From 2588b8092062efffc80a84f56604aa5baf6af6f1 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Mon, 17 Apr 2017 11:43:10 -0700 Subject: [PATCH] Exploded, removed tarball --- README.md | 20 + adb2usb/LICENSE | 674 ++++ adb2usb/adb2uart/Makefile | 267 ++ adb2usb/adb2uart/adb.c | 153 + adb2usb/adb2uart/adb.h | 16 + adb2usb/adb2uart/exsc/scanadb2usb.h | 108 + adb2usb/adb2uart/exsc/scancodes.h | 400 ++ adb2usb/adb2uart/exsc/test.c | 10 + adb2usb/adb2uart/main.c | 121 + adb2usb/adb2uart/notes.txt | 2 + adb2usb/adb2uart/scanadb2usb.h | 110 + adb2usb/uart2usb/Makefile | 171 + adb2usb/uart2usb/main.c | 222 ++ adb2usb/uart2usb/usbconfig.h | 373 ++ adb2usb/uart2usb/usbdrv/Changelog.txt | 308 ++ adb2usb/uart2usb/usbdrv/CommercialLicense.txt | 166 + adb2usb/uart2usb/usbdrv/License.txt | 361 ++ adb2usb/uart2usb/usbdrv/Readme.txt | 172 + adb2usb/uart2usb/usbdrv/USB-ID-FAQ.txt | 149 + adb2usb/uart2usb/usbdrv/USB-IDs-for-free.txt | 148 + adb2usb/uart2usb/usbdrv/asmcommon.inc | 188 + adb2usb/uart2usb/usbdrv/oddebug.c | 50 + adb2usb/uart2usb/usbdrv/oddebug.h | 123 + adb2usb/uart2usb/usbdrv/usbconfig-prototype.h | 376 ++ adb2usb/uart2usb/usbdrv/usbdrv.c | 625 +++ adb2usb/uart2usb/usbdrv/usbdrv.h | 735 ++++ adb2usb/uart2usb/usbdrv/usbdrvasm.S | 393 ++ adb2usb/uart2usb/usbdrv/usbdrvasm.asm | 21 + adb2usb/uart2usb/usbdrv/usbdrvasm12.inc | 393 ++ adb2usb/uart2usb/usbdrv/usbdrvasm128.inc | 750 ++++ adb2usb/uart2usb/usbdrv/usbdrvasm15.inc | 423 ++ adb2usb/uart2usb/usbdrv/usbdrvasm16.inc | 346 ++ adb2usb/uart2usb/usbdrv/usbdrvasm165.inc | 453 +++ adb2usb/uart2usb/usbdrv/usbdrvasm18-crc.inc | 707 ++++ adb2usb/uart2usb/usbdrv/usbdrvasm20.inc | 360 ++ adb2usb/uart2usb/usbdrv/usbportability.h | 144 + adb2usb/uart2usb/vusb | 1 + adb2usb/uart2usb/vusb-20100715/Changelog.txt | 308 ++ .../vusb-20100715/CommercialLicense.txt | 166 + adb2usb/uart2usb/vusb-20100715/License.txt | 361 ++ adb2usb/uart2usb/vusb-20100715/Readme.txt | 83 + adb2usb/uart2usb/vusb-20100715/USB-ID-FAQ.txt | 149 + .../vusb-20100715/USB-IDs-for-free.txt | 148 + .../vusb-20100715/circuits/Readme.txt | 79 + .../vusb-20100715/circuits/tiny45-rc.png | Bin 0 -> 7582 bytes .../vusb-20100715/circuits/tiny45-rc.sch | Bin 0 -> 193502 bytes .../circuits/with-series-diodes.png | Bin 0 -> 12316 bytes .../circuits/with-series-diodes.sch | Bin 0 -> 213956 bytes .../vusb-20100715/circuits/with-vreg.png | Bin 0 -> 13073 bytes .../vusb-20100715/circuits/with-vreg.sch | Bin 0 -> 215922 bytes .../vusb-20100715/circuits/with-zener.png | Bin 0 -> 12364 bytes .../vusb-20100715/circuits/with-zener.sch | Bin 0 -> 225497 bytes .../vusb-20100715/examples/Readme.txt | 102 + .../examples/custom-class/Readme.txt | 64 + .../custom-class/commandline/Makefile | 48 + .../custom-class/commandline/Makefile.windows | 18 + .../custom-class/commandline/opendevice.c | 203 + .../custom-class/commandline/opendevice.h | 77 + .../custom-class/commandline/set-led.c | 135 + .../examples/custom-class/firmware/Makefile | 164 + .../examples/custom-class/firmware/main.c | 97 + .../examples/custom-class/firmware/requests.h | 36 + .../custom-class/firmware/usbconfig.h | 373 ++ .../examples/hid-custom-rq/Readme.txt | 28 + .../hid-custom-rq/commandline/Makefile | 48 + .../commandline/Makefile.windows | 18 + .../hid-custom-rq/commandline/opendevice.c | 203 + .../hid-custom-rq/commandline/opendevice.h | 77 + .../hid-custom-rq/commandline/set-led.c | 135 + .../examples/hid-custom-rq/firmware/Makefile | 164 + .../examples/hid-custom-rq/firmware/main.c | 120 + .../hid-custom-rq/firmware/requests.h | 32 + .../hid-custom-rq/firmware/usbconfig.h | 373 ++ .../examples/hid-data/Readme.txt | 75 + .../examples/hid-data/commandline/Makefile | 42 + .../hid-data/commandline/Makefile.windows | 18 + .../examples/hid-data/commandline/hiddata.c | 324 ++ .../examples/hid-data/commandline/hiddata.h | 71 + .../examples/hid-data/commandline/hidsdi.h | 49 + .../examples/hid-data/commandline/hidtool.c | 127 + .../examples/hid-data/firmware/Makefile | 164 + .../examples/hid-data/firmware/main.c | 141 + .../examples/hid-data/firmware/usbconfig.h | 373 ++ .../examples/hid-mouse/Readme.txt | 48 + .../examples/hid-mouse/firmware/Makefile | 164 + .../examples/hid-mouse/firmware/main.c | 164 + .../examples/hid-mouse/firmware/usbconfig.h | 373 ++ .../vusb-20100715/examples/usbtool/Makefile | 48 + .../examples/usbtool/Makefile.windows | 18 + .../vusb-20100715/examples/usbtool/Readme.txt | 209 + .../examples/usbtool/opendevice.c | 203 + .../examples/usbtool/opendevice.h | 77 + .../vusb-20100715/examples/usbtool/usbtool.c | 356 ++ .../vusb-20100715/libs-device/Readme.txt | 22 + .../vusb-20100715/libs-device/osccal.c | 63 + .../vusb-20100715/libs-device/osccal.h | 63 + .../vusb-20100715/libs-device/osctune.h | 88 + .../vusb-20100715/libs-host/Readme.txt | 26 + .../vusb-20100715/libs-host/hiddata.c | 324 ++ .../vusb-20100715/libs-host/hiddata.h | 71 + .../uart2usb/vusb-20100715/libs-host/hidsdi.h | 49 + .../vusb-20100715/libs-host/opendevice.c | 203 + .../vusb-20100715/libs-host/opendevice.h | 77 + adb2usb/uart2usb/vusb-20100715/tests/Makefile | 127 + .../uart2usb/vusb-20100715/tests/Readme.txt | 13 + .../vusb-20100715/tests/compare-sizes.awk | 45 + adb2usb/uart2usb/vusb-20100715/tests/main.c | 159 + adb2usb/uart2usb/vusb-20100715/tests/null.c | 26 + .../sizes-20080418-gcc3.4.6.txt | 13 + .../sizes-20080418-gcc4.2.2.txt | 13 + .../sizes-20080513-gcc3.4.6.txt | 15 + .../sizes-20080513-gcc4.3.0.txt | 15 + .../sizes-20081022-gcc3.4.6.txt | 16 + .../sizes-20081022-gcc4.3.0.txt | 16 + .../sizes-20081126-gcc3.4.6.txt | 16 + .../sizes-20081126-gcc4.3.0.txt | 16 + .../sizes-20090323-gcc3.4.6.txt | 17 + .../sizes-20090323-gcc4.3.2.txt | 17 + .../sizes-20090415-gcc3.4.6.txt | 17 + .../sizes-20090415-gcc4.3.2.txt | 17 + .../sizes-20100715-gcc3.4.6.txt | 17 + .../sizes-20100715-gcc4.3.3.txt | 17 + .../uart2usb/vusb-20100715/tests/usbconfig.h | 288 ++ .../vusb-20100715/usbdrv/Changelog.txt | 308 ++ .../usbdrv/CommercialLicense.txt | 166 + .../uart2usb/vusb-20100715/usbdrv/License.txt | 361 ++ .../uart2usb/vusb-20100715/usbdrv/Readme.txt | 172 + .../vusb-20100715/usbdrv/USB-ID-FAQ.txt | 149 + .../vusb-20100715/usbdrv/USB-IDs-for-free.txt | 148 + .../vusb-20100715/usbdrv/asmcommon.inc | 188 + .../uart2usb/vusb-20100715/usbdrv/oddebug.c | 50 + .../uart2usb/vusb-20100715/usbdrv/oddebug.h | 123 + .../usbdrv/usbconfig-prototype.h | 376 ++ .../uart2usb/vusb-20100715/usbdrv/usbdrv.c | 625 +++ .../uart2usb/vusb-20100715/usbdrv/usbdrv.h | 735 ++++ .../uart2usb/vusb-20100715/usbdrv/usbdrvasm.S | 393 ++ .../vusb-20100715/usbdrv/usbdrvasm.asm | 21 + .../vusb-20100715/usbdrv/usbdrvasm12.inc | 393 ++ .../vusb-20100715/usbdrv/usbdrvasm128.inc | 750 ++++ .../vusb-20100715/usbdrv/usbdrvasm15.inc | 423 ++ .../vusb-20100715/usbdrv/usbdrvasm16.inc | 346 ++ .../vusb-20100715/usbdrv/usbdrvasm165.inc | 453 +++ .../vusb-20100715/usbdrv/usbdrvasm18-crc.inc | 707 ++++ .../vusb-20100715/usbdrv/usbdrvasm20.inc | 360 ++ .../vusb-20100715/usbdrv/usbportability.h | 144 + kernel_driver/Kbuild | 1 + kernel_driver/LICENSE | 674 ++++ kernel_driver/Makefile | 13 + kernel_driver/macusbfb.c | 535 +++ kernel_driver/test.sh | 13 + kernel_driver/test/Makefile | 4 + kernel_driver/test/bdc.xbm | 1828 +++++++++ kernel_driver/test/test | Bin 0 -> 31344 bytes kernel_driver/test/test.c | 37 + macsearm.tgz | Bin 1400993 -> 0 bytes macusbfb/LICENSE | 674 ++++ macusbfb/Makefile | 95 + macusbfb/asm_routines.s | 41 + .../build/codelite/LPC1343 Workspace.tags | Bin 0 -> 3762176 bytes .../codelite/LPC1343 Workspace.workspace | 12 + .../LPC1343 Workspace.workspace.session | 28 + .../build/codelite/LPC1343_CodeBase.project | 252 ++ macusbfb/build/codelite/tags | 4 + .../build/crossworks/LPC1343_CodeBase.hzp | 204 + .../build/crossworks/LPC1343_CodeBase.hzs | 65 + macusbfb/build/crossworks/flash_placement.xml | 31 + macusbfb/checksum/Makefile | 3 + macusbfb/checksum/main.c | 60 + macusbfb/core/adc/adc.c | 188 + macusbfb/core/adc/adc.h | 47 + macusbfb/core/cmd/cmd.c | 260 ++ macusbfb/core/cmd/cmd.h | 60 + macusbfb/core/cpu/cpu.c | 191 + macusbfb/core/cpu/cpu.h | 79 + macusbfb/core/gpio/gpio.c | 665 ++++ macusbfb/core/gpio/gpio.h | 112 + macusbfb/core/i2c/i2c.c | 351 ++ macusbfb/core/i2c/i2c.h | 98 + macusbfb/core/libc/stdio.c | 475 +++ macusbfb/core/libc/string.c | 311 ++ macusbfb/core/pmu/pmu.c | 380 ++ macusbfb/core/pmu/pmu.h | 50 + macusbfb/core/ssp/ssp.c | 293 ++ macusbfb/core/ssp/ssp.h | 85 + macusbfb/core/systick/systick.c | 135 + macusbfb/core/systick/systick.h | 47 + macusbfb/core/timer16/timer16.c | 476 +++ macusbfb/core/timer16/timer16.h | 59 + macusbfb/core/timer32/timer32.c | 344 ++ macusbfb/core/timer32/timer32.h | 66 + macusbfb/core/uart/uart.c | 346 ++ macusbfb/core/uart/uart.h | 76 + macusbfb/core/uart/uart_buf.c | 129 + macusbfb/core/usbcdc/cdc.h | 236 ++ macusbfb/core/usbcdc/cdcuser.c | 371 ++ macusbfb/core/usbcdc/cdcuser.h | 65 + macusbfb/core/usbcdc/config.h | 41 + macusbfb/core/usbcdc/usb.h | 228 ++ macusbfb/core/usbcdc/usbcfg.h | 157 + macusbfb/core/usbcdc/usbcore.c | 1057 +++++ macusbfb/core/usbcdc/usbcore.h | 87 + macusbfb/core/usbcdc/usbdesc.c | 202 + macusbfb/core/usbcdc/usbdesc.h | 35 + macusbfb/core/usbcdc/usbhw.c | 568 +++ macusbfb/core/usbcdc/usbhw.h | 62 + macusbfb/core/usbcdc/usbreg.h | 134 + macusbfb/core/usbcdc/usbuser.c | 208 + macusbfb/core/usbcdc/usbuser.h | 57 + macusbfb/core/usbhid-rom/rom_drivers.h | 76 + macusbfb/core/usbhid-rom/usb.h | 240 ++ macusbfb/core/usbhid-rom/usbconfig.c | 111 + macusbfb/core/usbhid-rom/usbconfig.h | 68 + macusbfb/core/usbhid-rom/usbhid.c | 181 + macusbfb/core/usbhid-rom/usbhid.h | 48 + macusbfb/core/wdt/wdt.c | 145 + macusbfb/core/wdt/wdt.h | 47 + macusbfb/debug.c | 60 + macusbfb/drivers/chibi/chb.c | 202 + macusbfb/drivers/chibi/chb.h | 99 + macusbfb/drivers/chibi/chb_buf.c | 87 + macusbfb/drivers/chibi/chb_buf.h | 46 + macusbfb/drivers/chibi/chb_drvr.c | 890 +++++ macusbfb/drivers/chibi/chb_drvr.h | 368 ++ macusbfb/drivers/chibi/chb_eeprom.c | 85 + macusbfb/drivers/chibi/chb_eeprom.h | 50 + macusbfb/drivers/chibi/chb_spi.c | 77 + macusbfb/drivers/chibi/chb_spi.h | 62 + macusbfb/drivers/chibi/types.h | 54 + macusbfb/drivers/eeprom/at25040/at25040.c | 297 ++ macusbfb/drivers/eeprom/at25040/at25040.h | 85 + macusbfb/drivers/eeprom/mcp24aa/mcp24aa.c | 325 ++ macusbfb/drivers/eeprom/mcp24aa/mcp24aa.h | 67 + macusbfb/drivers/fatfs/ccsbcs.c | 540 +++ macusbfb/drivers/fatfs/diskio.h | 81 + macusbfb/drivers/fatfs/ff.c | 3154 +++++++++++++++ macusbfb/drivers/fatfs/ff.h | 596 +++ macusbfb/drivers/fatfs/ffconf.h | 166 + macusbfb/drivers/fatfs/integer.h | 34 + macusbfb/drivers/fatfs/mmc.c | 669 ++++ macusbfb/drivers/lcd/drawing.c | 688 ++++ macusbfb/drivers/lcd/drawing.h | 70 + .../drivers/lcd/fonts/DotFactorySettings.png | Bin 0 -> 34083 bytes macusbfb/drivers/lcd/fonts/bitmapfonts.h | 68 + macusbfb/drivers/lcd/fonts/consolas11.c | 895 +++++ macusbfb/drivers/lcd/fonts/consolas11.h | 6 + macusbfb/drivers/lcd/fonts/consolas16.c | 1199 ++++++ macusbfb/drivers/lcd/fonts/consolas16.h | 6 + macusbfb/drivers/lcd/fonts/consolas9.c | 804 ++++ macusbfb/drivers/lcd/fonts/consolas9.h | 6 + macusbfb/drivers/lcd/fonts/smallfonts.c | 561 +++ macusbfb/drivers/lcd/fonts/smallfonts.h | 72 + macusbfb/drivers/lcd/hw/ILI9325.c | 362 ++ macusbfb/drivers/lcd/hw/ILI9325.h | 119 + macusbfb/drivers/lcd/lcd.h | 71 + macusbfb/drivers/sensors/lm75b/lm75b.c | 190 + macusbfb/drivers/sensors/lm75b/lm75b.h | 70 + macusbfb/font_8x8.c | 2571 ++++++++++++ macusbfb/gpio.h | 5 + macusbfb/lpc134x.h | 3455 +++++++++++++++++ macusbfb/lpc1xxx/LPC11xx_handlers.c | 170 + macusbfb/lpc1xxx/LPC13xx_handlers.c | 193 + macusbfb/lpc1xxx/LPC1xxx_startup.c | 65 + macusbfb/lpc1xxx/linkscript.ld | 77 + macusbfb/main.c | 454 +++ macusbfb/projectconfig.h | 53 + macusbfb/sysdefs.h | 64 + macusbfb/sysinit.c | 156 + macusbfb/sysinit.h | 50 + macusbfb/usb.c | 319 ++ macusbfb/usb.h | 3 + macusbfb/usbgpio.c | 48 + macusbfb/usbgpio.h | 2 + 272 files changed, 61436 insertions(+) create mode 100644 adb2usb/LICENSE create mode 100644 adb2usb/adb2uart/Makefile create mode 100644 adb2usb/adb2uart/adb.c create mode 100644 adb2usb/adb2uart/adb.h create mode 100644 adb2usb/adb2uart/exsc/scanadb2usb.h create mode 100644 adb2usb/adb2uart/exsc/scancodes.h create mode 100644 adb2usb/adb2uart/exsc/test.c create mode 100644 adb2usb/adb2uart/main.c create mode 100644 adb2usb/adb2uart/notes.txt create mode 100644 adb2usb/adb2uart/scanadb2usb.h create mode 100644 adb2usb/uart2usb/Makefile create mode 100644 adb2usb/uart2usb/main.c create mode 100644 adb2usb/uart2usb/usbconfig.h create mode 100644 adb2usb/uart2usb/usbdrv/Changelog.txt create mode 100644 adb2usb/uart2usb/usbdrv/CommercialLicense.txt create mode 100644 adb2usb/uart2usb/usbdrv/License.txt create mode 100644 adb2usb/uart2usb/usbdrv/Readme.txt create mode 100644 adb2usb/uart2usb/usbdrv/USB-ID-FAQ.txt create mode 100644 adb2usb/uart2usb/usbdrv/USB-IDs-for-free.txt create mode 100644 adb2usb/uart2usb/usbdrv/asmcommon.inc create mode 100644 adb2usb/uart2usb/usbdrv/oddebug.c create mode 100644 adb2usb/uart2usb/usbdrv/oddebug.h create mode 100644 adb2usb/uart2usb/usbdrv/usbconfig-prototype.h create mode 100644 adb2usb/uart2usb/usbdrv/usbdrv.c create mode 100644 adb2usb/uart2usb/usbdrv/usbdrv.h create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm.S create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm.asm create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm12.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm128.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm15.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm16.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm165.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm18-crc.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbdrvasm20.inc create mode 100644 adb2usb/uart2usb/usbdrv/usbportability.h create mode 120000 adb2usb/uart2usb/vusb create mode 100644 adb2usb/uart2usb/vusb-20100715/Changelog.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/CommercialLicense.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/License.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/USB-ID-FAQ.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/USB-IDs-for-free.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/tiny45-rc.png create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/tiny45-rc.sch create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/with-series-diodes.png create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/with-series-diodes.sch create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/with-vreg.png create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/with-vreg.sch create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/with-zener.png create mode 100644 adb2usb/uart2usb/vusb-20100715/circuits/with-zener.sch create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile.windows create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/set-led.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/main.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/requests.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/usbconfig.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile.windows create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/set-led.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/main.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/requests.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/usbconfig.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile.windows create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidsdi.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidtool.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/main.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/usbconfig.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/main.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/usbconfig.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile.windows create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/usbtool/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.c create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.h create mode 100644 adb2usb/uart2usb/vusb-20100715/examples/usbtool/usbtool.c create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-device/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-device/osccal.c create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-device/osccal.h create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-device/osctune.h create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-host/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.c create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.h create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-host/hidsdi.h create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.c create mode 100644 adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.h create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/Makefile create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/Readme.txt create mode 100755 adb2usb/uart2usb/vusb-20100715/tests/compare-sizes.awk create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/main.c create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/null.c create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc4.2.2.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc4.3.0.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc4.3.0.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc4.3.0.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc4.3.2.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc4.3.2.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc3.4.6.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc4.3.3.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/tests/usbconfig.h create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/Changelog.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/CommercialLicense.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/License.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/Readme.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/USB-ID-FAQ.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/USB-IDs-for-free.txt create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/asmcommon.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/oddebug.c create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/oddebug.h create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbconfig-prototype.h create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrv.c create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrv.h create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.S create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.asm create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm12.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm128.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm15.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm16.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm165.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm18-crc.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm20.inc create mode 100644 adb2usb/uart2usb/vusb-20100715/usbdrv/usbportability.h create mode 100644 kernel_driver/Kbuild create mode 100644 kernel_driver/LICENSE create mode 100644 kernel_driver/Makefile create mode 100644 kernel_driver/macusbfb.c create mode 100755 kernel_driver/test.sh create mode 100644 kernel_driver/test/Makefile create mode 100644 kernel_driver/test/bdc.xbm create mode 100755 kernel_driver/test/test create mode 100644 kernel_driver/test/test.c delete mode 100644 macsearm.tgz create mode 100644 macusbfb/LICENSE create mode 100644 macusbfb/Makefile create mode 100644 macusbfb/asm_routines.s create mode 100644 macusbfb/build/codelite/LPC1343 Workspace.tags create mode 100644 macusbfb/build/codelite/LPC1343 Workspace.workspace create mode 100644 macusbfb/build/codelite/LPC1343 Workspace.workspace.session create mode 100644 macusbfb/build/codelite/LPC1343_CodeBase.project create mode 100644 macusbfb/build/codelite/tags create mode 100644 macusbfb/build/crossworks/LPC1343_CodeBase.hzp create mode 100644 macusbfb/build/crossworks/LPC1343_CodeBase.hzs create mode 100644 macusbfb/build/crossworks/flash_placement.xml create mode 100644 macusbfb/checksum/Makefile create mode 100644 macusbfb/checksum/main.c create mode 100644 macusbfb/core/adc/adc.c create mode 100644 macusbfb/core/adc/adc.h create mode 100644 macusbfb/core/cmd/cmd.c create mode 100644 macusbfb/core/cmd/cmd.h create mode 100644 macusbfb/core/cpu/cpu.c create mode 100644 macusbfb/core/cpu/cpu.h create mode 100644 macusbfb/core/gpio/gpio.c create mode 100644 macusbfb/core/gpio/gpio.h create mode 100644 macusbfb/core/i2c/i2c.c create mode 100644 macusbfb/core/i2c/i2c.h create mode 100755 macusbfb/core/libc/stdio.c create mode 100755 macusbfb/core/libc/string.c create mode 100644 macusbfb/core/pmu/pmu.c create mode 100644 macusbfb/core/pmu/pmu.h create mode 100644 macusbfb/core/ssp/ssp.c create mode 100644 macusbfb/core/ssp/ssp.h create mode 100644 macusbfb/core/systick/systick.c create mode 100644 macusbfb/core/systick/systick.h create mode 100644 macusbfb/core/timer16/timer16.c create mode 100644 macusbfb/core/timer16/timer16.h create mode 100644 macusbfb/core/timer32/timer32.c create mode 100644 macusbfb/core/timer32/timer32.h create mode 100644 macusbfb/core/uart/uart.c create mode 100644 macusbfb/core/uart/uart.h create mode 100644 macusbfb/core/uart/uart_buf.c create mode 100644 macusbfb/core/usbcdc/cdc.h create mode 100644 macusbfb/core/usbcdc/cdcuser.c create mode 100644 macusbfb/core/usbcdc/cdcuser.h create mode 100644 macusbfb/core/usbcdc/config.h create mode 100644 macusbfb/core/usbcdc/usb.h create mode 100644 macusbfb/core/usbcdc/usbcfg.h create mode 100644 macusbfb/core/usbcdc/usbcore.c create mode 100644 macusbfb/core/usbcdc/usbcore.h create mode 100644 macusbfb/core/usbcdc/usbdesc.c create mode 100644 macusbfb/core/usbcdc/usbdesc.h create mode 100644 macusbfb/core/usbcdc/usbhw.c create mode 100644 macusbfb/core/usbcdc/usbhw.h create mode 100644 macusbfb/core/usbcdc/usbreg.h create mode 100644 macusbfb/core/usbcdc/usbuser.c create mode 100644 macusbfb/core/usbcdc/usbuser.h create mode 100644 macusbfb/core/usbhid-rom/rom_drivers.h create mode 100644 macusbfb/core/usbhid-rom/usb.h create mode 100644 macusbfb/core/usbhid-rom/usbconfig.c create mode 100644 macusbfb/core/usbhid-rom/usbconfig.h create mode 100644 macusbfb/core/usbhid-rom/usbhid.c create mode 100644 macusbfb/core/usbhid-rom/usbhid.h create mode 100644 macusbfb/core/wdt/wdt.c create mode 100644 macusbfb/core/wdt/wdt.h create mode 100644 macusbfb/debug.c create mode 100644 macusbfb/drivers/chibi/chb.c create mode 100644 macusbfb/drivers/chibi/chb.h create mode 100644 macusbfb/drivers/chibi/chb_buf.c create mode 100644 macusbfb/drivers/chibi/chb_buf.h create mode 100644 macusbfb/drivers/chibi/chb_drvr.c create mode 100644 macusbfb/drivers/chibi/chb_drvr.h create mode 100644 macusbfb/drivers/chibi/chb_eeprom.c create mode 100644 macusbfb/drivers/chibi/chb_eeprom.h create mode 100644 macusbfb/drivers/chibi/chb_spi.c create mode 100644 macusbfb/drivers/chibi/chb_spi.h create mode 100644 macusbfb/drivers/chibi/types.h create mode 100644 macusbfb/drivers/eeprom/at25040/at25040.c create mode 100644 macusbfb/drivers/eeprom/at25040/at25040.h create mode 100644 macusbfb/drivers/eeprom/mcp24aa/mcp24aa.c create mode 100644 macusbfb/drivers/eeprom/mcp24aa/mcp24aa.h create mode 100644 macusbfb/drivers/fatfs/ccsbcs.c create mode 100644 macusbfb/drivers/fatfs/diskio.h create mode 100644 macusbfb/drivers/fatfs/ff.c create mode 100644 macusbfb/drivers/fatfs/ff.h create mode 100644 macusbfb/drivers/fatfs/ffconf.h create mode 100644 macusbfb/drivers/fatfs/integer.h create mode 100644 macusbfb/drivers/fatfs/mmc.c create mode 100644 macusbfb/drivers/lcd/drawing.c create mode 100644 macusbfb/drivers/lcd/drawing.h create mode 100644 macusbfb/drivers/lcd/fonts/DotFactorySettings.png create mode 100644 macusbfb/drivers/lcd/fonts/bitmapfonts.h create mode 100644 macusbfb/drivers/lcd/fonts/consolas11.c create mode 100644 macusbfb/drivers/lcd/fonts/consolas11.h create mode 100644 macusbfb/drivers/lcd/fonts/consolas16.c create mode 100644 macusbfb/drivers/lcd/fonts/consolas16.h create mode 100644 macusbfb/drivers/lcd/fonts/consolas9.c create mode 100644 macusbfb/drivers/lcd/fonts/consolas9.h create mode 100644 macusbfb/drivers/lcd/fonts/smallfonts.c create mode 100644 macusbfb/drivers/lcd/fonts/smallfonts.h create mode 100644 macusbfb/drivers/lcd/hw/ILI9325.c create mode 100644 macusbfb/drivers/lcd/hw/ILI9325.h create mode 100644 macusbfb/drivers/lcd/lcd.h create mode 100644 macusbfb/drivers/sensors/lm75b/lm75b.c create mode 100644 macusbfb/drivers/sensors/lm75b/lm75b.h create mode 100644 macusbfb/font_8x8.c create mode 100644 macusbfb/gpio.h create mode 100644 macusbfb/lpc134x.h create mode 100644 macusbfb/lpc1xxx/LPC11xx_handlers.c create mode 100644 macusbfb/lpc1xxx/LPC13xx_handlers.c create mode 100644 macusbfb/lpc1xxx/LPC1xxx_startup.c create mode 100644 macusbfb/lpc1xxx/linkscript.ld create mode 100644 macusbfb/main.c create mode 100644 macusbfb/projectconfig.h create mode 100644 macusbfb/sysdefs.h create mode 100644 macusbfb/sysinit.c create mode 100644 macusbfb/sysinit.h create mode 100644 macusbfb/usb.c create mode 100644 macusbfb/usb.h create mode 100644 macusbfb/usbgpio.c create mode 100644 macusbfb/usbgpio.h diff --git a/README.md b/README.md index 2c965a8..0f21f59 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,22 @@ # macusbdb Jeroen/Spritesmods "macusbfb" LPC1343 firmware for Macintosh 9" CRT driver board +The code in these directories isn't the best I ever wrote, but at the moment +it works good enough for my own purposes. Use at your own risk! +Contents: + +adb2usb/ : Code for the ADB to USB converter +adb2usb/adb2uart : Code for the uC that receives ADB +adb2usb/uart2usb : Code for the uC that sends the data over the USB bus +macusbfb : Firmware for the LPC1343 that a.o. controls the Macintosh CRT + +A few notes about the shortcomings of the current code: +- macusbfb works just fine, but leaks memory when unloaded or the display +device is unplugged. As long as you plug in the device and load the module, +you should be fine though. +- The adb2usb device seems to drop adb replies every now and then, resulting +in e.g. a stuck key. I still need to figure out why. Until then, pressing +the key a second time should make it work again + +As always, if you fix or expand something, I'd love to get a patch. + +Jeroen/Sprite_tm diff --git a/adb2usb/LICENSE b/adb2usb/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/adb2usb/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/adb2usb/adb2uart/Makefile b/adb2usb/adb2uart/Makefile new file mode 100644 index 0000000..b96c00a --- /dev/null +++ b/adb2usb/adb2uart/Makefile @@ -0,0 +1,267 @@ +# Hey Emacs, this is a -*- makefile -*- + +# AVR-GCC Makefile template, derived from the WinAVR template (which +# is public domain), believed to be neutral to any flavor of "make" +# (GNU make, BSD make, SysV make) + + +MCU = attiny2313 +FORMAT = ihex +TARGET = adb2uart +SRC = main.c adb.c +DEPS= +ASRC = +OPT = s + +# Name of this Makefile (used for "make depend"). +MAKEFILE = Makefile + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = stabs + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +CDEBUG = -g$(DEBUG) +CWARN = -Wall -Wstrict-prototypes +CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-inline-small-functions +#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) +CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) $(CTUNING) + + +#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + +#Additional libraries. + +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +#PRINTF_LIB = $(PRINTF_LIB_MIN) + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +SCANF_LIB = + +#MATH_LIB = -lm + +# External memory options + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + +#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref +LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + +# Programming support using avrdude. Settings and variables. + +#AVRDUDE_PROGRAMMER = bsd +AVRDUDE_PROGRAMMER = usbasp +AVRDUDE_PORT = /dev/parport0 + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) $(AVRDUDE_ERASE_COUNTER) -E noreset,vcc + + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +MV = mv -f + +# Define all object files. +OBJ = $(DEPS) $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + +# Default target. +all: build + +build: elf hex eep + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +fw.h: firmware.bin + bin2c fw < firmware.bin > fw.h + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + $(COFFCONVERT) -O coff-avr $(TARGET).elf $(TARGET).cof + + +extcoff: $(TARGET).elf + $(COFFCONVERT) -O coff-ext-avr $(TARGET).elf $(TARGET).cof + + +.SUFFIXES: .elf .hex .eep .lss .sym + +.elf.hex: + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +.elf.eep: + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +.elf.lss: + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +.elf.sym: + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +$(TARGET).elf: $(OBJ) + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +.c.o: + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +.c.s: + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +.S.o: + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + +# Target: clean project. +clean: + $(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf \ + $(TARGET).map $(TARGET).sym $(TARGET).lss \ + $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) + +depend: + if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ + then \ + sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ + $(MAKEFILE).$$$$ && \ + $(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ + fi + echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ + >> $(MAKEFILE); \ + $(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) $(ASRC) >> $(MAKEFILE) + + +.PHONY: all build elf hex eep lss sym program coff extcoff clean depend + + +# DO NOT DELETE THIS LINE -- make depend depends on it. +main.o: main.c /usr/lib/gcc/avr/4.3.4/../../../avr/include/util/delay.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/inttypes.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/stdint.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/util/delay_basic.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/io.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/sfr_defs.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/iotn2313.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/portpins.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/common.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/version.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/fuse.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/lock.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/interrupt.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/stdio.h \ + /usr/lib/gcc/avr/4.3.4/include/stdarg.h \ + /usr/lib/gcc/avr/4.3.4/include/stddef.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/string.h adb.h \ + scanadb2usb.h +adb.o: adb.c /usr/lib/gcc/avr/4.3.4/../../../avr/include/util/delay.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/inttypes.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/stdint.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/util/delay_basic.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/io.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/sfr_defs.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/iotn2313.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/portpins.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/common.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/version.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/fuse.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/lock.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/interrupt.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/stdio.h \ + /usr/lib/gcc/avr/4.3.4/include/stdarg.h \ + /usr/lib/gcc/avr/4.3.4/include/stddef.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/avr/pgmspace.h \ + /usr/lib/gcc/avr/4.3.4/../../../avr/include/string.h adb.h diff --git a/adb2usb/adb2uart/adb.c b/adb2usb/adb2uart/adb.c new file mode 100644 index 0000000..6d808b9 --- /dev/null +++ b/adb2usb/adb2uart/adb.c @@ -0,0 +1,153 @@ +/* +ADB to USB-converter, for a non-extended keyboard and a mouse +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#define F_CPU 12000000 +#include +#include +#include +#include +#include +#include +#include "adb.h" + + +#define ADB_H() DDRB&=~(1<0) { + x--; + _delay_us(1); + } + if (x==0) return 0; + + //Delay for the low time of the start bit + _delay_us(40); + //Should be high again... + if (!ADBVAL) return 0; + //Wait till the line goes low again for the 1st databit. + while(ADBVAL && x>0) { + x--; + _delay_us(1); + } + if (x==0) return 0; + //Ok, all good. + return 1; +} + +static char adbGetBit(void) { + char res=0; + int x; +// DDRD|=(1<<3); +// PIND=(1<<3); + _delay_us(50); +// PIND=(1<<3); + if (ADBVAL) res=1; + x=80; + while(!ADBVAL && x>0) { + _delay_us(1); + x--; + } + while(ADBVAL && x>0) { + _delay_us(1); + x--; + } + if (x==0) return -1; + return res; +} + +static unsigned char adbGetByte(void) { + unsigned char ret, b, x; + for (x=0; x<8; x++) { + ret<<=1; + b=adbGetBit(); + if (b==-1) return 0xff; + if (b==1) ret|=1; + } + return ret; +} + + +int adbCommand(unsigned char cmd, unsigned char *data, int size) { + int x; + adbAttnSync(); + adbSendByte(cmd); + adbSendTlt(); + if (cmd&C_TALK) { + //Device writes data + if (!adbWaitStart()) return -1; + for (x=0; x, or by paper mail: + * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic + */ + + +struct scancode_list { + unsigned char xt; + unsigned char at2; + unsigned char at3; + unsigned char sun; + unsigned char usb; + unsigned char adb; + unsigned char code; +}; + +/* + * The base set common to all keyboards - the XT keyboard. + */ + +static struct scancode_list scancodes[] = { + + {0x01, 0x76, 0x08, 0x1d, 0x29, 0x35, 1}, /* Esc */ + {0x02, 0x16, 0x16, 0x1e, 0x1e, 0x12, 2}, /* 1 ! */ + {0x03, 0x1e, 0x1e, 0x1f, 0x1f, 0x13, 3}, /* 2 @ */ + {0x04, 0x26, 0x26, 0x20, 0x20, 0x14, 4}, /* 3 # */ + {0x05, 0x25, 0x25, 0x21, 0x21, 0x15, 5}, /* 4 $ */ + {0x06, 0x2e, 0x2e, 0x22, 0x22, 0x17, 6}, /* 5 % */ + {0x07, 0x36, 0x36, 0x23, 0x23, 0x16, 7}, /* 6 ^ */ + {0x08, 0x3d, 0x3d, 0x24, 0x24, 0x1a, 8}, /* 7 & */ + {0x09, 0x3e, 0x3e, 0x25, 0x25, 0x1c, 9}, /* 8 * */ + {0x0a, 0x46, 0x46, 0x26, 0x26, 0x19, 10}, /* 9 ( */ + {0x0b, 0x45, 0x45, 0x27, 0x27, 0x1d, 11}, /* 0 ) */ + {0x0c, 0x4e, 0x4e, 0x28, 0x2d, 0x1b, 12}, /* - _ */ + {0x0d, 0x55, 0x55, 0x29, 0x2e, 0x18, 13}, /* = + */ + {0x0e, 0x66, 0x66, 0x2b, 0x2a, 0x33, 14}, /* Backspace */ + {0x0f, 0x0d, 0x0d, 0x35, 0x2b, 0x30, 15}, /* Tab */ + {0x10, 0x15, 0x15, 0x36, 0x14, 0x0c, 16}, /* Q */ + {0x11, 0x1d, 0x1d, 0x37, 0x1a, 0x0d, 17}, /* W */ + {0x12, 0x24, 0x24, 0x38, 0x08, 0x0e, 18}, /* E */ + {0x13, 0x2d, 0x2d, 0x39, 0x15, 0x0f, 19}, /* R */ + {0x14, 0x2c, 0x2c, 0x3a, 0x17, 0x11, 20}, /* T */ + {0x15, 0x35, 0x35, 0x3b, 0x1c, 0x10, 21}, /* Y */ + {0x16, 0x3c, 0x3c, 0x3c, 0x18, 0x20, 22}, /* U */ + {0x17, 0x43, 0x43, 0x3d, 0x0c, 0x22, 23}, /* I */ + {0x18, 0x44, 0x44, 0x3e, 0x12, 0x1f, 24}, /* O */ + {0x19, 0x4d, 0x4d, 0x3f, 0x13, 0x23, 25}, /* P */ + {0x1a, 0x54, 0x54, 0x40, 0x2f, 0x21, 26}, /* [ { */ + {0x1b, 0x5b, 0x5b, 0x41, 0x30, 0x1e, 27}, /* ] } */ + {0x1c, 0x5a, 0x5a, 0x59, 0x28, 0x24, 28}, /* Enter */ + {0x1d, 0x14, 0x11, 0x4c, 0xe0, 0x36, 29}, /* Left Control */ + {0x1e, 0x1c, 0x1c, 0x4d, 0x04, 0x00, 30}, /* A */ + {0x1f, 0x1b, 0x1b, 0x4e, 0x16, 0x01, 31}, /* S */ + {0x20, 0x23, 0x23, 0x4f, 0x07, 0x02, 32}, /* D */ + {0x21, 0x2b, 0x2b, 0x50, 0x09, 0x03, 33}, /* F */ + {0x22, 0x34, 0x34, 0x51, 0x0a, 0x05, 34}, /* G */ + {0x23, 0x33, 0x33, 0x52, 0x0b, 0x04, 35}, /* H */ + {0x24, 0x3b, 0x3b, 0x53, 0x0d, 0x26, 36}, /* J */ + {0x25, 0x42, 0x42, 0x54, 0x0e, 0x28, 37}, /* K */ + {0x26, 0x4b, 0x4b, 0x55, 0x0f, 0x25, 38}, /* L */ + {0x27, 0x4c, 0x4c, 0x56, 0x33, 0x29, 39}, /* ; : */ + {0x28, 0x52, 0x52, 0x57, 0x34, 0x27, 40}, /* ' " */ + {0x29, 0x0e, 0x0e, 0x2a, 0x35, 0x32, 41}, /* ` ~ */ + {0x2a, 0x12, 0x12, 0x63, 0xe1, 0x38, 42}, /* Left Shift */ + {0x2b, 0x5d, 0x5c, 0x58, 0x31, 0x2a, 43}, /* \ | */ + { 0, 0, 0x53, 0, 0, 0, 43}, /* \ | */ + { 0, 0, 0x5d, 0, 0, 0, 43}, /* \ | */ + {0x2c, 0x1a, 0x1a, 0x64, 0x1d, 0x06, 44}, /* Z */ + {0x2d, 0x22, 0x22, 0x65, 0x1b, 0x07, 45}, /* X */ + {0x2e, 0x21, 0x21, 0x66, 0x06, 0x08, 46}, /* C */ + {0x2f, 0x2a, 0x2a, 0x67, 0x19, 0x09, 47}, /* V */ + {0x30, 0x32, 0x32, 0x68, 0x05, 0x0b, 48}, /* B */ + {0x31, 0x31, 0x31, 0x69, 0x11, 0x2d, 49}, /* N */ + {0x32, 0x3a, 0x3a, 0x6a, 0x10, 0x2e, 50}, /* M */ + {0x33, 0x41, 0x41, 0x6b, 0x36, 0x2b, 51}, /* , < */ + {0x34, 0x49, 0x49, 0x6c, 0x37, 0x2f, 52}, /* . > */ + {0x35, 0x4a, 0x4a, 0x6d, 0x38, 0x2c, 53}, /* / ? */ + {0x36, 0x59, 0x59, 0x6e, 0xe5, 0x7b, 54}, /* Right Shift */ + {0x37, 0x7c, 0x7e, 0x2f, 0x55, 0x43, 55}, /* KP * */ + {0x38, 0x11, 0x19, 0x13, 0xe2, 0x37, 56}, /* Left Alt */ + {0x39, 0x29, 0x29, 0x79, 0x2c, 0x31, 57}, /* Space */ + {0x3a, 0x58, 0x14, 0x77, 0x39, 0x39, 58}, /* Caps Lock */ + {0x3b, 0x05, 0x07, 0x05, 0x3a, 0x7a, 59}, /* F1 */ + {0x3c, 0x06, 0x0f, 0x06, 0x3b, 0x78, 60}, /* F2 */ + {0x3d, 0x04, 0x17, 0x08, 0x3c, 0x63, 61}, /* F3 */ + {0x3e, 0x0c, 0x1f, 0x0a, 0x3d, 0x76, 62}, /* F4 */ + {0x3f, 0x03, 0x27, 0x0c, 0x3e, 0x60, 63}, /* F5 */ + {0x40, 0x0b, 0x2f, 0x0e, 0x3f, 0x61, 64}, /* F6 */ + {0x41, 0x02, 0x37, 0x10, 0x40, 0x62, 65}, /* F7 */ + {0x42, 0x0a, 0x3f, 0x11, 0x41, 0x64, 66}, /* F8 */ + {0x43, 0x01, 0x47, 0x12, 0x42, 0x65, 67}, /* F9 */ + {0x44, 0x09, 0x4f, 0x07, 0x43, 0x6d, 68}, /* F10 */ + {0x45, 0x77, 0x76, 0x62, 0x53, 0x47, 69}, /* Num Lock */ + {0x46, 0x7e, 0x5f, 0x17, 0x47, 0x6b, 70}, /* Scroll Lock Break */ + {0x47, 0x6c, 0x6c, 0x44, 0x5f, 0x59, 71}, /* KP Home 7 */ + {0x48, 0x75, 0x75, 0x45, 0x60, 0x5b, 72}, /* KP Up 8 */ + {0x49, 0x7d, 0x7d, 0x46, 0x61, 0x5c, 73}, /* KP PgUp 9 */ + {0x4a, 0x7b, 0x84, 0x47, 0x56, 0x4e, 74}, /* KP - */ + {0x4b, 0x6b, 0x6b, 0x5b, 0x5c, 0x56, 75}, /* KP Left 4 */ + {0x4c, 0x73, 0x73, 0x5c, 0x5d, 0x57, 76}, /* KP 5 */ + {0x4d, 0x74, 0x74, 0x5d, 0x5e, 0x58, 77}, /* KP Right 6 */ + {0x4e, 0x79, 0x7c, 0x7d, 0x57, 0x45, 78}, /* KP + */ + {0x4f, 0x69, 0x69, 0x70, 0x59, 0x53, 79}, /* KP End 1 */ + {0x50, 0x72, 0x72, 0x71, 0x5a, 0x54, 80}, /* KP Down 2 */ + {0x51, 0x7a, 0x7a, 0x72, 0x5b, 0x55, 81}, /* KP PgDn 3 */ + {0x52, 0x70, 0x70, 0x5e, 0x62, 0x52, 82}, /* KP Ins 0 */ + {0x53, 0x71, 0x71, 0x32, 0x63, 0x41, 83}, /* KP Del . */ + +/* + * The most common extensions to the base. + */ + + { 0, 0x78, 0x56, 0x09, 0x44, 0x67, 87}, /* F11 */ + { 0, 0x07, 0x5e, 0x0b, 0x45, 0x6f, 88}, /* F12 */ + { 0, 0xda, 0x79, 0x5a, 0x58, 0x4c, 96}, /* KP Enter */ + { 0, 0xca, 0x77, 0x2e, 0x54, 0x4b, 98}, /* KP / */ + { 0, 0x91, 0x39, 0x0d, 0xe6, 0x7c, 100}, /* Right Alt (Graph) */ + { 0, 0, 0x58, 0, 0, 0, 100}, /* Alt Graph - Sun PS/2 Type 5 */ + { 0, 0xf1, 0x64, 0x42, 0x4c, 0x75, 111}, /* Delete */ + { 0, 0xfe, 0x62, 0x15, 0x48, 0x71, 119}, /* Pause Break */ + { 0, 0xf7, 0, 0, 0, 0, 119}, /* Alternate Pause Break */ + +/* + * The separate navigation keys + */ + + { 0, 0xec, 0x6e, 0x34, 0x4a, 0x73, 102}, /* Home */ + { 0, 0xf5, 0x63, 0x14, 0x52, 0x3e, 103}, /* Up */ + { 0, 0xfd, 0x6f, 0x60, 0x4b, 0x74, 104}, /* Page Up */ + { 0, 0xeb, 0x61, 0x18, 0x50, 0x3b, 105}, /* Left */ + { 0, 0xf4, 0x6a, 0x1c, 0x4f, 0x3c, 106}, /* Right */ + { 0, 0xe9, 0x65, 0x4a, 0x4d, 0x77, 107}, /* End */ + { 0, 0xf2, 0x60, 0x1b, 0x51, 0x3d, 108}, /* Down */ + { 0, 0xfa, 0x6d, 0x7b, 0x4e, 0x79, 109}, /* Page Down */ + { 0, 0xf0, 0x67, 0x2c, 0x49, 0x72, 110}, /* Insert */ + +/* + * The OS keys + */ + + { 0, 0x9f, 0x8b, 0x78, 0xe3, 0, 125}, /* Left Meta (Win, Apple, Amiga) */ + { 0, 0xa7, 0x8c, 0x7a, 0xe7, 0, 126}, /* Right Meta (Win, Apple, Amiga) */ + { 0, 0xaf, 0x8d, 0x43, 0x65, 0, 127}, /* Compose (Application) */ + +/* + * OS keys on a NCD PS/2 Sun keyboard + */ + + { 0, 0, 0x40, 0, 0, 0, 125}, /* Left Meta (Win, Apple, Amiga) */ + { 0, 0, 0x48, 0, 0, 0, 126}, /* Right Meta (Win, Apple, Amiga) */ + { 0, 0, 0x39, 0, 0, 0, 127}, /* Compose (Application) */ + +/* + * PrintScreen + */ + + { 0, 0xfc, 0x57, 0x16, 0x46, 0, 99}, /* PrintScreen SysRq */ + +/* + * Right Ctrl + */ + + { 0, 0x94, 0x58, 0, 0xe4, 0x7d, 97}, /* Right Ctrl */ + +/* + * The European 102nd key + */ + + { 0, 0x61, 0x13, 0, 0x64, 0, 86}, /* the 102nd key */ + +/* + * Sun function keys + */ + + { 0, 0, 0x0a, 0x01, 0x78, 0, 128}, /* Stop */ + { 0, 0, 0x0b, 0x03, 0x79, 0, 129}, /* Again */ + { 0, 0, 0x0c, 0x19, 0, 0, 130}, /* Props */ + { 0, 0, 0x10, 0x1a, 0x7a, 0, 131}, /* Undo */ + { 0, 0, 0x13, 0x31, 0, 0, 132}, /* Front */ + { 0, 0, 0x18, 0x33, 0x7c, 0, 133}, /* Copy */ + { 0, 0, 0x20, 0x48, 0, 0, 134}, /* Open */ + { 0, 0, 0x28, 0x49, 0x7d, 0, 135}, /* Paste */ + { 0, 0, 0x30, 0x5f, 0x7e, 0, 136}, /* Find */ + { 0, 0, 0x38, 0x61, 0x7b, 0, 137}, /* Cut */ + { 0, 0, 0x09, 0x76, 0x75, 0, 138}, /* Help */ + + +/* + * Line Feed found on Sun Type 4 keyboard + */ + + { 0, 0, 0, 0x6f, 0, 0, 101}, /* Line Feed */ + +/* + * AT Enhanced keyboard in XT mode + */ + + {0x57, 0, 0, 0, 0, 0, 87}, /* F11 */ + {0x58, 0, 0, 0, 0, 0, 88}, /* F12 */ + +/* + * PP-06 keyboard extension keys + */ + + {0x65, 0, 0, 0, 0, 0, 87}, /* F11 */ + {0x66, 0, 0, 0, 0, 0, 88}, /* F12 */ + {0x6b, 0, 0, 0, 0, 0, 110}, /* Insert */ + {0x6c, 0, 0, 0, 0, 0, 111}, /* Delete */ + {0x6d, 0, 0, 0, 0, 0, 103}, /* Up */ + {0x6e, 0, 0, 0, 0, 0, 108}, /* Down */ + {0x6f, 0, 0, 0, 0, 0, 105}, /* Left */ + {0x70, 0, 0, 0, 0, 0, 106}, /* Right */ + +/* + * F13-F24, for USB and Focus 9000 + */ + + { 0, 0x60, 0, 0, 0x68, 0, 85}, /* F13 (PF1) */ + { 0, 0x51, 0, 0, 0x69, 0, 89}, /* F14 (PF2) */ + { 0, 0x62, 0, 0, 0x6a, 0, 90}, /* F15 (PF3) */ + { 0, 0x63, 0, 0, 0x6b, 0, 91}, /* F16 (PF4) */ + { 0, 0x64, 0, 0, 0x6c, 0, 92}, /* F17 (PF5) */ + { 0, 0x65, 0, 0, 0x6d, 0, 93}, /* F18 (PF6) */ + { 0, 0x67, 0, 0, 0x6e, 0, 94}, /* F19 (PF7) */ + { 0, 0x68, 0, 0, 0x6f, 0, 95}, /* F20 (PF8) */ + { 0, 0x53, 0, 0, 0x70, 0, 120}, /* F21 (PF9) */ + { 0, 0x6d, 0, 0, 0x71, 0, 121}, /* F22 (PF10) */ + { 0, 0x50, 0, 0, 0x72, 0, 122}, /* F23 (PF11) */ + { 0, 0x6f, 0, 0, 0x73, 0, 123}, /* F24 (PF12) */ + +/* + * F13-F17 for DEC LK450 + */ + + { 0, 0x84, 0, 0, 0, 0, 85}, /* F13 */ + { 0, 0x8c, 0, 0, 0, 0, 89}, /* F14 */ + { 0, 0x83, 0, 0, 0, 0, 90}, /* F15 */ + { 0, 0x8b, 0, 0, 0, 0, 91}, /* F16 */ + { 0, 0x82, 0, 0, 0, 0, 92}, /* F17 */ + +/* + * A1-A4 for RC930 + */ + + { 0, 0x0f, 0, 0, 0, 0, 85}, /* A1 */ + { 0, 0x17, 0, 0, 0, 0, 89}, /* A2 */ + { 0, 0x1f, 0, 0, 0, 0, 90}, /* A3 */ + { 0, 0x27, 0, 0, 0, 0, 91}, /* A4 */ + +/* + * Unlabeled keys on the NCD Sun PS/2 keyboard + */ + + { 0, 0, 0x7f, 0, 0, 0, 85}, /* U1 */ + { 0, 0, 0x80, 0, 0, 0, 89}, /* U2 */ + { 0, 0, 0x81, 0, 0, 0, 90}, /* U3 */ + { 0, 0, 0x82, 0, 0, 0, 91}, /* U4 */ + { 0, 0, 0x83, 0, 0, 0, 92}, /* U5 */ + +/* + * Macro key on BTC and other keyboards + */ + + { 0, 0xef, 0, 0, 0, 0, 112}, /* BTC Macro key */ + +/* + * Logitech key on Logitech NewTouch + */ + + { 0, 0xa8, 0x8e, 0, 0, 0, 112}, /* Logitech key */ + +/* + * Omni key on NorthGate and Lueck keyboards + */ + + { 0, 0xf3, 0, 0, 0, 0, 112}, /* NorthGate / Lueck Omni */ + +/* + * Sound (NCD Sun PS/2 + Sun Type 5 keyboard) + */ + + { 0, 0, 0x50, 0x2d, 0x7f, 0, 113}, /* Mute */ + { 0, 0, 0x51, 0x02, 0x81, 0, 114}, /* Volume Down */ + { 0, 0, 0x53, 0x04, 0x80, 0, 115}, /* Volume Up */ + +/* + * Sound (BTC Ez multimedia keyboard) + */ + + { 0, 0xcb, 0x9c, 0, 0, 0, 113}, /* Mute */ + { 0, 0xc2, 0x9d, 0, 0, 0, 114}, /* Volume Down */ + { 0, 0x9c, 0x95, 0, 0, 0, 115}, /* Volume Up */ + +/* + * BTC Ez Function keys + */ + + { 0, 0xbb, 0x94, 0, 0, 0, 165}, /* Previous song */ + { 0, 0xab, 0x99, 0, 0, 0, 164}, /* Play/Pause */ + { 0, 0xc3, 0x98, 0, 0, 0, 166}, /* Stop */ + { 0, 0xb4, 0x93, 0, 0, 0, 163}, /* Next song */ + { 0, 0xba, 0x97, 0, 0, 0, 161}, /* Eject */ + { 0, 0xb3, 0x9a, 0, 0, 0, 160}, /* Close */ + { 0, 0xb1, 0x9e, 0, 0, 0, 167}, /* Record */ + { 0, 0xc4, 0x9f, 0, 0, 0, 168}, /* Rewind */ + { 0, 0xb2, 0x91, 0, 0, 0, 139}, /* Menu */ + { 0, 0x9b, 0xa3, 0, 0, 0, 140}, /* Calc */ + { 0, 0xad, 0xa2, 0, 0, 0, 147}, /* X-fer */ + { 0, 0xa1, 0x92, 0, 0, 0, 150}, /* WWW */ + { 0, 0xa3, 0x9b, 0, 0, 0, 154}, /* Cycle Windows */ + { 0, 0xa4, 0x96, 0, 0, 0, 152}, /* Coffee */ + { 0, 0xcd, 0xa0, 0, 0, 0, 148}, /* Prog 1 */ + { 0, 0x95, 0xa1, 0, 0, 0, 149}, /* Prog 2 */ + +/* + * NCD Sun PS/2 Setup key + */ + + { 0, 0, 0x5d, 0, 0, 0, 141}, /* Setup */ + +/* + * The power key (AP PFT keyboard) + */ + + { 0, 0xb7, 0, 0x30, 0x66, 0x7f, 116}, /* Power */ + +/* + * The power management keys (AP PFT keyboard) + */ + + { 0, 0xbf, 0, 0, 0, 0, 142}, /* Sleep */ + { 0, 0xde, 0, 0, 0, 0, 143}, /* WakeUp */ + +/* + * Turbo-Xwing function keys. + */ + + { 0, 0xe2, 0, 0, 0, 0, 116}, /* WWW / Power */ + { 0, 0xb3, 0, 0, 0, 0, 176}, /* Sleep */ + { 0, 0xe4, 0, 0, 0, 0, 143}, /* Joystick / Wake */ + { 0, 0xd7, 0, 0, 0, 0, 140}, /* Calc */ + { 0, 0x8c, 0, 0, 0, 0, 101}, /* Line Feed */ + { 0, 0x86, 0, 0, 0, 0, 137}, /* Cut */ + { 0, 0xe7, 0, 0, 0, 0, 133}, /* Copy */ + { 0, 0xb4, 0, 0, 0, 0, 135}, /* Paste */ + { 0, 0xcf, 0, 0, 0, 0, 138}, /* Help */ + { 0, 0x8d, 0, 0, 0, 0, 144}, /* File */ + { 0, 0xab, 0, 0, 0, 0, 145}, /* Send File */ + { 0, 0xc0, 0, 0, 0, 0, 146}, /* Delete File */ + { 0, 0xa6, 0, 0, 0, 0, 151}, /* MS DOS */ + { 0, 0xd6, 0, 0, 0, 0, 153}, /* Direction */ + { 0, 0xa9, 0, 0, 0, 0, 166}, /* Stop */ + { 0, 0x95, 0, 0, 0, 0, 165}, /* Prev Song */ + { 0, 0xbb, 0, 0, 0, 0, 113}, /* Mute */ + { 0, 0xa5, 0, 0, 0, 0, 163}, /* Next Song */ + { 0, 0x96, 0, 0, 0, 0, 164}, /* Play / Pause */ + { 0, 0x82, 0, 0, 0, 0, 162}, /* Eject / Close */ + { 0, 0x84, 0, 0, 0, 0, 115}, /* Volume Up */ + { 0, 0x83, 0, 0, 0, 0, 114}, /* Volume Down */ + +/* + * KeyPad equal, found on Sun Type 4 and Mac keyboards + */ + + { 0, 0, 0, 0x2d, 0x67, 0x51, 117}, /* KP = */ + +/* + * KeyPad plusminus, found on DEC LK450 + */ + + { 0, 0xf9, 0, 0, 0, 0, 118}, /* DEC LK450 KP +- */ + +/* + * Japan alphabet switch key + */ + + { 0, 0x68, 0, 0, 0x87, 0, 124}, /* The Jpn key - clashes with Focus PF8 */ + { 0, 0, 0, 0, 0, 0, 0}}; + diff --git a/adb2usb/adb2uart/exsc/test.c b/adb2usb/adb2uart/exsc/test.c new file mode 100644 index 0000000..eb5572e --- /dev/null +++ b/adb2usb/adb2uart/exsc/test.c @@ -0,0 +1,10 @@ +#include + +#include "scancodes.h" + +int main() { + int x; + for (x=0; x<128; x++) { + printf("\t\t{%i, %i},\n", scancodes[x].adb, scancodes[x].usb); + } +} \ No newline at end of file diff --git a/adb2usb/adb2uart/main.c b/adb2usb/adb2uart/main.c new file mode 100644 index 0000000..0e5df63 --- /dev/null +++ b/adb2usb/adb2uart/main.c @@ -0,0 +1,121 @@ +/* +ADB to USB-converter, for a non-extended keyboard and a mouse +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#define F_CPU 12000000 +#include +#include +#include +#include +#include +#include +#include "adb.h" + +#include "scanadb2usb.h" + + +#define UDR0 UDR +#define UCSR0A UCSRA +#define UCSR0B UCSRB +#define UCSR0C UCSRC +#define UBRR0L UBRRL +#define UBRR0H UBRRH + + +void sendchar(char c) { + while(!(UCSR0A&(1<<5))) ; + UDR0=c; +} + +//Main routine +int main(void) { + unsigned char data[8]; + unsigned char keys[4]={0,0,0,0}; + unsigned char modFlags=0; + int ret; + int x; +// stdoutInit(39); //1228800MHz -> 19200 baud + UCSR0B=0x18; + UBRR0L=39; + UBRR0H=0; +// sei(); +// printf_P(PSTR("PWRON\n")); + PORTD&=~(1<0) { + char n; + sendchar('M'); + sendchar((data[0]&0x80)?0:1); + n=data[1]&0x7f; if (data[1]&0x40) n+=128; + sendchar(n); + n=data[0]&0x7f; if (data[0]&0x40) n+=128; + sendchar(n); +// printf("Mouse: %i %i, but=%i\n", data[0]&0x7f, data[1]&0x7f, (data[0]&0x80)?0:1); +// printf("Mouse: %x %x %x %x\n", data[0], data[1], data[2], data[3]); + } + ret=adbCommand((2<<4)|C_TALK|REG_0, data, 2); + if (ret>0) { + int x=0; + char mask=0; + unsigned char usbkey; + unsigned int key=data[0]&0x7F; + char press=data[0]&0x80; + if (key==0x7F) key=(data[1]&0x7f)+0x80; +// printf("Keyboard: key %3x %s.\n", key, press?"released":"pressed"); + while(pgm_read_byte(&scanadb2usb[x].usb)!=0) { + if (pgm_read_byte(&scanadb2usb[x].adb)==key) usbkey=pgm_read_byte(&scanadb2usb[x].usb); + x++; + } + x=0; + + //Check meta keys + mask=0; + if (key==0x36) mask=0x01; + if (key==0x38) mask=0x02; + if (key==0x37) mask=0x04; + if (key==0x7d) mask=0x10; + if (key==0x7b) mask=0x20; + + if (!mask) { + if (!press) { + while (x!=4 && keys[x]!=0) x++; + if (x!=4) keys[x]=usbkey; + } else { + for (x=0; x<4; x++) { + if (keys[x]==usbkey) keys[x]=0; + } + } + } else { + if (!press) { + modFlags|=mask; + } else { + modFlags&=~mask; + } + } + sendchar('K'); + sendchar(modFlags); + sendchar(keys[0]); + sendchar(keys[1]); + sendchar(keys[2]); + sendchar(keys[3]); + } + _delay_ms(9); + } +} diff --git a/adb2usb/adb2uart/notes.txt b/adb2usb/adb2uart/notes.txt new file mode 100644 index 0000000..73ab8a1 --- /dev/null +++ b/adb2usb/adb2uart/notes.txt @@ -0,0 +1,2 @@ +http://developer.apple.com/legacy/mac/library/technotes/hw/hw_01.html +http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011984 diff --git a/adb2usb/adb2uart/scanadb2usb.h b/adb2usb/adb2uart/scanadb2usb.h new file mode 100644 index 0000000..31b5478 --- /dev/null +++ b/adb2usb/adb2uart/scanadb2usb.h @@ -0,0 +1,110 @@ +struct scanadb2usb_t { + unsigned char adb; + unsigned char usb; +}; +//ADB to USB scancode table, generated (partially) by the tool in the +//exsc-dir +struct scanadb2usb_t scanadb2usb[] PROGMEM = { + {53, 41}, + {18, 30}, + {19, 31}, + {20, 32}, + {21, 33}, + {23, 34}, + {22, 35}, + {26, 36}, + {28, 37}, + {25, 38}, + {29, 39}, + {27, 45}, + {24, 46}, + {51, 42}, + {48, 43}, + {12, 20}, + {13, 26}, + {14, 8}, + {15, 21}, + {17, 23}, + {16, 28}, + {32, 24}, + {34, 12}, + {31, 18}, + {35, 19}, + {33, 47}, + {30, 48}, + {36, 40}, +// {54, 224}, + {0, 4}, + {1, 22}, + {2, 7}, + {3, 9}, + {5, 10}, + {4, 11}, + {38, 13}, + {40, 14}, + {37, 15}, + {41, 51}, + {39, 52}, + {50, 53}, +// {56, 225}, + {42, 49}, + {6, 29}, + {7, 27}, + {8, 6}, + {9, 25}, + {11, 5}, + {45, 17}, + {46, 16}, + {43, 54}, + {47, 55}, + {44, 56}, +// {123, 229}, + {67, 85}, + {55, 226}, + {49, 44}, + {57, 57}, + {122, 58}, + {120, 59}, + {99, 60}, + {118, 61}, + {96, 62}, + {97, 63}, + {98, 64}, + {100, 65}, + {101, 66}, + {109, 67}, + {71, 83}, + {107, 71}, + {89, 95}, + {91, 96}, + {92, 97}, + {78, 86}, + {86, 92}, + {87, 93}, + {88, 94}, + {69, 87}, + {83, 89}, + {84, 90}, + {85, 91}, + {82, 98}, + {65, 99}, + {103, 68}, + {111, 69}, + {76, 88}, + {75, 84}, +// {124, 230}, + {117, 76}, + {113, 72}, + {115, 74}, + {62, 82}, + {116, 75}, + {59, 80}, + {60, 79}, + {119, 77}, + {61, 81}, + {121, 78}, + {114, 73}, +// {125, 228}, + {255, 116}, //power key + {0,0} +}; diff --git a/adb2usb/uart2usb/Makefile b/adb2usb/uart2usb/Makefile new file mode 100644 index 0000000..7c6959b --- /dev/null +++ b/adb2usb/uart2usb/Makefile @@ -0,0 +1,171 @@ +# Name: Makefile +# Project: hid-mouse example +# Author: Christian Starkjohann +# Creation Date: 2008-04-07 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + +DEVICE = attiny2313 +F_CPU = 12000000 # in Hz +# see below for fuse values for particular devices +FUSE_L = 0xce +FUSE_H = 0xdf +AVRDUDE = avrdude -c usbasp -p $(DEVICE) -P bla # edit this line for your programmer + +#Shitload of C-flags to cram all of this into the 2K AVR :X +CFLAGS = -Ivusb/usbdrv -I. -DDEBUG_LEVEL=0 \ + -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ + -ffunction-sections -fdata-sections -ffreestanding -Wl,--gc-sections \ + -Wl,--relax -fno-tree-scev-cprop -fno-split-wide-types +# --param inline-call-cost=2 -finline-limit=3 -fno-inline-small-functions +OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) + +############################################################################## +# Fuse values for particular devices +############################################################################## +# If your device is not listed here, go to +# http://palmavr.sourceforge.net/cgi-bin/fc.cgi +# and choose options for external crystal clock and no clock divider +# +################################## ATMega8 ################################## +# ATMega8 FUSE_L (Fuse low byte): +# 0x9f = 1 0 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ BODEN (BrownOut Detector enabled) +# +-------------------- BODLEVEL (2.7V) +# ATMega8 FUSE_H (Fuse high byte): +# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) +# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 +# | | | | | +-------- BOOTSZ1 +# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) +# | | | +-------------- CKOPT (full output swing) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ WDTON (WDT not always on) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATMega48/88/168 ############################## +# ATMega*8 FUSE_L (Fuse low byte): +# 0xdf = 1 1 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ CKOUT (if 0: Clock output enabled) +# +-------------------- CKDIV8 (if 0: divide by 8) +# ATMega*8 FUSE_H (Fuse high byte): +# 0xde = 1 1 0 1 1 1 1 0 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V) +# | | | | + --------- EESAVE (preserve EEPROM over chip erase) +# | | | +-------------- WDTON (if 0: watchdog always on) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATTiny25/45/85 ############################### +# ATMega*5 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATMega*5 FUSE_H (Fuse high byte): +# 0xdd = 1 1 0 1 1 1 0 1 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (disable external reset -> enabled) +# +################################ ATTiny2313 ################################# +# ATTiny2313 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATTiny2313 FUSE_H (Fuse high byte): +# 0xdb = 1 1 0 1 1 0 1 1 +# ^ ^ ^ ^ \-+-/ ^ +# | | | | | +---- RSTDISBL (disable external reset -> enabled) +# | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# +-------------------- DWEN (debug wire enable) + +first: flash + +# symbolic targets: +help: + @echo "This Makefile has no default rule. Use one of the following:" + @echo "make hex ....... to build main.hex" + @echo "make program ... to flash fuses and firmware" + @echo "make fuse ...... to flash the fuses" + @echo "make flash ..... to flash the firmware (use this on metaboard)" + @echo "make clean ..... to delete objects and hex file" + +hex: main.hex + +program: flash fuse + +# rule for programming fuse bits: +fuse: + @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ + { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } + $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m + +# rule for uploading firmware: +flash: main.hex + $(AVRDUDE) -U flash:w:main.hex:i + +# rule for deleting dependent files (those which can be built by Make): +clean: + rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s + +# Generic rule for compiling C files: +.c.o: + $(COMPILE) -c $< -o $@ + +# Generic rule for assembling Assembler source files: +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +# Generic rule for compiling C to assembler, used for debugging only. +.c.s: + $(COMPILE) -S $< -o $@ + +# file targets: + +# Since we don't want to ship the driver multipe times, we copy it into this project: +usbdrv: + cp -r vusb//usbdrv . + +main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it + $(COMPILE) -o main.elf $(OBJECTS) + +main.hex: main.elf + rm -f main.hex main.eep.hex + avr-objcopy -j .text -j .data -O ihex main.elf main.hex + avr-size main.hex + +# debugging targets: + +disasm: main.elf + avr-objdump -d main.elf + +cpp: + $(COMPILE) -E main.c diff --git a/adb2usb/uart2usb/main.c b/adb2usb/uart2usb/main.c new file mode 100644 index 0000000..b95e2ba --- /dev/null +++ b/adb2usb/uart2usb/main.c @@ -0,0 +1,222 @@ +/* +ADB to USB-converter, for a non-extended keyboard and a mouse +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include +#include +#include /* for sei() */ +#include /* for _delay_ms() */ + +#include /* required by usbdrv.h */ +#include "usbdrv.h" +//#include "usbdrv/usbdrv.c" +#include "oddebug.h" /* This is also an example for using debug macros */ + + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +char usbHidReportDescriptor[] PROGMEM = { + /* partial keyboard */ + 0x05, 0x01, /* Usage Page (Generic Desktop), */ + 0x09, 0x06, /* Usage (Keyboard), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x01, /* Report Id (1) */ + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x08, // REPORT_COUNT (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + + 0x05, 0x07, /* Usage Page (Key Codes), */ + 0x95, 0x04, /* Report Count (4), */ + 0x75, 0x08, /* Report Size (8), */ + 0x15, 0x00, /* Logical Minimum (0), */ + 0x25, 0x75, /* Logical Maximum(117), */ + 0x19, 0x00, /* Usage Minimum (0), */ + 0x29, 0x75, /* Usage Maximum (117), */ + 0x81, 0x00, /* Input (Data, Array), ;Key arrays (4 bytes) */ + 0xC0, /* End Collection */ + + /* mouse */ + 0x05, 0x01, /* Usage Page (Generic Desktop), */ + 0x09, 0x02, /* Usage (Mouse), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x09, 0x01, /* Usage (Pointer), */ + 0xA1, 0x00, /* Collection (Physical), */ + 0x05, 0x09, /* Usage Page (Buttons), */ + 0x19, 0x01, /* Usage Minimum (01), */ + 0x29, 0x03, /* Usage Maximun (03), */ + 0x15, 0x00, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x85, 0x02, /* Report Id (2) */ + 0x95, 0x03, /* Report Count (3), */ + 0x75, 0x01, /* Report Size (1), */ + 0x81, 0x02, /* Input (Data, Variable, Absolute), ;3 button bits */ + 0x95, 0x01, /* Report Count (1), */ + 0x75, 0x05, /* Report Size (5), */ + 0x81, 0x01, /* Input (Constant), ;5 bit padding */ + 0x05, 0x01, /* Usage Page (Generic Desktop), */ + 0x09, 0x30, /* Usage (X), */ + 0x09, 0x31, /* Usage (Y), */ + 0x15, 0x81, /* Logical Minimum (-127), */ + 0x25, 0x7F, /* Logical Maximum (127), */ + 0x75, 0x08, /* Report Size (8), */ + 0x95, 0x02, /* Report Count (2), */ + 0x81, 0x06, /* Input (Data, Variable, Relative), ;2 position bytes (X & Y) */ + 0xC0, /* End Collection, */ + 0xC0, /* End Collection */ +}; + +typedef struct { + char id; + char meta; + char b[4]; +}keybReport_t; + +typedef struct{ + char id; + uchar buttonMask; + char dx; + char dy; +}mouseReport_t; + +static keybReport_t keybReportBuffer={1, 0, {0, 0, 0, 0}}; +static mouseReport_t mouseReportBuffer={2, 0, 0, 0}; +static uchar idleRate; /* repeat rate for keyboards, never used for mice */ +static char doSend; + +#define SEND_MOUSE 1 +#define SEND_KEYB 2 + + +//Parses a byte from the ADB receiving microcontroller. +//Includes a state machne to convert the individual bytes into a +//HID report we can send. +static void parseByte(unsigned char b) { + static unsigned char buff[8]; + static int toGet=0; //Bytes left in this hid report + static int p=0; //Buffer index + if (toGet==0) { + if (b=='M') { + toGet=4; + } else if (b=='K') { + toGet=6; + } + } + if (toGet>0) { + buff[p++]=b; + toGet--; + if (toGet==0) { //Got all bytes we need? + if (buff[0]=='M') { + mouseReportBuffer.buttonMask=buff[1]; + mouseReportBuffer.dx+=buff[2]; + mouseReportBuffer.dy+=buff[3]; + doSend|=SEND_MOUSE; + } else if (buff[0]=='K') { + keybReportBuffer.meta=buff[1]; + keybReportBuffer.b[0]=buff[2]; + keybReportBuffer.b[1]=buff[3]; + keybReportBuffer.b[2]=buff[4]; + keybReportBuffer.b[3]=buff[5]; + doSend|=SEND_KEYB; + } + p=0; + } + } +} + + +usbMsgLen_t usbFunctionSetup(uchar data[8]) { + usbRequest_t *rq = (void *)data; + /* The following requests are never used. But since they are required by + * the specification, we implement them in this example. + */ + if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */ + if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ + if (rq->wValue.bytes[1]==1) { + usbMsgPtr = (void *)&mouseReportBuffer; + return sizeof(mouseReportBuffer); + } else if (rq->wValue.bytes[1]==2) { + usbMsgPtr = (void *)&mouseReportBuffer; + return sizeof(mouseReportBuffer); + } + } else if(rq->bRequest == USBRQ_HID_GET_IDLE){ + usbMsgPtr = &idleRate; + return 1; + } else if(rq->bRequest == USBRQ_HID_SET_IDLE){ + idleRate = rq->wValue.bytes[1]; + } + }else{ + /* no vendor specific requests implemented */ + } + return 0; /* default for not implemented requests: return no data back to host */ +} + +/* ------------------------------------------------------------------------- */ + +int __attribute__((noreturn)) main(void) { + uchar i; + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + DDRD=0; + UCSRB=0x18; + UBRRL=39; + UBRRH=0; + odDebugInit(); + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ // fake USB disconnect for > 250 ms + wdt_reset(); + _delay_ms(1); + } + + usbDeviceConnect(); + sei(); + for(;;){ /* main event loop */ + wdt_reset(); + usbPoll(); + if(usbInterruptIsReady()){ + if (doSend&SEND_MOUSE) { + /* called after every poll of the interrupt endpoint */ + usbSetInterrupt((void *)&mouseReportBuffer, sizeof(mouseReportBuffer)); + mouseReportBuffer.dx=0; + mouseReportBuffer.dy=0; + mouseReportBuffer.buttonMask=0; + doSend&=~SEND_MOUSE; + } else if (doSend&SEND_KEYB) { + usbSetInterrupt((void *)&keybReportBuffer, sizeof(keybReportBuffer)); + keybReportBuffer.b[0]=0; + doSend&=~SEND_KEYB; + } + } + if (UCSRA&(1<<7)) parseByte(UDR); + } +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/usbconfig.h b/adb2usb/uart2usb/usbconfig.h new file mode 100644 index 0000000..4a57987 --- /dev/null +++ b/adb2usb/uart2usb/usbconfig.h @@ -0,0 +1,373 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 4 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +#define USB_CFG_PULLUP_IOPORTNAME D +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +#define USB_CFG_PULLUP_BIT 3 +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 10 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 100 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 0 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 0 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */ +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID 0xe8, 0x03 /* VOTI's lab use PID */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 's', 'p', 'r', 'i', 't', 'e', 's', 'm', 'o', 'd', 's', '.', 'c', 'o', 'm' +#define USB_CFG_VENDOR_NAME_LEN 15 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'A', 'D', 'B', '2', 'U', 'S', 'B' +#define USB_CFG_DEVICE_NAME_LEN 7 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 93 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +//#define USB_PUBLIC static +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +#endif /* __usbconfig_h_included__ */ diff --git a/adb2usb/uart2usb/usbdrv/Changelog.txt b/adb2usb/uart2usb/usbdrv/Changelog.txt new file mode 100644 index 0000000..5c6354a --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/Changelog.txt @@ -0,0 +1,308 @@ +This file documents changes in the firmware-only USB driver for atmel's AVR +microcontrollers. New entries are always appended to the end of the file. +Scroll down to the bottom to see the most recent changes. + +2005-04-01: + - Implemented endpoint 1 as interrupt-in endpoint. + - Moved all configuration options to usbconfig.h which is not part of the + driver. + - Changed interface for usbVendorSetup(). + - Fixed compatibility with ATMega8 device. + - Various minor optimizations. + +2005-04-11: + - Changed interface to application: Use usbFunctionSetup(), usbFunctionRead() + and usbFunctionWrite() now. Added configuration options to choose which + of these functions to compile in. + - Assembler module delivers receive data non-inverted now. + - Made register and bit names compatible with more AVR devices. + +2005-05-03: + - Allow address of usbRxBuf on any memory page as long as the buffer does + not cross 256 byte page boundaries. + - Better device compatibility: works with Mega88 now. + - Code optimization in debugging module. + - Documentation updates. + +2006-01-02: + - Added (free) default Vendor- and Product-IDs bought from voti.nl. + - Added USBID-License.txt file which defines the rules for using the free + shared VID/PID pair. + - Added Readme.txt to the usbdrv directory which clarifies administrative + issues. + +2006-01-25: + - Added "configured state" to become more standards compliant. + - Added "HALT" state for interrupt endpoint. + - Driver passes the "USB Command Verifier" test from usb.org now. + - Made "serial number" a configuration option. + - Minor optimizations, we now recommend compiler option "-Os" for best + results. + - Added a version number to usbdrv.h + +2006-02-03: + - New configuration variable USB_BUFFER_SECTION for the memory section where + the USB rx buffer will go. This defaults to ".bss" if not defined. Since + this buffer MUST NOT cross 256 byte pages (not even touch a page at the + end), the user may want to pass a linker option similar to + "-Wl,--section-start=.mybuffer=0x800060". + - Provide structure for usbRequest_t. + - New defines for USB constants. + - Prepared for HID implementations. + - Increased data size limit for interrupt transfers to 8 bytes. + - New macro usbInterruptIsReady() to query interrupt buffer state. + +2006-02-18: + - Ensure that the data token which is sent as an ack to an OUT transfer is + always zero sized. This fixes a bug where the host reports an error after + sending an out transfer to the device, although all data arrived at the + device. + - Updated docs in usbdrv.h to reflect changed API in usbFunctionWrite(). + +* Release 2006-02-20 + + - Give a compiler warning when compiling with debugging turned on. + - Added Oleg Semyonov's changes for IAR-cc compatibility. + - Added new (optional) functions usbDeviceConnect() and usbDeviceDisconnect() + (also thanks to Oleg!). + - Rearranged tests in usbPoll() to save a couple of instructions in the most + likely case that no actions are pending. + - We need a delay between the SET ADDRESS request until the new address + becomes active. This delay was handled in usbPoll() until now. Since the + spec says that the delay must not exceed 2ms, previous versions required + aggressive polling during the enumeration phase. We have now moved the + handling of the delay into the interrupt routine. + - We must not reply with NAK to a SETUP transaction. We can only achieve this + by making sure that the rx buffer is empty when SETUP tokens are expected. + We therefore don't pass zero sized data packets from the status phase of + a transfer to usbPoll(). This change MAY cause troubles if you rely on + receiving a less than 8 bytes long packet in usbFunctionWrite() to + identify the end of a transfer. usbFunctionWrite() will NEVER be called + with a zero length. + +* Release 2006-03-14 + + - Improved IAR C support: tiny memory model, more devices + - Added template usbconfig.h file under the name usbconfig-prototype.h + +* Release 2006-03-26 + + - Added provision for one more interrupt-in endpoint (endpoint 3). + - Added provision for one interrupt-out endpoint (endpoint 1). + - Added flowcontrol macros for USB. + - Added provision for custom configuration descriptor. + - Allow ANY two port bits for D+ and D-. + - Merged (optional) receive endpoint number into global usbRxToken variable. + - Use USB_CFG_IOPORTNAME instead of USB_CFG_IOPORT. We now construct the + variable name from the single port letter instead of computing the address + of related ports from the output-port address. + +* Release 2006-06-26 + + - Updated documentation in usbdrv.h and usbconfig-prototype.h to reflect the + new features. + - Removed "#warning" directives because IAR does not understand them. Use + unused static variables instead to generate a warning. + - Do not include when compiling with IAR. + - Introduced USB_CFG_DESCR_PROPS_* in usbconfig.h to configure how each + USB descriptor should be handled. It is now possible to provide descriptor + data in Flash, RAM or dynamically at runtime. + - STALL is now a status in usbTxLen* instead of a message. We can now conform + to the spec and leave the stall status pending until it is cleared. + - Made usbTxPacketCnt1 and usbTxPacketCnt3 public. This allows the + application code to reset data toggling on interrupt pipes. + +* Release 2006-07-18 + + - Added an #if !defined __ASSEMBLER__ to the warning in usbdrv.h. This fixes + an assembler error. + - usbDeviceDisconnect() takes pull-up resistor to high impedance now. + +* Release 2007-02-01 + + - Merged in some code size improvements from usbtiny (thanks to Dick + Streefland for these optimizations!) + - Special alignment requirement for usbRxBuf not required any more. Thanks + again to Dick Streefland for this hint! + - Reverted to "#warning" instead of unused static variables -- new versions + of IAR CC should handle this directive. + - Changed Open Source license to GNU GPL v2 in order to make linking against + other free libraries easier. We no longer require publication of the + circuit diagrams, but we STRONGLY encourage it. If you improve the driver + itself, PLEASE grant us a royalty free license to your changes for our + commercial license. + +* Release 2007-03-29 + + - New configuration option "USB_PUBLIC" in usbconfig.h. + - Set USB version number to 1.10 instead of 1.01. + - Code used USB_CFG_DESCR_PROPS_STRING_DEVICE and + USB_CFG_DESCR_PROPS_STRING_PRODUCT inconsistently. Changed all occurrences + to USB_CFG_DESCR_PROPS_STRING_PRODUCT. + - New assembler module for 16.5 MHz RC oscillator clock with PLL in receiver + code. + - New assembler module for 16 MHz crystal. + - usbdrvasm.S contains common code only, clock-specific parts have been moved + to usbdrvasm12.S, usbdrvasm16.S and usbdrvasm165.S respectively. + +* Release 2007-06-25 + + - 16 MHz module: Do SE0 check in stuffed bits as well. + +* Release 2007-07-07 + + - Define hi8(x) for IAR compiler to limit result to 8 bits. This is necessary + for negative values. + - Added 15 MHz module contributed by V. Bosch. + - Interrupt vector name can now be configured. This is useful if somebody + wants to use a different hardware interrupt than INT0. + +* Release 2007-08-07 + + - Moved handleIn3 routine in usbdrvasm16.S so that relative jump range is + not exceeded. + - More config options: USB_RX_USER_HOOK(), USB_INITIAL_DATATOKEN, + USB_COUNT_SOF + - USB_INTR_PENDING can now be a memory address, not just I/O + +* Release 2007-09-19 + + - Split out common parts of assembler modules into separate include file + - Made endpoint numbers configurable so that given interface definitions + can be matched. See USB_CFG_EP3_NUMBER in usbconfig-prototype.h. + - Store endpoint number for interrupt/bulk-out so that usbFunctionWriteOut() + can handle any number of endpoints. + - Define usbDeviceConnect() and usbDeviceDisconnect() even if no + USB_CFG_PULLUP_IOPORTNAME is defined. Directly set D+ and D- to 0 in this + case. + +* Release 2007-12-01 + + - Optimize usbDeviceConnect() and usbDeviceDisconnect() for less code size + when USB_CFG_PULLUP_IOPORTNAME is not defined. + +* Release 2007-12-13 + + - Renamed all include-only assembler modules from *.S to *.inc so that + people don't add them to their project sources. + - Distribute leap bits in tx loop more evenly for 16 MHz module. + - Use "macro" and "endm" instead of ".macro" and ".endm" for IAR + - Avoid compiler warnings for constant expr range by casting some values in + USB descriptors. + +* Release 2008-01-21 + + - Fixed bug in 15 and 16 MHz module where the new address set with + SET_ADDRESS was already accepted at the next NAK or ACK we send, not at + the next data packet we send. This caused problems when the host polled + too fast. Thanks to Alexander Neumann for his help and patience debugging + this issue! + +* Release 2008-02-05 + + - Fixed bug in 16.5 MHz module where a register was used in the interrupt + handler before it was pushed. This bug was introduced with version + 2007-09-19 when common parts were moved to a separate file. + - Optimized CRC routine (thanks to Reimar Doeffinger). + +* Release 2008-02-16 + + - Removed outdated IAR compatibility stuff (code sections). + - Added hook macros for USB_RESET_HOOK() and USB_SET_ADDRESS_HOOK(). + - Added optional routine usbMeasureFrameLength() for calibration of the + internal RC oscillator. + +* Release 2008-02-28 + + - USB_INITIAL_DATATOKEN defaults to USBPID_DATA1 now, which means that we + start with sending USBPID_DATA0. + - Changed defaults in usbconfig-prototype.h + - Added free USB VID/PID pair for MIDI class devices + - Restructured AVR-USB as separate package, not part of PowerSwitch any more. + +* Release 2008-04-18 + + - Restructured usbdrv.c so that it is easier to read and understand. + - Better code optimization with gcc 4. + - If a second interrupt in endpoint is enabled, also add it to config + descriptor. + - Added config option for long transfers (above 254 bytes), see + USB_CFG_LONG_TRANSFERS in usbconfig.h. + - Added 20 MHz module contributed by Jeroen Benschop. + +* Release 2008-05-13 + + - Fixed bug in libs-host/hiddata.c function usbhidGetReport(): length + was not incremented, pointer to length was incremented instead. + - Added code to command line tool(s) which claims an interface. This code + is disabled by default, but may be necessary on newer Linux kernels. + - Added usbconfig.h option "USB_CFG_CHECK_DATA_TOGGLING". + - New header "usbportability.h" prepares ports to other development + environments. + - Long transfers (above 254 bytes) did not work when usbFunctionRead() was + used to supply the data. Fixed this bug. [Thanks to Alexander Neumann!] + - In hiddata.c (example code for sending/receiving data over HID), use + USB_RECIP_DEVICE instead of USB_RECIP_INTERFACE for control transfers so + that we need not claim the interface. + - in usbPoll() loop 20 times polling for RESET state instead of 10 times. + This accounts for the higher clock rates we now support. + - Added a module for 12.8 MHz RC oscillator with PLL in receiver loop. + - Added hook to SOF code so that oscillator can be tuned to USB frame clock. + - Added timeout to waitForJ loop. Helps preventing unexpected hangs. + - Added example code for oscillator tuning to libs-device (thanks to + Henrik Haftmann for the idea to this routine). + - Implemented option USB_CFG_SUPPRESS_INTR_CODE. + +* Release 2008-10-22 + + - Fixed libs-device/osctune.h: OSCCAL is memory address on ATMega88 and + similar, not offset of 0x20 needs to be added. + - Allow distribution under GPLv3 for those who have to link against other + code distributed under GPLv3. + +* Release 2008-11-26 + + - Removed libusb-win32 dependency for hid-data example in Makefile.windows. + It was never required and confused many people. + - Added extern uchar usbRxToken to usbdrv.h. + - Integrated a module with CRC checks at 18 MHz by Lukas Schrittwieser. + +* Release 2009-03-23 + + - Hid-mouse example used settings from hid-data example, fixed that. + - Renamed project to V-USB due to a trademark issue with Atmel(r). + - Changed CommercialLicense.txt and USBID-License.txt to make the + background of USB ID registration clearer. + +* Release 2009-04-15 + + - Changed CommercialLicense.txt to reflect the new range of PIDs from + Jason Kotzin. + - Removed USBID-License.txt in favor of USB-IDs-for-free.txt and + USB-ID-FAQ.txt + - Fixed a bug in the 12.8 MHz module: End Of Packet decection was made in + the center between bit 0 and 1 of each byte. This is where the data lines + are expected to change and the sampled data may therefore be nonsense. + We therefore check EOP ONLY if bits 0 AND 1 have both been read as 0 on D-. + - Fixed a bitstuffing problem in the 16 MHz module: If bit 6 was stuffed, + the unstuffing code in the receiver routine was 1 cycle too long. If + multiple bytes had the unstuffing in bit 6, the error summed up until the + receiver was out of sync. + - Included option for faster CRC routine. + Thanks to Slawomir Fras (BoskiDialer) for this code! + - Updated bits in Configuration Descriptor's bmAttributes according to + USB 1.1 (in particular bit 7, it is a must-be-set bit now). + +* Release 2009-08-22 + + - Moved first DBG1() after odDebugInit() in all examples. + - Use vector INT0_vect instead of SIG_INTERRUPT0 if defined. This makes + V-USB compatible with the new "p" suffix devices (e.g. ATMega328p). + - USB_CFG_CLOCK_KHZ setting is now required in usbconfig.h (no default any + more). + - New option USB_CFG_DRIVER_FLASH_PAGE allows boot loaders on devices with + more than 64 kB flash. + - Built-in configuration descriptor allows custom definition for second + endpoint now. + +* Release 2010-07-15 diff --git a/adb2usb/uart2usb/usbdrv/CommercialLicense.txt b/adb2usb/uart2usb/usbdrv/CommercialLicense.txt new file mode 100644 index 0000000..11d07d9 --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/CommercialLicense.txt @@ -0,0 +1,166 @@ +V-USB Driver Software License Agreement +Version 2009-08-03 + +THIS LICENSE AGREEMENT GRANTS YOU CERTAIN RIGHTS IN A SOFTWARE. YOU CAN +ENTER INTO THIS AGREEMENT AND ACQUIRE THE RIGHTS OUTLINED BELOW BY PAYING +THE AMOUNT ACCORDING TO SECTION 4 ("PAYMENT") TO OBJECTIVE DEVELOPMENT. + + +1 DEFINITIONS + +1.1 "OBJECTIVE DEVELOPMENT" shall mean OBJECTIVE DEVELOPMENT Software GmbH, +Grosse Schiffgasse 1A/7, 1020 Wien, AUSTRIA. + +1.2 "You" shall mean the Licensee. + +1.3 "V-USB" shall mean all files included in the package distributed under +the name "vusb" by OBJECTIVE DEVELOPMENT (http://www.obdev.at/vusb/) +unless otherwise noted. This includes the firmware-only USB device +implementation for Atmel AVR microcontrollers, some simple device examples +and host side software examples and libraries. + + +2 LICENSE GRANTS + +2.1 Source Code. OBJECTIVE DEVELOPMENT shall furnish you with the source +code of V-USB. + +2.2 Distribution and Use. OBJECTIVE DEVELOPMENT grants you the +non-exclusive right to use, copy and distribute V-USB with your hardware +product(s), restricted by the limitations in section 3 below. + +2.3 Modifications. OBJECTIVE DEVELOPMENT grants you the right to modify +the source code and your copy of V-USB according to your needs. + +2.4 USB IDs. OBJECTIVE DEVELOPMENT furnishes you with one or two USB +Product ID(s), sent to you in e-mail. These Product IDs are reserved +exclusively for you. OBJECTIVE DEVELOPMENT has obtained USB Product ID +ranges under the Vendor ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under the Vendor ID 8352 from +Jason Kotzin (Clay Logic, www.claylogic.com). Both owners of the Vendor IDs +have obtained these IDs from the USB Implementers Forum, Inc. +(www.usb.org). OBJECTIVE DEVELOPMENT disclaims all liability which might +arise from the assignment of USB IDs. + +2.5 USB Certification. Although not part of this agreement, we want to make +it clear that you cannot become USB certified when you use V-USB or a USB +Product ID assigned by OBJECTIVE DEVELOPMENT. AVR microcontrollers don't +meet the electrical specifications required by the USB specification and +the USB Implementers Forum certifies only members who bought a Vendor ID of +their own. + + +3 LICENSE RESTRICTIONS + +3.1 Number of Units. Only one of the following three definitions is +applicable. Which one is determined by the amount you pay to OBJECTIVE +DEVELOPMENT, see section 4 ("Payment") below. + +Hobby License: You may use V-USB according to section 2 above in no more +than 5 hardware units. These units must not be sold for profit. + +Entry Level License: You may use V-USB according to section 2 above in no +more than 150 hardware units. + +Professional License: You may use V-USB according to section 2 above in +any number of hardware units, except for large scale production ("unlimited +fair use"). Quantities below 10,000 units are not considered large scale +production. If your reach quantities which are obviously large scale +production, you must pay a license fee of 0.10 EUR per unit for all units +above 10,000. + +3.2 Rental. You may not rent, lease, or lend V-USB or otherwise encumber +any copy of V-USB, or any of the rights granted herein. + +3.3 Transfer. You may not transfer your rights under this Agreement to +another party without OBJECTIVE DEVELOPMENT's prior written consent. If +such consent is obtained, you may permanently transfer this License to +another party. The recipient of such transfer must agree to all terms and +conditions of this Agreement. + +3.4 Reservation of Rights. OBJECTIVE DEVELOPMENT retains all rights not +expressly granted. + +3.5 Non-Exclusive Rights. Your license rights under this Agreement are +non-exclusive. + +3.6 Third Party Rights. This Agreement cannot grant you rights controlled +by third parties. In particular, you are not allowed to use the USB logo or +other trademarks owned by the USB Implementers Forum, Inc. without their +consent. Since such consent depends on USB certification, it should be +noted that V-USB will not pass certification because it does not +implement checksum verification and the microcontroller ports do not meet +the electrical specifications. + + +4 PAYMENT + +The payment amount depends on the variation of this agreement (according to +section 3.1) into which you want to enter. Concrete prices are listed on +OBJECTIVE DEVELOPMENT's web site, usually at +http://www.obdev.at/vusb/license.html. You agree to pay the amount listed +there to OBJECTIVE DEVELOPMENT or OBJECTIVE DEVELOPMENT's payment processor +or reseller. + + +5 COPYRIGHT AND OWNERSHIP + +V-USB is protected by copyright laws and international copyright +treaties, as well as other intellectual property laws and treaties. V-USB +is licensed, not sold. + + +6 TERM AND TERMINATION + +6.1 Term. This Agreement shall continue indefinitely. However, OBJECTIVE +DEVELOPMENT may terminate this Agreement and revoke the granted license and +USB-IDs if you fail to comply with any of its terms and conditions. + +6.2 Survival of Terms. All provisions regarding secrecy, confidentiality +and limitation of liability shall survive termination of this agreement. + + +7 DISCLAIMER OF WARRANTY AND LIABILITY + +LIMITED WARRANTY. V-USB IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, OBJECTIVE +DEVELOPMENT AND ITS SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND +NON-INFRINGEMENT, WITH REGARD TO V-USB, AND THE PROVISION OF OR FAILURE +TO PROVIDE SUPPORT SERVICES. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL +RIGHTS. YOU MAY HAVE OTHERS, WHICH VARY FROM STATE/JURISDICTION TO +STATE/JURISDICTION. + +LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, +IN NO EVENT SHALL OBJECTIVE DEVELOPMENT OR ITS SUPPLIERS BE LIABLE FOR ANY +SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER +(INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, +BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY +LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE V-USB OR THE +PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, EVEN IF OBJECTIVE +DEVELOPMENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY +CASE, OBJECTIVE DEVELOPMENT'S ENTIRE LIABILITY UNDER ANY PROVISION OF THIS +AGREEMENT SHALL BE LIMITED TO THE AMOUNT ACTUALLY PAID BY YOU FOR V-USB. + + +8 MISCELLANEOUS TERMS + +8.1 Marketing. OBJECTIVE DEVELOPMENT has the right to mention for marketing +purposes that you entered into this agreement. + +8.2 Entire Agreement. This document represents the entire agreement between +OBJECTIVE DEVELOPMENT and you. It may only be modified in writing signed by +an authorized representative of both, OBJECTIVE DEVELOPMENT and you. + +8.3 Severability. In case a provision of these terms and conditions should +be or become partly or entirely invalid, ineffective, or not executable, +the validity of all other provisions shall not be affected. + +8.4 Applicable Law. This agreement is governed by the laws of the Republic +of Austria. + +8.5 Responsible Courts. The responsible courts in Vienna/Austria will have +exclusive jurisdiction regarding all disputes in connection with this +agreement. + diff --git a/adb2usb/uart2usb/usbdrv/License.txt b/adb2usb/uart2usb/usbdrv/License.txt new file mode 100644 index 0000000..4460cfb --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/License.txt @@ -0,0 +1,361 @@ +OBJECTIVE DEVELOPMENT GmbH's V-USB driver software is distributed under the +terms and conditions of the GNU GPL version 2 or the GNU GPL version 3. It is +your choice whether you apply the terms of version 2 or version 3. The full +text of GPLv2 is included below. In addition to the requirements in the GPL, +we STRONGLY ENCOURAGE you to do the following: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/adb2usb/uart2usb/usbdrv/Readme.txt b/adb2usb/uart2usb/usbdrv/Readme.txt new file mode 100644 index 0000000..970dc66 --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/Readme.txt @@ -0,0 +1,172 @@ +This is the Readme file to Objective Development's firmware-only USB driver +for Atmel AVR microcontrollers. For more information please visit +http://www.obdev.at/vusb/ + +This directory contains the USB firmware only. Copy it as-is to your own +project and add all .c and .S files to your project (these files are marked +with an asterisk in the list below). Then copy usbconfig-prototype.h as +usbconfig.h to your project and edit it according to your configuration. + + +TECHNICAL DOCUMENTATION +======================= +The technical documentation (API) for the firmware driver is contained in the +file "usbdrv.h". Please read all of it carefully! Configuration options are +documented in "usbconfig-prototype.h". + +The driver consists of the following files: + Readme.txt ............. The file you are currently reading. + Changelog.txt .......... Release notes for all versions of the driver. + usbdrv.h ............... Driver interface definitions and technical docs. +* usbdrv.c ............... High level language part of the driver. Link this + module to your code! +* usbdrvasm.S ............ Assembler part of the driver. This module is mostly + a stub and includes one of the usbdrvasm*.S files + depending on processor clock. Link this module to + your code! + usbdrvasm*.inc ......... Assembler routines for particular clock frequencies. + Included by usbdrvasm.S, don't link it directly! + asmcommon.inc .......... Common assembler routines. Included by + usbdrvasm*.inc, don't link it directly! + usbconfig-prototype.h .. Prototype for your own usbdrv.h file. +* oddebug.c .............. Debug functions. Only used when DEBUG_LEVEL is + defined to a value greater than 0. Link this module + to your code! + oddebug.h .............. Interface definitions of the debug module. + usbportability.h ....... Header with compiler-dependent stuff. + usbdrvasm.asm .......... Compatibility stub for IAR-C-compiler. Use this + module instead of usbdrvasm.S when you assembler + with IAR's tools. + License.txt ............ Open Source license for this driver. + CommercialLicense.txt .. Optional commercial license for this driver. + USB-ID-FAQ.txt ......... General infos about USB Product- and Vendor-IDs. + USB-IDs-for-free.txt ... List and terms of use for free shared PIDs. + +(*) ... These files should be linked to your project. + + +CPU CORE CLOCK FREQUENCY +======================== +We supply assembler modules for clock frequencies of 12 MHz, 12.8 MHz, 15 MHz, +16 MHz, 16.5 MHz 18 MHz and 20 MHz. Other clock rates are not supported. The +actual clock rate must be configured in usbconfig.h. + +12 MHz Clock +This is the traditional clock rate of V-USB because it's the lowest clock +rate where the timing constraints of the USB spec can be met. + +15 MHz Clock +Similar to 12 MHz, but some NOPs inserted. On the other hand, the higher clock +rate allows for some loops which make the resulting code size somewhat smaller +than the 12 MHz version. + +16 MHz Clock +This clock rate has been added for users of the Arduino board and other +ready-made boards which come with a fixed 16 MHz crystal. It's also an option +if you need the slightly higher clock rate for performance reasons. Since +16 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code +is somewhat tricky and has to insert a leap cycle every third byte. + +12.8 MHz and 16.5 MHz Clock +The assembler modules for these clock rates differ from the other modules +because they have been built for an RC oscillator with only 1% precision. The +receiver code inserts leap cycles to compensate for clock deviations. 1% is +also the precision which can be achieved by calibrating the internal RC +oscillator of the AVR. Please note that only AVRs with internal 64 MHz PLL +oscillator can reach 16.5 MHz with the RC oscillator. This includes the very +popular ATTiny25, ATTiny45, ATTiny85 series as well as the ATTiny26. Almost +all AVRs can reach 12.8 MHz, although this is outside the specified range. + +See the EasyLogger example at http://www.obdev.at/vusb/easylogger.html for +code which calibrates the RC oscillator based on the USB frame clock. + +18 MHz Clock +This module is closer to the USB specification because it performs an on the +fly CRC check for incoming packets. Packets with invalid checksum are +discarded as required by the spec. If you also implement checks for data +PID toggling on application level (see option USB_CFG_CHECK_DATA_TOGGLING +in usbconfig.h for more info), this ensures data integrity. Due to the CRC +tables and alignment requirements, this code is bigger than modules for other +clock rates. To activate this module, you must define USB_CFG_CHECK_CRC to 1 +and USB_CFG_CLOCK_KHZ to 18000 in usbconfig.h. + +20 MHz Clock +This module is for people who won't do it with less than the maximum. Since +20 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code +uses similar tricks as the 16 MHz module to insert leap cycles. + + +USB IDENTIFIERS +=============== +Every USB device needs a vendor- and a product-identifier (VID and PID). VIDs +are obtained from usb.org for a price of 1,500 USD. Once you have a VID, you +can assign PIDs at will. + +Since an entry level cost of 1,500 USD is too high for most small companies +and hobbyists, we provide some VID/PID pairs for free. See the file +USB-IDs-for-free.txt for details. + +Objective Development also has some license offerings which include product +IDs. See http://www.obdev.at/vusb/ for details. + + +DEVELOPMENT SYSTEM +================== +This driver has been developed and optimized for the GNU compiler version 3 +and 4. We recommend that you use the GNU compiler suite because it is freely +available. V-USB has also been ported to the IAR compiler and assembler. It +has been tested with IAR 4.10B/W32 and 4.12A/W32 on an ATmega8 with the +"small" and "tiny" memory model. Not every release is tested with IAR CC and +the driver may therefore fail to compile with IAR. Please note that gcc is +more efficient for usbdrv.c because this module has been deliberately +optimized for gcc. + +Gcc version 3 produces smaller code than version 4 due to new optimizing +capabilities which don't always improve things on 8 bit CPUs. The code size +generated by gcc 4 can be reduced with the compiler options +-fno-move-loop-invariants, -fno-tree-scev-cprop and +-fno-inline-small-functions in addition to -Os. On devices with more than +8k of flash memory, we also recommend the linker option --relax (written as +-Wl,--relax for gcc) to convert absolute calls into relative where possible. + +For more information about optimizing options see: + + http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html + +These optimizations are good for gcc 4.x. Version 3.x of gcc does not support +most of these options and produces good code anyway. + + +USING V-USB FOR FREE +==================== +The AVR firmware driver is published under the GNU General Public License +Version 2 (GPL2) and the GNU General Public License Version 3 (GPL3). It is +your choice whether you apply the terms of version 2 or version 3. + +If you decide for the free GPL2 or GPL3, we STRONGLY ENCOURAGE you to do the +following things IN ADDITION to the obligations from the GPL: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. +If you don't have a web site, you can publish the project in obdev's +documentation wiki at +http://www.obdev.at/goto.php?t=vusb-wiki&p=hosted-projects. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + +COMMERCIAL LICENSES FOR V-USB +============================= +If you don't want to publish your source code under the terms of the GPL, +you can simply pay money for V-USB. As an additional benefit you get +USB PIDs for free, reserved exclusively to you. See the file +"CommercialLicense.txt" for details. + diff --git a/adb2usb/uart2usb/usbdrv/USB-ID-FAQ.txt b/adb2usb/uart2usb/usbdrv/USB-ID-FAQ.txt new file mode 100644 index 0000000..d1de8fb --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/USB-ID-FAQ.txt @@ -0,0 +1,149 @@ +Version 2009-08-22 + +========================== +WHY DO WE NEED THESE IDs? +========================== + +USB is more than a low level protocol for data transport. It also defines a +common set of requests which must be understood by all devices. And as part +of these common requests, the specification defines data structures, the +USB Descriptors, which are used to describe the properties of the device. + +From the perspective of an operating system, it is therefore possible to find +out basic properties of a device (such as e.g. the manufacturer and the name +of the device) without a device-specific driver. This is essential because +the operating system can choose a driver to load based on this information +(Plug-And-Play). + +Among the most important properties in the Device Descriptor are the USB +Vendor- and Product-ID. Both are 16 bit integers. The most simple form of +driver matching is based on these IDs. The driver announces the Vendor- and +Product-IDs of the devices it can handle and the operating system loads the +appropriate driver when the device is connected. + +It is obvious that this technique only works if the pair Vendor- plus +Product-ID is unique: Only devices which require the same driver can have the +same pair of IDs. + + +===================================================== +HOW DOES THE USB STANDARD ENSURE THAT IDs ARE UNIQUE? +===================================================== + +Since it is so important that USB IDs are unique, the USB Implementers Forum, +Inc. (usb.org) needs a way to enforce this legally. It is not forbidden by +law to build a device and assign it any random numbers as IDs. Usb.org +therefore needs an agreement to regulate the use of USB IDs. The agreement +binds only parties who agreed to it, of course. Everybody else is free to use +any numbers for their IDs. + +So how can usb.org ensure that every manufacturer of USB devices enters into +an agreement with them? They do it via trademark licensing. Usb.org has +registered the trademark "USB", all associated logos and related terms. If +you want to put an USB logo on your product or claim that it is USB +compliant, you must license these trademarks from usb.org. And this is where +you enter into an agreement. See the "USB-IF Trademark License Agreement and +Usage Guidelines for the USB-IF Logo" at +http://www.usb.org/developers/logo_license/. + +Licensing the USB trademarks requires that you buy a USB Vendor-ID from +usb.org (one-time fee of ca. 2,000 USD), that you become a member of usb.org +(yearly fee of ca. 4,000 USD) and that you meet all the technical +specifications from the USB spec. + +This means that most hobbyists and small companies will never be able to +become USB compliant, just because membership is so expensive. And you can't +be compliant with a driver based on V-USB anyway, because the AVR's port pins +don't meet the electrical specifications for USB. So, in principle, all +hobbyists and small companies are free to choose any random numbers for their +IDs. They have nothing to lose... + +There is one exception worth noting, though: If you use a sub-component which +implements USB, the vendor of the sub-components may guarantee USB +compliance. This might apply to some or all of FTDI's solutions. + + +======================================================================= +WHY SHOULD YOU OBTAIN USB IDs EVEN IF YOU DON'T LICENSE USB TRADEMARKS? +======================================================================= + +You have learned in the previous section that you are free to choose any +numbers for your IDs anyway. So why not do exactly this? There is still the +technical issue. If you choose IDs which are already in use by somebody else, +operating systems will load the wrong drivers and your device won't work. +Even if you choose IDs which are not currently in use, they may be in use in +the next version of the operating system or even after an automatic update. + +So what you need is a pair of Vendor- and Product-IDs for which you have the +guarantee that no USB compliant product uses them. This implies that no +operating system will ever ship with drivers responsible for these IDs. + + +============================================== +HOW DOES OBJECTIVE DEVELOPMENT HANDLE USB IDs? +============================================== + +Objective Development gives away pairs of USB-IDs with their V-USB licenses. +In order to ensure that these IDs are unique, Objective Development has an +agreement with the company/person who has bought the USB Vendor-ID from +usb.org. This agreement ensures that a range of USB Product-IDs is reserved +for assignment by Objective Development and that the owner of the Vendor-ID +won't give it to anybody else. + +This means that you have to trust three parties to ensure uniqueness of +your IDs: + + - Objective Development, that they don't give the same PID to more than + one person. + - The owner of the Vendor-ID that they don't assign PIDs from the range + assigned to Objective Development to anybody else. + - Usb.org that they don't assign the same Vendor-ID a second time. + + +================================== +WHO IS THE OWNER OF THE VENDOR-ID? +================================== + +Objective Development has obtained ranges of USB Product-IDs under two +Vendor-IDs: Under Vendor-ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under Vendor-ID 8352 from Jason +Kotzin (Clay Logic, www.claylogic.com). Both VID owners have received their +Vendor-ID directly from usb.org. + + +========================================================================= +CAN I USE USB-IDs FROM OBJECTIVE DEVELOPMENT WITH OTHER DRIVERS/HARDWARE? +========================================================================= + +The short answer is: Yes. All you get is a guarantee that the IDs are never +assigned to anybody else. What more do you need? + + +============================ +WHAT ABOUT SHARED ID PAIRS? +============================ + +Objective Development has reserved some PID/VID pairs for shared use. You +have no guarantee of uniqueness for them, except that no USB compliant device +uses them. In order to avoid technical problems, we must ensure that all +devices with the same pair of IDs use the same driver on kernel level. For +details, see the file USB-IDs-for-free.txt. + + +====================================================== +I HAVE HEARD THAT SUB-LICENSING OF USB-IDs IS ILLEGAL? +====================================================== + +A 16 bit integer number cannot be protected by copyright laws. It is not +sufficiently complex. And since none of the parties involved entered into the +USB-IF Trademark License Agreement, we are not bound by this agreement. So +there is no reason why it should be illegal to sub-license USB-IDs. + + +============================================= +WHO IS LIABLE IF THERE ARE INCOMPATIBILITIES? +============================================= + +Objective Development disclaims all liabilities which might arise from the +assignment of IDs. If you guarantee product features to your customers +without proper disclaimer, YOU are liable for that. diff --git a/adb2usb/uart2usb/usbdrv/USB-IDs-for-free.txt b/adb2usb/uart2usb/usbdrv/USB-IDs-for-free.txt new file mode 100644 index 0000000..2f4d59a --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/USB-IDs-for-free.txt @@ -0,0 +1,148 @@ +Version 2009-08-22 + +=========================== +FREE USB-IDs FOR SHARED USE +=========================== + +Objective Development has reserved a set of USB Product-IDs for use according +to the guidelines outlined below. For more information about the concept of +USB IDs please see the file USB-ID-FAQ.txt. Objective Development guarantees +that the IDs listed below are not used by any USB compliant devices. + + +==================== +MECHANISM OF SHARING +==================== + +From a technical point of view, two different devices can share the same USB +Vendor- and Product-ID if they require the same driver on operating system +level. We make use of this fact by assigning separate IDs for various device +classes. On application layer, devices must be distinguished by their textual +name or serial number. We offer separate sets of IDs for discrimination by +textual name and for serial number. + +Examples for shared use of USB IDs are included with V-USB in the "examples" +subdirectory. + + +====================================== +IDs FOR DISCRIMINATION BY TEXTUAL NAME +====================================== + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the manufacturer +and product identification. The manufacturer identification MUST be available +at least in USB language 0x0409 (English/US). + +(2) The textual manufacturer identification MUST contain either an Internet +domain name (e.g. "mycompany.com") registered and owned by you, or an e-mail +address under your control (e.g. "myname@gmx.net"). You can embed the domain +name or e-mail address in any string you like, e.g. "Objective Development +http://www.obdev.at/vusb/". + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(4) You may choose any string for the textual product identification, as long +as this string is unique within the scope of your textual manufacturer +identification. + +(5) Application side device look-up MUST be based on the textual manufacturer +and product identification in addition to VID/PID matching. The driver +matching MUST be a comparison of the entire strings, NOT a sub-string match. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by textual name: + +PID dec (hex) | VID dec (hex) | Description of use +==============+===============+============================================ +1500 (0x05dc) | 5824 (0x16c0) | For Vendor Class devices with libusb +--------------+---------------+-------------------------------------------- +1503 (0x05df) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +--------------+---------------+-------------------------------------------- +1505 (0x05e1) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +--------------+---------------+-------------------------------------------- +1508 (0x05e4) | 5824 (0x16c0) | For MIDI class devices +--------------+---------------+-------------------------------------------- + +Note that Windows caches the textual product- and vendor-description for +mice, keyboards and joysticks. Name-bsed discrimination is therefore not +recommended for these device classes. + + +======================================= +IDs FOR DISCRIMINATION BY SERIAL NUMBER +======================================= + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the serial +number. The serial number string MUST be available at least in USB language +0x0409 (English/US). + +(2) The serial number MUST start with either an Internet domain name (e.g. +"mycompany.com") registered and owned by you, or an e-mail address under your +control (e.g. "myname@gmx.net"), both terminated with a colon (":") character. +You MAY append any string you like for further discrimination of your devices. + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(5) Application side device look-up MUST be based on the serial number string +in addition to VID/PID matching. The matching must start at the first +character of the serial number string and include the colon character +terminating your domain or e-mail address. It MAY stop anywhere after that. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by serial number string: + +PID dec (hex) | VID dec (hex) | Description of use +===============+===============+=========================================== +10200 (0x27d8) | 5824 (0x16c0) | For Vendor Class devices with libusb +---------------+---------------+------------------------------------------- +10201 (0x27d9) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +---------------+---------------+------------------------------------------- +10202 (0x27da) | 5824 (0x16c0) | For USB Mice +---------------+---------------+------------------------------------------- +10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards +---------------+---------------+------------------------------------------- +10204 (0x27db) | 5824 (0x16c0) | For USB Joysticks +---------------+---------------+------------------------------------------- +10205 (0x27dc) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +---------------+---------------+------------------------------------------- +10206 (0x27dd) | 5824 (0x16c0) | For MIDI class devices +---------------+---------------+------------------------------------------- + + +================= +ORIGIN OF USB-IDs +================= + +OBJECTIVE DEVELOPMENT Software GmbH has obtained all VID/PID pairs listed +here from Wouter van Ooijen (see www.voti.nl) for exclusive disposition. +Wouter van Ooijen has obtained the VID from the USB Implementers Forum, Inc. +(see www.usb.org). The VID is registered for the company name "Van Ooijen +Technische Informatica". + + +========== +DISCLAIMER +========== + +OBJECTIVE DEVELOPMENT Software GmbH disclaims all liability for any +problems which are caused by the shared use of these VID/PID pairs. diff --git a/adb2usb/uart2usb/usbdrv/asmcommon.inc b/adb2usb/uart2usb/usbdrv/asmcommon.inc new file mode 100644 index 0000000..07d692b --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/asmcommon.inc @@ -0,0 +1,188 @@ +/* Name: asmcommon.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2007-11-05 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id$ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file contains assembler code which is shared among the USB driver +implementations for different CPU cocks. Since the code must be inserted +in the middle of the module, it's split out into this file and #included. + +Jump destinations called from outside: + sofError: Called when no start sequence was found. + se0: Called when a package has been successfully received. + overflow: Called when receive buffer overflows. + doReturn: Called after sending data. + +Outside jump destinations used by this module: + waitForJ: Called to receive an already arriving packet. + sendAckAndReti: + sendNakAndReti: + sendCntAndReti: + usbSendAndReti: + +The following macros must be defined before this file is included: + .macro POP_STANDARD + .endm + .macro POP_RETI + .endm +*/ + +#define token x1 + +overflow: + ldi x2, 1< 0 + +#warning "Never compile production devices with debugging enabled" + +static void uartPutc(char c) +{ + while(!(ODDBG_USR & (1 << ODDBG_UDRE))); /* wait for data register empty */ + ODDBG_UDR = c; +} + +static uchar hexAscii(uchar h) +{ + h &= 0xf; + if(h >= 10) + h += 'a' - (uchar)10 - '0'; + h += '0'; + return h; +} + +static void printHex(uchar c) +{ + uartPutc(hexAscii(c >> 4)); + uartPutc(hexAscii(c)); +} + +void odDebug(uchar prefix, uchar *data, uchar len) +{ + printHex(prefix); + uartPutc(':'); + while(len--){ + uartPutc(' '); + printHex(*data++); + } + uartPutc('\r'); + uartPutc('\n'); +} + +#endif diff --git a/adb2usb/uart2usb/usbdrv/oddebug.h b/adb2usb/uart2usb/usbdrv/oddebug.h new file mode 100644 index 0000000..d61309d --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/oddebug.h @@ -0,0 +1,123 @@ +/* Name: oddebug.h + * Project: AVR library + * Author: Christian Starkjohann + * Creation Date: 2005-01-16 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: oddebug.h 692 2008-11-07 15:07:40Z cs $ + */ + +#ifndef __oddebug_h_included__ +#define __oddebug_h_included__ + +/* +General Description: +This module implements a function for debug logs on the serial line of the +AVR microcontroller. Debugging can be configured with the define +'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging +calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is +2, DBG1 and DBG2 logs will be printed. + +A debug log consists of a label ('prefix') to indicate which debug log created +the output and a memory block to dump in hex ('data' and 'len'). +*/ + + +#ifndef F_CPU +# define F_CPU 12000000 /* 12 MHz */ +#endif + +/* make sure we have the UART defines: */ +#include "usbportability.h" + +#ifndef uchar +# define uchar unsigned char +#endif + +#if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */ +# warning "Debugging disabled because device has no UART" +# undef DEBUG_LEVEL +#endif + +#ifndef DEBUG_LEVEL +# define DEBUG_LEVEL 0 +#endif + +/* ------------------------------------------------------------------------- */ + +#if DEBUG_LEVEL > 0 +# define DBG1(prefix, data, len) odDebug(prefix, data, len) +#else +# define DBG1(prefix, data, len) +#endif + +#if DEBUG_LEVEL > 1 +# define DBG2(prefix, data, len) odDebug(prefix, data, len) +#else +# define DBG2(prefix, data, len) +#endif + +/* ------------------------------------------------------------------------- */ + +#if DEBUG_LEVEL > 0 +extern void odDebug(uchar prefix, uchar *data, uchar len); + +/* Try to find our control registers; ATMEL likes to rename these */ + +#if defined UBRR +# define ODDBG_UBRR UBRR +#elif defined UBRRL +# define ODDBG_UBRR UBRRL +#elif defined UBRR0 +# define ODDBG_UBRR UBRR0 +#elif defined UBRR0L +# define ODDBG_UBRR UBRR0L +#endif + +#if defined UCR +# define ODDBG_UCR UCR +#elif defined UCSRB +# define ODDBG_UCR UCSRB +#elif defined UCSR0B +# define ODDBG_UCR UCSR0B +#endif + +#if defined TXEN +# define ODDBG_TXEN TXEN +#else +# define ODDBG_TXEN TXEN0 +#endif + +#if defined USR +# define ODDBG_USR USR +#elif defined UCSRA +# define ODDBG_USR UCSRA +#elif defined UCSR0A +# define ODDBG_USR UCSR0A +#endif + +#if defined UDRE +# define ODDBG_UDRE UDRE +#else +# define ODDBG_UDRE UDRE0 +#endif + +#if defined UDR +# define ODDBG_UDR UDR +#elif defined UDR0 +# define ODDBG_UDR UDR0 +#endif + +static inline void odDebugInit(void) +{ + ODDBG_UCR |= (1<len & 0x10){ /* packet buffer was empty */ + txStatus->buffer[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* toggle token */ + }else{ + txStatus->len = USBPID_NAK; /* avoid sending outdated (overwritten) interrupt data */ + } + p = txStatus->buffer + 1; + i = len; + do{ /* if len == 0, we still copy 1 byte, but that's no problem */ + *p++ = *data++; + }while(--i > 0); /* loop control at the end is 2 bytes shorter than at beginning */ + usbCrc16Append(&txStatus->buffer[1], len); + txStatus->len = len + 4; /* len must be given including sync byte */ + DBG2(0x21 + (((int)txStatus >> 3) & 3), txStatus->buffer, len + 3); +} + +USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len) +{ + usbGenericSetInterrupt(data, len, &usbTxStatus1); +} +#endif + +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 +USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len) +{ + usbGenericSetInterrupt(data, len, &usbTxStatus3); +} +#endif +#endif /* USB_CFG_SUPPRESS_INTR_CODE */ + +/* ------------------ utilities for code following below ------------------- */ + +/* Use defines for the switch statement so that we can choose between an + * if()else if() and a switch/case based implementation. switch() is more + * efficient for a LARGE set of sequential choices, if() is better in all other + * cases. + */ +#if USB_CFG_USE_SWITCH_STATEMENT +# define SWITCH_START(cmd) switch(cmd){{ +# define SWITCH_CASE(value) }break; case (value):{ +# define SWITCH_CASE2(v1,v2) }break; case (v1): case(v2):{ +# define SWITCH_CASE3(v1,v2,v3) }break; case (v1): case(v2): case(v3):{ +# define SWITCH_DEFAULT }break; default:{ +# define SWITCH_END }} +#else +# define SWITCH_START(cmd) {uchar _cmd = cmd; if(0){ +# define SWITCH_CASE(value) }else if(_cmd == (value)){ +# define SWITCH_CASE2(v1,v2) }else if(_cmd == (v1) || _cmd == (v2)){ +# define SWITCH_CASE3(v1,v2,v3) }else if(_cmd == (v1) || _cmd == (v2) || (_cmd == v3)){ +# define SWITCH_DEFAULT }else{ +# define SWITCH_END }} +#endif + +#ifndef USB_RX_USER_HOOK +#define USB_RX_USER_HOOK(data, len) +#endif +#ifndef USB_SET_ADDRESS_HOOK +#define USB_SET_ADDRESS_HOOK() +#endif + +/* ------------------------------------------------------------------------- */ + +/* We use if() instead of #if in the macro below because #if can't be used + * in macros and the compiler optimizes constant conditions anyway. + * This may cause problems with undefined symbols if compiled without + * optimizing! + */ +#define GET_DESCRIPTOR(cfgProp, staticName) \ + if(cfgProp){ \ + if((cfgProp) & USB_PROP_IS_RAM) \ + flags = 0; \ + if((cfgProp) & USB_PROP_IS_DYNAMIC){ \ + len = usbFunctionDescriptor(rq); \ + }else{ \ + len = USB_PROP_LENGTH(cfgProp); \ + usbMsgPtr = (uchar *)(staticName); \ + } \ + } + +/* usbDriverDescriptor() is similar to usbFunctionDescriptor(), but used + * internally for all types of descriptors. + */ +static inline usbMsgLen_t usbDriverDescriptor(usbRequest_t *rq) +{ +usbMsgLen_t len = 0; +uchar flags = USB_FLG_MSGPTR_IS_ROM; + + SWITCH_START(rq->wValue.bytes[1]) + SWITCH_CASE(USBDESCR_DEVICE) /* 1 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_DEVICE, usbDescriptorDevice) + SWITCH_CASE(USBDESCR_CONFIG) /* 2 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_CONFIGURATION, usbDescriptorConfiguration) + SWITCH_CASE(USBDESCR_STRING) /* 3 */ +#if USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC + if(USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_RAM) + flags = 0; + len = usbFunctionDescriptor(rq); +#else /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */ + SWITCH_START(rq->wValue.bytes[0]) + SWITCH_CASE(0) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_0, usbDescriptorString0) + SWITCH_CASE(1) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_VENDOR, usbDescriptorStringVendor) + SWITCH_CASE(2) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_PRODUCT, usbDescriptorStringDevice) + SWITCH_CASE(3) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER, usbDescriptorStringSerialNumber) + SWITCH_DEFAULT + if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){ + len = usbFunctionDescriptor(rq); + } + SWITCH_END +#endif /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */ +#if USB_CFG_DESCR_PROPS_HID_REPORT /* only support HID descriptors if enabled */ + SWITCH_CASE(USBDESCR_HID) /* 0x21 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID, usbDescriptorConfiguration + 18) + SWITCH_CASE(USBDESCR_HID_REPORT)/* 0x22 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID_REPORT, usbDescriptorHidReport) +#endif + SWITCH_DEFAULT + if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){ + len = usbFunctionDescriptor(rq); + } + SWITCH_END + usbMsgFlags = flags; + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbDriverSetup() is similar to usbFunctionSetup(), but it's used for + * standard requests instead of class and custom requests. + */ +static inline usbMsgLen_t usbDriverSetup(usbRequest_t *rq) +{ +uchar len = 0, *dataPtr = usbTxBuf + 9; /* there are 2 bytes free space at the end of the buffer */ +uchar value = rq->wValue.bytes[0]; +#if USB_CFG_IMPLEMENT_HALT +uchar index = rq->wIndex.bytes[0]; +#endif + + dataPtr[0] = 0; /* default reply common to USBRQ_GET_STATUS and USBRQ_GET_INTERFACE */ + SWITCH_START(rq->bRequest) + SWITCH_CASE(USBRQ_GET_STATUS) /* 0 */ + uchar recipient = rq->bmRequestType & USBRQ_RCPT_MASK; /* assign arith ops to variables to enforce byte size */ + if(USB_CFG_IS_SELF_POWERED && recipient == USBRQ_RCPT_DEVICE) + dataPtr[0] = USB_CFG_IS_SELF_POWERED; +#if USB_CFG_IMPLEMENT_HALT + if(recipient == USBRQ_RCPT_ENDPOINT && index == 0x81) /* request status for endpoint 1 */ + dataPtr[0] = usbTxLen1 == USBPID_STALL; +#endif + dataPtr[1] = 0; + len = 2; +#if USB_CFG_IMPLEMENT_HALT + SWITCH_CASE2(USBRQ_CLEAR_FEATURE, USBRQ_SET_FEATURE) /* 1, 3 */ + if(value == 0 && index == 0x81){ /* feature 0 == HALT for endpoint == 1 */ + usbTxLen1 = rq->bRequest == USBRQ_CLEAR_FEATURE ? USBPID_NAK : USBPID_STALL; + usbResetDataToggling(); + } +#endif + SWITCH_CASE(USBRQ_SET_ADDRESS) /* 5 */ + usbNewDeviceAddr = value; + USB_SET_ADDRESS_HOOK(); + SWITCH_CASE(USBRQ_GET_DESCRIPTOR) /* 6 */ + len = usbDriverDescriptor(rq); + goto skipMsgPtrAssignment; + SWITCH_CASE(USBRQ_GET_CONFIGURATION) /* 8 */ + dataPtr = &usbConfiguration; /* send current configuration value */ + len = 1; + SWITCH_CASE(USBRQ_SET_CONFIGURATION) /* 9 */ + usbConfiguration = value; + usbResetStall(); + SWITCH_CASE(USBRQ_GET_INTERFACE) /* 10 */ + len = 1; +#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE + SWITCH_CASE(USBRQ_SET_INTERFACE) /* 11 */ + usbResetDataToggling(); + usbResetStall(); +#endif + SWITCH_DEFAULT /* 7=SET_DESCRIPTOR, 12=SYNC_FRAME */ + /* Should we add an optional hook here? */ + SWITCH_END + usbMsgPtr = dataPtr; +skipMsgPtrAssignment: + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbProcessRx() is called for every message received by the interrupt + * routine. It distinguishes between SETUP and DATA packets and processes + * them accordingly. + */ +static inline void usbProcessRx(uchar *data, uchar len) +{ +usbRequest_t *rq = (void *)data; + +/* usbRxToken can be: + * 0x2d 00101101 (USBPID_SETUP for setup data) + * 0xe1 11100001 (USBPID_OUT: data phase of setup transfer) + * 0...0x0f for OUT on endpoint X + */ + DBG2(0x10 + (usbRxToken & 0xf), data, len + 2); /* SETUP=1d, SETUP-DATA=11, OUTx=1x */ + USB_RX_USER_HOOK(data, len) +#if USB_CFG_IMPLEMENT_FN_WRITEOUT + if(usbRxToken < 0x10){ /* OUT to endpoint != 0: endpoint number in usbRxToken */ + usbFunctionWriteOut(data, len); + return; + } +#endif + if(usbRxToken == (uchar)USBPID_SETUP){ + if(len != 8) /* Setup size must be always 8 bytes. Ignore otherwise. */ + return; + usbMsgLen_t replyLen; + usbTxBuf[0] = USBPID_DATA0; /* initialize data toggling */ + usbTxLen = USBPID_NAK; /* abort pending transmit */ + usbMsgFlags = 0; + uchar type = rq->bmRequestType & USBRQ_TYPE_MASK; + if(type != USBRQ_TYPE_STANDARD){ /* standard requests are handled by driver */ + replyLen = usbFunctionSetup(data); + }else{ + replyLen = usbDriverSetup(rq); + } +#if USB_CFG_IMPLEMENT_FN_READ || USB_CFG_IMPLEMENT_FN_WRITE + if(replyLen == USB_NO_MSG){ /* use user-supplied read/write function */ + /* do some conditioning on replyLen, but on IN transfers only */ + if((rq->bmRequestType & USBRQ_DIR_MASK) != USBRQ_DIR_HOST_TO_DEVICE){ + if(sizeof(replyLen) < sizeof(rq->wLength.word)){ /* help compiler with optimizing */ + replyLen = rq->wLength.bytes[0]; + }else{ + replyLen = rq->wLength.word; + } + } + usbMsgFlags = USB_FLG_USE_USER_RW; + }else /* The 'else' prevents that we limit a replyLen of USB_NO_MSG to the maximum transfer len. */ +#endif + if(sizeof(replyLen) < sizeof(rq->wLength.word)){ /* help compiler with optimizing */ + if(!rq->wLength.bytes[1] && replyLen > rq->wLength.bytes[0]) /* limit length to max */ + replyLen = rq->wLength.bytes[0]; + }else{ + if(replyLen > rq->wLength.word) /* limit length to max */ + replyLen = rq->wLength.word; + } + usbMsgLen = replyLen; + }else{ /* usbRxToken must be USBPID_OUT, which means data phase of setup (control-out) */ +#if USB_CFG_IMPLEMENT_FN_WRITE + if(usbMsgFlags & USB_FLG_USE_USER_RW){ + uchar rval = usbFunctionWrite(data, len); + if(rval == 0xff){ /* an error occurred */ + usbTxLen = USBPID_STALL; + }else if(rval != 0){ /* This was the final package */ + usbMsgLen = 0; /* answer with a zero-sized data packet */ + } + } +#endif + } +} + +/* ------------------------------------------------------------------------- */ + +/* This function is similar to usbFunctionRead(), but it's also called for + * data handled automatically by the driver (e.g. descriptor reads). + */ +static uchar usbDeviceRead(uchar *data, uchar len) +{ + if(len > 0){ /* don't bother app with 0 sized reads */ +#if USB_CFG_IMPLEMENT_FN_READ + if(usbMsgFlags & USB_FLG_USE_USER_RW){ + len = usbFunctionRead(data, len); + }else +#endif + { + uchar i = len, *r = usbMsgPtr; + if(usbMsgFlags & USB_FLG_MSGPTR_IS_ROM){ /* ROM data */ + do{ + uchar c = USB_READ_FLASH(r); /* assign to char size variable to enforce byte ops */ + *data++ = c; + r++; + }while(--i); + }else{ /* RAM data */ + do{ + *data++ = *r++; + }while(--i); + } + usbMsgPtr = r; + } + } + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbBuildTxBlock() is called when we have data to transmit and the + * interrupt routine's transmit buffer is empty. + */ +static inline void usbBuildTxBlock(void) +{ +usbMsgLen_t wantLen; +uchar len; + + wantLen = usbMsgLen; + if(wantLen > 8) + wantLen = 8; + usbMsgLen -= wantLen; + usbTxBuf[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* DATA toggling */ + len = usbDeviceRead(usbTxBuf + 1, wantLen); + if(len <= 8){ /* valid data packet */ + usbCrc16Append(&usbTxBuf[1], len); + len += 4; /* length including sync byte */ + if(len < 12) /* a partial package identifies end of message */ + usbMsgLen = USB_NO_MSG; + }else{ + len = USBPID_STALL; /* stall the endpoint */ + usbMsgLen = USB_NO_MSG; + } + usbTxLen = len; + DBG2(0x20, usbTxBuf, len-1); +} + +/* ------------------------------------------------------------------------- */ + +static inline void usbHandleResetHook(uchar notResetState) +{ +#ifdef USB_RESET_HOOK +static uchar wasReset; +uchar isReset = !notResetState; + + if(wasReset != isReset){ + USB_RESET_HOOK(isReset); + wasReset = isReset; + } +#endif +} + +/* ------------------------------------------------------------------------- */ + +USB_PUBLIC void usbPoll(void) +{ +schar len; +uchar i; + + len = usbRxLen - 3; + if(len >= 0){ +/* We could check CRC16 here -- but ACK has already been sent anyway. If you + * need data integrity checks with this driver, check the CRC in your app + * code and report errors back to the host. Since the ACK was already sent, + * retries must be handled on application level. + * unsigned crc = usbCrc16(buffer + 1, usbRxLen - 3); + */ + usbProcessRx(usbRxBuf + USB_BUFSIZE + 1 - usbInputBufOffset, len); +#if USB_CFG_HAVE_FLOWCONTROL + if(usbRxLen > 0) /* only mark as available if not inactivated */ + usbRxLen = 0; +#else + usbRxLen = 0; /* mark rx buffer as available */ +#endif + } + if(usbTxLen & 0x10){ /* transmit system idle */ + if(usbMsgLen != USB_NO_MSG){ /* transmit data pending? */ + usbBuildTxBlock(); + } + } + for(i = 20; i > 0; i--){ + uchar usbLineStatus = USBIN & USBMASK; + if(usbLineStatus != 0) /* SE0 has ended */ + goto isNotReset; + } + /* RESET condition, called multiple times during reset */ + usbNewDeviceAddr = 0; + usbDeviceAddr = 0; + usbResetStall(); + DBG1(0xff, 0, 0); +isNotReset: + usbHandleResetHook(i); +} + +/* ------------------------------------------------------------------------- */ + +USB_PUBLIC void usbInit(void) +{ +#if USB_INTR_CFG_SET != 0 + USB_INTR_CFG |= USB_INTR_CFG_SET; +#endif +#if USB_INTR_CFG_CLR != 0 + USB_INTR_CFG &= ~(USB_INTR_CFG_CLR); +#endif + USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT); + usbResetDataToggling(); +#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE + usbTxLen1 = USBPID_NAK; +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 + usbTxLen3 = USBPID_NAK; +#endif +#endif +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/usbdrv/usbdrv.h b/adb2usb/uart2usb/usbdrv/usbdrv.h new file mode 100644 index 0000000..3a78f30 --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/usbdrv.h @@ -0,0 +1,735 @@ +/* Name: usbdrv.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2004-12-29 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbdrv.h 793 2010-07-15 15:58:11Z cs $ + */ + +#ifndef __usbdrv_h_included__ +#define __usbdrv_h_included__ +#include "usbconfig.h" +#include "usbportability.h" + +/* +Hardware Prerequisites: +======================= +USB lines D+ and D- MUST be wired to the same I/O port. We recommend that D+ +triggers the interrupt (best achieved by using INT0 for D+), but it is also +possible to trigger the interrupt from D-. If D- is used, interrupts are also +triggered by SOF packets. D- requires a pull-up of 1.5k to +3.5V (and the +device must be powered at 3.5V) to identify as low-speed USB device. A +pull-down or pull-up of 1M SHOULD be connected from D+ to +3.5V to prevent +interference when no USB master is connected. If you use Zener diodes to limit +the voltage on D+ and D-, you MUST use a pull-down resistor, not a pull-up. +We use D+ as interrupt source and not D- because it does not trigger on +keep-alive and RESET states. If you want to count keep-alive events with +USB_COUNT_SOF, you MUST use D- as an interrupt source. + +As a compile time option, the 1.5k pull-up resistor on D- can be made +switchable to allow the device to disconnect at will. See the definition of +usbDeviceConnect() and usbDeviceDisconnect() further down in this file. + +Please adapt the values in usbconfig.h according to your hardware! + +The device MUST be clocked at exactly 12 MHz, 15 MHz, 16 MHz or 20 MHz +or at 12.8 MHz resp. 16.5 MHz +/- 1%. See usbconfig-prototype.h for details. + + +Limitations: +============ +Robustness with respect to communication errors: +The driver assumes error-free communication. It DOES check for errors in +the PID, but does NOT check bit stuffing errors, SE0 in middle of a byte, +token CRC (5 bit) and data CRC (16 bit). CRC checks can not be performed due +to timing constraints: We must start sending a reply within 7 bit times. +Bit stuffing and misplaced SE0 would have to be checked in real-time, but CPU +performance does not permit that. The driver does not check Data0/Data1 +toggling, but application software can implement the check. + +Input characteristics: +Since no differential receiver circuit is used, electrical interference +robustness may suffer. The driver samples only one of the data lines with +an ordinary I/O pin's input characteristics. However, since this is only a +low speed USB implementation and the specification allows for 8 times the +bit rate over the same hardware, we should be on the safe side. Even the spec +requires detection of asymmetric states at high bit rate for SE0 detection. + +Number of endpoints: +The driver supports the following endpoints: + +- Endpoint 0, the default control endpoint. +- Any number of interrupt- or bulk-out endpoints. The data is sent to + usbFunctionWriteOut() and USB_CFG_IMPLEMENT_FN_WRITEOUT must be defined + to 1 to activate this feature. The endpoint number can be found in the + global variable 'usbRxToken'. +- One default interrupt- or bulk-in endpoint. This endpoint is used for + interrupt- or bulk-in transfers which are not handled by any other endpoint. + You must define USB_CFG_HAVE_INTRIN_ENDPOINT in order to activate this + feature and call usbSetInterrupt() to send interrupt/bulk data. +- One additional interrupt- or bulk-in endpoint. This was endpoint 3 in + previous versions of this driver but can now be configured to any endpoint + number. You must define USB_CFG_HAVE_INTRIN_ENDPOINT3 in order to activate + this feature and call usbSetInterrupt3() to send interrupt/bulk data. The + endpoint number can be set with USB_CFG_EP3_NUMBER. + +Please note that the USB standard forbids bulk endpoints for low speed devices! +Most operating systems allow them anyway, but the AVR will spend 90% of the CPU +time in the USB interrupt polling for bulk data. + +Maximum data payload: +Data payload of control in and out transfers may be up to 254 bytes. In order +to accept payload data of out transfers, you need to implement +'usbFunctionWrite()'. + +USB Suspend Mode supply current: +The USB standard limits power consumption to 500uA when the bus is in suspend +mode. This is not a problem for self-powered devices since they don't need +bus power anyway. Bus-powered devices can achieve this only by putting the +CPU in sleep mode. The driver does not implement suspend handling by itself. +However, the application may implement activity monitoring and wakeup from +sleep. The host sends regular SE0 states on the bus to keep it active. These +SE0 states can be detected by using D- as the interrupt source. Define +USB_COUNT_SOF to 1 and use the global variable usbSofCount to check for bus +activity. + +Operation without an USB master: +The driver behaves neutral without connection to an USB master if D- reads +as 1. To avoid spurious interrupts, we recommend a high impedance (e.g. 1M) +pull-down or pull-up resistor on D+ (interrupt). If Zener diodes are used, +use a pull-down. If D- becomes statically 0, the driver may block in the +interrupt routine. + +Interrupt latency: +The application must ensure that the USB interrupt is not disabled for more +than 25 cycles (this is for 12 MHz, faster clocks allow longer latency). +This implies that all interrupt routines must either have the "ISR_NOBLOCK" +attribute set (see "avr/interrupt.h") or be written in assembler with "sei" +as the first instruction. + +Maximum interrupt duration / CPU cycle consumption: +The driver handles all USB communication during the interrupt service +routine. The routine will not return before an entire USB message is received +and the reply is sent. This may be up to ca. 1200 cycles @ 12 MHz (= 100us) if +the host conforms to the standard. The driver will consume CPU cycles for all +USB messages, even if they address another (low-speed) device on the same bus. + +*/ + +/* ------------------------------------------------------------------------- */ +/* --------------------------- Module Interface ---------------------------- */ +/* ------------------------------------------------------------------------- */ + +#define USBDRV_VERSION 20100715 +/* This define uniquely identifies a driver version. It is a decimal number + * constructed from the driver's release date in the form YYYYMMDD. If the + * driver's behavior or interface changes, you can use this constant to + * distinguish versions. If it is not defined, the driver's release date is + * older than 2006-01-25. + */ + + +#ifndef USB_PUBLIC +#define USB_PUBLIC +#endif +/* USB_PUBLIC is used as declaration attribute for all functions exported by + * the USB driver. The default is no attribute (see above). You may define it + * to static either in usbconfig.h or from the command line if you include + * usbdrv.c instead of linking against it. Including the C module of the driver + * directly in your code saves a couple of bytes in flash memory. + */ + +#ifndef __ASSEMBLER__ +#ifndef uchar +#define uchar unsigned char +#endif +#ifndef schar +#define schar signed char +#endif +/* shortcuts for well defined 8 bit integer types */ + +#if USB_CFG_LONG_TRANSFERS /* if more than 254 bytes transfer size required */ +# define usbMsgLen_t unsigned +#else +# define usbMsgLen_t uchar +#endif +/* usbMsgLen_t is the data type used for transfer lengths. By default, it is + * defined to uchar, allowing a maximum of 254 bytes (255 is reserved for + * USB_NO_MSG below). If the usbconfig.h defines USB_CFG_LONG_TRANSFERS to 1, + * a 16 bit data type is used, allowing up to 16384 bytes (the rest is used + * for flags in the descriptor configuration). + */ +#define USB_NO_MSG ((usbMsgLen_t)-1) /* constant meaning "no message" */ + +struct usbRequest; /* forward declaration */ + +USB_PUBLIC void usbInit(void); +/* This function must be called before interrupts are enabled and the main + * loop is entered. We exepct that the PORT and DDR bits for D+ and D- have + * not been changed from their default status (which is 0). If you have changed + * them, set both back to 0 (configure them as input with no internal pull-up). + */ +USB_PUBLIC void usbPoll(void); +/* This function must be called at regular intervals from the main loop. + * Maximum delay between calls is somewhat less than 50ms (USB timeout for + * accepting a Setup message). Otherwise the device will not be recognized. + * Please note that debug outputs through the UART take ~ 0.5ms per byte + * at 19200 bps. + */ +extern uchar *usbMsgPtr; +/* This variable may be used to pass transmit data to the driver from the + * implementation of usbFunctionWrite(). It is also used internally by the + * driver for standard control requests. + */ +USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]); +/* This function is called when the driver receives a SETUP transaction from + * the host which is not answered by the driver itself (in practice: class and + * vendor requests). All control transfers start with a SETUP transaction where + * the host communicates the parameters of the following (optional) data + * transfer. The SETUP data is available in the 'data' parameter which can + * (and should) be casted to 'usbRequest_t *' for a more user-friendly access + * to parameters. + * + * If the SETUP indicates a control-in transfer, you should provide the + * requested data to the driver. There are two ways to transfer this data: + * (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data + * block and return the length of the data in 'usbFunctionSetup()'. The driver + * will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The + * driver will then call 'usbFunctionRead()' when data is needed. See the + * documentation for usbFunctionRead() for details. + * + * If the SETUP indicates a control-out transfer, the only way to receive the + * data from the host is through the 'usbFunctionWrite()' call. If you + * implement this function, you must return USB_NO_MSG in 'usbFunctionSetup()' + * to indicate that 'usbFunctionWrite()' should be used. See the documentation + * of this function for more information. If you just want to ignore the data + * sent by the host, return 0 in 'usbFunctionSetup()'. + * + * Note that calls to the functions usbFunctionRead() and usbFunctionWrite() + * are only done if enabled by the configuration in usbconfig.h. + */ +USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq); +/* You need to implement this function ONLY if you provide USB descriptors at + * runtime (which is an expert feature). It is very similar to + * usbFunctionSetup() above, but it is called only to request USB descriptor + * data. See the documentation of usbFunctionSetup() above for more info. + */ +#if USB_CFG_HAVE_INTRIN_ENDPOINT +USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len); +/* This function sets the message which will be sent during the next interrupt + * IN transfer. The message is copied to an internal buffer and must not exceed + * a length of 8 bytes. The message may be 0 bytes long just to indicate the + * interrupt status to the host. + * If you need to transfer more bytes, use a control read after the interrupt. + */ +#define usbInterruptIsReady() (usbTxLen1 & 0x10) +/* This macro indicates whether the last interrupt message has already been + * sent. If you set a new interrupt message before the old was sent, the + * message already buffered will be lost. + */ +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 +USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len); +#define usbInterruptIsReady3() (usbTxLen3 & 0x10) +/* Same as above for endpoint 3 */ +#endif +#endif /* USB_CFG_HAVE_INTRIN_ENDPOINT */ +#if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH /* simplified interface for backward compatibility */ +#define usbHidReportDescriptor usbDescriptorHidReport +/* should be declared as: PROGMEM char usbHidReportDescriptor[]; */ +/* If you implement an HID device, you need to provide a report descriptor. + * The HID report descriptor syntax is a bit complex. If you understand how + * report descriptors are constructed, we recommend that you use the HID + * Descriptor Tool from usb.org, see http://www.usb.org/developers/hidpage/. + * Otherwise you should probably start with a working example. + */ +#endif /* USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH */ +#if USB_CFG_IMPLEMENT_FN_WRITE +USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len); +/* This function is called by the driver to provide a control transfer's + * payload data (control-out). It is called in chunks of up to 8 bytes. The + * total count provided in the current control transfer can be obtained from + * the 'length' property in the setup data. If an error occurred during + * processing, return 0xff (== -1). The driver will answer the entire transfer + * with a STALL token in this case. If you have received the entire payload + * successfully, return 1. If you expect more data, return 0. If you don't + * know whether the host will send more data (you should know, the total is + * provided in the usbFunctionSetup() call!), return 1. + * NOTE: If you return 0xff for STALL, 'usbFunctionWrite()' may still be called + * for the remaining data. You must continue to return 0xff for STALL in these + * calls. + * In order to get usbFunctionWrite() called, define USB_CFG_IMPLEMENT_FN_WRITE + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +#endif /* USB_CFG_IMPLEMENT_FN_WRITE */ +#if USB_CFG_IMPLEMENT_FN_READ +USB_PUBLIC uchar usbFunctionRead(uchar *data, uchar len); +/* This function is called by the driver to ask the application for a control + * transfer's payload data (control-in). It is called in chunks of up to 8 + * bytes each. You should copy the data to the location given by 'data' and + * return the actual number of bytes copied. If you return less than requested, + * the control-in transfer is terminated. If you return 0xff, the driver aborts + * the transfer with a STALL token. + * In order to get usbFunctionRead() called, define USB_CFG_IMPLEMENT_FN_READ + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +#endif /* USB_CFG_IMPLEMENT_FN_READ */ + +extern uchar usbRxToken; /* may be used in usbFunctionWriteOut() below */ +#if USB_CFG_IMPLEMENT_FN_WRITEOUT +USB_PUBLIC void usbFunctionWriteOut(uchar *data, uchar len); +/* This function is called by the driver when data is received on an interrupt- + * or bulk-out endpoint. The endpoint number can be found in the global + * variable usbRxToken. You must define USB_CFG_IMPLEMENT_FN_WRITEOUT to 1 in + * usbconfig.h to get this function called. + */ +#endif /* USB_CFG_IMPLEMENT_FN_WRITEOUT */ +#ifdef USB_CFG_PULLUP_IOPORTNAME +#define usbDeviceConnect() ((USB_PULLUP_DDR |= (1<device, 1=device->host + * t ..... type: 0=standard, 1=class, 2=vendor, 3=reserved + * r ..... recipient: 0=device, 1=interface, 2=endpoint, 3=other + */ + +/* USB setup recipient values */ +#define USBRQ_RCPT_MASK 0x1f +#define USBRQ_RCPT_DEVICE 0 +#define USBRQ_RCPT_INTERFACE 1 +#define USBRQ_RCPT_ENDPOINT 2 + +/* USB request type values */ +#define USBRQ_TYPE_MASK 0x60 +#define USBRQ_TYPE_STANDARD (0<<5) +#define USBRQ_TYPE_CLASS (1<<5) +#define USBRQ_TYPE_VENDOR (2<<5) + +/* USB direction values: */ +#define USBRQ_DIR_MASK 0x80 +#define USBRQ_DIR_HOST_TO_DEVICE (0<<7) +#define USBRQ_DIR_DEVICE_TO_HOST (1<<7) + +/* USB Standard Requests */ +#define USBRQ_GET_STATUS 0 +#define USBRQ_CLEAR_FEATURE 1 +#define USBRQ_SET_FEATURE 3 +#define USBRQ_SET_ADDRESS 5 +#define USBRQ_GET_DESCRIPTOR 6 +#define USBRQ_SET_DESCRIPTOR 7 +#define USBRQ_GET_CONFIGURATION 8 +#define USBRQ_SET_CONFIGURATION 9 +#define USBRQ_GET_INTERFACE 10 +#define USBRQ_SET_INTERFACE 11 +#define USBRQ_SYNCH_FRAME 12 + +/* USB descriptor constants */ +#define USBDESCR_DEVICE 1 +#define USBDESCR_CONFIG 2 +#define USBDESCR_STRING 3 +#define USBDESCR_INTERFACE 4 +#define USBDESCR_ENDPOINT 5 +#define USBDESCR_HID 0x21 +#define USBDESCR_HID_REPORT 0x22 +#define USBDESCR_HID_PHYS 0x23 + +//#define USBATTR_BUSPOWER 0x80 // USB 1.1 does not define this value any more +#define USBATTR_SELFPOWER 0x40 +#define USBATTR_REMOTEWAKE 0x20 + +/* USB HID Requests */ +#define USBRQ_HID_GET_REPORT 0x01 +#define USBRQ_HID_GET_IDLE 0x02 +#define USBRQ_HID_GET_PROTOCOL 0x03 +#define USBRQ_HID_SET_REPORT 0x09 +#define USBRQ_HID_SET_IDLE 0x0a +#define USBRQ_HID_SET_PROTOCOL 0x0b + +/* ------------------------------------------------------------------------- */ + +#endif /* __usbdrv_h_included__ */ diff --git a/adb2usb/uart2usb/usbdrv/usbdrvasm.S b/adb2usb/uart2usb/usbdrv/usbdrvasm.S new file mode 100644 index 0000000..45fcf18 --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/usbdrvasm.S @@ -0,0 +1,393 @@ +/* Name: usbdrvasm.S + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2007-06-13 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm.S 785 2010-05-30 17:57:07Z cs $ + */ + +/* +General Description: +This module is the assembler part of the USB driver. This file contains +general code (preprocessor acrobatics and CRC computation) and then includes +the file appropriate for the given clock rate. +*/ + +#define __SFR_OFFSET 0 /* used by avr-libc's register definitions */ +#include "usbportability.h" +#include "usbdrv.h" /* for common defs */ + +/* register names */ +#define x1 r16 +#define x2 r17 +#define shift r18 +#define cnt r19 +#define x3 r20 +#define x4 r21 +#define x5 r22 +#define bitcnt x5 +#define phase x4 +#define leap x4 + +/* Some assembler dependent definitions and declarations: */ + +#ifdef __IAR_SYSTEMS_ASM__ + extern usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset + extern usbCurrentTok, usbRxLen, usbRxToken, usbTxLen + extern usbTxBuf, usbTxStatus1, usbTxStatus3 +# if USB_COUNT_SOF + extern usbSofCount +# endif + public usbCrc16 + public usbCrc16Append + + COMMON INTVEC +# ifndef USB_INTR_VECTOR + ORG INT0_vect +# else /* USB_INTR_VECTOR */ + ORG USB_INTR_VECTOR +# undef USB_INTR_VECTOR +# endif /* USB_INTR_VECTOR */ +# define USB_INTR_VECTOR usbInterruptHandler + rjmp USB_INTR_VECTOR + RSEG CODE + +#else /* __IAR_SYSTEMS_ASM__ */ + +# ifndef USB_INTR_VECTOR /* default to hardware interrupt INT0 */ +# ifdef INT0_vect +# define USB_INTR_VECTOR INT0_vect // this is the "new" define for the vector +# else +# define USB_INTR_VECTOR SIG_INTERRUPT0 // this is the "old" vector +# endif +# endif + .text + .global USB_INTR_VECTOR + .type USB_INTR_VECTOR, @function + .global usbCrc16 + .global usbCrc16Append +#endif /* __IAR_SYSTEMS_ASM__ */ + + +#if USB_INTR_PENDING < 0x40 /* This is an I/O address, use in and out */ +# define USB_LOAD_PENDING(reg) in reg, USB_INTR_PENDING +# define USB_STORE_PENDING(reg) out USB_INTR_PENDING, reg +#else /* It's a memory address, use lds and sts */ +# define USB_LOAD_PENDING(reg) lds reg, USB_INTR_PENDING +# define USB_STORE_PENDING(reg) sts USB_INTR_PENDING, reg +#endif + +#define usbTxLen1 usbTxStatus1 +#define usbTxBuf1 (usbTxStatus1 + 1) +#define usbTxLen3 usbTxStatus3 +#define usbTxBuf3 (usbTxStatus3 + 1) + + +;---------------------------------------------------------------------------- +; Utility functions +;---------------------------------------------------------------------------- + +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbCrc16 on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ +RTMODEL "__rt_version", "3" +/* The line above will generate an error if cc calling conventions change. + * The value "3" above is valid for IAR 4.10B/W32 + */ +# define argLen r18 /* argument 2 */ +# define argPtrL r16 /* argument 1 */ +# define argPtrH r17 /* argument 1 */ + +# define resCrcL r16 /* result */ +# define resCrcH r17 /* result */ + +# define ptrL ZL +# define ptrH ZH +# define ptr Z +# define byte r22 +# define bitCnt r19 +# define polyL r20 +# define polyH r21 +# define scratch r23 + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbCrc16 on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ +# define argLen r22 /* argument 2 */ +# define argPtrL r24 /* argument 1 */ +# define argPtrH r25 /* argument 1 */ + +# define resCrcL r24 /* result */ +# define resCrcH r25 /* result */ + +# define ptrL XL +# define ptrH XH +# define ptr x +# define byte r18 +# define bitCnt r19 +# define polyL r20 +# define polyH r21 +# define scratch r23 + +#endif + +#if USB_USE_FAST_CRC + +; This implementation is faster, but has bigger code size +; Thanks to Slawomir Fras (BoskiDialer) for this code! +; It implements the following C pseudo-code: +; unsigned table(unsigned char x) +; { +; unsigned value; +; +; value = (unsigned)x << 6; +; value ^= (unsigned)x << 7; +; if(parity(x)) +; value ^= 0xc001; +; return value; +; } +; unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen) +; { +; unsigned crc = 0xffff; +; +; while(argLen--) +; crc = table(lo8(crc) ^ *argPtr++) ^ hi8(crc); +; return ~crc; +; } + +; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen); +; argPtr r24+25 / r16+r17 +; argLen r22 / r18 +; temp variables: +; byte r18 / r22 +; scratch r23 +; resCrc r24+r25 / r16+r17 +; ptr X / Z +usbCrc16: + mov ptrL, argPtrL + mov ptrH, argPtrH + ldi resCrcL, 0xFF + ldi resCrcH, 0xFF + rjmp usbCrc16LoopTest +usbCrc16ByteLoop: + ld byte, ptr+ + eor resCrcL, byte ; resCrcL is now 'x' in table() + mov byte, resCrcL ; compute parity of 'x' + swap byte + eor byte, resCrcL + mov scratch, byte + lsr byte + lsr byte + eor byte, scratch + inc byte + lsr byte + andi byte, 1 ; byte is now parity(x) + mov scratch, resCrcL + mov resCrcL, resCrcH + eor resCrcL, byte ; low byte of if(parity(x)) value ^= 0xc001; + neg byte + andi byte, 0xc0 + mov resCrcH, byte ; high byte of if(parity(x)) value ^= 0xc001; + clr byte + lsr scratch + ror byte + eor resCrcH, scratch + eor resCrcL, byte + lsr scratch + ror byte + eor resCrcH, scratch + eor resCrcL, byte +usbCrc16LoopTest: + subi argLen, 1 + brsh usbCrc16ByteLoop + com resCrcL + com resCrcH + ret + +#else /* USB_USE_FAST_CRC */ + +; This implementation is slower, but has less code size +; +; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen); +; argPtr r24+25 / r16+r17 +; argLen r22 / r18 +; temp variables: +; byte r18 / r22 +; bitCnt r19 +; poly r20+r21 +; scratch r23 +; resCrc r24+r25 / r16+r17 +; ptr X / Z +usbCrc16: + mov ptrL, argPtrL + mov ptrH, argPtrH + ldi resCrcL, 0 + ldi resCrcH, 0 + ldi polyL, lo8(0xa001) + ldi polyH, hi8(0xa001) + com argLen ; argLen = -argLen - 1: modified loop to ensure that carry is set + ldi bitCnt, 0 ; loop counter with starnd condition = end condition + rjmp usbCrcLoopEntry +usbCrcByteLoop: + ld byte, ptr+ + eor resCrcL, byte +usbCrcBitLoop: + ror resCrcH ; carry is always set here (see brcs jumps to here) + ror resCrcL + brcs usbCrcNoXor + eor resCrcL, polyL + eor resCrcH, polyH +usbCrcNoXor: + subi bitCnt, 224 ; (8 * 224) % 256 = 0; this loop iterates 8 times + brcs usbCrcBitLoop +usbCrcLoopEntry: + subi argLen, -1 + brcs usbCrcByteLoop +usbCrcReady: + ret +; Thanks to Reimar Doeffinger for optimizing this CRC routine! + +#endif /* USB_USE_FAST_CRC */ + +; extern unsigned usbCrc16Append(unsigned char *data, unsigned char len); +usbCrc16Append: + rcall usbCrc16 + st ptr+, resCrcL + st ptr+, resCrcH + ret + +#undef argLen +#undef argPtrL +#undef argPtrH +#undef resCrcL +#undef resCrcH +#undef ptrL +#undef ptrH +#undef ptr +#undef byte +#undef bitCnt +#undef polyL +#undef polyH +#undef scratch + + +#if USB_CFG_HAVE_MEASURE_FRAME_LENGTH +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbMeasureFrameLength on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ +# define resL r16 +# define resH r17 +# define cnt16L r30 +# define cnt16H r31 +# define cntH r18 + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbMeasureFrameLength on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ +# define resL r24 +# define resH r25 +# define cnt16L r24 +# define cnt16H r25 +# define cntH r26 +#endif +# define cnt16 cnt16L + +; extern unsigned usbMeasurePacketLength(void); +; returns time between two idle strobes in multiples of 7 CPU clocks +.global usbMeasureFrameLength +usbMeasureFrameLength: + ldi cntH, 6 ; wait ~ 10 ms for D- == 0 + clr cnt16L + clr cnt16H +usbMFTime16: + dec cntH + breq usbMFTimeout +usbMFWaitStrobe: ; first wait for D- == 0 (idle strobe) + sbiw cnt16, 1 ;[0] [6] + breq usbMFTime16 ;[2] + sbic USBIN, USBMINUS ;[3] + rjmp usbMFWaitStrobe ;[4] +usbMFWaitIdle: ; then wait until idle again + sbis USBIN, USBMINUS ;1 wait for D- == 1 + rjmp usbMFWaitIdle ;2 + ldi cnt16L, 1 ;1 represents cycles so far + clr cnt16H ;1 +usbMFWaitLoop: + in cntH, USBIN ;[0] [7] + adiw cnt16, 1 ;[1] + breq usbMFTimeout ;[3] + andi cntH, USBMASK ;[4] + brne usbMFWaitLoop ;[5] +usbMFTimeout: +#if resL != cnt16L + mov resL, cnt16L + mov resH, cnt16H +#endif + ret + +#undef resL +#undef resH +#undef cnt16 +#undef cnt16L +#undef cnt16H +#undef cntH + +#endif /* USB_CFG_HAVE_MEASURE_FRAME_LENGTH */ + +;---------------------------------------------------------------------------- +; Now include the clock rate specific code +;---------------------------------------------------------------------------- + +#ifndef USB_CFG_CLOCK_KHZ +# ifdef F_CPU +# define USB_CFG_CLOCK_KHZ (F_CPU/1000) +# else +# error "USB_CFG_CLOCK_KHZ not defined in usbconfig.h and no F_CPU set!" +# endif +#endif + +#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */ +# if USB_CFG_CLOCK_KHZ == 18000 +# include "usbdrvasm18-crc.inc" +# else +# error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!" +# endif +#else /* USB_CFG_CHECK_CRC */ +# if USB_CFG_CLOCK_KHZ == 12000 +# include "usbdrvasm12.inc" +# elif USB_CFG_CLOCK_KHZ == 12800 +# include "usbdrvasm128.inc" +# elif USB_CFG_CLOCK_KHZ == 15000 +# include "usbdrvasm15.inc" +# elif USB_CFG_CLOCK_KHZ == 16000 +# include "usbdrvasm16.inc" +# elif USB_CFG_CLOCK_KHZ == 16500 +# include "usbdrvasm165.inc" +# elif USB_CFG_CLOCK_KHZ == 20000 +# include "usbdrvasm20.inc" +# else +# error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!" +# endif +#endif /* USB_CFG_CHECK_CRC */ diff --git a/adb2usb/uart2usb/usbdrv/usbdrvasm.asm b/adb2usb/uart2usb/usbdrv/usbdrvasm.asm new file mode 100644 index 0000000..9cc4e4d --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/usbdrvasm.asm @@ -0,0 +1,21 @@ +/* Name: usbdrvasm.asm + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2006-03-01 + * Tabsize: 4 + * Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id$ + */ + +/* +General Description: +The IAR compiler/assembler system prefers assembler files with file extension +".asm". We simply provide this file as an alias for usbdrvasm.S. + +Thanks to Oleg Semyonov for his help with the IAR tools port! +*/ + +#include "usbdrvasm.S" + +end diff --git a/adb2usb/uart2usb/usbdrv/usbdrvasm12.inc b/adb2usb/uart2usb/usbdrv/usbdrvasm12.inc new file mode 100644 index 0000000..c116758 --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/usbdrvasm12.inc @@ -0,0 +1,393 @@ +/* Name: usbdrvasm12.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2004-12-29 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbdrvasm12.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 12 MHz version of the asssembler part of the USB driver. It +requires a 12 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! + + +Timing constraints according to spec (in bit times): +timing subject min max CPUcycles +--------------------------------------------------------------------------- +EOP of OUT/SETUP to sync pattern of DATA0 (both rx) 2 16 16-128 +EOP of IN to sync pattern of DATA0 (rx, then tx) 2 7.5 16-60 +DATAx (rx) to ACK/NAK/STALL (tx) 2 7.5 16-60 +*/ + +;Software-receiver engine. Strict timing! Don't change unless you can preserve timing! +;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled +;max allowable interrupt latency: 34 cycles -> max 25 cycles interrupt disable +;max stack usage: [ret(2), YL, SREG, YH, shift, x1, x2, x3, cnt, x4] = 11 bytes +;Numbers in brackets are maximum cycles since SOF. +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt + push YL ;2 [35] push only what is necessary to sync with edge ASAP + in YL, SREG ;1 [37] + push YL ;2 [39] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of 1/4 bit which meets the spec. + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push YH ;2 [2] + lds YL, usbInputBufOffset;2 [4] + clr YH ;1 [5] + subi YL, lo8(-(usbRxBuf));1 [6] + sbci YH, hi8(-(usbRxBuf));1 [7] + + sbis USBIN, USBMINUS ;1 [8] we want two bits K [sample 1 cycle too early] + rjmp haveTwoBitsK ;2 [10] + pop YH ;2 [11] undo the push from before + rjmp waitForK ;2 [13] this was not the end of sync, retry +haveTwoBitsK: +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- + push shift ;2 [16] + push x1 ;2 [12] + push x2 ;2 [14] + + in x1, USBIN ;1 [17] <-- sample bit 0 + ldi shift, 0xff ;1 [18] + bst x1, USBMINUS ;1 [19] + bld shift, 0 ;1 [20] + push x3 ;2 [22] + push cnt ;2 [24] + + in x2, USBIN ;1 [25] <-- sample bit 1 + ser x3 ;1 [26] [inserted init instruction] + eor x1, x2 ;1 [27] + bst x1, USBMINUS ;1 [28] + bld shift, 1 ;1 [29] + ldi cnt, USB_BUFSIZE;1 [30] [inserted init instruction] + rjmp rxbit2 ;2 [32] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- + +unstuff0: ;1 (branch taken) + andi x3, ~0x01 ;1 [15] + mov x1, x2 ;1 [16] x2 contains last sampled (stuffed) bit + in x2, USBIN ;1 [17] <-- sample bit 1 again + ori shift, 0x01 ;1 [18] + rjmp didUnstuff0 ;2 [20] + +unstuff1: ;1 (branch taken) + mov x2, x1 ;1 [21] x1 contains last sampled (stuffed) bit + andi x3, ~0x02 ;1 [22] + ori shift, 0x02 ;1 [23] + nop ;1 [24] + in x1, USBIN ;1 [25] <-- sample bit 2 again + rjmp didUnstuff1 ;2 [27] + +unstuff2: ;1 (branch taken) + andi x3, ~0x04 ;1 [29] + ori shift, 0x04 ;1 [30] + mov x1, x2 ;1 [31] x2 contains last sampled (stuffed) bit + nop ;1 [32] + in x2, USBIN ;1 [33] <-- sample bit 3 + rjmp didUnstuff2 ;2 [35] + +unstuff3: ;1 (branch taken) + in x2, USBIN ;1 [34] <-- sample stuffed bit 3 [one cycle too late] + andi x3, ~0x08 ;1 [35] + ori shift, 0x08 ;1 [36] + rjmp didUnstuff3 ;2 [38] + +unstuff4: ;1 (branch taken) + andi x3, ~0x10 ;1 [40] + in x1, USBIN ;1 [41] <-- sample stuffed bit 4 + ori shift, 0x10 ;1 [42] + rjmp didUnstuff4 ;2 [44] + +unstuff5: ;1 (branch taken) + andi x3, ~0x20 ;1 [48] + in x2, USBIN ;1 [49] <-- sample stuffed bit 5 + ori shift, 0x20 ;1 [50] + rjmp didUnstuff5 ;2 [52] + +unstuff6: ;1 (branch taken) + andi x3, ~0x40 ;1 [56] + in x1, USBIN ;1 [57] <-- sample stuffed bit 6 + ori shift, 0x40 ;1 [58] + rjmp didUnstuff6 ;2 [60] + +; extra jobs done during bit interval: +; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs] +; bit 1: se0 check +; bit 2: overflow check +; bit 3: recovery from delay [bit 0 tasks took too long] +; bit 4: none +; bit 5: none +; bit 6: none +; bit 7: jump, eor +rxLoop: + eor x3, shift ;1 [0] reconstruct: x3 is 0 at bit locations we changed, 1 at others + in x1, USBIN ;1 [1] <-- sample bit 0 + st y+, x3 ;2 [3] store data + ser x3 ;1 [4] + nop ;1 [5] + eor x2, x1 ;1 [6] + bst x2, USBMINUS;1 [7] + bld shift, 0 ;1 [8] + in x2, USBIN ;1 [9] <-- sample bit 1 (or possibly bit 0 stuffed) + andi x2, USBMASK ;1 [10] + breq se0 ;1 [11] SE0 check for bit 1 + andi shift, 0xf9 ;1 [12] +didUnstuff0: + breq unstuff0 ;1 [13] + eor x1, x2 ;1 [14] + bst x1, USBMINUS;1 [15] + bld shift, 1 ;1 [16] +rxbit2: + in x1, USBIN ;1 [17] <-- sample bit 2 (or possibly bit 1 stuffed) + andi shift, 0xf3 ;1 [18] + breq unstuff1 ;1 [19] do remaining work for bit 1 +didUnstuff1: + subi cnt, 1 ;1 [20] + brcs overflow ;1 [21] loop control + eor x2, x1 ;1 [22] + bst x2, USBMINUS;1 [23] + bld shift, 2 ;1 [24] + in x2, USBIN ;1 [25] <-- sample bit 3 (or possibly bit 2 stuffed) + andi shift, 0xe7 ;1 [26] + breq unstuff2 ;1 [27] +didUnstuff2: + eor x1, x2 ;1 [28] + bst x1, USBMINUS;1 [29] + bld shift, 3 ;1 [30] +didUnstuff3: + andi shift, 0xcf ;1 [31] + breq unstuff3 ;1 [32] + in x1, USBIN ;1 [33] <-- sample bit 4 + eor x2, x1 ;1 [34] + bst x2, USBMINUS;1 [35] + bld shift, 4 ;1 [36] +didUnstuff4: + andi shift, 0x9f ;1 [37] + breq unstuff4 ;1 [38] + nop2 ;2 [40] + in x2, USBIN ;1 [41] <-- sample bit 5 + eor x1, x2 ;1 [42] + bst x1, USBMINUS;1 [43] + bld shift, 5 ;1 [44] +didUnstuff5: + andi shift, 0x3f ;1 [45] + breq unstuff5 ;1 [46] + nop2 ;2 [48] + in x1, USBIN ;1 [49] <-- sample bit 6 + eor x2, x1 ;1 [50] + bst x2, USBMINUS;1 [51] + bld shift, 6 ;1 [52] +didUnstuff6: + cpi shift, 0x02 ;1 [53] + brlo unstuff6 ;1 [54] + nop2 ;2 [56] + in x2, USBIN ;1 [57] <-- sample bit 7 + eor x1, x2 ;1 [58] + bst x1, USBMINUS;1 [59] + bld shift, 7 ;1 [60] +didUnstuff7: + cpi shift, 0x04 ;1 [61] + brsh rxLoop ;2 [63] loop control +unstuff7: + andi x3, ~0x80 ;1 [63] + ori shift, 0x80 ;1 [64] + in x2, USBIN ;1 [65] <-- sample stuffed bit 7 + nop ;1 [66] + rjmp didUnstuff7 ;2 [68] + +macro POP_STANDARD ; 12 cycles + pop cnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;---------------------------------------------------------------------------- +; Transmitting data +;---------------------------------------------------------------------------- + +txByteLoop: +txBitloop: +stuffN1Delay: ; [03] + ror shift ;[-5] [11] [59] + brcc doExorN1 ;[-4] [60] + subi x4, 1 ;[-3] + brne commonN1 ;[-2] + lsl shift ;[-1] compensate ror after rjmp stuffDelay + nop ;[00] stuffing consists of just waiting 8 cycles + rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear + +sendNakAndReti: ;0 [-19] 19 cycles until SOP + ldi x3, USBPID_NAK ;1 [-18] + rjmp usbSendX3 ;2 [-16] +sendAckAndReti: ;0 [-19] 19 cycles until SOP + ldi x3, USBPID_ACK ;1 [-18] + rjmp usbSendX3 ;2 [-16] +sendCntAndReti: ;0 [-17] 17 cycles until SOP + mov x3, cnt ;1 [-16] +usbSendX3: ;0 [-16] + ldi YL, 20 ;1 [-15] 'x3' is R20 + ldi YH, 0 ;1 [-14] + ldi cnt, 2 ;1 [-13] +; rjmp usbSendAndReti fallthrough + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) or USBOUT = 0x01 +; K = (D+ = 1), (D- = 0) or USBOUT = 0x02 +; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles) + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte +;uses: x1...x2, x4, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x4 = bitstuff cnt] +;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction) +usbSendAndReti: + in x2, USBDDR ;[-12] 12 cycles until SOP + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS ;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + out USBDDR, x2 ;[-8] <--- acquire bus + in x1, USBOUT ;[-7] port mirror for tx loop + ldi shift, 0x40 ;[-6] sync byte is first byte sent (we enter loop after ror) + ldi x2, USBMASK ;[-5] + push x4 ;[-4] +doExorN1: + eor x1, x2 ;[-2] [06] [62] + ldi x4, 6 ;[-1] [07] [63] +commonN1: +stuffN2Delay: + out USBOUT, x1 ;[00] [08] [64] <--- set bit + ror shift ;[01] + brcc doExorN2 ;[02] + subi x4, 1 ;[03] + brne commonN2 ;[04] + lsl shift ;[05] compensate ror after rjmp stuffDelay + rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear +doExorN2: + eor x1, x2 ;[04] [12] + ldi x4, 6 ;[05] [13] +commonN2: + nop ;[06] [14] + subi cnt, 171 ;[07] [15] trick: (3 * 171) & 0xff = 1 + out USBOUT, x1 ;[08] [16] <--- set bit + brcs txBitloop ;[09] [25] [41] + +stuff6Delay: + ror shift ;[42] [50] + brcc doExor6 ;[43] + subi x4, 1 ;[44] + brne common6 ;[45] + lsl shift ;[46] compensate ror after rjmp stuffDelay + nop ;[47] stuffing consists of just waiting 8 cycles + rjmp stuff6Delay ;[48] after ror, C bit is reliably clear +doExor6: + eor x1, x2 ;[45] [53] + ldi x4, 6 ;[46] +common6: +stuff7Delay: + ror shift ;[47] [55] + out USBOUT, x1 ;[48] <--- set bit + brcc doExor7 ;[49] + subi x4, 1 ;[50] + brne common7 ;[51] + lsl shift ;[52] compensate ror after rjmp stuffDelay + rjmp stuff7Delay ;[53] after ror, C bit is reliably clear +doExor7: + eor x1, x2 ;[51] [59] + ldi x4, 6 ;[52] +common7: + ld shift, y+ ;[53] + tst cnt ;[55] + out USBOUT, x1 ;[56] <--- set bit + brne txByteLoop ;[57] + +;make SE0: + cbr x1, USBMASK ;[58] prepare SE0 [spec says EOP may be 15 to 18 cycles] + lds x2, usbNewDeviceAddr;[59] + lsl x2 ;[61] we compare with left shifted address + subi YL, 2 + 20 ;[62] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[63] + out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[01] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 12.5625 MHz +max frequency: 69.286 cycles for 8 bit -> 12.99 MHz +nominal frequency: 12.77 MHz ( = sqrt(min * max)) + +sampling positions: (next even number in range [+/- 0.5]) +cycle index range: 0 ... 66 +bits: +.5, 8.875, 17.25, 25.625, 34, 42.375, 50.75, 59.125 +[0/1], [9], [17], [25/+26], [34], [+42/43], [51], [59] + +bit number: 0 1 2 3 4 5 6 7 +spare cycles 1 2 1 2 1 1 1 0 + +operations to perform: duration cycle + ---------------- + eor fix, shift 1 -> 00 + andi phase, USBMASK 1 -> 08 + breq se0 1 -> 16 (moved to 11) + st y+, data 2 -> 24, 25 + mov data, fix 1 -> 33 + ser data 1 -> 41 + subi cnt, 1 1 -> 49 + brcs overflow 1 -> 50 + +layout of samples and operations: +[##] = sample bit +<##> = sample phase +*##* = operation + +0: *00* [01] 02 03 04 <05> 06 07 +1: *08* [09] 10 11 12 <13> 14 15 *16* +2: [17] 18 19 20 <21> 22 23 +3: *24* *25* [26] 27 28 29 <30> 31 32 +4: *33* [34] 35 36 37 <38> 39 40 +5: *41* [42] 43 44 45 <46> 47 48 +6: *49* *50* [51] 52 53 54 <55> 56 57 58 +7: [59] 60 61 62 <63> 64 65 66 +*****************************************************************************/ + +/* we prefer positive expressions (do if condition) instead of negative + * (skip if condition), therefore use defines for skip instructions: + */ +#define ifioclr sbis +#define ifioset sbic +#define ifrclr sbrs +#define ifrset sbrc + +/* The registers "fix" and "data" swap their meaning during the loop. Use + * defines to keep their name constant. + */ +#define fix x2 +#define data x1 +#undef phase /* phase has a default definition to x4 */ +#define phase x3 + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt, r0 + push YL ;2 push only what is necessary to sync with edge ASAP + in YL, SREG ;1 + push YL ;2 +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of 1/4 bit which meets the spec. + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS ;[0] + rjmp foundK ;[1] +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError + +foundK: +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push YH ;[2] + lds YL, usbInputBufOffset;[4] + clr YH ;[6] + subi YL, lo8(-(usbRxBuf));[7] + sbci YH, hi8(-(usbRxBuf));[8] + + sbis USBIN, USBMINUS ;[9] we want two bits K [we want to sample at 8 + 4 - 1.5 = 10.5] + rjmp haveTwoBitsK ;[10] + pop YH ;[11] undo the push from before + rjmp waitForK ;[13] this was not the end of sync, retry +haveTwoBitsK: +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +#define fix x2 +#define data x1 + + push shift ;[12] + push x1 ;[14] + push x2 ;[16] + ldi shift, 0x80 ;[18] prevent bit-unstuffing but init low bits to 0 + ifioset USBIN, USBMINUS ;[19] [01] <--- bit 0 [10.5 + 8 = 18.5] + ori shift, 1<<0 ;[02] + push x3 ;[03] + push cnt ;[05] + push r0 ;[07] + ifioset USBIN, USBMINUS ;[09] <--- bit 1 + ori shift, 1<<1 ;[10] + ser fix ;[11] + ldi cnt, USB_BUFSIZE ;[12] + mov data, shift ;[13] + lsl shift ;[14] + nop2 ;[15] + ifioset USBIN, USBMINUS ;[17] <--- bit 2 + ori data, 3<<2 ;[18] store in bit 2 AND bit 3 + eor shift, data ;[19] do nrzi decoding + andi data, 1<<3 ;[20] + in phase, USBIN ;[21] <- phase + brne jumpToEntryAfterSet ;[22] if USBMINS at bit 3 was 1 + nop ;[23] + rjmp entryAfterClr ;[24] +jumpToEntryAfterSet: + rjmp entryAfterSet ;[24] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +#undef fix +#define fix x1 +#undef data +#define data x2 + +bit7IsSet: + ifrclr phase, USBMINUS ;[62] check phase only if D- changed + lpm ;[63] + in phase, USBIN ;[64] <- phase (one cycle too late) + ori shift, 1 << 7 ;[65] + nop ;[66] +;;;;rjmp bit0AfterSet ; -> [00] == [67] moved block up to save jump +bit0AfterSet: + eor fix, shift ;[00] +#undef fix +#define fix x2 +#undef data +#define data x1 /* we now have result in data, fix is reset to 0xff */ + ifioclr USBIN, USBMINUS ;[01] <--- sample 0 + rjmp bit0IsClr ;[02] + andi shift, ~(7 << 0) ;[03] + breq unstuff0s ;[04] + in phase, USBIN ;[05] <- phase + rjmp bit1AfterSet ;[06] +unstuff0s: + in phase, USBIN ;[06] <- phase (one cycle too late) + andi fix, ~(1 << 0) ;[07] + ifioclr USBIN, USBMINUS ;[00] + ifioset USBIN, USBPLUS ;[01] + rjmp bit0IsClr ;[02] executed if first expr false or second true +se0AndStore: ; executed only if both bits 0 + st y+, x1 ;[15/17] cycles after start of byte + rjmp se0 ;[17/19] + +bit0IsClr: + ifrset phase, USBMINUS ;[04] check phase only if D- changed + lpm ;[05] + in phase, USBIN ;[06] <- phase (one cycle too late) + ori shift, 1 << 0 ;[07] +bit1AfterClr: + andi phase, USBMASK ;[08] + ifioset USBIN, USBMINUS ;[09] <--- sample 1 + rjmp bit1IsSet ;[10] + breq se0AndStore ;[11] if D- was 0 in bits 0 AND 1 and D+ was 0 in between, we have SE0 + andi shift, ~(7 << 1) ;[12] + in phase, USBIN ;[13] <- phase + breq unstuff1c ;[14] + rjmp bit2AfterClr ;[15] +unstuff1c: + andi fix, ~(1 << 1) ;[16] + nop2 ;[08] + nop2 ;[10] +bit1IsSet: + ifrclr phase, USBMINUS ;[12] check phase only if D- changed + lpm ;[13] + in phase, USBIN ;[14] <- phase (one cycle too late) + ori shift, 1 << 1 ;[15] + nop ;[16] +bit2AfterSet: + ifioclr USBIN, USBMINUS ;[17] <--- sample 2 + rjmp bit2IsClr ;[18] + andi shift, ~(7 << 2) ;[19] + breq unstuff2s ;[20] + in phase, USBIN ;[21] <- phase + rjmp bit3AfterSet ;[22] +unstuff2s: + in phase, USBIN ;[22] <- phase (one cycle too late) + andi fix, ~(1 << 2) ;[23] + nop2 ;[16] + nop2 ;[18] +bit2IsClr: + ifrset phase, USBMINUS ;[20] check phase only if D- changed + lpm ;[21] + in phase, USBIN ;[22] <- phase (one cycle too late) + ori shift, 1 << 2 ;[23] +bit3AfterClr: + st y+, data ;[24] +entryAfterClr: + ifioset USBIN, USBMINUS ;[26] <--- sample 3 + rjmp bit3IsSet ;[27] + andi shift, ~(7 << 3) ;[28] + breq unstuff3c ;[29] + in phase, USBIN ;[30] <- phase + rjmp bit4AfterClr ;[31] +unstuff3c: + in phase, USBIN ;[31] <- phase (one cycle too late) + andi fix, ~(1 << 3) ;[32] + nop2 ;[25] + nop2 ;[27] +bit3IsSet: + ifrclr phase, USBMINUS ;[29] check phase only if D- changed + lpm ;[30] + in phase, USBIN ;[31] <- phase (one cycle too late) + ori shift, 1 << 3 ;[32] +bit4AfterSet: + mov data, fix ;[33] undo this move by swapping defines +#undef fix +#define fix x1 +#undef data +#define data x2 + ifioclr USBIN, USBMINUS ;[34] <--- sample 4 + rjmp bit4IsClr ;[35] + andi shift, ~(7 << 4) ;[36] + breq unstuff4s ;[37] + in phase, USBIN ;[38] <- phase + rjmp bit5AfterSet ;[39] +unstuff4s: + in phase, USBIN ;[39] <- phase (one cycle too late) + andi fix, ~(1 << 4) ;[40] + nop2 ;[33] + nop2 ;[35] +bit4IsClr: + ifrset phase, USBMINUS ;[37] check phase only if D- changed + lpm ;[38] + in phase, USBIN ;[39] <- phase (one cycle too late) + ori shift, 1 << 4 ;[40] +bit5AfterClr: + ser data ;[41] + ifioset USBIN, USBMINUS ;[42] <--- sample 5 + rjmp bit5IsSet ;[43] + andi shift, ~(7 << 5) ;[44] + breq unstuff5c ;[45] + in phase, USBIN ;[46] <- phase + rjmp bit6AfterClr ;[47] +unstuff5c: + in phase, USBIN ;[47] <- phase (one cycle too late) + andi fix, ~(1 << 5) ;[48] + nop2 ;[41] + nop2 ;[43] +bit5IsSet: + ifrclr phase, USBMINUS ;[45] check phase only if D- changed + lpm ;[46] + in phase, USBIN ;[47] <- phase (one cycle too late) + ori shift, 1 << 5 ;[48] +bit6AfterSet: + subi cnt, 1 ;[49] + brcs jumpToOverflow ;[50] + ifioclr USBIN, USBMINUS ;[51] <--- sample 6 + rjmp bit6IsClr ;[52] + andi shift, ~(3 << 6) ;[53] + cpi shift, 2 ;[54] + in phase, USBIN ;[55] <- phase + brlt unstuff6s ;[56] + rjmp bit7AfterSet ;[57] + +jumpToOverflow: + rjmp overflow + +unstuff6s: + andi fix, ~(1 << 6) ;[50] + lpm ;[51] +bit6IsClr: + ifrset phase, USBMINUS ;[54] check phase only if D- changed + lpm ;[55] + in phase, USBIN ;[56] <- phase (one cycle too late) + ori shift, 1 << 6 ;[57] + nop ;[58] +bit7AfterClr: + ifioset USBIN, USBMINUS ;[59] <--- sample 7 + rjmp bit7IsSet ;[60] + andi shift, ~(1 << 7) ;[61] + cpi shift, 4 ;[62] + in phase, USBIN ;[63] <- phase + brlt unstuff7c ;[64] + rjmp bit0AfterClr ;[65] -> [00] == [67] +unstuff7c: + andi fix, ~(1 << 7) ;[58] + nop ;[59] + rjmp bit7IsSet ;[60] + +bit7IsClr: + ifrset phase, USBMINUS ;[62] check phase only if D- changed + lpm ;[63] + in phase, USBIN ;[64] <- phase (one cycle too late) + ori shift, 1 << 7 ;[65] + nop ;[66] +;;;;rjmp bit0AfterClr ; -> [00] == [67] moved block up to save jump +bit0AfterClr: + eor fix, shift ;[00] +#undef fix +#define fix x2 +#undef data +#define data x1 /* we now have result in data, fix is reset to 0xff */ + ifioset USBIN, USBMINUS ;[01] <--- sample 0 + rjmp bit0IsSet ;[02] + andi shift, ~(7 << 0) ;[03] + breq unstuff0c ;[04] + in phase, USBIN ;[05] <- phase + rjmp bit1AfterClr ;[06] +unstuff0c: + in phase, USBIN ;[06] <- phase (one cycle too late) + andi fix, ~(1 << 0) ;[07] + ifioclr USBIN, USBMINUS ;[00] + ifioset USBIN, USBPLUS ;[01] + rjmp bit0IsSet ;[02] executed if first expr false or second true + rjmp se0AndStore ;[03] executed only if both bits 0 +bit0IsSet: + ifrclr phase, USBMINUS ;[04] check phase only if D- changed + lpm ;[05] + in phase, USBIN ;[06] <- phase (one cycle too late) + ori shift, 1 << 0 ;[07] +bit1AfterSet: + andi shift, ~(7 << 1) ;[08] compensated by "ori shift, 1<<1" if bit1IsClr + ifioclr USBIN, USBMINUS ;[09] <--- sample 1 + rjmp bit1IsClr ;[10] + breq unstuff1s ;[11] + nop2 ;[12] do not check for SE0 if bit 0 was 1 + in phase, USBIN ;[14] <- phase (one cycle too late) + rjmp bit2AfterSet ;[15] +unstuff1s: + in phase, USBIN ;[13] <- phase + andi fix, ~(1 << 1) ;[14] + lpm ;[07] + nop2 ;[10] +bit1IsClr: + ifrset phase, USBMINUS ;[12] check phase only if D- changed + lpm ;[13] + in phase, USBIN ;[14] <- phase (one cycle too late) + ori shift, 1 << 1 ;[15] + nop ;[16] +bit2AfterClr: + ifioset USBIN, USBMINUS ;[17] <--- sample 2 + rjmp bit2IsSet ;[18] + andi shift, ~(7 << 2) ;[19] + breq unstuff2c ;[20] + in phase, USBIN ;[21] <- phase + rjmp bit3AfterClr ;[22] +unstuff2c: + in phase, USBIN ;[22] <- phase (one cycle too late) + andi fix, ~(1 << 2) ;[23] + nop2 ;[16] + nop2 ;[18] +bit2IsSet: + ifrclr phase, USBMINUS ;[20] check phase only if D- changed + lpm ;[21] + in phase, USBIN ;[22] <- phase (one cycle too late) + ori shift, 1 << 2 ;[23] +bit3AfterSet: + st y+, data ;[24] +entryAfterSet: + ifioclr USBIN, USBMINUS ;[26] <--- sample 3 + rjmp bit3IsClr ;[27] + andi shift, ~(7 << 3) ;[28] + breq unstuff3s ;[29] + in phase, USBIN ;[30] <- phase + rjmp bit4AfterSet ;[31] +unstuff3s: + in phase, USBIN ;[31] <- phase (one cycle too late) + andi fix, ~(1 << 3) ;[32] + nop2 ;[25] + nop2 ;[27] +bit3IsClr: + ifrset phase, USBMINUS ;[29] check phase only if D- changed + lpm ;[30] + in phase, USBIN ;[31] <- phase (one cycle too late) + ori shift, 1 << 3 ;[32] +bit4AfterClr: + mov data, fix ;[33] undo this move by swapping defines +#undef fix +#define fix x1 +#undef data +#define data x2 + ifioset USBIN, USBMINUS ;[34] <--- sample 4 + rjmp bit4IsSet ;[35] + andi shift, ~(7 << 4) ;[36] + breq unstuff4c ;[37] + in phase, USBIN ;[38] <- phase + rjmp bit5AfterClr ;[39] +unstuff4c: + in phase, USBIN ;[39] <- phase (one cycle too late) + andi fix, ~(1 << 4) ;[40] + nop2 ;[33] + nop2 ;[35] +bit4IsSet: + ifrclr phase, USBMINUS ;[37] check phase only if D- changed + lpm ;[38] + in phase, USBIN ;[39] <- phase (one cycle too late) + ori shift, 1 << 4 ;[40] +bit5AfterSet: + ser data ;[41] + ifioclr USBIN, USBMINUS ;[42] <--- sample 5 + rjmp bit5IsClr ;[43] + andi shift, ~(7 << 5) ;[44] + breq unstuff5s ;[45] + in phase, USBIN ;[46] <- phase + rjmp bit6AfterSet ;[47] +unstuff5s: + in phase, USBIN ;[47] <- phase (one cycle too late) + andi fix, ~(1 << 5) ;[48] + nop2 ;[41] + nop2 ;[43] +bit5IsClr: + ifrset phase, USBMINUS ;[45] check phase only if D- changed + lpm ;[46] + in phase, USBIN ;[47] <- phase (one cycle too late) + ori shift, 1 << 5 ;[48] +bit6AfterClr: + subi cnt, 1 ;[49] + brcs overflow ;[50] + ifioset USBIN, USBMINUS ;[51] <--- sample 6 + rjmp bit6IsSet ;[52] + andi shift, ~(3 << 6) ;[53] + cpi shift, 2 ;[54] + in phase, USBIN ;[55] <- phase + brlt unstuff6c ;[56] + rjmp bit7AfterClr ;[57] +unstuff6c: + andi fix, ~(1 << 6) ;[50] + lpm ;[51] +bit6IsSet: + ifrclr phase, USBMINUS ;[54] check phase only if D- changed + lpm ;[55] + in phase, USBIN ;[56] <- phase (one cycle too late) + ori shift, 1 << 6 ;[57] +bit7AfterSet: + ifioclr USBIN, USBMINUS ;[59] <--- sample 7 + rjmp bit7IsClr ;[60] + andi shift, ~(1 << 7) ;[61] + cpi shift, 4 ;[62] + in phase, USBIN ;[63] <- phase + brlt unstuff7s ;[64] + rjmp bit0AfterSet ;[65] -> [00] == [67] +unstuff7s: + andi fix, ~(1 << 7) ;[58] + nop ;[59] + rjmp bit7IsClr ;[60] + +macro POP_STANDARD ; 14 cycles + pop r0 + pop cnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;---------------------------------------------------------------------------- +; Transmitting data +;---------------------------------------------------------------------------- + +txByteLoop: +txBitloop: +stuffN1Delay: ; [03] + ror shift ;[-5] [11] [63] + brcc doExorN1 ;[-4] [64] + subi x3, 1 ;[-3] + brne commonN1 ;[-2] + lsl shift ;[-1] compensate ror after rjmp stuffDelay + nop ;[00] stuffing consists of just waiting 8 cycles + rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear + +sendNakAndReti: + ldi cnt, USBPID_NAK ;[-19] + rjmp sendCntAndReti ;[-18] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov r0, cnt ;[-16] + ldi YL, 0 ;[-15] R0 address is 0 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) or USBOUT = 0x01 +; K = (D+ = 1), (D- = 0) or USBOUT = 0x02 +; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles) + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte +;uses: x1...x3, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x3 = bitstuff cnt] +;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction) +usbSendAndReti: + in x2, USBDDR ;[-10] 10 cycles until SOP + ori x2, USBMASK ;[-9] + sbi USBOUT, USBMINUS ;[-8] prepare idle state; D+ and D- must have been 0 (no pullups) + out USBDDR, x2 ;[-6] <--- acquire bus + in x1, USBOUT ;[-5] port mirror for tx loop + ldi shift, 0x40 ;[-4] sync byte is first byte sent (we enter loop after ror) + ldi x2, USBMASK ;[-3] +doExorN1: + eor x1, x2 ;[-2] [06] [62] + ldi x3, 6 ;[-1] [07] [63] +commonN1: +stuffN2Delay: + out USBOUT, x1 ;[00] [08] [64] <--- set bit + ror shift ;[01] + brcc doExorN2 ;[02] + subi x3, 1 ;[03] + brne commonN2 ;[04] + lsl shift ;[05] compensate ror after rjmp stuffDelay + rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear +doExorN2: + eor x1, x2 ;[04] [12] + ldi x3, 6 ;[05] [13] +commonN2: + nop2 ;[06] [14] + subi cnt, 171 ;[08] [16] trick: (3 * 171) & 0xff = 1 + out USBOUT, x1 ;[09] [17] <--- set bit + brcs txBitloop ;[10] [27] [44] + +stuff6Delay: + ror shift ;[45] [53] + brcc doExor6 ;[46] + subi x3, 1 ;[47] + brne common6 ;[48] + lsl shift ;[49] compensate ror after rjmp stuffDelay + nop ;[50] stuffing consists of just waiting 8 cycles + rjmp stuff6Delay ;[51] after ror, C bit is reliably clear +doExor6: + eor x1, x2 ;[48] [56] + ldi x3, 6 ;[49] +common6: +stuff7Delay: + ror shift ;[50] [58] + out USBOUT, x1 ;[51] <--- set bit + brcc doExor7 ;[52] + subi x3, 1 ;[53] + brne common7 ;[54] + lsl shift ;[55] compensate ror after rjmp stuffDelay + rjmp stuff7Delay ;[56] after ror, C bit is reliably clear +doExor7: + eor x1, x2 ;[54] [62] + ldi x3, 6 ;[55] +common7: + ld shift, y+ ;[56] + nop ;[58] + tst cnt ;[59] + out USBOUT, x1 ;[60] [00]<--- set bit + brne txByteLoop ;[61] [01] +;make SE0: + cbr x1, USBMASK ;[02] prepare SE0 [spec says EOP may be 15 to 18 cycles] + lds x2, usbNewDeviceAddr;[03] + lsl x2 ;[05] we compare with left shifted address + subi YL, 2 + 0 ;[06] Only assign address on data packets, not ACK/NAK in r0 + sbci YH, 0 ;[07] + out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[01] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 0) + echo "$s\n"; + } +} + +function printBit($isAfterSet, $bitNum) +{ + ob_start(); + if($isAfterSet){ +?> + ifioclr USBIN, USBMINUS ;[00] <--- sample + rjmp bit#IsClr ;[01] + andi shift, ~(7 << #) ;[02] + breq unstuff#s ;[03] + in phase, USBIN ;[04] <- phase + rjmp bit@AfterSet ;[05] +unstuff#s: + in phase, USBIN ;[05] <- phase (one cycle too late) + andi fix, ~(1 << #) ;[06] + nop2 ;[-1] + nop2 ;[01] +bit#IsClr: + ifrset phase, USBMINUS ;[03] check phase only if D- changed + lpm ;[04] + in phase, USBIN ;[05] <- phase (one cycle too late) + ori shift, 1 << # ;[06] + + ifioset USBIN, USBMINUS ;[00] <--- sample + rjmp bit#IsSet ;[01] + andi shift, ~(7 << #) ;[02] + breq unstuff#c ;[03] + in phase, USBIN ;[04] <- phase + rjmp bit@AfterClr ;[05] +unstuff#c: + in phase, USBIN ;[05] <- phase (one cycle too late) + andi fix, ~(1 << #) ;[06] + nop2 ;[-1] + nop2 ;[01] +bit#IsSet: + ifrclr phase, USBMINUS ;[03] check phase only if D- changed + lpm ;[04] + in phase, USBIN ;[05] <- phase (one cycle too late) + ori shift, 1 << # ;[06] + +*****************************************************************************/ diff --git a/adb2usb/uart2usb/usbdrv/usbdrvasm15.inc b/adb2usb/uart2usb/usbdrv/usbdrvasm15.inc new file mode 100644 index 0000000..401b7f8 --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/usbdrvasm15.inc @@ -0,0 +1,423 @@ +/* Name: usbdrvasm15.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: contributed by V. Bosch + * Creation Date: 2007-08-06 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm15.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 15 MHz version of the asssembler part of the USB driver. It +requires a 15 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! +*/ + +;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 15 MHz -> 10.0 cycles per bit, 80.0 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + +;---------------------------------------------------------------------------- +; order of registers pushed: +; YL, SREG [sofError] YH, shift, x1, x2, x3, bitcnt, cnt, x4 +;---------------------------------------------------------------------------- +USB_INTR_VECTOR: + push YL ;2 push only what is necessary to sync with edge ASAP + in YL, SREG ;1 + push YL ;2 +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +; +; sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +; sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +;------------------------------------------------------------------------------- +; The following code results in a sampling window of < 1/4 bit +; which meets the spec. +;------------------------------------------------------------------------------- +waitForK: ;- + sbis USBIN, USBMINUS ;1 [00] <-- sample + rjmp foundK ;2 [01] + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +;------------------------------------------------------------------------------ +; {3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for +; center sampling] +; we have 1 bit time for setup purposes, then sample again. +; Numbers in brackets are cycles from center of first sync (double K) +; bit after the instruction +;------------------------------------------------------------------------------ +foundK: ;- [02] + lds YL, usbInputBufOffset;2 [03+04] tx loop + push YH ;2 [05+06] + clr YH ;1 [07] + subi YL, lo8(-(usbRxBuf)) ;1 [08] [rx loop init] + sbci YH, hi8(-(usbRxBuf)) ;1 [09] [rx loop init] + push shift ;2 [10+11] + ser shift ;1 [12] + sbis USBIN, USBMINUS ;1 [-1] [13] <--sample:we want two bits K (sample 1 cycle too early) + rjmp haveTwoBitsK ;2 [00] [14] + pop shift ;2 [15+16] undo the push from before + pop YH ;2 [17+18] undo the push from before + rjmp waitForK ;2 [19+20] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 20 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: ;- [01] + push x1 ;2 [02+03] + push x2 ;2 [04+05] + push x3 ;2 [06+07] + push bitcnt ;2 [08+09] + in x1, USBIN ;1 [00] [10] <-- sample bit 0 + bst x1, USBMINUS ;1 [01] + bld shift, 0 ;1 [02] + push cnt ;2 [03+04] + ldi cnt, USB_BUFSIZE ;1 [05] + push x4 ;2 [06+07] tx loop + rjmp rxLoop ;2 [08] +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +unstuff0: ;- [07] (branch taken) + andi x3, ~0x01 ;1 [08] + mov x1, x2 ;1 [09] x2 contains last sampled (stuffed) bit + in x2, USBIN ;1 [00] [10] <-- sample bit 1 again + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 1 + ori shift, 0x01 ;1 [03] 0b00000001 + nop ;1 [04] + rjmp didUnstuff0 ;2 [05] +;----------------------------------------------------- +unstuff1: ;- [05] (branch taken) + mov x2, x1 ;1 [06] x1 contains last sampled (stuffed) bit + andi x3, ~0x02 ;1 [07] + ori shift, 0x02 ;1 [08] 0b00000010 + nop ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 2 again + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 2 + rjmp didUnstuff1 ;2 [03] +;----------------------------------------------------- +unstuff2: ;- [05] (branch taken) + andi x3, ~0x04 ;1 [06] + ori shift, 0x04 ;1 [07] 0b00000100 + mov x1, x2 ;1 [08] x2 contains last sampled (stuffed) bit + nop ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample bit 3 + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 3 + rjmp didUnstuff2 ;2 [03] +;----------------------------------------------------- +unstuff3: ;- [00] [10] (branch taken) + in x2, USBIN ;1 [01] [11] <-- sample stuffed bit 3 one cycle too late + andi x2, USBMASK ;1 [02] + breq se0Hop ;1 [03] SE0 check for stuffed bit 3 + andi x3, ~0x08 ;1 [04] + ori shift, 0x08 ;1 [05] 0b00001000 + rjmp didUnstuff3 ;2 [06] +;---------------------------------------------------------------------------- +; extra jobs done during bit interval: +; +; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs], +; overflow check, jump to the head of rxLoop +; bit 1: SE0 check +; bit 2: SE0 check, recovery from delay [bit 0 tasks took too long] +; bit 3: SE0 check, recovery from delay [bit 0 tasks took too long] +; bit 4: SE0 check, none +; bit 5: SE0 check, none +; bit 6: SE0 check, none +; bit 7: SE0 check, reconstruct: x3 is 0 at bit locations we changed, 1 at others +;---------------------------------------------------------------------------- +rxLoop: ;- [09] + in x2, USBIN ;1 [00] [10] <-- sample bit 1 (or possibly bit 0 stuffed) + andi x2, USBMASK ;1 [01] + brne SkipSe0Hop ;1 [02] +se0Hop: ;- [02] + rjmp se0 ;2 [03] SE0 check for bit 1 +SkipSe0Hop: ;- [03] + ser x3 ;1 [04] + andi shift, 0xf9 ;1 [05] 0b11111001 + breq unstuff0 ;1 [06] +didUnstuff0: ;- [06] + eor x1, x2 ;1 [07] + bst x1, USBMINUS ;1 [08] + bld shift, 1 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 2 (or possibly bit 1 stuffed) + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 2 + andi shift, 0xf3 ;1 [03] 0b11110011 + breq unstuff1 ;1 [04] do remaining work for bit 1 +didUnstuff1: ;- [04] + eor x2, x1 ;1 [05] + bst x2, USBMINUS ;1 [06] + bld shift, 2 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 3 (or possibly bit 2 stuffed) + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 3 + andi shift, 0xe7 ;1 [03] 0b11100111 + breq unstuff2 ;1 [04] +didUnstuff2: ;- [04] + eor x1, x2 ;1 [05] + bst x1, USBMINUS ;1 [06] + bld shift, 3 ;1 [07] +didUnstuff3: ;- [07] + andi shift, 0xcf ;1 [08] 0b11001111 + breq unstuff3 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 4 + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 4 + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 4 ;1 [05] +didUnstuff4: ;- [05] + andi shift, 0x9f ;1 [06] 0b10011111 + breq unstuff4 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 5 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 5 + eor x1, x2 ;1 [03] + bst x1, USBMINUS ;1 [04] + bld shift, 5 ;1 [05] +didUnstuff5: ;- [05] + andi shift, 0x3f ;1 [06] 0b00111111 + breq unstuff5 ;1 [07] + nop2 ;2 [08+09] + in x1, USBIN ;1 [00] [10] <-- sample bit 6 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 6 + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 6 ;1 [05] +didUnstuff6: ;- [05] + cpi shift, 0x02 ;1 [06] 0b00000010 + brlo unstuff6 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 7 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 7 + eor x1, x2 ;1 [03] + bst x1, USBMINUS ;1 [04] + bld shift, 7 ;1 [05] +didUnstuff7: ;- [05] + cpi shift, 0x04 ;1 [06] 0b00000100 + brlo unstuff7 ;1 [07] + eor x3, shift ;1 [08] reconstruct: x3 is 0 at bit locations we changed, 1 at others + nop ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 0 + st y+, x3 ;2 [01+02] store data + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 0 ;1 [05] + subi cnt, 1 ;1 [06] + brcs overflow ;1 [07] + rjmp rxLoop ;2 [08] +;----------------------------------------------------- +unstuff4: ;- [08] + andi x3, ~0x10 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 4 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 4 + ori shift, 0x10 ;1 [03] + rjmp didUnstuff4 ;2 [04] +;----------------------------------------------------- +unstuff5: ;- [08] + ori shift, 0x20 ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 5 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 5 + andi x3, ~0x20 ;1 [03] + rjmp didUnstuff5 ;2 [04] +;----------------------------------------------------- +unstuff6: ;- [08] + andi x3, ~0x40 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 6 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 6 + ori shift, 0x40 ;1 [03] + rjmp didUnstuff6 ;2 [04] +;----------------------------------------------------- +unstuff7: ;- [08] + andi x3, ~0x80 ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 7 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 7 + ori shift, 0x80 ;1 [03] + rjmp didUnstuff7 ;2 [04] + +macro POP_STANDARD ; 16 cycles + pop x4 + pop cnt + pop bitcnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;--------------------------------------------------------------------------- +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies +;--------------------------------------------------------------------------- +bitstuffN: ;- [04] + eor x1, x4 ;1 [05] + clr x2 ;1 [06] + nop ;1 [07] + rjmp didStuffN ;1 [08] +;--------------------------------------------------------------------------- +bitstuff6: ;- [04] + eor x1, x4 ;1 [05] + clr x2 ;1 [06] + rjmp didStuff6 ;1 [07] +;--------------------------------------------------------------------------- +bitstuff7: ;- [02] + eor x1, x4 ;1 [03] + clr x2 ;1 [06] + nop ;1 [05] + rjmp didStuff7 ;1 [06] +;--------------------------------------------------------------------------- +sendNakAndReti: ;- [-19] + ldi x3, USBPID_NAK ;1 [-18] + rjmp sendX3AndReti ;1 [-17] +;--------------------------------------------------------------------------- +sendAckAndReti: ;- [-17] + ldi cnt, USBPID_ACK ;1 [-16] +sendCntAndReti: ;- [-16] + mov x3, cnt ;1 [-15] +sendX3AndReti: ;- [-15] + ldi YL, 20 ;1 [-14] x3==r20 address is 20 + ldi YH, 0 ;1 [-13] + ldi cnt, 2 ;1 [-12] +; rjmp usbSendAndReti fallthrough +;--------------------------------------------------------------------------- +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +;We need not to match the transfer rate exactly because the spec demands +;only 1.5% precision anyway. +usbSendAndReti: ;- [-13] 13 cycles until SOP + in x2, USBDDR ;1 [-12] + ori x2, USBMASK ;1 [-11] + sbi USBOUT, USBMINUS ;2 [-09-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;1 [-08] port mirror for tx loop + out USBDDR, x2 ;1 [-07] <- acquire bus + ; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;1 [-06] exor mask + ldi shift, 0x80 ;1 [-05] sync byte is first byte sent + ldi bitcnt, 6 ;1 [-04] +txBitLoop: ;- [-04] [06] + sbrs shift, 0 ;1 [-03] [07] + eor x1, x4 ;1 [-02] [08] + ror shift ;1 [-01] [09] +didStuffN: ;- [09] + out USBOUT, x1 ;1 [00] [10] <-- out N + ror x2 ;1 [01] + cpi x2, 0xfc ;1 [02] + brcc bitstuffN ;1 [03] + dec bitcnt ;1 [04] + brne txBitLoop ;1 [05] + sbrs shift, 0 ;1 [06] + eor x1, x4 ;1 [07] + ror shift ;1 [08] +didStuff6: ;- [08] + nop ;1 [09] + out USBOUT, x1 ;1 [00] [10] <-- out 6 + ror x2 ;1 [01] + cpi x2, 0xfc ;1 [02] + brcc bitstuff6 ;1 [03] + sbrs shift, 0 ;1 [04] + eor x1, x4 ;1 [05] + ror shift ;1 [06] + ror x2 ;1 [07] +didStuff7: ;- [07] + ldi bitcnt, 6 ;1 [08] + cpi x2, 0xfc ;1 [09] + out USBOUT, x1 ;1 [00] [10] <-- out 7 + brcc bitstuff7 ;1 [01] + ld shift, y+ ;2 [02+03] + dec cnt ;1 [04] + brne txBitLoop ;1 [05] +makeSE0: + cbr x1, USBMASK ;1 [06] prepare SE0 [spec says EOP may be 19 to 23 cycles] + lds x2, usbNewDeviceAddr;2 [07+08] + lsl x2 ;1 [09] we compare with left shifted address +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + out USBOUT, x1 ;1 [00] [10] <-- out SE0-- from now 2 bits==20 cycl. until bus idle + subi YL, 20 + 2 ;1 [01] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;1 [02] + breq skipAddrAssign ;1 [03] + sts usbDeviceAddr, x2 ;2 [04+05] if not skipped: SE0 is one cycle longer +;---------------------------------------------------------------------------- +;end of usbDeviceAddress transfer +skipAddrAssign: ;- [03/04] + ldi x2, 1< 10.6666666 cycles per bit, 85.333333333 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt + push YL ;[-25] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-23] + push YL ;[-22] + push YH ;[-20] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-15] + rjmp foundK ;[-14] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-12] +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push bitcnt ;[-12] +; [---] ;[-11] + lds YL, usbInputBufOffset;[-10] +; [---] ;[-9] + clr YH ;[-8] + subi YL, lo8(-(usbRxBuf));[-7] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-6] [rx loop init] + push shift ;[-5] +; [---] ;[-4] + ldi bitcnt, 0x55 ;[-3] [rx loop init] + sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early) + rjmp haveTwoBitsK ;[-1] + pop shift ;[0] undo the push from before + pop bitcnt ;[2] undo the push from before + rjmp waitForK ;[4] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 21 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[1] + push x2 ;[3] + push x3 ;[5] + ldi shift, 0 ;[7] + ldi x3, 1<<4 ;[8] [rx loop init] first sample is inverse bit, compensate that + push x4 ;[9] == leap + + in x1, USBIN ;[11] <-- sample bit 0 + andi x1, USBMASK ;[12] + bst x1, USBMINUS ;[13] + bld shift, 7 ;[14] + push cnt ;[15] + ldi leap, 0 ;[17] [rx loop init] + ldi cnt, USB_BUFSIZE;[18] [rx loop init] + rjmp rxbit1 ;[19] arrives at [21] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- + +; duration of unstuffing code should be 10.66666667 cycles. We adjust "leap" +; accordingly to approximate this value in the long run. + +unstuff6: + andi x2, USBMASK ;[03] + ori x3, 1<<6 ;[04] will not be shifted any more + andi shift, ~0x80;[05] + mov x1, x2 ;[06] sampled bit 7 is actually re-sampled bit 6 + subi leap, -1 ;[07] total duration = 11 bits -> subtract 1/3 + rjmp didUnstuff6 ;[08] + +unstuff7: + ori x3, 1<<7 ;[09] will not be shifted any more + in x2, USBIN ;[00] [10] re-sample bit 7 + andi x2, USBMASK ;[01] + andi shift, ~0x80;[02] + subi leap, 2 ;[03] total duration = 10 bits -> add 1/3 + rjmp didUnstuff7 ;[04] + +unstuffEven: + ori x3, 1<<6 ;[09] will be shifted right 6 times for bit 0 + in x1, USBIN ;[00] [10] + andi shift, ~0x80;[01] + andi x1, USBMASK ;[02] + breq se0 ;[03] + subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3 + nop2 ;[05] + rjmp didUnstuffE ;[06] + +unstuffOdd: + ori x3, 1<<5 ;[09] will be shifted right 4 times for bit 1 + in x2, USBIN ;[00] [10] + andi shift, ~0x80;[01] + andi x2, USBMASK ;[02] + breq se0 ;[03] + subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3 + nop2 ;[05] + rjmp didUnstuffO ;[06] + +rxByteLoop: + andi x1, USBMASK ;[03] + eor x2, x1 ;[04] + subi leap, 1 ;[05] + brpl skipLeap ;[06] + subi leap, -3 ;1 one leap cycle every 3rd byte -> 85 + 1/3 cycles per byte + nop ;1 +skipLeap: + subi x2, 1 ;[08] + ror shift ;[09] +didUnstuff6: + cpi shift, 0xfc ;[10] + in x2, USBIN ;[00] [11] <-- sample bit 7 + brcc unstuff6 ;[01] + andi x2, USBMASK ;[02] + eor x1, x2 ;[03] + subi x1, 1 ;[04] + ror shift ;[05] +didUnstuff7: + cpi shift, 0xfc ;[06] + brcc unstuff7 ;[07] + eor x3, shift ;[08] reconstruct: x3 is 1 at bit locations we changed, 0 at others + st y+, x3 ;[09] store data +rxBitLoop: + in x1, USBIN ;[00] [11] <-- sample bit 0/2/4 + andi x1, USBMASK ;[01] + eor x2, x1 ;[02] + andi x3, 0x3f ;[03] topmost two bits reserved for 6 and 7 + subi x2, 1 ;[04] + ror shift ;[05] + cpi shift, 0xfc ;[06] + brcc unstuffEven ;[07] +didUnstuffE: + lsr x3 ;[08] + lsr x3 ;[09] +rxbit1: + in x2, USBIN ;[00] [10] <-- sample bit 1/3/5 + andi x2, USBMASK ;[01] + breq se0 ;[02] + eor x1, x2 ;[03] + subi x1, 1 ;[04] + ror shift ;[05] + cpi shift, 0xfc ;[06] + brcc unstuffOdd ;[07] +didUnstuffO: + subi bitcnt, 0xab;[08] == addi 0x55, 0x55 = 0x100/3 + brcs rxBitLoop ;[09] + + subi cnt, 1 ;[10] + in x1, USBIN ;[00] [11] <-- sample bit 6 + brcc rxByteLoop ;[01] + rjmp overflow + +macro POP_STANDARD ; 14 cycles + pop cnt + pop x4 + pop x3 + pop x2 + pop x1 + pop shift + pop bitcnt + endm +macro POP_RETI ; 7 cycles + pop YH + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies + +bitstuffN: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] + nop2 ;[7] + nop ;[9] + out USBOUT, x1 ;[10] <-- out + rjmp didStuffN ;[0] + +bitstuff6: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] Carry is zero due to brcc + rol shift ;[7] compensate for ror shift at branch destination + rjmp didStuff6 ;[8] + +bitstuff7: + ldi x2, 0 ;[2] Carry is zero due to brcc + rjmp didStuff7 ;[3] + + +sendNakAndReti: + ldi x3, USBPID_NAK ;[-18] + rjmp sendX3AndReti ;[-17] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov x3, cnt ;[-16] +sendX3AndReti: + ldi YL, 20 ;[-15] x3==r20 address is 20 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +;We don't match the transfer rate exactly (don't insert leap cycles every third +;byte) because the spec demands only 1.5% precision anyway. +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-7] <- acquire bus +; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-6] exor mask + ldi shift, 0x80 ;[-5] sync byte is first byte sent +txByteLoop: + ldi bitcnt, 0x35 ;[-4] [6] binary 0011 0101 +txBitLoop: + sbrs shift, 0 ;[-3] [7] + eor x1, x4 ;[-2] [8] + out USBOUT, x1 ;[-1] [9] <-- out N + ror shift ;[0] [10] + ror x2 ;[1] +didStuffN: + cpi x2, 0xfc ;[2] + brcc bitstuffN ;[3] + lsr bitcnt ;[4] + brcc txBitLoop ;[5] + brne txBitLoop ;[6] + + sbrs shift, 0 ;[7] + eor x1, x4 ;[8] +didStuff6: + out USBOUT, x1 ;[-1] [9] <-- out 6 + ror shift ;[0] [10] + ror x2 ;[1] + cpi x2, 0xfc ;[2] + brcc bitstuff6 ;[3] + ror shift ;[4] +didStuff7: + ror x2 ;[5] + sbrs x2, 7 ;[6] + eor x1, x4 ;[7] + nop ;[8] + cpi x2, 0xfc ;[9] + out USBOUT, x1 ;[-1][10] <-- out 7 + brcc bitstuff7 ;[0] [11] + ld shift, y+ ;[1] + dec cnt ;[3] + brne txByteLoop ;[4] +;make SE0: + cbr x1, USBMASK ;[5] prepare SE0 [spec says EOP may be 21 to 25 cycles] + lds x2, usbNewDeviceAddr;[6] + lsl x2 ;[8] we compare with left shifted address + subi YL, 20 + 2 ;[9] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[10] + out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[0] + sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< max 52 cycles interrupt disable +;max stack usage: [ret(2), r0, SREG, YL, YH, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 16.5 MHz -> 11 cycles per bit +; 16.3125 MHz < F_CPU < 16.6875 MHz (+/- 1.1%) +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], r0, YH, shift, x1, x2, x3, x4, cnt + push YL ;[-23] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-21] + push YL ;[-20] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-15] + rjmp foundK ;[-14] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-12] +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push r0 ;[-12] +; [---] ;[-11] + push YH ;[-10] +; [---] ;[-9] + lds YL, usbInputBufOffset;[-8] +; [---] ;[-7] + clr YH ;[-6] + subi YL, lo8(-(usbRxBuf));[-5] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-4] [rx loop init] + mov r0, x2 ;[-3] [rx loop init] + sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early) + rjmp haveTwoBitsK ;[-1] + pop YH ;[0] undo the pushes from before + pop r0 ;[2] + rjmp waitForK ;[4] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 22 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: ;[1] + push shift ;[1] + push x1 ;[3] + push x2 ;[5] + push x3 ;[7] + ldi shift, 0xff ;[9] [rx loop init] + ori x3, 0xff ;[10] [rx loop init] == ser x3, clear zero flag + + in x1, USBIN ;[11] <-- sample bit 0 + bst x1, USBMINUS ;[12] + bld shift, 0 ;[13] + push x4 ;[14] == phase +; [---] ;[15] + push cnt ;[16] +; [---] ;[17] + ldi phase, 0 ;[18] [rx loop init] + ldi cnt, USB_BUFSIZE;[19] [rx loop init] + rjmp rxbit1 ;[20] +; [---] ;[21] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +/* +byte oriented operations done during loop: +bit 0: store data +bit 1: SE0 check +bit 2: overflow check +bit 3: catch up +bit 4: rjmp to achieve conditional jump range +bit 5: PLL +bit 6: catch up +bit 7: jump, fixup bitstuff +; 87 [+ 2] cycles +------------------------------------------------------------------ +*/ +continueWithBit5: + in x2, USBIN ;[055] <-- bit 5 + eor r0, x2 ;[056] + or phase, r0 ;[057] + sbrc phase, USBMINUS ;[058] + lpm ;[059] optional nop3; modifies r0 + in phase, USBIN ;[060] <-- phase + eor x1, x2 ;[061] + bst x1, USBMINUS ;[062] + bld shift, 5 ;[063] + andi shift, 0x3f ;[064] + in x1, USBIN ;[065] <-- bit 6 + breq unstuff5 ;[066] *** unstuff escape + eor phase, x1 ;[067] + eor x2, x1 ;[068] + bst x2, USBMINUS ;[069] + bld shift, 6 ;[070] +didUnstuff6: ;[ ] + in r0, USBIN ;[071] <-- phase + cpi shift, 0x02 ;[072] + brlo unstuff6 ;[073] *** unstuff escape +didUnstuff5: ;[ ] + nop2 ;[074] +; [---] ;[075] + in x2, USBIN ;[076] <-- bit 7 + eor x1, x2 ;[077] + bst x1, USBMINUS ;[078] + bld shift, 7 ;[079] +didUnstuff7: ;[ ] + eor r0, x2 ;[080] + or phase, r0 ;[081] + in r0, USBIN ;[082] <-- phase + cpi shift, 0x04 ;[083] + brsh rxLoop ;[084] +; [---] ;[085] +unstuff7: ;[ ] + andi x3, ~0x80 ;[085] + ori shift, 0x80 ;[086] + in x2, USBIN ;[087] <-- sample stuffed bit 7 + nop ;[088] + rjmp didUnstuff7 ;[089] +; [---] ;[090] + ;[080] + +unstuff5: ;[067] + eor phase, x1 ;[068] + andi x3, ~0x20 ;[069] + ori shift, 0x20 ;[070] + in r0, USBIN ;[071] <-- phase + mov x2, x1 ;[072] + nop ;[073] + nop2 ;[074] +; [---] ;[075] + in x1, USBIN ;[076] <-- bit 6 + eor r0, x1 ;[077] + or phase, r0 ;[078] + eor x2, x1 ;[079] + bst x2, USBMINUS ;[080] + bld shift, 6 ;[081] no need to check bitstuffing, we just had one + in r0, USBIN ;[082] <-- phase + rjmp didUnstuff5 ;[083] +; [---] ;[084] + ;[074] + +unstuff6: ;[074] + andi x3, ~0x40 ;[075] + in x1, USBIN ;[076] <-- bit 6 again + ori shift, 0x40 ;[077] + nop2 ;[078] +; [---] ;[079] + rjmp didUnstuff6 ;[080] +; [---] ;[081] + ;[071] + +unstuff0: ;[013] + eor r0, x2 ;[014] + or phase, r0 ;[015] + andi x2, USBMASK ;[016] check for SE0 + in r0, USBIN ;[017] <-- phase + breq didUnstuff0 ;[018] direct jump to se0 would be too long + andi x3, ~0x01 ;[019] + ori shift, 0x01 ;[020] + mov x1, x2 ;[021] mov existing sample + in x2, USBIN ;[022] <-- bit 1 again + rjmp didUnstuff0 ;[023] +; [---] ;[024] + ;[014] + +unstuff1: ;[024] + eor r0, x1 ;[025] + or phase, r0 ;[026] + andi x3, ~0x02 ;[027] + in r0, USBIN ;[028] <-- phase + ori shift, 0x02 ;[029] + mov x2, x1 ;[030] + rjmp didUnstuff1 ;[031] +; [---] ;[032] + ;[022] + +unstuff2: ;[035] + eor r0, x2 ;[036] + or phase, r0 ;[037] + andi x3, ~0x04 ;[038] + in r0, USBIN ;[039] <-- phase + ori shift, 0x04 ;[040] + mov x1, x2 ;[041] + rjmp didUnstuff2 ;[042] +; [---] ;[043] + ;[033] + +unstuff3: ;[043] + in x2, USBIN ;[044] <-- bit 3 again + eor r0, x2 ;[045] + or phase, r0 ;[046] + andi x3, ~0x08 ;[047] + ori shift, 0x08 ;[048] + nop ;[049] + in r0, USBIN ;[050] <-- phase + rjmp didUnstuff3 ;[051] +; [---] ;[052] + ;[042] + +unstuff4: ;[053] + andi x3, ~0x10 ;[054] + in x1, USBIN ;[055] <-- bit 4 again + ori shift, 0x10 ;[056] + rjmp didUnstuff4 ;[057] +; [---] ;[058] + ;[048] + +rxLoop: ;[085] + eor x3, shift ;[086] reconstruct: x3 is 0 at bit locations we changed, 1 at others + in x1, USBIN ;[000] <-- bit 0 + st y+, x3 ;[001] +; [---] ;[002] + eor r0, x1 ;[003] + or phase, r0 ;[004] + eor x2, x1 ;[005] + in r0, USBIN ;[006] <-- phase + ser x3 ;[007] + bst x2, USBMINUS ;[008] + bld shift, 0 ;[009] + andi shift, 0xf9 ;[010] +rxbit1: ;[ ] + in x2, USBIN ;[011] <-- bit 1 + breq unstuff0 ;[012] *** unstuff escape + andi x2, USBMASK ;[013] SE0 check for bit 1 +didUnstuff0: ;[ ] Z only set if we detected SE0 in bitstuff + breq se0 ;[014] + eor r0, x2 ;[015] + or phase, r0 ;[016] + in r0, USBIN ;[017] <-- phase + eor x1, x2 ;[018] + bst x1, USBMINUS ;[019] + bld shift, 1 ;[020] + andi shift, 0xf3 ;[021] +didUnstuff1: ;[ ] + in x1, USBIN ;[022] <-- bit 2 + breq unstuff1 ;[023] *** unstuff escape + eor r0, x1 ;[024] + or phase, r0 ;[025] + subi cnt, 1 ;[026] overflow check + brcs overflow ;[027] + in r0, USBIN ;[028] <-- phase + eor x2, x1 ;[029] + bst x2, USBMINUS ;[030] + bld shift, 2 ;[031] + andi shift, 0xe7 ;[032] +didUnstuff2: ;[ ] + in x2, USBIN ;[033] <-- bit 3 + breq unstuff2 ;[034] *** unstuff escape + eor r0, x2 ;[035] + or phase, r0 ;[036] + eor x1, x2 ;[037] + bst x1, USBMINUS ;[038] + in r0, USBIN ;[039] <-- phase + bld shift, 3 ;[040] + andi shift, 0xcf ;[041] +didUnstuff3: ;[ ] + breq unstuff3 ;[042] *** unstuff escape + nop ;[043] + in x1, USBIN ;[044] <-- bit 4 + eor x2, x1 ;[045] + bst x2, USBMINUS ;[046] + bld shift, 4 ;[047] +didUnstuff4: ;[ ] + eor r0, x1 ;[048] + or phase, r0 ;[049] + in r0, USBIN ;[050] <-- phase + andi shift, 0x9f ;[051] + breq unstuff4 ;[052] *** unstuff escape + rjmp continueWithBit5;[053] +; [---] ;[054] + +macro POP_STANDARD ; 16 cycles + pop cnt + pop x4 + pop x3 + pop x2 + pop x1 + pop shift + pop YH + pop r0 + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies + +bitstuff7: + eor x1, x4 ;[4] + ldi x2, 0 ;[5] + nop2 ;[6] C is zero (brcc) + rjmp didStuff7 ;[8] + +bitstuffN: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] + lpm ;[7] 3 cycle NOP, modifies r0 + out USBOUT, x1 ;[10] <-- out + rjmp didStuffN ;[0] + +#define bitStatus x3 + +sendNakAndReti: + ldi cnt, USBPID_NAK ;[-19] + rjmp sendCntAndReti ;[-18] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov r0, cnt ;[-16] + ldi YL, 0 ;[-15] R0 address is 0 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-7] <- acquire bus +; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-6] exor mask + ldi shift, 0x80 ;[-5] sync byte is first byte sent + ldi bitStatus, 0xff ;[-4] init bit loop counter, works for up to 12 bytes +byteloop: +bitloop: + sbrs shift, 0 ;[8] [-3] + eor x1, x4 ;[9] [-2] + out USBOUT, x1 ;[10] [-1] <-- out + ror shift ;[0] + ror x2 ;[1] +didStuffN: + cpi x2, 0xfc ;[2] + brcc bitstuffN ;[3] + nop ;[4] + subi bitStatus, 37 ;[5] 256 / 7 ~=~ 37 + brcc bitloop ;[6] when we leave the loop, bitStatus has almost the initial value + sbrs shift, 0 ;[7] + eor x1, x4 ;[8] + ror shift ;[9] +didStuff7: + out USBOUT, x1 ;[10] <-- out + ror x2 ;[0] + cpi x2, 0xfc ;[1] + brcc bitstuff7 ;[2] + ld shift, y+ ;[3] + dec cnt ;[5] + brne byteloop ;[6] +;make SE0: + cbr x1, USBMASK ;[7] prepare SE0 [spec says EOP may be 21 to 25 cycles] + lds x2, usbNewDeviceAddr;[8] + lsl x2 ;[10] we compare with left shifted address + out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + subi YL, 2 ;[0] Only assign address on data packets, not ACK/NAK in r0 + sbci YH, 0 ;[1] + breq skipAddrAssign ;[2] + sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 12 cycles per bit +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts +;register use in receive loop to receive the data bytes: +; shift assembles the byte currently being received +; x1 holds the D+ and D- line state +; x2 holds the previous line state +; cnt holds the number of bytes left in the receive buffer +; x3 holds the higher crc byte (see algorithm below) +; x4 is used as temporary register for the crc algorithm +; x5 is used for unstuffing: when unstuffing the last received bit is inverted in shift (to prevent further +; unstuffing calls. In the same time the corresponding bit in x5 is cleared to mark the bit as beening iverted +; zl lower crc value and crc table index +; zh used for crc table accesses + +;-------------------------------------------------------------------------------------------------------------- +; CRC mods: +; table driven crc checker, Z points to table in prog space +; ZL is the lower crc byte, x3 is the higher crc byte +; x4 is used as temp register to store different results +; the initialization of the crc register is not 0xFFFF but 0xFE54. This is because during the receipt of the +; first data byte an virtual zero data byte is added to the crc register, this results in the correct initial +; value of 0xFFFF at beginning of the second data byte before the first data byte is added to the crc. +; The magic number 0xFE54 results form the crc table: At tabH[0x54] = 0xFF = crcH (required) and +; tabL[0x54] = 0x01 -> crcL = 0x01 xor 0xFE = 0xFF +; bitcnt is renamed to x5 and is used for unstuffing purposes, the unstuffing works like in the 12MHz version +;-------------------------------------------------------------------------------------------------------------- +; CRC algorithm: +; The crc register is formed by x3 (higher byte) and ZL (lower byte). The algorithm uses a 'reversed' form +; i.e. that it takes the least significant bit first and shifts to the right. So in fact the highest order +; bit seen from the polynomial devision point of view is the lsb of ZL. (If this sounds strange to you i +; propose a research on CRC :-) ) +; Each data byte received is xored to ZL, the lower crc byte. This byte now builds the crc +; table index. Next the new high byte is loaded from the table and stored in x4 until we have space in x3 +; (its destination). +; Afterwards the lower table is loaded from the table and stored in ZL (the old index is overwritten as +; we don't need it anymore. In fact this is a right shift by 8 bits.) Now the old crc high value is xored +; to ZL, this is the second shift of the old crc value. Now x4 (the temp reg) is moved to x3 and the crc +; calculation is done. +; Prior to the first byte the two CRC register have to be initialized to 0xFFFF (as defined in usb spec) +; however the crc engine also runs during the receipt of the first byte, therefore x3 and zl are initialized +; to a magic number which results in a crc value of 0xFFFF after the first complete byte. +; +; This algorithm is split into the extra cycles of the different bits: +; bit7: XOR the received byte to ZL +; bit5: load the new high byte to x4 +; bit6: load the lower xor byte from the table, xor zl and x3, store result in zl (=the new crc low value) +; move x4 (the new high byte) to x3, the crc value is ready +; + + +macro POP_STANDARD ; 18 cycles + pop ZH + pop ZL + pop cnt + pop x5 + pop x3 + pop x2 + pop x1 + pop shift + pop x4 + endm +macro POP_RETI ; 7 cycles + pop YH + pop YL + out SREG, YL + pop YL + endm + +macro CRC_CLEANUP_AND_CHECK + ; the last byte has already been xored with the lower crc byte, we have to do the table lookup and xor + ; x3 is the higher crc byte, zl the lower one + ldi ZH, hi8(usbCrcTableHigh);[+1] get the new high byte from the table + lpm x2, Z ;[+2][+3][+4] + ldi ZH, hi8(usbCrcTableLow);[+5] get the new low xor byte from the table + lpm ZL, Z ;[+6][+7][+8] + eor ZL, x3 ;[+7] xor the old high byte with the value from the table, x2:ZL now holds the crc value + cpi ZL, 0x01 ;[+8] if the crc is ok we have a fixed remainder value of 0xb001 in x2:ZL (see usb spec) + brne ignorePacket ;[+9] detected a crc fault -> paket is ignored and retransmitted by the host + cpi x2, 0xb0 ;[+10] + brne ignorePacket ;[+11] detected a crc fault -> paket is ignored and retransmitted by the host + endm + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG, YH, [sofError], x4, shift, x1, x2, x3, x5, cnt, ZL, ZH + push YL ;[-28] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-26] + push YL ;[-25] + push YH ;[-23] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-17] + rjmp foundK ;[-16] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-15] +;{3, 5} after falling D- edge, average delay: 4 cycles +;bit0 should be at 30 (2.5 bits) for center sampling. Currently at 4 so 26 cylces till bit 0 sample +;use 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push x4 ;[-14] +; [---] ;[-13] + lds YL, usbInputBufOffset;[-12] used to toggle the two usb receive buffers +; [---] ;[-11] + clr YH ;[-10] + subi YL, lo8(-(usbRxBuf));[-9] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-8] [rx loop init] + push shift ;[-7] +; [---] ;[-6] + ldi shift, 0x80 ;[-5] the last bit is the end of byte marker for the pid receiver loop + clc ;[-4] the carry has to be clear for receipt of pid bit 0 + sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early) + rjmp haveTwoBitsK ;[-2] + pop shift ;[-1] undo the push from before + pop x4 ;[1] + rjmp waitForK ;[3] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 24 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[0] + push x2 ;[2] + push x3 ;[4] crc high byte + ldi x2, 1< jump back and store the byte + ori shift, 0x01 ;[11] invert the last received bit to prevent furhter unstuffing + in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + andi x5, 0xFE ;[1] mark this bit as inverted (will be corrected before storing shift) + eor x1, x2 ;[2] x1 and x2 have to be different because the stuff bit is always a zero + andi x1, USBMASK ;[3] mask the interesting bits + breq stuffErr ;[4] if the stuff bit is a 1-bit something went wrong + mov x1, x2 ;[5] the next bit expects the last state to be in x1 + rjmp didunstuff0 ;[6] + ;[7] jump delay of rjmp didunstuffX + +unstuff1: ;[11] this is the jump delay of breq unstuffX + in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + ori shift, 0x02 ;[1] invert the last received bit to prevent furhter unstuffing + andi x5, 0xFD ;[2] mark this bit as inverted (will be corrected before storing shift) + eor x2, x1 ;[3] x1 and x2 have to be different because the stuff bit is always a zero + andi x2, USBMASK ;[4] mask the interesting bits + breq stuffErr ;[5] if the stuff bit is a 1-bit something went wrong + mov x2, x1 ;[6] the next bit expects the last state to be in x2 + nop2 ;[7] + ;[8] + rjmp didunstuff1 ;[9] + ;[10] jump delay of rjmp didunstuffX + +unstuff2: ;[9] this is the jump delay of breq unstuffX + ori shift, 0x04 ;[10] invert the last received bit to prevent furhter unstuffing + andi x5, 0xFB ;[11] mark this bit as inverted (will be corrected before storing shift) + in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + eor x1, x2 ;[1] x1 and x2 have to be different because the stuff bit is always a zero + andi x1, USBMASK ;[2] mask the interesting bits + breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong + mov x1, x2 ;[4] the next bit expects the last state to be in x1 + nop2 ;[5] + ;[6] + rjmp didunstuff2 ;[7] + ;[8] jump delay of rjmp didunstuffX + +unstuff3: ;[9] this is the jump delay of breq unstuffX + ori shift, 0x08 ;[10] invert the last received bit to prevent furhter unstuffing + andi x5, 0xF7 ;[11] mark this bit as inverted (will be corrected before storing shift) + in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + eor x2, x1 ;[1] x1 and x2 have to be different because the stuff bit is always a zero + andi x2, USBMASK ;[2] mask the interesting bits + breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong + mov x2, x1 ;[4] the next bit expects the last state to be in x2 + nop2 ;[5] + ;[6] + rjmp didunstuff3 ;[7] + ;[8] jump delay of rjmp didunstuffX + + + +; the include has to be here due to branch distance restirctions +#define __USE_CRC__ +#include "asmcommon.inc" + + + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies +; 7.5 bit times is 90 cycles. ...there is plenty of time + + +sendNakAndReti: + ldi x3, USBPID_NAK ;[-18] + rjmp sendX3AndReti ;[-17] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov x3, cnt ;[-16] +sendX3AndReti: + ldi YL, 20 ;[-15] x3==r20 address is 20 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent + +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-6] <- acquire bus + ldi x2, 0 ;[-6] init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-5] exor mask + ldi shift, 0x80 ;[-4] sync byte is first byte sent +txByteLoop: + ldi bitcnt, 0x40 ;[-3]=[9] binary 01000000 +txBitLoop: ; the loop sends the first 7 bits of the byte + sbrs shift, 0 ;[-2]=[10] if we have to send a 1 don't change the line state + eor x1, x4 ;[-1]=[11] + out USBOUT, x1 ;[0] + ror shift ;[1] + ror x2 ;[2] transfers the last sent bit to the stuffing history +didStuffN: + nop ;[3] + nop ;[4] + cpi x2, 0xfc ;[5] if we sent six consecutive ones + brcc bitstuffN ;[6] + lsr bitcnt ;[7] + brne txBitLoop ;[8] restart the loop while the 1 is still in the bitcount + +; transmit bit 7 + sbrs shift, 0 ;[9] + eor x1, x4 ;[10] +didStuff7: + ror shift ;[11] + out USBOUT, x1 ;[0] transfer bit 7 to the pins + ror x2 ;[1] move the bit into the stuffing history + cpi x2, 0xfc ;[2] + brcc bitstuff7 ;[3] + ld shift, y+ ;[4] get next byte to transmit + dec cnt ;[5] decrement byte counter + brne txByteLoop ;[7] if we have more bytes start next one + ;[8] branch delay + +;make SE0: + cbr x1, USBMASK ;[8] prepare SE0 [spec says EOP may be 25 to 30 cycles] + lds x2, usbNewDeviceAddr;[9] + lsl x2 ;[11] we compare with left shifted address + out USBOUT, x1 ;[0] <-- out SE0 -- from now 2 bits = 24 cycles until bus idle + subi YL, 20 + 2 ;[1] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[2] +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[3] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< +int main (int argc, char **argv) +{ + int i, j; + for (i=0; i<512; i++){ + unsigned short crc = i & 0xff; + for(j=0; j<8; j++) crc = (crc >> 1) ^ ((crc & 1) ? 0xa001 : 0); + if((i & 7) == 0) printf("\n.byte "); + printf("0x%02x, ", (i > 0xff ? (crc >> 8) : crc) & 0xff); + if(i == 255) printf("\n"); + } + return 0; +} + +// Use the following algorithm to compute CRC values: +ushort computeCrc(uchar *msg, uchar msgLen) +{ + uchar i; + ushort crc = 0xffff; + for(i = 0; i < msgLen; i++) + crc = usbCrcTable16[lo8(crc) ^ msg[i]] ^ hi8(crc); + return crc; +} +*/ + +.balign 256 +usbCrcTableLow: +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 + +; .balign 256 +usbCrcTableHigh: +.byte 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2 +.byte 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04 +.byte 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E +.byte 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8 +.byte 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A +.byte 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC +.byte 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6 +.byte 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10 +.byte 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32 +.byte 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4 +.byte 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE +.byte 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38 +.byte 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA +.byte 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C +.byte 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26 +.byte 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0 +.byte 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62 +.byte 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4 +.byte 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE +.byte 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68 +.byte 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA +.byte 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C +.byte 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76 +.byte 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0 +.byte 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92 +.byte 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54 +.byte 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E +.byte 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98 +.byte 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A +.byte 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C +.byte 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86 +.byte 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 + diff --git a/adb2usb/uart2usb/usbdrv/usbdrvasm20.inc b/adb2usb/uart2usb/usbdrv/usbdrvasm20.inc new file mode 100644 index 0000000..303abaf --- /dev/null +++ b/adb2usb/uart2usb/usbdrv/usbdrvasm20.inc @@ -0,0 +1,360 @@ +/* Name: usbdrvasm20.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Jeroen Benschop + * Based on usbdrvasm16.inc from Christian Starkjohann + * Creation Date: 2008-03-05 + * Tabsize: 4 + * Copyright: (c) 2008 by Jeroen Benschop and OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm20.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 20 MHz version of the asssembler part of the USB driver. It +requires a 20 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! +*/ + +#define leap2 x3 +#ifdef __IAR_SYSTEMS_ASM__ +#define nextInst $+2 +#else +#define nextInst .+0 +#endif + +;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 20 MHz -> 13.333333 cycles per bit, 106.666667 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts +;register use in receive loop: +; shift assembles the byte currently being received +; x1 holds the D+ and D- line state +; x2 holds the previous line state +; x4 (leap) is used to add a leap cycle once every three bytes received +; X3 (leap2) is used to add a leap cycle once every three stuff bits received +; bitcnt is used to determine when a stuff bit is due +; cnt holds the number of bytes left in the receive buffer + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt + push YL ;[-28] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-26] + push YL ;[-25] + push YH ;[-23] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-19] + rjmp foundK ;[-18] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-16] +;{3, 5} after falling D- edge, average delay: 4 cycles +;bit0 should be at 34 for center sampling. Currently at 4 so 30 cylces till bit 0 sample +;use 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push bitcnt ;[-16] +; [---] ;[-15] + lds YL, usbInputBufOffset;[-14] +; [---] ;[-13] + clr YH ;[-12] + subi YL, lo8(-(usbRxBuf));[-11] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-10] [rx loop init] + push shift ;[-9] +; [---] ;[-8] + ldi shift,0x40 ;[-7] set msb to "1" so processing bit7 can be detected + nop2 ;[-6] +; [---] ;[-5] + ldi bitcnt, 5 ;[-4] [rx loop init] + sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early) + rjmp haveTwoBitsK ;[-2] + pop shift ;[-1] undo the push from before + pop bitcnt ;[1] + rjmp waitForK ;[3] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 27 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[0] + push x2 ;[2] + push x3 ;[4] (leap2) + ldi leap2, 0x55 ;[6] add leap cycle on 2nd,5th,8th,... stuff bit + push x4 ;[7] == leap + ldi leap, 0x55 ;[9] skip leap cycle on 2nd,5th,8th,... byte received + push cnt ;[10] + ldi cnt, USB_BUFSIZE ;[12] [rx loop init] + ldi x2, 1< +#ifndef __IAR_SYSTEMS_ASM__ +# include +#endif + +#define __attribute__(arg) /* not supported on IAR */ + +#ifdef __IAR_SYSTEMS_ASM__ +# define __ASSEMBLER__ /* IAR does not define standard macro for asm */ +#endif + +#ifdef __HAS_ELPM__ +# define PROGMEM __farflash +#else +# define PROGMEM __flash +#endif + +#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) + +/* The following definitions are not needed by the driver, but may be of some + * help if you port a gcc based project to IAR. + */ +#define cli() __disable_interrupt() +#define sei() __enable_interrupt() +#define wdt_reset() __watchdog_reset() +#define _BV(x) (1 << (x)) + +/* assembler compatibility macros */ +#define nop2 rjmp $+2 /* jump to next instruction */ +#define XL r26 +#define XH r27 +#define YL r28 +#define YH r29 +#define ZL r30 +#define ZH r31 +#define lo8(x) LOW(x) +#define hi8(x) (((x)>>8) & 0xff) /* not HIGH to allow XLINK to make a proper range check */ + +/* Depending on the device you use, you may get problems with the way usbdrv.h + * handles the differences between devices. Since IAR does not use #defines + * for MCU registers, we can't check for the existence of a particular + * register with an #ifdef. If the autodetection mechanism fails, include + * definitions for the required USB_INTR_* macros in your usbconfig.h. See + * usbconfig-prototype.h and usbdrv.h for details. + */ + +/* ------------------------------------------------------------------------- */ +#elif __CODEVISIONAVR__ /* check for CodeVision AVR */ +/* ------------------------------------------------------------------------- */ +/* This port is not working (yet) */ + +/* #define F_CPU _MCU_CLOCK_FREQUENCY_ seems to be defined automatically */ + +#include +#include + +#define __attribute__(arg) /* not supported on IAR */ + +#define PROGMEM __flash +#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) + +#ifndef __ASSEMBLER__ +static inline void cli(void) +{ + #asm("cli"); +} +static inline void sei(void) +{ + #asm("sei"); +} +#endif +#define _delay_ms(t) delay_ms(t) +#define _BV(x) (1 << (x)) +#define USB_CFG_USE_SWITCH_STATEMENT 1 /* macro for if() cascase fails for unknown reason */ + +#define macro .macro +#define endm .endmacro +#define nop2 rjmp .+0 /* jump to next instruction */ + +/* ------------------------------------------------------------------------- */ +#else /* default development environment is avr-gcc/avr-libc */ +/* ------------------------------------------------------------------------- */ + +#include +#ifdef __ASSEMBLER__ +# define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */ +#else +# include +#endif + +#if USB_CFG_DRIVER_FLASH_PAGE +# define USB_READ_FLASH(addr) pgm_read_byte_far(((long)USB_CFG_DRIVER_FLASH_PAGE << 16) | (long)(addr)) +#else +# define USB_READ_FLASH(addr) pgm_read_byte(addr) +#endif + +#define macro .macro +#define endm .endm +#define nop2 rjmp .+0 /* jump to next instruction */ + +#endif /* development environment */ + +/* for conveniecne, ensure that PRG_RDB exists */ +#ifndef PRG_RDB +# define PRG_RDB(addr) USB_READ_FLASH(addr) +#endif +#endif /* __usbportability_h_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb b/adb2usb/uart2usb/vusb new file mode 120000 index 0000000..8bfa54c --- /dev/null +++ b/adb2usb/uart2usb/vusb @@ -0,0 +1 @@ +vusb-20100715 \ No newline at end of file diff --git a/adb2usb/uart2usb/vusb-20100715/Changelog.txt b/adb2usb/uart2usb/vusb-20100715/Changelog.txt new file mode 100644 index 0000000..5c6354a --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/Changelog.txt @@ -0,0 +1,308 @@ +This file documents changes in the firmware-only USB driver for atmel's AVR +microcontrollers. New entries are always appended to the end of the file. +Scroll down to the bottom to see the most recent changes. + +2005-04-01: + - Implemented endpoint 1 as interrupt-in endpoint. + - Moved all configuration options to usbconfig.h which is not part of the + driver. + - Changed interface for usbVendorSetup(). + - Fixed compatibility with ATMega8 device. + - Various minor optimizations. + +2005-04-11: + - Changed interface to application: Use usbFunctionSetup(), usbFunctionRead() + and usbFunctionWrite() now. Added configuration options to choose which + of these functions to compile in. + - Assembler module delivers receive data non-inverted now. + - Made register and bit names compatible with more AVR devices. + +2005-05-03: + - Allow address of usbRxBuf on any memory page as long as the buffer does + not cross 256 byte page boundaries. + - Better device compatibility: works with Mega88 now. + - Code optimization in debugging module. + - Documentation updates. + +2006-01-02: + - Added (free) default Vendor- and Product-IDs bought from voti.nl. + - Added USBID-License.txt file which defines the rules for using the free + shared VID/PID pair. + - Added Readme.txt to the usbdrv directory which clarifies administrative + issues. + +2006-01-25: + - Added "configured state" to become more standards compliant. + - Added "HALT" state for interrupt endpoint. + - Driver passes the "USB Command Verifier" test from usb.org now. + - Made "serial number" a configuration option. + - Minor optimizations, we now recommend compiler option "-Os" for best + results. + - Added a version number to usbdrv.h + +2006-02-03: + - New configuration variable USB_BUFFER_SECTION for the memory section where + the USB rx buffer will go. This defaults to ".bss" if not defined. Since + this buffer MUST NOT cross 256 byte pages (not even touch a page at the + end), the user may want to pass a linker option similar to + "-Wl,--section-start=.mybuffer=0x800060". + - Provide structure for usbRequest_t. + - New defines for USB constants. + - Prepared for HID implementations. + - Increased data size limit for interrupt transfers to 8 bytes. + - New macro usbInterruptIsReady() to query interrupt buffer state. + +2006-02-18: + - Ensure that the data token which is sent as an ack to an OUT transfer is + always zero sized. This fixes a bug where the host reports an error after + sending an out transfer to the device, although all data arrived at the + device. + - Updated docs in usbdrv.h to reflect changed API in usbFunctionWrite(). + +* Release 2006-02-20 + + - Give a compiler warning when compiling with debugging turned on. + - Added Oleg Semyonov's changes for IAR-cc compatibility. + - Added new (optional) functions usbDeviceConnect() and usbDeviceDisconnect() + (also thanks to Oleg!). + - Rearranged tests in usbPoll() to save a couple of instructions in the most + likely case that no actions are pending. + - We need a delay between the SET ADDRESS request until the new address + becomes active. This delay was handled in usbPoll() until now. Since the + spec says that the delay must not exceed 2ms, previous versions required + aggressive polling during the enumeration phase. We have now moved the + handling of the delay into the interrupt routine. + - We must not reply with NAK to a SETUP transaction. We can only achieve this + by making sure that the rx buffer is empty when SETUP tokens are expected. + We therefore don't pass zero sized data packets from the status phase of + a transfer to usbPoll(). This change MAY cause troubles if you rely on + receiving a less than 8 bytes long packet in usbFunctionWrite() to + identify the end of a transfer. usbFunctionWrite() will NEVER be called + with a zero length. + +* Release 2006-03-14 + + - Improved IAR C support: tiny memory model, more devices + - Added template usbconfig.h file under the name usbconfig-prototype.h + +* Release 2006-03-26 + + - Added provision for one more interrupt-in endpoint (endpoint 3). + - Added provision for one interrupt-out endpoint (endpoint 1). + - Added flowcontrol macros for USB. + - Added provision for custom configuration descriptor. + - Allow ANY two port bits for D+ and D-. + - Merged (optional) receive endpoint number into global usbRxToken variable. + - Use USB_CFG_IOPORTNAME instead of USB_CFG_IOPORT. We now construct the + variable name from the single port letter instead of computing the address + of related ports from the output-port address. + +* Release 2006-06-26 + + - Updated documentation in usbdrv.h and usbconfig-prototype.h to reflect the + new features. + - Removed "#warning" directives because IAR does not understand them. Use + unused static variables instead to generate a warning. + - Do not include when compiling with IAR. + - Introduced USB_CFG_DESCR_PROPS_* in usbconfig.h to configure how each + USB descriptor should be handled. It is now possible to provide descriptor + data in Flash, RAM or dynamically at runtime. + - STALL is now a status in usbTxLen* instead of a message. We can now conform + to the spec and leave the stall status pending until it is cleared. + - Made usbTxPacketCnt1 and usbTxPacketCnt3 public. This allows the + application code to reset data toggling on interrupt pipes. + +* Release 2006-07-18 + + - Added an #if !defined __ASSEMBLER__ to the warning in usbdrv.h. This fixes + an assembler error. + - usbDeviceDisconnect() takes pull-up resistor to high impedance now. + +* Release 2007-02-01 + + - Merged in some code size improvements from usbtiny (thanks to Dick + Streefland for these optimizations!) + - Special alignment requirement for usbRxBuf not required any more. Thanks + again to Dick Streefland for this hint! + - Reverted to "#warning" instead of unused static variables -- new versions + of IAR CC should handle this directive. + - Changed Open Source license to GNU GPL v2 in order to make linking against + other free libraries easier. We no longer require publication of the + circuit diagrams, but we STRONGLY encourage it. If you improve the driver + itself, PLEASE grant us a royalty free license to your changes for our + commercial license. + +* Release 2007-03-29 + + - New configuration option "USB_PUBLIC" in usbconfig.h. + - Set USB version number to 1.10 instead of 1.01. + - Code used USB_CFG_DESCR_PROPS_STRING_DEVICE and + USB_CFG_DESCR_PROPS_STRING_PRODUCT inconsistently. Changed all occurrences + to USB_CFG_DESCR_PROPS_STRING_PRODUCT. + - New assembler module for 16.5 MHz RC oscillator clock with PLL in receiver + code. + - New assembler module for 16 MHz crystal. + - usbdrvasm.S contains common code only, clock-specific parts have been moved + to usbdrvasm12.S, usbdrvasm16.S and usbdrvasm165.S respectively. + +* Release 2007-06-25 + + - 16 MHz module: Do SE0 check in stuffed bits as well. + +* Release 2007-07-07 + + - Define hi8(x) for IAR compiler to limit result to 8 bits. This is necessary + for negative values. + - Added 15 MHz module contributed by V. Bosch. + - Interrupt vector name can now be configured. This is useful if somebody + wants to use a different hardware interrupt than INT0. + +* Release 2007-08-07 + + - Moved handleIn3 routine in usbdrvasm16.S so that relative jump range is + not exceeded. + - More config options: USB_RX_USER_HOOK(), USB_INITIAL_DATATOKEN, + USB_COUNT_SOF + - USB_INTR_PENDING can now be a memory address, not just I/O + +* Release 2007-09-19 + + - Split out common parts of assembler modules into separate include file + - Made endpoint numbers configurable so that given interface definitions + can be matched. See USB_CFG_EP3_NUMBER in usbconfig-prototype.h. + - Store endpoint number for interrupt/bulk-out so that usbFunctionWriteOut() + can handle any number of endpoints. + - Define usbDeviceConnect() and usbDeviceDisconnect() even if no + USB_CFG_PULLUP_IOPORTNAME is defined. Directly set D+ and D- to 0 in this + case. + +* Release 2007-12-01 + + - Optimize usbDeviceConnect() and usbDeviceDisconnect() for less code size + when USB_CFG_PULLUP_IOPORTNAME is not defined. + +* Release 2007-12-13 + + - Renamed all include-only assembler modules from *.S to *.inc so that + people don't add them to their project sources. + - Distribute leap bits in tx loop more evenly for 16 MHz module. + - Use "macro" and "endm" instead of ".macro" and ".endm" for IAR + - Avoid compiler warnings for constant expr range by casting some values in + USB descriptors. + +* Release 2008-01-21 + + - Fixed bug in 15 and 16 MHz module where the new address set with + SET_ADDRESS was already accepted at the next NAK or ACK we send, not at + the next data packet we send. This caused problems when the host polled + too fast. Thanks to Alexander Neumann for his help and patience debugging + this issue! + +* Release 2008-02-05 + + - Fixed bug in 16.5 MHz module where a register was used in the interrupt + handler before it was pushed. This bug was introduced with version + 2007-09-19 when common parts were moved to a separate file. + - Optimized CRC routine (thanks to Reimar Doeffinger). + +* Release 2008-02-16 + + - Removed outdated IAR compatibility stuff (code sections). + - Added hook macros for USB_RESET_HOOK() and USB_SET_ADDRESS_HOOK(). + - Added optional routine usbMeasureFrameLength() for calibration of the + internal RC oscillator. + +* Release 2008-02-28 + + - USB_INITIAL_DATATOKEN defaults to USBPID_DATA1 now, which means that we + start with sending USBPID_DATA0. + - Changed defaults in usbconfig-prototype.h + - Added free USB VID/PID pair for MIDI class devices + - Restructured AVR-USB as separate package, not part of PowerSwitch any more. + +* Release 2008-04-18 + + - Restructured usbdrv.c so that it is easier to read and understand. + - Better code optimization with gcc 4. + - If a second interrupt in endpoint is enabled, also add it to config + descriptor. + - Added config option for long transfers (above 254 bytes), see + USB_CFG_LONG_TRANSFERS in usbconfig.h. + - Added 20 MHz module contributed by Jeroen Benschop. + +* Release 2008-05-13 + + - Fixed bug in libs-host/hiddata.c function usbhidGetReport(): length + was not incremented, pointer to length was incremented instead. + - Added code to command line tool(s) which claims an interface. This code + is disabled by default, but may be necessary on newer Linux kernels. + - Added usbconfig.h option "USB_CFG_CHECK_DATA_TOGGLING". + - New header "usbportability.h" prepares ports to other development + environments. + - Long transfers (above 254 bytes) did not work when usbFunctionRead() was + used to supply the data. Fixed this bug. [Thanks to Alexander Neumann!] + - In hiddata.c (example code for sending/receiving data over HID), use + USB_RECIP_DEVICE instead of USB_RECIP_INTERFACE for control transfers so + that we need not claim the interface. + - in usbPoll() loop 20 times polling for RESET state instead of 10 times. + This accounts for the higher clock rates we now support. + - Added a module for 12.8 MHz RC oscillator with PLL in receiver loop. + - Added hook to SOF code so that oscillator can be tuned to USB frame clock. + - Added timeout to waitForJ loop. Helps preventing unexpected hangs. + - Added example code for oscillator tuning to libs-device (thanks to + Henrik Haftmann for the idea to this routine). + - Implemented option USB_CFG_SUPPRESS_INTR_CODE. + +* Release 2008-10-22 + + - Fixed libs-device/osctune.h: OSCCAL is memory address on ATMega88 and + similar, not offset of 0x20 needs to be added. + - Allow distribution under GPLv3 for those who have to link against other + code distributed under GPLv3. + +* Release 2008-11-26 + + - Removed libusb-win32 dependency for hid-data example in Makefile.windows. + It was never required and confused many people. + - Added extern uchar usbRxToken to usbdrv.h. + - Integrated a module with CRC checks at 18 MHz by Lukas Schrittwieser. + +* Release 2009-03-23 + + - Hid-mouse example used settings from hid-data example, fixed that. + - Renamed project to V-USB due to a trademark issue with Atmel(r). + - Changed CommercialLicense.txt and USBID-License.txt to make the + background of USB ID registration clearer. + +* Release 2009-04-15 + + - Changed CommercialLicense.txt to reflect the new range of PIDs from + Jason Kotzin. + - Removed USBID-License.txt in favor of USB-IDs-for-free.txt and + USB-ID-FAQ.txt + - Fixed a bug in the 12.8 MHz module: End Of Packet decection was made in + the center between bit 0 and 1 of each byte. This is where the data lines + are expected to change and the sampled data may therefore be nonsense. + We therefore check EOP ONLY if bits 0 AND 1 have both been read as 0 on D-. + - Fixed a bitstuffing problem in the 16 MHz module: If bit 6 was stuffed, + the unstuffing code in the receiver routine was 1 cycle too long. If + multiple bytes had the unstuffing in bit 6, the error summed up until the + receiver was out of sync. + - Included option for faster CRC routine. + Thanks to Slawomir Fras (BoskiDialer) for this code! + - Updated bits in Configuration Descriptor's bmAttributes according to + USB 1.1 (in particular bit 7, it is a must-be-set bit now). + +* Release 2009-08-22 + + - Moved first DBG1() after odDebugInit() in all examples. + - Use vector INT0_vect instead of SIG_INTERRUPT0 if defined. This makes + V-USB compatible with the new "p" suffix devices (e.g. ATMega328p). + - USB_CFG_CLOCK_KHZ setting is now required in usbconfig.h (no default any + more). + - New option USB_CFG_DRIVER_FLASH_PAGE allows boot loaders on devices with + more than 64 kB flash. + - Built-in configuration descriptor allows custom definition for second + endpoint now. + +* Release 2010-07-15 diff --git a/adb2usb/uart2usb/vusb-20100715/CommercialLicense.txt b/adb2usb/uart2usb/vusb-20100715/CommercialLicense.txt new file mode 100644 index 0000000..11d07d9 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/CommercialLicense.txt @@ -0,0 +1,166 @@ +V-USB Driver Software License Agreement +Version 2009-08-03 + +THIS LICENSE AGREEMENT GRANTS YOU CERTAIN RIGHTS IN A SOFTWARE. YOU CAN +ENTER INTO THIS AGREEMENT AND ACQUIRE THE RIGHTS OUTLINED BELOW BY PAYING +THE AMOUNT ACCORDING TO SECTION 4 ("PAYMENT") TO OBJECTIVE DEVELOPMENT. + + +1 DEFINITIONS + +1.1 "OBJECTIVE DEVELOPMENT" shall mean OBJECTIVE DEVELOPMENT Software GmbH, +Grosse Schiffgasse 1A/7, 1020 Wien, AUSTRIA. + +1.2 "You" shall mean the Licensee. + +1.3 "V-USB" shall mean all files included in the package distributed under +the name "vusb" by OBJECTIVE DEVELOPMENT (http://www.obdev.at/vusb/) +unless otherwise noted. This includes the firmware-only USB device +implementation for Atmel AVR microcontrollers, some simple device examples +and host side software examples and libraries. + + +2 LICENSE GRANTS + +2.1 Source Code. OBJECTIVE DEVELOPMENT shall furnish you with the source +code of V-USB. + +2.2 Distribution and Use. OBJECTIVE DEVELOPMENT grants you the +non-exclusive right to use, copy and distribute V-USB with your hardware +product(s), restricted by the limitations in section 3 below. + +2.3 Modifications. OBJECTIVE DEVELOPMENT grants you the right to modify +the source code and your copy of V-USB according to your needs. + +2.4 USB IDs. OBJECTIVE DEVELOPMENT furnishes you with one or two USB +Product ID(s), sent to you in e-mail. These Product IDs are reserved +exclusively for you. OBJECTIVE DEVELOPMENT has obtained USB Product ID +ranges under the Vendor ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under the Vendor ID 8352 from +Jason Kotzin (Clay Logic, www.claylogic.com). Both owners of the Vendor IDs +have obtained these IDs from the USB Implementers Forum, Inc. +(www.usb.org). OBJECTIVE DEVELOPMENT disclaims all liability which might +arise from the assignment of USB IDs. + +2.5 USB Certification. Although not part of this agreement, we want to make +it clear that you cannot become USB certified when you use V-USB or a USB +Product ID assigned by OBJECTIVE DEVELOPMENT. AVR microcontrollers don't +meet the electrical specifications required by the USB specification and +the USB Implementers Forum certifies only members who bought a Vendor ID of +their own. + + +3 LICENSE RESTRICTIONS + +3.1 Number of Units. Only one of the following three definitions is +applicable. Which one is determined by the amount you pay to OBJECTIVE +DEVELOPMENT, see section 4 ("Payment") below. + +Hobby License: You may use V-USB according to section 2 above in no more +than 5 hardware units. These units must not be sold for profit. + +Entry Level License: You may use V-USB according to section 2 above in no +more than 150 hardware units. + +Professional License: You may use V-USB according to section 2 above in +any number of hardware units, except for large scale production ("unlimited +fair use"). Quantities below 10,000 units are not considered large scale +production. If your reach quantities which are obviously large scale +production, you must pay a license fee of 0.10 EUR per unit for all units +above 10,000. + +3.2 Rental. You may not rent, lease, or lend V-USB or otherwise encumber +any copy of V-USB, or any of the rights granted herein. + +3.3 Transfer. You may not transfer your rights under this Agreement to +another party without OBJECTIVE DEVELOPMENT's prior written consent. If +such consent is obtained, you may permanently transfer this License to +another party. The recipient of such transfer must agree to all terms and +conditions of this Agreement. + +3.4 Reservation of Rights. OBJECTIVE DEVELOPMENT retains all rights not +expressly granted. + +3.5 Non-Exclusive Rights. Your license rights under this Agreement are +non-exclusive. + +3.6 Third Party Rights. This Agreement cannot grant you rights controlled +by third parties. In particular, you are not allowed to use the USB logo or +other trademarks owned by the USB Implementers Forum, Inc. without their +consent. Since such consent depends on USB certification, it should be +noted that V-USB will not pass certification because it does not +implement checksum verification and the microcontroller ports do not meet +the electrical specifications. + + +4 PAYMENT + +The payment amount depends on the variation of this agreement (according to +section 3.1) into which you want to enter. Concrete prices are listed on +OBJECTIVE DEVELOPMENT's web site, usually at +http://www.obdev.at/vusb/license.html. You agree to pay the amount listed +there to OBJECTIVE DEVELOPMENT or OBJECTIVE DEVELOPMENT's payment processor +or reseller. + + +5 COPYRIGHT AND OWNERSHIP + +V-USB is protected by copyright laws and international copyright +treaties, as well as other intellectual property laws and treaties. V-USB +is licensed, not sold. + + +6 TERM AND TERMINATION + +6.1 Term. This Agreement shall continue indefinitely. However, OBJECTIVE +DEVELOPMENT may terminate this Agreement and revoke the granted license and +USB-IDs if you fail to comply with any of its terms and conditions. + +6.2 Survival of Terms. All provisions regarding secrecy, confidentiality +and limitation of liability shall survive termination of this agreement. + + +7 DISCLAIMER OF WARRANTY AND LIABILITY + +LIMITED WARRANTY. V-USB IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, OBJECTIVE +DEVELOPMENT AND ITS SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND +NON-INFRINGEMENT, WITH REGARD TO V-USB, AND THE PROVISION OF OR FAILURE +TO PROVIDE SUPPORT SERVICES. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL +RIGHTS. YOU MAY HAVE OTHERS, WHICH VARY FROM STATE/JURISDICTION TO +STATE/JURISDICTION. + +LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, +IN NO EVENT SHALL OBJECTIVE DEVELOPMENT OR ITS SUPPLIERS BE LIABLE FOR ANY +SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER +(INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, +BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY +LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE V-USB OR THE +PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, EVEN IF OBJECTIVE +DEVELOPMENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY +CASE, OBJECTIVE DEVELOPMENT'S ENTIRE LIABILITY UNDER ANY PROVISION OF THIS +AGREEMENT SHALL BE LIMITED TO THE AMOUNT ACTUALLY PAID BY YOU FOR V-USB. + + +8 MISCELLANEOUS TERMS + +8.1 Marketing. OBJECTIVE DEVELOPMENT has the right to mention for marketing +purposes that you entered into this agreement. + +8.2 Entire Agreement. This document represents the entire agreement between +OBJECTIVE DEVELOPMENT and you. It may only be modified in writing signed by +an authorized representative of both, OBJECTIVE DEVELOPMENT and you. + +8.3 Severability. In case a provision of these terms and conditions should +be or become partly or entirely invalid, ineffective, or not executable, +the validity of all other provisions shall not be affected. + +8.4 Applicable Law. This agreement is governed by the laws of the Republic +of Austria. + +8.5 Responsible Courts. The responsible courts in Vienna/Austria will have +exclusive jurisdiction regarding all disputes in connection with this +agreement. + diff --git a/adb2usb/uart2usb/vusb-20100715/License.txt b/adb2usb/uart2usb/vusb-20100715/License.txt new file mode 100644 index 0000000..4460cfb --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/License.txt @@ -0,0 +1,361 @@ +OBJECTIVE DEVELOPMENT GmbH's V-USB driver software is distributed under the +terms and conditions of the GNU GPL version 2 or the GNU GPL version 3. It is +your choice whether you apply the terms of version 2 or version 3. The full +text of GPLv2 is included below. In addition to the requirements in the GPL, +we STRONGLY ENCOURAGE you to do the following: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/adb2usb/uart2usb/vusb-20100715/Readme.txt b/adb2usb/uart2usb/vusb-20100715/Readme.txt new file mode 100644 index 0000000..84d27f9 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/Readme.txt @@ -0,0 +1,83 @@ +This is the Readme file for V-USB and related code. V-USB is Objective +Development's firmware-only USB driver for Atmel's(r) AVR(r) microcontrollers. +For more information please visit http://www.obdev.at/vusb/. + +To avoid name confusion: This project was formerly known as AVR-USB. Due to +a trademark issue, it was renamed to V-USB in April 2009. + + +WHAT IS INCLUDED IN THIS PACKAGE? +================================= +This package consists of the device side USB driver firmware, library code +for device and host and fully working examples for device and host: + + Readme.txt .............. The file you are currently reading. + usbdrv .................. V-USB firmware, to be included in your project. + examples ................ Example code for device and host side. + libs-device ............. Useful code snippets for the device firmware. + libs-host ............... Useful code snippets for host-side drivers. + circuits ................ Example circuits using this driver. + Changelog.txt ........... Documentation of changes between versions. + License.txt ............. Free Open Source license for this package (GPL). + CommercialLicense.txt ... Alternative commercial license for this package. + USB-ID-FAQ.txt .......... General infos about USB Product- and Vendor-IDs. + USB-IDs-for-free.txt .... List and terms of use for free shared PIDs. + +Each subdirectory contains a separate Readme file which explains its +contents. We recommend that you also read the Readme.txt file in the +usbdrv subdirectory. + + +PREREQUISITES +============= +The AVR code of V-USB is written in C and assembler. You need either +avr-gcc or IAR CC to compile the project. We recommend avr-gcc because it +is free and easily available. Gcc version 3 generates slightly more +efficient code than version 4 for V-USB. Not every release is tested with +the IAR compiler. Previous versions have been tested with IAR 4.10B/W32 and +4.12A/W32 on an ATmega8 with the "small" and "tiny" memory model. + +Ready made avr-gcc tool chains are available for most operating systems: + * Windows: WinAVR http://winavr.sourceforge.net/ + * Mac: CrossPack for AVR Development http://www.obdev.at/crosspack/ + * Linux and other Unixes: Most free Unixes have optional packages for AVR + development. If not, follow the instructions at + http://www.nongnu.org/avr-libc/user-manual/install_tools.html + +Our host side examples are compiled with gcc on all platforms. Gcc is the +default C compiler on Mac, Linux and many other Unixes. On windows, we +recommend MinGW (http://www.mingw.org/). Use the automated MinGW installer +for least troubles. You also need MSYS from the same site to work with +standard Makefiles. + +Most examples also depend on libusb. Libusb is available from +http://libusb.sourceforge.net/ for Unix and +http://libusb-win32.sourceforge.net/ for Windows. + + +TECHNICAL DOCUMENTATION +======================= +The API reference of the driver firmware can be found in usbdrv/usbdrv.h. +Documentation for host and device library files are in the respective header +files. For more information, see our documentation wiki at +http://www.obdev.at/goto.php?t=vusb-wiki. + +See the file usbdrv/Readme.txt for more info about the driver itself. + + +LICENSE +======= +V-USB and related code is distributed under the terms of the GNU General +Public License (GPL) version 2 (see License.txt for details) and the GNU +General Public License (GPL) version 3. It is your choice whether you apply +the terms of version 2 or version 3. In addition to the terms of the GPL, we +strongly encourage you to publish your entire project and mail OBJECTIVE +DEVELOPMENT a link to your publication. + +Alternatively, we offer a commercial license without the restrictions of the +GPL. See CommercialLicense.txt for details. + + +---------------------------------------------------------------------------- +(c) 2010 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/USB-ID-FAQ.txt b/adb2usb/uart2usb/vusb-20100715/USB-ID-FAQ.txt new file mode 100644 index 0000000..d1de8fb --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/USB-ID-FAQ.txt @@ -0,0 +1,149 @@ +Version 2009-08-22 + +========================== +WHY DO WE NEED THESE IDs? +========================== + +USB is more than a low level protocol for data transport. It also defines a +common set of requests which must be understood by all devices. And as part +of these common requests, the specification defines data structures, the +USB Descriptors, which are used to describe the properties of the device. + +From the perspective of an operating system, it is therefore possible to find +out basic properties of a device (such as e.g. the manufacturer and the name +of the device) without a device-specific driver. This is essential because +the operating system can choose a driver to load based on this information +(Plug-And-Play). + +Among the most important properties in the Device Descriptor are the USB +Vendor- and Product-ID. Both are 16 bit integers. The most simple form of +driver matching is based on these IDs. The driver announces the Vendor- and +Product-IDs of the devices it can handle and the operating system loads the +appropriate driver when the device is connected. + +It is obvious that this technique only works if the pair Vendor- plus +Product-ID is unique: Only devices which require the same driver can have the +same pair of IDs. + + +===================================================== +HOW DOES THE USB STANDARD ENSURE THAT IDs ARE UNIQUE? +===================================================== + +Since it is so important that USB IDs are unique, the USB Implementers Forum, +Inc. (usb.org) needs a way to enforce this legally. It is not forbidden by +law to build a device and assign it any random numbers as IDs. Usb.org +therefore needs an agreement to regulate the use of USB IDs. The agreement +binds only parties who agreed to it, of course. Everybody else is free to use +any numbers for their IDs. + +So how can usb.org ensure that every manufacturer of USB devices enters into +an agreement with them? They do it via trademark licensing. Usb.org has +registered the trademark "USB", all associated logos and related terms. If +you want to put an USB logo on your product or claim that it is USB +compliant, you must license these trademarks from usb.org. And this is where +you enter into an agreement. See the "USB-IF Trademark License Agreement and +Usage Guidelines for the USB-IF Logo" at +http://www.usb.org/developers/logo_license/. + +Licensing the USB trademarks requires that you buy a USB Vendor-ID from +usb.org (one-time fee of ca. 2,000 USD), that you become a member of usb.org +(yearly fee of ca. 4,000 USD) and that you meet all the technical +specifications from the USB spec. + +This means that most hobbyists and small companies will never be able to +become USB compliant, just because membership is so expensive. And you can't +be compliant with a driver based on V-USB anyway, because the AVR's port pins +don't meet the electrical specifications for USB. So, in principle, all +hobbyists and small companies are free to choose any random numbers for their +IDs. They have nothing to lose... + +There is one exception worth noting, though: If you use a sub-component which +implements USB, the vendor of the sub-components may guarantee USB +compliance. This might apply to some or all of FTDI's solutions. + + +======================================================================= +WHY SHOULD YOU OBTAIN USB IDs EVEN IF YOU DON'T LICENSE USB TRADEMARKS? +======================================================================= + +You have learned in the previous section that you are free to choose any +numbers for your IDs anyway. So why not do exactly this? There is still the +technical issue. If you choose IDs which are already in use by somebody else, +operating systems will load the wrong drivers and your device won't work. +Even if you choose IDs which are not currently in use, they may be in use in +the next version of the operating system or even after an automatic update. + +So what you need is a pair of Vendor- and Product-IDs for which you have the +guarantee that no USB compliant product uses them. This implies that no +operating system will ever ship with drivers responsible for these IDs. + + +============================================== +HOW DOES OBJECTIVE DEVELOPMENT HANDLE USB IDs? +============================================== + +Objective Development gives away pairs of USB-IDs with their V-USB licenses. +In order to ensure that these IDs are unique, Objective Development has an +agreement with the company/person who has bought the USB Vendor-ID from +usb.org. This agreement ensures that a range of USB Product-IDs is reserved +for assignment by Objective Development and that the owner of the Vendor-ID +won't give it to anybody else. + +This means that you have to trust three parties to ensure uniqueness of +your IDs: + + - Objective Development, that they don't give the same PID to more than + one person. + - The owner of the Vendor-ID that they don't assign PIDs from the range + assigned to Objective Development to anybody else. + - Usb.org that they don't assign the same Vendor-ID a second time. + + +================================== +WHO IS THE OWNER OF THE VENDOR-ID? +================================== + +Objective Development has obtained ranges of USB Product-IDs under two +Vendor-IDs: Under Vendor-ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under Vendor-ID 8352 from Jason +Kotzin (Clay Logic, www.claylogic.com). Both VID owners have received their +Vendor-ID directly from usb.org. + + +========================================================================= +CAN I USE USB-IDs FROM OBJECTIVE DEVELOPMENT WITH OTHER DRIVERS/HARDWARE? +========================================================================= + +The short answer is: Yes. All you get is a guarantee that the IDs are never +assigned to anybody else. What more do you need? + + +============================ +WHAT ABOUT SHARED ID PAIRS? +============================ + +Objective Development has reserved some PID/VID pairs for shared use. You +have no guarantee of uniqueness for them, except that no USB compliant device +uses them. In order to avoid technical problems, we must ensure that all +devices with the same pair of IDs use the same driver on kernel level. For +details, see the file USB-IDs-for-free.txt. + + +====================================================== +I HAVE HEARD THAT SUB-LICENSING OF USB-IDs IS ILLEGAL? +====================================================== + +A 16 bit integer number cannot be protected by copyright laws. It is not +sufficiently complex. And since none of the parties involved entered into the +USB-IF Trademark License Agreement, we are not bound by this agreement. So +there is no reason why it should be illegal to sub-license USB-IDs. + + +============================================= +WHO IS LIABLE IF THERE ARE INCOMPATIBILITIES? +============================================= + +Objective Development disclaims all liabilities which might arise from the +assignment of IDs. If you guarantee product features to your customers +without proper disclaimer, YOU are liable for that. diff --git a/adb2usb/uart2usb/vusb-20100715/USB-IDs-for-free.txt b/adb2usb/uart2usb/vusb-20100715/USB-IDs-for-free.txt new file mode 100644 index 0000000..2f4d59a --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/USB-IDs-for-free.txt @@ -0,0 +1,148 @@ +Version 2009-08-22 + +=========================== +FREE USB-IDs FOR SHARED USE +=========================== + +Objective Development has reserved a set of USB Product-IDs for use according +to the guidelines outlined below. For more information about the concept of +USB IDs please see the file USB-ID-FAQ.txt. Objective Development guarantees +that the IDs listed below are not used by any USB compliant devices. + + +==================== +MECHANISM OF SHARING +==================== + +From a technical point of view, two different devices can share the same USB +Vendor- and Product-ID if they require the same driver on operating system +level. We make use of this fact by assigning separate IDs for various device +classes. On application layer, devices must be distinguished by their textual +name or serial number. We offer separate sets of IDs for discrimination by +textual name and for serial number. + +Examples for shared use of USB IDs are included with V-USB in the "examples" +subdirectory. + + +====================================== +IDs FOR DISCRIMINATION BY TEXTUAL NAME +====================================== + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the manufacturer +and product identification. The manufacturer identification MUST be available +at least in USB language 0x0409 (English/US). + +(2) The textual manufacturer identification MUST contain either an Internet +domain name (e.g. "mycompany.com") registered and owned by you, or an e-mail +address under your control (e.g. "myname@gmx.net"). You can embed the domain +name or e-mail address in any string you like, e.g. "Objective Development +http://www.obdev.at/vusb/". + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(4) You may choose any string for the textual product identification, as long +as this string is unique within the scope of your textual manufacturer +identification. + +(5) Application side device look-up MUST be based on the textual manufacturer +and product identification in addition to VID/PID matching. The driver +matching MUST be a comparison of the entire strings, NOT a sub-string match. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by textual name: + +PID dec (hex) | VID dec (hex) | Description of use +==============+===============+============================================ +1500 (0x05dc) | 5824 (0x16c0) | For Vendor Class devices with libusb +--------------+---------------+-------------------------------------------- +1503 (0x05df) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +--------------+---------------+-------------------------------------------- +1505 (0x05e1) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +--------------+---------------+-------------------------------------------- +1508 (0x05e4) | 5824 (0x16c0) | For MIDI class devices +--------------+---------------+-------------------------------------------- + +Note that Windows caches the textual product- and vendor-description for +mice, keyboards and joysticks. Name-bsed discrimination is therefore not +recommended for these device classes. + + +======================================= +IDs FOR DISCRIMINATION BY SERIAL NUMBER +======================================= + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the serial +number. The serial number string MUST be available at least in USB language +0x0409 (English/US). + +(2) The serial number MUST start with either an Internet domain name (e.g. +"mycompany.com") registered and owned by you, or an e-mail address under your +control (e.g. "myname@gmx.net"), both terminated with a colon (":") character. +You MAY append any string you like for further discrimination of your devices. + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(5) Application side device look-up MUST be based on the serial number string +in addition to VID/PID matching. The matching must start at the first +character of the serial number string and include the colon character +terminating your domain or e-mail address. It MAY stop anywhere after that. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by serial number string: + +PID dec (hex) | VID dec (hex) | Description of use +===============+===============+=========================================== +10200 (0x27d8) | 5824 (0x16c0) | For Vendor Class devices with libusb +---------------+---------------+------------------------------------------- +10201 (0x27d9) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +---------------+---------------+------------------------------------------- +10202 (0x27da) | 5824 (0x16c0) | For USB Mice +---------------+---------------+------------------------------------------- +10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards +---------------+---------------+------------------------------------------- +10204 (0x27db) | 5824 (0x16c0) | For USB Joysticks +---------------+---------------+------------------------------------------- +10205 (0x27dc) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +---------------+---------------+------------------------------------------- +10206 (0x27dd) | 5824 (0x16c0) | For MIDI class devices +---------------+---------------+------------------------------------------- + + +================= +ORIGIN OF USB-IDs +================= + +OBJECTIVE DEVELOPMENT Software GmbH has obtained all VID/PID pairs listed +here from Wouter van Ooijen (see www.voti.nl) for exclusive disposition. +Wouter van Ooijen has obtained the VID from the USB Implementers Forum, Inc. +(see www.usb.org). The VID is registered for the company name "Van Ooijen +Technische Informatica". + + +========== +DISCLAIMER +========== + +OBJECTIVE DEVELOPMENT Software GmbH disclaims all liability for any +problems which are caused by the shared use of these VID/PID pairs. diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/Readme.txt b/adb2usb/uart2usb/vusb-20100715/circuits/Readme.txt new file mode 100644 index 0000000..1aa5218 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/circuits/Readme.txt @@ -0,0 +1,79 @@ +This is the Readme file for the V-USB example circuits directory. + + +CIRCUITS IN THIS DIRECTORY +========================== +Since USB requires 3.3 V levels on D+ and D- but delivers a power supply of +ca. 5 V, some kind of level conversion must be performed. There are several +ways to implement this level conversion, see the example circuits below. + +with-vreg.png and with-vreg.sch (EAGLE schematics): + This circuit uses a low drop voltage regulator to reduce the USB supply to + 3.3 V. You MUST use a low drop regulator because standard regulators such + as the LM317 require at least ca. 2 V drop. The advantage of this approach + is that it comes closest to the voltage levels required by the USB + specification and that the circuit is powered from a regulated supply. If + no USB cable is used (connector directly soldered on PCB), you can even + omit the 68 Ohm series resistors. The disadvantage is that you may want to + use other chips in your design which require 5 V. Please check that the AVR + used in your design allows the chosen clock rate at 3.3 V. + +with-zener.png and with-zener.sch (EAGLE schematics): + This circuit enforces lower voltage levels on D+ and D- with zener diodes. + The zener diodes MUST be low power / low current types to ensure that the + 1k5 pull-up resistor on D- generates a voltage of well above 2.5 V (but + below 3.6 V). The advantage of this circuit is its simplicity and that the + circuit can be powered at 5 V (usually precise enough if the cable drop is + neglected). The disadvantage is that some zener diodes have a lower voltage + than 3 V when powered through 1k5 and the choice of components becomes + relevant. In addition to that, the power consumption during USB data + transfer is increased because the current is only limited by the 68 Ohm + series resistor. The zeners may even distort the signal waveforms due to + their capacity. + +with-series-diodes.png and with-series-diodes.sch (EAGLE schematics): + This is a simplified low-cost version of the voltage regulator approach. + Instead of using a voltage regulator, we reduce the voltage by the forward + voltage of two silicon diodes (roughly 1.4 V). This gives ca. 3.6 V which + is practically inside the allowed range. The big disadvantage is that the + supply is not regulated -- it even depends strongly on the power + consumption. This cannot be tolerated for analog circuits. + +tiny45-rc.png and tiny45-rc.sch (EAGLE schematics): + This is mostly an example for connecting an 8 pin device using the internal + RC oscillator for system clock. This example uses series diodes to limit + the supply, but you may choose any other method. Please note that you must + choose a clock rate of 12.8 or 16.5 MHz because only the receiver modules + for these frequencies have a PLL to allow higher clock rate tolerances. + + +GENERAL DESIGN NOTES +==================== +All examples have D+ on hardware interrupt INT0 because this is the highest +priority interrupt on AVRs. You may use other hardware interrupts (and +configure the options at the end of usbconfig.h accordingly) if you make sure +that no higher priority interrupt is used. + +If you use USB_SOF_HOOK or USB_COUNT_SOF in usbconfig.h, you must wire D- to +the interrupt instead. This way the interrupt is triggered on USB Start Of +Frame pulses as well. + +Most examples have a 1M pull-down resistor at D+. This pull-up ensures that +in self-powered designs no interrupts occur while USB is not connected. You +may omit this resistor in bus-powered designs. Older examples had a pull-up +resistor instead. This is not compatible with the zener diode approach to +level conversion: 1M pull-up in conjunction with a 3.6 V zener diode give an +invalid logic level. + +All examples with ATMega8/88/168 have D+ at port D bit 2 (because this is +hardware interrupt 0) and D- on port D bit 4 because it is also a clock input +for timer/counter 0. This way the firmware can easily check for activity on +D- (USB frame pulses) by checking the counter value in regular intervals. If +no activity is found, the firmware should (according to the USB +specification) put the system into a low power suspend mode. + + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/tiny45-rc.png b/adb2usb/uart2usb/vusb-20100715/circuits/tiny45-rc.png new file mode 100644 index 0000000000000000000000000000000000000000..ac97657a44f782a0e56088fb00e307fce6083860 GIT binary patch literal 7582 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 Qj#n8TYCqDd)Ub>BKYbiLV*mgE literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/tiny45-rc.sch b/adb2usb/uart2usb/vusb-20100715/circuits/tiny45-rc.sch new file mode 100644 index 0000000000000000000000000000000000000000..349f1ad60c47e121ae2c0032259d379e03fbf397 GIT binary patch literal 193502 zcmeF43*27QmH*G11g%Rhcu8C$u5n3tlP8IL5J{>LM8sW#G?Z3D2}NB}v{hBb7*%6b zRZ&${qo`3es;yB~RaK)#wN+JB%^2-y8t?h9@80M4oOSkj-cw2OuQt!;^JZoJp0(HB zd+oK?UVER*GkC$6Z0I^!Hem386|?tc?az?xDc-6kA1)W*W`x`>FQU&*^I;Io)G?T_^PXx_q1KV^5ra#9Z{O zzIxXn;ggSk{}J;}IQrOmhIg;gwSw^ZGmbg@-A5Q_?OCI{#OIXwz%_@KdgkwS{L$|@ zdfo}h4_&jw=al%sVQZCo=I?p<`;VZdCcoCO5}#Az1J_=s#OLpK_%SC^z~t9iyTs>| z_`r3C_b=PO&-`dnlOMkB@@;%hi4R#kRklAtrDM8;)4!8xSU6O9x-3@XwV^txcPYE2`3bO+y7nfD&=S3 z`%(X(*|W=ez0WD{pK~k*S}hxN=%Ho3a&z#*4l8lFv*BHf7L|6Je8dUwKK|(AutV3M z|Gbg~ocP&ikI6Q%=grMlUyx;|ubpM)l39B+?f>2Ox19Y^Vn_RX_p$Rv&pG1w_pE9E z#~UOod}~AcWnJeSVBckDc5T*kE&p7ZO)y-td}W`JBki9ZvLUOkwtC7{wwkv z(DY^R*l0}neyIJslKn}S>RmTmF?+f9o4pIV?g(E^8x!S6WjhBw$9)GIMhr#5w|O`C zSfKC`4zpU;ilF@~oHnhNjcel@WZ7((>oF!tSNlF1FTza8u^ zwa@Tu`|Q`f^Ln@M+NCRu%l(YYJ=x}F-A8+}Z1L?`c7ZK6_6bG;AN7MgcX%+8@F$OM z%LgM#kHdqJHZ_HhuO7$og;7C&_y>H`-$vf!X1DHhhvoS_Ph=VNoD+Iw&w#_9{A`wa zTs)L=h5ft5OJ8B`Z%}`)r=i|3jWb z&#^VVH|se~_}qsg&iBGM|CHJDZCM6=;pYKA9r+_aV(qr_P|BHnz)kLMlmF%|S7*7= zuHJ0$hYR`NnEVB6d_K!(uT{Y}v+`S*d^Yt*`Rb-8$gj9dmfif@Jcq`1jtK3XYa_Sc zqCAJvuHG!-W8WM51C8woe%meninFS?cxdczlot<;^_Doi>ghFW(=W+k&)A-bi~% z#Y4BrOL_5>^SF4Zx2Jf@d0afykC%AaL+zYp0T(%_w}be*H>~2~p}t?@r*2)97k}}r zDlT4rt@faY{y_0-;c92;|Itq*U;2NEYhHLg%v=18`Q`mwcsZ}5o&_dHd!RN?ZGJ^u z<%@Y5+G%mSd(`{#e8$arzHkNN4{`X>u+DDLFUy7-vb`;G$G`g+`(Ku^&Teja|G+HF<&dvl!#q%>qPucg-PV4N~}9vfQ! zG5uqDn&jW^rNiiq8P+7fVpV?T*q&znkpAdyM7Kzh#sD!HNFX*fBP~efx9b=;&|s&%{w?w#JTalwYmd9`x_f)Se{0 zojJazSwA_q`=EcV)mT$bYIyezUs#rA_ji*X6HllHZ~(e{GYz+jdcs_J6ra zp1rsGApf-{`7NEW{TKOfG|6vOm;ZK?ylqeY2mRk~k}r4pp&0T%Zj!fck^dn7-%ax6 zsX$x*ubSk`(}K4A@0#St`_@Ez{-H^JLS6pVCV5N0{m1${cDW|`ZM<}7&)8L(^!KPH`N?(pKI6ZSJ^tK}{m$}TUFU?lsqrlSIW_Ee zrquP{)YP7-b@|5l_Kv#zT}}FTtIL0@N&cO6`3IWhr`6>jX_DW)F8@T6{Peo~FPh}{ zsLIcpHFom2rv2BRRe1*T`6l_js`BU`-y}byE^qU<@BQH3Re9R;KTYys&s~;5{*@;A zeM(vWNBg&KlDA_J|3QD=B)_kh4)Le8e3Sfsb$N^DecNaMs{E{36DBv>^MIx z?M>~UUzMLSb~N+1Z~r{8CeQrsTmGb~JmdAvruKZWF8{qI`IGDNk2T4kQkVaEQ~OV? z%m1cH|A*@Ge`u0FttQ`W|I_R8D>Ugpqb|Q%ll+-=`SqIQ7u4mqXp;YMUEcDOzSpm_ z>hg`}lV{iE_iECAPF?=sCi#!lhg`}OXt?*KhdQB<8}E@H_4w@ zm7g+x^q9u;!%x)YoAZJ5Yx2$cz$a_+6B_e}3##%Kf5v^bslT79%Qv2PU09dDrAhxq zb@{uSey4Bw%WCrD zyPD)bQo%g<<%zq&4O`EB3+@cFv@+$Q;J>hi}m$$z0Pe_E6LwRQP(o8+&n%U{wYe|=s4 zswVj_*5z+(lE0xYe@B!2m+JEOHOb#tmw&iP{>ydwC!6GNs>?suB>$DV{L4-9H`nBw z*Q2l281h-(Ht*j1PCz|Y--P)b@>l8$^Uy@zA--BRhMtPKKPBg{KZY}xw|g^uTApbtjdSu{igN(o~nE} z-fxoskE(n)VsDbaw<;fw_nYLuRh19N^-c2kRprBReUtpRtMcKvzDfQ&Re8%lCtTko z|J}O$SNf74?PUAeomIMTnd=vq+WlI=xYT(2u6Dmx7Or31@5Cut4aTV)#dH_d*AJOqAuTfednijdApw8xBe$<@>{>XN&dg< z@{QL=o~p~Q-=zO%b$P}sTeXS@j{6~>uHt6@t?m50Z~33s`F5Y}`DI=H zc$4qc{188%smq_yB>$_r{CQ3C&(`HHZIb_WUB2=B`MJ8hUBB+TzrU%=-`OPpd|m!K zP4d63%Rka2|3Y2DMH`ur5EaN&bK8@@qB8zf_ms zyh;9l>+%ztFMp`Z@7W~($GW`j_xslWe|34w=lhm_r7qt%-~UvXZ=COo z>hg{A{m*sz#`(UuF5fucU#-hG&iCHBeB*r2>++5B-If6VvG~7D<9sh4XAH%VZ=CP_ z>iQe!d;hw8<9r`bli#*+zAsmoZ=CPT*X0}M`wDgWO`81wZFTvvP4aKA%TH{QFCWj< zcx^kaNxppiw=KVSll;o{_8ib8ze-*H&?fnTb@|44GN>;9{wDo{>+$Nug8<4_xlb?vWz7?ScipmnpiWf%6oCqJ(1vhWR00r8&=>`^414W0Vm z_N>^u?KwfCdM*|IP7~mJDEKHV!}FwkF6|l{|6~91Tq@5iowprjMi|n5Uh**T0cWBk z;Cfziw(3(os#onv>*d*4Q=F~QH3kwsJkNVweqryIyP|jPI%BWtd_g<;P-efZw3cw{ zd@S1{3faH3|62R<30n<|c82F_vCql(Mf;q)ebqkVp?uVS_I`jPi~O#U$1^WN!IyKQ3aIqREwj&07^Im`GzWf|X_%?@|T4#oIZ`s?f_JlH20 zN80g=fmJ)u9`NILOWV^k`zm`zjlaY8ihZU%n`9B6@p!~HeId4!{_?#(;EVc2KLn#+ zQ1pQhv;S{rPOZ72=iP>9t7IR@KanrWP7HUpZ2R%>_!=YHb;Yw$$BnC8GQ^4pX91s! zGW!&Ga9(RqYu+F2IpViv*~M?S=YowE?PT!%BTxEHoI24!8hc8(Me z-Qaia=NSVIPdSf^mp=5E|7pSi=P6RO+(Df<+7un+d%;TQHi@JQ@`m5I0G>e}G9 zUR(7a>_&{a{h2(UyjhmLXKgEDAMja^B9BvyX-OzTJ@UcyX}j`CG?v-+8^Q zH?;qSamP>Q-yi*?z=NMKAIEQO>(0}8KK%(>cZ_O2g5R@VmVraTnb*tRo#)@SSo}T1 zw>JfRz>x?4^Dg$Rc!4ut=KW`$lUt))}bmhCKH9 zfqlP$vm0w2_zFAQx>Vpsf}VS9JkSG0594_Jx8pc&y5Vtan(5o~{Q}E{`4o72zN`PT zpXRT4+0WzHQT7uqUi$u$J;&rnZ=L|! z#@p)=?{*;fO#KJ^*-zH|r-l8m+$zg%viJw}_W$*R(f%g|?a^=Vuvr4WocXPAGkMT6 z=ixj@4-`Fy2mgF=Tl2xgvJ5Kwh=;CfYqrPXv75)mL#4;&(T4cve_0>!&ymbv`_%mN z=wQ#bf08Sw_QBttytrnc;8(AMeS)4h+dftQ-xTY#{ipQ*fQJ#5J-=!52Yc>f^O4W+ zY+$yk`R9xB&x^wA4T66TzCrV=>Yoe44wm^9aLupQ>SpJwd+ePnJ7*bG{&wG$d481n z)&JS|FSJ6nAx`4U;9ou5$`m;MHt?Q2pZx>#Y4bxUdWfIo6rKDZyo3Lb-0$S*PdC`o zAiu(I#Y4Rxil>~%#YB4*{!=TyOFDQnit@2w%zdCJHHV9YVgRa-%dR!`bL2Vzhb`oe15whhSy^R z|6KZfeuPz2=Bt0N`TUxT^ZcUc^87dbv+P(_Nc&(O@piGjZ|l@=<@r|Ecz)v|n%Y<9} zX`zR`HF}_0-yfQ5xa}#&{)^#8wT_F2o@aYYkHb^WO^-TvSU&#l^@dS54d20gUT z+mrEq`U1th0d_)Aj_-&Mgsz(n0@9im(${2v?CJMY+wX0! z+Zi(<`12C(UqarP=Kt8C%zLZxzs!3pc}t7@Z3*@Zq26@AVB`D$bwBl!Vn4P0(ZQa< zKRKuFw4VZBwx5dmf2aK^`>7|3e0BSa!t0=xYCnZPcgiQhJLE-w7yBvVE&0FVE%TlI zzRpj!|6;Ib@K5Z}DR1ndqtiJ3&JgernI}8c0uM7DA zc~qzT7JONL`^MzAJ8Ty0AL27>RHytFd|7_m+5W6|2jr*czs=4L`-L6$4zEiL{yf9h z#!lC>z|;LN`J}G*=z5Xjo30z_x{z@3Dkog!Rj$BW_uH8~*9EtEhP_IA9~5w|v4QLQ zAbIsOb{&G9#N1(I-R1sb9lIXEr@+Jhg8kr3JHJB5gkRZx4OSN)@CVk4b>3v>S`H7_ zTRBhQ`innL*vZbdeqNkw?QmRpon){l=h9c$E;c=n1?PT)0&ib`*ZD8!#{Rqx{ z@6YYUtDO8<FeH)&$i>ktYh&= zyIvgewm-8b&#`>igLa*+#QQuS!)CPa9J~JP+Sv_G`-lf> zXWZYp`20e6U2d@dviSVh$LAea3a=9m_FNX9o8vS0z7e0f_f7X3EO~sc#*-a453grl z7Ej8!@dn3}q1iCYpMPEC&pW=eXKc^7t;X~FGP;M9`{3*o;vqQq{PHRA5D&SYd*xSS z{5o(o8ed+IyZ**JzwHZoUf{|PThhb*u6$mw`$WxuTB?_OA|2j+{+%&z<~)^qOBVGT zdY{w4-zuG$dp3(c_xTb#f=p|8S>R0#! zIb!Np3+~DDO@3GRE9qJ5_^3~Q#r^Xj?5Cjx-i?0j&z_L|qS-C@6*zVVXV18(--uK3 zpXmo?89e?Q^UM(+5>9#WA}__Sf_~&wkH$syUHY|lz2SNp_GP?MTF-|@-G~n%iNzXl3hUR3?+4ThLMoabXe0Xecfp>EjNIw}LVvhAU%olL{ z2b>tB`NFuuFMpciRh%#2lm{>D7Uqles2=&7>cbz3dV@c+SH=%hTTDS=EctR3qx{(9- zaR$HL$Ncuoh2Kux%KUcX$l$m9HY4(>-|9CZ(|EX~ek(n%6c66YZ&mNxdSm?szAPTv zddK)G?xk@|_!|=s7xobk7j}$?`{8Epp&h zzkPeiPlm{E55;fyU#k3MK(DS}RM+u}ChJO|w8GsG{mZ~ptNl`*r2I(xV(@A{7Wc)`I#zOkQ>Ux5>A zz&Y#Cc?JO$nTY%fobuo?E=9kR9@QhiQhnGp)*IV1;LMnRrnuSx9@|sOb8l0M zFJ55JC|e$j{k?wSsz>bsM-TE|zi{OFUh?X1s$cd=^t5EJ(mwHA<(S>0Utu5l34Wz< zzugLls#oX!#{-I%KpxtVP7dd|KR@CEqgipg#9Bt{&Um=rT>uUUpBt(hr{hx z;W>v{r^s`5n%ZN(^0;*8FytSsvFW-Ge$yB0>!9)y&QwbO&sxaSe%>3P`LeOKUwIL8 z-OcwFXTp@%_mm+%gQI7y|1IYoc7O+`9;d&ZUy)Z7=YEzK4b48>drE$0*XKe!-|1xL z-Eoz9_vDb!{BSzOxv1t#fw%J_<_S4;YM-^{cRtUNo|!)m`olXYh#Q)BH*FsKO`gYm zVSb)v*BGH^?A*>9yNNHH={h{jBie&J>jr1SnvclCOP}T=^5{h#eHJIfd6D!pUkg06 z=Yh|}GsP5_e(+dtY(MgxeWv(?BjY+q-0=E^s~*K|aP%PW^$S-$l2^ZE58>)(TCeQo z_2XC9Zkgxg=IBxG4UQeb5Bgzzj|iiQU+ran^;P-Rm+-642fxz(H1#X(Xa7pSTIMJH zqQA)>{5Ud?gufAf!u-|vY91H!x25^6aR&GP)9=;Nf53bD)%}fqT({k))LT5)u+yVG zhJvT#C|PYq3o~eX$(u1cV2;clvn1_~)r98N{y@P3189%{^SK#cA6^F+?lV$KD zUW{>3aTuKP;OMh>72>({s2;^J)%Vef?RrCeK5f?+Pg7j&0FUj7^96b0X^Nk7R~*+< z|0A|b^$J%#9!C%IUO)2Ssz>tbZ>nGRN%hEH&OTut!H-yIKG)km%LuqVsFs6cw<1># z=OIJv{>cGdpNM|dWAmuEJ|%xm{YvK!sb3NM+=Zv#(QR~aYOpAzo|SACJrC-U~jnhYLnkbDt}n@Prdm@ z@3+{P;K*~$3>@m^xo<7SU$hq#qUQ;FksbGVNnW_>@i=;r_xh0sM;J@GJ{x4e2{KCNHjxBrCSej@noIlFZB+tcpu?6=h0$!}R_JH`La=SBUh z$M;v`D7*b5`m@H#jcK?w$!_wyx$;X*^WiPU9i_+Y7g@$HQnT&{MgDnqspip$6MFM`->vtz zuX&{Lz3B^;@oi~d%{-{OE});YQRr=-FXMKk4NgDUSS6d)R%y zCJ*)Uv-Yp!2UvVV5An_G7p{7w2OK@fd;P+Z=X=Tbo*wn4`oSrm>UsM7t_(XsWe4K_ z^moPig?%*c#2?vB{Z?F+9c4djPl(T|SM@0WR6AY0C*yDM_}ilwm-82V)cfo0p`DVy z_3Bcd{R{K%?Zv#?W!Maxc&+{XeT=Vl-f>;5)BXjVYa3}kuX(kkdDnEie~LfGk^U;b zdTsM=ohxc2YE?M<|| zy?T_b7r%~vdm4Uw!cwglm)y~t-+E2mZyDcCdDpn3JLg?j{#$RjMg-;BjO?($_9I-o z+wND93dg^nJFku-Kk9vXjy%-M4?VGtGk?(Yowd3$>XE!~)#GvWAn)}f4~{%k@(Xs1 zdQ<)2luz}{nckIgtqkhy(9$~l;H8!M-Yt8{PF8Q2*RrSVp?R(LIQ?P%sy(Wo`EK`< zw>Tf+p2ZMv2lQ++#&RLzByvsb1@+7ShueFtKi7MdJs)~m^tbC~peU>hoVOCE(se=k zQksvk_u;$rTnn7sD_s|`G5S@H;-vKR9UpM=G0EWz@(22h9{MX;DEXM=(Z?U-Zg%Tl z=jGmT-u-yE4?o&%cs4jY-S+8c7td|&@&xnlk#L^FxeV7uIG>(BCFlv`$aytW58rFtrC0jopQ=~ogiC*^C&p*BqpUXzaYN^!={V|K)Q_XZ z!}fWpu8(M3q(|3BzwZSjJ-eK-&7WFOkW8S#}{c4_X#dHuuQ z9Grd?V;1UVKTmyXFW<4QssCkv z?BLPE_nKeQ%K-{Vw%?aL%o~|8sx-Vfoqi{P^k7 zpHIY}j|k6S^WG1}@xHf*H^>LOZDG&3ho^^2Ty|?Mw7#Bf{xI0u1bwA{^h5Db-VE(= zc*=QPy!0VYzpx?i_I+sR2&=t(UI~1waNYST@Nk`ie$Dp%x|e?468fd*^zT@y+Alq) zU*LbU{hDNc{`11mcMb99)zGh_z8%NwszKHF4_s#NYvWVkp_?*&)NM3 zlWdJNs&Nz#>(?Un>m~a2i_ov*E-!MQEvx;y@QB#2rz76(7j5s< zFYq_NUn^#3_fE48+!n@b^5~vz$BvEXfy&>CwXVI65U=?Zc)MS$ji>EWkHg?EoL7y* z%rEIl&m~l^@>A9;3xn#Cf4vLDy^Cph^T z*LPB!>rh;O0r%H&kY^oCaq>X)u){J@{CVm=a65?KGa+24|$;Mpz%~5CA+B~+J`b1 z&b_OcUjxi<&4-3(D`X$cKWOXb$K$-d(BjqPGc8`tjmfdetg~^*0E##~cQC%kr@-6u zdP(w-O{0qNuYQLI#^!HJU$Hjw$H(w-@qZB$KHPo}l=uAnqHgvwH#M=iIXf4)ypSZSVW&)AoB^Mn|pJUcb7tcuPE# za>aVrEnfPx4(iu)_{gY)S(M5L8f$TsVi3?EXJ>$aoDxVxY@|DeP2;1YU{IkF{zTv&-=uPwoT=ha#FJ}?d z3st@N3GY`&4(i)^p}k*-&!}QXNzY(wGrwT~eP-oyyucQk{_1-;hh%TdkIrAoJ{`wv z;jXjnXTZlYUgRL0ho<8NzUb`wc=5g)?9BUZy#3*^JKsC|j})(RcH0W`Vx-EeT!FXF zJwA>V6kDjjE1sNXGat)y=uMlo=TY|==i5E?CYQ(uoH3C;>G|Ww@*F)-r>BJ;4C~_ z8_kQ)OGBNW7J87AK8+V!eLnY(eVUPI&)>}KQpwKEc< zGgfaNFZxA)o;N@2)Gu(~PRXmkYna~^^|tMRyzt@K8sYrsJo&>8w!TjpXXlMw?))eG z>PF}<=R)QAPryTe@gMHdi~hsvU9P9(DrZ@Y_U9+Glh`ob&Vcw1s(f$K?3iam(J34` z&U7dT70z1CxoxV4ILJN%$~yrifBbjt*^%+)J712pz{C5x87I#2pu)vN4|}*>Z@7OR zp7$JhTs-uutx7%O(c^LPsz>#5O^FZdJ0EbH*Wvzuaw+b?*H~ar*#~>X^Xd=}yJepg zm;GgL(;xCi*|)Sm_YtiTo`1Zp>*g3Y&c{#A34TI6r+q~Z+x8Rf%L=^hC#==%7t(V! zuF=y6!)>(Uc@+Ixyujwa`2yvjg?+l8`c%Ar2aVTHV}FsOuatvIeuLv;u9WIoLO%)b z$)Uf=cy)`1I)4aw2R{k##}MxPA>i=n@wj-^qkhRxm;-#k%}=^{exsA0$UfKudrOb( zlj5?!>}~SFPh{WH{?Siv>3x5`XV=f8pFD-1JQn;!`|;vF>b9S7|39AsZ~Fo8xiOB+ zn^uV@-RPuWdLCE$#Y4THi0A$bkBf(Te-KYOkBf&=zv`8ra4lANlb^^w*aLe@kL;7; zvcK$Y^1)AJ-_ri_lee3nObPc>O&w=`GIi8a`3Zi-HPlXi67!a@9%*0DO?zky<)G>p z|JQe1(-DpwedRl-aQ=_)rh5L-{6zM_9{fMGPm0UNvbV{%{RCO?Xn*`<)sUaOr+EHu z>e;hqjh#$>;`5N;&LM78^Ok^zI75EIwN2K{)K9?4Gm?1HVlRaT&K;pezgpsM;_|h-+kRT^6VnB)`62UXg_-n`opZh;Kx3i2i)iy_PjHAOY+6{YYC^kFL)K&38sG2N_QSV)oWT$AW9WRFXBrp$ zm3c~z2?f`7#IAO{p4G7TxRqc|CwLd zhxrB7xG=9c?||xh7V&xOa34s&e%#;wjt_=$S*rNVy>&|xpSfm1JWAs;WAyyT;xj@% zUUAI_9O`lAB7Vpo5vu-5PTwnTOOAS?o;N3MtNrSqwet+(IqNiSBCm(4{o1T-*_Im9iLr3fNyuo2Q=O>PiV*CZraQ}_fYRw?0xVj z;)?ex?mFdJe0U4dGYA+xOmkgdF=&QYt`u5r@NjC^JTYV!nllKzqX{~!hHqg^Xa&7K1QzK z=L_RP%wbOVH7>h7Vb>?^Pj+~#j|;xRcrb7LxUh~g9#F<7j?22?edE8*?hEVYZns#n zw%ZLMj+Nt5-A9-6rMi#ie6Q2GNleA>!?+BH=kSaR<4F4=-i}w{{-^uXR&$)E)JNbu(Poz}J&~ba!9-Xvz|2um^F559?9vYkAFt?+kCT zHu2$mJ_R23*VN1SIK0LFAKv4em>%p*y{wzQUiyQ5%6^sk68TA|eCdJD#CZyppHm;X z1?wPGxOgbnZafapy6SQ9P(6QveZ-^3t5pHg}J>{yuyumWusl z++_!->9KwKYT>$)_Jg}EB+kVBVCm06#c2L*ivP5Mu}|X+c)8A&{!IHj?8m#0x**RE zwsSPfnUColthLDpvh1Btglk6!Tim!Vdp7HUxcqns0^5W6saq+50@;X=4JOF1M>FZn(e`Uk3r$ zazAAJ-Ho`feCOyez9G*q$M?0xE7l6)U=f$v?+M||p;MmEzLGwr@k;wH?E}<)?aQDs z{zSjkzEQcRmq$+DD~?I7)W76$jQObcsJ&M28N`{twfM%qfU(4{pt6s6sJEwh{M6&( zq5eEjJmowt9_s7GpW#`1gexv_4#~d2pF@)OFxR2}x*_W^`6TfkO21-WbbS7)u8Tun z^v?I<&s!(!uTAPK`-|}koy6rdUWGkZxIb!BQxoHr&r8#N1Zx!W&F4$_kJhO)Zxjz@ zP0@IXSAHs7yz*0zGyf^)afb7RzTylyN)dnB*B2Ns{5Xv>+IOe>ah(_7bM!;~lAOL*JdqsZ9_P!F$CJOs zxIuq9owvwt`rhml&MR1}nV(Q>BD;}yF_-WM%~SlJxWpPjd?@aV4tbz>C~JrGh$r57 zTs)LENnSkVJT4yU>m@G1Gv>k-mrmX_#-(S@XT~VbOv_L0x--U^XYl83mnzPX%dv)} zaRxu*ufT&p`#3|s&ma9I|7R~k+yCC;4A%>+%dk(|C)oROUNd4_Wx^DV#s zqCeQD>{q$}qR+$)f6hsKVLp?``gu(};mn9V9#nBaJXF_H@E`H~j)BL;Lw&v>o^l=+ z5B2r3p2Fk1!gc<`Z_M)hu}@qS;|cANpU588e%pU>U4BOXtt{TxH*NNmSu<@-@9X+| zU)Sp`J`B@&avEpAd55TvGqi_zLVm{g%F{f~_w=!_b4xsw+(Pyj4`nS7j$ZgqIP;l# zuX#T6%$*LfrUMqFmEmHHbvXN#%7fit(ET#MJZkTc*T z;85X`=X=U|oNHsO7tj<>^+*ot>lL50rzIZh^}m*LPJiDZb42%-dYn97xW8`@9G-F> z7Y`+xsK3hR{rNNV2>)juK{*GLJo^#KaBiS^&HB<;{x7>jo!wgS*d@WkeZs;uj?v#{ zn7;${}KHSyC;72n*2@Uh`-%t@8OwN-2c4$+s)s`MStV`GqX>6pFHQn4j;|` znMaJ#em{=C4GGn_aGhTG4V#zq3ml$u9v2TqH+qPl++*3-{nhdLtn&PU_8^ZBL7B^H z5BGDj#{l=|#**iI%1Iua{XFk~_WOF_sUFEeeZAt5cX&&@^r>EQDn2^z6#iQ7)0X`e zugC?NljQGwu+LfFwC7W70|k9{<#Jqj&m{5g@_#Gi9`dpal(8w=(}G8Lf(LowvUBve zmCWA`3inm+zN`70J=?;1x+MN4f8d$mJ2wd9-acPN4}S&TzKJ<<5{wbby z(BtBv&JV+LAMlj(xOk|qm;dvTpVA)uE!>}JIU_#B`6VCxhx1DEOX!2c%J!3A;)ge1 zAF28!yF*=`7W|F%I>Cd#377qcXPah&^Ud;w*^?oE+x;VU{c-oxgTHYGN!!xrJ2>lb zcsstamnCjO$syEE@o}%)#>4L~GmpTrwU>tnXU+0BJh)p=!|z|Chkc*d15aC_zCGfh z%3H8MJmsOjUhz;@Z#Q$7{UmeU?kX*o%loCWIvwfSK!2- zG@mC1v(JM1eb&xT$Nd$*lfZtf=vOy=#Sa-XsBrO6pC^lFUG=zlsLzwdQ_kb!p}t;x zi4V5qLwmHokUQfKSJ+;hkNgdPlE3KOMt)QJd3=wS{0+RwPr`E+j32!7LwgSx^LnFl zUf;yLzILhRHD~hZhq6A(&f=l8t-xF2p|r`%!-F%%9)|~a^DFGf(aV0*>w%{|P~RT$ zP}iPt4nTQu#zFOphq`*ZnIp_+=A@t3@XTkv_w!o)dA;T}`qF;UZp};CS@TWvSp5=D zznq@eZC<0d)4T@fT{8dZ^IHDHIQn@izbXAZ&TH(3ob$Kv9vE=^QhrB#7|s>Te74Q& zg>k+93G?~~OEs^llj{gj=O^KJ?U|3@T(g#6kt4CcAoqa^hiAXc_fYvK<L97%G zPpnMqrLV|CUAWwZf@@X$d^!&??EcD9`8jRVpZ6ay`~>R!ExgA7|7QMqKZnP^nZMr8 zy&kV0o#=;p{rq2bI{B8D7mnX@O|O&RV$WrM8{a#@c*v&aS0BPZWoI{z!4JXt(|F1c z8CS*|J^bO%{N4)pI~`Lz-!y$Q^TX-un;$OueY4XKjCp*T4})`WgkLvp+{1I7>;=>7 zvx+n1=H!x!KjNW^d)Prd*S9?`9_sf&;wk5G@lao{&R=}qOTG9$=fzO=ooXk0RrJyi zum7dxl`yxJvs@zN)peK>uB@}2N)zLsa>evoJPPqV%B56b)f zz#r_fb;od{?fVIZ7vBr$$M=h~mVdw9CDbG$Gmu2H^pJ-I= z3HZ6+%L8sy_bav}4>i2qPRbiEJ)xb%AL26mmeg;-i9wzGmNj*0{MMag1iyvHA3ZJ} z>itSQW9f16OX9cq8-A-ejGbu%dhuJYA3ubL`gY<=!c%$V_&${v-f4bGpZpVlWnTl; zekc0XJiDJQUXPo8JAU<*CH5=EooncwuE&9=>kjb>n~`I^RmYui#l}!_b=es|z`keM zxrOYEKm09?JMG!xv^?9zp6mbd*%?&xJ>cK8_W*z!ReWe64_=gO$AO}}dnpU~T%dB7j~hi5xv`}FRSf4O)s+#dH# z88dz~@7d_e^gimR2W_#rRT=Dtoy+$c2RzuB_OK_TZCrZ})bxY5dBcf`MSlYh&s_Dm zcqnUvT>2<;AOi(xdU~H13S6`X_nGrFP@@pIDQ)KNnieqn6?%_hj%P zj@!IwDX#KB~{fAsg6GcL$^{4d3Ai5x2<$iQCXOFK$n>xNV`|w!VArK-}iJuqBV%^piD$ z{1dAFiii5VT0CR!aq&=}SBs~d$HhZ^z2q?P_yr%@L%z-ZeCOO%-^ZP0=WAEoQjgpC z3HukQ&$sC>c{a~I`Fxw-N5My-+EMgIPIoB`s?eJyzHTR zr8m{1dR0#H=;sgpP~p-84Kc<1fpHNJopE3(ulk@~UOd#xQ=V}Lhx&RcuX4iGPpFp{ zzxi+CnkRYr)njYKwL!Re#?AMa@q_2R*Z8XB#jCx-RbJ(UOTWqqS3ikcUcY$i_U#d# z_Dg&^Uhs4GiaMaG7oEbre%cLAKfJtn^-p>ihTC(3|V7~BNkK!rxxs~EP zBDaB8+?Czf6VWdy?Jw|_Vj8jE>#=Jfb1lw3w03uv-~VhrMDGEvmi0hwq-Bke^q)pJcCX!+34Y{9@0= zIa)ei;ET?F{l<$uHh&r~@<8mF#u_2k~_Gdnlm!|dyZ;tc#4mb0)&(HB;K2Hw{_-OwBX2f}03+7t;A2P~)YV9}= zZhXM)`{m;M-Unyz08Z|l#tmJwczRHXXraICces8L z?GSLq`M1P%86V&1H-GrE;&Z3#HTXU8mU!aUop9d^KEZVy?)BHaV@@H5ttC%qhyCMTFWR__kK;nj$JXh%fd8Y6OOySHG1!-J@OEaburE~CDg5|W*VFB@+g_cJ zPwO{2Jg+xn)ReJfNAteZuI!v$;_tRTzS=oEnqRl)`)PM~;pTR)S-{)#o!^J$+0i-E zhqnEuJ zdZ4_Q5c^<%_LJBdDx7{HN58zh?3MOQIMn;0h<$TLq<{}k`#$rI@B zArBL`H?>(`-k0*kKUseJd2-xkE|o-K2-#>S1kR9}g9-@=)61ad@>$xSqp3<{dH42}i%=p#|PjJnTI^%CpW{ z^)1EEerLrv3XXl?$upUMV0^%_J2-lT56_6tYgv5$Wmq3)ypQ-CuZv0llEi1Or!f9d z^^10}pMm=83&I(HFE1Yd_c;EFp1yGWmhV+B^MdjzEnf+}VpRc&JH@|AkviSVQ$LGB)KCcz?=PweUpT&=eD|qh6sv|qxZ-VY_0wnz3#+boZ|OfX8hi+bItg5xXwjvVcks6 zmj;{}^8v$c_Y&WC&3(e0vG6IbYpD(euMd}(hxUm9PWFFiLX?u#DnuAVOqT^RRK1s?3oJX-nm z&il}bbK?DxejjT4ukH~i#Pbo#sXgH0zw_BDE}rrsE8{=N~(K|A58ezjlv)E?DP~RSW3AwkOQa#^5Ke)U;@*rao}=2#;}lFN@o8U$ggn ziQ92sBmJ*6Zgbv6JWBJQrnpUB&iMQNi+IN0EV0j?f)Z=Qu%BA|%Z{gCL>Y-ok6KKERFFZOd<{Ou79jVUiPMsR} zIlCQNy*>`kx&`jnFZzkz2|usyQ#PL$^^SVBdc9ub@zm*pBcEt8*)?-}P@)bBShxg+ANOMZVR9_sg%;wk6xhcA!&O{m{*zW9l_&t(1e z`%RUH61QXr@lfBMO@1Hcj{jD5zlnazt6ZU{rFi({DlsmyC$YHKQvBTLr5H!Su@5}^ z7v`V#FW`&|IC_M~_&mVk^W1Q~X66PVK9A)bPx_Z6KJ)AW_3(^?>_9ufp`CEXf8|$7 zyNSndJJxC9`uE0+sv%2Ba(-DTy_SA5B*x>e`EWh zns>x!o>d?|LxnR>d1ixo3iUY8V1Yx0(@*p=&%A!(GkS^7UcbhJxX7~*>KET%bI&Dg7EJsK+JO z7p{JLJ(N%D#SYvn!?-{-Ui1^5etDd6=WLAeg-TxYD(x?Nv9s*0_DD|O3zxrw`*|TA zJ;I64_iWgkzqou??Yv@He2#JWjgQaw_5QNo7h-%qJjCY-OBmUpVuE?^UmO{H>E7^nJ&U+fsSTd0g#R{i!_u?(3D_ zR1f_+Z=2YDsOBB<`I46XKApv9sBq>f?|@*QLOp)hdJ%^Tr=RF$o_YPmXY>-Ey?%`c zagjZ^`b9h0yJKglaQemg5ih;GaQf@Vm-bMecQ}vzOWPy8#38R=c-kI~ z3zQsB`ZZ2ak4vsET>bWXD4*7g9moY47pTUIe!|l)k2CIE8(`d_lE=@mZ`xn|+TK1Mrz{!G6ZKlW!nUlmS& z{rJ)z$`gmYyy{E!2v_~Gr{vQ1Nbf;=_N(O2!qfI>T%bNr);K{uF1fyN^;_+f95l59 z`7z_-^JMx7Prp3Q_>wm>zCM4}yh{6vUhFJ;t38s__rm3`;L4Mk7vlYVAwHjb&#N8t z=lS>dhWA+c`!v|6Kk?7;yxn7shE4iG+W8y$;Z?4%XG`&L^$$dOoo^_9zHmYHeB+NF zkLMfAKb>P>H^znYjTKL-o^RZ__(#1{`(GOK=bwf6JdXTX`qT3bwWm{jChw%4?S56} zC$s|`+6l)`$q(f};_+LLGat~?7tXx!d9Qf{j#&<()LI%ameczp0-Eh0_BWR z`ZZ2ak4vsET>bWXD4*7g9msd5F(Yjj!fa+F$fyXW3irk(|C4 zE`J60^Flm&gcF}>C;PE9e_j@!WB#mo_{PQOJ1sun6yozf!$W)y=Nn5CpV>b%{_NM} z55xg*XeXTUKWS1KC&lBp9%nwFr!Sm&!S||HJpR^65Bi8#sXXO8uJ)_`RG$9&dZjnj zL%-NJ(tfDs9q}3eCqDag3Fay1Cd^Z)ldE3N8yE|=>T${Sg{$9cr{tii9TwO<7hznCY8-<<7$5w>;fycmHHo6;40V%RKY?iO=XIK70Kd58~p=rJhH`Rj=gI_DC;r$mucyCZ`j}ui}MARSIDo>bDrf1l!FQvf9ZCXmpXa1NBSgBedu5PLy-!{Zs>h(x&9#^ z5iWV?>>ri&syx)=YIoWm;p&I-FJx)8w zBdOo#lj?ukU*RgJ_DC+(qx!J3uUB?|YQ_HH9$)EEe^XriJ;VA}t`AZl{zN@KKNL?r z9+#ice(#6UgMN>zpHP3UCBBm$+0)CTA71sSzbfAem%P`*__AMOeEq(O{=(B=kE{P_ zzr=fc5}(n}v%6{jJm&|U@2}&X6`bet9!G!v%=>G=xi{LM_li%R-weOkNqN2ZM)u)e zbk3il{`{GH8aa1P-~X)gP~w*Kh==<2@GdmuHhQjl{!BatS2^jKw`V+u9ez@zT2DtU zTpafE=kFBv{lbxFe~!FAZ_GXt-(SaXDc)W%HpX3@Z!10@|NR)J!8ylf{D}XT zjqcx$^WaB4vN)^@_2dM+ zJLM!#`?!aZc*!*k;ppMo0Og><#S=%pJbKV8eUhg>^fSMp!kI7VWqx@5l80V+XDP4p zP>-wKX?ujLAF5Y!sz5)CXJo@2PkL;%Mop8x}J&Z5$nel}x&d^_Y`s;D^Kkb)zZ%^X?fB|tIyDa|q9skKE zi04q*pZL$aEr|b6;lzK=F_HJ@nZ$qOi2qLhO^E;dTl` z?4lU|Z?fAB<08ZYsZYstdVGxMMr|DnRs15X_F^5{XY^huuj z(9isW3TM8chxy_4OCGw(aizS9#Xbb ze25PYSNRYp98Npf?^C}&pHctQ{t8z)wMTNP9@Q7(lB-vCC$4wuZ;Fd2UiopPKE|DT zyuXR39*@gUXutPE=|R88)laBDmlNMfkL>B?(GRbBWH*)XgiGG*VSMknD$Xyc;tc(T zr@tOo|I>bn_x2?I56lOCysh~^q^PzBu{B?(GRbB zWH*)XgiGG*VSKN-A;y2G;tc(Tr@tOo|I>bn_x4o$=bd89^8dc`f8sUq+{Nu~;y>#y z`M+O(iT|C}3*tX=#D6FMCdB`hE&d-KsWBlhC1o<=m2~Yg-xOn`X za*}60a!rwV$+b!0=;4_b%0Y#TCysh~^q^PzBu{Kdz0hZdl<6NuF+9HRQlEbw7bn_x9BJ&%*xwmc{>u^Z#i- ziSZvQ`xF0p=8E_a6;Ax0{rxBp6;Av|j`;87-{AN^BpYJy^Sq*XpXaQfaR~I2@E%UC z<8Zy>@zuE6QeOY%o$7oFynX$b-%$gf`rp;-EaIWa$j`;|dp8~z5B2Z)6i+#ii-%Ib z^oL&!G9Fnz;P^A|Xxa3A_4kzW+p@hMuD-XYulI0ry_JNnU-+#(`iZRCWdCjH|LEdVw7>oSQrQ)p-)noJ_l4eV`>h_X*X+CA6uVsCdc(%c z{SI0;_U-UHT-}U|aP`;v6>xaUd0hN!9j_JtWbf*}s{Xz^-aQhp^=)cai|>{7GIBoUsv!Y&pPZ68wciUu7@lbv<$>Z?&i^s)7 zv909AqsQaoRgdH~-!Gm(tE%Hjefk|vzN7tI^Q8>mY23jXbFPnS?9o3wi{p4w*V*BB zL-xJg#?gLPi#&Nr$MJh#%CnQr2gaLSjkd=T{M_&50XNznN68o8x5tt4k~cl=aU?!> z8b|PD;~2;BysmTOIR3=O(fnm;#_<=Q%CqIo2ZkS)LEGa9zUYBG;6~fyDEZ?1_Bc{r z@}{Rfj{F7+@5oN)BlxqQ{70XUh^z-te_!Qx z_DnN-AbuAJDt}OUC~fgLyxJw4`!m6HAER*2yCe@S@Rs7g?tj#Mk6JIbdvEo=N8%Ls zJ@z}fdf#KuvGKk~=4E-`7-ya_QNI{(t{LMOP>=JB1m#ZNsh|4WEnfO0PrH%BuPK+}d{6ztC5QiedHfqa zec|}IZx8LJd|x>I>!hE0uG*q(r^-V;u70UqYQM^-^3o$aNuG7*tnK=RbqA{T0{qgR zh(m>AAD&&o4p8B&M?9lK{DTS?4-L;aEf?pVaN?qu7Z3IF!dZ{JJa(oX*weR%^$0oQ zpO+U8_47u?BM+q`{Pfv*UJlM9K64Yr~Xu)@uu7v-!A=A;|le- z+LzWVTTWyczJ+A(w^ICX1uhl;2jW?D0#nVoYs~xn{*DD;F z+8H_IJ+5{@y?*idmB-Z|#V72^dUWp>7U!G3r+&`AY(0wSev1EZ%zCs_Hrn<_Khpl_ zdsD{SeVAc?blF{h4(nrjAO2Ch+7Bh$Cw&f!^^5(>^{wiDL_F)E-=~NtPWb&1ddPcj z*|M6KqK7<&a>{4OL&R?~zbdcxNT22}^`ZZoTdR53Y4=CH2RvBjOX!z8)aQ*V5B0d( zowi4~`l0qnPW1?v{*QjE+Ar~HujHi{>hnPH*vaE65A`_hAg`u=pSP?3X@7;QoZ2I~ zRFCSz&c0sRea|0O_t)xgii_`gx_TX!`tT>}@%|>BdOR*aq5a+ur3d{US3jZYJ{P`| z9@*2&qaR-N$Zjg%375Rr!}zkFWPJU;lK#TeUyrN*X}`pKdlH{7*|GC};qU!9tV?c+ z=Rg`4)jyjk1&4hN8a{wbwBdTN^w7eznA-wowChsKk`_yAK8Be;(y$aNPoH? zQG3$;2ztrm@kgJZi^o4bE*^jP`9FHdGl-WyuR{;{BISJED4sa#<<%bP(>PKe`k7xo zpJBeBm-*rKOCIX;C6$MITTimR$KU-pQXl?AJ>K8MQ;)~xC$!)D zq4c2NV|dKh2!Z;Y?s$I)MS`s;D^Kkb)zZ%^X? zd6PQl=gZ=M+>aB_+5Z#I{W$>fpZzfL-|vf&=Uf1Je?CC`M~?XK)*`2+2_RjA&HQe{I|G9Rb(*6s~KK(L&L!8g! ztA*da4R*k8+?V6<@H@gGkFsYjDU;sMOuuFxz!_(GKMD5HeFa=I<0CuBZan9n;+!1n zdoO?K*W&#TP~qI?Ae?d@mmZHxFI0N`^*)|K^zS#|-HEi1cjEeX^1G+pLjmR92_!g6(4L@$(eFeRkz|f6G}D z?H%9NUOtS=lNZN!Ly45Cm-js2-`uYU1^4#n9)13p7ar%`pL+i%(7HQF5F}HTE@lOQ+}>-S=#aX=-2J{%j}QwVq8}2U9tDh zet(SPa*55C@qgd*W%*OPvQ_85e&fQ~41ejo_-n?Cak=i*>t6kJzXQW{w*!7OWm0P? z;u!Ja#%t~OfFJ4HU*5Ol{m}axdk+56esNC&fAYh(LY#cP;vVBN`PIpSvJ`2o8@EcUF-U%vh0~B?00*g%d+dA z$@9hbGlAgZp$Dv;Wgds8+&VT4YHEsM|z2c$1o#H7+KUA-H=@Wk3x_M4JptOtj(BD!2Y4?rap6AfXyTx`I z-Yx#o33={u@leVYdb-6+pY(6@UDNwL`<=uEkxE{Cc6ydw^Y3jvt;yfE_KdUrkI6&5 zJUsG;Opds1R=Uprx?%RYW}8QQjD-CQ`249cZ!7TjzVDKrnCCn+^ePjdxaTf=Od*e2 z8=SpRfrsBCHam>G@WtMI;l5c09ehK(ogwEdR%6s|Y z**e*;EIzMY#OH$!G(SIRui)o1rpEZZ&ehfUJouUzpCA2lH9m`n`Zy_`ay~wbmp;YA zSFVfk8S3NnGw+J=`R1=zin%+y!6TcuR1@*WyXOxE&msP)TC;BzVW;mm-*huXYt7U z`26x2!EI~td1ZTsjBnETObjMRNaHhjr}(_-W;R|HhoL?WKmM5cmElm2OJ3j0Z&lvQ z6QBRd;`959_@ll$?JRhxypNa z{QSt?1MxK#UHhUo%1+cJd|>(SG@Fr zlc)8(gms7+H}gbVJAZq4m1wsD4|cQmw5G3Vzmxu)-IHtmeekLFd0I<6blm#w^Q(Zv zQ|`DmOI*D475kCa{a=ae(IqQcUN4F`_AWR4 z73%$2{AqT^>2dK;@8{yBkM#C}R zf08~ZPoWSfh~?U%E!rga-jkc8e3h?h8l;duY(rZRXwx>dg*Gj13baM(@KiwMa~!P< z!=NCaBI7XlLdOS+3Zf{3%Ali&$`6rYn0^d{3{!Hx_1}B1bM`s+rnyO5UenWGy3Sf> z?X~xM?DszB?g)n%=O&&t{!{Vk;+S~z=q5fjp1n8>hZu*3fA7U1?d>Vj-rjBE@T{{X z4$oQ;x3_nG(YCkqI^%j_+F@|oQJ=0jkaVuTOj4ZoR_U+3_V%?IhgYn%?JZE-AKFc& z54F9$W~9Y+@|ObH|^>W+grb!#Q6t4ZrfX+mY?<%oc5EklhWb8c(rYBfl7xT z9Dc@9(1+gM%8IGH5VNDE-^Tgl#Q7s8&UbW6yC*suC^m8VPEvg7N@*`Wy5a^(I^|bf z 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 LTMN4R^~e7Q7Hst_ literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/with-series-diodes.sch b/adb2usb/uart2usb/vusb-20100715/circuits/with-series-diodes.sch new file mode 100644 index 0000000000000000000000000000000000000000..d84d99e562a27e3f613511c6c9b340c9a9d59020 GIT binary patch literal 213956 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 J_OZ*^{|BitSq}gJ literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/with-vreg.png b/adb2usb/uart2usb/vusb-20100715/circuits/with-vreg.png new file mode 100644 index 0000000000000000000000000000000000000000..eca79324fc1371ab2d2ed74eecac544f74b28886 GIT binary patch literal 13073 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%0AWN28f? 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 V(^t6}|7c-){7_3J`+@1F{{!z3m{$M* literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/with-vreg.sch b/adb2usb/uart2usb/vusb-20100715/circuits/with-vreg.sch new file mode 100644 index 0000000000000000000000000000000000000000..1f1797bddb31bb9d52adee492dc6c75fc775c17f GIT binary patch literal 215922 zcmeF43A|lJk^j$o3CLy^-~nL?ku3odczHJoVKG2R5JLhngdGEfuqgzDfXEsF6%i2` z22mMAL}3sa1VlsxL{tV46%iR^5FJERWFn%2F}(AyZ}<7#Q@78(M-qX*Xzu6pQmNmq zuI{d`uCDI0+#w6cX4h<(Wdnx{TqV0VYkr1ir;PaImFvFk-@i9xg>1>Bh4&2H^}PF6 z%d(-Karo+4mUmg{PkoZl*LFN@%^TkK^Ha~=agA(H*O0D((mVUOY_yW zOg?VGg5!?0|C;>JpTd~S&k8n$k!XTcta9(y<~HTiXimH6BeAGF^3CB9&vLytL$0w%xydL=%$ z#0PCKd_dX$y%t1^n*8t$R&3&POMK9VBL+6{1-qPZ_@U9x!$)kmLKB}`;)C9@(SW8s z7wmfU{G(4iDzs;#x2)L2=a%@OjW==n-)7CnxYnLcHg@_;e9)$wmHk>U`|uMN6!M#G zTHS|;%BcJQ*2_-pO>w4o@F-~-W*N)e~e^_(oYa2j<$%V~Z}@HqZZLh7k@=-6@VdI28G@S=YhnnQ~xP zcKb#n?0=K?*m=fO@I#Er_ItEHFYtYKp1$`~!{<<*_FO)8gbl{tdrdaEVfMF!{iXI9 zo^7A~s(*g}_FX%7g>l(}aoH%_!mRs^M>X5-H&G(^xPBsWzT@apYlwWd0ae{ za)teS#7kdc=V33tDbH7XDa#&OXM{DNY3KDAi#x9F&jUViQm`}adG<4TzTl5}4n24M zEbGsDPZvJ#p@{Rn@GU-O_FO5;pwIn0;AbFz#0RY1Rvt<@lMlGb-D&c7-E>u!8|~`P zhP=O!|Fy|qxYp;ge9pQp_~urAOOwxb{ZYQA=?U_y?3`sc{x;8{v7IAAJLlQR?Xx(~ zp|q<%i+JC=Vt=5qJ;85##9w}PD=r=y`y1uOLu0)q4zGIp&D!)!a@aGrC*tCz&&$jH z(VnF|Jo3K%=z(vC(;n3?{o}q7+YR-4#9w5S$>ZXozCGfv_;H?lTs)NVQN7|R=W+4S ziFqk6o^l=+5B2sGPdSf^hx+jnFMFt+vn}8v2laLkf9J-nxOk}Vm-t<`X_Xg$@$6Py zy!=}2K@a_b;@85}&eH#*pGdy+{}R`{@OqfH_#5-f`?>IPUPnC(O^)_JZJyfvinz)b z^E9;6;&#vIcjx)c8}oe8n}|Qe;R#`#-LgB&h8wcIEpjIuc8vWm%UEZ(FnmDZN}P4} zJX>dHfumyjtT9vfKDgaFJF9nGZ{H5t>O%_^ErfO1)cen@-U+>pI(fCFC^V~gV(<7m z`DWG_3((qQ>*UEd+-KI<-g^BjI$`_otg(H)6UZxC;mFb7W_BJS+OwdpJvOxdWBSMT z*2%BzrQ_(FRwutotNg6K-g^DyKkh^O&#u$o%=Tg-^w;{so1Jp|FZw@Rr+-kZ{H(t5 z_4=E;$5;;i7uD$>lIU;rjkWRZ?9Yj#qyH0i@`jeP+b@*m=AxWctsH zvE!J(o#of_(zYl3YyNCYm;cP@YxHhgr+))4ZTkP3zY(+DXGUXuy?@%VkpIjWzinS_ zydB}C<9xiiuKjPR%HLimzfo2Gn|1QG?D`M>^PhF{n|SHi{vX!KZ(5cAuR8h7s`5Xt zlV{)QKD7VWb@HQ}u>BYL-`B}+UX_2TPJWAu{8-z=b@u-)tMV(=$-8YAC9VBq2iM87 z_jVuT*RGS_$_d+lk>9XRe(S3I$U1r3p85~^x2}^fcln_h^4rwO+qTGmkl(RRzC0CZ z>VI3Ee0f^Xl;5*Xe!Oo@wCBEc@)N4^2iM74`t3jT_sBZ=iC#Lk=eRogZL9L{t&`ub zDt}g;{PtD(57o)*Oc5%J**D*SAld{4TBX^!NTc`6*TTj`82e9)Iq~erLt5u5&}()c7?2JQ4OgQ!D!W zhSarZ*Q$JNe0y6}et4b!-Kz4N*2%xUDnGhTep*$2T%G*xRrww2fsgsWhvF9k#7vF>+gH2@~hU#pHP)wy-xnbs{F9J z_Ah9apV~Ku`Pe>=;c+$wM5)p$!?d)`}>A5$lPN>zSho&5W%^1IZv|J17d z?sfW4tIF?NCx3cXer{cR&Zx>CU8n!ds{BcH@@G}$-(M%cuqyx2I{Eik`e|A;A z_I&c3s{EJh^q*Um|3;ns2deV5=TRT5%Kx}d|A(sbwdYIcRpozIr~kuM`9IgmpWiA! zb^MsIwdaQ)smRyo0~b`}>+^w+R^%tt<_{OP%3J&y*Hzcwk5%Ps&$}+F%CA|c|KnBp z5q0txSLH|7$^T1LzBV3SQkAcbhyPlYw|Lk&{$E;^xBX7%^Ttn9ke@dPF8Zv`Sa`aUs08>&4)izm9M?tbY)fk+Pe09 zwkm&9o%~f*dCPA*`@`p|^53bGzq%^_aGm_;tMX6Q$$z0L|C>7bYpU{ps*}IAB0s*n zPX6Dk@`LK+udB+hTPOd;s{Cek^4C}8Yp*AMsVYCIPX7&6`Du0X|526Sr%wLHs=VcI zo&EF6Rr&dK@;6oGPpy-`xhns`I{90w@*l60|4LQ9cE5aURsNbf{a>xh*T#q2s`9n@ z+t;e{_tmxM_Nx4k>g2y(m9LEtcU0wTuMd8sD*s|#d+w~t=XLUTwaSO%{krx2?pFD5 zyk95(%~ttv#9k+VPpf=5-mjDYR;zqCuCJ57w^cqI*VoB^yH!3M*VoB^r&Zqa&k3v4 z$$z&hKeUtl7$@6pcUI}XWv*XbYWHge<5J_WUF?3Xcwh8=u8jS6mw3Nc=ltzIQ~B|| z<2tp6`AI?F$p$jAG&I?I1AmH#XEYdutv=l-b9`oEvbH|pho zkjhW!wfwxZ{vW3D6S?21v;4yqdG7z|EdQfKKHlHbS^kkkKHjg=S^mcr`TF)en#hkE z&;3Q6_5Y+IKcUt?A8VCoc5Gj#|G%p8cKy9`dmgXK*IwWGX;t2?r+3!>L{pW$)ye;|D*s%a{4-Vgm+ItyRgvGO_Wb$Ts=Qsl?%dyBSLN5QlmAUs zepH?OZ>#dP^Y^)`{7!ZHe^-^CUMK&2RerxZ`TwoT&#RMPRFyxzPX6~*`P1v|fgd1^e=GTMdhLhUaRr&nfpt`<%CZt9`^n`KbNK!>b%P&*5(M>pXvIaPd6p zz*x8RBk%Q?{2{dGUDI3bwwbl(?7Q+D+nl*mmhpeeGQKyO9qy1Fit%mfud|!*V4q|h zX~!=Hwc3I9fS<5i+MeDySK2db{2j7q>@)4zEQ|Qe$09!Jx!6wn%lG<#FYbT606syA99YoV_RiNWM5bDcspI@wegeHAb}S@@Jxs>)(9IP%9ps1$-XL z>{H;ud96K-`G2zKh*!$8i&wVif{hmKX~6IFe|gULQ1H#NMU8`gljrNanCEL6{-IT) zPVn_t$ujUqda_Ko*=<k$Gs&~l@)lfzqP0FoZxOk}a zn7WSkoRgoG|1o=iwC8%^@yFnwvd_F>(+Sm0|CD_SJlF^O@9+zI9(W}7ztY5;adkcL zTfWfhKiG{J^VO&Ge9GoocI0|i#6IA&AI)>{+sr<~vF8%wAF??%(Ci15J;Cu&aH#D0 z{7td{tIue)r+BEhn|R83T)gyo|9r2-1^n~FYsB{Bp9h#d7t5ZFV9$LuzoLCcm~d$y z+I-y?Utjy+|GWJ(`v3F|&ZG6s@x5)6*p~tiI8& z#Y><36I)(OTrykkSHvsqxueD|KX{w=_w4h8+0pEEqjd%;2mYp=Y+WjFBSFvIHXi7KqK9!j;oET>M{Ruk+GhIZe813gVLk=kobT$t z?5FuFUiR}ic9i{ui6;0qX&u}!-Ic5zpeS;Az22MeZ)gow>8`2@Yv1c;-S)G^JruI^S`VQ_~%Gwuzf22 z`9QE|(?7|TQ~Tg=Ph4EFPw=Z(!9GFH>usM_{~v{Qn*LMzf55{C%bs`H{K1|(+kE6R zJR6j)ZvOea{PPdt^#;K|hg_%m)#{&%!VZ@C6>!b3#+qj5t9tF7D?4QwRQ`7F6?uM? z`PKi~_s=y#wINR8%iv!=)XEe%{x<0DJfHJ@^J()#D0+yWz7r<2{tRol%A@YmaJ`0eeVkA5{|WUJrqdO-Az0uO%0eE0eMc8&0Q zjNqTkp3jf4ipqTTA2pv}dr6*u{MkJJ^?)opjup~A*wg3p+wC6g`B(G#*L%N%pZvY$ z^X=_9I9t>|Cm+&vRh-u+hS#fvc=hln^88)Xs_PN>;&WQpBl>%#tx=58sErp+GSZCa zha3yq#GCQ-$6V47WXH-=_^Xs&!mE^nBY}dK{i|9v3ft$g>`?*IZ<=lD*~-ieKUKBo;FkT=_Kom5vE} zy_NF>uD|&6gdOc%>*vL}*7gsF*GUF@axQ(j?PAmOSa9w)DDdX>cb)%oZtTzN;9u#v zG2^20DkpoAYu`B{%MSQayyji(D;waGf0pOqQ1I4$O30R)`|)z067Z%yKlqJ2-_6#l z{T{I#ixXM``?GxZ3cU?4{Enx0B^Hj82RK! z;`O7A7PMYJg6Fyh-$Uhx;#E$#%B!60d6}Kra(@M9xKP;>oHI3WsO))}*$12Kw_fYM z?e{{ZL*C#@}-C^tSde>l2@`QHz5;%WpeAx9J@jU%Oxt6cqag|+{vwW5h{yfFb-N1*u*RIo*c*pZGY)1Rewd>EWoju^R zk9eSV#{FFxpLf_Jye>D`e|dcV+vD>N$A;Gl2YW7$&-L+{d*6u9-20~c4VFGWC-LNh z@OtLu@uZ9!uW>wCCmUw@^RJ5hd516d_Vte2dOW``qkBlX56(Uz9)fevFP{Pr@sR7e zSA03ful?7c@#XcnYp>7qTR)%Y1+M(CAwAsh%I7(|Pt^RUp?bL|(&0T9+#d60&QrO! zWO4V9_u+5gzo+g~~ajzBhoMLQ4dQ?xbUi7Fw;%lro zUe_SMB>zZpwF8{`r3ZQPk`yNgL=U;O*DqZ4NDnxAkoWq9s~*W?2lS@;WuHV(L-s1| zLmXJtU_7{27yB?)e87qO&(_JF?LQ-5rz`HucKA{7t8K#X8NEA>YwA~zToQGr zeuY1fBc^_}@a{a{>~~ealAd)>i2CGL+&>S(ei~ZfJ?O{&>XO1{cIOV~MycE9*`jJyT8W+`f=~tTdhU;b6m+?w*wF5l1C;B1s z_(6&@F6iM*r|4JEFI@GgJ>cj;-s=~xdL)k>(3|R)eNsKLm$MK4(*uwHFkbQ>aK;H7 zy9pm|_vi0!@#-$ctC#VseZuc*F|Qcc)UWVwhd1LDafy8Ep>^8Fs{(JvE9sX$+O(;~ z4dK|DKkVai_WJx4d1=ooe~Innc?Le{VZPjI^JQ8wU*5X4-CXw8k)dCDUL)<7o*zl) z3wdcg=eG^Ni^Dfv6XWDV>jb>nFX_4aiqM?wS-YNK-Ds%ZoequdE$|-B0_i8?L(H-M zhWP@H|9}&NG+!83_!UoAyo&P$obup>-NJm49@Qg%Q+@bDQE%{P_R9ESimM&qu|09V zAdi2iIQs(4U$0-d>QQ^Z6$iY2;i^aS>M#E8^~*lsUXSeM?8E+|2cG96?)f*nPv6Fh z5BQ|H@p%gDCVY6des-?;)#>u9L-4Epf?x5wY?Mv?ir;E;cyqp>_hP%3vG5=LUfz1d zCHCB@UrEnFKZyF|SE~2wt(W^1{`N-nEBx)MFGW9`^Ziyoys9_);hb5eA6mEw@_0fL zXL^tW_i+Zl-OK#;OY+-~t&BA@!LeiJf{hfC|X((_XB;H~^t^{&((>o4%- z@zB;g##eDKjbp-Jn|QdWLp)s6HXf2!O!`^$+r{=Ew&EoCig|x{9_^kHt$vF3(y#t5>56%aaB>mqQGdz7;mOVUsK3<7N9|I7rKh#Ot^1lu>skJ}&DP7j zuj#a&j<#nb)AdyQmqDkt_Dgw^@+0kw!CUjOxGz?|q5Q)3%cn7am7kRP#*nZtmLAok zd`9(QC!fz~JxlR7cs|yUy-NGU^D)MQd<^^GJABNZjTb%;|F8Wh-*G-ndF1(C@@4-2 z(QvLlX@Y8?>)op2oAtv{d!bCj4RczVVEK_{M%h zeg#gf0q3kk=PkrX`0KBYXCm?|aLR+nxD@?LdQ^}6O7&saSZ{34z_Vihnc`{(cx+E8 z&%I44zGR_2qilIB_V@aQs~)un96iW;{lbywd&#T6seaif(bJHUt4nTa^{bfw7k+gHesxmtE9K#-Uny_@Tm4FU)ZW6c8mjlN z`&-;s%1<=T+E>b+vY+9n;kUBCvuD^>O3y#JzxBvo&OTxP2#^09b${tU9!c~vrHaL2a_xgpa9?7d;vWIZ>Gp$$l z^7`?sFKm_Pot>3+HNAMpO}s=u+1>#_Tk`itip zcAU^VZtU0?&$SOq{Yr5-^()>*!+s!*S6lp6_cevQw0Zt4J&LKcpSZ1hnY(WOHcr1M z#xH%Z{x0}V?AM|J>J_efJdPgZy?*4uRgdJ=-&DWslj@PZoPEMPf*-NSe6GKFmJx7!P%Q_? zZbhyf&O?UU{gVT`J`(-vVw*?B^(pyl>Q_2L= z`}0kXwb+>8$aBpM9O~t{Z!N{2w-*$m=W%;zrARiYCH`06MV87{}s2jpDp^^ zP=2L)z%#DC-R#zvr`bHRx1QP*+G!^L?6yqvXvB&A z`TXxz``c+AX?$<^e9QPYG_PhI(7G<5pR-Zut)DC7cK6x+`DHg{8S4pDahP?5Gm#WW z{-_yt->=C-z5MKbtN4Bv-_S#R^ZJFW9_ax`5At5WaOC-3^8IH-y{Ue1%BOmsx}Yn= z4p7;F_&@!faeiSRjXUv2c2mCv+7kn%0JakSMMqK8$AB@$i?OS1s{EE zwLP>`^0!=7%CmoA-mR>8ciK#wc#VDheT=Vk-f>;5-TnofYa3}kuX(k!dDnEie~LfG zk^U;bdS&x&{VeWZt`B+FPS-QE(VB*%QD0)VR2B zNpaN&9_x+!6y(`gr1%jJ#Qd21SiFAWsz>t?96iW;{lZm`*d;Q3RBM+7Q z!na1fseW+Er+Vg2@5;DV26c95Xq|oV(w6z&BYVkCR&SWsvZw5!d9C(1{bBy9J*uDi zZugTnI3MAj#Sm`?_D&pYxe##@xw`d&`sM$_?Y-8Y?LW$%54|k-+s-S`L{V55IBz9R zrR#$7r8FO7@56WLxfVFNSGq1>WAv*Y#YySsJ3ip#W0J!c0J@i+yQ1UU!qmMtv z-R#!0{)_$Ly!)|mAAYpk@N7tShV9eODW2Qfc?X+!JC6(JIh@OIU4--L1yh5bFpiwJ z!*fnjTsH~h1bKb;_^s?y+9CR_>?wPj{QG#nAJ;d( zQru_0^QZS2-#1}QFLv|$D{EHMZkpG{*vf9<9GmkHa)Dx=hWSM<0Z;zO_i86Nb%4k7 zme@|l4jw&xulXfCPJghE$~*l5S9#SVKS4k3P(9#`FF7yQ?^6E<=iJKsKlkS!lAmMG zkDn3!`6u}Ecf<47y!V4~ym#gB2KivOE$un?@bqwr%WjQD*4In!IM{m!8wV zZPnI(={fxZ|GVwiWb^Z%7k)mO_%r$7(66Ju9mng+!L9EfxXj+y#;3qTzn0dX#FNXu zVb?sLwfhYw+Zt(9<0u}=n}9tIPdSf^mpDTdVx9?Yh|K0X$&HUZ@ zbJ@R!`L)ZN=-2;+eyx9P9Iu@=e1r#Dn)B=FeZz3sdx-=!;hU{clp!HEIId-9vt z>3E+ZbBOmBLNzYpq0C8-!&A=V;-ydHwW9TFvHCUJ`nAiH(68e^RpdTfwf5_x!(+dm zig>eMw7p%wz+eAP`%1eS+6V%HuF!;sB}){^Uvg5qAAa{#Nv7)aW&+h)LrDC)?eo1 z2E};YC&jrA#q}3(e;o&T*1;4f4@3|9ey?A+>e2cOjvnN_e&MP|@?4ihZ>k@h z@~Iy7=MR4(?%!wH{4Mk}z;Cp93UzqczYEv(2=j-=nlHukhb05bJQllgUVwh6(-Y1m z(39XnUbxpka7oOcpR*tKQl5-IKVAG#mi$8FNV_S|_!M>y`IYQLy@mde2g(i_Pvudv zoBE-BD0AVwJBs-=(EQeXXn6Lf?7jJWZQcBEoYyZ9uYPXvYF> z85vq{Q0x1A3VaMWenPIgh21|7ebnv+l%I3Y8aUMBf3m&rBTw1ybr~JKVRQZJ5xkbkBTNjQ(A3{}+6L#bKjt}9z41-)AbjhS4AP>1iGd&OWffTgHp`%`!gzJ;3n1f0l9a@1YeBP35J> z$v0lu(Vpq#{%WI(?VbbKfi@Bspv-&5h4EEBIb`HZTi6gb$5;7hfopujd(qLG=nuH+ zg{of8BB&Rtdhrw9uZ|qlxAP)oa%V-z8mb!`)$1a;jug4JNu6muX1+V3iD#5 z%Bx&~H_kgDjujMJsK2Y6l4Y|V&2#7tn>XiC&zTq4J@qD+$OoJ;kv{49(}(gLJy55o zfga?g4|)9I+Czi+v-|p5{b9c=VjfuF@`uJcTSfU>4vtjy&fL}Z(RMxq@s_s#<&LK#h8%Kq~irn4wcTYJKt(+>>>6}t9xusH7fhV zcYnrWsC^F=E?(t?tGvo-yk=ft&y4PEbIIuB>&o$Z;^Xo8VJPuidBU0t?EYbsOXPdN zr3WgzZ8ASTFAa5i8j_bjjTc*eKKJ!K#Yi;gZ)Wy!cyqjNG~efQi}@8F)qA&zx> z*dzO-xa==`oBohD%D$!jxsPbA@ciSgT{p(K@jQO=Oz;!pIqfTQ*ruOoUsm8vKVhwA zzmT4@agCln7;d8#&!gzql7%+^%@-&KE$q|t)cHfe+xSU%KZbDU4*`cqkH^KU9`#Fp!W`fOZhq3k^Be8_ME1cR z*jsvJpA?t&vtiI`FKrzsS*7%0VU1bycoIq9dgUivixpnyC$bOr zz~0g$`=q$+FMFGO@Dtg$w7>jhW%HA%;eM*Am*OWEE|Z_&S6oAF=O;053G0#e1wFKf zwoneLe(`^O$2A?{$kA86g9_*W_-?A_pUqEXAMC;ZQ~RX2Y%F`5eA7>m1&{W}PgW24 z$&tnLcT;~kdv@QHaposJ4+-uZ;zn!U67Udb$WOSo$(ot^2{?I15>FcJrO?2+BedvO zLp+q{&OHu4=+CXVcxdtdpRj)yj~o!CFKp1OT>&vjpn`GdaKd79)(JtI!DxEk_F zVlFmD4bL%QD4h?yXyz_{=p6;!zr( z8Kd8PC_W?P;}zF@z@Z*zF5-vm5uxg@Un+Qw%V`$Sv$`pp0iHVCh~fy z+AkjJ$I!Iv1R4*})cfsIqP;mThli+Xb1%G?nTKL;G%j9o7kKByUE+4?R+vNiq@0cev<8Tjc z=AL_~_bc{3_!Du(`xW<~BB$@=SCT9Bygq(KduYGfCHo6k{|pcQ#+eD@1?4-*Gfx;N z; z8H03OIP*!z1^eUstb=~t_jv+)d;ZjZ;uq~9?}Z8%4Jx zJ(Aa6fVEcbAwG9H_hViYujq%5Z|r@s1C$&Z{c&72%0JQdWSlP#g>f0ner;*Th5HJ~ z=hJcFe2iSd&lkppn8TdzG%mY6Zr3O6Pj+~tj|;xRcrb7LxUh~g9#F<7j>`t&edE8% z?hWhaZfjbyw%ckUj+Numx{ogBOY1(G^SyTKCNUMi592a0p2IUPj3e!fcr#vw`=bUf z?h5B%zWu!KlySW3OReiBXGF;9d##(2qwc6DtefGw2ELx`qkB5-qbWJf z8RscfeolSl7OaC%;o_lOyYV#E1aL-qUx_7RUBkBe75($D%!JFuJDV|EDZ+PoQY z{r$nESSt3HahDySrpNZ_YlQ1c+7IqFi#QYagQY(Q6=V3fF8cTub(9Y2)XFjHLu*PQZ$+EXUo(m7>TKJFUfB0thxRv|rrr98!n{8_NV?WEY z^-Pa_uXD5J^&{*_pJY$*P<-9v@Qjbg#Y343k{6F2kBe75lGnMS<^eeCNT+i}{FO0h zUkQ~Stt(K~%l(k?cQ@j`a<`9#@eO%?IliwfUa?jX2aCAWd`}2x4(;-M_LcN0jaS-t zX&<2WYhMP9@hAGN_KnIly*zUIUU5uvrT(RlW6VdjNA0zG&m_+Ly~Q{71&k$r1(kio zL%lu4Z$tQ{TQ2G_~ zq7(9ubzL0tqTL?EpSMZYUz^lf_E+N-I*H3^yb61+aDUV&QxoHr&r8#N1Zx!W&F4$_ zkJhO)Zxjz@P0@IXSAHs7yz*0zGyf^)ABy{;Lmns| z%Gx14;)ypN7Z0UPk{3@okBf);dWlQ$jJa^drBil^ap~y`m@$eo)ACchZVz$h?YrX7 z+b&a_A(vwfN#hKD#$SO4fA(>Pe4ju1Oa9MZgtq^q#Tl*@u!kP~?(#YX{=>Ne=R8oK z&n)TZcf=;eICD-Imt~4GJm;`9afW+g@XIvL@a_}N!=ZjXC5|y(>>+%dk(|C)oROUN zd4_Wx^9{fMqCeQD>{q$}qR+$)f6hsKVLp?``gu(};mn9V9#nBaJXF_H@E`H~j)BL; zLw&v>o^l=+5B2r3p2Fk1!gc<`Z_M)hv5$W|#uM5jKaoAG{kH$&y8O)iTUorX@9lR_ zojuFe^iJ2`J6*50_%KZ8$!VMc=N+Ox&d?s>3Hce{D^K${-_ys!&JFQUatqmCJe0LS zIC|mR;ml{|z2-IbA`hRoM{-cN{|dho2d{Ffmwe@@-DBRuI|PMukH*3sZ4Lisqy_$l zzwcCbhC2K7$X*`D--hJ}Tm1ZNT-W|={$@7nw6E`U-iW^um)UEj{szw3V(M?;%xx&w z;x#Vh4EP8*RJi2%o^l@N+8FBvG{sXrl7sqs#V74)h=+RpujHK5-#5q{(fy?!Cyy8I z?;8Y%r<}*dLy0Epukv|+{>(hW|CvWn&cP(leuOfd8)#m$zI4j}Wp}8vTLT`uBzU+_ zSh&V9`rAzNw;121^_jmlmfhcov+ew?U3_Ewh(8)n*@1Qw@4$WBlRV%1I0jC?HlQ@!L=e01I^ z{FU6NE&D58kqa^>$=~^4pR@0>=TmG01$}0FrIr`hG=5Ggt`zoh>-u%s;ZDBoK8h?{N@J#US8-;Oip0A>ZzXEUGM~!`-85I5D zWP68(>`A-V{eAQYsBp>iJ>@)p{&vwHpear{uZMA$yssA=9(jice-Q5VYutGsA!Dd| z#Y4S+if0}4xOk}Z!|>b(Jmowt9_s7m|9s@9vcus(#7tP?x6#e`CE)@ZfL4W&h#XsBB2SdA=xnBIIw=er4Amr~NGW8)uNT zEq%U&vkr$h;~RTf;wF?FLhTeE_qt6y{QffY2pn5`d3bQvERVy3yY)2u{xy2o_jx_= zv=!>xBOa=}1^dHO9_s5A4|VnSFn8HcGS~gS5}q?JzK5pmCzl~-D)6umf~T#VF$sq! zwjuBL`{J=f+ArFD-529?!_vbzq6ggT5l_FIo`%X(u3dXvJ5M*eH6*8ctll$-Kg3P; z<7s{cPW(ypd15g8EU4dS?etXKU-3H$?6-=3_0U)RkTHV_7Z3G$vUt{2kBf);JXt*D zJT4yU>&2J&U`sxID)_h`xAz>EAOJZHi9!8<>+ z_kc04H)+o6-G|t`-hHKIn%A7kqaVupC_9UX(zXI`h=Uc)n=`QFcK_2<=^*XT?8MY}aG zWoOMd&13aTJpFQdUbT6R-gfgEoOj9mv(Ib!598?Psr;t&^Ej`u8*ewpu~ z@=wa6hxLM3DIA_ynbu2Rk%zi^!}@|exNj#s?N9J<-wt}1AF7x2i0k@SeW|)0F<%Cr zRrOou9KT}%eRR#Tztetd?@E75Jokgj4sY=FsA=cYZX?cMeb@MD+{_PI_j}|Ij3eV< zb_nZ{#>M$b@MmzwRsN#&PJUDR8_x-@+v?|Y@$&*xQf)5$lyym0)MYkKYc7JDxD+xXrI#zQtWzd8;7l%3r; z20sMnPva>+WLz0<^zes2^Ls1Y?{rM@eADh9!4J3PQ8AI7ilUuwU?&JTPs&rTVa zW#et1XjJV9_<0ZH0XM4q6&sR=8s2Ot<&Bq~&`#nHahZKf>bKy;pmu)Cnz}50>&`KP z-@@aM9v2VwekGo<^tkw?@mu^2zf~N@&a?r&_^sEEAHqX@JMksqsXTIgpUMkwH@~D$ z{)xY`uYqd66a8ww-Om=U$4wt*el>mQQu`I-&NcLQ*WGKVq++| zy6lV}VBfRt+(LH7AO4=ko%U>bdYin$*;KAtKIWf;OYHK_!V=3IP*sJEA|h}4XBSN?CXdNPZ`5yCpxnI5h>(r*^ zSNJ3!?)B%7cso2BZ11aIm>=1-F#5wYQ^$^;IA$E{5$9{f-!u;a=M2=3FZnrhgwNA& zet0b-;W`D^(U=nsw+I-{W1G(bv8I9*@xLJ+%AEB$JmwZFSf93&y=pUZ#knPn!BmYwI zUbq<>O&vRa4DZ?K%Je?!rv`7ig;g2shMmjz8V5Ysnf9G3%F1E18(UW#_`erZ1F!LN93uHAhg;JeOg^()#x`rR>(Lm4Br zhyLPooDKWJbl>U-@>@UXRmm>Z8BDUiC}% zP`%Qd>QTKaCwcU<2B04*Tza7FS3C|6&NWxzst@Yr#Y4S3# zPI6BMAL6*pi-zJV?{^o@e1~VvV4RWV1CBp{qepm*+hZ=pC*^gj<|9lGm#vT}d^!J%FF35TOuf=WTrB8l^U!pgymw5<| zzxnnc&v_-^Lw(#vUge};dQ&~(q2$q$$M2~R>T%jlee~DYD|y*NdZahiqk2_N^5|cD zPK?`7;nD-;o@9^1gWKMtiK{-SmlqH9@|0)X!J(;sl@qRhLcP3r;u+`7lE?nY5l1~P zp7C7l`pfvi6K}n|c(qshRbJ(UOTWqqS3ilzUcY#agXD#${SuEq`1Zs9=>sutL!}43 z!o5802B#lhUcCAzJsLmk;Kxz8`X_nGLH&3Ux5)#E+tAl9ZcnqgZK2<`zB8^MZu4B& z(#LK3$r?fa2~~f^Lw#N?o-y~hc&N{-#Z%7X;-S7?au|60f)DK>-{yY4bML6`LT_3x{tC{$5xzahb6t<`p^DqmqjJ(Oy{R7YP=CEr?Sy)qc2ghy z_4P_#_E5djo9a=$DkpjL^M`(@aOr`Dm}36GxQK_&+`p7peNZni9_r;O&$xp_eZ7=d zIpOLj)XR(C;@5G_lf3-u(Y4~*AY44-=KIU|!Smj0d{y$|)n4H$uX4hrU*&|WpTsS% zUp#gD_6Se=B|aT5_<4Iq9Z=PaPT^iZ?FOeGUS7QVCp{X!cH_>ts(+G~TxvJg3*HsQ zx&~d=xXrkyd9}~O8UHfhUM0Mbw70k}JmYDC_Y)z$>0Bl~rvfJ?ww_Zh-S09mUwE!Z z@f7;(s&O8X+rTUC%5Ln5=oggs7kEQ4jo9z?*fo%O7H1z?uP4jzdnO;M_W)P%A@&~N zp}`LCDeSPvTc-AnwgV&LJbQWSNbLa5{o@Ii<-|kXx*5(1;jy*H#Y0`a;XDu?JsuaYdek1B2cEeT zt%~h5|7`pF5&nFSvmTuc>mG#!Y&}znQ~V@Jut*Jtx?F9#;02J;lr39{+op zNBj;u@15RK^W`z@KWi%XXFigbruGM~kMs8oH}f^m&+%bCPYn+E828{)c*k8kvwKm1wox!v^|{GNDAJaOwzxbFp@;5rWX`fJ`Xr;x+e zk|#dA&_68yVArq0{&CNlHZJ4ixDfNPbviEK|19HDXMbW0_GKKrof#|a3)OWBKfbN& z>Gs*JFHgv)b&m

+N~r)V{tkyzjItJ9p>!yRDC{aqe5qubcDz^gFw7bGz3p;LZ8Y z@5A!!=-lb?-GUl-en0-gug2ezCx=h*D{k%&<%Ekr`Ma$+=gjEog!4P{d@ns}Pl`(q z)bD2{2lcqxuX56_@~OP^OgXSCOWVV5%3>d=_RE};bDpr@JIv-rg<}Wg=&zT*_J;l- zf6RlCN`8-@_J@5szqiYN-Q(<&!To-jelZ?5{d<4dtEgYp%btXK!x@~#0h_Wt^cVTL zKWvp34)yyu;n>5EJL7_0o{waYq5h!r8Rs zg{SRDFMBogKzT1A_QC$_C$TeBIQ>G7etCJ>EA5wXsP{w3rR|Zu()NqT554`7XP&11 zDc;MIC(z%6en8wFWwXA#FXi!nvHbRPs9o z9;$T#dGVCv|nlm@yxeJc-nsSvd2RYRB;$Pv$w;}P~r3oIr`=0Wv{ef!lB*|C6~5G_Db6? z9zXQ`q#3==c_DF zWBj3-7sLUse?Z-HTRp<@cP}p<|Mxilik?n5e(SHZFfS;d;?e{4?}d{b)Z=QW%Bf!} zpUO)QexA06dQpZPkgxllQ9lMr5~JobBP;J z;TjL(nZLe6z2vFX>+@Cm%lHxJyu5Je=y$iqbL6pyA9uzDy~IDSM>zKJ^~%0buV3v> z+ap~4(0EBM?U&j?JoD`lp0*#ov-gemfhrDTXRd`}XQ*)cg&h6z^0HUjFX2${hmuR% zBYUOo7mpu$`ya-(lCeX1+aK z=OVVSZl>o;1J8>2fZ?`#iSN7SK4H#S_!QT1#_)g6Nw}ZY;X3#0(fi>awp@dAR?Q=F z46da?-M;1xea`I9m)KkKM}N7m@BMbZbXIY`G}F$P#uw*H&km0JqDOjK&zII&6!%dD z9_-9KTJ4PX`_M^qcTM^O;s$Jn@hDs_`Q3QU1lVThF!7 z!`_i{P%jUUyvNlZ=;^zZ^3uz@r+vLD&%0tdH;{hhD4)u!oy2FaNBx2N`$i-OZHK4& z)qd$yd!#4DRbQ%~c82pTvyVU5!k+Nh)8pu&ztB^rmUcidIMn0F>0B%A7kJtp=}|rE zm-O(x&QI8Kdl6TRezzWw5nXY8d%@=)JS@yuh7 zOHVql#cO^`Klv)>$P4d@w8%djij$xEkJfW1#nmHbww^n|bH2oQ>U;@*rao}=2#;}l zPm9~dzUD#VcHGxU|0|8#oOcnA()_0`Zj+ZY{(k==p7Hm%c*d75XYQOZQ zdQx2VrTS@S*hiUt{C*01!edX5qlf-Nc@D|f3yyw|BS)UC`n^1O+8%i6he}?0_+EMY zKWp5^F2q;whvGF4WH-$R;;@$&k6pc;rAOaO4|)%n9p@KRIQoVA`GsEmpq)Q}Ydob# za(;Xjx6w;{_3amryl=neJJh#RJoDJ&(v!|>@tWUiCvlrS25}qu`o!(Q_Pfb*@*|4p zAK$U^)P~*9Hj(^!$-;QwQo7&aUJv#n1s<;BEZ^_Mcx!Rvuil@=*z(7?bG>E*+wc5O zvEO;e)Txc$V!w0a^)H9~DqS~c?qvn-kr`@Ya2e_^bL_ zan2{v(+Qt6FMcn77SDR(_fygX_3M}9p&nQJRW8-9ehZi0R1f`PpFsQle&LZ}G2ggs zn@DwDcj~TjpR?P+t=GrFS+~Ib`b9s{JK^W8`;;x_N4=w;X}w;r@py90*8Grml26i3 zpRdv{#_z%%TIGe)Uq8OIhw|f&Zk1PksUG2~U-pz-+8*iM=(nxc!G)*o(YQc;Jl8lu zJubOUxcaSjN)DRZfxMh?fogo|Cp`V~IOEH;WX2aNdCjY|zv#uzvbWkJIejl&{tE8r zg?K+-h{LqA-SzY*SFfI9khe^ED!yl&b5XzFyyUisvo87lop`9;d)gjDzez zJHVmsaK?YNmrA>d$8SB(d_YepoO!|bs#iSz)=m%l!n18=R@M>8Lp`qctNv6!{q^-q zZ>ooWt@Vf4eyHXh@tJ28h|f^r%u}A(V4gxf&NEoxP~r3wz05POpZJVk;i}52~dU@gW*N-plp*-=@%d5Urk8stmdL@^(M|z1vUcd0PJsKA% z&umJ+#tG_i$#ufjZ?A{)X}#Eidu13GsK$$a!qYF0Gwz&?F}_gAYhI=OMK5-iz11Gc z>3iYwS8zWs#G^+z@%iqJ`}5~l?5dnsERWAI4!`#C`QHBj>Hd6-&)*91dBU>B=PS1A z3h|k1f$|69064TAj-M`kYxq6r5GTdsw;pFcpr;egyx@D)D;|Gqrw4uCvE#N>o^l>n z`&EA`kH7nRr8m_>zs{c++Yi;eBR*f!u-~V%_zV@!Jmnn_%u}ex@7OTnP~r3wz05PO zpZJVk;8kl7(e2rmlsZd{rJ)z$`dcWyy{E!2v_~8S8{24 zq?b74^$Sniqj7jlb;8weuZQw!z1V?Vka2-(yyz!9{qi{D&b0x?9V&VJ z4Ev`2MK5-iz11Gc>3iYwS8zWs#G^;J^5os|-_=(T9;_Loj)YAzk z&iOo6{H>$Pd;tB@1NC{bmNyqUP=^Jj4KW^kWB(@*rypVHluKa>BEH_v-}cT4`P@%X}*Uv9~7X(#y@?ezIG z{bKyspZR=MIQ{kGOM56!9P;w2FV!Pl^~;`;OWPy82kg<^l0OSi+oN%T`aD_V1ogP& zI^pWK+9^3`Y6tRT#>MB!^b?+bd7SYjZ)SXb{;YYG_7}a_S@u?YB&Y9%%U{8jCo?a^ z`}snAKJV_A+vd*;?&}ZlvGVt6uup&dU*mbfO?J-U&o{^uI7i_6p+8R$5B295;wk5G zu6y#l0MwsvuwHVm!Mf(pH&h<#&o{(FeS5h6f!uYQbwir@8~Wi@uCQlA@o>%eM0uTW zD1JV7Ve9$EpFSMVH<*7q$G~ok3+EfFoZNc8ar=@V_3t|1(vUyT+BwAMapcd^pPp~1 zJ?-K%c_;O3_scRrp&j7Rb~t`YeklJDkKcNn`GB5IIP=2iz2fn=c6!jqzD@N?9_n$m zU-hT*^w-xby{R7hb<-xX{ZPeW;xlG+_E4U9>E%^lsz0d=BRu z%Mzd2KQsR9*W?ex0dQzLobf+-av3MZ>Fu6RP&DbjQ{#9we9hv_GJnP*-<@fp3u zXRlx5L0t6b7-2qsBgT#MjjF%&i}52~dU@gW*N-plp*-=@%d5Urk8stmdL@V5e0!vq zIOO#UPurt$f%4WC^8r1baOMTyOOJT`t(_k9ZT7CJJmoyD_N)F>KmGOf zN^h!%esS*GS~{!`S_G0T0g;aelSaGfP6Ax6a}vE%~bW zE62Cy!{W)){q;5UkT-1f$0hkf%PZtp=sDl=1j<2$i@$U`%S)ZS+9Q3Er#|$rd0M2x zu^W1yU131TM}$irI_F1ay($m&xZ0hzN4WYS{gP8X!lj?{D&H^hYOmy_7y7}w%65v! zP99fzsK;psc_j7wd{X^S`zu`K)E>#DdQ=~F_Vvo{Pp&c`+~X@f>TimRzkAq#mg|Gm zhd)t|&kw~@kH_UFwBP%o^q}A4>L=8nYl&~CNA~pc=!aK5>aWVT!zJ(aFuv@U7+=3{ zqQCI;*W>Dc+As0mp2TPL^XzV#KhOPs`}^y7X9efEyvNa>KlAS=QqRe zby8mMy^(#m7oGEGs6T(^o<`1{)Av8CJe0U4J>sFhJ-iDIxlNvJJ%1*if~%bL%-7cB|<`3rW8`+nibvp+}PpEqV7h;ok%9^kLzHxzF#?2B<%=i7?UCwwo) zX>iW589(CxWn%_3<2?9L4=)Mp0{-3_|37Q-|GOdn@AcLY|3iK*{Yw-7k9nKjA7cK( zGuyI{c>L4j;_-LNNuKs`4-FJx)7V z2dUq$v+94^U*RgJ_DC+(qx!J3uUB>_uD9!Nii^kJ{Www|<4!%^-^5do$K@xq-}|BT zpx@)_C)A&tiEpPz_Vn`ThgUtao65JtCGYhxzQkw77pgczf8pt`$JPI|U*f$ziT?u! z#(nJa_}@AHlTQ%Op|U^mpLbgj|DnQ(|D0nY@6R)d|Hu*lo&4(%|M#`{zj`;nH?i00 z#Q(mroX;#v{D1W0G5+6Rw;Rfz@lSaC)8pdtcgjhg`N%b1;w9ITg`;QI0WtnVg`)?a zIO^rmgI?*AJoTZU`2`iud_fQM!|RtkbhG12d6kEHTQs!lj>h@B1ZQ z?UlUrLiaeRY^V4T9~`doAx=1)cCg>4et$lr{-^yFu5xORuWqJNzm;ZB~MLdVf{>1+WFOBgZDxCPw zIVtk~yp;Hl9P!`DzYg(#hQZxz-XKOPs4zf(@~ z%t!9AC0-u1cWWHuo+HXZB`=;h>gCacUg?uO^`W2n1r^SGK`-;e>z6!qyCX_@m4|v< z?M~Yx9D8{El2biukMtAoeZR!3y^@z+=-gRlJH=xskE=Y?w_7iW|Hu*lo&4(%|5vm4e`t*Vi$nY$zpVNHPEW-6&oc<} zXZ#bM_~UW$_&en!&wS*XBJq-Ilfu!%GcA;Z3Kvft_44RJuk=Zt`q0n(f(mE8pqKgK z^-CUl$EKyc%0oS_cBkzTu70Rq$*CUU(oeki{SvSCN?v-QPY*5IDIPm{T;-u2ryX3Q zqkgFLtN&?#g{z$8C70?^ec0L8E4vfd+x0ia#S^dmI8qB?(GRbBWH*&>hfCh;VSITOi1CH`_zzEiJ+A(z{Sxo(sq>#j z1G<;T|C;mvX+MeaA1eD3|9R$$_zx9M{Gao^C=V4*{6~)X@8nR-tpKPTx}_@|ME_CJ_X*q{>$&Ef$#d?t=Cz^Ly?i6i|6-lJT4yU z-}5P+avm2CrGDuTzZzsbvV6etXWr2=>fP1%l=9oM{qJvmZ%?Q9aB{tycmJNblRX!2 z)IaaQdrGkw??!@BFV|oAtv&jQtlDJ%ZRr2#;#0K0`TkPb6`bE|d#?Yv{%yP04A*OB zzkjM-u5X0*roI;A<$edP2m7}99j+e6MY#HF{R%idl{W&A!XVYg~NKt;XxA!Q-vj)%jK6&G~iBH}dS`_BP!8Cuh*^#oa^R zZ|&&;Kkkt{;6~Td?=woi_lk7mtgFVq3|JM~}zFs~*W~zF$0nR<({J_33vw`HuE;&6hHKr*Q{o%(*_Q zu}A;#ERN&JUFU?~4Vk^f#?gLPi#&O0$MJzL=GiIc1LMuEMw{aZe%=Flz>PM?QS!z2 z&2gl>IgaDWHjWcVhkdK& z<3C#7a{FhqZ2JCHfB4S7<@xg;ZuJMh4)U&6|Grk<$IkEALH)YS?=+Ev;9F4Qp4P#? zJ#U$sUG$gL`u8o)8TS6l)bYJz`oehqV8izJ8P5Ig077-;KEo~M#r@uHd$;ZrXU&ZJ z_FJ}WJs$vPzehR0j}tF_T1PndM((LgGtx&%oRC%b!)i0IvdXP)yrAKy>{Dj{w$=T;Tv--<{YX1Vxeg@p{Yp@UdPwe3L zp)Xz#_ea0^c%;%J9?CmSQhd%&TIIzYv{i zPdShCK19|7sK2jrJA0;?JrKVO1eHIiJe0P09A51b&i$F-x{pyf=UtMA7I;JPU-v)i zzDKPW+r6vxzDME|_dRx>(t6)x?{V?IN9JXD-{aKmqksALmk$_tZ#ehf`}eFzjqp3I z(*KUNTkm^UdkVa{FQZ=G(ZD$KjEVZicyrAdzkqt2XCx?h%8uRYZ;yEClRWK44!@>c zit|173zr=J@8$7t^mM}UbKf4?P5DkZ{cES6dam5EY^TaYJ+6MKU24C|r}EMxJ4v2( z=j`pe!@2|2dI5fEZ^WU(u@BF#U+Uw9JN^>Z$Min@qjs?$O14k>92V;r`}K0_WNezOIw@@kLtY5r0l`mesFHSaq8zNmM< z2g`g3{gQ|Jyiw($9#^~5_6S!$)E>#H9^ume!Ed$pOT5}EdFh4vJWxD#^0>-FJx)8w ztEu1T?dpHpU*RgJ_DC+(qx!J3uUB^8 z{oW6y2mKybKcVS97rvby+0)CTA71syZYtjnm%P`*__Cj5eEq(X{=(B=kE{P_zr=fc z5}z-5Yy17eKl*c6m)sD~fiy0xi^RS3IjsH<#dC=p{v%T5Z+C1S_y6m^uk{=NdCn=2 z_vaNC-5KSkJle9aZz$gOzZBb}{fOdo_nTVxBa9#Wk(FL--H*JqYTS?D@8y1E$7~DR zk33rJNA@|I_#gKp(x2`})Sh%df?o1?{L$y<;_*+9i^t!6{*NB=4C1BF>(E2KNI9Q3 ziYJbGd9_FSG>+7Ve&(0YXP7VOWqx@5l85?yN#&s)SG&{p2v$mb8{_Nu zar76S{(4;fPx~d_+mrZz{^a)g`SSQ5_v6HK_W#6le-1$WXFp8*_xobxITt|QpAQiK zkt6;)`PVr9ubTa~e~*0AuA9R3tbIN|b^I(_<65svayr-UK7oLT^Cq?jZ+te&yb#%5uaX&+2isA1ZlU;t2;r9Jd@Zs6u?DqcK`xkWY8t!}9 z=Qnnr(mua1`*dgghB%+c)(F3Q8|;AHxG%@y;dg{X9%av5QYO8hnSRaMk2B8leiH1X z`wF;b#z%IL-FVJD#W^|D_g?wP?f=-+R^yAx?2 z@5J@(eedy(^mwNeN|IhY+w*P(I2M7D_+iUjUchoZ3pJyKVU7vp> z`{O6ChMoO5PC2lv`JD3bY)E!||MC4Nbzc*wx`OK44=$ z1>QWb)_gquo>)%53ojnZT=qEpM*rK2i-)39^5W6saq+50@|s_YAK=W>i^p|^_pzpa za^ZF{_V{^<-#)Wiyuan_N%oF!YcC(h<%x@9yP-r%)ysPx@Ne$dgMxeebB{iM%nOh6 z?oYk{lX2Olf0zCbcYh;}%U75eU;2k0mv`-EzsE4W`aB5Z!aa7cWL&&G<>wlgWgV{% ze$9Tr%>EcJ#$}cMRr+u5{!<*6KiPa4|BpRiRy?&UTYbT+H!hsb@R!buzh%4_mup_W z=H*{??;oza?KghvA2kTmhOzdzt?fm z{ia%TXy>apF6(F4^&gP$)Afb0FWB!6TVM9O+4L`JJi9Q<7FkYx%M)2P#O|BrW9wbx z+9$K@>BsGNd!Nm+YoE^ZCH6Cc;NqeCt(RpUho{{7Hc^C&mpcD@ptu#hx&GkryTuIz2c=$`0*R$IqiVbF4{wX zNB^hYH~!T;hfdiow$tz)@sCW%bB~LMQm)X`BVPKXf8uvd?*sNbi3=l@y!h;lEW7&a zO+Ae%-?sLQv;B|BL%lpa@&`?cxNTOtF8G>Z_PKiEBfUn#{snx&t}$;b@aDenlHQo- zJhaZ0CO&D8oo7rXk6I6$y-94t~4;4(7M}Hf`g%?~L*J#;>);=S2s`_&nO4i}Ce}hx+&|o^n1u zi68Coc|nZJj0166{xANh z$*uAE`txI4=6fHX#Ut{0V8!=WCRyuO#;s=SvcKL3lw=VOcbd;szJfWGB^>*DiL`fWpgi=TLZ7BByme~Op? z%0I#M&eM_S zy}2s`hk9J{`d)sn@?IW4KcauX{8L@mhCJi|;`0GtCO;f`*|+TX5-zjfO*VS%k!8K& zkJ`b`c^obtN;%alUi!ev(|TXPI>d|{c_OWuzy09N(QXAE>}Kt0Okdl6C;eHwC)fJ> z;FHbsw1#--xVJRVuL2HFx#QO^aq-eu>_-~+{YPAnE?L#`x{;x2Ay2;L+5VjJ*w5=1 z5B2R4PdVCK?8_SBrBC%9WA_uYFPJ#9W!>q?7H8QL=b0^5wBHmrD*qP`UHHu=-Vh(C zo$-13g~o$#V$Vi-9G-ew@PY@YTp`~OA81)`XeaFe_wD4j+n)NeopG97p{iH>K-;q2 zdqIgKKVlC%qcnM_mxo7whZ7^tKAQ6f&MO~UXM}a4%;%Y3d{^KhpC6vBn{C{`eg5BF zw#hITKX4NNj0=8#uD#0*e}#H~7Js^(ae7=l)cd)3>7)I`2mFlBlKXz9xs%LHK#+1_vhMnxwb$Nz zt+k(LpK}*~Y=x0*{ze=){I?Y6Prg8L{$y>KaUSAX@!t@iX&e)84iE9Ecy@7E8)h5^ z`R6YV>2K#+e|vX~!!HqscV+$U9e*49+l75uy9oU-JpHK0#Y0J#wwEKt)87hz@%6Va z&NzJg`q)&J0M3LkENd&NzeU)sVYdfa)K+KaZ{UOfJoMmx-W>1LoCs$a%XLSzLY?9`C zr1<6MS%2wp@qt=8$%~gh@W%eOd~x&sHsJrO`&-4ckDr(0d?ax`KKbYV)9OdI{8fze zuMy{;Wsq;t`uEJ)jr)^Y|E9R&uO8X60;Fe#)Wzm9O7hf(94{cV?X62_G z%Ab6(Gd5mz^1ylc(O1;#r~F~#Jbbe4U#*!N{dMza?A;>Hk13x(&HtlQ{|0&DA;q&e zK@WJU?={Ht9+Cz>{sKS#%gcT =c(K5lb_W%CF6am+RL{;5Cs?fcR9t7lziemra4 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 literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/with-zener.png b/adb2usb/uart2usb/vusb-20100715/circuits/with-zener.png new file mode 100644 index 0000000000000000000000000000000000000000..598441fb2e902efae32a47461078042437335bb4 GIT binary patch literal 12364 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 literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/circuits/with-zener.sch b/adb2usb/uart2usb/vusb-20100715/circuits/with-zener.sch new file mode 100644 index 0000000000000000000000000000000000000000..624177a7d611271c2c008539e8a4022e0d94d4d1 GIT binary patch literal 225497 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 X-d^SaSSzP9!1B+ZjUVubLyi9c@AfUg literal 0 HcmV?d00001 diff --git a/adb2usb/uart2usb/vusb-20100715/examples/Readme.txt b/adb2usb/uart2usb/vusb-20100715/examples/Readme.txt new file mode 100644 index 0000000..82b10fe --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/Readme.txt @@ -0,0 +1,102 @@ +This is the Readme file for the directory "examples" of V-USB, a firmware- +only USB driver for AVR microcontrollers. + +WHAT IS IN THIS DIRECTORY? +========================== +This directory contains examples which are mostly for educational purposes. +Examples can be device firmware only, host software only or both. Here is +a summary: + +custom-class + A custom class device with host software based on libusb. It demonstrates + the straight forward way of sending small amounts of data to a device and + receiving data from the device. It does NOT demonstrate how to send large + amounts of data to the device or how to receive data generated on the fly + by the device (how to use usbFunctionWrite() and usbFunctionRead()). See + the hid-data example for how usbFunctionWrite() and usbFunctionRead() are + used. + +hid-custom-rq + This example implements the same functionality as the custom-class example + above, but declares the device as HID. This prevents the "give me a driver + CD" dialog on Windows. The device can still be controlled with libusb as in + the previous example (on Windows, the filter version of libusb-win32 must + be installed). In addition to the features presented in custom-class, this + example demonstrates how a HID class device is defined. + +hid-mouse + This example implements a mouse device. No host driver is required since + today's operating systems have drivers for USB mice built-in. It + demonstrates how a real-world HID class device is implemented and how + interrupt-in endpoints are used. + +hid-data + This example demonstrates how the HID class can be misused to transfer + arbitrary data over HID feature reports. This technique is of great value + on Windows because no driver DLLs are needed (the hid-custom-rq example + still requires the libusb-win32 DLL, although it may be in the program's + directory). The host side application requires no installation, it can + even be started directly from a CD. This example also demonstrates how + to transfer data using usbFunctionWrite() and usbFunctionRead(). + +usbtool + This is a general purpose development and debugging tool for USB devices. + You can use it during development of your device to test various requests + without special test programs. But it is also an example how all the + libusb API functions are used. + +More information about each example can be found in the Readme file in the +respective directory. + +Hardware dependencies of AVR code has been kept at a minimum. All examples +should work on any AVR chip which has enough resources to run the driver. +Makefile and usbconfig.h have been configured for the metaboard hardware (see +http://www.obdev.at/goto.php?t=metaboard for details). Edit the target +device, fuse values, clock rate and programmer in Makefile and the I/O pins +dedicated to USB in usbconfig.h. + + +WHAT IS NOT DEMONSTRATED IN THESE EXAMPLES? +=========================================== +These examples show only the most basic functionality. More elaborate +examples and real world applications showing more features of the driver are +available at http://www.obdev.at/vusb/projects.html. Most of these +features are described in our documentation wiki at +http://www.obdev.at/goto.php?t=vusb-wiki. + +To mention just a few: + +Using RC oscillator for system clock + The 12.8 MHz and 16.5 MHz modules of V-USB have been designed to cope + with clock rate deviations up to 1%. This allows an RC oscillator to be + used. Since the AVR's RC oscillator has a factory precision of only 10%, + it must be calibrated to an external reference. The EasyLogger example + shows how this can be done. + +Dynamically generated descriptors + Sometimes you want to implement different typtes of USB device depending + on a jumper or other condition. V-USB has a very flexible interface for + providing USB descriptors. See AVR-Doper for how to provide descriptors + at runtime. + +Virtual COM port + Some people prefer a virtual serial interface to communicate with their + device. We strongly discourage this method because it does things + forbidden by the USB specification. If you still want to go this route, + see AVR-CDC. + +Implementing suspend mode + V-USB does not implement suspend mode. This means that the device does + not reduce power consumption when the host goes into sleep mode. Device + firmware is free to implement suspend mode, though. See USB2LPT for an + example. + +The projects mentioned above can best be found on + + http://www.obdev.at/vusb/prjall.html + +where all projects are listed. + +---------------------------------------------------------------------------- +(c) 2009 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/Readme.txt b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/Readme.txt new file mode 100644 index 0000000..815518e --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/Readme.txt @@ -0,0 +1,64 @@ +This is the Readme file for the custom-class example. In this example, we +show how an LED can be controlled via USB. + + +WHAT IS DEMONSTRATED? +===================== +This example shows how small amounts of data (several bytes) can be +transferred between the device and the host. In addition to a very basic +USB device, it demonstrates how to build a host side driver application +using libusb or libusb-win32. It does NOT show how usbFunctionWrite() and +usbFunctionRead() are used. See the hid-data example if you want to learn +about these functions. + + +PREREQUISITES +============= +Target hardware: You need an AVR based circuit based on one of the examples +(see the "circuits" directory at the top level of this package), e.g. the +metaboard (http://www.obdev.at/goto.php?t=metaboard). + +AVR development environment: You need the gcc tool chain for the AVR, see +the Prerequisites section in the top level Readme file for how to obtain it. + +Host development environment: A C compiler and libusb. See the top level +Readme file, section Prerequisites for more information. + + +BUILDING THE FIRMWARE +===================== +Change to the "firmware" directory and modify Makefile according to your +architecture (CPU clock, target device, fuse values) and ISP programmer. Then +edit usbconfig.h according to your pin assignments for D+ and D-. The default +settings are for the metaboard hardware. You should have wired an LED with a +current limiting resistor of ca. 270 Ohm to a free I/O pin. Change the +defines in main.c to match the port and bit number. + +Type "make hex" to build main.hex, then "make flash" to upload the firmware +to the device. Don't forget to run "make fuse" once to program the fuses. If +you use a prototyping board with boot loader, follow the instructions of the +boot loader instead. + +Please note that the first "make hex" copies the driver from the top level +into the firmware directory. If you use a different build system than our +Makefile, you must copy the driver by hand. + + +BUILDING THE HOST SOFTWARE +========================== +Since the host software is based on libusb or libusb-win32, make sure that +this library is installed. On Unix, ensure that libusb-config is in your +search PATH. On Windows, edit Makefile.windows and set the library path +appropriately. Then type "make" on Unix or "make -f Makefile.windows" on +Windows to build the command line tool. + + +USING THE COMMAND LINE TOOL +=========================== +The command line tool has three valid arguments: "status" to query the +current LED status, "on" to turn on the LED and "off" to turn it off. + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile new file mode 100644 index 0000000..aaa948a --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile @@ -0,0 +1,48 @@ +# Name: Makefile +# Project: custom-class example +# Author: Christian Starkjohann +# Creation Date: 2008-04-06 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + + +# Concigure the following definitions according to your system. +# This Makefile has been tested on Mac OS X, Linux and Windows. + +# Use the following 3 lines on Unix (uncomment the framework on Mac OS X): +USBFLAGS = `libusb-config --cflags` +USBLIBS = `libusb-config --libs` +EXE_SUFFIX = + +# Use the following 3 lines on Windows and comment out the 3 above. You may +# have to change the include paths to where you installed libusb-win32 +#USBFLAGS = -I/usr/local/include +#USBLIBS = -L/usr/local/lib -lusb +#EXE_SUFFIX = .exe + +NAME = set-led + +OBJECTS = opendevice.o $(NAME).o + +CC = gcc +CFLAGS = $(CPPFLAGS) $(USBFLAGS) -O -g -Wall +LIBS = $(USBLIBS) + +PROGRAM = $(NAME)$(EXE_SUFFIX) + + +all: $(PROGRAM) + +.c.o: + $(CC) $(CFLAGS) -c $< + +$(PROGRAM): $(OBJECTS) + $(CC) -o $(PROGRAM) $(OBJECTS) $(LIBS) + +strip: $(PROGRAM) + strip $(PROGRAM) + +clean: + rm -f *.o $(PROGRAM) diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile.windows b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile.windows new file mode 100644 index 0000000..a8239ad --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/Makefile.windows @@ -0,0 +1,18 @@ +# Name: Makefile.windows +# Project: custom-class example +# Author: Christian Starkjohann +# Creation Date: 2008-04-06 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id$ + +# You may use this file with +# make -f Makefile.windows +# on Windows with MinGW instead of editing the main Makefile. + +include Makefile + +USBFLAGS = -I/usr/local/mingw/include +USBLIBS = -L/usr/local/mingw/lib -lusb +EXE_SUFFIX = .exe diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.c b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.c new file mode 100644 index 0000000..137f50c --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.c @@ -0,0 +1,203 @@ +/* Name: opendevice.c + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.c 740 2009-04-13 18:23:31Z cs $ + */ + +/* +General Description: +The functions in this module can be used to find and open a device based on +libusb or libusb-win32. +*/ + +#include +#include "opendevice.h" + +/* ------------------------------------------------------------------------- */ + +#define MATCH_SUCCESS 1 +#define MATCH_FAILED 0 +#define MATCH_ABORT -1 + +/* private interface: match text and p, return MATCH_SUCCESS, MATCH_FAILED, or MATCH_ABORT. */ +static int _shellStyleMatch(char *text, char *p) +{ +int last, matched, reverse; + + for(; *p; text++, p++){ + if(*text == 0 && *p != '*') + return MATCH_ABORT; + switch(*p){ + case '\\': + /* Literal match with following character. */ + p++; + /* FALLTHROUGH */ + default: + if(*text != *p) + return MATCH_FAILED; + continue; + case '?': + /* Match anything. */ + continue; + case '*': + while(*++p == '*') + /* Consecutive stars act just like one. */ + continue; + if(*p == 0) + /* Trailing star matches everything. */ + return MATCH_SUCCESS; + while(*text) + if((matched = _shellStyleMatch(text++, p)) != MATCH_FAILED) + return matched; + return MATCH_ABORT; + case '[': + reverse = p[1] == '^'; + if(reverse) /* Inverted character class. */ + p++; + matched = MATCH_FAILED; + if(p[1] == ']' || p[1] == '-') + if(*++p == *text) + matched = MATCH_SUCCESS; + for(last = *p; *++p && *p != ']'; last = *p) + if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p) + matched = MATCH_SUCCESS; + if(matched == reverse) + return MATCH_FAILED; + continue; + } + } + return *text == 0; +} + +/* public interface for shell style matching: returns 0 if fails, 1 if matches */ +static int shellStyleMatch(char *text, char *pattern) +{ + if(pattern == NULL) /* NULL pattern is synonymous to "*" */ + return 1; + return _shellStyleMatch(text, pattern) == MATCH_SUCCESS; +} + +/* ------------------------------------------------------------------------- */ + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */ + return rval; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING){ + *buf = 0; + return 0; + } + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1: */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + +/* ------------------------------------------------------------------------- */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USBOPEN_ERR_NOTFOUND; + + usb_find_busses(); + usb_find_devices(); + for(bus = usb_get_busses(); bus; bus = bus->next){ + for(dev = bus->devices; dev; dev = dev->next){ /* iterate over all devices on all busses */ + if((vendorID == 0 || dev->descriptor.idVendor == vendorID) + && (productID == 0 || dev->descriptor.idProduct == productID)){ + char vendor[256], product[256], serial[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot open VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + continue; + } + /* now check whether the names match: */ + len = vendor[0] = 0; + if(dev->descriptor.iManufacturer > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, vendor, sizeof(vendor)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query manufacturer for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen device from vendor ->%s<-\n", vendor); */ + if(shellStyleMatch(vendor, vendorNamePattern)){ + len = product[0] = 0; + if(dev->descriptor.iProduct > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iProduct, product, sizeof(product)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query product for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen product ->%s<-\n", product); */ + if(shellStyleMatch(product, productNamePattern)){ + len = serial[0] = 0; + if(dev->descriptor.iSerialNumber > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, serial, sizeof(serial)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query serial for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + } + if(shellStyleMatch(serial, serialNamePattern)){ + if(printMatchingDevicesFp != NULL){ + if(serial[0] == 0){ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product); + }else{ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\" serial=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product, serial); + } + }else{ + break; + } + } + } + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) /* we have found a deice */ + break; + } + if(handle != NULL){ + errorCode = 0; + *device = handle; + } + if(printMatchingDevicesFp != NULL) /* never return an error for listing only */ + errorCode = 0; + return errorCode; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.h b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.h new file mode 100644 index 0000000..79c12f6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/opendevice.h @@ -0,0 +1,77 @@ +/* Name: opendevice.h + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.h 755 2009-08-03 17:01:21Z cs $ + */ + +/* +General Description: +This module offers additional functionality for host side drivers based on +libusb or libusb-win32. It includes a function to find and open a device +based on numeric IDs and textual description. It also includes a function to +obtain textual descriptions from a device. + +To use this functionality, simply copy opendevice.c and opendevice.h into your +project and add them to your Makefile. You may modify and redistribute these +files according to the GNU General Public License (GPL) version 2 or 3. +*/ + +#ifndef __OPENDEVICE_H_INCLUDED__ +#define __OPENDEVICE_H_INCLUDED__ + +#include /* this is libusb, see http://libusb.sourceforge.net/ */ +#include + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen); +/* This function gets a string descriptor from the device. 'index' is the + * string descriptor index. The string is returned in ISO Latin 1 encoding in + * 'buf' and it is terminated with a 0-character. The buffer size must be + * passed in 'buflen' to prevent buffer overflows. A libusb device handle + * must be given in 'dev'. + * Returns: The length of the string (excluding the terminating 0) or + * a negative number in case of an error. If there was an error, use + * usb_strerror() to obtain the error message. + */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp); +/* This function iterates over all devices on all USB busses and searches for + * a device. Matching is done first by means of Vendor- and Product-ID (passed + * in 'vendorID' and 'productID'. An ID of 0 matches any numeric ID (wildcard). + * When a device matches by its IDs, matching by names is performed. Name + * matching can be done on textual vendor name ('vendorNamePattern'), product + * name ('productNamePattern') and serial number ('serialNamePattern'). A + * device matches only if all non-null pattern match. If you don't care about + * a string, pass NULL for the pattern. Patterns are Unix shell style pattern: + * '*' stands for 0 or more characters, '?' for one single character, a list + * of characters in square brackets for a single character from the list + * (dashes are allowed to specify a range) and if the lis of characters begins + * with a caret ('^'), it matches one character which is NOT in the list. + * Other parameters to the function: If 'warningsFp' is not NULL, warning + * messages are printed to this file descriptor with fprintf(). If + * 'printMatchingDevicesFp' is not NULL, no device is opened but matching + * devices are printed to the given file descriptor with fprintf(). + * If a device is opened, the resulting USB handle is stored in '*device'. A + * pointer to a "usb_dev_handle *" type variable must be passed here. + * Returns: 0 on success, an error code (see defines below) on failure. + */ + +/* usbOpenDevice() error codes: */ +#define USBOPEN_SUCCESS 0 /* no error */ +#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */ +#define USBOPEN_ERR_IO 2 /* I/O error */ +#define USBOPEN_ERR_NOTFOUND 3 /* device not found */ + + +/* Obdev's free USB IDs, see USB-IDs-for-free.txt for details */ + +#define USB_VID_OBDEV_SHARED 5824 /* obdev's shared vendor ID */ +#define USB_PID_OBDEV_SHARED_CUSTOM 1500 /* shared PID for custom class devices */ +#define USB_PID_OBDEV_SHARED_HID 1503 /* shared PID for HIDs except mice & keyboards */ +#define USB_PID_OBDEV_SHARED_CDCACM 1505 /* shared PID for CDC Modem devices */ +#define USB_PID_OBDEV_SHARED_MIDI 1508 /* shared PID for MIDI class devices */ + +#endif /* __OPENDEVICE_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/set-led.c b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/set-led.c new file mode 100644 index 0000000..3f167dc --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/commandline/set-led.c @@ -0,0 +1,135 @@ +/* Name: set-led.c + * Project: custom-class, a basic USB example + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: set-led.c 692 2008-11-07 15:07:40Z cs $ + */ + +/* +General Description: +This is the host-side driver for the custom-class example device. It searches +the USB for the LEDControl device and sends the requests understood by this +device. +This program must be linked with libusb on Unix and libusb-win32 on Windows. +See http://libusb.sourceforge.net/ or http://libusb-win32.sourceforge.net/ +respectively. +*/ + +#include +#include +#include +#include /* this is libusb */ +#include "opendevice.h" /* common code moved to separate module */ + +#include "../firmware/requests.h" /* custom request numbers */ +#include "../firmware/usbconfig.h" /* device's VID/PID and names */ + +static void usage(char *name) +{ + fprintf(stderr, "usage:\n"); + fprintf(stderr, " %s on ....... turn on LED\n", name); + fprintf(stderr, " %s off ...... turn off LED\n", name); + fprintf(stderr, " %s status ... ask current status of LED\n", name); +#if ENABLE_TEST + fprintf(stderr, " %s test ..... run driver reliability test\n", name); +#endif /* ENABLE_TEST */ +} + +int main(int argc, char **argv) +{ +usb_dev_handle *handle = NULL; +const unsigned char rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID}; +char vendor[] = {USB_CFG_VENDOR_NAME, 0}, product[] = {USB_CFG_DEVICE_NAME, 0}; +char buffer[4]; +int cnt, vid, pid, isOn; + + usb_init(); + if(argc < 2){ /* we need at least one argument */ + usage(argv[0]); + exit(1); + } + /* compute VID/PID from usbconfig.h so that there is a central source of information */ + vid = rawVid[1] * 256 + rawVid[0]; + pid = rawPid[1] * 256 + rawPid[0]; + /* The following function is in opendevice.c: */ + if(usbOpenDevice(&handle, vid, vendor, pid, product, NULL, NULL, NULL) != 0){ + fprintf(stderr, "Could not find USB device \"%s\" with vid=0x%x pid=0x%x\n", product, vid, pid); + exit(1); + } + /* Since we use only control endpoint 0, we don't need to choose a + * configuration and interface. Reading device descriptor and setting a + * configuration and interface is done through endpoint 0 after all. + * However, newer versions of Linux require that we claim an interface + * even for endpoint 0. Enable the following code if your operating system + * needs it: */ +#if 0 + int retries = 1, usbConfiguration = 1, usbInterface = 0; + if(usb_set_configuration(handle, usbConfiguration) && showWarnings){ + fprintf(stderr, "Warning: could not set configuration: %s\n", usb_strerror()); + } + /* now try to claim the interface and detach the kernel HID driver on + * Linux and other operating systems which support the call. */ + while((len = usb_claim_interface(handle, usbInterface)) != 0 && retries-- > 0){ +#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP + if(usb_detach_kernel_driver_np(handle, 0) < 0 && showWarnings){ + fprintf(stderr, "Warning: could not detach kernel driver: %s\n", usb_strerror()); + } +#endif + } +#endif + + if(strcasecmp(argv[1], "status") == 0){ + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_GET_STATUS, 0, 0, buffer, sizeof(buffer), 5000); + if(cnt < 1){ + if(cnt < 0){ + fprintf(stderr, "USB error: %s\n", usb_strerror()); + }else{ + fprintf(stderr, "only %d bytes received.\n", cnt); + } + }else{ + printf("LED is %s\n", buffer[0] ? "on" : "off"); + } + }else if((isOn = (strcasecmp(argv[1], "on") == 0)) || strcasecmp(argv[1], "off") == 0){ + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, CUSTOM_RQ_SET_STATUS, isOn, 0, buffer, 0, 5000); + if(cnt < 0){ + fprintf(stderr, "USB error: %s\n", usb_strerror()); + } +#if ENABLE_TEST + }else if(strcasecmp(argv[1], "test") == 0){ + int i; + srandomdev(); + for(i = 0; i < 50000; i++){ + int value = random() & 0xffff, index = random() & 0xffff; + int rxValue, rxIndex; + if((i+1) % 100 == 0){ + fprintf(stderr, "\r%05d", i+1); + fflush(stderr); + } + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_ECHO, value, index, buffer, sizeof(buffer), 5000); + if(cnt < 0){ + fprintf(stderr, "\nUSB error in iteration %d: %s\n", i, usb_strerror()); + break; + }else if(cnt != 4){ + fprintf(stderr, "\nerror in iteration %d: %d bytes received instead of 4\n", i, cnt); + break; + } + rxValue = ((int)buffer[0] & 0xff) | (((int)buffer[1] & 0xff) << 8); + rxIndex = ((int)buffer[2] & 0xff) | (((int)buffer[3] & 0xff) << 8); + if(rxValue != value || rxIndex != index){ + fprintf(stderr, "\ndata error in iteration %d:\n", i); + fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, value); + fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, index); + } + } + fprintf(stderr, "\nTest completed.\n"); +#endif /* ENABLE_TEST */ + }else{ + usage(argv[0]); + exit(1); + } + usb_close(handle); + return 0; +} diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/Makefile new file mode 100644 index 0000000..e909fc6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/Makefile @@ -0,0 +1,164 @@ +# Name: Makefile +# Project: custom-class example +# Author: Christian Starkjohann +# Creation Date: 2008-04-07 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + +DEVICE = atmega168 +F_CPU = 16000000 # in Hz +FUSE_L = # see below for fuse values for particular devices +FUSE_H = +AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer + +CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 +OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) + +############################################################################## +# Fuse values for particular devices +############################################################################## +# If your device is not listed here, go to +# http://palmavr.sourceforge.net/cgi-bin/fc.cgi +# and choose options for external crystal clock and no clock divider +# +################################## ATMega8 ################################## +# ATMega8 FUSE_L (Fuse low byte): +# 0x9f = 1 0 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ BODEN (BrownOut Detector enabled) +# +-------------------- BODLEVEL (2.7V) +# ATMega8 FUSE_H (Fuse high byte): +# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) +# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 +# | | | | | +-------- BOOTSZ1 +# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) +# | | | +-------------- CKOPT (full output swing) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ WDTON (WDT not always on) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATMega48/88/168 ############################## +# ATMega*8 FUSE_L (Fuse low byte): +# 0xdf = 1 1 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ CKOUT (if 0: Clock output enabled) +# +-------------------- CKDIV8 (if 0: divide by 8) +# ATMega*8 FUSE_H (Fuse high byte): +# 0xde = 1 1 0 1 1 1 1 0 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V) +# | | | | + --------- EESAVE (preserve EEPROM over chip erase) +# | | | +-------------- WDTON (if 0: watchdog always on) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATTiny25/45/85 ############################### +# ATMega*5 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATMega*5 FUSE_H (Fuse high byte): +# 0xdd = 1 1 0 1 1 1 0 1 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (disable external reset -> enabled) +# +################################ ATTiny2313 ################################# +# ATTiny2313 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATTiny2313 FUSE_H (Fuse high byte): +# 0xdb = 1 1 0 1 1 0 1 1 +# ^ ^ ^ ^ \-+-/ ^ +# | | | | | +---- RSTDISBL (disable external reset -> enabled) +# | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# +-------------------- DWEN (debug wire enable) + + +# symbolic targets: +help: + @echo "This Makefile has no default rule. Use one of the following:" + @echo "make hex ....... to build main.hex" + @echo "make program ... to flash fuses and firmware" + @echo "make fuse ...... to flash the fuses" + @echo "make flash ..... to flash the firmware (use this on metaboard)" + @echo "make clean ..... to delete objects and hex file" + +hex: main.hex + +program: flash fuse + +# rule for programming fuse bits: +fuse: + @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ + { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } + $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m + +# rule for uploading firmware: +flash: main.hex + $(AVRDUDE) -U flash:w:main.hex:i + +# rule for deleting dependent files (those which can be built by Make): +clean: + rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s + +# Generic rule for compiling C files: +.c.o: + $(COMPILE) -c $< -o $@ + +# Generic rule for assembling Assembler source files: +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +# Generic rule for compiling C to assembler, used for debugging only. +.c.s: + $(COMPILE) -S $< -o $@ + +# file targets: + +# Since we don't want to ship the driver multipe times, we copy it into this project: +usbdrv: + cp -r ../../../usbdrv . + +main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it + $(COMPILE) -o main.elf $(OBJECTS) + +main.hex: main.elf + rm -f main.hex main.eep.hex + avr-objcopy -j .text -j .data -O ihex main.elf main.hex + avr-size main.hex + +# debugging targets: + +disasm: main.elf + avr-objdump -d main.elf + +cpp: + $(COMPILE) -E main.c diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/main.c b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/main.c new file mode 100644 index 0000000..231b1ce --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/main.c @@ -0,0 +1,97 @@ +/* Name: main.c + * Project: custom-class, a basic USB example + * Author: Christian Starkjohann + * Creation Date: 2008-04-09 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: main.c 790 2010-05-30 21:00:26Z cs $ + */ + +/* +This example should run on most AVRs with only little changes. No special +hardware resources except INT0 are used. You may have to change usbconfig.h for +different I/O pins for USB. Please note that USB D+ must be the INT0 pin, or +at least be connected to INT0 as well. +We assume that an LED is connected to port B bit 0. If you connect it to a +different port or bit, change the macros below: +*/ +#define LED_PORT_DDR DDRB +#define LED_PORT_OUTPUT PORTB +#define LED_BIT 0 + +#include +#include +#include /* for sei() */ +#include /* for _delay_ms() */ + +#include /* required by usbdrv.h */ +#include "usbdrv.h" +#include "oddebug.h" /* This is also an example for using debug macros */ +#include "requests.h" /* The custom request numbers we use */ + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +usbMsgLen_t usbFunctionSetup(uchar data[8]) +{ +usbRequest_t *rq = (void *)data; +static uchar dataBuffer[4]; /* buffer must stay valid when usbFunctionSetup returns */ + + if(rq->bRequest == CUSTOM_RQ_ECHO){ /* echo -- used for reliability tests */ + dataBuffer[0] = rq->wValue.bytes[0]; + dataBuffer[1] = rq->wValue.bytes[1]; + dataBuffer[2] = rq->wIndex.bytes[0]; + dataBuffer[3] = rq->wIndex.bytes[1]; + usbMsgPtr = dataBuffer; /* tell the driver which data to return */ + return 4; + }else if(rq->bRequest == CUSTOM_RQ_SET_STATUS){ + if(rq->wValue.bytes[0] & 1){ /* set LED */ + LED_PORT_OUTPUT |= _BV(LED_BIT); + }else{ /* clear LED */ + LED_PORT_OUTPUT &= ~_BV(LED_BIT); + } + }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){ + dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0); + usbMsgPtr = dataBuffer; /* tell the driver which data to return */ + return 1; /* tell the driver to send 1 byte */ + } + return 0; /* default for not implemented requests: return no data back to host */ +} + +/* ------------------------------------------------------------------------- */ + +int __attribute__((noreturn)) main(void) +{ +uchar i; + + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + odDebugInit(); + DBG1(0x00, 0, 0); /* debug output: main starts */ + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ /* fake USB disconnect for > 250 ms */ + wdt_reset(); + _delay_ms(1); + } + usbDeviceConnect(); + LED_PORT_DDR |= _BV(LED_BIT); /* make the LED bit an output */ + sei(); + DBG1(0x01, 0, 0); /* debug output: main loop starts */ + for(;;){ /* main event loop */ + DBG1(0x02, 0, 0); /* debug output: main loop iterates */ + wdt_reset(); + usbPoll(); + } +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/requests.h b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/requests.h new file mode 100644 index 0000000..b4ecb14 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/requests.h @@ -0,0 +1,36 @@ +/* Name: requests.h + * Project: custom-class, a basic USB example + * Author: Christian Starkjohann + * Creation Date: 2008-04-09 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: requests.h 692 2008-11-07 15:07:40Z cs $ + */ + +/* This header is shared between the firmware and the host software. It + * defines the USB request numbers (and optionally data types) used to + * communicate between the host and the device. + */ + +#ifndef __REQUESTS_H_INCLUDED__ +#define __REQUESTS_H_INCLUDED__ + +#define CUSTOM_RQ_ECHO 0 +/* Request that the device sends back wValue and wIndex. This is used with + * random data to test the reliability of the communication. + */ +#define CUSTOM_RQ_SET_STATUS 1 +/* Set the LED status. Control-OUT. + * The requested status is passed in the "wValue" field of the control + * transfer. No OUT data is sent. Bit 0 of the low byte of wValue controls + * the LED. + */ + +#define CUSTOM_RQ_GET_STATUS 2 +/* Get the current LED status. Control-IN. + * This control transfer involves a 1 byte data phase where the device sends + * the current status to the host. The status is in bit 0 of the byte. + */ + +#endif /* __REQUESTS_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/usbconfig.h b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/usbconfig.h new file mode 100644 index 0000000..4b7ea54 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/custom-class/firmware/usbconfig.h @@ -0,0 +1,373 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 4 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 0 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 10 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 40 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 0 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 0 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */ +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID 0xdc, 0x05 /* = 0x05dc = 1500 */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't' +#define USB_CFG_VENDOR_NAME_LEN 8 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'L', 'E', 'D', 'C', 'o', 'n', 't', 'r', 'o', 'l' +#define USB_CFG_DEVICE_NAME_LEN 10 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0xff /* set to 0 if deferred to interface */ +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 0 /* define class here if not at device level */ +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +/* #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 42 */ +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +#endif /* __usbconfig_h_included__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/Readme.txt b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/Readme.txt new file mode 100644 index 0000000..6a2ab3b --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/Readme.txt @@ -0,0 +1,28 @@ +This is the Readme file for the hid-custom-rq example. This is basically the +same as the custom-class example, except that the device conforms to the USB +HID class. + + +WHAT IS DEMONSTRATED? +===================== +This example demonstrates how custom requests can be sent to devices which +are otherwise HID compliant. This mechanism can be used to prevent the +"driver CD" dialog on Windows and still control the device with libusb-win32. +It can also be used to extend the functionality of the USB class, e.g. by +setting parameters. + +Please note that you should install the filter version of libusb-win32 to +take full advantage or this mode. The device driver version only has access +to devices which have been registered for it with a *.inf file. The filter +version has access to all devices. + + +MORE INFORMATION +================ +For information about how to build this example and how to use the command +line tool see the Readme file in the custom-class example. + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile new file mode 100644 index 0000000..5894ca8 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile @@ -0,0 +1,48 @@ +# Name: Makefile +# Project: hid-custom-rq example +# Author: Christian Starkjohann +# Creation Date: 2008-04-06 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + + +# Concigure the following definitions according to your system. +# This Makefile has been tested on Mac OS X, Linux and Windows. + +# Use the following 3 lines on Unix (uncomment the framework on Mac OS X): +USBFLAGS = `libusb-config --cflags` +USBLIBS = `libusb-config --libs` +EXE_SUFFIX = + +# Use the following 3 lines on Windows and comment out the 3 above. You may +# have to change the include paths to where you installed libusb-win32 +#USBFLAGS = -I/usr/local/include +#USBLIBS = -L/usr/local/lib -lusb +#EXE_SUFFIX = .exe + +NAME = set-led + +OBJECTS = opendevice.o $(NAME).o + +CC = gcc +CFLAGS = $(CPPFLAGS) $(USBFLAGS) -O -g -Wall +LIBS = $(USBLIBS) + +PROGRAM = $(NAME)$(EXE_SUFFIX) + + +all: $(PROGRAM) + +.c.o: + $(CC) $(CFLAGS) -c $< + +$(PROGRAM): $(OBJECTS) + $(CC) -o $(PROGRAM) $(OBJECTS) $(LIBS) + +strip: $(PROGRAM) + strip $(PROGRAM) + +clean: + rm -f *.o $(PROGRAM) diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile.windows b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile.windows new file mode 100644 index 0000000..4ea1df6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/Makefile.windows @@ -0,0 +1,18 @@ +# Name: Makefile.windows +# Project: hid-custom-rq example +# Author: Christian Starkjohann +# Creation Date: 2008-04-06 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id$ + +# You may use this file with +# make -f Makefile.windows +# on Windows with MinGW instead of editing the main Makefile. + +include Makefile + +USBFLAGS = -I/usr/local/mingw/include +USBLIBS = -L/usr/local/mingw/lib -lusb +EXE_SUFFIX = .exe diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.c new file mode 100644 index 0000000..137f50c --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.c @@ -0,0 +1,203 @@ +/* Name: opendevice.c + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.c 740 2009-04-13 18:23:31Z cs $ + */ + +/* +General Description: +The functions in this module can be used to find and open a device based on +libusb or libusb-win32. +*/ + +#include +#include "opendevice.h" + +/* ------------------------------------------------------------------------- */ + +#define MATCH_SUCCESS 1 +#define MATCH_FAILED 0 +#define MATCH_ABORT -1 + +/* private interface: match text and p, return MATCH_SUCCESS, MATCH_FAILED, or MATCH_ABORT. */ +static int _shellStyleMatch(char *text, char *p) +{ +int last, matched, reverse; + + for(; *p; text++, p++){ + if(*text == 0 && *p != '*') + return MATCH_ABORT; + switch(*p){ + case '\\': + /* Literal match with following character. */ + p++; + /* FALLTHROUGH */ + default: + if(*text != *p) + return MATCH_FAILED; + continue; + case '?': + /* Match anything. */ + continue; + case '*': + while(*++p == '*') + /* Consecutive stars act just like one. */ + continue; + if(*p == 0) + /* Trailing star matches everything. */ + return MATCH_SUCCESS; + while(*text) + if((matched = _shellStyleMatch(text++, p)) != MATCH_FAILED) + return matched; + return MATCH_ABORT; + case '[': + reverse = p[1] == '^'; + if(reverse) /* Inverted character class. */ + p++; + matched = MATCH_FAILED; + if(p[1] == ']' || p[1] == '-') + if(*++p == *text) + matched = MATCH_SUCCESS; + for(last = *p; *++p && *p != ']'; last = *p) + if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p) + matched = MATCH_SUCCESS; + if(matched == reverse) + return MATCH_FAILED; + continue; + } + } + return *text == 0; +} + +/* public interface for shell style matching: returns 0 if fails, 1 if matches */ +static int shellStyleMatch(char *text, char *pattern) +{ + if(pattern == NULL) /* NULL pattern is synonymous to "*" */ + return 1; + return _shellStyleMatch(text, pattern) == MATCH_SUCCESS; +} + +/* ------------------------------------------------------------------------- */ + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */ + return rval; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING){ + *buf = 0; + return 0; + } + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1: */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + +/* ------------------------------------------------------------------------- */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USBOPEN_ERR_NOTFOUND; + + usb_find_busses(); + usb_find_devices(); + for(bus = usb_get_busses(); bus; bus = bus->next){ + for(dev = bus->devices; dev; dev = dev->next){ /* iterate over all devices on all busses */ + if((vendorID == 0 || dev->descriptor.idVendor == vendorID) + && (productID == 0 || dev->descriptor.idProduct == productID)){ + char vendor[256], product[256], serial[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot open VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + continue; + } + /* now check whether the names match: */ + len = vendor[0] = 0; + if(dev->descriptor.iManufacturer > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, vendor, sizeof(vendor)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query manufacturer for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen device from vendor ->%s<-\n", vendor); */ + if(shellStyleMatch(vendor, vendorNamePattern)){ + len = product[0] = 0; + if(dev->descriptor.iProduct > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iProduct, product, sizeof(product)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query product for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen product ->%s<-\n", product); */ + if(shellStyleMatch(product, productNamePattern)){ + len = serial[0] = 0; + if(dev->descriptor.iSerialNumber > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, serial, sizeof(serial)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query serial for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + } + if(shellStyleMatch(serial, serialNamePattern)){ + if(printMatchingDevicesFp != NULL){ + if(serial[0] == 0){ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product); + }else{ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\" serial=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product, serial); + } + }else{ + break; + } + } + } + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) /* we have found a deice */ + break; + } + if(handle != NULL){ + errorCode = 0; + *device = handle; + } + if(printMatchingDevicesFp != NULL) /* never return an error for listing only */ + errorCode = 0; + return errorCode; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.h new file mode 100644 index 0000000..79c12f6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/opendevice.h @@ -0,0 +1,77 @@ +/* Name: opendevice.h + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.h 755 2009-08-03 17:01:21Z cs $ + */ + +/* +General Description: +This module offers additional functionality for host side drivers based on +libusb or libusb-win32. It includes a function to find and open a device +based on numeric IDs and textual description. It also includes a function to +obtain textual descriptions from a device. + +To use this functionality, simply copy opendevice.c and opendevice.h into your +project and add them to your Makefile. You may modify and redistribute these +files according to the GNU General Public License (GPL) version 2 or 3. +*/ + +#ifndef __OPENDEVICE_H_INCLUDED__ +#define __OPENDEVICE_H_INCLUDED__ + +#include /* this is libusb, see http://libusb.sourceforge.net/ */ +#include + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen); +/* This function gets a string descriptor from the device. 'index' is the + * string descriptor index. The string is returned in ISO Latin 1 encoding in + * 'buf' and it is terminated with a 0-character. The buffer size must be + * passed in 'buflen' to prevent buffer overflows. A libusb device handle + * must be given in 'dev'. + * Returns: The length of the string (excluding the terminating 0) or + * a negative number in case of an error. If there was an error, use + * usb_strerror() to obtain the error message. + */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp); +/* This function iterates over all devices on all USB busses and searches for + * a device. Matching is done first by means of Vendor- and Product-ID (passed + * in 'vendorID' and 'productID'. An ID of 0 matches any numeric ID (wildcard). + * When a device matches by its IDs, matching by names is performed. Name + * matching can be done on textual vendor name ('vendorNamePattern'), product + * name ('productNamePattern') and serial number ('serialNamePattern'). A + * device matches only if all non-null pattern match. If you don't care about + * a string, pass NULL for the pattern. Patterns are Unix shell style pattern: + * '*' stands for 0 or more characters, '?' for one single character, a list + * of characters in square brackets for a single character from the list + * (dashes are allowed to specify a range) and if the lis of characters begins + * with a caret ('^'), it matches one character which is NOT in the list. + * Other parameters to the function: If 'warningsFp' is not NULL, warning + * messages are printed to this file descriptor with fprintf(). If + * 'printMatchingDevicesFp' is not NULL, no device is opened but matching + * devices are printed to the given file descriptor with fprintf(). + * If a device is opened, the resulting USB handle is stored in '*device'. A + * pointer to a "usb_dev_handle *" type variable must be passed here. + * Returns: 0 on success, an error code (see defines below) on failure. + */ + +/* usbOpenDevice() error codes: */ +#define USBOPEN_SUCCESS 0 /* no error */ +#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */ +#define USBOPEN_ERR_IO 2 /* I/O error */ +#define USBOPEN_ERR_NOTFOUND 3 /* device not found */ + + +/* Obdev's free USB IDs, see USB-IDs-for-free.txt for details */ + +#define USB_VID_OBDEV_SHARED 5824 /* obdev's shared vendor ID */ +#define USB_PID_OBDEV_SHARED_CUSTOM 1500 /* shared PID for custom class devices */ +#define USB_PID_OBDEV_SHARED_HID 1503 /* shared PID for HIDs except mice & keyboards */ +#define USB_PID_OBDEV_SHARED_CDCACM 1505 /* shared PID for CDC Modem devices */ +#define USB_PID_OBDEV_SHARED_MIDI 1508 /* shared PID for MIDI class devices */ + +#endif /* __OPENDEVICE_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/set-led.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/set-led.c new file mode 100644 index 0000000..52b2a3b --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/commandline/set-led.c @@ -0,0 +1,135 @@ +/* Name: set-led.c + * Project: hid-custom-rq example + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: set-led.c 692 2008-11-07 15:07:40Z cs $ + */ + +/* +General Description: +This is the host-side driver for the custom-class example device. It searches +the USB for the LEDControl device and sends the requests understood by this +device. +This program must be linked with libusb on Unix and libusb-win32 on Windows. +See http://libusb.sourceforge.net/ or http://libusb-win32.sourceforge.net/ +respectively. +*/ + +#include +#include +#include +#include /* this is libusb */ +#include "opendevice.h" /* common code moved to separate module */ + +#include "../firmware/requests.h" /* custom request numbers */ +#include "../firmware/usbconfig.h" /* device's VID/PID and names */ + +static void usage(char *name) +{ + fprintf(stderr, "usage:\n"); + fprintf(stderr, " %s on ....... turn on LED\n", name); + fprintf(stderr, " %s off ...... turn off LED\n", name); + fprintf(stderr, " %s status ... ask current status of LED\n", name); +#if ENABLE_TEST + fprintf(stderr, " %s test ..... run driver reliability test\n", name); +#endif /* ENABLE_TEST */ +} + +int main(int argc, char **argv) +{ +usb_dev_handle *handle = NULL; +const unsigned char rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID}; +char vendor[] = {USB_CFG_VENDOR_NAME, 0}, product[] = {USB_CFG_DEVICE_NAME, 0}; +char buffer[4]; +int cnt, vid, pid, isOn; + + usb_init(); + if(argc < 2){ /* we need at least one argument */ + usage(argv[0]); + exit(1); + } + /* compute VID/PID from usbconfig.h so that there is a central source of information */ + vid = rawVid[1] * 256 + rawVid[0]; + pid = rawPid[1] * 256 + rawPid[0]; + /* The following function is in opendevice.c: */ + if(usbOpenDevice(&handle, vid, vendor, pid, product, NULL, NULL, NULL) != 0){ + fprintf(stderr, "Could not find USB device \"%s\" with vid=0x%x pid=0x%x\n", product, vid, pid); + exit(1); + } + /* Since we use only control endpoint 0, we don't need to choose a + * configuration and interface. Reading device descriptor and setting a + * configuration and interface is done through endpoint 0 after all. + * However, newer versions of Linux require that we claim an interface + * even for endpoint 0. Enable the following code if your operating system + * needs it: */ +#if 0 + int retries = 1, usbConfiguration = 1, usbInterface = 0; + if(usb_set_configuration(handle, usbConfiguration) && showWarnings){ + fprintf(stderr, "Warning: could not set configuration: %s\n", usb_strerror()); + } + /* now try to claim the interface and detach the kernel HID driver on + * Linux and other operating systems which support the call. */ + while((len = usb_claim_interface(handle, usbInterface)) != 0 && retries-- > 0){ +#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP + if(usb_detach_kernel_driver_np(handle, 0) < 0 && showWarnings){ + fprintf(stderr, "Warning: could not detach kernel driver: %s\n", usb_strerror()); + } +#endif + } +#endif + + if(strcasecmp(argv[1], "status") == 0){ + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_GET_STATUS, 0, 0, buffer, sizeof(buffer), 5000); + if(cnt < 1){ + if(cnt < 0){ + fprintf(stderr, "USB error: %s\n", usb_strerror()); + }else{ + fprintf(stderr, "only %d bytes received.\n", cnt); + } + }else{ + printf("LED is %s\n", buffer[0] ? "on" : "off"); + } + }else if((isOn = (strcasecmp(argv[1], "on") == 0)) || strcasecmp(argv[1], "off") == 0){ + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, CUSTOM_RQ_SET_STATUS, isOn, 0, buffer, 0, 5000); + if(cnt < 0){ + fprintf(stderr, "USB error: %s\n", usb_strerror()); + } +#if ENABLE_TEST + }else if(strcasecmp(argv[1], "test") == 0){ + int i; + srandomdev(); + for(i = 0; i < 50000; i++){ + int value = random() & 0xffff, index = random() & 0xffff; + int rxValue, rxIndex; + if((i+1) % 100 == 0){ + fprintf(stderr, "\r%05d", i+1); + fflush(stderr); + } + cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_ECHO, value, index, buffer, sizeof(buffer), 5000); + if(cnt < 0){ + fprintf(stderr, "\nUSB error in iteration %d: %s\n", i, usb_strerror()); + break; + }else if(cnt != 4){ + fprintf(stderr, "\nerror in iteration %d: %d bytes received instead of 4\n", i, cnt); + break; + } + rxValue = ((int)buffer[0] & 0xff) | (((int)buffer[1] & 0xff) << 8); + rxIndex = ((int)buffer[2] & 0xff) | (((int)buffer[3] & 0xff) << 8); + if(rxValue != value || rxIndex != index){ + fprintf(stderr, "\ndata error in iteration %d:\n", i); + fprintf(stderr, "rxValue = 0x%04x value = 0x%04x\n", rxValue, value); + fprintf(stderr, "rxIndex = 0x%04x index = 0x%04x\n", rxIndex, index); + } + } + fprintf(stderr, "\nTest completed.\n"); +#endif /* ENABLE_TEST */ + }else{ + usage(argv[0]); + exit(1); + } + usb_close(handle); + return 0; +} diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/Makefile new file mode 100644 index 0000000..f2372db --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/Makefile @@ -0,0 +1,164 @@ +# Name: Makefile +# Project: hid-custom-rq example +# Author: Christian Starkjohann +# Creation Date: 2008-04-07 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + +DEVICE = atmega168 +F_CPU = 16000000 # in Hz +FUSE_L = # see below for fuse values for particular devices +FUSE_H = +AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer + +CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 +OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) + +############################################################################## +# Fuse values for particular devices +############################################################################## +# If your device is not listed here, go to +# http://palmavr.sourceforge.net/cgi-bin/fc.cgi +# and choose options for external crystal clock and no clock divider +# +################################## ATMega8 ################################## +# ATMega8 FUSE_L (Fuse low byte): +# 0x9f = 1 0 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ BODEN (BrownOut Detector enabled) +# +-------------------- BODLEVEL (2.7V) +# ATMega8 FUSE_H (Fuse high byte): +# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) +# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 +# | | | | | +-------- BOOTSZ1 +# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) +# | | | +-------------- CKOPT (full output swing) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ WDTON (WDT not always on) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATMega48/88/168 ############################## +# ATMega*8 FUSE_L (Fuse low byte): +# 0xdf = 1 1 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ CKOUT (if 0: Clock output enabled) +# +-------------------- CKDIV8 (if 0: divide by 8) +# ATMega*8 FUSE_H (Fuse high byte): +# 0xde = 1 1 0 1 1 1 1 0 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V) +# | | | | + --------- EESAVE (preserve EEPROM over chip erase) +# | | | +-------------- WDTON (if 0: watchdog always on) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATTiny25/45/85 ############################### +# ATMega*5 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATMega*5 FUSE_H (Fuse high byte): +# 0xdd = 1 1 0 1 1 1 0 1 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (disable external reset -> enabled) +# +################################ ATTiny2313 ################################# +# ATTiny2313 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATTiny2313 FUSE_H (Fuse high byte): +# 0xdb = 1 1 0 1 1 0 1 1 +# ^ ^ ^ ^ \-+-/ ^ +# | | | | | +---- RSTDISBL (disable external reset -> enabled) +# | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# +-------------------- DWEN (debug wire enable) + + +# symbolic targets: +help: + @echo "This Makefile has no default rule. Use one of the following:" + @echo "make hex ....... to build main.hex" + @echo "make program ... to flash fuses and firmware" + @echo "make fuse ...... to flash the fuses" + @echo "make flash ..... to flash the firmware (use this on metaboard)" + @echo "make clean ..... to delete objects and hex file" + +hex: main.hex + +program: flash fuse + +# rule for programming fuse bits: +fuse: + @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ + { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } + $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m + +# rule for uploading firmware: +flash: main.hex + $(AVRDUDE) -U flash:w:main.hex:i + +# rule for deleting dependent files (those which can be built by Make): +clean: + rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s + +# Generic rule for compiling C files: +.c.o: + $(COMPILE) -c $< -o $@ + +# Generic rule for assembling Assembler source files: +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +# Generic rule for compiling C to assembler, used for debugging only. +.c.s: + $(COMPILE) -S $< -o $@ + +# file targets: + +# Since we don't want to ship the driver multipe times, we copy it into this project: +usbdrv: + cp -r ../../../usbdrv . + +main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it + $(COMPILE) -o main.elf $(OBJECTS) + +main.hex: main.elf + rm -f main.hex main.eep.hex + avr-objcopy -j .text -j .data -O ihex main.elf main.hex + avr-size main.hex + +# debugging targets: + +disasm: main.elf + avr-objdump -d main.elf + +cpp: + $(COMPILE) -E main.c diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/main.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/main.c new file mode 100644 index 0000000..9681a29 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/main.c @@ -0,0 +1,120 @@ +/* Name: main.c + * Project: hid-custom-rq example + * Author: Christian Starkjohann + * Creation Date: 2008-04-07 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: main.c 790 2010-05-30 21:00:26Z cs $ + */ + +/* +This example should run on most AVRs with only little changes. No special +hardware resources except INT0 are used. You may have to change usbconfig.h for +different I/O pins for USB. Please note that USB D+ must be the INT0 pin, or +at least be connected to INT0 as well. +We assume that an LED is connected to port B bit 0. If you connect it to a +different port or bit, change the macros below: +*/ +#define LED_PORT_DDR DDRB +#define LED_PORT_OUTPUT PORTB +#define LED_BIT 0 + +#include +#include +#include /* for sei() */ +#include /* for _delay_ms() */ + +#include /* required by usbdrv.h */ +#include "usbdrv.h" +#include "oddebug.h" /* This is also an example for using debug macros */ +#include "requests.h" /* The custom request numbers we use */ + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +PROGMEM char usbHidReportDescriptor[22] = { /* USB report descriptor */ + 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0xa1, 0x01, // COLLECTION (Application) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x01, // REPORT_COUNT (1) + 0x09, 0x00, // USAGE (Undefined) + 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) + 0xc0 // END_COLLECTION +}; +/* The descriptor above is a dummy only, it silences the drivers. The report + * it describes consists of one byte of undefined data. + * We don't transfer our data through HID reports, we use custom requests + * instead. + */ + +/* ------------------------------------------------------------------------- */ + +usbMsgLen_t usbFunctionSetup(uchar data[8]) +{ +usbRequest_t *rq = (void *)data; + + if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){ + DBG1(0x50, &rq->bRequest, 1); /* debug output: print our request */ + if(rq->bRequest == CUSTOM_RQ_SET_STATUS){ + if(rq->wValue.bytes[0] & 1){ /* set LED */ + LED_PORT_OUTPUT |= _BV(LED_BIT); + }else{ /* clear LED */ + LED_PORT_OUTPUT &= ~_BV(LED_BIT); + } + }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){ + static uchar dataBuffer[1]; /* buffer must stay valid when usbFunctionSetup returns */ + dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0); + usbMsgPtr = dataBuffer; /* tell the driver which data to return */ + return 1; /* tell the driver to send 1 byte */ + } + }else{ + /* calss requests USBRQ_HID_GET_REPORT and USBRQ_HID_SET_REPORT are + * not implemented since we never call them. The operating system + * won't call them either because our descriptor defines no meaning. + */ + } + return 0; /* default for not implemented requests: return no data back to host */ +} + +/* ------------------------------------------------------------------------- */ + +int __attribute__((noreturn)) main(void) +{ +uchar i; + + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + odDebugInit(); + DBG1(0x00, 0, 0); /* debug output: main starts */ + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ /* fake USB disconnect for > 250 ms */ + wdt_reset(); + _delay_ms(1); + } + usbDeviceConnect(); + LED_PORT_DDR |= _BV(LED_BIT); /* make the LED bit an output */ + sei(); + DBG1(0x01, 0, 0); /* debug output: main loop starts */ + for(;;){ /* main event loop */ +#if 0 /* this is a bit too aggressive for a debug output */ + DBG2(0x02, 0, 0); /* debug output: main loop iterates */ +#endif + wdt_reset(); + usbPoll(); + } +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/requests.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/requests.h new file mode 100644 index 0000000..79282b6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/requests.h @@ -0,0 +1,32 @@ +/* Name: requests.h + * Project: custom-class, a basic USB example + * Author: Christian Starkjohann + * Creation Date: 2008-04-09 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: requests.h 692 2008-11-07 15:07:40Z cs $ + */ + +/* This header is shared between the firmware and the host software. It + * defines the USB request numbers (and optionally data types) used to + * communicate between the host and the device. + */ + +#ifndef __REQUESTS_H_INCLUDED__ +#define __REQUESTS_H_INCLUDED__ + +#define CUSTOM_RQ_SET_STATUS 1 +/* Set the LED status. Control-OUT. + * The requested status is passed in the "wValue" field of the control + * transfer. No OUT data is sent. Bit 0 of the low byte of wValue controls + * the LED. + */ + +#define CUSTOM_RQ_GET_STATUS 2 +/* Get the current LED status. Control-IN. + * This control transfer involves a 1 byte data phase where the device sends + * the current status to the host. The status is in bit 0 of the byte. + */ + +#endif /* __REQUESTS_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/usbconfig.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/usbconfig.h new file mode 100644 index 0000000..e34583f --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-custom-rq/firmware/usbconfig.h @@ -0,0 +1,373 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 4 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 100 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 40 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 0 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 0 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */ +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID 0xdf, 0x05 /* obdev's shared PID for HIDs */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't' +#define USB_CFG_VENDOR_NAME_LEN 8 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'L', 'E', 'D', 'C', 't', 'l', 'H', 'I', 'D' +#define USB_CFG_DEVICE_NAME_LEN 9 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 22 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +#endif /* __usbconfig_h_included__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/Readme.txt b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/Readme.txt new file mode 100644 index 0000000..cb17baa --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/Readme.txt @@ -0,0 +1,75 @@ +This is the Readme file for the hid-data example. In this example, we show +how blocks of data can be exchanged with the device using only functionality +compliant to the HID class. Since class drivers for HID are included with +Windows, you don't need to install drivers on Windows. + + +WHAT IS DEMONSTRATED? +===================== +This example demonstrates how the HID class can be misused to transfer fixed +size blocks of data (up to the driver's transfer size limit) over HID feature +reports. This technique is of great value on Windows because no driver DLLs +are needed (the hid-custom-rq example still requires the libusb-win32 DLL, +although it may be in the program's directory). The host side application +requires no installation, it can even be started directly from a CD. This +example also demonstrates how to transfer data using usbFunctionWrite() and +usbFunctionRead(). + + +PREREQUISITES +============= +Target hardware: You need an AVR based circuit based on one of the examples +(see the "circuits" directory at the top level of this package), e.g. the +metaboard (http://www.obdev.at/goto.php?t=metaboard). + +AVR development environment: You need the gcc tool chain for the AVR, see +the Prerequisites section in the top level Readme file for how to obtain it. + +Host development environment: A C compiler and libusb on Unix. On Windows +you need the Driver Development Kit (DDK) Instead of libusb. MinGW ships +with a free version of the DDK. + + +BUILDING THE FIRMWARE +===================== +Change to the "firmware" directory and modify Makefile according to your +architecture (CPU clock, target device, fuse values) and ISP programmer. Then +edit usbconfig.h according to your pin assignments for D+ and D-. The default +settings are for the metaboard hardware. + +Type "make hex" to build main.hex, then "make flash" to upload the firmware +to the device. Don't forget to run "make fuse" once to program the fuses. If +you use a prototyping board with boot loader, follow the instructions of the +boot loader instead. + +Please note that the first "make hex" copies the driver from the top level +into the firmware directory. If you use a different build system than our +Makefile, you must copy the driver by hand. + + +BUILDING THE HOST SOFTWARE +========================== +Make sure that you have libusb (on Unix) or the DDK (on Windows) installed. +We recommend MinGW on Windows since it includes a free version of the DDK. +Then change to directory "commandline" and run "make" on Unix or +"make -f Makefile.windows" on Windows. + + +USING THE COMMAND LINE TOOL +=========================== +The device implements a data store of 128 bytes in EEPROM. You can send a +block of 128 bytes to the device or read the block using the command line +tool. + +To send a block to the device, use e.g. + + hidtool write 0x01,0x02,0x03,0x04,... + +and to receive the block, use + + hidtool read + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile new file mode 100644 index 0000000..dabfa42 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile @@ -0,0 +1,42 @@ +# Name: Makefile +# Project: hid-data example +# Author: Christian Starkjohann +# Creation Date: 2008-04-11 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + +# Please read the definitions below and edit them as appropriate for your +# system: + +# Use the following 3 lines on Unix and Mac OS X: +USBFLAGS= `libusb-config --cflags` +USBLIBS= `libusb-config --libs` +EXE_SUFFIX= + +# Use the following 3 lines on Windows and comment out the 3 above: +#USBFLAGS= +#USBLIBS= -lhid -lusb -lsetupapi +#EXE_SUFFIX= .exe + +CC= gcc +CFLAGS= -O -Wall $(USBFLAGS) +LIBS= $(USBLIBS) + +OBJ= hidtool.o hiddata.o +PROGRAM= hidtool$(EXE_SUFFIX) + +all: $(PROGRAM) + +$(PROGRAM): $(OBJ) + $(CC) -o $(PROGRAM) $(OBJ) $(LIBS) + +strip: $(PROGRAM) + strip $(PROGRAM) + +clean: + rm -f $(OBJ) $(PROGRAM) + +.c.o: + $(CC) $(ARCH_COMPILE) $(CFLAGS) -c $*.c -o $*.o diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile.windows b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile.windows new file mode 100644 index 0000000..a66dffc --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/Makefile.windows @@ -0,0 +1,18 @@ +# Name: Makefile.windows +# Project: hid-data example +# Author: Christian Starkjohann +# Creation Date: 2008-04-11 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id$ + +# You may use this file with +# make -f Makefile.windows +# on Windows with MinGW instead of editing the main Makefile. + +include Makefile + +USBFLAGS= +USBLIBS= -lhid -lsetupapi +EXE_SUFFIX= .exe diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.c new file mode 100644 index 0000000..93795e4 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.c @@ -0,0 +1,324 @@ +/* Name: hiddata.c + * Author: Christian Starkjohann + * Creation Date: 2008-04-11 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hiddata.c 743 2009-04-15 15:00:49Z cs $ + */ + +#include +#include "hiddata.h" + +/* ######################################################################## */ +#if defined(WIN32) /* ##################################################### */ +/* ######################################################################## */ + +#include +#include +#include "hidsdi.h" +#include + +#ifdef DEBUG +#define DEBUG_PRINT(arg) printf arg +#else +#define DEBUG_PRINT(arg) +#endif + +/* ------------------------------------------------------------------------ */ + +static void convertUniToAscii(char *buffer) +{ +unsigned short *uni = (void *)buffer; +char *ascii = buffer; + + while(*uni != 0){ + if(*uni >= 256){ + *ascii++ = '?'; + }else{ + *ascii++ = *uni++; + } + } + *ascii++ = 0; +} + +int usbhidOpenDevice(usbDevice_t **device, int vendor, char *vendorName, int product, char *productName, int usesReportIDs) +{ +GUID hidGuid; /* GUID for HID driver */ +HDEVINFO deviceInfoList; +SP_DEVICE_INTERFACE_DATA deviceInfo; +SP_DEVICE_INTERFACE_DETAIL_DATA *deviceDetails = NULL; +DWORD size; +int i, openFlag = 0; /* may be FILE_FLAG_OVERLAPPED */ +int errorCode = USBOPEN_ERR_NOTFOUND; +HANDLE handle = INVALID_HANDLE_VALUE; +HIDD_ATTRIBUTES deviceAttributes; + + HidD_GetHidGuid(&hidGuid); + deviceInfoList = SetupDiGetClassDevs(&hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); + deviceInfo.cbSize = sizeof(deviceInfo); + for(i=0;;i++){ + if(handle != INVALID_HANDLE_VALUE){ + CloseHandle(handle); + handle = INVALID_HANDLE_VALUE; + } + if(!SetupDiEnumDeviceInterfaces(deviceInfoList, 0, &hidGuid, i, &deviceInfo)) + break; /* no more entries */ + /* first do a dummy call just to determine the actual size required */ + SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, NULL, 0, &size, NULL); + if(deviceDetails != NULL) + free(deviceDetails); + deviceDetails = malloc(size); + deviceDetails->cbSize = sizeof(*deviceDetails); + /* this call is for real: */ + SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, deviceDetails, size, &size, NULL); + DEBUG_PRINT(("checking HID path \"%s\"\n", deviceDetails->DevicePath)); +#if 0 + /* If we want to access a mouse our keyboard, we can only use feature + * requests as the device is locked by Windows. It must be opened + * with ACCESS_TYPE_NONE. + */ + handle = CreateFile(deviceDetails->DevicePath, ACCESS_TYPE_NONE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, openFlag, NULL); +#endif + /* attempt opening for R/W -- we don't care about devices which can't be accessed */ + handle = CreateFile(deviceDetails->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, openFlag, NULL); + if(handle == INVALID_HANDLE_VALUE){ + DEBUG_PRINT(("opening failed: %d\n", (int)GetLastError())); + /* errorCode = USBOPEN_ERR_ACCESS; opening will always fail for mouse -- ignore */ + continue; + } + deviceAttributes.Size = sizeof(deviceAttributes); + HidD_GetAttributes(handle, &deviceAttributes); + DEBUG_PRINT(("device attributes: vid=%d pid=%d\n", deviceAttributes.VendorID, deviceAttributes.ProductID)); + if(deviceAttributes.VendorID != vendor || deviceAttributes.ProductID != product) + continue; /* ignore this device */ + errorCode = USBOPEN_ERR_NOTFOUND; + if(vendorName != NULL && productName != NULL){ + char buffer[512]; + if(!HidD_GetManufacturerString(handle, buffer, sizeof(buffer))){ + DEBUG_PRINT(("error obtaining vendor name\n")); + errorCode = USBOPEN_ERR_IO; + continue; + } + convertUniToAscii(buffer); + DEBUG_PRINT(("vendorName = \"%s\"\n", buffer)); + if(strcmp(vendorName, buffer) != 0) + continue; + if(!HidD_GetProductString(handle, buffer, sizeof(buffer))){ + DEBUG_PRINT(("error obtaining product name\n")); + errorCode = USBOPEN_ERR_IO; + continue; + } + convertUniToAscii(buffer); + DEBUG_PRINT(("productName = \"%s\"\n", buffer)); + if(strcmp(productName, buffer) != 0) + continue; + } + break; /* we have found the device we are looking for! */ + } + SetupDiDestroyDeviceInfoList(deviceInfoList); + if(deviceDetails != NULL) + free(deviceDetails); + if(handle != INVALID_HANDLE_VALUE){ + *device = (usbDevice_t *)handle; + errorCode = 0; + } + return errorCode; +} + +/* ------------------------------------------------------------------------ */ + +void usbhidCloseDevice(usbDevice_t *device) +{ + CloseHandle((HANDLE)device); +} + +/* ------------------------------------------------------------------------ */ + +int usbhidSetReport(usbDevice_t *device, char *buffer, int len) +{ +BOOLEAN rval; + + rval = HidD_SetFeature((HANDLE)device, buffer, len); + return rval == 0 ? USBOPEN_ERR_IO : 0; +} + +/* ------------------------------------------------------------------------ */ + +int usbhidGetReport(usbDevice_t *device, int reportNumber, char *buffer, int *len) +{ +BOOLEAN rval = 0; + + buffer[0] = reportNumber; + rval = HidD_GetFeature((HANDLE)device, buffer, *len); + return rval == 0 ? USBOPEN_ERR_IO : 0; +} + +/* ------------------------------------------------------------------------ */ + +/* ######################################################################## */ +#else /* defined WIN32 #################################################### */ +/* ######################################################################## */ + +#include +#include + +#define usbDevice usb_dev_handle /* use libusb's device structure */ + +/* ------------------------------------------------------------------------- */ + +#define USBRQ_HID_GET_REPORT 0x01 +#define USBRQ_HID_SET_REPORT 0x09 + +#define USB_HID_REPORT_TYPE_FEATURE 3 + + +static int usesReportIDs; + +/* ------------------------------------------------------------------------- */ + +static int usbhidGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */ + return rval; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING){ + *buf = 0; + return 0; + } + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1: */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + +int usbhidOpenDevice(usbDevice_t **device, int vendor, char *vendorName, int product, char *productName, int _usesReportIDs) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USBOPEN_ERR_NOTFOUND; +static int didUsbInit = 0; + + if(!didUsbInit){ + usb_init(); + didUsbInit = 1; + } + usb_find_busses(); + usb_find_devices(); + for(bus=usb_get_busses(); bus; bus=bus->next){ + for(dev=bus->devices; dev; dev=dev->next){ + if(dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product){ + char string[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USBOPEN_ERR_ACCESS; + fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror()); + continue; + } + if(vendorName == NULL && productName == NULL){ /* name does not matter */ + break; + } + /* now check whether the names match: */ + len = usbhidGetStringAscii(handle, dev->descriptor.iManufacturer, string, sizeof(string)); + if(len < 0){ + errorCode = USBOPEN_ERR_IO; + fprintf(stderr, "Warning: cannot query manufacturer for device: %s\n", usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* fprintf(stderr, "seen device from vendor ->%s<-\n", string); */ + if(strcmp(string, vendorName) == 0){ + len = usbhidGetStringAscii(handle, dev->descriptor.iProduct, string, sizeof(string)); + if(len < 0){ + errorCode = USBOPEN_ERR_IO; + fprintf(stderr, "Warning: cannot query product for device: %s\n", usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* fprintf(stderr, "seen product ->%s<-\n", string); */ + if(strcmp(string, productName) == 0) + break; + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) + break; + } + if(handle != NULL){ + errorCode = 0; + *device = (void *)handle; + usesReportIDs = _usesReportIDs; + } + return errorCode; +} + +/* ------------------------------------------------------------------------- */ + +void usbhidCloseDevice(usbDevice_t *device) +{ + if(device != NULL) + usb_close((void *)device); +} + +/* ------------------------------------------------------------------------- */ + +int usbhidSetReport(usbDevice_t *device, char *buffer, int len) +{ +int bytesSent; + + if(!usesReportIDs){ + buffer++; /* skip dummy report ID */ + len--; + } + bytesSent = usb_control_msg((void *)device, USB_TYPE_CLASS | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, USBRQ_HID_SET_REPORT, USB_HID_REPORT_TYPE_FEATURE << 8 | (buffer[0] & 0xff), 0, buffer, len, 5000); + if(bytesSent != len){ + if(bytesSent < 0) + fprintf(stderr, "Error sending message: %s\n", usb_strerror()); + return USBOPEN_ERR_IO; + } + return 0; +} + +/* ------------------------------------------------------------------------- */ + +int usbhidGetReport(usbDevice_t *device, int reportNumber, char *buffer, int *len) +{ +int bytesReceived, maxLen = *len; + + if(!usesReportIDs){ + buffer++; /* make room for dummy report ID */ + maxLen--; + } + bytesReceived = usb_control_msg((void *)device, USB_TYPE_CLASS | USB_RECIP_DEVICE | USB_ENDPOINT_IN, USBRQ_HID_GET_REPORT, USB_HID_REPORT_TYPE_FEATURE << 8 | reportNumber, 0, buffer, maxLen, 5000); + if(bytesReceived < 0){ + fprintf(stderr, "Error sending message: %s\n", usb_strerror()); + return USBOPEN_ERR_IO; + } + *len = bytesReceived; + if(!usesReportIDs){ + buffer[-1] = reportNumber; /* add dummy report ID */ + (*len)++; + } + return 0; +} + +/* ######################################################################## */ +#endif /* defined WIN32 ################################################### */ +/* ######################################################################## */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.h new file mode 100644 index 0000000..fce0743 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hiddata.h @@ -0,0 +1,71 @@ +/* Name: hiddata.h + * Author: Christian Starkjohann + * Creation Date: 2008-04-11 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hiddata.h 692 2008-11-07 15:07:40Z cs $ + */ + +#ifndef __HIDDATA_H_INCLUDED__ +#define __HIDDATA_H_INCLUDED__ + +/* +General Description: +This module implements an abstraction layer for data transfer over HID feature +requests. The implementation uses native Windows functions on Windows so that +no driver installation is required and libusb on Unix. You must link the +appropriate libraries in either case: "-lhid -lusb -lsetupapi" on Windows and +`libusb-config --libs` on Unix. +*/ + +/* ------------------------------------------------------------------------ */ + +#define USBOPEN_SUCCESS 0 /* no error */ +#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */ +#define USBOPEN_ERR_IO 2 /* I/O error */ +#define USBOPEN_ERR_NOTFOUND 3 /* device not found */ + +/* ------------------------------------------------------------------------ */ + +typedef struct usbDevice usbDevice_t; +/* Opaque data type representing the USB device. This can be a Windows handle + * or a libusb handle, depending on the backend implementation. + */ + +/* ------------------------------------------------------------------------ */ + +int usbhidOpenDevice(usbDevice_t **device, int vendorID, char *vendorName, int productID, char *productName, int usesReportIDs); +/* This function opens a USB device. 'vendorID' and 'productID' are the numeric + * Vendor-ID and Product-ID of the device we want to open. If 'vendorName' and + * 'productName' are both not NULL, only devices with matching manufacturer- + * and product name strings are accepted. If the device uses report IDs, + * 'usesReportIDs' must be set to a non-zero value. + * Returns: If a matching device has been found, USBOPEN_SUCCESS is returned + * and '*device' is set to an opaque pointer representing the device. The + * device must be closed with usbhidCloseDevice(). If the device has not been + * found or opening failed, an error code is returned. + */ +void usbhidCloseDevice(usbDevice_t *device); +/* Every device opened with usbhidOpenDevice() must be closed with this function. + */ +int usbhidSetReport(usbDevice_t *device, char *buffer, int len); +/* This function sends a feature report to the device. The report ID must be + * in the first byte of buffer and the length 'len' of the report is specified + * including this report ID. If no report IDs are used, buffer[0] must be set + * to 0 (dummy report ID). + * Returns: 0 on success, an error code otherwise. + */ +int usbhidGetReport(usbDevice_t *device, int reportID, char *buffer, int *len); +/* This function obtains a feature report from the device. The requested + * report-ID is passed in 'reportID'. The caller must pass a buffer of the size + * of the expected report in 'buffer' and initialize the variable pointed to by + * 'len' to the total size of this buffer. Upon successful return, the report + * (prefixed with the report-ID) is in 'buffer' and the actual length of the + * report is returned in '*len'. + * Returns: 0 on success, an error code otherwise. + */ + +/* ------------------------------------------------------------------------ */ + +#endif /* __HIDDATA_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidsdi.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidsdi.h new file mode 100644 index 0000000..a549ab1 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidsdi.h @@ -0,0 +1,49 @@ +/* Name: hidsdi.h + * Author: Christian Starkjohann + * Creation Date: 2006-02-02 + * Tabsize: 4 + * Copyright: (c) 2006-2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hidsdi.h 692 2008-11-07 15:07:40Z cs $ + */ + +/* +General Description +This file is a replacement for hidsdi.h from the Windows DDK. It defines some +of the types and function prototypes of this header for our project. If you +have the Windows DDK version of this file or a version shipped with MinGW, use +that instead. +*/ + +#ifndef _HIDSDI_H +#define _HIDSDI_H + +#include + +#include +#include + +typedef struct{ + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +}HIDD_ATTRIBUTES; + +void __stdcall HidD_GetHidGuid(OUT LPGUID hidGuid); + +BOOLEAN __stdcall HidD_GetAttributes(IN HANDLE device, OUT HIDD_ATTRIBUTES *attributes); + +BOOLEAN __stdcall HidD_GetManufacturerString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen); +BOOLEAN __stdcall HidD_GetProductString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen); +BOOLEAN __stdcall HidD_GetSerialNumberString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen); + +BOOLEAN __stdcall HidD_GetFeature(IN HANDLE device, OUT void *reportBuffer, IN ULONG bufferLen); +BOOLEAN __stdcall HidD_SetFeature(IN HANDLE device, IN void *reportBuffer, IN ULONG bufferLen); + +BOOLEAN __stdcall HidD_GetNumInputBuffers(IN HANDLE device, OUT ULONG *numBuffers); +BOOLEAN __stdcall HidD_SetNumInputBuffers(IN HANDLE device, OUT ULONG numBuffers); + +#include + +#endif diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidtool.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidtool.c new file mode 100644 index 0000000..9b581cd --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/commandline/hidtool.c @@ -0,0 +1,127 @@ +/* Name: hidtool.c + * Project: hid-data example + * Author: Christian Starkjohann + * Creation Date: 2008-04-11 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hidtool.c 723 2009-03-16 19:04:32Z cs $ + */ + +#include +#include +#include +#include "hiddata.h" +#include "../firmware/usbconfig.h" /* for device VID, PID, vendor name and product name */ + +/* ------------------------------------------------------------------------- */ + +static char *usbErrorMessage(int errCode) +{ +static char buffer[80]; + + switch(errCode){ + case USBOPEN_ERR_ACCESS: return "Access to device denied"; + case USBOPEN_ERR_NOTFOUND: return "The specified device was not found"; + case USBOPEN_ERR_IO: return "Communication error with device"; + default: + sprintf(buffer, "Unknown USB error %d", errCode); + return buffer; + } + return NULL; /* not reached */ +} + +static usbDevice_t *openDevice(void) +{ +usbDevice_t *dev = NULL; +unsigned char rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID}; +char vendorName[] = {USB_CFG_VENDOR_NAME, 0}, productName[] = {USB_CFG_DEVICE_NAME, 0}; +int vid = rawVid[0] + 256 * rawVid[1]; +int pid = rawPid[0] + 256 * rawPid[1]; +int err; + + if((err = usbhidOpenDevice(&dev, vid, vendorName, pid, productName, 0)) != 0){ + fprintf(stderr, "error finding %s: %s\n", productName, usbErrorMessage(err)); + return NULL; + } + return dev; +} + +/* ------------------------------------------------------------------------- */ + +static void hexdump(char *buffer, int len) +{ +int i; +FILE *fp = stdout; + + for(i = 0; i < len; i++){ + if(i != 0){ + if(i % 16 == 0){ + fprintf(fp, "\n"); + }else{ + fprintf(fp, " "); + } + } + fprintf(fp, "0x%02x", buffer[i] & 0xff); + } + if(i != 0) + fprintf(fp, "\n"); +} + +static int hexread(char *buffer, char *string, int buflen) +{ +char *s; +int pos = 0; + + while((s = strtok(string, ", ")) != NULL && pos < buflen){ + string = NULL; + buffer[pos++] = (char)strtol(s, NULL, 0); + } + return pos; +} + +/* ------------------------------------------------------------------------- */ + +static void usage(char *myName) +{ + fprintf(stderr, "usage:\n"); + fprintf(stderr, " %s read\n", myName); + fprintf(stderr, " %s write \n", myName); +} + +int main(int argc, char **argv) +{ +usbDevice_t *dev; +char buffer[129]; /* room for dummy report ID */ +int err; + + if(argc < 2){ + usage(argv[0]); + exit(1); + } + if((dev = openDevice()) == NULL) + exit(1); + if(strcasecmp(argv[1], "read") == 0){ + int len = sizeof(buffer); + if((err = usbhidGetReport(dev, 0, buffer, &len)) != 0){ + fprintf(stderr, "error reading data: %s\n", usbErrorMessage(err)); + }else{ + hexdump(buffer + 1, sizeof(buffer) - 1); + } + }else if(strcasecmp(argv[1], "write") == 0){ + int i, pos; + memset(buffer, 0, sizeof(buffer)); + for(pos = 1, i = 2; i < argc && pos < sizeof(buffer); i++){ + pos += hexread(buffer + pos, argv[i], sizeof(buffer) - pos); + } + if((err = usbhidSetReport(dev, buffer, sizeof(buffer))) != 0) /* add a dummy report ID */ + fprintf(stderr, "error writing data: %s\n", usbErrorMessage(err)); + }else{ + usage(argv[0]); + exit(1); + } + usbhidCloseDevice(dev); + return 0; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/Makefile new file mode 100644 index 0000000..5876ab0 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/Makefile @@ -0,0 +1,164 @@ +# Name: Makefile +# Project: hid-data example +# Author: Christian Starkjohann +# Creation Date: 2008-04-07 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + +DEVICE = atmega168 +F_CPU = 16000000 # in Hz +FUSE_L = # see below for fuse values for particular devices +FUSE_H = +AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer + +CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 +OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) + +############################################################################## +# Fuse values for particular devices +############################################################################## +# If your device is not listed here, go to +# http://palmavr.sourceforge.net/cgi-bin/fc.cgi +# and choose options for external crystal clock and no clock divider +# +################################## ATMega8 ################################## +# ATMega8 FUSE_L (Fuse low byte): +# 0x9f = 1 0 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ BODEN (BrownOut Detector enabled) +# +-------------------- BODLEVEL (2.7V) +# ATMega8 FUSE_H (Fuse high byte): +# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) +# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 +# | | | | | +-------- BOOTSZ1 +# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) +# | | | +-------------- CKOPT (full output swing) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ WDTON (WDT not always on) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATMega48/88/168 ############################## +# ATMega*8 FUSE_L (Fuse low byte): +# 0xdf = 1 1 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ CKOUT (if 0: Clock output enabled) +# +-------------------- CKDIV8 (if 0: divide by 8) +# ATMega*8 FUSE_H (Fuse high byte): +# 0xde = 1 1 0 1 1 1 1 0 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V) +# | | | | + --------- EESAVE (preserve EEPROM over chip erase) +# | | | +-------------- WDTON (if 0: watchdog always on) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATTiny25/45/85 ############################### +# ATMega*5 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATMega*5 FUSE_H (Fuse high byte): +# 0xdd = 1 1 0 1 1 1 0 1 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (disable external reset -> enabled) +# +################################ ATTiny2313 ################################# +# ATTiny2313 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATTiny2313 FUSE_H (Fuse high byte): +# 0xdb = 1 1 0 1 1 0 1 1 +# ^ ^ ^ ^ \-+-/ ^ +# | | | | | +---- RSTDISBL (disable external reset -> enabled) +# | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# +-------------------- DWEN (debug wire enable) + + +# symbolic targets: +help: + @echo "This Makefile has no default rule. Use one of the following:" + @echo "make hex ....... to build main.hex" + @echo "make program ... to flash fuses and firmware" + @echo "make fuse ...... to flash the fuses" + @echo "make flash ..... to flash the firmware (use this on metaboard)" + @echo "make clean ..... to delete objects and hex file" + +hex: main.hex + +program: flash fuse + +# rule for programming fuse bits: +fuse: + @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ + { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } + $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m + +# rule for uploading firmware: +flash: main.hex + $(AVRDUDE) -U flash:w:main.hex:i + +# rule for deleting dependent files (those which can be built by Make): +clean: + rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s + +# Generic rule for compiling C files: +.c.o: + $(COMPILE) -c $< -o $@ + +# Generic rule for assembling Assembler source files: +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +# Generic rule for compiling C to assembler, used for debugging only. +.c.s: + $(COMPILE) -S $< -o $@ + +# file targets: + +# Since we don't want to ship the driver multipe times, we copy it into this project: +usbdrv: + cp -r ../../../usbdrv . + +main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it + $(COMPILE) -o main.elf $(OBJECTS) + +main.hex: main.elf + rm -f main.hex main.eep.hex + avr-objcopy -j .text -j .data -O ihex main.elf main.hex + avr-size main.hex + +# debugging targets: + +disasm: main.elf + avr-objdump -d main.elf + +cpp: + $(COMPILE) -E main.c diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/main.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/main.c new file mode 100644 index 0000000..aa4bf1d --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/main.c @@ -0,0 +1,141 @@ +/* Name: main.c + * Project: hid-data, example how to use HID for data transfer + * Author: Christian Starkjohann + * Creation Date: 2008-04-11 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: main.c 777 2010-01-15 18:34:48Z cs $ + */ + +/* +This example should run on most AVRs with only little changes. No special +hardware resources except INT0 are used. You may have to change usbconfig.h for +different I/O pins for USB. Please note that USB D+ must be the INT0 pin, or +at least be connected to INT0 as well. +*/ + +#include +#include +#include /* for sei() */ +#include /* for _delay_ms() */ +#include + +#include /* required by usbdrv.h */ +#include "usbdrv.h" +#include "oddebug.h" /* This is also an example for using debug macros */ + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +PROGMEM char usbHidReportDescriptor[22] = { /* USB report descriptor */ + 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0xa1, 0x01, // COLLECTION (Application) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x80, // REPORT_COUNT (128) + 0x09, 0x00, // USAGE (Undefined) + 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) + 0xc0 // END_COLLECTION +}; +/* Since we define only one feature report, we don't use report-IDs (which + * would be the first byte of the report). The entire report consists of 128 + * opaque data bytes. + */ + +/* The following variables store the status of the current data transfer */ +static uchar currentAddress; +static uchar bytesRemaining; + +/* ------------------------------------------------------------------------- */ + +/* usbFunctionRead() is called when the host requests a chunk of data from + * the device. For more information see the documentation in usbdrv/usbdrv.h. + */ +uchar usbFunctionRead(uchar *data, uchar len) +{ + if(len > bytesRemaining) + len = bytesRemaining; + eeprom_read_block(data, (uchar *)0 + currentAddress, len); + currentAddress += len; + bytesRemaining -= len; + return len; +} + +/* usbFunctionWrite() is called when the host sends a chunk of data to the + * device. For more information see the documentation in usbdrv/usbdrv.h. + */ +uchar usbFunctionWrite(uchar *data, uchar len) +{ + if(bytesRemaining == 0) + return 1; /* end of transfer */ + if(len > bytesRemaining) + len = bytesRemaining; + eeprom_write_block(data, (uchar *)0 + currentAddress, len); + currentAddress += len; + bytesRemaining -= len; + return bytesRemaining == 0; /* return 1 if this was the last chunk */ +} + +/* ------------------------------------------------------------------------- */ + +usbMsgLen_t usbFunctionSetup(uchar data[8]) +{ +usbRequest_t *rq = (void *)data; + + if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* HID class request */ + if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ + /* since we have only one report type, we can ignore the report-ID */ + bytesRemaining = 128; + currentAddress = 0; + return USB_NO_MSG; /* use usbFunctionRead() to obtain data */ + }else if(rq->bRequest == USBRQ_HID_SET_REPORT){ + /* since we have only one report type, we can ignore the report-ID */ + bytesRemaining = 128; + currentAddress = 0; + return USB_NO_MSG; /* use usbFunctionWrite() to receive data from host */ + } + }else{ + /* ignore vendor type requests, we don't use any */ + } + return 0; +} + +/* ------------------------------------------------------------------------- */ + +int main(void) +{ +uchar i; + + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + odDebugInit(); + DBG1(0x00, 0, 0); /* debug output: main starts */ + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ /* fake USB disconnect for > 250 ms */ + wdt_reset(); + _delay_ms(1); + } + usbDeviceConnect(); + sei(); + DBG1(0x01, 0, 0); /* debug output: main loop starts */ + for(;;){ /* main event loop */ + DBG1(0x02, 0, 0); /* debug output: main loop iterates */ + wdt_reset(); + usbPoll(); + } + return 0; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/usbconfig.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/usbconfig.h new file mode 100644 index 0000000..4831281 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-data/firmware/usbconfig.h @@ -0,0 +1,373 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 4 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 100 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 20 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 1 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 0 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */ +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID 0xdf, 0x05 /* obdev's shared PID for HIDs */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't' +#define USB_CFG_VENDOR_NAME_LEN 8 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'D', 'a', 't', 'a', 'S', 't', 'o', 'r', 'e' +#define USB_CFG_DEVICE_NAME_LEN 9 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 22 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +#endif /* __usbconfig_h_included__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/Readme.txt b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/Readme.txt new file mode 100644 index 0000000..e0c8142 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/Readme.txt @@ -0,0 +1,48 @@ +This is the Readme file for hid-mouse, an example of a USB mouse device. In +order to have as little dependencies on hardware and architecture as +possible, mouse movements are computed internally so that the mouse pointer +moves in a circle. + + +WHAT IS DEMONSTRATED? +===================== +This example demonstrates how HID class devices are implemented. The example +is kept as simple as possible, except the report descriptor which is taken +from a real-world mouse. + +It does NOT include a host side driver because all modern operating systems +include one. It does NOT implement USBRQ_HID_SET_REPORT and report-IDs. See +the "hid-data" example for this topic. It does NOT implement any special +features such as suspend mode etc. + + +PREREQUISITES +============= +Target hardware: You need an AVR based circuit based on one of the examples +(see the "circuits" directory at the top level of this package), e.g. the +metaboard (http://www.obdev.at/goto.php?t=metaboard). + +AVR development environment: You need the gcc tool chain for the AVR, see +the Prerequisites section in the top level Readme file for how to obtain it. + + +BUILDING THE FIRMWARE +===================== +Change to the "firmware" directory and modify Makefile according to your +architecture (CPU clock, target device, fuse values) and ISP programmer. Then +edit usbconfig.h according to your pin assignments for D+ and D-. The default +settings are for the metaboard hardware. + +Type "make hex" to build main.hex, then "make flash" to upload the firmware +to the device. Don't forget to run "make fuse" once to program the fuses. If +you use a prototyping board with boot loader, follow the instructions of the +boot loader instead. + +Please note that the first "make hex" copies the driver from the top level +into the firmware directory. If you use a different build system than our +Makefile, you must copy the driver by hand. + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/Makefile new file mode 100644 index 0000000..22b1227 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/Makefile @@ -0,0 +1,164 @@ +# Name: Makefile +# Project: hid-mouse example +# Author: Christian Starkjohann +# Creation Date: 2008-04-07 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + +DEVICE = atmega168 +F_CPU = 16000000 # in Hz +FUSE_L = # see below for fuse values for particular devices +FUSE_H = +AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer + +CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 +OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) + +############################################################################## +# Fuse values for particular devices +############################################################################## +# If your device is not listed here, go to +# http://palmavr.sourceforge.net/cgi-bin/fc.cgi +# and choose options for external crystal clock and no clock divider +# +################################## ATMega8 ################################## +# ATMega8 FUSE_L (Fuse low byte): +# 0x9f = 1 0 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ BODEN (BrownOut Detector enabled) +# +-------------------- BODLEVEL (2.7V) +# ATMega8 FUSE_H (Fuse high byte): +# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) +# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 +# | | | | | +-------- BOOTSZ1 +# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) +# | | | +-------------- CKOPT (full output swing) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ WDTON (WDT not always on) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATMega48/88/168 ############################## +# ATMega*8 FUSE_L (Fuse low byte): +# 0xdf = 1 1 0 1 1 1 1 1 +# ^ ^ \ / \--+--/ +# | | | +------- CKSEL 3..0 (external >8M crystal) +# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) +# | +------------------ CKOUT (if 0: Clock output enabled) +# +-------------------- CKDIV8 (if 0: divide by 8) +# ATMega*8 FUSE_H (Fuse high byte): +# 0xde = 1 1 0 1 1 1 1 0 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V) +# | | | | + --------- EESAVE (preserve EEPROM over chip erase) +# | | | +-------------- WDTON (if 0: watchdog always on) +# | | +---------------- SPIEN (allow serial programming) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (reset pin is enabled) +# +############################## ATTiny25/45/85 ############################### +# ATMega*5 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATMega*5 FUSE_H (Fuse high byte): +# 0xdd = 1 1 0 1 1 1 0 1 +# ^ ^ ^ ^ ^ \-+-/ +# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ DWEN (debug wire enable) +# +-------------------- RSTDISBL (disable external reset -> enabled) +# +################################ ATTiny2313 ################################# +# ATTiny2313 FUSE_L (Fuse low byte): +# 0xef = 1 1 1 0 1 1 1 1 +# ^ ^ \+/ \--+--/ +# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) +# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) +# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) +# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) +# ATTiny2313 FUSE_H (Fuse high byte): +# 0xdb = 1 1 0 1 1 0 1 1 +# ^ ^ ^ ^ \-+-/ ^ +# | | | | | +---- RSTDISBL (disable external reset -> enabled) +# | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) +# | | | +-------------- WDTON (watchdog timer always on -> disable) +# | | +---------------- SPIEN (enable serial programming -> enabled) +# | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) +# +-------------------- DWEN (debug wire enable) + + +# symbolic targets: +help: + @echo "This Makefile has no default rule. Use one of the following:" + @echo "make hex ....... to build main.hex" + @echo "make program ... to flash fuses and firmware" + @echo "make fuse ...... to flash the fuses" + @echo "make flash ..... to flash the firmware (use this on metaboard)" + @echo "make clean ..... to delete objects and hex file" + +hex: main.hex + +program: flash fuse + +# rule for programming fuse bits: +fuse: + @[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ + { echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } + $(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m + +# rule for uploading firmware: +flash: main.hex + $(AVRDUDE) -U flash:w:main.hex:i + +# rule for deleting dependent files (those which can be built by Make): +clean: + rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s + +# Generic rule for compiling C files: +.c.o: + $(COMPILE) -c $< -o $@ + +# Generic rule for assembling Assembler source files: +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +# Generic rule for compiling C to assembler, used for debugging only. +.c.s: + $(COMPILE) -S $< -o $@ + +# file targets: + +# Since we don't want to ship the driver multipe times, we copy it into this project: +usbdrv: + cp -r ../../../usbdrv . + +main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it + $(COMPILE) -o main.elf $(OBJECTS) + +main.hex: main.elf + rm -f main.hex main.eep.hex + avr-objcopy -j .text -j .data -O ihex main.elf main.hex + avr-size main.hex + +# debugging targets: + +disasm: main.elf + avr-objdump -d main.elf + +cpp: + $(COMPILE) -E main.c diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/main.c b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/main.c new file mode 100644 index 0000000..747f643 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/main.c @@ -0,0 +1,164 @@ +/* Name: main.c + * Project: hid-mouse, a very simple HID example + * Author: Christian Starkjohann + * Creation Date: 2008-04-07 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: main.c 790 2010-05-30 21:00:26Z cs $ + */ + +/* +This example should run on most AVRs with only little changes. No special +hardware resources except INT0 are used. You may have to change usbconfig.h for +different I/O pins for USB. Please note that USB D+ must be the INT0 pin, or +at least be connected to INT0 as well. + +We use VID/PID 0x046D/0xC00E which is taken from a Logitech mouse. Don't +publish any hardware using these IDs! This is for demonstration only! +*/ + +#include +#include +#include /* for sei() */ +#include /* for _delay_ms() */ + +#include /* required by usbdrv.h */ +#include "usbdrv.h" +#include "oddebug.h" /* This is also an example for using debug macros */ + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +PROGMEM char usbHidReportDescriptor[52] = { /* USB report descriptor, size must match usbconfig.h */ + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x02, // USAGE (Mouse) + 0xa1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Pointer) + 0xA1, 0x00, // COLLECTION (Physical) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM + 0x29, 0x03, // USAGE_MAXIMUM + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x03, // REPORT_COUNT (3) + 0x75, 0x01, // REPORT_SIZE (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x05, // REPORT_SIZE (5) + 0x81, 0x03, // INPUT (Const,Var,Abs) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x09, 0x38, // USAGE (Wheel) + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7F, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x03, // REPORT_COUNT (3) + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0xC0, // END_COLLECTION + 0xC0, // END COLLECTION +}; +/* This is the same report descriptor as seen in a Logitech mouse. The data + * described by this descriptor consists of 4 bytes: + * . . . . . B2 B1 B0 .... one byte with mouse button states + * X7 X6 X5 X4 X3 X2 X1 X0 .... 8 bit signed relative coordinate x + * Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 .... 8 bit signed relative coordinate y + * W7 W6 W5 W4 W3 W2 W1 W0 .... 8 bit signed relative coordinate wheel + */ +typedef struct{ + uchar buttonMask; + char dx; + char dy; + char dWheel; +}report_t; + +static report_t reportBuffer; +static int sinus = 7 << 6, cosinus = 0; +static uchar idleRate; /* repeat rate for keyboards, never used for mice */ + + +/* The following function advances sin/cos by a fixed angle + * and stores the difference to the previous coordinates in the report + * descriptor. + * The algorithm is the simulation of a second order differential equation. + */ +static void advanceCircleByFixedAngle(void) +{ +char d; + +#define DIVIDE_BY_64(val) (val + (val > 0 ? 32 : -32)) >> 6 /* rounding divide */ + reportBuffer.dx = d = DIVIDE_BY_64(cosinus); + sinus += d; + reportBuffer.dy = d = DIVIDE_BY_64(sinus); + cosinus -= d; +} + +/* ------------------------------------------------------------------------- */ + +usbMsgLen_t usbFunctionSetup(uchar data[8]) +{ +usbRequest_t *rq = (void *)data; + + /* The following requests are never used. But since they are required by + * the specification, we implement them in this example. + */ + if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */ + DBG1(0x50, &rq->bRequest, 1); /* debug output: print our request */ + if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ + /* we only have one report type, so don't look at wValue */ + usbMsgPtr = (void *)&reportBuffer; + return sizeof(reportBuffer); + }else if(rq->bRequest == USBRQ_HID_GET_IDLE){ + usbMsgPtr = &idleRate; + return 1; + }else if(rq->bRequest == USBRQ_HID_SET_IDLE){ + idleRate = rq->wValue.bytes[1]; + } + }else{ + /* no vendor specific requests implemented */ + } + return 0; /* default for not implemented requests: return no data back to host */ +} + +/* ------------------------------------------------------------------------- */ + +int __attribute__((noreturn)) main(void) +{ +uchar i; + + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + odDebugInit(); + DBG1(0x00, 0, 0); /* debug output: main starts */ + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ /* fake USB disconnect for > 250 ms */ + wdt_reset(); + _delay_ms(1); + } + usbDeviceConnect(); + sei(); + DBG1(0x01, 0, 0); /* debug output: main loop starts */ + for(;;){ /* main event loop */ + DBG1(0x02, 0, 0); /* debug output: main loop iterates */ + wdt_reset(); + usbPoll(); + if(usbInterruptIsReady()){ + /* called after every poll of the interrupt endpoint */ + advanceCircleByFixedAngle(); + DBG1(0x03, 0, 0); /* debug output: interrupt report prepared */ + usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer)); + } + } +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/usbconfig.h b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/usbconfig.h new file mode 100644 index 0000000..c16a146 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/hid-mouse/firmware/usbconfig.h @@ -0,0 +1,373 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 4 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 100 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 20 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 0 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 0 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */ +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID 0xe8, 0x03 /* VOTI's lab use PID */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't' +#define USB_CFG_VENDOR_NAME_LEN 8 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'M', 'o', 'u', 's', 'e' +#define USB_CFG_DEVICE_NAME_LEN 5 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 52 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +#endif /* __usbconfig_h_included__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile new file mode 100644 index 0000000..d41aba6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile @@ -0,0 +1,48 @@ +# Name: Makefile +# Project: usbtool +# Author: Christian Starkjohann +# Creation Date: 2008-04-06 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ + + +# Concigure the following definitions according to your system. +# This Makefile has been tested on Mac OS X, Linux and Windows. + +# Use the following 3 lines on Unix (uncomment the framework on Mac OS X): +USBFLAGS = `libusb-config --cflags` +USBLIBS = `libusb-config --libs` +EXE_SUFFIX = + +# Use the following 3 lines on Windows and comment out the 3 above. You may +# have to change the include paths to where you installed libusb-win32 +#USBFLAGS = -I/usr/local/include +#USBLIBS = -L/usr/local/lib -lusb +#EXE_SUFFIX = .exe + +NAME = usbtool + +OBJECTS = opendevice.o $(NAME).o + +CC = gcc +CFLAGS = $(CPPFLAGS) $(USBFLAGS) -O -g -Wall +LIBS = $(USBLIBS) + +PROGRAM = $(NAME)$(EXE_SUFFIX) + + +all: $(PROGRAM) + +.c.o: + $(CC) $(CFLAGS) -c $< + +$(PROGRAM): $(OBJECTS) + $(CC) -o $(PROGRAM) $(OBJECTS) $(LIBS) + +strip: $(PROGRAM) + strip $(PROGRAM) + +clean: + rm -f *.o $(PROGRAM) diff --git a/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile.windows b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile.windows new file mode 100644 index 0000000..fa910fc --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Makefile.windows @@ -0,0 +1,18 @@ +# Name: Makefile.windows +# Project: usbtool +# Author: Christian Starkjohann +# Creation Date: 2008-04-06 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id$ + +# You may use this file with +# make -f Makefile.windows +# on Windows with MinGW instead of editing the main Makefile. + +include Makefile + +USBFLAGS = -I/usr/local/mingw/include +USBLIBS = -L/usr/local/mingw/lib -lusb +EXE_SUFFIX = .exe diff --git a/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Readme.txt b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Readme.txt new file mode 100644 index 0000000..33f527c --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/Readme.txt @@ -0,0 +1,209 @@ +This is the Readme file for usbtool, a general purpose command line utility +which can send USB requests to arbitrary devices. Usbtool is based on libusb. + + +WHAT IS USBTOOL GOOD FOR? +========================= +When you implement a communication protocol like USB, you must usually write +two programs: one on each end of the communication. For USB, this means that +you must write a firmware for the device and driver software for the host. + +Usbtool can save you the work of writing the host software, at least during +firmware development and testing. Usbtool can send control-in and -out +requests to arbitrary devices and send and receive data on interrupt- and +bulk-endpoints. + +Usbtool is not only a useful developer tool, it's also an example for using +libusb for communication with the device. + + +SYNOPSIS +======== + usbtool [options] + + +COMMANDS +======== + list + This command prints a list of devices found on all available USB busses. + Options -v, -V, -p and -P can be used to filter the list. + + control in|out + Sends a control-in or control-out request to the device. The request + parameters are: + type ........ Type of request, can be "standard", "class", "vendor" or + "reserved". The type determines which software module in + the device is responsible for answering the request: + Standard requests are answered by the driver, class + requests by the class implementation (e.g. HID, CDC) and + vendor requests by custom code. + recipient ... Recipient of the request in the device. Can be "device", + "interface", "endpoint" or "other". For standard and + class requests, the specification defines a recipient for + each request. For vendor requests, choose whatever your + code expects. + request ..... 8 bit numeric value identifying the request. + value ....... 16 bit numeric value passed to the device. + index ....... another 16 bit numeric value passed to the device. + Use options -v, -V, -p and -P to single out a particular device. Use + options -d or -D to to send data in an OUT request. Use options -n, -O + and -b to determine what to do with data received in an IN request. + + interrupt in|out + Sends or receives data on an interrupt-out resp. -in endpoint. + Use options -v, -V, -p and -P to single out a particular device. Use + options -d or -D to to send data to an OUT endpoint. Use options -n, -O + and -b to determine what to do with data received from an IN endpoint. + Use option -e to set the endpoint number, -c to choose a configuration + -i to claim a particular interface. + + bulk in|out + Same as "interrupt in" and "interrupt out", but for bulk endpoints. + + +OPTIONS +======= +Most options have already been mentioned at the commands which use them. +here is a complete list: + + -h or -? + Prints a short help. + + -v + Numeric vendor ID, can be "*" to allow any VID. Take only devices with + matching vendor ID into account. + + -p + Numeric product ID, can be "*" to allow any PID. Take only devices with + matching product ID into account. + + -V + Shell style matching pattern for vendor name. Take only devices into + account which have a vendor name that matches this pattern. + + -P + Shell style matching pattern for product name. Take only devices into + account which have a product name that matches this pattern. + + -S + Shell style matching pattern for serial number. Take only devices into + account which have a serial number that matches this pattern. + + -d + Data bytes to send to the device, comma separated list of numeric values. + E.g.: "1,2,3,4,5". + + -D + Binary data sent to the device should be taken from this file. + + -O + Write received data bytes to the given file. Format is either hex or + binary, depending on the -b flag. By default, received data is printed + to standard output. + + -b + Request binary output format for files and standard output. Default is + a hexadecimal listing. + + -n + Numeric value: Maximum number of bytes to receive. This value is passed + directly to the libusb API functions. + + -e + Numeric value: Endpoint number for interrupt and bulk commands. + + -t + Numeric value: Timeout in milliseconds for the request. This value is + passed directly to the libusb API functions. + + -c + Numeric value: Interrupt and bulk endpoints can usually only be used if + a configuration and an interface has been chosen. Use -c and -i to + specify configuration and interface values. + + -i + Numeric value: Interrupt and bulk endpoints can usually only be used if + a configuration and an interface has been chosen. Use -c and -i to + specify configuration and interface values. + + -w + Usbtool may be too verbose with warnings for some applications. Use this + option to suppress USB warnings. + + +NUMERIC VALUES +============== +All numeric values can be given in hexadecimal, decimal or octal. Hex values +are identified by their 0x or 0X prefix, octal values by a leading "0" (the +digit zero) and decimal values because they start with a non-zero digit. An +optional sign character is allowed. The special value "*" is translated to +zero and stands for "any value" in some contexts. + + +SHELL STYLE MATCHING PATTERNS +============================= +Some options take shell style matching patterns as an argument. This refers +to Unix shells and their file wildcard operations: + + "*" (asterisk character) matches any number (0 to infinite) of any + characters. + + "?" matches exactly one arbitrary character. + + A list of characters in square brackets (e.g. "[abc]") matches any of the + characters in the list. If a dash ("-") is in the list, it must be the + first or the last character. If a caret ("^") is in the list, it must + not be the first character. A closing square bracket ("]") must be the + first character in the list. A range of characters can be specified in + the way "[a-z]". This matches all characters with numeric representation + (usually ASCII) starting with "a" and ending with "z". The entire + construct matches only one character. + + A list of characters in square brackets starting with a caret ("^"), e.g. + ("[^abc]") matches any character NOT in the list. The other rules are as + above. + + "\" (backslash) followed by any character matches that following + character. This can be used to escape "*", "?", "[" and "\". + + +BUILDING USBTOOL +================ +Usbtool uses libusb on Unix and libusb-win32 on Windows. These libraries can +be obtained from http://libusb.sourceforge.net/ and +http://libusb-win32.sourceforge.net/ respectively. On Unix, a simple "make" +should compile the sources (although you may have to edit Makefile to +include or remove additional libraries). On Windows, we recommend that you +use MinGW and MSYS. See the top level Readme file for details. Edit +Makefile.windows according to your library installation paths and build with +"make -f Makefile.windows". + + +EXAMPLES +======== +To list all devices connected to your computer, do + + usbtool -w list + +To check whether our selection options single out the desired device, use eg. + + usbtool -w -P LEDControl list + +This command shows all LEDControl devices connected or prints nothing if +none is found. LEDControl is the device from the "custom-class" example. + +You can also send commands to the LEDControl device using usbtool. From +the file requests.h in custom-class/firmware, we know that the set-status +request has numeric value 1 and the get-status request is 2. See this file +for details of the protocol used. We can therefore query the status with + + usbtool -w -P LEDControl control in vendor device 2 0 0 + +This command prints 0x00 if the LED is off or 0x01 if it is on. To turn the +LED on, use + + usbtool -w -P LEDControl control out vendor device 1 1 0 + +and to turn it off, use + + usbtool -w -P LEDControl control out vendor device 1 0 0 + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.c b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.c new file mode 100644 index 0000000..137f50c --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.c @@ -0,0 +1,203 @@ +/* Name: opendevice.c + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.c 740 2009-04-13 18:23:31Z cs $ + */ + +/* +General Description: +The functions in this module can be used to find and open a device based on +libusb or libusb-win32. +*/ + +#include +#include "opendevice.h" + +/* ------------------------------------------------------------------------- */ + +#define MATCH_SUCCESS 1 +#define MATCH_FAILED 0 +#define MATCH_ABORT -1 + +/* private interface: match text and p, return MATCH_SUCCESS, MATCH_FAILED, or MATCH_ABORT. */ +static int _shellStyleMatch(char *text, char *p) +{ +int last, matched, reverse; + + for(; *p; text++, p++){ + if(*text == 0 && *p != '*') + return MATCH_ABORT; + switch(*p){ + case '\\': + /* Literal match with following character. */ + p++; + /* FALLTHROUGH */ + default: + if(*text != *p) + return MATCH_FAILED; + continue; + case '?': + /* Match anything. */ + continue; + case '*': + while(*++p == '*') + /* Consecutive stars act just like one. */ + continue; + if(*p == 0) + /* Trailing star matches everything. */ + return MATCH_SUCCESS; + while(*text) + if((matched = _shellStyleMatch(text++, p)) != MATCH_FAILED) + return matched; + return MATCH_ABORT; + case '[': + reverse = p[1] == '^'; + if(reverse) /* Inverted character class. */ + p++; + matched = MATCH_FAILED; + if(p[1] == ']' || p[1] == '-') + if(*++p == *text) + matched = MATCH_SUCCESS; + for(last = *p; *++p && *p != ']'; last = *p) + if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p) + matched = MATCH_SUCCESS; + if(matched == reverse) + return MATCH_FAILED; + continue; + } + } + return *text == 0; +} + +/* public interface for shell style matching: returns 0 if fails, 1 if matches */ +static int shellStyleMatch(char *text, char *pattern) +{ + if(pattern == NULL) /* NULL pattern is synonymous to "*" */ + return 1; + return _shellStyleMatch(text, pattern) == MATCH_SUCCESS; +} + +/* ------------------------------------------------------------------------- */ + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */ + return rval; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING){ + *buf = 0; + return 0; + } + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1: */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + +/* ------------------------------------------------------------------------- */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USBOPEN_ERR_NOTFOUND; + + usb_find_busses(); + usb_find_devices(); + for(bus = usb_get_busses(); bus; bus = bus->next){ + for(dev = bus->devices; dev; dev = dev->next){ /* iterate over all devices on all busses */ + if((vendorID == 0 || dev->descriptor.idVendor == vendorID) + && (productID == 0 || dev->descriptor.idProduct == productID)){ + char vendor[256], product[256], serial[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot open VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + continue; + } + /* now check whether the names match: */ + len = vendor[0] = 0; + if(dev->descriptor.iManufacturer > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, vendor, sizeof(vendor)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query manufacturer for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen device from vendor ->%s<-\n", vendor); */ + if(shellStyleMatch(vendor, vendorNamePattern)){ + len = product[0] = 0; + if(dev->descriptor.iProduct > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iProduct, product, sizeof(product)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query product for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen product ->%s<-\n", product); */ + if(shellStyleMatch(product, productNamePattern)){ + len = serial[0] = 0; + if(dev->descriptor.iSerialNumber > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, serial, sizeof(serial)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query serial for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + } + if(shellStyleMatch(serial, serialNamePattern)){ + if(printMatchingDevicesFp != NULL){ + if(serial[0] == 0){ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product); + }else{ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\" serial=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product, serial); + } + }else{ + break; + } + } + } + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) /* we have found a deice */ + break; + } + if(handle != NULL){ + errorCode = 0; + *device = handle; + } + if(printMatchingDevicesFp != NULL) /* never return an error for listing only */ + errorCode = 0; + return errorCode; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.h b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.h new file mode 100644 index 0000000..79c12f6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/opendevice.h @@ -0,0 +1,77 @@ +/* Name: opendevice.h + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.h 755 2009-08-03 17:01:21Z cs $ + */ + +/* +General Description: +This module offers additional functionality for host side drivers based on +libusb or libusb-win32. It includes a function to find and open a device +based on numeric IDs and textual description. It also includes a function to +obtain textual descriptions from a device. + +To use this functionality, simply copy opendevice.c and opendevice.h into your +project and add them to your Makefile. You may modify and redistribute these +files according to the GNU General Public License (GPL) version 2 or 3. +*/ + +#ifndef __OPENDEVICE_H_INCLUDED__ +#define __OPENDEVICE_H_INCLUDED__ + +#include /* this is libusb, see http://libusb.sourceforge.net/ */ +#include + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen); +/* This function gets a string descriptor from the device. 'index' is the + * string descriptor index. The string is returned in ISO Latin 1 encoding in + * 'buf' and it is terminated with a 0-character. The buffer size must be + * passed in 'buflen' to prevent buffer overflows. A libusb device handle + * must be given in 'dev'. + * Returns: The length of the string (excluding the terminating 0) or + * a negative number in case of an error. If there was an error, use + * usb_strerror() to obtain the error message. + */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp); +/* This function iterates over all devices on all USB busses and searches for + * a device. Matching is done first by means of Vendor- and Product-ID (passed + * in 'vendorID' and 'productID'. An ID of 0 matches any numeric ID (wildcard). + * When a device matches by its IDs, matching by names is performed. Name + * matching can be done on textual vendor name ('vendorNamePattern'), product + * name ('productNamePattern') and serial number ('serialNamePattern'). A + * device matches only if all non-null pattern match. If you don't care about + * a string, pass NULL for the pattern. Patterns are Unix shell style pattern: + * '*' stands for 0 or more characters, '?' for one single character, a list + * of characters in square brackets for a single character from the list + * (dashes are allowed to specify a range) and if the lis of characters begins + * with a caret ('^'), it matches one character which is NOT in the list. + * Other parameters to the function: If 'warningsFp' is not NULL, warning + * messages are printed to this file descriptor with fprintf(). If + * 'printMatchingDevicesFp' is not NULL, no device is opened but matching + * devices are printed to the given file descriptor with fprintf(). + * If a device is opened, the resulting USB handle is stored in '*device'. A + * pointer to a "usb_dev_handle *" type variable must be passed here. + * Returns: 0 on success, an error code (see defines below) on failure. + */ + +/* usbOpenDevice() error codes: */ +#define USBOPEN_SUCCESS 0 /* no error */ +#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */ +#define USBOPEN_ERR_IO 2 /* I/O error */ +#define USBOPEN_ERR_NOTFOUND 3 /* device not found */ + + +/* Obdev's free USB IDs, see USB-IDs-for-free.txt for details */ + +#define USB_VID_OBDEV_SHARED 5824 /* obdev's shared vendor ID */ +#define USB_PID_OBDEV_SHARED_CUSTOM 1500 /* shared PID for custom class devices */ +#define USB_PID_OBDEV_SHARED_HID 1503 /* shared PID for HIDs except mice & keyboards */ +#define USB_PID_OBDEV_SHARED_CDCACM 1505 /* shared PID for CDC Modem devices */ +#define USB_PID_OBDEV_SHARED_MIDI 1508 /* shared PID for MIDI class devices */ + +#endif /* __OPENDEVICE_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/examples/usbtool/usbtool.c b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/usbtool.c new file mode 100644 index 0000000..dc7e4eb --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/examples/usbtool/usbtool.c @@ -0,0 +1,356 @@ +/* Name: usbtool.c + * Project: V-USB examples, host side + * Author: Christian Starkjohann + * Creation Date: 2008-04-06 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbtool.c 740 2009-04-13 18:23:31Z cs $ + */ + +/* +General Description: +This command line tool can perform various USB requests at arbitrary +USB devices. It is intended as universal host side tool for experimentation +and debugging purposes. It must be linked with libusb, a library for accessing +the USB bus from Linux, FreeBSD, Mac OS X and other Unix operating systems. +Libusb can be obtained from http://libusb.sourceforge.net/. +On Windows use libusb-win32 from http://libusb-win32.sourceforge.net/. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include /* this is libusb, see http://libusb.sourceforge.net/ */ +#include "opendevice.h" /* common code moved to separate module */ + +#define DEFAULT_USB_VID 0 /* any */ +#define DEFAULT_USB_PID 0 /* any */ + +static void usage(char *name) +{ + fprintf(stderr, "usage: %s [options] \n", name); + fprintf(stderr, + "Options are:\n" + " -h or -? (print this help and exit)\n" + " -v (defaults to 0x%x, can be '*' for any VID)\n" + " -p (defaults to 0x%x, can be '*' for any PID)\n" + " -V (shell style matching, defaults to '*')\n" + " -P (shell style matching, defaults to '*')\n" + " -S (shell style matching, defaults to '*')\n" + " -d (data byte for request, comma separated list)\n" + " -D (binary data for request taken from file)\n" + " -O (write received data bytes to file)\n" + " -b (binary output format, default is hex)\n" + " -n (maximum number of bytes to receive)\n" + " -e (specify endpoint for some commands)\n" + " -t (specify USB timeout in milliseconds)\n" + " -c (device configuration to choose)\n" + " -i (configuration interface to claim)\n" + " -w (suppress USB warnings, default is verbose)\n" + "\n" + "Commands are:\n" + " list (list all matching devices by name)\n" + " control in|out (send control request)\n" + " interrupt in|out (send or receive interrupt data)\n" + " bulk in|out (send or receive bulk data)\n" + "For valid enum values for and pass \"x\" for the value.\n" + "Objective Development's free VID/PID pairs are:\n" + " 5824/1500 for vendor class devices\n" + " 5824/1503 for HID class devices excluding mice and keyboards\n" + " 5824/1505 for CDC-ACM class devices\n" + " 5824/1508 for MIDI class devices\n" + , DEFAULT_USB_VID, DEFAULT_USB_PID + ); + + +} + +static int vendorID = DEFAULT_USB_VID; +static int productID = DEFAULT_USB_PID; +static char *vendorNamePattern = "*"; +static char *productNamePattern = "*"; +static char *serialPattern = "*"; +static char *sendBytes = NULL; +static int sendByteCount; +static char *outputFile = NULL; +static int endpoint = 0; +static int outputFormatIsBinary = 0; +static int showWarnings = 1; +static int usbTimeout = 5000; +static int usbCount = 128; +static int usbConfiguration = 1; +static int usbInterface = 0; + +static int usbDirection, usbType, usbRecipient, usbRequest, usbValue, usbIndex; /* arguments of control transfer */ + +/* ------------------------------------------------------------------------- */ + +/* ASCII to integer (number parsing) which allows hex (0x prefix), + * octal (0 prefix) and decimal (1-9 prefix) input. + */ +static int myAtoi(char *text) +{ +long l; +char *endPtr; + + if(strcmp(text, "*") == 0) + return 0; + l = strtol(text, &endPtr, 0); + if(endPtr == text){ + fprintf(stderr, "warning: can't parse numeric parameter ->%s<-, defaults to 0.\n", text); + l = 0; + }else if(*endPtr != 0){ + fprintf(stderr, "warning: numeric parameter ->%s<- only partially parsed.\n", text); + } + return l; +} + +static int parseEnum(char *text, ...) +{ +va_list vlist; +char *entries[64]; +int i, numEntries; + + va_start(vlist, text); + for(i = 0; i < 64; i++){ + entries[i] = va_arg(vlist, char *); + if(entries[i] == NULL) + break; + } + numEntries = i; + va_end(vlist); + for(i = 0; i < numEntries; i++){ + if(strcasecmp(text, entries[i]) == 0) + return i; + } + if(isdigit(*text)){ + return myAtoi(text); + } + fprintf(stderr, "Enum value \"%s\" not allowed. Allowed values are:\n", text); + for(i = 0; i < numEntries; i++){ + fprintf(stderr, " %s\n", entries[i]); + } + exit(1); +} + +/* ------------------------------------------------------------------------- */ + +#define ACTION_LIST 0 +#define ACTION_CONTROL 1 +#define ACTION_INTERRUPT 2 +#define ACTION_BULK 3 + +int main(int argc, char **argv) +{ +usb_dev_handle *handle = NULL; +int opt, len, action, argcnt; +char *myName = argv[0], *s, *rxBuffer = NULL; +FILE *fp; + + while((opt = getopt(argc, argv, "?hv:p:V:P:S:d:D:O:e:n:tbw")) != -1){ + switch(opt){ + case 'h': + case '?': /* -h or -? (print this help and exit) */ + usage(myName); + exit(1); + case 'v': /* -v (defaults to 0x%x, can be '*' for any VID) */ + vendorID = myAtoi(optarg); + break; + case 'p': /* -p (defaults to 0x%x, can be '*' for any PID) */ + productID = myAtoi(optarg); + break; + case 'V': /* -V (shell style matching, defaults to '*') */ + vendorNamePattern = optarg; + break; + case 'P': /* -P (shell style matching, defaults to '*') */ + productNamePattern = optarg; + break; + case 'S': /* -S (shell style matching, defaults to '*') */ + serialPattern = optarg; + break; + case 'd': /* -d (data bytes for requests given on command line) */ + while((s = strtok(optarg, ", ")) != NULL){ + optarg = NULL; + if(sendBytes != NULL){ + sendBytes = realloc(sendBytes, sendByteCount + 1); + }else{ + sendBytes = malloc(sendByteCount + 1); + } + sendBytes[sendByteCount++] = myAtoi(s); + } + break; + case 'D': /* -D (data bytes for request taken from file) */ + if((fp = fopen(optarg, "rb")) == NULL){ + fprintf(stderr, "error opening %s: %s\n", optarg, strerror(errno)); + exit(1); + } + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if(sendBytes != NULL){ + sendBytes = realloc(sendBytes, sendByteCount + len); + }else{ + sendBytes = malloc(sendByteCount + len); + } + fread(sendBytes + sendByteCount, 1, len, fp); /* would need error checking */ + sendByteCount += len; + fclose(fp); + break; + case 'O': /* -O (write received data bytes to file) */ + outputFile = optarg; + break; + case 'e': /* -e (specify endpoint for some commands) */ + endpoint = myAtoi(optarg); + break; + case 't': /* -t (specify USB timeout in milliseconds) */ + usbTimeout = myAtoi(optarg); + break; + case 'b': /* -b (binary output format, default is hex) */ + outputFormatIsBinary = 1; + break; + case 'n': /* -n (maximum number of bytes to receive) */ + usbCount = myAtoi(optarg); + break; + case 'c': /* -c (device configuration to choose) */ + usbConfiguration = myAtoi(optarg); + break; + case 'i': /* -i (configuration interface to claim) */ + usbInterface = myAtoi(optarg); + break; + case 'w': /* -w (suppress USB warnings, default is verbose) */ + showWarnings = 0; + break; + default: + fprintf(stderr, "Option -%c unknown\n", opt); + exit(1); + } + } + argc -= optind; + argv += optind; + if(argc < 1){ + usage(myName); + exit(1); + } + argcnt = 2; + if(strcasecmp(argv[0], "list") == 0){ + action = ACTION_LIST; + argcnt = 1; + }else if(strcasecmp(argv[0], "control") == 0){ + action = ACTION_CONTROL; + argcnt = 7; + }else if(strcasecmp(argv[0], "interrupt") == 0){ + action = ACTION_INTERRUPT; + }else if(strcasecmp(argv[0], "bulk") == 0){ + action = ACTION_BULK; + }else{ + fprintf(stderr, "command %s not known\n", argv[0]); + usage(myName); + exit(1); + } + if(argc < argcnt){ + fprintf(stderr, "Not enough arguments.\n"); + usage(myName); + exit(1); + } + if(argc > argcnt){ + fprintf(stderr, "Warning: only %d arguments expected, rest ignored.\n", argcnt); + } + usb_init(); + if(usbOpenDevice(&handle, vendorID, vendorNamePattern, productID, productNamePattern, serialPattern, action == ACTION_LIST ? stdout : NULL, showWarnings ? stderr : NULL) != 0){ + fprintf(stderr, "Could not find USB device with VID=0x%x PID=0x%x Vname=%s Pname=%s Serial=%s\n", vendorID, productID, vendorNamePattern, productNamePattern, serialPattern); + exit(1); + } + if(action == ACTION_LIST) + exit(0); /* we've done what we were asked to do already */ + usbDirection = parseEnum(argv[1], "out", "in", NULL); + if(usbDirection){ /* IN transfer */ + rxBuffer = malloc(usbCount); + } + if(action == ACTION_CONTROL){ + int requestType; + usbType = parseEnum(argv[2], "standard", "class", "vendor", "reserved", NULL); + usbRecipient = parseEnum(argv[3], "device", "interface", "endpoint", "other", NULL); + usbRequest = myAtoi(argv[4]); + usbValue = myAtoi(argv[5]); + usbIndex = myAtoi(argv[6]); + requestType = ((usbDirection & 1) << 7) | ((usbType & 3) << 5) | (usbRecipient & 0x1f); + if(usbDirection){ /* IN transfer */ + len = usb_control_msg(handle, requestType, usbRequest, usbValue, usbIndex, rxBuffer, usbCount, usbTimeout); + }else{ /* OUT transfer */ + len = usb_control_msg(handle, requestType, usbRequest, usbValue, usbIndex, sendBytes, sendByteCount, usbTimeout); + } + }else{ /* must be ACTION_INTERRUPT or ACTION_BULK */ + int retries = 1; + if(usb_set_configuration(handle, usbConfiguration) && showWarnings){ + fprintf(stderr, "Warning: could not set configuration: %s\n", usb_strerror()); + } + /* now try to claim the interface and detach the kernel HID driver on + * linux and other operating systems which support the call. + */ + while((len = usb_claim_interface(handle, usbInterface)) != 0 && retries-- > 0){ +#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP + if(usb_detach_kernel_driver_np(handle, 0) < 0 && showWarnings){ + fprintf(stderr, "Warning: could not detach kernel driver: %s\n", usb_strerror()); + } +#endif + } + if(len != 0 && showWarnings) + fprintf(stderr, "Warning: could not claim interface: %s\n", usb_strerror()); + if(action == ACTION_INTERRUPT){ + if(usbDirection){ /* IN transfer */ + len = usb_interrupt_read(handle, endpoint, rxBuffer, usbCount, usbTimeout); + }else{ + len = usb_interrupt_write(handle, endpoint, sendBytes, sendByteCount, usbTimeout); + } + }else{ + if(usbDirection){ /* IN transfer */ + len = usb_bulk_read(handle, endpoint, rxBuffer, usbCount, usbTimeout); + }else{ + len = usb_bulk_write(handle, endpoint, sendBytes, sendByteCount, usbTimeout); + } + } + } + if(len < 0){ + fprintf(stderr, "USB error: %s\n", usb_strerror()); + exit(1); + } + if(usbDirection == 0) /* OUT */ + printf("%d bytes sent.\n", len); + if(rxBuffer != NULL){ + FILE *fp = stdout; + if(outputFile != NULL){ + fp = fopen(outputFile, outputFormatIsBinary ? "wb" : "w"); + if(fp == NULL){ + fprintf(stderr, "Error writing \"%s\": %s\n", outputFile, strerror(errno)); + exit(1); + } + } + if(outputFormatIsBinary){ + fwrite(rxBuffer, 1, len, fp); + }else{ + int i; + for(i = 0; i < len; i++){ + if(i != 0){ + if(i % 16 == 0){ + fprintf(fp, "\n"); + }else{ + fprintf(fp, " "); + } + } + fprintf(fp, "0x%02x", rxBuffer[i] & 0xff); + } + if(i != 0) + fprintf(fp, "\n"); + } + } + usb_close(handle); + if(rxBuffer != NULL) + free(rxBuffer); + return 0; +} diff --git a/adb2usb/uart2usb/vusb-20100715/libs-device/Readme.txt b/adb2usb/uart2usb/vusb-20100715/libs-device/Readme.txt new file mode 100644 index 0000000..76518dc --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-device/Readme.txt @@ -0,0 +1,22 @@ +This is the Readme file for the libs-device directory. This directory contains +code snippets which may be useful for USB device firmware. + + +WHAT IS INCLUDED IN THIS DIRECTORY? +=================================== + +osccal.c and osccal.h + This module contains a function which calibrates the AVR's built-in RC + oscillator based on the USB frame clock. See osccal.h for a documentation + of the API. + +osctune.h + This header file contains a code snippet for usbconfig.h. With this code, + you can keep the AVR's internal RC oscillator in sync with the USB frame + clock. This is a continuous synchronization, not a single calibration at + USB reset as with osccal.c above. Please note that this code works only + if D- is wired to the interrupt, not D+. + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-device/osccal.c b/adb2usb/uart2usb/vusb-20100715/libs-device/osccal.c new file mode 100644 index 0000000..939d5c3 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-device/osccal.c @@ -0,0 +1,63 @@ +/* Name: osccal.c + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: osccal.c 762 2009-08-12 17:10:30Z cs $ + */ + +#include + +#ifndef uchar +#define uchar unsigned char +#endif + +/* ------------------------------------------------------------------------- */ +/* ------------------------ Oscillator Calibration ------------------------- */ +/* ------------------------------------------------------------------------- */ + +/* Calibrate the RC oscillator. Our timing reference is the Start Of Frame + * signal (a single SE0 bit) repeating every millisecond immediately after + * a USB RESET. We first do a binary search for the OSCCAL value and then + * optimize this value with a neighboorhod search. + */ +void calibrateOscillator(void) +{ +uchar step = 128; +uchar trialValue = 0, optimumValue; +int x, optimumDev, targetValue = (unsigned)(1499 * (double)F_CPU / 10.5e6 + 0.5); + + /* do a binary search: */ + do{ + OSCCAL = trialValue + step; + x = usbMeasureFrameLength(); /* proportional to current real frequency */ + if(x < targetValue) /* frequency still too low */ + trialValue += step; + step >>= 1; + }while(step > 0); + /* We have a precision of +/- 1 for optimum OSCCAL here */ + /* now do a neighborhood search for optimum value */ + optimumValue = trialValue; + optimumDev = x; /* this is certainly far away from optimum */ + for(OSCCAL = trialValue - 1; OSCCAL <= trialValue + 1; OSCCAL++){ + x = usbMeasureFrameLength() - targetValue; + if(x < 0) + x = -x; + if(x < optimumDev){ + optimumDev = x; + optimumValue = OSCCAL; + } + } + OSCCAL = optimumValue; +} +/* +Note: This calibration algorithm may try OSCCAL values of up to 192 even if +the optimum value is far below 192. It may therefore exceed the allowed clock +frequency of the CPU in low voltage designs! +You may replace this search algorithm with any other algorithm you like if +you have additional constraints such as a maximum CPU clock. +For version 5.x RC oscillators (those with a split range of 2x128 steps, e.g. +ATTiny25, ATTiny45, ATTiny85), it may be useful to search for the optimum in +both regions. +*/ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-device/osccal.h b/adb2usb/uart2usb/vusb-20100715/libs-device/osccal.h new file mode 100644 index 0000000..777dfb2 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-device/osccal.h @@ -0,0 +1,63 @@ +/* Name: osccal.h + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: osccal.h 762 2009-08-12 17:10:30Z cs $ + */ + +/* +General Description: +This module contains a function which calibrates the AVR's internal RC +oscillator so that the CPU runs at F_CPU (F_CPU is a macro which must be +defined when the module is compiled, best passed in the compiler command +line). The time reference is the USB frame clock of 1 kHz available +immediately after a USB RESET condition. Timing is done by counting CPU +cycles, so all interrupts must be disabled while the calibration runs. For +low level timing measurements, usbMeasureFrameLength() is called. This +function must be enabled in usbconfig.h by defining +USB_CFG_HAVE_MEASURE_FRAME_LENGTH to 1. It is recommended to call +calibrateOscillator() from the reset hook in usbconfig.h: + +#ifndef __ASSEMBLER__ +#include // for sei() +extern void calibrateOscillator(void); +#endif +#define USB_RESET_HOOK(resetStarts) if(!resetStarts){cli(); calibrateOscillator(); sei();} + +This routine is an alternative to the continuous synchronization described +in osctune.h. + +Algorithm used: +calibrateOscillator() first does a binary search in the OSCCAL register for +the best matching oscillator frequency. Then it does a next neighbor search +to find the value with the lowest clock rate deviation. It is guaranteed to +find the best match among neighboring values, but for version 5 oscillators +(which have a discontinuous relationship between OSCCAL and frequency) a +better match might be available in another OSCCAL region. + +Limitations: +This calibration algorithm may try OSCCAL values of up to 192 even if the +optimum value is far below 192. It may therefore exceed the allowed clock +frequency of the CPU in low voltage designs! +Precision depends on the OSCCAL vs. frequency dependency of the oscillator. +Typical precision for an ATMega168 (derived from the OSCCAL vs. F_RC diagram +in the data sheet) should be in the range of 0.4%. Only the 12.8 MHz and +16.5 MHz versions of V-USB (with built-in receiver PLL) can tolerate this +deviation! All other frequency modules require at least 0.2% precision. +*/ + +#ifndef __OSCCAL_H_INCLUDED__ +#define __OSCCAL_H_INCLUDED__ + +void calibrateOscillator(void); +/* This function calibrates the RC oscillator so that the CPU runs at F_CPU. + * It MUST be called immediately after the end of a USB RESET condition! + * Disable all interrupts during the call! + * It is recommended that you store the resulting value in EEPROM so that a + * good guess value is available after the next reset. + */ + + +#endif /* __OSCCAL_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-device/osctune.h b/adb2usb/uart2usb/vusb-20100715/libs-device/osctune.h new file mode 100644 index 0000000..c751648 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-device/osctune.h @@ -0,0 +1,88 @@ +/* Name: osctune.h + * Author: Christian Starkjohann + * Creation Date: 2008-10-18 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: osctune.h 692 2008-11-07 15:07:40Z cs $ + */ + +/* +General Description: +This file is declared as C-header file although it is mostly documentation +how the RC oscillator can be kept in sync to the USB frame rate. The code +shown here must be added to usbconfig.h or this header file is included from +there. This code works only if D- is wired to the interrupt, not D+!!! + +This is an alternative to the osccal routine in osccal.c. It has the advantage +that the synchronization is done continuously and that it has more compact +code size. The disadvantages are slow synchronization (it may take a while +until the driver works), that messages immediately after the SOF pulse may be +lost (and need to be retried by the host) and that the interrupt is on D- +contrary to most examples. + +You may want to store a good calibration value in EEPROM for the next startup. +You know that the calibration value is good when the first USB message is +received. Do not store the value on every received message because the EEPROM +has a limited endurance. + +Notes: +(*) You must declare the global character variable "lastTimer0Value" in your +main code. + +(*) Timer 0 must be free running (not written by your code) and the prescaling +must be consistent with the TIMER0_PRESCALING define. + +(*) Good values for Timer 0 prescaling depend on how precise the clock must +be tuned and how far away from the default clock rate the target clock is. +For precise tuning, choose a low prescaler factor, for a broad range of tuning +choose a high one. A prescaler factor of 64 is good for the entire OSCCAL +range and allows a precision of better than +/-1%. A prescaler factor of 8 +allows tuning to slightly more than +/-6% of the default frequency and is +more precise than one step of OSCCAL. It is therefore not suitable to tune an +8 MHz oscillator to 12.5 MHz. + +Thanks to Henrik Haftmann for the idea to this routine! +*/ + +#define TIMER0_PRESCALING 64 /* must match the configuration for TIMER0 in main */ +#define TOLERATED_DEVIATION_PPT 5 /* max clock deviation before we tune in 1/10 % */ +/* derived constants: */ +#define EXPECTED_TIMER0_INCREMENT ((F_CPU / (1000 * TIMER0_PRESCALING)) & 0xff) +#define TOLERATED_DEVIATION (TOLERATED_DEVIATION_PPT * F_CPU / (1000000 * TIMER0_PRESCALING)) + +#ifdef __ASSEMBLER__ +macro tuneOsccal + push YH ;[0] + in YL, TCNT0 ;[2] + lds YH, lastTimer0Value ;[3] + sts lastTimer0Value, YL ;[5] + sub YL, YH ;[7] time passed since last frame + subi YL, EXPECTED_TIMER0_INCREMENT ;[8] +#if OSCCAL > 0x3f /* outside I/O addressable range */ + lds YH, OSCCAL ;[6] +#else + in YH, OSCCAL ;[6] assembler modle uses __SFR_OFFSET == 0 +#endif + cpi YL, TOLERATED_DEVIATION + 1 ;[10] + brmi notTooHigh ;[11] + subi YH, 1 ;[12] clock rate was too high +; brcs tuningOverflow ; optionally check for overflow + rjmp osctuneDone ;[13] +notTooHigh: + cpi YL, -TOLERATED_DEVIATION ;[13] + brpl osctuneDone ;[14] not too low + inc YH ;[15] clock rate was too low +; breq tuningOverflow ; optionally check for overflow +osctuneDone: +#if OSCCAL > 0x3f /* outside I/O addressable range */ + sts OSCCAL, YH ;[12-13] store tuned value +#else + out OSCCAL, YH ;[12-13] store tuned value +#endif +tuningOverflow: + pop YH ;[17] + endm ;[19] max number of cycles +#endif + +#define USB_SOF_HOOK tuneOsccal diff --git a/adb2usb/uart2usb/vusb-20100715/libs-host/Readme.txt b/adb2usb/uart2usb/vusb-20100715/libs-host/Readme.txt new file mode 100644 index 0000000..5117d18 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-host/Readme.txt @@ -0,0 +1,26 @@ +This is the Readme file for the libs-host directory. This directory contains +code snippets which may be useful for host side USB software. + + +WHAT IS INCLUDED IN THIS DIRECTORY? +=================================== + +opendevice.c and opendevice.h + This module contains a function to find and open a device given its + numeric IDs (VID, PID), names (vendor name and product name) and serial + number. It is based on libusb/libusb-win32 and returns a libusb device + handle. See opendevice.h for an API documentation. + +hiddata.c and hiddata.h + This module contains functions for data transfer over HID feature reports. + It is based on libusb on Unix and native Windows functions on Windows. No + driver DLL is needed on Windows. See hiddata.h for an API documentation. + +hidsdi.h + This DDK header file is missing in the free MinGW version of the Windows + DDK. Use this version if you get an "include file not found" error. + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.c b/adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.c new file mode 100644 index 0000000..93795e4 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.c @@ -0,0 +1,324 @@ +/* Name: hiddata.c + * Author: Christian Starkjohann + * Creation Date: 2008-04-11 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hiddata.c 743 2009-04-15 15:00:49Z cs $ + */ + +#include +#include "hiddata.h" + +/* ######################################################################## */ +#if defined(WIN32) /* ##################################################### */ +/* ######################################################################## */ + +#include +#include +#include "hidsdi.h" +#include + +#ifdef DEBUG +#define DEBUG_PRINT(arg) printf arg +#else +#define DEBUG_PRINT(arg) +#endif + +/* ------------------------------------------------------------------------ */ + +static void convertUniToAscii(char *buffer) +{ +unsigned short *uni = (void *)buffer; +char *ascii = buffer; + + while(*uni != 0){ + if(*uni >= 256){ + *ascii++ = '?'; + }else{ + *ascii++ = *uni++; + } + } + *ascii++ = 0; +} + +int usbhidOpenDevice(usbDevice_t **device, int vendor, char *vendorName, int product, char *productName, int usesReportIDs) +{ +GUID hidGuid; /* GUID for HID driver */ +HDEVINFO deviceInfoList; +SP_DEVICE_INTERFACE_DATA deviceInfo; +SP_DEVICE_INTERFACE_DETAIL_DATA *deviceDetails = NULL; +DWORD size; +int i, openFlag = 0; /* may be FILE_FLAG_OVERLAPPED */ +int errorCode = USBOPEN_ERR_NOTFOUND; +HANDLE handle = INVALID_HANDLE_VALUE; +HIDD_ATTRIBUTES deviceAttributes; + + HidD_GetHidGuid(&hidGuid); + deviceInfoList = SetupDiGetClassDevs(&hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); + deviceInfo.cbSize = sizeof(deviceInfo); + for(i=0;;i++){ + if(handle != INVALID_HANDLE_VALUE){ + CloseHandle(handle); + handle = INVALID_HANDLE_VALUE; + } + if(!SetupDiEnumDeviceInterfaces(deviceInfoList, 0, &hidGuid, i, &deviceInfo)) + break; /* no more entries */ + /* first do a dummy call just to determine the actual size required */ + SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, NULL, 0, &size, NULL); + if(deviceDetails != NULL) + free(deviceDetails); + deviceDetails = malloc(size); + deviceDetails->cbSize = sizeof(*deviceDetails); + /* this call is for real: */ + SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, deviceDetails, size, &size, NULL); + DEBUG_PRINT(("checking HID path \"%s\"\n", deviceDetails->DevicePath)); +#if 0 + /* If we want to access a mouse our keyboard, we can only use feature + * requests as the device is locked by Windows. It must be opened + * with ACCESS_TYPE_NONE. + */ + handle = CreateFile(deviceDetails->DevicePath, ACCESS_TYPE_NONE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, openFlag, NULL); +#endif + /* attempt opening for R/W -- we don't care about devices which can't be accessed */ + handle = CreateFile(deviceDetails->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, openFlag, NULL); + if(handle == INVALID_HANDLE_VALUE){ + DEBUG_PRINT(("opening failed: %d\n", (int)GetLastError())); + /* errorCode = USBOPEN_ERR_ACCESS; opening will always fail for mouse -- ignore */ + continue; + } + deviceAttributes.Size = sizeof(deviceAttributes); + HidD_GetAttributes(handle, &deviceAttributes); + DEBUG_PRINT(("device attributes: vid=%d pid=%d\n", deviceAttributes.VendorID, deviceAttributes.ProductID)); + if(deviceAttributes.VendorID != vendor || deviceAttributes.ProductID != product) + continue; /* ignore this device */ + errorCode = USBOPEN_ERR_NOTFOUND; + if(vendorName != NULL && productName != NULL){ + char buffer[512]; + if(!HidD_GetManufacturerString(handle, buffer, sizeof(buffer))){ + DEBUG_PRINT(("error obtaining vendor name\n")); + errorCode = USBOPEN_ERR_IO; + continue; + } + convertUniToAscii(buffer); + DEBUG_PRINT(("vendorName = \"%s\"\n", buffer)); + if(strcmp(vendorName, buffer) != 0) + continue; + if(!HidD_GetProductString(handle, buffer, sizeof(buffer))){ + DEBUG_PRINT(("error obtaining product name\n")); + errorCode = USBOPEN_ERR_IO; + continue; + } + convertUniToAscii(buffer); + DEBUG_PRINT(("productName = \"%s\"\n", buffer)); + if(strcmp(productName, buffer) != 0) + continue; + } + break; /* we have found the device we are looking for! */ + } + SetupDiDestroyDeviceInfoList(deviceInfoList); + if(deviceDetails != NULL) + free(deviceDetails); + if(handle != INVALID_HANDLE_VALUE){ + *device = (usbDevice_t *)handle; + errorCode = 0; + } + return errorCode; +} + +/* ------------------------------------------------------------------------ */ + +void usbhidCloseDevice(usbDevice_t *device) +{ + CloseHandle((HANDLE)device); +} + +/* ------------------------------------------------------------------------ */ + +int usbhidSetReport(usbDevice_t *device, char *buffer, int len) +{ +BOOLEAN rval; + + rval = HidD_SetFeature((HANDLE)device, buffer, len); + return rval == 0 ? USBOPEN_ERR_IO : 0; +} + +/* ------------------------------------------------------------------------ */ + +int usbhidGetReport(usbDevice_t *device, int reportNumber, char *buffer, int *len) +{ +BOOLEAN rval = 0; + + buffer[0] = reportNumber; + rval = HidD_GetFeature((HANDLE)device, buffer, *len); + return rval == 0 ? USBOPEN_ERR_IO : 0; +} + +/* ------------------------------------------------------------------------ */ + +/* ######################################################################## */ +#else /* defined WIN32 #################################################### */ +/* ######################################################################## */ + +#include +#include + +#define usbDevice usb_dev_handle /* use libusb's device structure */ + +/* ------------------------------------------------------------------------- */ + +#define USBRQ_HID_GET_REPORT 0x01 +#define USBRQ_HID_SET_REPORT 0x09 + +#define USB_HID_REPORT_TYPE_FEATURE 3 + + +static int usesReportIDs; + +/* ------------------------------------------------------------------------- */ + +static int usbhidGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */ + return rval; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING){ + *buf = 0; + return 0; + } + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1: */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + +int usbhidOpenDevice(usbDevice_t **device, int vendor, char *vendorName, int product, char *productName, int _usesReportIDs) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USBOPEN_ERR_NOTFOUND; +static int didUsbInit = 0; + + if(!didUsbInit){ + usb_init(); + didUsbInit = 1; + } + usb_find_busses(); + usb_find_devices(); + for(bus=usb_get_busses(); bus; bus=bus->next){ + for(dev=bus->devices; dev; dev=dev->next){ + if(dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product){ + char string[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USBOPEN_ERR_ACCESS; + fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror()); + continue; + } + if(vendorName == NULL && productName == NULL){ /* name does not matter */ + break; + } + /* now check whether the names match: */ + len = usbhidGetStringAscii(handle, dev->descriptor.iManufacturer, string, sizeof(string)); + if(len < 0){ + errorCode = USBOPEN_ERR_IO; + fprintf(stderr, "Warning: cannot query manufacturer for device: %s\n", usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* fprintf(stderr, "seen device from vendor ->%s<-\n", string); */ + if(strcmp(string, vendorName) == 0){ + len = usbhidGetStringAscii(handle, dev->descriptor.iProduct, string, sizeof(string)); + if(len < 0){ + errorCode = USBOPEN_ERR_IO; + fprintf(stderr, "Warning: cannot query product for device: %s\n", usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* fprintf(stderr, "seen product ->%s<-\n", string); */ + if(strcmp(string, productName) == 0) + break; + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) + break; + } + if(handle != NULL){ + errorCode = 0; + *device = (void *)handle; + usesReportIDs = _usesReportIDs; + } + return errorCode; +} + +/* ------------------------------------------------------------------------- */ + +void usbhidCloseDevice(usbDevice_t *device) +{ + if(device != NULL) + usb_close((void *)device); +} + +/* ------------------------------------------------------------------------- */ + +int usbhidSetReport(usbDevice_t *device, char *buffer, int len) +{ +int bytesSent; + + if(!usesReportIDs){ + buffer++; /* skip dummy report ID */ + len--; + } + bytesSent = usb_control_msg((void *)device, USB_TYPE_CLASS | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, USBRQ_HID_SET_REPORT, USB_HID_REPORT_TYPE_FEATURE << 8 | (buffer[0] & 0xff), 0, buffer, len, 5000); + if(bytesSent != len){ + if(bytesSent < 0) + fprintf(stderr, "Error sending message: %s\n", usb_strerror()); + return USBOPEN_ERR_IO; + } + return 0; +} + +/* ------------------------------------------------------------------------- */ + +int usbhidGetReport(usbDevice_t *device, int reportNumber, char *buffer, int *len) +{ +int bytesReceived, maxLen = *len; + + if(!usesReportIDs){ + buffer++; /* make room for dummy report ID */ + maxLen--; + } + bytesReceived = usb_control_msg((void *)device, USB_TYPE_CLASS | USB_RECIP_DEVICE | USB_ENDPOINT_IN, USBRQ_HID_GET_REPORT, USB_HID_REPORT_TYPE_FEATURE << 8 | reportNumber, 0, buffer, maxLen, 5000); + if(bytesReceived < 0){ + fprintf(stderr, "Error sending message: %s\n", usb_strerror()); + return USBOPEN_ERR_IO; + } + *len = bytesReceived; + if(!usesReportIDs){ + buffer[-1] = reportNumber; /* add dummy report ID */ + (*len)++; + } + return 0; +} + +/* ######################################################################## */ +#endif /* defined WIN32 ################################################### */ +/* ######################################################################## */ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.h b/adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.h new file mode 100644 index 0000000..fce0743 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-host/hiddata.h @@ -0,0 +1,71 @@ +/* Name: hiddata.h + * Author: Christian Starkjohann + * Creation Date: 2008-04-11 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hiddata.h 692 2008-11-07 15:07:40Z cs $ + */ + +#ifndef __HIDDATA_H_INCLUDED__ +#define __HIDDATA_H_INCLUDED__ + +/* +General Description: +This module implements an abstraction layer for data transfer over HID feature +requests. The implementation uses native Windows functions on Windows so that +no driver installation is required and libusb on Unix. You must link the +appropriate libraries in either case: "-lhid -lusb -lsetupapi" on Windows and +`libusb-config --libs` on Unix. +*/ + +/* ------------------------------------------------------------------------ */ + +#define USBOPEN_SUCCESS 0 /* no error */ +#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */ +#define USBOPEN_ERR_IO 2 /* I/O error */ +#define USBOPEN_ERR_NOTFOUND 3 /* device not found */ + +/* ------------------------------------------------------------------------ */ + +typedef struct usbDevice usbDevice_t; +/* Opaque data type representing the USB device. This can be a Windows handle + * or a libusb handle, depending on the backend implementation. + */ + +/* ------------------------------------------------------------------------ */ + +int usbhidOpenDevice(usbDevice_t **device, int vendorID, char *vendorName, int productID, char *productName, int usesReportIDs); +/* This function opens a USB device. 'vendorID' and 'productID' are the numeric + * Vendor-ID and Product-ID of the device we want to open. If 'vendorName' and + * 'productName' are both not NULL, only devices with matching manufacturer- + * and product name strings are accepted. If the device uses report IDs, + * 'usesReportIDs' must be set to a non-zero value. + * Returns: If a matching device has been found, USBOPEN_SUCCESS is returned + * and '*device' is set to an opaque pointer representing the device. The + * device must be closed with usbhidCloseDevice(). If the device has not been + * found or opening failed, an error code is returned. + */ +void usbhidCloseDevice(usbDevice_t *device); +/* Every device opened with usbhidOpenDevice() must be closed with this function. + */ +int usbhidSetReport(usbDevice_t *device, char *buffer, int len); +/* This function sends a feature report to the device. The report ID must be + * in the first byte of buffer and the length 'len' of the report is specified + * including this report ID. If no report IDs are used, buffer[0] must be set + * to 0 (dummy report ID). + * Returns: 0 on success, an error code otherwise. + */ +int usbhidGetReport(usbDevice_t *device, int reportID, char *buffer, int *len); +/* This function obtains a feature report from the device. The requested + * report-ID is passed in 'reportID'. The caller must pass a buffer of the size + * of the expected report in 'buffer' and initialize the variable pointed to by + * 'len' to the total size of this buffer. Upon successful return, the report + * (prefixed with the report-ID) is in 'buffer' and the actual length of the + * report is returned in '*len'. + * Returns: 0 on success, an error code otherwise. + */ + +/* ------------------------------------------------------------------------ */ + +#endif /* __HIDDATA_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-host/hidsdi.h b/adb2usb/uart2usb/vusb-20100715/libs-host/hidsdi.h new file mode 100644 index 0000000..a549ab1 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-host/hidsdi.h @@ -0,0 +1,49 @@ +/* Name: hidsdi.h + * Author: Christian Starkjohann + * Creation Date: 2006-02-02 + * Tabsize: 4 + * Copyright: (c) 2006-2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: hidsdi.h 692 2008-11-07 15:07:40Z cs $ + */ + +/* +General Description +This file is a replacement for hidsdi.h from the Windows DDK. It defines some +of the types and function prototypes of this header for our project. If you +have the Windows DDK version of this file or a version shipped with MinGW, use +that instead. +*/ + +#ifndef _HIDSDI_H +#define _HIDSDI_H + +#include + +#include +#include + +typedef struct{ + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +}HIDD_ATTRIBUTES; + +void __stdcall HidD_GetHidGuid(OUT LPGUID hidGuid); + +BOOLEAN __stdcall HidD_GetAttributes(IN HANDLE device, OUT HIDD_ATTRIBUTES *attributes); + +BOOLEAN __stdcall HidD_GetManufacturerString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen); +BOOLEAN __stdcall HidD_GetProductString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen); +BOOLEAN __stdcall HidD_GetSerialNumberString(IN HANDLE device, OUT void *buffer, IN ULONG bufferLen); + +BOOLEAN __stdcall HidD_GetFeature(IN HANDLE device, OUT void *reportBuffer, IN ULONG bufferLen); +BOOLEAN __stdcall HidD_SetFeature(IN HANDLE device, IN void *reportBuffer, IN ULONG bufferLen); + +BOOLEAN __stdcall HidD_GetNumInputBuffers(IN HANDLE device, OUT ULONG *numBuffers); +BOOLEAN __stdcall HidD_SetNumInputBuffers(IN HANDLE device, OUT ULONG numBuffers); + +#include + +#endif diff --git a/adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.c b/adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.c new file mode 100644 index 0000000..137f50c --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.c @@ -0,0 +1,203 @@ +/* Name: opendevice.c + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.c 740 2009-04-13 18:23:31Z cs $ + */ + +/* +General Description: +The functions in this module can be used to find and open a device based on +libusb or libusb-win32. +*/ + +#include +#include "opendevice.h" + +/* ------------------------------------------------------------------------- */ + +#define MATCH_SUCCESS 1 +#define MATCH_FAILED 0 +#define MATCH_ABORT -1 + +/* private interface: match text and p, return MATCH_SUCCESS, MATCH_FAILED, or MATCH_ABORT. */ +static int _shellStyleMatch(char *text, char *p) +{ +int last, matched, reverse; + + for(; *p; text++, p++){ + if(*text == 0 && *p != '*') + return MATCH_ABORT; + switch(*p){ + case '\\': + /* Literal match with following character. */ + p++; + /* FALLTHROUGH */ + default: + if(*text != *p) + return MATCH_FAILED; + continue; + case '?': + /* Match anything. */ + continue; + case '*': + while(*++p == '*') + /* Consecutive stars act just like one. */ + continue; + if(*p == 0) + /* Trailing star matches everything. */ + return MATCH_SUCCESS; + while(*text) + if((matched = _shellStyleMatch(text++, p)) != MATCH_FAILED) + return matched; + return MATCH_ABORT; + case '[': + reverse = p[1] == '^'; + if(reverse) /* Inverted character class. */ + p++; + matched = MATCH_FAILED; + if(p[1] == ']' || p[1] == '-') + if(*++p == *text) + matched = MATCH_SUCCESS; + for(last = *p; *++p && *p != ']'; last = *p) + if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p) + matched = MATCH_SUCCESS; + if(matched == reverse) + return MATCH_FAILED; + continue; + } + } + return *text == 0; +} + +/* public interface for shell style matching: returns 0 if fails, 1 if matches */ +static int shellStyleMatch(char *text, char *pattern) +{ + if(pattern == NULL) /* NULL pattern is synonymous to "*" */ + return 1; + return _shellStyleMatch(text, pattern) == MATCH_SUCCESS; +} + +/* ------------------------------------------------------------------------- */ + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen) +{ +char buffer[256]; +int rval, i; + + if((rval = usb_get_string_simple(dev, index, buf, buflen)) >= 0) /* use libusb version if it works */ + return rval; + if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, 0x0409, buffer, sizeof(buffer), 5000)) < 0) + return rval; + if(buffer[1] != USB_DT_STRING){ + *buf = 0; + return 0; + } + if((unsigned char)buffer[0] < rval) + rval = (unsigned char)buffer[0]; + rval /= 2; + /* lossy conversion to ISO Latin1: */ + for(i=1;i buflen) /* destination buffer overflow */ + break; + buf[i-1] = buffer[2 * i]; + if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ + buf[i-1] = '?'; + } + buf[i-1] = 0; + return i-1; +} + +/* ------------------------------------------------------------------------- */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp) +{ +struct usb_bus *bus; +struct usb_device *dev; +usb_dev_handle *handle = NULL; +int errorCode = USBOPEN_ERR_NOTFOUND; + + usb_find_busses(); + usb_find_devices(); + for(bus = usb_get_busses(); bus; bus = bus->next){ + for(dev = bus->devices; dev; dev = dev->next){ /* iterate over all devices on all busses */ + if((vendorID == 0 || dev->descriptor.idVendor == vendorID) + && (productID == 0 || dev->descriptor.idProduct == productID)){ + char vendor[256], product[256], serial[256]; + int len; + handle = usb_open(dev); /* we need to open the device in order to query strings */ + if(!handle){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot open VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + continue; + } + /* now check whether the names match: */ + len = vendor[0] = 0; + if(dev->descriptor.iManufacturer > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, vendor, sizeof(vendor)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query manufacturer for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen device from vendor ->%s<-\n", vendor); */ + if(shellStyleMatch(vendor, vendorNamePattern)){ + len = product[0] = 0; + if(dev->descriptor.iProduct > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iProduct, product, sizeof(product)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query product for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + }else{ + errorCode = USBOPEN_ERR_NOTFOUND; + /* printf("seen product ->%s<-\n", product); */ + if(shellStyleMatch(product, productNamePattern)){ + len = serial[0] = 0; + if(dev->descriptor.iSerialNumber > 0){ + len = usbGetStringAscii(handle, dev->descriptor.iSerialNumber, serial, sizeof(serial)); + } + if(len < 0){ + errorCode = USBOPEN_ERR_ACCESS; + if(warningsFp != NULL) + fprintf(warningsFp, "Warning: cannot query serial for VID=0x%04x PID=0x%04x: %s\n", dev->descriptor.idVendor, dev->descriptor.idProduct, usb_strerror()); + } + if(shellStyleMatch(serial, serialNamePattern)){ + if(printMatchingDevicesFp != NULL){ + if(serial[0] == 0){ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product); + }else{ + fprintf(printMatchingDevicesFp, "VID=0x%04x PID=0x%04x vendor=\"%s\" product=\"%s\" serial=\"%s\"\n", dev->descriptor.idVendor, dev->descriptor.idProduct, vendor, product, serial); + } + }else{ + break; + } + } + } + } + } + } + usb_close(handle); + handle = NULL; + } + } + if(handle) /* we have found a deice */ + break; + } + if(handle != NULL){ + errorCode = 0; + *device = handle; + } + if(printMatchingDevicesFp != NULL) /* never return an error for listing only */ + errorCode = 0; + return errorCode; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.h b/adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.h new file mode 100644 index 0000000..79c12f6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/libs-host/opendevice.h @@ -0,0 +1,77 @@ +/* Name: opendevice.h + * Project: V-USB host-side library + * Author: Christian Starkjohann + * Creation Date: 2008-04-10 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: opendevice.h 755 2009-08-03 17:01:21Z cs $ + */ + +/* +General Description: +This module offers additional functionality for host side drivers based on +libusb or libusb-win32. It includes a function to find and open a device +based on numeric IDs and textual description. It also includes a function to +obtain textual descriptions from a device. + +To use this functionality, simply copy opendevice.c and opendevice.h into your +project and add them to your Makefile. You may modify and redistribute these +files according to the GNU General Public License (GPL) version 2 or 3. +*/ + +#ifndef __OPENDEVICE_H_INCLUDED__ +#define __OPENDEVICE_H_INCLUDED__ + +#include /* this is libusb, see http://libusb.sourceforge.net/ */ +#include + +int usbGetStringAscii(usb_dev_handle *dev, int index, char *buf, int buflen); +/* This function gets a string descriptor from the device. 'index' is the + * string descriptor index. The string is returned in ISO Latin 1 encoding in + * 'buf' and it is terminated with a 0-character. The buffer size must be + * passed in 'buflen' to prevent buffer overflows. A libusb device handle + * must be given in 'dev'. + * Returns: The length of the string (excluding the terminating 0) or + * a negative number in case of an error. If there was an error, use + * usb_strerror() to obtain the error message. + */ + +int usbOpenDevice(usb_dev_handle **device, int vendorID, char *vendorNamePattern, int productID, char *productNamePattern, char *serialNamePattern, FILE *printMatchingDevicesFp, FILE *warningsFp); +/* This function iterates over all devices on all USB busses and searches for + * a device. Matching is done first by means of Vendor- and Product-ID (passed + * in 'vendorID' and 'productID'. An ID of 0 matches any numeric ID (wildcard). + * When a device matches by its IDs, matching by names is performed. Name + * matching can be done on textual vendor name ('vendorNamePattern'), product + * name ('productNamePattern') and serial number ('serialNamePattern'). A + * device matches only if all non-null pattern match. If you don't care about + * a string, pass NULL for the pattern. Patterns are Unix shell style pattern: + * '*' stands for 0 or more characters, '?' for one single character, a list + * of characters in square brackets for a single character from the list + * (dashes are allowed to specify a range) and if the lis of characters begins + * with a caret ('^'), it matches one character which is NOT in the list. + * Other parameters to the function: If 'warningsFp' is not NULL, warning + * messages are printed to this file descriptor with fprintf(). If + * 'printMatchingDevicesFp' is not NULL, no device is opened but matching + * devices are printed to the given file descriptor with fprintf(). + * If a device is opened, the resulting USB handle is stored in '*device'. A + * pointer to a "usb_dev_handle *" type variable must be passed here. + * Returns: 0 on success, an error code (see defines below) on failure. + */ + +/* usbOpenDevice() error codes: */ +#define USBOPEN_SUCCESS 0 /* no error */ +#define USBOPEN_ERR_ACCESS 1 /* not enough permissions to open device */ +#define USBOPEN_ERR_IO 2 /* I/O error */ +#define USBOPEN_ERR_NOTFOUND 3 /* device not found */ + + +/* Obdev's free USB IDs, see USB-IDs-for-free.txt for details */ + +#define USB_VID_OBDEV_SHARED 5824 /* obdev's shared vendor ID */ +#define USB_PID_OBDEV_SHARED_CUSTOM 1500 /* shared PID for custom class devices */ +#define USB_PID_OBDEV_SHARED_HID 1503 /* shared PID for HIDs except mice & keyboards */ +#define USB_PID_OBDEV_SHARED_CDCACM 1505 /* shared PID for CDC Modem devices */ +#define USB_PID_OBDEV_SHARED_MIDI 1508 /* shared PID for MIDI class devices */ + +#endif /* __OPENDEVICE_H_INCLUDED__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/tests/Makefile b/adb2usb/uart2usb/vusb-20100715/tests/Makefile new file mode 100644 index 0000000..74b2518 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/Makefile @@ -0,0 +1,127 @@ +# Name: Makefile +# Project: custom-class example +# Author: Christian Starkjohann +# Creation Date: 2008-04-07 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id: Makefile 719 2009-03-16 18:51:56Z cs $ + +DEVICE = attiny2313 +F_CPU = 16000000 # in Hz +DEFINES = + +CFLAGS = $(DEFINES) -Iusbdrv -I. -DDEBUG_LEVEL=0 +OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) + +SIZES_TMP = /tmp/sizetmp.txt + +# symbolic targets: +help: + @echo "This Makefile has no default rule. Use one of the following:" + @echo "make clean ..... to delete objects and hex file" + @echo "make sizes ..... compute code and RAM sizes for various options" + @echo "make test ...... test with all features whether everything compiles" + +sizes sizes.txt: + rm -f $(SIZES_TMP) sizes.txt + $(MAKE) null.elf + avr-size null.elf | tail -1 | awk '{print "null", $$1+$$2, $$3+$$2}' >$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf + avr-size main.elf | tail -1 | awk '{print "Minimum_with_16_MHz", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf F_CPU=12000000 + avr-size main.elf | tail -1 | awk '{print "Minimum_with_12_MHz", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf F_CPU=12800000 + avr-size main.elf | tail -1 | awk '{print "Minimum_with_12_8_MHz", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf F_CPU=15000000 + avr-size main.elf | tail -1 | awk '{print "Minimum_with_15_MHz", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf F_CPU=16500000 + avr-size main.elf | tail -1 | awk '{print "Minimum_with_16_5_MHz", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf F_CPU=18000000 + avr-size main.elf | tail -1 | awk '{print "Minimum_with_18_MHz+CRC", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf F_CPU=20000000 + avr-size main.elf | tail -1 | awk '{print "Minimum_with_20_MHz", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf DEFINES=-DUSB_CFG_IMPLEMENT_FN_WRITE=1 + avr-size main.elf | tail -1 | awk '{print "With_usbFunctionWrite", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf DEFINES=-DUSB_CFG_IMPLEMENT_FN_READ=1 + avr-size main.elf | tail -1 | awk '{print "With_usbFunctionRead", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSB_CFG_IMPLEMENT_FN_READ=1 -DUSB_CFG_IMPLEMENT_FN_WRITE=1" + avr-size main.elf | tail -1 | awk '{print "With_usbFunctionRead_and_Write", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSB_CFG_IMPLEMENT_FN_WRITEOUT=1" + avr-size main.elf | tail -1 | awk '{print "With_usbFunctionWriteOut", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSB_CFG_HAVE_INTRIN_ENDPOINT=1" + avr-size main.elf | tail -1 | awk '{print "With_Interrupt_In_Endpoint_1", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSB_CFG_IMPLEMENT_HALT=1 -DUSB_CFG_HAVE_INTRIN_ENDPOINT=1" + avr-size main.elf | tail -1 | awk '{print "With_Interrupt_In_Endpoint_1_and_Halt", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSB_CFG_HAVE_INTRIN_ENDPOINT3=1" + avr-size main.elf | tail -1 | awk '{print "With_Interrupt_In_Endpoint_1_and_3", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSE_DYNAMIC_DESCRIPTOR=1" + avr-size main.elf | tail -1 | awk '{print "With_Dynamic_Descriptor", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + $(MAKE) clean; $(MAKE) main.elf "DEFINES=-DUSB_CFG_LONG_TRANSFERS=1" + avr-size main.elf | tail -1 | awk '{print "With_Long_Transfers", $$1+$$2, $$3+$$2}' >>$(SIZES_TMP) + cat $(SIZES_TMP) | awk 'BEGIN{printf("%39s %5s %5s %5s %5s\n"), "Variation", "Flash", "RAM", "+F", "+RAM"}\ + /^null/{nullRom=$$2; nullRam=$$3; next} \ + {rom=$$2-nullRom; ram=$$3-nullRam; if(!refRom){refRom=rom; refRam=ram} \ + printf("%39s %5d %5d %+5d %+5d\n", $$1, rom, ram, rom-refRom, ram-refRam)}' | tee sizes.txt + rm $(SIZES_TMP) + +test: + for freq in 12000000 12800000 15000000 16000000 16500000 18000000 20000000; do \ + for opt in USB_COUNT_SOF USB_CFG_HAVE_INTRIN_ENDPOINT USB_CFG_HAVE_INTRIN_ENDPOINT3 USB_CFG_HAVE_MEASURE_FRAME_LENGTH USB_CFG_LONG_TRANSFERS; do \ + $(MAKE) clean; $(MAKE) main.elf F_CPU=$$freq "DEFINES=-D$$opt=1" || exit 1; \ + $(MAKE) clean; $(MAKE) main.elf F_CPU=$$freq "DEFINES=-D$$opt=1 -DDUSB_CFG_IMPLEMENT_FN_WRITEOUT=1" || exit 1; \ + done \ + done + +# The following rule is used to check the compiler +devices: #exclude devices without RAM for stack and atmega603 for gcc 3 + excludes="at90s1200 attiny11 attiny12 attiny15 attiny28"; \ + for gccVersion in 3 4; do \ + avr-gcc-select $$gccVersion; \ + for device in `echo | avr-gcc -xc -mmcu=x - 2>&1 | egrep '^ *at[a-zA-Z0-9_-]+$$'`; do \ + if echo "$$excludes" | grep "$$device" >/dev/null; then continue; fi; \ + if [ "$$gccVersion" = 3 -a "$$device" = atmega603 ]; then continue; fi; \ + $(MAKE) clean; $(MAKE) null.elf DEVICE=$$device || exit 1; \ + done \ + done + $(MAKE) clean + avr-gcc-select 3 + @echo "+++ Device test succeeded!" + +# rule for deleting dependent files (those which can be built by Make): +clean: + rm -f *.hex *.lst *.map *.elf *.o + rm -rf usbdrv + +# Generic rule for compiling C files: +.c.o: + $(COMPILE) -c $< -o $@ + +# Generic rule for assembling Assembler source files: +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +# Generic rule for compiling C to assembler, used for debugging only. +.c.s: + $(COMPILE) -S $< -o $@ + +# file targets: + +# Since we don't want to ship the driver multipe times, we copy it into this project: +usbdrv: + cp -r ../usbdrv . + +main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it + $(COMPILE) -o main.elf $(OBJECTS) + +main_i.elf: usbdrv main.o usbdrv/usbdrvasm.o # usbdrv dependency only needed because we copy it + $(COMPILE) -o main_i.elf main.o usbdrv/usbdrvasm.o + +null.elf: null.o + $(COMPILE) -o null.elf null.o diff --git a/adb2usb/uart2usb/vusb-20100715/tests/Readme.txt b/adb2usb/uart2usb/vusb-20100715/tests/Readme.txt new file mode 100644 index 0000000..3f0d36d --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/Readme.txt @@ -0,0 +1,13 @@ +This is the Readme file for the directory "tests" of V-USB, a firmware-only +USB driver for AVR microcontrollers. + +WHAT IS IN THIS DIRECTORY? +========================== +This directory is for driver development only. It contains tests to check +whether all branches of #ifdef code compile as they should and whether the +code size of the driver increased. + + +---------------------------------------------------------------------------- +(c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH. +http://www.obdev.at/ diff --git a/adb2usb/uart2usb/vusb-20100715/tests/compare-sizes.awk b/adb2usb/uart2usb/vusb-20100715/tests/compare-sizes.awk new file mode 100755 index 0000000..8135729 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/compare-sizes.awk @@ -0,0 +1,45 @@ +#!/usr/bin/awk -f +# Name: compare-sizes.awk +# Project: v-usb +# Author: Christian Starkjohann +# Creation Date: 2008-04-29 +# Tabsize: 4 +# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH +# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) +# This Revision: $Id$ + +BEGIN{ + opt = 0; + if(ARGC != 3){ + printf("usage: compare-sizes.awk file1 file2\n"); + printf(" computes size differences between two size lists\n"); + exit 1; + } + file1 = ARGV[1]; + file2 = ARGV[2]; +} + +{ + if(($2 + 0) != 0){ + if(!hadOption[$1]){ + hadOption[$1] = 1; + options[opt++] = $1; + } + flash[FILENAME, $1] = $2; + ram[FILENAME, $1] = $3; + } +} + +END{ + if(opt > 0){ + printf ("%39s %6s %5s\n", "Variation", "+Flash", "+RAM"); + } + for(i = 0; i < opt; i++){ + option = options[i]; + if(!flash[file2, option] || !flash[file1, option]){ + printf("%39s %6s %5s\n", option, "n/a", "n/a"); + }else{ + printf("%39s %+6d %+5d\n", option, flash[file2, option] - flash[file1, option], ram[file2, option] - ram[file1, option]); + } + } +} diff --git a/adb2usb/uart2usb/vusb-20100715/tests/main.c b/adb2usb/uart2usb/vusb-20100715/tests/main.c new file mode 100644 index 0000000..55f881c --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/main.c @@ -0,0 +1,159 @@ +/* Name: main.c + * Project: Testing driver features + * Author: Christian Starkjohann + * Creation Date: 2008-04-29 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: main.c 773 2010-01-15 18:30:36Z cs $ + */ + +/* +This module is a do-nothing test code linking against (or including) the USB +driver. It is used to determine the code size for various options and to +check whether the code compiles with all options. +*/ +#include +#include /* for sei() */ +#include /* required by usbdrv.h */ +#include /* for _delay_ms() */ +#include "usbdrv.h" +#if USE_INCLUDE +#include "usbdrv.c" +#endif + +/* ------------------------------------------------------------------------- */ +/* ----------------------------- USB interface ----------------------------- */ +/* ------------------------------------------------------------------------- */ + +#if USB_CFG_IMPLEMENT_FN_WRITE +uchar usbFunctionWrite(uchar *data, uchar len) +{ + return 1; +} +#endif + +#if USB_CFG_IMPLEMENT_FN_READ +uchar usbFunctionRead(uchar *data, uchar len) +{ + return len; +} +#endif + +#if USB_CFG_IMPLEMENT_FN_WRITEOUT +void usbFunctionWriteOut(uchar *data, uchar len) +{ +} +#endif + +#if USE_DYNAMIC_DESCRIPTOR + +static PROGMEM char myDescriptorDevice[] = { /* USB device descriptor */ + 18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */ + USBDESCR_DEVICE, /* descriptor type */ + 0x10, 0x01, /* USB version supported */ + USB_CFG_DEVICE_CLASS, + USB_CFG_DEVICE_SUBCLASS, + 0, /* protocol */ + 8, /* max packet size */ + /* the following two casts affect the first byte of the constant only, but + * that's sufficient to avoid a warning with the default values. + */ + (char)USB_CFG_VENDOR_ID,/* 2 bytes */ + (char)USB_CFG_DEVICE_ID,/* 2 bytes */ + USB_CFG_DEVICE_VERSION, /* 2 bytes */ + USB_CFG_DESCR_PROPS_STRING_VENDOR != 0 ? 1 : 0, /* manufacturer string index */ + USB_CFG_DESCR_PROPS_STRING_PRODUCT != 0 ? 2 : 0, /* product string index */ + USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER != 0 ? 3 : 0, /* serial number string index */ + 1, /* number of configurations */ +}; + +static PROGMEM char myDescriptorConfiguration[] = { /* USB configuration descriptor */ + 9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */ + USBDESCR_CONFIG, /* descriptor type */ + 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + (USB_CFG_DESCR_PROPS_HID & 0xff), 0, + /* total length of data returned (including inlined descriptors) */ + 1, /* number of interfaces in this configuration */ + 1, /* index of this configuration */ + 0, /* configuration name string index */ +#if USB_CFG_IS_SELF_POWERED + USBATTR_SELFPOWER, /* attributes */ +#else + 0, /* attributes */ +#endif + USB_CFG_MAX_BUS_POWER/2, /* max USB current in 2mA units */ +/* interface descriptor follows inline: */ + 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */ + USBDESCR_INTERFACE, /* descriptor type */ + 0, /* index of this interface */ + 0, /* alternate setting for this interface */ + USB_CFG_HAVE_INTRIN_ENDPOINT, /* endpoints excl 0: number of endpoint descriptors to follow */ + USB_CFG_INTERFACE_CLASS, + USB_CFG_INTERFACE_SUBCLASS, + USB_CFG_INTERFACE_PROTOCOL, + 0, /* string index for interface */ +#if (USB_CFG_DESCR_PROPS_HID & 0xff) /* HID descriptor */ + 9, /* sizeof(usbDescrHID): length of descriptor in bytes */ + USBDESCR_HID, /* descriptor type: HID */ + 0x01, 0x01, /* BCD representation of HID version */ + 0x00, /* target country code */ + 0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */ + 0x22, /* descriptor type: report */ + USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH, 0, /* total length of report descriptor */ +#endif +#if USB_CFG_HAVE_INTRIN_ENDPOINT /* endpoint descriptor for endpoint 1 */ + 7, /* sizeof(usbDescrEndpoint) */ + USBDESCR_ENDPOINT, /* descriptor type = endpoint */ + (char)0x81, /* IN endpoint number 1 */ + 0x03, /* attrib: Interrupt endpoint */ + 8, 0, /* maximum packet size */ + USB_CFG_INTR_POLL_INTERVAL, /* in ms */ +#endif +}; + +USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(usbRequest_t *rq) +{ +uchar *p = 0, len = 0; + + if(rq->wValue.bytes[1] == USBDESCR_DEVICE){ + p = (uchar *)myDescriptorDevice; + len = sizeof(myDescriptorDevice); + }else{ /* must be configuration descriptor */ + p = (uchar *)(myDescriptorConfiguration); + len = sizeof(myDescriptorConfiguration); + } + usbMsgPtr = p; + return len; +} +#endif + +USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) +{ +usbRequest_t *rq = (void *)data; + + if(rq->bRequest == 0) /* request using usbFunctionRead()/usbFunctionWrite() */ + return 0xff; + return 0; /* default for not implemented requests: return no data back to host */ +} + +/* ------------------------------------------------------------------------- */ + +int main(void) +{ +uchar i; + + usbInit(); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ + i = 0; + while(--i){ /* fake USB disconnect for > 250 ms */ + _delay_ms(1); + } + usbDeviceConnect(); + sei(); + for(;;){ /* main event loop */ + usbPoll(); + } + return 0; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/tests/null.c b/adb2usb/uart2usb/vusb-20100715/tests/null.c new file mode 100644 index 0000000..dc6848d --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/null.c @@ -0,0 +1,26 @@ +/* Name: null.c + * Project: Testing driver features + * Author: Christian Starkjohann + * Creation Date: 2008-04-29 + * Tabsize: 4 + * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: null.c 692 2008-11-07 15:07:40Z cs $ + */ + +/* +This is a NULL main() function to find out the code size required by libusb's +startup code, interrupt vectors etc. +*/ +#include + + +/* ------------------------------------------------------------------------- */ + +int main(void) +{ + for(;;); + return 0; +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc3.4.6.txt new file mode 100644 index 0000000..2257e89 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc3.4.6.txt @@ -0,0 +1,13 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1154 45 +0 +0 + Minimum_with_12_MHz 1274 45 +120 +0 + Minimum_with_15_MHz 1260 45 +106 +0 + Minimum_with_16_5_MHz 1276 45 +122 +0 + With_usbFunctionWrite 1214 45 +60 +0 + With_usbFunctionRead 1200 45 +46 +0 + With_usbFunctionRead_and_Write 1246 45 +92 +0 + With_usbFunctionWriteOut 1178 45 +24 +0 + With_Interrupt_In_Endpoint_1 1284 58 +130 +13 + With_Interrupt_In_Endpoint_1_and_Halt 1372 58 +218 +13 + With_Interrupt_In_Endpoint_1_and_3 1386 69 +232 +24 + With_Dynamic_Descriptor 1186 45 +32 +0 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc4.2.2.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc4.2.2.txt new file mode 100644 index 0000000..f776893 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080418-gcc4.2.2.txt @@ -0,0 +1,13 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1208 45 +0 +0 + Minimum_with_12_MHz 1328 45 +120 +0 + Minimum_with_15_MHz 1314 45 +106 +0 + Minimum_with_16_5_MHz 1330 45 +122 +0 + With_usbFunctionWrite 1268 45 +60 +0 + With_usbFunctionRead 1264 45 +56 +0 + With_usbFunctionRead_and_Write 1314 45 +106 +0 + With_usbFunctionWriteOut 1218 45 +10 +0 + With_Interrupt_In_Endpoint_1 1340 58 +132 +13 + With_Interrupt_In_Endpoint_1_and_Halt 1414 58 +206 +13 + With_Interrupt_In_Endpoint_1_and_3 1426 69 +218 +24 + With_Dynamic_Descriptor 1238 45 +30 +0 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc3.4.6.txt new file mode 100644 index 0000000..d292bfb --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc3.4.6.txt @@ -0,0 +1,15 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1154 45 +0 +0 + Minimum_with_12_MHz 1274 45 +120 +0 + Minimum_with_15_MHz 1260 45 +106 +0 + Minimum_with_16_5_MHz 1276 45 +122 +0 + Minimum_with_20_MHz 1136 45 -18 +0 + With_usbFunctionWrite 1214 45 +60 +0 + With_usbFunctionRead 1192 45 +38 +0 + With_usbFunctionRead_and_Write 1234 45 +80 +0 + With_usbFunctionWriteOut 1178 45 +24 +0 + With_Interrupt_In_Endpoint_1 1280 57 +126 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1370 57 +216 +12 + With_Interrupt_In_Endpoint_1_and_3 1346 69 +192 +24 + With_Dynamic_Descriptor 1182 45 +28 +0 + With_Long_Transfers 1200 47 +46 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc4.3.0.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc4.3.0.txt new file mode 100644 index 0000000..e3218b4 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20080513-gcc4.3.0.txt @@ -0,0 +1,15 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1192 45 +0 +0 + Minimum_with_12_MHz 1312 45 +120 +0 + Minimum_with_15_MHz 1298 45 +106 +0 + Minimum_with_16_5_MHz 1314 45 +122 +0 + Minimum_with_20_MHz 1174 45 -18 +0 + With_usbFunctionWrite 1246 45 +54 +0 + With_usbFunctionRead 1242 45 +50 +0 + With_usbFunctionRead_and_Write 1280 45 +88 +0 + With_usbFunctionWriteOut 1208 45 +16 +0 + With_Interrupt_In_Endpoint_1 1320 57 +128 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1410 57 +218 +12 + With_Interrupt_In_Endpoint_1_and_3 1428 69 +236 +24 + With_Dynamic_Descriptor 1212 45 +20 +0 + With_Long_Transfers 1270 47 +78 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc3.4.6.txt new file mode 100644 index 0000000..0dfafa7 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc3.4.6.txt @@ -0,0 +1,16 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1152 45 +0 +0 + Minimum_with_12_MHz 1202 45 +50 +0 + Minimum_with_12_8_MHz 1522 45 +370 +0 + Minimum_with_15_MHz 1258 45 +106 +0 + Minimum_with_16_5_MHz 1274 45 +122 +0 + Minimum_with_20_MHz 1134 45 -18 +0 + With_usbFunctionWrite 1212 45 +60 +0 + With_usbFunctionRead 1190 45 +38 +0 + With_usbFunctionRead_and_Write 1232 45 +80 +0 + With_usbFunctionWriteOut 1176 45 +24 +0 + With_Interrupt_In_Endpoint_1 1278 57 +126 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1368 57 +216 +12 + With_Interrupt_In_Endpoint_1_and_3 1344 69 +192 +24 + With_Dynamic_Descriptor 1180 45 +28 +0 + With_Long_Transfers 1198 47 +46 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc4.3.0.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc4.3.0.txt new file mode 100644 index 0000000..42e2ba9 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081022-gcc4.3.0.txt @@ -0,0 +1,16 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1194 45 +0 +0 + Minimum_with_12_MHz 1244 45 +50 +0 + Minimum_with_12_8_MHz 1564 45 +370 +0 + Minimum_with_15_MHz 1300 45 +106 +0 + Minimum_with_16_5_MHz 1316 45 +122 +0 + Minimum_with_20_MHz 1176 45 -18 +0 + With_usbFunctionWrite 1248 45 +54 +0 + With_usbFunctionRead 1244 45 +50 +0 + With_usbFunctionRead_and_Write 1282 45 +88 +0 + With_usbFunctionWriteOut 1210 45 +16 +0 + With_Interrupt_In_Endpoint_1 1322 57 +128 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1412 57 +218 +12 + With_Interrupt_In_Endpoint_1_and_3 1430 69 +236 +24 + With_Dynamic_Descriptor 1214 45 +20 +0 + With_Long_Transfers 1272 47 +78 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc3.4.6.txt new file mode 100644 index 0000000..0dfafa7 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc3.4.6.txt @@ -0,0 +1,16 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1152 45 +0 +0 + Minimum_with_12_MHz 1202 45 +50 +0 + Minimum_with_12_8_MHz 1522 45 +370 +0 + Minimum_with_15_MHz 1258 45 +106 +0 + Minimum_with_16_5_MHz 1274 45 +122 +0 + Minimum_with_20_MHz 1134 45 -18 +0 + With_usbFunctionWrite 1212 45 +60 +0 + With_usbFunctionRead 1190 45 +38 +0 + With_usbFunctionRead_and_Write 1232 45 +80 +0 + With_usbFunctionWriteOut 1176 45 +24 +0 + With_Interrupt_In_Endpoint_1 1278 57 +126 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1368 57 +216 +12 + With_Interrupt_In_Endpoint_1_and_3 1344 69 +192 +24 + With_Dynamic_Descriptor 1180 45 +28 +0 + With_Long_Transfers 1198 47 +46 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc4.3.0.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc4.3.0.txt new file mode 100644 index 0000000..42e2ba9 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20081126-gcc4.3.0.txt @@ -0,0 +1,16 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1194 45 +0 +0 + Minimum_with_12_MHz 1244 45 +50 +0 + Minimum_with_12_8_MHz 1564 45 +370 +0 + Minimum_with_15_MHz 1300 45 +106 +0 + Minimum_with_16_5_MHz 1316 45 +122 +0 + Minimum_with_20_MHz 1176 45 -18 +0 + With_usbFunctionWrite 1248 45 +54 +0 + With_usbFunctionRead 1244 45 +50 +0 + With_usbFunctionRead_and_Write 1282 45 +88 +0 + With_usbFunctionWriteOut 1210 45 +16 +0 + With_Interrupt_In_Endpoint_1 1322 57 +128 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1412 57 +218 +12 + With_Interrupt_In_Endpoint_1_and_3 1430 69 +236 +24 + With_Dynamic_Descriptor 1214 45 +20 +0 + With_Long_Transfers 1272 47 +78 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc3.4.6.txt new file mode 100644 index 0000000..18e72a6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc3.4.6.txt @@ -0,0 +1,17 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1152 45 +0 +0 + Minimum_with_12_MHz 1202 45 +50 +0 + Minimum_with_12_8_MHz 1522 45 +370 +0 + Minimum_with_15_MHz 1258 45 +106 +0 + Minimum_with_16_5_MHz 1274 45 +122 +0 + Minimum_with_18_MHz+CRC 2268 45 +1116 +0 + Minimum_with_20_MHz 1134 45 -18 +0 + With_usbFunctionWrite 1212 45 +60 +0 + With_usbFunctionRead 1190 45 +38 +0 + With_usbFunctionRead_and_Write 1232 45 +80 +0 + With_usbFunctionWriteOut 1176 45 +24 +0 + With_Interrupt_In_Endpoint_1 1278 57 +126 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1368 57 +216 +12 + With_Interrupt_In_Endpoint_1_and_3 1344 69 +192 +24 + With_Dynamic_Descriptor 1180 45 +28 +0 + With_Long_Transfers 1198 47 +46 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc4.3.2.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc4.3.2.txt new file mode 100644 index 0000000..9b4f4ee --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090323-gcc4.3.2.txt @@ -0,0 +1,17 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1224 45 +0 +0 + Minimum_with_12_MHz 1274 45 +50 +0 + Minimum_with_12_8_MHz 1594 45 +370 +0 + Minimum_with_15_MHz 1330 45 +106 +0 + Minimum_with_16_5_MHz 1346 45 +122 +0 + Minimum_with_18_MHz+CRC 2298 45 +1074 +0 + Minimum_with_20_MHz 1206 45 -18 +0 + With_usbFunctionWrite 1284 45 +60 +0 + With_usbFunctionRead 1280 45 +56 +0 + With_usbFunctionRead_and_Write 1318 45 +94 +0 + With_usbFunctionWriteOut 1246 45 +22 +0 + With_Interrupt_In_Endpoint_1 1358 57 +134 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1448 57 +224 +12 + With_Interrupt_In_Endpoint_1_and_3 1466 69 +242 +24 + With_Dynamic_Descriptor 1250 45 +26 +0 + With_Long_Transfers 1302 47 +78 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc3.4.6.txt new file mode 100644 index 0000000..18e72a6 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc3.4.6.txt @@ -0,0 +1,17 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1152 45 +0 +0 + Minimum_with_12_MHz 1202 45 +50 +0 + Minimum_with_12_8_MHz 1522 45 +370 +0 + Minimum_with_15_MHz 1258 45 +106 +0 + Minimum_with_16_5_MHz 1274 45 +122 +0 + Minimum_with_18_MHz+CRC 2268 45 +1116 +0 + Minimum_with_20_MHz 1134 45 -18 +0 + With_usbFunctionWrite 1212 45 +60 +0 + With_usbFunctionRead 1190 45 +38 +0 + With_usbFunctionRead_and_Write 1232 45 +80 +0 + With_usbFunctionWriteOut 1176 45 +24 +0 + With_Interrupt_In_Endpoint_1 1278 57 +126 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1368 57 +216 +12 + With_Interrupt_In_Endpoint_1_and_3 1344 69 +192 +24 + With_Dynamic_Descriptor 1180 45 +28 +0 + With_Long_Transfers 1198 47 +46 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc4.3.2.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc4.3.2.txt new file mode 100644 index 0000000..9b4f4ee --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20090415-gcc4.3.2.txt @@ -0,0 +1,17 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1224 45 +0 +0 + Minimum_with_12_MHz 1274 45 +50 +0 + Minimum_with_12_8_MHz 1594 45 +370 +0 + Minimum_with_15_MHz 1330 45 +106 +0 + Minimum_with_16_5_MHz 1346 45 +122 +0 + Minimum_with_18_MHz+CRC 2298 45 +1074 +0 + Minimum_with_20_MHz 1206 45 -18 +0 + With_usbFunctionWrite 1284 45 +60 +0 + With_usbFunctionRead 1280 45 +56 +0 + With_usbFunctionRead_and_Write 1318 45 +94 +0 + With_usbFunctionWriteOut 1246 45 +22 +0 + With_Interrupt_In_Endpoint_1 1358 57 +134 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1448 57 +224 +12 + With_Interrupt_In_Endpoint_1_and_3 1466 69 +242 +24 + With_Dynamic_Descriptor 1250 45 +26 +0 + With_Long_Transfers 1302 47 +78 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc3.4.6.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc3.4.6.txt new file mode 100644 index 0000000..a7550ee --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc3.4.6.txt @@ -0,0 +1,17 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1152 45 +0 +0 + Minimum_with_12_MHz 1202 45 +50 +0 + Minimum_with_12_8_MHz 1518 45 +366 +0 + Minimum_with_15_MHz 1258 45 +106 +0 + Minimum_with_16_5_MHz 1274 45 +122 +0 + Minimum_with_18_MHz+CRC 2268 45 +1116 +0 + Minimum_with_20_MHz 1134 45 -18 +0 + With_usbFunctionWrite 1212 45 +60 +0 + With_usbFunctionRead 1190 45 +38 +0 + With_usbFunctionRead_and_Write 1232 45 +80 +0 + With_usbFunctionWriteOut 1176 45 +24 +0 + With_Interrupt_In_Endpoint_1 1278 57 +126 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1368 57 +216 +12 + With_Interrupt_In_Endpoint_1_and_3 1344 69 +192 +24 + With_Dynamic_Descriptor 1180 45 +28 +0 + With_Long_Transfers 1198 47 +46 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc4.3.3.txt b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc4.3.3.txt new file mode 100644 index 0000000..ce162f3 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/sizes-reference/sizes-20100715-gcc4.3.3.txt @@ -0,0 +1,17 @@ + Variation Flash RAM +F +RAM + Minimum_with_16_MHz 1226 45 +0 +0 + Minimum_with_12_MHz 1276 45 +50 +0 + Minimum_with_12_8_MHz 1592 45 +366 +0 + Minimum_with_15_MHz 1332 45 +106 +0 + Minimum_with_16_5_MHz 1348 45 +122 +0 + Minimum_with_18_MHz+CRC 2298 45 +1072 +0 + Minimum_with_20_MHz 1208 45 -18 +0 + With_usbFunctionWrite 1286 45 +60 +0 + With_usbFunctionRead 1282 45 +56 +0 + With_usbFunctionRead_and_Write 1320 45 +94 +0 + With_usbFunctionWriteOut 1248 45 +22 +0 + With_Interrupt_In_Endpoint_1 1360 57 +134 +12 + With_Interrupt_In_Endpoint_1_and_Halt 1450 57 +224 +12 + With_Interrupt_In_Endpoint_1_and_3 1418 69 +192 +24 + With_Dynamic_Descriptor 1252 45 +26 +0 + With_Long_Transfers 1304 47 +78 +2 diff --git a/adb2usb/uart2usb/vusb-20100715/tests/usbconfig.h b/adb2usb/uart2usb/vusb-20100715/tests/usbconfig.h new file mode 100644 index 0000000..8281c2e --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/tests/usbconfig.h @@ -0,0 +1,288 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig.h 774 2010-01-15 18:33:11Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +/* +General Description: +This is the config file for tests. It is not updated to the latest set of +features. Don't use it as a prototype, use usbconfig-prototype.h instead! +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +#define USB_CFG_DMINUS_BIT 4 +#define USB_CFG_DPLUS_BIT 2 +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +#define USB_CFG_CHECK_CRC (USB_CFG_CLOCK_KHZ == 18000) + + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#ifndef USB_CFG_HAVE_INTRIN_ENDPOINT3 +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0 +#endif +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#ifndef USB_CFG_HAVE_INTRIN_ENDPOINT +#define USB_CFG_HAVE_INTRIN_ENDPOINT USB_CFG_HAVE_INTRIN_ENDPOINT3 +#endif +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +//#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_INTR_POLL_INTERVAL 10 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 40 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +//#define USB_CFG_IMPLEMENT_FN_WRITE 0 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +//#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +//#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +//#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +//#define USB_COUNT_SOF 0 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +//#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID 0xc0, 0x16 +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you use one of obdev's free shared + * VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + */ +#define USB_CFG_DEVICE_ID 0x08, 0x3e /* 1000 dec, "free for lab use" */ +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you use obdev's free shared VID/PID pair. Be sure to read the rules in + * USB-IDs-for-free.txt! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x01 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't' +#define USB_CFG_VENDOR_NAME_LEN 8 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'T', 'e', 's', 't' +#define USB_CFG_DEVICE_NAME_LEN 4 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0xff /* set to 0 if deferred to interface */ +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 0 /* define class here if not at device level */ +#define USB_CFG_INTERFACE_SUBCLASS 0 +#define USB_CFG_INTERFACE_PROTOCOL 0 +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +/* #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 42 */ +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + */ + +#if USE_DYNAMIC_DESCRIPTOR +#define USB_CFG_DESCR_PROPS_DEVICE USB_PROP_IS_DYNAMIC +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +#else +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#endif +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +#endif /* __usbconfig_h_included__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/Changelog.txt b/adb2usb/uart2usb/vusb-20100715/usbdrv/Changelog.txt new file mode 100644 index 0000000..5c6354a --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/Changelog.txt @@ -0,0 +1,308 @@ +This file documents changes in the firmware-only USB driver for atmel's AVR +microcontrollers. New entries are always appended to the end of the file. +Scroll down to the bottom to see the most recent changes. + +2005-04-01: + - Implemented endpoint 1 as interrupt-in endpoint. + - Moved all configuration options to usbconfig.h which is not part of the + driver. + - Changed interface for usbVendorSetup(). + - Fixed compatibility with ATMega8 device. + - Various minor optimizations. + +2005-04-11: + - Changed interface to application: Use usbFunctionSetup(), usbFunctionRead() + and usbFunctionWrite() now. Added configuration options to choose which + of these functions to compile in. + - Assembler module delivers receive data non-inverted now. + - Made register and bit names compatible with more AVR devices. + +2005-05-03: + - Allow address of usbRxBuf on any memory page as long as the buffer does + not cross 256 byte page boundaries. + - Better device compatibility: works with Mega88 now. + - Code optimization in debugging module. + - Documentation updates. + +2006-01-02: + - Added (free) default Vendor- and Product-IDs bought from voti.nl. + - Added USBID-License.txt file which defines the rules for using the free + shared VID/PID pair. + - Added Readme.txt to the usbdrv directory which clarifies administrative + issues. + +2006-01-25: + - Added "configured state" to become more standards compliant. + - Added "HALT" state for interrupt endpoint. + - Driver passes the "USB Command Verifier" test from usb.org now. + - Made "serial number" a configuration option. + - Minor optimizations, we now recommend compiler option "-Os" for best + results. + - Added a version number to usbdrv.h + +2006-02-03: + - New configuration variable USB_BUFFER_SECTION for the memory section where + the USB rx buffer will go. This defaults to ".bss" if not defined. Since + this buffer MUST NOT cross 256 byte pages (not even touch a page at the + end), the user may want to pass a linker option similar to + "-Wl,--section-start=.mybuffer=0x800060". + - Provide structure for usbRequest_t. + - New defines for USB constants. + - Prepared for HID implementations. + - Increased data size limit for interrupt transfers to 8 bytes. + - New macro usbInterruptIsReady() to query interrupt buffer state. + +2006-02-18: + - Ensure that the data token which is sent as an ack to an OUT transfer is + always zero sized. This fixes a bug where the host reports an error after + sending an out transfer to the device, although all data arrived at the + device. + - Updated docs in usbdrv.h to reflect changed API in usbFunctionWrite(). + +* Release 2006-02-20 + + - Give a compiler warning when compiling with debugging turned on. + - Added Oleg Semyonov's changes for IAR-cc compatibility. + - Added new (optional) functions usbDeviceConnect() and usbDeviceDisconnect() + (also thanks to Oleg!). + - Rearranged tests in usbPoll() to save a couple of instructions in the most + likely case that no actions are pending. + - We need a delay between the SET ADDRESS request until the new address + becomes active. This delay was handled in usbPoll() until now. Since the + spec says that the delay must not exceed 2ms, previous versions required + aggressive polling during the enumeration phase. We have now moved the + handling of the delay into the interrupt routine. + - We must not reply with NAK to a SETUP transaction. We can only achieve this + by making sure that the rx buffer is empty when SETUP tokens are expected. + We therefore don't pass zero sized data packets from the status phase of + a transfer to usbPoll(). This change MAY cause troubles if you rely on + receiving a less than 8 bytes long packet in usbFunctionWrite() to + identify the end of a transfer. usbFunctionWrite() will NEVER be called + with a zero length. + +* Release 2006-03-14 + + - Improved IAR C support: tiny memory model, more devices + - Added template usbconfig.h file under the name usbconfig-prototype.h + +* Release 2006-03-26 + + - Added provision for one more interrupt-in endpoint (endpoint 3). + - Added provision for one interrupt-out endpoint (endpoint 1). + - Added flowcontrol macros for USB. + - Added provision for custom configuration descriptor. + - Allow ANY two port bits for D+ and D-. + - Merged (optional) receive endpoint number into global usbRxToken variable. + - Use USB_CFG_IOPORTNAME instead of USB_CFG_IOPORT. We now construct the + variable name from the single port letter instead of computing the address + of related ports from the output-port address. + +* Release 2006-06-26 + + - Updated documentation in usbdrv.h and usbconfig-prototype.h to reflect the + new features. + - Removed "#warning" directives because IAR does not understand them. Use + unused static variables instead to generate a warning. + - Do not include when compiling with IAR. + - Introduced USB_CFG_DESCR_PROPS_* in usbconfig.h to configure how each + USB descriptor should be handled. It is now possible to provide descriptor + data in Flash, RAM or dynamically at runtime. + - STALL is now a status in usbTxLen* instead of a message. We can now conform + to the spec and leave the stall status pending until it is cleared. + - Made usbTxPacketCnt1 and usbTxPacketCnt3 public. This allows the + application code to reset data toggling on interrupt pipes. + +* Release 2006-07-18 + + - Added an #if !defined __ASSEMBLER__ to the warning in usbdrv.h. This fixes + an assembler error. + - usbDeviceDisconnect() takes pull-up resistor to high impedance now. + +* Release 2007-02-01 + + - Merged in some code size improvements from usbtiny (thanks to Dick + Streefland for these optimizations!) + - Special alignment requirement for usbRxBuf not required any more. Thanks + again to Dick Streefland for this hint! + - Reverted to "#warning" instead of unused static variables -- new versions + of IAR CC should handle this directive. + - Changed Open Source license to GNU GPL v2 in order to make linking against + other free libraries easier. We no longer require publication of the + circuit diagrams, but we STRONGLY encourage it. If you improve the driver + itself, PLEASE grant us a royalty free license to your changes for our + commercial license. + +* Release 2007-03-29 + + - New configuration option "USB_PUBLIC" in usbconfig.h. + - Set USB version number to 1.10 instead of 1.01. + - Code used USB_CFG_DESCR_PROPS_STRING_DEVICE and + USB_CFG_DESCR_PROPS_STRING_PRODUCT inconsistently. Changed all occurrences + to USB_CFG_DESCR_PROPS_STRING_PRODUCT. + - New assembler module for 16.5 MHz RC oscillator clock with PLL in receiver + code. + - New assembler module for 16 MHz crystal. + - usbdrvasm.S contains common code only, clock-specific parts have been moved + to usbdrvasm12.S, usbdrvasm16.S and usbdrvasm165.S respectively. + +* Release 2007-06-25 + + - 16 MHz module: Do SE0 check in stuffed bits as well. + +* Release 2007-07-07 + + - Define hi8(x) for IAR compiler to limit result to 8 bits. This is necessary + for negative values. + - Added 15 MHz module contributed by V. Bosch. + - Interrupt vector name can now be configured. This is useful if somebody + wants to use a different hardware interrupt than INT0. + +* Release 2007-08-07 + + - Moved handleIn3 routine in usbdrvasm16.S so that relative jump range is + not exceeded. + - More config options: USB_RX_USER_HOOK(), USB_INITIAL_DATATOKEN, + USB_COUNT_SOF + - USB_INTR_PENDING can now be a memory address, not just I/O + +* Release 2007-09-19 + + - Split out common parts of assembler modules into separate include file + - Made endpoint numbers configurable so that given interface definitions + can be matched. See USB_CFG_EP3_NUMBER in usbconfig-prototype.h. + - Store endpoint number for interrupt/bulk-out so that usbFunctionWriteOut() + can handle any number of endpoints. + - Define usbDeviceConnect() and usbDeviceDisconnect() even if no + USB_CFG_PULLUP_IOPORTNAME is defined. Directly set D+ and D- to 0 in this + case. + +* Release 2007-12-01 + + - Optimize usbDeviceConnect() and usbDeviceDisconnect() for less code size + when USB_CFG_PULLUP_IOPORTNAME is not defined. + +* Release 2007-12-13 + + - Renamed all include-only assembler modules from *.S to *.inc so that + people don't add them to their project sources. + - Distribute leap bits in tx loop more evenly for 16 MHz module. + - Use "macro" and "endm" instead of ".macro" and ".endm" for IAR + - Avoid compiler warnings for constant expr range by casting some values in + USB descriptors. + +* Release 2008-01-21 + + - Fixed bug in 15 and 16 MHz module where the new address set with + SET_ADDRESS was already accepted at the next NAK or ACK we send, not at + the next data packet we send. This caused problems when the host polled + too fast. Thanks to Alexander Neumann for his help and patience debugging + this issue! + +* Release 2008-02-05 + + - Fixed bug in 16.5 MHz module where a register was used in the interrupt + handler before it was pushed. This bug was introduced with version + 2007-09-19 when common parts were moved to a separate file. + - Optimized CRC routine (thanks to Reimar Doeffinger). + +* Release 2008-02-16 + + - Removed outdated IAR compatibility stuff (code sections). + - Added hook macros for USB_RESET_HOOK() and USB_SET_ADDRESS_HOOK(). + - Added optional routine usbMeasureFrameLength() for calibration of the + internal RC oscillator. + +* Release 2008-02-28 + + - USB_INITIAL_DATATOKEN defaults to USBPID_DATA1 now, which means that we + start with sending USBPID_DATA0. + - Changed defaults in usbconfig-prototype.h + - Added free USB VID/PID pair for MIDI class devices + - Restructured AVR-USB as separate package, not part of PowerSwitch any more. + +* Release 2008-04-18 + + - Restructured usbdrv.c so that it is easier to read and understand. + - Better code optimization with gcc 4. + - If a second interrupt in endpoint is enabled, also add it to config + descriptor. + - Added config option for long transfers (above 254 bytes), see + USB_CFG_LONG_TRANSFERS in usbconfig.h. + - Added 20 MHz module contributed by Jeroen Benschop. + +* Release 2008-05-13 + + - Fixed bug in libs-host/hiddata.c function usbhidGetReport(): length + was not incremented, pointer to length was incremented instead. + - Added code to command line tool(s) which claims an interface. This code + is disabled by default, but may be necessary on newer Linux kernels. + - Added usbconfig.h option "USB_CFG_CHECK_DATA_TOGGLING". + - New header "usbportability.h" prepares ports to other development + environments. + - Long transfers (above 254 bytes) did not work when usbFunctionRead() was + used to supply the data. Fixed this bug. [Thanks to Alexander Neumann!] + - In hiddata.c (example code for sending/receiving data over HID), use + USB_RECIP_DEVICE instead of USB_RECIP_INTERFACE for control transfers so + that we need not claim the interface. + - in usbPoll() loop 20 times polling for RESET state instead of 10 times. + This accounts for the higher clock rates we now support. + - Added a module for 12.8 MHz RC oscillator with PLL in receiver loop. + - Added hook to SOF code so that oscillator can be tuned to USB frame clock. + - Added timeout to waitForJ loop. Helps preventing unexpected hangs. + - Added example code for oscillator tuning to libs-device (thanks to + Henrik Haftmann for the idea to this routine). + - Implemented option USB_CFG_SUPPRESS_INTR_CODE. + +* Release 2008-10-22 + + - Fixed libs-device/osctune.h: OSCCAL is memory address on ATMega88 and + similar, not offset of 0x20 needs to be added. + - Allow distribution under GPLv3 for those who have to link against other + code distributed under GPLv3. + +* Release 2008-11-26 + + - Removed libusb-win32 dependency for hid-data example in Makefile.windows. + It was never required and confused many people. + - Added extern uchar usbRxToken to usbdrv.h. + - Integrated a module with CRC checks at 18 MHz by Lukas Schrittwieser. + +* Release 2009-03-23 + + - Hid-mouse example used settings from hid-data example, fixed that. + - Renamed project to V-USB due to a trademark issue with Atmel(r). + - Changed CommercialLicense.txt and USBID-License.txt to make the + background of USB ID registration clearer. + +* Release 2009-04-15 + + - Changed CommercialLicense.txt to reflect the new range of PIDs from + Jason Kotzin. + - Removed USBID-License.txt in favor of USB-IDs-for-free.txt and + USB-ID-FAQ.txt + - Fixed a bug in the 12.8 MHz module: End Of Packet decection was made in + the center between bit 0 and 1 of each byte. This is where the data lines + are expected to change and the sampled data may therefore be nonsense. + We therefore check EOP ONLY if bits 0 AND 1 have both been read as 0 on D-. + - Fixed a bitstuffing problem in the 16 MHz module: If bit 6 was stuffed, + the unstuffing code in the receiver routine was 1 cycle too long. If + multiple bytes had the unstuffing in bit 6, the error summed up until the + receiver was out of sync. + - Included option for faster CRC routine. + Thanks to Slawomir Fras (BoskiDialer) for this code! + - Updated bits in Configuration Descriptor's bmAttributes according to + USB 1.1 (in particular bit 7, it is a must-be-set bit now). + +* Release 2009-08-22 + + - Moved first DBG1() after odDebugInit() in all examples. + - Use vector INT0_vect instead of SIG_INTERRUPT0 if defined. This makes + V-USB compatible with the new "p" suffix devices (e.g. ATMega328p). + - USB_CFG_CLOCK_KHZ setting is now required in usbconfig.h (no default any + more). + - New option USB_CFG_DRIVER_FLASH_PAGE allows boot loaders on devices with + more than 64 kB flash. + - Built-in configuration descriptor allows custom definition for second + endpoint now. + +* Release 2010-07-15 diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/CommercialLicense.txt b/adb2usb/uart2usb/vusb-20100715/usbdrv/CommercialLicense.txt new file mode 100644 index 0000000..11d07d9 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/CommercialLicense.txt @@ -0,0 +1,166 @@ +V-USB Driver Software License Agreement +Version 2009-08-03 + +THIS LICENSE AGREEMENT GRANTS YOU CERTAIN RIGHTS IN A SOFTWARE. YOU CAN +ENTER INTO THIS AGREEMENT AND ACQUIRE THE RIGHTS OUTLINED BELOW BY PAYING +THE AMOUNT ACCORDING TO SECTION 4 ("PAYMENT") TO OBJECTIVE DEVELOPMENT. + + +1 DEFINITIONS + +1.1 "OBJECTIVE DEVELOPMENT" shall mean OBJECTIVE DEVELOPMENT Software GmbH, +Grosse Schiffgasse 1A/7, 1020 Wien, AUSTRIA. + +1.2 "You" shall mean the Licensee. + +1.3 "V-USB" shall mean all files included in the package distributed under +the name "vusb" by OBJECTIVE DEVELOPMENT (http://www.obdev.at/vusb/) +unless otherwise noted. This includes the firmware-only USB device +implementation for Atmel AVR microcontrollers, some simple device examples +and host side software examples and libraries. + + +2 LICENSE GRANTS + +2.1 Source Code. OBJECTIVE DEVELOPMENT shall furnish you with the source +code of V-USB. + +2.2 Distribution and Use. OBJECTIVE DEVELOPMENT grants you the +non-exclusive right to use, copy and distribute V-USB with your hardware +product(s), restricted by the limitations in section 3 below. + +2.3 Modifications. OBJECTIVE DEVELOPMENT grants you the right to modify +the source code and your copy of V-USB according to your needs. + +2.4 USB IDs. OBJECTIVE DEVELOPMENT furnishes you with one or two USB +Product ID(s), sent to you in e-mail. These Product IDs are reserved +exclusively for you. OBJECTIVE DEVELOPMENT has obtained USB Product ID +ranges under the Vendor ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under the Vendor ID 8352 from +Jason Kotzin (Clay Logic, www.claylogic.com). Both owners of the Vendor IDs +have obtained these IDs from the USB Implementers Forum, Inc. +(www.usb.org). OBJECTIVE DEVELOPMENT disclaims all liability which might +arise from the assignment of USB IDs. + +2.5 USB Certification. Although not part of this agreement, we want to make +it clear that you cannot become USB certified when you use V-USB or a USB +Product ID assigned by OBJECTIVE DEVELOPMENT. AVR microcontrollers don't +meet the electrical specifications required by the USB specification and +the USB Implementers Forum certifies only members who bought a Vendor ID of +their own. + + +3 LICENSE RESTRICTIONS + +3.1 Number of Units. Only one of the following three definitions is +applicable. Which one is determined by the amount you pay to OBJECTIVE +DEVELOPMENT, see section 4 ("Payment") below. + +Hobby License: You may use V-USB according to section 2 above in no more +than 5 hardware units. These units must not be sold for profit. + +Entry Level License: You may use V-USB according to section 2 above in no +more than 150 hardware units. + +Professional License: You may use V-USB according to section 2 above in +any number of hardware units, except for large scale production ("unlimited +fair use"). Quantities below 10,000 units are not considered large scale +production. If your reach quantities which are obviously large scale +production, you must pay a license fee of 0.10 EUR per unit for all units +above 10,000. + +3.2 Rental. You may not rent, lease, or lend V-USB or otherwise encumber +any copy of V-USB, or any of the rights granted herein. + +3.3 Transfer. You may not transfer your rights under this Agreement to +another party without OBJECTIVE DEVELOPMENT's prior written consent. If +such consent is obtained, you may permanently transfer this License to +another party. The recipient of such transfer must agree to all terms and +conditions of this Agreement. + +3.4 Reservation of Rights. OBJECTIVE DEVELOPMENT retains all rights not +expressly granted. + +3.5 Non-Exclusive Rights. Your license rights under this Agreement are +non-exclusive. + +3.6 Third Party Rights. This Agreement cannot grant you rights controlled +by third parties. In particular, you are not allowed to use the USB logo or +other trademarks owned by the USB Implementers Forum, Inc. without their +consent. Since such consent depends on USB certification, it should be +noted that V-USB will not pass certification because it does not +implement checksum verification and the microcontroller ports do not meet +the electrical specifications. + + +4 PAYMENT + +The payment amount depends on the variation of this agreement (according to +section 3.1) into which you want to enter. Concrete prices are listed on +OBJECTIVE DEVELOPMENT's web site, usually at +http://www.obdev.at/vusb/license.html. You agree to pay the amount listed +there to OBJECTIVE DEVELOPMENT or OBJECTIVE DEVELOPMENT's payment processor +or reseller. + + +5 COPYRIGHT AND OWNERSHIP + +V-USB is protected by copyright laws and international copyright +treaties, as well as other intellectual property laws and treaties. V-USB +is licensed, not sold. + + +6 TERM AND TERMINATION + +6.1 Term. This Agreement shall continue indefinitely. However, OBJECTIVE +DEVELOPMENT may terminate this Agreement and revoke the granted license and +USB-IDs if you fail to comply with any of its terms and conditions. + +6.2 Survival of Terms. All provisions regarding secrecy, confidentiality +and limitation of liability shall survive termination of this agreement. + + +7 DISCLAIMER OF WARRANTY AND LIABILITY + +LIMITED WARRANTY. V-USB IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, OBJECTIVE +DEVELOPMENT AND ITS SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND +NON-INFRINGEMENT, WITH REGARD TO V-USB, AND THE PROVISION OF OR FAILURE +TO PROVIDE SUPPORT SERVICES. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL +RIGHTS. YOU MAY HAVE OTHERS, WHICH VARY FROM STATE/JURISDICTION TO +STATE/JURISDICTION. + +LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, +IN NO EVENT SHALL OBJECTIVE DEVELOPMENT OR ITS SUPPLIERS BE LIABLE FOR ANY +SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER +(INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, +BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY +LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE V-USB OR THE +PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, EVEN IF OBJECTIVE +DEVELOPMENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY +CASE, OBJECTIVE DEVELOPMENT'S ENTIRE LIABILITY UNDER ANY PROVISION OF THIS +AGREEMENT SHALL BE LIMITED TO THE AMOUNT ACTUALLY PAID BY YOU FOR V-USB. + + +8 MISCELLANEOUS TERMS + +8.1 Marketing. OBJECTIVE DEVELOPMENT has the right to mention for marketing +purposes that you entered into this agreement. + +8.2 Entire Agreement. This document represents the entire agreement between +OBJECTIVE DEVELOPMENT and you. It may only be modified in writing signed by +an authorized representative of both, OBJECTIVE DEVELOPMENT and you. + +8.3 Severability. In case a provision of these terms and conditions should +be or become partly or entirely invalid, ineffective, or not executable, +the validity of all other provisions shall not be affected. + +8.4 Applicable Law. This agreement is governed by the laws of the Republic +of Austria. + +8.5 Responsible Courts. The responsible courts in Vienna/Austria will have +exclusive jurisdiction regarding all disputes in connection with this +agreement. + diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/License.txt b/adb2usb/uart2usb/vusb-20100715/usbdrv/License.txt new file mode 100644 index 0000000..4460cfb --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/License.txt @@ -0,0 +1,361 @@ +OBJECTIVE DEVELOPMENT GmbH's V-USB driver software is distributed under the +terms and conditions of the GNU GPL version 2 or the GNU GPL version 3. It is +your choice whether you apply the terms of version 2 or version 3. The full +text of GPLv2 is included below. In addition to the requirements in the GPL, +we STRONGLY ENCOURAGE you to do the following: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/Readme.txt b/adb2usb/uart2usb/vusb-20100715/usbdrv/Readme.txt new file mode 100644 index 0000000..970dc66 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/Readme.txt @@ -0,0 +1,172 @@ +This is the Readme file to Objective Development's firmware-only USB driver +for Atmel AVR microcontrollers. For more information please visit +http://www.obdev.at/vusb/ + +This directory contains the USB firmware only. Copy it as-is to your own +project and add all .c and .S files to your project (these files are marked +with an asterisk in the list below). Then copy usbconfig-prototype.h as +usbconfig.h to your project and edit it according to your configuration. + + +TECHNICAL DOCUMENTATION +======================= +The technical documentation (API) for the firmware driver is contained in the +file "usbdrv.h". Please read all of it carefully! Configuration options are +documented in "usbconfig-prototype.h". + +The driver consists of the following files: + Readme.txt ............. The file you are currently reading. + Changelog.txt .......... Release notes for all versions of the driver. + usbdrv.h ............... Driver interface definitions and technical docs. +* usbdrv.c ............... High level language part of the driver. Link this + module to your code! +* usbdrvasm.S ............ Assembler part of the driver. This module is mostly + a stub and includes one of the usbdrvasm*.S files + depending on processor clock. Link this module to + your code! + usbdrvasm*.inc ......... Assembler routines for particular clock frequencies. + Included by usbdrvasm.S, don't link it directly! + asmcommon.inc .......... Common assembler routines. Included by + usbdrvasm*.inc, don't link it directly! + usbconfig-prototype.h .. Prototype for your own usbdrv.h file. +* oddebug.c .............. Debug functions. Only used when DEBUG_LEVEL is + defined to a value greater than 0. Link this module + to your code! + oddebug.h .............. Interface definitions of the debug module. + usbportability.h ....... Header with compiler-dependent stuff. + usbdrvasm.asm .......... Compatibility stub for IAR-C-compiler. Use this + module instead of usbdrvasm.S when you assembler + with IAR's tools. + License.txt ............ Open Source license for this driver. + CommercialLicense.txt .. Optional commercial license for this driver. + USB-ID-FAQ.txt ......... General infos about USB Product- and Vendor-IDs. + USB-IDs-for-free.txt ... List and terms of use for free shared PIDs. + +(*) ... These files should be linked to your project. + + +CPU CORE CLOCK FREQUENCY +======================== +We supply assembler modules for clock frequencies of 12 MHz, 12.8 MHz, 15 MHz, +16 MHz, 16.5 MHz 18 MHz and 20 MHz. Other clock rates are not supported. The +actual clock rate must be configured in usbconfig.h. + +12 MHz Clock +This is the traditional clock rate of V-USB because it's the lowest clock +rate where the timing constraints of the USB spec can be met. + +15 MHz Clock +Similar to 12 MHz, but some NOPs inserted. On the other hand, the higher clock +rate allows for some loops which make the resulting code size somewhat smaller +than the 12 MHz version. + +16 MHz Clock +This clock rate has been added for users of the Arduino board and other +ready-made boards which come with a fixed 16 MHz crystal. It's also an option +if you need the slightly higher clock rate for performance reasons. Since +16 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code +is somewhat tricky and has to insert a leap cycle every third byte. + +12.8 MHz and 16.5 MHz Clock +The assembler modules for these clock rates differ from the other modules +because they have been built for an RC oscillator with only 1% precision. The +receiver code inserts leap cycles to compensate for clock deviations. 1% is +also the precision which can be achieved by calibrating the internal RC +oscillator of the AVR. Please note that only AVRs with internal 64 MHz PLL +oscillator can reach 16.5 MHz with the RC oscillator. This includes the very +popular ATTiny25, ATTiny45, ATTiny85 series as well as the ATTiny26. Almost +all AVRs can reach 12.8 MHz, although this is outside the specified range. + +See the EasyLogger example at http://www.obdev.at/vusb/easylogger.html for +code which calibrates the RC oscillator based on the USB frame clock. + +18 MHz Clock +This module is closer to the USB specification because it performs an on the +fly CRC check for incoming packets. Packets with invalid checksum are +discarded as required by the spec. If you also implement checks for data +PID toggling on application level (see option USB_CFG_CHECK_DATA_TOGGLING +in usbconfig.h for more info), this ensures data integrity. Due to the CRC +tables and alignment requirements, this code is bigger than modules for other +clock rates. To activate this module, you must define USB_CFG_CHECK_CRC to 1 +and USB_CFG_CLOCK_KHZ to 18000 in usbconfig.h. + +20 MHz Clock +This module is for people who won't do it with less than the maximum. Since +20 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code +uses similar tricks as the 16 MHz module to insert leap cycles. + + +USB IDENTIFIERS +=============== +Every USB device needs a vendor- and a product-identifier (VID and PID). VIDs +are obtained from usb.org for a price of 1,500 USD. Once you have a VID, you +can assign PIDs at will. + +Since an entry level cost of 1,500 USD is too high for most small companies +and hobbyists, we provide some VID/PID pairs for free. See the file +USB-IDs-for-free.txt for details. + +Objective Development also has some license offerings which include product +IDs. See http://www.obdev.at/vusb/ for details. + + +DEVELOPMENT SYSTEM +================== +This driver has been developed and optimized for the GNU compiler version 3 +and 4. We recommend that you use the GNU compiler suite because it is freely +available. V-USB has also been ported to the IAR compiler and assembler. It +has been tested with IAR 4.10B/W32 and 4.12A/W32 on an ATmega8 with the +"small" and "tiny" memory model. Not every release is tested with IAR CC and +the driver may therefore fail to compile with IAR. Please note that gcc is +more efficient for usbdrv.c because this module has been deliberately +optimized for gcc. + +Gcc version 3 produces smaller code than version 4 due to new optimizing +capabilities which don't always improve things on 8 bit CPUs. The code size +generated by gcc 4 can be reduced with the compiler options +-fno-move-loop-invariants, -fno-tree-scev-cprop and +-fno-inline-small-functions in addition to -Os. On devices with more than +8k of flash memory, we also recommend the linker option --relax (written as +-Wl,--relax for gcc) to convert absolute calls into relative where possible. + +For more information about optimizing options see: + + http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html + +These optimizations are good for gcc 4.x. Version 3.x of gcc does not support +most of these options and produces good code anyway. + + +USING V-USB FOR FREE +==================== +The AVR firmware driver is published under the GNU General Public License +Version 2 (GPL2) and the GNU General Public License Version 3 (GPL3). It is +your choice whether you apply the terms of version 2 or version 3. + +If you decide for the free GPL2 or GPL3, we STRONGLY ENCOURAGE you to do the +following things IN ADDITION to the obligations from the GPL: + +(1) Publish your entire project on a web site and drop us a note with the URL. +Use the form at http://www.obdev.at/vusb/feedback.html for your submission. +If you don't have a web site, you can publish the project in obdev's +documentation wiki at +http://www.obdev.at/goto.php?t=vusb-wiki&p=hosted-projects. + +(2) Adhere to minimum publication standards. Please include AT LEAST: + - a circuit diagram in PDF, PNG or GIF format + - full source code for the host software + - a Readme.txt file in ASCII format which describes the purpose of the + project and what can be found in which directories and which files + - a reference to http://www.obdev.at/vusb/ + +(3) If you improve the driver firmware itself, please give us a free license +to your modifications for our commercial license offerings. + + +COMMERCIAL LICENSES FOR V-USB +============================= +If you don't want to publish your source code under the terms of the GPL, +you can simply pay money for V-USB. As an additional benefit you get +USB PIDs for free, reserved exclusively to you. See the file +"CommercialLicense.txt" for details. + diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/USB-ID-FAQ.txt b/adb2usb/uart2usb/vusb-20100715/usbdrv/USB-ID-FAQ.txt new file mode 100644 index 0000000..d1de8fb --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/USB-ID-FAQ.txt @@ -0,0 +1,149 @@ +Version 2009-08-22 + +========================== +WHY DO WE NEED THESE IDs? +========================== + +USB is more than a low level protocol for data transport. It also defines a +common set of requests which must be understood by all devices. And as part +of these common requests, the specification defines data structures, the +USB Descriptors, which are used to describe the properties of the device. + +From the perspective of an operating system, it is therefore possible to find +out basic properties of a device (such as e.g. the manufacturer and the name +of the device) without a device-specific driver. This is essential because +the operating system can choose a driver to load based on this information +(Plug-And-Play). + +Among the most important properties in the Device Descriptor are the USB +Vendor- and Product-ID. Both are 16 bit integers. The most simple form of +driver matching is based on these IDs. The driver announces the Vendor- and +Product-IDs of the devices it can handle and the operating system loads the +appropriate driver when the device is connected. + +It is obvious that this technique only works if the pair Vendor- plus +Product-ID is unique: Only devices which require the same driver can have the +same pair of IDs. + + +===================================================== +HOW DOES THE USB STANDARD ENSURE THAT IDs ARE UNIQUE? +===================================================== + +Since it is so important that USB IDs are unique, the USB Implementers Forum, +Inc. (usb.org) needs a way to enforce this legally. It is not forbidden by +law to build a device and assign it any random numbers as IDs. Usb.org +therefore needs an agreement to regulate the use of USB IDs. The agreement +binds only parties who agreed to it, of course. Everybody else is free to use +any numbers for their IDs. + +So how can usb.org ensure that every manufacturer of USB devices enters into +an agreement with them? They do it via trademark licensing. Usb.org has +registered the trademark "USB", all associated logos and related terms. If +you want to put an USB logo on your product or claim that it is USB +compliant, you must license these trademarks from usb.org. And this is where +you enter into an agreement. See the "USB-IF Trademark License Agreement and +Usage Guidelines for the USB-IF Logo" at +http://www.usb.org/developers/logo_license/. + +Licensing the USB trademarks requires that you buy a USB Vendor-ID from +usb.org (one-time fee of ca. 2,000 USD), that you become a member of usb.org +(yearly fee of ca. 4,000 USD) and that you meet all the technical +specifications from the USB spec. + +This means that most hobbyists and small companies will never be able to +become USB compliant, just because membership is so expensive. And you can't +be compliant with a driver based on V-USB anyway, because the AVR's port pins +don't meet the electrical specifications for USB. So, in principle, all +hobbyists and small companies are free to choose any random numbers for their +IDs. They have nothing to lose... + +There is one exception worth noting, though: If you use a sub-component which +implements USB, the vendor of the sub-components may guarantee USB +compliance. This might apply to some or all of FTDI's solutions. + + +======================================================================= +WHY SHOULD YOU OBTAIN USB IDs EVEN IF YOU DON'T LICENSE USB TRADEMARKS? +======================================================================= + +You have learned in the previous section that you are free to choose any +numbers for your IDs anyway. So why not do exactly this? There is still the +technical issue. If you choose IDs which are already in use by somebody else, +operating systems will load the wrong drivers and your device won't work. +Even if you choose IDs which are not currently in use, they may be in use in +the next version of the operating system or even after an automatic update. + +So what you need is a pair of Vendor- and Product-IDs for which you have the +guarantee that no USB compliant product uses them. This implies that no +operating system will ever ship with drivers responsible for these IDs. + + +============================================== +HOW DOES OBJECTIVE DEVELOPMENT HANDLE USB IDs? +============================================== + +Objective Development gives away pairs of USB-IDs with their V-USB licenses. +In order to ensure that these IDs are unique, Objective Development has an +agreement with the company/person who has bought the USB Vendor-ID from +usb.org. This agreement ensures that a range of USB Product-IDs is reserved +for assignment by Objective Development and that the owner of the Vendor-ID +won't give it to anybody else. + +This means that you have to trust three parties to ensure uniqueness of +your IDs: + + - Objective Development, that they don't give the same PID to more than + one person. + - The owner of the Vendor-ID that they don't assign PIDs from the range + assigned to Objective Development to anybody else. + - Usb.org that they don't assign the same Vendor-ID a second time. + + +================================== +WHO IS THE OWNER OF THE VENDOR-ID? +================================== + +Objective Development has obtained ranges of USB Product-IDs under two +Vendor-IDs: Under Vendor-ID 5824 from Wouter van Ooijen (Van Ooijen +Technische Informatica, www.voti.nl) and under Vendor-ID 8352 from Jason +Kotzin (Clay Logic, www.claylogic.com). Both VID owners have received their +Vendor-ID directly from usb.org. + + +========================================================================= +CAN I USE USB-IDs FROM OBJECTIVE DEVELOPMENT WITH OTHER DRIVERS/HARDWARE? +========================================================================= + +The short answer is: Yes. All you get is a guarantee that the IDs are never +assigned to anybody else. What more do you need? + + +============================ +WHAT ABOUT SHARED ID PAIRS? +============================ + +Objective Development has reserved some PID/VID pairs for shared use. You +have no guarantee of uniqueness for them, except that no USB compliant device +uses them. In order to avoid technical problems, we must ensure that all +devices with the same pair of IDs use the same driver on kernel level. For +details, see the file USB-IDs-for-free.txt. + + +====================================================== +I HAVE HEARD THAT SUB-LICENSING OF USB-IDs IS ILLEGAL? +====================================================== + +A 16 bit integer number cannot be protected by copyright laws. It is not +sufficiently complex. And since none of the parties involved entered into the +USB-IF Trademark License Agreement, we are not bound by this agreement. So +there is no reason why it should be illegal to sub-license USB-IDs. + + +============================================= +WHO IS LIABLE IF THERE ARE INCOMPATIBILITIES? +============================================= + +Objective Development disclaims all liabilities which might arise from the +assignment of IDs. If you guarantee product features to your customers +without proper disclaimer, YOU are liable for that. diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/USB-IDs-for-free.txt b/adb2usb/uart2usb/vusb-20100715/usbdrv/USB-IDs-for-free.txt new file mode 100644 index 0000000..2f4d59a --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/USB-IDs-for-free.txt @@ -0,0 +1,148 @@ +Version 2009-08-22 + +=========================== +FREE USB-IDs FOR SHARED USE +=========================== + +Objective Development has reserved a set of USB Product-IDs for use according +to the guidelines outlined below. For more information about the concept of +USB IDs please see the file USB-ID-FAQ.txt. Objective Development guarantees +that the IDs listed below are not used by any USB compliant devices. + + +==================== +MECHANISM OF SHARING +==================== + +From a technical point of view, two different devices can share the same USB +Vendor- and Product-ID if they require the same driver on operating system +level. We make use of this fact by assigning separate IDs for various device +classes. On application layer, devices must be distinguished by their textual +name or serial number. We offer separate sets of IDs for discrimination by +textual name and for serial number. + +Examples for shared use of USB IDs are included with V-USB in the "examples" +subdirectory. + + +====================================== +IDs FOR DISCRIMINATION BY TEXTUAL NAME +====================================== + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the manufacturer +and product identification. The manufacturer identification MUST be available +at least in USB language 0x0409 (English/US). + +(2) The textual manufacturer identification MUST contain either an Internet +domain name (e.g. "mycompany.com") registered and owned by you, or an e-mail +address under your control (e.g. "myname@gmx.net"). You can embed the domain +name or e-mail address in any string you like, e.g. "Objective Development +http://www.obdev.at/vusb/". + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(4) You may choose any string for the textual product identification, as long +as this string is unique within the scope of your textual manufacturer +identification. + +(5) Application side device look-up MUST be based on the textual manufacturer +and product identification in addition to VID/PID matching. The driver +matching MUST be a comparison of the entire strings, NOT a sub-string match. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by textual name: + +PID dec (hex) | VID dec (hex) | Description of use +==============+===============+============================================ +1500 (0x05dc) | 5824 (0x16c0) | For Vendor Class devices with libusb +--------------+---------------+-------------------------------------------- +1503 (0x05df) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +--------------+---------------+-------------------------------------------- +1505 (0x05e1) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +--------------+---------------+-------------------------------------------- +1508 (0x05e4) | 5824 (0x16c0) | For MIDI class devices +--------------+---------------+-------------------------------------------- + +Note that Windows caches the textual product- and vendor-description for +mice, keyboards and joysticks. Name-bsed discrimination is therefore not +recommended for these device classes. + + +======================================= +IDs FOR DISCRIMINATION BY SERIAL NUMBER +======================================= + +If you use one of the IDs listed below, your device and host-side software +must conform to these rules: + +(1) The USB device MUST provide a textual representation of the serial +number. The serial number string MUST be available at least in USB language +0x0409 (English/US). + +(2) The serial number MUST start with either an Internet domain name (e.g. +"mycompany.com") registered and owned by you, or an e-mail address under your +control (e.g. "myname@gmx.net"), both terminated with a colon (":") character. +You MAY append any string you like for further discrimination of your devices. + +(3) You are responsible for retaining ownership of the domain or e-mail +address for as long as any of your products are in use. + +(5) Application side device look-up MUST be based on the serial number string +in addition to VID/PID matching. The matching must start at the first +character of the serial number string and include the colon character +terminating your domain or e-mail address. It MAY stop anywhere after that. + +(6) For devices which implement a particular USB device class (e.g. HID), the +operating system's default class driver MUST be used. If an operating system +driver for Vendor Class devices is needed, this driver must be libusb or +libusb-win32 (see http://libusb.org/ and +http://libusb-win32.sourceforge.net/). + +Table if IDs for discrimination by serial number string: + +PID dec (hex) | VID dec (hex) | Description of use +===============+===============+=========================================== +10200 (0x27d8) | 5824 (0x16c0) | For Vendor Class devices with libusb +---------------+---------------+------------------------------------------- +10201 (0x27d9) | 5824 (0x16c0) | For generic HID class devices (which are + | | NOT mice, keyboards or joysticks) +---------------+---------------+------------------------------------------- +10202 (0x27da) | 5824 (0x16c0) | For USB Mice +---------------+---------------+------------------------------------------- +10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards +---------------+---------------+------------------------------------------- +10204 (0x27db) | 5824 (0x16c0) | For USB Joysticks +---------------+---------------+------------------------------------------- +10205 (0x27dc) | 5824 (0x16c0) | For CDC-ACM class devices (modems) +---------------+---------------+------------------------------------------- +10206 (0x27dd) | 5824 (0x16c0) | For MIDI class devices +---------------+---------------+------------------------------------------- + + +================= +ORIGIN OF USB-IDs +================= + +OBJECTIVE DEVELOPMENT Software GmbH has obtained all VID/PID pairs listed +here from Wouter van Ooijen (see www.voti.nl) for exclusive disposition. +Wouter van Ooijen has obtained the VID from the USB Implementers Forum, Inc. +(see www.usb.org). The VID is registered for the company name "Van Ooijen +Technische Informatica". + + +========== +DISCLAIMER +========== + +OBJECTIVE DEVELOPMENT Software GmbH disclaims all liability for any +problems which are caused by the shared use of these VID/PID pairs. diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/asmcommon.inc b/adb2usb/uart2usb/vusb-20100715/usbdrv/asmcommon.inc new file mode 100644 index 0000000..07d692b --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/asmcommon.inc @@ -0,0 +1,188 @@ +/* Name: asmcommon.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2007-11-05 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id$ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file contains assembler code which is shared among the USB driver +implementations for different CPU cocks. Since the code must be inserted +in the middle of the module, it's split out into this file and #included. + +Jump destinations called from outside: + sofError: Called when no start sequence was found. + se0: Called when a package has been successfully received. + overflow: Called when receive buffer overflows. + doReturn: Called after sending data. + +Outside jump destinations used by this module: + waitForJ: Called to receive an already arriving packet. + sendAckAndReti: + sendNakAndReti: + sendCntAndReti: + usbSendAndReti: + +The following macros must be defined before this file is included: + .macro POP_STANDARD + .endm + .macro POP_RETI + .endm +*/ + +#define token x1 + +overflow: + ldi x2, 1< 0 + +#warning "Never compile production devices with debugging enabled" + +static void uartPutc(char c) +{ + while(!(ODDBG_USR & (1 << ODDBG_UDRE))); /* wait for data register empty */ + ODDBG_UDR = c; +} + +static uchar hexAscii(uchar h) +{ + h &= 0xf; + if(h >= 10) + h += 'a' - (uchar)10 - '0'; + h += '0'; + return h; +} + +static void printHex(uchar c) +{ + uartPutc(hexAscii(c >> 4)); + uartPutc(hexAscii(c)); +} + +void odDebug(uchar prefix, uchar *data, uchar len) +{ + printHex(prefix); + uartPutc(':'); + while(len--){ + uartPutc(' '); + printHex(*data++); + } + uartPutc('\r'); + uartPutc('\n'); +} + +#endif diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/oddebug.h b/adb2usb/uart2usb/vusb-20100715/usbdrv/oddebug.h new file mode 100644 index 0000000..d61309d --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/oddebug.h @@ -0,0 +1,123 @@ +/* Name: oddebug.h + * Project: AVR library + * Author: Christian Starkjohann + * Creation Date: 2005-01-16 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: oddebug.h 692 2008-11-07 15:07:40Z cs $ + */ + +#ifndef __oddebug_h_included__ +#define __oddebug_h_included__ + +/* +General Description: +This module implements a function for debug logs on the serial line of the +AVR microcontroller. Debugging can be configured with the define +'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging +calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is +2, DBG1 and DBG2 logs will be printed. + +A debug log consists of a label ('prefix') to indicate which debug log created +the output and a memory block to dump in hex ('data' and 'len'). +*/ + + +#ifndef F_CPU +# define F_CPU 12000000 /* 12 MHz */ +#endif + +/* make sure we have the UART defines: */ +#include "usbportability.h" + +#ifndef uchar +# define uchar unsigned char +#endif + +#if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */ +# warning "Debugging disabled because device has no UART" +# undef DEBUG_LEVEL +#endif + +#ifndef DEBUG_LEVEL +# define DEBUG_LEVEL 0 +#endif + +/* ------------------------------------------------------------------------- */ + +#if DEBUG_LEVEL > 0 +# define DBG1(prefix, data, len) odDebug(prefix, data, len) +#else +# define DBG1(prefix, data, len) +#endif + +#if DEBUG_LEVEL > 1 +# define DBG2(prefix, data, len) odDebug(prefix, data, len) +#else +# define DBG2(prefix, data, len) +#endif + +/* ------------------------------------------------------------------------- */ + +#if DEBUG_LEVEL > 0 +extern void odDebug(uchar prefix, uchar *data, uchar len); + +/* Try to find our control registers; ATMEL likes to rename these */ + +#if defined UBRR +# define ODDBG_UBRR UBRR +#elif defined UBRRL +# define ODDBG_UBRR UBRRL +#elif defined UBRR0 +# define ODDBG_UBRR UBRR0 +#elif defined UBRR0L +# define ODDBG_UBRR UBRR0L +#endif + +#if defined UCR +# define ODDBG_UCR UCR +#elif defined UCSRB +# define ODDBG_UCR UCSRB +#elif defined UCSR0B +# define ODDBG_UCR UCSR0B +#endif + +#if defined TXEN +# define ODDBG_TXEN TXEN +#else +# define ODDBG_TXEN TXEN0 +#endif + +#if defined USR +# define ODDBG_USR USR +#elif defined UCSRA +# define ODDBG_USR UCSRA +#elif defined UCSR0A +# define ODDBG_USR UCSR0A +#endif + +#if defined UDRE +# define ODDBG_UDRE UDRE +#else +# define ODDBG_UDRE UDRE0 +#endif + +#if defined UDR +# define ODDBG_UDR UDR +#elif defined UDR0 +# define ODDBG_UDR UDR0 +#endif + +static inline void odDebugInit(void) +{ + ODDBG_UCR |= (1<len & 0x10){ /* packet buffer was empty */ + txStatus->buffer[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* toggle token */ + }else{ + txStatus->len = USBPID_NAK; /* avoid sending outdated (overwritten) interrupt data */ + } + p = txStatus->buffer + 1; + i = len; + do{ /* if len == 0, we still copy 1 byte, but that's no problem */ + *p++ = *data++; + }while(--i > 0); /* loop control at the end is 2 bytes shorter than at beginning */ + usbCrc16Append(&txStatus->buffer[1], len); + txStatus->len = len + 4; /* len must be given including sync byte */ + DBG2(0x21 + (((int)txStatus >> 3) & 3), txStatus->buffer, len + 3); +} + +USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len) +{ + usbGenericSetInterrupt(data, len, &usbTxStatus1); +} +#endif + +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 +USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len) +{ + usbGenericSetInterrupt(data, len, &usbTxStatus3); +} +#endif +#endif /* USB_CFG_SUPPRESS_INTR_CODE */ + +/* ------------------ utilities for code following below ------------------- */ + +/* Use defines for the switch statement so that we can choose between an + * if()else if() and a switch/case based implementation. switch() is more + * efficient for a LARGE set of sequential choices, if() is better in all other + * cases. + */ +#if USB_CFG_USE_SWITCH_STATEMENT +# define SWITCH_START(cmd) switch(cmd){{ +# define SWITCH_CASE(value) }break; case (value):{ +# define SWITCH_CASE2(v1,v2) }break; case (v1): case(v2):{ +# define SWITCH_CASE3(v1,v2,v3) }break; case (v1): case(v2): case(v3):{ +# define SWITCH_DEFAULT }break; default:{ +# define SWITCH_END }} +#else +# define SWITCH_START(cmd) {uchar _cmd = cmd; if(0){ +# define SWITCH_CASE(value) }else if(_cmd == (value)){ +# define SWITCH_CASE2(v1,v2) }else if(_cmd == (v1) || _cmd == (v2)){ +# define SWITCH_CASE3(v1,v2,v3) }else if(_cmd == (v1) || _cmd == (v2) || (_cmd == v3)){ +# define SWITCH_DEFAULT }else{ +# define SWITCH_END }} +#endif + +#ifndef USB_RX_USER_HOOK +#define USB_RX_USER_HOOK(data, len) +#endif +#ifndef USB_SET_ADDRESS_HOOK +#define USB_SET_ADDRESS_HOOK() +#endif + +/* ------------------------------------------------------------------------- */ + +/* We use if() instead of #if in the macro below because #if can't be used + * in macros and the compiler optimizes constant conditions anyway. + * This may cause problems with undefined symbols if compiled without + * optimizing! + */ +#define GET_DESCRIPTOR(cfgProp, staticName) \ + if(cfgProp){ \ + if((cfgProp) & USB_PROP_IS_RAM) \ + flags = 0; \ + if((cfgProp) & USB_PROP_IS_DYNAMIC){ \ + len = usbFunctionDescriptor(rq); \ + }else{ \ + len = USB_PROP_LENGTH(cfgProp); \ + usbMsgPtr = (uchar *)(staticName); \ + } \ + } + +/* usbDriverDescriptor() is similar to usbFunctionDescriptor(), but used + * internally for all types of descriptors. + */ +static inline usbMsgLen_t usbDriverDescriptor(usbRequest_t *rq) +{ +usbMsgLen_t len = 0; +uchar flags = USB_FLG_MSGPTR_IS_ROM; + + SWITCH_START(rq->wValue.bytes[1]) + SWITCH_CASE(USBDESCR_DEVICE) /* 1 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_DEVICE, usbDescriptorDevice) + SWITCH_CASE(USBDESCR_CONFIG) /* 2 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_CONFIGURATION, usbDescriptorConfiguration) + SWITCH_CASE(USBDESCR_STRING) /* 3 */ +#if USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC + if(USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_RAM) + flags = 0; + len = usbFunctionDescriptor(rq); +#else /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */ + SWITCH_START(rq->wValue.bytes[0]) + SWITCH_CASE(0) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_0, usbDescriptorString0) + SWITCH_CASE(1) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_VENDOR, usbDescriptorStringVendor) + SWITCH_CASE(2) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_PRODUCT, usbDescriptorStringDevice) + SWITCH_CASE(3) + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER, usbDescriptorStringSerialNumber) + SWITCH_DEFAULT + if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){ + len = usbFunctionDescriptor(rq); + } + SWITCH_END +#endif /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */ +#if USB_CFG_DESCR_PROPS_HID_REPORT /* only support HID descriptors if enabled */ + SWITCH_CASE(USBDESCR_HID) /* 0x21 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID, usbDescriptorConfiguration + 18) + SWITCH_CASE(USBDESCR_HID_REPORT)/* 0x22 */ + GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID_REPORT, usbDescriptorHidReport) +#endif + SWITCH_DEFAULT + if(USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC){ + len = usbFunctionDescriptor(rq); + } + SWITCH_END + usbMsgFlags = flags; + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbDriverSetup() is similar to usbFunctionSetup(), but it's used for + * standard requests instead of class and custom requests. + */ +static inline usbMsgLen_t usbDriverSetup(usbRequest_t *rq) +{ +uchar len = 0, *dataPtr = usbTxBuf + 9; /* there are 2 bytes free space at the end of the buffer */ +uchar value = rq->wValue.bytes[0]; +#if USB_CFG_IMPLEMENT_HALT +uchar index = rq->wIndex.bytes[0]; +#endif + + dataPtr[0] = 0; /* default reply common to USBRQ_GET_STATUS and USBRQ_GET_INTERFACE */ + SWITCH_START(rq->bRequest) + SWITCH_CASE(USBRQ_GET_STATUS) /* 0 */ + uchar recipient = rq->bmRequestType & USBRQ_RCPT_MASK; /* assign arith ops to variables to enforce byte size */ + if(USB_CFG_IS_SELF_POWERED && recipient == USBRQ_RCPT_DEVICE) + dataPtr[0] = USB_CFG_IS_SELF_POWERED; +#if USB_CFG_IMPLEMENT_HALT + if(recipient == USBRQ_RCPT_ENDPOINT && index == 0x81) /* request status for endpoint 1 */ + dataPtr[0] = usbTxLen1 == USBPID_STALL; +#endif + dataPtr[1] = 0; + len = 2; +#if USB_CFG_IMPLEMENT_HALT + SWITCH_CASE2(USBRQ_CLEAR_FEATURE, USBRQ_SET_FEATURE) /* 1, 3 */ + if(value == 0 && index == 0x81){ /* feature 0 == HALT for endpoint == 1 */ + usbTxLen1 = rq->bRequest == USBRQ_CLEAR_FEATURE ? USBPID_NAK : USBPID_STALL; + usbResetDataToggling(); + } +#endif + SWITCH_CASE(USBRQ_SET_ADDRESS) /* 5 */ + usbNewDeviceAddr = value; + USB_SET_ADDRESS_HOOK(); + SWITCH_CASE(USBRQ_GET_DESCRIPTOR) /* 6 */ + len = usbDriverDescriptor(rq); + goto skipMsgPtrAssignment; + SWITCH_CASE(USBRQ_GET_CONFIGURATION) /* 8 */ + dataPtr = &usbConfiguration; /* send current configuration value */ + len = 1; + SWITCH_CASE(USBRQ_SET_CONFIGURATION) /* 9 */ + usbConfiguration = value; + usbResetStall(); + SWITCH_CASE(USBRQ_GET_INTERFACE) /* 10 */ + len = 1; +#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE + SWITCH_CASE(USBRQ_SET_INTERFACE) /* 11 */ + usbResetDataToggling(); + usbResetStall(); +#endif + SWITCH_DEFAULT /* 7=SET_DESCRIPTOR, 12=SYNC_FRAME */ + /* Should we add an optional hook here? */ + SWITCH_END + usbMsgPtr = dataPtr; +skipMsgPtrAssignment: + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbProcessRx() is called for every message received by the interrupt + * routine. It distinguishes between SETUP and DATA packets and processes + * them accordingly. + */ +static inline void usbProcessRx(uchar *data, uchar len) +{ +usbRequest_t *rq = (void *)data; + +/* usbRxToken can be: + * 0x2d 00101101 (USBPID_SETUP for setup data) + * 0xe1 11100001 (USBPID_OUT: data phase of setup transfer) + * 0...0x0f for OUT on endpoint X + */ + DBG2(0x10 + (usbRxToken & 0xf), data, len + 2); /* SETUP=1d, SETUP-DATA=11, OUTx=1x */ + USB_RX_USER_HOOK(data, len) +#if USB_CFG_IMPLEMENT_FN_WRITEOUT + if(usbRxToken < 0x10){ /* OUT to endpoint != 0: endpoint number in usbRxToken */ + usbFunctionWriteOut(data, len); + return; + } +#endif + if(usbRxToken == (uchar)USBPID_SETUP){ + if(len != 8) /* Setup size must be always 8 bytes. Ignore otherwise. */ + return; + usbMsgLen_t replyLen; + usbTxBuf[0] = USBPID_DATA0; /* initialize data toggling */ + usbTxLen = USBPID_NAK; /* abort pending transmit */ + usbMsgFlags = 0; + uchar type = rq->bmRequestType & USBRQ_TYPE_MASK; + if(type != USBRQ_TYPE_STANDARD){ /* standard requests are handled by driver */ + replyLen = usbFunctionSetup(data); + }else{ + replyLen = usbDriverSetup(rq); + } +#if USB_CFG_IMPLEMENT_FN_READ || USB_CFG_IMPLEMENT_FN_WRITE + if(replyLen == USB_NO_MSG){ /* use user-supplied read/write function */ + /* do some conditioning on replyLen, but on IN transfers only */ + if((rq->bmRequestType & USBRQ_DIR_MASK) != USBRQ_DIR_HOST_TO_DEVICE){ + if(sizeof(replyLen) < sizeof(rq->wLength.word)){ /* help compiler with optimizing */ + replyLen = rq->wLength.bytes[0]; + }else{ + replyLen = rq->wLength.word; + } + } + usbMsgFlags = USB_FLG_USE_USER_RW; + }else /* The 'else' prevents that we limit a replyLen of USB_NO_MSG to the maximum transfer len. */ +#endif + if(sizeof(replyLen) < sizeof(rq->wLength.word)){ /* help compiler with optimizing */ + if(!rq->wLength.bytes[1] && replyLen > rq->wLength.bytes[0]) /* limit length to max */ + replyLen = rq->wLength.bytes[0]; + }else{ + if(replyLen > rq->wLength.word) /* limit length to max */ + replyLen = rq->wLength.word; + } + usbMsgLen = replyLen; + }else{ /* usbRxToken must be USBPID_OUT, which means data phase of setup (control-out) */ +#if USB_CFG_IMPLEMENT_FN_WRITE + if(usbMsgFlags & USB_FLG_USE_USER_RW){ + uchar rval = usbFunctionWrite(data, len); + if(rval == 0xff){ /* an error occurred */ + usbTxLen = USBPID_STALL; + }else if(rval != 0){ /* This was the final package */ + usbMsgLen = 0; /* answer with a zero-sized data packet */ + } + } +#endif + } +} + +/* ------------------------------------------------------------------------- */ + +/* This function is similar to usbFunctionRead(), but it's also called for + * data handled automatically by the driver (e.g. descriptor reads). + */ +static uchar usbDeviceRead(uchar *data, uchar len) +{ + if(len > 0){ /* don't bother app with 0 sized reads */ +#if USB_CFG_IMPLEMENT_FN_READ + if(usbMsgFlags & USB_FLG_USE_USER_RW){ + len = usbFunctionRead(data, len); + }else +#endif + { + uchar i = len, *r = usbMsgPtr; + if(usbMsgFlags & USB_FLG_MSGPTR_IS_ROM){ /* ROM data */ + do{ + uchar c = USB_READ_FLASH(r); /* assign to char size variable to enforce byte ops */ + *data++ = c; + r++; + }while(--i); + }else{ /* RAM data */ + do{ + *data++ = *r++; + }while(--i); + } + usbMsgPtr = r; + } + } + return len; +} + +/* ------------------------------------------------------------------------- */ + +/* usbBuildTxBlock() is called when we have data to transmit and the + * interrupt routine's transmit buffer is empty. + */ +static inline void usbBuildTxBlock(void) +{ +usbMsgLen_t wantLen; +uchar len; + + wantLen = usbMsgLen; + if(wantLen > 8) + wantLen = 8; + usbMsgLen -= wantLen; + usbTxBuf[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* DATA toggling */ + len = usbDeviceRead(usbTxBuf + 1, wantLen); + if(len <= 8){ /* valid data packet */ + usbCrc16Append(&usbTxBuf[1], len); + len += 4; /* length including sync byte */ + if(len < 12) /* a partial package identifies end of message */ + usbMsgLen = USB_NO_MSG; + }else{ + len = USBPID_STALL; /* stall the endpoint */ + usbMsgLen = USB_NO_MSG; + } + usbTxLen = len; + DBG2(0x20, usbTxBuf, len-1); +} + +/* ------------------------------------------------------------------------- */ + +static inline void usbHandleResetHook(uchar notResetState) +{ +#ifdef USB_RESET_HOOK +static uchar wasReset; +uchar isReset = !notResetState; + + if(wasReset != isReset){ + USB_RESET_HOOK(isReset); + wasReset = isReset; + } +#endif +} + +/* ------------------------------------------------------------------------- */ + +USB_PUBLIC void usbPoll(void) +{ +schar len; +uchar i; + + len = usbRxLen - 3; + if(len >= 0){ +/* We could check CRC16 here -- but ACK has already been sent anyway. If you + * need data integrity checks with this driver, check the CRC in your app + * code and report errors back to the host. Since the ACK was already sent, + * retries must be handled on application level. + * unsigned crc = usbCrc16(buffer + 1, usbRxLen - 3); + */ + usbProcessRx(usbRxBuf + USB_BUFSIZE + 1 - usbInputBufOffset, len); +#if USB_CFG_HAVE_FLOWCONTROL + if(usbRxLen > 0) /* only mark as available if not inactivated */ + usbRxLen = 0; +#else + usbRxLen = 0; /* mark rx buffer as available */ +#endif + } + if(usbTxLen & 0x10){ /* transmit system idle */ + if(usbMsgLen != USB_NO_MSG){ /* transmit data pending? */ + usbBuildTxBlock(); + } + } + for(i = 20; i > 0; i--){ + uchar usbLineStatus = USBIN & USBMASK; + if(usbLineStatus != 0) /* SE0 has ended */ + goto isNotReset; + } + /* RESET condition, called multiple times during reset */ + usbNewDeviceAddr = 0; + usbDeviceAddr = 0; + usbResetStall(); + DBG1(0xff, 0, 0); +isNotReset: + usbHandleResetHook(i); +} + +/* ------------------------------------------------------------------------- */ + +USB_PUBLIC void usbInit(void) +{ +#if USB_INTR_CFG_SET != 0 + USB_INTR_CFG |= USB_INTR_CFG_SET; +#endif +#if USB_INTR_CFG_CLR != 0 + USB_INTR_CFG &= ~(USB_INTR_CFG_CLR); +#endif + USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT); + usbResetDataToggling(); +#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE + usbTxLen1 = USBPID_NAK; +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 + usbTxLen3 = USBPID_NAK; +#endif +#endif +} + +/* ------------------------------------------------------------------------- */ diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrv.h b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrv.h new file mode 100644 index 0000000..3a78f30 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrv.h @@ -0,0 +1,735 @@ +/* Name: usbdrv.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2004-12-29 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbdrv.h 793 2010-07-15 15:58:11Z cs $ + */ + +#ifndef __usbdrv_h_included__ +#define __usbdrv_h_included__ +#include "usbconfig.h" +#include "usbportability.h" + +/* +Hardware Prerequisites: +======================= +USB lines D+ and D- MUST be wired to the same I/O port. We recommend that D+ +triggers the interrupt (best achieved by using INT0 for D+), but it is also +possible to trigger the interrupt from D-. If D- is used, interrupts are also +triggered by SOF packets. D- requires a pull-up of 1.5k to +3.5V (and the +device must be powered at 3.5V) to identify as low-speed USB device. A +pull-down or pull-up of 1M SHOULD be connected from D+ to +3.5V to prevent +interference when no USB master is connected. If you use Zener diodes to limit +the voltage on D+ and D-, you MUST use a pull-down resistor, not a pull-up. +We use D+ as interrupt source and not D- because it does not trigger on +keep-alive and RESET states. If you want to count keep-alive events with +USB_COUNT_SOF, you MUST use D- as an interrupt source. + +As a compile time option, the 1.5k pull-up resistor on D- can be made +switchable to allow the device to disconnect at will. See the definition of +usbDeviceConnect() and usbDeviceDisconnect() further down in this file. + +Please adapt the values in usbconfig.h according to your hardware! + +The device MUST be clocked at exactly 12 MHz, 15 MHz, 16 MHz or 20 MHz +or at 12.8 MHz resp. 16.5 MHz +/- 1%. See usbconfig-prototype.h for details. + + +Limitations: +============ +Robustness with respect to communication errors: +The driver assumes error-free communication. It DOES check for errors in +the PID, but does NOT check bit stuffing errors, SE0 in middle of a byte, +token CRC (5 bit) and data CRC (16 bit). CRC checks can not be performed due +to timing constraints: We must start sending a reply within 7 bit times. +Bit stuffing and misplaced SE0 would have to be checked in real-time, but CPU +performance does not permit that. The driver does not check Data0/Data1 +toggling, but application software can implement the check. + +Input characteristics: +Since no differential receiver circuit is used, electrical interference +robustness may suffer. The driver samples only one of the data lines with +an ordinary I/O pin's input characteristics. However, since this is only a +low speed USB implementation and the specification allows for 8 times the +bit rate over the same hardware, we should be on the safe side. Even the spec +requires detection of asymmetric states at high bit rate for SE0 detection. + +Number of endpoints: +The driver supports the following endpoints: + +- Endpoint 0, the default control endpoint. +- Any number of interrupt- or bulk-out endpoints. The data is sent to + usbFunctionWriteOut() and USB_CFG_IMPLEMENT_FN_WRITEOUT must be defined + to 1 to activate this feature. The endpoint number can be found in the + global variable 'usbRxToken'. +- One default interrupt- or bulk-in endpoint. This endpoint is used for + interrupt- or bulk-in transfers which are not handled by any other endpoint. + You must define USB_CFG_HAVE_INTRIN_ENDPOINT in order to activate this + feature and call usbSetInterrupt() to send interrupt/bulk data. +- One additional interrupt- or bulk-in endpoint. This was endpoint 3 in + previous versions of this driver but can now be configured to any endpoint + number. You must define USB_CFG_HAVE_INTRIN_ENDPOINT3 in order to activate + this feature and call usbSetInterrupt3() to send interrupt/bulk data. The + endpoint number can be set with USB_CFG_EP3_NUMBER. + +Please note that the USB standard forbids bulk endpoints for low speed devices! +Most operating systems allow them anyway, but the AVR will spend 90% of the CPU +time in the USB interrupt polling for bulk data. + +Maximum data payload: +Data payload of control in and out transfers may be up to 254 bytes. In order +to accept payload data of out transfers, you need to implement +'usbFunctionWrite()'. + +USB Suspend Mode supply current: +The USB standard limits power consumption to 500uA when the bus is in suspend +mode. This is not a problem for self-powered devices since they don't need +bus power anyway. Bus-powered devices can achieve this only by putting the +CPU in sleep mode. The driver does not implement suspend handling by itself. +However, the application may implement activity monitoring and wakeup from +sleep. The host sends regular SE0 states on the bus to keep it active. These +SE0 states can be detected by using D- as the interrupt source. Define +USB_COUNT_SOF to 1 and use the global variable usbSofCount to check for bus +activity. + +Operation without an USB master: +The driver behaves neutral without connection to an USB master if D- reads +as 1. To avoid spurious interrupts, we recommend a high impedance (e.g. 1M) +pull-down or pull-up resistor on D+ (interrupt). If Zener diodes are used, +use a pull-down. If D- becomes statically 0, the driver may block in the +interrupt routine. + +Interrupt latency: +The application must ensure that the USB interrupt is not disabled for more +than 25 cycles (this is for 12 MHz, faster clocks allow longer latency). +This implies that all interrupt routines must either have the "ISR_NOBLOCK" +attribute set (see "avr/interrupt.h") or be written in assembler with "sei" +as the first instruction. + +Maximum interrupt duration / CPU cycle consumption: +The driver handles all USB communication during the interrupt service +routine. The routine will not return before an entire USB message is received +and the reply is sent. This may be up to ca. 1200 cycles @ 12 MHz (= 100us) if +the host conforms to the standard. The driver will consume CPU cycles for all +USB messages, even if they address another (low-speed) device on the same bus. + +*/ + +/* ------------------------------------------------------------------------- */ +/* --------------------------- Module Interface ---------------------------- */ +/* ------------------------------------------------------------------------- */ + +#define USBDRV_VERSION 20100715 +/* This define uniquely identifies a driver version. It is a decimal number + * constructed from the driver's release date in the form YYYYMMDD. If the + * driver's behavior or interface changes, you can use this constant to + * distinguish versions. If it is not defined, the driver's release date is + * older than 2006-01-25. + */ + + +#ifndef USB_PUBLIC +#define USB_PUBLIC +#endif +/* USB_PUBLIC is used as declaration attribute for all functions exported by + * the USB driver. The default is no attribute (see above). You may define it + * to static either in usbconfig.h or from the command line if you include + * usbdrv.c instead of linking against it. Including the C module of the driver + * directly in your code saves a couple of bytes in flash memory. + */ + +#ifndef __ASSEMBLER__ +#ifndef uchar +#define uchar unsigned char +#endif +#ifndef schar +#define schar signed char +#endif +/* shortcuts for well defined 8 bit integer types */ + +#if USB_CFG_LONG_TRANSFERS /* if more than 254 bytes transfer size required */ +# define usbMsgLen_t unsigned +#else +# define usbMsgLen_t uchar +#endif +/* usbMsgLen_t is the data type used for transfer lengths. By default, it is + * defined to uchar, allowing a maximum of 254 bytes (255 is reserved for + * USB_NO_MSG below). If the usbconfig.h defines USB_CFG_LONG_TRANSFERS to 1, + * a 16 bit data type is used, allowing up to 16384 bytes (the rest is used + * for flags in the descriptor configuration). + */ +#define USB_NO_MSG ((usbMsgLen_t)-1) /* constant meaning "no message" */ + +struct usbRequest; /* forward declaration */ + +USB_PUBLIC void usbInit(void); +/* This function must be called before interrupts are enabled and the main + * loop is entered. We exepct that the PORT and DDR bits for D+ and D- have + * not been changed from their default status (which is 0). If you have changed + * them, set both back to 0 (configure them as input with no internal pull-up). + */ +USB_PUBLIC void usbPoll(void); +/* This function must be called at regular intervals from the main loop. + * Maximum delay between calls is somewhat less than 50ms (USB timeout for + * accepting a Setup message). Otherwise the device will not be recognized. + * Please note that debug outputs through the UART take ~ 0.5ms per byte + * at 19200 bps. + */ +extern uchar *usbMsgPtr; +/* This variable may be used to pass transmit data to the driver from the + * implementation of usbFunctionWrite(). It is also used internally by the + * driver for standard control requests. + */ +USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]); +/* This function is called when the driver receives a SETUP transaction from + * the host which is not answered by the driver itself (in practice: class and + * vendor requests). All control transfers start with a SETUP transaction where + * the host communicates the parameters of the following (optional) data + * transfer. The SETUP data is available in the 'data' parameter which can + * (and should) be casted to 'usbRequest_t *' for a more user-friendly access + * to parameters. + * + * If the SETUP indicates a control-in transfer, you should provide the + * requested data to the driver. There are two ways to transfer this data: + * (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data + * block and return the length of the data in 'usbFunctionSetup()'. The driver + * will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The + * driver will then call 'usbFunctionRead()' when data is needed. See the + * documentation for usbFunctionRead() for details. + * + * If the SETUP indicates a control-out transfer, the only way to receive the + * data from the host is through the 'usbFunctionWrite()' call. If you + * implement this function, you must return USB_NO_MSG in 'usbFunctionSetup()' + * to indicate that 'usbFunctionWrite()' should be used. See the documentation + * of this function for more information. If you just want to ignore the data + * sent by the host, return 0 in 'usbFunctionSetup()'. + * + * Note that calls to the functions usbFunctionRead() and usbFunctionWrite() + * are only done if enabled by the configuration in usbconfig.h. + */ +USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq); +/* You need to implement this function ONLY if you provide USB descriptors at + * runtime (which is an expert feature). It is very similar to + * usbFunctionSetup() above, but it is called only to request USB descriptor + * data. See the documentation of usbFunctionSetup() above for more info. + */ +#if USB_CFG_HAVE_INTRIN_ENDPOINT +USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len); +/* This function sets the message which will be sent during the next interrupt + * IN transfer. The message is copied to an internal buffer and must not exceed + * a length of 8 bytes. The message may be 0 bytes long just to indicate the + * interrupt status to the host. + * If you need to transfer more bytes, use a control read after the interrupt. + */ +#define usbInterruptIsReady() (usbTxLen1 & 0x10) +/* This macro indicates whether the last interrupt message has already been + * sent. If you set a new interrupt message before the old was sent, the + * message already buffered will be lost. + */ +#if USB_CFG_HAVE_INTRIN_ENDPOINT3 +USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len); +#define usbInterruptIsReady3() (usbTxLen3 & 0x10) +/* Same as above for endpoint 3 */ +#endif +#endif /* USB_CFG_HAVE_INTRIN_ENDPOINT */ +#if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH /* simplified interface for backward compatibility */ +#define usbHidReportDescriptor usbDescriptorHidReport +/* should be declared as: PROGMEM char usbHidReportDescriptor[]; */ +/* If you implement an HID device, you need to provide a report descriptor. + * The HID report descriptor syntax is a bit complex. If you understand how + * report descriptors are constructed, we recommend that you use the HID + * Descriptor Tool from usb.org, see http://www.usb.org/developers/hidpage/. + * Otherwise you should probably start with a working example. + */ +#endif /* USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH */ +#if USB_CFG_IMPLEMENT_FN_WRITE +USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len); +/* This function is called by the driver to provide a control transfer's + * payload data (control-out). It is called in chunks of up to 8 bytes. The + * total count provided in the current control transfer can be obtained from + * the 'length' property in the setup data. If an error occurred during + * processing, return 0xff (== -1). The driver will answer the entire transfer + * with a STALL token in this case. If you have received the entire payload + * successfully, return 1. If you expect more data, return 0. If you don't + * know whether the host will send more data (you should know, the total is + * provided in the usbFunctionSetup() call!), return 1. + * NOTE: If you return 0xff for STALL, 'usbFunctionWrite()' may still be called + * for the remaining data. You must continue to return 0xff for STALL in these + * calls. + * In order to get usbFunctionWrite() called, define USB_CFG_IMPLEMENT_FN_WRITE + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +#endif /* USB_CFG_IMPLEMENT_FN_WRITE */ +#if USB_CFG_IMPLEMENT_FN_READ +USB_PUBLIC uchar usbFunctionRead(uchar *data, uchar len); +/* This function is called by the driver to ask the application for a control + * transfer's payload data (control-in). It is called in chunks of up to 8 + * bytes each. You should copy the data to the location given by 'data' and + * return the actual number of bytes copied. If you return less than requested, + * the control-in transfer is terminated. If you return 0xff, the driver aborts + * the transfer with a STALL token. + * In order to get usbFunctionRead() called, define USB_CFG_IMPLEMENT_FN_READ + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +#endif /* USB_CFG_IMPLEMENT_FN_READ */ + +extern uchar usbRxToken; /* may be used in usbFunctionWriteOut() below */ +#if USB_CFG_IMPLEMENT_FN_WRITEOUT +USB_PUBLIC void usbFunctionWriteOut(uchar *data, uchar len); +/* This function is called by the driver when data is received on an interrupt- + * or bulk-out endpoint. The endpoint number can be found in the global + * variable usbRxToken. You must define USB_CFG_IMPLEMENT_FN_WRITEOUT to 1 in + * usbconfig.h to get this function called. + */ +#endif /* USB_CFG_IMPLEMENT_FN_WRITEOUT */ +#ifdef USB_CFG_PULLUP_IOPORTNAME +#define usbDeviceConnect() ((USB_PULLUP_DDR |= (1<device, 1=device->host + * t ..... type: 0=standard, 1=class, 2=vendor, 3=reserved + * r ..... recipient: 0=device, 1=interface, 2=endpoint, 3=other + */ + +/* USB setup recipient values */ +#define USBRQ_RCPT_MASK 0x1f +#define USBRQ_RCPT_DEVICE 0 +#define USBRQ_RCPT_INTERFACE 1 +#define USBRQ_RCPT_ENDPOINT 2 + +/* USB request type values */ +#define USBRQ_TYPE_MASK 0x60 +#define USBRQ_TYPE_STANDARD (0<<5) +#define USBRQ_TYPE_CLASS (1<<5) +#define USBRQ_TYPE_VENDOR (2<<5) + +/* USB direction values: */ +#define USBRQ_DIR_MASK 0x80 +#define USBRQ_DIR_HOST_TO_DEVICE (0<<7) +#define USBRQ_DIR_DEVICE_TO_HOST (1<<7) + +/* USB Standard Requests */ +#define USBRQ_GET_STATUS 0 +#define USBRQ_CLEAR_FEATURE 1 +#define USBRQ_SET_FEATURE 3 +#define USBRQ_SET_ADDRESS 5 +#define USBRQ_GET_DESCRIPTOR 6 +#define USBRQ_SET_DESCRIPTOR 7 +#define USBRQ_GET_CONFIGURATION 8 +#define USBRQ_SET_CONFIGURATION 9 +#define USBRQ_GET_INTERFACE 10 +#define USBRQ_SET_INTERFACE 11 +#define USBRQ_SYNCH_FRAME 12 + +/* USB descriptor constants */ +#define USBDESCR_DEVICE 1 +#define USBDESCR_CONFIG 2 +#define USBDESCR_STRING 3 +#define USBDESCR_INTERFACE 4 +#define USBDESCR_ENDPOINT 5 +#define USBDESCR_HID 0x21 +#define USBDESCR_HID_REPORT 0x22 +#define USBDESCR_HID_PHYS 0x23 + +//#define USBATTR_BUSPOWER 0x80 // USB 1.1 does not define this value any more +#define USBATTR_SELFPOWER 0x40 +#define USBATTR_REMOTEWAKE 0x20 + +/* USB HID Requests */ +#define USBRQ_HID_GET_REPORT 0x01 +#define USBRQ_HID_GET_IDLE 0x02 +#define USBRQ_HID_GET_PROTOCOL 0x03 +#define USBRQ_HID_SET_REPORT 0x09 +#define USBRQ_HID_SET_IDLE 0x0a +#define USBRQ_HID_SET_PROTOCOL 0x0b + +/* ------------------------------------------------------------------------- */ + +#endif /* __usbdrv_h_included__ */ diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.S b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.S new file mode 100644 index 0000000..45fcf18 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.S @@ -0,0 +1,393 @@ +/* Name: usbdrvasm.S + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2007-06-13 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm.S 785 2010-05-30 17:57:07Z cs $ + */ + +/* +General Description: +This module is the assembler part of the USB driver. This file contains +general code (preprocessor acrobatics and CRC computation) and then includes +the file appropriate for the given clock rate. +*/ + +#define __SFR_OFFSET 0 /* used by avr-libc's register definitions */ +#include "usbportability.h" +#include "usbdrv.h" /* for common defs */ + +/* register names */ +#define x1 r16 +#define x2 r17 +#define shift r18 +#define cnt r19 +#define x3 r20 +#define x4 r21 +#define x5 r22 +#define bitcnt x5 +#define phase x4 +#define leap x4 + +/* Some assembler dependent definitions and declarations: */ + +#ifdef __IAR_SYSTEMS_ASM__ + extern usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset + extern usbCurrentTok, usbRxLen, usbRxToken, usbTxLen + extern usbTxBuf, usbTxStatus1, usbTxStatus3 +# if USB_COUNT_SOF + extern usbSofCount +# endif + public usbCrc16 + public usbCrc16Append + + COMMON INTVEC +# ifndef USB_INTR_VECTOR + ORG INT0_vect +# else /* USB_INTR_VECTOR */ + ORG USB_INTR_VECTOR +# undef USB_INTR_VECTOR +# endif /* USB_INTR_VECTOR */ +# define USB_INTR_VECTOR usbInterruptHandler + rjmp USB_INTR_VECTOR + RSEG CODE + +#else /* __IAR_SYSTEMS_ASM__ */ + +# ifndef USB_INTR_VECTOR /* default to hardware interrupt INT0 */ +# ifdef INT0_vect +# define USB_INTR_VECTOR INT0_vect // this is the "new" define for the vector +# else +# define USB_INTR_VECTOR SIG_INTERRUPT0 // this is the "old" vector +# endif +# endif + .text + .global USB_INTR_VECTOR + .type USB_INTR_VECTOR, @function + .global usbCrc16 + .global usbCrc16Append +#endif /* __IAR_SYSTEMS_ASM__ */ + + +#if USB_INTR_PENDING < 0x40 /* This is an I/O address, use in and out */ +# define USB_LOAD_PENDING(reg) in reg, USB_INTR_PENDING +# define USB_STORE_PENDING(reg) out USB_INTR_PENDING, reg +#else /* It's a memory address, use lds and sts */ +# define USB_LOAD_PENDING(reg) lds reg, USB_INTR_PENDING +# define USB_STORE_PENDING(reg) sts USB_INTR_PENDING, reg +#endif + +#define usbTxLen1 usbTxStatus1 +#define usbTxBuf1 (usbTxStatus1 + 1) +#define usbTxLen3 usbTxStatus3 +#define usbTxBuf3 (usbTxStatus3 + 1) + + +;---------------------------------------------------------------------------- +; Utility functions +;---------------------------------------------------------------------------- + +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbCrc16 on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ +RTMODEL "__rt_version", "3" +/* The line above will generate an error if cc calling conventions change. + * The value "3" above is valid for IAR 4.10B/W32 + */ +# define argLen r18 /* argument 2 */ +# define argPtrL r16 /* argument 1 */ +# define argPtrH r17 /* argument 1 */ + +# define resCrcL r16 /* result */ +# define resCrcH r17 /* result */ + +# define ptrL ZL +# define ptrH ZH +# define ptr Z +# define byte r22 +# define bitCnt r19 +# define polyL r20 +# define polyH r21 +# define scratch r23 + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbCrc16 on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ +# define argLen r22 /* argument 2 */ +# define argPtrL r24 /* argument 1 */ +# define argPtrH r25 /* argument 1 */ + +# define resCrcL r24 /* result */ +# define resCrcH r25 /* result */ + +# define ptrL XL +# define ptrH XH +# define ptr x +# define byte r18 +# define bitCnt r19 +# define polyL r20 +# define polyH r21 +# define scratch r23 + +#endif + +#if USB_USE_FAST_CRC + +; This implementation is faster, but has bigger code size +; Thanks to Slawomir Fras (BoskiDialer) for this code! +; It implements the following C pseudo-code: +; unsigned table(unsigned char x) +; { +; unsigned value; +; +; value = (unsigned)x << 6; +; value ^= (unsigned)x << 7; +; if(parity(x)) +; value ^= 0xc001; +; return value; +; } +; unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen) +; { +; unsigned crc = 0xffff; +; +; while(argLen--) +; crc = table(lo8(crc) ^ *argPtr++) ^ hi8(crc); +; return ~crc; +; } + +; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen); +; argPtr r24+25 / r16+r17 +; argLen r22 / r18 +; temp variables: +; byte r18 / r22 +; scratch r23 +; resCrc r24+r25 / r16+r17 +; ptr X / Z +usbCrc16: + mov ptrL, argPtrL + mov ptrH, argPtrH + ldi resCrcL, 0xFF + ldi resCrcH, 0xFF + rjmp usbCrc16LoopTest +usbCrc16ByteLoop: + ld byte, ptr+ + eor resCrcL, byte ; resCrcL is now 'x' in table() + mov byte, resCrcL ; compute parity of 'x' + swap byte + eor byte, resCrcL + mov scratch, byte + lsr byte + lsr byte + eor byte, scratch + inc byte + lsr byte + andi byte, 1 ; byte is now parity(x) + mov scratch, resCrcL + mov resCrcL, resCrcH + eor resCrcL, byte ; low byte of if(parity(x)) value ^= 0xc001; + neg byte + andi byte, 0xc0 + mov resCrcH, byte ; high byte of if(parity(x)) value ^= 0xc001; + clr byte + lsr scratch + ror byte + eor resCrcH, scratch + eor resCrcL, byte + lsr scratch + ror byte + eor resCrcH, scratch + eor resCrcL, byte +usbCrc16LoopTest: + subi argLen, 1 + brsh usbCrc16ByteLoop + com resCrcL + com resCrcH + ret + +#else /* USB_USE_FAST_CRC */ + +; This implementation is slower, but has less code size +; +; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen); +; argPtr r24+25 / r16+r17 +; argLen r22 / r18 +; temp variables: +; byte r18 / r22 +; bitCnt r19 +; poly r20+r21 +; scratch r23 +; resCrc r24+r25 / r16+r17 +; ptr X / Z +usbCrc16: + mov ptrL, argPtrL + mov ptrH, argPtrH + ldi resCrcL, 0 + ldi resCrcH, 0 + ldi polyL, lo8(0xa001) + ldi polyH, hi8(0xa001) + com argLen ; argLen = -argLen - 1: modified loop to ensure that carry is set + ldi bitCnt, 0 ; loop counter with starnd condition = end condition + rjmp usbCrcLoopEntry +usbCrcByteLoop: + ld byte, ptr+ + eor resCrcL, byte +usbCrcBitLoop: + ror resCrcH ; carry is always set here (see brcs jumps to here) + ror resCrcL + brcs usbCrcNoXor + eor resCrcL, polyL + eor resCrcH, polyH +usbCrcNoXor: + subi bitCnt, 224 ; (8 * 224) % 256 = 0; this loop iterates 8 times + brcs usbCrcBitLoop +usbCrcLoopEntry: + subi argLen, -1 + brcs usbCrcByteLoop +usbCrcReady: + ret +; Thanks to Reimar Doeffinger for optimizing this CRC routine! + +#endif /* USB_USE_FAST_CRC */ + +; extern unsigned usbCrc16Append(unsigned char *data, unsigned char len); +usbCrc16Append: + rcall usbCrc16 + st ptr+, resCrcL + st ptr+, resCrcH + ret + +#undef argLen +#undef argPtrL +#undef argPtrH +#undef resCrcL +#undef resCrcH +#undef ptrL +#undef ptrH +#undef ptr +#undef byte +#undef bitCnt +#undef polyL +#undef polyH +#undef scratch + + +#if USB_CFG_HAVE_MEASURE_FRAME_LENGTH +#ifdef __IAR_SYSTEMS_ASM__ +/* Register assignments for usbMeasureFrameLength on IAR cc */ +/* Calling conventions on IAR: + * First parameter passed in r16/r17, second in r18/r19 and so on. + * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer) + * Result is passed in r16/r17 + * In case of the "tiny" memory model, pointers are only 8 bit with no + * padding. We therefore pass argument 1 as "16 bit unsigned". + */ +# define resL r16 +# define resH r17 +# define cnt16L r30 +# define cnt16H r31 +# define cntH r18 + +#else /* __IAR_SYSTEMS_ASM__ */ +/* Register assignments for usbMeasureFrameLength on gcc */ +/* Calling conventions on gcc: + * First parameter passed in r24/r25, second in r22/23 and so on. + * Callee must preserve r1-r17, r28/r29 + * Result is passed in r24/r25 + */ +# define resL r24 +# define resH r25 +# define cnt16L r24 +# define cnt16H r25 +# define cntH r26 +#endif +# define cnt16 cnt16L + +; extern unsigned usbMeasurePacketLength(void); +; returns time between two idle strobes in multiples of 7 CPU clocks +.global usbMeasureFrameLength +usbMeasureFrameLength: + ldi cntH, 6 ; wait ~ 10 ms for D- == 0 + clr cnt16L + clr cnt16H +usbMFTime16: + dec cntH + breq usbMFTimeout +usbMFWaitStrobe: ; first wait for D- == 0 (idle strobe) + sbiw cnt16, 1 ;[0] [6] + breq usbMFTime16 ;[2] + sbic USBIN, USBMINUS ;[3] + rjmp usbMFWaitStrobe ;[4] +usbMFWaitIdle: ; then wait until idle again + sbis USBIN, USBMINUS ;1 wait for D- == 1 + rjmp usbMFWaitIdle ;2 + ldi cnt16L, 1 ;1 represents cycles so far + clr cnt16H ;1 +usbMFWaitLoop: + in cntH, USBIN ;[0] [7] + adiw cnt16, 1 ;[1] + breq usbMFTimeout ;[3] + andi cntH, USBMASK ;[4] + brne usbMFWaitLoop ;[5] +usbMFTimeout: +#if resL != cnt16L + mov resL, cnt16L + mov resH, cnt16H +#endif + ret + +#undef resL +#undef resH +#undef cnt16 +#undef cnt16L +#undef cnt16H +#undef cntH + +#endif /* USB_CFG_HAVE_MEASURE_FRAME_LENGTH */ + +;---------------------------------------------------------------------------- +; Now include the clock rate specific code +;---------------------------------------------------------------------------- + +#ifndef USB_CFG_CLOCK_KHZ +# ifdef F_CPU +# define USB_CFG_CLOCK_KHZ (F_CPU/1000) +# else +# error "USB_CFG_CLOCK_KHZ not defined in usbconfig.h and no F_CPU set!" +# endif +#endif + +#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */ +# if USB_CFG_CLOCK_KHZ == 18000 +# include "usbdrvasm18-crc.inc" +# else +# error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!" +# endif +#else /* USB_CFG_CHECK_CRC */ +# if USB_CFG_CLOCK_KHZ == 12000 +# include "usbdrvasm12.inc" +# elif USB_CFG_CLOCK_KHZ == 12800 +# include "usbdrvasm128.inc" +# elif USB_CFG_CLOCK_KHZ == 15000 +# include "usbdrvasm15.inc" +# elif USB_CFG_CLOCK_KHZ == 16000 +# include "usbdrvasm16.inc" +# elif USB_CFG_CLOCK_KHZ == 16500 +# include "usbdrvasm165.inc" +# elif USB_CFG_CLOCK_KHZ == 20000 +# include "usbdrvasm20.inc" +# else +# error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!" +# endif +#endif /* USB_CFG_CHECK_CRC */ diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.asm b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.asm new file mode 100644 index 0000000..9cc4e4d --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm.asm @@ -0,0 +1,21 @@ +/* Name: usbdrvasm.asm + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2006-03-01 + * Tabsize: 4 + * Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id$ + */ + +/* +General Description: +The IAR compiler/assembler system prefers assembler files with file extension +".asm". We simply provide this file as an alias for usbdrvasm.S. + +Thanks to Oleg Semyonov for his help with the IAR tools port! +*/ + +#include "usbdrvasm.S" + +end diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm12.inc b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm12.inc new file mode 100644 index 0000000..c116758 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm12.inc @@ -0,0 +1,393 @@ +/* Name: usbdrvasm12.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2004-12-29 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbdrvasm12.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 12 MHz version of the asssembler part of the USB driver. It +requires a 12 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! + + +Timing constraints according to spec (in bit times): +timing subject min max CPUcycles +--------------------------------------------------------------------------- +EOP of OUT/SETUP to sync pattern of DATA0 (both rx) 2 16 16-128 +EOP of IN to sync pattern of DATA0 (rx, then tx) 2 7.5 16-60 +DATAx (rx) to ACK/NAK/STALL (tx) 2 7.5 16-60 +*/ + +;Software-receiver engine. Strict timing! Don't change unless you can preserve timing! +;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled +;max allowable interrupt latency: 34 cycles -> max 25 cycles interrupt disable +;max stack usage: [ret(2), YL, SREG, YH, shift, x1, x2, x3, cnt, x4] = 11 bytes +;Numbers in brackets are maximum cycles since SOF. +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt + push YL ;2 [35] push only what is necessary to sync with edge ASAP + in YL, SREG ;1 [37] + push YL ;2 [39] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of 1/4 bit which meets the spec. + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push YH ;2 [2] + lds YL, usbInputBufOffset;2 [4] + clr YH ;1 [5] + subi YL, lo8(-(usbRxBuf));1 [6] + sbci YH, hi8(-(usbRxBuf));1 [7] + + sbis USBIN, USBMINUS ;1 [8] we want two bits K [sample 1 cycle too early] + rjmp haveTwoBitsK ;2 [10] + pop YH ;2 [11] undo the push from before + rjmp waitForK ;2 [13] this was not the end of sync, retry +haveTwoBitsK: +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- + push shift ;2 [16] + push x1 ;2 [12] + push x2 ;2 [14] + + in x1, USBIN ;1 [17] <-- sample bit 0 + ldi shift, 0xff ;1 [18] + bst x1, USBMINUS ;1 [19] + bld shift, 0 ;1 [20] + push x3 ;2 [22] + push cnt ;2 [24] + + in x2, USBIN ;1 [25] <-- sample bit 1 + ser x3 ;1 [26] [inserted init instruction] + eor x1, x2 ;1 [27] + bst x1, USBMINUS ;1 [28] + bld shift, 1 ;1 [29] + ldi cnt, USB_BUFSIZE;1 [30] [inserted init instruction] + rjmp rxbit2 ;2 [32] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- + +unstuff0: ;1 (branch taken) + andi x3, ~0x01 ;1 [15] + mov x1, x2 ;1 [16] x2 contains last sampled (stuffed) bit + in x2, USBIN ;1 [17] <-- sample bit 1 again + ori shift, 0x01 ;1 [18] + rjmp didUnstuff0 ;2 [20] + +unstuff1: ;1 (branch taken) + mov x2, x1 ;1 [21] x1 contains last sampled (stuffed) bit + andi x3, ~0x02 ;1 [22] + ori shift, 0x02 ;1 [23] + nop ;1 [24] + in x1, USBIN ;1 [25] <-- sample bit 2 again + rjmp didUnstuff1 ;2 [27] + +unstuff2: ;1 (branch taken) + andi x3, ~0x04 ;1 [29] + ori shift, 0x04 ;1 [30] + mov x1, x2 ;1 [31] x2 contains last sampled (stuffed) bit + nop ;1 [32] + in x2, USBIN ;1 [33] <-- sample bit 3 + rjmp didUnstuff2 ;2 [35] + +unstuff3: ;1 (branch taken) + in x2, USBIN ;1 [34] <-- sample stuffed bit 3 [one cycle too late] + andi x3, ~0x08 ;1 [35] + ori shift, 0x08 ;1 [36] + rjmp didUnstuff3 ;2 [38] + +unstuff4: ;1 (branch taken) + andi x3, ~0x10 ;1 [40] + in x1, USBIN ;1 [41] <-- sample stuffed bit 4 + ori shift, 0x10 ;1 [42] + rjmp didUnstuff4 ;2 [44] + +unstuff5: ;1 (branch taken) + andi x3, ~0x20 ;1 [48] + in x2, USBIN ;1 [49] <-- sample stuffed bit 5 + ori shift, 0x20 ;1 [50] + rjmp didUnstuff5 ;2 [52] + +unstuff6: ;1 (branch taken) + andi x3, ~0x40 ;1 [56] + in x1, USBIN ;1 [57] <-- sample stuffed bit 6 + ori shift, 0x40 ;1 [58] + rjmp didUnstuff6 ;2 [60] + +; extra jobs done during bit interval: +; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs] +; bit 1: se0 check +; bit 2: overflow check +; bit 3: recovery from delay [bit 0 tasks took too long] +; bit 4: none +; bit 5: none +; bit 6: none +; bit 7: jump, eor +rxLoop: + eor x3, shift ;1 [0] reconstruct: x3 is 0 at bit locations we changed, 1 at others + in x1, USBIN ;1 [1] <-- sample bit 0 + st y+, x3 ;2 [3] store data + ser x3 ;1 [4] + nop ;1 [5] + eor x2, x1 ;1 [6] + bst x2, USBMINUS;1 [7] + bld shift, 0 ;1 [8] + in x2, USBIN ;1 [9] <-- sample bit 1 (or possibly bit 0 stuffed) + andi x2, USBMASK ;1 [10] + breq se0 ;1 [11] SE0 check for bit 1 + andi shift, 0xf9 ;1 [12] +didUnstuff0: + breq unstuff0 ;1 [13] + eor x1, x2 ;1 [14] + bst x1, USBMINUS;1 [15] + bld shift, 1 ;1 [16] +rxbit2: + in x1, USBIN ;1 [17] <-- sample bit 2 (or possibly bit 1 stuffed) + andi shift, 0xf3 ;1 [18] + breq unstuff1 ;1 [19] do remaining work for bit 1 +didUnstuff1: + subi cnt, 1 ;1 [20] + brcs overflow ;1 [21] loop control + eor x2, x1 ;1 [22] + bst x2, USBMINUS;1 [23] + bld shift, 2 ;1 [24] + in x2, USBIN ;1 [25] <-- sample bit 3 (or possibly bit 2 stuffed) + andi shift, 0xe7 ;1 [26] + breq unstuff2 ;1 [27] +didUnstuff2: + eor x1, x2 ;1 [28] + bst x1, USBMINUS;1 [29] + bld shift, 3 ;1 [30] +didUnstuff3: + andi shift, 0xcf ;1 [31] + breq unstuff3 ;1 [32] + in x1, USBIN ;1 [33] <-- sample bit 4 + eor x2, x1 ;1 [34] + bst x2, USBMINUS;1 [35] + bld shift, 4 ;1 [36] +didUnstuff4: + andi shift, 0x9f ;1 [37] + breq unstuff4 ;1 [38] + nop2 ;2 [40] + in x2, USBIN ;1 [41] <-- sample bit 5 + eor x1, x2 ;1 [42] + bst x1, USBMINUS;1 [43] + bld shift, 5 ;1 [44] +didUnstuff5: + andi shift, 0x3f ;1 [45] + breq unstuff5 ;1 [46] + nop2 ;2 [48] + in x1, USBIN ;1 [49] <-- sample bit 6 + eor x2, x1 ;1 [50] + bst x2, USBMINUS;1 [51] + bld shift, 6 ;1 [52] +didUnstuff6: + cpi shift, 0x02 ;1 [53] + brlo unstuff6 ;1 [54] + nop2 ;2 [56] + in x2, USBIN ;1 [57] <-- sample bit 7 + eor x1, x2 ;1 [58] + bst x1, USBMINUS;1 [59] + bld shift, 7 ;1 [60] +didUnstuff7: + cpi shift, 0x04 ;1 [61] + brsh rxLoop ;2 [63] loop control +unstuff7: + andi x3, ~0x80 ;1 [63] + ori shift, 0x80 ;1 [64] + in x2, USBIN ;1 [65] <-- sample stuffed bit 7 + nop ;1 [66] + rjmp didUnstuff7 ;2 [68] + +macro POP_STANDARD ; 12 cycles + pop cnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;---------------------------------------------------------------------------- +; Transmitting data +;---------------------------------------------------------------------------- + +txByteLoop: +txBitloop: +stuffN1Delay: ; [03] + ror shift ;[-5] [11] [59] + brcc doExorN1 ;[-4] [60] + subi x4, 1 ;[-3] + brne commonN1 ;[-2] + lsl shift ;[-1] compensate ror after rjmp stuffDelay + nop ;[00] stuffing consists of just waiting 8 cycles + rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear + +sendNakAndReti: ;0 [-19] 19 cycles until SOP + ldi x3, USBPID_NAK ;1 [-18] + rjmp usbSendX3 ;2 [-16] +sendAckAndReti: ;0 [-19] 19 cycles until SOP + ldi x3, USBPID_ACK ;1 [-18] + rjmp usbSendX3 ;2 [-16] +sendCntAndReti: ;0 [-17] 17 cycles until SOP + mov x3, cnt ;1 [-16] +usbSendX3: ;0 [-16] + ldi YL, 20 ;1 [-15] 'x3' is R20 + ldi YH, 0 ;1 [-14] + ldi cnt, 2 ;1 [-13] +; rjmp usbSendAndReti fallthrough + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) or USBOUT = 0x01 +; K = (D+ = 1), (D- = 0) or USBOUT = 0x02 +; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles) + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte +;uses: x1...x2, x4, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x4 = bitstuff cnt] +;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction) +usbSendAndReti: + in x2, USBDDR ;[-12] 12 cycles until SOP + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS ;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + out USBDDR, x2 ;[-8] <--- acquire bus + in x1, USBOUT ;[-7] port mirror for tx loop + ldi shift, 0x40 ;[-6] sync byte is first byte sent (we enter loop after ror) + ldi x2, USBMASK ;[-5] + push x4 ;[-4] +doExorN1: + eor x1, x2 ;[-2] [06] [62] + ldi x4, 6 ;[-1] [07] [63] +commonN1: +stuffN2Delay: + out USBOUT, x1 ;[00] [08] [64] <--- set bit + ror shift ;[01] + brcc doExorN2 ;[02] + subi x4, 1 ;[03] + brne commonN2 ;[04] + lsl shift ;[05] compensate ror after rjmp stuffDelay + rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear +doExorN2: + eor x1, x2 ;[04] [12] + ldi x4, 6 ;[05] [13] +commonN2: + nop ;[06] [14] + subi cnt, 171 ;[07] [15] trick: (3 * 171) & 0xff = 1 + out USBOUT, x1 ;[08] [16] <--- set bit + brcs txBitloop ;[09] [25] [41] + +stuff6Delay: + ror shift ;[42] [50] + brcc doExor6 ;[43] + subi x4, 1 ;[44] + brne common6 ;[45] + lsl shift ;[46] compensate ror after rjmp stuffDelay + nop ;[47] stuffing consists of just waiting 8 cycles + rjmp stuff6Delay ;[48] after ror, C bit is reliably clear +doExor6: + eor x1, x2 ;[45] [53] + ldi x4, 6 ;[46] +common6: +stuff7Delay: + ror shift ;[47] [55] + out USBOUT, x1 ;[48] <--- set bit + brcc doExor7 ;[49] + subi x4, 1 ;[50] + brne common7 ;[51] + lsl shift ;[52] compensate ror after rjmp stuffDelay + rjmp stuff7Delay ;[53] after ror, C bit is reliably clear +doExor7: + eor x1, x2 ;[51] [59] + ldi x4, 6 ;[52] +common7: + ld shift, y+ ;[53] + tst cnt ;[55] + out USBOUT, x1 ;[56] <--- set bit + brne txByteLoop ;[57] + +;make SE0: + cbr x1, USBMASK ;[58] prepare SE0 [spec says EOP may be 15 to 18 cycles] + lds x2, usbNewDeviceAddr;[59] + lsl x2 ;[61] we compare with left shifted address + subi YL, 2 + 20 ;[62] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[63] + out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[01] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 12.5625 MHz +max frequency: 69.286 cycles for 8 bit -> 12.99 MHz +nominal frequency: 12.77 MHz ( = sqrt(min * max)) + +sampling positions: (next even number in range [+/- 0.5]) +cycle index range: 0 ... 66 +bits: +.5, 8.875, 17.25, 25.625, 34, 42.375, 50.75, 59.125 +[0/1], [9], [17], [25/+26], [34], [+42/43], [51], [59] + +bit number: 0 1 2 3 4 5 6 7 +spare cycles 1 2 1 2 1 1 1 0 + +operations to perform: duration cycle + ---------------- + eor fix, shift 1 -> 00 + andi phase, USBMASK 1 -> 08 + breq se0 1 -> 16 (moved to 11) + st y+, data 2 -> 24, 25 + mov data, fix 1 -> 33 + ser data 1 -> 41 + subi cnt, 1 1 -> 49 + brcs overflow 1 -> 50 + +layout of samples and operations: +[##] = sample bit +<##> = sample phase +*##* = operation + +0: *00* [01] 02 03 04 <05> 06 07 +1: *08* [09] 10 11 12 <13> 14 15 *16* +2: [17] 18 19 20 <21> 22 23 +3: *24* *25* [26] 27 28 29 <30> 31 32 +4: *33* [34] 35 36 37 <38> 39 40 +5: *41* [42] 43 44 45 <46> 47 48 +6: *49* *50* [51] 52 53 54 <55> 56 57 58 +7: [59] 60 61 62 <63> 64 65 66 +*****************************************************************************/ + +/* we prefer positive expressions (do if condition) instead of negative + * (skip if condition), therefore use defines for skip instructions: + */ +#define ifioclr sbis +#define ifioset sbic +#define ifrclr sbrs +#define ifrset sbrc + +/* The registers "fix" and "data" swap their meaning during the loop. Use + * defines to keep their name constant. + */ +#define fix x2 +#define data x1 +#undef phase /* phase has a default definition to x4 */ +#define phase x3 + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt, r0 + push YL ;2 push only what is necessary to sync with edge ASAP + in YL, SREG ;1 + push YL ;2 +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of 1/4 bit which meets the spec. + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS ;[0] + rjmp foundK ;[1] +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError + +foundK: +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push YH ;[2] + lds YL, usbInputBufOffset;[4] + clr YH ;[6] + subi YL, lo8(-(usbRxBuf));[7] + sbci YH, hi8(-(usbRxBuf));[8] + + sbis USBIN, USBMINUS ;[9] we want two bits K [we want to sample at 8 + 4 - 1.5 = 10.5] + rjmp haveTwoBitsK ;[10] + pop YH ;[11] undo the push from before + rjmp waitForK ;[13] this was not the end of sync, retry +haveTwoBitsK: +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +#define fix x2 +#define data x1 + + push shift ;[12] + push x1 ;[14] + push x2 ;[16] + ldi shift, 0x80 ;[18] prevent bit-unstuffing but init low bits to 0 + ifioset USBIN, USBMINUS ;[19] [01] <--- bit 0 [10.5 + 8 = 18.5] + ori shift, 1<<0 ;[02] + push x3 ;[03] + push cnt ;[05] + push r0 ;[07] + ifioset USBIN, USBMINUS ;[09] <--- bit 1 + ori shift, 1<<1 ;[10] + ser fix ;[11] + ldi cnt, USB_BUFSIZE ;[12] + mov data, shift ;[13] + lsl shift ;[14] + nop2 ;[15] + ifioset USBIN, USBMINUS ;[17] <--- bit 2 + ori data, 3<<2 ;[18] store in bit 2 AND bit 3 + eor shift, data ;[19] do nrzi decoding + andi data, 1<<3 ;[20] + in phase, USBIN ;[21] <- phase + brne jumpToEntryAfterSet ;[22] if USBMINS at bit 3 was 1 + nop ;[23] + rjmp entryAfterClr ;[24] +jumpToEntryAfterSet: + rjmp entryAfterSet ;[24] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +#undef fix +#define fix x1 +#undef data +#define data x2 + +bit7IsSet: + ifrclr phase, USBMINUS ;[62] check phase only if D- changed + lpm ;[63] + in phase, USBIN ;[64] <- phase (one cycle too late) + ori shift, 1 << 7 ;[65] + nop ;[66] +;;;;rjmp bit0AfterSet ; -> [00] == [67] moved block up to save jump +bit0AfterSet: + eor fix, shift ;[00] +#undef fix +#define fix x2 +#undef data +#define data x1 /* we now have result in data, fix is reset to 0xff */ + ifioclr USBIN, USBMINUS ;[01] <--- sample 0 + rjmp bit0IsClr ;[02] + andi shift, ~(7 << 0) ;[03] + breq unstuff0s ;[04] + in phase, USBIN ;[05] <- phase + rjmp bit1AfterSet ;[06] +unstuff0s: + in phase, USBIN ;[06] <- phase (one cycle too late) + andi fix, ~(1 << 0) ;[07] + ifioclr USBIN, USBMINUS ;[00] + ifioset USBIN, USBPLUS ;[01] + rjmp bit0IsClr ;[02] executed if first expr false or second true +se0AndStore: ; executed only if both bits 0 + st y+, x1 ;[15/17] cycles after start of byte + rjmp se0 ;[17/19] + +bit0IsClr: + ifrset phase, USBMINUS ;[04] check phase only if D- changed + lpm ;[05] + in phase, USBIN ;[06] <- phase (one cycle too late) + ori shift, 1 << 0 ;[07] +bit1AfterClr: + andi phase, USBMASK ;[08] + ifioset USBIN, USBMINUS ;[09] <--- sample 1 + rjmp bit1IsSet ;[10] + breq se0AndStore ;[11] if D- was 0 in bits 0 AND 1 and D+ was 0 in between, we have SE0 + andi shift, ~(7 << 1) ;[12] + in phase, USBIN ;[13] <- phase + breq unstuff1c ;[14] + rjmp bit2AfterClr ;[15] +unstuff1c: + andi fix, ~(1 << 1) ;[16] + nop2 ;[08] + nop2 ;[10] +bit1IsSet: + ifrclr phase, USBMINUS ;[12] check phase only if D- changed + lpm ;[13] + in phase, USBIN ;[14] <- phase (one cycle too late) + ori shift, 1 << 1 ;[15] + nop ;[16] +bit2AfterSet: + ifioclr USBIN, USBMINUS ;[17] <--- sample 2 + rjmp bit2IsClr ;[18] + andi shift, ~(7 << 2) ;[19] + breq unstuff2s ;[20] + in phase, USBIN ;[21] <- phase + rjmp bit3AfterSet ;[22] +unstuff2s: + in phase, USBIN ;[22] <- phase (one cycle too late) + andi fix, ~(1 << 2) ;[23] + nop2 ;[16] + nop2 ;[18] +bit2IsClr: + ifrset phase, USBMINUS ;[20] check phase only if D- changed + lpm ;[21] + in phase, USBIN ;[22] <- phase (one cycle too late) + ori shift, 1 << 2 ;[23] +bit3AfterClr: + st y+, data ;[24] +entryAfterClr: + ifioset USBIN, USBMINUS ;[26] <--- sample 3 + rjmp bit3IsSet ;[27] + andi shift, ~(7 << 3) ;[28] + breq unstuff3c ;[29] + in phase, USBIN ;[30] <- phase + rjmp bit4AfterClr ;[31] +unstuff3c: + in phase, USBIN ;[31] <- phase (one cycle too late) + andi fix, ~(1 << 3) ;[32] + nop2 ;[25] + nop2 ;[27] +bit3IsSet: + ifrclr phase, USBMINUS ;[29] check phase only if D- changed + lpm ;[30] + in phase, USBIN ;[31] <- phase (one cycle too late) + ori shift, 1 << 3 ;[32] +bit4AfterSet: + mov data, fix ;[33] undo this move by swapping defines +#undef fix +#define fix x1 +#undef data +#define data x2 + ifioclr USBIN, USBMINUS ;[34] <--- sample 4 + rjmp bit4IsClr ;[35] + andi shift, ~(7 << 4) ;[36] + breq unstuff4s ;[37] + in phase, USBIN ;[38] <- phase + rjmp bit5AfterSet ;[39] +unstuff4s: + in phase, USBIN ;[39] <- phase (one cycle too late) + andi fix, ~(1 << 4) ;[40] + nop2 ;[33] + nop2 ;[35] +bit4IsClr: + ifrset phase, USBMINUS ;[37] check phase only if D- changed + lpm ;[38] + in phase, USBIN ;[39] <- phase (one cycle too late) + ori shift, 1 << 4 ;[40] +bit5AfterClr: + ser data ;[41] + ifioset USBIN, USBMINUS ;[42] <--- sample 5 + rjmp bit5IsSet ;[43] + andi shift, ~(7 << 5) ;[44] + breq unstuff5c ;[45] + in phase, USBIN ;[46] <- phase + rjmp bit6AfterClr ;[47] +unstuff5c: + in phase, USBIN ;[47] <- phase (one cycle too late) + andi fix, ~(1 << 5) ;[48] + nop2 ;[41] + nop2 ;[43] +bit5IsSet: + ifrclr phase, USBMINUS ;[45] check phase only if D- changed + lpm ;[46] + in phase, USBIN ;[47] <- phase (one cycle too late) + ori shift, 1 << 5 ;[48] +bit6AfterSet: + subi cnt, 1 ;[49] + brcs jumpToOverflow ;[50] + ifioclr USBIN, USBMINUS ;[51] <--- sample 6 + rjmp bit6IsClr ;[52] + andi shift, ~(3 << 6) ;[53] + cpi shift, 2 ;[54] + in phase, USBIN ;[55] <- phase + brlt unstuff6s ;[56] + rjmp bit7AfterSet ;[57] + +jumpToOverflow: + rjmp overflow + +unstuff6s: + andi fix, ~(1 << 6) ;[50] + lpm ;[51] +bit6IsClr: + ifrset phase, USBMINUS ;[54] check phase only if D- changed + lpm ;[55] + in phase, USBIN ;[56] <- phase (one cycle too late) + ori shift, 1 << 6 ;[57] + nop ;[58] +bit7AfterClr: + ifioset USBIN, USBMINUS ;[59] <--- sample 7 + rjmp bit7IsSet ;[60] + andi shift, ~(1 << 7) ;[61] + cpi shift, 4 ;[62] + in phase, USBIN ;[63] <- phase + brlt unstuff7c ;[64] + rjmp bit0AfterClr ;[65] -> [00] == [67] +unstuff7c: + andi fix, ~(1 << 7) ;[58] + nop ;[59] + rjmp bit7IsSet ;[60] + +bit7IsClr: + ifrset phase, USBMINUS ;[62] check phase only if D- changed + lpm ;[63] + in phase, USBIN ;[64] <- phase (one cycle too late) + ori shift, 1 << 7 ;[65] + nop ;[66] +;;;;rjmp bit0AfterClr ; -> [00] == [67] moved block up to save jump +bit0AfterClr: + eor fix, shift ;[00] +#undef fix +#define fix x2 +#undef data +#define data x1 /* we now have result in data, fix is reset to 0xff */ + ifioset USBIN, USBMINUS ;[01] <--- sample 0 + rjmp bit0IsSet ;[02] + andi shift, ~(7 << 0) ;[03] + breq unstuff0c ;[04] + in phase, USBIN ;[05] <- phase + rjmp bit1AfterClr ;[06] +unstuff0c: + in phase, USBIN ;[06] <- phase (one cycle too late) + andi fix, ~(1 << 0) ;[07] + ifioclr USBIN, USBMINUS ;[00] + ifioset USBIN, USBPLUS ;[01] + rjmp bit0IsSet ;[02] executed if first expr false or second true + rjmp se0AndStore ;[03] executed only if both bits 0 +bit0IsSet: + ifrclr phase, USBMINUS ;[04] check phase only if D- changed + lpm ;[05] + in phase, USBIN ;[06] <- phase (one cycle too late) + ori shift, 1 << 0 ;[07] +bit1AfterSet: + andi shift, ~(7 << 1) ;[08] compensated by "ori shift, 1<<1" if bit1IsClr + ifioclr USBIN, USBMINUS ;[09] <--- sample 1 + rjmp bit1IsClr ;[10] + breq unstuff1s ;[11] + nop2 ;[12] do not check for SE0 if bit 0 was 1 + in phase, USBIN ;[14] <- phase (one cycle too late) + rjmp bit2AfterSet ;[15] +unstuff1s: + in phase, USBIN ;[13] <- phase + andi fix, ~(1 << 1) ;[14] + lpm ;[07] + nop2 ;[10] +bit1IsClr: + ifrset phase, USBMINUS ;[12] check phase only if D- changed + lpm ;[13] + in phase, USBIN ;[14] <- phase (one cycle too late) + ori shift, 1 << 1 ;[15] + nop ;[16] +bit2AfterClr: + ifioset USBIN, USBMINUS ;[17] <--- sample 2 + rjmp bit2IsSet ;[18] + andi shift, ~(7 << 2) ;[19] + breq unstuff2c ;[20] + in phase, USBIN ;[21] <- phase + rjmp bit3AfterClr ;[22] +unstuff2c: + in phase, USBIN ;[22] <- phase (one cycle too late) + andi fix, ~(1 << 2) ;[23] + nop2 ;[16] + nop2 ;[18] +bit2IsSet: + ifrclr phase, USBMINUS ;[20] check phase only if D- changed + lpm ;[21] + in phase, USBIN ;[22] <- phase (one cycle too late) + ori shift, 1 << 2 ;[23] +bit3AfterSet: + st y+, data ;[24] +entryAfterSet: + ifioclr USBIN, USBMINUS ;[26] <--- sample 3 + rjmp bit3IsClr ;[27] + andi shift, ~(7 << 3) ;[28] + breq unstuff3s ;[29] + in phase, USBIN ;[30] <- phase + rjmp bit4AfterSet ;[31] +unstuff3s: + in phase, USBIN ;[31] <- phase (one cycle too late) + andi fix, ~(1 << 3) ;[32] + nop2 ;[25] + nop2 ;[27] +bit3IsClr: + ifrset phase, USBMINUS ;[29] check phase only if D- changed + lpm ;[30] + in phase, USBIN ;[31] <- phase (one cycle too late) + ori shift, 1 << 3 ;[32] +bit4AfterClr: + mov data, fix ;[33] undo this move by swapping defines +#undef fix +#define fix x1 +#undef data +#define data x2 + ifioset USBIN, USBMINUS ;[34] <--- sample 4 + rjmp bit4IsSet ;[35] + andi shift, ~(7 << 4) ;[36] + breq unstuff4c ;[37] + in phase, USBIN ;[38] <- phase + rjmp bit5AfterClr ;[39] +unstuff4c: + in phase, USBIN ;[39] <- phase (one cycle too late) + andi fix, ~(1 << 4) ;[40] + nop2 ;[33] + nop2 ;[35] +bit4IsSet: + ifrclr phase, USBMINUS ;[37] check phase only if D- changed + lpm ;[38] + in phase, USBIN ;[39] <- phase (one cycle too late) + ori shift, 1 << 4 ;[40] +bit5AfterSet: + ser data ;[41] + ifioclr USBIN, USBMINUS ;[42] <--- sample 5 + rjmp bit5IsClr ;[43] + andi shift, ~(7 << 5) ;[44] + breq unstuff5s ;[45] + in phase, USBIN ;[46] <- phase + rjmp bit6AfterSet ;[47] +unstuff5s: + in phase, USBIN ;[47] <- phase (one cycle too late) + andi fix, ~(1 << 5) ;[48] + nop2 ;[41] + nop2 ;[43] +bit5IsClr: + ifrset phase, USBMINUS ;[45] check phase only if D- changed + lpm ;[46] + in phase, USBIN ;[47] <- phase (one cycle too late) + ori shift, 1 << 5 ;[48] +bit6AfterClr: + subi cnt, 1 ;[49] + brcs overflow ;[50] + ifioset USBIN, USBMINUS ;[51] <--- sample 6 + rjmp bit6IsSet ;[52] + andi shift, ~(3 << 6) ;[53] + cpi shift, 2 ;[54] + in phase, USBIN ;[55] <- phase + brlt unstuff6c ;[56] + rjmp bit7AfterClr ;[57] +unstuff6c: + andi fix, ~(1 << 6) ;[50] + lpm ;[51] +bit6IsSet: + ifrclr phase, USBMINUS ;[54] check phase only if D- changed + lpm ;[55] + in phase, USBIN ;[56] <- phase (one cycle too late) + ori shift, 1 << 6 ;[57] +bit7AfterSet: + ifioclr USBIN, USBMINUS ;[59] <--- sample 7 + rjmp bit7IsClr ;[60] + andi shift, ~(1 << 7) ;[61] + cpi shift, 4 ;[62] + in phase, USBIN ;[63] <- phase + brlt unstuff7s ;[64] + rjmp bit0AfterSet ;[65] -> [00] == [67] +unstuff7s: + andi fix, ~(1 << 7) ;[58] + nop ;[59] + rjmp bit7IsClr ;[60] + +macro POP_STANDARD ; 14 cycles + pop r0 + pop cnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;---------------------------------------------------------------------------- +; Transmitting data +;---------------------------------------------------------------------------- + +txByteLoop: +txBitloop: +stuffN1Delay: ; [03] + ror shift ;[-5] [11] [63] + brcc doExorN1 ;[-4] [64] + subi x3, 1 ;[-3] + brne commonN1 ;[-2] + lsl shift ;[-1] compensate ror after rjmp stuffDelay + nop ;[00] stuffing consists of just waiting 8 cycles + rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear + +sendNakAndReti: + ldi cnt, USBPID_NAK ;[-19] + rjmp sendCntAndReti ;[-18] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov r0, cnt ;[-16] + ldi YL, 0 ;[-15] R0 address is 0 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) or USBOUT = 0x01 +; K = (D+ = 1), (D- = 0) or USBOUT = 0x02 +; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles) + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte +;uses: x1...x3, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x3 = bitstuff cnt] +;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction) +usbSendAndReti: + in x2, USBDDR ;[-10] 10 cycles until SOP + ori x2, USBMASK ;[-9] + sbi USBOUT, USBMINUS ;[-8] prepare idle state; D+ and D- must have been 0 (no pullups) + out USBDDR, x2 ;[-6] <--- acquire bus + in x1, USBOUT ;[-5] port mirror for tx loop + ldi shift, 0x40 ;[-4] sync byte is first byte sent (we enter loop after ror) + ldi x2, USBMASK ;[-3] +doExorN1: + eor x1, x2 ;[-2] [06] [62] + ldi x3, 6 ;[-1] [07] [63] +commonN1: +stuffN2Delay: + out USBOUT, x1 ;[00] [08] [64] <--- set bit + ror shift ;[01] + brcc doExorN2 ;[02] + subi x3, 1 ;[03] + brne commonN2 ;[04] + lsl shift ;[05] compensate ror after rjmp stuffDelay + rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear +doExorN2: + eor x1, x2 ;[04] [12] + ldi x3, 6 ;[05] [13] +commonN2: + nop2 ;[06] [14] + subi cnt, 171 ;[08] [16] trick: (3 * 171) & 0xff = 1 + out USBOUT, x1 ;[09] [17] <--- set bit + brcs txBitloop ;[10] [27] [44] + +stuff6Delay: + ror shift ;[45] [53] + brcc doExor6 ;[46] + subi x3, 1 ;[47] + brne common6 ;[48] + lsl shift ;[49] compensate ror after rjmp stuffDelay + nop ;[50] stuffing consists of just waiting 8 cycles + rjmp stuff6Delay ;[51] after ror, C bit is reliably clear +doExor6: + eor x1, x2 ;[48] [56] + ldi x3, 6 ;[49] +common6: +stuff7Delay: + ror shift ;[50] [58] + out USBOUT, x1 ;[51] <--- set bit + brcc doExor7 ;[52] + subi x3, 1 ;[53] + brne common7 ;[54] + lsl shift ;[55] compensate ror after rjmp stuffDelay + rjmp stuff7Delay ;[56] after ror, C bit is reliably clear +doExor7: + eor x1, x2 ;[54] [62] + ldi x3, 6 ;[55] +common7: + ld shift, y+ ;[56] + nop ;[58] + tst cnt ;[59] + out USBOUT, x1 ;[60] [00]<--- set bit + brne txByteLoop ;[61] [01] +;make SE0: + cbr x1, USBMASK ;[02] prepare SE0 [spec says EOP may be 15 to 18 cycles] + lds x2, usbNewDeviceAddr;[03] + lsl x2 ;[05] we compare with left shifted address + subi YL, 2 + 0 ;[06] Only assign address on data packets, not ACK/NAK in r0 + sbci YH, 0 ;[07] + out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[01] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 0) + echo "$s\n"; + } +} + +function printBit($isAfterSet, $bitNum) +{ + ob_start(); + if($isAfterSet){ +?> + ifioclr USBIN, USBMINUS ;[00] <--- sample + rjmp bit#IsClr ;[01] + andi shift, ~(7 << #) ;[02] + breq unstuff#s ;[03] + in phase, USBIN ;[04] <- phase + rjmp bit@AfterSet ;[05] +unstuff#s: + in phase, USBIN ;[05] <- phase (one cycle too late) + andi fix, ~(1 << #) ;[06] + nop2 ;[-1] + nop2 ;[01] +bit#IsClr: + ifrset phase, USBMINUS ;[03] check phase only if D- changed + lpm ;[04] + in phase, USBIN ;[05] <- phase (one cycle too late) + ori shift, 1 << # ;[06] + + ifioset USBIN, USBMINUS ;[00] <--- sample + rjmp bit#IsSet ;[01] + andi shift, ~(7 << #) ;[02] + breq unstuff#c ;[03] + in phase, USBIN ;[04] <- phase + rjmp bit@AfterClr ;[05] +unstuff#c: + in phase, USBIN ;[05] <- phase (one cycle too late) + andi fix, ~(1 << #) ;[06] + nop2 ;[-1] + nop2 ;[01] +bit#IsSet: + ifrclr phase, USBMINUS ;[03] check phase only if D- changed + lpm ;[04] + in phase, USBIN ;[05] <- phase (one cycle too late) + ori shift, 1 << # ;[06] + +*****************************************************************************/ diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm15.inc b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm15.inc new file mode 100644 index 0000000..401b7f8 --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm15.inc @@ -0,0 +1,423 @@ +/* Name: usbdrvasm15.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: contributed by V. Bosch + * Creation Date: 2007-08-06 + * Tabsize: 4 + * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm15.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 15 MHz version of the asssembler part of the USB driver. It +requires a 15 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! +*/ + +;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 15 MHz -> 10.0 cycles per bit, 80.0 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + +;---------------------------------------------------------------------------- +; order of registers pushed: +; YL, SREG [sofError] YH, shift, x1, x2, x3, bitcnt, cnt, x4 +;---------------------------------------------------------------------------- +USB_INTR_VECTOR: + push YL ;2 push only what is necessary to sync with edge ASAP + in YL, SREG ;1 + push YL ;2 +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +; +; sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +; sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +;------------------------------------------------------------------------------- +; The following code results in a sampling window of < 1/4 bit +; which meets the spec. +;------------------------------------------------------------------------------- +waitForK: ;- + sbis USBIN, USBMINUS ;1 [00] <-- sample + rjmp foundK ;2 [01] + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK + sbis USBIN, USBMINUS ; <-- sample + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +;------------------------------------------------------------------------------ +; {3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for +; center sampling] +; we have 1 bit time for setup purposes, then sample again. +; Numbers in brackets are cycles from center of first sync (double K) +; bit after the instruction +;------------------------------------------------------------------------------ +foundK: ;- [02] + lds YL, usbInputBufOffset;2 [03+04] tx loop + push YH ;2 [05+06] + clr YH ;1 [07] + subi YL, lo8(-(usbRxBuf)) ;1 [08] [rx loop init] + sbci YH, hi8(-(usbRxBuf)) ;1 [09] [rx loop init] + push shift ;2 [10+11] + ser shift ;1 [12] + sbis USBIN, USBMINUS ;1 [-1] [13] <--sample:we want two bits K (sample 1 cycle too early) + rjmp haveTwoBitsK ;2 [00] [14] + pop shift ;2 [15+16] undo the push from before + pop YH ;2 [17+18] undo the push from before + rjmp waitForK ;2 [19+20] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 20 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: ;- [01] + push x1 ;2 [02+03] + push x2 ;2 [04+05] + push x3 ;2 [06+07] + push bitcnt ;2 [08+09] + in x1, USBIN ;1 [00] [10] <-- sample bit 0 + bst x1, USBMINUS ;1 [01] + bld shift, 0 ;1 [02] + push cnt ;2 [03+04] + ldi cnt, USB_BUFSIZE ;1 [05] + push x4 ;2 [06+07] tx loop + rjmp rxLoop ;2 [08] +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +unstuff0: ;- [07] (branch taken) + andi x3, ~0x01 ;1 [08] + mov x1, x2 ;1 [09] x2 contains last sampled (stuffed) bit + in x2, USBIN ;1 [00] [10] <-- sample bit 1 again + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 1 + ori shift, 0x01 ;1 [03] 0b00000001 + nop ;1 [04] + rjmp didUnstuff0 ;2 [05] +;----------------------------------------------------- +unstuff1: ;- [05] (branch taken) + mov x2, x1 ;1 [06] x1 contains last sampled (stuffed) bit + andi x3, ~0x02 ;1 [07] + ori shift, 0x02 ;1 [08] 0b00000010 + nop ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 2 again + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 2 + rjmp didUnstuff1 ;2 [03] +;----------------------------------------------------- +unstuff2: ;- [05] (branch taken) + andi x3, ~0x04 ;1 [06] + ori shift, 0x04 ;1 [07] 0b00000100 + mov x1, x2 ;1 [08] x2 contains last sampled (stuffed) bit + nop ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample bit 3 + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 3 + rjmp didUnstuff2 ;2 [03] +;----------------------------------------------------- +unstuff3: ;- [00] [10] (branch taken) + in x2, USBIN ;1 [01] [11] <-- sample stuffed bit 3 one cycle too late + andi x2, USBMASK ;1 [02] + breq se0Hop ;1 [03] SE0 check for stuffed bit 3 + andi x3, ~0x08 ;1 [04] + ori shift, 0x08 ;1 [05] 0b00001000 + rjmp didUnstuff3 ;2 [06] +;---------------------------------------------------------------------------- +; extra jobs done during bit interval: +; +; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs], +; overflow check, jump to the head of rxLoop +; bit 1: SE0 check +; bit 2: SE0 check, recovery from delay [bit 0 tasks took too long] +; bit 3: SE0 check, recovery from delay [bit 0 tasks took too long] +; bit 4: SE0 check, none +; bit 5: SE0 check, none +; bit 6: SE0 check, none +; bit 7: SE0 check, reconstruct: x3 is 0 at bit locations we changed, 1 at others +;---------------------------------------------------------------------------- +rxLoop: ;- [09] + in x2, USBIN ;1 [00] [10] <-- sample bit 1 (or possibly bit 0 stuffed) + andi x2, USBMASK ;1 [01] + brne SkipSe0Hop ;1 [02] +se0Hop: ;- [02] + rjmp se0 ;2 [03] SE0 check for bit 1 +SkipSe0Hop: ;- [03] + ser x3 ;1 [04] + andi shift, 0xf9 ;1 [05] 0b11111001 + breq unstuff0 ;1 [06] +didUnstuff0: ;- [06] + eor x1, x2 ;1 [07] + bst x1, USBMINUS ;1 [08] + bld shift, 1 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 2 (or possibly bit 1 stuffed) + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 2 + andi shift, 0xf3 ;1 [03] 0b11110011 + breq unstuff1 ;1 [04] do remaining work for bit 1 +didUnstuff1: ;- [04] + eor x2, x1 ;1 [05] + bst x2, USBMINUS ;1 [06] + bld shift, 2 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 3 (or possibly bit 2 stuffed) + andi x2, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 3 + andi shift, 0xe7 ;1 [03] 0b11100111 + breq unstuff2 ;1 [04] +didUnstuff2: ;- [04] + eor x1, x2 ;1 [05] + bst x1, USBMINUS ;1 [06] + bld shift, 3 ;1 [07] +didUnstuff3: ;- [07] + andi shift, 0xcf ;1 [08] 0b11001111 + breq unstuff3 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 4 + andi x1, USBMASK ;1 [01] + breq se0Hop ;1 [02] SE0 check for bit 4 + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 4 ;1 [05] +didUnstuff4: ;- [05] + andi shift, 0x9f ;1 [06] 0b10011111 + breq unstuff4 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 5 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 5 + eor x1, x2 ;1 [03] + bst x1, USBMINUS ;1 [04] + bld shift, 5 ;1 [05] +didUnstuff5: ;- [05] + andi shift, 0x3f ;1 [06] 0b00111111 + breq unstuff5 ;1 [07] + nop2 ;2 [08+09] + in x1, USBIN ;1 [00] [10] <-- sample bit 6 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 6 + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 6 ;1 [05] +didUnstuff6: ;- [05] + cpi shift, 0x02 ;1 [06] 0b00000010 + brlo unstuff6 ;1 [07] + nop2 ;2 [08+09] + in x2, USBIN ;1 [00] [10] <-- sample bit 7 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for bit 7 + eor x1, x2 ;1 [03] + bst x1, USBMINUS ;1 [04] + bld shift, 7 ;1 [05] +didUnstuff7: ;- [05] + cpi shift, 0x04 ;1 [06] 0b00000100 + brlo unstuff7 ;1 [07] + eor x3, shift ;1 [08] reconstruct: x3 is 0 at bit locations we changed, 1 at others + nop ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample bit 0 + st y+, x3 ;2 [01+02] store data + eor x2, x1 ;1 [03] + bst x2, USBMINUS ;1 [04] + bld shift, 0 ;1 [05] + subi cnt, 1 ;1 [06] + brcs overflow ;1 [07] + rjmp rxLoop ;2 [08] +;----------------------------------------------------- +unstuff4: ;- [08] + andi x3, ~0x10 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 4 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 4 + ori shift, 0x10 ;1 [03] + rjmp didUnstuff4 ;2 [04] +;----------------------------------------------------- +unstuff5: ;- [08] + ori shift, 0x20 ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 5 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 5 + andi x3, ~0x20 ;1 [03] + rjmp didUnstuff5 ;2 [04] +;----------------------------------------------------- +unstuff6: ;- [08] + andi x3, ~0x40 ;1 [09] + in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 6 + andi x1, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 6 + ori shift, 0x40 ;1 [03] + rjmp didUnstuff6 ;2 [04] +;----------------------------------------------------- +unstuff7: ;- [08] + andi x3, ~0x80 ;1 [09] + in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 7 + andi x2, USBMASK ;1 [01] + breq se0 ;1 [02] SE0 check for stuffed bit 7 + ori shift, 0x80 ;1 [03] + rjmp didUnstuff7 ;2 [04] + +macro POP_STANDARD ; 16 cycles + pop x4 + pop cnt + pop bitcnt + pop x3 + pop x2 + pop x1 + pop shift + pop YH + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +;--------------------------------------------------------------------------- +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies +;--------------------------------------------------------------------------- +bitstuffN: ;- [04] + eor x1, x4 ;1 [05] + clr x2 ;1 [06] + nop ;1 [07] + rjmp didStuffN ;1 [08] +;--------------------------------------------------------------------------- +bitstuff6: ;- [04] + eor x1, x4 ;1 [05] + clr x2 ;1 [06] + rjmp didStuff6 ;1 [07] +;--------------------------------------------------------------------------- +bitstuff7: ;- [02] + eor x1, x4 ;1 [03] + clr x2 ;1 [06] + nop ;1 [05] + rjmp didStuff7 ;1 [06] +;--------------------------------------------------------------------------- +sendNakAndReti: ;- [-19] + ldi x3, USBPID_NAK ;1 [-18] + rjmp sendX3AndReti ;1 [-17] +;--------------------------------------------------------------------------- +sendAckAndReti: ;- [-17] + ldi cnt, USBPID_ACK ;1 [-16] +sendCntAndReti: ;- [-16] + mov x3, cnt ;1 [-15] +sendX3AndReti: ;- [-15] + ldi YL, 20 ;1 [-14] x3==r20 address is 20 + ldi YH, 0 ;1 [-13] + ldi cnt, 2 ;1 [-12] +; rjmp usbSendAndReti fallthrough +;--------------------------------------------------------------------------- +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +;We need not to match the transfer rate exactly because the spec demands +;only 1.5% precision anyway. +usbSendAndReti: ;- [-13] 13 cycles until SOP + in x2, USBDDR ;1 [-12] + ori x2, USBMASK ;1 [-11] + sbi USBOUT, USBMINUS ;2 [-09-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;1 [-08] port mirror for tx loop + out USBDDR, x2 ;1 [-07] <- acquire bus + ; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;1 [-06] exor mask + ldi shift, 0x80 ;1 [-05] sync byte is first byte sent + ldi bitcnt, 6 ;1 [-04] +txBitLoop: ;- [-04] [06] + sbrs shift, 0 ;1 [-03] [07] + eor x1, x4 ;1 [-02] [08] + ror shift ;1 [-01] [09] +didStuffN: ;- [09] + out USBOUT, x1 ;1 [00] [10] <-- out N + ror x2 ;1 [01] + cpi x2, 0xfc ;1 [02] + brcc bitstuffN ;1 [03] + dec bitcnt ;1 [04] + brne txBitLoop ;1 [05] + sbrs shift, 0 ;1 [06] + eor x1, x4 ;1 [07] + ror shift ;1 [08] +didStuff6: ;- [08] + nop ;1 [09] + out USBOUT, x1 ;1 [00] [10] <-- out 6 + ror x2 ;1 [01] + cpi x2, 0xfc ;1 [02] + brcc bitstuff6 ;1 [03] + sbrs shift, 0 ;1 [04] + eor x1, x4 ;1 [05] + ror shift ;1 [06] + ror x2 ;1 [07] +didStuff7: ;- [07] + ldi bitcnt, 6 ;1 [08] + cpi x2, 0xfc ;1 [09] + out USBOUT, x1 ;1 [00] [10] <-- out 7 + brcc bitstuff7 ;1 [01] + ld shift, y+ ;2 [02+03] + dec cnt ;1 [04] + brne txBitLoop ;1 [05] +makeSE0: + cbr x1, USBMASK ;1 [06] prepare SE0 [spec says EOP may be 19 to 23 cycles] + lds x2, usbNewDeviceAddr;2 [07+08] + lsl x2 ;1 [09] we compare with left shifted address +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + out USBOUT, x1 ;1 [00] [10] <-- out SE0-- from now 2 bits==20 cycl. until bus idle + subi YL, 20 + 2 ;1 [01] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;1 [02] + breq skipAddrAssign ;1 [03] + sts usbDeviceAddr, x2 ;2 [04+05] if not skipped: SE0 is one cycle longer +;---------------------------------------------------------------------------- +;end of usbDeviceAddress transfer +skipAddrAssign: ;- [03/04] + ldi x2, 1< 10.6666666 cycles per bit, 85.333333333 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt + push YL ;[-25] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-23] + push YL ;[-22] + push YH ;[-20] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-15] + rjmp foundK ;[-14] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-12] +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push bitcnt ;[-12] +; [---] ;[-11] + lds YL, usbInputBufOffset;[-10] +; [---] ;[-9] + clr YH ;[-8] + subi YL, lo8(-(usbRxBuf));[-7] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-6] [rx loop init] + push shift ;[-5] +; [---] ;[-4] + ldi bitcnt, 0x55 ;[-3] [rx loop init] + sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early) + rjmp haveTwoBitsK ;[-1] + pop shift ;[0] undo the push from before + pop bitcnt ;[2] undo the push from before + rjmp waitForK ;[4] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 21 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[1] + push x2 ;[3] + push x3 ;[5] + ldi shift, 0 ;[7] + ldi x3, 1<<4 ;[8] [rx loop init] first sample is inverse bit, compensate that + push x4 ;[9] == leap + + in x1, USBIN ;[11] <-- sample bit 0 + andi x1, USBMASK ;[12] + bst x1, USBMINUS ;[13] + bld shift, 7 ;[14] + push cnt ;[15] + ldi leap, 0 ;[17] [rx loop init] + ldi cnt, USB_BUFSIZE;[18] [rx loop init] + rjmp rxbit1 ;[19] arrives at [21] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- + +; duration of unstuffing code should be 10.66666667 cycles. We adjust "leap" +; accordingly to approximate this value in the long run. + +unstuff6: + andi x2, USBMASK ;[03] + ori x3, 1<<6 ;[04] will not be shifted any more + andi shift, ~0x80;[05] + mov x1, x2 ;[06] sampled bit 7 is actually re-sampled bit 6 + subi leap, -1 ;[07] total duration = 11 bits -> subtract 1/3 + rjmp didUnstuff6 ;[08] + +unstuff7: + ori x3, 1<<7 ;[09] will not be shifted any more + in x2, USBIN ;[00] [10] re-sample bit 7 + andi x2, USBMASK ;[01] + andi shift, ~0x80;[02] + subi leap, 2 ;[03] total duration = 10 bits -> add 1/3 + rjmp didUnstuff7 ;[04] + +unstuffEven: + ori x3, 1<<6 ;[09] will be shifted right 6 times for bit 0 + in x1, USBIN ;[00] [10] + andi shift, ~0x80;[01] + andi x1, USBMASK ;[02] + breq se0 ;[03] + subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3 + nop2 ;[05] + rjmp didUnstuffE ;[06] + +unstuffOdd: + ori x3, 1<<5 ;[09] will be shifted right 4 times for bit 1 + in x2, USBIN ;[00] [10] + andi shift, ~0x80;[01] + andi x2, USBMASK ;[02] + breq se0 ;[03] + subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3 + nop2 ;[05] + rjmp didUnstuffO ;[06] + +rxByteLoop: + andi x1, USBMASK ;[03] + eor x2, x1 ;[04] + subi leap, 1 ;[05] + brpl skipLeap ;[06] + subi leap, -3 ;1 one leap cycle every 3rd byte -> 85 + 1/3 cycles per byte + nop ;1 +skipLeap: + subi x2, 1 ;[08] + ror shift ;[09] +didUnstuff6: + cpi shift, 0xfc ;[10] + in x2, USBIN ;[00] [11] <-- sample bit 7 + brcc unstuff6 ;[01] + andi x2, USBMASK ;[02] + eor x1, x2 ;[03] + subi x1, 1 ;[04] + ror shift ;[05] +didUnstuff7: + cpi shift, 0xfc ;[06] + brcc unstuff7 ;[07] + eor x3, shift ;[08] reconstruct: x3 is 1 at bit locations we changed, 0 at others + st y+, x3 ;[09] store data +rxBitLoop: + in x1, USBIN ;[00] [11] <-- sample bit 0/2/4 + andi x1, USBMASK ;[01] + eor x2, x1 ;[02] + andi x3, 0x3f ;[03] topmost two bits reserved for 6 and 7 + subi x2, 1 ;[04] + ror shift ;[05] + cpi shift, 0xfc ;[06] + brcc unstuffEven ;[07] +didUnstuffE: + lsr x3 ;[08] + lsr x3 ;[09] +rxbit1: + in x2, USBIN ;[00] [10] <-- sample bit 1/3/5 + andi x2, USBMASK ;[01] + breq se0 ;[02] + eor x1, x2 ;[03] + subi x1, 1 ;[04] + ror shift ;[05] + cpi shift, 0xfc ;[06] + brcc unstuffOdd ;[07] +didUnstuffO: + subi bitcnt, 0xab;[08] == addi 0x55, 0x55 = 0x100/3 + brcs rxBitLoop ;[09] + + subi cnt, 1 ;[10] + in x1, USBIN ;[00] [11] <-- sample bit 6 + brcc rxByteLoop ;[01] + rjmp overflow + +macro POP_STANDARD ; 14 cycles + pop cnt + pop x4 + pop x3 + pop x2 + pop x1 + pop shift + pop bitcnt + endm +macro POP_RETI ; 7 cycles + pop YH + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies + +bitstuffN: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] + nop2 ;[7] + nop ;[9] + out USBOUT, x1 ;[10] <-- out + rjmp didStuffN ;[0] + +bitstuff6: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] Carry is zero due to brcc + rol shift ;[7] compensate for ror shift at branch destination + rjmp didStuff6 ;[8] + +bitstuff7: + ldi x2, 0 ;[2] Carry is zero due to brcc + rjmp didStuff7 ;[3] + + +sendNakAndReti: + ldi x3, USBPID_NAK ;[-18] + rjmp sendX3AndReti ;[-17] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov x3, cnt ;[-16] +sendX3AndReti: + ldi YL, 20 ;[-15] x3==r20 address is 20 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +;We don't match the transfer rate exactly (don't insert leap cycles every third +;byte) because the spec demands only 1.5% precision anyway. +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-7] <- acquire bus +; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-6] exor mask + ldi shift, 0x80 ;[-5] sync byte is first byte sent +txByteLoop: + ldi bitcnt, 0x35 ;[-4] [6] binary 0011 0101 +txBitLoop: + sbrs shift, 0 ;[-3] [7] + eor x1, x4 ;[-2] [8] + out USBOUT, x1 ;[-1] [9] <-- out N + ror shift ;[0] [10] + ror x2 ;[1] +didStuffN: + cpi x2, 0xfc ;[2] + brcc bitstuffN ;[3] + lsr bitcnt ;[4] + brcc txBitLoop ;[5] + brne txBitLoop ;[6] + + sbrs shift, 0 ;[7] + eor x1, x4 ;[8] +didStuff6: + out USBOUT, x1 ;[-1] [9] <-- out 6 + ror shift ;[0] [10] + ror x2 ;[1] + cpi x2, 0xfc ;[2] + brcc bitstuff6 ;[3] + ror shift ;[4] +didStuff7: + ror x2 ;[5] + sbrs x2, 7 ;[6] + eor x1, x4 ;[7] + nop ;[8] + cpi x2, 0xfc ;[9] + out USBOUT, x1 ;[-1][10] <-- out 7 + brcc bitstuff7 ;[0] [11] + ld shift, y+ ;[1] + dec cnt ;[3] + brne txByteLoop ;[4] +;make SE0: + cbr x1, USBMASK ;[5] prepare SE0 [spec says EOP may be 21 to 25 cycles] + lds x2, usbNewDeviceAddr;[6] + lsl x2 ;[8] we compare with left shifted address + subi YL, 20 + 2 ;[9] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[10] + out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[0] + sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< max 52 cycles interrupt disable +;max stack usage: [ret(2), r0, SREG, YL, YH, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 16.5 MHz -> 11 cycles per bit +; 16.3125 MHz < F_CPU < 16.6875 MHz (+/- 1.1%) +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG [sofError], r0, YH, shift, x1, x2, x3, x4, cnt + push YL ;[-23] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-21] + push YL ;[-20] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-15] + rjmp foundK ;[-14] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-12] +;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling] +;we have 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push r0 ;[-12] +; [---] ;[-11] + push YH ;[-10] +; [---] ;[-9] + lds YL, usbInputBufOffset;[-8] +; [---] ;[-7] + clr YH ;[-6] + subi YL, lo8(-(usbRxBuf));[-5] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-4] [rx loop init] + mov r0, x2 ;[-3] [rx loop init] + sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early) + rjmp haveTwoBitsK ;[-1] + pop YH ;[0] undo the pushes from before + pop r0 ;[2] + rjmp waitForK ;[4] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 22 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: ;[1] + push shift ;[1] + push x1 ;[3] + push x2 ;[5] + push x3 ;[7] + ldi shift, 0xff ;[9] [rx loop init] + ori x3, 0xff ;[10] [rx loop init] == ser x3, clear zero flag + + in x1, USBIN ;[11] <-- sample bit 0 + bst x1, USBMINUS ;[12] + bld shift, 0 ;[13] + push x4 ;[14] == phase +; [---] ;[15] + push cnt ;[16] +; [---] ;[17] + ldi phase, 0 ;[18] [rx loop init] + ldi cnt, USB_BUFSIZE;[19] [rx loop init] + rjmp rxbit1 ;[20] +; [---] ;[21] + +;---------------------------------------------------------------------------- +; Receiver loop (numbers in brackets are cycles within byte after instr) +;---------------------------------------------------------------------------- +/* +byte oriented operations done during loop: +bit 0: store data +bit 1: SE0 check +bit 2: overflow check +bit 3: catch up +bit 4: rjmp to achieve conditional jump range +bit 5: PLL +bit 6: catch up +bit 7: jump, fixup bitstuff +; 87 [+ 2] cycles +------------------------------------------------------------------ +*/ +continueWithBit5: + in x2, USBIN ;[055] <-- bit 5 + eor r0, x2 ;[056] + or phase, r0 ;[057] + sbrc phase, USBMINUS ;[058] + lpm ;[059] optional nop3; modifies r0 + in phase, USBIN ;[060] <-- phase + eor x1, x2 ;[061] + bst x1, USBMINUS ;[062] + bld shift, 5 ;[063] + andi shift, 0x3f ;[064] + in x1, USBIN ;[065] <-- bit 6 + breq unstuff5 ;[066] *** unstuff escape + eor phase, x1 ;[067] + eor x2, x1 ;[068] + bst x2, USBMINUS ;[069] + bld shift, 6 ;[070] +didUnstuff6: ;[ ] + in r0, USBIN ;[071] <-- phase + cpi shift, 0x02 ;[072] + brlo unstuff6 ;[073] *** unstuff escape +didUnstuff5: ;[ ] + nop2 ;[074] +; [---] ;[075] + in x2, USBIN ;[076] <-- bit 7 + eor x1, x2 ;[077] + bst x1, USBMINUS ;[078] + bld shift, 7 ;[079] +didUnstuff7: ;[ ] + eor r0, x2 ;[080] + or phase, r0 ;[081] + in r0, USBIN ;[082] <-- phase + cpi shift, 0x04 ;[083] + brsh rxLoop ;[084] +; [---] ;[085] +unstuff7: ;[ ] + andi x3, ~0x80 ;[085] + ori shift, 0x80 ;[086] + in x2, USBIN ;[087] <-- sample stuffed bit 7 + nop ;[088] + rjmp didUnstuff7 ;[089] +; [---] ;[090] + ;[080] + +unstuff5: ;[067] + eor phase, x1 ;[068] + andi x3, ~0x20 ;[069] + ori shift, 0x20 ;[070] + in r0, USBIN ;[071] <-- phase + mov x2, x1 ;[072] + nop ;[073] + nop2 ;[074] +; [---] ;[075] + in x1, USBIN ;[076] <-- bit 6 + eor r0, x1 ;[077] + or phase, r0 ;[078] + eor x2, x1 ;[079] + bst x2, USBMINUS ;[080] + bld shift, 6 ;[081] no need to check bitstuffing, we just had one + in r0, USBIN ;[082] <-- phase + rjmp didUnstuff5 ;[083] +; [---] ;[084] + ;[074] + +unstuff6: ;[074] + andi x3, ~0x40 ;[075] + in x1, USBIN ;[076] <-- bit 6 again + ori shift, 0x40 ;[077] + nop2 ;[078] +; [---] ;[079] + rjmp didUnstuff6 ;[080] +; [---] ;[081] + ;[071] + +unstuff0: ;[013] + eor r0, x2 ;[014] + or phase, r0 ;[015] + andi x2, USBMASK ;[016] check for SE0 + in r0, USBIN ;[017] <-- phase + breq didUnstuff0 ;[018] direct jump to se0 would be too long + andi x3, ~0x01 ;[019] + ori shift, 0x01 ;[020] + mov x1, x2 ;[021] mov existing sample + in x2, USBIN ;[022] <-- bit 1 again + rjmp didUnstuff0 ;[023] +; [---] ;[024] + ;[014] + +unstuff1: ;[024] + eor r0, x1 ;[025] + or phase, r0 ;[026] + andi x3, ~0x02 ;[027] + in r0, USBIN ;[028] <-- phase + ori shift, 0x02 ;[029] + mov x2, x1 ;[030] + rjmp didUnstuff1 ;[031] +; [---] ;[032] + ;[022] + +unstuff2: ;[035] + eor r0, x2 ;[036] + or phase, r0 ;[037] + andi x3, ~0x04 ;[038] + in r0, USBIN ;[039] <-- phase + ori shift, 0x04 ;[040] + mov x1, x2 ;[041] + rjmp didUnstuff2 ;[042] +; [---] ;[043] + ;[033] + +unstuff3: ;[043] + in x2, USBIN ;[044] <-- bit 3 again + eor r0, x2 ;[045] + or phase, r0 ;[046] + andi x3, ~0x08 ;[047] + ori shift, 0x08 ;[048] + nop ;[049] + in r0, USBIN ;[050] <-- phase + rjmp didUnstuff3 ;[051] +; [---] ;[052] + ;[042] + +unstuff4: ;[053] + andi x3, ~0x10 ;[054] + in x1, USBIN ;[055] <-- bit 4 again + ori shift, 0x10 ;[056] + rjmp didUnstuff4 ;[057] +; [---] ;[058] + ;[048] + +rxLoop: ;[085] + eor x3, shift ;[086] reconstruct: x3 is 0 at bit locations we changed, 1 at others + in x1, USBIN ;[000] <-- bit 0 + st y+, x3 ;[001] +; [---] ;[002] + eor r0, x1 ;[003] + or phase, r0 ;[004] + eor x2, x1 ;[005] + in r0, USBIN ;[006] <-- phase + ser x3 ;[007] + bst x2, USBMINUS ;[008] + bld shift, 0 ;[009] + andi shift, 0xf9 ;[010] +rxbit1: ;[ ] + in x2, USBIN ;[011] <-- bit 1 + breq unstuff0 ;[012] *** unstuff escape + andi x2, USBMASK ;[013] SE0 check for bit 1 +didUnstuff0: ;[ ] Z only set if we detected SE0 in bitstuff + breq se0 ;[014] + eor r0, x2 ;[015] + or phase, r0 ;[016] + in r0, USBIN ;[017] <-- phase + eor x1, x2 ;[018] + bst x1, USBMINUS ;[019] + bld shift, 1 ;[020] + andi shift, 0xf3 ;[021] +didUnstuff1: ;[ ] + in x1, USBIN ;[022] <-- bit 2 + breq unstuff1 ;[023] *** unstuff escape + eor r0, x1 ;[024] + or phase, r0 ;[025] + subi cnt, 1 ;[026] overflow check + brcs overflow ;[027] + in r0, USBIN ;[028] <-- phase + eor x2, x1 ;[029] + bst x2, USBMINUS ;[030] + bld shift, 2 ;[031] + andi shift, 0xe7 ;[032] +didUnstuff2: ;[ ] + in x2, USBIN ;[033] <-- bit 3 + breq unstuff2 ;[034] *** unstuff escape + eor r0, x2 ;[035] + or phase, r0 ;[036] + eor x1, x2 ;[037] + bst x1, USBMINUS ;[038] + in r0, USBIN ;[039] <-- phase + bld shift, 3 ;[040] + andi shift, 0xcf ;[041] +didUnstuff3: ;[ ] + breq unstuff3 ;[042] *** unstuff escape + nop ;[043] + in x1, USBIN ;[044] <-- bit 4 + eor x2, x1 ;[045] + bst x2, USBMINUS ;[046] + bld shift, 4 ;[047] +didUnstuff4: ;[ ] + eor r0, x1 ;[048] + or phase, r0 ;[049] + in r0, USBIN ;[050] <-- phase + andi shift, 0x9f ;[051] + breq unstuff4 ;[052] *** unstuff escape + rjmp continueWithBit5;[053] +; [---] ;[054] + +macro POP_STANDARD ; 16 cycles + pop cnt + pop x4 + pop x3 + pop x2 + pop x1 + pop shift + pop YH + pop r0 + endm +macro POP_RETI ; 5 cycles + pop YL + out SREG, YL + pop YL + endm + +#include "asmcommon.inc" + + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies + +bitstuff7: + eor x1, x4 ;[4] + ldi x2, 0 ;[5] + nop2 ;[6] C is zero (brcc) + rjmp didStuff7 ;[8] + +bitstuffN: + eor x1, x4 ;[5] + ldi x2, 0 ;[6] + lpm ;[7] 3 cycle NOP, modifies r0 + out USBOUT, x1 ;[10] <-- out + rjmp didStuffN ;[0] + +#define bitStatus x3 + +sendNakAndReti: + ldi cnt, USBPID_NAK ;[-19] + rjmp sendCntAndReti ;[-18] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov r0, cnt ;[-16] + ldi YL, 0 ;[-15] R0 address is 0 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-7] <- acquire bus +; need not init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-6] exor mask + ldi shift, 0x80 ;[-5] sync byte is first byte sent + ldi bitStatus, 0xff ;[-4] init bit loop counter, works for up to 12 bytes +byteloop: +bitloop: + sbrs shift, 0 ;[8] [-3] + eor x1, x4 ;[9] [-2] + out USBOUT, x1 ;[10] [-1] <-- out + ror shift ;[0] + ror x2 ;[1] +didStuffN: + cpi x2, 0xfc ;[2] + brcc bitstuffN ;[3] + nop ;[4] + subi bitStatus, 37 ;[5] 256 / 7 ~=~ 37 + brcc bitloop ;[6] when we leave the loop, bitStatus has almost the initial value + sbrs shift, 0 ;[7] + eor x1, x4 ;[8] + ror shift ;[9] +didStuff7: + out USBOUT, x1 ;[10] <-- out + ror x2 ;[0] + cpi x2, 0xfc ;[1] + brcc bitstuff7 ;[2] + ld shift, y+ ;[3] + dec cnt ;[5] + brne byteloop ;[6] +;make SE0: + cbr x1, USBMASK ;[7] prepare SE0 [spec says EOP may be 21 to 25 cycles] + lds x2, usbNewDeviceAddr;[8] + lsl x2 ;[10] we compare with left shifted address + out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + subi YL, 2 ;[0] Only assign address on data packets, not ACK/NAK in r0 + sbci YH, 0 ;[1] + breq skipAddrAssign ;[2] + sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< 12 cycles per bit +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts +;register use in receive loop to receive the data bytes: +; shift assembles the byte currently being received +; x1 holds the D+ and D- line state +; x2 holds the previous line state +; cnt holds the number of bytes left in the receive buffer +; x3 holds the higher crc byte (see algorithm below) +; x4 is used as temporary register for the crc algorithm +; x5 is used for unstuffing: when unstuffing the last received bit is inverted in shift (to prevent further +; unstuffing calls. In the same time the corresponding bit in x5 is cleared to mark the bit as beening iverted +; zl lower crc value and crc table index +; zh used for crc table accesses + +;-------------------------------------------------------------------------------------------------------------- +; CRC mods: +; table driven crc checker, Z points to table in prog space +; ZL is the lower crc byte, x3 is the higher crc byte +; x4 is used as temp register to store different results +; the initialization of the crc register is not 0xFFFF but 0xFE54. This is because during the receipt of the +; first data byte an virtual zero data byte is added to the crc register, this results in the correct initial +; value of 0xFFFF at beginning of the second data byte before the first data byte is added to the crc. +; The magic number 0xFE54 results form the crc table: At tabH[0x54] = 0xFF = crcH (required) and +; tabL[0x54] = 0x01 -> crcL = 0x01 xor 0xFE = 0xFF +; bitcnt is renamed to x5 and is used for unstuffing purposes, the unstuffing works like in the 12MHz version +;-------------------------------------------------------------------------------------------------------------- +; CRC algorithm: +; The crc register is formed by x3 (higher byte) and ZL (lower byte). The algorithm uses a 'reversed' form +; i.e. that it takes the least significant bit first and shifts to the right. So in fact the highest order +; bit seen from the polynomial devision point of view is the lsb of ZL. (If this sounds strange to you i +; propose a research on CRC :-) ) +; Each data byte received is xored to ZL, the lower crc byte. This byte now builds the crc +; table index. Next the new high byte is loaded from the table and stored in x4 until we have space in x3 +; (its destination). +; Afterwards the lower table is loaded from the table and stored in ZL (the old index is overwritten as +; we don't need it anymore. In fact this is a right shift by 8 bits.) Now the old crc high value is xored +; to ZL, this is the second shift of the old crc value. Now x4 (the temp reg) is moved to x3 and the crc +; calculation is done. +; Prior to the first byte the two CRC register have to be initialized to 0xFFFF (as defined in usb spec) +; however the crc engine also runs during the receipt of the first byte, therefore x3 and zl are initialized +; to a magic number which results in a crc value of 0xFFFF after the first complete byte. +; +; This algorithm is split into the extra cycles of the different bits: +; bit7: XOR the received byte to ZL +; bit5: load the new high byte to x4 +; bit6: load the lower xor byte from the table, xor zl and x3, store result in zl (=the new crc low value) +; move x4 (the new high byte) to x3, the crc value is ready +; + + +macro POP_STANDARD ; 18 cycles + pop ZH + pop ZL + pop cnt + pop x5 + pop x3 + pop x2 + pop x1 + pop shift + pop x4 + endm +macro POP_RETI ; 7 cycles + pop YH + pop YL + out SREG, YL + pop YL + endm + +macro CRC_CLEANUP_AND_CHECK + ; the last byte has already been xored with the lower crc byte, we have to do the table lookup and xor + ; x3 is the higher crc byte, zl the lower one + ldi ZH, hi8(usbCrcTableHigh);[+1] get the new high byte from the table + lpm x2, Z ;[+2][+3][+4] + ldi ZH, hi8(usbCrcTableLow);[+5] get the new low xor byte from the table + lpm ZL, Z ;[+6][+7][+8] + eor ZL, x3 ;[+7] xor the old high byte with the value from the table, x2:ZL now holds the crc value + cpi ZL, 0x01 ;[+8] if the crc is ok we have a fixed remainder value of 0xb001 in x2:ZL (see usb spec) + brne ignorePacket ;[+9] detected a crc fault -> paket is ignored and retransmitted by the host + cpi x2, 0xb0 ;[+10] + brne ignorePacket ;[+11] detected a crc fault -> paket is ignored and retransmitted by the host + endm + + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG, YH, [sofError], x4, shift, x1, x2, x3, x5, cnt, ZL, ZH + push YL ;[-28] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-26] + push YL ;[-25] + push YH ;[-23] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-17] + rjmp foundK ;[-16] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-15] +;{3, 5} after falling D- edge, average delay: 4 cycles +;bit0 should be at 30 (2.5 bits) for center sampling. Currently at 4 so 26 cylces till bit 0 sample +;use 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push x4 ;[-14] +; [---] ;[-13] + lds YL, usbInputBufOffset;[-12] used to toggle the two usb receive buffers +; [---] ;[-11] + clr YH ;[-10] + subi YL, lo8(-(usbRxBuf));[-9] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-8] [rx loop init] + push shift ;[-7] +; [---] ;[-6] + ldi shift, 0x80 ;[-5] the last bit is the end of byte marker for the pid receiver loop + clc ;[-4] the carry has to be clear for receipt of pid bit 0 + sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early) + rjmp haveTwoBitsK ;[-2] + pop shift ;[-1] undo the push from before + pop x4 ;[1] + rjmp waitForK ;[3] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 24 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[0] + push x2 ;[2] + push x3 ;[4] crc high byte + ldi x2, 1< jump back and store the byte + ori shift, 0x01 ;[11] invert the last received bit to prevent furhter unstuffing + in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + andi x5, 0xFE ;[1] mark this bit as inverted (will be corrected before storing shift) + eor x1, x2 ;[2] x1 and x2 have to be different because the stuff bit is always a zero + andi x1, USBMASK ;[3] mask the interesting bits + breq stuffErr ;[4] if the stuff bit is a 1-bit something went wrong + mov x1, x2 ;[5] the next bit expects the last state to be in x1 + rjmp didunstuff0 ;[6] + ;[7] jump delay of rjmp didunstuffX + +unstuff1: ;[11] this is the jump delay of breq unstuffX + in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + ori shift, 0x02 ;[1] invert the last received bit to prevent furhter unstuffing + andi x5, 0xFD ;[2] mark this bit as inverted (will be corrected before storing shift) + eor x2, x1 ;[3] x1 and x2 have to be different because the stuff bit is always a zero + andi x2, USBMASK ;[4] mask the interesting bits + breq stuffErr ;[5] if the stuff bit is a 1-bit something went wrong + mov x2, x1 ;[6] the next bit expects the last state to be in x2 + nop2 ;[7] + ;[8] + rjmp didunstuff1 ;[9] + ;[10] jump delay of rjmp didunstuffX + +unstuff2: ;[9] this is the jump delay of breq unstuffX + ori shift, 0x04 ;[10] invert the last received bit to prevent furhter unstuffing + andi x5, 0xFB ;[11] mark this bit as inverted (will be corrected before storing shift) + in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + eor x1, x2 ;[1] x1 and x2 have to be different because the stuff bit is always a zero + andi x1, USBMASK ;[2] mask the interesting bits + breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong + mov x1, x2 ;[4] the next bit expects the last state to be in x1 + nop2 ;[5] + ;[6] + rjmp didunstuff2 ;[7] + ;[8] jump delay of rjmp didunstuffX + +unstuff3: ;[9] this is the jump delay of breq unstuffX + ori shift, 0x08 ;[10] invert the last received bit to prevent furhter unstuffing + andi x5, 0xF7 ;[11] mark this bit as inverted (will be corrected before storing shift) + in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors + eor x2, x1 ;[1] x1 and x2 have to be different because the stuff bit is always a zero + andi x2, USBMASK ;[2] mask the interesting bits + breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong + mov x2, x1 ;[4] the next bit expects the last state to be in x2 + nop2 ;[5] + ;[6] + rjmp didunstuff3 ;[7] + ;[8] jump delay of rjmp didunstuffX + + + +; the include has to be here due to branch distance restirctions +#define __USE_CRC__ +#include "asmcommon.inc" + + + +; USB spec says: +; idle = J +; J = (D+ = 0), (D- = 1) +; K = (D+ = 1), (D- = 0) +; Spec allows 7.5 bit times from EOP to SOP for replies +; 7.5 bit times is 90 cycles. ...there is plenty of time + + +sendNakAndReti: + ldi x3, USBPID_NAK ;[-18] + rjmp sendX3AndReti ;[-17] +sendAckAndReti: + ldi cnt, USBPID_ACK ;[-17] +sendCntAndReti: + mov x3, cnt ;[-16] +sendX3AndReti: + ldi YL, 20 ;[-15] x3==r20 address is 20 + ldi YH, 0 ;[-14] + ldi cnt, 2 ;[-13] +; rjmp usbSendAndReti fallthrough + +;usbSend: +;pointer to data in 'Y' +;number of bytes in 'cnt' -- including sync byte [range 2 ... 12] +;uses: x1...x4, btcnt, shift, cnt, Y +;Numbers in brackets are time since first bit of sync pattern is sent + +usbSendAndReti: ; 12 cycles until SOP + in x2, USBDDR ;[-12] + ori x2, USBMASK ;[-11] + sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups) + in x1, USBOUT ;[-8] port mirror for tx loop + out USBDDR, x2 ;[-6] <- acquire bus + ldi x2, 0 ;[-6] init x2 (bitstuff history) because sync starts with 0 + ldi x4, USBMASK ;[-5] exor mask + ldi shift, 0x80 ;[-4] sync byte is first byte sent +txByteLoop: + ldi bitcnt, 0x40 ;[-3]=[9] binary 01000000 +txBitLoop: ; the loop sends the first 7 bits of the byte + sbrs shift, 0 ;[-2]=[10] if we have to send a 1 don't change the line state + eor x1, x4 ;[-1]=[11] + out USBOUT, x1 ;[0] + ror shift ;[1] + ror x2 ;[2] transfers the last sent bit to the stuffing history +didStuffN: + nop ;[3] + nop ;[4] + cpi x2, 0xfc ;[5] if we sent six consecutive ones + brcc bitstuffN ;[6] + lsr bitcnt ;[7] + brne txBitLoop ;[8] restart the loop while the 1 is still in the bitcount + +; transmit bit 7 + sbrs shift, 0 ;[9] + eor x1, x4 ;[10] +didStuff7: + ror shift ;[11] + out USBOUT, x1 ;[0] transfer bit 7 to the pins + ror x2 ;[1] move the bit into the stuffing history + cpi x2, 0xfc ;[2] + brcc bitstuff7 ;[3] + ld shift, y+ ;[4] get next byte to transmit + dec cnt ;[5] decrement byte counter + brne txByteLoop ;[7] if we have more bytes start next one + ;[8] branch delay + +;make SE0: + cbr x1, USBMASK ;[8] prepare SE0 [spec says EOP may be 25 to 30 cycles] + lds x2, usbNewDeviceAddr;[9] + lsl x2 ;[11] we compare with left shifted address + out USBOUT, x1 ;[0] <-- out SE0 -- from now 2 bits = 24 cycles until bus idle + subi YL, 20 + 2 ;[1] Only assign address on data packets, not ACK/NAK in x3 + sbci YH, 0 ;[2] +;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm: +;set address only after data packet was sent, not after handshake + breq skipAddrAssign ;[3] + sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer +skipAddrAssign: +;end of usbDeviceAddress transfer + ldi x2, 1< +int main (int argc, char **argv) +{ + int i, j; + for (i=0; i<512; i++){ + unsigned short crc = i & 0xff; + for(j=0; j<8; j++) crc = (crc >> 1) ^ ((crc & 1) ? 0xa001 : 0); + if((i & 7) == 0) printf("\n.byte "); + printf("0x%02x, ", (i > 0xff ? (crc >> 8) : crc) & 0xff); + if(i == 255) printf("\n"); + } + return 0; +} + +// Use the following algorithm to compute CRC values: +ushort computeCrc(uchar *msg, uchar msgLen) +{ + uchar i; + ushort crc = 0xffff; + for(i = 0; i < msgLen; i++) + crc = usbCrcTable16[lo8(crc) ^ msg[i]] ^ hi8(crc); + return crc; +} +*/ + +.balign 256 +usbCrcTableLow: +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41 +.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 + +; .balign 256 +usbCrcTableHigh: +.byte 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2 +.byte 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04 +.byte 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E +.byte 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8 +.byte 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A +.byte 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC +.byte 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6 +.byte 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10 +.byte 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32 +.byte 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4 +.byte 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE +.byte 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38 +.byte 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA +.byte 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C +.byte 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26 +.byte 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0 +.byte 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62 +.byte 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4 +.byte 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE +.byte 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68 +.byte 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA +.byte 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C +.byte 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76 +.byte 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0 +.byte 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92 +.byte 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54 +.byte 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E +.byte 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98 +.byte 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A +.byte 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C +.byte 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86 +.byte 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 + diff --git a/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm20.inc b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm20.inc new file mode 100644 index 0000000..303abaf --- /dev/null +++ b/adb2usb/uart2usb/vusb-20100715/usbdrv/usbdrvasm20.inc @@ -0,0 +1,360 @@ +/* Name: usbdrvasm20.inc + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Jeroen Benschop + * Based on usbdrvasm16.inc from Christian Starkjohann + * Creation Date: 2008-03-05 + * Tabsize: 4 + * Copyright: (c) 2008 by Jeroen Benschop and OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * Revision: $Id: usbdrvasm20.inc 740 2009-04-13 18:23:31Z cs $ + */ + +/* Do not link this file! Link usbdrvasm.S instead, which includes the + * appropriate implementation! + */ + +/* +General Description: +This file is the 20 MHz version of the asssembler part of the USB driver. It +requires a 20 MHz crystal (not a ceramic resonator and not a calibrated RC +oscillator). + +See usbdrv.h for a description of the entire driver. + +Since almost all of this code is timing critical, don't change unless you +really know what you are doing! Many parts require not only a maximum number +of CPU cycles, but even an exact number of cycles! +*/ + +#define leap2 x3 +#ifdef __IAR_SYSTEMS_ASM__ +#define nextInst $+2 +#else +#define nextInst .+0 +#endif + +;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes +;nominal frequency: 20 MHz -> 13.333333 cycles per bit, 106.666667 cycles per byte +; Numbers in brackets are clocks counted from center of last sync bit +; when instruction starts +;register use in receive loop: +; shift assembles the byte currently being received +; x1 holds the D+ and D- line state +; x2 holds the previous line state +; x4 (leap) is used to add a leap cycle once every three bytes received +; X3 (leap2) is used to add a leap cycle once every three stuff bits received +; bitcnt is used to determine when a stuff bit is due +; cnt holds the number of bytes left in the receive buffer + +USB_INTR_VECTOR: +;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt + push YL ;[-28] push only what is necessary to sync with edge ASAP + in YL, SREG ;[-26] + push YL ;[-25] + push YH ;[-23] +;---------------------------------------------------------------------------- +; Synchronize with sync pattern: +;---------------------------------------------------------------------------- +;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K] +;sync up with J to K edge during sync pattern -- use fastest possible loops +;The first part waits at most 1 bit long since we must be in sync pattern. +;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to +;waitForJ, ensure that this prerequisite is met. +waitForJ: + inc YL + sbis USBIN, USBMINUS + brne waitForJ ; just make sure we have ANY timeout +waitForK: +;The following code results in a sampling window of < 1/4 bit which meets the spec. + sbis USBIN, USBMINUS ;[-19] + rjmp foundK ;[-18] + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK + sbis USBIN, USBMINUS + rjmp foundK +#if USB_COUNT_SOF + lds YL, usbSofCount + inc YL + sts usbSofCount, YL +#endif /* USB_COUNT_SOF */ +#ifdef USB_SOF_HOOK + USB_SOF_HOOK +#endif + rjmp sofError +foundK: ;[-16] +;{3, 5} after falling D- edge, average delay: 4 cycles +;bit0 should be at 34 for center sampling. Currently at 4 so 30 cylces till bit 0 sample +;use 1 bit time for setup purposes, then sample again. Numbers in brackets +;are cycles from center of first sync (double K) bit after the instruction + push bitcnt ;[-16] +; [---] ;[-15] + lds YL, usbInputBufOffset;[-14] +; [---] ;[-13] + clr YH ;[-12] + subi YL, lo8(-(usbRxBuf));[-11] [rx loop init] + sbci YH, hi8(-(usbRxBuf));[-10] [rx loop init] + push shift ;[-9] +; [---] ;[-8] + ldi shift,0x40 ;[-7] set msb to "1" so processing bit7 can be detected + nop2 ;[-6] +; [---] ;[-5] + ldi bitcnt, 5 ;[-4] [rx loop init] + sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early) + rjmp haveTwoBitsK ;[-2] + pop shift ;[-1] undo the push from before + pop bitcnt ;[1] + rjmp waitForK ;[3] this was not the end of sync, retry +; The entire loop from waitForK until rjmp waitForK above must not exceed two +; bit times (= 27 cycles). + +;---------------------------------------------------------------------------- +; push more registers and initialize values while we sample the first bits: +;---------------------------------------------------------------------------- +haveTwoBitsK: + push x1 ;[0] + push x2 ;[2] + push x3 ;[4] (leap2) + ldi leap2, 0x55 ;[6] add leap cycle on 2nd,5th,8th,... stuff bit + push x4 ;[7] == leap + ldi leap, 0x55 ;[9] skip leap cycle on 2nd,5th,8th,... byte received + push cnt ;[10] + ldi cnt, USB_BUFSIZE ;[12] [rx loop init] + ldi x2, 1< +#ifndef __IAR_SYSTEMS_ASM__ +# include +#endif + +#define __attribute__(arg) /* not supported on IAR */ + +#ifdef __IAR_SYSTEMS_ASM__ +# define __ASSEMBLER__ /* IAR does not define standard macro for asm */ +#endif + +#ifdef __HAS_ELPM__ +# define PROGMEM __farflash +#else +# define PROGMEM __flash +#endif + +#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) + +/* The following definitions are not needed by the driver, but may be of some + * help if you port a gcc based project to IAR. + */ +#define cli() __disable_interrupt() +#define sei() __enable_interrupt() +#define wdt_reset() __watchdog_reset() +#define _BV(x) (1 << (x)) + +/* assembler compatibility macros */ +#define nop2 rjmp $+2 /* jump to next instruction */ +#define XL r26 +#define XH r27 +#define YL r28 +#define YH r29 +#define ZL r30 +#define ZH r31 +#define lo8(x) LOW(x) +#define hi8(x) (((x)>>8) & 0xff) /* not HIGH to allow XLINK to make a proper range check */ + +/* Depending on the device you use, you may get problems with the way usbdrv.h + * handles the differences between devices. Since IAR does not use #defines + * for MCU registers, we can't check for the existence of a particular + * register with an #ifdef. If the autodetection mechanism fails, include + * definitions for the required USB_INTR_* macros in your usbconfig.h. See + * usbconfig-prototype.h and usbdrv.h for details. + */ + +/* ------------------------------------------------------------------------- */ +#elif __CODEVISIONAVR__ /* check for CodeVision AVR */ +/* ------------------------------------------------------------------------- */ +/* This port is not working (yet) */ + +/* #define F_CPU _MCU_CLOCK_FREQUENCY_ seems to be defined automatically */ + +#include +#include + +#define __attribute__(arg) /* not supported on IAR */ + +#define PROGMEM __flash +#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr)) + +#ifndef __ASSEMBLER__ +static inline void cli(void) +{ + #asm("cli"); +} +static inline void sei(void) +{ + #asm("sei"); +} +#endif +#define _delay_ms(t) delay_ms(t) +#define _BV(x) (1 << (x)) +#define USB_CFG_USE_SWITCH_STATEMENT 1 /* macro for if() cascase fails for unknown reason */ + +#define macro .macro +#define endm .endmacro +#define nop2 rjmp .+0 /* jump to next instruction */ + +/* ------------------------------------------------------------------------- */ +#else /* default development environment is avr-gcc/avr-libc */ +/* ------------------------------------------------------------------------- */ + +#include +#ifdef __ASSEMBLER__ +# define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */ +#else +# include +#endif + +#if USB_CFG_DRIVER_FLASH_PAGE +# define USB_READ_FLASH(addr) pgm_read_byte_far(((long)USB_CFG_DRIVER_FLASH_PAGE << 16) | (long)(addr)) +#else +# define USB_READ_FLASH(addr) pgm_read_byte(addr) +#endif + +#define macro .macro +#define endm .endm +#define nop2 rjmp .+0 /* jump to next instruction */ + +#endif /* development environment */ + +/* for conveniecne, ensure that PRG_RDB exists */ +#ifndef PRG_RDB +# define PRG_RDB(addr) USB_READ_FLASH(addr) +#endif +#endif /* __usbportability_h_INCLUDED__ */ diff --git a/kernel_driver/Kbuild b/kernel_driver/Kbuild new file mode 100644 index 0000000..4a6329c --- /dev/null +++ b/kernel_driver/Kbuild @@ -0,0 +1 @@ +obj-m := macusbfb.o diff --git a/kernel_driver/LICENSE b/kernel_driver/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/kernel_driver/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/kernel_driver/Makefile b/kernel_driver/Makefile new file mode 100644 index 0000000..49accaf --- /dev/null +++ b/kernel_driver/Makefile @@ -0,0 +1,13 @@ +KERNELPATH=/lib/modules/`uname -r`/build +#KERNELPATH=/home/jeroen/dockstar/linux-2.6.35.3 + +macusbfb.ko: macusbfb.c + make -C ${KERNELPATH} M=`pwd` + +install: macusbfb.ko + make -C ${KERNELPATH} M=`pwd` modules_install + +clean: + make -C ${KERNELPATH} M=`pwd` clean + + diff --git a/kernel_driver/macusbfb.c b/kernel_driver/macusbfb.c new file mode 100644 index 0000000..a0191b6 --- /dev/null +++ b/kernel_driver/macusbfb.c @@ -0,0 +1,535 @@ +/* +Framebuffer driver for the USB Macintosh display adapter +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_AUTHOR "Jeroen Domburg, jeroen@spritesmods.com" +#define DRIVER_DESC "Mac-display USB framebuffer driver" + +#define VENDOR_ID 0x1234 +#define PRODUCT_ID 0x55aa + +#define MACFB_HEIGHT 342 +#define MACFB_WIDTH 512 + +#define usb_buffer_alloc usb_alloc_coherent +#define usb_buffer_free usb_free_coherent + +#define BUF_MAX_SIZE 32768 + +/* table of devices that work with this driver */ +static struct usb_device_id id_table [] = { + { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, + { }, +}; +MODULE_DEVICE_TABLE (usb, id_table); + +struct macusbfbdev { + struct usb_device * udev; + struct fb_info * fbinfo; + unsigned char *fb; + unsigned char *pixels; + unsigned char *oldpixels; + unsigned char *xferbuff; + dma_addr_t xferbuffDmaAddr; + struct usb_anchor submitted; + int gpioVals; + atomic_t writeInProgress; + atomic_t changedWhileWriting; +}; + +static struct fb_fix_screeninfo macusbfb_fbfix __initdata = { + .id = "macusbfb", + .type = FB_TYPE_PACKED_PIXELS, + .visual = FB_VISUAL_TRUECOLOR, + .line_length = MACFB_WIDTH*2, + .accel = FB_ACCEL_NONE, +}; + +static struct fb_var_screeninfo macusbfb_fbvar __initdata = { + .xres = MACFB_WIDTH, + .yres = MACFB_HEIGHT, + .xres_virtual = MACFB_WIDTH, + .yres_virtual = MACFB_HEIGHT, + .bits_per_pixel = 16, + .red = { 11, 5, 0 }, + .green = { 4, 6, 0 }, + .blue = { 0, 5, 0 }, + .left_margin = 0, + .right_margin = 0, + .upper_margin = 0, + .lower_margin = 0, + .vmode = FB_VMODE_NONINTERLACED, +}; + + + +static void sendFramebufferOver(struct fb_info *info); + +static void macusbfb_write_bulk_callback(struct urb *urb) +{ + + struct macusbfbdev *dev; + int status = urb->status; + + dev = urb->context; + + // sync/async unlink faults aren't errors + if (status && + !(status == -ENOENT || + status == -ECONNRESET || + status == -ESHUTDOWN)) { + dbg("USBLCD: %s - nonzero write bulk status received: %d", + __func__, status); + } + + /* free up our allocated buffer */ +// usb_buffer_free(urb->dev, BUF_MAX_SIZE, +// urb->transfer_buffer, urb->transfer_dma); + + + + //Is the picture on the 'tube holy and perfect now? + if (atomic_read(&dev->changedWhileWriting)!=0) { + // *sigh,* something has changed. Let's do it again. + atomic_set(&dev->changedWhileWriting, 0); + sendFramebufferOver(dev->fbinfo); +// printk(KERN_INFO "Macusbfb: USB transfer complete but frame has changed!!\n"); + return; + } else { +// printk(KERN_INFO "Macusbfb: USB transfer complete! Image is perfect now.\n"); + } + + atomic_set(&dev->writeInProgress, 0); + + +// up(&dev->limit_sem); +} + + +static int createCmdStream(unsigned char* newbuff, unsigned char* oldbuff, unsigned char *data) { + int p=0; + int datalen=0; + int x,y; + int starting; //If we send data, will it be in a new packet? + int sizePos; //pos of size indicator of packet + int sizeCnt; //size of packet + int addr; + + for (y=0; y<342; y++) { + sizeCnt=0; + starting=1; + for (x=0; x<64; x++) { + if (newbuff[p]==oldbuff[p]) { + if (sizeCnt!=0) { + data[sizePos]=sizeCnt; + sizeCnt=0; + } + starting=1; + p++; + } else { + oldbuff[p]=newbuff[p]; + if (starting) { + addr=(y*64)+x; +// printk(KERN_INFO "%i\n", addr); + data[datalen++]=0xfa; + data[datalen++]=(addr>>8); + data[datalen++]=addr&0xff; + sizePos=datalen; + sizeCnt=0; + data[datalen++]=1; + starting=0; + } + data[datalen++]=newbuff[p++]; + sizeCnt++; + } + } + if (sizeCnt!=0) { + data[sizePos]=sizeCnt; + } + } + return datalen; +} + + +static void convert16to1bit(unsigned char* in, unsigned char* out) { + int x,y,p,tresh, val; + unsigned char *outp=out; + u16 *inp=(u16 *)in; + for (y=0; y<342; y++) { + for (x=0; x<512; x+=8) { + for (p=0; p<8; p++) { + //Tresh should start at 32 but seemingly my Xorg interprets + //the 565-mode I pass to it as 555... + tresh=16; + if (p&1) tresh-=8; + if (y&1) tresh+=4; + val=(((*inp)>>5)&0x3F); + *outp<<=1; + if (valpar; + unsigned char *buf=dev->xferbuff; + + + /* create a urb, and a buffer for it, and copy the data to the urb */ + usbreq = usb_alloc_urb(0, GFP_KERNEL); + if (!usbreq) { + printk(KERN_INFO "Macusbfb: Can't allocate urb!\n"); + goto err_no_buf; + } + + + convert16to1bit(dev->fb, dev->pixels); + count=createCmdStream(dev->pixels, dev->oldpixels, buf); + + /* initialize the urb properly */ + usbreq->transfer_dma=dev->xferbuffDmaAddr; + usb_fill_bulk_urb(usbreq, dev->udev, + usb_sndbulkpipe(dev->udev, 3), + buf, count, macusbfb_write_bulk_callback, dev); + usbreq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + usb_anchor_urb(usbreq, &dev->submitted); + + /* send the data out the bulk port */ + retval = usb_submit_urb(usbreq, GFP_KERNEL); + if (retval) { + err("macusbfb: failed submitting write urb, error %d", retval); + goto error_unanchor; + } + + /* release our reference to this urb, the USB core will eventually free it entirely */ + usb_free_urb(usbreq); + + return; + +error_unanchor: + usb_unanchor_urb(usbreq); + + usb_buffer_free(dev->udev, count, buf, usbreq->transfer_dma); + usb_free_urb(usbreq); +err_no_buf: +// up(&dev->limit_sem); + return; +} + +static void macusbfb_dpy_deferred_io(struct fb_info *info, struct list_head *pagelist) { + struct macusbfbdev *dev=info->par; + + if (atomic_read(&dev->writeInProgress)!=0) { +// printk(KERN_INFO "Macusbfb: Deferred io handler called but write still in progress!\n"); + atomic_set(&dev->changedWhileWriting, 1); + return; + } + atomic_set(&dev->writeInProgress, 1); + sendFramebufferOver(info); +} + +static void macusbfb_fillrect(struct fb_info *info, + const struct fb_fillrect *rect) +{ + struct macusbfbdev *dev = info->par; + return; + sys_fillrect(info, rect); + if (atomic_read(&dev->writeInProgress)!=0) { + atomic_set(&dev->changedWhileWriting, 1); + return; + } + atomic_set(&dev->writeInProgress, 1); + sendFramebufferOver(info); +} + +static void macusbfb_copyarea(struct fb_info *info, + const struct fb_copyarea *area) +{ + struct macusbfbdev *dev = info->par; + sys_copyarea(info, area); + if (atomic_read(&dev->writeInProgress)!=0) { + atomic_set(&dev->changedWhileWriting, 1); + return; + } + atomic_set(&dev->writeInProgress, 1); + sendFramebufferOver(info); +} + +static void macusbfb_imageblit(struct fb_info *info, + const struct fb_image *image) +{ + struct macusbfbdev *dev = info->par; + sys_imageblit(info, image); + if (atomic_read(&dev->writeInProgress)!=0) { + atomic_set(&dev->changedWhileWriting, 1); + return; + } + atomic_set(&dev->writeInProgress, 1); + sendFramebufferOver(info); +} + + +static struct fb_deferred_io macusbfb_defio = { + .delay = HZ/30, + .deferred_io = macusbfb_dpy_deferred_io, +}; + +static struct fb_ops macusbfb_fbops = { + .owner = THIS_MODULE, + .fb_read = fb_sys_read, + .fb_write = fb_sys_write, + .fb_fillrect = macusbfb_fillrect, + .fb_copyarea = macusbfb_copyarea, + .fb_imageblit = macusbfb_imageblit, +}; + + +#define MYDEV_ATTR_SIMPLE_UNSIGNED(name, gpiono) \ +static ssize_t show_attr_##name(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + struct usb_interface *intf = to_usb_interface(dev); \ + struct macusbfbdev *mydev = usb_get_intfdata(intf); \ + \ + return sprintf(buf, "%u\n", mydev->gpioVals&(1<udev->dev, "out of memory\n"); + return -1; + } + + if (val) dev->gpioVals|=(1<gpioVals&=!(1<udev, + usb_sndctrlpipe(dev->udev, 0), + 0x1, //1 -> modify gpio + 0x40, //vendor specific reqtype + val, + gpiono, + buffer, + 8, + 100); +} + +MYDEV_ATTR_SIMPLE_UNSIGNED(fan, 0); +MYDEV_ATTR_SIMPLE_UNSIGNED(display, 1); +MYDEV_ATTR_SIMPLE_UNSIGNED(fddeject, 2); +MYDEV_ATTR_SIMPLE_UNSIGNED(hdled, 3); + +static struct attribute *dev_attrs[] = { + &dev_attr_fan.attr, + &dev_attr_display.attr, + &dev_attr_fddeject.attr, + &dev_attr_hdled.attr, + NULL +}; + +static struct attribute_group dev_attr_grp = { + .attrs = dev_attrs, +}; + +static int macusbfb_probe(struct usb_interface *interface, const struct usb_device_id *id) { + struct usb_device *udev = interface_to_usbdev(interface); + struct macusbfbdev *dev = NULL; + int retval = -ENOMEM; + struct fb_info *info; + + dev = kzalloc(sizeof(struct macusbfbdev), GFP_KERNEL); + if (dev == NULL) { + dev_err(&interface->dev, "Out of memory\n"); + goto error_mem; + } + init_usb_anchor(&dev->submitted); + + //ToDo: oom handling + + dev->fb = vmalloc(roundup((MACFB_WIDTH*MACFB_HEIGHT)*2, PAGE_SIZE)); + if (!dev->fb) goto error_mem; + dev->pixels = vmalloc((MACFB_WIDTH*MACFB_HEIGHT)/8); + if (!dev->pixels) goto error_mem; + dev->oldpixels = vmalloc((MACFB_WIDTH*MACFB_HEIGHT)/8); + if (!dev->oldpixels) goto error_mem; + + dev->udev = usb_get_dev(udev); + usb_set_intfdata (interface, dev); + + //Allocate fb stuff + //The display is 1bit, but nothing is compatible with that so we'll emulate a 16-bit one. + info = framebuffer_alloc(sizeof(struct macusbfbdev*), NULL); + if (!info) goto error; + dev->xferbuff=usb_buffer_alloc(dev->udev, BUF_MAX_SIZE, GFP_KERNEL, &dev->xferbuffDmaAddr); + if (!dev->xferbuff) { + printk(KERN_INFO "Macusbfb: Error alloccing xfer buff!\n"); + goto error2; + } + + info->par=dev; + info->screen_base = (char __force __iomem *) dev->fb; + printk("Screen base = %x\n", (int)info->screen_base); + info->screen_size = MACFB_WIDTH*MACFB_HEIGHT*2; + info->fbops = &macusbfb_fbops; + info->fix = macusbfb_fbfix; + info->fix.smem_len=(MACFB_WIDTH*MACFB_HEIGHT)*2; + info->var = macusbfb_fbvar; + info->pseudo_palette = NULL; + info->flags = FBINFO_FLAG_DEFAULT|FBINFO_VIRTFB; + + //Init deferred IO + info->fbdefio = &macusbfb_defio; + fb_deferred_io_init(info); + +//Klont?!? + dev->fbinfo=info; + atomic_set(&dev->writeInProgress, 0); + atomic_set(&dev->changedWhileWriting, 0); + + if (sysfs_create_group(&interface->dev.kobj, &dev_attr_grp)) goto error; + + if (register_framebuffer(info) < 0) goto fberr; + printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, info->fix.id); + dev_info(&interface->dev, "MacUsbFb device now attached\n"); + + + + return 0; +//ToDo: look more closely at this: this doesn;t free everything. +fberr: + framebuffer_release(info); + printk(KERN_INFO "Macusbfb: Error initing fb!\n"); + +error2: + +error: + printk(KERN_INFO "Macusbfb: Error initing!\n"); + usb_set_intfdata (interface, NULL); + usb_put_dev(dev->udev); + kfree(dev); +error_mem: + printk(KERN_INFO "Macusbfb: Couldn't allocate framebuffer or usb memory!\n"); + return retval; +} + +static void macusbfb_disconnect(struct usb_interface *interface) +{ +//ToDo: _Really_ clean everything up! + struct macusbfbdev *dev; + struct fb_info *info; + + dev = usb_get_intfdata (interface); + info=dev->fbinfo; + + if (info) { + fb_deferred_io_cleanup(info); + unregister_framebuffer(info); + framebuffer_release(info); + } + + sysfs_remove_group(&interface->dev.kobj, &dev_attr_grp); + + /* first remove the files, then set the pointer to NULL */ + usb_set_intfdata (interface, NULL); + + usb_put_dev(dev->udev); + + kfree(dev); + + dev_info(&interface->dev, "MacUsbFb now disconnected\n"); +} + +static struct usb_driver macusbfb_driver = { + .name = "macusbfb", + .probe = macusbfb_probe, + .disconnect = macusbfb_disconnect, + .id_table = id_table, +}; + +static int __init macusbfb_init(void) +{ + int retval = 0; + + retval = usb_register(&macusbfb_driver); + if (retval) + err("usb_register failed. Error number %d", retval); + return retval; +} + +static void __exit macusbfb_exit(void) +{ + usb_deregister(&macusbfb_driver); +} + +module_init (macusbfb_init); +module_exit (macusbfb_exit); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/kernel_driver/test.sh b/kernel_driver/test.sh new file mode 100755 index 0000000..998c976 --- /dev/null +++ b/kernel_driver/test.sh @@ -0,0 +1,13 @@ +set -e +sudo rmmod macusbfb || true +sudo rmmod fb || true +sudo rm -f /lib/modules/2.6.34/extra/macusbfb.ko +sudo make clean install +sudo modprobe macusbfb +sleep 2 +#echo bla | sudo tee /dev/fb0 +#sudo Xfbdev :1 +sudo test/test +sudo modprobe snd-usb-audio +mplayer -vo fbdev -zoom -fs -vf scale ~/server/film/Bastian\ -\ You\ got\ my\ love.avi -ao alsa:device=hw=1 +dmesg | tail \ No newline at end of file diff --git a/kernel_driver/test/Makefile b/kernel_driver/test/Makefile new file mode 100644 index 0000000..2948b3c --- /dev/null +++ b/kernel_driver/test/Makefile @@ -0,0 +1,4 @@ +CFLAGS=-g + +test: test.o + gcc -o test test.o \ No newline at end of file diff --git a/kernel_driver/test/bdc.xbm b/kernel_driver/test/bdc.xbm new file mode 100644 index 0000000..ffadcd0 --- /dev/null +++ b/kernel_driver/test/bdc.xbm @@ -0,0 +1,1828 @@ +#define bdc_width 512 +#define bdc_height 342 +static const char bdc_bits[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF0, 0x01, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x08, 0x02, 0x00, + 0x80, 0x40, 0x20, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFC, 0x04, 0x02, 0x00, 0x80, 0x80, 0x10, 0xFE, 0xC3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC1, 0x07, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xC0, 0xFF, 0x1F, 0xE0, 0x3F, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x67, 0x06, 0x00, 0xE0, 0x8C, 0x88, 0xFF, + 0x8F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x8E, 0xFF, + 0x03, 0xFE, 0xFF, 0xC0, 0xFF, 0xFF, 0x0F, 0x80, 0x03, 0x76, 0xFC, 0xFF, + 0x3F, 0x9C, 0xC4, 0xFF, 0x1F, 0xF1, 0xFF, 0xFF, 0xFF, 0x7F, 0x8C, 0xE1, + 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x3F, 0x8F, 0xFF, 0x81, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x03, 0x00, + 0x62, 0xF2, 0x00, 0x00, 0x00, 0x9E, 0xE4, 0xFF, 0x3F, 0xC2, 0xFF, 0xFF, + 0xFF, 0x7F, 0x1E, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x7F, 0xF0, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFF, 0xC1, 0x1F, 0xF0, 0xF2, 0x00, 0x00, 0x00, 0x9F, 0xF2, 0xFF, + 0x7F, 0x22, 0xF0, 0x1F, 0x80, 0x7F, 0x1E, 0xF8, 0x1F, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x87, 0x1F, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0E, + 0xF8, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0xF0, 0x7F, 0xF0, 0xE2, 0xFF, 0xF7, + 0xFF, 0x8F, 0xF2, 0x8F, 0x7F, 0x14, 0xE0, 0x07, 0x00, 0x7F, 0x3E, 0xFC, + 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xB0, 0x5F, 0xBF, 0x3F, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x3F, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0xFC, 0x5F, 0xF8, 0xFF, + 0x78, 0xE2, 0xFF, 0xF7, 0xFF, 0x87, 0xF9, 0x07, 0xF7, 0x14, 0xC3, 0xC3, + 0x1F, 0x7E, 0xFE, 0x3F, 0x7E, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xDC, 0x1F, + 0x2A, 0x3F, 0x09, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x7E, 0xC0, 0xFF, 0xFF, 0xFF, 0x7F, + 0xF8, 0x67, 0xFC, 0xF8, 0x7D, 0xC6, 0xFF, 0xF7, 0xFF, 0xC1, 0x79, 0x03, + 0xF6, 0x98, 0x87, 0xE1, 0x3F, 0x7C, 0xFC, 0x1F, 0xFC, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0xA7, 0xFF, 0xDF, 0xFD, 0xBF, 0x7F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFE, 0xF0, + 0xFF, 0xBF, 0xFF, 0xFF, 0xF8, 0x21, 0x7E, 0xE0, 0x7F, 0x86, 0x8F, 0xF7, + 0x3F, 0x60, 0x7D, 0x23, 0xEE, 0x99, 0x0F, 0xF0, 0x7F, 0x78, 0xF8, 0x1F, + 0xF8, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x47, 0xC7, 0x9F, 0x77, 0x3E, 0x5E, 0x7F, + 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0x71, 0x30, 0x7E, 0xC0, + 0x3F, 0x8E, 0x8F, 0xF3, 0x7F, 0xB8, 0xBC, 0x73, 0xEE, 0x99, 0x1F, 0xF8, + 0xFF, 0xF8, 0xE0, 0x9C, 0xB8, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xEA, 0xF7, 0xA7, 0x9F, + 0xCF, 0x3F, 0x9F, 0x7F, 0xF1, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0x00, 0x80, 0xFF, + 0x31, 0x10, 0x37, 0x86, 0x3F, 0x1E, 0x8F, 0xF7, 0x7D, 0x8C, 0xBC, 0x51, + 0xEC, 0x11, 0x7F, 0x7E, 0xFF, 0xF1, 0xE1, 0x9C, 0xB1, 0xE3, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, + 0xE2, 0xD7, 0xDD, 0xDF, 0xCB, 0x3E, 0xFF, 0x7F, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, 0xFF, + 0xE7, 0xE0, 0x07, 0xFE, 0x23, 0x10, 0x3B, 0x8E, 0x3F, 0x17, 0x8E, 0xE7, + 0x7B, 0x8C, 0x9C, 0x51, 0xCC, 0x11, 0xFE, 0x3F, 0xEE, 0x71, 0xE7, 0x9C, + 0x31, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBF, 0x6D, 0xE5, 0xFF, 0xBE, 0xDF, 0xEB, 0x3F, 0x7D, 0x7F, + 0xFA, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF8, 0xFF, 0xE7, 0x1C, 0x18, 0xDC, 0x63, 0x90, 0x3B, 0x1B, + 0x3F, 0x3F, 0x9E, 0xC7, 0xF3, 0xC8, 0xDE, 0x89, 0xDC, 0x33, 0xFE, 0x1F, + 0xEE, 0xF3, 0xE4, 0x9C, 0x63, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x8F, 0xEA, 0x77, 0xD6, 0x5F, + 0x6F, 0xBF, 0x7D, 0x7F, 0xFD, 0xE7, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x7F, 0xE6, 0x04, 0x60, 0xB8, + 0x47, 0x98, 0x1B, 0x11, 0x3F, 0x7B, 0x1C, 0x8F, 0xE7, 0x48, 0xDE, 0x89, + 0xDC, 0x73, 0xDC, 0x1F, 0xDC, 0xB3, 0xE5, 0x9C, 0x62, 0xC7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, + 0xE7, 0xF7, 0xEE, 0xDB, 0x6E, 0xAE, 0xFD, 0x7F, 0xF8, 0xB7, 0xEE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF1, 0x7F, + 0xE6, 0xE4, 0xC7, 0xB8, 0x47, 0x88, 0x19, 0x31, 0x1E, 0x53, 0x1C, 0x0F, + 0xE7, 0x49, 0xDE, 0xA8, 0x98, 0x53, 0x18, 0x1E, 0x9C, 0x23, 0xE7, 0x9C, + 0x66, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC5, 0xBF, 0xEB, 0xE7, 0xDD, 0xDB, 0xDD, 0x3D, 0xDF, 0xAF, + 0xFD, 0xE7, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC3, 0x1F, 0xE6, 0x1C, 0x98, 0x71, 0xCF, 0x88, 0x99, 0x27, + 0x1E, 0xF1, 0x38, 0x0F, 0xCF, 0x69, 0xCF, 0x74, 0x99, 0xF7, 0x38, 0x8E, + 0xB8, 0x23, 0xE4, 0x9C, 0xC4, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xC9, 0x5F, 0xF7, 0xD5, 0xBF, 0xDB, + 0xFF, 0x3F, 0xED, 0xBF, 0xFB, 0xA7, 0xDE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x1F, 0xE6, 0x04, 0x60, 0x71, + 0x8F, 0xC8, 0x9D, 0x6E, 0x9E, 0xE1, 0x38, 0x1F, 0xCE, 0x29, 0xCF, 0x54, + 0x99, 0xA7, 0x39, 0x8F, 0xB8, 0x27, 0xE4, 0x9C, 0xC5, 0xCE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xE9, 0xAF, + 0xEB, 0x67, 0xD7, 0x5F, 0x77, 0x2F, 0x7F, 0xEF, 0xF7, 0xF7, 0xDE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, + 0xE6, 0x04, 0xC0, 0xE2, 0x8E, 0xCC, 0x8D, 0x5B, 0x9E, 0xC1, 0x79, 0x5E, + 0xCE, 0x29, 0xCF, 0x54, 0x99, 0x27, 0x39, 0xCF, 0x39, 0x67, 0xE4, 0x9C, + 0xCD, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE7, 0xD1, 0x4F, 0xF7, 0xD5, 0xFF, 0xC9, 0xF7, 0x2F, 0xED, 0x6F, + 0xF5, 0xAF, 0xDE, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1B, 0x1F, 0xE6, 0x04, 0x80, 0xE3, 0x9E, 0xC5, 0x8C, 0x51, + 0x8E, 0xC1, 0x79, 0x5E, 0xCE, 0x29, 0xEF, 0x8C, 0x99, 0x27, 0x39, 0x47, + 0x39, 0x47, 0xE4, 0x9C, 0xCB, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xE9, 0xBF, 0xEB, 0xFC, 0xDB, 0xDF, + 0xDB, 0xAF, 0xDD, 0xEF, 0xFD, 0xEF, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x1F, 0xE6, 0x04, 0x00, 0xE5, + 0x1C, 0xC5, 0xCC, 0x71, 0x8E, 0x81, 0x79, 0x5E, 0xCE, 0x29, 0xE7, 0x8C, + 0x39, 0x27, 0x39, 0x47, 0x31, 0x47, 0xE4, 0x9C, 0xCA, 0x9C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xD1, 0xDB, + 0xF3, 0xF7, 0xFB, 0xD1, 0xFB, 0xAF, 0xF7, 0xFF, 0xFF, 0xF5, 0xDF, 0x6F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x1F, + 0xE6, 0x04, 0x00, 0xC6, 0x1C, 0xE5, 0xCC, 0x61, 0xCC, 0x80, 0xF1, 0x5C, + 0xCE, 0x39, 0x67, 0x8C, 0x31, 0x67, 0x39, 0x67, 0x31, 0x4F, 0xE4, 0x9C, + 0xCE, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xD2, 0xE9, 0xAB, 0xEF, 0x67, 0xF3, 0xFF, 0xFF, 0xBF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xDF, 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xCA, 0x39, 0xE5, 0xCC, 0x60, + 0xC0, 0x00, 0xF1, 0x1C, 0xCE, 0x19, 0x67, 0x04, 0x31, 0x4F, 0x39, 0x27, + 0x33, 0x4F, 0xE4, 0x9C, 0xCC, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xE6, 0xD7, 0x9B, 0x77, 0xDC, 0xFF, 0xF9, + 0xFF, 0xAF, 0xFB, 0xFF, 0xFF, 0xA5, 0xDE, 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xCC, + 0x39, 0xE5, 0xCC, 0x7F, 0xC6, 0x00, 0xF3, 0x1C, 0xCF, 0x19, 0x67, 0x06, + 0x33, 0x4F, 0x39, 0xA7, 0x32, 0x4F, 0xE4, 0x9C, 0xCC, 0x9C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xD2, 0xE9, 0xBB, + 0x7F, 0xFF, 0xDD, 0xFF, 0xFF, 0xAF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x04, 0x00, 0x8C, 0x39, 0xE5, 0x0C, 0x00, 0xE7, 0x00, 0xE3, 0x39, + 0xCF, 0x99, 0x67, 0x06, 0x33, 0x4F, 0x39, 0xA7, 0x32, 0x4F, 0xE4, 0x9C, + 0xCC, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x7F, 0xE3, 0xD5, 0x2B, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xBF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0x98, 0x39, 0xE5, 0x0C, 0x00, + 0x67, 0x00, 0xE3, 0xB9, 0xC7, 0x99, 0x67, 0x06, 0x33, 0x4F, 0x39, 0xE3, + 0x33, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xCA, 0xE9, 0x69, 0xFF, 0x7F, 0xF3, 0xF5, + 0x77, 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xF6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0x98, + 0x39, 0xE5, 0xFC, 0xFF, 0x67, 0x00, 0xE7, 0xB9, 0xE7, 0x98, 0x67, 0x06, + 0x33, 0x4F, 0x39, 0x63, 0x33, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xE2, 0xD5, 0x6F, + 0x7F, 0xDE, 0xFF, 0x9F, 0x6F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x04, 0x00, 0x98, 0x39, 0xE5, 0xFC, 0xFF, 0x67, 0x00, 0xC6, 0xF1, + 0xF3, 0x98, 0x67, 0x06, 0x33, 0x4F, 0x39, 0x73, 0x33, 0x4F, 0xE4, 0x9C, + 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF7, 0x66, 0xE9, 0xEF, 0x7F, 0xDC, 0xFF, 0xD7, 0x47, 0x6D, 0xFD, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0x90, 0x39, 0xE5, 0x0C, 0x00, + 0x27, 0x00, 0xC6, 0xF3, 0x7B, 0x9C, 0x67, 0x06, 0x33, 0x4F, 0x39, 0x73, + 0x33, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x7A, 0xD5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEA, 0xEF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0x90, + 0x39, 0xE5, 0x0C, 0x00, 0x27, 0x00, 0x8E, 0xF3, 0x7F, 0x9C, 0x67, 0x02, + 0x32, 0x4F, 0x39, 0x33, 0x33, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0xD3, 0xE9, 0xEB, + 0x7F, 0xD4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF, 0xF7, 0xFF, 0xFF, 0xFF, + 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x04, 0x00, 0x90, 0x39, 0xE5, 0xCC, 0x3F, 0x27, 0x00, 0x8C, 0xF7, + 0x3F, 0x9E, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x33, 0x32, 0x4F, 0xE4, 0x9C, + 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xE2, 0xD5, 0xDB, 0x7F, 0xBD, 0x0F, 0xBF, 0xAA, 0xEE, 0x00, 0xBC, + 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xD8, 0x39, 0xE5, 0x4C, 0x20, + 0x26, 0x00, 0x1C, 0xFF, 0x1F, 0x9E, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x33, + 0x32, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x42, 0xE9, 0xDF, 0xC7, 0x7C, 0x00, 0x73, + 0x55, 0xDD, 0x57, 0x09, 0xF4, 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xD8, + 0x39, 0xE5, 0xCC, 0x20, 0x66, 0x00, 0x1C, 0xFF, 0x0F, 0x97, 0x67, 0x02, + 0x32, 0x4F, 0x39, 0x33, 0x32, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x56, 0xD1, 0x5F, + 0xE9, 0xAF, 0xAA, 0xBE, 0x00, 0xF8, 0xA6, 0xAE, 0xD9, 0xFF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x04, 0x00, 0xD8, 0x39, 0xE5, 0x8C, 0x7F, 0x40, 0x00, 0x0C, 0xFF, + 0x83, 0x97, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x33, 0x32, 0x4F, 0xE4, 0x9C, + 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xCF, 0x42, 0xE9, 0x6B, 0xFD, 0xFD, 0x5F, 0x6E, 0x24, 0xDD, 0xF1, 0xD7, + 0x7D, 0x76, 0xFB, 0x7F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xE4, 0x39, 0xE5, 0x8C, 0x40, + 0x46, 0x00, 0x86, 0xFF, 0xC0, 0x92, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x33, + 0x32, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x42, 0xD3, 0xE9, 0xBF, 0xFB, 0xBF, 0xFE, + 0x00, 0xFC, 0x7A, 0xEB, 0xFA, 0xE3, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xE4, + 0x39, 0xE5, 0x9C, 0x40, 0x4E, 0x00, 0xC3, 0x3F, 0x70, 0x93, 0x67, 0x02, + 0x32, 0x4F, 0x39, 0x13, 0x32, 0x4F, 0xE4, 0x9C, 0xC8, 0x9C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x5B, 0x03, 0xFF, + 0x7F, 0xF7, 0x55, 0x5D, 0x55, 0x75, 0xED, 0x77, 0xFF, 0x8F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x04, 0x00, 0xE4, 0x3D, 0xC5, 0x9C, 0x60, 0x4E, 0x80, 0xE1, 0x1F, + 0x9C, 0x91, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x13, 0x32, 0x4F, 0xE4, 0x9C, + 0xC8, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x57, 0xD2, 0xC9, 0xFF, 0xFB, 0xEE, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, + 0xFE, 0xFB, 0xFC, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x04, 0x00, 0xE2, 0x3D, 0xC5, 0x9C, 0x21, + 0x4E, 0xC0, 0xF0, 0x07, 0xC7, 0x90, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x13, + 0x32, 0x4F, 0xE4, 0x9C, 0xCC, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x5B, 0x39, 0x7F, 0xFF, 0xDD, 0xFF, 0xFF, + 0x75, 0xFF, 0xFD, 0x5F, 0xFF, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x84, 0x00, 0xF2, + 0x3C, 0xCD, 0x19, 0x21, 0x4E, 0x40, 0xF8, 0x81, 0x71, 0x90, 0x67, 0x02, + 0x32, 0x4F, 0x39, 0x13, 0x32, 0x4F, 0xE4, 0x9C, 0xC4, 0x8E, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0xE2, 0x07, 0xFB, + 0xAF, 0xFE, 0xFF, 0xAF, 0xAA, 0xFA, 0xBF, 0xFA, 0xFF, 0xFF, 0xDF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x44, 0x01, 0xF1, 0x1E, 0xCD, 0x19, 0x31, 0xCF, 0x60, 0x7C, 0xE0, + 0x1C, 0x90, 0x67, 0x02, 0x32, 0x4F, 0x39, 0x13, 0x32, 0x4F, 0xE4, 0x9C, + 0xC4, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xD7, 0x52, 0x07, 0xDD, 0xF7, 0xFF, 0x77, 0xFF, 0xFD, 0xDF, 0xFF, 0xFF, + 0xDF, 0xFD, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x44, 0x01, 0x79, 0x1E, 0xCD, 0x39, 0x11, + 0x8F, 0x20, 0x3E, 0x38, 0x7F, 0x90, 0x6F, 0x02, 0xB2, 0x4F, 0x39, 0x13, + 0x32, 0x4F, 0xE6, 0x9C, 0xE6, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0xF6, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, + 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x24, 0x82, 0x7C, + 0x9F, 0x8D, 0x3B, 0x1B, 0x8F, 0x30, 0x0E, 0x8E, 0xC1, 0x10, 0x6F, 0x04, + 0xB1, 0x47, 0x39, 0x13, 0x32, 0x4F, 0xE2, 0x9C, 0x62, 0xC7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xF2, 0x07, 0xFF, + 0xFF, 0xFF, 0x7D, 0xFF, 0x7D, 0xF5, 0xFD, 0xFF, 0xFF, 0xDF, 0xFF, 0xEF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0xA4, 0x42, 0xFC, 0x8F, 0x89, 0x3B, 0x8A, 0x9F, 0x10, 0x0F, 0xE3, + 0x80, 0x10, 0xEF, 0x04, 0xB9, 0x47, 0x39, 0x13, 0x32, 0x4F, 0xE3, 0x9C, + 0x63, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x57, 0xFA, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xAA, 0xEF, 0xFF, 0xFE, + 0xFD, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x9C, 0x3C, 0xFE, 0xC7, 0x89, 0x37, 0x8E, + 0x9F, 0x11, 0xC7, 0x79, 0x9E, 0x30, 0xDF, 0x04, 0xD9, 0x67, 0x39, 0x13, + 0x73, 0x4F, 0xF1, 0x9C, 0xF1, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0xFE, 0x07, 0xFF, 0xFF, 0xBB, 0x7F, 0xD7, + 0xF5, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xC0, 0x01, 0xFF, + 0xC7, 0x18, 0x77, 0xC0, 0x1F, 0x91, 0x47, 0x2E, 0x9E, 0x30, 0xDE, 0x8C, + 0xD9, 0xA3, 0x38, 0x33, 0x71, 0xCF, 0xF1, 0x9C, 0xF0, 0xE3, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0xFF, 0xC7, 0xFF, + 0xFF, 0xFF, 0xBF, 0xAE, 0xAE, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0xE0, 0x83, 0xFF, 0xE3, 0x18, 0x7F, 0xC0, 0x1F, 0x91, 0x63, 0x33, + 0x9F, 0x30, 0xFE, 0x89, 0xF8, 0xA3, 0x38, 0x23, 0xF1, 0xCF, 0xF8, 0x1F, + 0xF8, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x57, 0xFD, 0xF5, 0xFD, 0xFF, 0xFF, 0x7F, 0x7F, 0x35, 0xF4, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xFF, 0xFF, 0xFF, 0xE1, 0x38, 0xFE, 0xF0, + 0x3D, 0x91, 0xE3, 0x11, 0x9F, 0x70, 0xFC, 0xD9, 0xFC, 0xB1, 0x3C, 0x63, + 0xF9, 0x4F, 0xF8, 0x1F, 0xFC, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0x9F, 0xEB, 0xFF, 0xFF, 0xFF, 0xBF, + 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xDA, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xFF, 0xFF, 0x7F, + 0x70, 0x30, 0xFE, 0xFF, 0x3D, 0x93, 0x73, 0x18, 0x9F, 0x60, 0xFC, 0x73, + 0xFC, 0x79, 0x3C, 0xC7, 0xB9, 0x4F, 0xFC, 0x3F, 0x7F, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0xFF, 0x77, 0xF4, + 0xFD, 0xBB, 0xBB, 0xFF, 0xFF, 0xDF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0xFF, 0xFF, 0x0F, 0x78, 0x70, 0xFC, 0xFF, 0x3C, 0x96, 0x71, 0x88, + 0x8F, 0xE0, 0xF8, 0x03, 0xFE, 0x58, 0xDC, 0x87, 0xB9, 0x47, 0x3E, 0xFC, + 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF7, 0xFF, 0xAF, 0xD9, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xBF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xFF, 0xFF, 0xFF, 0xC0, 0x70, 0xF8, 0xFF, + 0x3C, 0x94, 0x31, 0x8C, 0x8F, 0xE0, 0xF0, 0x8F, 0x7F, 0x3C, 0xFE, 0x0F, + 0x39, 0x67, 0x1E, 0xF8, 0x0F, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0xFF, 0xD5, 0xF3, 0xFF, 0xFF, 0xDF, 0x77, + 0x55, 0xFD, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFB, 0xF7, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xFF, 0xFF, 0xFF, + 0x83, 0xE1, 0xE0, 0x7F, 0x78, 0x94, 0x31, 0xC4, 0xCF, 0xC0, 0xE1, 0xFF, + 0x3F, 0x3C, 0xFE, 0x1F, 0x39, 0x67, 0x0E, 0xE0, 0x03, 0xFB, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA6, + 0xFF, 0xFF, 0x7F, 0xEF, 0xAE, 0xFE, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xF1, + 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0xFF, 0xFF, 0xFF, 0x0F, 0xE3, 0xC1, 0x1F, 0xF8, 0x94, 0x23, 0xC6, + 0xCF, 0xC0, 0xC3, 0xFF, 0x1F, 0x1E, 0xFF, 0x3F, 0x39, 0xE2, 0x80, 0x01, + 0xC0, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0x55, 0x4D, 0xFF, 0xBB, 0x7F, 0x77, 0x1F, 0xFD, 0xFD, 0xFF, + 0xDD, 0xFF, 0x5F, 0xAE, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xFF, 0xFF, 0xFF, 0x1F, 0x42, 0x07, 0x00, + 0xF0, 0x94, 0xE3, 0xE3, 0xCF, 0x80, 0x86, 0xFF, 0x0F, 0x9F, 0x07, 0x38, + 0x39, 0x62, 0x41, 0x06, 0x70, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x1E, 0xFF, 0xFD, 0xBB, 0x7F, + 0xF6, 0xFD, 0xBF, 0xFE, 0xFF, 0xFF, 0xCB, 0xDF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xE0, 0x83, 0xDF, + 0x3F, 0xC6, 0x0C, 0x80, 0x61, 0x14, 0xC7, 0x61, 0x8F, 0x81, 0x0D, 0xFE, + 0x83, 0x9D, 0x03, 0x30, 0x79, 0x70, 0x3E, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x5F, 0xDD, 0xCD, + 0xFB, 0x7F, 0xF5, 0xFD, 0x1C, 0x7F, 0xDF, 0x7F, 0xF7, 0xFF, 0xF7, 0xFF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0xC0, 0x01, 0xBE, 0x7F, 0x84, 0xF9, 0xFF, 0x03, 0x14, 0x0F, 0x70, + 0x0F, 0x03, 0x3B, 0xF8, 0xC0, 0x16, 0xE3, 0x01, 0x79, 0xB0, 0x80, 0x01, + 0xC0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xA6, 0xFA, 0xFC, 0xFF, 0xFF, 0xEF, 0x16, 0xFD, 0xFF, 0xEE, + 0xFF, 0xFF, 0xF3, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x9C, 0x3C, 0x3C, 0x7F, 0x0C, 0x07, 0x00, + 0x06, 0x16, 0x1F, 0x78, 0x1E, 0x02, 0xE6, 0x00, 0x70, 0x33, 0x30, 0x03, + 0xF1, 0x30, 0x41, 0x06, 0x70, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xBF, 0x7E, 0xDD, 0x75, 0x7D, + 0x15, 0x3D, 0xF5, 0xFF, 0xD5, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0xA4, 0x42, 0x78, + 0xFE, 0x08, 0x0C, 0x80, 0xFD, 0x37, 0xFE, 0x3F, 0x3E, 0x02, 0x8C, 0x07, + 0x9F, 0x71, 0x18, 0x86, 0xF1, 0x20, 0x3E, 0xF8, 0x1F, 0xF0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x1C, 0xED, + 0xCF, 0xBB, 0xBA, 0xEB, 0x17, 0xFD, 0xFD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, + 0xE6, 0x24, 0x82, 0x70, 0xFC, 0x08, 0xF8, 0xFF, 0x03, 0x34, 0xFE, 0x3F, + 0x7C, 0x02, 0x38, 0xFC, 0xC1, 0x90, 0xE7, 0x7D, 0xE3, 0x27, 0x00, 0x00, + 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xD7, 0x57, 0x55, 0xF7, 0x77, 0x5F, 0x75, 0x75, 0x1E, 0x7F, 0xFF, 0x7F, + 0xFD, 0xFF, 0xFF, 0x7F, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x44, 0x01, 0xF1, 0xFC, 0x11, 0x00, 0x00, + 0x06, 0x76, 0xFC, 0x1F, 0x7C, 0x02, 0xE0, 0x00, 0x70, 0x30, 0x30, 0x03, + 0xE3, 0x6F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x4F, 0x64, 0x9D, 0x0C, 0xAB, 0xFB, 0xEA, + 0x16, 0x7D, 0xFF, 0xFF, 0xBE, 0xFF, 0xFB, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0xE6, 0x5C, 0x3D, 0xE2, + 0xF8, 0x11, 0x00, 0x00, 0xFC, 0x63, 0xF0, 0x87, 0x38, 0x02, 0x80, 0x07, + 0x1F, 0x60, 0x18, 0x86, 0xC7, 0x4F, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x47, 0x5D, 0xD5, + 0xFD, 0x77, 0x7D, 0x77, 0x15, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x1F, + 0xE6, 0xA4, 0x42, 0xE2, 0xF8, 0x33, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x01, 0x02, 0x00, 0xFC, 0x01, 0x80, 0x07, 0x7C, 0x87, 0x4F, 0x00, 0x00, + 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x4F, 0xFE, 0xD1, 0xC2, 0xB9, 0xFA, 0xEA, 0x17, 0x7D, 0xF9, 0xEF, + 0xFE, 0xBF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x2F, 0x1F, 0xE6, 0x24, 0x82, 0xE4, 0xF3, 0x23, 0x00, 0x00, + 0x00, 0xE0, 0x03, 0x70, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0E, 0x47, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xC7, 0xD5, 0xD7, 0x57, 0xFF, 0xFD, 0xFD, + 0x1E, 0x7F, 0x7C, 0xFF, 0x7D, 0xFF, 0xFF, 0x7F, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0x1F, 0xE6, 0x44, 0x01, 0xC5, + 0xE3, 0x23, 0x00, 0x00, 0x00, 0x40, 0xFE, 0x9F, 0xFE, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x53, 0xA6, + 0x7C, 0x8F, 0xFE, 0xFE, 0x15, 0xFD, 0x7F, 0xE9, 0xFD, 0xFF, 0xD7, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0x1F, + 0xE6, 0x44, 0x01, 0xCA, 0xE3, 0x27, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, + 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x60, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x5F, 0xC7, 0x5D, 0xD5, 0xD7, 0xFF, 0xFF, 0x7F, 0x16, 0xDF, 0xFD, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x23, 0x1F, 0xE6, 0x84, 0x00, 0xCA, 0xE3, 0x47, 0x00, 0x00, + 0x00, 0x80, 0x03, 0x70, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEC, 0x5F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x67, 0x41, 0xC4, 0x8B, 0xFD, 0xFF, 0xEE, + 0xF7, 0xFA, 0x1F, 0xFF, 0xFF, 0xFF, 0x3F, 0x22, 0x00, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0x1F, 0xE6, 0x04, 0x00, 0x94, + 0xC7, 0x47, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0xFE, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x41, 0xFF, + 0xFF, 0xD7, 0xF5, 0x7F, 0x0A, 0xDF, 0xFF, 0xFF, 0xEF, 0x5F, 0x01, 0x01, + 0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x21, 0x1F, + 0xE6, 0x04, 0x00, 0x94, 0xC7, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBE, 0x49, 0xFB, 0xFC, 0xFF, 0xFF, 0x6B, 0x56, 0xDD, 0xFF, 0x07, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, + 0xFF, 0xFF, 0x21, 0x1F, 0xE6, 0x04, 0x00, 0x98, 0xC7, 0x4F, 0xF8, 0x03, + 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0x71, 0xD5, 0xFF, 0xFF, 0xD5, 0xF5, + 0xFF, 0xDF, 0x07, 0x10, 0x10, 0x10, 0x7F, 0x7F, 0xFD, 0xDE, 0xFF, 0xFF, + 0xFF, 0xFF, 0x87, 0xFD, 0xFF, 0xFF, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x28, + 0x8F, 0x8F, 0x0C, 0x04, 0x1C, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x41, 0xF9, + 0xAF, 0xE2, 0xEA, 0xFE, 0xFF, 0x9F, 0x06, 0x00, 0xC5, 0x89, 0xCF, 0x62, + 0xE5, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xFC, 0xFF, 0xFF, 0x20, 0x1F, + 0xE6, 0x04, 0x00, 0x30, 0x8F, 0x9F, 0x04, 0x08, 0x03, 0x00, 0xC0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x2F, 0x45, 0xFF, 0x7D, 0xFF, 0xDD, 0xEF, 0xFF, 0xFF, 0xB7, 0x33, + 0xCF, 0x7F, 0xB1, 0xFE, 0x3B, 0x5F, 0xFD, 0xFF, 0xFF, 0x3F, 0xC0, 0xFD, + 0xFF, 0x7F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x30, 0x8F, 0x9F, 0xC4, 0xD8, + 0x01, 0xFF, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xC3, 0xC3, 0x38, 0xE0, 0xEA, 0x89, + 0xEA, 0xDF, 0x8B, 0x24, 0xB8, 0x78, 0xBF, 0xF3, 0xFC, 0xFC, 0xFC, 0xFF, + 0xFF, 0x2F, 0x88, 0xFE, 0xFF, 0x7F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x30, + 0x8F, 0x9F, 0xE4, 0x71, 0xE0, 0xFF, 0x0F, 0x0C, 0x00, 0x00, 0x00, 0x0C, + 0xFC, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xE7, 0xFF, 0x00, 0x00, 0xF0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0xE9, 0x41, + 0xFD, 0x7F, 0x17, 0x77, 0xBF, 0xDF, 0x9B, 0xC3, 0x9F, 0x5F, 0xFF, 0x33, + 0xBB, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x81, 0xDD, 0xFF, 0x7F, 0x20, 0x1F, + 0xE6, 0x04, 0x00, 0x20, 0x8F, 0x9F, 0xE4, 0x01, 0xF8, 0xFF, 0x3F, 0x18, + 0x00, 0x00, 0x00, 0x06, 0x00, 0xC6, 0xFF, 0x03, 0x00, 0x86, 0x07, 0x80, + 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x2F, 0xB1, 0x89, 0x5A, 0xF8, 0xFF, 0x90, 0x4B, 0xDF, 0x83, 0xCC, + 0xB8, 0xDE, 0xEC, 0x77, 0x7E, 0xF9, 0xFF, 0xFF, 0xFF, 0x07, 0xA0, 0xF6, + 0xFF, 0x3F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x20, 0x8F, 0x9F, 0xE4, 0x03, + 0xFE, 0xFF, 0xFF, 0x10, 0x80, 0xFF, 0xFF, 0xC3, 0x00, 0x74, 0x00, 0x0E, + 0x3F, 0xC3, 0x03, 0x80, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x27, 0x3D, 0x93, 0x92, 0xFF, 0xFB, 0xCF, + 0x7B, 0xFF, 0x86, 0x0C, 0xEE, 0xF7, 0x1D, 0x7D, 0x7F, 0xBB, 0xFD, 0xFF, + 0xFF, 0x0F, 0x82, 0xFD, 0xFF, 0x3F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x20, + 0x8F, 0x9F, 0xC4, 0xFF, 0xFF, 0x80, 0xFF, 0x31, 0xE0, 0x00, 0x03, 0xE0, + 0x61, 0x1C, 0x00, 0x98, 0xE0, 0xE1, 0xF9, 0x9F, 0x00, 0x00, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x8B, 0x89, + 0xFA, 0x3F, 0xFD, 0x3F, 0x6A, 0xDE, 0x07, 0xF7, 0xDF, 0xDF, 0xBC, 0xBF, + 0xDF, 0xFE, 0xED, 0xFF, 0xFF, 0x47, 0x90, 0xFC, 0xFF, 0x1F, 0x20, 0x1F, + 0xE6, 0x04, 0x00, 0x20, 0x8F, 0x9F, 0xC4, 0xFF, 0x7F, 0x00, 0xFF, 0x63, + 0x30, 0x00, 0x00, 0xF0, 0xF1, 0x00, 0x7E, 0x70, 0x80, 0xF0, 0xF8, 0x9F, + 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xA7, 0x89, 0xE8, 0x7F, 0x10, 0xFB, 0xFF, 0xD1, 0xD7, 0x93, 0x6F, + 0xFE, 0x9E, 0xFF, 0xFE, 0xFD, 0xBF, 0xEF, 0xFF, 0xFF, 0x07, 0x84, 0xFD, + 0xFF, 0x1F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x20, 0x8F, 0x9F, 0x8C, 0xFF, + 0x7F, 0x1C, 0xDE, 0x43, 0x10, 0x3C, 0xF0, 0xFF, 0xF1, 0x80, 0xFF, 0x61, + 0x06, 0x78, 0xE0, 0x83, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x03, 0xFF, 0x04, 0x0D, 0xFB, 0xFF, + 0x47, 0xE2, 0x87, 0x33, 0xD7, 0xEF, 0xB2, 0xFE, 0xFF, 0xBA, 0xED, 0xFF, + 0xFF, 0x07, 0x91, 0xFC, 0xFF, 0x1F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x20, + 0x8F, 0x9F, 0x0C, 0xFE, 0x7F, 0x36, 0xBC, 0xC7, 0x18, 0xFF, 0xFF, 0xFF, + 0xF1, 0xE1, 0xFF, 0x43, 0x1E, 0x7C, 0xE0, 0x81, 0x00, 0x00, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x67, 0xD4, 0x0F, + 0x22, 0x49, 0xFA, 0xFF, 0xBF, 0xFF, 0x8B, 0x6F, 0xB9, 0xBF, 0xBF, 0xFB, + 0xFD, 0xFE, 0xED, 0xFF, 0xFF, 0x4F, 0x80, 0xFD, 0xFF, 0x0F, 0x20, 0x1F, + 0xE6, 0x04, 0x00, 0x20, 0x8F, 0x9F, 0x1C, 0x3C, 0x77, 0x62, 0x38, 0x8F, + 0x88, 0xFF, 0xFF, 0xFF, 0xF0, 0xF3, 0xFF, 0x47, 0xFE, 0x7F, 0xE2, 0xF0, + 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x37, 0x7F, 0x80, 0x00, 0x13, 0xFE, 0xFF, 0x7F, 0x76, 0x8B, 0x67, + 0xFF, 0xBB, 0xFF, 0xD7, 0xFF, 0xFE, 0xED, 0xFF, 0xFF, 0x07, 0xA2, 0xFE, + 0xFF, 0x0F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x20, 0x8F, 0x8F, 0x7C, 0x38, + 0x77, 0xC2, 0x38, 0x0F, 0x89, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0x83, 0x0F, + 0xFC, 0x37, 0xF3, 0x98, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x07, 0x00, 0x90, 0xFB, 0xFF, 0xFF, + 0x7F, 0xBF, 0x92, 0xF8, 0xFF, 0xFE, 0xFD, 0x76, 0xBF, 0xFE, 0xEF, 0xFF, + 0xFF, 0x87, 0x80, 0xFD, 0xFF, 0x0F, 0x20, 0x1F, 0xE6, 0x04, 0x00, 0x20, + 0x8F, 0x8F, 0xC8, 0x38, 0x77, 0x9E, 0x71, 0x1E, 0xC9, 0xF1, 0x7F, 0x7C, + 0xC0, 0xFF, 0x01, 0x0F, 0xF8, 0x33, 0x71, 0x8C, 0x00, 0x00, 0x80, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x40, + 0x3C, 0x57, 0xFC, 0xFF, 0x7F, 0xF7, 0x83, 0x5C, 0xBD, 0xFF, 0xFF, 0x57, + 0x7F, 0xFE, 0xED, 0xFF, 0xFF, 0x17, 0xA4, 0xBC, 0xFF, 0x07, 0x20, 0x1F, + 0xE6, 0x0C, 0x00, 0x20, 0x8F, 0xCF, 0x98, 0x39, 0x77, 0x36, 0x71, 0x1E, + 0xC9, 0xE0, 0xE3, 0x3C, 0xC4, 0xFF, 0x18, 0x9E, 0xF0, 0x3B, 0x38, 0xF4, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x17, 0x01, 0x81, 0xFF, 0x59, 0xFB, 0xFF, 0x7F, 0x3F, 0x03, 0x94, + 0xEE, 0x97, 0x3D, 0x5F, 0x5F, 0xBB, 0xED, 0xFF, 0xFF, 0x07, 0x84, 0xFD, + 0xFF, 0x07, 0x20, 0x1F, 0xE6, 0x08, 0x00, 0x10, 0x8F, 0xC7, 0x70, 0x39, + 0x77, 0x62, 0x73, 0x3E, 0x09, 0xE0, 0xC1, 0x1C, 0xCE, 0xFD, 0x3C, 0x9E, + 0xE1, 0x19, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x00, 0xC6, 0x6C, 0xED, 0xFC, 0xFF, + 0x7F, 0xFB, 0x87, 0xD7, 0x9E, 0xEE, 0xAD, 0xBF, 0xFF, 0xDF, 0xEF, 0xFF, + 0xFF, 0x87, 0xC0, 0xFC, 0xFF, 0x07, 0x20, 0x1F, 0xE6, 0x08, 0x00, 0x10, + 0xCF, 0xC7, 0xC0, 0x39, 0x77, 0xC2, 0x72, 0x3E, 0x09, 0xE0, 0xC1, 0x1D, + 0xCB, 0xF9, 0x64, 0x9C, 0xE3, 0x19, 0x0E, 0x70, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x60, 0x19, + 0x9A, 0x1B, 0xFA, 0xFF, 0x7F, 0x37, 0x1E, 0x6B, 0xFE, 0x97, 0xBF, 0xFF, + 0xFD, 0xFE, 0xEF, 0xFF, 0xFF, 0x27, 0x88, 0xFD, 0xFF, 0x03, 0x20, 0x1F, + 0xE6, 0x09, 0x00, 0x90, 0xCF, 0xE7, 0x80, 0x39, 0x77, 0x82, 0x73, 0x3C, + 0x3B, 0xF0, 0xC8, 0x9D, 0xC9, 0x79, 0x44, 0x9C, 0xE6, 0x19, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x5F, 0x00, 0x20, 0x3F, 0xBD, 0xFA, 0xFF, 0x7F, 0xDF, 0x87, 0x67, + 0xEF, 0xFF, 0xFF, 0xFA, 0xBF, 0xFF, 0xED, 0xFF, 0xFF, 0x07, 0x81, 0xFC, + 0xFF, 0x03, 0x20, 0x1F, 0xE6, 0x19, 0x00, 0x88, 0xE7, 0x63, 0x00, 0x39, + 0x77, 0x02, 0x73, 0x3C, 0x2A, 0xFE, 0xC8, 0x9D, 0xC8, 0x79, 0xDC, 0x9C, + 0xE4, 0x99, 0xFF, 0x83, 0x01, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x81, 0x28, 0xCF, 0x2A, 0xFF, 0xFF, + 0x7F, 0x6F, 0x83, 0xA0, 0xFE, 0x3F, 0xFF, 0xFF, 0xE7, 0xDD, 0xED, 0xFF, + 0xFF, 0x07, 0xA0, 0xFF, 0xFF, 0x03, 0x30, 0x1F, 0xE6, 0x11, 0x00, 0x88, + 0xE7, 0x63, 0x00, 0x39, 0x77, 0x02, 0xF3, 0x3C, 0x2A, 0x7F, 0xCC, 0x9D, + 0xC8, 0x79, 0xBE, 0x9C, 0xE4, 0xDD, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x60, 0x26, + 0x59, 0xF7, 0xFF, 0xFF, 0x7F, 0x67, 0x0B, 0xDC, 0xFB, 0xDB, 0xFF, 0xD7, + 0xF7, 0xFD, 0xEE, 0xFF, 0xFF, 0x0F, 0x82, 0xFE, 0xFF, 0x01, 0x10, 0x1F, + 0xE6, 0x11, 0x00, 0xC4, 0xF3, 0x61, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x7C, + 0x3A, 0x7C, 0xCC, 0x9D, 0xC8, 0x79, 0xE6, 0x9C, 0xE4, 0xDD, 0xF1, 0x1E, + 0x03, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, + 0xFB, 0x17, 0x08, 0xF7, 0x5D, 0x70, 0xFE, 0xFF, 0x7F, 0xDF, 0x93, 0xC7, + 0x2E, 0xBE, 0xFD, 0x73, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x47, 0x90, 0xFD, + 0xFF, 0x01, 0x10, 0x1F, 0xE6, 0x33, 0x00, 0xC4, 0xF3, 0x31, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0x78, 0x22, 0x7C, 0xCE, 0x9D, 0xC8, 0x79, 0x46, 0x9C, + 0xE4, 0xFD, 0xC0, 0x3C, 0x02, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x4F, 0xD6, 0x57, 0x10, 0xB0, 0x89, 0x9F, 0xFE, 0xFF, + 0x7F, 0x5F, 0x03, 0xFF, 0xE9, 0xDF, 0x7F, 0xFD, 0x7E, 0xFF, 0xEF, 0xFF, + 0xFF, 0x07, 0x84, 0x9C, 0xFF, 0x01, 0x90, 0x1F, 0xE6, 0x23, 0x00, 0xE2, + 0xF9, 0x31, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x78, 0x66, 0x3C, 0xC0, 0x9D, + 0xC8, 0x79, 0x66, 0x9C, 0xC4, 0xFD, 0x80, 0x39, 0x06, 0x00, 0x00, 0xFC, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0xBF, 0x1E, 0xE1, 0x0C, + 0xFA, 0xE9, 0xFE, 0xFF, 0x7F, 0x7F, 0x06, 0x94, 0x7F, 0xE1, 0xAF, 0xBF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x07, 0x91, 0xF5, 0xFF, 0x01, 0x98, 0x1F, + 0xE6, 0x23, 0x00, 0xE2, 0xF9, 0x28, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x78, + 0x24, 0x3E, 0xC0, 0x9D, 0xC8, 0x79, 0x36, 0x9E, 0xC4, 0x7D, 0x8C, 0x71, + 0x04, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0xFD, 0x5B, 0x64, 0xA1, 0xF6, 0x3B, 0xFB, 0xFF, 0x7F, 0xD6, 0x07, 0xCF, + 0xAF, 0xDE, 0xEF, 0xFB, 0xFD, 0x7A, 0xEF, 0xFF, 0xFF, 0x4F, 0x80, 0xFC, + 0xFF, 0x00, 0x8C, 0x1F, 0xE6, 0x47, 0x00, 0xF1, 0x7E, 0x1C, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0x78, 0x34, 0x3E, 0xC2, 0x9D, 0xC8, 0x79, 0x1E, 0x9E, + 0xCC, 0x7D, 0x1C, 0x73, 0x04, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0xD8, 0xFF, 0x17, 0x60, 0x4C, 0xFC, 0x6A, 0xFB, 0xFF, + 0x7F, 0xD7, 0x13, 0x3F, 0xD7, 0x57, 0xFF, 0x72, 0xDF, 0xFD, 0xED, 0xFF, + 0xFF, 0x07, 0xA2, 0xFF, 0xFF, 0x00, 0x86, 0x1F, 0xE6, 0xC7, 0x80, 0x78, + 0x7E, 0x14, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, 0x1C, 0x3F, 0xC2, 0x9D, + 0xC8, 0x79, 0x00, 0x8F, 0xC8, 0x3D, 0x16, 0xF3, 0x04, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x90, 0xFF, 0x5F, 0x80, 0x47, + 0xF2, 0xB4, 0xFE, 0xFF, 0x7F, 0xEB, 0x83, 0x64, 0xF1, 0xFF, 0xFD, 0xFE, + 0x67, 0x5F, 0xED, 0xFF, 0xFF, 0x87, 0x80, 0xFC, 0xFF, 0x00, 0xC3, 0xFF, + 0xEF, 0x87, 0x61, 0xBC, 0x3F, 0x0E, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, + 0x0C, 0x3F, 0xC7, 0x9D, 0xC8, 0x79, 0x80, 0x87, 0xC8, 0x3D, 0x3E, 0xF7, + 0x04, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x47, 0xD1, + 0xFF, 0x3F, 0x81, 0x12, 0x83, 0xD6, 0xFF, 0xFF, 0x7F, 0x57, 0x8B, 0xEF, + 0xFF, 0xDF, 0x77, 0x7F, 0xED, 0xFE, 0xED, 0xFF, 0xFF, 0x17, 0xA4, 0xFD, + 0xFF, 0x80, 0xE1, 0xFF, 0xFF, 0x0F, 0x1F, 0xDE, 0x1F, 0x0F, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0xF8, 0x84, 0x3F, 0xC7, 0x9D, 0xC8, 0x79, 0xF0, 0xC3, + 0xC8, 0x3D, 0x3F, 0xF6, 0x04, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x23, 0x4F, 0xFF, 0x7F, 0x00, 0x88, 0x71, 0xF6, 0xFC, 0xFF, + 0x7F, 0x56, 0x83, 0x93, 0xFE, 0xBE, 0xEF, 0xBF, 0xFB, 0xFD, 0xEF, 0xFF, + 0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x80, 0xF0, 0xFF, 0xFF, 0x1F, 0x0E, 0xFF, + 0x0F, 0x05, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, 0xC0, 0xBF, 0xFF, 0x9D, + 0xC8, 0x79, 0xFC, 0x61, 0xC8, 0x1D, 0x37, 0xF6, 0x04, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xC2, 0xFF, 0x1F, 0x90, 0x38, + 0x4B, 0x9C, 0xFF, 0xFF, 0x7F, 0x5F, 0x97, 0x8F, 0xDF, 0xFF, 0x77, 0xFD, + 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0x87, 0x80, 0xBD, 0x7F, 0xC0, 0xF8, 0xFF, + 0xFF, 0x3F, 0x80, 0xFF, 0x87, 0x07, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, + 0xE0, 0xBF, 0xFF, 0x9D, 0xC8, 0x39, 0x7F, 0x30, 0xC8, 0x1D, 0x73, 0xF6, + 0x04, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x4C, + 0xFF, 0x5F, 0xEC, 0xDC, 0x88, 0x3B, 0xFE, 0xFF, 0x7F, 0xEE, 0x07, 0x77, + 0xFE, 0xFA, 0x7C, 0xBE, 0xFF, 0xBF, 0x2F, 0x00, 0xFE, 0x07, 0x88, 0xF4, + 0x7F, 0x60, 0xFC, 0xFF, 0xFF, 0x7F, 0xC0, 0xFF, 0xC3, 0x03, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0xF8, 0xF0, 0xBF, 0xFF, 0x9D, 0xC8, 0xB9, 0xFF, 0x11, + 0xC8, 0x9D, 0x63, 0xF6, 0x04, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xA5, 0x73, 0xFF, 0x1F, 0xE5, 0x85, 0xBC, 0xF2, 0xFF, 0xFF, + 0x7F, 0xFF, 0x0B, 0x8F, 0x7F, 0x9F, 0xBF, 0xFF, 0xFF, 0xFF, 0x2F, 0x00, + 0x00, 0x0E, 0x80, 0xFD, 0x7F, 0x20, 0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, + 0x63, 0x01, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, 0xF0, 0x3F, 0xC7, 0x9D, + 0xC8, 0xB9, 0xFB, 0x31, 0xC8, 0x9D, 0x61, 0xF6, 0x04, 0x00, 0x00, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xB9, 0xFF, 0x7F, 0x20, 0x8A, + 0xD1, 0x3F, 0xFF, 0xFF, 0xFF, 0x1F, 0x02, 0x77, 0xCD, 0xB7, 0xFF, 0x7F, + 0xFF, 0xBF, 0x1F, 0x00, 0x00, 0xF0, 0x80, 0xFC, 0x7F, 0x20, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x01, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, + 0x30, 0x3F, 0xC7, 0x9D, 0xC8, 0xB9, 0xF1, 0x23, 0xC8, 0x8D, 0x61, 0xF6, + 0x04, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x49, 0xE6, + 0xFF, 0x1F, 0x84, 0x53, 0xB6, 0xDC, 0xFF, 0xFF, 0x7F, 0x00, 0x92, 0xFF, + 0xBA, 0x7E, 0xF1, 0xFF, 0xF7, 0xFF, 0xFD, 0x07, 0x00, 0x00, 0x83, 0xFD, + 0x7F, 0x20, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x7F, 0xD0, 0x00, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0xF8, 0x00, 0x1F, 0xC2, 0x9D, 0xC8, 0xB9, 0xE1, 0x23, + 0xC8, 0x8D, 0x41, 0xF6, 0x04, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x33, 0xD9, 0xD2, 0xFF, 0x7F, 0x90, 0x15, 0xE7, 0x67, 0xFC, 0x7F, + 0x08, 0x04, 0x8A, 0xC7, 0xBF, 0x7F, 0x7F, 0xFF, 0x7D, 0xFD, 0xFF, 0xFF, + 0x3F, 0x00, 0x9C, 0xFC, 0x3F, 0x20, 0x7F, 0x00, 0xE0, 0xFF, 0xFF, 0x3F, + 0x78, 0x00, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, 0x00, 0x1F, 0xC2, 0x9D, + 0xC8, 0xB9, 0xE3, 0x27, 0xC8, 0xCD, 0x40, 0xF6, 0x04, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x21, 0xCD, 0xFF, 0x3F, 0x91, 0xE4, + 0x95, 0xFB, 0xFB, 0x2F, 0x04, 0x51, 0x86, 0xDC, 0xB9, 0xBF, 0xFF, 0x33, + 0x7B, 0xFE, 0xFF, 0xCF, 0xFF, 0xFF, 0xE3, 0xFD, 0x3F, 0x20, 0x3F, 0x38, + 0xC0, 0xFF, 0xFF, 0x0F, 0x3E, 0x00, 0x00, 0x39, 0x77, 0x02, 0xF2, 0xF8, + 0x3C, 0x1F, 0xC0, 0x9D, 0xC8, 0xB9, 0xE7, 0x27, 0xC8, 0xCD, 0x40, 0xF6, + 0x04, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x51, 0x1D, + 0xFF, 0x5F, 0x70, 0x17, 0xEE, 0xB4, 0xFE, 0xC3, 0x72, 0xEC, 0x0B, 0xA3, + 0xDE, 0xF7, 0xBB, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xBE, 0xFF, 0xFF, 0xBE, + 0x3F, 0x20, 0x3F, 0xEC, 0x87, 0xFF, 0xFF, 0x03, 0x13, 0x00, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0x78, 0x24, 0x1F, 0xC0, 0x9D, 0xC8, 0x39, 0xC7, 0x67, + 0xC8, 0xCD, 0x40, 0xF6, 0x04, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xB9, 0x79, 0xEC, 0xFF, 0x1F, 0x70, 0x9A, 0xA8, 0x73, 0xFF, 0x51, + 0xC2, 0xDF, 0x1B, 0x8B, 0xFE, 0x77, 0x9F, 0xFF, 0xFE, 0xFC, 0xFF, 0xBF, + 0xBE, 0xFF, 0xFF, 0xBD, 0x3F, 0x20, 0x1E, 0x02, 0x0C, 0xFF, 0x7F, 0xC0, + 0x19, 0x00, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x78, 0x24, 0x8F, 0xCF, 0x9D, + 0xC8, 0x39, 0xC3, 0x47, 0xC8, 0xCD, 0x60, 0x76, 0x04, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x51, 0x09, 0xE2, 0xFF, 0x5F, 0xA0, 0x2A, + 0xC0, 0xDB, 0x7E, 0x88, 0xFF, 0xFF, 0x8F, 0xE7, 0x2F, 0xDD, 0xEF, 0xFF, + 0xFF, 0x3B, 0xFF, 0xF7, 0xFE, 0x1E, 0xFF, 0x9C, 0x3F, 0x20, 0x00, 0x39, + 0x18, 0x78, 0x0F, 0x70, 0x0E, 0x00, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x78, + 0x26, 0x8F, 0xCC, 0x9D, 0xC9, 0x39, 0xC0, 0x47, 0xC8, 0x4D, 0x20, 0x76, + 0x04, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x79, 0xC1, 0xDB, + 0xFF, 0x3F, 0x7D, 0x9F, 0x2B, 0x3C, 0xBF, 0x3F, 0xD9, 0xF7, 0x4F, 0x2F, + 0xEE, 0xF7, 0xBF, 0xFF, 0xFF, 0xAD, 0x7F, 0xFF, 0xFF, 0xEF, 0xFF, 0xEF, + 0x3F, 0x60, 0x80, 0xED, 0x37, 0x00, 0x00, 0x1E, 0x03, 0x00, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0x78, 0x22, 0xCF, 0xC6, 0x1D, 0xC9, 0x39, 0xC0, 0x4F, + 0xC8, 0x4D, 0x20, 0x76, 0x06, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xB1, 0x31, 0xB4, 0xFF, 0x7F, 0x62, 0x72, 0xFD, 0x59, 0xF9, 0x5D, + 0xCB, 0xF6, 0x47, 0xC7, 0xFF, 0xB9, 0xDF, 0xF7, 0xFB, 0xBF, 0xFD, 0xDF, + 0xCE, 0xFF, 0xFF, 0xFD, 0x3F, 0xE0, 0xFF, 0x02, 0xEC, 0x01, 0xE0, 0xC3, + 0x01, 0x00, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x78, 0x32, 0xCF, 0xC3, 0x1D, + 0xCB, 0x39, 0xC0, 0x4F, 0xC8, 0xCD, 0x20, 0x3F, 0x06, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xC1, 0xD1, 0xFF, 0x1F, 0x80, 0x6E, + 0xE8, 0xF9, 0xFF, 0xD7, 0xFE, 0xFF, 0xDF, 0xF7, 0xBF, 0x7F, 0xB6, 0xFF, + 0xDD, 0xFF, 0x7D, 0xF3, 0xDF, 0xFF, 0xFE, 0xFF, 0x3F, 0x20, 0x00, 0x01, + 0x18, 0xFF, 0x3F, 0x70, 0x00, 0x00, 0x00, 0x39, 0x77, 0x02, 0xF2, 0x78, + 0x12, 0x07, 0xE0, 0x3D, 0xCA, 0x39, 0xC0, 0x4F, 0xCC, 0x8D, 0x21, 0x3F, + 0x06, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0xC9, 0x8B, + 0xFF, 0x5F, 0x72, 0x61, 0x46, 0xAB, 0xFA, 0xF5, 0xE7, 0xD9, 0x82, 0xD8, + 0x7B, 0xBF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, + 0x1F, 0x60, 0x80, 0x01, 0x30, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x39, + 0x77, 0x02, 0xF2, 0x3C, 0x12, 0x07, 0xF0, 0x3F, 0xCE, 0x79, 0xC0, 0x4F, + 0xC4, 0x0D, 0x23, 0x3F, 0x07, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xD1, 0x21, 0xEA, 0xFF, 0x17, 0x15, 0x8C, 0xAF, 0x73, 0xFA, 0xFE, + 0xFC, 0xD5, 0xC7, 0xDF, 0x8E, 0xFF, 0xF7, 0x9B, 0xFB, 0xFF, 0xFE, 0xB7, + 0xFF, 0xFF, 0xF9, 0xFF, 0x1F, 0xC0, 0xFF, 0x00, 0xE0, 0x01, 0xE0, 0x03, + 0x00, 0x00, 0x00, 0x39, 0x77, 0x02, 0x72, 0x3C, 0x9A, 0xFF, 0xFF, 0x7F, + 0xCC, 0x7F, 0xC0, 0x4F, 0xC6, 0x1D, 0x26, 0x3F, 0x03, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x91, 0x4C, 0xFF, 0x53, 0xE0, 0x22, + 0x19, 0xB6, 0x7E, 0xEF, 0x7F, 0xFB, 0x52, 0xDA, 0xFF, 0x37, 0xAF, 0xFF, + 0xFD, 0xFC, 0xFF, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x39, 0x77, 0x02, 0x72, 0x3C, + 0x8B, 0xFF, 0xFF, 0x7F, 0xC4, 0xFF, 0xC0, 0x4F, 0xE3, 0x3B, 0x2C, 0x1F, + 0x03, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x91, 0xE6, + 0xFF, 0x31, 0xC4, 0x9A, 0x5A, 0x9F, 0xBB, 0xFE, 0xFF, 0xFF, 0xDF, 0xAA, + 0xEE, 0xDE, 0xFF, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xEF, 0x9F, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, + 0x77, 0x02, 0x72, 0x3C, 0x89, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x81, 0x4F, + 0xE1, 0x7F, 0x28, 0x1F, 0x03, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x51, 0x21, 0xCA, 0xFF, 0x50, 0x8C, 0x2E, 0xDC, 0xDF, 0xFE, 0x6F, + 0xF7, 0xEF, 0x0F, 0x7B, 0xAE, 0xFA, 0xBF, 0xBF, 0xFF, 0xFF, 0x7F, 0xFF, + 0xBE, 0x7F, 0xEF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x39, 0x77, 0x02, 0x72, 0x3C, 0xCD, 0x03, 0xE0, 0xFF, + 0xE0, 0xFF, 0x83, 0x4F, 0xF1, 0xFF, 0x28, 0x1F, 0x01, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x79, 0x81, 0x62, 0x7F, 0x18, 0xF1, 0xE6, + 0xD3, 0x39, 0xFF, 0xFA, 0xD9, 0xEC, 0x4F, 0x2F, 0xEF, 0xDF, 0xDF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xFF, 0xFB, 0xFF, 0xFB, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x77, 0x02, 0x72, 0x1E, + 0xC7, 0x01, 0x00, 0xFF, 0xF1, 0xFF, 0x87, 0x4F, 0xF9, 0xFF, 0x29, 0x1E, + 0x01, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x91, 0xCC, + 0x3F, 0x7C, 0x40, 0xF6, 0xDC, 0xD3, 0xFE, 0xBF, 0xDF, 0xEF, 0x4B, 0xC4, + 0xD5, 0x77, 0x7F, 0xFD, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFD, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, + 0x77, 0x02, 0x73, 0x1E, 0xC3, 0xF1, 0x07, 0xF8, 0x71, 0x80, 0x87, 0xCF, + 0x39, 0xC0, 0x29, 0x1E, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xD9, 0xA1, 0xCF, 0x9F, 0x3B, 0x14, 0x8B, 0x20, 0x6A, 0xFE, 0xF7, + 0xDD, 0xFA, 0x1B, 0xFE, 0xBF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFB, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x39, 0x77, 0x02, 0x71, 0x8F, 0xE3, 0x19, 0x3C, 0xC0, + 0x30, 0x00, 0x06, 0x8F, 0x19, 0x80, 0x69, 0x1E, 0x03, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x03, 0x11, 0x6F, 0x71, 0x62, 0xD8, + 0x35, 0x3F, 0x7F, 0xFF, 0xFD, 0xFA, 0xC7, 0xDB, 0xAA, 0xFF, 0xFF, 0x5E, + 0x57, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x77, 0x86, 0x31, 0x8F, + 0xF1, 0x09, 0xE0, 0x01, 0x00, 0x1E, 0x00, 0x8F, 0x01, 0x0F, 0x68, 0x1C, + 0x06, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0xA5, 0xC9, + 0x5F, 0x14, 0xF9, 0x0E, 0xB7, 0xA9, 0xFE, 0x6F, 0xFF, 0xFF, 0xC7, 0xFC, + 0x7F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xDF, 0xFF, 0xFF, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, + 0x77, 0x8C, 0xB8, 0x8F, 0xF1, 0xF8, 0x07, 0x0F, 0x00, 0x73, 0x20, 0x9F, + 0x81, 0x19, 0x68, 0x3C, 0x04, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x39, 0x25, 0x4A, 0xAF, 0x7F, 0x84, 0xA9, 0xF8, 0x7A, 0xBF, 0xED, + 0x7F, 0xF7, 0x5E, 0x6F, 0xBF, 0xFB, 0x3B, 0xF3, 0xFF, 0x7B, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3C, 0x77, 0xD8, 0xF8, 0xC7, 0xF9, 0x18, 0x3C, 0xF8, + 0xFF, 0xC1, 0x3F, 0x1F, 0xFF, 0xF0, 0xEF, 0x78, 0x04, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x91, 0x83, 0x2F, 0x38, 0xC1, 0x1A, + 0xD5, 0x25, 0xBB, 0x7E, 0xFB, 0xDF, 0x57, 0x8F, 0x4F, 0xFF, 0xFF, 0xFE, + 0x3F, 0xEF, 0x7F, 0xFE, 0xFF, 0x7D, 0xFF, 0xBF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x70, 0xFC, 0xC3, + 0x79, 0x0C, 0xE0, 0x01, 0x00, 0x1E, 0x20, 0x1F, 0x0E, 0x0F, 0xC8, 0xF0, + 0x04, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x51, 0x81, 0x58, + 0xFF, 0x77, 0x8C, 0xA2, 0x7C, 0x6D, 0xFD, 0xFB, 0xFB, 0xEB, 0x43, 0x7F, + 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xBD, 0x9F, 0xEF, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, + 0xFF, 0x00, 0xFC, 0xE3, 0x79, 0x0C, 0x00, 0x0F, 0x00, 0x73, 0x20, 0x3E, + 0x98, 0x19, 0xC8, 0xC1, 0x04, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x79, 0x25, 0x4A, 0x7F, 0x7A, 0x91, 0xEE, 0x7D, 0xF7, 0xFE, 0x7E, + 0xD7, 0xEF, 0x0B, 0xCB, 0xBF, 0xFF, 0xF6, 0xDD, 0xDF, 0xFF, 0x7F, 0xEF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC2, 0xFF, 0xFF, 0x03, 0xFE, 0x71, 0x31, 0x0E, 0x00, 0xF8, + 0xFF, 0xC1, 0x3F, 0x7E, 0xF0, 0xF0, 0xCF, 0x03, 0x04, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x21, 0x91, 0x3F, 0xDF, 0x72, 0xC4, + 0x98, 0x8F, 0xFE, 0xFF, 0xF7, 0xF2, 0x4F, 0xC7, 0xA7, 0xEB, 0x7F, 0xFF, + 0xE6, 0xFE, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xFF, 0xFF, 0x0F, 0xFF, 0x50, + 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFC, 0x11, 0x00, 0x80, 0x0E, + 0x04, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xD1, 0xD8, + 0xCF, 0x19, 0xE4, 0xBB, 0xE7, 0x2A, 0xFA, 0xFB, 0x7E, 0xFF, 0xD2, 0x9A, + 0xF9, 0xBF, 0xFA, 0xDF, 0xFF, 0xF9, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x07, + 0xC0, 0xFF, 0x7F, 0x78, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x60, 0xF8, + 0x13, 0x00, 0x80, 0xF9, 0x07, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x31, 0x0D, 0x52, 0x37, 0x76, 0xA1, 0xCA, 0xAD, 0xFF, 0x3F, 0xDF, + 0xEF, 0xF1, 0xCF, 0x9F, 0xDF, 0xFF, 0x6F, 0xFE, 0xFF, 0xFD, 0xFD, 0xFE, + 0x7F, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0x01, 0x00, 0xFF, 0x1F, 0x3C, 0xFD, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xE0, 0x11, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x81, 0xE0, 0x97, 0x35, 0x8D, 0x22, + 0x7D, 0xC9, 0xFE, 0xFE, 0xBB, 0xF7, 0x17, 0xF8, 0x6F, 0xDF, 0xF7, 0xFF, + 0xFE, 0xF3, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xE0, 0x0F, 0xFE, 0x0F, 0x16, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x10, 0x00, 0x00, 0x0E, + 0x04, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0xC1, 0x16, + 0xEF, 0x7C, 0x94, 0x6F, 0xAF, 0x1F, 0x7E, 0xBF, 0xBF, 0xF7, 0x43, 0x3F, + 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, 0x76, 0xFF, 0xFF, 0xFF, 0x7F, 0xEF, 0xBF, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x30, + 0x38, 0xF8, 0x81, 0x1B, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, + 0x18, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xB9, 0x11, 0xC1, 0xBF, 0x3A, 0x92, 0x75, 0xAD, 0x99, 0xFF, 0xF3, + 0xED, 0xCF, 0x57, 0xC7, 0xE6, 0x77, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, + 0xFE, 0xBF, 0x9F, 0xBF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x1F, 0x02, 0x0C, 0x60, 0x00, 0xC0, 0x0C, 0xFC, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x51, 0x21, 0x5C, 0xF7, 0xFE, 0x10, 0x11, + 0x7D, 0x6A, 0xFE, 0x7D, 0x7F, 0xFF, 0x4F, 0xF7, 0xF6, 0xBF, 0xAF, 0xFF, + 0xFB, 0xF7, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, 0xBF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0xC0, 0xFF, 0xFF, 0x30, 0x10, 0x06, 0xE6, 0xCF, 0x01, 0x78, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x79, 0x81, 0x41, + 0x7F, 0xF9, 0x67, 0xC9, 0x60, 0xF7, 0xFF, 0xDF, 0xF5, 0xEF, 0x03, 0xD7, + 0x8F, 0xEF, 0xFF, 0xFD, 0xFF, 0x3D, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x80, 0x13, 0x10, 0xFA, 0x33, + 0x38, 0xFF, 0x8F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x11, 0xC1, 0x98, 0x97, 0x5D, 0x61, 0xC8, 0xF7, 0xCD, 0xFC, 0xF2, + 0xEE, 0xF5, 0xCB, 0xF0, 0xDF, 0xFF, 0xFE, 0xFF, 0xA7, 0x2B, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF7, 0xFD, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, + 0x1E, 0x13, 0x02, 0x0C, 0x60, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x15, 0xC6, 0x7F, 0x7F, 0x84, 0x37, + 0x8F, 0x7F, 0xFA, 0x8B, 0xBB, 0xF7, 0xDF, 0xFC, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFD, 0xE7, 0xFF, 0xFB, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, + 0x00, 0x06, 0xFE, 0x1F, 0x8C, 0x13, 0x04, 0x06, 0xC0, 0x01, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x21, 0x61, + 0x3F, 0x7B, 0x99, 0x9A, 0xD8, 0xB6, 0xFB, 0xED, 0xBB, 0xF3, 0x4F, 0x8B, + 0xD9, 0xBF, 0xFF, 0xFF, 0xFD, 0xF9, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, + 0x3F, 0x00, 0x00, 0x00, 0x80, 0x83, 0xFF, 0x7F, 0x80, 0x13, 0xF8, 0x03, + 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, + 0x00, 0x00, 0xFF, 0xDF, 0xC0, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x11, 0xA1, 0xC8, 0x5F, 0x96, 0x25, 0x58, 0x8F, 0x3B, 0xFF, 0x3C, + 0xF9, 0xEF, 0x0F, 0xAC, 0x6E, 0x76, 0x37, 0xFB, 0xFF, 0xFE, 0xFF, 0xFE, + 0xFF, 0x7D, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xFF, 0xFF, + 0xC0, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, + 0xF8, 0x0F, 0xE4, 0x1F, 0x00, 0xC0, 0x01, 0x70, 0x80, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x41, 0x43, 0xFF, 0x7E, 0x80, 0xFF, + 0xE7, 0xFE, 0x7E, 0xF7, 0xC5, 0xEF, 0x0B, 0x6B, 0xBF, 0xFF, 0xFD, 0xFF, + 0x3F, 0x77, 0xFF, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, + 0x60, 0xF0, 0xFF, 0xFF, 0xE3, 0x11, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, + 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x00, 0x3C, 0x30, 0x00, 0x60, 0x00, 0x40, + 0x8C, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x51, 0xB3, + 0xBF, 0xBE, 0xE0, 0x21, 0x90, 0xF7, 0xFF, 0x7F, 0x7F, 0xDF, 0x57, 0xCF, + 0xB8, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xEE, 0xBF, + 0x3F, 0x00, 0x00, 0x00, 0x30, 0xFC, 0xFF, 0xFF, 0xFF, 0x11, 0x00, 0x00, + 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x06, 0xC0, 0x18, 0x20, + 0x00, 0x30, 0xF8, 0x03, 0x9E, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x11, 0x89, 0x4E, 0xF7, 0x55, 0x7E, 0x96, 0xFB, 0x58, 0xFD, 0xDB, + 0xFD, 0xFD, 0x43, 0xDF, 0x97, 0xA7, 0xBF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCE, + 0xFB, 0xFF, 0x9F, 0xEF, 0x3F, 0x00, 0x00, 0x00, 0x18, 0xFE, 0x7F, 0xE0, + 0xFF, 0x19, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0xC4, 0xF0, 0xFF, + 0xC3, 0xE1, 0x00, 0x23, 0x00, 0x18, 0xFE, 0x0F, 0x9E, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0xC3, 0xF2, 0x7F, 0x3F, 0xE0, 0xC9, + 0x76, 0x33, 0xFE, 0xF6, 0xEF, 0xFB, 0x43, 0xDC, 0xBF, 0xEF, 0xFC, 0xFF, + 0x3F, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x3F, 0x00, 0x00, 0x00, + 0x08, 0xFF, 0x0F, 0xC0, 0xFF, 0x98, 0xFF, 0xFF, 0xC3, 0x08, 0xE0, 0xFF, + 0x03, 0xE4, 0x01, 0x00, 0xE0, 0xE3, 0x81, 0x27, 0x00, 0x08, 0xFF, 0x1F, + 0x8F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x01, 0xA6, + 0x9F, 0x53, 0x65, 0x99, 0xB5, 0xE8, 0xFF, 0xB6, 0xBB, 0xE7, 0xE7, 0xDF, + 0xF6, 0xBE, 0x7F, 0xFF, 0xFF, 0xBB, 0xFF, 0xE7, 0xBF, 0xFF, 0xFF, 0xFD, + 0x3F, 0x00, 0x00, 0x00, 0x8C, 0xBF, 0x07, 0x06, 0xFF, 0xF8, 0x00, 0x00, + 0xE0, 0x09, 0x3C, 0x00, 0x0E, 0xE4, 0x03, 0x00, 0xF0, 0xE1, 0xC3, 0x27, + 0x00, 0x8C, 0x1F, 0xBF, 0x8F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x19, 0x45, 0xD5, 0xFF, 0x3C, 0x92, 0xCC, 0xFD, 0x6E, 0xFE, 0xEC, + 0x3F, 0xE7, 0xCF, 0x48, 0x76, 0xBB, 0xE9, 0xBF, 0xFE, 0xFF, 0xFC, 0xFF, + 0x7F, 0xF3, 0xFD, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xC4, 0xDF, 0xC3, 0x0F, + 0x7E, 0x3C, 0x00, 0x00, 0xF0, 0x09, 0x07, 0x00, 0xF8, 0xC7, 0xFF, 0xFF, + 0xFF, 0xC0, 0xFF, 0x23, 0x00, 0xC4, 0x0F, 0xFC, 0xCF, 0x00, 0x00, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x49, 0xC0, 0xB7, 0xFF, 0xE4, 0x3A, + 0xF7, 0x9D, 0x7E, 0x7F, 0xDB, 0xEF, 0xAE, 0xEC, 0xAE, 0xFE, 0x6E, 0xBF, + 0xFC, 0xF0, 0xFF, 0xCF, 0xFD, 0xFF, 0xFB, 0xFF, 0x7F, 0x00, 0x00, 0x00, + 0xC6, 0xEF, 0x61, 0x38, 0x7E, 0x14, 0x3C, 0xF8, 0xFF, 0x89, 0x01, 0x7F, + 0x20, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x21, 0x00, 0xC6, 0x0F, 0xF8, + 0xC7, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x01, 0xEB, + 0xD7, 0xBD, 0x04, 0x8E, 0x65, 0xC7, 0xFE, 0xF5, 0xDB, 0xF7, 0x0F, 0xDF, + 0x2E, 0xB7, 0x5F, 0x7E, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, + 0x7F, 0x00, 0x00, 0x00, 0xE2, 0xE7, 0x30, 0x60, 0x7C, 0x1E, 0xFF, 0xFF, + 0xFF, 0xC9, 0xE0, 0xFF, 0x01, 0x80, 0xFF, 0xFF, 0x7F, 0x8C, 0xE7, 0x31, + 0x00, 0xE2, 0xC6, 0xF0, 0xC7, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x39, 0xA1, 0x10, 0x3F, 0x7E, 0xE1, 0xFD, 0x37, 0xF1, 0xFD, 0xFD, + 0x97, 0xFD, 0x73, 0x2F, 0xB9, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xE3, 0xF3, 0x18, 0x46, + 0x7C, 0x8A, 0xFF, 0xFF, 0xFF, 0x68, 0xF8, 0xFF, 0x07, 0x83, 0xBF, 0xFF, + 0x7F, 0x1C, 0xE7, 0x39, 0x00, 0x62, 0xC7, 0xF1, 0xE7, 0x00, 0x00, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x11, 0xA4, 0xAF, 0x3B, 0x6F, 0x88, + 0xFD, 0xB9, 0xFE, 0xEF, 0xEE, 0xEB, 0x63, 0xC4, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x7F, 0x00, 0x00, 0x00, + 0xF1, 0x73, 0xCC, 0xCF, 0x7C, 0x8A, 0xFF, 0xFF, 0xFF, 0x28, 0xFC, 0xE0, + 0x8F, 0x93, 0x1F, 0xEF, 0x7D, 0x16, 0xE7, 0x29, 0x00, 0x72, 0x67, 0xE3, + 0x67, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x19, 0xC2, + 0x5F, 0x5C, 0xEC, 0x3B, 0xAC, 0xBA, 0xFE, 0xF9, 0x6B, 0xD1, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0xF1, 0x71, 0x64, 0xB8, 0x38, 0xCA, 0xF1, 0x7F, + 0x7C, 0x3C, 0x7E, 0x80, 0xDF, 0x93, 0x0F, 0xE7, 0x78, 0x3E, 0xE7, 0x39, + 0x00, 0x73, 0x23, 0xE2, 0x67, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x39, 0xA1, 0x42, 0x7F, 0xFA, 0x95, 0xF4, 0xFB, 0xBA, 0xFE, 0xFF, + 0xD8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0xF9, 0x31, 0x36, 0xE0, + 0x38, 0xCA, 0xE0, 0xE3, 0x3C, 0x14, 0x3F, 0x04, 0xFE, 0x91, 0x07, 0x67, + 0x78, 0x3E, 0xE7, 0x18, 0x00, 0x31, 0xE3, 0xC6, 0x63, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x01, 0xB8, 0xD7, 0xDB, 0x8A, 0x9E, + 0xD5, 0x37, 0xFC, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x00, 0x00, 0x80, + 0xF8, 0x39, 0x1A, 0x70, 0x38, 0x0B, 0xE0, 0xC1, 0x1C, 0x1E, 0x1F, 0x1E, + 0xFC, 0x90, 0x07, 0x67, 0x70, 0x36, 0xE7, 0x08, 0x00, 0x31, 0xF3, 0xC5, + 0x23, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x11, 0xC4, + 0x7F, 0x3E, 0xAC, 0x22, 0x5D, 0x36, 0xFF, 0xFC, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xFF, 0x00, 0x00, 0xC0, 0xF8, 0x38, 0x0F, 0x30, 0x38, 0x0D, 0xE0, 0xC1, + 0x1D, 0x8B, 0x1B, 0x73, 0xFC, 0x98, 0x23, 0x67, 0x70, 0x32, 0xE7, 0x0C, + 0x00, 0xB9, 0x73, 0xCF, 0x33, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x31, 0xA1, 0x0B, 0xF7, 0x7F, 0x99, 0xAC, 0x99, 0x03, 0xFA, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0x00, 0x00, 0x40, 0xFC, 0x18, 0x05, 0x10, + 0x3C, 0x3D, 0xF0, 0xC8, 0x9D, 0x89, 0x99, 0xC5, 0x78, 0x9C, 0x23, 0x27, + 0x72, 0x22, 0xE7, 0x0C, 0x80, 0xB9, 0x31, 0xCA, 0x33, 0x00, 0x00, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x01, 0xF1, 0x5F, 0x5E, 0x06, 0x24, + 0xC9, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0x01, 0x00, 0x40, + 0xFC, 0x1C, 0x07, 0x10, 0x1F, 0x25, 0xFE, 0xC8, 0x9D, 0xC8, 0x8D, 0x9E, + 0x78, 0x94, 0x31, 0x27, 0x72, 0x22, 0xE7, 0x0C, 0x80, 0x98, 0x31, 0xCE, + 0x31, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x1D, 0xC1, + 0xBF, 0x7F, 0xF8, 0xD9, 0x23, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, + 0xFF, 0x01, 0x00, 0x40, 0xFE, 0x9C, 0x03, 0x10, 0x1F, 0x25, 0x7F, 0xCC, + 0x9D, 0xC8, 0x8D, 0xF3, 0x71, 0x9E, 0x31, 0x27, 0x63, 0x22, 0xE7, 0x0C, + 0x80, 0x98, 0x39, 0xCC, 0x31, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x39, 0x21, 0xCA, 0xEF, 0xBE, 0xE4, 0x72, 0xF9, 0xFF, 0xFB, 0xFF, + 0xFF, 0xFF, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x60, 0x7E, 0x9C, 0x03, 0x10, + 0x8F, 0x25, 0x7C, 0xCC, 0x9D, 0xC8, 0x8D, 0xC1, 0x61, 0x8A, 0x39, 0x27, + 0x63, 0x26, 0xE7, 0x04, 0x80, 0x9C, 0x19, 0x8C, 0x19, 0x00, 0x00, 0xFC, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x81, 0x52, 0x77, 0xDF, 0x2C, 0x15, + 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x20, + 0x7E, 0x9C, 0x01, 0x10, 0x80, 0x24, 0x7C, 0xCE, 0x9D, 0xC8, 0x0D, 0xFF, + 0x71, 0x8A, 0x39, 0x27, 0x67, 0x24, 0xE7, 0x04, 0x80, 0x9C, 0x09, 0x0C, + 0x18, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x81, 0xC8, + 0x6F, 0x7B, 0x0C, 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x03, 0x00, 0x20, 0x7E, 0x9C, 0x01, 0x30, 0xC0, 0x62, 0x3C, 0xC0, + 0x9D, 0xC8, 0x1D, 0x80, 0x79, 0xCE, 0x39, 0x27, 0x67, 0x2C, 0xE7, 0x04, + 0x80, 0x9C, 0xF9, 0xC7, 0x18, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x11, 0x25, 0xC2, 0xBF, 0xDD, 0x04, 0xFE, 0xFF, 0xD3, 0x1F, 0xFF, + 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, 0x03, 0x00, 0x20, 0x7F, 0x9C, 0x01, 0xF0, + 0x7F, 0x22, 0x3E, 0xC0, 0x9D, 0xC8, 0x3D, 0x00, 0x30, 0xC6, 0x39, 0x27, + 0xE7, 0x28, 0xE7, 0x04, 0x80, 0x9C, 0x01, 0xE0, 0x1C, 0x00, 0x00, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x01, 0xDB, 0x6F, 0xDC, 0xFC, 0xFF, + 0xFF, 0xCA, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x03, 0x00, 0x20, + 0x3F, 0x9C, 0x00, 0x10, 0x00, 0x31, 0x3E, 0xC2, 0x9D, 0xC8, 0xF9, 0x7F, + 0x00, 0xC6, 0x28, 0x27, 0xC7, 0x28, 0xE7, 0x04, 0x80, 0x9C, 0x01, 0xE0, + 0x0C, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x61, 0x90, + 0x37, 0xF7, 0xFF, 0xFF, 0x31, 0xF1, 0x7F, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, + 0xFF, 0x07, 0x00, 0x20, 0x3F, 0x9C, 0x00, 0x10, 0x00, 0x19, 0x3F, 0xC2, + 0x9D, 0x88, 0xF3, 0xFF, 0x03, 0xE7, 0x28, 0x27, 0xC5, 0x29, 0xE7, 0x04, + 0x80, 0x9C, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x11, 0x09, 0xF3, 0xDF, 0xFD, 0xFF, 0xFF, 0xD2, 0xD2, 0xFF, 0xFA, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x20, 0x3F, 0x9C, 0x00, 0x30, + 0x80, 0x0C, 0x3F, 0xC7, 0x9D, 0x88, 0xC7, 0xFF, 0x07, 0xE7, 0x2C, 0x27, + 0xCD, 0x29, 0xE7, 0xC4, 0xBF, 0x9C, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x19, 0x84, 0x4F, 0xFF, 0xFF, 0x3D, + 0x2D, 0xED, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x20, + 0x3F, 0x9C, 0x00, 0xE0, 0x7F, 0x86, 0x3F, 0xC7, 0x9D, 0x18, 0x1F, 0xFE, + 0x1F, 0xE6, 0x2C, 0x27, 0xCD, 0x29, 0xE7, 0x44, 0xE0, 0x9C, 0x01, 0xE0, + 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x43, 0x20, + 0xEF, 0xFF, 0x7F, 0xEA, 0xAB, 0xEA, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, + 0xFF, 0x0F, 0x00, 0x20, 0x3F, 0x9C, 0x00, 0x00, 0x00, 0xC2, 0xBF, 0xFF, + 0x9D, 0x10, 0xFF, 0xFF, 0x3F, 0x46, 0x2C, 0x27, 0x8D, 0x28, 0xE7, 0x44, + 0xC0, 0x9C, 0x01, 0xE0, 0x04, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x11, 0x81, 0x44, 0xFF, 0xFF, 0x3F, 0xD5, 0x55, 0xD5, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x0F, 0x00, 0x20, 0x3F, 0x9C, 0x00, 0x00, + 0x00, 0xE2, 0xBF, 0xFF, 0x9D, 0x30, 0xFE, 0xFF, 0x7B, 0x04, 0x2C, 0x27, + 0x0D, 0x28, 0xE7, 0x44, 0x86, 0x9C, 0xF9, 0xE7, 0x04, 0x00, 0x80, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x01, 0xF0, 0xFF, 0xFF, 0xBF, 0x7A, + 0x6E, 0xEA, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x20, + 0x3F, 0x9C, 0x00, 0x00, 0x00, 0xF2, 0xBF, 0xFF, 0x9D, 0x20, 0xF8, 0xFF, + 0x77, 0x0C, 0x26, 0x27, 0x19, 0x2C, 0xE7, 0x44, 0x0E, 0x9C, 0x09, 0xC4, + 0x04, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0x43, 0xBE, + 0xFE, 0xFF, 0xBF, 0xD5, 0x95, 0xD1, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFB, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, + 0xFF, 0x1F, 0x00, 0x20, 0x3F, 0x9C, 0x00, 0x00, 0x00, 0xF2, 0x3F, 0xC7, + 0x9D, 0x30, 0xE0, 0xFF, 0xE7, 0xFC, 0x27, 0x27, 0xF9, 0x2F, 0xE7, 0x44, + 0x1C, 0x9C, 0x19, 0xC4, 0x0C, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x19, 0x81, 0x7E, 0xFD, 0xFF, 0x7F, 0xFE, 0xDA, 0xCA, 0xFF, 0xDF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, + 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x20, 0x3F, 0x9C, 0x00, 0x00, + 0x00, 0x32, 0x3F, 0xC7, 0x9D, 0x10, 0x00, 0xC0, 0xCF, 0x0C, 0x24, 0x27, + 0x09, 0x28, 0xE7, 0x44, 0x38, 0x9C, 0xF1, 0x0F, 0x08, 0x00, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x81, 0xFF, 0xFB, 0xFF, 0x7F, 0x31, + 0x37, 0xF1, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x20, + 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x02, 0x1F, 0xC2, 0x9D, 0x10, 0x01, 0x80, + 0xCF, 0x08, 0x26, 0x27, 0x19, 0x3C, 0xE7, 0xC4, 0x38, 0x9C, 0x11, 0xC8, + 0x08, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0xE3, 0xFD, + 0xD7, 0xFF, 0x6F, 0xF2, 0xD2, 0xD2, 0xFF, 0xFF, 0xEA, 0xFF, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, + 0xFF, 0x3F, 0x00, 0x20, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x02, 0x1F, 0xC2, + 0x9D, 0x90, 0xF3, 0x0F, 0x8F, 0xF8, 0x23, 0x27, 0xF1, 0x17, 0xE7, 0xC4, + 0x78, 0x9C, 0x13, 0xC8, 0x09, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x39, 0xB1, 0xFF, 0xEF, 0xFF, 0x3F, 0x6D, 0xEF, 0xED, 0xFF, 0xFF, + 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x77, 0x76, 0xFF, 0xC3, 0xDF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x60, 0x3E, 0x9C, 0x00, 0x00, + 0x00, 0x3E, 0x1F, 0xC0, 0x9D, 0x90, 0x13, 0x18, 0x9E, 0x09, 0x20, 0x27, + 0x01, 0x10, 0xE7, 0xCC, 0x78, 0x98, 0x13, 0xCC, 0x09, 0x00, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x7F, 0xDE, 0xFF, 0xEE, 0xFF, 0xAA, + 0xEE, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xD7, 0x6B, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x60, + 0x7E, 0x9C, 0x00, 0x00, 0x00, 0x20, 0x1F, 0xC0, 0x9D, 0x90, 0x13, 0x30, + 0x9E, 0x09, 0x30, 0x27, 0x01, 0x90, 0xE7, 0xC8, 0x7C, 0x98, 0x33, 0xC4, + 0x09, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0xFF, 0xDF, + 0xFF, 0xFF, 0xBF, 0xD7, 0x57, 0xD5, 0xFF, 0xFF, 0xBF, 0x7A, 0xEE, 0xDF, + 0xB7, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0x00, 0x60, 0x7E, 0x9C, 0x00, 0x00, 0x00, 0x20, 0x8F, 0xCF, + 0x9D, 0x90, 0xF3, 0x6F, 0x9C, 0x09, 0x10, 0x27, 0x03, 0x90, 0xE7, 0xC8, + 0x7C, 0x38, 0x23, 0xC4, 0x09, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x99, 0xEF, 0xBF, 0xFF, 0xFD, 0x3F, 0x6E, 0xEF, 0xEA, 0xFF, 0xFF, + 0x5F, 0xF9, 0x5D, 0xEF, 0x7F, 0xF5, 0xF7, 0xDD, 0x57, 0xF7, 0x77, 0xFD, + 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0x7F, 0x00, 0x60, 0x7C, 0x9C, 0x01, 0x00, + 0x00, 0x20, 0x8F, 0xCC, 0x9D, 0x91, 0x23, 0x58, 0x9C, 0x09, 0x10, 0x27, + 0x02, 0x90, 0xE7, 0x49, 0x7C, 0x38, 0x23, 0xE6, 0x19, 0x00, 0xF0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xF7, 0x7F, 0xFF, 0xFF, 0xD1, + 0xFD, 0xD1, 0xFF, 0xFF, 0xBF, 0xFE, 0x6E, 0xFF, 0xB7, 0xAF, 0xFF, 0xFE, + 0xBF, 0xFA, 0xFF, 0xEB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x00, 0x40, + 0x7C, 0x1C, 0x01, 0x00, 0xF0, 0x27, 0xCF, 0xC6, 0x1D, 0x91, 0x23, 0xF0, + 0x9C, 0x09, 0x90, 0x27, 0x02, 0x90, 0xE7, 0x69, 0x7C, 0x38, 0x27, 0xE2, + 0x11, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x71, 0xFA, 0xFF, + 0xFE, 0xFB, 0x7F, 0xFE, 0xFE, 0xCA, 0xFF, 0xFF, 0xDF, 0x7D, 0x77, 0xF7, + 0x77, 0x55, 0xDF, 0xF7, 0xD7, 0xF7, 0xF7, 0xDD, 0xFF, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0xC0, 0x7C, 0x1C, 0x01, 0x00, 0x18, 0x34, 0xCF, 0xC3, + 0x1D, 0x93, 0x23, 0x60, 0x9C, 0x09, 0x90, 0x67, 0x02, 0x98, 0xE7, 0x39, + 0x7E, 0x70, 0x67, 0xE3, 0x11, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x39, 0xE2, 0xFF, 0xEF, 0xFF, 0x7F, 0x32, 0x75, 0xF1, 0xFF, 0xFF, + 0xEF, 0xFF, 0xAB, 0xF3, 0xEF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFB, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x01, 0xC0, 0xFC, 0x38, 0x03, 0x00, + 0x08, 0x14, 0x07, 0xE0, 0x3D, 0x92, 0x67, 0x60, 0x8C, 0x09, 0x90, 0x67, + 0x02, 0x88, 0xCF, 0x19, 0x7E, 0x70, 0x47, 0xF1, 0x13, 0x00, 0xFC, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xF9, 0xFF, 0xBF, 0xFF, 0x7F, 0xD3, + 0xD6, 0xD2, 0xFF, 0xFF, 0xFF, 0x7F, 0xF5, 0xF5, 0xDF, 0x5D, 0x77, 0xF5, + 0xF7, 0xD7, 0xD7, 0xD7, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, + 0xF8, 0x38, 0x02, 0x00, 0x8C, 0x14, 0x07, 0xF0, 0x3F, 0x96, 0xC7, 0x38, + 0xCE, 0x08, 0x98, 0x63, 0x06, 0x8C, 0xFF, 0x01, 0x3F, 0xF2, 0xC6, 0xF1, + 0x33, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xEF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x6E, 0x2F, 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFE, + 0xAF, 0xFE, 0xEF, 0xBB, 0xFF, 0xFB, 0xFE, 0xFE, 0xEF, 0xEB, 0xFF, 0xFF, + 0xFF, 0xFF, 0x03, 0xC0, 0xF8, 0x38, 0x06, 0x00, 0xC4, 0x9C, 0x7F, 0xFF, + 0x7F, 0x94, 0x87, 0x0F, 0xC6, 0x08, 0x88, 0x63, 0x04, 0xC4, 0xFF, 0x81, + 0x3F, 0xE2, 0x0E, 0xF8, 0x23, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xBA, 0xFF, 0xEA, 0xFF, 0xFF, + 0x7F, 0xFD, 0xF5, 0xFD, 0xF7, 0xDF, 0x77, 0xFF, 0xFF, 0xD7, 0xF7, 0xFF, + 0xF5, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0x03, 0x80, 0xF9, 0x71, 0x04, 0x00, + 0xC6, 0x8C, 0x7F, 0xFF, 0x7F, 0x9C, 0x0F, 0x00, 0xE7, 0x0C, 0x8C, 0x63, + 0x0C, 0xC4, 0xFF, 0xE3, 0x1F, 0xE3, 0x0F, 0xF8, 0x23, 0x00, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xFF, 0x7F, 0x54, + 0x77, 0xD5, 0xFF, 0xFF, 0xAF, 0xFF, 0xEF, 0xFF, 0xEF, 0xFE, 0xAB, 0xFF, + 0xFF, 0xFF, 0xFE, 0xEF, 0xEF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x07, 0x80, + 0xF1, 0x71, 0x0C, 0x00, 0xE2, 0x8C, 0x7F, 0xFF, 0xFF, 0x98, 0x1F, 0xC0, + 0x73, 0x0C, 0xC6, 0xF7, 0x08, 0xE4, 0xF8, 0xFF, 0x0F, 0xC7, 0x1F, 0xBE, + 0x27, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xBF, + 0xBB, 0xFF, 0x7F, 0x7F, 0x6E, 0xEE, 0xFF, 0xFF, 0xFF, 0x7D, 0x5F, 0xFD, + 0x77, 0xF7, 0xDF, 0xDF, 0xF7, 0xD7, 0x77, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x07, 0x80, 0xF1, 0xF3, 0x18, 0x00, 0xE3, 0xCC, 0x03, 0xE0, + 0xFF, 0x98, 0x7F, 0xF8, 0x3F, 0x0C, 0xC3, 0xFF, 0x18, 0xE4, 0xE0, 0xFF, + 0x87, 0xC7, 0xFF, 0xBF, 0x67, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x2B, 0xB4, 0xF1, 0xD7, 0xFF, 0xFF, + 0xEF, 0xFF, 0xBF, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, + 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x0F, 0x80, 0xE3, 0xE7, 0x10, 0x80, + 0x71, 0xC4, 0x01, 0x00, 0xFF, 0x89, 0xFF, 0xFF, 0x1F, 0x0E, 0xE1, 0xFF, + 0x31, 0x64, 0x80, 0xFF, 0xC3, 0x8F, 0xFF, 0x9F, 0xC7, 0x80, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xEE, + 0xEE, 0xCF, 0xFF, 0xFF, 0x5F, 0xFD, 0xD7, 0xFF, 0x77, 0xDD, 0xDF, 0xDF, + 0xDF, 0xF7, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, + 0xC3, 0xEF, 0x71, 0xC0, 0x70, 0xC0, 0xF1, 0x07, 0xF8, 0x89, 0xFF, 0xFF, + 0x0F, 0x07, 0xF1, 0xFF, 0x21, 0x04, 0x04, 0x7E, 0x60, 0x0F, 0xFF, 0x9F, + 0x87, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, + 0xFF, 0xEB, 0x3F, 0x78, 0x71, 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xBA, 0xFB, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, + 0xFF, 0xFF, 0x1F, 0x00, 0xC7, 0x9F, 0xC3, 0x71, 0x38, 0xE2, 0x19, 0x3C, + 0xC0, 0xC8, 0xF3, 0xFF, 0x83, 0x05, 0xF9, 0xE0, 0x23, 0x04, 0x1E, 0x00, + 0xB0, 0x1D, 0xFC, 0x0F, 0x8F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0x07, 0xD6, 0xFF, 0xFF, + 0x5F, 0x7F, 0xFF, 0xF5, 0x5F, 0xD5, 0xF7, 0xF5, 0xF7, 0xD7, 0xDF, 0xF7, + 0xFF, 0xFF, 0xF5, 0xF7, 0xFF, 0xFF, 0x3F, 0x00, 0x8F, 0xFF, 0x03, 0x1F, + 0x3C, 0xF0, 0x09, 0xE0, 0x01, 0xC0, 0xC3, 0x7F, 0xC0, 0x06, 0x79, 0xC0, + 0x27, 0xFC, 0x73, 0x00, 0xDE, 0x3C, 0xF8, 0x03, 0x9F, 0xE0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xEF, 0xAB, 0x3E, 0x6C, + 0x21, 0xCF, 0xFF, 0xFF, 0xAF, 0xFB, 0xEF, 0xFF, 0xBE, 0xFE, 0xFF, 0xEF, + 0xFF, 0xFA, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, + 0x0A, 0xFF, 0x0F, 0x00, 0x1E, 0xF1, 0xF8, 0x07, 0x0F, 0xC4, 0x01, 0x00, + 0x70, 0x03, 0x31, 0x84, 0x27, 0x04, 0xC4, 0xFF, 0x63, 0xE8, 0x00, 0x00, + 0x9E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x3F, 0x3E, 0xF8, 0xBF, 0xFF, 0xFF, 0x7F, 0x7D, 0xDD, 0xFF, + 0xD7, 0x57, 0xFF, 0xFD, 0xDF, 0x5F, 0xFF, 0x7D, 0xFD, 0xF7, 0xFD, 0xFF, + 0xFF, 0xFF, 0x7F, 0x00, 0x1E, 0xFE, 0x3F, 0x80, 0x1F, 0xF9, 0x18, 0x3C, + 0xF8, 0xE3, 0x01, 0x00, 0x9E, 0x01, 0x01, 0x0E, 0x23, 0x04, 0x1E, 0x00, + 0x30, 0x98, 0x01, 0x30, 0x8C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xAA, 0x7E, 0xC1, 0xFF, 0x7F, 0xFF, 0xFF, + 0xAF, 0xFA, 0xEF, 0xFE, 0xEE, 0xEA, 0xEF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x3C, 0xFC, 0xFF, 0xF0, + 0x8F, 0x79, 0x0C, 0xE0, 0x01, 0xE1, 0xF8, 0xFF, 0xC3, 0x00, 0x03, 0x1B, + 0x20, 0xFC, 0x73, 0x00, 0x1E, 0x30, 0xFF, 0x7F, 0x80, 0xF0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0x7F, 0xFA, + 0xFF, 0xFF, 0xFE, 0xFF, 0xDF, 0x7F, 0xDF, 0xFF, 0x77, 0xF7, 0xDF, 0xFF, + 0xD7, 0xDD, 0xFF, 0xF5, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x68, 0xF0, 0xFF, 0xFF, 0x87, 0x79, 0x0C, 0x00, 0x0F, 0xF1, 0x08, 0x00, + 0x70, 0x00, 0xFF, 0x35, 0x30, 0x00, 0xC0, 0xFF, 0x03, 0xE0, 0x00, 0xC0, + 0xC0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, + 0xEE, 0xAB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xAF, 0xFE, + 0xAF, 0xFA, 0xFF, 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x01, 0xD8, 0xC0, 0xFF, 0xFF, 0xC1, 0x31, 0x0E, 0x00, + 0xF8, 0x79, 0x0C, 0x00, 0x1E, 0x00, 0x01, 0xEE, 0x3F, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x01, 0xB0, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xF9, 0xFF, + 0x5F, 0xFD, 0x77, 0xF5, 0xDF, 0xDD, 0xF7, 0xDF, 0x7F, 0xF7, 0xFF, 0xFF, + 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xB0, 0x03, 0xFF, 0x7F, + 0xE0, 0x01, 0x0E, 0x00, 0x00, 0x79, 0xFC, 0xFF, 0x03, 0x00, 0x03, 0x1B, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x80, 0xFC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xBF, 0xEA, 0xAB, 0xFE, 0xFB, + 0xFF, 0xFF, 0xF7, 0xFF, 0xAF, 0xFE, 0xAB, 0xFF, 0xEF, 0xBE, 0xEF, 0xFF, + 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, + 0x60, 0x0E, 0xF8, 0x07, 0xB8, 0x03, 0x07, 0x00, 0x00, 0x31, 0x0E, 0x00, + 0x00, 0x00, 0xFE, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, + 0xF7, 0xD9, 0xFF, 0xD7, 0xDB, 0xFB, 0xEB, 0xFF, 0x5F, 0x7F, 0xD5, 0xFD, + 0xDF, 0xF5, 0xFF, 0xFF, 0xF7, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF3, + 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x38, 0x00, 0x00, 0xCE, 0xFF, 0x07, 0x00, + 0x00, 0x01, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xCF, 0xBF, 0xBE, 0xEB, 0xBE, 0x4F, 0x7F, 0xFF, 0xDF, 0xFF, + 0xEF, 0xFA, 0xEF, 0xFE, 0xBE, 0xBE, 0xEA, 0xFF, 0xFF, 0xFE, 0xBF, 0xFF, + 0xFE, 0xFB, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0xE3, 0x01, 0xE0, + 0x63, 0x01, 0x02, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0xF7, 0xF9, 0x7F, 0xBD, + 0xF5, 0xF5, 0xBD, 0xFF, 0xFF, 0xFD, 0x57, 0xFF, 0xDF, 0x57, 0xF7, 0xF7, + 0xDF, 0xD7, 0x7D, 0xFF, 0xFF, 0xF7, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, + 0x00, 0x0E, 0xFF, 0x3F, 0x38, 0x03, 0x03, 0x00, 0x00, 0xFF, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, + 0xFE, 0xBB, 0xBE, 0x7A, 0xFE, 0xFF, 0x7F, 0xFF, 0xAF, 0xFA, 0xBE, 0xFE, + 0xBE, 0xEB, 0xEF, 0xFF, 0xFF, 0xEE, 0xEF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x38, 0x00, 0x00, 0x0E, 0xFE, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xD7, 0xFF, 0xDF, 0x7F, 0xF5, 0xDD, 0xDE, 0xDF, 0xFE, + 0x5F, 0x7D, 0x77, 0xFF, 0x77, 0xDD, 0x5D, 0xF7, 0x7F, 0xFD, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xE0, 0x01, 0xE0, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1A, 0xFE, 0xFB, 0xFA, 0xEF, + 0xF3, 0xF7, 0xF7, 0xFD, 0xEF, 0xFF, 0xAE, 0xFF, 0xEF, 0xFB, 0xFF, 0xEE, + 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x34, + 0xFF, 0x59, 0xFF, 0xFD, 0x67, 0x7D, 0xFF, 0xF5, 0xFF, 0x7F, 0xF5, 0xFD, + 0xD7, 0x5D, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0x5C, 0xEB, 0xAF, 0xBF, 0xEE, 0xFA, 0xFF, 0xFF, 0xFF, + 0xAF, 0xFA, 0xEE, 0xFE, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xEB, 0xFF, 0xBF, + 0xFF, 0xEF, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x14, 0xDD, 0xFB, 0x7F, 0xF7, + 0x7D, 0xFB, 0xFF, 0xF2, 0x5F, 0xFD, 0xD7, 0xFF, 0xF7, 0xFF, 0xFF, 0xDF, + 0xDF, 0xDF, 0xFF, 0x5D, 0xFF, 0xDF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, + 0xBE, 0xBB, 0x3F, 0x6A, 0xEA, 0x3F, 0x2D, 0xFD, 0xEF, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xEF, 0xE7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF9, 0x07, 0x7E, 0xBC, 0xCF, 0x03, 0x00, + 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x78, 0x1E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF4, 0xFF, 0xD1, 0x7D, 0x75, 0xD5, 0xAB, 0xAA, 0xFA, + 0xDF, 0x7F, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xDF, 0xC7, 0x8F, 0x0B, 0x06, 0xE3, + 0xB4, 0x4C, 0x03, 0x00, 0x00, 0x40, 0x38, 0x00, 0x00, 0x80, 0x06, 0xC6, + 0x01, 0x4C, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xEF, 0xAF, 0x7E, 0x6A, + 0xAE, 0x56, 0x55, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F, 0xEF, 0xCF, 0xBB, + 0x77, 0xFB, 0x06, 0xDD, 0xBE, 0xED, 0xF3, 0xF1, 0xF9, 0x41, 0x37, 0x1F, + 0x1F, 0x9F, 0x1E, 0xBA, 0xF9, 0x76, 0xFB, 0xF3, 0x3E, 0x7F, 0x1F, 0x00, + 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, + 0xDF, 0x59, 0x7F, 0x75, 0xF5, 0x69, 0x6A, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xD9, 0xDF, 0xBB, 0x77, 0xFB, 0x06, 0x7D, 0xB2, 0x2D, 0x9B, 0x9B, + 0x8B, 0x43, 0xB7, 0xB9, 0xB9, 0xB9, 0x38, 0xFA, 0xCD, 0x63, 0x71, 0xD3, + 0x73, 0xE5, 0x39, 0x80, 0x3D, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x1F, 0xEE, 0xFB, 0x2E, 0x6A, 0xAA, 0x93, 0x91, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xEB, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xBF, 0xDE, 0xDF, 0xBB, 0x8F, 0x41, 0x07, 0xE3, + 0x36, 0x6D, 0x6B, 0x6B, 0x6B, 0x43, 0x98, 0xB6, 0xB6, 0xB6, 0x36, 0xC6, + 0xB5, 0x77, 0x7B, 0xDF, 0x6D, 0xF9, 0x36, 0xC0, 0xBD, 0xBD, 0xFD, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF5, 0xDB, 0x7F, 0x77, + 0xF5, 0xFD, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xD7, 0xFF, 0x5F, 0xF7, + 0xDF, 0xD7, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xBF, 0xDE, 0xDF, 0x87, + 0x77, 0x63, 0x03, 0xDE, 0x36, 0x6D, 0xEB, 0x6B, 0x6B, 0x43, 0xB7, 0xB0, + 0xB1, 0xBE, 0x36, 0xBE, 0xB5, 0x77, 0xFB, 0xEA, 0x63, 0xFD, 0x30, 0xE0, + 0xBD, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFB, 0xFF, 0x3A, 0x7E, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFB, + 0xEA, 0xEE, 0xBF, 0xFA, 0xEB, 0xEF, 0xFF, 0xBF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xBF, 0xD9, 0xDF, 0xBF, 0x77, 0xA3, 0x03, 0xDF, 0x34, 0x4D, 0xEB, 0x69, + 0x6B, 0x43, 0xB7, 0xBE, 0xB6, 0xBE, 0x36, 0xBE, 0xB5, 0x35, 0xDA, 0xEA, + 0x6D, 0x9D, 0x3E, 0xF0, 0xBD, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0x1F, 0xDF, 0x55, 0x7F, 0x7D, 0xD5, 0xFF, 0xFF, 0xFF, + 0x59, 0xFD, 0xFF, 0x7F, 0xF7, 0xD7, 0x5F, 0xDD, 0xF7, 0xDF, 0xFD, 0xFF, + 0xFF, 0xDF, 0xFF, 0xF7, 0x7F, 0xEF, 0xDF, 0xDF, 0x77, 0xD3, 0x01, 0xDD, + 0x34, 0x4D, 0x6B, 0x6B, 0x6B, 0x43, 0xB7, 0xB6, 0xB6, 0xB6, 0x36, 0xBA, + 0xB5, 0x35, 0xBA, 0x75, 0x6D, 0x8D, 0x36, 0xFF, 0xBD, 0xBD, 0xFD, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x5F, 0xBB, 0xAB, 0xBE, 0x7A, + 0xFA, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFE, 0xFF, 0xBB, 0xFE, 0xBF, 0xFF, + 0xFB, 0xAF, 0xEE, 0xFE, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0xDF, 0xE7, + 0x8F, 0xD3, 0x00, 0xE3, 0x34, 0x4D, 0x9B, 0x9B, 0x6B, 0x43, 0xB8, 0xB9, + 0xB1, 0xB9, 0x36, 0xC6, 0xCD, 0x35, 0xB6, 0x75, 0x63, 0x8D, 0x39, 0xFD, + 0xBD, 0x7D, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x55, + 0xFD, 0x5F, 0x7F, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x7F, 0xFD, 0xDD, + 0xD7, 0x57, 0x5F, 0x7F, 0xFF, 0xFF, 0xD7, 0xDF, 0x7B, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x00, 0xFF, 0x3C, 0xCF, 0xFB, 0xFB, + 0xFB, 0xC3, 0xBF, 0xBF, 0xBF, 0xBF, 0x3F, 0xFE, 0xFD, 0x3D, 0x3E, 0x3F, + 0x7F, 0x8F, 0xBF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x1F, 0x7F, 0x1B, 0xFA, 0xFF, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, + 0xBB, 0xFA, 0xFE, 0xFB, 0xFF, 0xFF, 0xBF, 0xFE, 0xEF, 0xFE, 0xEE, 0xEE, + 0xFF, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x7E, + 0x3C, 0xCF, 0xF3, 0xF1, 0xF9, 0xC3, 0x1F, 0x1F, 0x3F, 0x9F, 0x3F, 0xFC, + 0xF8, 0x3C, 0x3C, 0x3F, 0x7E, 0x0F, 0x9F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xEF, 0xD7, 0xF5, 0xDF, 0xFF, 0xFF, + 0xF5, 0x7F, 0xD5, 0x57, 0x5D, 0x7F, 0xFF, 0xFF, 0xFD, 0xDD, 0x5F, 0xFF, + 0xFF, 0xDF, 0xD7, 0xFF, 0x7F, 0xFD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0xF4, 0x1F, + 0xEA, 0xEF, 0xFF, 0xFF, 0xAA, 0xFF, 0xBA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFB, + 0xFF, 0xAF, 0xBF, 0xFF, 0xBB, 0xEB, 0xEB, 0xAF, 0xFF, 0xFE, 0xEE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x47, 0x7F, 0xA7, 0x15, 0xF7, 0xF5, 0x77, 0x16, 0xD5, 0xFF, 0x5D, 0xFD, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFD, 0xFF, 0xF7, 0xFF, 0xFD, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xFF, 0x90, 0x3F, 0xEA, 0xFF, 0xAE, 0xBE, + 0xAA, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBF, 0xEF, + 0xEF, 0xFB, 0xAF, 0xEF, 0xFE, 0xFE, 0xEB, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3C, 0x2D, 0x2F, 0x1A, + 0xD5, 0x7F, 0x4D, 0x37, 0xDF, 0xFE, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xF7, + 0xFF, 0x5F, 0x5F, 0xF5, 0xDF, 0xFF, 0xFF, 0x7F, 0x7F, 0xDF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, + 0xC3, 0x22, 0xF3, 0x17, 0xFA, 0xEF, 0xAA, 0xBA, 0xFA, 0xFF, 0xFF, 0xFF, + 0xEF, 0xAA, 0xFE, 0xFF, 0xEF, 0xEF, 0xBF, 0xFB, 0xBF, 0xEF, 0xFF, 0xFE, + 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF8, 0x57, 0xF7, 0xFE, 0x5F, 0xFD, 0x7D, 0x55, 0xF5, + 0xFF, 0x6F, 0xF5, 0xFD, 0xFF, 0xDD, 0xFF, 0xFF, 0xFD, 0xDF, 0x5F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0xFC, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x6C, 0x4F, 0xFE, 0x1F, + 0xBF, 0x38, 0xEA, 0xEA, 0xDF, 0xDE, 0xEA, 0xFA, 0xFA, 0xAE, 0xFF, 0xAF, + 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0xFF, 0xEE, 0xFB, 0xFF, 0xBE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xFC, 0x38, 0x00, 0x38, + 0x02, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, + 0xFE, 0xF2, 0xFF, 0x9F, 0x47, 0x3C, 0x55, 0xF5, 0xDF, 0xFF, 0xDB, 0x7F, + 0xFF, 0xF7, 0xF7, 0xF5, 0xF7, 0x55, 0x5F, 0xDF, 0x77, 0xF7, 0xF7, 0xFF, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xE0, + 0x47, 0xF9, 0xFF, 0x3F, 0xFE, 0xFF, 0x8E, 0xFF, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x08, 0x98, 0xFD, 0xFF, 0xDF, 0x03, 0x3A, 0xA6, 0xCA, + 0xBE, 0xFB, 0xFF, 0xFF, 0xEE, 0xEF, 0xFE, 0xFF, 0xFF, 0xAF, 0xBF, 0xFF, + 0xEE, 0xEF, 0xFF, 0xEF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x3F, 0xE8, 0xFA, 0xFE, 0x3F, 0xFE, 0xFF, 0xCF, 0x82, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xE3, 0xFF, 0xFF, 0x3F, + 0xA2, 0xB6, 0x15, 0x7D, 0xBF, 0xF7, 0x75, 0x7F, 0xD7, 0xDD, 0xFF, 0xFD, + 0xFF, 0x5F, 0x5F, 0x77, 0xF7, 0xDF, 0xFD, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x45, 0x7F, 0xFB, 0xFF, 0x3F, + 0xFE, 0xFF, 0xCF, 0xFC, 0xFB, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, + 0xFE, 0xFF, 0xFF, 0x3F, 0x92, 0x3A, 0xAA, 0xA2, 0xBE, 0xF9, 0xFF, 0xFA, + 0xFB, 0xFF, 0xFE, 0xEB, 0xFE, 0xAE, 0xBF, 0xF9, 0xFF, 0xBB, 0xAF, 0xFE, + 0xFF, 0xFE, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, + 0xE7, 0xFA, 0xFF, 0x3F, 0xFA, 0xFF, 0xCF, 0xFA, 0xFF, 0xFF, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x18, 0xFF, 0xFF, 0xFF, 0x1F, 0x02, 0x3C, 0xF3, 0xDB, + 0x1D, 0xDF, 0xFF, 0x7D, 0xDF, 0xFF, 0xFD, 0xDD, 0xFF, 0x5F, 0x5F, 0xDB, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xF7, 0xF7, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0xF8, 0xFF, 0x7D, 0xDB, 0xFF, 0x3F, 0xFE, 0xFF, 0xCF, 0xF4, + 0xFF, 0xDF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xFF, 0xFF, 0xFF, 0x17, + 0x2A, 0x3A, 0xAA, 0xAA, 0x3F, 0xBE, 0xAE, 0xFF, 0xAF, 0xAA, 0xFE, 0xAF, + 0xEB, 0xEE, 0xBF, 0xFE, 0xAF, 0xEE, 0xFF, 0xEE, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x6F, 0x7D, 0xFF, 0xFA, 0xFF, 0x3F, + 0xFE, 0xFF, 0xCF, 0xFA, 0xFF, 0xEF, 0xDF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xFF, 0xFF, 0x5F, 0x57, 0x02, 0x7F, 0xC8, 0x75, 0x1D, 0xFD, 0xFF, 0xFF, + 0xFF, 0xDF, 0xF7, 0xFF, 0xD7, 0xD7, 0x5F, 0xEF, 0xFF, 0xF5, 0xFF, 0xFF, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xF7, 0xFE, + 0x7B, 0xFB, 0xFF, 0x3F, 0xFE, 0xFF, 0xCF, 0xFC, 0xFF, 0xDF, 0xFF, 0x3D, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xBF, 0x1E, 0x02, 0x3A, 0x2E, 0xE2, + 0x9E, 0xFF, 0xBF, 0xFF, 0xFE, 0xEE, 0xFA, 0xDE, 0xBF, 0xFF, 0xBF, 0xFF, + 0xFF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x7F, 0xBC, 0xFC, 0xFD, 0xFF, 0xFA, 0xFF, 0x3F, 0xFE, 0xFF, 0xCF, 0xFA, + 0xFD, 0xCF, 0xFD, 0xDD, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xD7, 0x9F, + 0xA2, 0x3D, 0x41, 0x59, 0x1D, 0xFD, 0xFF, 0x7F, 0xDF, 0x55, 0xF5, 0xCF, + 0x5F, 0xFF, 0x5F, 0xDF, 0x77, 0xF7, 0xF7, 0xFD, 0x7F, 0xFD, 0xDF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFC, 0xF2, 0xFE, 0x7E, 0xFB, 0xFF, 0x3F, + 0xFE, 0xFF, 0xC7, 0xF4, 0xFF, 0xDF, 0xFF, 0xFD, 0x03, 0x00, 0x00, 0x00, + 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, + 0xFF, 0xFF, 0xAF, 0x1E, 0x22, 0x3A, 0x8A, 0xA8, 0xBE, 0xDA, 0xDA, 0xFF, + 0xEF, 0xAB, 0xFB, 0xEB, 0xEA, 0xAF, 0xBF, 0xFA, 0xEF, 0xAF, 0xBF, 0xBF, + 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xBD, 0x7B, 0xFD, + 0xFF, 0xFA, 0xFF, 0x3F, 0xFE, 0xFF, 0xCF, 0xFA, 0xFF, 0xCF, 0xFF, 0xFD, + 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xDF, 0x5F, 0x15, 0x44, 0xB5, 0x11, 0x56, + 0x1F, 0x7F, 0xFF, 0x7F, 0xE7, 0xE7, 0xFD, 0xE7, 0x67, 0x77, 0x5F, 0xC7, + 0xDF, 0xF7, 0xFD, 0x7F, 0x7D, 0xDF, 0xDF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xFD, 0xEF, 0xFE, 0x7F, 0xFB, 0xFF, 0x3F, 0xF6, 0xFF, 0xCF, 0xFC, + 0xF7, 0xDF, 0xFF, 0xDD, 0x7F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xEB, 0xBF, 0x1B, + 0xB2, 0x3A, 0xAA, 0x8A, 0xBE, 0xAF, 0x7F, 0xFB, 0xF9, 0xF9, 0xFA, 0xF9, + 0xF9, 0xEA, 0xBF, 0xF9, 0xBD, 0xBF, 0xEF, 0xFF, 0xFE, 0xAA, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBE, 0xFF, 0xDD, 0xFF, 0xFA, 0xFF, 0x3F, + 0xFA, 0xFF, 0xCF, 0xFA, 0xFF, 0xCF, 0xFF, 0xFD, 0xE7, 0x00, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF5, 0xFF, 0x3F, 0x62, 0x3D, 0xF2, 0xCC, 0x3F, 0xFD, 0xED, 0x7F, + 0xDF, 0xDB, 0xDA, 0xDA, 0xDA, 0x57, 0x5F, 0xDA, 0xFB, 0xFD, 0xFF, 0xDD, + 0x7F, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, 0xB2, 0xF9, 0xFF, 0xFE, + 0xFF, 0xFB, 0xFF, 0x3F, 0xFE, 0xFF, 0xCF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFD, + 0xF7, 0x01, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xBF, 0xFA, 0x1F, 0x4B, 0x3A, 0x88, 0xAA, + 0xBF, 0xEA, 0xFB, 0x7F, 0xAF, 0xBF, 0xEF, 0xAF, 0xAF, 0xEF, 0xBF, 0xEF, + 0xAF, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0x3E, 0xBF, 0x7F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, + 0xFF, 0xCD, 0xF5, 0xFD, 0xE7, 0x01, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xD5, 0xFF, 0x1F, + 0x22, 0x7C, 0x40, 0x75, 0x1F, 0xDD, 0xDF, 0x7F, 0xEF, 0xFF, 0xEF, 0xEF, + 0xEF, 0xEF, 0xDF, 0xFF, 0x6F, 0xDD, 0xFD, 0xFF, 0x7F, 0xFD, 0xFD, 0xFF, + 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xF8, 0xFE, 0xFE, 0xEF, 0xDF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xDF, 0xFF, 0xFD, 0xF7, 0x06, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0xFF, 0xFB, 0xBF, 0x1B, 0xE6, 0x3A, 0x2C, 0xEA, 0x9E, 0xBF, 0xFF, 0xFE, + 0xFE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xBF, 0xDE, 0xDE, 0xDE, 0xEE, 0xEF, + 0xFF, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0xD4, 0xBF, 0xFE, 0xFD, + 0x7B, 0xF0, 0xFF, 0x7F, 0xFF, 0xFB, 0xAF, 0xEF, 0xFF, 0xCF, 0xDF, 0xFD, + 0x67, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0xFF, 0xD7, 0x3F, 0x03, 0x3E, 0x55, 0xC1, + 0x3F, 0x7F, 0xDF, 0x7D, 0xD9, 0xDF, 0xEF, 0xCF, 0xCF, 0xCF, 0xDF, 0xEF, + 0xCF, 0xCF, 0xFF, 0xFF, 0x7D, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, + 0xF7, 0xFF, 0xFF, 0xFF, 0xBF, 0xFA, 0xFF, 0xBF, 0xFE, 0xFF, 0x57, 0xFF, + 0xFF, 0xDF, 0xFF, 0xDD, 0xF7, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF9, 0xFF, 0xFB, 0x1A, + 0x82, 0x3A, 0x8A, 0xFA, 0xBA, 0xEA, 0xAE, 0x7F, 0xE8, 0xEB, 0xEB, 0xEB, + 0xEB, 0xEB, 0xBA, 0xEF, 0xEB, 0xEB, 0xFF, 0xBF, 0x7F, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC7, 0x93, 0xBF, 0xFE, 0xFE, 0x5F, 0xF5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xAF, 0xFC, 0xFF, 0xFD, 0xBF, 0xFD, 0x63, 0x1B, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, + 0xF8, 0xFF, 0xF5, 0x1F, 0x62, 0xB4, 0x46, 0xCE, 0x17, 0xFF, 0xFF, 0x7F, + 0x9D, 0xF7, 0xE7, 0xE7, 0xE7, 0xE7, 0xDF, 0xE7, 0xE7, 0xE7, 0xFD, 0xDF, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xBF, 0xFB, 0x7F, 0xDF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0x76, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x3F, 0xF7, 0xBF, 0xFB, 0x1F, 0x92, 0x3A, 0xA8, 0xA8, + 0xBA, 0xEF, 0xEA, 0xFA, 0xBA, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xBF, 0xF9, + 0xF9, 0xF9, 0xAE, 0xFF, 0xFF, 0xAE, 0xEB, 0xF7, 0xFF, 0xFF, 0xFF, 0xC7, + 0xDF, 0xBF, 0xFF, 0xFC, 0xD6, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, + 0xBF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xD5, 0x1F, + 0x02, 0x3D, 0xFC, 0x55, 0x3F, 0xD5, 0xFD, 0x7D, 0xD7, 0xDE, 0xE6, 0xDA, + 0xDA, 0xDA, 0xDF, 0xDB, 0xDA, 0xDA, 0xFF, 0xFF, 0x7B, 0xFF, 0xF7, 0xFD, + 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDE, 0xE7, 0xF5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xEE, 0xFB, 0x1F, 0x6A, 0x3A, 0x26, 0xCE, 0x9E, 0xCA, 0xF7, 0xFF, + 0xEE, 0xAF, 0xFF, 0xAF, 0xAF, 0xAF, 0xBF, 0xAF, 0xAF, 0xAF, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x9F, 0xBF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFD, 0xFF, 0xFD, 0xF7, 0xFB, + 0x6F, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xFD, 0x7D, 0x5F, 0x62, 0x7C, 0x15, 0x48, + 0x1F, 0xDD, 0x5F, 0x7F, 0x15, 0xC7, 0xFA, 0xEF, 0xFF, 0xEF, 0xFF, 0xFF, + 0xEF, 0xEF, 0xFF, 0xEF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xB7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFB, 0xFE, 0x77, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xFE, 0xBB, 0x1F, + 0x82, 0x3E, 0xA8, 0xBA, 0xBE, 0xAA, 0xEA, 0xFF, 0xEA, 0xFF, 0xCF, 0xBE, + 0xFF, 0xFF, 0xFF, 0xAE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x47, 0xD7, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFE, 0xEF, 0xF3, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE9, 0xBD, 0xF5, 0x3F, 0x22, 0x3C, 0x85, 0x56, 0x5F, 0xCE, 0x5D, 0x7F, + 0xD9, 0xEF, 0xDF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xEF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xF7, 0xFB, 0xEE, 0xEF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xDF, 0xDE, + 0xF7, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xAE, 0xFF, 0x1F, 0x82, 0x3A, 0xAA, 0xA8, + 0xBB, 0xEE, 0xEF, 0xDA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, + 0xFF, 0x3F, 0xBE, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0xFF, 0xFD, 0xFF, 0xFF, 0xEF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x1F, + 0x02, 0x76, 0xCD, 0xFD, 0x57, 0xFD, 0x5D, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x5F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF1, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xFF, 0xFF, 0x1F, 0x32, 0xBA, 0x2A, 0xAE, 0xBB, 0xFA, 0xFB, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFF, 0xDF, 0xDF, + 0xBC, 0xD7, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xE7, 0xF7, 0x7B, 0xFF, 0xFD, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, + 0xF7, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xFF, 0xFF, 0x1F, 0x22, 0x7D, 0x66, 0xD0, + 0xDF, 0xDD, 0xDF, 0xFE, 0xFF, 0xFF, 0x7F, 0xB7, 0xD4, 0xD7, 0x7D, 0xFF, + 0xFF, 0xFD, 0xDF, 0xEE, 0xF7, 0xE7, 0xF5, 0xFB, 0xFF, 0xFF, 0xFF, 0x6F, + 0xF7, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xAD, 0xDF, 0x6F, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFF, 0xAF, 0x1E, + 0x8A, 0x2A, 0x92, 0xAA, 0xBF, 0xFE, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xCD, + 0xBF, 0xBB, 0xAB, 0xEA, 0xAF, 0xFA, 0xAE, 0xAF, 0xF7, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF7, 0xDF, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF5, 0xDF, 0x6D, 0xF3, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE9, 0x7F, 0xFF, 0x5F, 0x22, 0x7F, 0x55, 0xF5, 0xFD, 0xFF, 0xFF, 0xDF, + 0xFD, 0xFC, 0xBD, 0xDF, 0xDF, 0x57, 0x55, 0xDD, 0xFF, 0xF7, 0xD7, 0xDF, + 0xBF, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xF7, 0xFF, 0xFC, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF3, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xBA, 0x1E, 0x82, 0x3F, 0xBA, 0xFE, + 0xFE, 0xFF, 0x9F, 0xEC, 0xFB, 0x8C, 0xA7, 0xBF, 0xFF, 0xBB, 0xAA, 0xEF, + 0xEB, 0xFB, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x47, + 0xD7, 0x7F, 0xDF, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x7D, 0xD5, 0x3F, + 0xC2, 0xFF, 0x51, 0xDF, 0xFF, 0xDF, 0x5F, 0x75, 0xFF, 0x61, 0x5E, 0xDF, + 0xCF, 0x07, 0x5D, 0x7D, 0xD7, 0xFF, 0xDF, 0x5F, 0xFF, 0xFE, 0xBF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xF6, 0xF1, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE9, 0xEF, 0xEB, 0x1E, 0xC2, 0xAB, 0xFA, 0xEF, 0xAB, 0xAA, 0xE3, 0xBE, + 0xEF, 0xAA, 0xDF, 0xEF, 0xEB, 0xCB, 0xFE, 0xBF, 0xBF, 0xFF, 0xAF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xDF, 0xFF, 0xDE, 0xFD, + 0xFF, 0xFF, 0x1B, 0x36, 0xC3, 0x07, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, + 0xED, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xBD, 0xF5, 0x1F, 0xC2, 0xA7, 0xFF, 0xD7, + 0xD5, 0xDD, 0x17, 0xD7, 0xF7, 0xDD, 0x4F, 0xCE, 0xE7, 0x17, 0xE7, 0x77, + 0xFD, 0xFF, 0xDF, 0xDD, 0xFF, 0xFF, 0xFB, 0xEF, 0xFF, 0xFF, 0xFF, 0x5F, + 0xFF, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x2F, 0xC0, + 0xFF, 0xFF, 0xF7, 0xFF, 0xF7, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0x1F, + 0xA2, 0xF9, 0xBF, 0xBB, 0xE0, 0xBA, 0xAF, 0xBA, 0xFE, 0xFE, 0xC6, 0xDF, + 0xF9, 0x8B, 0xF9, 0xAF, 0xAF, 0xFC, 0xAF, 0xFF, 0xFF, 0xD7, 0xE7, 0xFB, + 0xFF, 0xFF, 0xFF, 0xF7, 0xDF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xEE, + 0xEE, 0xAB, 0xFE, 0xF7, 0xE0, 0xFF, 0xFF, 0xFF, 0xED, 0xF3, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xFF, 0xFF, 0x1D, 0x62, 0xFF, 0xD4, 0x49, 0x5C, 0xF5, 0x93, 0xE7, + 0xFF, 0xC4, 0xBF, 0xFD, 0xDA, 0x17, 0xDB, 0xFF, 0xFD, 0xEB, 0xDF, 0xD7, + 0xF7, 0xFB, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xB7, 0xFA, 0xFF, 0xFF, + 0xFE, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xA7, 0xAB, 0xAA, 0xF8, 0xFF, 0xDF, + 0x7F, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFF, 0xBB, 0x1E, 0xE2, 0x0F, 0xAA, 0xA9, + 0x9A, 0xBD, 0xAB, 0xAE, 0xFE, 0xEA, 0xF3, 0x9F, 0xAF, 0x5B, 0xEF, 0xEF, + 0xFF, 0xFB, 0xAF, 0xBF, 0xFF, 0xFB, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, + 0xDF, 0xFD, 0xFF, 0xF3, 0xFF, 0xFF, 0xDF, 0xBB, 0xFF, 0xAB, 0x56, 0x5F, + 0x55, 0x05, 0xD4, 0xFF, 0xFD, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x7F, 0xD7, 0x1D, + 0xFA, 0x75, 0xF4, 0x71, 0x51, 0xD5, 0x17, 0xDD, 0xFD, 0x8C, 0xFF, 0xDF, + 0xEF, 0xF7, 0xFF, 0xFF, 0xFF, 0xE7, 0xDF, 0xF7, 0xFF, 0x7F, 0xBF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x5F, 0xBF, 0xFE, 0xBF, 0xFF, 0xFF, 0xEF, 0xFB, 0xFF, + 0xFF, 0xFF, 0x8F, 0xEE, 0x88, 0x0A, 0x7E, 0xFD, 0x7F, 0xF5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD, 0xEF, 0xEF, 0x19, 0xFE, 0xB8, 0xCA, 0xB3, 0xB9, 0xEA, 0xEF, 0xC9, + 0xFE, 0x30, 0xBD, 0xFF, 0xFE, 0xDB, 0xDF, 0xDF, 0xEE, 0xF7, 0x8F, 0xDF, + 0xFB, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x47, 0xDF, 0xFD, 0xF8, 0xFF, + 0x7F, 0xFD, 0xFF, 0xEF, 0xDF, 0xBF, 0xD6, 0x55, 0x55, 0x81, 0xFF, 0xF7, + 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, 0xF7, 0x9F, 0xEF, 0x00, 0xD4, 0x01, + 0x75, 0xDD, 0xD7, 0xD4, 0xFF, 0xCD, 0xFC, 0xDD, 0xDF, 0xD7, 0xEF, 0x4D, + 0xEF, 0xBF, 0xDF, 0xEF, 0xFF, 0xFF, 0xFC, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0x8F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, + 0xA2, 0xEA, 0xF7, 0x8F, 0x7F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xFF, 0xFF, 0xDF, + 0x6B, 0x10, 0xEB, 0x2C, 0xA2, 0xF8, 0xE3, 0xF7, 0xEF, 0xAA, 0xFD, 0x1D, + 0xEE, 0xEB, 0xEB, 0x97, 0xB7, 0xF1, 0x2F, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x47, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xF6, 0xFF, 0x47, 0xFC, 0xF7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE1, 0xFF, 0xFF, 0xFF, 0x74, 0xD8, 0xF4, 0x51, 0xD5, 0xD7, 0x77, 0xFE, + 0xF7, 0x7D, 0xDD, 0xFF, 0xFD, 0xE7, 0xF7, 0xB7, 0xBF, 0xFD, 0xDF, 0xF7, + 0xFF, 0xBD, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x7F, 0xDC, 0xFB, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xF7, 0x8F, + 0xE2, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFE, 0x7D, 0xFA, 0x84, 0xFA, 0xA9, + 0xA8, 0xBA, 0xA7, 0xBA, 0xFF, 0xAE, 0xCE, 0xCF, 0xEF, 0xFB, 0xF9, 0xFD, + 0x6F, 0xFF, 0x8F, 0xFC, 0xFD, 0xCF, 0xE7, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, + 0x2F, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x2B, 0xCD, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xDF, 0x7F, 0x3E, + 0x54, 0x2C, 0xD4, 0x31, 0x7F, 0xD5, 0xC7, 0xDF, 0xFF, 0xD5, 0xFF, 0xFF, + 0xD7, 0xF7, 0xFA, 0xFB, 0x9D, 0xFF, 0xDE, 0xFF, 0xF7, 0xFF, 0xFB, 0xF9, + 0xFF, 0xFF, 0xFF, 0xEF, 0xBB, 0xDA, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0x8F, 0x3A, 0xF3, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x6D, 0xFE, 0xF3, 0x1D, 0x6A, 0x20, 0xAF, 0x89, 0xAB, 0xBF, 0x6F, 0xCF, + 0xFF, 0xAA, 0xFB, 0xFF, 0xBB, 0xFB, 0xFF, 0xAF, 0xFA, 0xF5, 0xAF, 0xAF, + 0xDF, 0xFF, 0xBB, 0xFD, 0xFF, 0xFF, 0xFF, 0xDF, 0x3E, 0xD5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x5B, + 0x55, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x1F, 0x7E, 0x54, 0x74, 0xE4, 0xF5, 0x51, + 0x55, 0xDE, 0xD7, 0x7D, 0xFD, 0x5D, 0xDD, 0x5E, 0xFD, 0xF3, 0xEF, 0xEF, + 0x67, 0xB7, 0xDF, 0xEF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, + 0xBF, 0xDF, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF6, 0xF7, 0x8B, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x92, 0x1B, + 0x5A, 0xA8, 0xFF, 0x43, 0xAE, 0xAA, 0x87, 0xBE, 0xFF, 0x2E, 0xFC, 0xFF, + 0xEF, 0xE3, 0xDE, 0xDF, 0x9E, 0xFF, 0x8F, 0xDF, 0xFF, 0xFF, 0xFF, 0x9F, + 0xFF, 0xFF, 0xFF, 0xBF, 0xBF, 0x5F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x7F, 0xED, 0x3D, 0xFD, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF5, 0xF7, 0x7D, 0x1F, 0xD4, 0x98, 0xDC, 0x41, 0xD4, 0xD5, 0xC7, 0x77, + 0xFD, 0x4D, 0x7D, 0x5D, 0xD7, 0xD7, 0xDF, 0xCF, 0xCF, 0xFF, 0x5F, 0xCF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xBF, 0xCF, 0xDF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x57, 0xDB, + 0x2F, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF1, 0x15, 0x6A, 0xE4, 0xEA, 0xBC, + 0xBA, 0xAB, 0x23, 0x92, 0xFF, 0x6E, 0xCF, 0xEE, 0xEF, 0xEB, 0xFB, 0xEF, + 0xEB, 0xFD, 0x2F, 0xEB, 0xBF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, + 0xBF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFE, 0xE6, 0x7D, 0x55, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xCC, 0xFD, 0x9F, + 0xF4, 0x48, 0xF5, 0x71, 0x45, 0xF4, 0x47, 0xE4, 0xF5, 0xDC, 0xDF, 0x9E, + 0xF7, 0xD3, 0xF7, 0xFF, 0xE7, 0xBF, 0xDF, 0xFF, 0xF7, 0xDD, 0xDB, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xDD, 0xFB, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xAB, 0xFC, 0x8B, 0xF2, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xD8, 0xFE, 0xD8, 0x3E, 0x7A, 0x48, 0xEA, 0xB1, 0xBA, 0xBF, 0xE7, 0xDE, + 0xFB, 0xEA, 0xAF, 0xD6, 0xEB, 0xF3, 0xFD, 0xF9, 0xF9, 0xFD, 0x8F, 0xF9, + 0xFD, 0xE7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xF7, 0xBF, 0xC3, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xDB, 0xD7, 0x00, 0xFF, + 0x5F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC1, 0xF7, 0xFF, 0x75, 0x1F, 0x54, 0x64, 0xD5, 0x00, + 0x55, 0xDD, 0xD7, 0xC3, 0xFD, 0xD5, 0x5B, 0xFD, 0xDF, 0xD3, 0xFE, 0xDF, + 0xDA, 0xBA, 0xDF, 0xDA, 0xDF, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, + 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0x37, 0xC2, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0x7D, 0xFD, 0xF9, 0x3F, + 0x6A, 0x00, 0xAA, 0xF1, 0xE1, 0xAE, 0xAF, 0xBF, 0xFB, 0xAE, 0x6F, 0xF6, + 0xBD, 0xAB, 0xFF, 0xFF, 0xAF, 0xFD, 0xA7, 0xBF, 0xBF, 0x7B, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xEF, 0x3F, 0x00, 0xDF, 0xFF, 0xFF, 0x7F, 0xFD, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF5, 0xF5, 0x37, 0xF0, 0xFB, 0x7F, 0xFD, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xFD, + 0xFF, 0xFF, 0xDD, 0x5D, 0x74, 0x54, 0xFD, 0x49, 0xD4, 0xD5, 0x97, 0xFC, + 0xFD, 0x55, 0x5D, 0x5F, 0xFD, 0xF3, 0xFF, 0xEF, 0xEF, 0xBF, 0xDF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0x11, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xF9, 0xBD, + 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x93, 0xFF, 0xD8, 0xFF, 0xFF, 0xFB, 0x3F, 0x5B, 0xE0, 0xCE, 0xE3, + 0xB2, 0xBB, 0x67, 0xBD, 0xFF, 0xE8, 0xCF, 0xFC, 0xEF, 0xB3, 0xDE, 0xDF, + 0xDE, 0xFF, 0x8F, 0xDE, 0xDF, 0xFE, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, + 0xFF, 0xC3, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xD2, 0xCE, + 0x7E, 0x0F, 0x7C, 0xF9, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x7D, 0xFF, 0x7D, 0x77, 0xFF, 0x75, 0x1F, + 0x5C, 0x14, 0xD5, 0xD1, 0xF5, 0xD5, 0x37, 0xD7, 0xFD, 0x5C, 0x4D, 0xAF, + 0xD4, 0x97, 0xFF, 0xFF, 0xDF, 0xFD, 0xDF, 0xCF, 0xDF, 0xBF, 0xDF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x8F, 0xF1, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0x79, 0xF1, 0x4B, 0xFC, 0xBF, 0xF1, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xFD, 0xF4, + 0xFF, 0xFD, 0xFF, 0x17, 0xEA, 0x90, 0xEA, 0x04, 0x9F, 0xBB, 0xAB, 0x1F, + 0xED, 0xAA, 0xA3, 0xEE, 0xFF, 0xAB, 0xFF, 0xEF, 0x7B, 0xFF, 0xAF, 0xEF, + 0xEF, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x1F, 0xE7, 0xFF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xEB, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x47, + 0xF5, 0xFF, 0xFF, 0xFD, 0xFD, 0xFF, 0xDD, 0x9F, 0x74, 0x60, 0xF4, 0x71, + 0x51, 0x95, 0x97, 0xEC, 0xF5, 0xD0, 0xB6, 0xFD, 0xFF, 0xB3, 0xF5, 0xEF, + 0xC7, 0xFE, 0xDF, 0xE7, 0xF7, 0x87, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xAF, 0x35, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, + 0xFF, 0xFF, 0x3F, 0xFF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0xF9, 0xD7, 0xDE, 0xFE, 0xDE, 0xFF, 0xFE, 0xFE, 0x1F, + 0x7B, 0x14, 0xEA, 0xD1, 0xED, 0xAB, 0xCF, 0xB9, 0xFE, 0xBA, 0xAB, 0xFF, + 0xFF, 0xD3, 0xEE, 0xFD, 0xFD, 0xFF, 0xBF, 0xFB, 0xF9, 0xDD, 0xFB, 0xF1, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x7B, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, + 0xFF, 0xFF, 0xDF, 0xDA, 0xFB, 0xEF, 0xFF, 0xFD, 0xF7, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xF7, 0xF5, 0xFF, 0xFF, 0xFF, + 0xF7, 0xFF, 0x75, 0x17, 0x54, 0x54, 0xD5, 0x88, 0x4D, 0xDD, 0x87, 0xDD, + 0xFD, 0x75, 0x7D, 0xDD, 0xD9, 0xF7, 0xBE, 0xBF, 0xEE, 0xFD, 0xDF, 0xDF, + 0xDA, 0xFA, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x78, 0xCA, 0xFE, + 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0xFF, 0xBA, 0xFE, 0xE7, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x7D, 0xFD, + 0x7F, 0x7F, 0xFD, 0x7D, 0xFF, 0xFF, 0xFF, 0x1F, 0x6A, 0xA0, 0xAE, 0x81, + 0xAA, 0x8A, 0x8F, 0xF5, 0xEF, 0xBA, 0x5D, 0x76, 0xAE, 0x2B, 0xCF, 0xD9, + 0xD7, 0xF6, 0xAF, 0xEF, 0xBF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0xD1, 0xC8, 0xFF, 0x57, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xF5, 0xBB, 0x7F, 0x3F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xDD, 0x5F, + 0xF6, 0x04, 0xFD, 0x81, 0xC1, 0x94, 0x97, 0x35, 0xFD, 0x51, 0xF5, 0xDD, + 0xFE, 0x67, 0xDD, 0xDB, 0xB7, 0xE7, 0xCF, 0xEF, 0x3B, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFE, 0xFD, 0x77, 0x77, 0xFB, 0xFF, 0xFF, + 0xFF, 0x7E, 0x77, 0xFF, 0xFF, 0x07, 0x7E, 0xFD, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0xDF, 0xDF, 0xFB, 0xD3, 0xFB, 0xFF, 0xDA, + 0xFF, 0xFF, 0xFF, 0x1F, 0x5A, 0x64, 0xDA, 0x02, 0x90, 0xBE, 0xA7, 0xA2, + 0xFE, 0x5E, 0x7F, 0xFF, 0xFE, 0xCB, 0xDC, 0xD5, 0xFF, 0xFF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xF1, 0xBF, 0xFC, + 0xEF, 0x7F, 0xFF, 0xFF, 0xDF, 0xFF, 0xDF, 0xDE, 0xDE, 0xEE, 0x7C, 0xDF, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFC, 0x4F, 0x7F, 0xFF, + 0x7D, 0x7F, 0xFF, 0x7F, 0x7F, 0xFF, 0x75, 0x1F, 0x54, 0x10, 0xD4, 0x11, + 0xF4, 0xD5, 0x47, 0x55, 0xDD, 0x1D, 0xCD, 0xFF, 0xFF, 0xD5, 0xFD, 0xEF, + 0xFF, 0xFF, 0x7F, 0x7F, 0xFC, 0xFD, 0xDF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0xFD, 0x8B, 0xDE, 0xCF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xDF, 0xFE, + 0xFF, 0xFF, 0xF9, 0xFB, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, + 0xF5, 0xCF, 0xF5, 0xF5, 0xF3, 0xF5, 0xFD, 0xF0, 0xFF, 0xFD, 0xFF, 0x17, + 0x6A, 0x00, 0xEE, 0x64, 0x83, 0xA4, 0xBF, 0xEF, 0xEA, 0xEE, 0xEB, 0xFF, + 0xFF, 0xBB, 0xA7, 0x7F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x7D, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7E, 0x7F, 0xC3, 0xF2, 0xFB, 0xEB, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x43, 0xDD, 0xFD, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, + 0xDD, 0xFF, 0xDD, 0x9D, 0x75, 0x60, 0xF5, 0x91, 0x50, 0xD5, 0xD7, 0xF7, + 0xF7, 0xF5, 0xF7, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x7D, 0x77, + 0xF7, 0xF7, 0xFB, 0xFF, 0xFF, 0x7F, 0x77, 0xFE, 0xFF, 0x81, 0xF1, 0xEF, + 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xF9, 0xFC, 0xDF, 0xEF, 0xDE, 0xFE, + 0xDB, 0xDE, 0xFE, 0xDE, 0xFF, 0xFE, 0xFE, 0x1F, 0x7A, 0x30, 0xFB, 0x00, + 0xC8, 0xBB, 0xEB, 0xFB, 0xFB, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF9, 0xFF, 0xFF, 0x6F, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xFF, 0xDE, + 0xDF, 0x01, 0xE3, 0xDF, 0xF7, 0xFF, 0xFF, 0xFF, 0xDF, 0xC4, 0xFF, 0xF5, + 0xF7, 0xFF, 0xFF, 0xF7, 0xF5, 0xF7, 0xFF, 0xFF, 0xFF, 0xDF, 0x75, 0x17, + 0x54, 0x10, 0xD5, 0xCD, 0xD4, 0x9D, 0x93, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xE0, 0xDD, 0xDD, 0xF3, 0xFD, 0xFF, 0xFF, + 0xFF, 0xFF, 0xDF, 0xFE, 0xAF, 0x00, 0xED, 0x3F, 0xED, 0xFF, 0xFF, 0xFF, + 0x1F, 0x7D, 0xFD, 0xFC, 0xFF, 0x6F, 0xFD, 0xFD, 0x7B, 0x7D, 0xFD, 0xFC, + 0xFF, 0xDD, 0xFF, 0x5F, 0x6A, 0x04, 0xAE, 0xAC, 0xAF, 0x9B, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x6A, 0xFF, + 0xEF, 0xFF, 0xFF, 0x3F, 0xF4, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFD, 0xFF, + 0xFD, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xDD, 0x1D, 0xF6, 0xD4, 0xFF, 0xEC, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x9D, 0xFF, 0x7F, 0x7F, 0xFB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x7A, 0xF5, 0x76, 0x7F, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, 0x77, 0xFF, + 0xBF, 0x00, 0x76, 0xFB, 0xF7, 0xFF, 0xFF, 0x91, 0x9F, 0xFF, 0xFB, 0xF8, + 0xDF, 0xFF, 0xFF, 0xFB, 0xFB, 0xDF, 0xD7, 0xDF, 0xFF, 0xDF, 0xFF, 0x1B, + 0x5A, 0xB8, 0xFE, 0x68, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0xFC, + 0xFD, 0xDE, 0xFB, 0xFB, 0xFB, 0xF7, 0x3F, 0xFF, 0xFE, 0xED, 0xBD, 0xBF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x7E, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0xEA, 0xFF, 0xEF, 0xFF, 0x4F, 0xFC, + 0x7F, 0x77, 0xFF, 0x7D, 0xF7, 0xEF, 0xFF, 0xFF, 0x7D, 0x7F, 0xEF, 0xFF, + 0xFF, 0xFF, 0x75, 0x1F, 0xDC, 0x70, 0xF7, 0xFF, 0xFF, 0xFF, 0x57, 0x9D, + 0xED, 0xD5, 0x31, 0xD9, 0x93, 0xF7, 0xD7, 0xFF, 0xF7, 0x7F, 0x7D, 0xDF, + 0xFF, 0x5F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xDD, 0xDD, 0x5E, + 0xFF, 0xFD, 0xFF, 0xFE, 0xBF, 0xFF, 0xDF, 0xF5, 0xB7, 0x00, 0xB2, 0xEB, + 0xFF, 0x7F, 0xF1, 0xF5, 0xBF, 0xFF, 0xFD, 0xF4, 0xFF, 0xEF, 0xFF, 0xFF, + 0xF7, 0xFD, 0xBD, 0xF0, 0xFF, 0xBD, 0xFF, 0x57, 0x6A, 0xFC, 0xFF, 0xFF, + 0x8F, 0x5A, 0x3D, 0xAB, 0xF7, 0xEB, 0x22, 0xAF, 0xFF, 0x7B, 0xBB, 0xFB, + 0x49, 0xDF, 0x3F, 0xFF, 0xFD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xFE, 0xFF, 0x7E, 0xFF, 0xFF, 0xF7, 0xF7, 0xBF, 0xFF, 0xFF, 0xF7, + 0xBF, 0x00, 0xD6, 0x2F, 0xF8, 0x43, 0xE7, 0xFF, 0xDF, 0xDF, 0xFF, 0xDD, + 0xFD, 0xFF, 0xFD, 0x7F, 0xFD, 0xFF, 0xDF, 0xFF, 0xDD, 0xDF, 0xDD, 0x1D, + 0x77, 0xFF, 0xFF, 0x5F, 0xD4, 0x9F, 0xD1, 0xF9, 0x4A, 0xFD, 0x75, 0x75, + 0xD7, 0x5E, 0xFC, 0xFF, 0xD5, 0xFD, 0x7D, 0xB9, 0xEF, 0x97, 0xD7, 0xDB, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x77, 0x77, 0xF6, 0xFF, 0x77, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFB, 0xFF, 0xD7, 0x00, 0xCA, 0xCB, 0x0F, 0xD9, 0xDF, 0xDE, + 0xBF, 0xFF, 0xFF, 0xFC, 0xDF, 0xEF, 0xFF, 0x7E, 0xFF, 0xFE, 0xFE, 0xDE, + 0xFF, 0xFF, 0xFE, 0x1F, 0xFB, 0xFF, 0xB3, 0xCA, 0xBE, 0xBE, 0x90, 0xFB, + 0xBF, 0xFF, 0xA8, 0xF2, 0x5D, 0x95, 0xDF, 0xFA, 0xE8, 0xBF, 0x3F, 0xFD, + 0xEF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFE, 0xF7, 0xFF, + 0x6D, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0x6C, 0xBF, 0xBF, 0x00, 0x52, 0xFF, + 0xC4, 0xF7, 0xE7, 0xF7, 0xFF, 0x77, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, + 0xF5, 0xF7, 0xDF, 0x77, 0xFF, 0xDF, 0x77, 0x97, 0xDF, 0x7F, 0x81, 0x90, + 0x50, 0x1F, 0xE4, 0xDF, 0x75, 0xFF, 0x55, 0xDD, 0x5D, 0xFF, 0xFE, 0xFF, + 0xD4, 0xD6, 0xD7, 0xBF, 0xFF, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xDD, 0xD5, 0x9F, 0xF7, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, + 0xF7, 0x00, 0xF2, 0x15, 0x6F, 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xFD, 0xFC, + 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFD, 0xDD, 0xFC, 0x7F, 0xDD, 0xFF, 0xFF, + 0x6F, 0x78, 0x1A, 0x62, 0xB2, 0x9F, 0xA0, 0x34, 0xDF, 0xFB, 0x8A, 0xDD, + 0xFE, 0x1C, 0xB5, 0xFD, 0xAE, 0x4F, 0x3F, 0x7F, 0xFF, 0x6F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF6, 0xFF, 0x5F, 0xFB, 0xFF, 0xFF, 0xFF, + 0x7D, 0xFD, 0xFF, 0xFA, 0xF7, 0x00, 0x7A, 0xF4, 0xFF, 0xFF, 0xE7, 0xFD, + 0xFF, 0xFF, 0xFF, 0xDD, 0xFD, 0xF9, 0xFD, 0x7F, 0xFD, 0xFF, 0xFF, 0xFF, + 0xDD, 0xFF, 0xDD, 0xFD, 0x4F, 0x68, 0x50, 0x36, 0x55, 0x1F, 0x54, 0x5D, + 0xFD, 0xFD, 0x5C, 0xDB, 0xD5, 0xFD, 0xDF, 0xFF, 0xF5, 0x7E, 0x7F, 0xFF, + 0xFE, 0xDF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x77, 0x77, 0xD7, + 0x7E, 0xF7, 0xBF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xC0, 0x9F, 0xDB, + 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0xFF, 0xFB, 0xFC, 0xDF, 0xFA, 0xFF, 0xFB, + 0xDB, 0xFB, 0xDF, 0xDF, 0xFF, 0xDF, 0xFF, 0xFB, 0xEF, 0x7E, 0x88, 0x00, + 0xB9, 0x1F, 0xFE, 0xBF, 0xEF, 0xFF, 0xE8, 0xBF, 0xB8, 0xFE, 0xBF, 0xFF, + 0xEB, 0x7B, 0x3F, 0xFF, 0xFD, 0xEF, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x7E, 0xCF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0x7F, 0x77, 0xFF, 0xFD, + 0xFF, 0xED, 0xFF, 0x7F, 0xFD, 0x7F, 0xEF, 0x7F, 0x7F, 0xFF, 0x77, 0xFF, + 0x21, 0x4D, 0x54, 0x55, 0x51, 0x9F, 0x90, 0xBD, 0xD3, 0xFD, 0x35, 0xF7, + 0x5F, 0xFF, 0x7D, 0xFF, 0xD4, 0x5F, 0x7B, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x5D, 0xFD, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFD, 0xEF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBD, 0xFC, 0xFF, 0xEB, 0xFF, 0xB5, 0xF7, 0xF5, 0xBD, 0xFD, + 0xFF, 0xBD, 0xFF, 0xB5, 0xE1, 0x6B, 0x20, 0x32, 0xE8, 0x9A, 0x88, 0xFE, + 0x97, 0xFF, 0xA2, 0xFF, 0xFA, 0xFF, 0xB3, 0xFE, 0xCD, 0xF1, 0x7B, 0xFD, + 0xFB, 0xAF, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xAD, 0x1F, 0xFA, + 0xFF, 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xDF, 0xFF, + 0xFF, 0xFF, 0xE7, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xFD, 0xFD, 0xFD, 0x7F, + 0xFD, 0xFF, 0xDF, 0xFF, 0xDD, 0xDF, 0xDD, 0x9F, 0x01, 0xE5, 0x08, 0xC4, + 0xD0, 0x9F, 0xC0, 0x7F, 0xFF, 0xFF, 0x7C, 0xF6, 0xDD, 0xFD, 0xDF, 0xFF, + 0xF6, 0xB7, 0x7F, 0xFF, 0xFF, 0xD7, 0xDF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0xD6, 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFE, 0x1F, + 0xE9, 0xFE, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xDF, 0xEB, 0xFF, 0x7E, 0xFF, 0xDF, 0xFE, 0xDE, 0xFF, 0xFE, 0xDE, 0x1E, + 0xA1, 0x7A, 0x8A, 0xF2, 0xE2, 0x1F, 0xBA, 0xFA, 0xB7, 0xFF, 0xE8, 0xF5, + 0xBF, 0xFE, 0xAB, 0xFF, 0xD9, 0xDC, 0x3F, 0xF7, 0xA7, 0xEF, 0xFB, 0xFB, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xAD, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC4, 0xFF, 0xFF, 0xDF, 0xFF, 0xF7, 0xF7, 0x77, 0xF7, + 0xFF, 0x77, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xF7, 0xFD, 0xF7, 0xDF, 0x77, + 0xF7, 0xD7, 0xF5, 0x17, 0x41, 0x5D, 0x05, 0x0C, 0x52, 0x1F, 0xE9, 0xDF, + 0xFD, 0xFF, 0xD4, 0xDF, 0xDD, 0x7C, 0xDE, 0xFD, 0xDC, 0x37, 0xFF, 0xAF, + 0xFF, 0x5E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xEC, 0xFF, 0x7F, + 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x15, 0x7D, 0x7D, 0x7D, 0xDF, 0xFF, + 0x6F, 0xFD, 0xFF, 0xFF, 0x7B, 0xFF, 0xFD, 0xFC, 0xFF, 0xEB, 0xFF, 0xFF, + 0xFF, 0x7F, 0xDD, 0x7C, 0x7D, 0xDD, 0x7F, 0x1D, 0x81, 0x6E, 0xE0, 0x32, + 0xA2, 0x1E, 0x38, 0xFF, 0xBB, 0xFB, 0x98, 0xFF, 0xBE, 0x67, 0xBF, 0xFB, + 0xCB, 0x7F, 0xBF, 0x7B, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x7D, 0xDB, 0xFF, 0xFF, 0x3D, 0xFF, 0xFF, 0xFF, 0xFD, 0xF4, 0xFF, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xF7, 0xDD, 0xF5, 0xFF, 0xFF, 0xDF, + 0xFD, 0xFD, 0xFD, 0x7F, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x5F, + 0x21, 0x6D, 0x04, 0x51, 0xF1, 0x1F, 0x6C, 0xFD, 0xA7, 0xFD, 0x5D, 0xDF, + 0x9D, 0x75, 0xF7, 0xBF, 0x77, 0xFB, 0xEF, 0xFF, 0xFE, 0xDF, 0xFB, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x7D, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xFF, 0xDB, 0xDB, 0xFB, 0xFF, 0xDF, 0xFF, 0xDF, 0xFB, 0xD7, 0xFF, + 0xF3, 0xFF, 0xFB, 0xFE, 0xDF, 0xFB, 0xFF, 0xFF, 0xDB, 0xFF, 0xDF, 0xDB, + 0xDB, 0xD7, 0x7B, 0x15, 0x93, 0x5A, 0x22, 0x1B, 0xA9, 0x1E, 0xAC, 0xFF, + 0xAF, 0xF9, 0xCA, 0xBF, 0xAF, 0x7E, 0xBF, 0xFF, 0x69, 0x7F, 0xDF, 0xDF, + 0xFE, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x6F, 0xF5, 0x6F, + 0xFF, 0xFF, 0xBF, 0x7F, 0xFF, 0x7F, 0x6F, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, + 0xEF, 0xFF, 0x7D, 0xF7, 0x7F, 0x77, 0xFF, 0xFF, 0xFF, 0xED, 0xF7, 0x7F, + 0xFD, 0x77, 0xEF, 0x7F, 0x7F, 0x7F, 0xEA, 0x3F, 0x01, 0x5F, 0x04, 0xD9, + 0x5B, 0x1F, 0x55, 0xD7, 0x9D, 0xFD, 0xD5, 0xFF, 0x7F, 0xFF, 0xF5, 0xFF, + 0x7D, 0x7F, 0xDF, 0xFF, 0xFF, 0xDF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xB1, 0xDB, 0xFD, 0xFF, 0xBE, 0xFF, 0xF6, 0xFF, 0xFF, 0xE7, 0xFD, + 0xFD, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFD, 0xF4, + 0xFF, 0xEB, 0xFF, 0xFF, 0xF7, 0xFF, 0xBD, 0xFD, 0x97, 0xD1, 0xFF, 0x9F, + 0xA5, 0x6A, 0xE8, 0x88, 0xA0, 0x3A, 0xA0, 0xFF, 0xDF, 0xFE, 0x38, 0xFF, + 0xFE, 0x7E, 0xBF, 0xFE, 0xCF, 0xF9, 0xFB, 0xEF, 0xFB, 0xAF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xED, 0xFF, 0xEE, 0xFB, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xF5, 0xDF, + 0xD7, 0xDF, 0xFF, 0xDF, 0xFD, 0xFD, 0xFD, 0x7F, 0xFF, 0xDD, 0xDF, 0xEF, + 0xFA, 0xFF, 0xFF, 0x1F, 0x21, 0xE5, 0x60, 0x01, 0x54, 0x1F, 0xFC, 0xF3, + 0x6F, 0xFD, 0xF5, 0x55, 0xDD, 0xFF, 0xDB, 0xFD, 0x75, 0xFD, 0xFF, 0xFF, + 0xF7, 0xD7, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xA0, 0x63, 0x7B, + 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFE, 0xFE, 0xDF, 0xCB, 0xFF, 0xFF, + 0xDF, 0xFF, 0x3B, 0xF9, 0xFF, 0xFF, 0xFF, 0x1F, 0xC1, 0x7A, 0x22, 0x30, + 0xE8, 0xBF, 0xC6, 0xBE, 0xFF, 0xFD, 0xAA, 0xFE, 0xEF, 0xFA, 0xBF, 0xFF, + 0xD9, 0xCF, 0xFD, 0xFD, 0xFD, 0xEF, 0xCF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x2D, 0x8C, 0x7F, 0x7F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0xFF, 0xDF, 0xF7, 0xF5, 0xF7, 0xF5, 0xF7, 0xD5, 0x77, 0xFF, 0xF7, + 0xF7, 0xFD, 0xF7, 0xFF, 0xF7, 0xF7, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0x09, 0x5D, 0x71, 0xED, 0x72, 0x1F, 0x31, 0xF7, 0x7F, 0xFE, 0x15, 0xDD, + 0xDF, 0xFF, 0xBF, 0xFD, 0xD5, 0xFF, 0xFF, 0xFF, 0xFA, 0xDF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x2C, 0x9B, 0xFD, 0xFA, 0xFE, 0xFA, 0xFB, + 0xFF, 0x7F, 0x7F, 0xFD, 0xFD, 0x7F, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xFF, 0xFD, 0xFD, 0xFF, 0xEB, 0xFF, 0x3F, 0xAD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x1F, 0xE1, 0x6E, 0xA2, 0x32, 0xBB, 0x1F, 0x78, 0xFD, + 0xBB, 0xFA, 0xAA, 0xFB, 0xFF, 0xF7, 0xFF, 0xFB, 0xC9, 0xFF, 0x7F, 0xAF, + 0xAF, 0x6F, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xA3, 0x9F, 0xFB, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xF5, 0xDF, 0xF7, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xAF, 0xEF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x11, 0x6D, 0x20, 0x14, + 0xD9, 0x5F, 0xFC, 0xFF, 0xDF, 0xFD, 0xF5, 0xD9, 0xD7, 0xFF, 0xB5, 0xBF, + 0xFF, 0xFF, 0xDF, 0xFF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0xBC, 0x59, 0xF1, 0xFF, 0xF6, 0xFF, 0xF7, 0xFF, 0xFF, 0xDB, 0xDB, + 0xFB, 0xFF, 0xDB, 0xFF, 0xFF, 0xDF, 0xF7, 0xFF, 0xD7, 0xFF, 0xFB, 0xDB, + 0xFF, 0x57, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xC3, 0x7A, 0x88, 0xBD, 0xA3, 0x9E, 0xE2, 0xFB, 0xFB, 0xFA, 0x8A, 0xCF, + 0xEF, 0xFF, 0xBF, 0xFB, 0x78, 0xDF, 0xBE, 0xDF, 0xFE, 0xEF, 0xBB, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xAA, 0x77, 0xFF, 0xFF, 0x7F, 0xF7, 0xFE, + 0xFF, 0x7F, 0xEF, 0x7F, 0x7F, 0xFF, 0x7F, 0xFF, 0x7D, 0xFF, 0xFD, 0xF7, + 0x7F, 0x7F, 0xFF, 0xFF, 0x7B, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, + 0xFF, 0xFF, 0xFF, 0x3F, 0xA1, 0x6F, 0xC8, 0x74, 0xD5, 0x1F, 0xC4, 0xFD, + 0x57, 0xFF, 0x75, 0x75, 0x7F, 0xF7, 0xFD, 0xFF, 0xF5, 0xFF, 0xFB, 0x7D, + 0xF7, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x38, 0xD8, 0x9B, + 0xEC, 0x9F, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFD, 0xFD, 0xFF, 0xFB, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x91, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x07, 0xF9, 0xFF, 0xFF, 0x1F, 0xAD, 0x6A, 0xA0, 0x82, + 0xBB, 0x1A, 0xF6, 0xFD, 0xEA, 0xFA, 0xEB, 0xFE, 0xFE, 0xBF, 0xFB, 0xFD, + 0xE9, 0xF5, 0xFD, 0xFF, 0xFF, 0xEF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xAA, 0x6D, 0xFB, 0x6A, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xF7, 0xDD, 0xDF, 0xDD, 0xCA, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x07, 0xF9, 0xFF, 0xFF, 0x1F, + 0x01, 0xE5, 0x54, 0xE4, 0x5C, 0x1F, 0x59, 0xFE, 0x77, 0xFD, 0x34, 0x5D, + 0xDF, 0xFC, 0x8F, 0xFE, 0x97, 0xED, 0xFF, 0xEB, 0xF5, 0xDF, 0xCF, 0xEF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xA8, 0x29, 0x6B, 0x6A, 0xFB, 0xFF, 0xFF, + 0xFF, 0xFF, 0xCE, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xDF, 0xDE, + 0x3B, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x77, + 0xFF, 0xFF, 0xFF, 0x1F, 0x91, 0x7A, 0x60, 0xEA, 0x92, 0x1F, 0x28, 0xF6, + 0x3F, 0xFA, 0xCA, 0xBF, 0x3A, 0xAB, 0x9B, 0xFB, 0x89, 0x7F, 0x6F, 0x87, + 0xFF, 0xEF, 0xFB, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x2A, 0xAD, 0x65, + 0xFF, 0xF7, 0xFE, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xDF, 0xF7, + 0xF5, 0xF7, 0xFD, 0xD3, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFD, + 0xFF, 0xFE, 0xFF, 0x77, 0x3F, 0x97, 0x39, 0x1F, 0x21, 0x7D, 0x21, 0x57, + 0x11, 0xDF, 0xD8, 0xFD, 0x5A, 0xDD, 0x14, 0x1F, 0xDF, 0x7D, 0x2D, 0xBF, + 0x75, 0xDF, 0xCF, 0x7F, 0xFF, 0xDB, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0x2D, 0xD1, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xEF, 0x7D, + 0xFD, 0x7F, 0x5F, 0xFD, 0xFF, 0xFD, 0x2D, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFB, 0x83, 0xFD, 0xFF, 0xFE, 0xFF, 0x77, 0x39, 0x97, 0x10, 0x1E, + 0x81, 0x6A, 0x08, 0x2E, 0x9B, 0x9F, 0xD2, 0x27, 0x9B, 0xEB, 0xE3, 0xBB, + 0xB2, 0x7F, 0xFB, 0xFF, 0xFF, 0xF7, 0x3F, 0x7F, 0xFE, 0xEF, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xA3, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0xF6, 0xFF, + 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFB, 0xBB, 0xFD, 0xFF, 0xFE, 0xC7, 0x77, + 0x19, 0x86, 0xD6, 0x5E, 0xA1, 0x6D, 0x40, 0xDC, 0xFD, 0xDE, 0x10, 0x6B, + 0xDF, 0xFF, 0x15, 0xD7, 0x7F, 0x77, 0x3D, 0xFE, 0xF4, 0xFB, 0xDE, 0x76, + 0xFF, 0xDB, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x29, 0xAB, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xDB, 0xDB, 0xFB, 0xFF, 0xFF, 0x7B, + 0xF5, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0xFF, 0xFB, 0xBB, 0xFD, + 0xFF, 0x38, 0x87, 0x77, 0xD9, 0xE6, 0xD6, 0x1E, 0xA3, 0x7A, 0x80, 0xA0, + 0x8B, 0x3F, 0x22, 0xB9, 0x67, 0xFA, 0x2A, 0x7B, 0xE3, 0x9F, 0xFC, 0xFE, + 0xDA, 0xBF, 0x3A, 0xFF, 0xF3, 0xAF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xBF, 0xDF, 0xDF, 0x6F, 0xFF, 0xF5, 0xF6, 0xFF, 0x7F, 0xFF, 0x7F, + 0x7F, 0x7F, 0x6F, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x7F, 0xCF, + 0xFF, 0xFB, 0xFB, 0x98, 0xE3, 0x10, 0x86, 0x77, 0xDB, 0xE6, 0xD6, 0x3E, + 0x21, 0x6D, 0xE0, 0x44, 0x74, 0x7F, 0x95, 0xAF, 0x05, 0xDF, 0x75, 0xFB, + 0x7F, 0xFF, 0xBF, 0xFF, 0xB5, 0xBB, 0xDF, 0x73, 0xFF, 0xDF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFD, 0xFF, 0x93, 0xEE, 0xBF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF7, 0xFD, 0xFD, 0x91, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x1F, 0x7E, 0xCE, 0x7F, 0xDA, 0xFB, 0x08, 0xC3, 0xD6, 0xB6, 0x77, + 0xDB, 0xE6, 0x1E, 0x1E, 0xA5, 0x6A, 0x4A, 0x3D, 0x2A, 0x7A, 0xB7, 0x6E, + 0x97, 0xEB, 0xA2, 0xE8, 0x3F, 0xFB, 0xEE, 0xFE, 0x73, 0xFE, 0xBF, 0xFF, + 0xF7, 0x2F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xDF, 0xBF, 0x48, + 0x36, 0xFB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xFA, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xDF, 0x7E, 0xC6, 0x5C, 0xDA, 0xFB, 0x6C, + 0xDB, 0xD6, 0xB6, 0x07, 0x1B, 0xF6, 0x1E, 0x1E, 0x81, 0xE5, 0x00, 0x50, + 0x00, 0x1F, 0xBB, 0x1B, 0x75, 0xF6, 0x55, 0x9D, 0xDD, 0x59, 0xD5, 0xBF, + 0xFD, 0xBF, 0x4F, 0xA7, 0x9F, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x2F, 0xC3, 0x76, 0x67, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0x5E, 0x31, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xDF, 0x7E, 0x54, + 0x18, 0xEB, 0xC3, 0x6D, 0xDB, 0xD6, 0xB6, 0x07, 0x1B, 0xF6, 0x1E, 0x1E, + 0x81, 0x7A, 0xB2, 0xEA, 0x9E, 0x9A, 0x78, 0x5E, 0x19, 0xFB, 0x23, 0xA9, + 0xBB, 0xBF, 0xAB, 0xA9, 0xBC, 0x0F, 0x8F, 0xFF, 0xFF, 0xEF, 0xF7, 0xF7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x9D, 0xDE, 0xBF, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xD3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0x6C, + 0x6E, 0x5F, 0x7E, 0x51, 0x9B, 0xEB, 0x87, 0x0D, 0xDB, 0x16, 0xB6, 0x87, + 0x1B, 0xF6, 0xDE, 0x1F, 0x01, 0x7D, 0x88, 0x13, 0xD5, 0xDE, 0x84, 0x83, + 0xDA, 0xDE, 0xC5, 0xDB, 0xDF, 0xDF, 0xDB, 0xDF, 0xEF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xA1, 0xFF, 0x7F, + 0xFB, 0xFE, 0xFF, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDD, 0xFF, 0xF8, 0x7E, 0x6C, 0x3F, 0x7F, 0x51, 0xDB, 0xF3, 0xBF, 0x0D, + 0xDB, 0x16, 0xB6, 0xF7, 0xDB, 0xF7, 0xDE, 0x1F, 0x81, 0x68, 0x10, 0x00, + 0x21, 0xBF, 0xAB, 0xAF, 0xAF, 0xEF, 0xB3, 0xAF, 0xEF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x76, 0x5D, 0xFA, 0xDF, 0x2F, 0xFD, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0x1D, 0xE7, 0xF0, 0xBE, 0x6D, 0xBF, 0x7F, 0xDB, + 0xD8, 0xF3, 0xBF, 0x0D, 0xDB, 0xD6, 0xB7, 0xF7, 0xDB, 0xF7, 0xDE, 0x5F, + 0x01, 0x68, 0x20, 0x20, 0xE5, 0x7F, 0xAB, 0xFF, 0x7F, 0xE2, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xDF, 0xE3, 0xDF, 0xFF, 0xF7, 0xFF, 0x7E, + 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xCF, 0x18, 0xDA, 0xF6, 0xBE, + 0x6D, 0x5F, 0x7D, 0xDB, 0xD8, 0xF3, 0xBF, 0xED, 0xDB, 0xD6, 0xB7, 0xF7, + 0xDB, 0xF6, 0xD6, 0x1E, 0x01, 0x78, 0x20, 0x20, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x9F, 0xBE, 0xFF, 0xFF, + 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x25, 0x7D, 0xB3, + 0x6F, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xBF, 0x39, 0xBE, + 0xDD, 0xDE, 0xF6, 0x66, 0x6C, 0x4F, 0x7D, 0x5F, 0xDB, 0xF3, 0xBF, 0xED, + 0xDB, 0xD6, 0xB6, 0xF7, 0xDB, 0xF6, 0xD6, 0x3E, 0x01, 0x68, 0x02, 0xDC, + 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFF, + 0xFF, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0x9D, 0x8B, 0x49, 0xFE, 0xB5, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x6F, + 0xDB, 0xBF, 0xB6, 0xBD, 0xDD, 0xC6, 0xF6, 0x66, 0x6C, 0xEF, 0x7E, 0x5F, + 0xDB, 0xF3, 0xBB, 0x6D, 0xDB, 0xD6, 0xB6, 0xF7, 0xDB, 0xF6, 0xD6, 0x1E, + 0xE3, 0xEB, 0xCA, 0xED, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xBF, 0xD8, + 0x38, 0x7A, 0xB7, 0xFC, 0x7F, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xCE, 0x8D, 0x53, 0x2F, 0xFF, 0xFB, 0xFF, + 0xFF, 0xFF, 0xFF, 0x6F, 0xDB, 0xBF, 0xB6, 0x8D, 0xDD, 0xDE, 0xF6, 0xAE, + 0x6D, 0xEF, 0x7C, 0x5F, 0xDB, 0xEB, 0xBB, 0x6D, 0xDB, 0xD6, 0xB6, 0xF7, + 0x1B, 0xF6, 0x10, 0x1E, 0xE7, 0x67, 0x92, 0xFF, 0xFF, 0xF7, 0xFF, 0x3B, + 0x3C, 0xFB, 0x5F, 0x5D, 0xFB, 0xDD, 0x99, 0xFB, 0xFF, 0xB9, 0xFB, 0xBF, + 0xFF, 0xDF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x34, 0xD3, 0xEE, + 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xDB, 0xBF, 0xB6, 0xB5, + 0xDD, 0xDA, 0xF6, 0xAE, 0x6D, 0x6F, 0x7C, 0x5F, 0xDB, 0xEB, 0x83, 0x09, + 0xE3, 0x16, 0xB6, 0xF7, 0x1B, 0xF7, 0x10, 0x1E, 0x39, 0xE0, 0xFF, 0xFF, + 0xFF, 0x9F, 0xBE, 0x1F, 0x3B, 0x83, 0xAB, 0xBB, 0xFB, 0x0A, 0x3D, 0xED, + 0x3F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x9F, 0xF9, 0x49, 0xFB, 0xFF, 0xFF, 0xFB, 0xFD, 0xFF, 0xFF, 0x6F, + 0xDB, 0xBB, 0xB6, 0xB5, 0xDD, 0xDA, 0xF6, 0xAC, 0x6D, 0x6F, 0x7B, 0xDF, + 0xD8, 0xDB, 0x87, 0x9B, 0xE3, 0x36, 0xB7, 0xF7, 0x3B, 0xF7, 0x39, 0x1F, + 0x21, 0xFE, 0xBF, 0xF8, 0x41, 0xB4, 0x59, 0x3F, 0x21, 0x11, 0x61, 0x4D, + 0x7F, 0x37, 0x35, 0x7F, 0xDF, 0x9F, 0xFF, 0xF7, 0x7F, 0xF7, 0xFE, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x6F, 0x7F, 0xDB, 0xDF, 0x77, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x6F, 0xDB, 0xBB, 0xB6, 0xB5, 0xDD, 0xDA, 0xF6, 0x20, + 0x0C, 0x1F, 0x7B, 0xDF, 0xD8, 0xDB, 0xC7, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x1F, 0x70, 0xFF, 0xFF, 0x27, 0xA0, 0x89, 0x2B, 0x3F, + 0x11, 0x07, 0xDF, 0xFF, 0x37, 0x6F, 0xE7, 0xEF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFE, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x24, 0x75, 0xFB, + 0x7F, 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xDB, 0x83, 0xB9, 0x8D, + 0xDB, 0xC6, 0xF6, 0x71, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFD, 0xFF, 0x27, 0x02, + 0x18, 0x5B, 0x63, 0x3F, 0x4A, 0x7A, 0x7E, 0x66, 0x7F, 0xFF, 0xFE, 0xFF, + 0xBF, 0xBA, 0xFE, 0xFF, 0xFB, 0xFB, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xBF, 0xDF, 0x6F, 0xD3, 0x77, 0xFF, 0xB7, 0xF7, 0xFF, 0xFF, 0xFF, 0x8F, + 0xC7, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0xFE, 0xFF, 0xCA, 0xE8, 0xE6, 0x2A, 0x08, 0xB8, 0x88, 0x92, 0xFA, 0xB2, + 0xF2, 0xFF, 0xBF, 0xDE, 0xF3, 0xBF, 0xBB, 0x73, 0xF7, 0xFF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x87, 0x8D, 0x29, 0xE7, 0x97, 0xFD, 0xFF, + 0xB7, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xDF, 0x7F, 0x40, 0x00, 0x20, 0x02, 0x49, 0x2D, 0x3A, + 0xDA, 0xB8, 0x7E, 0x3E, 0xF8, 0x18, 0x36, 0x75, 0x77, 0x31, 0xF7, 0xFF, + 0xFF, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x63, 0x20, 0x32, 0x02, + 0xB2, 0xBA, 0x08, 0x38, 0x1C, 0x9A, 0xB9, 0xBA, 0x7A, 0xDB, 0xDB, 0xDB, + 0x9F, 0xDF, 0xBB, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + }; diff --git a/kernel_driver/test/test b/kernel_driver/test/test new file mode 100755 index 0000000000000000000000000000000000000000..98eb4a9da6e1d2ff2ccd4fca3afe3272b0084185 GIT binary patch literal 31344 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

D&p~QFMim^pF#_x3lH#*h2^~Md+)N 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 I6-_h$AHP^vV*mgE literal 0 HcmV?d00001 diff --git a/kernel_driver/test/test.c b/kernel_driver/test/test.c new file mode 100644 index 0000000..b2d1d53 --- /dev/null +++ b/kernel_driver/test/test.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include + +#define SIZE (512*342*3) + +#include "bdc.xbm" + +int main(int argc, char** argv) { + char *fb; + char *fbp; + char n; + int x; + int p; + int fd=open("/dev/fb0", O_RDWR); + if (fd<0) perror("opening fb"); + fb=mmap(NULL, SIZE, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); + if (fb==MAP_FAILED) { + perror("Mmap failed"); + exit(0); + } + fbp=fb; + for (x=0; x<((512*342)/8); x++) { + for (p=0; p<8; p++) { + if (bdc_bits[x]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
)!(kLAa*$Hr@`Td~mP;L!s= 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%0DY7zsyT0q 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ÕH=UT-DO(RYughfZgSCAQ>`6b2du#kFKelq#J-VoL6y zu+VdO?EQ&|UZ20@E-``e2NM%?OX9Mx%~$fvgd8}ba_*$i*cW-c_Oj9R4Y7xo53FqN z?dj_84bxrMdM5s>C@{3%9_kNvb+`71$4(aohSpPT#~MX}&>-jtxq4Rgj=ymFZ`q0%R590#PuB#AtnI5$h@UnR~h()pK(^9t$w3!0nKW_nI%=^py%j#g9s zz>1O@niSxvkyuG}{6u`}+oTh-c(PMEv4|%-q>~EqWc%?u|Mx0?m9Ozv`Ct51zRq9e zA^s}g;IHyc{wm+1_W!2{R{-m?tymv7IFb;By$MC|BWBVcj2E1JB6$86?hf2 z{;Tk0bQrylUO>B{chHVb6}}Q)68`yHeH_rl4E3fZk4{Itp1Ohw5_;xzV#VTGut2NJ zV+vGAJp-?!)nSE?WMMwUIXxwgSs7=-UWkL|lV$NZ=lHD+fgV3yum;i10ZYKy2JKIq zzrs=vw_5$?i4z3@e>jVHr&~}X9>v4;j=QdKu zg0G4t-7a>1p)qBA3BvYMBmU_orA>cDqm zzN5wCZMO0q_#V=k>yeW5t)~K%;*x_~(_=H(452T5hLGOEedIf;1IZE05K7Zu?%v+D z#^u3|)y6fdh5!i#vhlwX{qetQt^nPxH~v?h+xVYZt;{6E9sl9o9=$`3l%FZl}fFS*($ zJneO%$`RDnm4qRjBfKuLdc#r>=?G~81lG_ab!0WfHTPE4T9 zM5oH#?e2hoae{LWba!*b;`|gWG*gyMtH`N z9^SPY=<~aJfbQ9~4(R>6`hniJYXkJkKizdP^okGdx)eh0iNL-1cM$^oZz3as{!3&G zguEFU2mIX;1JFAo6CmWu2=uXWU*sg9ha*!U{PxHxKyQnb0NoiW1v(U&4Rm{C9?+jg z=0nUsM@+!4j#L1>B~lIa#z-B6ua2Av{PmFqK(C9`1HCrl0J`us94!PoAzB1< zQFJm;Z*(fqh0*Ci&yCIijc-KDfNzS<0qTpM3iO=l=|G)PGf-=^5~w3u1Jo5g188IP zET9XbXT!bwqc-5riaLQm5Oo1x8+8M%j(XrpAB%c{e<|7qv?jV3=!WQ0p!1{W13fJo z1iCcZ33P6BCD8Kdg+S*;*8m+ET?=$nv=3-$bUn~n(TzY)iEaW~61^PglpzfCWGO=JZWEIbD%!PFHB=bcL+Y7wSU6*B<&Gbf8c*hgO5aq6vjX z2E_zjDEL}K->5eMkSi2s?Fj(o`+pzx|MdzSj*;KsjM#WKxYd@vk-M$6(aL|C>l%$r zOr|K8OoR$eoaVB1_jatN4zG-BSAojR`I^*_Earw-p5}JkK@D48|{my1gRG9xyh zEdgAXz68*D6qZUqq>aasECDoUSOTcN|3^ZL^8Mc};P=praQK1$AWsWeAwM_$^G(|} z+%xqjI&HUHty`RQ9!FgN9tw8_yNw-U?H>;It5p069WqxJ`5LY+;w=TA!{%w>y9)kV zz4nomrW{Itt$IC|6en9KZP2h6i{ImPd3}DasBG0kMNHCnRQo5y$?boNg@pqAZ4_=7 z_6i@PlhD~{6}kc4kN$*5V+%eHZ^n1y1LOp9I$2Bx$uRkY#w$8|M6oUIY|Lk?4=l3# zJwBVbNX71Ir)xmqP-V%_&njMJenD38s`Dpg6|XkGaMp-ot6scn!&ljet2X6N%qpHG ze^OTQD)Wo7NnWktux>Q^J;*PfJEFKDb2O*dv5>|y1*lbN{z=)ytfet0>&G+)%rxf7 z*~F}*F{fk`vzo@7noUeGozwJVS^_2-^OS62T4>Da*~Ao|$e2w`@rg>ZiCIHq&d4Ta z9gR6tKW2rLN2OBz|FD2RK+nM8*!m5Qjg40I1VX=ePOp=C2IcxWAJq7q$J3K*6Ho1P z9v7Fa;HJe!vDT3%y>&$6b8j78se?!Ew!alp>&O`nt_c}e^oG|2Gi-My7cUzS8L2rS zV)yw1=IVME-v+=H8VDs*lv|0(xCgLY-0^S!yN|!hf9J3AS^g@YjzWp7$~#fB z$`k9zMRa8vPoRFR*C?PV$_XfoRwGFiCtLqBMsxiSy~EG9(Rh^(9)7hpqbeR|Ej;`# z<@n!n0Y8L>;P8FCs@CDQ0%3s!_aK>;w?JluZKpdmwp;D?cI#1iUF%g0u+vhNOT#PP zH0|i`>g@@38#}w!cR`xYFs==U`Z|K$p>WcIKiyP2O)-0ohy7`%iw9VYID*qa?h8A`E6okR<< zLv-m|9tXo1q-DCZD;yF(nZ^!jos%w>iqB*9@N(w(cb(+;H|;)g_|(sLz0*QH5aWr; zzG9E>f!5X+GSd52^oEVOfEU*%@BdF1el5V?bHe**G%7_4&=NF&Za{aTC(#?|OI(1< zaXns!2kY4!H9Vtssm`#E`p?UB ziM}I-H>qC=c9r^vFqo-B2xVBn?Xfi(K2(ZIUXVn6MEz03N0e>uCTOb|<|dMr3`%${ z&%cg(+(^CDZqC0xJzSiwxIrl$N~*!HjGCO;xVDrurG)!DZFGNOS4(Rf1VNJXuc0nj zR3iBu-WIFdbEu8JqBy-W0m;NAtHH6c8ZFQ0^cL=jJfV%qk$6V0RYybthcQ;I zx-CjPKKEADi3O0$*5(>Hu8@bG22fYkB^Q4n>b4QLQ;L${)TLc7s}=n3>JIzYXFqp$HuT!5$I+1P^5 z!j0I6&&OT3A775I#W&+$;JfgB_%Zwpei^@xKfqrSLdKKHq?DACGl+wC6AE3tgIVjBR49o3YJ| zZDFj3v8{|<$XG99eT?-pwvDmvj9tXo#f&|du}c`cl(FYAb{S*OXKaA67ce%+*yW7v zU~DI2LyTR)*p-Z3#n>*!UdY(hjO}LZ8pif8wwJMM8M}_LVaE0`wx6*Bj9t&z4UD~r zu^SnCF=H=b>?X!u%Gk>odpTpTVC$Ej_-Qkm8w;~`buAQI4U*V#F;aCMNQlP^B{WYhqM1@$?%#2 z!Npo>E-k-p4!YQhYvwIeu^Y&ow5-}|SvhVK#mPFi-Pt?0<33n&UbYyejhcKr=XQz_ zlIg>%^&s*dJ^z18wITB6?Eg<`_p2#R-v0kz_MQbgsv^r*^=Jeoq(exz1Ov^_@HO3? zFCt2(`;oLscZb&<2;U}~1c?NKNk9-3$vCK}tIqDKyQ7YyM`sz{dOSO`Go#~x;ul9n zcl@n_;BOQ^qvIE4bhhgCr@FddRd;8cYG8OL@a}zmU)`!(pLeTn)xFiycaroS7zT>L zWKab>Kn2Ue8n78`N4oz#;Fn+zcn-V{J_O&uAdZMyjM5}D7;04?+hRUW6XaP4tgH>BE&Sv#iC9Ajnf&vKD?mW#!+Tq2(3Qt>R8iDwx;ssG1y zp+yw7n8KD&*is5xMqyzJTTWrE6!uRP)<$9N6xKmuD=6#&3R_8GofLKQP>s=yPU$d zQdmEQ{eZ%*ps*iO*ft8glESW{u&XI-JB3|CVb@aFbrkl`6m~s@-GKZ5C~233{tf{E z#)CSr3S0~B0=vP>;3ymeU9b&qhIhb6;d}CFs8`QJ{rP6plMm#&@8WBm$yy!rb3oQM z!#;hZOh{2JJ8ULvr7=aY(KTPO{G34$40s}e@ODl#S!Wv&1eMr!PmkrE2`1|-29e^A z(EN7W(?-_x~q#f~PkREqSOad~;GOY%yKO7a%C8kFWHMOu%u3ANuA7+ zI*m%|XOz?-zNDKBOX^^j)WIyN!>FV_MoI1BOL~c6N$t#%+L8 zhip#?dpb%*KTW~WR7u3sQ8q~${JKFj)vM9-_wlI=9C=j_p^IbPx?QS@*x2Sv((rMy zu&-`clQ$`DYcKkJupWChDZH!C<#*L7KE)rh-7QJO8t`!&OygHV3j%6GEKaRWLqBfE z5{Lw!RlTmpa3tJrV7{WN&3@Z9I8GXhPrJAg>0&*GZGCMRmjVsr;lSLvK_xWoI!PMx zMywPerBP|BN0JDuUVj}b#XacF+jJ)AO`oeJ><;=|VO0rvBe8*l!zz&!o~5JiIwMhc z4p(`d=0bpDoP}oaMiFqh^;4G zpk~}?J%I)O!UrVDl%EnSngoEZUl@$)g@uO^x5LQ^BlT1dD{V*Y^^`r{I&a9;SokgK zG1E%rdCaiYB;}Df0@AFcFxXByqazN*?f)NueaDXdze;P(>^P??_&8@%CdWC|td4Wq zd`Yi0ENKn1q&3Wv))a>EH&`@+HT8Vr5m=*o-u`t)U_qh;d@2kB^Whfb~S?WhWSZS5U>)ahRi zmjtDDX?mqrZSe@+EY+A!V0xCa=>T>oPpQ?DiwmVxTSA&r9iu7fuZV9-4H-!$tES{k zbO4ar^^KBF-2Zbb^hwYMFM;>KeekG!rtFtD%RA&hbd%K=wKs))=xgm$ z9aXh<9}Z7~!<2*qO>vW{Rhee8Hl!hrnog~r$tJ6kh88z!tDBdo1FuVx4Af6GS-pJP z82`G2=nV`~o&DSyCToCArz&{iF`j`2p15Mvu`HaQ;L@K-tY^Z@PnNC)Kkok%@P~i9 z^h;^K^eGqu#)4|l2rdAdzzyJTa0q+`o`HTi9@c;d;4s(<*TZYjNbxXy34SD-U)LW8LiLJT^5#gBwS;=EswIbtP1Y&Y!(dZDb$Pt*l7odN z>*&}|iaX>D`13X=rlBYeVRy4y{7v#h#qTLTlKc?Wb@9;=ChMs9!%%pEIcOvAs6wOiI2*#GG$K$h#Fg!li}qyNEg&}}!U0{;ak!XL{c85vE&VvePgi7dYeqZDqHQ(eo=#@;GD(rPkXV$PY`@li-8kVs!hv^klQ965sU>1K;&ZE_~OYYbC5zWT>&6)Dlaqr+Mwj%BX+#CPqXV~j_2Dnr>d;%JPo zSO|CQv?(coyAh9g)0VaJ0%;m)+S8JxR4+KTR|!Wz^^B-qd;vKPG}>5laWRx@PSRL5 zr8X8sE55Ou!I#AV8jCZvv8?RwYDWbiF26XfC&rZS|IbM9Yw*JH@BdHMs(D>OZJ8^! zD~w}TKhDblx`NRzqF8eAt}srkO7WhaL@T~4*!Z#-`0gR4r>DCI>%!^=-T6IJKFPyo zC3o0Fetj_&_=;E~0 z3T7r-FeFD=^?akfQgm`BzW<+qc$Q7#S=?ttH8xxvuaM>OJfy|=F3a-E@rjVMK9V1eaYUK09Fifb4YIBJ5!Uh556F6U7= zFvV6Lg%eZs^C-$O#SeHC6`0}*9z`Xl_#uy?3R7%j2nHX0S??@xr{@AL!DT*a0v8D-N+!&1A}9ND;biCM-I1aA8WFfGbn;hUdvTuOjZZu z_mJ0eb&1JZX7FAeFE|161KkA6BRd{qT&W~qx)B+kp_GA zpJs0W35cz$`(?d--D}xWqGtm@t1FPEkTx@gh{}g|;JH0QW#lxLQ8X)@`F~c6MbYFE z_5T{_6AAtOLwEqBd|AIiVQ*5{TNL&-g}p;zf26Q?DeOH8JABgLcoaM7Z#;(O+TXZ@ zzyF#9Ujwh8+cAChPuAuVn|5c^rcDiN;=gPT?x;PGc&^c9Z9T3{TWe2GXGc%;WT5UF zJayw+BCq%f_AQ!Hpr2rme%wlFS*c#3QnIt9qw-WB!chCtLAEW9wtI?doi|wWE)Ru^lwZ z>%?FGpDUhaop_e@;#qpdvpios%Lef*8^yEqMf`t1C856$z-eGQ@S%DC_2546JopqA zqS2rku7fwhU&B}6*JxarB`=XLMKk%`^1<(Wg!o%8o9u>3$ALZG`FPhOx;bj{|B789 zG6|gdUvU#~+Rc0pPNy002`bExPf%r+`2;oQL0p1zyV=AiaGD462`bE|@CmBSL-+(W z=Am3kSL7ezCQxBFpUNk2nor{sRG5eH398I_e1aPDa4tcm-JH)SaGK40f(mm1pPeJeeuD;f=CwkIZsKPdh zGqI;~m90LD1Ne5>+E%u%xj;X<(Ya>rx;`69&3Ix@@rtXsdD_gBIQA)TxdnSiotRE! zZX?gAX>?qURNM)UPb;*V^bHBUAig0@$UrJtHY5k9A)(axA~Tr(@5A=L7trl^zxsjZ z=Gt@w2YWkvy@Bj7Fq?k3cY7O-NT90p`2a76TgTJ-&2 zMO+FnM3ZbJE#oy2!KcMWu|>l@E5?nGU?>N2RxHy0AH?VX_MzKxb@k_KjTs&1a0so& znhcI}II^oo##tbeT)fAhsWp&wfmUi=fV?5P&sV3DNY+RHqDv`c_aF8Mgk}LDanywihi3r{-ciav2Oc%Qf?v7b0ATQE%n{KOfY0gNOU@9Cqo>7;=K zQW{884jPDsCx?MGkcexbrq-U$zKxvr(L}coJpV72c1Y;&*tP)j&3je(-<`DoowWa* zwEtym|HJ*iQ2M=u{yqmb&;WYDPrsO4#}6vJLQ*!_V{cso|AY- zf|K}0o|AYd?IeC4&q=(KauVOfa}w_)PT~VRC-Kf?C-EVkH+N@}llUOdNxU=BNxaHW zmUa@qfG;r0RsVcmEjSZup_!LxIb92jc(qVY)xttvEtHd5XyMgDd2%f*<%z32sTP*- zYN0%_78di9rE6h1Utm-%gn6}4o=^+RBKrT05&Qp*x$eS}?(}O8FZm=$3>2K3bd2a#@439qMWA>_Sx&R@yJ< z5PfWAGP~-M^Yu4OSB;X3x9bM&9OC+D6Xp8I=soexyEJndCAIQ2Q`yGui}A>~vh#wK zk>G%xdQ9YaLsz{SNiuodoRz`2DR`I2nHg*~%W~W_I6^`tNB937c>V8jybN&6Uj3tX zTv8y7i-cswdcnA&k~{_Jb9V6oS${?cWF@&Us-oGp%6LH5vZ>?Fu_+t+I(l#bM{nHy zwLJk&y{49tx+J_3qqrjBY%~;(L%eYANfnNRC!ET3!f|9J9EXu`HW&)WDPA~trwYf( z6HY}s;W)Drj*}7p_c94S0e*^ZqC53iZ88~-gQ=b>J!)9-HH8)m9gauvk80@|GO91G zC59Z;>g?q>XpJ+7x8CtuDQi9ydqMa&zkn~H0nCS@TUui=EcF9yksWM{>idVa?rqwPgBL-@hGp>`8ft7kEQG-GyUCbzHh4_+QWmwV*W=SiUC9NNf$ConuAHhHp7xK<_)N%PG(6{_5Tz1`(GiRWurG$RJWDWA#Gilgr&m9&#l(i-t4y~(hoHO!LMFiTp)SpRR9 z;EUke|7Y)7pxY?U^*$n!fbGP9B-=rWl-P-t#6%C z9?7d0Ot`d_L5PZ*x`dUf^l&0>?oPfL3w zB_^aNreZa{QmmBpmB9+Tzgb6|43|6asHfH{aIMvYt1lj}0$RsZik6(b!)^WqacKMh zKE?czegxc(ifhV~KdGKtrR?ZirB{HazW^!y_jO!Jcabd|mIB{yZyHz~%!%MjyWRkUi1K-sd`C}YkFvBB;6*NFT4&;QRi zU*!VxRW_Tivc-Ir3(Z%#$b6Np=BsqW_HU!^r@+5A=q7qKouMzKZ=v_nZ!)u)F6J!e zLgrfLKISEsVcXfW*~{1)*#n<--|(p})n=WLT_q4q}riI<`&cOqRnD=m9U0+>mHS(Hs!Gp=;r!>0PFiI7m3pLo+dKv~%#9Q+% z_7y~qz7W@IeOFHl9|~CC)@A64TK}S#3|KnWzj`h9K`aN{UNf0dimyL05eMzi`bLYz ze!5-^F?)aZTkPlPaYa%Z$!}__26%H@pU_rC@`t@`fofABk-JcDZS!IKUrv2OeKEX$ zm0pOasb3=04utwIg!&ai{Wn70flxaU>Q02Z3!&~tsCy9VUWEEJLfwZ@zd@+`5$d-H z^#DRWh)@q9)Gma27@;0PsND$lC_+7kPC=tl%qO z_0}=sbJ{KBry;t4Hc?DAh~=vRJAzCmxw6rSuPbSJaL83G^poiPTP6d?R2vA&sIQ9JB5wib{;a5<-%gtXwy#%*{T1W_H z1=YKpw1QfQQ?gbZCFHcz{G5IRo6}BWPCJP??ZoAjC*-sWHr-#x=9FmD?IqfDd$Bg% zYY926f=&0u*qjn=y1hi3Zm-s+`v|uGIKhIV3bx{xV=X9%w&H%Gt+*d+D?UufX%%e6 zzk|&w(N^3~v=#SjZN))O*AsGDg?+~ViOnftt1-x_mzY!SmSK?7Awo{8u-*JJY)%O~ z&OuH+#GGn(j!WbJIK@0cUkh$WRkM(E#qw=v>$!NdK5f245dvS%Fg(N3?DIpW#IGU zhq6R*D!@)O2-tG-0sB8gfGw{CFr3R+J#m`#|2ODcj+*uV`uy~IYK2mWD^!QHfK2hR zXmKLb)M9&^a7+uDBu$TOu-Hn($u;{+`D2uGk|xn}lF%sTcc6c%2pQbD0Ofq8r6$wE z3Fk;EEuQc_?o3T);n_bMlM_xJ=jaNfQAV&nZ_%q(p%`D4YV{TwJXMkmRV$p=G*sN@ zfBnDFe3eb+tDIxL%9G4j=`dgAT=P}VGhd|>w*M~b9SZ#WLaYEHs~h;K+qP}nwylkA+wT98&!3>>ieAOM2}EtV-;FS zmRy3~c|^a!@@)Vo=LbUS#FahoQvG)T&WL|vHz2Kr#~BSLrirqgdkT~|k(87b1~a?| zV)t%{a;irM99g*%(cJC?meaEprSi&oJc!V8m{FRhUJ6LK2@I9_S1Ne+tjsxH+55=n zm0?2E6bWa!pb`f}&^EzN>BHy6xtJQGbwdf|(!KZVrfAH){F>uIseJJvYriK(Fr{fXRCYj2p=IvFd9zK%8FoSaEKq+-XLIU^i=B z=ep8zVi3!AwNHg60fY=7n&psvo0kDT@pKvF~s0~*sO#WVWMTO8?3ly z4744j!di=e8>N<+h11lApf1U5V98x!RhEx^Y6)x<1U*Rvwn!H#1yYfE)}lnXysTYQ zK{%kIyyA=Im7NNbqZ;T{Q9p^SedCu;W4zw$ikqGi&%4fjh-BvWPnmuP^CYGlI7|s1 z8@8l-KzmJ^f*kxVll({Az_&Ikw0xm`K{|YM@%)VZ3sh6OC0W= zQ%er+p5rqNr*dgxCbKEc<}d={WCQ;aiMM>QM(_*JLF|N zoLfeZL2ZFs2~bwKg#cxdTSpIfF8wvPx4oeBX1&{*VSfnST`>;)J)(NqGi#oRXr1j3 zFkTfJRGHzgVD@ihr75I$QaipZ%L+1I`m;-8jY>}?y<2v6ub#ue<~lgdjr12 z>XU_Ld%w)r%!xF4oH8`q5K?4+-R#KCq8Bil{{=|ibup?fPx6o zz?x32if7U&;BJq|O>w31B%4{ij20%#?BUv9lToa2v;DajsTRe+^MU)@gmrEU`OFck zR@NAB!|u@%HL8MOipTeNM43pe*T2!2-|RzIj-~VTSO3**=5y-(;^UOEN(uDw%doAQ zk-q*I|M1@xen=@s(;$Dfe>MDnf5SpTbjSP=5wWBAblM~xS{R?7|M}-s+DayBe1pep zE^ktW9}qR#=tUdu1|{;bny0Fh6QymMqZpE>V+2z{RXpi*s>6kpohJ1)3?eq?Tpk~| z17KKk$9STDLf!hAE1LVuH?SvXTfBE>iFpzyC*7!p#g&bzfqi4D#(=9X^PjJ2t@ zcf^*q#&~W4VOkY+E^?MNQ79qyZ-c!&YE6v z#yO0UXn!H_a?bjI*9Kix}6izrMxL{5NiA5G&ew1z+A?KQNGZ zk(TQmg}0DL2E60fBY(QY{3U~cel3YLiiix#5KN+(Q_2wh{#*x4bLtv*ztP45y+zpL zN`9bGQF~BbpHeqZ9Rd8JIp+0%*mMHM;swa2Ny|3x)E68Fg;g$JifWznifW$YuSvWF zhg~IPFQtPx>lb7vEc{K9aeq@kI`}1d#mO9tJVa#yBVNngcELAt-L|Bsq&k~ljksQe zrs(K1Pq4T3>D1c^!{|W>pjFub{Ngn4$L3v^q8b`sn<(~W?Q0Ek9-PVI`8@mI zJoXM(x+#3UIe031_~iX+s&mh(V0cihhI|^2!{c!bzG^#;o=SoIcx*_u|7PH=>|W8@7bSR2IS z0(=Q&6IZQpoq>Udu($hB*7l;fYeWR`Oslup@YQlz{uXgZM`jgBJNxFC}FV8Oy4x>EFv00}!D; z4jXmCw=&Cdl0R_PFB+HN9h>_QOv8ouj|amn-HZrS^xTShSBiF)OcB0YcXsv##3z?gQ0f%ZhR-ZC_RdXbIkkDpPWQaGUAC+^BLnx6`LD*6^mB zE}TuS{$K0KT)kWJ6#0kW25-7zRP|134ruUDUfT8*g_bc~FdCt6e%@9vbuls^WNFnX z!{dIC_fHYI#3BbL&_EIv^#RF{U8P=Zrx=NVL2sN5nqe22dgU`2efllH!a0tGj2t(OOQaYg+b9@UDGlmhn;F-auv){5=!o74uE($=H?_lI|T|VyTvm zLrtrmdP%#QYMctSg5T(`F)XdPgf0rcGLCS}#B(JUFD0lI9z-NfJ;X3V?Npl8|1Z003e%P=1)!jdFj&*sc`@E?*MvpvDjP3?kPW9<@PQ=yvXGmv|2^Q z|4%KE-3LCev6j;bXzQuDD7g@koo70yl*6t+Cbh?PU#M^@p@wQgZOrhco;1q5^r+Ue z6MyAlwjqrtk|54WikPZFfe@0a@tosOenk;45w}V*hV7!2V{`pUg=XFNZ{ucoRZY4R z_mvf}4PWrh*WT!kRF8BMGpl=z`7Z9w;yfK(0cj?ICHpcA7pjR z;a1|-$b$pq4&m=Es1PLha96RY_qE&7X1+_q4nHXs|JhXG5W^iDXyACmM0wUTzhmIM z=;=Qu540g?dg{VP{Wj2lEZ6r6_yH4qM4NbG-SP9Nn1 zITEOW^Ht3JO_b^B3mY{HY*wlNNhsETC&d0)x&zYsaVr1LS(4tKA&|q-hBuaW!!qr` zs$ki(C~)DBw_@J2&IH~Z^=2_BT>Z9Vt45?U9y_h>iKOt6|7LL@eARheNtk*JU<`Q{ zYW2$;UtKEDs>nH~mfb_(v*2SN!CP>fUy{xY>~O(T3SeHWKf?Ze8?qy9r`d}_HV(}a z%M3{{)F2iPBXw`7Bxz1Q!O3{GYlRG zm@fww%rfvJKUOc8xKO(KFX<5xnMAVjy?iTHj{LwCY=iIF_wYAbfc`gxJSL@@`GabP z(0P45aCV#Y$N(wOcI0-HgI@qN?FW7KLx<(PNj)z@+E3`yw#!Yt z`@m`LFlEDXV8)+Jl8Sn~T>Jp5L}kab_$$PY>uQpC5Zz>nutVyOv#60N^%j(;7POk6y@0gC#G{k1*@)Q;@rY3Vu`h+9I_PI?O97)_ zt%1Pdp2cnKt7@ad@=h!n{T&}x!UYgW&NCc3CEod*Z1RcbZ2Iy|G$1Om1#6{s1|fSV z1W}(x+GXhmqnGV-d)LKDM|rwkWMLDV*!t!iCg^or zn7(a&DWDr(w@xYmMr>=i8sFU}dFRCH$;upi*6!@KZOaA+>ZB(R;zWTzN8X5a#=gy_ zl1A}oq=o4m?vqL;YxcTY06Kr#fJ)T$Qa=nOR4g)R;j$tX5oMWF zNEs!U!tZtr-6TfH0-VuIxEXnV?jN{D8ezMys+iQ2gn20xJn7KDT({l#+~_~h-!m}& z8*1ks7FexrgTOG74#>aIW)8!EpUhZ z&0mBc=}BBnrd5B~`9uyc=OZE1T!)Mn!t|Tj3h%b#5FZzC82U9X8rwG~J3J%bgK_Pm z^NMbDbJQv=HSJimy+a3W`{!u1^+G@UZLbq6FFguz{Lw<8Dy`!T};;*4!qq z8XDr=Z$^)DAnftZV}}gucWCI$fuZ`*Ft~3alJ?dt>iau(ZV_8cnJ>E_t!3eJa8AK4 zF9h6w@(N46kT*_9IV=aW{0#DJtdpT;aY>&=5CtQk5qz!Fh36j?-w(NU=J%xQnoBrQmeX&7;Uz*4I@8OMrB7fvVRn#hMs*JzA?+Z znUL(9#oY4<+S!U+xzVQfNkLi0LFylZ$aSM0e={x|@SzXo-Qp9=YzW^kK~R-fxjf?z z?OA`Ac6Y4MO4RT^D%KyC2@0$K{7#}>A`Rs=j&Wt7M}ZLMq%jw8}rA1!$y>qp;we^hwnoZDHLhxi0M)7)qCT=XhrXo;1KuFIqoV4SKt; zZns_IgubBtk>7f~mC*f|n*+w>a!$WvqR3?$Aap#?4wIZ^i-&rpbdJE{E@}o z_2VL!x)I~Pg`4TvFb$%-fYsCnG%YonoAgNAt)?U^FAe}N^N`)Q>^xTu+4{OLB%Ap`tn&L<4cH3$G9 zPjxV2@%X3C3N(~MyCoiOFhyY)bxK(OpR3D8CSdVeQwXa8d?VyC;1$h0oIWwqC)Y?;boqMg`iQAc*tc$#7&v%d5&nrXu0!J zLEgq<8_mhJspFKAVGf3LisXs(Vg>1AT({FC4g%^AAS~Q3uY8_EaABP=b7uYt8 zaT~rM!pr{Mzy=U{fm4p{fvzD>_Lg>_5@5;UF#1vEm>tiLs*~Es?S0AT9B+!mnM4(f`CQ%AqY6V>@Ob^+5K9Jh*o4<))SHI@m}o*c)8evc)(Ei<+O12EeO}q$ctW)mwQWXb+fHL8L%Y*4}5>oDVjG_K;qp8k+Abz-ZSoq;)vcI(OGqr7ykU8SuG@ zE-~fV&Xk>X=>97=d*8)H94>L5s|wk*iccKe{TD+w{#}x75`5bl>WIG4l3$lt%w1OS z&MTDePmL^)O`>L-0CxyJr&dTZpc_cJ;vz_;Q;T^<}g&Nql#Kbgu#~p3WadpMYu$j)NYJ0(J z`d%~H?&^Gn#d`$5!4D=)$&w!TJ?(h_!~&dI)|qF;y#QzMpUPOFXgxI zP^kxs&sLERNe}UNBm#KKK#w{+E3nppk3OASs8{UA0a0%FnxMbC;J1hn3Y2hpyiS50 zXyY-aP`q0wU7H5IiZB1LSDFJnpaQQZ(s{Q`+5R>(=jLCqPHEY@FY>_7*LeFD!O{&e0bvmUuF+UiD`RJeu=4jkF2(9F@Gi8D- zFxL$XID1t5=y1q=nj{hSnTK))na*Z20d7b9C{zpr>%GQod_0bO)xp?YG(Y3P*blPU zUp%a6K*`POL>4>A!#Xx*h%PB%a9BToyIlaf12TxOp7rq#yf(y^qrStxCG0<)G4-d$ ztpi?NI!oC8$1>e zN^pzORO5VnflhNtIU|Nh)q<&1nt`xYfhz5vKJ+${w-IKA+6rx}3n&RLQ>Z2wugbg& zyR>mn)iqK)R`U-CrA^OdCn9ILKW1bT+^N#d9=%m?j9y29ea$mG~m-IN&L$ z-V?|v7EK!~VdRs+>rMe0m6NhEeP^UE1E`tVOeF7k|kKq78}yXvtpT(mc&mgr$J>ISD6$^_cIlXL2tn*Z5y|!5KdXx&z>_~#s zmI&rl%9m3)b)bF3r)^4y(-sN#`4wDKB&x2MUs*oKp>hgrNQk*E8eCH<%B7HxUp^>jaHyQ7X!cxh@~j1ccxcqU;CPW9lKy zP{&X3JxUmfi*bySzp3V??}2uUD|}8FgZHd4{Rf_ul=d-hbpIFF$k5EA)2N4#Rxs>6dCE}*~R zpQwNPjwl`435B>GB~CMGU<8`val(1Xu*q_75rW4jpa}v1xjoV<_GNLwBpL2;LLk%K zNKUQR{qT}?PJ9{WVOmr3o=R;g_!Mob&SkW+!c<;seA;b5^5^P?N)m>=kwz*4%z)(I zbO?lLAz9ohyG}SuRFF&^EGoU2*da5IEDB92N;r(fp$;c$JQ7Jlp>kZz5<5-AK{|Zp zv_vr}MC5fR01)FA4?Ps=rQS960#v$PW5`31p9)=LzGYtk9oQb^=e-RQ@8+izI;l>< zXp7ZJ$kq$j#*L@@nC6R)9QiGQ!zYKM4xO4*E%~{!qEOL*`L;+)nR;-u*C#O&W3)c- z!k^F~e;LX2vZVbL|IlJZ@wImX5kI0-WI-1X0953!G;WAHNJo{`wfxCl2kDP|SXS%C zRIadXWH)YL7le*hok<~&WB_G1GJszC+9C$un%}O~r?4>EwKXgLe&N==RQ><`4V9uH zMy;7Ta2;h^T z1H~2VUTb0)kmva-~#9jOiXOi~x-AC8w@a%XdTe)=bJJRqF4^&<9aqg=tE!{$4Kd-q0Q z@qFbw>FA z>>kZFj!vd!L2cA+P<0fQL$s80)`^1|RI1y<+3j^1ud6fp)`+#)Ie2{Zp6Sti`_3LH z;)~ib{N#Qm{@ek4^WJ1Ntt^vr@>}3#o*y&X2zu*yU$vEtK*I6(Z0{*bg9-3b!6z&o zbgU4WTYK{rKECQ!wZO(kXJ)X#iP`C_R7+cGlhM;f)W|67*xU>H==6GIh4w8p0ZT&N z&1`haJ_j2d?ZoN-#IJN{q+N!*FIpaRwl1x3#nhg4gGLIuyZ^ClWWI~YUVH_N%wBv1 z-G9BrVOVaOBmY|UW7!4OKzb>Z0M+fiS~fJh*fY1*LG2?K3~jfs9Cti8&dN+-AFlWd zN6DETpP9(lQ!*>O`BP`bnU%fvH^t1Hw>FI!_AUb9sSIw1c*1T(O;Y~Jo#{$2?Ne8e zK+=Pd~ra9wZ_ z5puM+DMfk0Fd|}3qhzV)uPbgbc&rxs7kaw{v&{x|@LV?8$lO_MV$Lw3N$CRnyQk3- zPk6+v{3@8)=giy|btSJ%xh|LFTQ@VT?1MVJn9!b_^FG{TcF&@%WE! z#k1`=Ow)z3wa(+J41tX{Tu0wN^eWf#BOhO_j@E^#;gxTvUO~>S zzc!=UQ+<|~tm#kho3#$C{Y(6gy@g%?B9tUO2*!ZSJ&4o5RzK5z`CCYCbclYBSLilq zpP=`G`Z6>IQT+Lv`HSo?ao6Tw^{D!bO$cJeUMW8_4br35)0j1)s$s+u%HQf_C9Jui z@Th+O z!i`v{%d$=(Mo5R0Q?QKZWugp2#RRs9v1l9anBlNaSuiBs^a{Vr4)_YeA_~iVl*hv{ z6p2QbDWGFol!!8@n6Y5~5e-gJ$~RUqdzq3$|-#zr#U)WmR0apgYbm`AtA zgTm&rg5)+^iwncO4pKTHmzvQGy4}$rkV=3zsfHXaS3_GJwbx5pZwlt=V?*7q1A~75`230QIr%G< z9Z%0!Y|lLX8+$5y^sZoZ%W9E^-K7M29qIe@Ep@p?w_-f=;O^(NvMZSkBL9V`xmup$Z>9J z^p>HE`XJKsLV(#g&R?%LL}wfz{nX5u?17d2V!I%h(D1uwcHoQ{pFryU}ndg5~s5X3Ng@;?i-%f%O$%kzl--pbzt~yhA$wO71CAr~e#*8Xn{5jWU>J_9%RKls!>VYBu>n)jJ(XDP3ATh_nLy@Ex50cdI;gIlhMJ0IIG z7qDFbU%jTokzVp$V<$i*(lyo_iTzgK7S9xp{pR5Ch5Q6U?A-g*+oI#p^J{`c&NIf| zkLrIo7mFlQb0YpH#hiJ#8HnQ%y|zUvu8X%c97--Emhr-?;)jGqIsf}K<-EFAnmJxZ ztQIlg5#*THBb}_Af6_NV>I@YY;0-zA*S^bN2hNX-`Z%b(_oofNCoo31R~UZosVwpj zG?%B2I#w*2#GHX~1ZtCpqMV$zV`IzmG0)7Udp15z`!)AK?sfJxv%FWo@vHsWHmPIK zP)A-$s))%l(qctv#x6)B7M!IwJKq-mo&!sY^t1;xR%P)_x+A|B!!L>I?3mv#@{I>e z4EYU?{hHFwBUu^>go)SL7PD0~l?`-3!}k>jFypFfqo@gy)iGq`t6Iz707}>%NTQ+E z8rNpTxY2dImdcERtV@h->*^+!ZHb1Xstu*7R!tmRvT<|mcLjF@`=I1(yP)AHtTK8g zrV1FiVbfqTFEk#k_74|0OTI z0fb8VCfx2gE{ra?>Y-3WDAu7^fg$_H=0hJ3z*q&~=Of&N{vJf$bsdXtP+-Z3R4bsH zV|>JTFIrrOI*1ubvKvb@T>}Zv^$u%YZSU|dycb^kO0vmSv|l3(lQ<7!Og(|gCc=N? z`8WAY97dV$8$Eeex|pr(11E7eTR}njyJH_B`zsTV$C`jw6__y-R;lhh{h4NPM)%Ln z(*05ZYr6hO-lRR%hAL)~V0K791TCl#wHiVIkz($vMB-ZCk3)8FeHFwqEuc9TbcNaf z$?oeSGH7e|d8-9pf@uxf6HmI`e~xz=A}*t$aJm$y>wJ{kx8 z+<;y&O~6K^t@einJ~{EI)+EVMB%|_-$M374hs)`d+W3jo!qqg(72Ol^(#l;jD_S>h z)Zf&saw%ivjfY(UCmJM)vhuCpT$?2`L44IS^bSE$54;C3>A7RC0FpaW0KLxP;J&yZ zsm`G;utzFgW23+zuJZm1Il)Ed^@irm(GG$dg2fJW4Jrpzcc8xxW+qg&>Dzu1g$J>pvYcfpI#rP{zXUPJ^AEvFG(c6G7XRX(6f>#@;ces)4U!y%scyH__I zAQWsHy0E;WOEl7W9EWoc5m29S7VyQ(*hH{M;gB@(*wSYpn<^#Wy5vpoSiXTF_Nmc2 z56f6i@66XX%q_q>V&Z`TQ??VVpf}S3MHyd=K^yfZT*kxW@$DN5u><0HTYaJ9MwDvK z7W*qj&TC6&_Y{*ica+B?*y%`6hUh#&{>N>WUI4Umy%fd^m}tIvU690N;={VN;QoM= zd?1Aw(SCv`L<$Nq*4?s651SRv({ZRCFn!-s{tSRD6PoAj`w;xmM;{6eHJDFY551ql z!+TR~G`Tk#cd*-)nvmrJrXwzZU; z)s5kDmY87*!MCaW86OGDQyRc?rEVh*9)stGFZRe_G$0>1dYo|}lrDCInAseIu!rYV zjZK&UCd&jK;&*G}Lu|nNnGn{r!Z%_xB;}nW>j)r?>L_!=tCBu(PA5_M6%p zL8*^f0RbzJ(+-6nejD^eA1Vt*pbm2z!WVQW;6%aqPF0 zdb$RwLBlax2`sT{1ai4u?I0kZM*Se*e5%sEe-5I`Uc{MbrA^O_*QIVa13O*T#5h!= z3UcJkfBfGm*dvI-7X#4CIQv6TMm-?SO?@!np#l^Z89LlTGWye?WHS2up{SY^?5fRaqLC;mIt?*7Y_5$)x-R?e=97mn(4 z&irQ$69eSGo2uTTsG~%j6?9!oO+ITwtFazzo(=$*0tL`Q(Wb~hNMpRe0j97%5ZfaF#u0G!JDn0$uYgzDp0Uf6 z5#8bT)}-ov0bWMw#QQMCd(tSS^A`1puif4_OVlfm{p!PZMTUZK_;j)B({xHqbVm&Q zOffG8O+A}L>Ze0dYqYyhA=wU*1SFZ!BDMwWAD9T>iNXwPaMz%{;KY8md%|X+h_`>- zguIY|fLLN*^APOd(;^r1a;GBZ#P7*Y;2x;m{_=&5*xO;s@d%c8sxfU%d<_GCB-6J9 z3XlmcB(g=fm*$qDZp6ARkIq#s9uo{K2s;&_yz!i9n~OHI_fr7E!H7z&KUXI;o{MG|Jt_l0awn`l5=SBnR-*wAI;ya+|GDe zq&hqZ$&!;8S!g=OWzw^S=703v(p8g_Usoj^duViL>aJn(Gb^B*t+iG0DnQK>BG<%v$S-qXOV+gI)hMh z{I6+AqWP;+xFTr7n->Rx5gJktDh=`2A8HPv#oxsao*M+i4uSxZDPXma=9YvTzQM%yMf~-^=lsA^Al@*c7*in^ka)=O(YSyJexHBIM)D%!h$V>d*P4A0;qNurplOP# z=sNeHX(}sFeRx>D_&V{R?4N7nLD`~f#%=CHK6sggPc)YlIqxC z|4OVm49t*TS`Db7v?SE2231pD5)8~xRAtr?4XmKFq|`mY@a5Jy2Wbnh1qW&WTpJG3 z7F{b2s;0VR9pFT9;n7z|aiP#xM{S9(tAy#cx~V z=Iu{yKLnWF8M^}%%7ppO6B0*i@81C;`x*7WeZN(++)1BA1Zaqq4%|Zac%+6eAb&<0 zo&aKGZk0E`V<|hON9~(Rot+LgliLrR#U5%Sg1%>{aSAYY3>MJHlR( z`Un$^(NHcaMF})vw&sJ`49boY_E-c{Ez=-8qLla7o&jk@fQxz~E{nxNfyTiB+}$!_ z>K>oj@FPyjfqnrkf~RVx;i6x%6X=Q@JIvvZcBR9L+N7*!Xo)YfDwx1$?{X25#8?AH zpPqgB|4o0~@YR@KoQkwKPLpi3hY0$?bhkTqG4X|Lxt|_ObhOHcMcoi4h&KbSDX)ZR zkZPJY|KtcmtN$Tb{#KS-_q{ieSQ#=(hZu^ALcyK_qj3Jx#Vuim27C}wL&Og3-4Z#` zbg=ZStXh}c9{oDIkx^Q;9IE_cQ|tWOwLV+7uD!pUlUS6bb@yu#gec7hyS9bT23C2f z@+xvU2CLS^Pw-o)vIgL(yajbyz`Oq8A}l|L-@N#1CP|*6Rrj~v9KHkr<|C9{z&5k- zP^>#<{lDWIWDj(jm_Gn2`xQVrr1)rP+H|uF*nt?tkn{Hw0BAwne|Alb4pjoZ=Ly{~ z^|xO@LxNI!KQ4a+IN7njf6q)(;A))ec>WpOkv|-tKhrzuRECZZS-d$!1Pkwsjw0y| z=$vTsAtynSNlzC*YZgLah{*N1zGy?W z@?CoDSAC<}fa>pyB7!){N+&vm@i>?{wqPHG#cSDtHFt{}sgKO|?%w8a6(E z5tO3pmED$T84h28KF^>(_sy3L$nBkWnnTCmHZPH;%B_>D1=}wZu`NBzOAV5%m6^Vb zFO#b^vtJUMPcC^9v+}}84HrPeBBuNS9B(W`YwzoTzarJouxlH{tO4Q+ny`ScAN+ne zH=&|Xaz+ZMfs`y}tbrxWX0(A3xa`p)i@5B8BG1GEi9V0AX#45p&NDB7>XI8*gTU>7 za@#j(SdWZ9Vmtsl2JhdwL3yrhQ^1bqxi)d1fAuam`Gf(f47Y&86N!w8GTH-hO}X*q zldbeX6W!vSE^$G_JWs)rRDHTCQPs98`y2ZI8#(9v5pxdLn!XZCJ`~Ep(kNN5Ke({Z z3-|yC?5l3m=^TmN(cYlf-uv9qB8RKL`MD+Qcz+7f^aJ`20OLPf--`&ZuzaikeKQ(> z^CRs~e?08-jo>3HU`xumuclpnB?hg9fy-5)0=9*;EbC%_mizq9Nctt4VEJk;RVDzH z=7Sm0>2li(H-7*CDOVft}U64Tjy?k?S5(ARil}sj_E1A%02XP3j zKLLAeWpc-t6z=h&ko5cZV7l3bp^n?&274@KzL$^j6LrUy^y~3c>4_lIEAZj~eizl; zmU{`4#j*}c;F<&fY1F}3L{X8W2Z8bi)e$a^j7EABPD}ebueFV@igBPtx3e~DK!_SY zt4c9jJjzxWCVqcDNw3Do6k3xXf1Q?Q<)H`D9)6vN$a-q967&fWgrs5=1oUoyJAa05 z6jhy29|}xSI0!&f#6*CsOvQqv@Y}uwXk4O6`XvD+7GTsDvbTqv!bnAMma!{L@eWF& z0JxLA^?L8CQub?qAps{UMy*4yTe54oy1Q`KL?@r^N3UYnL^p6Elj|H!0~M*xQT4v+ zw@TN<27Q}#i=Tw-{EY~i8C2%&27vJvy$*X5>N(KUADaM5vM+Jh{FdNVfE#HW#5VAy z5BHV@=mvr9h{AOC>o60V^po7Oazm}_p=Lp4+hJvapY#vg@o0gs4yw6Pbm8eB+lGAX zg1QkuiU@fT2twxiGxeqJR^H0F!TEpy5QO}52OV!clL9&l1*yRig~jHn*^!P4$IYN< z#WBaC&*zky(5l7p=hT)$*5?sV)tsQ;ae0G?L}T-G3wH7hPsJbMc>T9U0YJC7HxD48 zoA(fYJ-^SVbp0}swtaFH3S`#tmA!dJ8hCWENj5;mzRk?~G?@xO}Uaj(BrzE9N^Oy#hMJr>P67Xaw*-~0MmaEdL z5vRBYtVLi+gX{-2K6Cfae^KUK#&jjx$%Jd`H+0r%#1)q#7;isH`a(06A`UM?&R}$r zWf^*OxKFrx*kxxw7FfR4O@|-hb+JlLyuew$wz(h{d*4I!-+Ox|?aJwOk&cC)qx&Dp zcHCrVU#-$|o-y^_{cB+sU%Zr=y;r#q7hSzvWIf-r(t3_E!_TC5=w$(il|zp~wn!zm zul#8}=b52rbUl!1J;#5e&Zv6cXZXH#8FY$Y6^tA@-I7; zAOz1Cf=%LsTu zi5X@33Q(EQGmtlS?>odVfCaDo4z@DrKo8baG^i&71zV^meFeNgMq>qCsA4uL69uTiDunaV zJXt7XmNKD0C}y)Cflw@F%z+`y)R`h;xa?6PgShMgBB?B9 zfg>zt{DG9r)TttzP)97(xgwB&*lzjazHegU0CmQYFQKZQ%7vn{BIw*0PrF#Ln_Yq$ z2UG97Tm}aFW9;zDVdZa}l}O3%3LK9+{!-4lRE2Ig75n`D>2u4-X?9~(cToW!C7tkL z_H$K=Ira+f33fh1mT0*ya~)2uXa=Ok!{f}1k&!eBTR^Yc1|aiwXV{_1^nLX{wVm8H zx3WtE2+dJHMUiquaQW~}@m<1R?uS$Q!vMRF{L;br;2JRc?~r!;Dn5*R;rq*yblrDJ z++MUg0Y6YRDi^@CMhkTZ;Ee>_m?#5gwC-BnGSV$wKWnbFR|%{I4t2_RMSs05JB~_TzrmvH@*3fV9z^sXpgs@C{vH zo^a>j>2YOPaZv|;x}-Z{_eF4O2=DF##Gx8hkfNin$|ejEg)PZ8`t(kJA2F;TvhW1Z zP%MY`y+J1MLx3VXPB7^k$|KM|53CAm6^z&o{1fq57~3jnRRoeKuy$ba7JmspT2xt) z!9t|9VDJ?ARLIae<;;v7!Hq(-j7ZnHxF#w*z3j(l(e;Z8PD=NPs%D}hN{Y5Xx#=wO ztj@8E@nNv(DAm(t%QiJWTCeEavWOXPuxcysx^exiunIvs!DI1xb}*$xiG_#9lVsv4 zxhbN&jpj~Ac`?r*D+EtL(OIzaNCAaYNCcMFG@hE4qHegQVz;U4Lj`8_Azo*!NTjSI zG!qX8^m2yD3S+_FH72`NH__fa%QdDvV2H0hFokywi)XUJj6KKPxX_dPc%_^z_)$Or zcd?!GrJ%Fc?w4t*VKUvzM$cw{i7;E`;S^$u)b614#4r__$Qk7SP@*p~ZMj(Y!+w>W zvFzO(4;z8U?EC<5@&3}g3a}5XuLDPR`85sINj}s`G=8&P7}^=bwaq~hgLj#dhUj8Y zsI5EFD)FcX%pLo=Fsz6y8aaI~fd=+7nz>%$(>c&Gnpo;H*Lq(S7(6(Hx+SYesJAP3 zO>hFY2((&<)b(%2q7#ZU@UyB%!c*AyK$bk5w!21O{5C{>h@Ade0I@$)@ku_U$$;V< zC1Gf>9qJ~`OW)TVa&90XVh6fMLO{`%9co(Q;_jml^%3tK!8-+50(~h}TU}O@@sCh5 zeEYP;$`U&%Yy2Jjq1T_eH`!DX!p;t#VS63x$dAS zZuIi3YFpS8<+GLWDI8FoC&bZSRWZ5*zR#=kg)1JrPg7%7%(H*CyO7`^WPixANx=9d zM;I-)%m8t%>1r38_Vq`uotF3}eqB^r&^2~irebrS(J)Of&y<8@H=CPwny)W4HqYFj zUlM^5K0P0=2w%-I!eP^CBnl66|%vND%3l`}jgF*z9{7ygE- zt%mnrz~$y)cSDVV>l{tolI+}~t#ab6$Yy-2d#09?F9Td~NH`YzI#Flf#`BlTcK?xd zHZJa-pm9Zzc&655M~(gY+qLsj{!RZ%e3IF_r?YE>;v*Vj%5~lHvLk?O$yRB0BG!5P z&bQkwnE^P`D76lSZpoQLm7DZB#+7c#e;;4|&%M&!{g1e7jLszJ(&0?(WMbR4jfrjB zwrx$Eyy3*QZQHgvG2YF$`+NWFpFO9mZ*}#p)8|xoSKsRU+~-1kxijHjWqespxA=epAq?vmX+$h~~*_%yr<)XiOo-&P^>t@?J#5W6_4oN&%m z+L0OtjvAm^>j-Y`YLa}1T|p|5CBV%088~oJg0S@3Fe0)BnAO5J25a|%<^_=KQhFeF z{*Vhq?9;r3zXV&@1>rbFWQ$rK&|^q?nta|Kzsi* zydk~x>)#ez1rO=Usudu)O<;IKaY@wAFQ~y_h~EDO^-gF=Kzum^?VVoR zLw3m#@|jw@gZ$*(|3x=AKA6NzNJ~mfYy)FR7jh-MS{-sFzN*siMqz{4|3%=v0=6yg zc;arxXo;OYD5WM0O=O*&@UtjUt=UHJZ!;+lau4y?G>({~$;e=0Flo4gmNfW^aNs+C zcPh`RA|`=!Kq=1SviPV$r!%4 z8@`}DP-WJ$j$J{GS>Zl#ZNB3k@%Ua!G>#bl_c zhdU#$2wuE&*V-pjVb=rnQ`LWjT)1F>#P3GXN+nrovYIKl3D^POQCKw9%Gah zY{x0P@0XatNj-h}bIU=->EBC_T&o6BH_0X~FJ&jW4+Qx>Q*T-yj04dN5&pwXAP4|N z+fbkrZX2v+U<+!$y9+e_z*_AHumqRNk6jNn8|__)b}HP*{`uIi_kh+e7swzvg9!a`^tf*}(Op`-m-F`;2&W z74l^9=7mDcuQHQ?EexsHLc+&2KQnWQpI?(H&4beE(w+TJu&gAO7`n7s% zZuPN+MRWSm1=+XLdz-`m63ly_P!A@E>q5+%t|+Jtt?nyIAA-e0MA2A?GHxsX%JtUe z!`xxhJL002oEZrVlUz*<>8fZ-haBw7jpxJ+4^fno*72n1i2r6eCD!%B<(@(*pK!ub z1(OLJcc=d=G#wQkPl>a$*N}POOiqK7cBr~`DfVV&PxuE$p5dHlcU|v30U!I1qs7Kv z2QbZ%pnk`96!e*Br2~=cl>e~pTExzQz$s!8sCoVhv<`U>QST$2g-{EU>8;vTyv5Ik zkPk8MZSsigfuFe{2(KXmjXX73j5&D}@lf-pYe$_q1!_pi?7C1yEmLr9MGCvi$~|YN zdr`irL59a!>7{U-W6IvtWIN@%YRk3dc{5z_NwVjpKepp_bXV#qNvD}PZ^@RKH*6;q zx;UuW|IKaaUvqJHRo!0TOqA{dJf`9)pO`;@79pZlbT+uy7Xq`?j&jQ0Q`?2OAf zhg5mQly$B;RePxHO7Ta!meAA%%-Ng9d4liN;qvNC7Ay*3q_xqk!oN~MHtOq__4j>6BmJpgJ{}C}IY5Psxj>X~B zWPb~$N1tPcJ#EI~8@fKFJgdWQc2&!~PONv1MXLj!bTtPBfFdhw0H~_SH1^UP@x!J) zX}H(Z@b3ZU6)UQzmo;#xT$t#@qq1qTJj$4h*@y?TWRM$4ulbQ(xrQal(%dB|D(Ow- zqcLQ~ybE*2*2~7zThS7%&ZLUkJ5t3D=0-!*NVKKXk82iFp>1uVtOyY@k<@+^iwp9u z&!xl^r?NA|J-Nt7q|Xn+i(5l8mc!vl5oWw>YIB>5Yo$I_H>0g-T`M7C?nf@pJc9dJ z8UO0*+n1NoSG`vz0V1M$T4sxO$46GalqLGBMe+WTIw{zqBl&E~VfO1IWs=`b`}^nG8Wq;*R&8eY-!DM4>?ZMPaw^pe;9 z6Yu$7K^j`aHv|7`O_znw)<3jMX^3xv(OmV7e?I^D}$kx8AE34*i-hbRw z%T}}DYtRAugP>{0(+^a97OzT^Njw7e>D8S!o4%BeCS&U~{T*q!gy?I6{(bH2wSD!B z`;IPMivSMzO}=Yv*CNGR;W`)mCb{1zdBJJm4XIUc_+~>>`|7p9Wm0y^Hw6KG2{!<8 zJ${%z_K?yzEgCOI7aQU_{%3Ja5Y7A0>R&1@t8|y<2SzCY^&@I+D{*Is%A|hgs9<9k zpn!6#X0QJ<^bC|geGL5R6=oZNXiaJU0Y&gSR{Ng=yxqo&r>S zy}S@3lqyPkHj8xS?cXq^pIB=(vjAU4(MnyudBxiD##q!(6=VJKz{U`_&j=9unP^MD8pV4v{L+=csq8)By2c}F;(Kg` z&U;8VX?A;dpzVXG6@E@bSof~>$bYj~D_XKq8dRy>j#>$ED zS%AM`wBvtrywQ2N`nUWtCGb5-VYl6+)T_M7VA;0HdV%+qUvnYIZk5`>Xz8Go!)+!n zvsQ{uJ1c>xG^D<3sTyow?|#9fVJe(w(5t@TxLD8HN3o(%UpiSFao!K;CbNfDLcJ() zi#KlM@^DO8=Q9&l>3_7rIMp5=gv)}QfH&Fa-m*gc8*u*1n|5t>N-0_jCn%tGF-&mD z7~R_z%EYk^KCm2(j=q5iDvHJyN+r2(9|kAL%drVQupNx5x}L}aNtqp@JV*Qv7bhqo zy_pEA48qz53VVnj2dwI{MpbTQLC9)OzVrb|0DCK2iwDF7Lj(-wDB4xMgJ?AHmrtJC z9a(STS}&_OEowcV9WA$SHJQa`w=uC>FUMJLF{i1MX|HHg{E}ypmg{Xk#06PEs)ef= zHo+F&Zy2xwg2((q3X(X;ow<3Kf{oHIN4APJ`-|}_uK8L+9R}#y;gz!5+VY#M{{_yk z%aIoOvJH!bYwM@EACbUAHGVDjGdaTpf<#4jg-EjPF;3ZJ?&M5og?Y$uSKmbEz!~Am zTL6Qp9q|3pPR}nrH*-A-1;ag^Gq4Q1wkQ>f z!+M=xGu)ThcU!wUCwVj=X_GzI=pR6-A1LlwZqBzN4xVnAXL``;bdJH@GM)*(PJo$P z;Wmy0%$NKogTAAs?+I1k7i~lIO#My+2hIiT`Mx_QGt2G!Wk(pzTTME!*}tqu%-WV6 z4S9NX$KVxUH%k6!ukwSq*@iNAVkhfrfAzcdc2dl%RG+qPwD_M-B81~_8yXyFxP0j7 zy=FZ6?`eVZ|GXX+_&L?Eq@JxzGC4QM!Pwvx$4^NDgfuo(7i-zD(=eGiuX67=}`cqN64rdLbSAehrlbIJ(p<9%X=Ut^^#x0$I%KDL_V@;7_b z3FE@63#r)j44uIHAVYU98QYbU;O-Hkd%#Y<4|Oply%{Bg(=P*0zE(1tMAT!&uJw_hPX zWLfhWZWCjSdi%G3C$2b?9_>Yn;hw@XIW3D!1-nNi!>%ob~-p4uFZ$FT=H?y03>#GthCtQ+m_ecC! z{!O9x?9JTuOyzy@flQ>RI}Gq4{NPK47*`$=3~*ulX*z>w^BD}lvH85<<5+*=@bI&^ zAh_QYWrv^osz2#)+ZLL6zU;i!|^1zcQq%HR3qUT$S{ zp~GscqrS6>OZGbBuT2#3DqYdxm1&sUvjSqod0T3s%krg#Ig)kxoh8lHI}6*k9%@Vu z{vce;+T?9XyOmagj#+FvXJJAABwNq&E(8>CkbG-WjEMW4Z@s+H1(pLo~K=^$N6`vJ(uu(k0)^NCTUTI+m>32*)d4u1oH zb{N;lepI{+oj>EiMgl_(m?Q(~cAaYBKhSs)o&+JfW)ZUtVUG7wZpA$iH=%a~4-!M< zB&1yM+tFIU+zWRKRz|eO#*R&YBhWOrEq3i#nCz1pHAcQ5{N*s$5`TMVX*=H<pjT%{isK`KEG)|v;Y`GKwDPtDIy!CZ1K<|C06oLy-JCcJ`m=OFjFiKrZjeGc_t+X z<0JlB!Hs<9>yWA|;8mKsSUzHY?HqsYvDR0Bv4!>KCx-+)e%oEKvOK$oV!VHy)5Ulu3s3cyKc&|3 z*{=+!Y!#EKp`qMe!!`~8T}4>Nok~+vhBGBab{d_k(|*EaHK9X?7UrwkV!l*(c|ioG zV$y^CdInvyTWe#foDNywpzeSS)N=$T~dz&6#zt3CO)Tj14Xc?i2 zx$b-h!7je2=fc(gh)zD>mjNlDfRwvE1-Bs8pEto{2J}$D=mrf1pf7|TkUntcy+6_i zyMU?=IGdpQLAk^PR>F=t7d3(_g#?9or$e8PB|rDr74@v+UZiLeqFh|XmliO($wUQ@ zYx5W^B?a`tf*D!S)$=kzU9BEsJrahuVhUD($y)EhLuzs_ID; zXK-KDlKdhOF8cW#J4+UBc*3*W>tGe3)t#ZhyV-DsUGb*U_L0WBn{b6?l`IhqXItV# zO2;bVMKo?MPLQmWCLEw}d@i^`GB1B{h7j$veX9ip>?!3`18dk!$0s{(Ws!XZNth-ZLK4=KA-IEnH&4H<)wscnwCXn1k4W*fsbonFI z0P#k0uO{egfP7O~wPPvOz%gSzU~5Iv zf@Cuoy6w5dAiZU)Y>jpc`cSSDwy>|`ak;u+G6HBC2z^vC+Y%i1{3JNQlYZP8sR7ncJOZV@1oQge7~-40CVqbk zr0N4rTP}d82$N-%UlYdFKxS=V7s6-H#v{;?-#$M^ImErSRw6!_Ri9TJPU#@vY+~#;QLDaZPgaT6lp_8 zK2Ewi1)=WUTz2U9Fk&)fGi|V>sU_mvz(?4wAzMS-&gl2gw{!zCKP{FvEAM z+X1?8Qs}h}7DgN7avVtRqt+$cJc7 zWy(*HMAjb2m4G;*@*y)LS3AeyZFk-j2XEj9UfGU(eXRf!9eJi|-Ixo@;YYXwuT)3A zkye1Y&i9X+Usx+LF&C!8k1z-8Q>|a4-wuH4u9yq?m6Vd#36Z ztQDS^3*F&I^Wn!|!;km}Ub&8+38j4w;p(ffdgclEIo~j5?BtRO|F1M6u~a2)|!Lw0ycbrv1^_{}Hm^0(pP5M1y!j z2YOr$di?*i|Ivm5r$vU@D2cQJv?K$oKnvEP`cb6>=kyn|QJQHq#b}m#h)_LB=zl$- z6*Zpt``s}TrLCJ(?C-C^IXnsCREaal z7=z6jz2Cz|sz3xqpW2xXft8TQ`;={fq$hXYMp!rl&6RXR>EY%QTNp2NJ8pWWg9hic zx(>YMJ>)-hdnR&kMSQJ&Pl*2(GS5W*NBoC1Qd@9L@bH$*)K->@VdQiBo0)9&gpn9j z04z)_>4)Ph-h}0JaLHuIBDNfc7;X-j2tW2rSSJ|p`A*89le@JkEZ!6XRlP+^%fWn2 z@?_EG75z;5e^vS%yoBhI1S~LUkfKRi?ZnfJHa$B@IQ#-MuCZuElEn#UG?N4W9&%>U z(k&`k#WWq% zz#pnq7~S0yj{2IpYQK9){eu{IsnKhynl#eN!;?~;1TkDGjl!rRwfNxgp7<`{j>NJX z-rL}+#H4c#mXPqiT-|+YvrVPa)>J_r4l5{ZW~@$k6r;=5Iv#sBy=mbCkiNlMh!z&A|1DKvvS{1pJ8>29YoV^j${(g33qC*;UITH(}=i-wYqXVl$m@hHQxItM8gEY2n`V9_`${a(XIV zdiapZf(pSZO`%~1k|g(#1%)tPM(jWvEcg7{Kf$ouxKJWOW_aP7ukxZKA?xt6fX0|Z z?FAB%R9;L%Q0$QH&!M6uVQshSrR0&^zHePWY*Nuc$|5+p>euA&xF+D5H_9z#RAoo` zsRJjps23&}1oIvg5$-}86y-i63$!sg%fV!bj0qfR0%e*MCj?q#K-91LsO#~`+EShN z?Q1VE;&GzgyZ4HVlb)}Ors@j6ubvK|S3U58OG%k;D^Qe5qX^o5`$D}&ziUNxOLgl} z52)2kkk5DP{AS}Ib5TxkK>ZNs$XCu|V{IQ(@sVt-W6D0<6zvxiJ;^it7*Ub~7h8o}&mN13~Pn4Wf{*pU2{^8H@k?p1}vy)@_Mr6l) zgVdtF&gppt>zK@gyHDOgWM_o4mFphyO-bjzC3LSNrzkh~Y2mq7Y1b`bg zHvl(&U^36`hrAjeP~`1%r~mbJN2Z-7d*eGr!2I5cKgQb!Ln^RB4#^GLAFW#qg<2fl z0z)g7*n-0g5pO`8_8_tqgJHydFZ`D1!~BCJF(OnYLDK|lO%flYIf29>K=n{&t9ruk zMHX7n3f^gb*zbid;}@*`dM5QIww0^@c=(hBn%cPfrOKWR6a6 z8F{y&MSS-%)X^j=9s6t%IcSXGUr5Hhj`^Q{RCY!JjAge*$Wbk|1nD-WgM)T*ww5-9 zJ@KCiMFIvf)xa}`PLkf8l~Y_+w6(lv{owvnMHdL)$c}vA3G15gv5C&UIJ$)J9(^)ECe-pZ&c>s%I|vfAt(#eZKaDK7RlqKj*Z0 zPJpQhGeEk@5C0LE|7rJ+@Ah8j0=9fKeye2wZ#1@-Uvh6g{9C%C|I_T^@nxU?;D7X` zPwqq3yTd>XF6i{nnL$7V60pg(w?;9)Qss)JB?Of=3L*$6-m~sqwCCYk(t~Bm(fn1AMF@pIYNA%o|$fpB2(MO zZ3cURi9gX>W{t9*r0YC948)vxslXl3KhpT3o;j$w_xYk8xl{K9^-no4{&o&Se*AJl z^ZVjsZ=GW+**ryYxMD+{dNa(lP;X526Jy(ON6mGDVN;H3|F0@(Uy`Y;cWj4HgC}5QPyjMfj?(M7LBEn3FknXF#$4 zOG_p}+y!Zu+d^vcx|5Xj2Z4|-q_6|_$A?pks`?deM3-j7NLVJSedJ!e{jJT(Oyf4P zM8({)N=+5JVtNu9hga($KBHfH_uY_AEU*G_H-yKgx6InjIrie?dl21<4J-rPiQ%zr zD;1miDBgeUfZ`FjilKayspX@%5S5E2E5K()r{-a}z_#OTMdJ(07y6#6{-b}x^bPGE zvE)R39`I~MiXT9&Bbe!hZ^fz^ytvKrVEIN5;`am~9<<#3e1ZLdCn60tNfa_c!;--r zl%XeT7)vpMYy;R364mGM%DE*5AIjeIzs7tVpgjWZ2GQP?f({ET(8adU9u*d4=Ax<2 z3rlkgK%>-@T~Nd*lwDxNN|ao%#TfEWU83})=djS=mHshDEi1T?iQ*sKA)|FUrLFt7mW?y_tht`!+(4y$_ znZW}j=+`&J_fHXdt(ZKial-UZf&5TK_^yS_1HEBjAzwB~JHugSRldD%(SCy@dvV>^ z0x>%jTf5bGq#Q{<$Fc-IxfKY_PEHO)k7G3-S%PC-op=3Zt8}iaxlt%7B+aWXH$)Y8PF5obV69H%xO!|0J_*=eY)Fqb7J@e|5WY|E|jGwm_i;NrN`4M9mbE4t0T zKHA%)+4e2`rrQehPARtvpi?66!*n?RQ94V%hPAi1=PAh??G6-F(TzZbSV~57p96Q<`UFRG-98&rx#POR~T#+`h^9DR$2q z%_utx=lffZt-Z`o$k=()%7T}vLe~8HQy{Bn{OfzrcWao#d!$+XQ`)`{4r`ne?mudh z8N~>@ZXH-b6LKxJ*}Nru<1GxLxcGea+`Itw`^;Pi{3|2W?&Ybv0Ecs6(NOXj^B4_f z?>rZGYU+KXUxd6cizFX@GO)E5QOsJ~=dsmo^?T9Z5T@R_NA z-e(piTDmXDDqzY>1?#=~T6B*zs((t?_hYeNQ;+DM;ybhY#ejEQa}VX8BJo<`lhQN3 z@>1cG(=*QTQt=V5@f9Bl_OS$O9ZJ`4*NOmT!B{TnJWK6@xE|fzPwoQ>h*UrLd29V5 zV?;O*kuymsGlqA_xArK~pDM&AkM&ruO(K8vYhme_BJEbi?Iw{dvmyCaRn2|Y5>X2d)rGUZ zk6V;A-i(vo-mq>7TcCW&?iqAh7n3Lx?`?=&B`uA|2Ox!@-!{R*b)aucz`BRwvT39^ zvKv^Sxy(@9N`8>O?rDSNfFPwy^!5KMyJ5RUm=&$ejhDvVQ(~ysSH=2@U*&`d36bXg~zcxsdC7y0lT>3BL5cm zDeoKNvB#{F>GXT|?ZdCcFl?C#Tsdfaj9+AyG_wH{|DUXOTfWX25Ilqg?BBDU1r(vb zn5zZ!dH}vi_}q?zIWOAVHz*sVW+3aX;l=fXtB*7b4Vj~ijAkt75ZNif=fgQ3gS$1S zk=J-cwsO%;uXwRhrd*U)O3H^`iELl- zh3Tq>^vI)%Zo_vt4(QD{p?~E3p~^p_e?!o57X9C!!8PLPm-_hSP z8X=tsJN%_y*fA$^O6W!48}7XeW;3+lNYV|t6Yaj&a=Str978HMFPNJAXhP!&=#=e# zX{*5+|E8?{-R7-(WK@h3 zcx!`rcv*Hyf{$%J9&SUZ;X;ZAY7+0R%&EQXH8r8xXeUvFn(|Y}c_OIWS=CMCm zxJ(?7OX>z#V)5^CB!iA3R{iqX| zruRM75%{Mt+^N4Z`=`9WR`B-f9|?U?BYqY<068(sv-7Djt%yaqu+E9Y%1tPLiKsID z$;#)2J2EYe#u^_{_>Ev3Ic7-9#1%tE9$q(i$e5arJB*S%pkd^MDf9ny(o)Rk3&=wT z1QNY)b+x2cUU_B&rA%K{Ryp&eAE4#TheOU-$elHo|HZFsIxq}e-qWJ!9=;M`4s~4Q zI$+IlhQWvD_0?G^1wgqR&Iz9HY2hU|`QAb|W-8wk?v|lC$6=Fb?i!KkJaG(qh4uCr#&s%BfTlUd0bs1y(>gIjv>3pM7Szc}fN{~HLPPoYUmazHf2U*8)L~)X+RGRZ|MMLP% zBK_H80u>lLzD$#@{kZ@Jt6ini<3T_{8G|X+dqa2lr$?(rx%8#H7r$AB%3C-YrFPKK zlAX4S`V0kRe#HuLX88t&LG=J%Zt%LccvNvTTgc^fYeKe9==m$t%e8<+1bKWIl&^z% zlY}YSuSW>wQ5W0DSI}Gmq-3g?wSvn8W+5ZJ`AFL?a*d$Sldn1)Kdn&|dh}iUM2F;B z-Bkvk816z|m2U>&j#;~Z`l|u3wXicoIAb2nv9!c3$s=Qi_e7s18;MOAc%GYQU9kmg zqnF`bVLRo&-aIdkSKcUwmR-AM^;u8ISbWuZ8fTzq9d!X?Vc_Rv%73oPe&6Kl1!0`1 zy_XEPHyVa}ed<+)Oqs=|GI!?9xUcIXh)8xpF-+%LxOU{5YuU1g?-0V3pjiKrDE{Yo?U*{HA@Hoz*&O+2YyOmC>!GQAs!;NY{OYXn(sW#FCywfaGwIAKx)W%QFUB%3&h82H!UAj)SI{q)%FZpI zH7%JZWs|DiK0I1o1lI%(gPT>o7Zt~{PoBPkn^(S~4`v)2-^-;bf3p9+Aj_1c{_(Gw*0m?ou0B7O)B@MvUn+7StT=AfaUhy5 zUMs48HeI|_bfGL(@71_vd>e%gjM@P`J^7)h1RhvlfjSFwi5=U`Q7%?zlLPhZ!(l_N zv9b&1OB|Cn>D5L2r4`z%tp?kpnpocQzGUBMRbD*mx*M0$L79pWIl9wDl>$pcaMp-4 zc~AJK+brEdp?~7j~5hQAVA1_cH%qS z9K0*|D}-M-H@{{Um`}hstn2V2)qx;8IDB`n6)9~GwiZu6q{{;Z5NE#c#Y@03;CiIh ziLn#IvD@K@xfAZbFL8Tw=j_429}vIKao6$Eb4T&w{L%A*;}hdTyd{Y^AN`M{&4dz5 zDr!u_iHM4VexF2n6i!Koo&t8vs6MDM0cW)85aAxDKEs9#F==E}+2q%n1VZA zJ?QHnAE__7?)SDD%d3s~VH+?C_jVs;@LkiaV=%vk;!uzWb~f5NVco9Y~W+3t^$tkRKZf$hVye7`;UKHmeWM30Sw6NWYhceDi$* z!bM07iE|BcJF`a*vV)ilep}ACO7lephpKUx zQwwo>U!4jeL#hV2)Xdaf65m_F~0}xchU@5JVp~_-cQ?7Sceu6>3*|Pbq*Q z3>^^{E*H^3-h;RIWB?U}AIA;EhZ+vt&{4e=WjDVTXSZ-K8uW_@7o=5y7i)LHa0pR8 zqz`eQWN!k59}NI`8_1Zgf4BF&bJWJ1u4(1#1Ti4pgmO^Uxa-|A90K3Fbqa6~Mc?2M zN89-IT{uL!!Lv~nryubWT>@Ifyg)kn=23U267@jrV|uZEX%l~fyb*(gY@>`pa*`Ef zKUE>`%t(Wl1>QH6WkNcje_IN zvluXvo0MoMO6;4@iqb@XL+K>kTSAXkg){BksV?t>>sf9Rwk2=IoP>uhJsibvvJQNA zKFqf}?W^sJ)9TGNhXH>B`6is6XypxOoM60D#h++PlD>e@n+L0*JN(((z#`p|oIzZ+ z1Nsj!-zYw9<|l6|=Vs-u^r|#I?Mle}=+y?kh_!lqyJACChf$Tr|*4@Txwct@Jnj^YSA*p*3U9Kc%2z0`3iBTQg5VYiODE;GcQzv z!0h_)vO5H!weZp}2*Wa@+-RF*{%C7o867pZx#c@`G`a;kZ769o?5tllxsKZ!U-2F_ zmo=+(+gg?9RBSdcE{`VARoJEnS&iyOOzO99b}glu^A=UA0macWJzl)pgMCQW^o2(e z^n1?`q#n3U?UQV&HTA(7Y6=T4b;+1B(o@`(AS?7$-rK=3shFGE^dWHG-QGV;38D>* zh5fz&mZf?{;2Lpq@dAgAs=z`Gy`^GXyn%o@8pC@ow$0I95@9RVm?O z#jUS%{YW-45mYqZr5eiYK}*>*8U^3bBuJs0I(-w=TvIQDn00s4Uj?+7DzH7lz zD@m)Db+{GD3!nto-~bC~2Dpi1>|+T}i9=Jy(b9iPvVnx1inVJ~92S=oX+wQ0x4mmq z7*?BtmnnI!@41g$5PDmP8oz7IXkswMFG~}q9ly<0uCut`7&EHojwo^_@z&Vm3sVKY zihw}gs*kp&?}($^p7i5mgsqRY`+M_=iCn9%o5X=^;Cp)4TTlx03#fN9FnFzd25@Db zesytq5+TjFp}y8YH)2E4N32F>_73LV%xgBWeHc*om5v8w;Tr^yc_)*QKYf$;U&_X% zuV&#g)p2kcWrjQhr7S;z@VFm%9x)wz6Mh$n59^94Zdm9?)-m(l zvi;i!$aDcN&G^Ovw5)=0eL~v{yUDd@u!wg!#2*&C^E2TGAIrCpiF3&O{Jhu~(X?}r zl>QUUKT7!!2@Sn@F|RrT_yn^o0~VbuKpQ!gLq!8BWjmcYQzLA&H%%!lQ4^cL@_tB8UC`74TZ|aIQw2;4Ca8MAN?-V{Gbg0l0Q+e;$!&)NhYxl)WKZvv2n#ptWB%2tRV~3*7``w= z!E-$jq2_Nd*c1tQi`qL_btVTB8@Mv@-4Al<;AuIDyy7spd)Od>5TJI5AmuFGReb3S z71QS*)Y&W8DDna7Ymy(yDuI0nEhfJ!_W{`_iAZ;z?kBwQ5GH^Y9u8Iaa0{bKqZ;vm zmsY;POAR>?zwGo=JtJLdXxJtmh!&GWbtLLACi;iaJn#`$&k$8-I|zY;Vo6q}K^}_8 zf!K6%lDENC)*3d4 z07tr)nqMJ&6CG;}o#A{FTbG*GiO0a{gIPEW(43cJneO4Y1-+}XZYf5rCf$nQa$_c# z=bqFvxkpQlm~;7>`RNl<%$W7!6nQ*vMb2Eh_SealU!f14sc!rfdm1fOTCa;-OYkSo zWp?~*a;_Kh-i;4j(BbX2bK@n`8FrkxQ{No~7G$x39l@)>PGlf%)rto1mf2zP1Uv3} zIotxgYS^`2e6l51WPU3 zI&nL8`T@-!1J8FG{NDNhnxh$z7Ls@<0=f2Ax(vH~21Zcp=DHz(Y%ve1dwmYX--#!) zdu&=l9j?$f16}D(nl00!H8Q(naSjqiD@P%6VR`(l4gY@yO74B3xFqVC{0 z|6yp>zDBuzU&)L)Qakwouez*IDu7L)5MEFRn*l?hHholGVXr|Tzl(BqP$&|7=v;5g zxjv(uw6t`BF}~su;^5=l%y@D9FLuze{WSZH{p&&#s`P{s@cL2o40J;127TJk9qV*k zEDDd=?6;ZdLTcIEFBOAYS(Zwld1KnLI*CY9W}J8x=V8+|ZlT*olD+Mt^b7eLA)aN` z?RcQ20zt7$qa)k=&&uJf3=WKmu1%=@P{qh%H?FBA8>V{M zT}n&ulujeyJW2Vkfcp94Uxs)!5v)9T*a-R>Blj#DFWQh({m(Nn>>^%6Cn2jMq53jG zl!bdIBfQc@!lS!_yv!7Sk{a?dGtTrN7r$w+fJ)4Dwz9|{W951vvlGdKVk@NR3~aoI zrq=n33MU4nxC^SHVr(jZ!=vgBvg`bIDitD_FS<7r37}2)kt2ThpJc_(5P6-VTWHrp~^i}EQ07&Dx zz`%%h$3l?de!rX(7QStxoytkEc=E`Zg!Zbc)@MdmUX!NM6(H@=*SIfRrT>ZEAG$*t zDk};x-?W12f>Qs2(i_FaXR33nsP?b|KS4!-qEZ6I#U?aYJh9L8g6fh|9LjU?C}|~? zr~-7@v&djN;-9<+*3n8<$v@pkhy6=`X5tvZ!@=#h#+lG_p@1H$pc! zU{F9}E|kZC=APSu@9tKxh=iA$6FRt6QOk1znXCkoJh&C(k^JHqcK4@IOY$y|Cm zuv7^U>mlUc(b*z65CF$Dh=E$|$DKeIXm7+Yh`|%rK`gLqA|K_}``UtQ+;24+|X3(&6-_;-9BPaT$}?={2hClAP$VLMM&}Z&(8AlqzGCK-jZbn ztD|&1zm{n!1<6yZd@t)t#hFgSb%_O$*b5a}H37!fo1uA>%1!HI;pw$O{+pqC=lA=^ zfXj_6*C(JKYb|k9Z7E)@rzcx0=S9W*48iVwX}h2=T+|W`jto2T zZ;Eifuv-C7c_*_tryy^b0)JM6^5cV$g5sj&N6XK7?JaFTMzo}S(EaD6_mh)+M1SXw z8n$AncgiA!OwSK``AdZJDBKZg(pF{j1fptDBa{ND-y#tI#O0?aqHbv2jbyK?soFTp z*=P^-Wv{ZUUS@FBU7`DrN7||n0mRf!l}}7nIt6}J6?6?gut1ckGj}YUX|8E%a{sJa zj9ff>Xz%P^N})*p`?Rhox=b-8VSW+ z`GQ*cyTsi5OL>LorPh^>-v3;JA%U}8oWTQ&_nwi@94GuliV??*{DfV(mLtL`Uc7?B z7)J3y_oWVDTw(TW_JDupfBA~l%%~!FIf>Tnp{k1396o9ePh6b3CigRcq+B8pS;e2} z-A$h%q+b)?_`~~M-R%@^T5skGag~B!?c&x#UP814OY~KI=Ou#7MzD22-vnvtquHCf z^?M=y01tY((vNDN18GOojep8dn@v0uIJMVP2-jF5qTfOipi(3oJi2y3vXL0JbFR3+*>yP{C18f|=cDy{^zf`^p1Py?UBc$TsKP9*i@=>cs1H|~K#FWcTa3z#RG9%qc*7oy;tSK2P zFGPn1luoOWCEli^N4nan3NWHESC3rkku^4JInsJZC6aD~f*a`9_+5vrbAgK|uNvRwXc;5B)-$TcHq6rcJu zt6!1)_p8&cCAU^RXgc{HFr4c}dlTsY64BWsao(@H5%y7CwJ_6cy`e0+@&qM^Y2{|i zB%r$D7HPM#Jd9Sh+p4=!aAFGUYHM4bA3yZ^C}N-^5JG%Df}H)eTuC6@>?e5xL>>GZ z>3BJ@zwQs+{G&cYc4 z6MKFpXfh`J#}{Jj!0F|v0W9o#-li0m38 zS^%Ga24W!ag99iA0wnfARX@C9{j#&FqHbu43EU6aftJq)o0{nU+U;`d$b>WcY@;|u zWwyh=k+uKUX=f&h14SsF0%+}M*n(5i_#b@jrDiys5V&r#D&P>5ga(bPAy24l;$xy~ z?!6C1YO*qdcBesw^ecIh&c(y`=K_hOxGK}i;o2@A53S{?;pAp$Dk5J78JTkai>_;q zj;s6Hjg7{(+1PH}Bu!(xv5m$~W81cE+qRuFcJ6Q9@BeSDnS17N*34OVpS}0p`*}vR zlGw{1Ma~@ZpMdwYfa`$dn`suiNS%bLQ47xphhzmP$oX4W3>pB=%rg>8)+oO))68?N zFx?%ysPGu4m6PWQr2aPjxEkcK^(=9$B$-ZOf!afqBe^x60~b9OuhF=z8S&JHPC7lc zAaCYJ7x1o(c8|B<}rXrk;K8BrOf8=zHz zrpNsf|HQf-Gd=)hJj2MfkG=^7 zt@rPCZ~OhK0Y~(wSV0jCaGrs2?ZcjtEBX5K3``ycQ$gjYru>Fjb5jw zWnhED2F=H+#ixN;k++%#T9g6{3B@HkPO9)>(3oqj+Ac*ef&Zg3HurN^-8_?sJL?Kr z&yqfP22(mPKj8Cwh0|jP+8r*`ew;v2;d?mRU5#o(y(fXL0t}C1l;{>_*wbJhdDw1B z%KKOonxm8Gs5C7fO#hABDHrubTEXB5W$;@tj4U%>!9m{%bl96~n(Ra_9L1AFFf>}a zOmzy$a@9Z1QK}l$P8vhn&J9IFqD)~2?edI%G5map{Mv80Y@x|l3HQL8Gyp)o-!(g2 za#K#q2HzZfZv3kJB+w`tRrb^p)HRKgDk!ZW)TB=4XPO`6C^j{f?8RHi*LQ$-xH6{M zd2A;X8F~dygY0q#=&-OYBZ!z5_LVyT2JqHhv-Hi1HuO zcv>T4F3M9X8w^OXa)~9QRyY+z;Rxp(rgYpg~!}G@36t{hSd`*pfi2W3Lk9WPF>AcWC ziMn7=dVpX60SJ#0qt2%-0nZFS%HeH*~?YSBb|7?NmaiJNp}`%p@u?$jKc;}GX=id5beWd38M=BsfOYYV zv%h$a*Q#01+=$w&kHhUJI`z%bAqOhb#Fof6&nTFnd$NkXbD27F4WIC|p}ARwx&AZ*02W zSiRV4t!JypukYrgh<>50f123fIi3KfCIlR>c}%~6t#515fbWCe-6Te*tf*26Y9o2=_diAfnd%!GnMtAvW^$y{yL}5f%&u18<5p1l1yNNc7*nL4&3Y zg632IH+&e>{F3dU zSB*D^D#ZEr5L3{@thzvjUKo_Yham&vIq~38@2gY=+|saNa_{S`I>wU1KvLgp>k7O& zzzLd{ssCYYMOfj3wf^ON*eG59qklzJT?lO*?0nd;UH`+5UfZ)Ny9rI5*y0l6 z{7vhv|FvsLTm9O0GXEM7D@2C-)Q$V}H+CY`{A(i|GGjZNeM6!hjDO?e_2p_#C`NlP z(9;%T!%`t8zRxyiE@LkO#^6w~)FZETK@jQom4#;z8&4&iFK|SS&mp`RZ!uRv!hO@7 zXHdn1qeWL-SAe(JEzN);})hlD2xlE!k^vCS$L*baCwP&+A!| zq$$VL4V~`pt@k|L8180aHQli$+3o`ng!tY7Do&=>j z+$&CAE@!q4qcQqbM4=_yV0h2et~SgH+zY08y8FKu@_$t57bf+yi?$Il%YN4=M6Uz3 zQjq!4yT!{4`WKl-HW!p&*cKOZ9Bhwqbk2h-Y)$_07s^<6($G1u&AtNWBBy0g+MJ6R z7>!UJo|3~qA$(?^Nkwz*(uH$jeBr~DeP-#Zqq@y9ut9E(hCm^S>VAc3&9qCx!J(nDJGLw1e9?2zpi z>l%jLs@EZPgQEG81FAi3y#ZJ^WVV>hzr0Xr0pX63^?`^Ddffsya@kLV_YZ&+t~)xa zcRIC`J=tkwXny_vVTc!dnYBK-g`usbs79&tVSRG@wbH>pGY%{5qNT-Rr8I*Kp0&k- z;RYu)<172-6OOcj>*JfA({5J~dq%#5-GWpU-k>6K6yBtw5qDWa{*c3hI{`;j{?u{F z4FQK=K9$1)6ahzAK9%DFMikvX4Ygz|cUeY09rxIzB2iS@m|`LUM`V7H<3bRD^H)io z2}L$;3o1#SK1CG*l}Sb2s9XDl?EK&M%1Dxn4$6d*I%A6UJaj#Z4+I<``FPxPBZ`hZ zbOVaJZh((^pKU(&?(q-Z9iFW0UdIiz<0fhI?EO`H8(D+mv^9J~{>EhfAI~d~Q09K4 zQI7b-@(P`-@2sU^}S-B zd!O^#2O~PDZ2%$ZeIIWaApujrX20GeTZr({d3DV2@8k$xqDbv<=1A>HKLP#NKaFAaCjP(L6?FS#uzt5-X*COs@Co2_$;Mzri=(6!L>#p2tS zkvjJnf)968^vkYEgl@QY3T30UqGQ>5T;=-795f;NxO^dc!xAkja`ICq>dett-BiFe zr&frIA2LXAV>p$6DQ@IEvgQ6NNp18nWFF%np|k$@42;}HK4Ek~xdutgmFQ%4_V zq1x={w~QsoT5t`Bi|YCfK}Lj-nJezi6WzNmY#>Q|_qk1XOe3jjR(D8nI9m^x z1J{xtlncb8W)x|@ptJ&Z{7Es{9`Kd$v{^bCYM&L9mZX_Z(LNcQ>tW z1S?S3`e2U_U56z;#IIkl!K&artQ8f5#OL-_M+$u;aT=y}!c z+3BMU27jp%jE5iB?s2Q~XJZc6??I|&jD%y?>`|y@OoS_`*Z#%KtT-_obWp9(7w4k) zP`9U}SFPJ)SIw9LC1UM~SGcjzPw5Y)R=B~@tJWHF(0gdi4u^ZIW(HITh(|=*KtJFgOeyVw}=% zcsMsTezA`_zahwN%AqB~BmL}5UG)bl*}lzL9s`FyUzu;AK@{d70sMTT{vvTh_7sZk z9`60ia1k}_cFb8*5Lb43n@S_wLNSqSq z_z?mQaw7=PP zbm;IN9p5NKvC>N=)+|y;v>WRyl4KcK)OJbpt5|Lc_7(;q^ZKZp34Q3lr6s6*XTf0> zUiGC`Yt@pnt?Or|#EsTM8~FiyBY)&K2t}Wno3bBNWhW(EsAY~F@(Kwykk;ktWZuK{ zP{ssBuQRrubiX6^kvy)P(4F+7U@)re!4vEolo)7`jy=c}Sumowk?G-GvQqM92*Wma zhidZ4dtqS5j!_$f{@meJA)jHi_KAbOCt~GcYH88QeX1*gF!X7#jJD;mo z5qGHZ819!b(#u58=y=B{VpYE`Ltg%!2hwwN>|dSynWE?QW{Ym7!+H`~ELBgZPibEQ zOcvACc#D2z=3Z#knTPeyOVgM-DrDHv4Q$%?6{5oIe{U5f2t~()uN9JS!Q89j-c=0! zBf#)kZC%ofn%tb*MdV$P{zQ~xIdodO7)i<`;9?b8Ub&(lD*Gn|if!{_UNk<4v`X2< zO246!CZK#M{JA^B8&_n0@>xj0<^A0Ug#fVC`py5TS0r;x+rWd3+c{p!G3QfyIoF<% zmU+giXYpU(BnBNua?tMR}OKG!{;VcUJ5m|wqSRpZx3j1DSoHab04Wiw~t zYd%&cOujRVRItTDHI5x8F%xDhX&b4Fg*iLSsTVuAH|a{K6!V^zX`5<_&z3AnSwB$N zN->|7#mlzQg+$6T@*MK1F^@A;_D;Vq;nPm)Bc?dWOhHVu@NzwT_Xwb^KJfDR$^2Bw zc9z6-!j+PaAb+O{HGVMpN`0itvBFWLlHj;q676W3_>+Rcc23BeYq@~$AzfJ@jp~{e zEzxSu@}bw!GR>)c*1VQ#({PM-wP5}4l-y>)di)3Qc9NL20AM#=v!_oxYaLCiB-n6s zS$=BU2>4VTbv#;55|D2!aZ6wniBVcceYGL%FZmOaY81FGIt;stm|Vdt(ei*qz6NB= z+P+g4a1}5ses#!qH^Xd$6A1N=6dd5Z0D+DVy1@wg`UETN%ohaypr{|!bU-&JXO2_C z+63}LvCHMBN^hv@iFds!)u9HzUb_e6$7i`Q|0Q9Iq+^G^WX2=Nz8~b1fvI1>%((Ts zWSI(VRN^S6oB2u3?26j$4W*|er&B;jQaxjFcz{@Bl7XL6*FLYDM#sF+m-}dD$+}W% zrxQb`yvfD1%fA)Z&gVH;SV~9v)<3QUw(Hq9{%g^Yx_xBl#Q6G2q12=Nt#c51m^w0r z<`@H3B1*fzb*^+`aSGaMp{8P{X`3HO70)x-@yh|y=4^q4DYogZMa zjJZ$F4ZjOQC|s{UJI?Eu#8I5d0pEe(E&Z)aQ#Lv-dEx9KezVnIrd8$B)t0$KC%G=xCsdjPp?C}rNQ^Q8P=SU4pCJwZ0V=Yj;X7gB zC;32)(j0)#!2}5X*=pNH@XS;NBShemTfQleo7<&~w8|P6(Ox5NuZe`*tS)v>wO<}; zY6-EYmcrK9Thp#Ck?U7~R5sv~;SHSQ{6RYTD(mR|hQ;>ey=WCSvqTWr#8IDk@oO-O zvfXOiD(QmNIZcj+)BX2~8OQjA440Hk>XuPX6Fd&WE;N(2pA1FCisJoK}P)Fgd14&4=eH3(XJbv7nJmv|HdI z;P{(AC6K<|5zm{x%`akpmoD1?_yisSo^ak%?}e=ed>*na zXtB7wvK7ilLxQAW>FB=8#QlV219G9dK$Sk#KWGZrdl9_MCRGNBRARj#lSynDCL7cwTNv|?4 z@LD=ELrLw0LwVKaNF40VCofg=muXtOEjS~V#c!XYRat{`O}R6s$p*b%g`BD1@_fm^ zyCy!VlxL4n=3CmH*04qC zpYX-bzAf;}h^?Ka=iQxoA>=OEN5E%VPk)+H}3{qSiZl)-!2+oPi1e(n* zs@w_92vY~-;a@j@>7k_OJ?xHH;c-bTklG?$0Cg$ci60_*uv6Bma!#r_blO^Wlo{cX zd)V99$j=`lZCo1|$k5<5g`kM|8)R#VLJ1wQ8q)8>-}a-`7~qxMqM-sDovl~vQ}2Z`k^D>Qc-RhkJQHdV9>Xp|5^Y= zg-}$LlnIZ~&O?(#5i~l=0zs)IZP0Mx_SQW-0W?-}WC4yEPhsO3m=c^B^zGR#PPl(S z&r%|5H?Qk%(UW<`+5C&%0?24Dly@qoz7WWIgqxW6j!xxB!Sj87`lL;PfO3QcEX|vm z^{g}IOFP)4mi#m1U%y_{@;dLvRuNzI)f@FzU7kl0$A=kJz(&oXxGJcWwO6;{xs<(h zI}d@9rLn{#pBA~WIq*&&fbClgmJ`5J^fUUg{BQQbp=xjosL%Rg;Vjs^d|2LjIUPsx za4G1&Mmwd%vnqS#D&jq4wa7600YVC|p^+qzLCzKRYvtkd-3K3JWlD66$nA;SU@<#H zxW#G>Mr=^&f{t|nAFcPq==qf6KbgaE#N@y9;}KEj{5-L8l*skW7{#}a1>$EQeow2p z$f&BOvFjP^$`#=y{=^(vdypv03?%%f+85{`dCddX{DzUMgZJ$3Z-A!9cn6fwG#QEq zZ1NsNf$zoX8excOxQ|z>uvMX3?RG51z0lrZ7qVeA0=5i;AdSj^eu=CRG60f*<@D@c`WkYePrQ;&uth7?f`>HZT_~-W9E}?)t!Veei zO>P&upH=KIgLv_%seWr(0-@ZOMt&MJ53 zjZYz_UDuiRfAjg+-~LsN^z@+HJjj?MbzC6Y+FvO5YtcuBH1D9s{=9z)0hs|rTWLp& z#9QFH(&;{KZ{c2}(@bzeLM_R0jM6lC+c+qXg)~X4L5k+za5DPjtpRM=?4IeINi$Tu z=(CwcnXBt3dm(=4<-N#f5^wl!SyZ0vg?JTXuCUnVk*}xd<<~BEQ0xqOQ_l;-{J6R` znsKl9#V>JvyZRWP;~lwmCCmiSZe{0W;_Z~QrbctNe5gMKi^aOP(47x2lPT7j(FC`{ z&)aVQr0R=p9D9zqt@xyPG|zw3&|{Rs2m6~Sw*8J;e}OI2F;btD?rbn?jQx3en_w|D zWl?2j(y_+%vyx{Qx=Q&@>Gx;Lh`jDU8`E-*l7sM}KZAG6qJdJ3K!vX;EQbxKFrE^oJkA#s=xAxN+{gIYCB_o&5v3nxh^r#1Rb@ofVKXLulpOk zZ+blH1NJC1LOb-xhmM-*PxWM(%AF4<4Ru%p{6sq~vQx2ce*iPpx4>gWhN!%AA_Egu1d~qcDw$);Y!QMy;QWN zltJ_)u*td2fc~>kg~^7;@o)BN;_4)zQ+mC(#5v6{C|<}xEK#ZuBC~Ysqjq)x*jTb7 zgjY2D>!$%@)2>Sc+J9|ZGMoZWq`cloZvc{|UKX>vhO9?qMXQ^Qc<#`~HY>}~o`>_@ z&~lxu?#bZg_-$b-VpgieztAq=%_|d*yKUOn*7nq4+PCkq@b?E)vX3$is}G0x(1cn? zxq?KLPB;K$dlUg6;s{&ba;0u~>xF4K{6(w0^73eB4!*_j%c5*t#45phxh3y|7>R*0 zIxOISS-+I5P>R$xa}~C#GNgW<-)VR#BOU==;@z>Vz_RBsz>Ll85at%Ur=xOUvM0_2 zss*{l(t|{c{}w=AAcpo%7%M2usT|Hv6S$O{t_b6SoY{v)6lA(H_-x_DW-~1L@9p{8 z7&28JE6&=OnCE*`%v0S*#f)A{0S1#ZQ@%g(xoM}=058TsOCaXP=a9Zg`RDBDJ;9TM zw1D<3V010BlTTCUt(Isk@~Fg$ix>)9Lf}6_ao~^1P5}lE=O^8Qfuq=q87uxB6AGkPZV7?4&A4v%q z)?0c3F14C$Sd*9B;X_1@>;q1jyLBZv1l^z5%Ig3@%ZFn1obej{*j$tB+9jN1UiCw2 zN%OG9YXFM8TCb?VfE@+=Rc%%%19WjfaR{N?#!n1sZVW;qbh+4h^|yG7 z@REJNLPpB3yE-ADgsu(jK|&#~S^ugV3BY};Ax7!1-feZ`YfWG$xg7QVSDI}}cnxL@ zz4T&UGr`bi%*nu3!}KGZQOwZMDAmuoA7ho3fm5kUm9({L7XL@e;ppMfWRfn~ys7)I zAdQBJsZQ?HBssKWhx3Fa9rU{x8_nYiDT%y){?fH0Yu!k>?S_BB1llLF(H@u_xdhB6% zuCSx{2JAz4u3(1=4_k}~Tr>9N?KY&N-V*n{_gj<*p7>0If}6(zxse?Sc3UF2tH6gT z?KZNxtH_2`_F5u%s&08~nPqrn4}D6vWwPie8%27M%PBKk#(<*HLmzW$`j>5X*WfSf z`MGFZppRki%$H`AK>E?%7yWchCi_G{F5U;2R(;EcQia%LPagPe`p!7%rr|ILRjhKS z+0dEjPLcoMDp|W~6%?7m>iLlu=1yT`*EUs~>3pnC#c^_yst1>zCkjCuUh2pmA7R{k za|wisTI`S6@hLE!2;Wxnp}HE2`25vG-*e{GPgBIe5H`1jz!>&ij8qf}TR!zQkGq^F zYLH8GcsT9GMTYs|h!IB25EFA1U6gtmU37X3a3s27Jf~M%iNY?5a^=aJee)oa`yMf) zfU~dJ!qbI|(wqN}y#wBs98+2>PT@7iC+^0$ihRx|qb5N?TUOp96W!p?%|}$)_yO4!0_x%UUbCd)pLKu zbeCg}eHROV2)fOBx32t2b*VPj2BeT)xl@T1lgC=^JlP4(mrTC&WsNA&B{ znMLLvK4p6J%s8$r0gVp_j#W1mhV>c!?mO2;{J|7aJX?RjGOvQA<53Q z>eX1g>CTQpa_Ml3yh^c*$>;6eJD3l>&zHSZHnW)z2pCDa9uJzWPF`CmRK4M?fGa%y z3WlMY=J7JI)*lt}a~!sVF_RsAQdvy00mVv-Yy#t1Sba)9-Uk{?{OcOJ2#)ZMj`gy2 zi=I8iEF)manF}uk6XH)=LuC9db)HhB!BAki~C3jdgc^ zj+W35nF4<)z+;Q~kYnVsEM~0GUwrz@qfo$>R>Y+07(A#NN6dgXsE2nz!_E<)v;J<& zs)4`5N;cxg&RrgRU{hLVJ#Z@ql$!9^Y z`M-q%M!6|~tLwO>WtlGh87HXA5cNGC#`P*2SnhqHi2$if`FDyg4uUe>cZyhi#3o^& znxN~tPu86xuWi-R`p^r_Ixn$F*PUXMqu|)%l%z&Z6u|ronuY?GOQNzD6kjfpG;^eq zFciD1t~d!;RwVaIMgCAAAoOG8LhquHMMSLl^#{!$ylyxx;rX&bBhg_n?#f?Rx=gEn z+(eNTJ5^2dI0ifTTDHC{!4h_Zj0U!Zxurg)Yk@A?3T*R9SSCqY0%?4Y{B7n3WAP>> zkFzAEVVH`1DqY~U-;emec=!11Z^T+NdqQ0w(PzDDM{z#TaQKoDMY$TYIB_Owe`TxQ zOkty>KcOsBWk2Eiq@zR~t(DDwAWKEu1hSKI7XkPka}t&Ihh7cPO*ydy(OCO0X2Co6 zcL2Y#v`AtM_M#|~B5xa9qomGH+XZ4I@xl{acDzXO_?cldBF(6!-0WFzCp7Av?_N+< z(Mt9R8(7%;y3b7fIMF={yU8~=?@XX%Tf3|#!`^|D}b(GPc;h5@3BwX}B|g!b!qaUyMLE%$z>~~!>~N&ro1w>c%r(&($D_t_+&s~m#*>Q}1vbiA<-^C*0$Bd`zacQ|>SvKdX2;E9gAG zIvO5POt>q42aai>KDX4m6ysRsNYmP+F`NOWX^xRO80KDsgO_>QY%1_DyO|1l)Mvi1yW#1^i#?oi^KJv4g+d5^q9}< z(RBF|B}i@PA0P;T-#zL8?BmW*i@+znH%9cJ-cIB**DrL58*f%$esQXppaaw9_4)&} zd%}B7g)KvQYH=UUgl6<&+&seC{6CQJP?SiUU-`GdU)nW`w?%&T$?x;Nk-e;IQg6qC z0>|JAJg*Nif_AVoy?mKt;x}iHJN2Y&+OA~1vO&ffeE?+OSk{YdcxOP6c7Y@D;V$^q zsmBH}Yhc+fh?4W^6#PmIDa@n=CAPbK_tTej&|@QHbbASeyVN7l|5oGc2_52T;1V{i zMMuFU7V<`ZYr0$U7ZpwEk%7VG!N+dj@e*Zk_dO{ryl`wWJoGCaB3& zW_x`9c|RpH2m&=k-**g50`xcHVtd`dg-^+X51$+m6^vF(CX|{v<62*op>Qg^XH`FI zCcX8TQ?L)uCK?BvJoSS|fOVW` zDEJ7c9d#`m+(~K;+PRRyX%N5WjxEXrfS*I)#E0j%^*uZHdR8z6(2HK*75oMe2M7(G z-zdiYn3Fbjpq>DR<9Xy)KO=WpC+1c$$}0`9s0zPP2K(0D3WLt-0t9;iA|F(*?p2C_2^$v2I`_h@Z9f zW}K$=9pY~bh%aOeM%RJotIfN~DJ3gn{J0j5gwgE}xBylj-uJAii)USL%V7rb_iryO z^&PddxA{q=<^e}ODTi`GF5Vlg4A!t8fgRdxoj_c&Ws!On?bh)D?)XCDIa`u$pSzD{ z*47W5)+FIpL3(E7-&spVNb&5?u=It{X%ddSRbVS9 zDU2t?*;(UK{Et^8nFQPws+SSHwCCKhd}@|3FjP+kdYDJ&Bdp!;@H zb|z?~0`s$~4tg+?b~i*dXTVwJgiRif{1VWGs{X#eb0pkuEn401N21-+R9ztnOC|wh zNRvjog^2yTxe-3<3Q z+|=q@uNiQ>u>n|~c_o-nNv2+TCE$XJQ?CRKkPm0#g(h9ix9Npz0h^{O{59{>4AtX{ zz+WOUh1}y=ntMDCd_{IRIkD^<4KpxJ|1Od3T;dr8GwQYIs2n|(A9vx84rD327ol1Db@<|D?#vqdROVhf? z@yqIxRmZUy^QTG)k`TvEkMh^0RFIU9LW3Yws69tX9muu>G_9}&F@LCG+^c?*CA5VC zz`F@hnjk&6Q;_bL^_gbGdO3xkAlJb*F&QA+_*TB2B*eVJ>J0 z;bOSWFfd;>@d6bIw}=T4*(td(PL_LN{HkCDA)R79Pz7{_ z;bz>~!A`In&}Lrlr-i%olEFXzdiZ*amV@iamxKL@U;4rupbK}eqzQB40Zm9J z_6LYRnJ&<;wrfZyj`vtO%(J?}lCxXF*@doOKCnB{PvRShXNFG%goz6w`~>B%A$T*8 z!CqZ?5kWC*1Si70;3uJ|(64qAZgLfAMlPsS!p(b#TA#cJv2}@1d_M;|noT2|3 zZ?l#XXuUR*Vm#+1ZLF{i%BfH!DM)gjjL}>gL|>@u^77YQTBI&9(XkdS9C-!=OL$I@ zT6pXemx@*7tUgk37#+O6;WzN`v&m~rZ-}CECCC+TeJ`XAC@Y3i?)$nsb)^;A9F~$I z74h;*2|qNf*Su%3P`XL3C^6G;uc8IutNj8UR?l+Il@)12L?8qJu&*8s7&fMpDrr*Z zE9w*W9mgqH&MefrTC0MmsxH>$l~&pLKYuj(ibDG$!;h-Eq^+tpDOldoHmK&!WvYNk z){~_-zEN;dHYK8Ea7v(=qs!)%4#8lboT;g#rD7K{D>kJJoEeA?U={fc&44kx+CGA@i%F zb+Gat8#of!=l(OM ztf;%i7Cb-rV-aD@b1R`+i>YwmeLTi6lcDL@`epr)^(Lz}L(|-XWWHWSDnh<#vtH+u zA!Eu~l$Sdbep(QWr&Bf9wA+^;-tOrFbB;N*$K zCrLi!At|7g4cTA@X)#Vj7;~|Mq^_dEOtR4%(qOF&!5jaN)0%u6h&_Aq;or#UmN}o1 zp^{+e-&B*fS&fBaB0PO4bC+b4PRoSrT$Qh+;Ld~;7N>{%vRQsbc>55}SYTZIXRyu8 z0t=+x0MzBz-OpVJFcOhXC`on>%7`!$8j!A6)4(}5@uA9;qxc95i|$x zCpm1eMrlpi({o>0M!g-q^O8zf0~`qiP@k`~)3o!6hhrkjm>iOwGvqX(Sosh$ds;h8 zZaCgZKys(0UvwGwlj(1DR4IRZF{}YtmI!;1A1+)dKNb6_NMi#7t-!&TD5ZQ8P`^=( zX@zNGY?BEJe-Eqy^J=iTTr8{f-?BJ=XnL@>{?kCSm#^wsZL8JcI7MYTmBHpnM3HGU zbBBJsBzFaJ6Bn0W<7h;=sm3Xwa5tY5LP*p5c2PwDV9c)%en76{VhU2P4Ke0iS{TOe*QD)Vu|RwxfW?cjOiw%`c4`C^~RJ-ryHwf>I0v0if6o)09&%^$J)$~OxQ+kmebD3 z)C>uu_4A&B<%A3g=o5SJWcsA&=Cu%6Q}9zKm>5a72^0Bv1yuJ`(QqkHpW_|+bIeNd2 z(p{Z=RGeD{_!jAnV)Nes2sD1!tl{SC*Tt*zo_+D(YL!f5Qd0wsnmQUG+tR8y*cyHx zx{E3#w9t~3naVlx-2(i&Tb)Rd2ipz~5^^?XHfE)^c#RE}CZ};GNcoz0SnN!e)@Hbv zREx4HrAS-LU@tSUgkZ0oeF0QXkTVAoR>J6p!sv6t5YIEP90_MntSER0Pu^B$L+id& zBfb(G32}$Ou&k-{^R=jXK!ccv>MLr2FPpGH3lTr`C#+xy`HqI&*A6&AI3Z!!%)eu^ zWDRfv!CS`JtC{!+N~|BG475dQ(ut?U<8g*ZL$@8~479&(o_dLH)sN&%lk@3i-D%Jw zmEHanIVIe6g=C%GsMOWzqsf@dM&vavVmd1lJVogf9#l+L#1Q-zXVuhVZ)_8?0-s36wCcyET-HDy@TXF1ze2FL^jS??)FSGwvyW*%MLOy)Ap_DRK z)Ap~9K!SI6d)gt;Er~kRG?g^#Flc<4I3k#D1bumF#20UE6W?~MbIU~SX6_~XXf`-<&qzBBkQd@po(i5qoid){??Ald zKr=uu`)%&<*uf(E_8SOhP;J5{_aNCtTS0`rk_yoYbClrfM7ZRCoMdj{L(m|U*)dcs z?&l#L;DrB7NKMWI6UUW5RnA`Nrq$F&pvf<_OFka3$*iYr6SerDD`G61=xFm%F5x^M zBc3Zw{#f}*mZ!Ef;;pJeqh(A}s~TSs_R$c&VMyq(+pz9z0%sYsKJh6>dra8o5J-E_ zblwApZg;hW$x;DvEDxasK85vIPsgo=6g21Wi2Y`cnPJUqciYk0R%d3SNcw0yw(Rm# z4f*Vg<~5{F{Tz|-xqwax0gvwzpRStsCRoE3zgSpk3*`pP2QaK~`1Ucicut5wxP;(N zWQ#b+T7gdR0&vABQFrg&)PgJRfmr!|cO$ukeQ zPuzEm?TxlI$zip$vZnZCJL$$h0hRFQn2Ro0JaY582KDCcg=^l8)&(9FYf}`G3kCb* za*Glt#X%@wYO6z~!&!xY528LnnNE8eMD$rEWo}8sVWy{;)2wp*TVFU>V|dg%%loeMSQy3F8Jp5c1Q%BHdvA7*<<_+^eEU#U6_=DPUco^nNe_+^oy zXUU2#oy#>!S9F`LXMvmK?bMjGu>ayEVD)KKRrF zhnCSNk%A!a#fd?g0#oX7`iYX(LzzRU9n$^9#rLf@Uth@W>pL6)WVWxZzE29gg74}x zpFSBwfTA0iRbb`6UoBuZ{;vI<|GqwBeB!xb68RGMGJh4NHRHa`Cvf7W6InFl{G@7u zt&}*Qoiw9A`;L-JJ?nTvd5`t_<tk4LO5Lof3BFFND4P}xUC=l_|pHd z&^EsNH^=Q*Q@HWLZHf4&OWPs9ZAtrUN&jO)+mP^gjo)!W>j;5#joFb$yCCV+p}?W; zl}Fo<^Y@gpV}{$3^?!=p`Jj0I0{58!=_BEf61O8p@%#<$GXs*Cv{x@?$0uedpW+z@ z?lTUOn7Wr*>Ywx?upE)2)Bscqd*!b3T&@)cXw_ZFPGB^q4)PglaHeMrb=dl~x)Xo2 z*qJ{LKE~FWZwk&9ecD`@FG2bwtM3}x* zKHExQ8}kVB%hF^~qD|N78GZsmkSKn~H#3=Fim|y#GJ4K{Fg_=mMAdbjJFNPJ{DkMl$*lMGjI-~z8|5DwR(o6zIDXuW-1cy_ z!Z7%ZFa@W6ri`CiO+nHgkQi>RHQK%@4#j^!vH453_EqJj;dyEM$deXnu1=?*7HQVz z%_(;mZ>0deOaGjOb}B!8)#Kk=AxA{y(fRe*62#+S8_`sIIGk;keSUeBpNB)9;Ti64 z*(@wcSDQpO@i@u%a%}Pd%=<`qF_jMo{!C(Yk7$qZWJoAm3N6SE!QR`uR|t==LKSB> zhxrUg@8-f6^2e>&ev)+fZ%C56KA(I{_%JFF9#XoKxAG587-z0O!ZiNmtGvAJjEDv* zEB3LAuInsNl)`SSmf)cRxka1ZM=t^ujFQgnkyVY7eg)cDJ!IowJPj|Lo(J33zA0W{ z4(8h5HIK-CSCoQoXKCVe!&uikTxyt1m1SWG35m+Aw`js26c5Z9%ggAiO47E8p&fuY z>gg+xEc0#JHkl%9sVr*q!ozi@=TfD>U~Zb}5;hv_M5kMZgt$5te%`^kvb2#rWaGNp z?!?5e0c{0%;7&7wNGx3}!FS+JSh~FWW&Q-0eKrZE54o@y#b8#0V zVgoe=-uFt!@A^ek^1w>OyD)OQqQq_1^|`6IS466FbuZ9grb_INMfDYWg2mYh4@$ zlcTnp8diLM?OK7j07Z(1C|yvT`f-rc4CfDVqZvN|3K1LV%IlI`051D^zt!KjJW{s1 z5Iu0MXs^W2vTLk(Q@)v%Hz4hZG%+!|$rtn{ z--8PUd~dSC6u61Y2=7ppS_iDa+vp=(Z_4@WF zV@keS^n7+_{(X9r9GS~ehXVELHkdD6p7E(~3ivlfMj; z4%=H%7r)z$nEaYJLED`%4nGiucJMoC=qRcnT7$B8Lt6_PYIIwLuvz*wpb-wO@mJ+8 zZ{&=BH02km3J_DuM{)`<{Nm3F?sUoJV{!M#R^qEe9H%Mn=%&f1L%w$5QT69wBgbVGVI#-;6~6z; zI6@aB@l-2^OAuWOQIl%Omn$zTy;EMWjKpCgEVktwv2htN0Fx8TRWL-4m&De~yv>K} z)V~y4D`-}y$gN%U&&vO^vG(uyRCz&`76S641py+fysx050jsq0owh=tt@}n|;+VAxOvg&|o&-~bO*8zX z3MHb-+N^t~V|ZlheT=%|`>Z%72qgR4_1oow#;ge%x(qN_`i$WnEcXvE{(9wmh2(Q8 zuief|Ml*=8XB~rbrcVR{zsj-o!7_=32z%Kfq$XKsR0x% zI%k2C;ki3|)=lZN6RO+So64V22Gn!{*l(aNX22V5^LcMRtIduJB=<2=(Mhh>j;`9W zl#*W;tHv&ga`El7EwTNzbjG^w3x^(3xC*^{ifGR}QMljE>eOQ^SPD~=H(iFhBu~cN z5250@p*52U+xQc8&Ox3RQ>lB=ly95S)DnkuGTl4rjAGb7Cr-WFo-Oc)jSkt)+qmvV zX=OAF1rcw>KC~f@P>|90Y#`7K!CHJIPcT>%^-4zi>TvlhZuA|^G~oE>4I~`t=wN)F zdL3c^Y=7p`MB(lV%Jl6ZH{jA&7r3_K@DU?6Y587>7iE9KV9b9C(-Y$!Gbp4>n=@2TQcqthwXtMSfp@QlGRIS0f-4!)c zZURFOQ{L_1^#0j|;V+^vvavMQi1d63!uqfK)E`$a%F;@x6OMMBHI2@4u6DaS!AT}! z&JyZx;VT0u_$-2jXfYbQW|jE~#zjpm!fpu}Sj^pWw|fTr<6k>PNA^PLsMzD>N?C0K z6%4ulsHFwkz@u>yCC^WOw`HGtU!Wi`9v}OC$arRKn2h1x+0B*;H^hoX9xXOaLy% zDKugb6_ITF&j+%v%RfBlIIiA@czVu7U74E~m9?&(=f1;!QvC=v72#Mk1K67Sug7`N(febaJ>&V*KsO_1zc=ryh~M9Ku*%1sqkE5O&u& zDx)_}vdlQQWz~(fn_UFrOHuFvLL~|u1OD(EsO3j=5I}VG3>?nrd!oMog*=7W6kyeZ z#7>$8d)UpiW%TI%NGO0QrGmW@N+wfH+ty*aX?c+j_NMng@k~9+N8TihVpMcx{D-bH zeY$~r-VX?dSSn64@s12Tf6`_rByv4dXNiz9tvEq7khi&Q5>IrnqJws;1Ah6N50>`XKA6 zP))!;UCMc3Hsr{xAwg?+1{`y;5Es8~O}9e;6`|3tFsr9n&m<83tFh&0puG^#w?b2@J_1gLr=bn8pMkR>?pxq^;?vgkZ87Nfb9XH!j2SAy zMy%NZFbk&Wj<*PwuYLyhqF^Khl{j6awpL)a_=mC5Hg14nXsOYwV+xl{FG&0AgB+Wj zaR9RldJ?pSJmD2S-^bu><`%q*0JdJ`Y4#sHwxZhkNYJM*Bo9MGo5!0T6tNjP4&uQt zSz`VpH}-qJK**Oc@_TB(rTCg=y4Vz8mHJV?279yL;M{Dtk|(C#V^a1OS^q>Am3Ta> z#Om{RuGRXTQTvmZR;tIpYr+~l9l6ev^(KGRzabCks}-ig7o{FN`x)lT7nJB#cuVD{|+a4TlC=ag6H(gY(B`#Tt z(m11Kbmzofl?6NGnx>a5Rcf5^FuFq#?XI^kZNuEdIf!Wd6&9y$4*;P@!hyO(9Mz zD3xaAr`+3U?Iq)~Q1APeJM~&jYQ3j+N6E#(kH$56E{ctVFLSI=9xItrqf z;khOrws{35T)lz*90s8%+g9W{9|3)~-gD5TZiZ~&nxpfs7Dd}OR;sXVcg~{Brtm&X z9X~DO>XVKnsor6XbZYRDZ6hGaGWb>0-X-lo zXu5&_lnh^3FKJa~qzL`bI)>SW_p!>i~Idb+5tP<%iRDU%z4b4&g;0JHi z+uZ5a=q)Ji)DMa+8~N(vD$}+rXQ@?_tAO4QikvX{RIKVQl9hi}eD0K zBMf?g*;cC)s{zJkfO6mB_98u;qNMAzg*DPoqK?yhm>dJTpFTb2B_{ObxvYZx7b_Iy zB@sn1*@MZ2PlNyyW7V)CX!Y`1k*jDh92(B0gN@JQYc3C`$YUM7K;>kvdH2rc!`axz zr-0?<*-VS1OxQh=)`S+#U&#m7BCUe#|HaJ)B zgjC?K{pM#m)iu}W=j(GTE%Bez*GoYsmq0b7yuIzD8qjHRI?r=EF1X(O=k_G+^oK}% zqZ+Bjr*Mt&e6G61=WXMm)#nY>*cdjsnjHJ#Zs+FC>hbxe)dy~4-JlaTsXAnoH|NI9 z^$D@g2c^|VzQeo4M_#v6m~~Svu{wFQnQOG!BX*QGvU0H5n||%Uw|Qxwc(gnWDUjmQ zgRb3Y-m*~--_OoGQ`!c3P7(ddU_d_qwDI1J^Se|7!ya5wWp^VH?Ax1SZvQU|a-y@F zDBj8iS<$MyK}nAI?CCGhrdHe6r-(xdX*0$sGpm8Qo%aa0RxwKOcq^3i?( zhWY~IOQUoIUo8zB)_Tm2LZR;Y+~9ZKdFxoW9vU#E~ zfi^Uvb&79k70>BkbM__YFnAQvc?JU&10Cj}W$Bu?z*<;W2H#2u?dWeo*aY;xR0@HV z^v;3kwM`+H1YLREDoYkUy_)0P8UvQC0(4o%`8Lp@1?{I~-1#YUn~)2Ji{~aA(YFkli5=azfQ#!x zNkF8GL#&d8Dm2zpd7hg5vak^&6y6pFT-{-$@%%Uzr~PhxR_Yp99A(_ zp*vfxAHvEGtbVU@LK+VBSC-gx`o zj|3i03{D5J3Kk=fbP7TF_jf0_znBic$tf|?{4MhU$%h<}9|lInTm{mzi8f;Yj~b>2 z-e*1)#4!!o(&~ShS&_ppYuQJEhN(za&Y&`kn|?Xh!wsu|1lwg9JeIzi7qi=lg1&0s zTnu+`USWQp z91D0+HYKpi5LvGE3N?K1bL#cX9*J>DW8xe;5)5A4cNIE|`lzPQMa*|Cg2})omn+hu zKgCSeoU?Z>dqlf0q)XZ*0l1tq=-(ZR^ayD5w7&+pRj~2$N((q-i_uBD(a5d_rS6C7&~x|X-N~-23w03YN~Bie=dY|)0$POVYq#> z0b!c<{GW1bFablP&eRM4;zugOa!fw@Pam(zK7I_fh8MnV^9j^RSTPxEpQTTmn@}5{ zdwy=?x!i!-4wWWo1MHo*?xD|`v8F|Ye*d84Z_4`G5x86cQ4*mkoY`~h@ z<>0HUe5vaTVU(txo_K9j%|nMOt1)M_bf$NIey-DB;TgO#J9}H}f0^vP`*t69c%*w9 zw}*agUKh9ch*4OU>3$h#@lkKFX6ex>`Amiya{b~H+*WFcANBkb-Q($mc}o3qmu!By`;j5HPju5xc+#W>goHz?y}GG^P8mA*t-|#<(Zh8meJ5LAV<7J8|hQU!Jlyi#k655e=*U*Ez-ud*7R#fzUeRCOE2h$4?64z z>)+;x%DM*gPY)|a=+1i|EJTtWaemKY2~m;R*_K8qMD6<)&(fDgh4M!iQbUwKnJ{2<0_eEG45pJf*x`g2MqR{r(L z2&+LlZkM@dH~l_!>w3IJY3f-$9|_^ye$cgmT~PnF_~RU6up~lbp@iwLl{yM_gvNb| zq7SxA!3y|uTIl=|D*D{!!8YGVFwAmBwX4c4)<0WU7IiaGwF3``o(Hm<0Ml2zhy!O$ z^b1EcY_#pBs@*b$re@^0H>sj8n&{^anWhW`-ZP)r_vq`7{3z>>7&{tk3`RF|DVLA* zlU5bYO!2-`4^9Bh)=wf$d~cy1kKIiEojbVxmdLX>QA6kYvkE!(=>krh>AG&SdnMC3 zvO+|BW^dMMNC`G-GSYCj-{P#^mgtajWyvWOIsG{lPyVPVRFIcPF2u||gS-#*fx}HT zJDtf=1`IvB{Oz{31r=WjAsyo0oVg5i{8NF1)jagd!<2CtR{p%RHX8F3>f?!$u&pqk z%74TitIGW@xoL^FQAQT5_~9hFz^0m+TbFgQT;ixy>rkP@Lqwy&(jnjoZM1X#SdK!1 zZ~W(9*ja0#CBliYEPIP3LCrj7{;xDE z`U!yGR?63Z)J&~Q1z7X3`F9}A5n%*SbU12`!hN3?Dpz&@9{ZFyqF%qK)#s^Y)P|IR zB=#vaM7;sgQ9^43xJvUJP1J_8fCcs`Jw&}h(bE_UaYYFkU0RKjl6z3pqX!hU*u-TovocU1)SJ{$%fM(&YSPkMeny|7Q8V&%SuXN)W#O zd+ek;m!+Vb@M?I)+oZRNzEvGCto(D#!-dn8^tdd;w0t;2QLvSZzwSo4ZM<1#jxz(r zbKRI4pLpB=b+6_4Tts>?`qi2A_h#L?R$qMDU83RE(2N)?*zrc_eBGb#X za>n3li8SVx*eYBzwn19Mv4O6W=YcLB>p<#LSg3Ng0?V`u24p=YpLaM)^BxmLafD!1 z^4L!zLcdkWs3iQQ@hj5YJcA+b_R9XD`O@)9N~Y z{&~NBPa8w0ZqW5D{M4XoRXiX>kQZDD?E%olymQd<{WAVcHAjIuE_Em|5_<)BCqKPZ z1UWoRJZXb;DMKw|q)*c1h*hhi@aQ4bY8pY!<&f3WuX_kcydLoGy(l&sna;{SV^}~a zI`CG$pGf>cY9?A$G~9d8dVwT9H1SsXIh?a*H{VxH4M?z zt$cn1B^Fwrg_Ed`&jKFnPXN`8u0!nPjp`FKdHm#!^AmISpGlW;pCsk7Nl@)g&My%* z2BZL_M==6sq~w6rZuKogr}u5!I!ma@-SS(sj|4t&eu2-q*Chy*(p{p>&~JyV?K0tO z=vWAR+)bJV>ZUsDEjM0}d+`P|O0t9xxKW29`-*g7}@6X(m+6-=7x=#K46-F(FJ z_Z1q5%x&RlmVzRQ1|urj0v=?*n*GrVLNMMerXBvx$lRXFa=Mn2Z2l#CY#(U-UeExxyCm6+26I!)m#ms@7)l9wF(t& zLOlf(H*VmpLS^wNNN>MW+T)P0<6>>`G)=yhp%q9rPHs!EbKA+!>|9$st_lqE-Rc~6 zVx)OWpFaes_uUadWNJp5_kmfS@S$6nTWWvcmHiDrc8k^ECt2T@&AV|$(i6E~278om z_m|&T@Y@?U|NcwH2lz^H==)||2sJZ!71;1gXZVz;(XvqKZJZ*d%f=$5Uuha3)#(3J zL^1x}lfy{=a$*0#6=-8ZW(1dkveE+zwCfq)a;PD+M*txJ@R$C+TTDx&c-;^u0@Usg zHJH-d1}*SaA^1Jnea3y8J)3F;5rTA{@~$ zlvPSQFY1Wr2l-F{3WOcuZN1IVk;)iNZ*#ndV&z#kbF;!H^y7UE6e7 zhJq#Oa8>Cth~B>k}#n9pW~C1zF+?u4;>9#J+b2gpw(D%po`u)cc=qA%;I1!>{jmX~#OWUF9t43h#myMH-%O+qofo2V7QCUx60KA5W$B zVUFNvf8lQNdUgV^%)jEdmaiCFaLGi$o)?`YhQFI~n)gJWtG+Vk*f8d)suyt2;2}3X z&zss9$a~M*;Y(+V{*F`34erys$S>X2Su;)pF%3MCGxk@)7Bd5gQpfk~iRE9V!h%H|_>cuWuqTu{So&O<;QKCnGMjmL5uTbfBedmOOT3cXlOD6vTk7d%P`j%oI-NN} z6QL`?7|eE%YZt9Rt+()34-!_cnr2y6ybjB#nhZ9?uMC`t{RejLUV2^ zBKwLDzthzpO3Id|FYax^XF5{DrN_4xcoaw32Hvliq>R}F>8O|R;~)p$mNz~CRC=$~ zGJ7J6As!763W%X{hwoPk)UzQ5Cp8d>i<&A&wP@Q6Cy(7}k1Y7Lj zo}6f4f9t-xad!R`Mjjy~MN&s}X-R{-nm0gDIiUGwY)n(NrQGh)e)BF1cz~z*gv{fA z+JjdEM}{QR!{f>N$^zx27G0lWpNrJWFQ0xpiXzEU5m+w|dqU1E5j6pekEf4E=>|1~ zDxzd&CVl>%%V~DSV(^IHPtf*WmCG9+0zMiuI@+VPTwt?Aqm^d&i6yZAHb$hF+W(#b zbCjUo&J5KYdUYmhSAN;r;#8^=Sc~%&#Vpb)h&~Mst&2@Zoe1*#H1c}v{WOo)s}fDC z_gebn&TL_@lOtC<`%Ecs$tB=0VvdjrPxq^^#mSRxPndWVB|!{78)FXEUCVjnlTdds zk=;&IqvyGhdT&Xa(|H_P#6neihskx^ll&F%WQKR@>iXy2Jb2pnZgZ&??o{FqP6o}O z*%}Sf^>bt7G46Lujnj17-L)4AewAkV0_#+G-x~q)R@a!vNet1C5AkPOw+T@e9SJ>Y z_GuBfh{aOs%0^+M$nHKTW-}T5#Z2?IsVU{+r9K) zsmAS+#cR4dgU|AZg z$|bi4XfovF4eJy0Wzysguvh;Y=#%s?WaU*26*iZ^xZZ2bxVy;R=I*pn0-s2Tp`py# zI_{{UVf)y6xnjjS3f5uRp-41AdwXX+PNZSe#k{n-2Xlg}YYNU+j1Nzh`vp_1qgS^1 z-&*cpH!BB#)$p$9tNadjFOp;Nu3VJa&l3f9PTr{=6!X*&`}@rZr@^(Qw|J2u@WUWx zdx=l3wLN#_%xwM+;MN=p946RkDBB$`SrCI~@(+Q;k>-)<*f$vvd#eg9`xFMDH6@&) zY0f9Od3Kf109(S6=ztT#l7Ijr!jiB6C951uL}X4C6gWl8ocC~z98)-mwq`l>a9{#! zMmR;YoMY4>o{JZ2+=;pUaxC!({sKSbcP^RT)Ty3Fy_7;vF~Oh+u`c+#MbSBMbc zLQg4_qT4IE130dIcgCIpZ28osM6A4-7KrvC;G2;0OGHG?K_g53K42q+e)60E@+(OtH_%n}#i`+08;%|ie*VRi)ZZ_!!76i< zqVoDaKG0x~-L11VUwGP9jTU)!sxc)d#1F+**EI|7U{Q|vA4x+_GWYRQhGf1RMO9>@ zlo^q2cf1IeB5(QFnqbdxk5fU9Yuv@eR_+21Hy8NVw@DboUC)*>4IyybhUv#yUW?Mf zFGS;*W`&NUNhV{L*GKTy{aTI+%DFUpWxqR^r{~Cp5b~IcE|ir;&ffqTgihF|?dl2V ztyrHdYwBvJqbMMH-+rQs*AL+#3RL8IkR9eqt4Zq^VIF6rI=Jx&%b99EWFf`z36o8Q zC{&iHg)(=iT@H7g^}o2EV8!sCSQ0@%q$DTc3jWnCfy5Igm5EF=BNh3g;V;!$8nPBa z@h=^ESC^0B|5V*Vpa^3GU90DFT3Tkx_cU(gYzj>*#}Cv!oDqzi!$iNQm!E)mWQY&U znhA*x3QVIYJu0X!9+Ouo6UL@-vl0dd8g1m1~1@8N?;O zV{RR@rTJJU!De;lF>us>yz-R77pLv$U}3PtgCom6N-N#>FOH!ZAN$p7^U&J___JY%dkKV)TEBme7y7fc{z*OXJqQg{sC8bScG@h>bEkno`Rdk zHmBhN#KQ)?jO@6&&Nr!ytlh{WF++P9A&e$ZGC5IA>bh1GXKfz_6JZdt$Te+2V*#}5 zm;?IT32&E3TKZH?%YatO5^xZRhtS|ZZ-VXlLHuaifB4kyaFUj83oBQcmvmb1}C%*)KX5CE4n2@!3_YmpwlmjL)Ix9BvoJW>5R*Fim>I7&*_le^Qnv57x8(8~_+q>uo;%-k8RPy$xo~82 zckXZ+Y(C#|sk;eNA>fhRC@X7qF&6t%tK-Feu@UIf6&}^!tN*JhJR0PaB=^MZ2t`Nk zPz!q0HVIHaF$do0E(}=_#!c2~36BaqF`w?&+y8gU?MBy#EqfmgimIR{xA{hQ0~$2D z+^b(J5C;Aq-Xmkc3_N@B!9|(m#G-PA2Pj$OOrvrI2Mlnie1Ll*r0*6jMAaA&-AC2v z5luwZ0E^C}azzIWa8B6_zEVcxb%j>FK!8M_ByFfq`JaFSO}i&%5LNa*H}u)7UT+}E zypPHI(NDl%>x*e!hhiWmn#2NuPZwvWZjBJgKG#xv0^L`^{S7yLxg7JvEgkOY`B?Z> zUGgstny(P5T#)R?F|-np@80FDZWaPDPZlyf!`E6>A5(BLldP(WYRxBE%{0u|GMrj` z=B3eeZ^t@LEBB^7vrT)fdUA3PCHIGn<;{t+u?)^blEv5jdUJ>fTm_|+xz`a;Ka7m8 zota->@d`Rog2cFvZ<_bd^0v;NDH4^rc{)vpm>s5ouw5W$k%GjOu93Fr@mSIYQSr#(uqUbg6eBNo1Z)9HeGxp1Tgpg*((Cl2qYsAmkj=2bhNZ@;; z7}1+Y{(Vc6)(c*vwC}Xn5$(TEdXbFN6eQhZYvjfOgS&Lsj6N`cXcxwEK@cicJe0&g z&Zqm~7LhIq5lV}t#C+3Uz8MY5ymIe_oWGN8+w`M!mKDkf0yV1`PQ;IOsr#{B(+ln$ z=1upS0<7Dg{qs`*I9SgO!7-31Ox7JO;J1DKn{^MgsX~SL>iq$LW+ww28qs88^3z)X zprx|w&YwF`mAgOxC35WBj7`ux1GM#{gWWAxCiWgqNPS{*2Yiq=nY#2Zw_f14r~;(L z4Jk9?#mt^s`w^e>5#%uM??`5>oVcbWORV5q&>j)Yss1L5ii+~|X1r5FQ_IB=<&=n8 zP6CQs0m0i;$ZC+9FE$_j?n%fEJ$ zO65(81LKKa$~7S|3Nd*DEcFNjl?C)9f_|^n+0OvkiBwjek-198(4U{N-|i@>PNXc$ z@KZIDZ$TD%=O;HVCEgQ0+R5b-nE|A{b5dg=ZJ|~Y>-A0DEu3>w<`Sd`H1=rWykg|g zx}+V`DVgqQasXv|nn-}CFxS0=ctpH7A7cH!?W19sgZRER2ee8$056Benr0=)JqPaS z(=!5jn7Xsw8g7U)+Zu+mVCw$E2|uYX@`6lUU`)nDs%ozaXG|vH(eTOIo!g3*6kKByFutzy2PRevaI(&|g_h56Tw@Ec zMa3f#6RQ;%x8hNNsmdIzS<#Y)yI8ZMr)4l0?pU*vUeS_;%UiP}t+m!4p00b%qE%rI zZq{{1Ve0G)*Vnx^)LI(|U)6O+V!AK~8&;g4r9zDomOD<( zns!BecjCZ0fV3FL<|1d_Gw*ZTC?;1(^=FQnz!!i#W)Luz1KDn>Za8T5f9(5`wpq-q zm!_?j##>^pQo{@Z&68PyIrZY0{)&#KE&uJValWw}j=p=<{U$NV+pf+az>hxdJacR3 zAC0ciu1it;olf0%b=W;vsVKe)+a*$o)>_c*`|G50&B25DE2zia<}?W~E;@e9{=N?+ zA1^<4E#VP0zXBYJ0{}Bp5jPhOc%SAtccvdzU zO@@h*<`|jRO#gd_5QW|x#z}>MS6WH|%TUE=ZJi$j_gRpKSvOKh`L5TVvlu zss15715kE%L7BAxuWL=(t>h)B_}q4aw4)39zw9{JCO&-HiQNGGVqtfnk&cl42O+Gb zU0^{xBTz#g^JFp+Z6s+Xh{rK`C%6PO+ra0u9VvJ4TPq(~bS(D~n@yH$rGGKtx(~7# zAVVH8Ch^aEy}b%&p}$aw=%t;_o2|HyD9^;}u!oh3Dway6wNdT0*Go79s;wVU8h%6O zDg!5umAJEKrT(s-b)6@5C_T_y@?S!;IF9)}MU|31_1EBa)SLaQ2` zvq*V?O9x>fW^+4p!LtgNmDM&14SGF@rxS2wc`HRh$^>Vb2uI9kYj_cZX6_B!>W2`{ zQc9T?=7r|nUhxjRGKLh$HNq9gkcn$8CpyDt+^Ql;o1c$O*B$=qVreaz?oPygtSJ|c zXnceKe*Zu>LT|dkb<;j;A10~&T&%|1Xr82>?kxZl#`~O~wGyRE%5xDN3E}JIMrYj6 zOr<+h$6QnGQha?SaA%d#nIxk-l!;CKv>H&hx}$6_!C!{%L)dc>LaH4@4p386U}XN_ z2{?wSaVLbg<<3aXRa;n#+;3lae(J=W>}R@C+M%NR1KA_uNMxpMUx#qa)#WF$b#M;l zq^0ohKl5fB$zL+@!xp87g$k#m+4w&(VF&o~=o-a^rqtKQvvnk&VF@Qpwv+lE7pEF( z;7(iVBN_jUUgrLws^9)Nb8D{M{V1GhnP~aVZ=-InK<343^=$d^<2!w3uj5$wjo7Z5 ztN^7Od`kmz__h)9$aEH@HXWllr_)Pj5PeSJhkt*%*f%)H`J^DdDW+6TbtGw7;vauu zk28*&VrHm-27wPJQX8d4dxj@cN*Zh~aX(|@=OZ%mjP}++2d^Lq*#9T23fnu|4>?Ki zPH03sP)oF7?ih2DU{AP3S&-(CMLW<-68-fMO6L9b;7S_(^^i(3`ygsL{Z6S@G*{+&l1QFQJl?sayT!J%x7$fnXS5 zoH+!z#obkrR~xKl)iu7g@9xmn>^8OhaIFD@vGJSvqjUIu@Oj|`(KE0~{ddC#hwSy8 z)~*RY*X-^B4c)p#6TQCIQl4CX1YOY&vC@0yGwB)14ivLP^5!9nq+Q!3nlj_!W60a~ zoXfvxy7>OEc5&urI1I-Pr^Gx2?5@OZ+>~P}=%sQ@BT0-<=VKo`y3TiZ*Y>(vA?Tqr z9%_*WH1)a${?^OMe4UU?Tz#)O5hv^+v)x+1<=V_^(JSH+@>~u$RvMWT-%+lX;V&z7 z4BekdxvQ|AhCV}=My}DG&K>0-%_5-Oe+yI;i!@%- zUy_VE72WJu@_f~Hp0z6&an8Bn(6p0ZK1Nypr&F#`$qQH3OsF#Awl~H#eJy+a?8%x`S)7b`OKHJ(lLBu zLy2LkNk2?+jDhCas`)<{jWWggC{vY3VhuQzGRE7qE#*AFv(iFdcI2-K&Z)km`Mnb{ zPDE=#I#y<-*d1c7`*l_-wu$&*QQU%m?J>HyC;X(57Duk<#d$fOd5>D8nzj)4sWpoa28y? z1r1@JmYrTHei!WIHnjgfIbip7TQP@vkNFB5Tj{8@iP~y`IoQT)a3Sr@ndJ2fe8E%i6>_f;t3B(g*lUo!Gj z$5?W&irJPVMOV6)@*MXIAW}iww4AjJi0}ZBR_!(b{*p88MMQ=8nuWJDwCe&UmqSp? zBu^s%ti$qUEde482!oZOvC9WgHP@>uGR#$6T(AjILDGnn&Y@GK8E8Qw3#Wr}x{Vf%q-1fr+DrQ$6P|s?%saiVAzRAqIOYQvE z#oyXeWObPj^OqlBUvd#G`RDpFB7{_@w3A=Ep{n5YMU zXGKWy(fRHo37a;b)cIL$UZw(OB)CZ<{>FSQI2VTa`fq7nrX4vRD3Fw^2q|y$c zO?Ly3eybXe63Oz2&5+USki@6rCth;y$kKWESsh8$yb1-W&XOjB$3ShM)^3>d9*@iv zNvCsvH~Kwr$vs2Hn=1l}%NOEaSQ1c9;=TSnuv`@A!X%717#$Jg+yJMNfDvQ%UCjBv znX2crBNWppwX%FggYWNoFjd3*N%3TdcI1K-XDDYzyvdKOk{@S;XQt=>Yi%dE2sr-D-?}I z7D*^aSr@W}^-MYWeLcyqf)$^#*xa@K4kA6-{LX#plT`?sP?e2mk%=9ev-jaf&Y>gL zS?Q-(bG;88rd65BFqQo(J=W`-Q(=%h0VgY+wdn&;nh_^%kXvpws&yTl;1LZcJkPgp zW@~T%(qwwfg1r)6F=j(NHMb~;fc2PGN`1LBufi)`|yi)KZ#@ zl9LSdL@Ds_kB5bKJ@SnS1JtDWv*P72J^wnn6^ET$T557ClvQnzRtVAz39?(!M+D0& zN^+Q&8t~uLbNFp!(q-gykAH)@Zg!&WxGKGxJtGLYOq_H##eRIwI4)+}9h%)?Gn+!| z%MZ&^rIZ02N92LohT{;mg@w)6P26Vv7|@3G zqeJc6LVF@0NIiR{xpn~ceBytl|EDH^hiu+9v8po^F<<^sqj#wD7Z*SVt>Fq&39V1Qu-Xs37e8+cd&t(Nsb__h}5m&N>LfL-5YE$!{_ zt0hp1yQm+yGycaZ5tqIS{X^>jh1ewUMyO|;d;=<;VC4Ec`ba_t#c1M()jz@|0C{E% zjZS%&q$}2a&9dS4vAxa0jLePhm~_oQW&4~eH{+tiY8!XMFmyxa!_Qs$imZ5NIzV>f zWyLr>8ijH=DTR7G&n^rh0ni*0?7hW#&Hd=`Dzp(GLKh{AKNDggJrMs?5a+Yy=HbX^ zJ2?HZB3YzdNT>R0t!{}uVE6ao1iHZ|?G&0UZ)<3@fiMPWPKC@3=l@leqSlP4!8MS~ zUP5DHh{Q{x&DQ@u@Pb`XFQ7txh|-#4PldEqh~W|tUNfI`l%uVm*Pb%z5_sVdhW@o# zQah-EM+WiBD%SckG#1h%iDaRl2ldrHTPFld=h97aG+@64#q?14@N^<854c{Zd-6hJ z3t~UA-qS6U-VVrJ5p196pdl2}K#JjS-{X_@ zipcn}=Kje>E2IC%0EojdzG6M$6WZp#APG}7qZ~s5Zc({SApx%Y4=2!LXlUpS4xjqD zi|1=TkTty_qd09mop^-VfN94E2jCh9)9oO55<{YXe0th*;YbydX=-1FkV@)rp-Bzi zT@_}ZZ#^?sZ!Mtz;yhxl859V`g=O&_*tVHESI8vkQ4 ziJtWPb<}*hB5?lsw%}>BOFYRm-LSx$E99+uR81Ahi}*LFb)P1z36fU$w`W?|!YTp% zY&F@vDbaHNu>CZ>&U|eiU-NF|?!SXYYR0=@Wu?o+Er&n-@ag9eO=~WgD#~6!&VLpZLf%M{fc{_t}^edYU>6%?&2#zC};#| zv%P^{MauA>;(x}9l;b}^Bc5H*Q94vWM>2ts&DDG{U^54JPy@0v0Jg|WU{w}m3#ewP zUISXwYkg$4t`poblONsH)6Gl$YUR& z`o4^Vwsd_9Sn^eDvkN0_Mq6#sc;Z6>e^9;+?e7`gkSrg&g+R4#k)mFhaKJY8PL9KT zv?3-fR^QSs5Uyn`gEn$EDVaLNb-9l~+ATFzg=B444<#v3w`xIlX5)k9J0;WfK zcJ{9+xFL@Q%=@%-*eJo%d2Cz?xh}=*jc5TG3?3iiEjOmU#l7R$G6F|a1S987Pg6eA zdYq!9)(-rdNBvv*0-VXDpT+^o zqv7S18f*Mnr7djroQEw%I}@K(oiXawoDV(ocRJ^wF9&)S5tr8x$I!w8z{f(T2k&Ds z85pc{Q`VHz-FGcL9o%=x>LzL5cRh?5F;&cdNpeZN|)) z#LUc&nVDi{J7$KMnHl1knc0q+nQ6^-%*-(}GtTXM`hJ~GC*A3!J88G8Yf3x4Jv&uh zU0YKRLeo4R$>h^hS4Lp=PE_pqEV2#up)Tm-Z!h1_Pt43~Tb4GR+-qA7$@6UspUaH( znyIH|gfSzm(orDnNo^hT(H*=MV7=zTp#SDBsN$nbG*XD%G~;-OaAJ-jXGwJPf-#XB`8VM@(FyC|CGEH zNt9++8jX6Q<|#}~IPVR%GkKegJ(_U$`eM*iWikyXw*mxnnIF;lbXz&L?z6{`e%`9XC^0u zOeMy|D$EZkbPxLX##_b4!{yi=kr9Mt`e%VpPq`I@^G7{G60o1p-`_ZeH&9FC1Mpx< zX9DQp=5d5KAWG{3@Zd_X12R69@6WAR}JK>r}`M0i}24n(dxZM9Plg$(gb-DjN#vp+TDEvqtTN;hD12e8SZ}7S* zZWN`c0!>7iu1I<+MKRoiOkj}SM7R3te>WFLRnW?F7WFvlw%dcGT`WOAF zl3c~4K9>F!=ffJV7MH%q4lbTab~sg zgE#r*$j6IQPntP@X*%=R+-jQej(HmIiF!j(sBnvAh_{}pk{EwePKiGj3#DziCMEe(x#T+*>=5?=IZj>j0CI%{{++sx3|Xn@__)!|Tx@FpBzA&~tf=++hsyd>rPwRUi9xfaooD}p zRpxscG(fRx!%$Jiz$}}7A4oS5_=ea)<2s0pugUIhIB)V?aH?x(=+b=OTT1P#%d+6s z67U5z%Il9V3**B}uAT3@_v{d$Zl$?I+xa1Y^=6>HxYQ%X0%(Ru(`Wd<>sgvkI$zD&)Zr5XI=Dwoe)sj$bvE^xkCf)bC@*vAzv#J;IS1-Y{|NA7pu#tqMZ zSfuo~*9qF7xH7%=m9aZ6l^X0LEehBC)+10{IQWolFRmQo@@%wR#?!! z5$-u^24ind5^JOfMz-sG4Vekc2z_)Bi9M%AKxZF#QVT;?ajAIN zL7mI3ID4z;5N%XR5KdZ09&r_-=fc&qDrrO_2~10T6jUL)RAIft`f}gut7H| zYJ}xIjDr5daez51vF+7de8i=XGo{vtlF+;dX$g3%-1$&YlaSDt>UUM}iA>FDbYIy- zw^wUWL#_Q4z)W(!!?_|#sPz^h_=9`XHcTIvhvbm}pI_w5Hj;z$kjTAxJ`>we1s4*v zoFv!1`F7>sqk>I_tQXvslL^p$@{E3$R_kxJ7*+e`R47 zuV+4U9jwy$Gao>|(MOHIl_P`AbX%^`R+}PP?A&~aNn6>rBW8W1tGzd@Red9?i%h!9 zKwx_c_k3a&QEu2I-~DrPl%rz)>RY>8)~VJjDg`#H)x$@bvxQTWqg zx)oM8`n5sSq8Ekf_NF*_h0SBfw|UAr4yBu5ogTHxKeU*Tt0mz#kPlNX@=3)QM-cna zX;dk~JX^)WSlr*{)EVTBcaR$yc%%p|bFo?BwTbeDDJ*mGZxFQSe@prEtbU+b-Z9pH z7L1uh@vsazfS$}_+(~3sCJUc;?~WQ%FvclwKT?caK?@O zm3o`(LZV1UkDWI^vNeJ7us~M_+i?Yq$i%cthw^bToimM^;AYBQMs7WVb;ET7GZFOB z%g~-;SFAV_`vdO4tYL+6nrV4-led6=bw`8tDg``|*;MUyDv9a}Uo14pc>cdTBE8PP zwbt!+O9vQaCs`s^4nqfwQ>19FB3BN7v70z$SmoIM1)=aCr`aaZJf?*XOCYi$aUsZ= zYQRW}vhv`&5iqB#=ks{6u4Tm){XJQRu4i5AjBAkF{57^vlT6GtWk@AN5;*dgQ#xsi z!ROt5VbO9G*0$t<%E)rK4N`ts3Jk{I2IF$skbB1_`>zL%)SDh_6d0*7iLZ2utzt65|X8lgkChC#Lpb+?8I3w76rBJsBR;C_84-pxJj&CY@I!nXxZ z>Al}$F?t`Dh_C4ZF4sI?C=n0kaC3vDh7N11RSh#ZzM1+DuHyFE1YfGo}BG-?Y#9&tU?zKymM8d4{=+@jm&b@Oa}` zduAv3rN7*==gP=FS?{m3FVt>BBch8+XmsN2jM88ES=sCJLGyJa#)jQtK=Nl;lL6do ziRb55bVZED=O7Jc%M!%ZpFwWzdD*0vNYLk8LCs3jlV2JepwDeYbSNyr>CMI>e45iK z@T)2!I#ib9Ft(w2+0>TwFy}rZ9m3NZ2&+~iI^>opL2mhZRkmi%w)1{0nbwiffFpm+ z<{r|C{D)rGDE308k95~)>O$sQm{($r_!^)Iu0-3?FV)`c3I$cz&}d~-rLNPsIEy{Z zOBVi+!JpNH>sZOTGKkj<1r<8lLC2_E)t~69uIq5hY_~eL^|ZnEZOr(?puXiM2Bl4 zajDUFmFcNfrbFjdjZdyU0dj|WeAJaf{2>l4ze^|pOGQXea;e|fkV{~I=Cq%xPIU#b zIR|Ei$nD!GJ$EL`VdNanmHiD0ak(9@8>ytg1s4)p)ydV613X09($sW@wwMn4<5FH!FqhFn?N8IyWub^E&&^_C#8fM z+F*;s&Q=il7^n1|G$nKSaUf+4>~$Ns`M9PO`UhEuN03>CNLT?otk=xLp&o1!xlrf0 z@UL}^v!>X}VV%6@mvW34IDouUzAd&!5l{XitUs?T%Hf0I`yoWA2i&@}*Gw2RR-Jyq zG49%9Z237~I8fvEQxmOY%}X`h)cxL^31X*Vm&i5voY?gkm*+fZnz~F2NTerZoj^qX zk0r|mHZXZ9IZpkZ!0F%Grf;#kwD(lG;0*>YIBg88_+WGu00i*6GgJYW zUydvu{|<8&%<8m_zi7lzS}n2}bpOqsiaC9KY&w0-%*d5_PcS)5{lerNJI-{FbtX)F zn!HmC+o`f-O6?+Vl~yRf5`O9*TXo&DDV=rj6Bhty{ic@T0Q9v4z-e-b^DOH}33wAy zJ_H~#3;OodR&~ANc{U@Pyd)Ir1;&znPiEu^6E%9;GXf-${ z-}%_eiymcm!$oNBhr7mzIT$aVsyVw0g!LJv+P1v|LSLb%##B?Zb%>ifWHpbRJB+T9KTVmeA!95m@ zP~zlWBO!(LaE4Zq(L>G462(|EmZ~~7(Pi&!8P<_iDVO-xksN8O#)YBH%b_=2Cbo4= zqB?(dF5Mn5$9DEh%Cda-dL&-3xDEZCwB>~=#a2s&k4YasxoO*>;!K#J;|SV z`1H-v0<54ou;+IfWA=!_ZZT2x7+!WEK3i#r>yDHM0*CRJgtxlYqt0!Up~dwMb(50~ zpi98*r!z=%`EptR0lgz=!bnVuYD3X|Mh9HB6;)51dfMiO$1`DFI3>~XPvk?}Lr^pA zHDyQe?$g7>_49Zn{fY0#>g?D_K>`!%_u49p;_PtUA?tJ%mUePKh^_TY(I?r8 z2Uol*+ML%sjJ6DNJpXFJ9Jw$@YPTGeN>N4 zFL>9zyxg?|blJs>n{iwo_qOgaAn5NZzl*EAQy#?XLvgQU;>C5DFCFKFjm-lpVv41T zp};Tx3C1TakZLuJwzHCJ{V}(?)!XG2Ap3*BF;K{Dv7;J#%^S|FU54^!zjUP4`hH!1 z&0c z@gTltQ(b0J$FVuCXLco@Qwr~9!k~WJ^IEys3o8a!Pr^Xm6lXY^)%tZYL(n*5HIE}f z9L#K6Xc2WxaJ?`uR}19ebvJ|QgsuMX9gpGiX`Jtm&0wEUxZS-fCK~OJ_Y`N%50VW( zEt2ex&5D+I?4@xO!sZ5f%%9}V$*G{o8o~^ow#kx~RN{C|9DA1$>+x|kzLT3(5Qde& zc)7T7|08sTN&ka=*wwv3sc%`|R!tCunxPN_Mx%;ICYhyK5U2X|7>sR3o;tjCQJy-& zs*6YkRwJHBCaGmp(7|W+p1cKwRXLGNO3MZq+nBtGuZ^BTZcg;MCv`(5t4_lJF*rg) zdQa6-!S!70l^9#f^(=HEf1zZ56FYMaXo9Z&nfs-XmYJ;KksI-+Tgsz(*gL=E$renHJhebj;Ow@bMYDIIknl}!34So^)j)8w z#2cvGbHU1OCgOy^8Y)sV#?*wDCo(=`GKptGe=B(HlQQR~6>DVm3|&rBGU; zip;@G&|0nprI1@PiSQ{;x5H~|ittHKwUX!JTAv@orJL zo3AGx!o1*iM6;CKAV0<@^#4Bwv>}Dm0&rR0c{+XeA)v%>+$Pk@D5+~pS$Kz5tZd_K z8`0D@P*YLSIk_#fDK&eOT2GK8Jj&YGI1p$@Re8B^VLFe zfxkJi_^O_?xDbNxe09kjsyFT{|2axV?18b&uFn5Un95@+n0lcl7GMc6M#Bq*AsN&lGK;%5fCLE5C+S0zc2oyD< zWeXo#>l|yh3u3~!1Yj(pXg@WqSTzTp2e|n%AdY-d?o+hozT^z$gij=&WGwbTVxsbI zpgrlcj__(7PpbPSb)aiS_gRSNK-auJq5%v&NL5jM{Oz!ybp$c$hFhoGo?&b^s}=KB znJ9AKdpPD%S2ZbY$+M!2VVxrN7VJjGJ8e=u+MMBBMy+ATUZXyD*O{#2Xl}f**s&6d z&C>}X2ujrm9ZHTINq8(6?7ly73LjKMJ}_qB5s&p$r;TS0yUb{lW44xUJEPkz6F zhjKK70k4maW`%M&<4YE4W1yOtt5N^Rqy|o(_uM}M)qPun=Ww%u$Uz^#@gAlV--@(8 z^_CL#M4{>tq!$cIuPeZLcM(=^)f}}kL?r9Z&^xmurphz$mC9M(BDWS~nsa=%tC9AX zC3&k8^oOZh+~eVS|8;1xJN-WkA(w2o`(NjV8Rzbuh_MsnLxD7dyUZ&o`RBVMy&ZiD zp|AeYeK?VK=dhaZMRLa~4G`5gQsj+vJ z*0=xF;tfz=`$I>|O#g_j&RcS4w$C|A7N!kKPE!2LqZJ`@ll2*nCD$y-xQENV9?t3J zkeB-2yeI{Moa-LJjh3tkcPT7ctN6FiF2R=5A#kB-?^NNHh*rvlt7bn7-cr%cJa04b}6#GuSrE8f(L`G3yLs9IBaSw)L0R>dEcabOBG zNfwkWe!rW?3(wIe|6dASr`O=SqG#7|x}xXS6udgJHmQ!zukV^8H|g%0GdCZm*C@K= zXV$*namw4X-Eqp=JKr^@ZdU(ksW`GF?h**x%=vB)27xyyZlRuA(Z}7(iR9_GDVN8~Bm-`g zb0TklS$Cj$JH6WXY;`h2mg}T_J4ts161Ci*TPDA?7@?52Jl-eyf3j=m95ZkJB~EW@AK(38{IUE6Qf>`I z2&{&j-bvb_HzM`LbIU$@tV0<=kD&ZUiYPpdp?Sh#+A)&&m+d=@j9pNp;a z<`aG%ew5>}pJyVSWmIdi-xm9-MpkCI`Be=fYVq}Gl%_WMZ)4t9suqH)o-JjR)-N7! z1WYbAF_pJ7J|q8vZGjHYCR^G8F3YDFe@1m_FLm(BcT`LO*p5fIAKGuKGuFndlfhPP zoOF3jeaE!K@)El;t%=9NZ`OxD$1G##gl(9|QX?uQ7SbE;LD_IBxyhXe4aSMNT>~!> zT=E2_8rT_eWqhk!LbKmQ4=zKk!?@5mzz~sLo5>nVy#}4mboah^(>}Qoh=UG_O2#b3 zEZrrYX9~=P@*kd-bqY1f*W&#Lfqi|j>vEk3xcC%zYrpaTeP@SS>ShM)En;sFA82Y! zV{hod#60!}4@}HrZ+LA#dZM3zkF*eotVZk=RogZWGUrD4)m8kO65Y!wqHP-w3vNm zUq11sHEcS>LGggzWcMBaoh1$o3kC?a2{Taq6Jmk@91)&kWqbW~AwPC8uZU9vfL7?Y zVaoqa(Fc+6Fys-^rx&t-7^vygPhVh_-~z}#trGW41i10};U5E$t+xCv(H-I50UeRv zLEbUm(XWJ$7W_nihj#l^1npwru&cy3aE{3^@d*zh6NUjwK+{yUoE=C{C`0txOTw|XmK5Br8e$X zZq4Kx1(@pDLO3p}mLRx7>;7^sCn(=cjN1JIdgeSv_X~2~{PG14<@cVvmQfa8S$~<0 zwy$5x*P$scMeKvm+{9=WQA>L2S-)=YwdU^JC%%?!`*ba`ze~&w{^SPNibmy{Yh2>5 zqd_?2{rRg_SYE}r(X%9(VkfI4SiCFHS{BoB(l4%*>v}IiJd4e~QAd6r&r{M7Z<4Fr z-!vir!e5?bM)i@p{c^>ME0L+hyPtgY!tPDXq}{H_yXoFy@q5+M^u|d_iP!H%>tj3D zaj_16Oj&=3Xn+4q z*=}JEI1T@}6ntZAV`A9I0iy+28O^T9wxG31JEcfIr|zv17U{^k&a?l($)7z>i*~6P zj`hsshl*f6usj2<#BQ*$z7n0Ptcq-FM8 zwG>(N@d+EOa^qZWlAy9>f?x_Bwck@f)wGLj4 zElH?5vXOAtF{UtQ{z4A;ebHFS9G8KrJ+>8WJg=9CB{R_#7MA#$k+R>4h6IS_9k%T) ztk6F$a0Utex37vF`9oqJYp$E%d!OWF2Xz#+% zsOxn)?YpL-<14crJFB)DQM7ip$6Dzmg|w;>At4@|%`ZvaAX<*@Ly_nW9K5Cl3|gHS zn~>Yg2O-jN4rfKDr!5_yIQw1ax0Sc(x5T%#@1hOU+m`88$M~Y3E%E8{yk|Zi2~Eo$ zq1<)%A~b=FL^IK`+toWZPeE{l{*^;;ct887rUNs`Huw~e>L*OpX9RcD;w4mH#qjV8 z*kj9GeA8gN0(kN^A0SGukkx#>d#vS)u^vTA+#86B@8hiX4ve%riV>S=;xim$%aIjp zM#4HiFX%>3S3(kQ+vrPISH9R3*DA^X76(25_=1fl^;+(^&>g5My<6dA#qb#!W34kG z%0*pKo#V<&rdmoq(|Av&X3U~~+ok#C)52t+>bJBBv+{b_8-_{D({K$WN!WxqSF!ObAKF5`wpO1NRMn-s%#d`5Z(Jb4ATE!SuyUDQ+U3S!xzo~TZW!}7h0jIL; zk^G+qo~(zu7j3cQkNEAG>!0f7RbpXe{h7apN?_2?gTALX>%IR(HvC1PSx{AGd3$(u z&hC_HE2!HVh(tFd&Pz;0Ol_Ou*C;jP zLzh0uc{AWtL^GPBu&{SMvvu=qKvtU_+3Usxxz+}6bNK&^`FF;Kk>yJj)G#IP@Q@Ba zDfqc>#e$6cRSw!BH~fDp+zDv@=t&c+xoUCtUO&-1;84~)D$!mo;?&mebdo-(Kf|tf z_hi_Jl1#31u~z=dHA&B2DB~>9QCgdF^2W7x^wuOQckEQcr8lNG+q}&9vu;@^h|*t( zUMFgnVr3napUF!j131J#Q_h(p+J`w)_Dd8PLs}_(!}3njSuT9zJO-M4 z@P}KB!U4<=kq-{F$QTjp>A@q2JN#|KZFo}pEc$gS{+<%4kgkUpACh?#G5Xel9z7g* zN&&V^BZpY{5X_vmCd<|$2%@v#9VWyOR-$KNoAoIeQI^;@?cch@xJ}>NZlUrOVxzoz zbsv}D9Gy4ln|@8XQh$jq;NwEKf_jb!I!-Zki7Gp#E-Bx97a2w3tEj<-7S&_Y3dC9~ z)UIIl-pU4g#)$TXz-}_9chVu4FnK2#n8el(Yp;?qA z1ecMO{8NqJ)j>K?j5kqsu6iguP)Uj?ZL@nQMzu{RK3Vo`8sE!ti zPi!ye;dPc$6mzq8A+@0uivf$p!>)#g@4X&#iFkSFY?5=Tcyai+eZ6z7K@&0*<*c@m zc*T5}wqpn#tvrKe&o1metQ#(vOc?ZDDL+pJvumoklhqc&8pih^)@iR=Y=G2ah*Cu1 zg-@6eU!avx0<0h?AS`(U%s*LD1(<#c{p124aPo;ANw@)m9ZvZE6Ym#cXNdVvd6J(v zAWCtCZ$C8(wFg1SmmeX*ArU*=wh=-;np}8Zn0%mr{16QD{&;TP+Uf(M{8IraUYvzO zm?O(Zf-3Q;LO&N+Ud_|%^^GHzJDof4^)0h}i4k})5Y{%;w%<1HHizAC&Pko={Ds25 zA`ylJ`QpQ_6416f>>JZcOpyz-KzYBz4C=4na}6mWB^4e8Y`I!F;|XO7*+xNgqkn$_ zy7!IJ573mXiE9=tc0o<1>IM7ZMRTJrf-`u>BW5o_1rt!16(l$mbGi3{n3JZ#3#Ni~ z#Z(;jPKgKe+BYOe zW9XIAE-6AyLe5#7VQ zZ^AA89M!{MtjZ8i4TQcZmk1W!f=chi1) znH+QL@BYqB#^S^YZt?w74@mk>>YMooEB~v|kkC|5v`6Qr5Tq+2c0uBd=8V~q z#vS<`;)@y%#>Ei*3-y)N2jgk3ZR{YoV9gqNJKt57xDQumE~uFVxLLzcVR;TJe`TnI<=})Ta9WhD%3~}ADqr%JG&|b@P87+KHS1561VbX5 z9Ot2>tb;GNx{mS}#owG$e?4a+;1ps@go|yoX72>DyyD|m34gZ#_%Tco#uBt-twFI)eVO31}sJ2zqGi#K05|f*Hy9m~cvRAOk&=mIiEnC9Q#_fA?{ zE?lo31s)Tgh!uBpyLLgMb~UMS6{Eazp=}j!@Xq@@{T_(U#c?_YBMVL}G6_Fur5lgX zlF^-OTuP8F(-g;&hFWWDCMl-xL>Eavq@+cP8{0s{wqx6P#EmROmwK=M3OB3$`NLx- zZwU4dK!|zao4;tLWkAtFdZj>%L&4GqvA~@UB`5$N1eueMVf9w?h#IGT$XM6u*YuZK)SIi^wmW#cj;STsC1}sgsS5#)6 zN;Jo1494#z<0nL6S(DhW5cZphY2M;c@nho zPeM91YLAs&A0zJ;TQLLzo0H#RfB8MXirDKaeqDo+`(5>XizBeHKUZ?w3DHY0$G>R zyzM;4I-s7httkKEti0jwwJ}vioPH>YY3*&gh(Y18IMU3h5hVMKRa5m$%e-RBtkA!2 zWT}3J>f=!U4Va_s~Gl|hf-u)42oRLjU2iQ81_dJ4HCccnL zRZc!mbSrRH{NdtB)%@nq7g5}XsX61ngX?Qcxd|ai?sG=RLSfUpbeW&j7F)!xu+a_1>-XVt8>?QK4Ee4v*t#6+AN}&leu2H|+%wTR6 zg~J|)nRmir-e+CnPfUh6Vw0eX)_N;INR=-GuzmcNm;?rlt*y`%F);B!}m=CH=SP-B6*#u;DZGa!Q6HPI6Q z4pdtgT%_oRGvqy&6k(1wzbQ}a#q9SI(FpGLwP|%PbuI>OwDCIcRCH0wPQhvY$wpJr zj=GP+ek!6i8WSM?W0p>D)XQ4-kP^kGELWpkEbiGCO=F%omJmnKHdu*T4FKt906_bZ zUWu(g>iY6yRDEo~wfj)U4lS(}e7}5$aAc;;sL}ez zBe>6=;re5AoIEJJZe0uFbV3?mgbKp&0LT}zaSgxQ5Ni5n*4cY=hI@_`2$xw6=Id4n zx0SNZ9CR-R`I1-ooC5z#Y3s&-S1@?!G4cbA)Jh?NNvu(_v<`veH_R9VP|Y^;{^hQL1YG`LDRy*z#kAOw*WTp`6Pa!f|M{7&CqQ=1+gk8yveSlk)aR~# zGXo6`DI~^uT&`PhLJI5B!n)dpszL&njVxi|ZF8s9CRg>f?0NY=9p%BdaIsehPTAMZ zh9|^CU5uhg0=WVgiO*eqwE7LssgP()& z`6AJtTTV8Hk@g2F9YUOS9a7PP3ITdQjQQ`)ydp2yX)o>N z-8HXU3+e`%zFV3ne$%)i)kYh_Cg!)h1*ei&tqMlTmQi7l;SMuRC$B;jga8uqr_aLB zjX_&9UA;(#LT5-)pyMlc52{X;V+1$Q`$#xdf%be5lQ`iKOXKiG%T*XbKO%qOYk!KX z4A7C|LY*uiakbiN!VTEtbo)M4uhatc`k{6||D zBT+S)#ECW1E;%AUwN}I=ia6#d9>;7H+3EN$62FPO#0h@VshVcK)$1dX_P^`6mD_~l z$7!9`kn}@(8}ox_q{DV3ez6J9lbhvUQkb0WgQz=9?QIpj9=WG3vy@KH(EtL4(h6m+ zbS+NUy^v;=$KzJWDOz!jV7xj~Je2vc1Qes9RD>ckG=EQrK#R0CLwRwdYg|U^i8o=b zKnuwDhB8kHS^3)ojw%R$m zKt^tH%IUbN(D=w?rQSz!{P|LSu8C=?^~w}mJ$>UD@X9g_&{G!dCu7ds$b?&Z7Kt}@ zs*q{x(_%2zB>hg&lo222!!!D484_rRZPc6Z2QGL%0c@Ep>7)lq%58Cs+PxvML0Jp$b(Iy^I@h1*woV%2~^ z!79LC_;%M=SfzN9WE_Sjq-k)_R%{~5HR722^xy}(AD)mZb`IynKa+ts_nC6#INHbZ zWY1U%Js6`gApfldFDNNe%1lf_?f2=9_+Y){m|@ttzltiugV3FqXuQ@`sGQ(=C=~9^ zI}i+Y0l}A?o8!`ma>5<9T2gY!iLPm{`7VTcOI;BnsEl?Rp22kT?ZpL;uPguYn48a{ z{pnDMvIa!+5iWVwzJELhk?@OP^BP>XOX5Y^QzDOJ;w2b^jfo`7@Z zA;9hu;9^%FG=OHc1)#az z>j2DrN%_?Y_NBK7=hK?bu1C+vt^|bbMx_=1@K0=>K5=Km;hv;^YANCi&K41%JG5rg z2ami19+|U0Fv{`GorlPQ#=ipsayI~3yU*>4W*IKq0Z|v4IncdN?+TwCc0w3wT5-nh zj{5aHKrRI(>FJjW$n+T$fkw-bQORgY`uR`m=*}-(O_2t(6JulEYi+Q>PFt3Rn zD0hVZ$t*@6E9gtC>b}Vl- zrgqSNns4Drs1~t>K_et@u`KUy6*MsQVgesw@`U_&0;8SXI{v|(QTSQ`*y?)7;yWx5zEbs z{$gtr8|^W1f?Rj;r#uajBNfrg_^5XXy^zR6u~C9q85E|~rRv#l^G{lQmHzXP-z8l$ z@V`S_gc>&mkq`9$Q1Gb49$vUFavhduG^?W58Jo1S(`$EHdHMS5$2G%V z{k)tvVwG)}&7j|+*9#fi`o~8&U*`?;%tcAEWXR0&qO-3!X;fUzfsyXAzs3ibhqXHEridMc zU=a^n4-w;)sXnEyVr$5VCncZSAlvUVsxjT3e-tq9YoO;D+%)L%k%xPT|h zcvYr{6G@A`KNu9{v`XeV<1!~uioq~eKfUYh^)Dje_~XvwYac__uPC{+h!bOW?Quk@ zeFt`QcZEs8+cR90$BMi01;q-ZfC`g3aXkif#PLb`d5^V4%wrD6!{irA^mHeZleha% z?7HI-i_oTr=1?mne5qyEO|GoCh|t0E@jtSiis2Upe)4G1imF-7Y|C0m z7DDh4c7odMa55yvr^~Aru4kR_F&p~p&vfTLKLFpIZ0vq65uu)E+ifkwcyoVS#?1mh ziUK|;W;mb8J+r+8(K^k-Ey;XVdA^K;b1yk*Yl24qjV?Ib@h$i4Y4Upa_lJ>SR2_PR z5LxLv^gWA+uc%Tk<~&5uOH`g9b!jm4J&eeEVje2Sd@A()R}o)%r7iUN7U+9I5nua1 z6p+{m=wB#k#Fe_>%LDRaNJ~u+%DF`DNlUw-7h>}e5z2)`P)KN~MZRLFv4}`RtBWc@ zAy}b{Bx5E;=B-0>q~-m_VaLP>mLxNt{w|J;7yes>9D~J@f($lVd>}6#ES&v*|NhAR zaisL2@8a_bQ5XRS&8pX@7FV~t^A#<~qK|05i#fQ-L7)?J6B3Z}97iiKnYp&4(*E6? zms@x`y)lN}tFyDUS=mmc!jYjB*ez?C% zXT5W@G!T1WE$R#O=fy(ZK|u96>~GXSv-R0bLud5iIbc~r^{BW6pgM4Qz`x=0!?^{w z^ilt__CRL%HQZMhLG=w~G6=;1Ll;J8+w&^*O55XeCzN2`-RG%Zy({@A4E_*wya3oj zVT?j2cTAi#+F~?p-<;fp)@oY%d&vP`84m89^5%AE5-n7qV1yI=weCg$vMV zs>2O2cN;#n!O*Ct!;N~D4+^!x@F}OKJ`}LsJr8hK$Z_N_2c#) z9QQM+f?r7DtK*GH)*Cdn(BLQ(_cN}7UrZvL;|)^Q8?^!vXq4IUhCb^JkGiLC)ZX!i zFY8TTQRb;n<`Xrk0$J8sXd(=^C$a)jWMY?NJ(|M9;HV$B*6+l3N2gB;ypHwo)RB%V zpi#^$g5Qb34)tHC^|+6RM*FyV_D1voYfNURYLEEafylRTkNA>sY#xKo5ttnbruhS) zTK(PsLe;N*c!ramBf+-8Olt<+`aJcYek+U4+x}toPqPw5>uCAt-d}UnM*Tmv1-$tS z@VG_l+a>l7@B57{u7K;>cYm6u&;p9XK+MB-7G@c#?srAC&JnL`GLs#Np~1*3a{WIH z`li7i@d&nWKq8bMbdIK<*W%29jl}?D%)kx{56*Azg+I(Z(xv-{wvDcYw_j(F4URUv zUfwNrL+uJAHGvxPP$Mx}&0$e~3v4NSHj?8T`*Yr8#yd2V>$72wz50h)0k^3a zf*)w|D0`~*wjNn?9!afC@b>m*7E1QAPxCr;4=So{aibQNyTU_;0D0ZHzr$B>nRx;%{#CazO8AMMt(J1kv_@6a>t*Dw8nm1)}}!V(7~ z=cmAG+B25`85M;|H}Yox%AJ0yT(|zfXvcT^PcA%pND9G`+Y%0ZKG5Le^M&CwzcdQQ zXM8PNHfr8x#GY8%dpY`RU7?T5OT6aGy1h0rV5(_(WH|mZ-DGm^kVKAz=Zy_>mG*M1 z|Df5#LExEUwKa$r%tRhKNnX^=b?jU>UzL%d{~SJa3Yw`s$u0e=W4J0KMvtYbAMui= zVN9={Mqn4gE^eG5mG2z+>^5hX0qG>(lhYuN9~$xnwy)NSt%^#x0e948_}}fq-*RT= z)aE@Vb$wOB^3sH6R}H!eYwJmsuYOhYD^k_(_TM{4YCYmPb|e-fuz6%VM}C8C5xA!_ z2QaH20z^uFXZ))}#bY;))^#GW+5MNbMk?mFa|=JtkXJvheAcxGtQs48dn=Ln2%=L! zlivV$A0lfBPI1YSP`F7~M*PBeQVIj&_iwLTNRjvGJU7hwEpXAv zpj8PaW{i0ucq=ZEE;*$d^!Wb%#Jo+i(k|$GPLVD#rAy3tZ|HkL zk#q7=H29PL!n&0IM%PzHMb(81gGhHMAl=>44KkpBba#W&-9t#{&D|q$WYP^ z(v3(rbH4N5b${OP&&;#-*)w~uefHDEuYD8yeS04PRwUK3YAp?DkulDjRR>yz!UE{4 zD9TO9=k*nZZwniy(K}?nT7h)PUNE9aAe5L2(Z1iHWp19#8E~Ek^?a4>+1Nm$G zYzcWbPybAIp8o9~LBlmse~cL)&j6UY_$gi49+FD(0{;e<&z zJf2VUebU`~>rykM2@s1Wu%@mvB&k^V_~fNNx=`Wo1#!Fhrs?ZRyPdzRu!LIMKi1?F zOIqG~%}OzFSqHzlwr*dcxvb<218z|(oqXFl%QlhO4^nyGdwVqmVlw9pL~I>*rf27- zD+i7aOA?wsR0jFCFEJ|%;u;*Ne2DC=OTXuAd=xUObog~Vg{J&HK0Tm)iF{$PsF0g7 zu?lj6mIU^6tNx~d(Lt5f_}bgz-E90f1;NtF$wm6;<&ZCR;zpzWzh7pk)c7NFZcxnkvh* zwbyLvR0qIAnf%=YHO@1ZFtPe)x%kdV_+ee)PxSI8xu z#X!P7;brA&-kZI_N#s}f6K!5a#eF_W6rF614RzMI3e7`$jk-y|ne2Epz!x(3Y#{?R zZ%D%1*ra~8COxl*r9hfSLg*HvbKX6TYP4#&NRCs2?T1sM5b#EIQ|{OO6I35gd3Of9 z2UYM&U)XeiTrRiiHqIHnT`Va%0Z(K5;632uIMzm7A>5(1Yh4)BCNTKE;5G$pw_B-V z_j>`8OIFh0-Nnn0&A zxxk!*k#H4Mvz#+GdM()|@_qFyz+f2o`CccO8acJw#Fb(k#EXhix6vITh63*$m}lcI zBbTvz@U6Y3_k2cRIu@?{pFJj%0g4#sF|}^YSuG5Ebtikd`QLyA;3hS0iypF7o1OPhmHD9#GEsU&Zo_UN4%o zP4fp_XH($|x2d%)khBcSFW(ZAke_k$B99{R+aoV`U#%0KzIyJ;SRKiAx_2NMA|(?v z$-6C&4aRD4H&sVA{_zxt}R;+nx0i z1XNj4hoOJ0S*MaaX?zL~f?Z*wR2>ggNwyQp6)i_6Bgq?m{JA*fQYOEUB5}s>dsg%5 z`jTvvaKPYR2%mi9?%pxCC7gATAC1pC?T8*d6X{=btwXA&kC@b90>M6DifPV)hretmCUv&=0;zf?8~J;*&UBDu(Z$=6uYo_ba9c!Wx$a zh!j-zQV#DGaZd_Y<8ZfPzp8l8C{kn&QI2|f9%4Lv6GB>_4ga~Zu zTKCm(S{p~jyVxLa>28nKj0zXC2COpRR4QL1w<;zmcvPz~5hg_RE^3sCWn}GiPVnmT z56?b7Jfy$+ev(ffDFo3Fohrz1?q-PjNrh3sWMY_tMqlB!&_f(&+Xa@IF_Ia9emz+Rfz3WQ=aKA>=Fd zgUl4IF03m;xSQk=|2F>=`Bo9^pGbswaq_8SgW{CxmQDf*zvrJi&kjd1MtafK1jcK; zylD1`A$#UZSuZ8X#RPp5PF|u=fxx6_1+GaLx8i&OR8hFlXfki#v5qJLM6sUXQH5eES|>kz zd5eLGRVB(yFf?FIr8@419}#{OaDQF$0TJAFztR(4FVdw4-eZ0veydn3p3 z-r-@p>3(@f6?gEgK%Uu(1w z?(d{;#!D_)0Lph=7aeRtBW7<8Zi4Yk*KYT;{Ntc>r7ibItWQ%=!BXhOLk0D**}FTn zr+JNgQt6taPe~|5X?3U=rTNc)mtDRo5GWl)F=3N@$*Xn$o;GHx1x1oAh#^_!pisu_ z9X>jD!DUo8(mOMJoT5u5bJkKGbcp)Brupkq7c|GT6Z{ele}3LCQ{kbQX~8eElnz3> znbJ;ht+m=k*9$!LWZZL?sk7c4oX8NC8aI@z>+R|dEA2<3a4)T@eePsMKKgYZzacQkm$@&||AS7}lNt*|Mbn&_$Y8aoYt z#Us%)sYQ0W`mZ{2>%Vm|LzfMio(Ipf(@jjU)1Bsk13BP8M$0>l*Uj%R9^1X_2dMzF z=N}KxO)lQc;EI`RkuDWzz4rQOp}P9K+Ix_|x`3i&!2(_(tmI&b!66XHfJ8^Y-_4Jr z09i!*i)nnmbW-v4c-{`YdvG41RIsgL zx9$q8tl689RHh(cdrOc^Im@7#%fm4=<}TW9R~3dJo$_uj=B?__g;_Sn&x#QGH*(D0 zkcx6#X*b5jnV=3BwBeQCanJsF?$~S2`|LvUu*!N$5 z8;`1q>n`q$(A47F9Llk^Z88M&;JL5^_IE(FYeZ z63#O(Qj?EJOzH+<#U+k_9Y*;lfMybyMJLV-!e(%?DRGK#%7c0HPQ8aL4JdVxABaMh z`ji655Bwnhp|ESdsbGj$w-OKklydwfKLeF@i5}U34#YnJhQ~K`6z`b@OXQuRh`-$B z33&a9i8|ml2GukGyo(09@@~+d%+8|Rk6i)4Eu@fA{0NZ7=SSG7eF6YA0{d=z6P*U`9U`_M?NQqTJU+0ra$!bM7gLHF45RMDK%euU%b%-`0AL;Cc^^<9f~+!LZkfhiSU z$cJ(zs{mlXLhHE#)rSJgv#a=AiV1W7o*26@>3AJN`Oo zrR3>LT7SA_aOWm}TSmxZpz57W{6iW&{4L!a#dv)bi~oR5ic3~7dxx)!(QCWB=R$7b z+iqkW3h*gnHrWG30B|f~1P8!rqJ#3Dl7+<;Wis%}$Mlc6l2rou;4Rt=MUT?YZgJalY zwSXC_BWKjdN3(MuxIP{)!o}X17onfXkNEeZ{!AKi1|7N~unswcI&Cye`oiA~0A78= zIP-;G4kqN-rr`G^98PPOf%vb6Vijd$Ip!^bIWBkm1!R#Yd<{a_pC)|gs zYh>}RuV^Anz4K<9c4R``Q@8^VK0umA-N3zQ)qQs|~u> zM1Oxp+=_fvyTs<9%CoK8ch@bBP>icsGWyoPWg=1jAz0N0w>16a!#|?Bj^0esKjJ*I zU&L&K=dCWo62F&Y-xL3&RSRe@P&+^!`=~~G`Qm56(zT~7w4Ai5RnlZ)oT?n*BiFgr z{ALE&)>2=PwtuSoM_f_(UIS1=iF~td1VEqlp)IweS{7FT${{<<$X9@w`3C*Q4jKt} z3Y#z$7h-Uy9*-M%l7<6vuROY+q#Z4!6MYlfDxRcwd&OFfZvfi0uw-N(R|_~Rn!;}P zFwTE-g~9WDfPUHx9#pi={q+D;gh4Dr8Cy()a$?Oj3IyFPh(E6_|;nIVSyMp%aKU3W%>F4>z`M)YLMw_3_n;()XP z0d;|OoGYc5!a)VrYG`wDlACZKVJ+C;$LW^A0{P%wBmsK1+6nVGWZ+4w=9_gMUYIy; zk~SCT?3oKD6Lq1X=n$h&l4ecrj3(1hwzp3@M_N}zk@1EWAO5~YG5;Wsds%`V^_f%D zP0Nn?3I%EA`Z7gRCPv;xehM{&L&;+~1ucwPgRDlDw)DEBhqlzBIx-}!j2Rb|4cAYS z5f_C`Rr%GQWoz=v_bjuyyXV*{FFWS4CpaIH3`@-xcbj86nrcJe5@~)H|H9sJoBKhu z9)fKqQKXY5=#RWfLFI#}!z!yF=ZEo(7ooHc}{*RgF{x+_b=!pbbpTpIzCml|enW=_skI_j#!j z3NkR)(A)NF-ekYalJDKYTn%Tb5%k`VtJvG)km4|qva?+0%5*$86043!>6f+**VofI zZS6V#U#6WUoz1;^T1O2+6Lr>xmCJSs##vq|v)&DlHSv!>|KfA7&vTw|$K(9b`S+OS z%+OJKnMTxhkvCm7LGksXzQQp}czlcN%ujKMsd-Mzr_`nM{G=4S zIgGy{MCmRq#IxzHi~K*_yK>%ERuaa01xOzclGjm?f^C<@s>4UT(kbqqfp6UIxg3O# zRTGax0MnK7j`B6=-4`g>pij8#N)$l|Q|QjLodAmO!t5^@enJeT0tVnmS z!f-%e`sq|ONb~*z!o<3^t%*panZ(P@KR5@sPiNT~Q2DL$+RoL^ncE1PNe$yJ*lzG@aX59+Zjr zeGS~g{9oqnb>sIMM8o)k+lp?YZue1nhLQZ6Y5j$cramtj9&O&?cG7ysfxg8H&PLtY zIX$i>-Fcpx)Q}&Qb6XcPrWC{j1%9Ofltp&wS3znz;#gq|MuXprpUUW-)6?=8d@@4H zWwLMMv*F^6Cm45|Q@Z-i?DwEiEYZsP>V>!V(LUCg=AR1BG6?NlTEF zZ@%@#;vUG{dUf14a`yLD>Ia@nuhALyEkQ6oG`g!Bp#7Aq=$|TU&Dj<$qJ){Px(llU zYx-~)yrrg7OR*cGKF1P$_daY-lW)uDABJxnHs0x@e>lF~3>`o5 zKZK0dW-OxHT+?L->D$i3j~VzobZu$U7rpo&vPNq&7n!r2G8PAIyu(MO=)S29A8YY< zXxIu5ImV6N+X&HqtKolW8kJ)B25@~FA3nCtUZwwLWaFJP>YTYq#owW2>oauhoE`Mu z_6B}znjK_nYnHqi#NT0Niw{4J<9|pQ?F3tR*j&HJ4$`qTOI?)be`p`2&RAsNe~29I zWc%habiB+T(6n_8T+juHQtVv;EVLYA>qmf>od>yBECL`=0@gC3uYf^1c=tST6xklD zTfPsdMW&N?9sz>y`@xqu{&l-XLDLxbnFD$-D!;`#v)cTZ1 z0QyXjG~snD(wG8>I^N`9-!7Ho)|z-};x+QWlK$gd_wAd~Eo9)!&vHl|oKDiJgN*lN##X`M@Cb)Lg%laDJ3W#AFOfqhRK6OK| z5d-qmr_?hrRW)-x{njAxIaIYhWs)(UleQ(91s;5^ar<XMuIr&~b6n{Yd_Zi^u_(&Gt^W(o*DvMy ztK6nv^Cf?XS#_S2MiIAyc_TWU)8LQ&wQF-kRdd0QAM5s!&bw}#DyyR#Hjr+Oq`)u)xXZCSP;>!t_gXM2$PEy!e%m zB0hjS$-v^87;_{g^s3lfVDOGWWIHPBf)Dx zo*7K($JVvIy$3qc<$ft;BhwaF17p5LAuOBkevqt%=l`nPs#6lSWI(khY)f!t3>ZR> z30?(jX>Rc?Shu|)v}T^y_>#W`ANPtH@&A)n)YMdBBdL->VpI7;v;59hr-JGr>E!q; z6ZeISPN6rwU07Y?-CQv9i2c>U$^mz#KvjR>15zrJ{2r+1IaRi5_K+l!H)(PXv-1L( z?6-IxLM7|JJDEq6yi(WB;?(M07~nzxRH;5KM{eyaI1lD2mL7Vy5$w? z+@U(Ifp*G&km;-{!s3#^%YVtCpZ&I*a!3P%A8ig;^bBK!R9S&FGl)(D?8TqnUQUX% zvh{U0={|d0Fhx^atjJp|qFHQhzM@KIqevGpS}Qw4EBk)y-}LkOAggnOP$bOK|MjYj z=(}#$vpDnk8LMBDWTmfqSWUK`{zX3lZ|f@)|9v`HF2HXutmH;yy#NID5jH_ZmG{ z&-Gj}W1P-J$QVL^Bvt9=h(xgg#fGR*_x_f4`$((j?24}OzkLB3Hvwp>(QVGk@Y=Qz zg1O~FxGlVEC=a9>DSrT*jWpU^ITH<<*Ek7^ZSa^{883VCcB&c(#e{7W{?E|F;_*rR zR^pQg^bPGmHtt@J(`SLWov3SZ^IPR-)PWc@efgXJh71^E^oPj!Va5>KWWRpJS3|4T zTn=>NL$YA^^5{U1_AYMVWHO;-y_u(Q-@HTu@_AHAi;OKF#%)#dHD0@0DI#9GUuhs- zyH{zNY-mWSG=AH%gdf6gS8@>lIvi%pKg9|8Jf`G9=D^Kh@>|In(jEq5C;OTLt0epS z872|`Itf;5U2+$%-KT_2=0L|V%RfaAskAEbhqTASYHb;L7`SX1X&3}~r-&ei!%FkK zQ{Uq~sTfSwCVv4{7Ra?k^@u%mB{G)Ndzy}ukoQeu3g|6ZFV|!L-RDEYl0&^+L*cAT zKzcoYYRHu|5JHP$2B0i+OAQ16;vE5&yur1S?5?4cN7dLzRpv8cKPhOcLa&+Qo~oOpm#0{f{!{mh>c`~r1;hPT9;uWi-XC7Cr}Z*SH0D+!^_HK{ zzN~BNxlW#1zsg=8R!;(KUS+ZFP;l?kQWm!=z{w!Px6q%T=-;VAOQeM{DL(b}&f6oo z7v*RWi+$=G2nW3yT)|j0-D|MWlHBWElRij3W*l?E8x!S>8c8xen=F^VRWOQvJqg=97*e)x zSBX$gqc@QX3d+6S-gvE$Xn7%`5Zjw;PUN$HPN~pSrTn{;+}+AXsThMa^Nll$-^;NH z`3Bhn`tWDr$@k{6s?F1sLqRGT8ycd=mnS75o^tuJ%p;6r(}g+shoWp4c3l;&cbbei zt3j-bTdx-{K9kzp(M7LJN%^BbMdom(Ub&Yq(casfaRx=D{)6WW2FV zx>8#(nxP<&cF+E!)Aa6jkK|943}nZ!AI5g$#h2ROHVGrtcEs)7cv!vm=Ilo`(a$kg{Og|13#jSC{@S-#ci@ zY}ZTl+Tz!P*=C#UW#iVi zF~uXsU%{e*3#=2s8gVeBI2n62M5wTsY^%XntdqQD{RWfXYCix%e{oVZO{}2svax7^{s<=i#c)xp}z0F!`UQLuC zXmav@9!9J4gQld(37au_>b0AolEZSO5^d>Lf0WF-kxn~evT3||eO|QehD+&qwV(*erh|{wl`re@wjvw@1CLmLEgreoBu2xW4 z6ljdh=i9JQ7T<;&M)JmX3p6>jvXYFPk_>*iPz&+t$GaWv8kUs%xXnY1rTNC>;R^Up zar=zXoN5_+eX7QEwCrr1A2;pf^%ZHi?K*b1kHYeWYy2h@8ONf8jGFvo0VR`p8{E_v zqkTFrZlcls@ahy$mT`jr5odYG%j{RGO^# z_Fva321Mf@v=St^H&1KmAR7?nk0g9R)DfLxHf1B4qW-g(WU-2Dv+PDs2W;KLn<@5N z2LNk|!&bKT7Wo8E7h>M`jkt*^T){WqxyWhSC`@ds^6_a*oeWGyxCJC#oaAybL4Yvk zt&wLMqG_+#?ezYrN5@odu5}eT@XI9jYJAQ1lm?5Q-%%Zkp5G6>j#a!tjHzwG5RKZK*sR#cUDIUD}|dR z^l^>bY{%(b2cg|Lyu4HO=yS*ZFS+i#ATZqr@&q8GO2?nfcDApSd##7oXk&g$l&JRE zhIvg5VDFAs>Fbt0v0Qz}#p^%l;OauBteLdZp9{-)>6RDlv>s}UM5$Rtx8X@g=@u6t z)?>ltZ%a6jIarONn&;Yt_bpuhkb+(Uf}yzb%=I_nZy8-(bJNwi_V3?AqpM|9gXG7U zLIuU2eK6Nlz53Ptd8s>NsjR#GS0pa7*HV-E`$UE?}Q;Wl)0RX0|VCC(c?lK-?7~&D{4kS~~^Jo$D^UG31f%6|xc?yYP7Q zd(Ed}$2}Ul_8#x^A~j9nB~!{W+-B0F)EU)gQoHG~{{bP(aUT0Gm*cM9en|a0(AKng zZ5fo(K6||>(LVM+;OY|AJ*R6_zV&I1fOVyySfTfOoNxr)-2SHn^CpwjV;;Sy8HD>P z=i^+*u>`}KG~7S)SpRbK%`$P(G$UY6aj;QYAicP|SubUEjsN|p{uTbWpZZ;O8_lFq zk8I7PieszNz1N%d(%_O6Z4ZigEC$EVt=6Tju~@!&NKIJ0=!%s9tiWKl>lU-S@8>_x zMPEg_Pg*viJ`t=&;T01vL@BOQ{-6{FopC6)YPTeB>DdjGgi=_QYFn{?rz> zeBA&0iqR9-yR&WYH{g;|cg}LIbCOxtsM`;4W|cT%y1!xLQ%W| z54}d4XSz~a!*d8Ddy;O<8**&RH$~?T-@zdX2xDc)T=X0AIGbDruj*{KmjfBUqu+eJ zB!aQ7E*&Wp$$5q=r4il|#b8aN!B`n^US0uFB#+$pdDpX4QZ-Fa#t;4>w&BSgjZcAt zf-Aq&!n$rWoculCQ!0Bpm|5rV_i|(UYyP#2Ap2~tQixryXL(0&A2ugPS~K)_Pu&I$ z#XeF}MzcW_KN9!Riw=Y08!)c-o_%S}p#cR+?@1zji`mVXc~Et?m5tH|{N8DGpv)X_ zlTFkTzX_ZJE*=v24nDg6BK*X7O@P+#dXJXEnn}>)q_uvaRW4^($ zqt$fTJ?rD)0?(RzvmtIw;aeO zDq$0mUCJSxtXY4pr1ZoSQ0Kx@d-My?G`U2go&nm49alr{&HP7STCeh5bwOJ9k+p1&wiPhk)kvE z%ktUq?g3y5TK1R+j5*A9yugc{UU%+)#|~vQ+mQk) z>PsUP@~^k6KWVe?mQ^ZJZG9YrF8nQfwoD`3Q&a9GEZv%FQN=r@3U2ByAgY81iyG3} zHaKS&eJ_OoPW(dhkr|op+dnb$P7T7P;*Uq*!SToAaO8MOI9xVf#d_Nuf@fh(#K6Yz z6t7~ttq#Gn+IEGM@wz`}&>|O2ffbX9eug>3Q})3AY-$+8FFv?vg{GK1Y}pBF$6YEE*cIKAUA-+ z4dQdh;G*%lBXD}iO96Lk24ymXVK_e|lVgt1=G58~FZOzvP)^p3O`l+^ZMs z|IwB0w5j@oD`azb4I|=fFguB@_0~dx)%)QFSr%qtMb9s=qOIyi2CYE@66FQL7|o}? zH%0N6RIrL3pCGoX|EL!f^>;s$aWM=^1~ zmI&wCA5a~=Uy}mIhfRP06iSALl$X4avfHll|40?WhlY&dzlluUwDInnKY*jpchZ>L zIL6LT08I}CzWw^dF9C89H;Z);A-bsJ3GIQT#0VtXc*{e;iqxC21p$Cr(K6y;me!_# z@VhpXNd&dl9|$HZN_xT7e!%|wOGdH8hYhyYXY*UDU|Yr4h!7llgOXfh8E%G_QqmCo6+YwMQ#srYZGDSH@cKj?oA?4|_;} z>Uo7{V>nXK-7N_^GM#@J2u|K=qa$00jmd^|YDur9vZbYlKMn{vkP7{EPMiO(Nc( z7c7L8G@>yRgMi5HmqpRL%c@#ogqr8ZoJ0lSC(t?)IRnJoI)}C&XWi$A8@CF!T}dym zll82;B4e07wJ!jrmjc9IFfSzeK7Z0Cg*N`YW8}8$35yhs`}-!<9dhegb^5<iNylbKQ6mv5+pRs6!k@NM zL=xR|^S4q&ommHQw^}zSGke__M7YzpAnq%yi4BRwbq|=7@=Rhrr+M@X#6m}^zk;cUgsJZdgq~`!WT$Bv^O)sNi zY!Zzl;1x>-ZsdJ2Fh3}E6KLk%u0dIEB|Y^Y4!QGnm;T^cj=9iQkGVVgbMhmRDQALYe0k;-`9~W?-ao5o zvcJS;zRNRHM5@4-B%MPR<5x0=j6jFC6I!f_&lRw2fp#MM^WmkEfT8m0@@p%piIE)x z+(3%a?j7B>E+TNJ-97Luv4I-ioHN>NYf}4mjBn(po(&z>UPS)rlD<8lo*fSli1zY-u^VOM?f7 z4+3e`m;EbMCJEoZSI#90kM?o>M7dF6z56ddk_r#!x!JP9+u?Xtj7&vg6yEoFdYWQB z2VqPv>^>%qHMU_(^wB$pN9^2OIHR9r91%e_is26iU- zEZzK56x;QUrEsGM$cGdy-B3Mq^>bmdj70M=7$eajQELCDwwM9uZzV0FIP6J*fz9|5 zriNDDJm!~nCA={MHq!;*^a;k7ney_MZV>-eePiyimvI6qdHtK`_RjqP3o92Ed6e>` zZ9?*s!&jH(FC{9Di(ym50-5DZ?^RSN=8RVtv<*7koF)^?3=O91qJJj>4j$*K3An1b zs^UVk??23m%{^9@b-((XX>D8cXGy(9$Qc{JKS&+u4oW@5AY{-CO? zBEiDtR=pdU@qtTgQG0dfhXP`CZgk0TRbTICS*MVDz}2j(*VXq>xT=H4uQH?un=&IS z!2VHr#LvknHSKIN#}JkwV%qhUX<1pw@x#(akI7hbTa}U)s){t1I+;3GOBv0&Pi z141xi8}q>B3TVO$Os4<|GOL+Qcwl-C2yvR(6bGgo(T_tvH!4jcgxKfVZrI0JSv2@H zCy8dFuM6e(MLn@twj_Swn8mvM!r#z4)nm*fNx>d^v8{U^{T(gYDI(om2XCPHg>HOf zf0_seyc84f*=2pyxU3BI-z{1heBjE9AX)7}6k`G<_=)N{$pkX^oM25R%3VSB^R{}e z68@nEIx_p!AW1qO748%!pMuS3R52E_Sd97s`Fr|HC5y;Dr~Pt9@fAoko)N_ z2FCOT_%9(AvEd<(V!g5<)buLgD)NeA7`$>jAS*qvM@NRZu7G=>ntph^kpg~>0|!r! zH=}3JguwKVJ5|-`b?$kA>7+w?ZKj>WVt4F3C!qOTr(QjC<(}pU^Bh~_}m_}_uVOt+t4$V=3*Lw7u$Oo!s_%4@9>UUUKS5ZR~v4;cIt_tN)O8if2{jq)#G zFo#*^FvyZkY0Y-n@7VQ5^b9~A9dWLs>$7$TxMx+R8UaUg>QQ*!UiEmZ+lLuF#(AJ3 zQ3(b?96=8X2?_Z@eIujS5#sz*H%n{1E`%Z%ISwoq+Czoer1ebSNP+Fx?w0hV{Qk#ucOI2R356QPLj}) zXCJ)N#M-2ak#g#(q~(I2mXe5nA#&;vLkR$ZQ2bant})7R?Y)#7~G$ zj?n}5e#0+-fWK8o!G_aI^T@<2lJ;=4csDW zZ*&Oh{TRTE`ve~D3eezgiui2zh#;VJ{Q$bn17O4J*xd&u6JiFskT!vE(_5hQzd$)@ zF+n0(Edsm8HL5MpSFE*Ku>A-y6`)0^dCB5_;J^B2UUnjjfHFNNcSUps4PENHm7OY~ zf;g}X@SxFc_1e&&W4%7>Awl6-|`X%lISvcGEhlX9T(DZan}vL0uc`8#(?VG#5n{%@ioMa%PlcZbm590spRmp9tXc5|9)| zm~orgLb=g48v=5$bAXXCKpgv1e9oOT68ZEa z6mQg40uEG#&~DKKJVgIdzZ^jC|EtqC@pb>-I(-vNhK_qM-B+--Pt}+7Pr}Ux$}RV! z@?(V%wMcBz2Jx+c9NawR9dj}#e_mR$f_147`@;XN)L&P)kjrQm9hIh1+io+&KjJdb z*lfFy-;puU*liQXKe|AqhTv;_=WGzf7nqvBIWGgy4VUIW$6x@WV8966j_i&FA~gb+ z7C0A$P}^)@#0Q4Lc=*qmAczPUkHGm0Narwop6pJHA&KuC7t%QdZy~!AVgQEWK4f>? z3`qj#l90}EIJi;>3~IIg7J|rw(eR%$K)zUR55_-!g5~p{3qXQ@!+FT=m>9Y&x98&@ zBVlXaDQV;)3i17`H&1{gNMXTK#5l|B{?<4d$;A_6$(5&5UE>#JxXpvx#{15E2V)$0ggd>DmMcPf3Dm`O~n z^X@3RjU3inF8ZpPQRm%KCZy51bR_uwX{X9*dWIRU7tnEy6bxE$Btd#6P5d7{12~Ym zJiK<+<$7&ub5`G=;mmZYM0CLh4M)QH%myd>m*g1yNZlUj2*pM>5Op?B`|}0;0-)p3 zjUWGX3#k7P+-m6FMz?C0Rdkb-2B6J>>E{dup0$DL3gz>rFmRqHcM0?X)bMOLYHAXF$ z%3UyhWB%-Lwn}f9r2?H@L3SqcM0UKO&ebK5@=GL7-_fbmBi9f^y0uVStRsEh(+Z-S zU&dgDYK7g^aE1f?{H#djG{Any;5;x~mDphU;)<-raz|^VMqlA+utxty)eGI~qCeZZ z)$eB5IdnDF+&Oeh5A`{8VIK3p3>wa>W_7FSk%`rsEOp8fTP$BJl4)A~ekY#%cYe3p zvb+(sTEA@;?P4K#<6`miSPq_eiBlw#K+C<63DBk2^RJlda?3pU`<3zEuG4FVJ|9@+ilgDF+&nt#lqR%(JJ)DO3- zgilB~ZwHs_$9Tqur}ogVR`|RdLdV+tD=OnHXcPEQ-m*(6s0YeqsEbJP*`Mp~g&(P5 z9T)Y5+%kSvS|%mcf&Ugk+-NM>f7CiDx&V?igw6}KCit6PNhV13dms0vo-W?nK4Jt% zEhrIwrQ@<@T7+B!nqw0AGmWc5p=ka!F9bsiGI)>mr1O`zbJd4yxHp9|SYEn*)x%@D zDr53|t7pLLUZrQm8>`P4>=JAR(~KK)87=1KvmHIYc8(A@}=JSSYxjd3;05`M{#SrjNc+L3H^Y%*m=M#_aDaAhKJzbkqX4G%pbjzo^ zCQ%RmxZ?4>?Z{t;v1cz{>@n6yI2fujG|$mH?<>|Dn2ibRQO;sA zQHU1E{ljB=|Ii{x&x14w({YBG;c)^Qaq74FOOQ zPd5(KWkbpO9g3b`y0WAv;oNJ!n^!<_VVseBOLKeZeuy@kh#1;a7lxsarn!uF&jjHy zIdQ>OXwlZoec+%GA&p}=wqw|?_>6|J;&UHON#SQwxhg-b;}r(;eGG|E)O|+(hnz+M zPne?YQKB*Q%(o7(CPl3jclGpr0Cuo~K3)UkFciOuq5VL=Yv}dnX4)^#3=8p{@LgT4 zO#eSHn@XH$OF!e2O}7A~ifkk2kcS=_dF~4QC<=GnEhyg1XkHlYO*pt-?+W(h zS}Sr1L(TndTz-cq5M5pET|VnjkpLA`M5NA(D)KQW67#0&nnBP6i3PvXmzze10O%cUMVcX6#9MqcU1Hv_Ps9zh4YCy;9ZCby{f!@nmK?hCvWPwvgg3BafU2XwK6MZ~wl zzTA~`ZkBq6C_Inu#FYtz&OUEum{+YSuctWz3Oj%aieVz4c=oHX4&NE#XuPHqq)EOd zAb@S2c#X*s+vUwPQJYA#k<+xbI0^TS=@8S!!xxY$ZfJ(z2MN% zN2PmgDc-O1(c4*2d~KJ~N&{YsM{et(Ym`1!x{E^AK3j+sNx19~dWEa_&by`4B5A4b zvq^vF()8y%y}veN+?EDjhTkr}{sb3ttPH|iz3QSnSJ(wFnRX}q*&TgS3QwbYC*0y( z;bmzmpoX?EsalIw4&K}lcFGypNCDszegM>J-vT1$r$|rGOYl4-{vT^!*;ZH2w2iwJ zcPZ}f?(XizDeg{jC{Cd`6u06OcXu!D?p|E>diQldf8qUY(E)<=oARfS>MB~#hb|H zXg3~1gEJQD}7cjML$6P+-b;cX>~_L`=kQDq+_e>%`}`<$s{ouo4_ zQ$y2|#C;%s$F(ZEMFA*j^Cru?x!iA&81mUM%5Ki6qq{8dB={v2k?xgW5pZO;E zg%mxyESMzt{U~~LT~H)`;E?U=SAXL_(@yY6^ZPXC-R@Ac<2G=P$U}~7yu*k5;$FU(CH)5`IR6ANZ00MhlUrV zOM^jjvjZnNl8^5h3N}WAz<6*0G&pOl$$N{;u?s&?mKX5j<1lve2di6fzz=A!l*-DX z+C3^B<@7d_#@f&k@I&|@_JZEjlJ(_t?w#~w8Y_nbKvuqyKl=ndZgNOA&I@*{BrHzf zgAm){swGtmc;{O9i12n5ga}v%d3WA!MczqHC1q0nj$vYg-+#-u)2+~MxFq)78`zNF zk-uer4|CZ;vO%N9n_UjE3lTDgTjgmHj4_Urf83A4<3PSubd8SEeR3$z(lX^O_+2wE z!i;M_`0V-o^jNW>YWMp$jn=%VKh{&q$?~hJ%C&N5fJvb7;=!4WKU-8BuGNXCV6`Cq zf;$n{wZrATj(<-^#)@~}_!%6tb&-XaQXIQ;@;bY0&aUeuj*Sn=zd-_#kpNej=zS$| z8T{+C730C5%5U}cZz@`1#tF`FKkDV(JxjN<*jxm=W0%khjJ2llm42t#oHLqcS~G3f zr4huADimxU@Z5h+xK?%=*ne(8gbsX}y$wTzuH6p?%YC!AMTpROzl+lWRoN3RU2s4e z?~W9j&{Tx-0m@$^B9E+WD4?f?%_IL-wEvtEj9$-xXYdk98z{&)_@wt74S{6;9TEAc;BgaReR8xXbw8bf-d%~Za&9hXqa23>?QE;P^eeQ{Ro@>;W<7&jaBZPV==L7h<}ljE)(0Z8@dFZH zCc6L(4~9h#sDEX?PO+@{+Rkey!sb>$Aj6)vY=zSyxx!M=- zx-T#jdxEuWSe+ulU`oBkeIbwU3@xEOr3f^s?(Mp;N$iO(yE&n5&u7OhTfJZYK-?5k z#N)OQNZb@%#6xylBPV!`M4fvCAbI>}7kW^6qQb5KZ^UWWPxTi6fLV=`cTw0kKoE@4 z*TC{5cyb4?0d(dN@a(<;h!`Y3n~(+WC$)h057vgtfFGL&v6D%x9GcyuOfR1=@1zCL zHXrk#e#mvpF_}_lBzd$F61EP4p zfr)J(5&i$hES3GgF>|4-1vPjRcgccJ8jG&PW}}bJFN3;5w`FGL6T?0hmsqj2Qjs2s z8TV9OJkH^XOUd&Ezb#!5%YxeT6X(;x!Y|{htjdDFS|xFPnrYai6{AAX5;XNO0F$M8 z{yk!@-8U+`1KPVMnLT5OFEB)u>zr=iS8p$Yoh?8zKP>y5(^1|=?}?djiDwo19zrR| zb!6?)D83*pdm+V9o)#S6<%KRWvV$Ly?>R!-bL9b(6~F5VZ^@(5@*XV zXyv6(gb^enW8bJTIO;fS0PO-6q_a@J{197w2APq9TU$&!i9d6zVEO^D$ylEgXhgjf zn<@A>F}{a=CG{R;xJpE>gHIgZcYzi`o$0Ukp*IPs9cbD0ztwr?+lnylcivUKYWU7XyPT9gW^9S&8-4+f93VQNywi?(&8``&NIXn%*Sj-H z6H26>u^E$QYRjNbuRG94>kOt&ueT&p1SL?jT8_o)-I=EuO(%nYDq(61rDnAlo6x^Q zO6yFft~DR4)W3UT@6RxD+$Ng<85mt83_wS6V&9az!gd$>{~xxUhpIxWnmp79|iA;lP2l2SHRnL;g0H@)9VjX zR)O1Gdx6^$%_D5(fNhQz^(~opVIh2RbuF4ZzR&z^%6gUh(QvXs z@vg}>6(<*&c(wE2PYr}<$ZK$J4wmX}t1hR%!lG@XdIHmuEjyU$wob@|0Oy6Gb?CFp0JkUw2 z7<84~;=!;URi>G%c4#V+O`;q_R5NXtoS6o{(O_0_oZe2>6_1Um2w&vK0&%vxWk4?q z?l6rAaU^+G{C7xXyP`xOn+w?9yr(2F@%a8mHj6>KU4ncK?{NqfRC8eLYu;z2y4^O_^vybN zEa&)zVa{M~#%|L#-FwKg)i%Sl%lb8*jn4%-g7otRFJe!bK-!J}ZzHf^kO~%5z=EHa zsYcdwSB)6|=#Fh#4gUkxK)k7x77cWik1;)=(_}f-18vb>H>a)aOR>&Rf-+oGiv5(d zm{ZBQF9zn)wsaMEN5fymLeD>yi>ww0C%V|M%Axp;{LCHn@y$uY3e>ngQ}%h6y-)lC zD^J*qUb@^M&6|6rhLpxE4b8dPmophUne(gq&k;X++xYA2M& z+(mz)hV<~}JU+%``DDs(FRlRjjDsIMnks?u9s7`+@2T`Ju|hXmUj={W3reWiztE$l zpO9>DC}Ph76fI;dww*7O`@oOe|NNup1R#TFN=4z*$96sE$4Y|ToQM!?kMuNlKEqibd0Tj)DEsE{oFAc5D(QyoD4K zHERyhun*{kZSGTij}cI zqi4D=&TCP|{K6T%*Nf4d>Z`3uDXQa5pBq2tpRI*`K%{u~$$lJ?3xgyoOO2?V=Dsz>8?Y!CTramK&!eRF?Zdq_yl^ zUr$?R?UpnC2#>49qWT+$u#Jj{F)uV;*O|k>!xa>0YPcmP{w>hh+6$_ki_wq$Df)T7 zgBe|m+b-aGvi|T8`EEcEnp0$97?>XCd+pKme!Zn*5Vya@2%vO4Pj9Z}UwgmX#Di0- zXL&J4E?@clVs5Ne^=@%WY~?Z9Zq&W9|8>YAiPcL8C!5vOfzmNpbsW#%&aVdG4qI~9 zsGG22{UR*eItEL6BQZH$2jV4Z1krjYPLLw7T)Mf|4-bKxP{Eps!EpvV>QxVh^Ycsd zs1a}s_6*o)7ZKC07 z=3~#;*xW1fHmKp{nd~D|%ZM~;2Z|UdXvH4}Qp6slL95@N*&$d$!#+i{K7VQbNfifl zrC!F|HQYI_yz)Xb%i7QVIWcXeC5Np?Jl*Ybv1WAxJa zWj&6-1w+%yXy=hPc~NMj(RbX|D8&3}3#h7zX6dJ*&(AApT*`@;HMW_S@fOux&i-@z zn`mldC_=4X0L59@M(FbCfGygZYWN z-ZWc=&>XpR;NIqZixt#l%@bEsh1uF|)2qTw3f!3S+y4Ax0u!t-_^b7QxDCCpeqddt zv*!O9V`nXaf0-oxLKCL~+W=p7{JafuHlw)%bdb#ENqz)v)`5ij0A2_}0K9o40@DY} z2afh{(t-aDPWF?|v@XYrqOsd^?M!W*L6zF@2FJ zxE|Pp`EqstSDLsfqX;zczf+Lnw=0IvpJhwo**-%-BknY1j6sT9x^i&JM=DwO6B8FE zgur}{gh?SU6q)lO|8>&sDLk9&^Es3*s^#u;muxh4R1>>w!AihI|EApzn!-oghzif}NmGyn>gA*LwIv zzTJVQy1YTx79a*--1Lz4UHcojuzA-8#rKTQyi~rkwt*5cuW<%1_nht`0Vu@LkPTZ3 zaO&w8o;yPqcEF2nT?Q+!RiCYZaC54mR;T(_`R;@fA_$n_qppV@m`=r zP)}L0hz8#;s(&A(rgTSV7Y?ieiViqbu*tTM~__g^E)-ocM|i>^6`HNEh>R!W$pmn9no6btF) zz5iarOYo75_K%G;`b5@tN^$R9<|ftY`C#HELU?zCei;?@IkUB1mTu1qNwe`=<|9sl zSKb|dGC_C2_nbE!U!?k%T;9`+i1(yYll=S#$W zkKd!-vvciwZhZdrOn(-ZbAsaWsU6KxqGR@WaE(lo>4X1SC;)3q?BcD*jxp}STgs2P zTdbJx2zjcU0@XlK^R2hzHOr0dhPnUU_0HeCrIq5vYQ9<-z0ID0SmF)8d-V5 z0^OnaeLP3hoj1iy&KxgY<_9RF!%i&KEwotp>IB01PKu4~hA#8uwcWOA9_NwfJo>{t zQ|V>>%umB4<}!WMJrO$v-HM`vqHvAJHd4`zRbaJFw{@ zr8HZ2&Oht|i7t;Or~xY{FybP#?B(-O#gh*-JHJ}|{K}|u^vC!CYe*(`wC<==aOUw( z7v9HIH_a5UhVkp)&9%w7uO2Gp9JPdz6RCgx2z_d~h`_ITNq=lIm$lnESGaXUGwy|0p8lEGSZ{+7onMXf#Tj$J6q7Z ztZ26#6wE%Ubd&!0@neLp2Qo*4P|hv4!>d^G1$D=P9RG9m*yvo>G6|I=`X$dR{2u)n+Cb=7 zPPpO9ucX2KQ*_}1bC)Ls_jox`s=b`xP0B+te~2vKN0Pf%!2{Rj6ydAML8>D6mDtH4 zzDtX#A*ye$eD3VjkGKC}H#3M~`>6Jg1jO)kqx-@VlzM%u`vMPc1o&%#7Jww56><%J z7J#_N5d$Dj@*o0HXL%t4k!O1#UeWTeAzw{{zd@YH27^>%;lj2>^k5Jm!y(V0)kwvn zAQ$lR2O!VjXFowaz}rHIK|>P4sELU21XBfHK%m0eB8W*s3Sj0#1t&n+;)}^ba}noT zKoCOC$_2|n9zfV~iCI7}z?388*F(ggH(djL?k|->xjo~Y&y_+cJ>&R6sW!K|tG%X& zoxk`&q7h$(c;RnFugvggrpy6R+5sOYnfJt$%wgbV7--Foz#E^yY%UdJqH?Z@O) zy0S|vM)fnX*h`$)y!6rL#l7Ry71Ab*;sob4(mxnlcK#a@Nd_nms(J_ve}unM$TM-PdfN+PA@G4LDSi7J{!dy0+9mNsAEH z?XR0QOUr$+j6+vFrEDM*_0EKM)dVt7~(<4 zXS+_c>p`;P_W7rNNwkI{A?ifT-~GngB*-&}6Oi&}iA;qB~W6(Ob#e$E}&OBfy@1#P_TA1=>WW~;^7<$v!S_HLm|BVzkzo__&G|hfW}dpb^uzf_lao4H_s7RfwiT1KailSy4>y zL8-94xKommz%_oUbqe^-C^r}~v?;25=k5VnPO$Dj113{o-3RsD*{Oqd@goR1oEz#T zsO%=f7K?GPZO>{iaF4~6j4)C~Jl>Xi?faJ0_U@;ZSiIduAI@*-s?wr7wY``Rv07n7YcgK_&_#muA+`!CbbJnfM-?I9Fv;F|v%koZsc z1tus}^-lK%8(e^EC_$++ce-uLO@K4@Ea#rU-H*2-d)p@r`3!~XrixSH_VP~J;&w7> zUBl|lD$TOC3MK*1Q=Y0{eDPMIE1gedkFPI=bvD`c$(=HpRa8SIbeT(z>EQ&3 z3P%a}e3FUDE^LHu{ubS0fm)k=DU701I`5Vnr2A@OjYVT~ZRKP2tp#n`Bp7UF%#w%~ zz*F%@kczpx>r|iR6*E)H#w3`2F~LYDWrN@iQ2OHTdMIf3NDX3(XiK_z0?9QN?(RmK;>yyESj~`K`w|jZHL&>zcVjZ9=>Cd5c+u zN`#`D{0es)PZYNYyGJ&P0+A$axCoOAXEC2m0E@dwr4hDS|_ga@XVg>&AJaOhzMkpV30=X60&C6 zkUDEgubeh#$*-(ZJSNYjFP@U}_0BRYM!J)MWv}wq* z@z}z1OX*JPnv;w6Gtr*^NouH`B0p6>D;IyZX79|ck>c{99p0FUQ1SG3c}XK-d2A>x z7ezoJC09mJDNmsoA6{;6mX zDZdtpiG_Ho_|SUWyk1h4B+h{fk;JlP3KqyH5ZHZ z_37>WaE~#N{s%^y{`QiwMb#GH+!YliZ45i8(f94Z($;{{q1c9$4mj8}sjvIqe{Y2)v|VIay2FQXP`JhiW9!(lP1Vk+;$ zfI>K1wC7FkUy}qs`%D=7NpY&HdeENuH8({)H z451voK$k_!p?x20~^Fm=z*HSt-P zFt)Tv#RJ+8rmO7sZS31jk4Zp=N)1)m6QSyB@yHD~ZW-dCJrj#?VQpKh)E85C*R|*F z;XN+1Z}CGVvTw?H3=1$H+?&fP(I58hwIryJ4iuwb4K3PViU=`QJpRcl8+~C^S6Ls> zDNI%mW&UQup;tFF!&txhm4c2yK(7Yi@#qXrkTqEdXAyV3$9{zfj87a?5rS^nvA_NB zfd?tpoUa#9E=Q>+ow}_H%ZQg^3Hoi>dz?zG2g;<=Jl=F}pUlfQH-TlZ%YfdKd8Bm# zu%q|pA!6%sYPs$QmId9NW_uRovuc!I)91UK<5@h{nond&b-gP4TolEWij&-o@xi4$%r(R#h(w=0PWVZZFJ=HGYKEi4!7dM5x zY)~?$m-Li)m*5$G7WhXt)1Ohp+cW0J%{e^IgwObw%?pyqB0%?5$aYn)?wYi z1xBS4noDvO)4U9B(lo?!i}r!ib7ItLiz^F&*1!ubZWzd123g01{R?tNu+4k^^m4Ka z@7qt(uF7|Ybm+$2i_nGi!&On=6X3A!;21242?TsPsD5f_D5MOD7@6i&a)@fxP7b`y zdiy0)3S*Ohrou(GhLa(~RYZLNOT zsGfOb=S_tx!4OLxOOorDkbLI`eaCSD>btdT$8bxA^zA&>7!uY0VZ)VbCy=gyhGo#m zS!(yuBXb2@gZCnZ+JEm)Xm&l-?9!yP1n9nzPH^~EcI>4)HaQO;FrUY4PiD*EJcd5M zB(ueL-<1-mjRi4T3PEST4p2;5P_*xHeE?SNA3;+HNZy=Z8ebshK=^3#Sn%gTvB4&| z*ED4C&7tYTc=I$qnLmulI~e{^i6#!gO@zK9StxqxOCG;V$2%gE z?yz#QHGmq1Jqi9CIE8B0HBu3IbPgoLb+$b58Kd~sif3T?qL$n;^r)s#h2*GV^t+do zC{LAW0Ip~_$!Itg??*&B6X5{ne!l{YK1SM}olbxW!a*Oh2;n0VB+bMP1oL!d>y52JQ|z!(@T{c zq^(Q+9B;>6lxmGkY7Q2WKtmGl3Imj1F(zq6{LG|Vj2kB^P5w9(R{vhP)viBL8` z`=h}Luk>{|z$}HU$aJMHUrRvq8W0u&Dvqi@pb7pE^gZ2l`oUYLSW#?xDUB7Ijdusc*P!hG;TD9xc{_+-RzHvRv0 zlwC+R($uCB&$Kdir1w$E40CYr5QIV{j7M3K;>AS(>&Vkf?cB^kNlaeT>sw?NXSo9l zRKLeel!5M&iOAgjn}-J7KNkoC!5)jZ3jMf8uyco)zNTunKc!^|Xf7!izv^VQ2prts za_pC&{I#z*ODc&`7vukF{A8snWyBa+e3(#m-R9niJmje6dF>{bjRtKl} z5WAAE(wBA~k@fDO(-i+_2w!+kV@@AK!WX(7T;Z#3Ja(nm70_4yFfFqJxE4(p>+QtC z5Ajsk&Th`BOUc{PHc256m_|=EsO?{k80yEiOxYpK&z60p*gmn9zvN50-$|Y87AW9; zS5^vf7cLuLdM+%(N{mUqaWmfMvHb&1ME`3ZuO@NnZoNhx2K!sUKl zJQnHxAhi*x-Njv*p2{0)>_6!=)}#E&C`Ir8BwBAAu)m3YV5#}&i6Oq#K_SgZ_SIIp z$A?BF{T+(^)|StUeKhd_{3ED~H;#7Nboa!Skt9$;J)K`Vd0eIHm{?k`ws|VOXs>Xy zE>0DAX>NK=ZRG}_Su*TAq^*k@B!3MCQe=typ}x{I#48(ma}7PE2&dsTb0qlOQ&jR z5lE+MYQaj!my|2S5X!3W)7wEw=ZdLg(c584=gO(4(2vWjYYXFQSuB{DiQ`-Ymx<@1 zDO-_i!4~Q>0M}!{BdHhX8}r$VZpiA6Mjc@%+PC0{S=6$k_D(1fXm3yNsgIJHMough zlQniGZ55Mm!9FZAAzqmy=c$Amrn$NpB+cgpN8dfiZxt(A;v=b`&g3EwS}E0@e_NQv zW3$BTvS2rF=ODm()DOflC(Mc)qY&V@l2)ok4H3y2 zQ^`=U(6Q%;D)MennCtkp?}QB^PbEh5reoQ7`dn(0nqI5#_q|PKS49@OQ_Ls{q$I!# zjW|9QQ9`~;EE7oJjf<3%hE5y2LO^X4y5RNPdi&ih^v=*6rTBaNA4l1uFHy;`tI5gO z3B~&ZDn84y5vYr%I&$M$yE_f)3jPi*80NnZH_e;M1k~z2ZgPQ+@mH$aW|1-bD%HE% zC0gI=2YC~lz~p7ayo2qVXR^(( zDUBa%K-sN$mDBl~tiMC~)|SRXb9uF}Tcn2`9{R?Z*>PcWTEbE(g0O;eTI{o)2(d6l z7-CWwMhMmGCGL~#1t$$o&IvFY{zj=fT5{*-QD>m+5=k`!L=fE2`7^hFeCF;W5T+K< zj@bSQ(n?jN^8|Bez`YrdBjWLEmX`e{j)x6j15zgb!l>}^Op9AD|WIU5;wts|xp?=)jodOnYr<7rDStj$&5>K&d z=0d^?KQPXMbAydauVT<-{CjKAt0F6(_DdlB8%GK0{tHLNNCWr^Cd<{$HsBr&o?|e^ zr-PCIaEbPX_B^Gt|CI`G2u#+6YE2rm+7jb#)J1C#oI(2n=IC3oU*W#M?F|-UBlPLx zsKe|;ON4nd!@BPeapCVIsfjWSI_3HN0BaUxJ?QF!r1rReGfEqCp(v&d=S10&A zlW5v_#1`Y}t_|qv4;c0hS(~i{j%y8$AYLTX_=jSo^gmYVoVCUG*ycv-=m{E}aAhw> zZH#KYa6Q+M7DBKtc z`+pa!KXm4Z_!&8LQDl!~vephSHAUG`{NKQIC7*qKu=|K`g`X9-*VucEJ$PH>{n!48 zid7w(e+=n$$?=GYtS*JZ>`Q7F{;8m!U!p<03L@V7hCegPxM4=M!pu5;PZkOFv}>vp zWuiuJf?|u$hAh1P12KyJQvhFRndl5#7ra76@*Ypq^y!1vepUNR9peEaQbxZtqgyogpj2749v`Hc<>+a5%)B1_yv}VW6C?t0pljvBhe(wB8v-y$xs3EZqq8cH8 z`teQGRTr*&uio3f`c-8V=(`fKtkxgQM1cc+_?^AtjwZ;=gMtgCqxN{KBJUrf2F(B& zlwx1gj{FV(WaR#?gAYLfMz>iY$#omrls$e9lI0r}E#fqxx{ES}2^*A?3CfahmuFv< ztZShBFy3BRCsvcMe&Q~i($wiA-85T6vt3CN+uUi|0pG2Zj`Gs<4;KR@m6oz$O1>`r zjz&?6A2_-(RWmLVUwd_pkG(05lB=Fv6w~A6f6a(vM$A`T`si~Ka9*X`bY;gVj&C+= zwMn8kY{}ng+7k_o7o1e7x_q>ZJ%}PqL-FRn_K=W5M)lj_hbV$mo|3s>y_a`Pn9MAG zq&IMw;LgZ-S@}%{~^{b+X0j`I;;KA$4V3VA_6`Mu;?!iOK5D(RJ5ST}1& ztrEP2>sDHl6NJ^Fa8NHp8 zsBx>Sk@!xeLdHV8yre($?C=GcAgD{|BHL_#Ib({$J!e58CPeP!J@2qnu5ZmY58>_8 zw!ed2pWd2dZ{K1Z14&Ml)z{9=A?M}}Mg$-D$@7tm$Hp>RXn1hdzt+d;eUM-54zs-y z8rG&%rkqKoR@R)ru>J^NFKh8`#A%vLo`h&@nzS=z>*6lFXtj-RlwOP1DpPp4$pfw% zMaJB#Rquq(Q-ro(saWeo#*o3)&tR;3zNrRc!LDxogFH*U$XLk|ZQCRm{+3^ zbo>KQMp>EZj&kaGsO0>>P3rrZvgPU<>g@fp5m7=@NJIT_#bQ%#|FKWCwQ1#gOWJUW zo0dVqNMk)L7k*U-CBR-GlguY|8Y+uj&Bqbi9x+EE{s~Vajp$RQ+!@E|7a29`lJ-}% z!HPE^bb$ zQOtNzIV83xiu9qT7Nj(4ak)ecLt(i%wkMM`YH9gCogIQSYDu{nHg`^;jM{=+45768 z$WzWGk9#xGG7vI}6zLo1oBe{g2;4egEWXFCuCF{?7+yFfA&!fa=)pNb&#*D}>eP`f zUb2^)%t&~?(mX>1e7bt}w09t7(oHZ`(8)EPURfLB9seC$6Qaoy+Hy$6OFA*7p(BGC zckTA)Au*Bxgw@JFt`WP|*j^0|J)grjO2_luKpY#w^Ykeqhu3w))*4A< znZM$yW*DtNJ^pF#_b~aED9%LTdNb>{e!dXe=C7lV5enRdxL@u3MNI;h!gZsbD=5l( zBJnN{C3@AbDuq`cakkzpCZkpq*w)hp_&+;n#F*|gD`iQT6GeIdEhihVrBl^*z?=$q zN8UeL)1z+D5>@hxn)vB0r-HK%H#mbt>l3iQcCSjY-sbfI z0l!S~1T1rWfq%nn|7fmJG4u#kKTacVYz{c{?)qkvFg-VOb@g{|FL%A_k>%3zIR3HE^5Y#+TeC(3w20_9Ok%$Pb7g9>k4_)1g7y*VHL*|;2?cuqSo^QViT znRh*r*;2OQ@WRpy$#6!+=C}cQMdgu$3#v7>D?KnHFlIB{4~DGXf0ay(H3{;rkBtj0 z1Hn!lKL;*LT#%2530^mhu9c_?PBnk77xzX492ba8ae@4A$F&YWAxa3PUsLURSE&`- z1fe#Zw?FkpycNwUytdza*XE|u$xbmLl>bhm!Vxbd534o1R~Y7s+J!8{6r(k-mlg3n zrneUHJ+jvs@japU8u2}(7ofd?2oc46)+Ba2uyJDw2^N#v`2s5mKgK#1Hg(u_#agu^9y;led9>WJEvKqOb8_+vGmR@OahGyO2`mQ+UPcLUJvwepLih{=lZJG zB3?rl1kb#(zT42xIMT0jY}yJY|611=9O|(dDAH8&K^L22TAV1ezMpUUl{m0tM2`7W z!pzn9P+FBkJqg1qQ2dpur2nS_iASxRDRCg^i5SkoTDQoMSIga>>&sGINmE&?DDT%_ z^~e!z9GPYl#bwQh#ahy9&ZUkXUXtsrjGjb07v}4FX`PN9c5B0*)XBaQWuvUilr=f- zt8n_A8m#MCA3#9JD-^J|gLv7$K>M?_e=u+h0Wx?aac4rw%u2QTT1g@dUF02Kr%~83 zGq=~=B3B4AMgE53vHxj$sgko_uTXZ+vf;{8m?z^bgV|g&T*I46M5+Cwi>;i;|L5Vk zuzkGn2d98FMKEa-H)}#1oycWX+EJ!-Rt{}EM@T1(GS?wH?y7Hpyf(q4ZE;@c{U|>_ z>}kHxD#(D%vZSz@AqdcU;YhJ17 ze}aZLPbQPb@s>;KcZI zo3Jypm|VO`87h?*EogXJmTJj<)m<#uye|AyrZFOfbyl|!1vM&HfkyI#IJWqMEl(=8 z=p3kC0WGJTc+r{Uj!1EOF!P-f3b3>+1-%gnI8T$C(ro8!R`|NZ?P&nLCNEYEc^5H`@Xi#(h2gJ8$-e$E5x4fBczUa1tTRU5!2 zWddA)9qSQ;Jj;^zkG#oX|5b=~&lic!im|cC&CUAktU!@AilZ>JOo zC;x@z8QBNH0ag^8A{TBtOt+W&X3Dgca@PH0iKV(4aY$7o+Cg36F=BkPu!+0CjB#J5 z7=y}Ra?eSbqCBUAIU?UpfA*3dM%%@^7(&H)C$Zx`<(1+wG*1>=JrglEn!Cu%z zu?eo2O#b=qiK7&z??RUY1G@sn8qBE1c+2tre2mL!W!UUsGq;ax!R+Xn+EK;fo@wS% z-P6eBULjs5iDptr=8%YJ>VVHQWMYZokRFD|u)ae7PoaKEXUjjD)ICV0Zc1z9&5;tT zO00tBYg;8I6EFS0_YLkCO?n2pBds$#tBKA6{!cY}FX~*#Ad{UPOsniR9(?LcwL^Uz zTudXr(k@n}pORsoq%Dr(LU|d3Xg>x*|FV)5)-mg-V2*~6n$AwV`Q#|_zb`yrr}u|V zC+(zP>aOF?xk;WZh6_XL^EW@!eB-a%BDfp;Ym^KbrRMy1DIsxCPWATy#k%iGc$q}B zwq|JP<>w*5@cjqVnZ#kL!p!Dh7>WawwKT>|9nn-uqbg$gq|j%$7ta+I-3CSBv?8NY zV#lO@yIhkH?{yY6w4rj+@rz^4iwBmno!?Ey3iT7{R*#A;@DKaJImR!f(4@Fr8T$cKx=TsDR&BvL#xJ$dq^NwE-VRy1 zOI+PqW5E#nfk)c0q}&nv0ZqC~QTgE`tq6|!0H%v%@joFOzBO9srh`v0(DJuLkb0`>~z6w z$?gE3d_+UgF`mgo0P-6OC|#`9$lf5#XSR?;jAy!##80hhy`C^Nv^TC$dE__pP`nt= z*deM|&#X{+6gT=%yqM3#Av0Ld&QPZ0H_}kNU>fxhR;*{FkZi<&)ZS%;fZSeYm~Qc% zY?yB8opl%|Y8RrAYm8@>kn2yaxxG(_@4>z3i0|Kf6A?GWcW7b0DeTy^g51CGK}Qz( zZNN;!@)oeZWbX*Bpr`dg5N@+ZdH0q1GX(=%wJ@xw^FqnOM+`asa;K?w10)-EMdb}- zPEPUa3mR8>GU^uY3Ft)9%=@J5F@)Jx0Sk0?{7)I`3oD&_21VsK8v;e;^_hbYGU_94 ziA2)zQzRm0*iFg)^K^C&%`Rc;3$7cQcdy&hC_bsiVNRP~o(VBaKc+I3E!~fTRyr`B z8DhA$wUxo6^hB9U#rfi6V91&DFphoR4=29iOU?+F)QzJMBFD#6GU4lFb6uEo_1aj? z)W@;jBEs3c73sU}wHU$bjQE6OsVyXvt8U{R)I*ZEdA2-qes*;R`ejaSdAc2@;;9{I zy4Z77+xQF5~Jr=Jbxkct$QK!ead5it8=_xNvC6> z61Z+X3;&O$YXGvOX|`kAwr$%xwy|Sl$JUN#cE`4D+t!Y4+s1wO`{PA)M4ryRx1y`7 zvZ}JXGLIs)B_F{W1P{TFf?vZ&E-*~ISF+*S8j&dXATi5;PFY^S2bdS)=>lNzQC2)P zFMvXhGx35}{}>~KV7HK+G$MOO^g`3HdRt;3=MiUTW4QL|LW18mRo+}DAvcZ z+brXrvGua(UDUzBKUj8xCB^%>44(?INToOR^VhaVEl2)9FShj3avV(%u^r7=b`z9+ zS=tacp%X_nE_HWAv0^W0`Dd>%`YDzec5M}01>XVgMmf|i5^{wt-u7shzL!t0thH0M zi<1_ooqdWx0XsCAlBngQ6!?j800^u4_I1}*DETKR!s@U;W`siSx}dvEs5 zKz(P)n=U*_`>B(1YpDbLa`KJQ&53atfUE?}HpP#e$J?hz7zPu_DDonjc72K40`jnc zDs6fSZUb|RrN#3c&FWf$DMCx=E`T9eM+Fja6E)_~8aC4eC~W~Sf^CPlB(4PA$AvnK z{mSR>i%z&8jGDLQO*kkRGUsJuW8}wccbzZVgPXh&Fjhft-ubCAj@yS(^n1;AK(=uu z1o0D&5wVPAxmo9Lcm4&LoIT(P%%8wO(r~BUK(mP2a^vXTu5-#ztYlMQtlQvw9@N4o z!PzGD2&uK6@%mbKfmf3EzJVfMzKL?H)^uSFZ%JKIX(D*#2qMS9Ka1WIun(7$QFt4E7_SsSEg zvqwW6dwtOcfD2SOGKaJl{OwGy^^Su${kle4@~!aL+@g~_^T5Rx??_v&j&j>`U0!vU zFwz0ZEw8$g|CdFBpLv1a-?N*9BT5}{)2K7bt)WCUyd@B-4`aokDfcXyV|?xORA}*I zxh-~PaW-alwjHCE`fcVU3$~pCZ4i3O_7xs2YChc+&eqoK1@@mhsf{`-S8nE?=iXWw zcJ7QSXm~eM6dKZ_DbOsS=-ymp7N=n~pS2OflOO>prmu|x@xqfP-wdPomb`z3CliyN zjc7JW<8~Scq^)r9q7|pJAUcq?V%_s*>yVWO8t+tnaeI&)H5I|4q@#;Xy4%FMR5vMv zXs@?+1Vc9ts>U#EVBd3GmV?L)E07ksG}YHyvoSRm?0s@DIS+k;{s-eRIWK)8{|D1C zIrn`+{|A#XInRCm{0BGsqwpTC%p{jwH@=6WbdP=hSHec|j*IE*q-vqR4dsUdeR7_o zl1P=wYdOS@g;a{4PkMaw{Wr3nR1?Ti54RoeT=!y`V?%-F>$ZvHlH&fg`(HdNw-3UT zGUINC-pMGsk8M-QrTdOqAj!0O#27$rA?-e38cH>q;9zYOZii(E$gasV;ck!;#7ceV zkdjr;A;jhu#m1=FpO%u2wb4g&5;eR+q@C25=cG}pPRvDdL?uz;O*XI;n01>BO~%j| zcdZ*_7$I@`1jvs1>RlPPtrPw_m`86UYk*WFW1FA8!+!c~tSpmOQU#uB%!NrT9r6j{ z<|E5B6*jWicpG{L8>J;&!IWBw4C8Br!Nw~rP0P=i0UWzhzl4vt z`axOM-6A``gk3s*rj2nf=Ld=YbpY<-+TA)8y~krv3Q&2c=w%_-vteH?#&U?9%Jza< zalQyo&dg}|(sZEXEi}O{9_=TEy9+BrhEsuoQ^ABOKtY_-=8<4?j9>~AqYx*pfDom~ zBvD-lu;d%`0V2Vzu-*&c(GDi8P#$tBG1h$k~ zCg0bZc||sZoIc_>L9Z+?XE+s$pXGkwaZCA%)n|yZvD0d@V;!cnW)ciUvAWM{*yEes!x6I8q7E7aq0H65!xDX*29#vmoO zlXaz7PuOI~tT&^}OoBz9PS>5se(<9WmHG~<3-<;so<}o_+&!untu?|2s$=FXwlaRO3S?(V*F@^?ji?Ov zi4O|ghv7X*5&VlFjHGX^C(69!7g0z-&x!!dS#SWd80(HAve-LUAap+4&IM7(qe9TZ zJusUyWMc6M`U4ytL3e{5#K8kxh5m0Ven`V2vmHZb)%PAy`jfRQaLpOUP8gyPI$uXG zl=&A7eOU7rtg!2E0PCj?)~%%%LqJL)(7=IaJ@=_YG@EO_x0?*W6sP1a>O5d<*FjF) zETaYg;V=Q3fS;W8qs@(spnz=~#Q-9-3;{0QekJk848$A`j|3}F2NOyI6-omZOk)ub zFuw#`O0^=DedQLok~Wo%4TO5ARR6|I&R~;Kfh3)`OU_csl$#&5B+a-0MSWTC!h%C> z;)14MO1%A(elj7fI+VK?|rbTz%DPx-#A?gty9H$~t;vSy_q#tl<6!Axfb%Zl2 zFjYpG7L)r2%q?Zb?v3jg6@Kum4UKu=;(%Qso<|-bqBH`2xX82FGxK%Izwvw8 z-xZQ|x&m}O7Gt@XXw8vvLCLYq&PG)MKj3`Vh|saBe13{Ppg>NNCO|Sk>RqNa)!`2A z#|^tL**r8tuJf6=0q*oZyWlp%mrg6Y{oQ2I?SbiV-4gr39d>xpY&LgkyJSj^>(3Hz z$YSg?|At4h1!juwp+|T*X7(?#d3yQYvPZfFW~%OyNBTr}mamE8Z24ZeGbM&Gv3a#B ztNgr2z6GTech)bld3^cax<{%7X0q<#$7tEkbbnTB zK#`HqWW7;|J*Ea{xcGwkw=S+Coz7H}==)K`mM&&=7OSg92{x{!*9Y==&XHTxIA%6; z&?$snEIi+g#pOUgZS+QBP)p7Bj9Eb^hf5qKi4VCo9$+?Pxse3m{p^90AnGItjNQ>GrGdD|MNSAd?Xb@P#S8yH31I&kiyZzC=Wv>^|Jb8 z&ym)5tO|e~4I@;~lbhK8x_ZDf4C%-A!_Q({8K4ckZNHEd*%SHh ziqc$u{QDi(;&nS$))jnr{IesS`iw%F_=qg-m*%mi4@%E1tQTa1X#~Q86-h10`DwKQ z92)HyJxvRQa*6faephh$^Ub3A)h{WW2iGgs@W=ELyI724%p|rh@%i6OJ*a1-*gMW= zdj(y=EQ4C<1NLqrVHqQW-oC)y(%~Suv(z|i^Cd1TY-ty29Tx^)=4Vh^fH>E}`EMl> zHGrt#hlfAX3;_9m$IIj=07?=7fW60yQ39Mk&fVf~n)*6A867bVvX;Vg;Ui5f#Q{|# zh}RG~h0bleITv2Ui;$tzHiB=1A*FDx{eJDRIjFpSgHKjC=MaOYg5)D1mV7WdXKyDSdcV=IP9NCfY=sUz$TDE&)(v+w_Cbgb_UgO$6d>mg= z%A@U3n&hnsN5rBX!WZIBF+*Zv41t^#XF!k$1Wx~f3?SJ3599-Z@;MNc5xph`E&YyQ z>+yyp9jwwqVOs}+-!(w+3WUn#`gB=~&nblc#E$bm4sn6~$lpCFV>?wu=`6*^U zHMBhD>mC!{8rlTc{w=ZdCh8^3NKgfvfR=P`AcSN@_q7&Fn3kdy$|E(~MZAUF6-i+n zpR{5e$5Oi$*n55KKVvEU&>D(>Lm;gFAql=c#*o}5@>7?@s)9JF^w;}d z6`~4xbo3$vT}&`|+Hjm6R{4;Qv&`Gv2jI8gcL0Si6!so}zX51=zhoc!CfgVSlS$6* z@d*g>4y*$|4$&y3OhkTTvS-?71YuceaN;XJ1%@}^cLmmob{=0CT+96## zxb3Gf#`f>WdUIVf75 zSikpRLHA&F?F(4O=B@$~*MZ^wu43d7sJIk|! z+4;?(&8#yqCMT2K|iS zH@ksaPN@Ho6vx#2ktcyw**Z{V5%~Eu#sWj+^1>q!KKI-4B@HB&Xm`u>qB{b?8Cv~A zsX9D0Z>kjnfT|nJ<{3yIo|I>Yx2uYM1Z-;1YXla7T~MSVBI6DSW7qQmU}Mu02@)b8 zs|(;kluM7HHh$LXzsi&JI{rgF<>3GwR_3&kumtY<1?@lsI@)3{`PBd9fPv%?UxdU_ zvHhmMU;r>Hd+c{`U06n80g<(%9(&cE{Qlqp5db{`s=p}UCXt>|JaYOpOqhu#y`Igl zdUsrRqIbBzN`XvD=IaJNw(xi?}$h5j7PF6H5^Cpghw4Y z&RZhw4n_KzG%E^87Zwvwj!73UNf%fXZuCbTf1I}z+pqKVJydHtX;!w9E{G=Fn2$PQ zowtfM!pSoe4mN`SIOzP$O^g1NrtogC=p4H%IR`?yW2&I-b0U3lp5 zo1`*ah6nK9;Hr^RGZ9op%Vz!Q7obQxuqx=DL(sp$TNA7b6ej^WShuC8i1&QTx&E}6 zFYxAT&&nm3?N3vtNw(I+SIX-x7&`Fl-A&b<;9Sm9^l_@}qH(uZgnz+A_I*z%(a|pc z2L8!{O~56Q8PF%i1r4Og!lziC8;0Rmjlg9)CUUT03Rf?u5a$e8}&Dy~uN%Vy^S?MhM~zV9|r zQlA78me)#`J{#JI{%%Vs2U&8|ot4j%>rft8sZNMb?nfan#O%@l&x$eTu{G6HMy+nk zV^MSc8}FS9<#ktQ0!uH4V*9P@;&EJspPuIsjx22x$|0@YeRboC&ez=5&QvUL-Tk{A z${5d{L3>@YQ^l#ShLjc0!X9vkFT4}d=qiYO_}Q`kf3BrA=Ae0yV+Tk#12=9ZUsqm{ z{>yUKi#i(BI3&5RduMZp^{evrS%ll|W036`Cnd)MS6n@Yl=aK(%%H?b#yfVHiA-?t zK1z1Bq0406g`t+s8h^4;TZ^`bg zmV-RCWb#>x%MG-eu=^x)*)9+-*&dJ z8-$;0%jhl4z&B2Db$$uL8=3>|>;WzGi*EopP~jLR>e`z-(#blaQS-DPipC8)({8w$ z7fj`>l<)#y4GucIiR{Nk&K3OheD=;5**0@F=SiqV8T3M&B)&~aqIW73Itwe+Hdkk` z6l_`n40mGkrauFp3m4n{No#^y8d!v9AQbRD-U>7k#T1nAU^q3twSc+hx98?EF3*vg zULg276M}|u3DD(ayGRz>5xu^M&*Z)tdVw>HEl}*u-Uqzdjvxe%;O)<%(O(6`I3+fG z11fJh@gl{_u$uFhPO+`fy&U9`{xEBu7`YO+ni(_u}A1(;~Bix*~m!?Ci6XH5dD>97;#=&omc$77@ zhFJUY>K?;svpiPY;6wQ6sG^o%bOZ2 z`IOCB;Ed1br(mTWBBq3X#h(3}5c4B4&>Ru_GV#mL`EoESt7XPIm$}WOoRTHuYJ<%MwND?tO z9l}c$q3}CuQK!LWY#H-7?b6hS5HGn@)Hngu!o9jYB6%T(mI7`Ud3sT1m^cO$?+wx` z|Ayc8qy}oaFW-*s6}5(DvC0VvaAE;JtShJ)=TZ}JeQ`7MRE<(G9LhUkfbZ^lmloXS zP!k}n&~^+O3sM=Aavz=mq&e>`*M@S<*#lA@UK_K3iwLl92JCxFua0?O4wh{UnG0+c z6h?{Ef{i(RoC8(14FGEoBG9|mCY!-#Ms>tA+S%zIczKVRr7vUK@)tW^{WJXsNOaX- z!TX1Cg80t6y?8U=>#!@heS44Xff9g7Qh@o5FDgN=UXTeQAg^N2J*hUqs+wtkWf^fOw<9{Bn8F*1CoMs%JT0{Q3>*I9}$TqTg$JP;0UR&m!OD> z)cyAxXw*M%+`l76)C=@PBql$Rao&ZA3kbz!0i}-iHla#o$|qhI@DKEt728Yalv(=b z11cT{j*LJ4vI|zaM+;{BnC;$@o9*UvS)yI(lJ0tNUZ})%uB$;QC=iy6b1P@X`e^O3_W<0wyQu1l;%raIXZ@crZt7z5vYaOS!h&E4Xp3 zE>3Our8f!@o7~)}Iy?E&BoB)Son$M>;SFlZT}vvb+r_kwmwNt~iC#DXS?s-meBu=q zhJ&@0-07eT;KJzA;Jv|%y#B^EEzoJ_o9xce%*R{2e60bkxbc>=R*nGtq=#N)niUY_ zg7C+UO8s|x-G?OG`s@h?EoZ`;Oa+*3Jt%nJXn~M-+^KLWsX&h`(q^4XIc!g;+0{ z*a}*{5qkd4=TB@6SijlJ0*kBf-dk9o_}m8UH(Z~1>DB1ZtnM*pph)N*t8HlgCjQBM zPvR3F4%EbTkHrE-TK8B$9kv%R@Qf&FFrR<}1yTG!nU)WJsleh;+}?^aDxbcXw@=}e zsR`0vy7Ql56EUHb(ZTj=WcWVoy!=nRoFM!=F@hl#V2o|w%0B+>)hlS1LI(0>|HrNL zt6a{>$HVV86<<=}(3e}pPhV@zx`f_{-mKoR-khDOok_=|+#`<%$2;gZ@*Vd{(>uN# z;w1G{lo{xG=tDA+FOe27To7m0IJrQ5I5U(na}g%!2E;LU68=C0&~~t~WRb9-7!X{@ z2J|rvks7FbFp?FJH*^wah;W~h5Kk`*v7+PI6r7|?d2v0Sh>M-fA)!y}Pz{x~g= zcF-{Z$i1bAA?%@sh#}(PY|tlU9PsaQBmt0z%_84;V>=*kdL#kRhi)R@L}PzM43W*S z<9?Aig4|1yaD#fG$8lQ@z8h5*YY>jqY{6IKxGiqIwOqdGPAWDp9<@TjsR?>;%)!xg zR9vTg8Q89si|CjkVzgk*Q)z=zF7RZq(xeNaHD5Lu0*p>UJ4tTpu-jw1$B614?umTj zKh~msbGyfo8}b3UrsWzQ^;=7*j7{fEKAn6}6E$%B8d@v=6^7S0SQS`M2_~x}1j;6wU!Z2Rw*=8GW(1NMbug!{WJWV1sj@ zWdyrq7A0z23U1@qJ`H`|>IMd@ z3)+c0>Ju?9k1x(->&;g)Q`4O*HMiN8ZW1+SLRQx%sVb>;EC=M*Bsqd?s4xZ+Lqt`i z1f^H`heW^;oe>X>-Wa2P8{Oh@G}H!|N$KNo^cJIv%J`;wf!Ua1!8&1W%|8IZRRIApGl0-nSGhvI7QgHT*+vIP^;By$ z{Xs>}e^1)MA@)iqb!=~~(2-|3GI$B-`%54{a7E@DrGL0QG6K@G$vK%QotsA9bH902 zy#N6u=cD=lWfte#N${ygaAVgjp5dO-rq!(5<}l?Pe@g-W`gv)?qG}@RCas=Mu3_DBq+;`}2B>!4 z^s%U-;(y7kSG^qWcAS#s!t@wR(^!|?3?Kgn*dX1A=oRZJ8P(t2(X9@4qCDSvU&?>P z%HvsWwX8J-U5})@Z-HO&-pK}5#spScDmFg6JEaqvmkt&OWEkAg_)KBeg3uFB_D@JF z>818VrQxKdu=Wj=xZ#2?u&vd7pES434KEXE=OowH)JU?}bQ+f|ozbZ_s?5Lx}s{&1IRn$%44JH*E0lkFwyizBCi-Eg?Ed88&1NeLA z2X$Qnc}$+`LK>%k{N0bK1l;bSD=zN!dIWl|LDI{+6--QYH2>zdWm1oYer=Cqidi$M zZ+lCLZ49gNp4cg|>wP8rxEkh;{rS_=s~_O4R3|5{LNuye&m0z|ATVvXcjmw@P)1G$ zE^z1{5XQVo$Mo#hA~|fu(`NRAgh3FvC3qE2d$C;tp(?@I5hT;%TR3TB{6_$^G7?^B zg$lfGbd5N2VJeV&rBAXAi+MD45BTQf6G>=*--}x~8up?PSFcw1xi+Z~-8yPP z`KG!e?wEf(GST#drAJJd?hNM0`m1POV*C#KtEike$rPHgeDaQf(b_q*?@miswbhgw zh$Z{#qf?qz?*xDtvhNOz(K_-#Qg{9^X6KGucV2bW0f-TH?$8*|C`KonipFufO_3R` z(+@EJ({JC|OcQI-s~>U%(AGba&s`!?nilVjC;T+T*IO5@?y1-2)ciAoMkdvMO%!5E zP@1Kb2#`>1o)yhCsx7yso*D6cc7%gZVH$ywn0~OFjvw|v5NwI9>0FfAob+GT4 zyBb|>ykbxTCK`c1>7mkwdghUHXJIX>S6Dz!%)NN-cYbn?&a$(k$r;%&-(YMP53TBr@Av~|u~ zEHQW=LNZgb;gT$Xvxy)D+a?^%a|~G~ZB#ojqm)@DV28~Gxz>(x$H@rqDtcjh8^`Z( zN_?B6k=ySek)f}@$?dR*B~-lCnj@Ip#Ush&Rw}q~kpQV>WWRlOdiP%|h9g9HzK2yE zMsD{3Ap27C+JyPu>zT|5xX6=yCIgHZ9y$QeWS;@}yq{d&@*RX4S`4+7Fq(G3btVfu zwe>yqQBTf09NAKM&SKWNiGP~hhexV)mu&RWBcaxZm4}G!Y#$`WjlV*LSKXUH*rr79paGSCDUjZfxHqX=&foQIbw6qabBl zsA^~zbVyrT^``|&3sP^%vWIOL7 zdGzQ-^-IfQTP58I$Bb#9vn@{>9m-#Z2naqh(zESlL(LAFw}Acm@*t#0FKs5lPhRL|z)8H6Yr44=ETmW66`2G2dUiAr88@7w*u}RFXTr@83W~(UP{ps;sVFI|=;<)0 zEX8o~nVfH*3D)wR6)o2%7w5NmIi&GvgPru$%-r16%%9h=;o^HKB1*k`xO1HJV5*$- z`ei5upA-9`WN$4`&HEhnGzS}##5?5mhUf-#N7@MbD7PL`#iH)gG@IA9wtD0?aLUtF z8C3S584IMj8yJP8<*yKhqDFcwXfjC^4%i|pAJs$AlAPCS8WZ#9J4da#^Yi-`FmCcQ z*KfU(0|>F@@!Z$w3%EHoq1k%i*N zBnZXY{aJxMO~@50u0^{J^H<&!6+;en{2gG~{(Y0|FnWo3L7WSAUbi4Zn4&CT{I1f= z^;!nyP>U!;H~qlbui>`q#&*?5p9FC%TMsbRT(l?lTzc}VHZHFK9ATx1uVE$E%BPB3 zhYmN?zaqG=xqe&bH-8DYNM*xST>{qF+%DMIT~9PKI|OHevy;Ns-)68VMzz)qmAL(S>5GGlV& zyLU(oepY=vn%`u7;9>)m%W97u*~_v{&CPQd*bFw1X&+MgIW57v5H2$E;2b^OY4?NGIXFhZ@hN zL%5aiHc;8mx(-HQ*D5Z=5;}P89xCnD9uscFeq->74=`qS zhW3e{rThSB@qW^J8+Dk^VopXPyE!viofvpu32az=BQ{#(EKe+CdJUQrtv=2~BC|sO zzRG#IDDg3D=^qn-muOH6`W3~CW0x9k#GVbZ3Pt{afHMA<03bYYH(E$Of2G}FlDKaf z)IF+L-7TFQ1XqI3H|BI8oK1~S+$doEQqG5i^jc`5q0wD%jC&qK#UO%*>!`+#eGf!PwCz#hRE3yY-%a;bR<%c9x1}JTcb@sH=CxWz%Nu4G?vvSN|7JIC3bFj!H zV%URF!-5#G@<++MV+=8Cp?Ws)kEKqF+|i<`A-_o`pGx#iQqb}nz43Uo|}A0 zDji`ZrEBLN5v3YWQ=j+@x1*ry#j4KiST%Hdr1hLUDkgV_LMl!D2EiW+`uo078QQ-F zTCy|R7T-8H>-XKS(t*^ zN?{6dVoOvJD+{OAvPEUTwCaUVUb=|L)&pDq9C7a zN?tG7M#IN80mQ_?2IssC8f8NI<&V89q-QOJoCSWKl;2^!19eEx*Ud~PZL6>hQ1rCu z$U%KkPGx>U%;!vubhNTt)J#_a+7n3E<(Ew#T5WQ^J&S$?y?_%{_qIYxez^~T+Jxe_ zN+Mx?tNOnl{gsb4ZKlb~(+p@-=b|oO|D?lV+M^@%=L10h8b6>HxH#BYi|zt04)}p0 zx_hh>D8hl}NHq#raek$IEOX`Ot63d;{h?TcCFR%*RmeTd@cg?q8w=V|cDsXfv$RnT z*;y$j_w=v?RDPj}g_DbJ!Mo)3a|tKcwZsnLn{&g5?{dB`CKB1z`3Xc`5Hc+X|6AA+ zl=SN^pcQqV5I}ta$SL~1$;qjC-C4)Hz$Z2~PEEa{z41`MhP}+WXJQjLIsz+P;l0~C zmZP%cBzsQJ7gdYMD>Sx3wQqn!m?J=Fc}KZP3ldce&--m`h0IuuL>dc_{^h?0*s-)C zp_6#B!fj2y*k5+}b{vP#OD`1y&-L7LE7jWPk%@NZ-7fs4k;QRcO6kVG4M6IK``!iI zKm!8K!J`?z0B^j$5L8Lb?GW5?h@vo?B1@3OimyTlEwJDTzU9dB z+y8R&E1g7I))P44@ak%$OUqC^X;IZ5Ep-tGhNswqpj`rU8AMv4hGXU9tcT=Ce6Wm= zJ3&70xxGrQop8s#?)gIA9IV`N-zwcY22k5eU>Oa1Bht+bN6uDmeBzJDbq5-EE#l&g z$oT~W0Vfa$4wZL9wOide?C}*IUX$%14SJ?Jl^S>HwN0}0Xt!;!^hmUgvh=9G78-w2 z?DZlXOosR%9!!RQARJJ`zu@=lF??>*c>RjM1(q!5`Hy9rQ6T9OzHHU7#bR#qkX(#>=rN8IJ1&%E`-Rh;lU}=+8ONs_X%t#7opSlTvU+Uj7^CR{c>J; zaX8!B4M>}+>_O7`dB#qUXUPJ2h`Ye5Os3=x@(VvEh_A?4$(w+pSC0n;wgt)z8+2jA zH@;ZvAYVdi?5Q{N2)Ivj{;I6Yr0~G+XFnATJXa*Dg1Nmoa$3EA9G9V-<)}NPjK3pq zHwJ2C82{JY&oc5WZ!t@j)Rg2JBHymoM0{k%VNXs~b~+0#RtHhyy#Ayq_~zug`l)J@ zQeD6eqxrl2J*QQL*|rnz(o`X-dum z3M9SLm(JZ9M{4wA0HiOK6+}j8vS&)bBt{Z=?I@CMAuA0xA{tx;pvrpq;t@93At^;E zy#?@5MhbWSC&Gd7N4)ryK|MMn9=SPxi6*Q@qF0hTzw;kf6XBJZ&z!$2j^7_2Q);59 z(VyHoVV1j6T`17MFlvYKZ<}ACeEI!B90zCj1U-qrVFJb zkG1Zx?@}LDZdV>M-+bPxKN~+Cz8Sws0*b=%G7jEE$Ia39Fi65dcrnHVNR%L*apK70 z27?Gd4`oQCLDP{Btw=^ec(KO7NJc?{qJS5KL=OXO{&s<4 zER4gWE@oL3wi)y%*%x=q z?0x_}x9!}iztihC%a2qP{0cy}t1Drs3&2m@xp?}FxaD^>N%V7{tZGQgGsWaO;XL%IZfV9CKhhnz5}lj zn7Fgbx7R&w_V_2ZC!3q3D(01Hcw@1{Uzu${uRp3d_D$d@G&}V&{q5myxWm0;`LL); zh*aTWYbC10So~w6U=FoMjR(BlQGZ)|r9iM*!dF3!qot z=#cSIa$D92xN4I05A7NAdz6d=;fth=5 zQ--gIZNxp3Ge0+Ug1S?>bN%)J%`SDTBGxmq>c~8mSnBG~b_p6rR6^4MlevnOWe#o= zCkNZErp4Yayt^Y6K|YgzlFv7eW*w^V+FQ4@%X193f0;H1`>X)fFGqshnhKjA4pkW# zn#67OHpfD)rb|_I?~^f6=aBA*`8G?NQRf;h3KF*9PYV}Vn(ENm4>X7s+sWx39V^M{ z>wJD8qbuw!@S_*bJ0e#MtzgX~yVAs#LO^v*R@5 z6$(YG*yFfCNxiXF5Eg>rECs2E#+(n8apE*%6^h|BBNcYARD7Txqo>3#13cJoC2z@H zGbgluweVEbnnd?$4~GpVt+)hd*IRm$!Si)K=@-`Lz{88TfAV;-Vk4z89GkV5R9AzI zPHADk=dVw^Wo+}WV#7h4)jTb@pF1=YnddEP8||#l|Fae=2iM@Fyv;|7j?z1-{>>^) zz}kny-FJExK}i-g!^zPvvzDGv`9y<_kn07XN6k%jm|E;&szZw~bv%_a=d0R+KV4Zp zV&Ygc!BGoPvLG@`)9PdW$r{0m9IWC*-bUO7q0@#kvWxRc_sJyC=bvG3x^U@s>37LY z)k!Xry74IGHs3zan9CPw>zt|bR>Iv`uS#g&0&KaoZCyPTAdgK0>$TAa(dl&p@*a?p zN@Yu4_Ugq0LZEzszT!)fH|ck;^@-h96jNWLy`kijjY*40ZEJb=cB8+Fn71??3iXxRM;t zJMRGzZQYJF@%EMujomxer=1@OZ}Mz4N=VS z>BU2B^U_YzqV>Ry+{($zVW_%=#O}hlSb|cC>bzZmG!-|^>~588CYl$OY06d02!nIF zvX2;@C}y3lOkjEPue2-0$JN;MY$Sm*coboxJQ{$1ctAc+kd31zs5}e`nlp3;b_?A`?TA?mmLYFGo?MZ^2#MTfQu))IO#*L_;vgaHWCN zy`5DZJN(Z0t?}(Cp{br%k57)bsB_HMZF5JOf0!_3(1wCHsSX8`xE-B*VtyLz$6D&G z@v3gA>HKosGWGg?hO=#YSh*))tqgy1;DNj~o=nbDWWx6~>6lB=@;YeW+O_Xp?2N^K zD87uP8EW$C7*2n{|2-3$Ei?5lw1nn0sQFs`fw|Ot?Ak<8ecqJjzbAFBfvv;fc560V zev+=Kepu{KR7m6T$!`=bR$L@lOr2-iL)& zk`|{$PEq1>E1xs|r?f`wmdnLBTy)viASD@L|BN!lHh!h9tqPU)JSLSb(#{)z>79(Z zgxQ(fFFy4jc6)fw7#R@FV|%4H00NSW03X<{nM0L4T3OULCX*Ezq^8*XsE#XsCJPYM zKRu`>)v?1BF3}PZA5GKjNT>w%2TGw_%I!a895`~(UQvyeWpps~EUe#&UQB+~fG&h` zu}}u1X0W*N^oN|Q63K&Nr%8n`j0g9@uO0T~iHN|%a-IPc57H#*bko--Br_1>jzhC; zU?M`YG2;x;*;L)Ny^ao)=rkk1b7hgRr5?mGqzT^Q#Tr=n23GW{0$g?4zHcrNK5;z} zwn~mQ1azucxA&G@@-`<~Cl& z_vQ7>V%E47%$C=lAiWhPBu6&Q$*2^^aKv2Aj-%MkO3T+%Yk3uhu{1gQ&l+sGjwh19 z6+6!kVq;@5LP&e!L{E8|i5eL`KLTQc9D{BOH}c&vV^N{63=YDIj}&>fHzf65{L;IB z)v4g$+vb!}d&Fdy_dBu+6b~cn(K2xRUA+`LcoI~VHhGe!uZP)8!@v15-2|dIFt92J z>~OIq=~AGkhj6J;m=-OSPI0O2Q%(;c0lsrBcKv|^5MjkiPFGsvli8f&M&hsrgeh`q z|7=OBmY_~kN|uu&w@*VFl|}Zt^D6PhgU3SiyCoBKt9iAMdCL)&7@)L%VXq83JjOF3 z7!`RgA=jU{ZG|wA?SQn!3RQJJ9YYu8&n+6c5c|N543fqCU#H|%z?7MxW!g&rT_1Gt zE&&UY10-@_ZlK4W>naSo6Mq-zHhgYqZR2Po{2B^T zQT`r$tNuI9A*I(!2;Y4oZ}o+FIoSCuT)XnUsZMpIUGt6SLYmXA^5}-G_Wj%Y+PI2K zJ45vq)x?olA}7u#~lfuf|9N(mmK@WS(pl2YgPvUU4L#9=7?T-eLzHxr5S4o z;IDTAf8nXG^Im<2HQAH8{$XPLhVL{_t9eCQX8SH;ki|&ovKNV=i_5MKlOgf*#rqEcYTOnu0bn%4 zzQ$)#o6hqI6vOvsl9$pLG0bCVfqLhk=*S1bYOWz{A(ao0tnBS;zk;7xFcazf2S3-! zX9GRj!Bn4Nqns6X?T4(#eMW|w_K2sWvl&V|eY+w;5>1&^=GDq7rR~9&pkN+81F#-q z5#GHr-Y|LKZu?@FL9h!s`v!NtZjl6Vx$-#skeZ;{kgGwFfRL>Tiifxw^c%Js)L-EQ zJ$C?|#$-?PI(%p#iX8h|I%L4GN#qqazfMb!bCnGZ13f8 z-|(8#`Ip-_0NP|}2>~Ek)e-BHqpfW~(j~&M+4mLmAN^_B1+tVM%wb?W8wy$XPPl>9r7-Tu30jP;$&V;-AV(dZBo zIHi?ai%_t`g=5Wj`vjOq_+<5j+bWsR(5J9K(3p8g)A(C5QdB#!c2HBn zsFqv^^-ET!hH(>PJq;#trM9{S=_*-_FtHAFKwm7R{NSgDNYx&LlRF=d+z{gklFWPu z_&lo)KS`$nD6b4L8sT*hx!vLJ4xk&s7fB$yd*}fnKx7$I^sQVHW z?dcRLoBR8TnEH8A3Z%~jA`d%KDi~j^n*)@V2ed%_VbtaU`2UV#30xxonD<$MYm!=-YMZ=DD@A zpA0C4Qk6Q6)|{`rd=(MC)0pvWdVjR+IV0_ym49ehfGN`WiG2d>3Ynebdd5iK$r>Le zk58isfYTnoU%c1Zhj8*Z%jpT72J~3qf(X7$Fd0g}>8|9hmM5Iu*D7Bhc}E@apsj%i z4k>Qky;N8ZNB-grRV_C=XmB6OAO6|OtEJ61!f5b5?c5Qe&22nG147pdUf;+T?3Xq? zgj;|0Uz@3^a|T&Cr4GCBOnHAa7S3$c68(6vd>E=zrrnb5-h<1@zi% zy+^&$T*E!DGof>;P}6E#%F1YQ0>?0^@{WAV8kP7M_U({mqyGm*u~n@Q?chRTkkwG) z9JP6Ir0m_p73JusvC^s`o2+V-6pUn{u@ZK^l{(|PJ#va`*~Wq+a!OJOhS01bQ-J`f zPkV%FR83ilESvUhz+uYZ~-wmE2wl#tSAX9&iyzBFPxTZ z)nZLiNs)22+n29JB#<>YQ}*LUp4J&T1nNq)rz%yi?;4*XHOga%cM(6NGRjY+!{Jl@ zICQg70fbpC0m6nEAkVySfV&jvycGnJaX@V9E?_kJ0&s1*deDasOrWDbY`w3$p>~6X z9InpEZ$xVA-t-=~eJP>zsr`QdnLuX0*y&BYLtLYqN);;&jkle{N2-|I=8j3ZDsSb` zkH1h5hK37#A;$|lh16(4K+nRDW)(S78U0X@BZT;3J}-9Kx{yfFb|G;q0XN4UwzQW} z4*~g0HhU7L^FPY>Utr)%;G5`1=L2pL&(b^P;%rl=+~HsE?+Q{5%{X8ino+AsnWLIH znx`o=qtqP>=t(w9L)lnzo3KnXd+iW};bn^P#t^ESHCm%q4gG6hC~hcL+Gpi2F$_!$+ds z`QM8f_;27=bfbI~PZ0sfG#5_Fq-QS(9{=GjB3VP9i1soj@vT_I!<|9rBL%h#RD^S0GoioZE&YuOjzlY@C7nI4y# z@aTx?jo7l#TklMfF|et!!^Ypy5u@X($_<+)Cv4PemSUp?IL?h0B-8$UGP{L{j>^QC z_3YctF+mlbHMNz&5_H-Vot?p0v@aOz?2fLV0w6UzfrQs~sR2?rxsz|<2gap7FomW$ z1Ja@>nXVhlXV5e#D>bSd>P~XQLf&Hf>m&gG{vTrChu~>+JA|&{v0~8H;!Tcq*4{Z8 zzOTMSiu9&ehuFtY)b|z6PX8R1iyel=n_vl@sAs3Y2Dr%;k#f!6OFUmmoCuz;Y$WN3 zv0{K@mKe=vi5am;@B#Qm5>hT+Bg;5+W@2a7|J5)X8RlkYC$kZ(1T~-+TmtT9K4iYd zya2ufUWL=)XW;>#?>?4kmz^wre-Vk9TfoVqvYDcVYqGH4R^*h+{8)%YWqSVKQ($yJFZ71dp~ z1>?~~ED-DuMS2pwf$nIa%d>lNMRmw2uj14?n&|ahY%37exN5_!it1%}itaYNYF=GM zb)1lBRH!!?i}<^v@qnkPwDu+WC4W0o-sXiB)j`+12&@)T4W;VOwFas%CF*aZwe)=% znPeHOtT8jpIn=kl(i$s7$s>hbZ?Hs5HH}?4BiZZS04RW@QP%Icwtm~`(XkT3= zTVKDosp_@T7HZDntNN{ThQ_MjIcI38`n@%P37(-n)LZojW&FQO^8d9T-KOqUoGrF< z%nIWqz>3oTn*Q*1qjRTCj_mqzoZDIj=tJ5uqTkjTa=WtaH3@^-4J3SA+}f7m*cM}F z^8a;);S71baZn7)O~1W-!3~e{Pl`?C^k}IFeEy$g;6vb_(e3Z>-L4b6^xgX6GRtng z5sZoIYq*`XGi}tT+-BKm-I-2Ho6{*_SawY{mMLuI2a;)Nk~%6#YqsEqKz}UQn}|jD ztWCgnOKnV__&VE991BiG6-&_pOSv}Xf8y4&ei%C)igq!if8s^X_{2-&bWz1)pBoG-hFscfpJQ&4c)O3tG5u;8z z>?6c7()fQT1K$SsquZ3cij`uUG4-#rO#MUQ9<=TX#c5A%uP06AOcg474q-EGGqKZ$ zzLnx>|IFg)%3;wD-wGJeX$QKK4}Zin8r zXP0=ChgniQQ8MxvSJXI~;xp{uAgPU~faQ5D+VM9?(urCQksCY+m1E|r(zC@~KsSQO!v6Gg!0y2e6a!{Hg zq1+BuCK4lj|L;Zyz6Ksax2bRy=ZmefW>yPvp=oBd0EPiS)pG$G9O5>js*omTysgpp ziWWlL#@wi6)6S>R3mmW-a#$qlt$UH!VuS)7H$nlo`{O~yU?v`?iPQ?aS*)opumCF|Lxj}wFwssppviYQ9LS&ihnq=x=ohUYQ%zPEBb80K+YkmQP;aD*2r|JT< z+0GfDS`UZzG-05IgrQu1oX-nGNsALuO^W&ZKZ<#PVHd$}a3%WBA#v@A?px$xYWIwT z88a%IYbxt1Ybr?S~ah( zzdxDHWgFGo%9UD@`iDJj`xbhb6O~6=QiGZ&dL&`{5DvvzQ}Xwi|nT_@;vGL z4}xPEa4a|p%m$0W3UCJK0(~F}2EiC8f@{H-!PmgO;9KA+@GST__zgG!K7vO>4$guL zpbxHwYhfIo3p20)cf+gTP4EtQH+%p-4)??7;j8cs_yNnZC$KZvd2AiKk`1yw>?U?I zyPds=y@I`g-N$}|y^sAi`#tvm*n1M_IEpK~tJeWC5i^oKNCsq&;x)E>X%5L6$ryQ# zmNfAk@*GlZz=JG}WP>f4(a5&24UxifE`~s|0b)%ygtvK*_cqI&0O1Hn2pA_MOSsn% zjtv2V&AlZ1_H9+ybXQk*_2{r^$&UNknqO7F>K|R*)m8u3ujhot01}f41rRU@1%NlP zPa+0DLLCEOc0NV=Q%2jLOpY=UHtbK6h%ymy7TE^K3NWEiQv3hR;YK*_W;pkMf%_PK z1vvRN{1$!>e;dD#8{rSY(Y_Kif^)zQa1*#6JP$q>W(u`%6u(foM);}lgz);|J?`4W zvvJhIvK59=3q7SD8iqV9gtq+1uySqb$A*;)p)Ef#tXx<6sbS?pXv@zGD=#no+^}*X zwB`R8R<1Ao!mx57wB=v52a~(3E3~moT}o(3XIYIlcB!fm-vXy`byu0oxO(9Zy0y|M z7~ZlaT4_ibuDsL`0msuUTV~L@C+#fr7*zHY;%S!E8di3d)frYU$hF+Cvb(I_uriL= zTIMyZ>?vz7tXw#IzVQ^HMjy$`dOABcm@gQxb+KcE!6LkAq8pF@5e_`Y?}0yuIdZSe zpGh|MSCh@@l0d#TlgFsFMq`x3$wbE}Cwq*_boXYIh3QF*R1z=BQ02<6AY;5;KgOFH zt>(NUV|>wIH7xzP#yQ5jRycC~TOHmp$9E-!%}7JOk@UJMMz1qfYv&g0brX#7<91D` z*Nsni5+Ahv?*R_{jeiLK98K5oCHbiIu*iN~3)Bwa(OAG#lMZ)_k>5Asr1;Y^-mNZ5 zbE>W%QC!(ZteR6l5T^MafIljxhhkeR#@gb-iuwbefvwqovpD?sv^BGETmPo+>YDZF$Dv^im#rYOY0Bkngf_fs z??uRJhvf8hNMWz+h*qd?Q*H_btRVsp!p`h*r*jT}=U{iXGnbL2mDyupsAQJ0)WVLG z>>ZMY?bu0#O_*cH(+caPh4n&77WoHzdNSFzTy}{=5igwS>&or|N)2U`8&=4#!G|X9>}@F{bi9D5~xQQh&W=KEk ztaQ|A1jd+(fa^yWqv-gOfM?_A_y`M*KPClcVMw@&C1HUhhJ^LBfCWTF!luzhTAz)s zY}eFC7H9fwKz0}|05Df&|F7aUaQun<0)92$!(Ybl%lPi5qJt5 z5@vE6goQ#A_dfS5cQ}Hq2|6bcJ!?If2PQx;{?IOc6mu+Z{(8P+7p75vPjLepqCxncPG0Q#dRhW)o($>pf zg@Hx5>PEY;lrD!%St~2yOIe$%1jGpH$SJ~zMn!I0vr$p4t%X@6@z*+2sFsUjiGZ}| z_abL7WOuOomF?U_0 zb)EIoGlWL9J~Yqd>Zs+tL0%c`jgW#_@kPbKGs*e(oS&%6s?} zzn#B{e~5pH{{qYbUhZmcGgt?5;0Ew8cwd+;c!ZRY6TT~Y#=%S?sc+)XM;9*TU~Q!lzW&(X%u+KdXU+^QjXg{qzO5s+!AZGMgaBA!hLxUvo4BA zlw{s$C9u*}ngB$kSRX#=iX}73BgJt^WTVT+LhkS-1FgYW3qrn<$vz5KG?yv5I#$uu zOaYZZMb~KJ_K@O2l%jvu+*XJnzjbRC%qR~qi_lYoWI+#$)B3k@;km8YipU$*f|m$S8~yU((atYCU>4?QCWslhdw%(Kc6ke+%lLP?`r9|cP^aoX#YJ*vCWP=eWW4W5xK^5aO!iZ`E zmN&md3hE>2ZYBxpBVooRvtQWM{pe{U{mINsNPk|o{_xvxf_jq~P;_@@elgMAX$;*t zP1fDn#dPPKpzfUG)7|*Z%`y{e|DR*i|G&+Al55N-88@F~!hDiR^GT-6C)sX3$qqdJ z-^_uR`Fr8dG`dDA@^eb%!&Qeb!0X58J?4)E(L}~fJ$0})wqiDleoe5q0INQ8{n`HQ zeM?dN`|eB*e%SVBWv>p+j#f-eH3_IBJAZr0&R_M~otX-1VegSvc$tWTob~!W(y*ao z&eCd9ijKaXKVA7UKsu_?>d5R~)LKkQMf(y%NnZVAi71KLhbU6&@xPw?Kkn}%`k(fq zBI5lQl{!GBUZYa4Q>i~vsW+(9n^fv8D)ly%`fn=rCo1(0mHIQ4dY4MQN2T6B9__G@ zIv(v%PHCbYV*B5BIQZ{Y?q}R{+-H0l@8Mhd_58*BE&N0LJHP@KfM(DOt^)rC9s_R) zCku;(uyC%>FI*ygSNMtWfUsXUARIhGk0kP9M|QQ~rU5js7Tc=g`m76(XFAFfqrtXV zD4I+M#Y7+;YD>oAmWPpNx!9Yz{?|C~I6oUrLKDXx2{aCo%EkL*Jf zLMUokg)DefW-OJo_>ggn%1x||2GYKuuPqsB7cKS3hQ=sIe_P|RXe^bmcy+u=I1($3 z)k2C<7LBFl7DDTMh;vH=vU}+<)r6Mo2q9gi{i*P3%bCc|r7sJ_qRDtHY&lD(GpSfw ze2=Hvl9m-Z@)#izQ^>Dmlb7Ud(%tSV{KKt)ERA| zVAZ$O8OfG#)zGm!|8Fs$WUKikL*|qGhWR8{n@=)qKFNsrB%^r#e;)__!oLK6j-G4e z^!##i5N5CHAWX?*X7=39%QEsPoJ?$mz)79#oXKw5x-paO++0}nWzOvgDP{U=%h!?R zle5Y4Nx_Z4Oyx8fSimN;eByNKR|g~u7*j2nh@ul~zLw}@Eu|B)ZOe^pos4N&X6q!t z)CsmM>r|pPCu9F#CkGCJukkzt#<+$f`3f61cccWVu)eZnF4SN;9I3DKr(4q|IzA3$ z`Ud*p@8&J_bsO;CWg8c2bgD2$RG?%jed2_Cc`3I53p6|%8!j=Dc@gxAO0`rY6~!Ft z0}c4dAeYmL{yQB58#nc!IGLL>JvoQVv0+mV1=oaVL=99MiaYCh`BQANDk5r4#6@4w zZ)%WCrY4p#HBn#=X@WX4ohnss_t)}v8|T9^UWnb!WyF?H0!~=cNiotU#(hb1-OiZ; zI}HTZb6R*cpq)Pq73lG4`~R;v@Gk!{{5eW5IM~gyaiVfpMg3icbJgZhODZnSho}0! zx{BXdidXr*vbr`4U)9rRvU@s4PbXSa$zZG_YStFPq8jlqHNxVQ^mM&OSon%Q%JOA4 zu0_#Di=jT+VjW_9>N`p8xKvVL*6`ssz(4lw|7V#`vdMgstIQ|qGoPg2e3Ak4Ne0a) zDWd1Uoc|`rf0G~NZ{Y9ZpXWaTrJx4HKo(pF{vGTC?+GUhON5ZnD_kzzEZiaN7yf*t z-wwy#g;tW25%|d!iF@3BrwBnY5^$!&v5tz3Xk!nn5DixqJ;-RlDow^(TEb$*`DiU& zU+zi=W6@Z$H56^B=wlObrCUQStrc6@ytyRa`i-heylr9g=8}24kjV-2+YUBw9u;r9*aSS7w~N`lc_iL;8&#Ef+sWq5BlC6%TJl$w zhvF6GXvYzil@7$66*b6AqRYlqmg&n-e%cofS2*>}MPPFaj@|LU&U})~%_muJK1r|n zBpb{p*=Rn=73PyX6FvVG+#4MC1`qi8e2Cw~@8R#{pX5IPCxL1Z1l`~&a4UEMeg%{W zwL(%D60Q^O5?(vf?}sn%Qf-7omQQ)EEEcS-GgbQvNqO3zO5mxI7_>C2PL@}p6pFER zxP?gu<3J2cK(*gaRUQ{3u_W4gwpvWJS%Pdr2{GKPFeA>IQC_LWNyfwW`&6gW%b9Rk zY9Y32#H9Tp)y6UfEgpne_6M~5D@C~K{j91Taa8p|R#mA8SN+BO8Rbo?@}THXwdi~@ zQmPGi7^}TGv<8Z9e^|9&jw+FS6GBn@6FLGk0%qfJ)xJGFRxFjYKc>;54g)vzs779b z)*SamMEfr_w^~z<8+qiE8RbwK3CkM2>IiOY%5V7wdj74z%>g$EfehFN_JT*jJMfEtsn8~5h3nz>{*%JnQ~eAd zzoyS6?}Vq$l(+iiZSDG_=B=xc*NMuD**a&w5K(6!PoXe;9f#Ad^zw#w_}5$8ZaZj* z50H!Fi6o9=pltp9 zM2?E8N5Ma~Pvw9IdJKukXIdU$xr&Dm5Wv_j=f9{6`{^mnEJjP*+EmAgegH<6Y&J0hO8CR?1aFy`WR? zPQ$Jdxat&~2gp=J109BkX6~?#0;HQ#RASFtOF2(LB{M5aJQ|gle+(c~FO9}}IgAqk z8O_l4zehRn5`Pc;ISQ}g{=5ZyB+Mnc1=xb)dm)W~znv5#i;abc;|3Po@@V z)*YG}TFubdOdZY3pJd~fN;<0FE$xuPItujn^=#_x$ZpC_xq|%q@PAzrckP{<2Qy4H zsknDAD`_>Qs=!jyvAh1a#C(!V%_q6ce3CWhlXRL-(q%qLxA`PJ*#GZ5POyVoz7YaP z_!@4{pJ?Oe;p4eiV2{hRd?K-_9)m{5F6*2I33n>DL6WI>%Wcb_VB_Xv$+qM3WM!;r za_aaJjc982(8r^5htElUO1hjbDQ>j>@M!gkrfRp~{HcPIk(=4U8p%17uk<;{16G?G&54XNSKNJ`ot5`X{S#(|Id7vRq{zDBC^ ziyC%MpklGWyuT!hAdz>jd?+wjlvYYML6 z-J`qk3~6r3Y`iC}y6}x>@(QNWhvu2OMa)8xyfUR?*P&a34#|DXA)kz#ULpj5Ptvn*A zWAcsb)lQmaD<6&jcHYnNe!iQ(n*R^}MgB7|8`Oh!U+X<)hi2Spmd2g2HKF491~eY8je z_)u8;UcIkU0R{UiU4zGeF9&`O{~W)@eU0oIy{L?H$%9r*I(knYv?OcGv>CO|`VvPi zm83^>*iyA?@X-()9V(TU=;oFrkdMP+%{Rl4spdT+-8W4@_r*UAhGc_Z@iq*;0EUS5 zkEVgw|5`Y3DZdB)O!{#MjP5AqmP)rHhIY{})jkc=<9@6f&;8g|u)Y@S@?+eNZCYEb zwle!}3};8T1OQZ`cj@YBI|1n8 zu2aOHo)drxfB#G4KX)s~Ul0FG(`)$r(Ti=;SX)(6vJxM1E1NU0Q&ZTNm<|>hFYUdh z=TUEtA!TyOrRR_CM&5ff`O`{DE^DYPsh(e1Lf^D$AZjCehjwRrYStG32a?^f)1ei6 zQto`ZRwnHH#%jTzO03nlfRH;kXW?@)1lw>7!ur~}Qk;}{Twm9RA5RAg;N0Ki$aePi z>TCN`&COyw)-J}I!?BJfq;{lphr{dG07ruXM^|T`V*@%xqO-eZI~*i(nLfl#e_zJY zFS$9vcaE-Q)NLHQ9dzed;n2MV3MJ?cHR5ysyz2FTFL#K8|Nbr_08>$6Z>LgsP^mkq z)Lm5SZYp&TmAaQo{ftWeoJu`Nr5>VE4^yc}sMIg1)T31DF)H;qm3o3o{fbIGNu_>G zrJkZvPgALVRO%TjwVz7;hD!aGNYNn9iT(E(}d1HWEl!{yU;>eIzHj^o?)h)sPaI`bLH zjb`zD9)9(Vgy4K0e)V+b+;vdEEnA?*2BzY(2QlERb;`eRK5zWl<4ZzjJK|zg3by84 zzJ%ljLpZNi$%_XQahzAD!jtn{1W)t@ah^wo7fOma(+x*|jgr*Ezotkv{x3iF?f<8m zPx3VLNuF*#$x8D{&M}|lT=Pjf%qLkTt^e_D$p3c{{5gId<~7_tdZEtW8NIgQ@G&L+ z&blG2TI=sjxKsH%lT6|iJGvD`2bCmCVUI#(EQ5d6P6OGrj=vOtg^4%q7E58MMC~^g zwZjxQ)3HR=djC@V5mDVNQ9J1KKLOv!f&1W}fxDMGz|Y{T z`38Os-^X9Z|CoQAKfr$h?4SmOKsUG+{1m(b-V@3MuW+_-rEo9y2RcKDffRB+NjXCz ze3gb1>5zO1seEitxBX2NguxI^?88`ZNN2?uVM$&Me_SA}QKKYV<06aT>l(f^crwM; zq+@st(Ik=wq?20;IH9=xnR3CUN~e8(F$SyHKb4M<(dFYtKKXz4u06bsD!b1kPAFKm zl*D!%qj(a>L~k%(+Lk{mk=6l7RhmRERffiRSI zX@MS@uyKyG@tHqrmiO8xMrWgW$O= zdk^h1WJHRDez%_8X`J03%P8yDnk&}ZIav1ZnwtS&p(7p&>;n%n@{w2XnerOVO`1t2 z-!kRPG&gA`6%@97=_+=Ymc$b|5J`YXt{1LZ5Zs~&9^Z7e7im<>O0Cphi*_`cg%}C3 z9PL1rrW^=>_v*oPwN=>vkEdv!PSSVLe^37h{RLxZHZdY|1M?{JBJ&}5)?3(N_Dc2v z_G$JF_M?J+bkBwZKCkk^6F-j@TfkT=F#Z$xS=($aS0ca|610_mkv$)UfT>Wz&}j0z z2E8c4luKyo>)Byll#`?ll2qm(X%reE$>N+O&5)!jC&^k!a$!yqB#S)#Z4Yuy`oFqu2+MFavql*mgHiZP;Eh|dc zYCzEAhQXMI7thf^U;pBwbNhd)b0K#V=(_~^3j*CkpnC~)AAt@N=zao81bTo#e@CFl z2y}!%KOoTK=jJ!h&2OH{{N^9y{J+v8vph+lrwH_O0{wzOuMy~%1o|&6DzOo0K7kex zXd!{h2vkm>B?PJ_5J#Y;1ZpGDIs&aH&;|l+B9NOv9R%tmkcU8C0(B9nn?OSZ+Df3y z2(*nr!vxw+pdAF7AkcmS#R-%k(9Hz8g+R9w=r#h~OQ8D*beKT*6G$S^(*$~kK+hBC z1p>W7pjQd>Q~3PPqk1Ut_cA?9A7{eM33mF_pR3f|IWv}g%w6ORs8l-NByub;i5v?} zB1f4?V_T}zRRxIlnN7hS0|m1>2%mJYPofyr9!@D_qgrKqtg>5L zNqY?W`n)ih_ck+Jcwbh#q{Xb)*kvd(1}p*nji&+;C@VJ_i*r*b9v}`5ldr(5Q`*MKaJw&Qa94SgN*CHmr`b%2ET=2?YzI$reLRLO}y1LP16T_0ke6 zwE)O(M?2y!0B@TKaiky$h|U9ncm%!$R_}(dfr!WfQG_J?SF;!mAmx;yp#L9e|5J0W z20#A{djCg2|Nb!O!QXglPuiTv^X|T6vw>S!b>ZiXLmIOw zF>X_GkXuC4=N?82UU}XGW^);tEiIwy=IU~#7v;(Z+Q_+vVMaYpX+kN}jcP(8PH1!K zY?Llt^#|T2Md20`%J5Njdicl`zQF4YM~~7gkupY)yu|+B^QaCA{Jr%1eg9K`GG}H% zKHp^7mZX=?Gmj|end1E}T1HGFhiDQxf+mq8WD+?>@%R5(id{l~2!77S1ANKKY}D!* zmaew+rHWAWn6k;lNRQ9c9ZLGf2SXFFcs^q1h_QI+a!_$N5?lpe3;47lT%WnkOCm1r z+@*1bk19^~FnT7JAv`x5qh@d?gIURdMT17tLL1d6+iD(Kvmo0F*uy`WEV!{&Wg07( zNX}|3t@PY%oEg^Aa%;_%+AS@B^G48Im7QqbNVZmM{^ z|5l1>WiMndrb|!qnM(~x7r+%#ENnft<0&U$E8ih+O_!I2ZrN;;v7v`nF3l1*ZL((W zs02SBcKj|e+w&pz5$j3L$m4O+Psinw1wS2jOQqX9Plq_B+9>D4G263|+9MTPDd!B! z*e$kpw2fjJ45H~9+|mOSisof)S2i7~Bicx8NI_CIZ3s3pN2?=j|2HE4KboSgG)KGW zP4oc0hn}FXr4P{$(nslI^vm>d`UFEUR)%9-%qC`l*~3gQ*D{Bg2brVHG3I6FIOsJ{ ztd-?h7rTiaVE3>S?6vG6_CfY2dyIXVJG0Piw&?1!&^pZO@Ejd3(&4!}JWq$u)8X@V_yQd+)?tedm+G)phiy7MUxyd!aJddw z=^{ud5cPO;DnbCZ)^O*acHKb^#hN;=R4z&H@Bj)SFivF&YiT(m9;+ z!0FzJNDN4ZcEfbI>ba(R&gImNfMFJOcyC(TsV?`Q()dq#yr$7yG}2s=PuAT)^G3bq z3X9hNho!EenCIvpf}gxU(W|APjdIJrTD8FLS$ws+eEmMYr|=gdeCg~CTUgfm*&Vi$ zF%DeJNFtouSqqn^c2PcgMgY@qG=jhMrKzn(k6}A zsCL;R8|;>L(jsI4P7@fWH>+U`Vui|qLf4)`pio1jkwugKe|J#qM&=6oPHL$XU?`C^i;{aYl~l#kX_;11rO>qhx8d!6?G~FKc|xQ+l{n^x z33MITj`zvVy=d4^C#rVbPnV@$<}^2+|6fCazaP;)`c+0?-eo6qKh7qZWfx06H;X9Y zlK(Z2D8Dt2C|{UIl;4?0lrPOA%2&Am|31Z*Gn>KBH~W~`A@OMZ5Qpq*G2Qr~NWFPF zBK4i_@xzlGKJ1nTVPk=Y!)SPH)&jc-{D4o$=g5uPCKeJCk%sU}-N>0LQd%oDNo^5~ zN?YK}CQ@ZTUN4G>_yPZ5K8FK!y6C+j(=w$8QXDQP95WbjH8gP>IiC0S>J&xvr2pSp z@%_&jMk)EoJfeJTmUp^nSz{VeN`7G;Q9dz`D4&`~l+XSc z7K&+Mb}&~l4=~4=H<+(j2Rq0fWFKLFR;cIn++pHlc~Qkic~fZ^dXnGHyL&o1dpCQ0 zmkAyp@9yaJT0NS5(G7?$YqWZ2p=h#p%|g*^?aoDk;$QYGE~;>n6mp!*QdeD3h0icc z=-58s=6OXKPw7X_qKfXEq~3l^`LSlVcVkK@R_P}VMHO3&$zb@-L3e+*S7>Y*@;AYN zuBD%?Dys0$N)D)Du+-8|vrC(%Mq>QttZx7Rk9kCS*F2)UXC6_0Z5~nHH;*VEm`9Wk z@%Z1%F#gx0;ODGAQd^|~br6cz3_|e(zI-m#)D7G;8V}s~`ZXRfjwWZuNR3Zjs5x_y zw3TPlE8HY=p^7rk(%YR+ORSukX)lQmUiPE&;= zd&8NwlIziq|5>TOroi97QJ;Xm|1kXo{Uy`P1ejZxXP6W0YS4fGEA~b9#WVA~)~-;4 zk%q?i3(=Uk&%t%Mhr0MWZZyF;mwmpn$X?Z|5{(LCI2egLI59S!NOD6kk~vp55lDss z?HkLB?A5g-EwqP&>)1Zz<%018favuOP+*848jA%D3arOmXg^E&d@PXI2a0%aDJY^w zTSPRL0JU`adbzsM2|#gtc&@!Vb%BOtG!~x<#DgkPJ-5}@Kg2oeAc@m~YloH8)x!*@ zoIjF`%V%{XqoCjqE(I#?*Oa?AlpKwRLWc5tw)qD=T-~@BO(g5FRk^yl(LfSe_MO%u zd*v3gsDuNTP=_V}>bb}`S`}0er3M!y5(Ru8*8}a>Y51avP-veeV>jU>ErPMhTs(jB>=X!))(3ByoPNe4h%c$P_0U^)o}@U z(Hj~X0PAOUKwz!?CMJ`je33YjxGtZp0i-^XG~qBPS;O<`S>67B-8`baVIEQ5G><56 znMaggnMahj%_GV?@cF-xeu|=>qMxB(rQfDMWf-QMsbkuhPKIZK%mL;*%md70%+t&( z%*U*ab+K-C7dy?~%^qcc!u~4rzcbTLFzfMcz6Z3*YCZ?2-{SdYu$2_&y+cB$M;P=7 z+Xk0i0aA)l3cqX*eGfh#^ehX~H&Uhe9Fm0rSrvj_@b9uwg$rbjfb&v(4hxAucs^Uf zpqgt-Y-}w)MQ-tet9X+xrLnjjj`{LEAfeAaT={hx`T7@A3s@(^`?>}9kiXB@i8hJZ ztWN`Uy@<=V!;2{TkN~}2?*LxX2O6XYfll67C_UO%cF9p3A^598)a+r(D_1 z)%#>vmq0z>?VDdhv$VxSBGz?{93gC7qylGf4is~sfVfm zrZ1ue`eFJ%nMF(=lVBcVe#&xeI~!+jVjp5(koWs5vaeXGwlq-RCX^JQTVcqtwGBle z4mr7npzXI}Wfn5kDHYKcbM_*8t&OCehzODKNYddfc>y$4S9FrO@xYh>S3$rERX=;w zR#p7%om^=b;0t8oQzXF53PL5Qele(+;@Y+%yVIb0+0j3H{nl>4Xiz_9Jb3|@yFk;9 z6d*YbE3OM0E->KcwF8ELo#By5`)Yx;s|lv*(NJ7~ z3s)TSq5)^g^FSASyM`(x?h{};Uu~x=J%~g|OmfcUPXUH1w}xRK=(5G-9+Maj#N}o! z?5ltb=kk|8AE{=HU_hOMklM=|#?5oNg|Bps;;?Ge+=nbvpdYvVAC>?+R1!r^#HK=V z96+G9rK!liRHI9DGLdY8VjE}!J7J*2pDhB~Xm0eepby>S+}wt2$e6PX7_3H{ zF%XD@?j}^7s{_!<6=m=a#G+A$v-4XI1lmiWFo7Zjy5gKi!#R(JKft4bg8P3TqnL-lKj)6K?nv#C1iT8V z+EUq$Rw0$a?p>ZD@XXf1++rN3N|7)#N|lnMU=*}$SlT^b))BjH+hwZGm zQ6Hdkr!VLOEX}}a8?XO+f?{1vlD-Ck09ZGtD$YRLn$-h!Z^-6(cMH<*@ zB*ZgPQj@JoO&5`BJ6wz|A)KIFgV%!!Zck?(!^Q=IBK+SVSR9r^6DAHPC@|G~_yR0D ze&52|4-}No+fS8!mGR4!ljSjZx#A4%4T$Fd>GLV(J^FR}{6at6g*;Nc)CZ&AplRc7 z9Q{U~G%f6+kF~}##_FmMSH>i-c7eytT&Wj^MaQ$@_=Sn}>dfc9U^<;zjdbeVtolMU za{2=hXjayz-fhgAr=Z!fB-`Tra??cg<-WSX!ZMK1C1g%6o zx6793^YgyKnWD|W6i^~X@un=MXwsRYFOW!v;wX5^DlQQX907hH(!y$)Qeq-Mk56Hii2#!n|nYBVx2@(v{TfMQM)> z1>>r+SZ-(q@1t6~MbmIIfqs7Y=>d1`>fQ1Q2NmY7|@{kYS)4_=nSPCZ5w_j^V# z;?6*TA5MQaaaVJidqW%2L6Z!x&Uzg8qgCtwa~`#b0)KbY^Xc1|V&+D6E_>Zob5aNM zIYX%lWK!~2AuB&p$jX0E$jTotWaUQ-S@{!%to(Q&?)lfvT!4Yk1U5L;=X+`5kQ1 zD77cu(L;hv3n;EulBKCy{~cmp`8^>TtkDX)WH1 zH9eHk+2iXdP{f0Va7{*U0tut-0H6djfB(N%$jTooWaWQT$jbk=kd;4N$jTonWaW<* zvhwfa^*=XL%vw4OehPY|hNVqbss?>{;eHD>7JC(Z2k#9fg+lG99NwM&_JU6>-c7kq zBb7t{ftAyhB$*?1sno7CDr|TLs|->{@;gtbQEV5X7@oM01Z1%8(1LS_@8jZ1{~v#>YcZVKfklrgPMN;T5@+ zebp5l3aY1KT!al8bRo128I(XYV4Ahx{~GFc3j94nJx9GpeNLCqb+nt_MJMS)^!Mo> z({C~ib0M>V*~%oDTbU!w3(VUr#a6TH*kLx#UdP_c9$}wnf6l(cetH^S0_EQ!S zJuZI8JtTPi{oXZ|L(t7KBN@3jR`NzH&6SrKu{2|rtwt;@mBU6XEtqAS5zE@j|7Y)6 zpxmggoA;iDv1NI+80?7kAPHma^>6NTj@Dv#C0UEy}OpQwt*0k zAwZLc(1a!g5DgSUNZOPDO$dbKK-zQCq|oH_l!jlS%{c*@CL!blA-}%Q{GMiH%fx7w zb24Xb&HcT1@B7c2H}~$d66t0ld#yxzJny#>>0u(5kn^2J8rdm|ry{MM50HbYRum?9 zX%)dX&t+8v+nAtSMX=qozlvZx6HHeT?C^|L5mf3cQ$?`TGhRhdskLks!7k5a6+xx$ zCaMT_dk$0)RBA9+MX<*+RYg##$Abnzd1oLY$x293&w1noF`@LwX~lc4KL>3zB3J?+ zCdZ)_tdg|ny7!@u3LIm;_AInUB`~)K9(s(4py<)*UoJsSFc3+SGtNs!oX7(MF*!Ii z=)arvf1mJm0slQM`~)lk>%lg#2NZDM|04Kj@G|%`W|}qH1zyazW#jl`%gOhZAoe)q>?46osf=Ok~#?KT1!$VAzf!l>LR2M zTavm7>H12G35lk6g%yP+ccm4DruIQAN)Mr2Wku;Fln+@^HWSL#Ruo#~mse6k@erfj zP-!ZqjE3XV@{f?NT}evB!pm=5f!a)jWO(^skh#T(PXyy~+wxCTvQu>H^4l%(ZOiW< z{eO+{B|-R>@Qm;y;cegse$Wku!DS#1t^=ROD}cwr_rMRqui+xR3TS~6yaeWjFToq& zeefIbMLZfnBBBHj|q!w)$6_QLk5`+Waq=Q9r9h zwfmnpqkdY6>hM2jM*XA`)#?8~tdU{jq2`qLi$2LQPAfk4TZEzmbgCMs!>njwU5}G%zToVorLbnv%nK z4*Z3dMmAlX%V(9WU$REO=0_4m4@gNezo!zFI!*deu!4inKBpR`GbE&;kQ|GSN^z;* zc|dIm1KDCIpFWiJ51KI7l8KvOc7^->4QeySfE*6Vk<_q%soK;P*t-eI42~qFcqkCW zE007X8Vm=L;b??}{|Uy!u_SpFx;G{{lWhJk31B(Awb#rzcR4~KMA zLFpm~&0I+{SDcKz6h)7k^=Av2d~UWlllSjZTPUL>=$m2xcD3pmR(W~rzesJN{rFKZ zJdK$rvi^201&oZ&6&bdTjOY|Ajo<=LB<18W(o6=E=fu?7H<9RMa86XMYfQ(L6^c4V zvM``MLv3h!Z8^WGwnqyht4jJLV&ahL2Y1KSwyM+ctP`Y7f@tI1sr5>gAslh;(E7EC z#ABT^pcx>6ph%9du7vYgd7K@H#9Rj}AF6GL;!6(|#3C#gfjgrtBF5 z?rm!Jeb(7iJGYyvJCz6wNOFH58E|%*GH1k)B=zqM1P7fRrcz=I;o;a&I2caqob6Te zp-Oc9`THO3TZq*hbRh?=;h?n~)XYKaIA}cwZQ!7d9JGmpS~#ecgW5Q#or5|!sFQ=b zIH;S0dN`<;gEn)}77p6VLEAW}kAp7apzR#AgM$Jbw3CB^9MsQ25(kAiXn=!uaZs3p zF6N*?4jSU1VGfFLP?UpW9JHH*;vAIVpd<&SIB0}}MmcB?2kqsceH?TNd;gym5Q07s z#5eE8RoYi>Bd6TyThiUS>#9&NB$MwgN=54)z)L1d-=nYI$e7Qytmxy z7S=QC26cB+c<{w5!rgeim$1h?tCOV$rLcKjyln=eW}IAZVee%8F4v`oQ_-nlP)gWj z*f#!PrO#*3$aGqk96qc#6U;a@6E81satnQ$iG93@bV8P6c=ilO2JEr7?*#U8>M?uU ztnKAEjr;#z;oAau0?+VoKqovOUIcf;94x^*;aA~*2yY253*UyX;uXO$P=>z+5?BV- zqowEqG>r1-7W4%?r@!;n|7pAE{zh;oUfXcqU#~agsqa~~>r{bfj%%;uMN$%5BD=4p z`#Kyx6~jd;xsUUS5sI2viBAka|FOibxd07T;1khQJV@4;u~afR6b%l#uO=&LOD2qn z4GrPdxcftNH<9p!*godYz5AqilzDgEO?_&p#BgLJ7Hk-zJ53ypF%QxmB?Eyxvq}vY z(_PL=G!qGvXE2Qxi3Vd05zSx~#aM?qd@2$c3J*l2{)QN*zlLW*QBK!Xq+be!BZ*|Z zVV8*dtO!hOKvPSt+=fveg^RKw#iMYoHS8e|JPHbzufll2T9hzh_3FZp16XT3#=E-> zm1<%f4um6wsfRqsRcFF&qt~Pb(QTDxvH`2Lv(1Jks8eZjTeT84l9Z;qW&WN2$t=Ci z&dhJOGxIy_%)D%8=6Bk83g&O@%>1)uIH0XKlJfd7R);bs_s zSHg$jkMT?|qubDT>NAh~9G(srWQTZVx@!@m>y|BBX35T*U+QvrF69`={u&-Scc<{w z5eiFj!^YT_E&DTLn8$fTx5Fdz$(py(Ft@&Cn7n*8>->C=!;`K-Oqw2>B|F^84x;nE zR);51gIsvJn9UzaPdV?|4e2|=thO|A}C zlS@BRWzYCHX#F*T;iQ-PIYFoLvt^4;R8XZo7oGn@;v$Fd=7%Z%sM z%%&Nrs%`P|s>&}wwBv2|SThh% z?)ad!jYbxQK<5AD!W{zs`&Z#tU?tcEj({7%UEophEOf%H@F2Vc{u_d59omDg#p{5_ z(0|u!L})>2cq+3lc}}Zow!IKVPsFIsvg^^_6R~l#>qd0x33w}KRr2o7IGg%|b%>ICTbJV=i8b^^m%p- z+I>P1b$-=qxTbk^9U46mcTQ8p`FCXBg|gBkBXTSd9F&sI%g7r*6B_3e&mNx37K+ZX z)o9p~;gG^XYbmQW6Q1j6czP^*%()+eH-&`)aZ01lu2{=D$< zlCa=7u;p1t-aj|KDYK+O5YBMh`M~usE`}#b%fMm*EC%ghA1HzQ!S}&$pdW_eVfY#N1bhuOqF!_vx)D8q zesKE7g!yx=ajXa$Vy2DuC)Jo~{oxU^M@wEDbT|B=CcfT=KUTznv*c@Uc(az|+FRW< zsn_1_1~u_@x?xRx-ELG9U$1*XEqooVZbwag?d~&b;_GxTtckDNeP&I3z3xS|R9k1m zTeT$D+3H?g6JNXASrcEUdr3`v-ELP+e7)|a?D_u|0WU}|1~d3(9$cl-@<9^Ai#qq& z%3^p?7b>Ii{(3rUs^<4*i^;DKQ;oc8KGxc~fphJ{NZPyR(eeRH)8hS!_&hLetA%Mq zHD+2@rD=p@FfCW5*5-w2+bnBMHLcBDYn*A5*0m-D>fxaAWTy35)f!ffnbu*dHB92a z|DP1_-}4{>o`9Y3K6Ebn*y--m`30qHJr+4rvl)yywrSEmTmLK%*FVdA{j)68Kg(kM zvz)7cmPhKJ<RDttH z6*PZTSulT8aj^ZrivtH#)dB<02S6O5pu0&U3$2{FxN z0P(h!%lH&;r;5TSkfd_W8x34FS z%gC1lW!D|Rvi|>=fZE`G@Hu?*-nmK>We**2py=w@JrDf!W`sMnnmctry(e0yYN!w}l$`Cxg47BQ!fMa;no)iYv_ruzo#h&hTn=72d0 zftwlz%gZgy31zeOXmq?eRRRDh>R6gX2u5?}-}gV0OaIZ%%)er1=3lil^GEE={A+e* z{-~XqKW1mrgGJoVe zta4)ovmVR*Uj}em=?d~Y2ul9SE{C_-DxFgeF8=5ahu2e)&?yBAf2_;l^-6pKCyy5X z_=UI}yu6e}xbSa#9Ns2lX{rIUy+2#!@QSNAN@ZYd?@!IrN@VQUd=BplUYZY${px01 zzCn&brd@|`r|JAeW`mDqxefzInteTexP4hll4gD~>E0gPd@Q96m0}^cxf9nyh1_Iz zYHH>LLf)6y`hT|opMeWNGrswgSLMm_S#H699O36Fmn6FUc&Vy{ew-eksn-%|uCRYH zH@1;%da&C~nN3I1`5f^Sh8N-nw_844Im1dxM;gw6G-`GYGP`!=#xSGJcD3ks5x;QC z=aAGiT|a|qI#M$&Qg*wAWz4jc=vszN!#UV!Q>$)MJUWb9s}ECseZI8}YHmH&HaKAxS$L%od#_G%A`+T@YXTym)) zmhY4r7ML#SO}hI|Ca9N-NtRpxgI9zd!Vd)e_e0^Q!fyZqOMwSm09wH|a52~e#=v3l zA@En=9`G3W7Wgjsckm*31H26(Tnx{Ke%J;BFa^`_5WE8306zuqg%7}Q!tcQ6;g8@i z5kPLV60Ji$D1`Q)1L!JrJ^DDh4c&_#ME``ILeHR=(5vWm^cH&SPab)=YcW~@|8P9V{Cb`QTbi3 z{B~33d}putajIe-cL)qTNc>AufEC8|74SpE#Ry)yWTw(NvV_5XMf?Iap55mR_s3Ym z*#fDSF(Yv6Qsh+u`JkBP!JBAZ6!4R)_%NjuauYJ?K;m&m$xTd)DdM@6-lnI>R}NxH zpO=i@ zCCz$ndai&=;A1pp2GDvCr5n%w7l3YG#y{0#2{``t*T!f zaDK8SYq*Le|@USXQ8{2JN59^ z+S=MdDk+wq86z=6Dr-sM)eO40ypVjSP7Ru13qjovMIG$%TiC-gXCCWX+ge+RJ!}nY zGKaBh@qghN0s?0W@F(C*=(D?5+jo_&C_5U3u2PByhi(#GU0k*5zI5Nk3dTQU*+OR1 zq^D{P>w2i}?bec6ZDxFJ1rPhsw7J=;?)5}e8ZLly-NFhs?i>|eE3omSJ4XUT!BV(< z2Bxrb;V5+|hZPm&Kr>!@tl77g{C6R4>!DEdhP4#B=ptXQhSRO4BHCj?LwP}?5L7C; zS#$-JN)ARNq3}Q|5Z9b!*R8J4wW#YV>Tq?f@Wd1aJeD8oi!vr-IR(Y0AA z2D3BqdX&OSi&8LaVjci3oG(-sf;ky&Vn194Zecwe1P?Mlu53pIGe$$9gjA29@+Vk? z^;DEfg>t;xQ?jmUYd38B@XW^kzd#5G@I`nA5b@2aUZp+d0k^RFI3P!5wu-LR%CR4H z$J>^#+;QfcGVPYffApPr{)M}W=ic>Z%OU)bL2dI6(1(mhZkyUZ<8~U4%+Q^3?RqIqZ`f_B+3%0#D%2k_t8qEE^s9YFMfyZiDfIZLu=+|52IqdqgxfLjcVR0-t|Xf*{wEWevnV*t0vNjX#dh#6N zQCziSy*e4kR{2q>JJU77QQyi=Kz(=t^b9m1$Zxb692r%uhMLJ zguJ9%2JvEqy`*aPU0Uf;8xRgJut zd!MJB9LW|6hNBaBg2qcP!>c-m7*gN#k>prZw5(4x?*G|)65u$hE4%;q7;GJx5r@z* znwBkL$;h@wk|oOq%xI=ZYSeSMyGOEYOe2rRmh927(g`3x@em=419OmS=adkFfv7-p}5}9%DZRWncx^2nN{y z2D9KW_&e~=;5Xo9a2zgyPT0!)0tVq2+zSt*m*}6sC*aHQE&QkW*FD)GQ+os@;0gOf zK}A;kRJGw6v)E??!|~ZzNfbx6r`3ui1bg-2^Zum;ZZ)aPjfD3gj{9!fSc@O`P{BrW zVj9QbdjLck2WrHtevhokJm0TH3gj`CKN9pd0u3bptN{HtL@Wy#&jDN3b^c$ZJ(W z45NXIUP;^AYX6ZiF&6g-y|q8W@$hN681C%A#ho3s_hnj(Vbm(O>~Q`(UQ$$S{i|o*|+)P!tU(sQmE?B=Fzs+$^5zY0*(<8#j9`4DU^2?@i`L9WDkn%om zl61N14frrm*K2hC-_5{orW-6{T?@YC=C&vI+wp=qx+j;#GVA4ZBxkOWA}kk0nQJrt zBGJi-nMC>)nNOmv+qm<%%d@87S#8o&z5_=Y2eX2%3C)$!SBmsfinbhP;gV2xiXVe$ zS&48`3uUP`x$9#F?DR|YX~_c)X02v|D%#VyrNoCrl5(P0qC1ZzvL(!C3F;D)>G^DX zWYb8G3~%yEybU;m&C*S`0aX>Rv*Qb^Xto%hPLTide3y|HM)zq(x=bJc=XB;a2L1gd zTf&~hjxk#?Kf%Y~bMUp#>j|E9wAq|44@ga_W+&p4(cS8f znI_KfQT#HuatE3Q`6XVChzf@$MO<^klNZ>WYXTXRY^SIB{H4loaM_&oRapdxt0|eG zmS5+wIo;U|P`8F=6ImQaW)gWhT)*DtJcrj)ApWY}$?vboC<%FCJp3J7=e8 zlal9Zkzou?@V7Hs<+C}JnUPZR+w)LoWk$-Lal{-yxwm5$O`7mHha8>3x6t#%BvCAWZgm}{0;#9wR?%jzT`lh3SmSzUE{YAHTiWoOo;by<^owTj3%dt=eGiRIhM z(94jkjiEZ@G56?MIGsjHpH-Q@i3EzbXuczV=cGl*-#O`Ooi>&Ev>EjD^O53hYV6FT zjb4O2yEFP~{rrC&^CpA-o)j6t_1TZhjvJs44bVph=wk!)i2?f50R7pJU)h*poHane z06_z^$NWd^9+0Da8>*$t4x096>E(+tq*2Ivd} zbfy8SG(cw=peh4YZGdVFP^|%S8lXA@^b+p%iv6m)wKYg-_5TC|-eiA=e!kGhA$xL%gK5_~x1Ks^q%`;OqG!nBTfkbA?$yagyVu>U zU$|dGdUIChMq=^dy*R-;ml%ug&h1?t9o-EemKpH%#sROjw{XCB7Pd%cz`I+Uvn(>M zvqvj2$c(8)0(yIlnBEYz*4CLL+ru|oFfL;be81D1LvIaq%wv$WJ!t&TgA8+!W!Qs& z0S6%i4;Js5J+Nr*K+zUKvh5u$-)b@ci!9|oTE5L<{uf)!U$vP3B^L7^#@GLH<}kzD z%G}Sq$d<4x*$wF3{|feY_I~uv|3Baq^tOKi*a|L1Z}~q0{|f#9K89z)b{K-Y;MMR> zcpq~ZJ_sL!&%jsUvA^zKfWJTwt9-crzp!UcI1o{L!xG=yfqro2OEut;`zx-;o;kWY zx~S1NB&+D3!b`j?$UZ^#^oYE#;zpdpbDqY0khVR7y@m3&C46td-Wj+W{lj^bDh^yCgKGzUidPJI`{gjt`_#TI<&}h+(ub43s9yBHfs!?ARh$#GK><;6Jh)P{8(ZNtfJckjU zx4(`fIv8q$*bhmptJjN3Yb4$qkz`?juXF0r!jce5$x~O3{b&p|!BCK|o6SK8OCg2# zDs_^c4=Ti7OSr`VvP<1Qy*W~qa-T;+Ixp4hEPF#?KGmXbg`OL&lJOV})SaytPewh` zuLgu*-Kk{2DUwg{`%&j^uD;MvAOx!gdclN(rQgLb^7@HW82UJ1Y zG;#VP*aIj$oA8bfPcOYi1NvfnhL_$*=l_3Vz)S2a=;zCO%K& z;68XGychl)J_ld5`U1E9z`<6~Q=p*?`&gnoEcI4ddNXz{MPOtCN2iI62os5=-@@*n zlE;T0Iz1jm6+?rik7LKxOi`%6%#IyjwUUTDgr5xxUwRKFM@zk452-1A#8@WyM85QB zJ>*kmeV$;D7d8J|)$b9+h{TtEkfHCDyrh`-l^(;-H(DwL2Rx$SQ$12|B)|ui()%(p z21AHke_6>g*sGNg@l-|f1Z9DIY)%Q5*)qDy5h6k9t=J`(7U8Scr-mX*>Ae{x6lpV2 ztgH;r6lhr_C`ZEB7mrT`IV=4LKRIdbpoE>0sfB)spN2>bAAW4sl9)PZM(6IV`UmZ_ zy{+nA{Om-h>#FV};_;gzysW5R(Id+xR}&LxMOw@RC8YL+WToVYz7Ch*8rr7hMq*H{ z4sYyA1H7-~kiHa281#80U&#$bcC9o+Vh+#ybj7L9l}irb`Gc+^{V{jRK|Os`6H?H$ zr({3rs#NJvm@kv!_NI{2IzGI^o9X?(*V6?fZjGh#|+Rr2IyS_^qv8F-vE8^mDj>o zUJIX(*TR=K|L@M?vm7lx%dz6K+*N#*yNk~%j( zU^(BrrX))FgtT+n2M%%Dv$~yI#R(Hrvx)T_Cx-<)tsC*_qd})lEoK0{| zm{hYdx)v@xKoDqEt;Dx+Fda|wmo_g4)Z>_ zI=b`-Vjs7T{Vj-n<>ia!E-N;ByiZ}ik%9JPe^X!%OI|Nj~T7lBimVtw6j)p4jYxrOcoJIgj*e&Xx|M6*lXDzu#dAZ0~@FZJ>X(+0Ne>40MCNsuoN~x4~)Wt z@O$tf_@dPpbp8YH(2`Fg6py6HQn*z`{|O~_3nitMJyubU#bIo>cuZllO=nj*J5-ZDjQr^s)cB6m2BnId;kQlJ^djlHFQ$5#O zu?Bltm{d~qR&#WBh1(omik56GGj$Ysm1zSy+$&bo_kW0={{a1*jK|#N z$w3@77~lTg+sNBqYF5Bc;GkmG-S_V{ofl-y1E`?6t#Tgxw4veYw?8>xXPT+{siO(waj|{N654gTVShUS}4V4Vnxdnn5+N4FI0ab=K{1R?ew~* z=l`YPtS|rke?@YegIP{IL5Jr`NHVHaPZu*EeU2Z-1q<>7B}KwSA~ucF7#jxw2|u-9 z++4@doHX}S$&2jdyFnV>5q~zQHASmcURMm^goyWE2 zYMiN0FKSLDx0>nfwp{1lh3M>_M`w4o&UpTBV-KFB-hb8~7W;qgvY7vFi}}Yb=09#R zf3p8y&cqn>_xsH6Sr#rWpiP1)^Eo2$myC=)}n?2azPnK#si<8d0F5}gNTp+4VaY>I3^KZzI|8%c~daX3;tO;o;e$K*r; zrzB4qawdU^lz43}*RYXDcx=zYl|VF3L4vH2jWnd*p0Gv~xwa{-s7~jdnbYlv z$kN@5UG;OTj8v#D3%4hY`#G=Dw)kS#IdhHqc*!`|^k2XbQC-O;VtW!T9HNbLn-cCm z-p^s)h*{}L?*G$oF@Mow{sD{m2QB6wvY3C^V*Z=(^32V1q%}j1?>HW357I5;xb!hw`nt3 z4!7FX6}C!m!6uZ{B?VrO#`jD^7>{ zs!vKdwKEO%)lO48r`lTG@H3K3by2n_?0W)k|vzj-0yGJ969&5uI|PW&@SM* z+5&z1TDbl0)$LuRpko~>$Z`P4C1{NQ_Y?y@VLw4XU;N`xQ!?nl+gYruYzSZV>HREs zC-HhIa{NDiXSdC_%un9lh|7*J5s?iSeOmg3p=PiBrqK=8{T0aoz3yFP>u*KIR2J-f z>Mhl7ZmBG*nC*P#8X(Ws=YgbX*T#x_*f>-y*!t8Ppku)XFx~phGX!$?KJom&ndKOE zGdsmz#oodGJ^N$!VfGpJRZz7JcBp~AZ~gp&GP0O3VH&9SIeWP)_#wq z>BI51s>$b^Qyf2 zNf!?(ysV0Xq9Dn%`WBM@kJcM&R#O3l01@Db)-I@IC%K!U8SGFEm89wuYA(?u_41t^ zL{7Q(J2VBI=p`xW8thaoQ3ysz7_eXnX{zu+oPtkA+T22k;$UWovY^x+qgnRS1(_IN zwQp0+(+LVSG2SIP0re%vsS(A=iJi_Zv^F5C_;Q;;dW_PNAU`MyJy^(U50x25RzqO9 zlcoU-hh$+hd1D|U&mto3(^2P3bkL+Dklad{$)0ey=1lF}EAlmE+BqNc*Hov@C8?%L zI~O}UYD!Y)J^q?{svQ}8ILV-2;6i`~Euu~(q`z=Q1b?5Cg>Yy?}u72r1TQ}8r+4?3V5iZBkp0q;Rq z`pXtxn79XWUu?XJyR)a&K8T~znAOrZpUnjbxa~s)2vEl?`xY|-?QKYct!4ypEhTVK z0RnFOwgLn+2`(bbLo z#?mcoh=F#n;~j7W4Pe^}jnA@B(`s`Z8xQ z?6z6X_OJ)mZZcDJ;UKq-On573q@=kzRRyU?A_lk{fZJlP?j z7a$LZr#tt)H}~E*@6DY%ckU4HOq?XG-9o)HbFe{V!Gf&xddW^hn%daD;n>iCi#lX@ z=3ItEwLCsms=LEji&`;5DWMW4i;^py_7c1Ed|Y!brz_IJUTkzhk!_Bt#}O0I4Rbr= z{oO--!}}?Y{nR0Q@l6SaoKs#aO&Ztda!;Ldwfl03e_iUl0!^K}lLcvQl6{kNuFYT; zZKevycEHAcqce&lj7t=k{c>JMbD)!$0%iUG zOA0&!UdE@d%#plCZI-TTwR~zf3N}pkxlVRft8``;ztkS-s#c4wo+#*^to)N()haW3 z=BaDsp+|+6?{5#OmHMy)uw!EP8ZqjD`~^B(~X=0 z-j>MvoCV4mJXwZ7xeQObFu6=&dd=&ox;kGQ9+2*jyeQgDbLw;u+4q06WPL*6IW z|KF*=!$8HS)Aqn)v-M_UGi%mn>p$xqlNp<3U7M}Prvq5))O7`#%#q|wDl`|$NFTFh zLSHqRu1t$a)}yVc5A8(<(GStj(c35SvXkJsR5abDV8k1W zbOzc(bNyrkBV9QzoZCtw%=Bd)!SLKRvc+Mb-P02B1l-@x03Gf-(ttPMzC8nUxW7ks z?+Ubs%V##T;y}2$Ywg@;7!by)_0IYMi2`E)*^qHS2L{?_#Whm0&HAjnG+b>BCEck5 zF=?+xx_lWX{TmIpd>JL})`6IGJBil9;0jFXC2@H4Hz6F(K$vbsgGhXvch+}E2$}{F z+D<);sXH{dGaRJ&eR>$(HdqVz*$L9KSHLbSO?To)C0Z|4l+uC-6mSESJ+`}0Cy2X-NW%Awp}o8c67(p z=S|S{4E=%$dIdutHbFNq^bx1cT`oa0>`&zv*Hkg|izaC8>X%H=H4Ob56Lc*@zifhD z#?ZetLDw<#D<)`7r$=FK^q5?yn%F;+UtFu{^mP-orqee}(Av%4 zG(l@Reai%`>GW+Aw5HQ{OwgK6-zD$AQ@L7Eo>E>`KE-{$2lRj&!1uv3WCZ|pVbpD~ z4qggxgb%>yao>Ipa--E~BTAsZMt7no(9u(Phe)7ixGfmL|43M@H|)ioeW1OwD;)B- z`n}=e8|I;otQ7PsR(w7A`s&HN!D9Cu6cEZHUQcJ$T7T-J=_|gBM7YXnv|YiABP6&| zPC~2RW^#)_rk1EEW||~b$#$~!xRip{(QP71P$$ZzCVT`lqHHx0C8&vViKxY3Rq=(S z0~8)W@!Se@vGJ*d+d6!H+`)8_6=uyH;q}D_7NSiP(5>~flA!tG>lUD{2}py15TP6+ zk+LR~RE%q-t%?!Q$$;XdAgI4BSUiVx$$VMF-&R!|BOR-;oK@8$y{NjlUwRP>x-Q-& zy{M)*A-#wNS{DyVFRCrRLV6L)>sq{DXcG+St%~?M+VS%t+T6+Z|Ef~(-<`k(Zh`sm z#%vLQ7Ue0gv8di!i|SowQN48*)w|rHdh0EY|6E~l{SD0jcZUMs22bPDX?lz~$D4^m zCjrXrp`?vDbaoE*#RCJwIiAiVwbK7B>D?vq({e#sv}AkVaA!R2`{J2)P2xhGr;xvx z^LWh~_Y^1pOc-;ma&cpLYS0Azoqi8Cj(8^Z z>LLCA3gv`?|GpMG0CT(EKEXjh=AfT&(32eWQx5tW2R+3>Pjk@EIp`S<`UM9)%R&Fa zLI24?|HVPS`&^eP9v z#zDt8=yeWygM;4Wptm^aZ4P>egWlz!;~exJ2ffchA8^p`PUC&16*B*Sfr6&OdH8hZ zpvTyBwYoqlPsVBL7(bmGwquL2$`?z-`eV`D2jkZX^ZR;c<}b)>^4Al0T}i(6n4gW^ z{UfpYbP1_9MCL^nxl%x&eUYnr!OE*$qrGIRa(>kUE=W9m=X8|7rD|2aQjPU-zTF;j z+N+s5_;CH4nHXuMTtqs~rQ2wd%-9YWfsCsNVw`9KE-m1Qx|Bpf#)*Z{;3;v`O_U+t1d2}?`;YGj>YkdyHX-|?!RUp?UkMI-F02*%F^g%IHC~O z)e^+;N>>&=4ig3%vwR@J>Y{w5l6?W&oc2on7m%(=%KhgrknQuwc#=rW5PJK6s`7}U zJOZk~ozMkuLHX!Lt6$fN4~zDREU~EGQj6+!TC^wTY>VnGv#4H|MfJK_|Np209|w=) z)0gQ;UZYm#E2~(aj*Ze)mEtEk*q6ZC^Y`q`{kOTrq+1vGGPB(TGLw&Y@+x&YM-jQxMT@~QIm@cxMh=L>m=gC6Fff99Y^IOtzE=wCVLQ4V^H zgC6Igf8(HkKjWu7)Bc)L26 zIlr8CdpC1_^^uiILnDL3!F{3O?wp(1(LlB(R|0dwf-3==9!>30=dd{dEafhm1tBA4 z$KKdbaAd#|Q8!FVR2_$A^6E(R_PGm4?>(f3X<3OJ_+iDxBSsdUCiV?z=DUi^^UpOQF9 zQW#(%sa}7?=MQ;NMtQ!U~Pc){|_thV>kn!z9h%k=J9X={!}N3<7W)vZ*>z3=nAAhb)ncmF1|3|_da{@^adLNJkP51F6E+Co2dOwg1Pn|(BX42i@_VG}@Qj2wazTMvCwAb1N z)e`PMJN%K*OW$5@$K zR-m<>-O2MT%?TY<-ZO7JUuaI~tSO<#D%9E3HA+=9(`wgf6y%+{mNec^Nl!Az=xWuO zuavPk@p`AdjBcE&?Gl#r-rTrZs>X?aqg1U(AOAZ==}{1Z7k~=<;|n;FP2+?4ij&1o z;(cZCDQ0w?tX7ilR(FlZnFkyX7b8x4rPFB-)Oh{DV5GT= zY}(cl%(*1O7*Sxyr9ZF*v9C%$QWS^{;`WUXFe`$IyC5TODC`M_!<%z1ZL?HbjT@Iy z+7(7=HDZIX`^R@PYmo`tkP%i}Ugxt)Xs=Xgfvb$r)sjan5R1Z-@qejuP*LtxeyMy2 zrh)mu2QC9wgImFa;5qOCoC+_59(WnN8ji!q;8Eou{9oio?Pw3W89n-W`~Ayoj%qvH z9oxM0-%cwc2HslFMq@WeX*jEz>TmkX*KmT{dsF&9PKK z)ipLoShB*>F*EdDvihj>8xr{`dNkTwnsnM6i%pQ*ORtqYY=R^|uqM{Kr(`E+b=xGB zH#Ww1>`26h=N_16b2RbD8r&43aXh>lAjU=_8Xt_!MvH8Y775wl2+64zi4t==(%s)5 zAC2|Qo_e9pQEw#fi4Av0dlPt+7IXf2j?K|vBBH80 zUw41s6`1NQx6M&!q@uSN>>ldgJzJ5p!zkkYebN210eSz=0#(YF%ll{DVNsk$rA75F zvZ&t07S+4NqI#EFRBsi_|4G*W0|n#*7yb^c0iD%ZyQF|Fr-g7T_ZSd|ZIv6X5p+_yYm{odEw{fd3%C9}4hC0{lk-{+NgJrUnW5z~>2Yz5p*2;7S2rBEU-p_$~pyTY&Eo;Clu5J^_ARfZq_{ zHwE}D0e)M6-x1(<1z2cLc|v>26WUXr(4O*y_LTRj0RNeX&lB4Jd9?qZr97nIzgLt` z@cZ8kdcgJI4)8QM4$pxLVGG;^55jx#JN^eW9W6xb(GGL~eHXvguUYmI&$AVIuw6sE z9Uh-I;_+2^$yhcR3P;v&3VA*4BsYqq-eoJQGa)1S(HwOb+KL)X2tu3aJ(jy|MfC;} zZ)=M$u#w$lnHfbWQeD*?2!|XEQa&g}EhSiEPOyv;G?^3BQG(Ux1j{MGDszH*N^p@m z!3s*S(wv}y5;T_CifZKqR8cFW+V=a_`6F5uK!;y?3ra$7;gjl`;#qb;$6BYYXsLlB zm1ctu*)4aS+Mnv+S#_EYAKc~tWx^W zs4IXGc$ojMNr6Wo088Fi6SDDMHr?ixd&7{;AlE|iEIEgM+XEEn2mdHb$vqYj$ ze=IhbbCH&05s7jnmx-ddDU5llgXM22v&YEJpXE#{AEvWLvZaz-XbH;6@KC>Q;$gIV zS8QZ36pO|OdJ;P6)105o<-C^Cx6o^f^#2vgpo0GnDt9Z-C`Xn51~yOxDnS$24EBJ( z0=I+5zzg6w_yiWfa@YvlVK*FsH$oNO2cLpR;Ya9f${&bj_{w`o;H=RRSylK$IijZUUOA$+@P0XBS>Xe6L|x&7 zBqyxQ$;mUyoSP)F)!@|B5vHA)d>M0M@)v8)OC4d_X-QJ`3(iU%S=vddBTG3ab!2I$ zq>e1*j3hC{5+|fstT`Wbd}o}FB&6BsY}6^4cQVQmt=JODXrJ>@>nhDS8%cz37ANCe z)S^eror@%kzll?kLf7@p_%BAK(n_8H!&9*yNS=wDj zm9g|Ra@OuLdvEDeXVTsh3sg{RZEqP>4y7eB^pguF=pf708MK4Ma>Pg&gw-8nR5{Ge z^5>?5oVb5XZdD8NHAOksrS(J?2>9Zo13A|d*lOO4(_Bg0avCef|4dQ(6jTS-fsOdb z7j-22#(Pbsls&=b){am(=d-KprL(IVH^wRDTFI2MMr@c;-aWoE6@_QNl1AYXVcW3L z5*s4ndO44Kh&D(94>5u=gWn6DJCbX*#!J?i_#**dtA8aYxQ;L_@a5w>$S%56;QciH zFcCP^-@P|xjl7K$%9~*>ySN#;w6yESV{8=YqpS3e%WKizl7(9 zOZ4;qXDf3R{C5bHf?HrAya`R`=K!yqk{r$1+(duh_UP8c@DRTBlIXeP7S^p=Soc3z zSoc3#Soduf)_usry1!%5dWQnm|BonmY|#e#@sC^_$%L9umYAh%f!d5M;PZronA#9ryNFLtv|lJ+~)DeL#;T;{MrW{w|T zLJpPgO)~=SQ1h4-fCb!wtpL4%q+`vwbRiSz2s18&i6;}5P)a2AtM+`FKH_|uPu9&s zS~aSii+Qm;s8wT!3u_ewVefyNf{Nin;Ke^q>AfCOr{^mx+4B!L?JM=qKNX0`norJE zw9%v`@NCIi08b%l3sH3%OOEZP;my^&)KiI|tG=dxJ$GP`pNjdiai zU$}vteFM2~@s~+v3S#^4uw+2DoGQhgWY!>!OBDzgCwtU$(i1&h)Wol(I*I4ZHIkM! zGC5fZZ*oZq#zanH|6c%RDPR^@2{wTQxD`AO-h>Fwg=^pr_)YjD_#*rS%|QVaM+ecJ z=t=bI=VAk#_J=XLlm<@@cSm<6`mTu0o??urt*LHoB#&wKH4@zavv(!%O;zdso^uEZ z&>*0-E!dJs3yLgl!&1Q_X_C^=GznQKtD&R;Dz(KfP~IY~QQ%tB(b67?##(3~$dWU(OM<&48td$gbgpXZfRct~`b0}y zUG35K){+q#iVCyx(e94UmbI~x(=?Q^Ny?nAA;OdlWvaEg(gdAVYABkS#x<4BX18=j zVm%;E7cjMI6g4%Y!qpmF(=xa=YICKDwMm0(dPZ4mwYk#DT9@f94Yx%UGTm(}+Dk7h zG8C0%W?#~5;W8bxA*Z>itEseCGmB0VT9Af|@QfL&Vl69Ib@`iC#yU&4(Dom5wHzvk zt3+28yf1aayzsOO&U*@RZ zuX0rH*Ey>9c#i7*CO7pC<>>E!0@urNJGuM0|KeWfzCwk_h8j>a>gKLOSD@`^7fPT< z(X;3vI*g9v;dl%_A2;A8d^!FZeh5E}55xFi1Q|=5WHHxET1Xe!O8$fNk$vO^a`=P~ z5ED5a2VBll^B|Isg(z&V6_KgfAF2zu?9PZk;Pyq_-a1#n9V!`0{XCc)ug~i$>CQO8 zAMk}-j!;Q}x(uaqd=6JINIB+1>s7LWdQGHf2J7q~P03*DY$4|b9X`KH<|rAbu1(Ae zE)0fT4JBjM;z8T!sE;(by(K0Zbj}|NINi0iG-Te$xeUSW9qATz_j&Vfqw(nck*-VD zG`Dn&{7PVqwKWIli_!g_q(S!l-CYjoF%G_70(G&TrolU?4-=&hL)2e`RdKXsKbmz2?rMnk>^}_ zf;W^%bvW!oPTrF&jn16q-As4mmS}Z$ub29*Is{AC+TEUTz?Jt|s(eSlA&_0pypQR{ z5vgwPe7nc(gm!yQxWVNO2*^tsT7#1YR zyMemuh$Ol(xHIAlhw|=CDM6cKs+ieKeP~2l*c%M{>1Jxc?sUy}J6w5R(#tO9HU@m& zIg*9$qn8rIaMEjj*66{c0PgcS71N6LNMCK0MfcJR4_~W__6p)D5eDtS;E*2)CXh&C zU6GJ4QU`sPA=}k?ltObvo*_E~gGza_yV#IzYAQ(Rb=m{YA=ilWf4e!jSL#qReEFUp zy;Xf!oR29mn{DDN*9dfpB6V4dv!FaRGvX|Wa;Ty#hy-QkY*`-?CkR3IMsfE%%28{l zD-q~6u6|EAm~}PAr>T)ClGwQ{XNE>;EQ*f7K5iH{M$~a(v3ZQ7V@(MpnPPAXx|KlWGV{~Lqx1QL^#OB1F z*tRpVZQIGjwr$(CZQGjI?62Q@|Lm%IHmX;zv#L(j+3RJZ=J_&-6;OPVnGbf zHnQJ7j;}f{Exj>P(yg~47#x1Fc-S0?qLhZUzI<24C%Z<(h}oZFXN;ZqH_Oy{^AKt)1NJhcN)ZijpQn8kJ?ym z%=)xH9avw5;T}#aR%|RC!&uu?B3IPe%!)8_Oy6>tg!_ZP7{i8_tS)Jti-$dCKDlhN zRcH+roo1NOWR?z`-XnvUc#n`Yw3OnYPYAPD^To1{xJv37oXZ*3)aWEv$^zibN*>734xw_n# z;$BQQN3%AQ7MHQliEZ0ladu13rDIkvy9~S#|F#|h+&r?P%$cGnU;o*Gg)m&@WY#F6a_Q~5X=Z3S* ztSXvrfzb!?c!|L~@$p6bPmL9J1?@vROHNMVNo~sYwcG@vxD>amn2vq#KFoOfKVC_a(VIW;UJRDy`vzF+kavBRkPp9;Zd1{67w zU+#Rm0jY;7Z3u4r2(L`u5Is10k#+-}xA?ERQ^K(ail17a@VfA#w9_S|m0UZKC? zNASVM^qHcvBxgv>5}n3KnS!T?8YSuO;(lld(34Cb88(Dek!9*zJCeOotxNjK*^;@% zcOQW?#PW#ckn~ajWOYev6I#cJ@A=+>yzi=?#N@8llG32hPeeG2E>YMde8Mf_YGkvJ z&I5)Z;#|qiKZ9AraU`@*=_MHC<|ytfM0ksIU>J((hj=6~$%NusNO6dxNihUFXzS4y z%nh-NB7u=$nB-?BHo(u3I?^cBaUm#IagZqZc>rUX%_e`PsbPmgbw;a!Ss&$K})pU>-zdq-7Wp+fm|{m zHyjEs?fF3;M2QeMNcnGYrw_7t$fMr(XhlG)|BjA?!MHsW2qA+66j}rW;?C?q=n81D z#LKhmOl!(r`80tLJh^g#}B zC4q{`|1m9rOm8X}491=;phPavL=+$q*wd2%_WY!P1nNJ9#{U$`fePmGK&TNo!Qmwk zaxneRHiIOcLL5-1l)N8w#Nt26S|F(>0a}&&&jRLuc=&(f-v5bH0P*YpCOZ7javIR+ zTHHU3LqEd9F(T(6?&s?5tKEmfR*D|M=j$qS#V+o~c6tqu0R|Nhw-O9n9Z*6p-<$)( zV`tTsL#1w8&gw9m($Q5UOjTmEwCU~`!v_%yIqtLDCDDt30kf5A{l&B;Rk);#C3;Lm zt@dFikFMgD^2W&nyQ}LW3iZG92mh`$?HsCNTSjP`4y|E^R5eHBO;7umA!vC2&bY_U zWS}+ED6AkHUe|)5d@prSG8}&$LlS@u9*y@%wN~K$-4bU%}2QUqR`u_CV^uRd*YABAFaaXqiJQ2a4gF=aEo-yXdC` z=tXi;z7Yo=0wjQk01ojd--JTXSm4>f2nZ?F1A4Otq2@Ag@9^<9*+#gBvs-`%np7le zHmzBu>f|Y3Kd<VP$o@Yhw$H)qn^0W7^#e>1< z5%#4|H4JRAd}?irLk@pdo~l;5=SAv|KV+^w1qeljKO$gK66=w-5mgmguON}b@4xyt zqFMlp?T2`7c*ptiXLu|KoQgl_fC=kRJ7Bkiu7!{ac45EyZ}J)HU~E1(ogmg)Ki^X_j z&ZaAImbFG%hcCu3onZy?nar8Nzh?>RF`h|7`V8mQVmoIE?v~9nip>~=38o1K34&o6 z>(2>5Vq+T{&JjT(n9lu#JpMg41q^86iWVHiV#yNxh2_i@IHRw?7dT_A01^m`tvr+$ z505jP*NCM&m4^ZuZ5kIWs0x`qo%b7_+C%|6aD>SmFL1_St{om{Ht%8R#qZRClrT3$ z=2jGNrh~Oh(n4CmaKz!U6ULWR22featxIesk2bbYjvc!v@XA1~94KzWC++cQtJ1zP zPIh&!p`=hUME6uOym+fyN>Ue1<{*1!kPj+1>u=eAElI*AXEMEomRy-uD7S%B%Fxpe8uzUM%`TZsc*Xc!WZ8>)*1J2^FIqnp8Q14Mk=Cq~LYoaeK)kmiWU< zi&E;1)lJDP7^RWcnnB!47>?_^7Udc64)_h0NAQ)#&TI}B*ur#14f#b8SYtXTkM*bo zsWX^&1;5dsXNB#IALz<-<_Wpomxqh(j2h@Wl9$U&Ig`f+xjmJq1K$xW*vfRq2Dv?x z2Yj#)A-Bi#ImJ<|kx z4d?hEzcK`48O`|v2~6hfupZOazF+K%(4gj}YACdN2X~h5OdSl!nozSR2BdyBIm^C8 zpmVx6%`8|joPFP>uQ|qENW~KFGcVT>AW&GP-)Hj|HB8vw8Nk4WcBi@s=4`R8D5jZ zPazsQ^8@?DLK0a{c0+h-)NuWYe9)ps6)Z5KOo7VLj5wdytO_MKaDyqkQ9)0-+neCi7*G%P=h zM&l*rJ&Kk`z8+mXDR69ds6Eh+lzbItcegh-vYYkqsfRcJFeEVp-6^y-3a@PZ*CsHy z!hZ`gMpBkrHplZ^PMI5W9xs?Su&GKZ&nnr$4f_mo;;K6)t#=_n9<*3icT!oQ!c%*3 zHGh4w*uwQ6$}^Ds{ij;tmZ^xuj}W}v#?ez^cfyF(3#SQ+-96jpm z?^|RX17RH|eqiO4FZ1Eb(pPxJoeoI_Yr}V<4Tk8E=);c4+{6*^RKrY06j>bR0ix{Y z0R>kHuR;c^%%0en!8)^LE$!=1v=J8{y>b6s%`CkBGHzy?Y4SrdZeeAax#GfH{{=H^fWvNoz>D;xN*CO!&sl`nWQCO-Odjhp(AB|gqNFQ8p|Ma+}_(NVHW zbur~?&M$XregYkqKta!Ws;*wa)_gh8a;)0cOyxzxAYtVA0*vk?{%uvsdNU;tfF!O1 zizz0RJHk66=kf**{b{Vxf-ap>@Jp^ik^orskGv=Dh*X->a*kLn&ja<9Pr#I4S33Ix;9*uK zC~H`T)oPn`nQYKvktS6RIi_0mew-d@GGk{`oryyS6c19to)i0gCa z5hYl{Hi|?XLh*Q8PU&<2;6@TrBOlifZ_=WuaZYt+IfA}mf?DeewmUM6AkjP|mXZ&L z5cxRfm~;UjavWGSH})^>GX_ipZf7Jo$Dkf*9U0VM6@3+{zZR$CgN-`$)&fC>MF=zd zc-s%P(PULybb*wAT|#wH9as>4&2IU+OrEA?FbghdofR%J=e7){`dH9DQ5%2{*#fUV z(hi19kr(vDvmQ&7?NynAj}A#^q=aw1>8s=0S*ShZx*tvceDfMxK7jRNx|=-C-Y%1g1G2 z_V>mcB~WU&1^Q1p2tQI!is+BRdj`nU08M3IyHzT~}Efs21W(U)GpENqoV zhR+!q&UtjPXdojQ@@5K9AKpH4ulj@KZD_-yzpXE>i;%&h#1pLjUi4#ZTiKgs0XYmJ zqiQ-r9gX}%DZQF*0|$Z#Qse8$kOp0V`^kD?85=1m!z2L2LRU%-rnXIfg^N>x2hBo} zJVW^sK#a|RMqo9t7x7_IbHoGkMuBq_gC*!I5GeBiev~^g)}5}*_R|LMqQ=(j$mY*| zgELBObPDt@JLdMC=#%+MnGB|O=N7Y{v0ck_3G=@M7;PIUOZ76s;5dcdr$z>Co*c(v z;~SWlDV z5Wp+k!tMP4&cV!N{Pbb7&>s6P3WC_kZ36vrRry&4eLVUyua03157-nM*F+hFqM#ej z%7!y!kiBCEHmY`PKe*a#M*lzEpa}<0$CQO(ha0VS}jO z$0qv8OQ32JmY~XOn$RXKrk=72!dC{%0-QAEpb?5vQ1@@WjeVJZ!lwX4G|k|cnA|QT zw?`5s`L?(Ipwga_q-qL#6XR1D1u$W|qMErsa#ya792o5rHL47a*atXSBPFOp&*61b zJ0x*=P^ZBi|44R2VM#lA)qVY&gHM=j>lvv*pBWWGs0ze8bTl^c^rfL+ z2}TExI$yMp4{oe7IepAtz9#!sj<$%~A;^S~DlMD`Z1C3TN|^aD^6m2L!NlUX@QB6_ zSHeD#NeF1!yl-a$a^1T^hU=UWhLaKAU`=J7dck{u&VV5RFc$KFe@c2Vet_qKFGz)L z)bWB3jc{R2G=&O@avD92f=&{TGg!MjBpI3slwe0aO-t+rpgb;Kg2Ka)OAaLywOvj~ z-EJwJjh}BI=SCX>Nsc>u30ImtUqdDl=9OYIH{2F{#}?86*6My7cS)y zUTMhPEW0+e$qAT#KJ|vAsUm%)&p@iUmCAXjsFU zIF;J9X#Qp}!z1fTGSW>UBDWD(r3pViW$C$k?D6zZygD$H_-|pI zh=qs%XAnps+y|zN0+RcwQ>FOco0Ek&Wko9h`Go*#7i#t}mca{W25m!H>@{runp{SA z6A5$wSA!~(uO9F+S`#|efi9pCce9%AeGTKQ1QeAtCWXsCxcM}{=nU3YvO7y1I@tk) z^PWmUiXq?MhP=#VnQ}Rx9XD8rQI*OE`n#7JF}dHe4iu0t_iGU@vTQf0hcmWx2Z`&m z#rVEbsax2zi=+L8A8e?Bc zxMbx55DIOb>z%am2T1lI4CJ9&L#6uP_;2cwiTz1Yc>2OuwS7A&f*V-=C$xzKnrLTzq59=oT z0k)z`1*r#FYxD9j{acSif13mqm7cj&@I$G{rjwXv$L+HonHq)SxZxdaA=!O}dP0!tJ^JVz!i-sU~Bd zyr9|-R7Rrwf;_~u+;GM^U8-UTl-y-Bh_axwS#XMc?1{q~-P$iMQkrD%r$aYajFmZRpON+|v8RxNRlMuhFv2v?alyJ!l$=QP#7A9JDgaS z$Z7Ki^2ijQYK}`I3pHsTWVn_}b`W(xk|97l$EOo+8bVE|t2;Uuvd>@{e>z6^bCN~U zOPbi5#UdrY5zeuhY~iQVBIONh^gV+Fz|EeUNTj$W>Jq9L!quh!0>_g#{b47B%7{I&xKw1sAgxGXknai+YD6z&Vg0_ldeNcA${*V9r>ULLldo&vqEfX8qC^ zWR^ft4Yo=Kf7h1I<3EqS+E3BpfFF5m`msR;Yf#>akVa@ZZmnX$vaAEF*esccV4L71 zV&m{f#Uzr}2B$1}y5_7zG-IcQ1b>l+FBKZUG=d-&KkgdaF@p)lX_q{aDtW@l7CeJ1 zMH4jR5VDs^RF0G)9Ici)0JBCDB;({7sva&^+?~p>da_!2r<9A;7L1ssSw3DYze<-p z>Sp8k^(z;uRgZKJ0igDj@V>F-56{!&e$`mXQJ+?Xgz6_(+qqLm6IJhI;7&b1o_3B} zx^8bSrt9WTy3LFB;5W?DcXKAY&|^iN{$|d^;9LazYVT5-vL+aNF20Y<(o*uaLz0PGGE>K(8QTy1F1EF+l_wQuxv zO{m6hhSrA5{L>!lU5x?c&Ct-*{o*oMRp2~T za^7QJ0Kq31QAXaGrwnL#!lVpHQF{j5OvF}*x&zT1MaluEGz>*2EK&ER4?miI9H0}Y z@E&2m?JeFb7;UJuKDg2akyZ*XFKTY ztiamMfp9$HhpFQQBAi62@%9lVJ_ZZ2g#`@6zf(&y7nH4Oc7sZWc^qrI`jCDV~Hhtx!`<2m?X}UXCf=u?Yep|4EO%D=D@J96uUj zji37D$8D=<>tLy|r#=FxuW=9oTZ7%;KRFPB`aE7`?cv%8dBAkR2nWLLxgPsj@cjAz z#t!V}g_{#=hQH4tKK^?A`M!)f=g|bLCp9J&VNp$*>Yu!n-<+UrO=Hnqqr+HLR3s>> zY2=i>BDG{FxwK*#ElY<&))ImzRXoxcTV6pqYm=*+bXq@4Iq|TO-O+;nv{`!5X!uNJ zEGwP8jQqTLdZsMQ5tpA+RfVK`)GfH zUc9`hQRXw^6v|D(Cg8nF2{NCN#W$3>ms^5 zD0GpQJjz(QWcNbHqtwjvLA4U{hhDl65c5-=M|NbWAnlQ5$BG62`h8pAdaF>Vukd!8sgbDu|Mpf{+0UQATI8V9*w_St{c2pbO=bOt< zV^M^VmD9gY^A(0o;M?Z3e1l><&)k1oM(b`f?kFQpp%LXa2h_{z^|PkPzpI>{%YT^aIyUGV+wO3LcHITvd3Hl z+X<%V3$8=9{fjx^=l?SJb^9~JKc&!VPW0^KOz^Q{ogui8Cw|p;3z*f>yIzC`!{y;s zjq%_(*zK+enCkyG@>ZfH0vw#ux}-};FmK`oux}S3DUATiDV~+TCP<`D1-3bap zt^AWt(ZAF>x$c|rL;%aUzj;r$j!^EelL40L{_-u~E6OMQw4hBHp-%L*@W<4(rnrY8 z*N?3YlLN6U8O=aaSzsDYs4y*uzgg4Hf7_lA<9;mK?XPeOWTYYfl${IM%_FG>D_R!t zjRq?UKL4QzMaRNiIS)bC^n1AsK~sHPxsckNcud(yaZZR^$}D6L#fc1~yvsD`74 zJyxq|lvFO}GAA_DhhMB{WY`4&pf9=u2yXzR>VVL^jLN-theO_d-ba)U%rDf50&p(4 zZ^Umj-B4h5zgw<0Fm1>MeTY@0A1@?s6fgLnwUql2SxR&FEb9$R| zao5vs&odXJx9fOj*%ia%tWd)K9T_2zJ&m0cA?@z^8N>AoA!f{LV*`DUE8cb`y%$ zibanp%4%w^9l?h&yUI~VBN9blL#j|2mU7#{Rv9Pt99+hvD9cngvVVq`*jOINaBZr% zIT34gEFFqihb8*x=^Lrf;UF>t{nJXEDc08$wlmHfbYq?x^LGv;>S3)Snvk9>TF#HE z;2hTBBA{_~d;==a9*!T@b7u0r$<4Y6_%HBPFh&jA>zWQDL~7YsSTtJ?F9@~F9l%ZC z`CDi;!FtHMSzhrGYR4QP=ge{L3TucAOhu_#WoVVLA9 zdY2_yFS?d++8#_Fr%Xuw9&=>`X70auB`#s!t5cpqck<}rPdq1-lHA zrq9!!uMLss$FqOzp0PUA>VS>ASRLGTFw{P=u{f){Y8{LYsTg>dEf3{I*TB7FOT)kS z4%aJX!TiaZUW0em;o`?YG0}6HTh{DOjozeh$V~R9Kku8?pa*~6xvh7CfUiy1=*3;# z!zZ%3Qhuq^nVwW%U~C``R9{H{&&36DzZm{+?C?t4I!vI)hb)ta_tWM3zpff!oqPqQe%kJ+*xx(HUfFpjO|nJr(GEytB~L zzR10&TVnSgFYi=kAT|PeqPxN`d8aX7ltd>PVWZ!CjSdl9zOfo(RseoeV#P_qm|n2a zU4QXY?zl%l;{G`v4?d(mtnH}L=hdxZ8G0-F@@th~T z)cyEj`6$5ofo{3YG(}xm$57v=x?yL$ZMfEvH|mR>l|vQx4fhR&F1YAR27MADBihrX z2N8dX;4#Gnu#AIg!dA{`(X*pKjh0CNgq(A?aC&TL{=!jbKJjkGjf~QfkzRbZislW6 z?0&wC;?0*x_pYBXde7bTZHKh114KAzJNNVY&!UfiK;S;(=qc0E=?C3Euppo>{=|1i zGGfb)`t$Tymgaue6ktisdxHfQd9DD4l8V(mIlEY!gh! z+;LfAYND3MtrD?jEF02>72=m|$e78qA6Q#wTj0a@YHE3`cTw|6^-W_6;lIWd_Q!Pb zj%c5i`w~8@w|qV;k4A4mYjB}oXFHMtJ+)wI9;D~DUW{)fTR!jO5kvo?J-coc`#x{b zFOwnh8Isin=AN5fIK)(G%|SK&yzP$h1+rwp&ZoR$Y3goQt8QQu?Rp6!ovKWJwL%VT z#I9DvfDPBxN(emqd9xOhnY(Yct5svMS*>Gq{FX5GXVv-IYZw{s6M3c<-Fn&Y^)173 zvBdF{8>Y6<#m2jNyQx{cDgci+N@%%v&}@I@E&V_u^|4m2%aO*tt{%hvx3fgapqhy* zUb+M0(m$$RraGz$qs3H6HqmM8ccDtiryw|2%Oo(g5}J1Z9S`i{L}M~K6r1k9>U%zfFw9d@##17 zI{C10zodw0!o#e*W#|CpLO}z7r+U@<+l~k0&b@d58`nyyb?su)?@U!F2ehY5pPj0QuPA|_xXO@jK zmYeH~f8kX4euktsSa#HVb~jOqZ^`$X#2=fK8?2}rq$%chF~W?X%^mFcU4!|hfwxmq z*EiG6;2jB9jT>6&ca9O;b}IKV6^Aa)Nz2RKjoJ?xn}>D8QIMEEMwu%1Q4i(0_c2Vo zHv=|~#KVDl(l=Ea^+6YXvB|NcTxJxfz+ad)z%6zTCvKQ+vmCDepp81q8&U3Jk1|{5;o4 zSSVNqu9A=84DwFcgm6`I0|<7f{l$h&EJzJj#N&@Jb<+ z_C%e=|DC@Q^hRbb52AGV03DbXMhccNO9OFn8RX3x7YT~V+^_PoA5DV-)8R9Mq-i|* ztjH#S-Lp8}9x3@3+wmCIv}``&k+ebnQ!l_*Cznb*+b@U<;X+$h zN;}KZpp7fY1-Uh@^f?jqBJMa~2EyKdCq|i@cR-TbEO5S@yoV*~*JAP%&P0m@G`;wd zU8+oztYsGQh+%(vMrG9D{a<*cLg?TDL9SMwx72cY*!fUY-R6v4J8UDx_OAk(ELfFf zWs2Ag*;N1Uhl(tEmtb>AmWLbb696jG-mS5A6x1HEJ4=q3nkTnzSZ&|rU7$OZFHEnn z`yVkmGUoAMV~BN!vf41$dgBB{9t1wUhXHf>-DBNW3YzkPgMX~*PE`MybB1c7& zS}ufq5u)Vu_mWXCkD86bPBh;VUecp8o%;@HQkjsn!7F2mSsFl|Cv6Y}Zxj#=yaxBh z^#QvDI`sCA33v{~k|c&<#`Xu+gQ+Dzc0f5NK8&*(W3LN*3w%rQon4l1=Jw1#+WiB! z*TY9xjeKVPSD9QlN!M^IRoj+bXEeuFq9vuo=*GexZ_IKx1#X)rH` zQB!fQ+{f*U>pWW(Q*JvGQwI#TC*$!U=lai%M&7}8Ve^ZFw8%1 z!P^vdiEKJCH4*QAZ$g=x|GK)`@Kp|B`?FJXC2ndi%qCTbG&U!;Vb%I2j=dq_ant%QbGsdorC_kDP~lU&X3HDGO7Y)|q^*IiLCHd6mn^rqL)RM^iSsWNS^eiY$<` zbzlTLhR4m6&G(c(-U~4%62ms0*|9#tA%1+Ke#kvN6Tj&g%u)6R%Y%*&dUQ<1XCLeB zADAbg`rR`oe*1X68=#7f_p9-P-Tp(|yx@_$|SdU9}pVRX0zjJ)&Me1-2sMdg712B^O6hYxM6#Mz{fouId%0 z$$>Zp)O$8Cn~59+)M9q9a%)w09y>VG5@to2ECj`vn1^n%>{^)nP_2G8uCui2s1 zeN0K1a-dUB^R84@ZlHv1Pa8>CC#udky?y)h4OW5opMK2Fs}imT^@2|$G(Daj?E&M6 z`#bXuZszQDjN@%&@A^T3vfpAJvjqgwR!J|FuLl)}PeD*j;_Lju4D`%(w|iHLJ)hWm zJQE7x#iH3aU~D)>kG}M%$QGT+ zQRaQ^$X`hP9@Tr?3qr!ewb3nlT-Nmdi1joo&u zKE9pJi@#?PeA9Aq``$6zFc4V_oaX+pfY^xDI?g&07J|~x=nPg1f7}si2Y|VQ^x*Rc z^OJ}gqm&abj%zzYXv{RnL5;aKB>tQHthRf1J!4$h_rauY1E|ZpyIXd_Uv6_{ZFUSE zlcTQqakhg01LPd;9Q23;DpI|}WCU$d2F(bV<$IiwIJ0(S_n=w}asw}5$=}f)+$jlS z<@=GhW~z@;_8#tlxlZi{XZKd`PK}|l#kY#Wo#P_MqK^pfDLvx5q<47Bj38rAM_Tc? zkam`nRK1QtjA?(FNnnWbCdSh7Fv4E`W-Ib8Kv_z><6l6oB0O7XR2+ciQax#UikS zZl8|W(^Gr|&HjNO>(if@$mo?8m5T7*5&n2UzKrF8 zr&s`KLxvtd>>?3wX>r|bo$esDjl%wIF`5wa?2?<=*V`y>ofdSgI=*no@oftg| zurUdy=%&QVG01x~mus#^zwawG446d?l znfon`4JwKT(#DlSzUU3v+0_wJn*-J=V|KwU5bG6X4LWhvupYt<*>*dWi!7RUcP)qy z-z9}X(F-fd)spLOUDc>7fcZAO6+f`+q2pIaZwg=dn_<1Ueq)m41I#$Bv6OF}JpS?U zZt0caG|WnQLF!O+dMdlrKVvsgAFH_yL@*ohuX;poTv!E{xAS>ucaesac4Zd`df~g} ztZvN+t0t;v%yv>{swy~A80Z&FPh^o8R!#WUhmN5(g)9^75N1*9wwcBA*I4Fgbb)jw zcXM_`2GZSh!szE|S1qp5zT)x)Y)s;XyYotQY^G-JXtGnTxLyFl@$LTk-s&y5t<5c8 z7Vv0MibC?GNQ`_HbKH$!z7ftg_}n1jHgw?Dc#H4O?2BW|@M9gvuq>AL4um+8`jR<=Ph|ltTSG9nsyc>j6DEz6-C=GP1^jAZLKb2|_zov17 z!5oW+$UgS819W!t!1UO23q6`|5TwpR`r6?P9KLUdKD$HGGdyO`4AhwTo&6GoOem?K^YrsiwS zTQ*_yM!Oca&SP>QahHqOQ^)Lax)bz3GnCNy@%qB{hVYYz!5donQF8{8jtv{bWQ3F? z9vic+%jA%Dj`7|1?mqI_n^Vk*cx-=bj$cNIOlDCrf_lmRc6US*u4xIHgZ0E(T)T|B z$O~+d<=)6!ltyB1%EQ(}fCj6i!VM1zD&4CB!&1%Q-UG>qrbgJ~q2Cvr^Qo|3qgjRs zM$kmjH0BLF7gN2esCf<_P*nxjCp=p9>K<@?ruo!h2n(<&Nc? z^CO(zfc5Ns&5o10&0ZcBxd>F$M%i6N6g=Q@S6^LyFejKqh;OZaJ;#&b3=;&?zs<*x zaw3ASdr}RQuqE&G1 z<^i_mr}w{WXeir`mq_JVWk^eq0ns35wRITIn}(=muR45wKI(YB*06=z@bGQ})^{DB z$n!lo>c>xgE4&4u?^1prB*?$H3be=lcas@u@9kb`y@$q$N)%sD4LLXrdCqEyOOET9 z%wc>X&f*6|+G_Q`2xFxiieWl>{J@uJj<2e0u%9UTOit zE??YxUxcde(6d9^ub|ZX41-p8Y}AK0!-PL$@MKrrIXRPq)>eBl<3x?IHKbeO&Bk}W zZ~TyI!BOe1`e|QG!Mc`y>{|Y{WAB@UzjXxr#0B#X1^KQ9=~?_y%h*SQa7zv5oeI*k z`D54UuNv+iE99##Sl7yrTIRkN>^&&>TTigA{vUQseMq=_)sU~qGNVmFnUa8Me*Z2R zwgm383tfo}$)L6IAD`5|e{-H!4885X9tPp6}Iti zZEqE8vsY4Q2jIOF{;*a~K!XY49fVYDOVFv8zNIFteir6AJm5v+1yv@e6=K;Qz7URZ zOC3)<{YVctmSY}8I0N71j)LsrM|x)pHBYHkmKHGANS?zy1`EuB9B&3H&V`ZZXtwBwd$;9TbjFRv$`|7^kE59MeCeI^ zyK#E~eBJc+xVk;jC=9#6zuQtU=N{gIbW&E~OuY`8X>P!< z$?FSohvsC^9x5)@)a62VbLFtogCIY>R(dN{P&E2!1dz9>Y zkw_frWE)N&g7ZT*{DUv3$*Pd$p9}zsB3!&0mW6U4HW}1kpnY}_fIdPVNNFdK9Yxf$&w<103ged zh5*N48jsNn z+!(R}^qSspj4sUDZ1n7tA5$lA&kpHbZ!4UA|6`2jfJ|%b>PT;#_?q$>JSOyR&+yvz zS|gb}9VdDp+-D}jpvbR#E_E&Ir+Kcn;rxtV@o(D5iLS!={h_(MxUi6qlp-Ss*QAbc z>P=d9MKhYVvW@05!<_N8mNL=SS|uZndgDJ@Wz0n~hyQ#n^f=H>-5x^{=*Y7fx9hB%Dy%izy`QC>vZYy1ftbt5 z!YaMR0@jqA#yxJK0|-i-@#037AcO=<%5`pvCHzw}MExHjTAXND7Sc#*JK7SDr=QLm zz;{F1hTDw{%dxl~%1?XaFOl^E-pr}IOerufAc~E_FtftSbZeF z4d-=`&gs}Nz_%$Op}a-iPqm2Rik~!WMS>z_^)tnl2?xd<1Kc}j>+U+3e{_=3y>%B|f13d?haCQ%y z#NmRUe`qI_{b6R+;12P{J^sj`4rxX>K~ZvHaq&G{WVqM?IK4EX+gutrg#f2C$c>Pl zUU@st*3%`^+!;QKfg%kzH{v1VvnB73rX4AB0s0E9sxM}PZh|GEMhcF_cXZJwipd`^ zxPs;~pF{<6q{p|hNBX=jI)YK!b;3bjw0QMKsU=Z&NzD_v4 z8ChNs?;g{Q!yAl0AxN2xKaQE2DKgJ4^u7YI zCV1Jm#0k#Vq5cxsNI5E_fgh**wK^Q8E2A(({Bw2RqJNLv9ODh7D8&6Liz((Im`dow zB{z3uB;Xm{MdPJG)gGab9MT$yx8fXEH>n*@-R^cR%l8nqnU?h7;tYO!iemr z9XQ}{;b>9Kx78mYxcH&wA|%vnW1*4ygJV%zzpuSP0fHTm*FcTHi9UxTo3(1*9LdHc zi48-k6a{}YxNPslylL7ggSkz{+=BOy#XWO?@`1RnFn)I}Rh8v4F{6S~LUEQ7rKTUH z-+2;4!7rWbpkvu_xEf%}TfCz8nbMZ>t|Y9uu0UBvN}XE~W?dE4TRUXtob?*@3Fq#! z2vOOMt|xj%tTFX1qB7Md+0PW(33&-VBaS2FZ72H>($i))&cto(mt`C8Pu7<^3->Rz zZi;!@t0cUk5qOyjXk&`B=zAEMqs-FO#a^_w_5!yv5h9#xad}@F(^m&SiLar55-01V z-}gdl+ekjZ3Pl{(wo`kV2wJ;9NPr{CLS!{Vv}9!8xvU}OqSCOKCRbRaqJ4RC-I%xX zMuo@qqVs#9p3xo`s4`#{Al^^`pYnF2N@VKRv0G^QzjP^xB6-1dc)U z@8Io{sT;I>71wPqMij=H%x;Rg(hZ`o~g&b&>4i zikuRKA-iPEtFjvIaXO1Q$UPycEYu!g0OM}O?OgpZ2&tvibAgm@n^k-FU2mFYskCsW zXc2Lt{oPG*(h;Gg>Gl(T{!SlXm!HP&RarB|o`YWj+{Zlle!z)fY3!v&{Kb+vBi?HA zdv)}+`dH6)0plwU=lNDP_?j={UD*Yb3g0r?k|1XiAto0MSmp zD456&exTmd@Y8_n>v6lyHHi{R4t8uY)p_-cL6BxYp}-eoHwiWKPQ@azA_<$i6jn;X zM_;UMBiOF_%9|+#TR*p0=yQ*Y8OT=_n?`&~%`s3^3?-Uh=!~>yjKa~6xoMn7H{6=p z3}kMr-*Vh5^P~6g^*z|w5+Rmq2f;mG?OeI~hyXhDxLq47sP!@`Rwt&zZ~E1hq)zh2 zQU1EfZ>Zv)!#LNM_+CY`v(+}&QyR}12_Gvj1aHRENWi|v_du%aVk^Lhj!JoF{nv|d zz(m)2fpm`7`ow?Aojo{$&1rDYyq(Q~d7KXHT}u0+QMl6NKU?;9{NSyX&J|L~{l{jp zg{FyH0#6&RMr)hI@xECZqejag>3laoPAJV9Q`zBs_evK&qs<<-WdphW;*HJeo-Bi2 zrXb;r{i!%2Yk{w01@NHw=i@8*R=)X;e|0%iRO8!u$!KW7VHQ)lv`#&CPdmP`d<8Us z`M%e?I{i5IiWkUAD)}z5J}C`KeBsZwOX{m|LMUI~OcniZ+I*f4Mrf>zheTJ#D%usx zhmzVQ_%e-_tME8o!rBaoLf=zA`5?Yti_FP59N{^oy_bNOhKMwxGOecX%cosZUYG?J zEl)J_EYe<>{Z1S2s-_!!@N|O?i|{etx`RXpy*C1Lo|wC!jl&#=9(Sd0T%RyL(iP}# zM@$G><(yd z%HIXiQ`dXQNoKJH1ztk)c1YYIvblbb>J&W!(eC^^-b&!3e1KV08|M?IY`s*B zxEihXkJ5j3F!0{MW+b)8Pu$+$3;!KK=7pJI=hDy(7UR$yQEaGi*mfmSA?b7A1fm-A`C~Bd{_vt?1fWWKD!DyMVIRJJ`{|};DgC=P{@)5J3^9$HaN$Oyyc2&A)4#&f>fsaS!(1>xspZ=rjsGfLX_7%YV>dT^}d30T@Q zI10I5oIZ5qpm}i;2D?Mo;|~w53;xjFvQiM3VVKT*VF1LGf=stqY5>s?)((v~lj@PqY&IM&6?xgMsrsml!pd3azMqxB4k&Fen~n-=+Y$&qNRa(8bjcc#l(08=puZ7f|Pus5z30p=TJ()V6Cr}FtT`HT?rI1pC! zoVT)&by^Vll&vq6dxlXg`C{*Qy$q0Sk$5VYfxFM-*nboUj7>QfyImMRA45Y9ikPT3 zBTlGTLAA)<1q~r7_R^j}SK+<}D!z+2C1XJ(9Yff^=uWFl0a92wVxdwx!prs7EqMactNdt6{0dW^UiZLeZFa zyY(NTXE6=vV3uqg3mhT7lRzoQM|EbQai~S@+z!ZSax>wxG-!kimpAsd$JpSIVjQH;u`(LO9$o?N>nvq!RC%D=BddY3Lv_(PNkO5_^l zo69?%P7WftBZ_!f#fr|H+%#vcK!y(9LHS$1VVgl(&X3E*rVM(KwdGId!mNDoL_**zdlH#?}Cqz0)55h$Qx6Q|?U+a*giOdI8N7 zb|)U`l*7Q5mVfaD-X7fTi!A@=%<6KOUCmeSs6MN>(3`E zQ{QRA8hDw~y6e?evkuMzRsd{{cflTjoKRG?9=H4jN9OgnI1}GQ*_Y?1M6x=A`t!+Zn`@7^L@2YzufWZN$|ER|5&IxDc$h1sw_y>cgK>@DzZk=s$(l?`});^+DvqkT4O z?Zu_U6eLwQ-!0|G_P`jJFs_*)RRAOPxu*+Io_PnPt>l{BK+m>zFKz1aT8C$TCB8ZM zyU>(3plOiQqD>w>Xd}s@@-E$xrR-7_M|2swG*Lv~fBST0t z`;8GYA(C|!xW#<{Oi32ugIaOFl$XCQ%oHMs7rf_r{RxrzgBT zTf{9qC2fd1IV=}H$4p%!eY8PuXgECh!YdjfbA@g_aoBn*R97Mk3bO_^3wRZ;S=mYD70S4S|{ma z3lkh)!VM_2FARU#_>kg4uu%s22;y!yjLkd3*2O^+8~r3EXdK}gMH9}4p@RcM!`?G9 zQ|JTJxp9`#bDGMgcj^RwFhzMo$KPUUuwgr{4J|JaR159^WEQ%|zw8DjY8z_qYFLDa#l9uaY$N(?J8 z>T1+%-J3t(455uJU3{-ZCc=oEn;yc*?)WmmRH0A*1vPd* z>IPSIL0}j=JI}sWP@J?WJV5XcBW3miMOVt|WcvRLk@(s4kKV`= z^z8o%R#UE0WpGOvI(V$NnCI4Hf`$ z5xZX~_PjLTf5kTL5rAz40H5wFmKHL6hH6+oHUIF1#b($iquiL6TspR|iJR1}|00l- zYxP+B?N&2}wb5TzLkCnYNx}NjKx;D7oE)8WlWJ@T5PV!+VdC;mx6ze z;rTUqF8}2-s3B@^ z{yK5-=43~aQPV?87#9&^$2@rJ%bcrFT6I{}Xslu3+BjbE-K;3G=Ty*X=$mXux{asO8!WwQZtSm^h%+nm*E1fd?ta5EC zK`nbC$U2MGc=l)ST#`#QJzc|(=ByhDkGDEhI|0_VK_SdKucCi{s=}nkszR@_ze&4_ zt)0=_{1XSKZ%bvpMvq~=xe#%@MHM-NRLI}@KVN)3)5(7eXlDbWUmgM9h#E*y!CWED z6r8M?RTUvXV}hO8w;a5R%8J56d`!WYc1Y zcnBRO0?1}I|7IUUw8W+tTEv3?Pme5DJ*`%$C>r8aOjE1RFPS)3HOu;cBHrPF6r2v%o! z&OX&8ZdQWT-WD+I`Y)*XxsdDS;q>aWp@MXNM`rkqhx(yKhgYG__4%Cf8gLMi)#d5u zr>y5rQly%fI=%ncaDr0Ah^DCp6(!i|{e#%ZBO>{IG)AY;mQ!K=BR`iZM*wq+D9ZS= zS;6v;Kk%+^i9_}rsTzZW2SHl9IHUhMpQoIMQ7V-}M|hSPv%lP&kD$btezOAM($Cr< z((ub$@Jr)S9u_uy6S)Nhi)%W3;4@;*6CZFCqt1%bp$|=E4v&Jdc7HmM} zF2}IA4p?tq)ZB5{^v&<{d_X@Y*zrr~Je87Hz@pd2S_m6Wp z2aU^P&cWwc0Gy^^SMz<+V_)*9P|A*~=i^9}r(+z1t)KWgivtx#AZ>xPKNQx?5^P~- zqoT7;W#Ij(f`%`<87g~!IH9`Ssuzd26#vTuolm#W-3j9a$3K45OhBU0954IN!jHix+& zKvcHrS7lzdi95W}UK%w?nyxJSm%FI$3o&lP=ZS#Au&9*oL*wRWv}zLB zt+B@0W4fU!p@{$0f!?+AVt(3VeO_y!(p_38N8Be&1!bbtHIf-${+12;^Q2$y`d;-B zo(GH|^oH7soO!_O{+q2<+F2GJcDsr~vBu{9lO25Xm){QY>pc)lJgG!PlO@k9R!fQA zwKJ8EYPx+CFh?a8%}KBo%bc7d<3V@Jb-C3yi7#vD2hL2VE2TYMUjyhE|M+XjG(X}* zL);~%z6EII0PPzSk?4iX!mIpy*yKdKBCP`8AF+q@N} zHR+uOP|~eY&1(a498p4kDlqiTm?KD3seNpV1(DAi2Z0cTpLO?cZRmg4(FG=r5|B9S zc4mbQxR|=}{_Vr7SWKlWAHM$Ek~7_F01J)HQk^T~YFe*2oMbsBUDuRFNt6)QjlO~^ zGTE19&n^~bgA9>Z%X6}l_Wt2(mIkcV0UVD|5MC)d(bmqN4?r;Lg%o1vQ^g0EJF7K* zS)lmmTw~{g(p)6uoJ;P4(&h4*@qKVaxXulX!8ijEEMr3kUld*-6@z~7%1+xlW$Yjm zZ`#jYG5-}Jp`M!XaEceCYJKLyQ!qmFK-!oZYg9%aj|fO-J2&T`Vz}}uVE)7(n16o5 zH8ws6(A5?~?kJrWPN%GQgYs&XjzLXN&nAF7>Wzd1wVO?yekoB{3Z zfvz2azsMhhF~8J+U4!( zva@l0t%J;ipP%^nAkp2@nk!_GzL+rclc@w&l0PoU1fG+a$w%nWz;W$Glq+njA@KO^ zK~Q4uxXr2T&}0FF1S21oWcL`b0Y)Vv#rz$yTT0ts1ET$dKA_W4KcEbdYTyBwT-Yl% zlmYgt3>F12fjxKv84()qvKU3E8##Olj?ye@YDhR&XFag1(Yk2$J-2unmC>qXe>cxu z5qUQU)0emTb4=Q)i4u;Qau?(&Ag|Zv#hAB_ozcyYp&ipv>()9fD}RUeY4_(yM75O@ z%}6=V2dgw^xGAIbXkB%;?E0q@GN&xF?Hefv_|?VPet=I53Olwf>@PtZq}d^ zzF78>SNq%NPBtr$K_&gFG=;h$oKI9$yl}FnQtPIS)UF+i6CjzIXIV=N0=Hvo>b$Y$L4trVlOo`e=eZXOrRvPn&4OE5^x zWgeUFmM~w;`ov-mH~hi9-Sv<6WZAE`PGsY!QfW>ye` zeRdS-ku&92@6XHQ@0TU~Jj+zf#YJUcXZ)D= zIbk}nztihj9h>rp%hl!4&VkW}Cy6&BwNE&vLOYTYkm!y+H5YCu68<4eL6W&m{~GrT z9>o9Bb*nx8(m0a4z2DTnVWGtqoNjdB^D%Ypn`c*iYIPO^v*I{Lq-vs$@z6)M@=Tqe zhlYM^h5X|o6uS9ntQ3ZiebBpO$s^3W({!`%$F$h$Z@QnbJnjRO9829Ir_VjVX^MJ} zY2E0Qwb#9;zpeVxhlVcIT%i0}f+@-+9~&~Dq;I3dIF0lsOIp;~c^&YdMrZqO?wYoJ z%a!U0W9R~%5iX z;pjE&^Oe_^hcFobtfMR)+%?s1vOx-IQoTeZA!XC@8nJD*wfWh<{8Y9g;xg-*+dMWjH~V_zGyu~tKk1;Qm8Fhk_+VRxUi+%nMHMS zSix{`(Azt^+}w%p3&=FP=tB^=P+AHY_DAvEOl0V*t(#K287s;%s0jaoQ)ycsxR3bj z$2zngM&t*?2o;wD9A$+`Hh*YT%M=?UFO2I~B?w7n1lgK^Pm|9@Z1>+*9E&F5ROFsh ze`V{}rCpHfN&3JqM*Mky^PNPAIekFuU?YOiI03?afjpa1;Pv+j&`J=1x1DhTh%|qQ z4k`eTx^n=?6s{oh9-y6n-?oIXumJMxN`WNMWsyxDApzYIkcILJ`uBm}^pU4}C zha;dI0P`add*ZYB-j_kMS^klr)6LWa-xP2f22RSVSjL|->!%gR)<-RJPKae_i07y! z^b@Mq%mtc5lr2-yvpMgv)#AY1VgMejzj9vj@6~DQ>-{pEmaKX&dm7M&dluWnLbDh5 zxAVyLt_QG@##?E`$QC7JD3THpE{_uBAnA)bQdh>(jCc?C1Se#OgDo560G;?pEeAEg zt4j?4-Ss+4Zr=|8TJC3ng!5lO63stAdy;~S{TVda^tNpdVNvoXIvMk(`~fvm3F3s_ z`?C+=Nj!sOO8^kl6mW%g3g8KQsSwQl^Ni&mp%yr1Wm9{w@%H7ZI3GL$#5ivOxk7?$ zTcMlkg&aVeP|26c;ugUDeh8%OX9W+#pmf}V5D6HU0QGW6q>nBsk6GnFyld3&pIvV= zE`3g9F&q+A8rDZF390iAEcP2?lBOHteNz$t>C%o`j^=Tn0c{zW+rjd^hC|dnsVG)2 z4ZOY|poxh$qQ^W(9y8nFMq1Q^LL0Rgt)p{@q}N|ym6XnLk)AZg+^Fq$Qx`5p@%>z0p4 z!Wy8P@f{Qd1%J%-21XZOM^dOzjl1}5mHbgIN^%R|+2K=I*e9&Y1;`OkMg?blZ9KM- z!*r)l8+Gv$O8eVr@FVoLvUNC$S^mP=8gfCUz{LlJFi@t)aElA_Q_6)pwk+s-r-pKU z=+Y9Dp@boGY)IqAL-gWIR3SA~VMzc*7cGvVG)@hOE4ZrA^QRLxK5?!m-9(td0{XU0 zu~)qm^?<>)%#Xmmq;)Tu`+>Sy11^4;77870s%Gf>PJj^`(2E3jE<3osd^i{XS23J@Tas5-)PpmbF= zv0?0vzl!F^sV=aW!cATD-%`UL5ROxz`{PF#VVTwEwm5OMe8y|+{cgq%C)v)%apXW_ zl;A3H_EEvT(9o5WYuUQpwq|b(2N>hq#W%zAz`Y0Q)KyWNH{TDYHFQdQ=~NBb&ylM~ zU!KS-3hyT~|j~v}?Ffi)NF^)@pHd&Qr@0==WX7e_H=$h~=BGz5&yoVAqi| z{i&m|gWeP@ouOPhOROUvI8u-gG%G2f>T2?mA4zPCmcCVI}+5`CUE%ny3e#B^KZ)8Dm}X zsGF3~3lL+nzhf}chKKupe*{SO|Buqe2k@%zJSe{t`l~66=;qs$8_CiPc3gD-WMnv* z^D5M<=*FItlciZ$mg6S0DS6oo38@ngHnr*ZW~e}+!IgaLJF_V#L$pj=-!hAE2}vzX0SE_J-d9ea4oPN$_DT9W8+e@@kQc{x&fKr|ggsyu|CA!VWJ2f`}Nlo3OkY(U*X^2whA-XoUn z3BIY_`;8l4MaC!h8@ob%Q}w|{+q^2xJbl z(NL7b1M_|fBif$!<@bl%c>|Bf4%WwxnyMOTkIkwxWDOV#T=KIJP1R+(u_&sDLeHu) zI(0+g&3V$WQ_4B=VnF?!Pcy(nGe^L+V~lX^Yatx3?N?Me5hUk18D4c@a&hR5_iqft zPknFIkme6O<1giZ1fpS&Y>Z6|Yqv|+>g%Y^yJqiKLl>o_e}@&s5@u727t>{VSYeL} zeZOWj6RM0cjD_nvkoS%1>+9%Jr3}?AKs9d|@U?D`Sak<)q)UnGA2Bag&^?>`u9#4r z-q#~wi&m}TI(YE{JZ<+GSupsdC_OM9HEQb)8CmfAqNM9RqwS*4`$FqoH#e29D_hX0l|+07f$G4@+fHZ zelvsuuH>+xLSK!T>~bO&$=G9;CP>3@2l3Vd!C9U=1TdD3`0FgB+rByYxS>PHFG)Sh zZ+}8yK4N>r5q#5or4f9SdxsG=ly=ad$my;Tq4GXC(FG}Ewng`D!iXsDaKc7K^aqAOF|h_U6aG~DC{u7^vLbl!dy~c=fU(S?GVHC$nN+AkE7LgG8BP@qrO z1VP4_PuxMnh;Ki89T9~npMlH2JJBX|TQm<#IfQyyeUr4g*{ejkB!^qIv2bsEr{9RT z*W)GH+tkEuIrxYvhf1XsDAnb7j#bsl2}g>A+x)gHeftqbin+;I1R>6;qghquhZra?;dME*G!dp2h2?00HrR$ zix!8r#S+{>Lppvshq;ubpB2XB7wbqZsg_P*n0QMTw_#k! zaW2^OPik4gTW?nGE-O7bO5zOt>=24uOIpT_GXz$)m`hyG^$Emw{}3UKr7bx>j}sa9 z(k-+$*F3-m_rPhcdApD80^_^g{0^3io8s8C#sZa!S5tnJlb^_~v4J}4OmcR`+oDoy{|TszBA95V{WQTgN*bskKcA%DE=GqWsMNdINF zU-n2{%TSxEkdEAJlc4z5gELt4=kpa{=@icQb_F8?OWg;z`pY``@$L|`m4gNBOyuXMZ5mgK-Gk8iG zc?N4CBDkFR9pxQqGnVXY=gj!Aq4}EJp3vCOZVU4Iq{Q69V#DO7ti;^XVoQ2!bei{^ z#N3kNBYJCA8ewHwR+YKvG)JWtW;Bs@t;`vD50$laseX!P}21sl(9_ylWlJ~^u1TTt=7**p} zy(9ZHSJkcApD+F}X{LOz;WcS~tk?EI)q1sjunCA-+!`{v2$0+Zw)up20b*1gXV~-V zwsDlEJ-^1?bMK3`ji@s+qJNk^6vhK&z4$D@J0ciZt5B|kZx`TwdP|3qdkm9PvsFTZ zj3bd1UQ$*Z1GAG}n4HDVYyYUd8xQnZ_Fi4b=_-ijZRPn=BDgyWg%}vVApFPbB1)DG1>2?Ze(7*t*}V_L*5aF(*i; zM1`jAOGwZ4a=*;fQ+}4@j!Tr>#Zgn(j%{5q6VYtIomc#64438IR5x}%I|kLNG#}+3 zYoz6h=}P->#ztu&J7`4FXgq8o-qG`DwOm@Q-n^4j;v@R(5({el9_GF>W zQF~7&0gm9l@9ybc7kyKK%I(*QWL~0i_oB3Q+8N_U2VWl;>FTxlGrGrw9vI8Owt$Xj zV3{}*2yX`fIp|y9ZWIue@c1AP0{|rG4?z6z1DJ&KJV^pTGHLj00B9-@0L^>?09xq% zYz-iwAQcGUgwKNl4GSJ}uMxdOCO`(R7en^C`0Y*lxxhm>EJF4UO2I)mxWYlC5$u*L zLqo&{`JZ1D;wYlBP(lZ$WI{ujR{Cql@hv>xHd4 zY_sG$T$-F;^5R%DH0pB@azrw+ma1wbD!R9$|Orh7wQ?3la*y*-&+ClDWj6G?lH`B z&F|nLNbDX{1wYsKS`I;hj{vxhZ$nQ33dj8@HNhzMObezhNWwLew33iZr;_%wUayd7 z5Y6k7;jK$5?n1ngZ+e^t5ZpsLYB!Kpb>?6gM7uX*TwO9}>xq96|Ku|SAvcByIC_K% zg*zsSb^O~`oB3AMBad+ zV>v9iKD6gYYrO?^-#yNT0lZ9HK;JT%rsxJF3Cnl`y0Hzgd#kkq&>_s)zvjKqPfRwg z66SF!-YU&=iCSbH8kSmb*=HV>y%pTso3M!;39|fsPI7*0(-V(C+Sw~`arg`{-GSCbDn0@_Qvr~| zHsHuR34nSDc=4U_W=Xa1o$pk+Xs z$Ki=hgnux_)D;Qb#9x|XF3cErCG6m#&q0C?GJ z7m&N#1MFyrfD|H&vFo=yy`;CwEu}*stBM@3wNUO|T!hg1sZu7fo~4?rdloF0f*!4iO1 zlw2%_H4O2OCX=jXcVum9y&1)WM;~BbUYr=XlCpMB(OFrGuF5g3$Z_y6bidfqZ68hL zxVW{cBssXOl+<+R4zbM3vdgIODjoT|!*7MbX4BM*mfZJ{7w*)y*z zQ2R%fy{(R7Rjte~x2nOrVEk_-4gSg=6S}37jqib}$BxlCGpQYMf*m29Xzkjb!MTBk zEh&%Cs%Z&2b7fW2_jtJ$g+#i}P0h;@nhf31)SEl@>8`cRwdW-!DO!D(6lo#N=*{Tg zXDNie;c}!7;qFN^s~l3!y}FwAoB4@G7mUqD6^TarEi)ZTk{;Dn4V5)Z9jY_~?o+2x zdS~A)PVkp^wMV_bdeu5LSgOi~-CrM@%Nv~+WUeKKAy?-y-2Oz5BIK(ySC>QIzK%XO zm+u*4KZ(m@YK)8DCF`kKdpYnLO~qPGc%DjJ>$vV>NZ_UL4e4Vl`2gI}$l$K_3_)uh z@ORlcQ?XZvVp@2{sp0m~LR*Wc56!Kx!Er59OZlsp+LqC^7GbP2TkVCb#(5wE3;}0k z(E)567{;u|p+lcB!;)OJBhxeqyNN?>hJ#(xQ>25xm&v(JZlASH`%}WhF}!>=E!l#~ z(`#j6bCe|vX41-k^)Zc>-?TLGzV-{B*f=(>nkQQ)iXF{k5Z=*@?OE;yC{LzRfUeAG zWJIKB!R0@aPDZ3*@I^H8l{*};-}~Y0=#&QyBLziF504+BnNR!%wE^7{a@0$_!^sDM z7IM^2#Yg@*X!2Ulld}u`GKjo?j~-QbmP;e(vt$mKIhnfy-(H%vC_cc6n<&cVo8LT= zvRUu??k$Y(*3X68p9QiFP27+HGid^1GzsC1k>Yv+MA%9OC${%o+%R+g{3Hj`SixkV z>7!duVj`%DqjK;ztxRSVIuBIuwKMJF_g0R-?8pt0*aDeON1ryGnxtL^BxXDl$?kT= z*L+rw6;ID)nj`1iBdkBP0@yBiaLF zih=PjdsK6BCy)w}vR;N6ROXVJ(rR||YPY8IPZKL#lomLdvL#-6YeZDj{MxSsNR(xad{asJ`prpUx2bR;k}=XZQ?Bq==1&)@NYWk? z8-K0$I-0nph z<*#O#{kWok%8?5TmfjKj%+2#xX}lx~Z85~b1_!AbOZ&OAnf$nsUyL%g8Xlzc;^Kje z$gTMfP_O*SsehlgD|3;@@ZqHs`$zdnM&!3CkoV`AKN$r+h@T+40l#;XQz)nLYqoR7 z8-YlYV{KK&@NRfz8%cJpoq5(>GE}s<1}a8O`{b_DhNN9!(_T5=74}4n`HCD;_nJc)0!`GsbFx zz<<>vUQ=j=l-nf;R6|2u3z!?Vc?WbiHc32q>vm>8#Dp5QgJ_F#)tAuT0_`=`v~yO> zm)uRhQ{Ck;U!D=4ru_wSo|e=zLmgKtUQ%-^vClR9j+9R;`AaIjMT@)RGD^=ftUH2I zXqo8VKU%{>w1Yr9o7Ua#&)yAl?W$^=m-W}}U17sC_V*d0F?lt1gW9dn#8fw=*wkJV zIT)l{f0GUBb;pH_9N^FGaDy={8c7j&VE2zRk$m_9+U zBJI;YQo>*%s1HE%m|96>xUc@v%+vBWp%bI0eb0VSm?>}>oiNgRdj(tjmhoXbot$Npcu)lu4k3b zKH5C$VTCiYTxDLNCn;ow%A_zgHFO8Fe-13VddZR1kBZV0VUg}qi395>l~cgO<@(z- z^Hxr&zK5E!k^t{#qLaOTXg-5CHRG8xM7luLH*ogH`z7Pt2s&u3xI`>L zHID1$H&JjQ6Z6m(O8DGVmk(-BU~w7aZj6r0M@<(CydFd9meooXX#D4+m%0xBN-4Zr zkZD17$$LCr_l%`srC?KCUsJ1PX7qoE`>LoonsD10+%>qnySuvvcMonq?gPO?@Zhe2 z;O-8=HMj(K8zeC3T<+_Azvrygy}s_QTC2P2VOQ1HyY}XtdO_KuBMWT$0yeIb&ilA> zBdEd2Dk==4)4IIKP&Bm*%@$`%{?#E5@D^FasU$;4S8U-ir}nM^nmsqm{!+^z_;{KE z1rbFf4Bixe3QukK=DYu{blljfJ_eqwgk@Kj;csoaL}^j_c|tEi=o@dT7pS1QDLN<*sAcJQt$?7-GxNez^xs5 zcb0atO;mD#M(A$l1mB``BOnirY=$8XdU9 z@*!D;MJ|I>R>aDSe^_F5AiHGGTLA zWLR29$BmC=Ahjb6!-8xgYk?QG1ZSpLnA1-TrNM@2KS6?BDeDejvseb+JYs_1+Ep>PbdrsBZ7p6 zv#PY?2(yCKp5E^bXC}2103(3ap4_hn=SmM&hUr4Opa(O<)X{^9Ve06>!Z39VU<8;p zEC>bMJ42WN4n+I(v5$OCfnQiwvvMT!a|$)v19 z@(;(MUa;g=`fbBa#Y06oMwlY?HOYb-ThowKQzsuKAh-}xXyoEj^)JlLxbu8 z)n~)y^4FHPZ;cbn*;%d6wbK=7Hh6m2`)Y2Gj&|FB3;N%6$ML@c=w@<>5d@xnV_CW0 z<;Pejc90$QMjrgJSKwH#3uYG4LsFIlW|rYcxE$Ok{Q6-y&6*WscihQ-{GfcbW80q9 zvEWzMvD~6eScl}33fq%|`v&V_$Js>&*-&i@aS$YWM~Y&1%Z*(trBI?HEQfA5n)jwL*2~A+qo7hfK$m`QNK5`#;dtnkmMgskaZ+hbl{X(MhqOxf z^}_ITHR@zm9{>k&2n5y=+PA5EGoLEtz6Y@XZo?tCqixDG$@m<(#!bEEmV<8X=G_MF z3kvQPQScf)jBzzfI1%=g^>t1->GY5lfKFhKQ*E5MUYKt51aQv(*)ac`*R~QVfxiLb z#)y|Iux;@dJLKq1&M9#^=ttx2+J5WeX}lvfqseG|;&nY}{jbc`ww2b!x~57yi64jJ zI$eX-mgDNC#M(1|ined)v z!b2vfg4SKvj3~WpPq}>RgyGdJv@-qQCwQF>V%T}bAG3t>0S<duYGUp|9)$J?%x=m}RvkyX6cJQoSfCv$5JV(COVqjDp@FggxSUq_fJkw)$5a*HXe2)>y0BMT{hzrubdH7Vw{uV zM(IAvl9HIqp9gv6v*GN=D8p;;uGcj zhd6|swWUEWPqvdxqF!pRHqIHQMGzuSB$aMEBAIo_fJ|BTV!k_a6D9V56}8Dl_Fl^O zD#*2gkN2ORD=jmzKwi{NZifk&;*?hZz0@@Lt>3uTTdI|VK}?(+poq&P%en?MZbVz| zvGH$=aT+ z3X$n99yaVxF?x##OMmbjC|KBE7A8kX9vqi37*tW5e~>)LBa(9lHC?z%aQ5dUWvtB3tJ zmlO6fBfUVUyZ>S)QegrGf|&_sj835&sm%h@X85|0Hcm%qynTv`y8EC=ijHPSQ%)q! z!_NIx_$hIt=eVWx4#MDuP>xT!FI`W0A5AQ$b*0t6bB6dMOP9f zM)f^#^(#%^KEDi3x@v&)r*gN@eK)>dKxX{tooV$iZH4{9o(3*-UnTX(r^-cwD9=0F z*DSnp5|}I@y)8yOUp4d;jis*-1mkn4bbrp%A z)=gYpJ}OK*|D&)GgnB`){M6n3t{f&DWvNuLSZYNOdZ% zD`S)AmLUiMSP6pTo#YthE8+doW|(Qq0az%NXCO6%f7`8?J8Gw2^nxFCxb+PutKY7W z-=JKonY*BT>5&to`@hgh*i13KNscw?a+?S-8`8DE`bpV5>_iSEWuIF=6T6U*`5grcC!4KplYk3bpxa!q+$}BeYF*>6HV4R^~6zWrKzBq zYvl1AjKb$+(v1$UjygI}8?*V(zVQ|IgPhIMMD$j5S554T>crpa&(vX=b-nr5-SVO< zRa1@;vPE)nH=l%IX3VQf@lu4(BV}jFr!PzG8!XbIc{HjYHp^`_RM8^O#RMv!F zw_c`6gl?gEq>762Bl10c>Pj*0@Z3@@S-^B&e1N54F@D?Qc*^aseuRrpuTkqL3g`<- z%`a?CT0rbgF+Q>V`t3qWW-ZtU#mz?2awfqD@}xKT^1YN|XU3C9TrQxX;r?H5tG&BF z<#`GTkttzQG1)z9^A8jD(kp1e8g#be0ZOoi2`22Xg9!rcgai5zz*M1_u&=`XZh#=T z9RXkn>P{O_90kl3x($Q~_A>y)k-g#jZ1KuF+gz&p}TBCr<)%m6Tlg=mL@Fu@dncbfhJ;Hyyo3h*6f zM*{dt*KZDdwF~V-fRKc`0bbeqK|lz7e;c3|9qbE$@?lC0`)QI7t-J|0!h02fWR*`kNNk6-7-n~Cx z!mz_Vo95pRqAZg3(K}E$WwxyK3IP4l9+C`gF|&LE$7C<4a9g5Pqs45}H)P5`a0-;=;k6%zheu3&E-!YT@@zhAeb*G=r! zZ+zn#gxX6X@y&c#Vz6)cdM9xVi96ppOEs}qFw{(d5UwY8g zlCQMjhVarO(<=*eb2y5rOk|3VJpGGLiXZ(zBn7jw|O-bx!1% z?{V;++3}vq@q~8=3vTzJqEX)!{QYcd9SDoNv*!15^cdclhH}+Pp?rF?+qKMyh z4HNu|lDLnyrc8Hi(-|8%xPEL=xW>0e8#l5)dOIAZ3yrV-)i8}|4XV~2Gfw&oOn-lBegyyZIB76)6#R-o{X-)ck-( z$+f;|3GV_diiP3uvq7@8g8k0lXJL0}Q>SOAM2t&fU?Gp!B`Y#UKL3ZHCmm7fe1T5? z6g=CQ@onmPN8P6w601|cb|uaio;)QMIyhrBFG(iLqDq{vHAIV0y3_MMwmZ+|$45k}4SE`hJNMG%X@HSHsCL^Zc-iYH2lf8LED#wXwgA{Q&M2bpGuxyP9)@6pL zAagA->%n32kw50=0%pwn7ZqU`lp3m{(hWQc2_~L@|E!vhRBPb0OVwDx%chal)5#!4 z$z}HY{jT8|rnV>ofRgQi0IwRM*D$YQ{f~fmg8oO~J8*{r7yF5T;B|6-r166oe^+-BAoJ0VE&@B3O`1GW0h9OaXVm1lSV< z1Ax0|KQaIns1E0c-%lNy3J3tGBM8D%qSh1c=!E_O1OU?kxfo#QP#(YxoFM9sbEqdE z9Yz#!$0YRbU3wYnbV0?lP0o#aLFHL1W;4?iJtZADwzw{1n=EE?W^zKi4fW+L1tiKP za8%9|bP^ELx%wz%PhVyH7r$rgtJd8)`>CR>tO+ESEnYAc6*6Jh`yZmdsbbdKi){Xr zbaqyqS*=v=)57p%o6$P9(iZ!M(W+G~JRSi8uK7AuVsFySP1w6Bl0i4Bqr%zR^4A9& z3tawtBQS}Rl&Rttlp+k3$i(kA>}r-ur^j)^+0kaQ_z#hVXitS_{PFkgAxcaty9=nU zzK6)lfvvQ%2v*7la4kB$Z-gMW^kG_I9p>FahI7(&esTqqm={U!l@VQ926l_m08h(y zU~e{t>5q?F0(OzA5;%9;c4C_ zRpRRSEW!^*C54ljTy>}stMhquV~n8I3EZ!<$VZR%Fr9#rc{4AH0HU7wyLwE_T?MeQ zjVN-8=>hU>c~2VH8D|*3_7d{xc?2&Mu&*CmgDi^3`vwO>*2$C$IskhZYFvT?W@To zl;F7-Pd7HAiPFp~1B~M^<%K*Yr4NExKi&=bar~EqJyjINfBVl?jRq6wlM>*?MC5;c z$xorXAaMz`Wx$U$4g4dcHI&da04#t6zz^dLgJd_<nI$GQ0ejywP*pUhq0Cp4Y zP=!VV|H6RvLP`5K0Dm#S7@@u}qA+0gP+wS46fk+{BTP3YWxIyOKrjsI6|RAMLI2km zIQ&h9`W^8w_(x>c|EZ$4Fw~yWM<}+;@7?4Rju!yd0cX}d3XxjCXH$m%7HBtmdV9Tk z#FJ4=60SP%d&C=(xbGetPH{kS^EeX0KYjkIb8cOlE6_v7p$Op1wJSrY)I?~-n0CO! z-ZfS?w_Y{{xTya`%EIiS#y4V={=ZXGf?Z_E$Gr zaj9EQA$7CgabvS%#_cJ&^v7`d9rr7Q+}OTR8|QZ4Snl%F2J9_<%UY_$?%1%e_Ey({ zWd=qf)?e~DYv;SRcw%ZEHtE|3HHFr3O$svuR&j%JGdq@ZWF4CwQZ&Q{n4)H~@}pVj zYe*#pFrPZGb9ibK^*1YKSzP}&fl^msSEx~YnwGTs!qL6426VU!~mFQHj) z(5!3~-gTMsadK{{z%dhh%q-i$vF247dK=6vy~;NZOHJgg(4LOkk)Jzh-QSFlY_rqw zi`FXSz|k^A33|P1c;C;OdPSS5Oot?!N*oD)u@NJ5CM{4tcw+x&$64%)pe=VPjAs`t zJP@BS%(YJFY@mqUk>R8vLSr+uJ9&5>_-DLIEYdK!Z9>}Y%-Oc`9Tx$6PgHFM>Z`s} z46myC_bTk0Dc4gNOV1EtU2DAr<1$)}Hq^Nf_P=mnN}Au@e}6G^yb;^zs4wA})e;U~ z0%Y3Vb$sikTD|973SnXS(W(L6X7SjeQe1L7lN}g`+HEp#mB#CqU1MTVy4#`HJ;Up` zp=fcRA3!Ix;p%&A5bZ|O=SRAg`YmhcCfB{Rw%)d%&V``V3ibagTY`e$y???HbZH>7 zKhVy{~etrcwR`posU2U_WDX5u#e{tOJs-O5*nT zWn0PoptBXDR&W$6a=}xitxK0>tj=;?rZLmAK)Uyb0IF-es*>~PLAoPTQ|){|I>Nf3 z>~zg$&J^QaTRmnYgUWlCY?xv?n?ms~ylze8ooHRcr|q}-KQ9kUS)?AJJ!rQn^N?y% z{W)#0GKM=rM^@-7L(Vi$_BnZY z=Z;ra0=Rmg$jcuL$D?glYwnlIMQT+EQ+}AaG;d9m$};cQ!m!f|lgenD)S7-7scjtb zAk*$R9&hc=i*?D_@2Dc5Q9TThCc+z zT6@4;J2|boTM$0Ff2$9kEgGcjLs`>%_82!@I4Wu(3G8B7&g@R)VfMOC>cC_-RrY{i zxwI8c@#{rd!I2VeFtai4tk4rK>C7r}x3Z;KTRyYFW$|tOa$cXV_S|p7n3HM9VVv1D zJgtM&*kQsF=Rf|Q*y9wISgd%rw1rl$Dy-^169 zS)PhU%VS9n2k+y%7Z`lO#O=9r=HJH5__v|9vlFu?b>HNl`lFB7KhgOu???3&&l|Rh z%TqmXjmP_y#4M}@JV|BM+q&AT>-nvJy86NYg4xYh#vHjgQiL1Ayw=td`kO~-48O^j zh=6CmDuC#j7$TZlHIan=f3IA;P60UzJQXq8BBswc1<> zle<@~w2*^N{eh3DnVT2^2WBG&KJzq>#;RB30SE6f<68=GCK)d@`A-tBZ*B^kYZoT3 z=jWd@=WX)r0&SBR>h5T}w8p52bJ(QT7|g@w4?hEG|a41^aO}7U|@PvkSoTz}MKc&5cnv{XrsTa&*9W!bz; z3Jg-Lf@HP|a#`W4+Bijw5Kc;o*sQrQSYn24$0xubzP z2J*sCl1S13iQ(t$LwhaXZ%NmS`>_!>UF#H)Lij(JV z5Wc;#gUJh#L4Q{amssA>;DuNj>IOcbl(anAh96PzUAaMNIK|nVv8X!k^UEHBZ@0ASa zSlqF-!WO~V1;maDM8Vp_NeTeHcqH2ZUM!N^uqSnZPV~YJ;5u-Q3~&i&PaxR^?8Gg+ zhV>$tO?fS#!PX!9ZqqC5$^%MCx1nAt^Luig4tNS6)@!NzW$OK3;IcLTzU`#;j+sUM zv)%7F$A21qH-9c@M|RoLQHaWfC-W7&mztPPg~ z?KNhi9{oKLBa5Z6pH;Oy>S$?LpVU)FQ=&W!!{7?c`=pALB6Pz^>*wd_YW3 zco?JfP}+$%TG3l={o^7?#%ldDDx#hnWfK(*@hD^baMVvm7~gV!W^BplMr_F+smrab zk2UsH|BTpOWY`_>*f-a;K08p?czj!b*O1nyX+|X*HV5!zp-;U{sa)9mAarKe*sV0S zH9^PT^R3(0Oi)**x4!p1QyiHcnUQav^Ca5QxgGLrm>z!Z)Z8S^ykJtJy1W z#w+WxTT?F2Xy~DZi2UcJ4k@|up(3sB;%3jK36!oGEv$A|si`U5ta2na-d@$Y#@^;56}f#9?wiIY_V~m*NC@=Cer;KQ6&bV~W7hs`A7{ ze+LBl^CEUkgf(QC9kfWs=-JoRucvh}&VPkEyqA1sQLanj5LGAYr2a5#_{C1Q6RgCH zeh$D;3wxqdf1uoCEqp`Cm!Vl$?(5}|nU|r+OTV0#L#b2$< zwgqjiWy^ndTmTzbTl$I)gSrgtqeHr>zeUQ|a#bYve@Cqc)L*Xz$4wsPqOS7_wD4N6 zpXC^dUUf}4&mg$p@8LH(RTcMi__PG9d=FgF$?;5$;(|5M@5Z$E|XV1ik4 z?0t}jb=GI|?Q77F?>`6SHzby9VHoGn68hK^vtXxeMBeF+^e}RZ)*pz+>Dr=OH(P`b zmbp^X0vj4OJ9&2CB!45C@Rbh8lkYP?2&D@H1a*~|oI@O|WY1*Obf18-s{=h@z zo=MIr8(Vx&@jru*Of&lN3oCNld}|D@>n2u_u)G0w%N#=r66-poY9eUrm;$`|h+&|KrY=BQ|1iH$ah~KhvR;?tHL~_d z=&-q>ZQpi^RG5<-K&QEjz(u)bKVGlM!t%d%HEmFdQbHR_TI8WgMW{+ji4@t zWc%dTUg>uJk4b?G0$Tb4Pc_+r6wC`(K$Le{%2vUvP2bh>2sN0Nm}d#)X(pu zn=KWbb1m2smh+VodnoNz{Nc*xNv_B8K`%-h7N@v-Bc1Rdof!GJ0-OyW1#sEEojEwNs*pmYRUF8=2LnqXPbccbdud!$SRBD$ zcm?uDhGYeBIJR+Vts7Dvb^FD*VY{UTckx#^IkBR1=%Sa#T=ugb>)#Y&SZow>_f93` z8Bfh{e|goJR(_De)phGyb6ft=x_2E~ie(&fJrVIYZwH`GtA!k)eW^RPD{uOn^WC;* zDT+qKw%G`s&%Zj~vAc%-IE$p`f(SMfdOckh>+>rcVw;aRD2p36MS;{q|KkbNCx_jC zI%Tc*hpOoV8Ht5$dX=J8*~qv*Fp~ABOnE*=76Q}zta^lx2L`>6?DgvnzVi?3r|%xN zhJPHpYafJ4o{XULag2 z+^=a`>n`b7yHpgq_^&urS5oqebg2lQz&adzo9W+8%?=IE69IZwRgtppO~OV7rMx?wviD=KJzrITb@3K zWLeG|Jm2_8B^w5>UW(V1Y6yEGU5nA2obAi>`K=PXf1TPtB`z2+>f+g8ZkHd$^n0~* zP}kkP?XNMxs2)iL$EHR=<{Sqgr4GemVA0Vb{pg7}rG1VKaFhx2V@5L(s`O65{V-|{ z_<09CAZ17P8iPAYLSCTyBNeU6K*nwAH5PG_v_`oGwZm%re);8U0F?WKu0yzGD@>U- ze2q8%5scT(&DdfTd)E^6$Jyfhbj9zvxbnVV$`0icna=7io`tdBY?chTiIaWsGg0BA z@5`lQf!_DGCQ0jOlKXi6=~n*W=+LD-R$c%4kTK6^geY$0zgl0z5fSLg!z$52%OUhw=A)5Zg^JU7)R;Vc(nQJ5Snk(=F8>^-Qr!uO;#d7k7 z*sb;V>cZJB)GoFzhAyNY*f9Q6f30!nS{dE?eYu~1_-@x8_UP~%FkK9D(=)8>Ek}LHjwN8h*_%>8HqGW^mBA$^r&sLdd)P^Ez%KV*4Jg$eL48` zq`X9)(w41b=|mGF(j26=`&Tv>lt3F5g=mEPpT~jW9xN~s>Gke;LXe~OJXJXni@^Hv z7W33`con8Jik0Rr5Evlsx)m|1V-uSLO|Cs+YD_Aqti&97J@0~lk4ErDv|0PlRK}os zy{<06NOy_+aTJ&9-7Y#)~%arl?if2gX|G+PDJ4{T1PDY>}0qLuITTx z38I{VdN3c)ldh`DyS5li=S2S2v?G8HeySblR`M)OgbFIgG~>prOaJux|>wYIHAJwtEg*=Yw8yfl$!`NMbT zrE`-Lg5`Ysb`JmAomy?Vg)nT}2wH=eJ?cdqTQ;6}ZD`^Ec7)wOJFDdjm`Ms=NXoR46Fu6(P(sKWn9 zI`%$Zzo@xp@eV|@N-1o3{HC6P+c%draaJx<9*vR3Nyd#m{(epQ07YpIzd?U&`l`~% zB_?esWyDZJ`DKOEsm6CW$8url+pt=Okrc~_g|o&6=~$dwnf5)y;{*|nht01hBhh9C zeS}!j@25D*2liErJ70N^CBIBevubZmEvd|Py3-PpZB5ocH%7yOiuog7~jBsq+F7?@#eAb0=-WhSi)SOr5t3v=SqmgldXUa(Ht8_-)?%(YDe@DAh2zrP)BA`pJR> zjp>Ob-okYE*d)W)w6oGZYhr|mbY5&l0jrlGNa8VPTZ4>8##6;RgRI|rmPGWSL6Uco zBvIBu5UU8$L+rs(J?gAM-<+rJtMe%g*8uD1IW3NB8kFKx3;atyeY7d|z#x>*hxyYy z?-F8AP^W?63ECHdc`Dp88G89>)!c4q+&m%@^d*JKV#a31a>n{Bi~k6P-Z>rnz-9)u zVkTr~6HfC}A)(}dp*R2+gbK_;Hh?MeoG!ox-kwBq1Ne+Dxs7ll0-yt)A)Yvf)&ftA zLTh190zzE@C-R}asB>z7Ewm3z-$KC}3qFDCz|5n3EW$ky_xidSJtG2GN5&e9JAw1Z z&ZFcg#yybpxs6EfI4m}ltC0XII$Tenm=Q1NGiBs$QO7E}MvfkF|+kbth^d95)@xDMu z+v zp?&nj_v}7~m0BYoc2Gh+o!>QR(>mFN_z*ZaNF6n`edBsH9vdN%FN1iNJd_!}_HzUfp z#`<5s42>hpvJ2CG{nuV9ykYX|w}}>?W7RXk&r!VCuD&?`UQlfuM^&vI*k`PRB_ zI!LZVb&tWtyXrM>ISC?1B%nelQb~j$=Qu@%9o;2w;<*IN{dBuL1<5K;qrX-~x^vFk}uHH;bQ(NXX0 zQPoN0o`4beVk@vB6?h4fnKvTs$F{dpDBWlew62*_hH6RvqO`;dI8!FNqhtQs24VC> z%{h@;{Vn8ko_mo7~=)lae#KUryGLjlQ-rR6RN7U;j%vxH4Dm zg`sqIA^^@Gf~AM(l2}MVQKc|PnPzo>YO^fd!DgE44R;H6iZx>tqe?_y#I~;wAnf=2 z&>QfjdcF28kMz$r?Z4WcIdCO9TS*RZyepRY!|(*XR|-)oIM82IN+^LszFVK9+MK2y z(7r%Xr0eP_xTB+JYF~l}B&_31 zdJS9LsWVf4@YYsz6JtE)YDuo(wl9&&g87|hz<8YpJNMY`D+SAEvmo>;l4^{`{Sxu^yq0LOmqp6v^3nwj?Q11 z`&Kh1k#ZueRsc(ughC28njAsiz{7%-$afOvlO3GBbK`25ycHAy_JPX*3tiHa0&E%S zKN}{!&@eHT@g?h#uLj&=;`|?+rcxA1{FgCz3woKO`t^^kaHLR>YQX`+M;9s=9N66} zkr!#)dOp+k6>8iv&XUWrHc>Q0gA@N84l_-eSXs7KMP1p<5MrMGw2!_oHAA~t-Nn=- z>=RG+e6dbX-X|OQ8h7aYeb_nVj_ylKAVf`;2@+Sho#zwx8Hw-T8V5YrN#!B&OKivQ z`%Tii^?Us(k$1cKIHbfkbJ8n?cZiCXqK0Roqk~k#pAr2@)NdY?3fU@790x`!ycUXW z-|gq*#Y5C&0vxeBHI1aYePZMKz*_ZR1zGR7r}S{&iJ5p{ z?*24=8?MCUrqSHrtLj<*V*IU9yug#W-(Xd023XOXHl|aQ+~ndSAWrx&8abuYd39%c zMQ=?{z?aFYnLsp4#~6+N6IXg-Hz*ZG{@20`0%6N%4cLPKXPXa$H){-BfgSDgdxEm# zFX8aZ;5^9X$~Nz$d4&1FQ#Yc9W_f`?r+GQz0Y~t^NL3Q+vMD}&lor3!*$<`r^`z5q zJ(QSK*F{19F98X#YRNyejECw5l*fAu(^>X~JP9hDIk*JrY&a~|V}hWGveDSWQ_fc6 zmM^O%q;J8Ji^?fP^Rx2?mVB$=Z_tl5Mz;&Zusyil@PxVB0b;ny^~$>WabEnmfKo+Z zG$?3PzDX#)4sy(f94zf{1hur3SVIelLMus#_X|dE3CdZ9Ut?tnYWTV(y^6>PjBDe= zkJjhn=MgJ0FTJPu2Fqvh{-|Qd`#D0qWogdbfRimZ971ADjoY;0i^JxtT{sZ_Z=QWT zsfbF|-UcaHLaPlas|U2bo`T4+Y)lFDWF#sxN~_F`&Q)XSNr$A8Nc=yv62z5N)NmQ? zs1Cp9!0aYVhl-LX-ael={VmZ9*<9IYPKwBB<>^YX6(>s%&(TF%8-9RFG>MG1i8S$S zPlbHwMo!$_KY-dIpb`0npoEJO-;0F1RnnEo2h)d7r{^!V&-7{UKhpFFHkg`Mj3*bL zneA$lUn&~K<2T~6ercvhSf4Fk&9Ivr|7;tPc3b3Cx%qA7V-Oej;p=Gj>!A3ihsGzj zYVN;aRZhBbIBnYsMR6sDltx)gG{%&@y$;yeQdau!4kG+a3$HPp%Ln6ksVGB`=mQI* z*it`vgcPKBHs;1v0mq*F?S);8z;(G%b0%)=M`%91DZ@O}SFx**ylBVT~p&W{CDu_w43IJQ3&~NiF&7V3>2>TQHi{s{X zPlTKE5?~%aNSg&8v`v|NJTk=Z1Nfr2vm^YQiV857g5NoY^>>_ZYP?wMNhD$)cQbAR zAw0swf?)?Km8H3?^xj^gbJAZAf;^a>h&qxJkbIJR4v0PsYja2m9q(qSg$!EiOcuH? z4t(KX^Fy}@z=$yKn*9{W5NqHy0T>9R_ylHvdDrPLK!$h%K~y^&@ULm1efZ#QxL4l< z&&bYWY9KBU6Bpcv1n~o65`d9_iJ#olL)Bo?;d9w`aN(+v{F*~Yks!3dMBIAAejylg zj-6EaT$UYCpa#BsQRq+PcG>$`?$1b36 zO({QA;76T)C|5lsm}zjui;{WV&e|dnxw*ztsij4H7nNX|S1Fr}sd5;rkA-f@e{bf8 zR}@a*>{$*O&yQ7+ND}2{{>2rN7w7JjqqP{8Sph%Bg;+86Xj%W!JODfy0n-`u!am}| z3!ICQLQMhBp6i#~WO7dLqd=jV7hT@l_SY*Z%;KJtzWKWo^yece4n;IxZrslut!^xi z5%nPahk0Kpeh^VF!iQ(t@Z-M1%^!&2hw*qp?;G+sy-;cBr(|U-hIkuv2fE|AM=0j_ z(m_CD-UTgYDwOtROyz*gV{XTcG2lDxetmfXU$oH0k-JzliQwkgE?-m0IY=p8s7avYBsZrM`|{{n<(_Ek5RV=W*{}2 z-qjF#C5m2ghj?PV2zI9rnY*{A4Y`n-jqd&2}-yZI6awr zB|D=!lm4^=s{j;t|6dDVG=OFgpLYJ=u!gZ(2ke5a7Xfym)^`EB5bFbh8$bgIi$0+9 zvF{o*gQyva#~#~uj(Vz4E>kLwGaTO%fo<@^m*oF%!C&N6H((cL{R=PI#Esg>gNvUIivb$N8>H3a0oSo-MoHrYvDEA^~q%Bx-D)AM^it7 zC64Cvvgjr5>Q`Pz!pO8~?J00XwMsLgqYu!Y$OrPL7pVN>%hOD4F(l8FF1hDFI!DtX z6dGTjtQn<_Ce$CNSUx^!4BPLBDRBvc& z8V6hgRTy#&Jh-sqFQM-M5rwBTc{dbZcm%3EnROu}XEg@0|DY7ccM|IB${T_1$uf<7XzkQLH1ny5J3OOg?oS!Bdu=c8i@luWko`yN@aS?W zYw_r0pY#-vc@@y6Ouw9GFp+>ABxEDr9aoh2K}|)XCLGp?9eX(0I^l zKAHV%!GU2M3G`?8PnvPZN}YA;A`dTwGg*lbX}YZw&|KAtwJ51ZKiz6n#=g&o_t9v^ zevO~V2QNFJ;A2x9CRpEwmPn&KRcOJ-CRseg=a0>E=}IY7+HhEYU5TJ0$wa9&Wn+x} z_LF~DcR{I8A`RW@@#8cLOO3nN^B}*u{@nFn9RqKeEK+p0+fHK?f<*d1#lR&#wK6rn zrO3F5)N};lZg}m{6zvjVvw-RDxihjeV$WQVzE@s(wQtyP^G{lY6 z2dIHHWNh%b5kWO!2^j022@VcZp4!EOo+PMVQ{7Fc%Nr77oucQd8<~$k()ebkE_{&9dask0OL9#40^|NfL*3a((Od8x_op)t-T^wG ze$R)}+0~SsI-bHP244G>v%D3E3$~V?@;DzhcUNu-MU$!UbB^Wf^!m^`k)H9E>9e;4 zmP~V8;0P95B%9GoOhmm6`-YT(|T~*t6MS7m?KQ!p)a#>jswdbyRhg@I2 zbi8;)tK|8wg#ZKp)9S zdRYF~M|8na4aZ@SqV2_Ad`S65XU>#?S23Bet&C{=1f`PhUK)auI`$F*tRKsXP>&lO zi6fkQelCx>=L4UQjEZ0E%7)dC8Edj|KC zW;cp{KN?rb6}Fjc_>mT)rX|qoriCh*hm=#RxmiuBrxdwOn3Erry&krs_)Dth*iOXn zDHc%eDFWbo;>AZsce(s<*auPF+05cMZUTak--UYNuloaU#9#5n6j){jN!9;~sE% zrL|Smnk$fa)X`d=2rLk=*(x+8d(ojjXLrdqzP`FB=iMZ`jcP1+S`&zZVQcQ15S9}e zI7NTj40*d7t9Gzy;bqNAP^!{Vxu3wL$}6VZXxvmO$kAN3?=N3K)V^tP&dt@}SF|>0 z9M@4A*F{8L=LmM)R#zdtx@`_Lrr*J~VMV`*Z2Enk8enel4>GG4-aAuUy=jo-Te2b( z_>zwNuJere@J>PRl3qG}^3tBJDoT3Eb2z_$Zal5Z=^*CdnJ+3glcV~=$fBJ!XV)cS z?+02Z-7fH%S6Dc1knPenYqrT_NsLE8$#|^3G#+|Yvrns;&y`Owwe+k^DCbFE`1RB> zn-E`9Lvy+Ti_hGf&57Slkn=nvDwSQWt0_*SkG^wKMdW_%_h%R*T!& zVCw~GmN`^1rVaF8Ppp!pJ(j|XJmM5Fp_rG&s zD1TXyNog*afuer?P`1pt=S7)cgVNcvbmCshgQTwu`}Vo~=v#M}7CgsTdSW^LECa66 z$OkcZ8Ez6=nMe}p8OE^heO5@(@5eaKZ+*0Bw) zbp=iWUhFchQXO^{mutWNAKJbuIF289bIma)W+#R?X7Gc&B?*fBFRGjq($ z%xouScFer<->a*-r+c`Ut6J5pW*#)seCn23-Teu%%>TXkE&w$&l@=CFd|`U(N>4Hd zk7Px-b8Od5Y<#-=wJ9&h;Hx4Y^?9tRTPL{W(E-Ly4UaxlGQFn7tmQl!!HRCH&BeBg zp-%xp>Axxa(2W&Z$MAxzYI%;$zsM;m9a|6IX+ElStr^-bEevQ0uH_CR`MG1!Mj+Nz zRd(p=cIBTdB_M&vH0THaC>T3F{4o2G+jyTOou~0r8U;x;7~Ge%`ZcS#LCE^p@~%7m zTdO%%W;mk%UBI(0AL^ya>y{N-^4w_VH&|0o&wcdx4?b6t+hxY~Ka542JycR7sb-VA zjJOFEWHLjJ^X+X|h#HI}dEdLI8&94i)8BaE?83!uXLznyvc2+}lZUgX=h5NQ>DZ4r zO6*pg&CM%!wo+~p6IIwLTE@TSET3HdJM0`{4f|E)`RZz5=_!io^y=O1*hv3#$VNtO ziDsuHBF?A+52O!?XugN}i>Div>am zEJxNm3$|>XziMg+C3~OmVhk`v3WaOHUL(JeUkXz6%nkNl?MY6hKWr?GT=KCtQOm&0yQgMYJ!k5ZQ^$9zk*m`FI3B}MUhw4IS9;F87T%7~D zY8ocy5|}m8`WZi~K>y-_;&lzi$_h`dCAy30;|@)$u*xyzt@DPX zJ6lV&4O^m#W4oym9oHPApWMyuf@gZ1Ick;JoGTTQ9jeW1soW`R_SkCGc}v}#yd0CZ z^9hX_Jo=|Mh@p%}-6p&FS<3|#>nAo94ee=j3Yw~7#My{Ul@;|X8-F1~SGaLH@38cY zE)j_VKCJ1bxlM}(=8at8&YBHBdhj%*BBfj#>t|kSbEVIHtZrE?&Kd``HJgc^fcFq8 zj(}eumnvjdWf8Q_>dKki{dh8iPGF*@m+7~R8Y`olnh@I6&2*GX=`CZah;2>TI-=KI zif!EI7xd(AfBLA?+B)%SR7_Y_#t4R)awvt5E?_LRTV!LFyDEmIp+kFTUXn%g0cKZC)s z4kh3yUZ2vt8Py`hni(7EnlkGKzKfbkD+pfE%5v{Ky7nznV&q8^%Igt^q*R4rHuBca zTc0eQ$aAWSO7YKlwa%N`A}|Km&s}+zpRmlFdas&1TC|j90AgH1&AaW5hxfowW#AfZ z@Led;>4%%$9r#?@J@At$laY6z0yn4QQ_Iws7z1cFVCW>^8@7C|xz_Hs^h>#dR*|4p zP3UC!P6{|0?*SXfq=m8DWABYfjWyN&nknJhy`6W3ob`5MEC#6zZL6~$Cg6~7JipV3 z%7>D|341sDWN4kQg_@IO=jCXf-wbP{H7*}lGIXSW#X^qI6h&ni-qF93`QMSg=E>*6 zuoorkzC8iQen5|%UrH@O?m;EA`3&gWIQXSFLaUk3s>USbN~Gy*v=#961KcF&c5C~- ztq$;Mky@6e`YuE*zPB4>h<8+!^38a^f5TKJi46m=Tm7enn+o3Jr>OgNGXdF9Ktatd)!l~F2>nRd8-{v|L# z8;`}G4dL-Xdp~w|m@p?9hO;VQn3+jbDvl-51=l#%xbl2HBYL1(3i~hOVd^*a>QsP5 zv!)lHwGEjk_eT@S!`%tCL?NDQ<$5ZKmh39uPq8mC(PL7633}Ce$y}v=WDdSzx3V-BrQCh2urG8sZ_}Ha#$KU z6jk43R_!J%sQW~gvtWy>a=BV`3?FBZ*7Opc& z?3X!Wb2wzq+_zE|vdt_Nr`z41$+r-Ckpw}0JWL?IUuLR3uf303vG`BjuUoHMe0*GI ziuiwL04n@i3L+N@VJHvE&Y2(XQ$NY!3^0I|g4m6jtXovIzg66ZRX(8_ZTcmyp42O5-_}y&`4jY2 zR57JU^`nB-EM6nS%tq9S{eo*veMmA_-X8q1MTH(4o-P}IUo|iyh|_u^Xi!bznK)K7 zUeu*O9wrnWIz}uFg(=^g#~Vf=z*B%BG7ZUJb!qv`SB{^7Dnn{-r1|EzUkTMgaAW5e z_nyyf2L2duPGdgC5rku3_2s1pp3F?#3Fqpf{^^d*{|r5}&{emQqIF;$&t+n(-03#4 zvyfYODXE;_$eZ}R@y(lXqG5ilJmb0&%Z*T(o^#2RZACWYbEIU`Y8Ss0U%KDLzP73@ zMJ|(Vei=|pF`9Tx^5*PNdr)H57(y_1`W&Ct$g(S^OX|O)vZxjnHPATs=IJApGG@)oMvTCW#YoHvYw`<}gz(9`E}j!V1KDs7qKS zMI|0fZ5=Qq9|cRs?qU||d8O&9I)(gd8Q5HhrDvBVJv=SMpd!osl*8B-o-6e+go}xQUght#WPORsMv|@#KQqtk$CUMD#$80A z7{)0%do3;EDZY)e8e7kLm}5*zNyT07&8k1-M3FthJf? zIp%?4XDMf&xrzE&?m{L9?;f~^_eObVgv{RbM^xA3nJo0tHx|#TOwQx#>efdnEVWWn z(x)S>>dgwf*wVGO!@9VpI($9QnxooQH2J!OcP`~{@j7=XdPCDi+KjUiyXn1OVgjW) zj00iS5RF&)7^eWM5}`*hy1j zZ_|7^`l#SaGFNtnJ@x{iu0VkB2MTvB?4p5FYT{+@u6%(pE@;0~phG})3P^dqgHgZ) zm;Dht>F$5z>4>-uG)$+iCJUd}Ix7sPe!y*S1+leCcg@J+^az}c+O%4Sc$gwKCC8Ds z2D8vp+O%ras)mvQJG&H;(jWjoCB7g?|PQ$ODb;f^7#YyiC%UpEd&m)1hlUj zE|0)bINKXFP*bH42F`kG{{3bSFqd)r7W=pVwW#UT6EdO|??U(T78_HrU&IfXmi>Ds zt>(=J{?jRniVy^TrpAkTK%`>&;@%+m-S2?^h0JN4-aFEI;vyN|pV0Nhw|Hp3sszSX z+*Sa2{RDMu4q*hhjM`>m8h(wmmOU#pu>G0*pe78 zd%Eq>NqRBdx~=^!)CA=2uK;fX5SGi35hwL$|KID=9_k0Te-Cp`RY(Wgy1e~<^K>hZ z!KZO(r$fgd!;$_rykzljbq9H@mCLyYqc*>}oQ9bMTRBej@OEKDXKkR0L?J7!O46g% z*E9az3m|)t8vYu&K$&tqXgwY?WOm64Z!7Rp82OF>Napt!|6^*Hog?We8QKbx+Ms3;o02p+4w(EN8c*PJ9JB=BU109jTY(8; zC0+--7}iOLP3IsiB#{rH*ILt7N;hJ2P-c4(2*x`WI7@S-fw7G&*H!bZ_{W!c8x68R0J}ZGe&WJS>dcHJ?hw~IW@tvTZF-V?AQvw-uW>*VR?hKr^W*9 zcs)xpUe$v7)yZtyxeu>sZEZ|SX@B_z4a1N_IdE0lBI4A%RIn4o+3W74r8i3i*`^Fq zy6**3Z%#k3_$I?)Dc7ek^&DI@eqjBD!CV=d9pTEzVv>+dGxpPCd-uAO=X#%|N^F$L zIEf_D%OXn4%pL~2LS`Xr_sr_)S&G)5hDnVwhdN`IZZ=J}f%1dqFz+7K30vG-Nb1+w zy_>5w(#yTH@1si!f)Z-utm(?&H23DeM9-QGME4=K_uqG@x^oM`Pofax;b!bdX3ZF^ zz8e3iRQHQKs{&b#U?EAO$DWzJS6?%2IR7o<=>=T0`ro|{dcFC_;Pgf$J!0-2Ne&_I z#f1s)pJc<$NU8OeNyz_^?4(uVA64A_a{vqN-Rupcmmh_U^fR#iSq~wVsH_sNn;H5O zag*5qfuZ6aZ0D7D?-{HGz#qX@9#Hu@5xE9ir=DvrWFF#aVJpz83u>vbhq0oyK<(Ag z$9t<{loTzthgns=!wam4)Jt}w^!Tprf!bS=r3*TBGMLXW8PrwTsuE*$iBrj>~i5@O|WAR`S$S<2b4An>BA2pcGrpZfGH{c#t5bfnnDuV{@YaYuM|peFoRmm(Z&Vq9esB8v zgb=uO*Uh2E!Sfl-Hw4}XC|*Q#!O<04nqE>v;2FMqM3S;$cq6_J8=bg!ImGt+G>!dF zz0)q==DDXofOPL-#2dFZMVTq9zvbM@!FCwgRy2|u#PPtP zz9kL!fz-%ui{Ftu1pT?=msZI)+N5I>pEnq$$ro2(SZ{CjPHP_T4_pp{hP7TYK8!v6UMa0$bb);uWfu*5@Mo$Bg z>2+NDq-HoHC3=vI5yw!Rk!O~dIwHpAP|Nj#W4@&05q~JPU(6Q`d3un* z`xdmYmoe(KcrA>?VJJ@-Vs*7*3plnD?Cn&?UiVbgDI5y64)^FzJsIjpU0*E^J@qsZ zASYYAwc^;nRn~-R%uh)-u(nmCz4y4Ul3AJmXTmV`bhT(Sz*-XSSjBx6Bu!1 zsZpdL(NxQ39xzup9xyZPzB-w%fJ;-mayu%w741ywI^Lg!hFiev6~HP;>Ft@x>pJFe ziSkqWi^MV?Ry-~}X~&Mm#!3F4DHj&olBCJ7F@;4|C&W;MU;O*V=trG?Fu`&E)z%Gb zfvne6M(szXap|s+JKuw4lIXz_@5ZK+isz8g{=45|9xwg4+uKYvwq=>9q`w>DYNvdwnEP0<~aoVfKCxc zF=qt>UqGiwR-inPut*>x%sS@BFsmXFadLE%T&s_-;y+iZKMxAdeSHW=tXEj0u@k*`igk4x!lYor9+6+Nm>_|RPA@ra40Wl*%t(^e{m&+XnTj(E z?yrsOdssYTzp8HI6umP=)x5*O_ovgrm&uh=j@chts_1`g)rCIE6^GDCnGBU;pAFtl zIemE_=H0Qg(cQMNz~EN3E`LF`Ot|gYd2%}fW4GFN`>nkQ$Uo>@jCF^NF>coz70JG7r@q_Zt(CjP#dnqGAA^fJhIJ` zF=7+sF>esq4T?j`tBEWOgZ^&aah$iG0ewl6l40q|#n0jCP_6b$MxpmH|z!17jL-z{;#pJma3{4>UweELx(2i zA{r^?&-*r<)Y%ok#ry=7`+U*id7cnzf3OXNIS>A$FDEd&n5m<444@KANOSN|+J$2C zb8Km~#jRpyn-2Fsy)5#%gHcy!ifaA`{-K1sKeuWsyksQOS`!~iS8-ye&Xd?F{e*j3 zMq>>oZuXs8-Dtkx2*xS?y$4fYqx=Bx^lLnOx1$m`E)@A*R5*g}J_v)EBr3revm2l; zxY-UB@mj<%#8I@_&w+HH3ivXVylBuGr~yt5Jr3?GwQwfL1x5|-JEL$WOa+`3s_;G3 zGrbHZ&mP19+eDm46_^3z0=M{0;_xRlK$;x}>dI~lYRAhvgK7Vi#|P7nn%4p2gOle7 zdj~J91bfFAm;-xk9oP*wYY2O%ADFQFvU7xdqj1Ly;qIw9Xb7&3azaIECNp8{P<42E zK8EEI;=tGa^9>vOMV^no$%auY@6cfcCD~H(G&R(2VqC->H4+x{JvuzvI$bL$NZ!sb zS_W>sNWsS1ETeK?!@*9zqD9dE=fR73a!A=nijU!$!MGoS;K0UX1XB+*%XALe8DaL& zNF&FCQqu+}Dqecmdu9e)Lu^?GW0^w$e-G^NEiU>A`5OM3p#=tlq#x0eFF+GG0>|~~ zF+X!|WzKU}<_^{E7rSZoj+lYO@EH6v!!zQuZbV5&ne!>kDbK0hoA&{gZAdy!RVrxZ z!gzp#)Q&~Fl1(PxDDM7QjN?iU^%sv}Ts03uVw!Tx;ek7qtvY8p{qdJd9^{1=0ppfK zO0DJ|zVEjMRaz`WHQvV2V>V+&OZXoZXYGze)dDEY-XPAim?^)D~s@IkGRF#a$eU47O=w6caf^q)@R!3aAjgJJ9 zscgF_%7tdhaWEcvu99c>8b!PRJKFl9usrOx-uuz0?rnHNUZa$v(UN8Gjy-j!bIfe3 zSbCUL5cBMlbn;HV#)3YHX5|SYM^A-DW3iuhwFPRKw`jG6?Q`mqO-oRQXT_2oJrJQY z#rgfVMkDba#XSC#5-A(|Dj(jV&$F~2gFKj;JoLoZuxU-Vg^nd)rYPaWRk zvL&O6Nrv_(HvTj29 z5*zNqgGu08 zQ;c-oFOaIGtrGshlU|-`tfL`o&fQx&QPpAYTF@S4g(cCqHmQ&RGw;U!nPXNfPu?1* zGCG!3Zz6*BAfA?%nArHo>JmJwHUAGaT)a`UIoR|`%8%F2LSo;k+$4L{+t&4=XW>i% zFkg0HP6yW9!~J6a4k)5uZ;>lrZ{2o|>IM&WkNZ-^a96m#0zqIS&@ zr;@7~l_Ob(6dp2Y^e^~Xj3S`O{M!*zv)lj3`QGVP#6#gID0l-U^=m&EnQU-Kaw ziVoD^OIlUQVO`ied?M-lz7xkmfkrXyi8^Uv+)JCRigy!+ee~PR0|)0yds}@9P4yQC zvBF}plmxE7w(;u#Sq;9N2bE2f2&kEk+%Ctye3YV!cTj%SMW%Zm0`Q7-M|Ot_MY%F+ zQnVCzd2P2<$xI4yA)dZt;sm6R8j>Pxf2O-aJ~-=3w~~I;wD@nskS%2EV)*0Cg7+Y~ z{KHW~Y=?khG|@Mg)`{RIj@r2OjVQ9BBb2-R>bBs;?UY(c46^3d@--k~O$hgFM>;ir zvNU_x*doi}KMXciw@N6gp#bNL8kFzI1Lkys-afojL!PP(ui?U}0;=1ScTVj?>of$4 z*$xYbwQ@++wr&*uD1A!krG||T!`cWL!wdkr>+S9Wd>Bl^5U0y*#L`!Urv76n6zor! z39pf5FCm_~&-%mMBop~%$gQ0+mxvXWvQZD8JfiAHQnw5zB=`53>M&pn_ABRz7_$K% z*SO;)zSCcfkqnq6t|xX8Ci+9wuivAuxNpOwaRa8U(u0WnL%_vYfGRXdKs=7LfNhW` za^$}o+#aU6Z`^oZxIKnW42za{$zLqI<8;k4lq*1Nn-w+DsZ0n#$$N&fzY#7*S_K)b zgl1ocyv5ji8b=SAr;lua-OhGUiY9f&0_XRE-$roAx0Bd&>7&hAA{jHFt)2BC-7aoY zV$F1C#YRSY8q{fdT$Oa6!w~=)+D9F>Lymt_K%5N#j@C>Th3#AzmQCB!C_j)L>0 zZP*S_>ufAWMz2oE-PM9}%9O}^#Us|U1-E34SENk4eZoTK^-0X2so#kvk z@9JD^5L2CD$mD+_Jv)faM#a3Le!3^oGEH{rf4CXxb2fMrns5^Qb?@a%n7ftSG1;AG zsKw{7L!m#ILpKnG@$lO9W=+v=Z<9rJrl|c1oR^AhF1uKfL_lDYt_(55n)xndyF+8o zPSY1G+V`X{TZ<#N zIz5dJ-T{rCjI;J?mOdoh!eKwB`Vf)SsE}YioJ?d|OfxAc8Yr+STdJfR_TomwTMkzH zQi!w_v$$A4Zac1K&oXVO$dYxEh1}4f>Z9Pmnzu5<{=*=HPr3YC=Y~0<((ZX^V{s|O zcJs4$zr_6O$YUdr4*UoBzdz>ss;YJmzk-Vh?g0FA-Um4c@<)!I``0R$(0`zkACR2% zt;AfReXLHWQOZ^SQA)4tIJtlGWT}5JL-m4EF&p2(?bK7HG6a|k{fi3}QK?kMe(cD5 zr7~%V`~bi<@Rt5c|LXZ4Af;*XQ%$>fQrOYhCIAB6uSA`5G8xoL+1Whg|EJqX9NHZV z2}skuSIwl?7)KH!9HPJs$)HzD9q2NUmc4%*kdj+MnAB5vZqq)PGg48*z{Pwm{81+) z8vDtio;4`>_v#0xpP#B|n$i7Rq}9Dz;qA~;PmxbgPMLfr|GCN;f`Ssd|FFNn=BWWe zk3fZK8gF+RUxI-9xqF#hMo3S(aEfk`A6q=>zt`)P{eno0M15O!Lb80D5;87r+Yhi) zQW`Su2vK4SY7pjqmr#ns*GUdUC7Q53sb;++6y2r$}4C4IrVRevLKo^8fPR)E%8xl zOun^W-zqy6*5_E2kV1=~xMSex@ED*yL9Q8}1NcOME6ztihl^!W))gg9w#sxe-jKFu z33N(S_?NT3EnftUgEL}Egm=+@{?2160jqZ9;9F=vUekKyWvazq@?Y$mTfU@ZWAl$V z)@Tv~`G-zPDED1>zWz4Q_K-c2`;=oPKa2n*zpnp{xE5DA5;Y#%`PM1$>fUDI1|J!1 zRFstTyG@Fv)|#7}N~iuKvSZA-+Eu4Cx!Me|pZ&J+ zc-1;r*)@CTk%fmmTxtT5!{%aU_=!b{smxQwpu~5+1@}A?}A4f19z50-9e2 z;z6I^lnW1wB{`6h-8uM>IgnvlAxDw}kOAvf@H&%=lsnA1D6<;u9lLN3+%aKb4#F`{ zU;yUqEvO4L>kI0_oHYm(1X+;^lfpKU=EZ_|L9-(i87R{@X(%4|x&Nn}^Wd(!+TaSK z!sx(%Cl^)#A;8!m(!kG}KuyOIpa|GS*zfehav&QxD_Y?r*e0~R15h={icqtzy#NYfMhG(9^RPoJA6yx>^5SVlP<&i$XFHZ1ZhIfO>P zl2=Kq<`g6%)3wzYHNhL0R0c%4EP-YF)d$*6dlLP|8W~Q3znQ>-WFm{4HP)eCMzA*Y z?}Rm$1%g6a06RA9EHRwDnJOAn)};IIa-Fdnz<4HL zgZn)*uNLGqR7U(;yZj#YIlYYXiKrRwSm^ass3*4WL4bVqqmMw<3IOvy6F z&=!Rs_5-UMIL8yFj;cl*Alt8Ys*)A4cP+Gag8jT0wwIm@C7T#$+%6Z1_dVCOG4%>R z{I>^ghhuXC?WOd1(@7XL$zSjhaO zYfAdI#!Utmuj?nQ+RnA7aVVz;IjD{?)$r#txH!bn_7*GvT#e#mFacL(XZA{lyw@0m z54^8yf`O|B=0Y1IvvM!J0WC`8Emx~E4-$h93a@M35v$z}LK~i+Ht;VjeL;`F4MYff zplX62+XIkZC2LcKB#-h`N==^$%u&g9Gp(7}sn*;5>g8FBH-fER`B;o+ZXLChIt=@F zXq?kXjpp~<-I|pKuZjqD`d%596`hB)vUzmq(u$W^hV&w~eg59r9|a9rljjeV9cZ#9 zumwOY!7H#_2N3!E^2<~p46N`fs!hn{vw}ZmhE8XIE+aU6jzXSKq2CRvR;U&F2d%M6 zBDDZ!k#|7k2r$!-u9k)HRUY;D1}V?sTNR7$p$}8B(GwkSXPeEtr3jzlw#djehg=iX zv(yBr(gAs^&ntu?-^N>F-Wwi!lLPGcB<%=HBL0FkLbxc*hOxkVOQ;(C=H9($QFXZ=(YvS8- zVJGJ`=n?a7M@`n!{LsiKYFBw~`AR;xY%jFI_HhH{b&dDahV?_^R1WaYFz_C}^)rB| zX60YKr)!8jI_nPd^K&|iR6sO8b#$=!-OLF(pM)XBxAx6@7`_Lm`AOe9iva_L6f9&7 zP3sdQlRQiJZ`-tY6!Ydc+!%)UgE5LJu?u*&v0a(OTNF$k3JuomiNA;Kv1X*HoJA5@ z3Nr_-TV*(7EU=D#E2wZK$Yce}{Cn&9Vf^_Ct0s`~)nkd7T$VmM(%>eTjwl?Og73Jf z>hNcSn~{&u1Pf^ra+r)GgC&1h41Xyk>-y_%2bE>AI=}SJ2W}-D_1;CRzf+$%I?IWE zQAlQtw{d#AT@{#Dm_~1<`;Lr@D_T`ZzMYF_lYN<9bDFLWYeLQ)VuqsZUTorj4f90k z^bjt-blh|UidY6-tN44HAXltjf!6Om0|bC-`LWia^!_{+gX?d`rn|)Jo&lS8A?UEl zWCWi;SE|kI$cY6qX)qbVWYd7)>E6#MKmq#I>p#>B%muV454NlZw9tRtka=jl5beHh zdACaptA4j0p%jB&HeyoDKI*=@cE~Z24+Dw6_f{81SRhxa?f;PHt+W;kvcB4LvxY~M z*x!$qQpStzZBkQOi}g8_OMSU+`SYpPCrn;|*tBn2Z{+XdD}qzH67qmrM$K7~!+{gK z_DbnR=GqyZZQQBft+MmYoQzr;CFeS=b3@T8gNCI@yjq5sUGhtkk(LIKp;v06 zY#gX=%KK5SZu4kDx>(z&+ASw#iDI{k>c&Wf4#$!7Bu;$w?ypVmUXpl0v!UtQI#N(m z(*tqagF9R6gNASW5>$ec{ru&nKM6Pa#qK}8Ox(4Jwa``1-^iQtHOUiBx&I6TP z8ezN`$6Y543NCn0@4Y3=*d1Bp6)Anc_+nj4^QOd{*%HESjj8Eq- zLs`_V2ez@rQ4bj0Em$qxT9K8f}9bvKj~mmczr zyNSR$)DnDPHVEV|;L7P&+3)eU$l04@W6vzSm`S??RPS0s-h)A3ahhaOjcP+y>{>maCmowDlcMBXzMHDiTF&A*;w zu-2@>y?(pTYi-bWgNnPv{6<>xQwU9*bnMT}=f0Jt10F?d#2JNBGb#8P3cVVk1R{C& zJU&M)!9L{_o{Y|BO8V!g;D-6f7i(_}sq}|)r_$Ei1$?eRPo?qi_Q+UfW3PF2H25Z$rSqagcDf^GlF?? zsf=5oEol$|mBvppdjF{oD1I^Z%+V&lwbF;4(HRFu(AOIt3{pL!ba^bRjWmt5W!i`6=r4rwQF)Ek>@elOcgf9FuOfwW70runXlqkD%YaRsZy zB0YvbGQnVat0gSfvCsPJ;J@UQIKmW_kekC`SVJJXu}add>Yi!F(G0kbAfzi%$|Y|?8w^RCjX$@&k{L{DTujgx^<~{+9K^m}JVh6^ z_lqgDVAQD&Db*=Vonf?y*;bEHKy!KeWM(IQOlkg1ahTE9e37$=;n(!ofdCvl# z)E7)=EUAOhm76=@cSwE}|Ga5#(G^a96&jnej7wL@v*xHc7wWnysCIldcEUvE9-^`) z6(;AAD(%R>%^d85)z%rP2V~B$qD|B#u41n(Xi@Wp>i0^nsoOF04H}FZ3_yarvbTl= z$1W`lEg$Q1>kVC{oJU+?HK&(c1epdIkJ{VVJq0}xsGVC~9-U)dXPj%DuAFmS3~!|V zA-s+G(HaiT9DRA_>`uHo;<`=!$MsL>;A$51jL^e3OZwHz|u*N*axw9H!}Di4^YEzB*eWt3wwF)Lbndi`uiX`2J-G~?Xp(*Ex zC*6kMm=*XjC^LN>4-tRnF3=NCiVVL&7Jn9RgDAzp1+-}bG#yqbxpq+H775*^U}Xfi zB~ckO70RSdTt9)S2hR5&8bhn_NhUZpzoO&PjfJiK?aqik#)Lolay8RP&`XHG5&Nib za^cCn&2_VY_=apvu6Q~C2eB?9vnITrnKBoSBmG@^6>@?HJs<*CIMzJt{ zm8UpUq7JJU9c^OT==n)t!)&I->kE}k<8rDH<B^GLQ8Jh*sfETRaEJUjmq(H1G)>V2iTd#^Me#l{P7>gLk6zSW@$}M za&b(Ue75kIlRma6ItzYWF4JH^zi5is3-B_^Cv05AHqP_Hf0ab5sjnM7}+mK(#kA6}Yykf=Ov&o*})~e?AA@!t|_Ms3*!n*b${if+t zJg#o@+0&Hq0YKL;Vbt`u{+-~!qON>hrna~@WY=ipBG}5Rj`#7Us@W7 zqXZwz=Z*wf{ky0mBr)ZV|68geD*1-6q@ZqVUBPf+)$)zB{EOUr#)4LZ^ScPCz;Fd| zU#*&myD5*Y>oaZvainQ^Ec+$!;}%G>K6eJe63Zis&ik5L=IF}CgU4lSqQM<)`5ixS@`$<-NF*KraN-Vt)9olU(e=>S1fEIj z_kU=7n+-^Ly|8?ae`mmayI2OlVmdSW4Fsh4o?BW2`JEw-Ycul@;u(~Sor|h}`fU)+ zMpc5Ar0k)WRhEtjg}ThO39az1=&d10ihsI)=zG$81YZRGq2k`=rXSNNiNP>900uq3oEd&W5&hCNU z5%Z`)FZh8u@W-@)0jRS*|92CVL!bftF=ZeGG&=!${~`=v%#yQ=dIZ1@eAr~-G_D~TK=ma0ainDRnKvsn zTWBm-iQ`v+@f?1b*Xfs&G$9ThdC?z9#Xi&GmMW`F?LE}t`*z8XaIyfyx~Cf?9CNb?y%0B^Qb#(RF4^7Z>K*7UUMn})ngx*jt|Ge-v#lX3^?vH z8`Jnnf|m4r%%1C*qp55H8xJ59=^bL+ZA|@NZnPkZQE8MtPA{%*6s$!>A;^LmD4V={ zZ4*X)Gz9tcistgET%q}v_0(F%H4zO17>TGC35DL*OQk`K{MJ;J8(&Te-Z@+BlBpnk7`)=sMtboC zeyBm z%~!J}f*h09cYp7yht2g0n8|Ltoe=`wTt$-Gk$R4SQpf%)l$RDn1hAW|VmWVDUN)X7 zkwyGGj+e;CrLbS3bgfD<)^>};*|(iN9n6~}E0hg9%FWB`51nP~FvW*=QmoCwMO5Cz&ZZ@bA9Z|7O{`LJlpcmq1 zoZPK1rQL5JspzS_)`dmGwbZ=YZPIKiKzBG4bRXmX&N=u7rrIW~$GnP~Wou~0W#AT> zN_z~7*X^6OI1WuXItkYSz$tqYIe z2`(0H=)M8-p_d^mEg0se!qMq@e9l3=07zW#;X(N-_j!Vm;lEq;l(c7CX!(+o)|L(( zx)f+}K=cgai`5-*J`*O$3Wj|{_$+2>$-U^Z5EJA|E*-$$?BkVEQ2TZwp*r@1Cg!k# zoNo`ovvFZ>5irayv-+GXctL|*HR+Q>tfAO2Fiz{C<^6+L!(j0a;N!l;ctY`dILC%4JFa%sK@42mh>fjtvC!tq}XU^b~Taa0GNH6gzT_OCo6r%njBQ z!98VDV)NZ6_O4iu6l5PRNjmRI&2P%qC{&WnDbHzC5gSf!V4;s?A$N`cddUgkEa^eV zYgQYtFvheh9%7!dRvUml`L-#mhgTgO?I^q_UR|{RQQGyGToaSd?>UsJsR{kE!f;i^fQ>eP@)uv2=mXxMzrYZfH~`aEZBpM;Kp?&KwT+>kqB~=Eap*fh|rl9O=;m^9-dy?I5_Ei@kUCG zBoutx2TPcB$R$X_sP=P+o^)esNI2r9d^ac(x%_vnR{OR!5#GxDzIM{8(M{I^>v8HZ zrVK|$Q8VsDYgxjyx*Wv)vNjNJodkMjLy zEvIjh0W!3_f?pX~I_Y28uf}5_-Nd4HeAq#*Jsdr|-#i!d%5wtus0>{HOT3N{qFPwbe^4Q(r;J32>vrf_BUi={8!_m|8NoBTO8i~IR~yo^nW#13nfyfFcG z!qPFA4Efo8kqmzE#8B&-4+;iSi7N~H=?Ag>JdTtGWGG_GcK0=^VvGHY*n@iFNCo3#Em9Huh(+48Ihr+`_RV z>l+G%oPtq=)`fjyc5iBhZHYwBh5c5m8JMZGJd<^PbxdR(e>knG zThE&R;z&?fXLI^-cZ`Dkr*jfXls@B)Q>Bw7Nz8vcC4P8&tkZHBGg758&8NM^Xfw$C zPVTQQsQG2Jd^BzdzMMn6>1Ftr9`sz)Y?b?ITf9~`ZmgD^C6F`9P@4_aQV4m5y;9~8 z-6zL>7)cM1lTb^}>zRB?<~_D67;xfG{IuXlH$y#d!oSix@;IVuz4WCn?f~_LRVHgD z4CzV4+_=}~rB)~&YAk3IRD^W=;_K^z(U>TNIRA^_ALkk<<8R3gyc#X^=3D;>f!zw7 zHVercI@CH0{b@?b@lV}^g0>77>Z0{o){37i$tvzuOwU<8Dg6DuvvKUOtT+-q^2E)f zfHiWHGqkX1@>pErbY+c*sa<+Jdv;kWB#S^vQEhd}!IeFk-cR_yc_p>=uH{3kBDqp2 zolK-)GUaF=4&}8Hi%e5weNHe;U@8ww$26guZW zVm=d*014LQy|dKqmchfa*1d0qrkR7H!fI#=e}%JeF3M|vd*u7+(#2xMSEfB3-JBU> zQDFNnShvkYM=y{4_GQqQjxJF(Q9Se-{CY~?eH^blg{UVVfQz8)zrNyO5czOrN>kcf&R8VCf9ih>bZ%b2= zO88s8)wVOoztDW|QgLN7>FZ0z=Ai02l}_{)g*Apd2XcCI+zyrY!Om7;fkLi!{jj^T z>tyo$kJ#@00#@GVEJHNbG~}2&j8oPGlOD2>^lfdww4G}7V7gocImH7O7#jLBw9_^0 zgZArJWvRrvqXsLHy2SiueeF8_L?W6_Nd&JD1Hefo>}poyi~BxK_-dIP8bEs(OKH(Pg~j#= zm8Wn}&74;PIR2T1)f%w}ol)~t#gfJ|RWG8~l@~agdkPyVSif9hVY3fWIQ|cDUlm(d z%&Z$`W@ct)W=_M*%-k?F)NsSh)NmSTn3=g@<}{2u=}z|Dzs}KpIxk1};Y!OIdySe*z1n_5e(hKOy z30Ht8i1&}*_PM|Env#eOP-EfCD>B(IG~|pacALG!zZ-T)bj*O;!?03DpnoFp;>Tj> zg@VjApVp!B(wecTN>UbPAbC%&F6~w7i z(A5m|$_Gy(ku9+SLrjprQiHzMnd?}L?I41RgoX>T>8}LG!t0Pmg)8c&^?9`qQ{>ievWRNZXGI)k$risp z+IJ3%8U>pigw^FaU*4j72*|N2f&e}=;~gwdT0HSNW8(iSiCBB*1nLo5r-5iS{X32T%z>~ zu{;6=$I#l6*~aF`gV#kj3#ZpNa1*R&$6Mb(nn^}+5OpxfEMxAjBJ}kQ+E5F)XCc!~ z+#N!cwo*7Z5nN;kO!0tPhWXF!%d7bl)_Y{V79wbAHBSR2lYFLT%IAMJbm2_#=__oi zmw!^Li*r|h1ju+2JpxTOMa+H$+grgCbAgtovdcK_m#9}Z+>D@I#uh!XjzY^aVB>j@ z#v1D)e{;E~x4197DSm_!ogI9EJq!05DCO3;9EY!{RBF)O;-h>`*erdm?&sbM9Z@l7^3P=Lv_QM7S`tb+Bd_ojPg3v+{_av9U&>DWf z`~mMGV`49?RI2er=#AS&wv*s0k6uc@h`u;|F20yYK0S5E8N!`HiZpm#@>!S*2h~V* z=Lp4*wXSH6AHDCPP93*$o(6-5D59`W z35AX=AiK|u(33Ub0F{g(Aid8LE|1ug48~tPLo}wilY|NlAJD@DI5LCwyjJn&uf~_2 zE<7@`{lSZ@&^k8f_SeYFD_G)^^L`YaEm%%O#HU9;`>moS{jW2XPwEbJc+!%O;=

oH$m~(3hH)(+0r*sL*at{=IyLG&QyrJLTGRL%s_i!f& z!rW$Z`k)^S4SPLc=^$x{GCD8?82F*=B9g~64zz2)cER{B+O`stO8b^%sdKvvJHP1Q za+pmd(jrNPn#CB;8x4OJZ+}Ro|F zOtH=%2T&gr66E~F>z?gPm|JCr3F6$d1Xb|;gJYttBk9I`m_(;>b>E`O>rI*ZgP-vH ziqtCxIyHAbEu`fOBrYI{j}GKZY4-zI<^{*5$lt*OrQ|~uzTbm1U0T-mBZC;WalN(Y zTQ;0j@r^`~_bOl(*^ndddrQmisq%Kz%25(fg?e=O{uu|=a~z(R7t;DZL{xvXx+cjB z?(^_q5Tz3$E6FBRJi(SyODArSE+ymU%EiV`3Ww$U=XqqvN6p}id)QghGb}I4PXCIO zyyk)KgMQst{l@pt^21O`be2h+i4N~M<+<2ok6c~Yl-@0cR0j{@TD<<(#@}bBvM39i z_IwsgO8R5`S?ZHX`smSe4x;%{c@p;7whhvNZ=QkA)kccHGis-}_qgpu^Jl*&wV$m! z9t-LA^?7D#z1(f|OPXzBBD3XPx2=vODo=I4`aCg8tEt?{2UspDWG!6(y>~%kLQa*b zJs5raooiTA{Kvk~p=mX;`frGtUS}SHvNLbJ_UT+PyMzzT=X7Y(Cn)2yI@H?ylAJLA zT|OGDc=N!e0IY=XR>U8;WH2Y`pE+w~fB-?Qzb5Y>)W| z{pZpIr8|L$M^BwIPX@;zX^lp$6=Ixcr?_`i*-t_=!|2E+J6rbi4abL5c7xFoQg-#rid38<*C8lGst%O!q2GKWHj2d! z0w2GCX0W)`!PX0R?nfv!ym;8Ec@zrWTX#Tv>o28e{MzcD0L|Vq%X?4xDB#cCD@fWg zY;4VM&$7e{M>kaaxV>rOn%V+^?Xpqk{mSm}LS6B$*sQ8GRsmMj3Z51=~?9wE1H{^9_C+2b?k5xH?8 z#}SUqvERT@GR&E);0jcmB(oZ{$(n4rGoTY&a{RU?FXY9sgLYh>(ER#$h6(h;21oG& zZ3=LEVtRJm55ngTQ}?+6KVJ1-S}PE;v+BtD*eXq;^YbPjcpKEN~oILruU1Ja6hYNe5Z7WTo}@JXaD2d?yZgCJxZ$ zr9YXLHGONI>58H&^~*Ee?yON{BmFmW@XPp zjizQsp7sR*gP(Hldzh8NjPfYvZ>~an7-W)HYfvv*W1Xk_rMrIG+lW2ooR|K0YOJf4 zC34QXwURR(mQjAC40?`zh%I)?IVXMBqztz-8`YwVns;g}PJ0cgeT-v=#8ju-w#3Yzzp` z=|+}*LF=3*0QUo`*C$DgnR_AVXMl!j57Dq3N&!I^hqu*wWC{GREs7C`^XNjn1#z?! zhjILY5Xu&(aq%cBBP;v;_+Luse6O3BgyZ^#}`?VN;ZL zbAr((^kIVN4+7UwcjD+R&h796atlAfXkpInr~_9NSd>?Df^m0B_PLd&a zf?=F!J@XFyVV-De0$Yw5OM$opF%+*F5W4=@F4OKmwD zP#WRWs;eKur`Wx;;Ey8OK@o*A$Zv#rV=Z_05(`6bJ9TpWHPsVcY4G7a6dN1LYb|39 zl-KmR=U5HmPk9U-5gi?j>8u(!0!{B`gtco}Uo>1YWKoY7U~dSdSmo{0{8&#afI� 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

$ zQ}?9AsWQLVQ*8^$_RVa+*bkcE7h4qxN;_BEGq$Q&cUdAw<{CRGHj`arKVXt;?CeFS z;T&64tZPxi#@hlVqu@*xqu{7Y8ZN-y>B8Ws$WeyDQ5BHu{}8+upeNzA$9sH#-&6NF ziM%{uPYzViRGXI$)L=7dK*PJ&!&>8$PT)>~0G$vyvH?maW~#z+Mms`5$wMQ-iQH723D;CxfSnG^iZk)hw~aF~D-nuQ>m7oC_xRabPI{vk!M6T zj&>=krg=dBMKXQR!qahGno=S@zo>lDDMk@KtSX~c`^;8}KtuIYtI*o9g(#{yD&DH= zDIF|tJ5{_fr9^a18g$ExQG}N$)P$uvYQiTJ{FP}n@k#~tWtvU=Ger}ZshfDW{)=Q{ zxJV&}GVLbzDa4>GMiD-wDx+@V3soY}XyO``VpiG2^@9KJ%K*HT{4hUttxF8%opI0& zR;S>MgI}n)UDd}c^yZ#)J1u>>RG~-pi;BgrxGXV9FkYgL)5C?fvYEnZwE5f1N78yu zSMM*KC!^=|Y!>29qqasFe5b3LK8?*SM78( zv8`iE12L_b*2$RHqIz9_O_Skqc{xi~hT`3!#Azwr9uaVq3fO$z-c#RJw-*ewW*?yZ z7zkNg?WbRb&i}b^F@THVWpEdK86HMC=xnm{51~uZL+Bk`gcsuL@z0Oyp4%$M&nAOfy5}wgBb!)*$ zi+zg511{LQoa+d;MXkg0E%uSh648j&p^8|YyhE5SUiagwnAlpCk}#d%FZYd&AFlApv{-4j`?EubRI@b;_Z;@@GFEe*jab)lo`r`&| zq5lx^qp_*3Uw$XYPmr{z9qCams;Z^G#kjy-PwNYKc{}vAC{^Gtp@X9*Otf{i1cS07 z1Hq1V>)PHvm0FP3yD_2_ld+-|Ehj-!M;NRk>@XNRmAH|>G zlVmipky26(T0l3soLo=tAdiq2$y?;F^xv6&FV9|vUerCUZGB6ht7mPm?FvX3+d8l| zrX2fVEvCZ8!DaYwh-STs+Vb>=z_z2X(D$ z?d|Okz$??Y#e9hZzfADqi#oR|?ZfIeY>2k7ZB0r-br z|3}{cG!BQj_u&sWSjT6kMZ&3?%_}13Jqfpv#f?dL55F7lQIZF+Q9eGhJTZOeh5Y2m z7qOGf=AHCRTc12QvGMQ8(P6|W)_75@r*C4i#vWPa)#~eN+0+qRAYNE{(R_M0Az7x# zmJBP>uZj)rfWN9@>bSr9Gr|IXQY`%MB&WF(WFZ1PfA?v&qGNdtDMI zuQ*O#k>Fty&nlI2>(E7R8@kB8IE~1OlV^*Qmm4SV{5W~j;^gJU$;*$ER}d#}dYrr& zaquk#j3M)YF=QSzhRj38kU3}!nTL%b^N2BI9yNx{V-fxTaSp$OUV=aWLe~xx zZym$sL^VH4p}7VYE3FN}iAaX51CQw{eX>^QI){PM7b#_J?d+E?{bXwxB@U`x?9R%} z9cg@atUt1&{Xx(0tnTgWZs|{Wf4r~XAF)=%>kp4)Ko9l+sz6o0_im*95*${a#O|)@ zlPo@K43{146Gx%h0e#YbNfj)1PR=9cjPAbyGS6OTFa0Ygrk0lOX7MvZ_^5nY_IhBy>^E`76HL9)|YC<2G(zmoOMO?pE$K7{=4~{ zG~tL~5G-3_Cj@JRX-N27@v%z2C=a}}>NHI`J!%w@fB*9%u>U=744Eg4A@ig$WS%mH z%+tn@dBzwrA!Eq!#*hg|oY1)`%sOLW8pY<+_>vQn}~BIqPMgmOb% zEkV^Bx#*aqrzNOr#o}c1`C4(Z9rcYMZC1j>?T&=)Ni^5>TH&&kjnLMOW-G#FDQii* zHt>0AREv)Cnr)W(R3w@|j|P7NVSU9}RUigu~Yp|6sN~0fjMSHk3+QZIfztiKRx(N+}l<1!IYxFGJ0^P^Q z!S*a$OBN-xFm9AkBbfBX3n8b^BW1EuCxjfsV>>@1jhiX)I8#)U*)V5`=F+Rdr83f* z4wrU?hRoKIML(Rb75$JZ;(n*M&IM8+(M&Gan(k!u<4kvR71N!pmR$dz$~AG^dhRN2 zKldv4F+ykzDnJf&0lFOBfu2D}&`CTVSKwy64gVS+z(??>1d%CZA@P$=u8C|Tza$Tm z=gG0yn@(Mig}J9a8eZY_?ynQy zTmx+I&04l0rUiO)V`+)PHpJAD=Kn6fR4@lcxfIPoPJgY_3&jm&b%mDNqHczk7^qgL zE$Uhlzx{kk8g-VA@+(FUqBGhVF#R=Ytz@*DqU2c-2v?_;#P=q?SooMC%C|Ghw_ae^ zL^Ix~!MJXaS(b4{RC~Qzto&cjk-w0`95GIDPNtQ`wEVSQIT@!FSs%-ymO|q1W zX|jFZ|9+>Z|yrwJE76PL_*9A`Nl*}Yc zu`1KvSVcu|`abz6K(244&+h_0s+?~7%0Qhj{q~$B%Y5Ae@F>*zvQH{VG3c68a zEwCk77HXD&!LRex&@syXhk}LJH%2yPPMIU}9;DwAk^hT0G6Ii7Hu&*;&<=y&GWF2v@w=Iyna0&f{MJbP>L}rf=K3N{uJu*~jQB56a;;N~ z-Tzz2k=>*KKZE_~V{{oB%iRM>Lth(43^pcsk759BUDRehY#gcI8%OFT<4C<|9H~Rb zk$S;6QqLPl>N(>`JsXk#t2vT^=OH)zIIY*<27aCpKP5V|&Xq|{YR{qbu)WUdPrNrp zzmDK!TcN2V%ux$Yww5GEHt=(`xb+#%ZBR#S4ujj-YO$%q?J9mw8uh`9aywmekg~f0 z)VTZ!*ADtLy`m)Y+FD-}W!Q!% z;8Ex#`V_r`UO{1W5Z#6Lpli@})PvR_FRDTnC=X>I6Zai=f;+~&&OOgP2E>&AbS`LG zs@Tpc^XTC-61IxLE@ZF^7;GhjH8a=>25VxlMh5dUn2*7{47QxX8W^me!8{CB$6#&- zTgG5Z8O+6CwG39nVATxfV6aLCvoqKd23yQvix_MngDqgN`3yFf!R9d7YzC`fuyO{Q z#b7fTtc<}*8LWiCib+2w*~6w3!GjmW3IVH@uo-~Ok+A826-ZbCV3Q>*kD-vuVDq44 zs!pDb!EzXEDuYd7Fe`&)GguabWir_0i2N_%NGdKudGKQ>iQdmI(y|a!IUyOA8|oTp z)M^6+-DVv@r_mI}^f;?jE$B3ANq*y)Uzo-%m-t?;#kXK=b=ZCWXyt@Uhf9WHU)3Us zebquSUM-o-U!W!PscdQR*3(GkiDr3|jzEl(k0O`Ww3D!HlD#I zFqnnGCNfw$gJm$-B*pBmKl5kBkr>uEl7^K+tc0@R&AO6JAp=3?w#M=p2~6{1GPeM* z*gdB+*bD|MWUwMu#>bKWtZu;S4XjSV>Km*s!s;ok4#Vmb0zv#A;BicExI5 ztX9TqY^*lNYI+XQ{s;fvgT|uE(8t)1pCJWg_b^^UP)Dimr+mMYQ8_0VXT7|Zv-M9h$4*e%OhW>^}f|Q?z=i)W^Qv55t zA3uv<$H(z!_*;@pCXzzpBJE@=xq<8>50Dqgo8)uy`Ke0ue~N1&-5zz+x++}(uhZeA zo^t6o3$9xYj%@s)b}!PIX~a15=k_tx1H?ijUQXThszhQ{izTw}qjs3ole`*^$7mmoFrH8S<1 zbkWB)(JXJ%S@5b`qGWm2EcJp{T}$G6E59U-b4gsgG%Y*Acc%s!ceV~`+>y72;e2L1 zmY#Ma*y4V!;BzTqE(LDf7e@FMA{pcWi z9EH&H=rDQ>y@B3A$I&O~1o|3%i!mOBQ}H;Qfvxy_JOh{EId~DS!b@=jZo;c@D_)O# za6jIPufV(T&+!d-58jLK#P{I?_!0ah4&y`k53qhXir>S3!JpzU@i+K8G6Gf-X=DPK zOs0}NQbcBvd1MKxCT`*-&15yKFE)^kWE0s=c95&dFUXDLH{>>Q7rCE2NFF0klV{0G zY87Ll%HDLRkQdLQ?@2ht3CB z8p;PaD^v)uJX8vBZm1mKf)LE_rbVHJ0PP_=z^afFV0Fj^uqIRo&=pz^&>d<7=n1U^ z*bur1pf9upeF#xylV*zgC#{;~Sr<`8SX8^o{&jh%W zw*tJ1r(EyiDc4u?1pt4_7XkbkUk316z5?Jc`FQ}Z=NAFo%~t|k%2TfYji+4S#Jd6R zFwe<>lFMHozCcpm&>I4AYVNW0;QA zYhgN4e+tu)dNWK%>a8$s^V?zC=J&#Mq}~tHkvblxBlSOFI#M5o=}3JPrla#oxC7v) z;q?Ij8twx4MR+5?{|(dD{w=&2;5Xsz7%k)(r?z%S!> z@fWZXn~p6cgN#CZ&@R-ET2TYc3s0aEqzz3YUUVOMi<}Vuo$0sa`(40%ek723Rou|t zH*#EZfUdKJZzyBSa@k302MFOt+7QR3=F2Utw(lT?vF6)C9B2N3NrAC5Gdl&gNiaHJ zF_zjdp$P}*>N*ez(k-jZ9Jq0XaI_n3yeh!6^?LXpiZIsg+}V&)JM{5&Hv#z@Sm%Kh z`e3hP($0Y+%%q97y?^N!dp1ToQf%US*hrQ8GQkr0n!se*uZpncB~ho!l5| z=n*>9>8XNwB>Be3IJNZj_LNN-0d=m7cXT&AhfUOaAUmdCHjL|Si=hD1JvNv-Ibr7| zLZh^7G9)k?Pr36a{{!fH>3ToV-5G2P^mTx?k_iKw{6-2%$5DJ&B>p$Z|L<@8H}o>j zB>IMNq~0`+)KTL|y=5G!KO0BtZR1G2V;re>=~N=@|8b@Rr?3ZjPQt^X!=Iw{DFe{H zurZ`SNj>LgV@O>NT-|RBsVjl2-Nul*7PxxM7*cycc(oWqY9DmqJ;so_4>~a6N5Dl$ z9gLj+|91|5i@t$B|9`H*ZM=I7H$^bynFkkVnx{l9z7gA>5wq{2O)Y($Ev;Q0#j7b{ zy2InQ%FLB$S-j-IC?sPu>DU_U!6VRb2_U^ zOzTu>rKYvw-f}EW*#4a*ZWG5&K@hg!H4jb@H?%blT@ZJXrE?mjyQoffkSNj|xPxh{ z*j^{Kq6A=>>o;8^(eirhy#bfU<@dYlob`=<)0cuLfRyE_7yg>Q67N#&s18)F^g9D3 zsSm2sN>d*Yn_BJg1>8Om>NTSs^3O&wA~lSk;J6XK40ZPov=_blL173ZFrVG$&Y zi51frmOUXnvV@R?AW8y;WV0bFNjB^z1dO<@$>sqe37ZW80d*rj>I0ueZL7Dn_x9T2 zgMtsVqMp=it<|f&^-}fvZn?F#*2k^3MbysBIeX^J*|SNgW}>}0gm3?U=0Ee#|Ihnz z{@))AoHg}6dVvDtOgCNB78D60cWP_O*7!a3ey=Bxa&bH{Z|&-`YH!8VJ#o!={i}lI zW%a>oUn71YurlSMxXdJ`uDTk>xL2xC+vueULsUa8i`;H}&%cJ8s2xUT^*D}v z{7Yjl&@-&XH2Bqs3rYK*ExjY*zoQ@p%mjI)8I_F6xPD? z;0|~ryaPTApMkH!cj0H~M3jq`qSa^<+J%0Ieu`fHQttqYy;?ynOR<1pncM9N1cH@i z-s%RwXX;(!ZF{_Jk80bF>#W*Ce16i>xIC@^ELgDIlhUD{|3@S|#!mvvFfi&*Y=u&n zDy8FDS4M`tG}~Ti&$jnRye(TqOt*>?{4aF%cC>YcTj;cjW}{?QelV!d#|>a{F^xBb zU{QQ#Q6epZL@60k6q=18M4|CUQI;#UsZur(#cp5ez=AmJhG-E2otDh&Gs}iyK5Gco z*E9u64e{;K05a|Nfhi8Vvrt{q2@_#yQkO6W8B}*L@xr2$cd}Y*ic^qFjq6He%erX} zRf}2PA?wMTZU582xKorwovH2LC*iIl7q@@k=WX2UmHISkE-r#}ysA!j*yq|=5qN6q z>eq@WhC++mQ+ft+Fd1G0xzrW3hAp6ql$R}&HJqy3m8eRZgnnsky%I>H3rHeuCS5`5 z(pEN9kFsr8RoI0|geClWS%(%jx6nddl8E7gpr4iPX?)pIQ{f`SElMIT&48(F<8fp- zl;`N;Q*q@y*{BVdh43^s=<33!BzbPJLQNHZ|x zEQTA`F3kNy}f`X(_#dY{p>vB^xw!$zaH zTAb>DQG2=8Xgb;2SldHJ6TkW$NO_sjkTLoEp`w~v`zOZz<$%%FZiVIwQ?-dt_Gwpm zOUa%2w)B88emGAUE?fGF zWc0j445L})iUcner2Q`iof7B-{a^rG4Q>YC2X})9!Q2cORL_Q;kLI{ z_SDH8y>gh4n`}ht$>_7jpmKIPy}`f5CX!#VEgY7?@Epa5sP0`#5QK}D-gy!I|I>BRLGZcSwokwAva{Xv!wt(CFZXJ zbrQoJsI_eSb_KtTB}+vSlDU#h`>AOI(=vAPB3EL)_4P%2`l9iBV8loK)@Zm_>py z$M`~vWe-W(IR78t|6}FRF25~~)gQ#M`lC2j?}%gdCvmLa702p5ajf2lunDjK$@fDO zPJqR5GoI(~hWp@)NJ5#Y0?{|me|0e8^v^LuN8p4#&2lOMycXC`?aM^VRm@pl9Mpue(`tYXQ5 z1X(4x8sCA%}2PA3Y&&U^y^)>z={$IGbyuj`DljUrI--B5b*L)S} z=V2DFn8-XB^whWugB3o^sR~b!(xaH{U2+Y{K;|VkmkQEP#ZliQABP&EYA_=V;ia{& zPG?nv2}8sqqJglku?8=-8*2)5s$G~WLau}{szO7)$?jeHtC;2j@-d--M$7cVV3l`8 zRXX{${Z^h=p_-`zHB&Slta`AMcuGv5DpIK`ya6>=uh9GdAV)&;U=IEnf08`0?MhI+ zTS8Vk9@XV_d0*#-^1fDYmxzhtbc-o4J^s~mAsXT@rOK#9+v+JoY7jw`c`}V{)Srl(zpw0 zF1D`B@2y`eUl#Xf%taEJrokcq2BdMe8r zs_TQR-Lj91!$rbQ8)P@V(5uA}eFiH%W%UhykGwqYl30yV&l?PHuAGZj>G4BYdOsNV z0zHJyw8zx(f06`W0Po?S|F=)9ML923%2%yHt##P*nKdY}yLr;$PwM`ErUah=`=qxpU}zFvrIlU@ zCsoBwuY^-mcVucLXvzoXB{g@a<-)RNXmLiHcd<$(oJ!`eM3^!iQ|N>}tn=q%IMN^@gn%a2AR)@AdX z^0q|Fel#YbwJ%nh)1(rrlg8L=YN9sYt+~6qqLJ=S(p3mMu8{tmR6AOB0yr?#S>6%d z80xX;`^=e6)Rk2_iTX-N$gH{J;VIHoDJDsKrB^@-C;|BymX=7kw^wB_b228&n`=Sl?u=;K zW2}0cT{FoX^Jqf4Sc9Z`_QjJu4pSYn;;xIS5fb~AcUdK8CY*o?cUq;0TS#k1o7VGa z#0V2NTBT}5Oibv^vm&kt_clj5dhn>MQGyvZhto{i8;%#&*)wtFwupA)E=D6+G|%S9 z&PyaoC{S0{s#&=9TcpO-kKd8?{{+|~!4~)nv=H6$g|_YSXZ*pB7*jSEiD45H!)8DX zn~T-?f2o8f!#SWxDm})cjrAz&)f+HQyQ_`ffXP-F(7D=HA=9n)GkPN3(Qfj|rO_fv zGoDw4x8PBrOQthzK3_bgVWX5Mi-#H#igha;RAxNcbcM%A=4Q}rWjW?pWIh&=gGxK` zg-cgY0qP5vuAYpW%7Ru=fuyS_J~P&P20RV7Kd+6!3g*Yss<0fx*Z zUi(vDC>e71z}O7>m5sEHXu=k1!U}H&?M1`NY-$a|$ZXv%jH3ILPSx)L7QKf0J)ois z@_W#}cvyiA{tryT8T}s^-WmYP22*LCHYP2;eMvImM%wU8M$+&t(^T#M-6ElB;IQ;% zn*9${DVyk)4lbR>SP9+I$sM~bo%UQ-MkCwOiK~0KogKANjwH>58?8xqcTBto<|{qw z_l!=vFIGgi40A8DcMi?n_;BeZXwI~cXyO)YQ@ZJ9vDPzW83r{m z{d@k1#x$;9A9hT$?AKNQpCJkVJqhx`Zt%$$yb~a19dn-;HusBR^MDvOf{gS&D2B~L zV%Ypd3>!iAe-EnT|6>yT419`zzH-k%u@a@{yz!y!RBdP*gLB^Yoa7^1;yJI?2$yi& zn{|+bE#?XdvLk~xGB-`ekYv$^!)+R4z*I}ZKbVS3$mdkwB;+x4K_COIXr7}ZGz2{+t)J4^r zB+r|-xu+)@F}&5~%36-APrie_(^$6B(@mwM?OL%Twq|X3pnb$?#boYOijXl?P?xG^d{beOH2ifH|NU17ETyR;p}EjT>h3F}rLP9z36^6;YrL3j+-*cdc9s zww!KqH?KzPAC8qN=c`AgstDNz5qu3IObNEnNFoFI@=cSWz(NKbtqW1AY_%!}x3F@^ zvXH@TDu+VTE(li+c+A;iHRg<++w=BWBV6@cdp}RM>L1emxyAZ_sdPZXe@{ryOK(c= zNuPoga0@MJg(E`-ZrEj$~phg;yK z@J4t$+zTIpPs5ksTks<^0iB3sv;ZwdXQDNz6-Chix)$Ar?nDovC($AFTlB#{+AnaP zSyyma6^D5_>`V?@$zjzTR>NVn9OmP&Iu2XKVSWw^a9BNuaqe!jR&!V*hppkTwH$U9 zhc$87*&Mcx!_MKbAcvjHVIdAXkHeZdtcAnE9M;NVyj$UR4(s5s^&GZ=!#X)^BZqZy zST~3DaM&gei*Q&khebJzb55MKnZx=yYzv2N<*@TPY#WDd=dc|db^(W7$YB?8Sd7C4 z)cOD85B}~UIy&8$iwFf}Fa=RjLUHDa`Y`2AHossJ-$b6M1$F=LNokZ$|Ajqbj!Som zVRMZbHrI+_bDbDA*Nb6ugBUiu#jv@FwEt3RmxTYmBmHQsR{`U5((ySdo|77}i#cp3 zhh4&9mvY!;9CkT}eS^cU;IJz>>?#hsn!|Q+*fkt>Er(slVb^om4IFkOhkcX7c5~QG z9CkB@-NIqt;;?UX*moefM4ADzaod~XfTeI1Y=(XCGI$Hz0}sMy;RmPyos1^HJeUb5 z<6fW^`~@5azXI8)9>vfTs2nT<5%dOnFaB@rW&k63z%uF70@MtNi6~Gjxrli;YA(uM zR&BJ`9<1;L+-ON`n( zrr{op>zQU!m<1WhrGa5 zmRE4dgIvh1SOZ6mAv1iqB5^6txB-VO<3gUsA>8(Z(}qL1PRDr$4&f@ivmb}-<3jf0 zkmtCN4{^xvjUjR=%8}BjZp%B`@O;-1z(P#tNG`)6e0yDoL-;Wz6K#_wkq{iSoO}C4 ztOD8=)xuj?;P?zHw}jYE3Q}WazS>IfiU!Rw0;^Y3ZbRReCT1d>V2su-LTs#EPF!De zXP{DaFJBjC{t`!=Xy8~h<0PDi5V8M66A5_g8|pMWKT|@u0=`Y`eFxh*`@)WcnDXT* zC<6u~VLXv=Tte3WHmO2FrLZ6DmyTlan4j39L6j0kr;@GP_6+z;HS3t(IO&O1~mJ23N&d-h{ceAlt zh-=-#OnVWoQlsfQnO6N%%szEx{UUBPb)QS;*6L4Taj}LM7gw8uaPB9Vb6+*uxz9|V z`>LUGUu6zb$Nx$R|Lp~*fSuq^a19(p^U>~O8RR=A;F>6)!e!ZoahfWO(+R>jr3&Me zCXCaG!Z>|R7^jnjahmoOYyauOIDK6hrwn17P7%f_Qy8b|!Za&naLhdCPpoDFt0;m zSP`E~8^o}hE3RJ67S{XB62>W87^j)SIAx97{~dou`w_F1y;%&Kelcveh+(sp7%x8# z5PRn-?*arO;5AqcA4GG|4P#wv{?6W&07rG4>38_CSwOO|vBv{?XoMt#xO5?e1Tsi7 zBWchznvoD7U_6=`iLpipbAU-=vV)VjDz)($+gYd9@r517vAu~M$CZsY-Uq%(d>>%r z`-q*?mbbQQtFoKK+x^b|-+LngMh$p*#;W=M{=5JG>wZTcfB#MKntg=AmoXYkMON&{ z|1QJiHSahl+cVATcI-x<;ZB6@9a_o)NZH%8lx;=IUZbOINAVC+_5m$r6G+*|w3K~a zS^t~M@GH4t_Acf%^pnY6A{F7iou zCCZNOR-ZfM^;5#pV1t7+0pqBJILKrj%{occ+oQ*54{A8p*x)b_sO@1|=QBa@Nrm!y zr3yh?uk38vqnI^V7K;4B$NI>1?+l;UC)lNH?b1?NA4o7h1<#9#vS7R%$M+felLG7|H`TUM4ztL z62ali_y{XNSBN2k3Ywox@zwcyU>f}?v%VaWunDe^r}z+5?2Ln#l*s1xM?Y!r0;m zr!1DJw=MSdW)jwn2-?@1SsGjMi(I1CyJthLIcscs%m+0wowtA_!fGJb#Z49LH`&xp&EnXU6ZpZ;fHNkcuK%^4` zvr>6r#=(Iy>R@}iX*?LrEjBz3$LAf_fVo2e1SPxh1x@o=OOdUsNy*`4OK^zmq^@B#i zIeH=m$QAm-jY;QWNz~|dC(Ai3c%N{6r2Ockx#~X%`s&%!Mj?C z|CeT%G`o#!qT}_GjY(w%>Iv4%L-MAn3&@jvr+X?$?)q@`#u3f%++g)cIbe~?EJPl) z3?wzCd}!9CQiXn|T%U4mp1ea-KI*nRgQHasPiIt09WC=?+hg;r#%L$WnczVofN`5t zDM!#(j|Qv&7=2^(ApT$qh^j4=~^ zU+MpMFiZ#g_uTp17hmeeuRqA(X~I@k)Tap*Tc;_|WMnjo|6dVVw=0~ChX)feycIHq zdUElI5+YJp?;5D7-ex)Fn+OcKZ^pqHbCB_U$oQr#D_dXHryaIJ!}q%x^zUp>cB$B| zf{TwOa7!yU_0%WA5Vy1@tTC(wW_KK%Ifp6E`tUuSU8=_VZfTY0CQtgNX!PV>7K@~{ z&>YR?DBrqX*A!Pph07Bg3TG1Olq)^%s;a83uB>#e?jmD?>xJnvcvl>pH3yAe6s+~~ z@I}Vz5BR!zTc|*8wSf%OPX-y;h2Ls8HmDq|WFm=LeaJPQNl#?b5IHCl#{W3&`~U0c z?Z8-1PgN5=Rn7ENxhd|Jp{L4APgM&wRSRd}=f8xxl4b5@o@M^Xp37DuqLB z;HX#K6?`4O`kLz6P^;h9UF~V=Z3^K(rCUn`#~K@vDp|xG47oj}^)A6tn^Pv>DXp8d zkbo!DA1G~@v=Ah)a?(Qj1IU=tHN}FX&PJw2QREGluAV12%1si;0Kc!Rbi;hXvD7B1 zJJ4I&zCdtPS<{eKlrvb`ZI{&>l#6XE6dcR#(r~#xn{s6+O1WMeYZaZP9X2X)5-zp# ze8DkaOY3TC4>kFU_gi?~#dn)|ZeQ`87G8JpU4ZB7ZSHF+edbZX?5$cAa?iW>0>M!P zc%4m~=8ajozOH%WFh6!Cns*y`wg>$DZOq4kTnb=d&J@57l1xGPt;sX3OY*a+I(*J*m;V9j9r~j4p zNVNs>c{-wgo=z~9&P@2jk&)Omk2jV6NQW`rFh^W;5vCC14T7upJ^j*3W$Y;CIopk8 z5dDlz8c6zbPAcnW{)E2iO!liHmbra}RT`bARPa z`8GbmU&lYhA3oI&{n-m&#k`lB+{w3$?=(x;c=uk+cTXavyY-gvzRAR7f8IrW4|gn% zyh^C$DLi;h*5`2Dm1FBp?z5Y_AktaaR1LYjbWPP@>z-?ovGL2bRDqpCuBnOZEKTgU zV6$uDJ1p32n>hTHIREQxRQQt|6&?op2Gp&9`Z1tx1Jvz+x&u&m0_rY6?FZD|fVu}z zKLOOefchz*?gP}%0Chj09styXfch6e{TxsrG2Xstoi3OVQ}N zd5j^07OBx?F~qd?1k&_jLyxpt>tg3^le^eT_|-%jbzal)v0)l;ygA?)Rty;1GPjv< z8A3X!OQbp+id_cPuY_Xv`YWgRfHECSs|^@M`+#W+Ac;hg&=J%~t8f@u89}2GMixon zZZ{1G8{ml4>z8NFT&e}oYRn<$|0~!r=Jfo^f7LGh?$sJ9?;SwB3#j)1^**3J0Mv(o z`Up@T1L_l!%3lbm5RLcu2dL`-bt|CW z0MubX9U&>_k4UQMEkJ=ba&ds-0d)vaK!fW|KmiS|qkwuFP~d(kt_9R8K-B?iHK6JN z)qtP>i`g!Q-OP@#d)e#QyVzf`&$36^&p94F`{mpk^yG)RG{%<)hMhZ1Z$B zg@YMw;jw5UmdwAodDac`?bW=osU!cp_yj5WPLpT%+X&LvHLnF9DAe!i z4K+6fy`d(LC*TbRomZXDm&@E1uh$borSy4c9aYxDg*%_C;M%!i?n>?^?jG(j?gj1>?hF1xz7Bo!_wcvykMPg)pAnD3 zLP4y_(_b|B)YkDtI8{H9ZW$j-`^JXGOTT}SAQl-S(O4=S3P+>K{5KW|;!-0)_UQ;^ z#uWF6Xx`<8g1E>?9-fGgSB4_v8QfFO`=vFpN>6;)npmwT-e*m$(G%|}5X5th#CTp! zi6GVz3@nw*Or*Pa#gc&xo@Y(xmp~l4OyF`kxwK3W>ur;J0*;zZCzYv-gPwphD z;_K%L;`v5mA~rVr+zSP9zQGzz^~NJ3srC}FF; zfKkE#tTNQmcaM*bqBlYa^-AEAqx-TgWabHCiIK27n%2sj^%ktc-ATC$3l#sKZU+5( zlr2Uhfd4}M{3lRv{^k?<0MZKow2hXc?X(nyXeqjsmZC5%MT4{yMQACC(oz&t=KsFO zFyG^=xIy;Xlh6r1!D}BUHO$dw>atbFRGqf94t)+22^w=LZa5tz`_NhpS(DoIpzS38<$4^)#TK0o1dAdJa&B0QEaS z{T@)y0}32VT>K)SUINt1fO-W`uL9~dK)ntqcu@0UKpg?pn}B*t`TkEZ{0eS68$ds% z`O0pWniQwEqC986?DSSb+v#mb)v;}jBb?vtHpP*?Z$$omUz64=8;OeYnzH;U*ho|h z;hof-L~D+3D^Z8EPXAc88y`y#0w0MfTkdImEH8l{OEgqhdo!dVrZy&%h~C*HcD*x2 z7S%>FmZAb^U5?%vFvJ#+nnr&AXRv!2a_7&n#{T>2Ueg^ZPmTp1$=^#W?0BTOm7c0L zdcoB9(NlFLJyqYPr|LV(_x}cl`lU&`Z|o%&RZUtH~?No1o-J zVLcXBf4wf5P(3L^go6e7yP-jrAX(WK$)iK5Q=qu*QxoCg zlz46~)pBxm;os&9&T_l-#GsfHS7LAo;}U1*vMezk87chVT-iql@xUQg_&>R_j}2yq zL^hY@<3mGeFjn~2d4hA1UHXK0Uaq91I42k0%%CXbvL}P>;d17j5YNe(mK6D1#_Sdg zoPx8=l!R}aA#ssSs~R_y=(MraxSdLEtkG_!GUfaKFvG9owy+uW;|#d6jgrqc=n9T> zIQ>Cal&+I)&=t)9Q_vNStq&u^Qd`|%jFBXE(n#yy96N&s zwz(QD8_P^G1jtr9kjf$fU69q2fixRr2huE~gKU&qY;Q$(cfd;_w6xrxu)P&E1I)pt zRW|wkKLgkQgR~U&(o)n%OVLJJiu!3O+C)pyW?G82&{8y@od2CC zvqtRp`nxit%k=J?GEGu$a*0q3bWN4ZWnSaMxipTJcVDs8f#;8KCB(C$9DPKth5lqb z9ivhWuO4GH5bJgkIjlLT6xH6TYQE5Lc2@nJkp+s5O>uNrp$K zd5u@Dr2jOB$^hUsL$p{K5S5l{f#sJr;GLH;ET0kF#BkN0eqbDzGX{uZh6>AcLZ+Uq zaj}r{{KpvH!L4Au=*M(i*{xDff%?!a-z+~fMx+}m&rB-EGh+#OV|^m5?*&)F_e1Va zd>+4?5AZ4eI{rca$h5p4Cc7>c#G-Qjr56fKWYRdY?_y;hM-K8EDKGuT0zq6fhY*X# zQ+U276i@D4Tt4>^Q4q_>FsN_YNKJrd|91X9DXbR?8qtgYK5V>p`h zl2Ax?m%$UPGEqK%_d1kwfXs=@w#g}HMD6DaMf3tt{sB}2B?Nq&8$x$2D-^`}PF*A% zjrhjmY2^zrlV5@oYsp01ty!#n<53x7W3dFjTV|d!Ul5CpItr(&Yte@=5DY9X&wmZo zpXdZ>hLZeO12aT1%YtNGjl5PBR-8_V&c$G6XedUy7AXwnSeo+uSAsLdB2$raXX8th z`7&zerE{!BdgXfop?tjv)qsI=aC|(CZj^L#kAgFAZz(FkNRR9o4EchAkor|sgk~>- zTCfl@BZO|4P$D+AxP103crR)Kaa^C}v-9m!lejv|XU|5>xv1Qdx?8UqTn~6+zkGIH z87in4h(=?H@Sad6wYaZpl`E5qp_}KTGjjfKNAWN%MLTFIiqleb87)O4v=k+1DH^4v zXpEMkai#y?%kcBKI<^n}I0;ww3aL*U{d#JN%nc@^7y-b;H)+@ zy!HA$peLnT=b9pmxm%@X1HH%XQZHT=!WB@y*@*1vi6`CZB%NNe&)Rv6#*-jsq-Ko^ zikJZEVgO-C3TjQfe86a8Kkiv0OFt&&>C_1HnI^@)G)@50i$lu zR3LRh>-hg_hF`$dv;BA@(5bw#UTL#7#pra)Q;c$*_lHMfeG?Qa{A)R9R}>TMCybOd z(;Hxu-5Wp!GBnLGx@0U4>&+7x8n$9W*0`XEEj%O!5Qe3GZG>Dt0OmZX_`%B%ORNyX z(WGg{Lp8?*WvufZCeL`a88_NBqqfnJ#!P1Al+CDHGkG)WVqpBwoRR(iowO7sX(>w4 zQk15pC__upE?SCq(^7OfEk%2j@BcFlU&oEG`_Ydx^~!FNwrOh&<$cB)1A6O?#Uj(} zaF1Wq%u6;e>hUqtiyGVFf&$jpG!_D%p=N0-K3Gle7B$H`3W<{frXShclOGab-zk!l z0E#wgKx-kV*Jz<&CN&Woi&DVxdG2!o6dUZ3sEGiJSK4CNQAMCLG}bqnzf9I7nOrNI zN}9F*|7`%qKsmpLZ{!Bq6#8*09^DZsT)>EOWqL=%JoMiM{Ym#|)Dxz0cVA`m+>ScVz|B$IZ~_wm&TBixp7kO0Sytro6Ac;7dGKF zjidXekk-28{c`Jyfhe`sy~DP3NrwQ<7}%y{D{2xJhk$j`b`6?yopR&KOYLKE8qj{8 z+Z6yAVE+cdDdzrv9rHKl%!vAbvM(G9L94{lLxB1npneai=K=Kspk4&jOMrSAP_F>$ zRY1K4sMi7Y2A~cD>Ik6T1k_uAItr+_0rd``-UZZqfO;QL9{}n@Kz#(L|6}h;;G?R} z{k`WfY#}UJ9EK1wlY}KCAv4(k(TBs#BpI{JI17tZFCc-WAi;o26}6$y*7m(>T`T&m z3$HG9snu4rE`6PGsXmvs&%S4=EeZ+>xNoge?YYa`bH01eBw)$m%Lfc63O4nXe$^d3O(1M~rlrWOEH2+(l=IRSD3Gzp-3fEoa5 z1ZXxua{!tP(D4Ax1Ly>RP6X&*0GbcbNqYPLu-gA$Azw~}p>y=bQk|LyN+$JgtLcFX zM*?ft=)R7@uY)VhDp+4ZgQd}L07s+c(sn#=aoN_EPx%F1_2ajuiF(mvb{KAE_^ zsa&glJ2z=*8FAZBGmVU<0tlUwIwM1L{KLwc?Q`pt8HtQCv|0 zRZK54bVhp?RTJH6tF954X8mz`qGd$eWz{zJtuw6GO>-32Sah_tY>Z9d3^ng`N3oBm z7SYxpHuY-Uj^Z+lo<1x#6qa)A=?b7w_P`h$`gy@PzXV3OfX@%myX{$Qe^9zAF!)*v z$#^%^(xa9SFY?*bR_iD(@zWa(yjD`_a9Ad`mA#GlspH_|RF~+s>g4>1{N9|jT(tKX zzU7`3bq-RqLKQ-!zmckEx!V3?=`#uKmp>r?eU*;Bjj1lZ|4@=!-J|s%$^-|qb~Vza zx@=7pyC&H{L9Nz>IBh|#%*_bz)qLKKd_(v8UZR}kHrfn_nW{i1JPrt`naejSikryBEtM*FU6s4Of*eJ)eK~3t&gNxd-67&UW@ZC7GlKK->meHdbG|4;n?)JAK$M{iMH#wCl%a2mGSnx^&=ygKzNNnZGgSXy ziQFikET1m-%HNi+lYb^ZE$@~;L=H3=)u8~2qh7QHU5#!*52D|om(YInIWE96@jN*n zx8bGuBD@}7if_dC;9uaU@DBXe5p9CR9y!>BlJS;EEHO1#-H=V|LnY(UP)AS+Eev%e zJT7%7HR#XtEaIfCXVQ!=m?z3f>t@mnFP^8)G|hVLJYFaEG07P(ou|fy8;o>P%QGug zjlFO@E<=nv&a>2-u+cQdI_x}q_{j&yVUL!aSgbB2S$H4C(Y8=W;r1zbK7*BLYeH%3 zXil^!?f!Uc;e#1T_n4-WaUGTp2hekpddr2OSUeo*Q1?w96Hw1DjD?z&KqA&QCO#aGLyK~* zq5BCM8!x8m28TW)={Y9J*o*ObCdt@~@dbVSUm)SJ@@Mi$B1qaee|=^wRIvt(g+zsR zcg^CAh4j#F-bjca;%y%XSwg(o@n27>Co|5kIFpX^#YK8|)o>{5k=}NXm>KcSP}Y>Q z?8w92s9;=b-2}s()7qCy{W-$sX?1xi<$>mDWhn#Qz0?22+%n1L_c+u16|7;sJ)$OV zv3pZkCT?+jJ(&qymKj_&Pmg5=7a0G4D$S7gOK2o=qG_lB1xZ`K0-c4vi7rDwLU&91 z(IceAe-XWc4xqo{VR$^AjA!6_d=hE*7vq(r-QSEa!B^p%@Ll*p{5bwCei^@kKRlE_ zg4=bqE;S3ce6u9UV@+5_pfrxc3n07@!pk7M5yG1wycxn{?14%%Wn!yJq&g1rUe{R~s1K zCP0?3aJCs)oZ2wn_|l}Z^HBG>i0JUH%7MulQQ}$2!ANn)t(V75&=k$Cs)4x~Q#G@4 zgVQx(C-5v@Cs5q1&93T0?*!7>n*($LZSyxR{(qkwlfF7Jzk_`o+u6=QM|)>G7X2BZ zzW}ropjQBT6`)-J?FQ&IfL;e^4?ueXdIO+00on)9et-@D^cFyG1N06+?*jCm-u|C2 z;b~~LtPnxm(YGwMDdT2vEj8T?BI9?vrVZGdFxla@CY&%{wna&#&edj!7#xd@7DdPm zk*?_jx0TvV5qI{slASNY@>-KRC)0mZTgo!(IuJ73vTFvfoz!Mq@*D-)tV=g+Cwta$ z90TmkOP21!)Y;kuOye<@fL$vGoovM+_2)V__VXOUY)sqt{~ihT;Hh{UeqP}Ff9&|` z9ewq~OI%x;IpGAWJ2&>M->9tZS+`pI`mL>ns4VYYeMaWPxBjtPOFL)jY4GE>qHO5u z=~eHrA#=j`d`^l)qqYK>|__qvr;8C@d}>H>P&1=>n_6|Uc1pnk7k zl0DO3CckP%v`;kyS^xb^M~SO}Z(Iuvs50L8isIXRL^Z&R)lgR#tg=QFkSk{C-~XE= z^7meOlKijo+h{RL;VOL1;XKyvVSVvI{#@DHxq4QY=VD=&zAenscZ6BGM3|-T3bXV* zVV3?)n5BOgX6gHS|G!tlC1{?!kO+f*kZ%8GZ3TUG%Oo`nyUf@aDin(;p@@J_EN;tw zNsMuK=J0OvdVOBEyJn_4v~H!lXO%m;{ERiEixuka?I9I-jU|FuzdV!Fw>)+J1Z`-e za&%~88yDh$+1q>eIxa)~N|WTW)Oiy$Z<$JR zgueNeshWrSVzGhYofVr@EMk6 zVMvUFAL|^QVWMaC>b0F3(d-n-wV5Q-|L;VNa#WoEKbe-sXUg?_Sgg@-aPW(Da+YEx z#zC=qeOj@q$=S=3oHc(iD^eHHmm&wg6vot<<#2B}FD*IDZuQUmErY@ir zcrL8K6XEtqQowU8$@c1N_8E$Ej0${%JJEe+XLZln{l5I#)tS`M=woSy^rS@oz9{XI z-aS(5fZ+EJ<2GBu({tnRR z0DZxtQt+fphXXVkpd5h407M!+d2|Mqy-I#SV@nKyLu_CP4cD z+7HkHfZhV=ZGheZ=v{!`1L%E#K2XR1#b}s>+R-v}Ci)h-5^X~dplN74dK#U8hLLyq zO`MB9$CGh2J^=@C5_jSA@um1?{PQ6n>3i(Z4mRMKAN$IWleGoF9?ei*TX^nJjK*b> z>hz@FGD-D%((jn020iKbOj4ts^gm3}Y(42kCTWhI^oJql|GQ6^rTc|h`nfPmzYu2W z0b!Q53$yf~FiQ^!v-C@(z5k`;-`pwWzaNnP|5|wmYC#X+a(spUc8~c)Sbi=g*1iyC z?T3W*Fk#kiBGyItox)|LtbnfrLvJA%hEWr28v7H_(oepM%dQ2 zUB_o*$lc+V%h0;Pt>p$=YSL(e5!}<=SE+etE1ACa;B%aNs4L~z_BiI1#h2Ua*cwC& zw>q}i>1#;Krayb0?$1^fa$U9PziSo@^>1o80#&SFE#E49}}DEy|rF1t&gdm`Q52CJwokXWT>d$)dKB7 zRjVoHZx0C|(_kUPng?VWybUZFR*#`G+)BqFEs9Pf|Jm^9@SY8%6G=PN4sM1{1${b! zmT*)V><`x(q1pWBV`P9K6y!c1Ll1uce@4O$XqCK`2t)QDzqK*ES0^4yDE?qDCg9O{ zIgch|p8c%_z4k|w(KCN*;dGALqs-7LGw1}Gnw4N^p#U~M4jaQdsMUgV>}(7@rXCob z?b)pc$V>})!ksjbr-PCrjWeYMFu;SVIj3qyHVXUnvvrrqhPe(w}bwzUN# zi#qbI$;Qo8OGfj4*zdh!p=ijT2*vWQwdLyMguhuy1X`77IO0`&-u(OO9L}Zvs_5k& zNcb8TcnOn4ZT@z>{okdw|6iAXEbThlKe8i#^vzF?A1}Gg%GyOLYjsVkpolhfhNYs` z4ZFdig>b1Ms!T<#>zVD1KRr&}F)Tx&$e<7lE)l??g2RDW=5d%~vO~g2yJ3o?!L=!R1W_@R`o(j?oN&w!f~a33kV*9_#;e zNNx!?qHg(CX*Ut!i#0#(GP|Cq>0QrIv_a6bv(98OEQ7A6{_Gl=M`vi6Pi=mBqMbsc zAPUxbDu!hah1q~YqlJRgPGPnn3f6fjhGh+N0rkdIRmv=}d^0|_HuDnJ5 zzI?5`O}H|cqv|m&%&GWckmVX27EidA3uhl#xLTXcpv`g z%l0&ztpCAe@8wFn$3blZO z&q86cokFc33X^OUYO_$N0~Bg46pHK=>I6|JvQenZLZKc|sIyR*WT#Lsh=O$q3&S#p zLIa>s&r;Cef4_w1qAl{HvP8tgJNo9O%gi!J>SYk_@V6>~uz)g%S<1k$49dW}iTwm( zXqb<1Zo1U`I+)bI4*H`?piP7;=M+osb;E9J?wM~<}>K06JTgC*`LPkf%zi>vY+Jj!2A(Q_I+MU56mB7vOkrdeGwhV1ULJ(4&)qb z_QOo}%lZ9Z5v3pJ_J6IV@2$7?e?8_*Nz9h`$3@G^V}z8mj2th(UX z@l`*j;&zlJ^3)8T&3~{0C;QdP#LwpcaymX`K+R+{|KWk|n2Dmzf24?vb6L$`*wFOl zzihn=J*W7C+I{>T{J+ikh|5fY5uqrnbl)qDb|3}D^q@m&c7kLQlgZ)I9r8|XLx=Wa)yM zWlpY3>XYjYdj3?t_29Ha50YRGaY@L6q!90Ts-ZLOt0vMdiXV6do-_W4(KUYdld9@_3mM@TR zmmij&m3PV?pb@ANU4?#%o<_UTL0pJya0_06H{)yZ{rEY&H`|}VY>(B0WcDFrhEr2K ztaNPJs5JFBv?!&Gg$`$lnHUXqsB2Od zNo;DyG3&VzokVXC3x$*g$)?inc@C#5lc=;s0B9z<9KD@)5-wxZs=3X0CUffGAMNL^6evKFj{Z_izGZB^~&3%SBPk~@cwkI zwR#Rk$)jphLQxT(v2WNuaAu5WZRJf3<`b>Y{7jS7KhqdmQ4tQBO?(c~h&x*oV`?yy z=e^^lN|QpR(OF4$w04kT^5E~6pb_chbXb@ia2%}`4JHt{#tfoQ>Ou6zCJO50IWemN ztmLqv8Q?ixp@vE3#Plq)BN?V0$&Lv5HzH!qi8DA%4C|vtjZ!B9Kn}*aA^QFANnw_r z5@zW)!Yn;4%+fQ$Ed94IOV0|k^qeqD&mY_W`$!+hcG)mcE{n>5^)g_+3|KD**2`sp z5I`89VE{P*0vyUm05lSyQ2+t9<$!HDU|SB@mX8H!96;j%ngCE9K=}X_08|LjaR501 znh1~!ph^1t-43Ehg*1R^pElu~hSCs92!Q~J!~ajyKp^}C zXxf>by}g;eSs@&2jPrObOFQ4r?DxGpyZe3f%{MbbTzm&@Kt$Merrf0WOXw%$ak`ki*ICcxTb&I| zzRkIY$**&+W%BLLMke3kY+~~3o%#g$o(^wI%gS5vj(k17t*X|oM!S4bb>-ij3%!Jb zM>GTIm*xwHecP6Az}o`$1iQ2@HR9I>0)dDcU6RB58QpK;v!u2Fax)QU&)acZb>v5+$=<(}A(vD}(g7r9uzxlp!XWu|1>UbG5 zFle2zi0-3zyjFp_Xima-M1dWGc)mN0H>9Fu2nw*0Csz64db7MN6eB6GoK*W8t?D z*D;K9Fwpyl8yMPH49q^^8}l1@0HR_5jPV+w6hNz`5hwtkfM1lFkDvd42wnm&f`?!h zj?%vWh28y|lZrbWzs2O&r*`nl=c3MRLb$yG7A z^O#&UlT(=7DkfLQ{ma zh{H3j~Du*Lq~m6A+GaDyVlVKFmi(y$}{sR-3x%h z^cr3OtX+pR-5?hcMLxmP{{{Yf^v`;W>Mxw6`~N3V{Lg<0vek_dB zW5PK7L>Q;Xg>ia<^#5z|{vTQSYtoD8utckF%Jw2di%3BxjHsaS$)4VBkv zj%@1}(P`exGXM~4OKYeW0|1pU0d(iPOw}JNs(yqKJ#?{vh-Ye=XOtEA7g2OsjIu(B z0+HDN_epRA7?-a{2PaL+Me=>7u|G_VeZ0RJo=#F&vspkpY_JZGSwt|}p(UV}ZpB8I zGoP(UzLy6pA{N$#99WTg!iw-<4dgGeE}d^|u_$Tx@~O zlo@pCrg+Vh;#fT;j@8rRSp7^KtDlQwbyOUyUx;J%j5t=$68(R(1nWUqz7idLyi#r` zA2P?et|sGL_-j0fOqp#_5uXxgU(c!# zqZ*~@2dtVN7sFNow$%hpg}ayokQTvIih)w4NSC8v_1oEH0%2{mvCBBHxON!_)@Hlb z5@?rQWYbz4yNugfR=eyI@}EjBxrdDZO(Fe%v-}PDu$-44mY@ATY;op4y3Xl=NDxP|1ctMLOx+RvV$psL zZ`^oh&tg~!3bX%phWfOBLM8M4&x9+0InkeFj2Zs=m8Mcztz&;j-IsBMOd%H?Pp0a= zgkw^4O5}=6HZkelzpm~^3#|>+{BsMf9no%BiF%K=%LZV^#q|Pkb?c;l9ByNo&Cinb zY5Z7ZcK*JFqMrRbOEo-W-%==Y_WNuheU3g$(kJKRc$|`1`Hb|&bbO{RnTOAk^a=Qk z82Ze63q^IFZmFhjb)IG^6mc$M3t{QYSrU@oc?KiBn@GQuk=~t=`3$>H4-iRN8c(JMM%_geDT zv!T4XK|wY`&jDp55l<&Db0v#UDGklk#&ddMQ|+h^uE4%B9nLWEmHCI$Bhf3S6AKS$ zy#-K#^M>+r3)so&xOs<2P1F-Y5LpY{qVUH{j#4ViMRTS7k%;1=PlUc#UK6}ewB!`np*{{fjaIP ztPN^;3(a_mQut&=Sw$^<4*mH0`kbC~$|`Cs^iYd)HIM9eUck9Z$lc;>;nLksH}5hY zr;A7SI_r7lR%Zi`+~!=vBd>F=<&oQ+jXZLPvx!Gu?`&RHR#8zPldxxsVniQPO~(cy zSC>_I=@ZsiWU84;LXxS*wL~T>Wfg7InbKI~m1Px;MuDKmuQ$8q>*@-tk;pkmiT=Mv zf~!HFJdO@dK+0W~kD5^~SCc3g++QI}`Dp&Wu!xnQyEr{7N&?)g*E{;HEx2bjXGfo^ zW~#r-@)0XW;wu-4(a-hjb1}BffzeXU#JDvdHXY(u8|(R*w?hEDPTM9dxN1ya&HS2> zLbk<q(ubo*RDy+VK<`3OM0^9Jf= zfUeJPv#x}XzxJw#xf#72MWnKuM_JZ1ASKxMf3E~rfc5eaI#}=*J)Xa8spQoki^{<& zhu3&4f~jmGJvtmuXez$-LLQEs)qiR}5*BF;SE}`Ku#{pRic9m_QmL81j8r+A4VZz% zaCRmw66AHZAQ@R~ATnhbfV=X$mPt+o5Iyy|nkt7AJ@%mm?+qKEuD3k)n6WE`G@(m> zO;L8M+88ari}VG*^QXpGsx2NjIrQ7H9{qV;*5n_8 zE^s$=!5bFT4k#u^oj8BTFA=*n;@G`~*tLjb_rHkUhP{h&@r7bHo*ZdRPfhMbe-rzM zC#NS8P2<&1Nz$1OLce0jXg#wJY^1pNRc`r39CQwaEUzQqVh( zQ*K*+1V>cHaO}huJ)%-Kkq3wOBx2LzEaZ@_flNzcV;|E+81p!kkL$f(46e7>`;80) z#39>Zi_8?m29|lA!E||kH};2NOpS5fA4Yog>GV`u9I7!+mmW*Nbm@yCDb`{oo%&)~ z2JPQ~}ey(W&;>*84b zS{$o4#Ibr)9IM|D{eM7$wZJbY(Sfj(+mjzRwMn9=O+r)q5(2eJZK*by#uCt9SxO{I zn;7Lvyeq}Rj5^txA1lDE94NvKCo+kwIJix=s)Q26MvYJ<7-T#1qq?h8W?h|;nap$| zH6jk%h4$tSEsCAVLziLjZObQkb}G6Z2!l9y>Re4{N@Cx3W)T`3dH>xKTnbjoE_Cpr zuWcqjK@8h!N8_Y!*w)f+)m9PTE%$VKDm#TE&r64O68p1>bV?~1-Dy=yT%#NKqdTny zB6X?Ubbb%92CE&FaorlMJu%kccxw^7@gP_s^R2=S^D+uq%$M^piyx{PZ~IWp{1KZC z^BSu7vIXWuRRG?cfqH3O)<|7Tgbx z>aqT`bkI>sgZK_iO6rP;{H~ z8U^}o>P$&d)4|?bZTa`aU(zYpbD;e~MK7BRu(#J#Wl$4M&}aYM^R&l2p%~1Dh=+ z)KH5vU5W;gNtM04DsE?%SH(@LWO!9P&RJd+52-T4tKxO;=T-5ND*JdOB@v!su=_fKdN=Y4rw z9IJQ4v3ge=tKW)a^`1CZ?~7yg0oMOexD&Ex~78S&Z0ASA%Ohtaf`nipw(f zR#~ICNOW4EKB}dKg8h2%wx_0&lQ{X_|optlLJAP45kNZRKjz4lNcgH`kho``Sj{hqIy%OjJ zUxy033V!!QzwW2fNt!M@t-3N-4NMbOQ-=bvewU^VXV7bvU8}fA@M?T~IIT3SRggux zR-sAtisp+(!@rlpY1%Fd)ynuea|%7-$TfojV@!~XFP=kk$w{$K~@>E!TC zOsCPMN7uUSuf0~8NoA5_sl*5eYyHYiU1imkNzSFm64{Z&L~;^i(F>z1Ws(OH$i6QC z3IzL9e32D*U5qYrDgPo9=<~wAhFSei{QfKQZIXPOd|3X0d{lk|l!0?W1K0>cAP#21 z=fPirZ-V>5W8h`*9(15@gckn} z3x>C(&VGaMN(ogWhQwE7pjuZ=dS_tWJie!{} zf+Bec>8BLQOGr;rBm>V=6v@EzG(|G-{EQ+Qcz#Zi3_M3El7Z(JMLdRB-zygK8hDz-_3>p5tNHIkC zevx8G@IaAb2=E{J{-5$Y*#Ex-Y}ViSI`qze6&wLif!82}6>tsQ1h>Kz{2csCc!&HB z{4RV1K69eqh*RnJN(E0bGw5COffF_Y>u7P!`vqse85CIaTW-M@3e<=ijfJ$3&)=&? z7i&y)JT0f@oYE^kR~P|^AZ6U&t*>7b4u+xw;l=kAMgU4qY0+&Vb@5IUOe_*o`@0M# zm3X;3ot((}Mn=+!Or~a#Lz|{(k?ioqgc_;|acD`3HZzT=V~HBC$vQinoyi1KgxrF+ z;VhB|X0n9dj5iD=bYwh?btN+KbaFa7m0ogiDXgU%q-KYekmWboi+HC|OpXre3;Nwv z%!m5ae&;>s!A(>iZ!V?v^>;^mi2wgy;{U%`f@gs`*@GtneUy}&&S#hDK`pp%wSr8M z)?JQUquM|$y71c|5kE$qrB7uMLGMeoqW{ee3f`YGG#uZP$SRFW|5R4-#rLG9_Dv*4 z#*m#xuV81nh&e4RmCr1b>Wi4`Da^rsQIJ>JKqeB9?qeH)tOWZ%B4lzA6Y-vWdYL{Z zjuDsZgW^mp3)s4gfL=XEI~TU^TE}T;{T-g8dD)GE5Qa3mb2(UK+0W}-%mo}svV8{^p8fZ_&Do1knC55j8ej!nHOyB*1gu)y z??G{{zqjOj!2b%+{yzs;C4p6-7tEl({{7$uSdRMm+u=d@Rrvi=YkZzc(yFqGO~wk6 zy3wz0iK&sO=I>K|VJ)EgqOq{LI9p#<(akA^SDp6{^aq07v9K>19Oz#>wYsdrXH$~0 z`}f+g#l?dCQ8gU!`PIdf=a*Hiw<(1ex`{;=&(@YzY~U2Z%i$OcVJ=SFNFOPYK4l|) zgq41J4yJ`$ma#z?VGvH(AjCV8Y5MB%i}z4Vhms=tQa^e>XgRh1r*ST}Sv5|cOXmN4 zN0PoHyW}s*?}E$bKl}gVkOa+>{JJ1M-w?#-9|ZCFrXW85D2UIUg81Aeh|jl3{EtgI zIp2P9Nl<%yTM(bS1@XB@5TAPm@i{Dr&wYaU{IdhxAOY!GNxD|P4tB%t6Z3W*0!Plo zKDD6kav2~#HGiNRZ@JhR)HWagEu&E1|MEmU8`menG>s2h7g=O@v&*TuIzy3OPm9*E zu48l0cCz|%b2I8CClqtVh;e0fDy>XUWirX#6A5K@cw#1zp%!CgE^kJvEIQ)A-c<80 ztYPj#XkbtcFYIj?vb_yDbM`j)dpfnyU|3UQ9<8mbb94RgaU1l@7s!$%Pb`(3xoz?a zhhr02S;7a&~6Y~xDLrvm>IsZ=_tKSJ; zWhh?#xNwe72wzF*r@}ctiQoTKa=j!+*WslMfnYI8dwAR zzy$aca0mET@ECX3-6L@)G6Z2F~qN+{pm*B+svP)Z9|xGM*DJVL@N0TKwL zkpnFpQ0{=z=HuG?t_N*7ddKzJ(%wJ2tJSU^b|}#XXvX@zJ2U^xKmR|oGym>9etZ`` zMt9>heg*#o{~Z7NVn1&sa>P_0zu}*a3=K6dC06Z3Z@96BSlWvw6D;)0`d7&!i)bim z;kc+f2>&Xo@RFtFI;V^tlLe-w5ZAdSl*D{ai8?ofi-3cYFQ*Sp5}6qsh9p z`Z;;!PSj5)bK;q>o!(e1z>(llvX&qxSWGb{&jmR2Ls&VPt(S+1xD8~LLMD7SHwHmk zUb7CD776<}2-`>2NMyoddr1{RXo4&ZP=<Ug;&j0G6z0^e> z`%})enH;6ORh$_kM=6v2imEML&$ad|5YH;T1(&j~W|~^%C#~~oq-mp_>8{EQODUbe z6ZtwjP%3>km#4KkJPE`n;t66`Gs@NFpy!j-jqC-U4yr?Fgt{p(CFL$LA^sG4>T9am{Gkr1 z_Lf8490h%xR`H!=PlvXWzK7n4j3iOCK!{2nZ=<)moQg~vbJh(f6y?hybnIRiiaReM_C`Yf7DI{}Jkr(#vjWh^PTT>sW9~YOu7lq=`f7IC=i3pe+>I zf==Tl_!}i2<}bNF8>iZbn|U^sKHSV(uNI*VY7w#%`#)vWeE6@u9xjKdKhV4A*HITb zg0BQEKyum*Dy>NR9?WNui(S@&5Ja6Tymd& zN2dF2PP5a&nw`D9a3O0MS(mlXYVufJRkx92XNCCn9#aqNF>he|Y|d8J*jjz08E-8T z$9DHS%&ggCT-HU-+x4_nKi-IYCqyRmU)7IJhDG+fS05!S9VWtZn>SQHHXl1DMj9~N zH&j2e0BmkICov1bP0es8I@j<8&>(lJ?OD=)38c(G2JjwxR3MchTFp1^*>Jh#$O=ji*ne zTaZKzfv6bjCacA|*>89wk}wc#Wol8M!#GUqrZi zxkk5mbuI!_uQ?fuM`BsFMr90*8T9ivLb_`Tq#Fo?{gJ&z(#h^ejq(ViLBF6?qg!Om z&2b z&u@u&_pY;(c9|`7Yf%nl_hNhLLikRql5T}3QoEIIrMJ>I(1+zE!zMpbg+ECx-6#y-bqpT%EG9f0%~8s-EMIXII8c2T)!>b z3o4-+bH|bw0Q0^DnmOit%%!Z!!e?u-_1HWnd(9@mO%^JEk?l~9)iu`w>XE{z%X3h_ z4s1CJqprwdYayT}3Zb^KtvSlVLxB3%vK_NBRHIQg%D)15U(svktj@=4QwZu7K>TW9 z#0~|b6A*7NOnJF%c&>UMM0AU6C$0={g=|2DkrbUOgw_rPl=P6AVL)T&Y33}?M_Za5 z?K`2lRV~)cab~fgw9hwb=2#W!!oq%EzHMcdg{r3j`Dndnj!}W^95q^fy@1>BH$UlfQp%6^xhtjg+lHp3dP_+S0LW<7Ayc6anHlPknW+w$ zN_EIosY9k(9Wph7{htmBbs#$$M*Gnn=n3>H`X!!*uf%Kc7Q6=^!VluJ_-CJZ;JoBM zFK)JG&b-W+;_&o&Tx_q+F?a7=%^X8EnC&*X;VmA9qRn$R7m0#Yg9W16+xS%dMWP_p zrUFsRmh!1wMWP^;yH+!2K~7XBpJ;307)Y~CcC-eGv0Jlj?J5=r>2?>26B+Xti-UAr zp*WGX9mV1x9h<{8A15$(O_3-_6%*F~@1v-FbU#{*D^zVqDNlMcF}B7pu^tf4mCLMK z=GQa#*&NGNQX!g(9Lp}1LtJ#dJpWvE2_<_3R(fzUzB*On%PBBK!*Jr1Sp}MWF9#Hk^|2(<D6ghH-nQ0g!aU-Qbp;Y3Z!}&);S5DcJ`&j_zG-{Bv4D4HkZai?oXk%?j&-sL zrf|`=ZinY8%W+{OsUvAjUrP=PTu$1<3gNIo7KCSWuzs$z=Pg=^D5CfO`iW5lov)Y z>RB4mUG#qXHMAQ&h0F0`yb0d^Z^5sT=s(#_I!m-hqib|4ChlzEggMB0W0OzZ8MH^P z*60j*$t{66>DbRFgTrezx&?U|Si|R={-J{Dg@fPEC;h`4HM)8Gawje=f%D*Am<$C} zj!#NvkpeM;_VLuL%XEuVdvo*TjbF!-(Zu=YEG2Mr;W(MmjFW3loYg-}qR3g|xiRGU zW636^_Q6Y2zUMpTtKuZCVE^wJg%{G#!R52#_FtB!DyfE4Kj@U($*Wp}RyT|6y6Fpy zazQnA_P8<)>M z36vEe!H^`m*n;w5p&I{o}JGodixic8>wd`OR#hc{9 z>{$(@XsaY&OA8E4WXWfYNko`oE=&%nfnM1gi+RVGh;Zbb*GJ;_1ma0=kcn~87zg7o zX^)YxzJ+DI;YhemysTVF@)te(FB^xRQ74L~y-wQ#q9GaD!b1^t#k01sc=$(<9G}P9 z9No@^Wek%k-l_uPQ3wSFuAxXQR747yY%-E)NMA?B2tg9wI;{~T5hp`2dC=7r#hM9Q zitJoPseG$MQ6xqcsni)+7wQic|$IIm)+$}fDp&*pqZ-Cb&t%v31*0V_YjK$dh)u2w|52-;AoIU*$qFF< z%q0t!PFJl;PZbo#2CX+$t-iuIQueW%L4K|Cg+1@;&a2%#hNhermj$=*`1qmMS$5-tQLawB4X# zv7Mu(oUIp>#W;EG6m&&jTkgzM?yGC2R9UTYHS@*JW(I!kZOx3a4Q{;2PJ#wl`(%Sa zCZ&+$%1n;ZAXz?MRY^69GBD`0jWQW{Mgn0~<&FR>2gYn4xa6!zx@@({)HmkMa_2UR%?YijO5nxQUe1jdyN z+3LDD5)O_D^T&$rI)j`YTu;v+pW%3ZdW6q#WVszNcS&}kU1-D9g?Y+7CS6g2va&YW z+EYc8#Kr21 z(AUx3=m3O3d%rL`fnG#!qW?f2;wiWaGk6KU3a`hT@eoen{rDz)C%zva$7%dJ{we<8 zVn6ejTwzBHg=Fge%6k>Q`xL%^RQUc$;k#eqdqClPP~m$>;XADGJ*@B@QTUE3e2*x6 zk1BkRDSVGBd`~ER#}vNf3g43o-%|?T(+b}Sh3}-o_l&~#tipFn;d@TudtTu?t?+$M z;X9-7r4_z$h3~Aw_kzOrqQdumv1xD=HNBUj%2!iV#T5WG06Ku_&}#kwa3jDhVgv`S z2Lbv4z6Njz;AQ|1z-<7x1AGhMBY-;rz76oV0Cxd=2jFg?(FOT@0q*aC>s*SuY%1K} z3-AKK{Q&m?JP3GZxE=7T0FMLw1HdtWqX5SNo&q=l@HD_lfJY!b zIl<`}fYWea30HE$SQ_9gz&OB*6m|Iz;7Z^n0Fa56oDB9Vz&``L2Jkw-4*~uK;9mi5 z0(cwXR)DtvehlyvfOi010eAy|oWk`pfX4uS4sZ_OU4ZuhegW|B0RIi}KESU4px@N~ z8sNVGwg7x6$b{63_J2g)e+%$CQNF(i_@hui6*S1pD)3sN5$dU;44_=7!wRj)`#iYL z5am)Ol#Q?JDRBQAvHqc+wJxC@XivelR;Z_n*XFn>MFqfo06l;KU=ctQ zKr=uqIr$8(EdWNicf++EpaY;9pp%^F1=p1TR|)M*`wh5XGvV0h+aW3cOxK{t%J^e@ znuWWCJCj30&5UKh>9R0!&X*wbo_vfik`$&=iP7(VyN4l}vBZWB(B|MJMW=0C%WExlJZ_v{?WxK!uB-C7=J^p!oinoHQITV`IGR~A@bExoUaZU zU;UHuwNxd(8YkgvsmRyT;(RTY@#UF}uXeRgyO@Npc9F04;(WEs_5Vit428PrchGh; zj1uSoT8XC8zoLJKYS28i7#&34M1O~lqnFUXp%3UY^sDHP_zJujuf-d&4=3^U_%?hG zegvPwFXMBUwEv6Zh=D%`+imi=_3shOa1Pexbb2f{m;PO1?#*H9wRZJ)>(e}*o3%JS z`sc)Z>t>Js6p!R)yPTFm{j;LSZgP9{&xly|ZioJ4Cc^1<>rYI@mEh4oO^ogJa-m3U ztk)a%4s)c%vo_bpaLsXIbI#G#HCTTYpR(K1W%Ib}SMUY2vnE#$*_}R(r{E;s+IRRA z{dRlpJ^bA!o4MvmV&sq9@f#9ZlZA}N?wWgvDLy_}-0T4)XH^i3dwig=lxO)N1w`#d(M z!^9WA_8cFwvCqAMUEbN+yKYPQ|7Jr3`_SbdWkXgNJ4ndyNr{}vgo`7)6Q)lmg_gW# zqM}T%AX<8#$-&wzY-{;yna^0hLh!jftfRlT+#>iq>&Tb=+V^JQd8lvQAZs?m&s4sR z5GQ`Cg|%BZS?%T9d3*?Qx!tz%9S9u&tr1iPMR&+dtWD*SJ~4Ql;D7#{#sPU9GI!>|%{= zv+sbWl_Y0@X5wtUZZqqGd|0ca%Rc)#$hw>~TM`fV4-hIDT(^sLIjpR;x6d;;8(#eI zYoxpRfA+2gI*#f*&%M{Ok?oZwzhq0^c!gvmS(2rd^_GP#?T)0iR$6&h@**2pc#nxgwK?|oPXYFLY!0P_}h z;G8d(AUQdwI~*Jg3{V(6SCuX$&P+|Y210$FF#b>HYw9x`thgcT)oazR*=WS%bw>q;`W7ld^kS&tBebt_rt5QIh6 zBbErl`Z`&o5rp-?Vib@ZuuOtwP=VLLzlBd}-o5M5SI`6KG4v#QmHx|U&+_SYPG7tQ z$|QS}oY~XmCn|CZyXVWTnWua(o#!Tui7tPrGN-UNo!mnM%O6hX$%gIGM+$QaOB1=Z z;Z1lz33NH%N{(0L4!`qVvpFpqzssi#4&kJCaA_rk_v6`D*fVx;`tYIBpX2yqb9~qI zjA#7tv_DY#6uL`VWh8~QMa$BaIfc$doZPWX4tI5xJ-i~P(0B$O&f~dMiNs~}h6e)5 zUDAYXDD-lN^7#TCV? z`<@o%b-6gj>I!2dVOYvjTT4%9x!tZxm%BE3xrN64m1+Sp|vd zNFgR=f+-faBuhoJ7!vJQ`wFB=-SiQ1Ix0;f5$W+eDM+Tg6f)^t7&005vOt~|SUlIAh5|D7k@CgGnC!8rIO?1A4y zW$5;-v;&f0tHIlaqIC#G>lBLS5sKy&iY5z1>k^9AP5b{52^GR>u;(LL`mw*_pH;hA z_fW!j51oFI-NVWht)|X}(Q4Kvx`)n@$iea0{;?SsT~215g}c$Fx6q$s>gu~vb@e2x zu-;ak8K2*Qf|~}V>(vh$NW>O zuRyBSt8W!O7iVOZgCgs1c`B)NHWE^8Nz@;yJ0(gEKCpV+;{5GAs5=l zg|>5{4ldNmg*;ry%Y|ev)WwCmxlj)m@^PUZT&R}|`MFRZ7wYFi0WLJag?4fwg$o6_ z&>$BY;zGN)P>2g%#D#{r&~7fYhYMZIg|6a4S976jxX>{!G|Ppq<3iVSp&Pi+ja=v^ zE_8e`9FQtNIRrrv0f)hD;M?FQ;AJS`ue=g&#|dG05KZE5{5E(m{5u$ePoQhzo zf8d+&6v{;_&?dAE1<_v647}(#x*wfD|AL-DuV?EE&&)+OsQY~V;h^jp3@Bx<&!KRm zW$g_6<$lfkLM~Ck=<^KJ)pvAg+AGTzX(}^%jI1aDg=)1Z$})-U?ea;TLtS0664)gx zUH(8Q?^N>5zB*6mP;ht|uuUQdzLr6NRFUZT|A2%R!y?cr9mw1l6dzQB^J!4l2^v3@&Z9wDr;nfNQfpAwnKVO{`Q&m7 zlI#3=rQ_^IV`8*+`SI|~wWkttfTVB!Y(C36bKM)`G#L4I>J8P*dYo34S$shL#r znn(9j>Og_i#C(4=@mn*(H=>-WcWAi1sM@1)V%pzA_MuX3MsfFjy8gd;tgJ~WTC-5J z7NKaZLebiUqHPt5)-DuHU;pco;FA!5VoaRj6%VM}@};%L7XDh?czXO~T~&}MTP>|6 z1!s#|W)C%Pt?|dH?XGh30v^4`=n(d*7ZxN$iaV)HM2p0eDQiMjnc6HeQSdos@)DWc z#6u6iTW^w*KE<>;*=}2LqJ(U1bbo*{dOOm4#=Q@L%AUNMhbCLY7w|9_0_fBsYu&VLBP`I#V`Ck5gBToBGvf^eP| zg!7+*aDGAUf8Ryy|38fXoGaJtdbO=UYSWwWpwrQ2+k}S%4lo+$ZNEdth$GGRo9#QN z*La7_!xLOYt!WgI$S$s7-XhZbxAcqXbo)21bHhc{l133}yW)b1sDA!YKrk`BS#+IIe zwSD3`VUuendUVF#PfW5Qc9T%2VSRso9E-tr6HFpn^Z8SvE-8@QT4C=b8}M$2(@FAo zM`!3Qq1fomn26$bn2KAIh4}PvZ6eYTXB1Rs*Cs42DMX_{T*=(J=6`^tbol!dDG7{O zm%5m&V3I-#l0vG{3rXqjtgD}y#D5wZGihYOD5E^fD@hFYntUYkEO^eS#V-9vEr9-C}=}y9orPJ-|7GjHa59bmo zaYtrdBAH7i*(;KX2eVfsQ#8N+S1IA2yFm_^0?$D|d5DB(iB-jeN|F=s*%V9l`F>zL|_(63u@wG<# zjZ$iMo9sJ@T(I-m?4E^8n}Vqp@Y-E=3v_M#1{${%hsCY76<6fqTaS&nY`M)&T$*YU z*Rz=Q9L-c@J$)qbWRVFbZ zAV@loU1bt{8|k*t%9MjiTfe%lzh&=Ndk%m8XSalMU?Kkgcb}c_Uuy&Qt92>Qg?oe^ z5m}u20G0g_AKVHUM?;!yMuVQ9^`xIW<)MC&=R%guA?Q3O{XE>U5d0C;vdYV~RG!fD zSxe_IRFINA447JRUMrx@ zs`$aT<@Eb+mEcLK6}$j)PviUURm+JroSlgjlLtYgdj}aDnCJ#l$6j?-ikn;hP zSf)2ILgQH}n3BvZ>hWFbru;;+e>LmVM7H{!Hho%Jt-e(khHK*Ed({eCJ*JF#MYGD) zVLLRLOT|Y?)?-ra^q82-wAn4{1=^8B{5oDi#$eU#eGEotLa~X_$s?j(%EyeCa^8)h zqi%D8+wuY%oS*)KlHPdZS?1TCuK!&rp>}u`{`2W2>WUvzH|A?cXq}GsN$czCIXpEz znMn`z=GXO#dEVCKcapM~D!bjANAKVo+->Rx;yX+0KU%2gFwB{6B9%_-1mV0a22?p@Ee*(_JFTs1^1Mpwr)9^9qf$zh5xD3967QqU%8kM6~ z)Pr`R1L#_G3%U#awPx$*S@ht>;X_hhuqU7lmcEC{#i$T!p$&P& zz>TqyTvnO5NAZ?b zUnFUA`ntm%gMmJuM>7M}YmLMCG`nX(-)>pU(WezL@oMB)t@}f&#k>yq`t!DE<*J7< z6M6L-Kf!@;m#-^8o{-n5Js-!I+%lEe#FcB9G;U($8+84DqlAjVM%bS1*Y8}tW>=^# zZG#vOe=dnH(l&_6O0O3;tOK#5(M)zh=H*_Hf12HpX+hZFHQigebz|dhZvA_=T9S{) zJ)~GFchXT0&f66mA6L3NMU@FkE|bxbnGuudIzyIpPCh*gC*6p;K3~%ca5}0(w9fSn z4R3UOrepgjqN6S>hHJ*ME2FVw&62beqvf)${};e633kB|cn!P@ejEM- zzJvfOMhz%{V(2<_FYe`kieAa~H~8sw?q0;SpV{@FHy8}N>pFddt7mPKwveRjY?JCq z(id!#8c5O?ZIc>F()DJ~fr%vTc~{w`Xpg(vE=7CVHFhaYB;}Z0N;65h)-I)mqQ9*5Gb8=S@nLKm|4}C1HWrDBd zd`V4aA}cp7%~hRL;m_#^9Mcs35)ympa|8*jq!ifHott|@p38afN-7QgMy{VcsIE(B zGE`o|X)p@5aElmh~5Mo!!vYH_~gjQ4@{j(q1d?o(f zJhqyhBi6V3@$^4BHQ_Sv`q$C4wxoT3!(^rDro{PQbTgiO+z)HOBcNOQ895Mqb}sP? z!?%h#Mwx(gH)70NvVeJW7BG(s#&l!Mo3em;V-_%Pm{|~yWgc^HZ069&<%#pZ*VF!g zKte9q3W_oD5wCc+T0~T$wARt5sYE4O$4obltI}y4Q?-pYP2+5_x|U4(i71!E3$+Pg zsh~-}CeTVIP};M7i^!)v>2I5R)^B=ze6PBOO#VsnRE}tq|5727f30j**p!Xl)mw_d ze)8Wo*X-Xc<;7|t8R=>7Gd74!G8=7NpaxrfN^^I*JN)RlZb+MWMzZ z3h~4+)Z-hJGcAbK>8%Eun_GLd3txVF{d8wb$0Z1 zbj$sN9hqjKNNBX*ihT%Uz2zFxf+`8gbY5}oNt(9p9J-jw7 z`~87Xri;|-A)BJoFU$P0(s<(?s8;jIIYN!!CVGxA9QJ#>88!%`v7BrPMh7-qfzhK( zZNV~YThQt6@bqSy*+rJNKm*l2FnlqFwP;gYkY{ZRI{iZ#Z)DF);&n)-teU?q5^Hc; zsygze6_nF9r(*@?RFN}z;!4YbubM;84X$^@tK%bCI5#-9 zS4i>D0wE(Ge@$!Afw(hAiU%?cNWtI< z>5vGp2mzaj7w2TWC`V({2V;{|x`}v^FhEU0{JxA!@xDv}8tdu)nwH-mjIY7M?aU;W zu8&923dNvB2pZM@TP~qB;C0}{gfzS8uPt^ma2xTrmB`IcYT$+vC7?CRaaY8S65Y6Uscy! zwWao0TW-xJS76`1>FA7Wa-YlJ)vt9I)2`TrYi2C!8jVdwBQujzSGq9o`2S5cti7a2 z#vV@J$qF(8Aw|*DqK!a`@!jF+X!Ky_%i?^avv7HRifhy8fht!hpm<%e(W9hy?Na36 zkblsX;K)^OYWMZHL|D%|yYXasfiBRt_z06|B6>7a8W$#s6dQ>;0|7rdzaAZlj9H~3 zT)E0gb#^J?KyPdCa3m6qjz&kTNJM`i+~xDjt@6YusplE;+Gq)0x!)&yTjju@YXql7 zCJ&E~x+W%P3>b5bCvYq!6(2o$L4mXaPsGVrP(kjl5{R`xAXbh*tc4=IWGoU1cAiMET)O@jknqn5Py&vF zx8TL_$7nM;Ghe`>3^J_}1+-ceP@yQGHKKsliUKMU1yn2wXq_k^C;9%pV5J0Bg7sh% zXaL(mFW3b}z&JPpX2GrCZg4;Nd+-qWXYg;}m*6+x4e$Y62n*mkcmb?~?XU+1;iWJJ zXW-}Had;=Z4?Y0D2Y&#cfKS8c;cM`Hgisz@i^@<9YDF>{Kzq|jJjTfD8F?Qg|B8|KGx8gZ{3av6#mI*l`3NH)W#m6G^81W@ zjFFEs@&}CkAtQgpNR^Q%8TngA{*IBaG4gdrzRk#Y82K(E-}{*M|La8oxkLe#hypra z6i}%spfXWF8$<#9AA8pV-Bxj?@12R#2uF_dP@KdTzKNYgmhIS<9hY#a#;_u`8VO0Mj{?%vtlKKB! zi||?`odj>T_t^C1#EYto)vK>maBTYJifp#+`elklF8xwA(GajISe6r5E0*9o8H=7p zuU|-fv`S2Rs-ND#i| zHKTotsQn`1n3gi(&oVfuHxtjbS;k0{ehou6>(|ONj5Igtn^;D(zM08k)*BhRMPJL% z>-8pvZq?T@^ag!BLvPeKFm#)K9YeS48_DRHZa}VCG8ZpE10^@m|5nZ+HwM~Tnwlza zCv`Yr*>3an+uYD(w#vUH4*4j@K5TdQLEy1Cot9lII!Uz+*sUI`&DHC1^!2%H?$T*e zy%Ll9?>&=Cx82@rqbr_Dw8S?cVLENZ?XN8PX`=N&aLnpIL{>zVUPs*e+ReSak*RQ8 z_d0o~fU-HAphnN2!{ye!O$20kJ)DgOQ~9Cs&Y;TQ9#_;-*SJ&aBG#xK|}zFRFpU1|;aeAPuct*5Z4bLxru zlWL-BRGW10)$rG7yf5_AASfwhG+3J_yznk{5pOc{|5gL{s>=$ z=O8QUMs3K9>d_h`pcQBdDn;`U;{V8hz`w`;l7Ewbm4AtUmVc6eoPUIWfWL?TNB#%= zE&RXGrJB#?QAWC z^JiB>sGAia<;vMgh%cC32H~RF#SqS!Ed~CEvs#GjXXilNIZMiaG<^a%%hN|7T$+wU zD5NJLtVo9-EKTo+a7}s)!kYA62 zbT@<@>2?S=r8hvDze<}S-kk=W=buXu9k|3i2>HZ(2yvneLQP@`gmV+iA=D(E#DX1eBv&k|1R+O>{uGEJ5mLMFQmNDiffC&X53obX5tWTXh2T)U8f{ z&bl=T&|kMU0a$dV1mM!uCjg_aApv-GjS0Z6YfV5s=r$yvPUd$cpnm56IB^=nCm$;T z{!H2gD0ZdSK)mCL;}G8X#7PK;QlvhkDGcG6)LaN1DX4ATc#5Dqo>~auvD8uskEB*W zcqm2C#Z#*w45vtG6DcTJcQ6I@qYI@7#$c)y!sb*Pgn<;azHTf?w5Or|OZ(GM|E1P6Xjs~p zCiQrm`!>ds{-vW_OaZSgPtB9+s9ekC}5}~fHD##uUPt@-%mIHit>q%8^^BUPGP*1lD znCb;9Stl=2wT*kM(vtFwZomhUFZCeJc5<;(^6nj3y;;s+CY6 zof0cesKmM>StVjE*XhI-*SXvl&#;3`_NjukR^iz#C!V??YbHAatRyGh=nxDC<3VpI zc+5Y>Ed0;qlKcO|+|wMcLtEj$3;miooLs$-tALiO(CN$TYgm7HYf)XCbHla&ss@Ia%YU&W^ewJ7)FcpGU5>wD=SusI#hv017A=skP zNL0GN!#Uz~i}%eP0zIHY7=fRG-xsHCEv6cFxSiHrVzQPFVHh3>Cv;>-r351uCrG0A z*LMi^@F93u#)J`X)H~si`>D8-LZ;q2h1>&_VG&Fn9*;L12{%idrFJK4$SE+SLs;&j zr@&-71nFT^r3DOZuRuBic$7R7?{K?=%O+E&gcvAsN-2Y?bcq5FLKSX;`3OC`KKJTCL7w=N(K=K7D$thDw z&O(*sEK*6%VwL19QAv(owExo_Za`lCdWc-8*R(BJD-K3h>U1vA@2>PhRi$rUOx}wA zs5c&oHtspk%Ute@HIq(yk8VpEB_N(05c=j<1;~;-Am_6>SU5Db1ZN<*R6SRBbU5*A+$i)c-$f@NtQmh+o(EF>{K>;HQfhda>>{{*jv z=x6kMtWT~hqn0>~nOa0&=pL)xwaxBOrJ}4#SJEsvOyZ-^@?q4f#FiW z&Fyg&%hx=svPGeCPP|sDHJfv)=Wa;aZ%o!p+INZCdq!P057f4MP!;XxDJxtOuWgpq zy2O=KZ%x*fWru7Q@j=NLr>f{(nm1x2*0VOF0yFp#S(4(Gq=|T@r@g@r(NBgr$Wuk{ zMR`5JCyg%IKESa}zW-m#?d0I^k z^2IuF@2Jyeta=gSIbEIsPsz$MO}RdM3trt-2jqnuAxdu}9unOvza!Ji)!RdtXnQPH zGHL5t(6&TVZjj&Xvp5$VBKALzDmhdM!BOb_B=b`vG&Tws8-c zNe}wOlj7Lw_+n_t`v1&nm*vXzC-48w+_yORyP3O_yN`REd!BopdyhNE&*xXbh+qS6 z<(>RqKFpuszscXk-@)I*KgvJDzsmob{|L=POHmCnqb+C{U5*Z*Bj_r01G)v>jUGZz zqF2z{=mR_lFTw&|hd1G^cqb0vIG(}R;_uKLk? zp&A%!9YZxTR1-rrGnAR3S{Q0QL$xy028Pw*)Kv`i4RQYe z5QjTZjK2#as$4VXw3!^OP5e++&uHk;+SCta)IT1K#r@Huk9_dGdA=x>-Y2uVpMna(=@x&-*vAedB3I7gjFm_Pz=Y0>5 zOIG@%>`gak-H}$y+>sW2xfQLj6Msg9k)>5iD7p1hIT%faU<86;6<};WFASoG5(eQZ zVf3UM$-E_j(b7!kE%mXf2~R8#Ez#AlZGdx?EvU>AbLj+BRMbT_gGPaT`$uOM$ zm_J@>$>VI3LGm+=j-hHO2f zeZ>dyl;YHAnQ#Cinv;R>WzFW@of%j3rVw;gIW)QS5++ZwO+0DqR)j?crAELhn-I*VlCS@n!zDPp2s!v~ zL*&A{rU#PUW%R%jXoe|q9mcTBW7}EWnRVI-f2VlNM7d;3MspMC00tw6{ZYXOxrIQ; zJ1!XgN8+_iMqE(yzS35(UC0+t`-V*$AYiw?I!Xa;H%Abi(cw+~li2q&*MO4d+2t{IkT2+E6FbOGswsWqbYPv+0BoK)n z_D08~MD@a`eb_A+O(aRJQNFR4+^Egm-$!bW#!UMHQ1CCe0>mq1<&OK~)MhNCKiwcK zn8LnLEDn__zMf3=c}IP+B3BuWbRTK3O*M zxkVRaWOeqsDlnyaTk+Q z>+RNj1DXiVZP0d1(Gv;V*0l)m3!d=Cm6kL~F4>`jNsBZTI4KPUV0c=5B)1hn(l<iTeD+0QJEG7x&XM77Gpy;D&^!C%Hvx8h@^7EG`wsHn$f51cE7|^>m=-g&$YU zKThQ4fq;~RIsiiiq9P`moX3{Z$=0kx?^O}CVL&q z%;?7CHu{k!von_bvypuqp1$ILq&cNfIxCncol`c;l}(~=l~m4rR~obt-|{M`d|L5# z$qELQ>xHNvsyynCPesEdE;~0plS+bcdD1RUqLZ(GRpKPNrN>cZ4+ix8cveyARBTRt z?QtP6+0aex;}cyli1WdrEyb_yqDo32SQGDC47-%uQ#oK(Z&{YIX(LIukWMT^W( zyi{Q*(!}idzZi!rQ48M=k>X!45FGj37EV6*SuLELK9qDUq~Gifx@o?hezez*`@^2_ z)C94;iVx-19FzFyD zA^WhW&*E+={-|WXq92naYd5sEnl})0e<&CZP5>@wrF}5)2eaQ7nj$O5V`PF!ps5+d zUn)ax|Ig>$9Pj3D=6}k6fGW@cx*9!$ev7;DVf+&n`hzds)vqxaCYVWC@)IgBPwk0> z#tKaAdcyw0LT$}EZ5qRJm#iEznkzUp-)A2r$HfSyKsW*!Ul$;w{EGrvIw=33@Em+c73kr7hc1cKIwUztU3LZP|r}-x5Bh;Zx)TEeF_zQ}*=i=afBk`=h^Q zffm}``MmdL=IJ?hIp`TU9ysy6qc?Ns&U-WW&gb4cqU~qnKKn6Zy{?kg6CR4^P{Zj6 ziq?8P2s$2QbDTMEu#L#!necrl({K$o<5Sz3Pr(>zja&8Yk_N*OJKfiP;gFj7b zze;lYV!55Etk-s*3r#u>p*X&|T8jt1*LF{F<(LiJe#7!TWRq?x?Zu~TQR3=4HKAP6Nwny>! zUqIsjNvowX>6_B)(%YaCYy!u?E#PH12iCz3*auHf_qX^Fq^(w0^Fgii;*n^3COp!a z2p^U=Wl{-zN353FZF9ESqdqsCK=Id)r)Y0=TO0Zii|Qgq-4oU!+IoAd+_mUs*70?q zCd9ipZ)7z@!@01xY6Y6sJ?r@g(TF+|EpK(lG9=|3d=WN^s;Y~A?3J_Xk5y>UuVhj` zo><-7M-2&x*S}iT;ygm~$hh{}`utW`W1UzCwXs)Dq_Kmlp^RLsNuC_a^x7iJk*IQr zCAfheU5!}YEdGog^!YE)8jz6>bMkDMHbgckN7~&YmeU4@Qm)^Fx}=7cOGO4l___dp z!vB)P>RQa2oCwE~w6%`gQHOe%(vgUy15M#DVaIEK_rPpdJtyjwUokfuksc#w*h>sY zqew1uX8lCdku&^YCK=o0hPJ<@k+h`oV~2bR#nvidwF$|nXhuKm1tsqf>kkb2L)1UC4Gq>T)DgHRx>9asS4M@H6Q&`t!+2C#1suO2v!Bn!Jm;ks!X0 z!zB*FgQw;>XS1nUQxcWU7$kqV8Ch+TULN-j$cnj!JC>zSDS}yb;mnIDwHDp%ed4^r zK2=3Y-D|yO}+t-;d`d6T2py!M#KFv2g1~(t^xl?VVIOU?CfgHFBTmxYy-DYGOz*Vwz_GHgezP$OTTTs zrO>Ccvsz<^82*-?ouv~jkBc_$X@f*=NS2)0T^j`WQ1?v7MeE-GB6z8DXCG1&UK7@6qO3%WBldynWA##9o4EFyQSpL<5{(o0mEOkhqmF|&V0<*xmU@ypmyTOZa8Qcd? zO}9|_OOtrMoW@3ep;UiAJ+ZBB60eykKP%_C)r;z_E(g0urT8vjE(p-@-9*fHiPHja z`L#i-%ek99Ka>mgS4WwtBHlv<7#3t1l2cgOtjqV@hW@#9KfaIguKc(TK*! z-^LswwqA3h9%NN!<+vPC&i1PpuR`S3a=#^`p-3XCG!H>)UE$1O)Vdb0)#a(<9?xx) zqxi}UyNf^%@y~gE2dbFej>&2-j=r*<96}HK+}KhiL_853X4esoUh8%1&}-et>MN@5 zOohLE>1>xXzl4>}rpbi>wawZ+9rQyRemy%=@o*-V8zsL{ko$1}%>noq{MT!DcUoO5 z5`5j=azw_yDT=D+PyD%i1aajC!E$>4KW~8^uvN++!0ePy6b`Eb?WiWu6h{;#pG3>| zpFu!R;`4%^YnAqj)2))J7a6+?{i?|5VIl*4(WU2h%^A7XAEk4m1hq~lN>GlTvEG8L zzR6bYO=6D}W~f@_^QUk*fN`WWOJqvP)bq8k5LNl=)c8^ybd+A@dh;*71fsT0WKPL6 zkpDCL|C8>M{=p92C`zF!(z$7|!Ql&rZo_FAk(sKg;UgF{ywNt+|Mp?x>7DtMAEQqtK(la@K$~zXMK_WLK zOV7>rLQDw2>2bWfd}9>;Ir_j(>>%rzUd;XYvm68?Q3$~ ze3I+ebir!>pABe%$-K8Et0Cm@V)=YGX9Y$xh!q%dZJ5k?t6p4-YS=5*kRGj_ zQrRCgqOzNXvS@M5m&K2wrgCL|xCO22NBA--IW(f$?61*NX6U#uY;V1>QqUqf6w_VGp4h9g=Vl`Hc~{*)t(wjYR^J^bV6$ z(q+y50QC^PeJGxbrQo3Twd3s(C72>KU7Sc2^ zV%uDLR=;pYb<@a({gR3EuzLI?H1g^#8c!HOm{H6gyzSit$SVc8!32S-`Fpu)h|t zzY(zO1nhbNyFtKi6tKS)u$u(zW&!&<0lP)OZWXZG1nhPJyF`@VoZN9BLg z0-L}=DT;uSrhKL_qFQ0rC_y0?%E_Z4e95WglclsvXN8HRR#p|sYAdMWWg9k?bjSL! zfh7%W5zD&6!{JyQ`+6eI6~k`4uSBA+@zbkX4=>7x3d1Vb&G|CAWrhHuKwiI1Rn6hL zMYuq6z8ha4!5oJp5xp6%K?i6d<|3#o`ea;6&SnklZh59v!Prw6Qnw0w{PblYmNDEEEDDOnshQa#H8acc zg601_=}C+9r1TDG2A6?{parglGQ1kz4L|A8fIj7Ejn(B~Curykhzw-JYs%`KR~ic~ zoC!yAa>iT!RWVoT-^W6;8eJ`r2+2Pa%~+?NjQ+uXs_>Mpl%%h&FI5U3I_P z>RQaaiz(h%IoD$U?6kU8RB{if@!V^@Znw|ss#z)grp0z==ZH8j>$L|PtghkUE{s(w5ngNZ^GJwSrzr*x()SIVDDV=D8a!wo zBt-WSD674*XDjyg9(4C3L9P>F2DTCTOAD8){-4?u|4-b3ap@VpZ4$2$sSM9P*ED|0 z=d$(ur3$0k&79*@Es4qzlhl$i17%EEg~xcd)E3b<+b%~kG6~W}loEWYm5yau^mU<@ z(z^k%6^=1gtd+U}i6zbA`QVvVG0J?B=eILCF~8wtRPkw+b;ppLNAFlZ=B{lB5`7lC z{}4lesWq!OCP)4MHCVu}K_&V#lO{>|gM}+KCwLo(6Fetx6I1eU2=ts`QlREHZ0ztY zN3nqNb>TSDCb znZTX&^C`SJiYZM}oB$o$q$JL<5B3JsiD!W%>Ix;NBc7FmZ8QLY8v3iq&mrp*Lh2J8 z|7*b0Z4#Xxlj!uCL}#~2boQ7;XRk?gE-{JDK9lI|r~dzbZvih$Pg|zVE2o($zhzv~ z->ygNv`{u0E4_ew-oThkaT<6`P1S6=y+gQmss8@DQf^{MsxWON<|ohxE?gf7cF7|XbQedeNdC`}YAv74 z+kfUIljh@cljzJdiB5${bZjQkv71C^zDaZzQ2GBK7Vx_CBKq?wOZg+?vs78%ag@mV zg^@(soKSVGOb|?LCPEKtlr~{k_2kw@aC;b{FKZU>xFKXA~!-aY2`HTs%;t9@&H{wAOQ0-wLd z7ijPW0=__#FVNy^Y&gDF3}L-(Qy1BA$2(i(95PD6*Q7F|%9$+R9h8!aov0oM>OSB4 zd|27rL>g35K4yYa^qzs5hu?EHmyyw%)N6XUQT)br58k(yqxk)!jIJG_O`Y31f*r{y z?iK9LMW*}N9bKIr?ZJ*6y<{sek{XIfiC18ijIbf9(9!9SbpQW)3oHYjQVIdnJz@`x z&!vH59S&Pwa@xFT&_?i~P01%iX+=WDT4;KxFCL53A1cFNa2cV!mX1rRtY+P5Iisps z?pnVu;A>j7YL!3GLbqE(p>Q&lY*PLNgQNxp%kLSVLywLTdqYlJ9pWyDH)TpbLI%GtW{*@QD3EHgyso)A%hOU~J6ba&t=*|L^~ zmS)UVHzJ!wW6|B&E{q8Jm}b?L9k;57AstuIy9%nEU+HJhLsOR(YNMF2;HHa)AhmyV zrx1nycxpu8SS`xQ3_Sh;@LGTuE|~7IKa)PjDIXc1$0p`VIx&ynDB7i;xjaTQ7on|8 zTqCh0(lO8=$&I>6VDDOgFoEW0d|?Sk63xj;cV9R%XgrURn$&45K3+i;2h8RYr>!2b z*`JMt%;B`kh*OpPTEZ*Ba8#oY%dA?Nl0p3cfi??hLu>yl!L8s?@GAH{v_l{4fQR5Q zcoRGcpNBu0?$2)~eQeV*tE0{a=!Y8$Wr?mDB;Q!p<#kydD<}9d;9BgkI;x9*jrY0E zUT$^N8~xIcl_}SGPOHOf@N+6M=vrc2G|`7o#AMf5#znEPbvcb&n<6U`*V3g{ho|`0 zw99AwL&jBS%->L->m1`&4B=KRo1j$MwS0nKGA@^K6GmL;8}tTJ+XiLyYhS-BK=uDO zEzk!>rH2vlX-xSoFI<5S?e}8c^Z?luwuR8@GPJv^vu#IvhbgvX{km}Od;`iF$nGyT z*6@ouD)*44scw8>40}@`-0Y>^6hfPNLftzz^j>TVEAb+QTcM8ln1~Ve5si!b7cR$J zGlUCz5^oE&cX#gTDD{GY@-U+3fzmE33vi95d0LZqzA&mac}!{Y_6?VWddz9^nEnf* zw9BX)3)JuEug~po2sHWJfrh3Q{1%!T)?6UI2wF(9{{j0gOTan{SO+c!yTBL0&EQ_} z4AKF91+8!q^uQ)ChV*~|n1NTrTi`wLDflD!Oa8y<9^5m@yo5d$yAm%rQ018i9UvZ! z4To~eYUjd*ATB2><|}~x3D{v-f!3OyJqWNNAQX!p^Xx@P1wz6J*;4_XK#8!}5#G;;X8C(o-pkUioD&)9*A@l;pSCrCZ`=4-) zT-adyyZVd|&Vu!zD0Hy>9pmix7r{E9iw10e+bHu7SpQ!EDlMQAxIsO*5NrpRffns1@Id9FSH_%-~xCKTm{#|ZSVj*0!QH&(R}bN_y~Lsz6#%fznkVyb0&Q> z34i?QOe&YkjizPW?IL=Ih(0EwkBjINBKlnseNsffC!(iC^cfL-RzzPB(YHnPk0ScM zfZEGMv|L1&il{?G&lXXqh%OV+Y7sq8L~BH}Rz%l}=!GJ>MMSrX=r$4EE}~sj|G&lp zSA#a`G6YOp%6E@1SU?O5=+<}*(yy|qz9XgIbg9#Ax`cZ6b+v_ZWth6M!PFT=BxC(C zx;st`4V2)WMtdx{pt_$F8lTU$&C2MuS=OBMj9MLE_`XM3mOIbDB7mM|DAokESc4=A zB-S5&Sa~$wMauGL8tHL6^@oO8bUJN*a;T9>rE(^CEFF-}Gh$PtzgBm$fwOf7iR6@H z(}rGupx!?Lzgl%F&mH5o1(r(6bHr)$AeLh#_x&~?RU7ddi{kf5jt{Yo05uUxmef+~y9FNIjX;;^zw z{u{~W{-3>P0dC{C?mnVyT7)FpqGXALbu>tclqiuP_yZ~00!dJU_yI+L`cxkT1VIuO zNYDT%TD2Vol5N@Xr*7=}H_7;usXK8xnKqrInWnYfI=Ox)&UD;PKbfiP=_J!SwUv6B zOg*vPeY>nwx&_V@Pf-R{2K_x8PbHg5?0TDsv|C?V@(K9OVUb;L|8 zqA^$P@@WUjWT@FsXp1GGMhm#pWPSXjQQ#{f?K4UmQ`@zaz$J~qY%&?cJ!Lc8J8CmLwW2AS4bWSc#|6rXvnMl=TnQibA6( zbN+w5_!B|=iTDd?rBo#~Nj=iI6vy^FzAAkWasTJ#RkDKk{&6`YKOjFN|Ec_A`7LMW zi7U@1d0@jAi=~pu8_MOPxd5cOupJg0-Gwr3hONC0(L7IA%YG6Yn?|24*Os$<8rOm^ z@o601J2xRl*GOa0-J|skN=hd+e494b$UWvrTH-NN3EVAfO(nRdJ#0$k+IAnD3^0k% zGwTgn^f;RTt0X@@c!(!%T}10u&40V)UQ=8QEn|z>9GY8deh!BvS}OKtR`WJl|4)Jb z&n_{A0!}@Jw0b?ciluRlJJ8&UR?o?}{qEmp#V*T;W};Y2voc3K{w9+%Vx7;kELc@YW|2O<|RboYhuK3m!cU60SjgWI&*_v z8!8Q;L_QGD$Cb>yl26T_QWDcMB{b$z^E&BCb(6uyxd>l_lAXAGI4gEru9_P99_~0t z<7(my3&}Xx^U?1V5Y@pFL_#5*(1^Nmto60tBElxz=peIsXYbV}DAl`M-bF{dnkcvLhq~|xR)3D~i zG3zwo<~@h4)4=tG=SVRXotQ?b^mvIxTx-liU$3K$=+L>8vW-5=wDbumT=T)^vW;G= z42ewUL@MdN#zO57r^8rvuPT)a27%nGE%f_HD%QVTQwlZFz^r+n-2Zz@kWPv@^yd`K*5xQ1$%>+F!*Ro&=zX?&Ue-LL^f-&4uy=HprbF3c?^^2+T>IW<*ae%szA z?gc9s^;szPcDZt=qIF`AVrcwnQG~{B?G3Q@zc1tc|8|G)G&zK4heLRFI)ta$Av`S( z;qf|zr_~`mK3MWJ}WXBpvOGQgFjk@hA-~JA92~zND0}GbWAX z=FC>A2i~N5$XN#Jl3urKgUjv0W|-|?x>gkR1~yWQv9lE52-@Dw>WxHMWrNG*bGs@* zZ#`;%W6R7c_R)sh8kO4^UGykzVuM;sx|G}o*npcDJmf$tR~EGrp)G1Cilc1}sS0IG zXEgRLy=Z?+*I69`TmY|P!HK08wJkr8~suQQ)$A3R7xBrT*Czn#p%FJkUBe zVE@GQw&}aUXd9-oCmR*~Yc(mQa!T^nMFi(Fm^VykX81Xav1b9*(NAt%-D=Re%AnK! z@gbbIpfgJ7B)5G6>81Fo9MLz+VY0lrys|*&TQgP0KTQt>Yzd?+i;->l{ zsHt6EuBpBV)6{KNO|`#QcUd&mqE~&iSI-Qojg`8ytuv=ILnFaM{RbSF3tuz07UNZJ zM_t>}1pNy?t?=W6pEmeuho27k>4cvy`0>L}0Dk)5ryqU>;3o(_gXqT(_4%PbKh)=k z`utFzAL{c%eSWCV5B2$>K0nmwhx!6gpC9V;Lw)|iCgmv8o4C!Nk^O(WLwGtI!qe#x zo-T**_#ML2?GTSL{Ip{79 zx|@UU;h=LIbng|9h8lFmqoEEt;n7fl^S_iJPe?C_ABgQJXwOsFt9mJmdArVH4z}9Q z4c8a3m`-mgxc$|sdN;{$6&EveT-m_IG-pMN^^EJNZ3| zm+jRZR-07&d$r$UlM1~W;CFt;r%d+$KZ5c9`{G}tz-9dumelr2p&7AGwJuko+U;sa zJwG@e3ymHK42K3{;l6#reh1E!e=9kUs?5gonJg$Anj6rB&&?YAjY?GWuGwsy*J}5Q zQ#on?pB=qLbiJ4p97%nPQB$NjsQs=xS5~pns@LCFfJg zDP?Lg31^@S+01NeG6lERH1$Lit+*CSV!i64LINM1b{&|kgnucXcVV{TW>s#gYAqiB zgAPnpyDi#Te4H|9OjVcp{{Lo&@a%R7PrxBOeGcL2cL>jbLwJG?;Td!Y&mOY=uNP!N zx>|Ij0DjKMs=rd$p)DqzZr2X7m}sWRBZnhVCls|FF)u0{er*-?`tUNEO~R5npHaw~ z2@35eGig*DYqO(ec7c=Zm=_wZW;&10s9lvpqt*>qxm}HVH$-E>(LmpD(0)0i_?6;L zpxB$V<<;9tSP6~d**NZrrA+pO63-^%#l+GYD5-h1(|F?>=^NLX4QvU|eqw*S6yt>P z>u=mksO6-m`X#uJ=9_R;lX%b-Xu(??@+97fw zlTIa0nLh!7feO+@wTE~PgAN$Np2MI6qM?ysc*21#!|#}TK*MZwL3^XpPn}xKB=bsK znaRfI^FXw=U&tG?-cl+*o0?a&>+x{$H97y$9-m*m;W5tF+KB2u+sM zIRe%QWW0dWwG(Yk(TbU!(mE}ZNGxVic1?X7d?=)oCzEKVg!Hu`b5!0P}~ags=6AP zOYm6f9ca!eH!1WQXVHK!u8Yoqg4%1W{f%_(C+typV$a@Ke|X#huIF)U7LT?-p8`4? zu}>uUGGLaUB(6RTzdw^n#te`p&qu3d_y1Q5FAK}N`*-efXrB~v2+ux;@C-SGXV@V; zBM#vibqG(`Av|L+{_Dh}f_PNShA0>(_FvZ^f-&#g%P^)>rXS(E1HrGg?vW zYfLf0s*R>%sP)&IGDWJ^^O>Oa)qE7ReiPUFR?_-PuJu0LdN)_r2d%$>kAl`KTr+&A z_4THhVAYMLVyN}Crc9Bl&3qEQ^9lb>iQ7kvV#Ec*efvaDNG#l|B5#kK<$ zW%<~3Wf`_Ua08fZ#JL;5BnoyJ+FiCTmj7=Tj|<{0;z{w0_>lON_`LXS!~^_|_>YJS zcuRa&S}7ivu9Y@RO_E<4lp<({Fem+{bWVCydRF?D^nK~Cq<@g!klvPlEtkvdWe?gt z^ve6>gYp#O4ZbMfFFzswuKaEJCHe2Uoqi# zjqnZYnQ(*&A27no7ntxg6Mm2hKf;8cWWrx#!ap*?wf*3ULpxbnRn7wISYQJSxLF{^ z0*fs06&84c1)gJp7g*psEbv_x_!Aa*i2*8JW`VaE!1Xu_e2oRz3S5850)NW_ud={v zEbt2!c!vR2%Pi2y0y|jXk6GYF7I>Wn{)YwLV}Lak46yEd3{b_UZ2Sfbyg<(XevbYZ ze~JElrk^t_)jo1{WV0(!sK-}Fs;6UMT*3Y`p6963g$6XMZ)-wJR%#0UnFx(W$?rDC zD>P}9QaY<<a=^aLy`_V>iI=AIz_!ts^m zZN%X%*AsZLE1gyAi7@0sj6?#Fi`Xv9o`9N6JyEzr-A&H2H@h04C#rEz;LD8mcf~VC zR{$;84%=Xa{}6~Be?A>w_{C(8Kx*^EJjoR|agaRuIFE^bGXC2I={@0>=+A{cg8cu(d{Ta@X zE%E7qU}`_699ziJlCkmkxy%$eC&5zzn-8pBS>}TTY9gUrv&Tiu$OUkCQL6_JwQ_7B z>xkEPjAV(-B7U9>FuV(F=-TPiwu0EKf+sbt#3mv^@Ls4@v8|k#+0t4wmPvuJ8=bj^ zd>VTUNWsl@d78843-lw#m&te}F`LaD!|0Oph%93K2Hv2__zgsHh8#Mn^zXFVuMhsM zg&q3fPv?@!6ZU@wUpLQ#_}z13AGbu|lG&kuQrng+XuXL#NSpT<=QPIn$F*6E{}n=3 zkXK4RaTo<`e+mcG&{|#YyhO#$+RoJeZvS!#rJ@THu30G!(a$NN?yVH+4RxV$uiK#il^=dyO`oBjV!gI_aJjWfv6LSd97aYP9cL>jh3^=@sd9={yS zgoRrBBhf%Kh!_X-7eoWASJjr)?y$_G=UB6`tk!MH5etp)pI`T8OJxW;7^yYhS^u9))6X?4g@n{`pOSyp6hKlKlkx-9T< zCDxYL1fUX1?*Vn6^_~@!EbXWCev3V8DfP}`X})>S3MEfoSG4(j3{KL>SlP!9*~;-Fp*x`~5s z=Ahji6yTsf4(jKi0S*ds&>#ox;h?=76yl(L95lp1!yGiiL8BZL=AbbS+Rs7b92DW8 zC3TFbVTC(`-Jw6&~4?}Kz|{)93Y zUr_S#NpkOkt(EHJl!Lss96U;q4~X+IMZOrO9PX!RX!Nl5flMw=^RAq5S=_c48n;(+IjmQj|y_FG%lV*flJ^i99Q=f=`=XVkgE}QS?$U>g0ffGY|H1YCk;*v)j6hU%`sW zo6c#$%l!O*+95nM4&j+~2v5o(JhwQ6=Y&Ie(hlL7a|qA8gvRPs!q3nj*OKrv@f9&D zwMb9PtL1acv65dxkL#Y<6@~rwcIn()VrQbh0U`UcQ^ zC#Fz1j#%}Xor$^?2;GBDp_{EMN9fMwR}@lqqMOb@J(H*e^k?#Qhu%-H_|b93=@n!LY6-Q$9=IykqYaKui$ zvr9)q!y&(~wH;xsN0iPwPU&pjGl9^)8*#3?2oYh8O!`{Q_I>+;g+2j;f8RiZ!8o;II;9&P? z2GXogYqaY0Gk}BY0mEafNL+rQEcVlyHq%OVsY@$To9-KyBG1_WZ2AUDcA@`!v`PRbeilzdixP<~u~R{o~^ozLf;zAMj1J*(x- z67@ChuHZoz53c6HH9WYM2P=8-TDVKEfwAfMiKM%wD8^e9(^?ecD~f3=ifJ#3=_rcn zglm*21`Ry7p9y!D%T*|xpL2(3Xdev?(a zUKY5C1#V`6-FW>Mb_t>^?E1LxxzMj3rl;5ua*BbQ+1&mCw(!xax*`gsS4hYEc7}Y)H-jKYLdL+{SU8?{*C*lm&^hDp4Q>;zUpuAyOhiO4Ofa1q49~ z5ed=&C|RbZ3kV)4nD`TL5Gluw4O@wm*skq3v8SChjq9Y2ogdeBCr+C*?X**>gK6Vr z>aiznl6u;@)3MVyO*5TFc4xY8_wI0a07Xd_j+U#_h`8IgKkwVypZE6O+wIO4WsmT2 zsJ_YF$GW6>d9v?V7yF<)={ z;-4TlSIkv9x^PSzeePC9A29K%f4{xMH2PeMlU$8438E=arQwC!8dV89!USx^ORxU$ zPS-eIa&aHQ8bDZ770RK7N$owwmG=bxhxG?CUrSS1(kZeAAfQy>+*$<(+%D@6XRaok zrF=nazyXT##Qc8`f&M>2e%{OVKyl$?Yt&=0zucbWRe z#kmky_mPxdLL~bCaShm<3e1|h=FVDk%|&=q*Mg>-Xh8qB@h@@wOQ;JyiPz%?F3aS6 z^{Vf+9N&uWS&l+W%TegP%Tefk%TeeV+L#QAU`EUng^j6IhKVV!=y5vJN;*lA3Cr8t z4cn=yiV!nc6gKS_c6xi2Yzw-fc;K`wu_;nf=Q>EdE^kloj;`LG9lN`B^z7-^t23%a zWjGKBMZ>;ORA>+*M?-#5ZYU6~SIIRvO;`fahjLpuor&vIVzZ5<*%mcLL?^w)D;1?G zyR%j6rir{H=@V4y2`FlUg3)AGWOxk|uv!JA8vA-{q6U8rO>wU1yPCPJ_DZT$Z+K<; zER{^CdFG&2k69>0a@r zQp}8rsz-tq{^`y=LPsn!&3J+>6_c6MLOd~3={6OcVY=^MV6-8TDoE)`ji56Drsl(h z7|RhgQz{s3e?jIpSpPzRLI2-j)c?Q9;T>p_zmwd&pD&_&O)rOO>F{MRE#0a7R7^{E zmL?bC%VJtOboot7EAUj)(w#&dm}*qNn%&Jlnh~+I{_t+CwSIAtmh{!Q2uTHYa3Q9t z14k8gfExJMAKMWVwk5p_s)4ZB%HtJo|C_U@oRb!nleegxf<@)X7L`-9sGL(4l{05i zIrD7(e~ZIA(HZ^)a`VBxO8$it%k;VO&?SAY)X%BfV${x3Xkn(2TgPCeTkKl^Mo!Mx zAH_#&qqq>a#Tt-EG8NIbg@lHvlOY1n$oeA+){+#cQ)V^85UeshydY@|i^?lV#b)Zy z@WGm&X3pMR{QT{|*jck9P41a${Y0Jh6~s2UdghySl~RO=?kf39Wxkj@N9= zm*$dMUBhZVYJ(YFnAL`!88-AxTZ1!H8|RX4yEQQB0UcSmoo$H00QC_-6{q3)qZ+M= zYH7FSYE+dpDzw`dl59^GrCoXnHqD*7{?JBhLc277?rOMNK05io5p{8>3yq>#^dNc` zmC+lR!yEBld>H5PL-=XDfdAFHapCIqe!T>nqtA|5^VF>H_U;u^Q?$)FS2}HuZ8akh zjdSBWizQD_!GtAkJhxc#3>eYzE}O$!i<(U&3X;6>f17QNEw$)5=k<$`^3F9aHixGc zsW|1dEyhm~_(6-N%sH=Fl$Lkm#h96MHacvM%_b5dOeLIKT5XQ*8kE#5t$0TbP6;`l z&CVtzXL}892o;8V=Vtc(|3wb{i2oM(xe~6@TshFlxl5DCY2Tlwd$l@K@#$en9#76o zDT|yncqviL#9@osjv|qAz5Svr%y$Xe{b^74aqU6J-eR#UtF^kwYLFW5URQY#b{Gce z$_SC@cauo2b$FZhq{aFD7QBariiuc( zHg%15pOI$Z;2tB*Q0`sLc$bc*FYZ%t!X6`~B&ED&$40!*9H^yu+>`>iXl^v6FtGNB ziD=;MGjJB6jtDigzJf&!)8c=T#RuU^jKxnDiCVhxKb&~KDNH2VYB66RqtnKpGnWNQ zji<5&Y2(`~P>!>6PjTE+{67A3{J$U@>PF)@gdfBIjQrlTU%vyjW?8CWDfuak4d;B~w~hnn{AX z#`0#7N68!_Qo~KjWB=i}&9%8$mF?kJswiCuP<;SN9S!d3W!T>2?Qs8=EeK z>GlonHkZf947|6&WFZGt%6Mw3=9s=*MqLl`zl{rXWZ1Ze|66|bd*27Jw5QwvYh6eA z7Q20n9S$@xG8P)H>(U7m*3 z%sZE0p0Z-_>wo}_`JVEJ8aXFnzR7Oi>9oT?IO!rV9H_4|lg9t1bc|%teca9FC_yc~ z!mt{mtMF?ZIalcj@El+pD2qcw{;|+du)ZxOks!lyV*7~|W}em3g`WAIo?QVQ?*a29Lq3!?6e}%h&ALaOe=ifng zv<2OWZb1noqx;eCqOYMB(f830&|BDse~ZWhLH>{V<9rTB`B!m*U*JdaDgLwgKKum# z1pW$s0e>H##joHu-}{t*grp1Y|G&h49(2bf#h z+aYIl9%^@UoG#acBjmMj9)M$>EAvGACS455NxJ|iN*lz^<_92>LD>8fFqc%toiWnh z!o>`k-{n>G^l6O}o~MEBAe-s}qsg?CEy|SE2J$_jrDO9X<2#in_~a)y-$8lFpA?H3 zMU=JI2>LipQy>pXS!(WFft$!vGLvZD%5F2UOtS}YC&4) zHt65=dJyA{Q+Iol{{1&YO=$1G1ssc0)5%k!ys_iMcr79-|H{=gz7pCF+EgmNYv+`o z3=+wiBk(QOK2@*q8^=$ zIPX2L@Mv5*qMTn^MpX+)G%x+aQ7K*aHFDn4B=594jydgKyVIRaB>{)7C0kT)^IEl0 zv9|j-d{IconbuLwl_LCV7^`Eb6kR^0aQP#2*%<%_*|M{eFkHVAWX(vEW~ADS)A6zh zzOe2fSTz~#|L8dmKTHOh=a#!4UcIhf=e=f2`)pk4=4xP_(xaqij257LycSCK0hB&d zfXWHLiiwt53)IuZ44s)@nxWHB6Z93Ro9pBg9RFqh8~jWBU-K{X|Hwbc&+~8b@1m7_ z0=1$W(GVI(lPHevMh~IiK~JF<(VwHU=wroZMYG);2Urcj^Z4C4F4W}7JnO` z#s9?4_fh{{mXYNOy+9*OB*eUQQk==hGP3)dp!AWDX(=Uwr($;McK0`wuy|h5!oCjL zUSe7-NOEf*sF-x`2KTL?5+(p8r{z*5l8^IEV`f7xJ)TrKCC2}le5KKPRhH#hBBNzL6qK9BGdK*T5Kvd z<9I{8b4!#*@LF?k{19G)5*had4T8_o?qm2yZcQRfN}m(qY^t``D2`mV04owLZIpZR zMDE=*%bc8d&rmisZ%g;}G#2T1Ql{k-w2Xo~r2NJ~4_3B%aIc`5D|;TeSJG@W7fknB z$`+WuYB;FDNG;nt!mTwt>lF36h zC$~POTlcyyGXZuA&dmJAMkaq6Fm~KfA*Hf6iD`&L=G@ z=TjDybH7F9eA=RNK4VcipS7r*2P`V*K_>q{!r@*NqmS&~+t-n7MISfO)DKGerZ( z^G-wr9WzyUSg?kOr6}E6-qXl+GDO4la8N~Q$Ry=tELCrpD~77$0#H>Ls@4-Uk{R7c z%e&#DAE4XUM?d0faPIXBFz7G-p%oD z{xE-vf0Ta_HKGW59{m@-5#NSO_z#wQL|FE#*XHWe+hf2tlwnDZO6eRN$y&@y9h!}g zOaeWtSGa60m&25#Vs)|lx@MbeosOQ4B^7<$e)lGu%dIEHbGVFQ}T$`mz4!Lx3P?BTuf{gU>?3|Pz%+6)BNE=KRRU{JQ zM2*l)s*5d2`;H=a$!NOhd1GR&8PP|NR`^ zhi>L`+;W}zQ&GtD6iMA%D0n3D4vKqF&%fJTY|V4}QpjUvD~ zN)1$kTN^(yE9Ri>TLA7U^9m?f6lx5xK<3>^IG3Q0%)v%f;DWSQ=-Hozn(*$=W(;OC zT6%3MI3t&QNr4wuA_0lCCLJyU#hv(t8q}Z%BxZI3%tz!uZP1vbcTP4dz0Lr zzoYh_wK2!fCcE9oPC_4uh_|P61KDi-y(3YR$y%#Yc0)r$PX%lxTr<`Rp1lTo9_9Q9 z?Rj>8IN*y0#F1d=(5P>`{@gd3xHp#H!1i;7s{+IrMF$46{ecOXg45nY!1zYRQD5Xx z{ZXtmp->7Y?Dq{p#~O_lW?|Pb#gqpukqd_2q$H@=0G>r`KOOdF91M&v?5{tT>#DJk zatV~)9=g$SK7InWd^K@TqG-(TJIia#Pio9tv41==n=Z0)3G?0_wketFsBU7PMAGd4 zxGQ@7@3$=~=V6P=dBmb}9<`{P&skK?V-}V3d5g;Vf<@&#&gTEyI6R6T=3n90lH1F6 zmHNu7G-G-{Gp3Im91BOSv8Py9y(c(q$xq}2%7osGo(5MQA2np9LA z7#Z^)8VOXtjecFT+FGkw?W#WpM-2?SR1CW)2H4zMj08i&BLRk`3dkjbFllgMWJY2etZ-c@I(0PxQzb+e~@cXQMtH;Y{I>e$;d!hm3;$*g_=VQMeIw*G z`$E3qz-WN9<(u3%Sc^a!QN$k(jz`DBf~a*Ih(jBn+NW;QI-PGkSZPL;{QpSn_J#t?9`5)u*^68VG@YMMo3iTOM1}u#P-T^72JTNmn@>B>fFKR4@_^`Xj<$ZMHQXs1ft9 zUmt5+u>Bu<*8<&Eai;H`u^~!gu#-39Y5V$0yGvhE!8-R4_m%MGluZpA9=)~qtzZhJ>&wadD-3BFRJ3gs#liqisX ze?>VIXNL^M*})shw2PD)hlh10KeJ(d!W*dNcwTr?cvN@@bb|pf0uCU%AqV~f+yqX6N5Es?2jCU(I(Qqr3;r8cz-qV> zHo{JL3G~5zFb=2T)$j&*2Ye7d3ZH^6!q?!>;XCj@k#cw!2Ep3Up^;9FY}ZJKMsC!| zHjQl6$QF&@>ou}LBiCu&#P6f9j7OaI771SRX$@6y!YT3Tx`N84qA*&`XKub4eu zjM)=#12V>O&C?$;cWn--?IxWesfuoFve}d~aB~ulD=o$7g86u2Ix!W`lH*>- z@$(tr%}Mnq)YoZmsZPUK$zTjw@;NjbVGNNkg2kAfNFP%$wmTe0T07BS2GBz6m*Og| z#*1Tii>s=tCh6iB94pX#P#s63nN;-9L_*vBhXqT065=BMfYpm zS7{Y(tPqSD+F0SphZ%E^D;HnFJOtk*F>l7NnZba}9v8*tZ_sZA+K1P9NzFKFg%X*? z- zhX(03AF}5wJDrM5n%~mx)s1X4*^TjRu1Pwe+lofAn4ZQ?l}F7p-J?`{ESk!Z-S=jN zq-2zj>o;bRFG$m%Y-g61#cs{c_m!5Cjpi6eAKhpkmq&EwgE(OvNKBSr9zsmc;DU!8 zEY%XXKiLWhNncrOmHxu@WlsTbY2?($9cDN<>h2BA#A1nTHaRoVB6<3KA$PAF%$Vyr zd4y!M{6-U+`0Uxoj6R)+(hUT67QR%u@^&m<3ycmomqSG(7}r}n&yD(wyBIicDL z!&`O6RP-9dF9i$Fc8U0`fu7lNv zIk*la+W#j6=m)38Ux;fEdFHQtcVV@*Q@pxiNuRAKi>`h&1us1b05HMf& z%5vS2T&#OL@e1PTNH|KJUVT(ZRllvUf)2Kk`gE{eASVZZWTJ5&>d&a^yZ4!|{?T&vkyx7=kikbn&BV~n z5{^kLH71Vdn)Fc69h$GX*iU?C@*L|53S~!N!0h9t+R)FHVZm}S7)Q4um_zCKi83_! z9u-c1@e&nILWScqd-evy$(6&wa&78B(1)jOvWYR`HP?agu`@KgirdxK>!kX6`8FeXJm^VhVhJgimSUMiG?$Q2rt#N;GI;<0jRN=xw2J!>an`Q<&cZqz2QvWb zs+J9sIGA=OQnLBOr`OaFYl=IChE-&gkXU`1ve(Ao214@{7>sP^3kr7JpGY~I~WWEo22bhyVNT=npmeXxleuf{e}7( z)JIcLkap6jOxoOVR|L}Y<&e@z9?*0yBlY!3GKYhB&w?qfhQP|7EUc{|7E)bR2R`@- zea_305%g5e4ZKPqJ*T~JVLX~>Zo$L57Cf=kjNU$)CQ)r9gCbj$DcQk9PKrv|TqZR& zCM7fJNiy4vBZ_lhKK&(i9+3PV{r(FA>;)F(lFDJ!F{$YQ%BKJA7`3lsZ8TU50J5g3XV5_nj_ctw48-gIm*i=;GXPs#p8#Z&Wn4wO|RaJwn zq{qdmX3Xz#V+($(pFn4jC?FX)Gr6n|%#7B5Vkp~-pHZM}W}%pS(i4I5x(0;?IGqhb ztPDbofq>`#`h;%?=>MmLmxb4bUkbkyJ`@*<%f&`Cn z-1QvyIgY!5<37)EH*(xxaokND_XUpoBFEj#akp^XtsHk7$KB3xcW~UD9QP%TyNlya zaopV;cMr!s$Z-#I+?P4-5sv$7j{6G7eU;cRB8R9QQcKJ;8C`=eQ?1?kSG@TaJ60=GT>5eX$?BZ*8nWBPKbaiBkqo)d4gIXfAbD4V7BzvG2g zJY>bjVckhGWL?aj;$^;t_%E7;D31-4mYq>UQuDS@bI^y^&$IKbE|oR~=D64(Ns9W!$~i~5?v1_gC%zD7mO9KmKj z>bEr1*fZZE$>^Fj@Qgl^zR(s_11{?Do3jR(-(YHhe*bp}um)@s(}*|+uKeEO@oJ%! z8UV3XRjqjZPxkWQI51%^4$@+cA#k1E5YTBcyH&3%$as&B5i1xlehTa_jP$!)?vOQh zqwqz&Y0qddJ0zx%3MWuJiW_+XCqf%}>d-)zPO#tP`BD|ny@rk#S%o=_VYZkG=}2*= zMp!FbpR0%;nqUfhhuwiuix8bQKqM<*v$Z=MNpNvT)Q% zc5LFiemO^d2eubBmyKOQ5l?C&bRru@4Ym3DZ_w+{inrOi*s%+nr9$W|Y{K3t<(!5( z3Sm!r!WTVczWUAO>Qm9E@;f^?-D$e2cYC2rT|u**uArfXtXOc>WT>`x0KYOldaapt zR+|f*>Y*4e^-v6a`a~!-X1>~u|GP$jOF*sIiwH}ve0Om|zqrm% zzDDymz`UWKO(k+s>q-aF23}xVLVf6ai$`jdFHG60=Z^#ffv^RKKg8z$W10T4Xj@mi zlVTX2naHK4Cx~aV!%3WuTl*xZqqAFwOTJTuc2)5(g|@0Hzd$~PF&RmwGsmJC3-%_R z=3I|bb8=cfoT#xG=QK5H$1^pz;EX2i@FJONK9uBl#K_9?&M-MqNl-TVj2Bai-*r;m z8J?V6Ip!LV_Qs;kciHBMc#X+MIZwYTV!}_ml|suuX|q*sxF_b z$X{kwgolY({J{9J174rEr^DIRHeNr3B%ZWX;%+4IvzAJ{480;(BrEd6W=TY^M~?-s z$Hnte)eV{n1XmsUgX*l7j{kS!_#ZcjuZUHM{6Ai3(A;O_@Y`{O3^@{}&xwo!r@^3K z6^{nZ4t~_HW-;Tqt!3jlY#xNXQ^~aX`nMYyEkrgRHh1f67LuW=zO}H0`YNfx)gY@L z#HX@Nn0$;dQQl#oydoWGuXDC4IgGv1TV}5ilzU7*HIOL3(Xi%`Xk775eZ}w5&H+UA z-eXkn?&CSnM0Cu8dT%pOU6GEI*S+&fj*^Dw|1JQ%0_X+1K@Qvv3gEY}2DZatco^Oc zpMbBzU!AG``_t>s=~`N8U&BO}RRVioTxsuNlMUi~*H_y6%8Ka2e79EG18kwWqkZe5 z=FS@QdrhT%Ggq!G_O~uzZdnL$T`XfR68OqWdn=#E1O(TiHjeSF3pYGVsBc}>D-pl# zmG-r|WD@vWAAVUM|GQiGop7$s`k(3R(>eD~=iJZwoIA_?9mhS#anEzy3mo?%$GyaH zFLPXh<6hyoBK7~>EIx!@Dq28UnmyYRYf>tIu$WdLCAtVC5&$P@KBW1-&>i$0&m5KG`AkPMxfIT6k;o>8 z=)^=ihL_Ci!{Q{f`lvWb6`$fS+gF^bQOqX1Edbk1!(P<)qE0nnfh+V)-4IxlZF4#t zj!_@=hNh-clQWYVbcx_)J)zo->iGUZaZ!{vO5XxtM0dkplK zg`=;)!D}yP@aun`5nvY>6Hg)HlXK1J zHdvX#Thp>`yg@A|>TT*>#fTC%w?_?|JCRK!%#SlWZ?nPr8yX8Coy_u(h(T zvv{yP3UF-Pk|%ZH#}1oI6w=2uHh4IL#mkj9uR(qDP)RJ?d^}>gSEmdHzN-ufPSio6 z{eMh=K5&=#mbeCyXZ$vmpioUAJCC=97e_i0M|Em$`=4lXgO>nM3i9J-ojmI2cK z|5gDuf`E7s5oi0#dy8?p1_ym>eZ=32+Ez5=nu=M_Sj222Wqlvtwkn$NjjNKX?l1tpRJtW6LtcndV@fz_a@oVA>;?KnY0t>+k&Ealch7>p0GdS3I}})hwv$u zo(MkJZS_N>cqFi^?uRrr><)!jKd=z4z%(iHAZ11gL)Jy$%8hg%@2C!f%v^(%T#-KYK7zrzDe7s?Azt4NAJGksEELhGQ zTJ~#vyBd$%L4tTM#`6(Onm1UxgirGBa4-1)tIQ<1YDHa&d&!5o+uVDW{83jZwB&v4 z|36Pm3u0P)6S%>*p&j0IRzHb9@9S_ye$-6oZafn`mYN!CiwO@|C2CxFc)TLN+e}eO z^oeB=rn{^WG%lRVRpe8q3p#Kpm79$I4|`Vv-bQt;XYS4JC3e6`ypLmrEI5mu#7X2h zi7m;o8d-KEFEJ(zjx0F}vgArKA%XOvJRVyip$}TNusoKq7Fu}F(2vK**N^s9Kp#sX zgs`=gwU1JkJRSuC?=CaaJ+hoQ{m>-kWs)yB|Cy_~_uQE~_nb55o;#>ldS7HrtUvRW zQr##N=#5lYlODbQA2k1u@o`cjdJ>?g0D2mr-vRVr06hcHvj9B@(DMNO9-tQhdJ&*~ z0KEjzet=#E=m0>k0Q4$AuL1NrKyLu_2Y~(v(3=4L381$CdK;j30D2do_W*hypg#lj z-vE68&|d)h5TL&T^btTG1M~?%p8|9cp#K5rGl2dVpw9vN8$e$G^d&%F0d!~*DwT@R zWC=}1RmhB*(RwzLFGe?`y+rqa4;{o4Z~?9$W7v$_@R|5Ld>OtI@5L{Wv3p`=z<2GS z4@X;rQ?*;w>TJ3d^yEYelS&gm>1tP<9WB{bj@p~4bx`;L4S8v6?p7@p^0y)TbgF4m zY_qBkTc^#Dy@8b{9GBZ|&ptyh-@aaL>vCnQ)QBNEDKRY;s&?19=H6gmz#GoFCCRTA z`FAJzH6s7EB!7{}zl+)hZEJ~2-dS-4Rl6zeaIRs^cdxDZ5j77e&t>hd*u@Gv9IB-$ zyNR73wAIp)ZPQP*I&-EM;CZO6rGstDqc&Kr#GZCf`2mxQaM!fCY-<)yIiK2eNlgCZ zA^oJzDVKt>)l*`iY&9tRLr}J6$_`Mr29&)FlwCCCpF!D0pzP(`|MxSA7&9<{Bd1K5&C2avKro;4N< z%2=tAZisj5x5|^aRn(Q1aY4tul}6AsA|^8)gok?phr0mNeE%CG-z9d>!~-?5%1C;-MZv$Xw2~e3;vM-cn22_VheZ=j;cU3RCnwaZ;{IbBmji#YfP%c2#WVQH&b z+|WRpFnI!Nzth%5TS+QywGejUQzzq76I>#Ky;W^4eMe+=+FWiTY0+xd8P3)Q*BW;r zb3hZ&-t21aDtv-|rBt0A4o7JZKcPD8?sj+S9`+lS*1%o(0PCtYi&~?)yIUM~=UR99 zF6ywLJk}t#+=y&Tb3g&>L!LaJD+jpXB=g9TF}=r^y!);`lsbr^nlP6kchL zWfhCUD;@})?Nzt>(y)YumlO;I z10l~@ssZbSr8m+_r%My|GTVgNo{2_@awV8LgBFdgh&y#lYgRS0vNlnIae?P zcxfFb@_#o;xB!ijXA$D>8=f2D?RmP{)xfN-;;@%J?gm+1_m0BqNohIh8D5lmvQ9_NC>O;thyYe;RR>in<`qqn?m(DtB zds%CeW-6z*f;DqFX)W6V5wF?8ZDNH6_6@}vp@>gWEpNte#g_a>JY9r%)6N;kq(Piiw zbQ>A*kD}kA7tkNj2k3J$=JRj~o{bmd)!0EseIFjg=i!U-RrqEy?)Ty+@U!?;{2o4d ztVaIvd(f}S177L?&)P1~7Yg)60)4SSUn0<#3iJ;J`Z9sOT%dOf^pygAl|cVkpnoFJ z*9r9X0=-+HZxHAk1^Om|zFDCEO`vZR=-UN)k3ioc(02;-T>^ctK>t*r?-S_z1^QobZR1Vp1yb#Aq`lJJ(r$eufOnIPqC|B3jR4&M&~AXP2UoEIWC5rVpay_e1GEaD zl>pTPv;v?yfXo0b2WS~UOW|AkFmLe1hk5hY9A?IVvk9DO;4B1ZC^&n;nGMc*a7Ki) zC7em&EDL8~I6K3c8_w!*#)sMf)D)l=0W}P$eL&3wYAsNsf!Yq#grJrLH7KZELCp(l zWl&>-+8osMpcV)B-CTbPWjto`>2Iov|DRU)=3Zp+g=XE|Qx zILo2y_%h%6ON4Hx&O%zN-uNbez^g>q5oA`#rq@e!C)b zps@6kI-v9aZ0S)+dPh1aBRNklldEL2+$?v>eR5dZFFh$eDxWX!ly}Q_%X{VD$j`|8 z8l%L$lDo zpzG27WK_S1-bSC`iMSZg#|_v;#`h4u0AG!7$9wU!_&p;=`HAB=I9TL}>h5;a)$D4s zs+zX5kQdeMvKE)?WLI%9^(_&SjKtys7J$NHYRH3ZTi;f+M?2ePw-!&*e$?eEE@km6 z^y+lzHrdzE3QG2{Xc@+(i}o4sGu{rmhpnr+ma=l)0&7tXV}tCEIW%bqO9gF z#)xT^yBl3La-oWw6Tj(jld(sOd_z+yFcyVbSL-Eg>Ux@Pp=NCf+crW~I~!;eQPE#{ z0j5ndEmAGvVMD4)Udp5&qAFLF`-+N^e9{?7etwc)yIA07as9tk!u9A<`5x(ALMD$` zQ+y>e17uIB%sd(A%$^SFbcRsPq$b ztE*0N*cv)*YEx69Y@M<_DI2>?Lc9g>I+i_4PG--t(fx7A&oeHdH$_0bV$$w8$@c18 z!P+q=n!JHGS(iBDP4=ZcTf@3~V%QrU3I{1ISesfYQU9Mn)O=~bTrb~(#-jjw4%hyJ z`~S#cg!AMp11eD}jHqOW5tURLQHjZjN@f{R$!sGknM>z?EZrud=jFS|f5+vqLyj-c z*Y;yx9xLS=GPAW|Mq~sWw=!*j8gnxF`^4BRy-7lR*6f9I%u4$vujZLi{1INNim!gN zYfIe3317cT!d;^U>CKEU%hw{H2VygM2sDl7WDYHF<~?j<9~mLPo}OS&OCT7gy~7-c zv~^p+`eLEIshuRov9Z4C4Q}Nzd`igU849O_vI$p8?Wno&rTWvdDi&f-OMz#T*O#RwpvTZY^dTOH^N8Jl3a-X0@Om62 zR{t;YYsdOsaN;=b4raYK+pVhA)@ircSoXlI{IuLDX}K)to$9i!>#(`oRk~y->zv`N zt;1Q{m{lvX%x2~W9f5z|2>k6df1v7WZONL-yb{#F&nirkMM<(aNtQ6b8nxo-=A^Ao z!LOFJ_b}%kVT+mgIqL1`aPdt|g(BA-xybcLF0%W`MQ-5n|3wn|1{KS536VHd@vjubADGOxr2;!6^19QxTB zhXNKn?hknV25b-R8LNyU2`pQrBQ}e41nmiDNYTu}VIqsA6G{kOz;kANvA*VNt+wV$ zTSp!=AfvTs%=eCT|A##QLi5CB4+1;&rf!cf($gnY#wvNb={|p0g zTaBpXHX|yzozMR!2~R-dS_Q;SXyhv-@~-lpwIyT#!kKvw)!6<5jxRY>Q3iM)RPbn2Uypx;H86NJ1u7 z@9M3hiVd9;+g%+tGn)~;ecnFmhj6%U=EfnP&l^_AgctS^g$_)H`V|s(FkS5%ji0Ko zfwaYBeycqLgT}~z?NP|DH42E|(ijMs*mR7`t}9NBX(pb#9U#2#<+*jjMAx5%a+uyi*z{y(QtPXb-BDpOm`@cuU%x zk^8t!iuuPFn^oPh;QW@s*vzp~tS6H-i<_#FDjNr5CIhSV&?^10N>XJ@CaYvY@1(Bf z1F;#Tu8vIBmDpZ@*H>XweY7u^55*KxpEpzWMZ9DL(s~D$F4@TcrS;Z5M8-&1igjnI zUaoP_=;3~EnD(r>h{gZP`y_dv{3rP%`4F0frXdrmMk~=;v>tg;82uBv3|&j!4iBQo z(eKa!^e#GxWt@l0@qAp59k>T?##`~l_-ecdKZKvazsGOlk4N(-Bk!2QA33Vp8w>?& zE1e=}6+xQ_)``F+0=Ed-MbIIFP7!n^!P3fZ5u7H19ub@_f(;@#Lj)=Z5t;(3w15Y^ zaWGW`(?l>`1cf3f5<#&DN<>g9f-(`5i$D=Ug$QPdpi%@T5zG|9DI%C9g4rUNBZ9di zI8_8yJQk0E+QlVbK=>tuUqN^X!mlCx2EbAYLK#8?A%<`agkvEb2jO@KCqOt6!bx=e z&yjaY@-DXe{}=MF<>%zr-UD^G1$VJE|1o?Weh@#6-!^(^e8DQ} z43l@c&-5uTI5-sbm_AO>5z{A}rdgj&FY^m%o51lrp%hY&hv|J@kcJ?d-qh%=L67Mb z8q1p8+>qxC^{GR_fIoPa>22QFp{So+;yn&n4sFu`R#|T(%Gy-Cj%L&I^$rE10#E|!BB)oycW-3zaxmym5dJ4-YotBqqi`6JH3S93NqbC1?l%joh&`EGN0C`B@8k> zPa}rKZzraQXd?;7Q|#0V(sW$K4q5{Np}}a`t-Jwdf zE4L9a`P&`RY@XFy|_eLM0f*Wzz%ys3?IS6UI5??!`c|=?Js=x5evt& z^Q5|1zg(J=<1fvr%PGxCx-16Sc9MFReJZ#yyQAb?iwE=6X7y7s*KRMo()R9 zBKSemm(ow~7#q*ZlPs}*x&m~2X^th0)K+iA6ZVt$YuH%H$JkOuXR83&(hwF1aF~YD zUKqI(go26qc7J?Qp0tE_L~m)%l9Z01TVL8U7y2+l58Rcu2Zjl+H*O@E_45f~!|{nD zKI_%T=vl8G&9h!Ts%O1A?X%9l|4Uy>(${i8K7g9h!`OuX)$m#87##!u$KJEWHga7z zoLMCi9okyAj=NcN_wHINkrG96NWCR$m!e*@sYglfZZ`WMM$|~8mm(ED^zdrka&6d- zoz`~hBu&z$PTHWg3k89pR! zA&wGQgI#g%x#!+<&V8J7?w$KMQNG^F30M6bUFQ>~QnQ;%?To3^&YDV%m`d%Osnj}| z{lCNskMoammn^;q?Lp;i<&h3T(jFobXs%dXq4v20d(fbK~&~QLycL!QR(R5 z`k0-#X1Dc$#L8XW+Re}{m$k4iWiraOxObWfTg%n;n|dj0V>R!`QhB(83zlUx`giQM zV111qh4TZo%D;a=->06<#;#92o>s|n#n!?3Ss^6sHovhDOm}=hdg09ee$U9>ZqG=) z*Tee%S&si#{xORKUW^a8!XInu3X4bR3WH-L{M12R;d(}!xWe^_I#>9kOnpW^z0d2qz4rWKqs{df4|NQTZ7i)iPEf=>MOw zq&Q2;@|@*O%R81oviyKQ!Jp+v`OEwU|04e@{O|Gi`S0^T608Cd28FP2L&ym`!VAJ{ z!dHZE3V(dOC+Hv#-S~oMutdTO(}~dHRCr;Qe61n$*BV0KY6$)MIboVXFE8NM4lx$N z{oT3~UcRy~##eEAScjpDT5BGaY95tt9`#Ja4L}bygnqms)YcICa6{-L4WS)JxMAtX zZle*}f1djcXZZ&FG2^+{S2=N#JH?dnz4p_#UQoh0dKQMc8ra`l1LKh@gz;3Pf2jt} zX(x9Wlx=r`Fak_D?-b<%y@iDx(}w>w>kOzkZ%d?nUfQWw(u{x-eBsj-fmyB7HrtCa zyX~ygZqsryx6FdYoedc*u;-TYf>+Iyl0|Zd)LO9WlakYGsp68fCZjcj@?!v6N*f3z zj^R2Jh6JIMw8AayL7-5S^3-n|Q!0oZiOp+8B9V7QBKR! z=>@@VbE?`&>pSMEsQ!bis6%qH$EEBU-2=G$hIOmXj+IU~>ghKbZt9Nqu- zG42j0yexF^zs)~w`4`JN_agwb{@E;h+qm*t>o)}Grp!_i|LnQVvd477NhG{gcDEhD z76_m$mHU8l;IJtdb_(fix`<23-}yi)yIM&ji8OANdx6H#Vbfqo?ngX7|L>)8Pb*jc zH`Fk=N2OGDnoSpXI?S{A|F=0|fd4tm_u%En^|@!i{~T^YW|OyX%ux?sj z2iCqc`0np^aOZ&Ov$m5X^!Sa(*je^r$h%b>U*E{*ia8t~IMi*@RiX~3?sA4I*sxoA z_Wm8btvSHMcxRE_)|{XVBcaAxrT(}V8{7#@lBxh2ePb-qSAc?{7X|(Q^V}i_|88(; zZj*bSd!74L?k~CjwRkO(XM=PgKau;A+g%k7V*cKo~i^q|Oso$iBYA5E2HfHS6 zGlh#Y@IYl;4pu|}TSZ2sm6g0)DB$!w80U0`a#XqUfSPWSE>AfnxeOFYirHecR#%G5ZX&FFRjVym&V3w zO3g@x+-s}Y@iVHXt%s=eGq_qdbogJd_AY>dy$V2MNm*~(L+??lUDhjYO6d&M-+PyW zmYY@(LgfiO`CluD0a_3d=?KbUaIbPuIZ~DrD&+vK{9eV-v>epjR2W&`{o zRFcjnGo=-obZfS!n-oeL8@YV3>NPgaRvRcpDx`z!1;Ytt60+NR**YT)FEQ8pt-*TZ zS-&&bz>8r4l0HI{=h@0xJo%qF0;kz-=hE<1+yP*!Aaxtk^j-jEhq(Yohmh`6Xygwz zbpdErDuAv3UEqY5gopVr@@FjHw79rG;1>RW{rj2na2r=%Z0-5Qcw<5&^tLTq9s*)l zTT3jNEG#DrjNoQ@(42L{`c}afEDxAYm@Zf@mHW+Em0CULBE{(X&8C}V1?@9=W%!_4 z!=mYgsl?3x{|;yQ4&Tk+27olEbrEOpo};Xb-pJ9X+GzL$^~SZjw}3(WySGsZEL;J zco0$N{%ee8E1fuL&IUl;Y(=0tM3|cn&(6hL%W$H}sE5%u?yq(DeY$ZEjCuf3oiN4i z7Ic?I{YZyprAd6d^5jXbTaowz+ee|IUJXyh=UOZ9ttJ9f(lr~39lrj0f!Tmy4|!=$ z`t^Tp`~{A`z`wx%)3NnGei}S2HF2c3rP+7hX{iN0_0^VU-`P_4BGq{pv`s;l^6MUW zDHWDimp#laJIv?z@Qe?qutq5GSUu_RwTT7 z0{1v(!BWX9^jb}FIW}nx5Uh)(zC^D5>UoPd>tk!rcT_9lO*7DLi zf!Ec%ER#ZRwTLuF$xg0Bl2VrBWgu6~r^uxP zzg|%HO3p4^CbRUkoD5l_Q)eWSPQoZgCKAv^NCEG`T;8$Lb2N~8OrcI@a*!)MKF3Am zG{ol#I(T@Tj$b99NbSD>rgkCvdq#GE%Xc&Rs8XRjw8F6rxma1CRB9 z+|qaqNhU*yam1&%bO0jpTv5u5k|D8w+dt$b-7KaXqC}bwY4x*{ zWQYWL;h8bW&*E(tt&+LP2)50QL6w}n6tZ(?0A9t#_ZUyo^)_8h7on0%8T9=^D zAfuyLkcwa~&>%jj^=#i}x{$`N*_vFjr7$$(nMJb9F7^f9MW4EJn)FQ&|8Tz=f=;%T zN+(lfOJ>com?O7kc>}aTAqCWF0kC{r#P9bS60GF1-9>2H(4?$Z)d^o%Tyi)`A|Vyl z$z~2Zd>VLjoColErw%PLJ+-tLjT4_9G8vAOK@Bh$yS5ObNM0ih(Lj58Jb_SL9Gvtf z=7aHSK35tfyP_r=s)E8((~Gre2t%}yDx*`;;5=hhG{Axi%;UijnSv6{7DmaEm>4E~ z_#&n|@*XMzhgs0tL3`whVP#YU(AMN}hj z`l;zqya6(Wvqofq&rPYV(q9i}*=z9F^uiR~J3D!KW@b97D^4wDCOSPG56@3yGOZ_o zzd-x)Qm!y&gl^^XEA`M7(D2dRR=`^e&&A~IN(6Emv(o+RppBkD^xHmyX_vth{;6<%8c*yP%*M8Wt_B7R*3_l6M=pwSb}0H zpB-aR6{8(V#HQm8tvvAMrW=dWMQVUhs7^?Kmw*nIwbY@=bTIlr>8*FsRCt)BKpy~X z#3EC|RPFn-=z0KxbQ_Hus_qQc@p!UYX@hEaY>nVLTxG3ObCBe2)_XLPRcooeW z;-ej8=c=W^YlOT27mrqSvvMpb&C;Q^bf?;=uqlUf87Og`v|0_Zx^b$p^NUjsP0hNh ziqA#!93QVLJS>Q6emZ65(&;cnqLyilH2SH{VYZrnR!NNr3H&2Yg`-`8=QPDVrn73Z z({b$n3*pJh$TXP28%oVKm&T!#N^h^zD3q4A%2h}&S4feI;_V?CjgQ5a67b(U6%9BX zI!S`@V3#I{b7G=ubaV`0qi#yx%IbDCpIZkVMf*%K7XW`l=^j{H69M1AAnPO)kHxkF z9>8fcZbye%Es6jljj7FLyqFs!EHQ1pj&lxGnrJxI=mpodx@5^SttN1q5*>1A9I$`w5v3j?JXDq897^vlV=`*9+ZTRs)dwY$&2&Q)yoYC4YOYnv}-Sw7^{e(~ghR zKHRQP8)=$0qNd%Yi47^KgVG=!z-cNJUrR()ikzMB`>JfCTr?8fp4 z`Gx{22%~innnbH9mS0VVWOtW1v?kjnI#m%2W-6fR_Fc{7jA>}ijS`ert%Yr`HAYR8 zLml4LD%Mqo_Sjk{ zSz~)xCmJ-@zCN&wtmQ(VYtV8JVrCB{?h(sct-t*xV%6Cj@H646UJ1~Z-2#;qz>K!Ff83yWZ zG7rOdl3LD4+1n(QUQ4+df;dWIbSJL7o-P*A&8D-uYyz7q)cAZf0snE56b7w0R`M#^ z)DRQEh%w!8Pn&vmX)~@=cPcYiOna)sI{*X%Iw2Kxtwwok%*mB%-dFT_D{ht{S8+he zOl7QTVyixVz1U(ivBermCIU4T-qoef*Ny8dT;Z!a4Hu}H5mXHvn<+9lk<~=Ifx6kk zs++48g2TvBAIehAqAT#6qb?JzOt2}Vxxp{hgf%bPx=4twp(*8MlH4d!S9x8+?|Zn7 zdqd8rH&XZsssO_Y{b`@jFCg(Wos(l{{%B@Pktfnf7f@4^g-a&P^&Dk{%CZ5^@G;DDreD9*vOQ0CCho zsWo=)Hi%%K8X8970J>oWH2K8^l`kwpIuFSh(rmvMZ9leAt*7l`=!!9;p)_su!yoO8}O z=bUrSIp-Xzs(S*^gETNB>FzYUSkTi`-PNJ0KGoGdGoGk9Rs-cp+tdX}Cu)vgi+;JT zSNFH=T6I&n8+W4oj7{4kJRSPQsoyUqsM)^QE6V!-UI`za<-I-Y-J@Ym!j{FXp{^Nf zH^wUK)g&(5ppO$DU%5y9+5AeQ@C1ZNy@_4WOaX{4p%n4nELHhUMRK#>sMQ<%c6#!5 z{Y9xF9?Xb4p6PZ_tyk=vIBc3*S1~X63NaEFTtjVP<_HxlLW? zpFx@beA;_^s!d-U6iE!E6UZN5v099h+v9xa3yt=g z<45S7w|_i*=&o}4!wdV#X>Y>STu1X=Li6uVEFh%Z)dPnIzQzJPtUs_VEISY2Alte?bhvk`rY62{+Y~VGP!ciBa9bVj8&`vwV>qAdo3%=%FSh7|3+N$(yMjwP)c*STmmrhvb*_#OmwQ4bp!h(FWWqwW+zb0XYHUV>&;ha-PSxcX7;IMPLzs z@KWP_Gb|i^<6J{Qg9c}Eln;T$_QRcSR}Vc05;>6g4y{Bo58i)kbzfgvytS~hus)nI z?(G;0aVk)g+NC1%1xFcd2QvC$eX^#Cho6R}E`fGwt9EgZ(fS>$u6Y|Lw^w(QX?v4r zM{58?!!j`Wo98)ivu&gFQs-`=U$8{x-Gd$EFv$zZUaqq>M~<|P7-3$1SB~Uw9QtTq zZp&D=j@{}#EF3`|V0it~JD@+n5J))hsMqkwfdnp@@?_riVaQZMW^9S@KarMCSO$UT z7qVa*1`Vn;Y7Z)hVrgEDv551i6FgcHwWxR9-1+(J`RxnLY2`Sdqu&!|qCJi*jmPLG zo>F3dt5*?p0Ur584$y@ACU*9;E1pxxdj+prF%r$I0*P1KvIce#`cdyYBosMHXMY3K$c(i4|gR zX8IsLzl1f%AlL8IEUvE88j3{9j8dWw1xnhbf<*do5Z5%k$Jh4lWqo0xcfz)X*X{N7 zc9#mv+G_im=lx9`OKc)iYfRb#j@dj@iv90>ZbaH(*UfPa-3_e8-o&u^Wx^w| zyLMB`r^>Pv)a5hJORl=BbB4gtJSbtz@zJrBxM!gC8H0TWHCC-j#a)3jsC$H$Di%0;d#fEmavv?*FkxUH-gmd2BRC# z0EJ5z8@DUP%8_6SsVaY%=8aAIV?Go?q-H|7rP@PNl!YSiDZ)!y@e1LsD5CR=gk$`XIf z6tO9^X|csV@u$jc?R{RfE)#;aFRLySjs{@9FE%U99UIzUIi8WJY)1xKbI*TPk z)anZIw3&2UxvGuWK5;0|pAic!TQ1rY}SlvJq%rG0%^_f-%A zn!8uQ?TEH4(gB`A&P?1fq)V@v8tIpUVcEKdz zzgHg}2aqwE1~@t6rg7M%ow~s|YOp8TEAZl9CbA!mT};!MTkstztt75XaDt8`R&bXq zItC;)AxPtKi7Jk4z_<)KV7EAHQv@77NKAQpP9dvvwzS*Gno*m^{roPt-VQ3QWa!AP zW^*tW8m472u6TrYSp1Aoiq}@;7fzZPK9#icmc5X?`a83xvvu(>?l^fNd8JQvu%KH7 zNz7|0UdCKjr4)vGi#9aNzQ*%p(2L^G9YE&u-4QSvD{y~d>kqpG*Vp7?aRE*zV~OE( zf#_GGG!Y=Elx%;r?PtVAe89mc?rIy!}8}8G3vI3Uq|L6!3y60>8EhS zOyPHM4v`Wm-WgB)p|N8=k-2PR<2D6hZ4S`ecVCo2cs@l;INv}87!pQhEXY}vlG)>g z(8B@9?e-Hh<7EUDygk3P-S&^XC{kp#yD7cWiK3(3_AT#Df)LfG#xBYOwARM%LV#r! zit3SNJKMq5B&=t%3!0o!yfkWcm({w zlGm2z5I#j2i`AwQn`BD{b8ZggSl@U6lB$uwr;_HhNu8m|c=QXI;*nNsX|K;+fEQkm zAq6@%l&HBStELkH0AdcrH_VCQS%rp`^wEc6 zcPcG0{(rjKB&i_cqMV3)R5Wk||0x|Yo{c>jQ>@6xf6R*3s@K4d7jA0nga8C zbwVLpYZA(=vI;63W$>k0P37lIgZNMdh584Wy%2rz=BsSyA~IT?O;m~UCkO6F--yNi z0q}zp#!X-YElC)o<@3?jw}M#5veE`W!Ypm%Ki_zAn_`X%8xJq&=eeH#_<3-_KIQZ5 z*i02~;kX&JvTxyNv5_7Df<91xj_3T0Za1_GcVDmq`cS^(fBm_kJbT$0SxUB91sN;F zT6KQm3-FesgCr%@e}!K2?!UeO8I_nuRv~W5PWOu-K6Y#(PfutmI`rxeC%ruXs{RU( zf{q4?i{^6T3vf+b0QmZa+;j?5n{?bntU$TL7)C%YqpSzc%|PE9XEnD{mxA&0yM6wo zIe=t@2#kAz>mAuy8>TtyL&pPD4+Fo}a<@A~ub_5`SN75BKl@y%F+8_B3~w6~ubdM}4@5 z*oAbZ750mJg4fTytwv%uwzMk9*#>&E!^@d+{p|q#r4f3n_xh;1T8n|cXP!tlc_ifZiz$##f|_N70eXCGm~3Dj z=#D_BKt$_zplKdz>#J8vT!9~nw$~j zf|&TnmA6slhq@tnGs72Id&6vXQ20m*jsA23E2IXg1whZQ_>t-`vSg8HWJ7UfiR**L zolYZqv`$58NJg-*5ruD)%uBfPWT7gM^-2oIDd|$6&96SejEJPgWpb>zZAR(^u(0Wc z3m!Hr8u9T5BhXENreSSM%Yv!5#+};tfmvMgTdoQZ#9+Ul+B?=6_S_&kOJplo#JiYQ0vp)_u zqTBwyNr++`J{k%WNg7c!yxYF!UifO&Ry!=C3fRU=>A&{5+|uGR>~M{*v+{a6`Z!cv zT0X-CjHpHRz_MP*5AwQm*{UV~G;Ix$TMqtspUnUk!d}!Jm$W#V3|elnT6X1cf;hN0 zgO43XwQ|Ch41%4(9{|s{!FX=pF=5~mxWiLj@pYZKGxR`M|5EIR6Yf@VNLHr0QQ&63E9Y1Gfg163t%BsB)Z>tityftt{$asy6VKaCEPW~W})=wvgH z?Au}4R16hhKlIf>sj#(+@F*C*e)Cs>Yd|6bnXTcwqcmxT6y zan9Y!+3i43&tyK9cx=yzo2FX>=RCQmR;`Wc(xU^VK6f6-*bG5vQWp$NDgk=+Mdq=W z;_-9JNQZIT$E4d|?;*#^jA2#;mVN6lTcIRbM0LvfPelJc%O?D{Fl0tKV1)K=m8J4S zW-kD~Yl8FKO7$C(R3v_T``R^v_+}dcsS5QvTX8K&1N0^^zH_HE z2nI^;wE>8#0_fw9NHYQ5=RDjqw{h)eY5?@&D$Q=VF7md`$kB{4!YZm$)mP`LqEo_o zT^PWCts@|sRELgT>SoSl91yGDx-{oqzrSXsQp8%Mc_%i1heNv^xPt>Wn_qM&Gz8+Z)l*fdF*0lEg2;2w`~w5XO)UUwm240yoL~IT1D)0Y z=s7M*k9JY*0XW+MU{?!Wzi?cH$k@Nmch1xH6{gy~D)7+gB~<@UMa0`AbdwG)6aX82 zFKUlBGKI~A-H+%k0MEEFux0)b?>7je?Aeigq2?;eOGzSu{*PN77&tP(yRu2V|0R&? z7%vWbz)1`8 z%hqy9J2>_hN;yMIKgth*Lx^1mMv>eJFbgYy24R#JheSG*DM$YBGQd!NCbrDi=rloj zZbNNLDEqNx%IaBrQGE|hj)ggR{|Uq}4M;|j!tMUorhXK@x078NI+TGaUgn>f+u*b~ zRq1w=_%n`j;+b%kZ1)lX!%-upt=xya(!%N}|4S5!u^ICdh1hRt9F1)_GN!%K+$CdUUtFhSRIhz zcUsefNB);5e3{QVk&gx`zUI^x5DBmJKaZqm(@nqJcr{^h;rKVhu30(aoa$Z5t=Z-O zIR8@xY@0k^?|3 z7V|8eDAW4LeSo8t{-$M&L z*q1TgkP+dy^Ow$c!IuIf-+xPoYGfAXg(F+~+fza@WIF%9)Omp5#e?7S=Q# z;Mk!C4A2?C^;f_zPH3MZf~tAO;9t57HJz9DwD^z&y9QHYSu42~{e>zemS` z%oT0nJCXM1UeLdq;84nfg58<_S@dDf92c_BnM*hQvPa4j`sa@a2@xuQRggD>pHUg% zP@VzPJQqMYPr9ibNkP7Vd3i>0rHL(mcT}}XX%oU{ zO?Efxaq!XcFZH*|Lw1Gjp0{!9&O)lSsDzo5Ke*|x3X*KOV?6^3`OEz$IGUtOMwi*P z=f?uquO}UsAFihlCVGw7PVU9FQTyS)(O(}Gn|7|wx0Cksc2-!&ofeY2JAQPSob<4L zdw7tW@WalTwzYbi`BZ{A@ny)AFlJ7N&-j!)#&1Tpp!ce|zJ0!4_|&My-^PO4{={92 z-qilo9bql~+-oQamLK+d&y_L0bHDWMm3o$z6nxK}ICOA*`Q)m3fSl0P)zG&?ha7-i z;NZlscVqJ3sA*o!DX*-3TuK>oL~GX;<)kw?PqFEq+pyHt*n70_*r*dNnZt>V63q2~ z0A>rFj^b;8FjQQiE;hbbz6)@MFqzRXHXS}qf|q{b#){?0-p;djg8L~#Qz^~r%(gg{ z!-R8Y&Bg+08^z{@on1ltBnBzDb+tQrn)}Uq))x0Eu8fv%Z9y#d@`c(`QMqw7&v4}@ zZX+>!6xpt2(U0u-=5?ITKFtDU4(!&Kzq{1_SdNN0Z%6o*JkQOXO5Aq(xL)3alo z(uAC9IJ9$f{EqLv_MUL)Q5AeqcjvPfh>iBL*Re_+s4Mxt5OD)Wyv{|LA?r<>HhBob z^ExVEk?E{1Ww`fb$ETIN_!q%Dw+D57GLTzrM(2o|QH!h)QQvn17Vy(j6i0GA`ZTy= z7|S#sR$>Vu9H zg$vcpK;|0TcRvY5mnL&nsy^Z{!ZdvkycTOZzmqK2GU#C3GfC$gI-i@+I2v1k@YL91 zOty4Z;h+;d*Dq9A2Xc6mxj=I5+PzHnBlt{?B4^8r8oA=uQf zU#L)1`)gd^{uIi7*Pr<{R5KDtG;5`)T( z)N|tZZ%SodTIfL+N3{e(6s==t$uN+?l)Xl82@nC(Gz2T-kZRUuaWA(u+Iy5s7Uk37 zg2)dJzuk+~YHS^yQh<-Rvs z4GetersH3$<)J3TD1WaMKNl(1kr8-QK2OWXuetd5SG(U-h7z*k*$cKA@k!tqsLSBhu9a`kL6*4v?4|b*gSf5Hc zb^9gI72EXUAZBh!;xf*f0%eIQj0lzW#;IX2e2Aeg%?>Q36+v7!z{*ma$6#hz&CqVS zMF8WM+sy1_-_@!>eS1mlP$FTApwB|$I0iQma)u0b`I*jsgk4d0hz-hjMV32z?^NZ` zIIR;LRNvHl_B=N=?;?v@&g_LbvnMm}F2fZMYrUK*-1lamZZ;nLnvJ9caq2N@@>}-O zBr-|M(n6h;8a40-Aa2~WT6&if*N)0dgKs7o5gJmzdyWl5{F!!H7Bk-E#8}&ZnEQdP z{A^n4vLm#0mM8A}w4XQyMHO1YgKiQcKiA_+qp4t&G1%m1Ql7$!qQ@HJo%N7H5R6ge^p$yz`^4zU^XSXIDdVPF}gc^Nyb@c!wOOu2XR>SPC z*)$gz3htRY?yEZ0^!w6{Z3E%v`Z+>tHnA$x?9P4?iOwtZh@)e{y~Mzm#IKV?FFTr7 z(9s>dn91Mbr4AD;dE~3eYRVW>sEXI;wu^jGx!r81`PtwpQN=l@RBgjtlJruLk*%OE zOW;_f?}=la@XKTAFl@LyQ0kgS!)5~hQI|K6SZ(0?c0{1|ScAEDe3yQ6i%c&>Y9_-_ zSW=}_J^LKrEKX(}@we#8NgtrNYkW~;{m|Po~Z7@LxD;cIDlcAZ@^Ns)sk&usB!Re{^_K1fqcbw_>jWKlanc6Um8 zw~zB>(M{J>Zc&7su$zftu)78G#9A?fa;}+-746A0=6Z^eUlX<%k(PU%)1T9Sa?Lr~ z)*7zcKeGAZLi~9xs_aNaFpjJMR@uuCF!p|j)05X7fo9`8Sbq@@&HAmJ(F5cOhZ-+Y z8ya^u3Dg+bAlC#ozuOvoB{L6vq~CTFeSa6P2}`#`52+lPSJ@0bhCm^qkKMd#Hs=Mr z#QeQo(Q6e=p8-K+iQ?>j(Xo*I3VO~Edk4htl=25^Ow(T`yMn(u*zdCW7p3$F0(`4L z2!?WWOa$dl{d1(z(&8>1`rmT7J%8@V549ENTMS68N13&VH3U)go!UZ4c^34c?cGh76X3#E>ZN&vq%gz&$>RsRYf z$(M0)Hbcu~5ejY;E515zR>qdzUR_aSnwbPmTPJkhf8?*bl6}0?e;(r7MZV?{;f(c0 zk4-%Hjst4nezjq`nM&OL(IEMjW0sK8B9YZ@_NdwfEdk~*LGg|y@j8ZG3NdzA<#ekO zRO+W7H?lRST%p&pI}qBNMPdB=H|tncf|70@Z#3l+QXSOcUCu`x4Jw9=2Y4i5c3hSKQ07GQ~rA9Ps_Z6WVvdt^CJ*0n_9y z)5qsgOGF+8?L(iZ+04%yH{YGRUd@eWaG^8O6yVpZ0YvpphNCU~kY`lr5uZUx5GETF zdr(WtV2mZPDmOU`jLMNv_^0O^eS-oLDx{rY9J4NB%9xTY0W-PTjMKOvQc7M0l-%e$ z2UoQW8Y=PIh+nEONFAR?uh9I|uoX6fVGln7K z5T70V@<+`!<|RyrA0Fl3S_6DCXbgXWRnTJblsJP+5@hGQ(r+zTNR*J}dGZ7ahGR~m zTFN-GLVzv28wPDy^htEy!${HVh>F+FxdduLJ>}60T zW7(qe7wJ`7)-F(xC#8a6N;rlZI$kGfZx*&!nSM>kyY*oyd87+OyWe8CS$UEc{08-i zRcTvUj_a{O#ig4Uv$a?*MrGOq8A{oBWl{9=G>W_+o#!TEOZQaDaEPIQZY?;fL%%C| z4BWa2xMIpW10e~3EX)!qc0lnn_#tPyX3(A<0^P^g}zdTkX)lDUtDUiBYa_}e+E!H=H>9kxcOdtn!zpA*hG zAOw_4B_@C><UPuH170n-e&&|4S-Nk<};oxllJ^L4tz6xa|4p<|YmAP3YpDnky-kSB*x#v~I z%ABp_g(z19LL7DMs#pPtgchUEWcTGxh+_o^YwOufbaAcJzV8ocux_#s_RO)V;m<>6 z*IWJ-d+iy8qjGVl6dKTKj*^8-Am9cy$D&MIJrB}9CgrTI_ zBg^2MZOypQ#$hN+Y6_pn_B$RDva{;$Jb$D&f+e?)cP1M>{P;Nt?`1m3;@+PgrzhSg z-9nQ<-T1ADf!0I8D>A4$mzV*ssi0{xI+IbvW)o|75OWZ zjLkC@Ih@>nW2e02AEIJ&hOJdHZo09OMk}iX{FK2ndhARV!2u6}^){U};lkRd1m_;## z@W=e{0-hOf!fz5BEK@zU!XtJW3ddNkjMBvqMES^(*&_G_O2rHiSoUpHk=jY)FY7N& zuiBQmG#2p?k*w0;zODXMU)cET3TrDn;7&3zcl|R{yXE*#{pZYjA@0^^eLj`zD}T*F z#=_@K8^&Ae*vvjZ7M$zTHCN5)Eg^g%_nT|z=he*)`i-vH4I|IJE9A#j?+*S`B;H#W z6)Vt*dt7d|9rhJz9H<6{AVTB;Bjk&~c}|Rej>|dRN88{>N633mM1s_j$z{*w*2j)z zTg}Kv=2`_>{ktm7N@NpEIPD0;qF|~)BeU5KbJU9&qReVoqc5I`#*ZMme$|qKV7)mV z!rA&R;K@q=)e%RR3htNAsYk|q1$_O%Y@ZrS!*yT(KA85ku3h4-ZImIdilx|SwW`7v z!=li>H@Q7x-f;UhEL=Fn=4#g^SoW+LC3skPQGyS>nBRKHOU)+2)*E?K8)$$dUenfG zFomsE1D!MFl2{h@!&qs)4{r<17&g2EF{_^Rw%@(N_MX;1)A(+p4jhpK^Jz%!!Wv>;S&0aujAh`|7JUi{H3gInYnx z;$2;*znEIK+8S9O?4Gr#2-5cW>z;`%VlR0h`yvra^C&W2DTFRY4vAV5+Q?F{JX##p zE>FBpDWO97M0+ze`6_8CA|}(!++sf^x->@$9Ql#Y{q0|jDC8{56?$A4gFOak5oTvn zZ`l7}&O1_x`m|ZD9BDFWQ|IL23MsOQC zTPPj7^K*)YrQXTKv1o*yNcH)!xgQG3d=)w<(e z+TOR<2ZE93aBTEn1D!BnCX&xcrDoyYO!RS`&%MJ8?3ZU+5gt6GqPYZPpnq|g_;ZGT zKn>>MznEbPbB6H}D7qpMLVt!Ua@yh=mU2c*^M-v=ZKNKFZ$x`Ie()21GR9B}dE(2! ziQhcMYOy7EMSix%TqJy8`ld#Lw$Xj?H^pb%f0inqO=`c5G-=Jfer6LpVS+lG40kym zY!CTuKHFV;wYu_YshWEj2mm$q*LksFL+=0VRG+pNNez}PF`>9|rkh=PL<7~M6(c}3!)1p(*3K}bjQ(`^@mg1HN@E*MZe^FgsxF_CDa77Ri+O^J z0Ab|;*nkox$_VcILHKm}01M7qHa$)#X?nLz^n}xCEo@1V$F%wzfe5;)f=4Byy^`2He2K@4(A;FxhOWsSNUUNebC8P{Sd=- zu69A>t#d&9`DiT98yAd}t#;#t2$VUs-avK2cBhlKot!h&)T+kq+-ve4kYlz!$Ab!M z8h|rYx@!w9G+B;+v>z(nhQ19P*yjnhghorY=l4K?jpqj8pye>Xwo#r6f>c^i?oJmL z=_>~2o&Uje)9>h`8D%r{EepH~GI_d=5BznSk2Z7J%Nl`-(R0%324SGHQm;z3NQqAnTh&h0ozl$8#|4k!8;T>R(z#{C!^XxpR zDk3-{nSMfABrJde2>PoVxaXa`b4vCq_zr`ed8ORrmOGwII!$DysjyTg!4d`Rs_Xd>8ya zXbHYZs6A3O?Sc&@`#0)r(#ZR%1=e+d;S$O24=J5ol#({%iic+f(Py^oy!Jyb>+piQE5jp;L9MrN6yVy~aM`+v~*Eo)xDEM^gCjReEmgqCD zY|axJ&f?g-A4I)Qjiz(tewkpeFoF$+xDV4e~J~1rudi1u4o3EPJ)a?te|gOsPGoxf*x;KJ!xJ|nfhjj{L18)4+Z<1Btc5m?AwW|@ zIkvOCwvVrWznu#zNS)gdSX~;KoNd`(+LV(eOBPosl+)D1^``4UHtczU;a^*|il@&H z6>mL9POQd&qpE$jc3=g+Pg4QYI_XlVfqlcQAu=y9-z(=A}0p#jn*Zr*Ebxc^wU0h`3|AS#u- zT*X=6=rg1J$jwwZ8S+dYI+}`N;fv?LiS#>NliMmEWBOKhw5m@3tQGo5>7p+Oe6-haT5js zX{2vSKh(T}$!cnCC$F1o|6TF>BH&KM^_A%P4DS`(tit89*miN0lHJ`~{uYa&dD&zW1_GEVyCz?zZ$RmeFm-MO%G%v) zxD`X9*`menDv49}oD9d4_5~`X!FDty#X@DCD4V@JFUOt~PPWDy_EU7C7S zn3!8^5JZ097p`HBW4-FBS+1*?EJnj=JeXI1sZX%j`S>6W%71cr1g@?=@!-jbhD>gp zbQ2j-g^eYbuAH30yAe+_2{kW`HZc7Kk%+xy%A2i7G&EvdnbhzD_g+Vd?sL|Iv$|~9 zDk-2tk}DlijU1w|OSx_JT%%-UYnG21(>^WW{&7Ni&v2OKa^f!xyt0K-5E2>)e1+vd zi5WQ(7}j^uXX>7x1?y@SilsO24o1RG(T>s|6)Q)&{cRsjgQuJJOL+M{I zjYGac-Voa*o5KE~F=k>x?p!_5^I!r*vftEQrAPAN1XYhBRs=e>^kZc#ZHrWQ=vM*} ztmU(<1AA<&vJRg7$T$Z_^FBGTfWf83;?={k)!$4lcD1IhxvZ$~)~sN{Kh;0gIZ9Vc zK>C6t{pL3ZqTCRYfVB9@2~}4VHRm-pJgZD=K0@1YudpGUnmU0k}tK3Y2XK0T98 zWQ#tTibe1FlO2&8{hQ8PRNg-}D|R|bdr-o%Q~jq`x92Pa6)XBXM)*Dl3=0Nnqnk}E zdi>t06@Hx8EOQ&cy8MLaBX6W(_P-4@V^C9NX@wXk$*L2V5X_gvPI*Ch94M5QAf!Dt z{0T`=E&9+ytFF&Gd-yCr+moeL?{uiN$DE*Ym#U$LTp1M2DtLQbL5RqQ7CU1r2cV^~~hP&h}EO+c8Ntt2JlbZKMcY{=2AFat>;Pm@|kL$JmvWS?7S zVdyd4lv=BS3r|sJ=BXbFzr>0Fqr&^Qr!Hje^n-LXeN_;MkcQH@*Ssk!{2E-~)P--> z7^cOd+D9Wtv3{7HVKXDjBnLx7{J8U`QQSh21a_YDS64kJ)_**Ir$I+p0*xG-7^wVYM;Hm8BmsqRu%z+cO%o`_r z$g9?4yj>>qAzrgj^$lL9|Ag7Io;)pgvq^$(zzf~Eb(g7Q3g2vGtj!NLUsYy4^p_Jq z#|;FMAz_eClwEChmd0bFrwy4~1u?GuWifN*4hgRrk8onzOlxYp{#ul|$csUesO`43 zr!b4gsbf-}t7-HIymY48`5^!!kJ&pch=`9N{@tA0o*vVrQ@gTQmFScj+W*HmDQga7 zxOLFs5*LSMqeUqp?Smxt?nezaLCkSGNBsPDTIw(PS{+V4YZVQ`NPgvM3)~HLTpGck zpG3ds7)4Nzw{QW*zZ?DBZmWg>oHFxkfrS)R|`f;`<={yZk0LTd3kH-u*nqI)xgGoT30zo#?*QG69|av+DF)@Bu3s zN{|+h*(`k{hPD_tuLXW?3awbmZ1Dw+J4A>#f+Z-Mo^!Sq9wL{ZEwz?KndD+VIlGdB zEXT)YsTKClky3=?qnCI^9H zP?)6?*+uDQcozEX+_)%E-%B>=Es`jJ zh_%)VwWb5bo=Jx*7=F(G+37)5VVqNO`d!Oz-K9I!Jn|QTB@Akb^>P~b@g+S;Dn~Qc%ve2Fw*0{rnh zh8JnWHJATOa=uKL_rD%WN;Q*46#1iaI)1RrJ zJWo+UA^sRjEHLo|aPAq*`izAn&da}xX<>&r!ZRS^)PKd*Xz)sS%G2XlR?Ja{u9#_C zRTkT}W}at~HsMgDW~EB8!ECDi4O?{%AI`Y2UsMxHd|bO0DN<$>)QHaBi|IP=j*j9A zRUs4<1+O2MMN`CF+=gRvc3}RtD5xnTLKt4=hQqH%Eh!lriFNCwF8CcyR^Bx;hne#! z_uVEo>U<~B$wJMTrYV3!0RPpA>-iY&@V+XYK{(|e1@3V7^0ZW378NT@g9Oqvl%qFF zlhNOwj>orGKqvgl*q3NV3TlFg=YC{fk;;dl;@y@HzIUXs;l?y4gyQJ!u8EhJ9oGfz z(ToTFT9kFw!LZEYF9klUmqRqifN9eXboZ>EZg}DT7&lV)Lvdwruz9NZx5J6Cj*eXC z%R?U{<*O=SGOx9ZnA$^z2vmxWayHpD-|OTsoaqG}eNx7pNUwfAn@2*)gXc9U8oAP( zNCL0c45KUFU#65Zzc?G+d0*Av6%>1*9;Afc736#HDs?N)Qxjf}l->)7Q?30dZ2r^+ zIkUz6)u9W-*z0;qapR2enpeA7WCVYhNF8OwnGQ7~BcME}0g6D)j)%I7Bl~@nN>cSE zL|m68&EnzIru=5GZ*;Pxg<2_`xT+5ElN&L(xJ?le?yn~IInQi^_*>{Jg?|p<&7hl3 zOtjC!-LBPJ7net>kAbVJ_0J2Y9RB!EOoj8#C&ZDusRuQbN^NJ)E#fw4cgAin_1BPU z?}3jd?}7b(L9a+Nq_HbK<{&VwpJ$o zv0IKBM@$A`B*i32)q9Nyp$*#UkJ4a8!|NN4kj0b-CfuM{=%2~h@pW|uIoFfxE_-$E zML%Ne+-haPy;$5Xajxe$X+iZ^moB0clG+GmT+^IJVoOj1?JNOB>m&3o_EQ7Z7qqt! z`5T5s%MJ&5rW69aMh7WvT-E|85m=mT zvK_9fP3z?F4VzOsUgJSHVFH1Y^(QCv&uR!CaSI~DgfL*tl%eT~gU3$+dX&#+5|{5T zGn|Je>plxyeB2hzE;k6uTDCVvGv~0~X8IMYa0?+g=h*P*l=n~`LV=0NTK#q90r@#O ztXuN%9q+RuaC}T7flZl~?!t}7k;}wL%tOpuu95vX(J4WEdWpx&_4MC7C_9^g(Kef5 z!mZJ>nvEnJxOq7&)r?;E^v>ZdW~|K^>+^X_^SkPZ-CPx@%j1c;1d))xXTTezk><`X z(RQ~`aiE#INkos8dv8EM(}uS>W)qwpIHvPBKF6TmCecPliI>y%-?vLS`E~r%aH4Lf zd%M#}3E9cz#}r>y6AM$BAk;0*{R=rzD%`7U2>FCiNLcPTwZ8Pb6&AOGDnym(KvaBA z1}+q{`CQE)?m_OkdUIK2FBz1p{sz{fViTWS-%h0zxLVXG#lRFT9Oi)NZ^I7h;=VtL z9WV_jE%zh2YZ`K`E-WH)n7#G@BcmgBxLMWx8+5AOcpi#nn}Rk{#LMOO3iYSQkRM8YJt#5$>^iivn}S-jbW5*bjTT zw&G%huES10rbkQ+v%g`p$}^=MI>f;ZQ?qYs;tV0fxC+)GRQlS=H$$Y{RVJDmHoCxx zq7pL79vE9FwSW;Iqs$I?+_omvu*oo=6Fi!IGbV-~2HS0}vShvq2*%-2SoZ}%Y@F`} zgUR#m6Qi*@!;*xl!g(H4jCb1qb&aL!cP(6c1r_9&fO;o`oj*B`Eh4VJ+0rNh8^5L+ ze}j?kq3+VLiQi(}6bDvN2}5s1QZkRiQs`k?RVBD{=vH@0X4~6frURa|SMX53&Gl5Q zE+GVdOW62Bj@=WSmb4v=qhFT}=IsnDX%^aMMnE>uN6jZ(|C?9hU+rcAL1OB(=WY?? zvTjH-2FadDpjbRp>NHR&23C9KQ~tuLJJMap76t6Heo1j?Yj-HF4PfANAX4a;ac5LV z`~0~||GsOE0vPSr-sFDTfM}RE2%`oY{$6mBs+>R^P+oR-#JU2ftBJk6ixnNww;YFN zXc8?o;ZBFWA>W%{MH#h&(%+SD(J^yL)eXbd6##or7{&hBZ-U5-kk+Qd2TxGQ`fek| zWl%J9Vxp`4*{@>ef!{pHZZ?hE%@;KbTD~V0uW2Un4`?PQ-1zJg1te1_%&8A_lO`Z* z;HuemO(f^U;|xfXtv+^HB@KRSjFftdRy}TpV`*dg@y({RZ<>LD+-8@3^MR4!(Og9q z0(A~C0O3`ytrEC3+#x1?#j=OFf2S^^x|ObxETJHjqHfoqO)FML4BXm44VKLwOCud? z1wI2^4*3#NcQJXK+duI~P*KS`x@c#30bP`J`!34`%*K&G!@^NB!7S!%gLyR!`ny%h~CDvIMDqw`b( zO#FSO(hyc@)wo%03LC52bw@5@5aivCF+Sc1_T6bkK$y@)( zSPJ71uMSPJNUL1TxSH-*npOXx*ivzrAC9Dul~52q%|`y9sG1Rk`u>#FXgX-4BjP^? z;%3C-ULBb+zN}4{gEs!*kd+vY+&~stnC{HX;uNF@0r9 zL1g)}rZI{_C+;EYqm_Bf4Zd;d0^nLVpb4T#tg;DDwk7UrZbLN zba%^j;H<&rmLF^nD_(xwc9Yf`+6geK^0MoOAyACpH%l#|#n(*?#eXOsRm+m*o;(3JB}*kCf=^i0p-&p6ftc_3^LLSs zFNVbO(nd$*tj<0MXapm&+|~!vNmuRGMw(r8yeOB9!xlH?hCReicRb2sA7Nj~ifiWX z@J@0|bL(vdWCR&9+Z@ z34k)0Vt0SAkG>pZA-Ic5g!Qju|*qvPfg2De@Zp_w*>I6SdtwxQw)IR`a- z+U^2G$B)wcIGEcT4t^BmI53T~Mlu*1tu~m;0Uq;>M=dBIS9(gGN$}qCZ0w#;855!p z0MNMrkIlLldrW1 z`N`R_60QXEB zrHX30kGjZ{Co$9=DW&>FeeXl3Jt?KdQw!!Ub7h+lKtHi+NV8TIC~BmFh^n~8n(7@yf9`Ju@H>#Ktn-P(1e zGsY*~5kQXBjS$>dc218+Z-}1i$&5K#vNP3_q`sugf4>rUkgVcW%Ch0|`S!QI_p*NY znSK9@Vyxb~jXCkZUwFBK8~;1EyUzdgD9<1K{ue#^5*SFjTUYwElLg8QwIiiBj<;dt zh6*qGm{-Aa>#Jbvt6+bst6&>ehA0ZVXXJ+Bzf%vy8qDP;&V39f0~5m=j^}L+J0O+Z z+}v#8g{{HpGPClLqsza=4W#oEhs*)>ryYj3`pj&Af(B{~>41W>1TVp{?x0$kL#>ShFWd8<;ha#X3kKb_GI$F#O8;T@MM=(@#|6HpxDE28PvMs2ZHoz*p2 zY1gV$X}+)2Pb$q8{P*#+{u72FaA82DJsT0t<5}fZOD`6pAl9UGkf!9x+|iTy!k)}p z{j_;nIz1xd0;(!D>9^uZxnU06qwbXLkjiuDcvrXi(jlOjm{~E%E+)6Rz=&Vy)_+VG zakWuCX&uz7v5UBni?8&)d{m05AS-$Cm4Nb38nt4b9Ua|D`S?nI|1s|w0V3^6y9wQ+ zN`zlnoF<>BofbRnF?Cg!kA=3ElgU-)Ys0 z%}T3SF4mgF{ESKo-NOZ)+`U4=R%Smj0}x#$Kx%HMtwM$imn`Na|V?p8kJ(D@x_qcCG%CSoDK<5p5m zSxI%U((b$g$*7t49+R{Aafsl=p2_azat>R!;^Zb(nzvO&0YtVcb5l%eFtSyJ`x}O^ zi632LtEyLOr}ZZ79mQJlpn6noRx6E2C3~x)xTmv`7u~8#r)PkGU(f&tV~YnsTUGp+ zPHPp;cTnW*&Dv02+TFvms7n2~3T0<>??_=9i#rM9h2tk3H2f(?YqS)MaM)~OY9s~+KHd1*_CXHC|6;FDp%iCn+Y|z(q5!{ zxEWwe#p6mdZu5ppFCyJrpwi129x=NbRQfT}5^Qyc)uZH92$hPFG3mX8wy#nV1Y!UJ zO*T}eohW0`m1@T|S=?!9$BVM%`IX$IVOFBVV3B%IsgT?fF2HI7hUFq+Cx*kq{z!_{ z;c5N27~S+EI@mi^iSw-Kwi&1Nzyl}4;X*=w(uJD%f6w3A{lWI`2-d{h_Hv zp%m1>?B`VO2wK8{2TCAH7@DUiXxDSP2ugDeB%UPICvj|m*6IgTxl6@*y&A8Wgky^r z5Uq>>$z-M{X78mVCGNc-q*OyGaYhScTQxXsRu7e-RO<;GE=B1v5m`}*hOOd{M%`dE0~xbG=UikkrHnM#2Rk@xOh!|R zUjB{F&2Z7lJX^7Lyd*Q;mPg#2&bqI-{`GV`5ko{>C!nM4UKd_a5GsqU8%Dyd6q*w8 zz;aA@5UtP@XxtoC-mK`p?c@-OcUr}{#F!=Ih6p`0lKXZ0>_TpWw5_#?AT6`20TRa$ z4^G-jV<65!J09Q}V7)zrODW9~ymSq?RSlznn4#jyexe0>4@Wth5FdgD7Yuc3DK!(@C z>@!{1%-97D1JpnzqdP#{lX%LcgR4J34Nj9MD302kq=K=%jN_gF6(x8iIbS6joI_^r z1k5KWW=NR$owE(<>NIutY6~l>PW6TRticd$z)WB z$GCaMVP6ruDFd+s;mi;(m9x%-Gh6k<2(=|#W8KME41xT{7(1t9qWm0_yYN60Ap_j- zdgpjD7!p7WN{y82_V~hn&~#8gW>3C>QJ(M<(=5iCk#=($ z(X~X zD3a+lCkKkX1LCdx4#@fn$odM%H@^aslxZh5Cv#3*Mx2;rI?*gSbfeIDq0{D&_Je8( z%w`)?{b9D$gXu-JFT}5BcBaUvzwU={$5(^Vgw-5A662F#85=kkU$Ptw ztNqIL5Z0x@0RHhpEa#s-q5I}z5n%DvA76-%0fjt-C4bJSWRJi0fR3s7h>b(aq76ix z2W=mh5WbMg3yS#H)Ap6PAUzcg3P2KcbSRH@PzzY~J)sRX^`ISdG9dHF2*`zUB0E@3 z@8L0=i)bLUA<&u}zcMz6^bm9Fh#c5eB3c6mlJ7@H7259O!fW}G@kd@myl9+WID<)BnBTMpmr))m<&qefR2s1gC??rz%D6ZdTdr z1Cbz%V*4qXHEL^XOZc4*XRL!Ax=jIINb2i%$ZG=&%II?jfXz)6?Ls2(`E$&{5%P*~ zCY=mJ5)1;N)DvGHfU20+5?Nt(g@-4qk0VV~L`F7g%_J%cq9&>8BZpekxzK1B7F~sO z!5^a(BVmN|O$8U2aP-pQz;KZnClFzH6JxgtahnY(A+v9@6cpQ~J#(P=i;%F)7B)9I z*dabCmtf?$FmK~SkPPDimMcyjC}zPZJ^{M=vk71lE_VItXEO%%gc{^$$Cf z5hVOE=dxk>e=IE!*_T?Arm>%}asGj}OdC(GNF09J(ta)irDK5!a&a)f=6=I#0F)wV z_Vc^0;&GLiOH|2I6^ysEaFqg8$?u?w85xb?U4x^MRd#;ck0~0u&=^H`V~Z+Z8OD(; zy7!x`pMba%>kuXEo?Wc&k>|GPx;56Sxt8<1ny!rQk<`V`!rQ&NT`KCjx#m}>dC z)nExks}<%}gJlq{wu9AXtPG>*ZfsG*xh!Rndt6cNMfR9WA@0WL9kzm)Pz6crLN?c+ z+h7NLf$w{w_c)A1Hu#u9ptbOO+~oV61G*viKzb7{n8QPX{v#vuH|5qMn-Cv83--a( zi&mO@;f3Ch13XPsD7VbP=W7~C|c;tQ0?_9B3{n0H#m z=NE#09S5V9VUGU6YA9p2w8-ItEN%83*gv*GzozA}T;>Puy8>HkR?KLX27(Rf&QtJw zvw^o1MjyUCvGUfC5w}unRZpM+yFIfywT5R{_>)7%OB^{?U@`)$qWJ%>;vtC^&t*-j z#lOEZvV|^Ld5RsXRVQ7S!NfQPM#mK>IpB){*FmRCx7%g1BbRi-^j~^DPtTg+ghCfE zZNdI>2VitX8NHP{95gd@zCo`)=`$nX|3rB5xFWosA)I4Dm#Vo_23bowdk`jv8GtAr zh8gL=$Ll-j2!TvM%!~!FwHP&-=N`$>SHBn8drtJc#kS@eE^=I95?l}UfsErIw$C+) zJsI-P4_GI|A7u$-Irvs)HOt{OcNgIAZ)V+<-;aZoUmQ|%Hl$q6TNDxn9Eb(7v&6vY znnr9#axWKzA)_@Uf!SFQ49Aj4f|6eliVS;U=_5|Phg!fWVMSN4b**LYa$ddrt7i13 z&n6~;HkO;?&dJ(w?n^P&p;A5Qg>)@9vL@dya^aA=9Jy#?qGzAsSa*cdW`Rr$*!*wO zEp$%zZiwZ@04QhxF&}ppg2>l(!usN;&mL^u`A!K+Av^9BD#;thBle*UqR-=j;-cNyq@n=R;hIK z({`hD&}#hBD84^{zsl7Qn7lB*i#!}FQQj}n<-}iI@mhit-RI8*w#4o}t(HH&PCxAr zhEK!Xns{{+QG%2~>FjH9$W@|s+V*q=DX0y|%_w`QD?oq!BVCD`eg6yoVdwmNwK4nt zS8iuFziZ$B0;wVIt?z$5#`CAT{{<`f47SLv_X+pEV6IU;!@FKa7LrH0@3qeP^RIW| zi=N1>uiee?>Q}?4u|jII6a2_^(R$x%8EJmZw{+nH*ND6oS@|4bZcJre7Am?1UHvcx z2TBr%msna?rjSe>zrY7k;K(&%C^upglR9AS|Ey_kN0 z=uF2T@y)B6;zdmJM%Bo)xeG$3GLNi>^oG2Np|fY=FGr{EswJ6}_P2~dB?vW+N|suG zP>Z^gvj|XvPAcpzQ#ij&;leV7cj5{wbd=D5xfCi&GHR0I1xX86tEO|xN!OnU1JbcD zI2eY(O0iepTBuv%nJfQee4K}s{|g}PN8&&1?5*Yh$9VqW^1l}SHKpQPOX@Eh;iw#` z-xT=sYk_|)@c#)TJQz9v1{{m(0Qzl8zyEmfp?H-3k`ZbA!S=^YHcfxMeH+>&Gbu~P zlIaczpm{SsjY0PY7ip&q$38QzYSRXOdU9BOhjvsI(2YTvFk~5-L?jVZm{!p4kqOE! z6AMOVLUYGug0aeIC`y`Ofl%302@6DeA!qvaxBcY8EYmDlxG}*cX%~(PD{9XFV8Y7! zS^2YA{I3U<|8~7XB>($5{?{Wte{lJao=E(!<#WKB@xRul;kBgruPiB+%B2`9Fio?#s(ULpCec}wUroV7v1=R`5VJgy@xV|{2>;=XqW(qW|sX*7pBLdHz)TA1HbC%DW`@pZET#LyEwWe`|XHk!pat00{qH;mem; zwQqeuuvYv2%xWJmp4NN&bbw!>tRd|sbaFnL4kzg0Y%L-~ZNZBV6*R7!(p2t?_xiOF z^tDpUIYm?<&n)C66v~^0@(G0sW}!ktp&hf(PC}twv(Rorp*^$EUP7T4W}z1eg^bk1 z<;n*V6U~xb$jowDsvI|ev4KfsT5)zU;%saw1LyTGc%Jc7OoN_*^k#CY0tXPTe-S@G zG38(*-SZPj1|c1tylcKUA{6s2<6PnJ&?;8`U?EHu+cA>(VzGMpm$+gtp;+i(!lH9R zpGwX85rAn`P9jipX7XPw_OTvcEYISKbR?b%Ds~tPEvA??1}q2Ub?{5G zf+w(Yp)nEWau@*yUvs#aj5G41R;8vY=~}zVwXm&(TKPrVYL$-aRXRGxT00B26{$71 zttQsODOj*AT0lp2j96*Yay~)_ABsoSvQdzV6{(o94=Q6_J-F;rO!@>Kf~10r+YG#( z`|{$@Do}Be>;lCIgqKbM7lLP@28|-q#ipTjdg8X_xdniuBn*ev{8=M;II@5X;iXle z-e@`yN;wT&t9tE!eSTfr3?_S*n*3QH}-5(E__Rgz9m{^pA!D zdscyi;=w`HUN0|fT%I1P{zYe%n)n$nLIbrDj()VhH82aO_B*D^MZ5X4Ln|je6gY@N zsMJgxm23!AY~k$C;8_0>qA7E;o5=d5B|*Y z|B?Bi?$^c~|DXKM-ixUHcYXi!QJ(FMRX%JMQ&jUx{mLnc*bs+wC4w*h^-#Vt?5^U_ zzwY*K8OkwQq*pg4xQw*z$f9 z0^{L$TNvC-h}tMXOKIO9-Qs(+1!wsdKQK~Yt7KM8trUfP`6zV?&3*0$H?LAp$ULkt zHoh9%jKvk^d{tIP&Xm;|bw6`-A2jB2%5tBM9XaDWrPm5Z-QiU*@_SnVb|6O6K3gdz z^eh=NDY2|SnfUE1fPnSdWNMYR;`4z&>TChNgVYoJ`{}!2GC{*=17pSo9r143?F3JS zKg6qh-7hrBonYd3d*iKC>b>szE4-gy>UG?xUsGO8f>uBSUFvOGXZSet63%#zEt+KWHX_>7d zq_P*VWQ|Pe6SpY)VXNIemwQ6_-Pyuh4tsD^DT63bZ;IR#0)}J6`RoN9s|*T`FQ^Dw zg#imgvm{dVs-M)xhM4hykS0zq#33-A)XLlb6UjVt&wuZ``TyJ8^WPVRd}ROk^6T^8 zM|u9>=fCFtuh_d^>-%0}eVqF*dYl`*>m~1bsmzYkKDw{{Q$}U-_F5D15u+N(jE@{Z zNjZES?OT7o=Uiv47D$RbkF8cZO*wHpnT+^&fGHglzn<31be?}?TjlP^G)dGe ze?O}7up{Ca?4m>;(`6eY30;Ol`l?%Em!Xil$d=q?D0JF< zU#ZXTvcY+=&o;reG^}506{0egV)WqHA-Ztnuf(oRfYb~*8@ATI!s01bfoV3Y=o)u)<-x6KKw?fJbAo z#c`gJD&PTC#ieN>b`!@C-gC4n>?O94P~k;l3)Usiu)@p477{A_nAn25AQW2TC!#T< zM#4<|a#FI7yTclJO+N-jpz1_{86)Hag}4lwrO`P1u~N6VhGS8->(nd9r_D<1WAUfT zSGQDVLK7xS3dM(=_4N*fh5Ufxb6Z_6%sqI7`v47{Aq8Z{W)q~;0e)2YXkw_`nJw6iC+^O*Q)kDj5OcfQ zZDTiX(0@NG9#s#km3mA?n^Vz_)@sx$lnN3N5UKJaVGOhu<9hbeX<;^s)bpb=kb|=Y z>NzYc>>S7`r=@DbRC=Cp!+z0a$V4I{xhGC$VYZMeSx<(tw^F*-cp|&(S(aC~-L0n^C7u z4Mgj_NUqa>!4%)QRAL>F#^CKBh8C@(>?q!~_j^UdGl*+=Ho3 zDYnjxZH&))Y5d3j7Ye3#*TKWk)7Qm}+o?3Z+|ILC=D9k*Rvt`U;|gMOGa(bM)+;6A zC@!8O_|kPw&zfl;nv3)dy2kH+Ck~Pjd82xgP}{2hGM9;^qGbk$oH3SuqD;iDBU2_t z>Leh9>QsR_zptO3nCmCX6zw_(XRcG0h+&FOJIF)oXSJqNCt*A!w zs{XeU!;^79b&9Hn%|vnu5&+jJ7i-Pxhl<;`mow_bH8W#8XANMX35=wWFdnW`E;ftN zI!QR-I)@;49DrnJ*YRf7sUFvks-4UOzC4iJ9HH#<+J*XK_0b9iTM0pocZLS!mJBSn5I zr>6ApXxqK$k_XU&lN%>T|6!*&5xM5)y0p+Pi1IiD#aM`D?dWmnPg2G1hx?o6VB+`U zDgjb-TucWcR@b$98|Wt;#shWz!n_|>65$1aer{yc96;!qWX{RBZP4*4-E{XKE-NVRim zkk^96BVv&E+3(FmPRvkD+~A4X0tks%QSQlLx#8`NUw_-!o@-ii+cqQcUSBWBtB#NF z%cSP90jGtyz;^4Pc1u2s<^O2ktBpDSA31L~AIblbTgQKUl;=<6|G|_R@c}WjejHPT zx3w$C+7;wa?+WraCXGNm1(g49(4Hu-?58Q?8@WwAwO_O^E+g-*Zlc9tpNPEV@Qdb4 z9h31X9a<53aappRljG`#Nvz4iJ0Xv?Q%g>iPVD(g8Z;>9$SZN$=fum~rxzD#$|jvj z3F#uk&az}Mt$e7QG*hvuOv1bbGLH#}G+(8}VULBG}AQQo|!3AWQIbN zu=FR)m5`Pw**8^Zgm?>sDyhG0-we1e_0f5^9c7lwRkU!DqDWdE@rE`W>TE8PRlj=S zulexTLip!1HU#~`2kk|D%TV*c)vn7{iZ=A)BH$!h6$zzzMopV;Zb z-8)^ld#4NWlsBJ{PS2W(lFV?Z&iu+b?qC?>QP2)Rh3SZk5vafK2jfXNxq4C)$<+wb z8q0c>YB8Kcdtm z^PeR!uML1}1K^+A07w)lLma%)Bf^Ks9ix{4PCxT4@-gh;C;<|24n`BVd@iR#pQ}~# zz!%pr(qZK8ntBQ19Ns1e&FD26^&M6FWA`6;6wUsV6Cg=(9Q3E+?c28kFO8EdxV+V~9(SYrc@+99ZlY8@498AZXWHE$gXMFPDQzPhI z*xz0cytm@m|039D02gKGgaMT{^SgU*Rnfd#RQn7d{LMmMmn?8eEwkp-MF>3THhc9F zdi7FZXm@OF5B~D@)Srbs{8`AWKlgUv&%GV~Q#KUr08);Nq6ti8d=cUck%hB^-*B1o z#gHI$5*X`}gWWB_xY<>ZY|XEp{k7URKjzJko?EqGf3>Ubm>=_Q)m{6mU3Jg=Sa7Sp zu)o?>Uz#6x+^Rp?UscuD+W}4O>+P$zR$vKj$u@*@=QhA0D)ix3+q=|M`thsnz#hJr zb#2hc#h>Mk6pEGtwBfEV*0J7Wf*9Z&ax7PG?KI=z_;W}Jrj1{J@$idjG1p)6_{FwU z>u&{FE3_8tPdof6YOb}(GS*zGi|k<$(|Rc<>*{SdRL3k6R(|1Yc7R z=IVr7jH-=XD1ii0%-{rc4Jmr@9Khxo^ic>N8%4C3rqVvCEf|RW{q)-JTkemwK$kYtDv7 zs|Xn}C<50grH946#0oFtE9B?)_s6%fX#&k9v`oj50a03{1&T`HE;dV{jNZ5^;Z3+w zMG#%&Na_OYU&QhDK>dUHCequ6vWv`HFeHjLOlkjq0JNK6`Or^XjX8 zqXq-1i6>83;!P%isC~OE%iZ#e6Uo&~b2SeEToD`8=Tir7~X; z0srks;elwIv0Z=@eS&pe7Y56zCK#q#vr-sGhc09CJy8nEzn{|AjKWX)YS`yN4_FVs`OGd`G; ziy+Ac#cW4Z!wq|;jdNxC<^k&)D(w!8Q-b0PKJ;(_># zc)sN=DqU=I9(a)&U+SJF+s zZ~0LtjC z^YGA$9cR)bT^MLv_XCXUWTlHsHL3PzON9RY4ZlnX7aP`%kfGa_O^&gR{qRQozr`9` zIWLMZ<~T^-69b#IXBhk|d^wkWElO{8j9#0(;z&*?ErXOFy34d5`E0R4B)V&}Obl@u zXt0$l;-NfjyL^O~nV-H!dITK6?67SOiS(n7SVFT0D9Y6nISujr{ja>GxSiuP(8FHW z@3#Zd1itYKI(&l?CfZSie}Q@VrhQWX!)p{~FQC{~r_sIaGvksyg10UGGTN>!$?754 z3Ln78igEWJ!QcX0$vD_^@uzRGxy{(vfaPva^DJ%>zqD7u3+}%U>U6)~rT7eusQ#Je zl84x{Vl6Dd;>7PFj8nVZ249hAU5>@O4AZ+v> zOxTEn8P3vslWpiLVe!GkUm0t5hV~RvN{9%P7r=O>^}uMRh3*h$DT8XPuFVWnZuW3k zj&_T;)%b4V*;1O#gMzl)B(fI$=g(bcYiJ%xvHLbM!*XWxtqh2ju#Z8fpT7}{L2~2y zg^$Uy&EJ>r<(rsZCb4U~Etf!;=xrLf-#C*fBt95zr0w;;(NU&$>C& zfv-T~Jni>xMFU8>M?En75T#SXfO2+P(&nt`o5M-PbD_rAIz2pWV6F;xwsnC;cs&-b zS1<+Tp9gU?rT_uV+8OOqDn8{rTY(Gvvzem#%u4UfCU3a2NP@1j`)9{ zRkwgNn2JB$0Ys_Ev_HMUPr7PUk~9QKTgCofWl6i24=vzLh)VBcO!AWrQsqH zYt_{yQ2CY?|A#hZ%9%*AEdd8M`7MiF34@p;o8Md!O%2Oh46r%58W$C?W6QcMe|a@R zjd4M_IT|k;MW_W3q@Fm3g*ghgUD-M~T3E=A#sIe;TLgY>Tri9kdc*D*{we+6?9(Xq zd`)i6r8LcSuonr!3w$=Db(xA~Dqvv6a5F4;r4$Ij)=*=V&qqD4r*sxa-;fmgj=sIgvDCiDXeVvU@=sG^_Nm?6h12wS&jAL%p!F&(XEJCs}xg{HpuAQF`*;-a8b`I z*ip%$55KtuV~Q9CyA0iSxy$S=CY~c|=3&Mi^eP4Rm5A$xhOwmS#})CDWc=CgHetDM zr3*0O$LT1pmOy(rEeMG*AXMpPbuE3_l&|grD4T(bMNu}(DC9ar8Gks0Z^-0JXgYU3 zB~h=(>fTOV=;K^$=;Nrkq5>J??-9|YuP!NwXq4kzT$JO~B4Li{zM1K36y9A5<7D&f zj7pOc`tHpXDxjFI<{lAQOH!UIQ^D;GBf{P}#Y@3U)iT0ec;vT`SfloPO$U}((`Xh? z%EfxwWPY(=CDcSiwgULBLO`2mjW~11Uqju2ZC2^n<#aiK@sb;2t2=Mq(qx1;w9=8a zB58Pbw@XKrVqH0)&g!}4xt)&Z2FrHex&f4yuAr7fEJgN@Rg1)l--5^aj41SR zXfVxO-_txU)cMBBJD)gzZrYq^)vBF8XQ}y%@$Z?{d$Z>ZjyMHIXpI$r?8HbI8Y5m@ zqEB;WrJ0tc=*%X%!NiVIEcL{($C*7a$STg0ke^xZZf|1T-Rurk4@IBF+xB2I3fhzZ zh%)Wvq)=lh?5`KDarWJFF&Yj7%fk|9N4NMT!cW2-$vMbpg$JgOvX#KU=K*HGnZ%8l zpD2fz)r4w?vg*h%Ixx%BT4EDSPl(r68zXzR2A|xe&rh7+LG0NlKamM&%$a~Y;51DA z!pPKFWzxO=CY*(k-GWtWN!CWtt@fa|CQJKS1z9dO35~@j;g3n45x*fbfUDg6 z$wylX5XX(u@&ZH{hWBv=2y9o)Hw6?=p6JBO%yc0ABvJ>uP7o>fqUiQN`@L>Q47J%) zY`ztAMb2I*XTB!s!B5e(ZmNKFpr7+2K2)&s-%md>(g#=Q0+I+-)!xidh)LTITT< zBTRQjU_cgr7G^E(yvDbnLVaV%m%D?Yc;K1X?LzPEQ&$6jqsdxzca@!|}9-v86#88xH#8we`Sx?!w2I(3(VANe7wy z{88v@{zwe6!lW(gR5ni9T~nC#+?B%EO}k@&%j^TuJ|mOAy4bgLz@DI|m5uUjsvPMR&}&73tH8k76SwA}7@5k?h>V+b~?@EDOo9qWm&egJo<6%UBGS zvll39L8Z2kwcxJ%&$4{@4qSLyKD^*siCZZN>tq=#!7?_2Wh?~C*$3`4olDvW7Ql0| zEg%k5ya!GKM^NiL!Vs2rld*^JY95Y~ALyy1P;t@icgI(lvxl#ZT}*quTYKEId~!JN zqYm*C@?-U0GdE7rqQP2F_}inq>X^<~oEfnkeCDfrbG@&YM7O({I3*&~X#bt)XEy7? zTkgsx``HxyZL~&MTKb@V-pbm{`wQ`>oj@ep~gUUFvn5<+rqX0*x zrD!BK8G&PA*aWkUv9yCpr0aLRm&4E8+d2HKlHWwK!nrJGwhQbMV~$+0p3zR?7JCl_ z%=Lzi@5e$uvHaZ0Gj@q%9DJ5PiZO<@jC*D{Bl(4E+2{EvE%e%=x*~x%tW$)4X$Ye(tpd?r?@4Vn|tb&2wiwkn;PT ze-*-8`h=Jt>kQ$}CwTn)DG@pMIE)_ykBc3O@$=_ESpw6GD3`H^4Ms;3?1TI)eQviDlP`Htwlq;MLDI|S5L%UjpoS*9CteQcZN)YfNjc-pjH`i?eusmf}FX+VoG5=-4|9A zI(d?z;@w2*%m|A-3-^HHr1J{S_i0AoGE!u6=ohPj*a@5i$XZ^JLs@%hF1c6%@iwl9a>!S<@!$mMeR7rVRoulHg%Xa1|6fAhSZy`4gCr%-@$ z-tOM6_iti%RUMf1Oo6M8g!s4r4Mu~YpImO<_dn<}YyR=a*46#nzzN>l*-4mxFIU*} zaQ^eVd-=T=1rO$b@5Nr>-$d^IP0xS+#pi!}V`a~FYJ20aEF%5q1x7~3hiQmk`qRnP z0B|jS+7c=;lt^E9+oQq3wAP!1bR~*D22a$4n|{)^el2) z@QUA!gEmEfJ^~@&q*39wjlsp_#vcXZ2)4~WS{W`!L2!*Og6V@sS-sA1>C#|$JL+Cu z!N+!nn#&5abD~kKA5qC-uP3PF7-XSwF!~&Hwire|=yb=NtOR@G!vLok*R(IjgXyRp z(3|sa-yhv#I)dwQmajJhTJT>`j|t560K~;^o8o?D1&&}CjIO&A6sL!y!RIa}=bBvk z6ZjDTpk8lqgR#=v1CTSZ(wHh;2U3*uww#`gF|?)ZQhU&WqOcAydZ-UwMVS8i;4^-b zC?O~y)&s(_@Vz@0J%ENl%qIICr$5jnX#3r3m|235kM;xFGw`AM0fX#Jp>Ge-6~RL! zIGsUziuB;C>Dq>w7{J$&xCROwb^YEr#5heAf;ET0BP(o)lb}l#u|VIy4zNr3yY9KT z8Xz5EHocMV0hXlM=mIriTx^0nfKu1~EqX!%{dCY%gH$%4C8!G>x*ov#U@T3>JQV0H zI!s=`N5;!ok-sD@F&+kOq${Y{MT#3CMfI7s#$y@_foi_5Hbmp}u=%lAuL$_PRzLkv zEmz9o;1~E<5v9}GFZJrX_f7Hs^r&2^H^j4N#Rimo_DmE{%JAPW1gP?J4MRE#P#R5cmEh#G3G4T`+Js`w(=4?ls}Z!YsyICq$CY~N zJ^Wcbs2)|Dzfik})#eGdcL)s@MXgwGR!e6`#k#1S)oZ7Xih%JDsB*PYIx1F=E9EWd z1+*+EYMN-g$AAKHLlg%U=v?vOsKU_Y2+P%arPRcsguj&lRnV`atZ39Kr7HeX`MClE zDb|0g6w1spWa4jRpB^Q>7B?@mw4 zgy=@4j+#(|#q6Wg24U;0QOQC}%_4OGzyPWm`}q68S))owBNIyftcHOJGcf9pfD-6y z5vt;h@*JF=;Ls66r}bYDFye$JAS*t;ufY2{B9tzQ6cHVm)wR?#i$R;s(|XexuQ;i^ zJF32`oRlh9;uIl$tTrkcn6qjF3skx3k40$rjE0Z%1ij;5tBgTKwpp4{JZ&tNKU8rD zWW7_6W=$8ZTk5jy>auOy)n(hZZQHhuF59+k+s1qP|Mu0{J7PxUjJ#V{nYre8#`p^| zCs;&f5h}0lNnfTu#asQKoy%cm@MEQ0eJ%)lX|~=?nmFD7a)3|4>y$0vpPh;>Ff7i{M?T<$aH@m9M=C_`x+zgs+a2H92A zQ+l~v6SG{@wd3Le7u+x(cGtN6Tyit7@Pzg%l45o8)~s!+B(GOc1G8TbV{rC15bCrc17Y@jsBrlTLw+)# z2+D4supI~PI$Mw}^zl!)MVnrFp9x!t56Uiz>}&%GQ+}?DeS^B_x7czjCw-c2O6?In zzmtrega%V<6J5_do`1R`0-Yc^jF?7RIeEDZ1kfM+0dK3INw=4&Wy&X^a!Q7%vei=w8{CcR>czmk8#4;{#V?{=5^JL2ZnEM zD_7AhaWz^>UWH6m30OF?1_ntfOH1xzNrk;Pp|6pu#|jBIV$QULKERg-kdT!~t|e{o9c{RMH{u-I4p`pV*LP3MC{% zFRkSISC+0hbgsUHE}7gv^whd!Go{1MOU^`jm24NZ%daw1G*;ytlYYVoT^YQP=aOhl z6cbs(3LQUc(}=wg9TVhpDn9||RK2)5$2MDJQwqK_xW}hc3O`<2&mqCCD_AoQ+CvVvUOs*V7O-@Tf$YSW5>WOi6#S{B&4BC7AeC%`I zW$&kEomW11nZ^Ri;hq8GI1zM|zu1c|IS|)9n$jnCn6q?vM>`)WTWK#GUe_5K7*3T^ z7Qnfw*rE;~vbdNJ_yrn#&_@198;dLW@8kfTBmtk?g4M^v*4NVroDSqR%rvDBO!E}h zGdb-?Jmn)qj#Hfd%Jcc{g8bv{w5?xovz7o{($)Apy=o)lqe3zr$!5xF1lpC@ z8a&pJhngJiujs4M-4ADhoJ&{9uj4{rhc7SKmUcPu_aQC}C#`a_&L{*;o9Y$K-MoEU z`aq+)bqCt>a=WJW{n#r@Ptfks?b62JeFt52ZgXIv`_D;N+=w|`ue|FC(JjrJ*}~5c zCaDXf;`d<=Zr}Jc3&`Z%FE^ag$Os#8+=3*XeA@Kzs|--XG;PB7p7TWNg|T`Iil8hR zXA;k^iz#iF@qwgECdKyyBMHTK^lrkl)@z%=-=bI9y3~VlOisd#O%sS^>z)xYi4}rr zCba3Wd$qaJk)DuZoG<4yFXM;5bPig$&;D>hk8IzA;h}yMj)-~hb8US0(dDmYtxSfi zF}M z!tgh3Yc+#2|1#C$x>h?t7lEZ2<-``o0IKFfdU+vKYRUw*U}}lQ0HI&;6_{>F6qTNK=nlkSyeAIKvkVs4~-zB9)gCbN|;)o zJ5^Y1Ec$&9??^qe?pL0t{dp+2dks7c%7sJYU}TMTzMhDY-}lsNNg;R293N#% z>b=y@C87NmvgQt1Cban(VDsiB@Qq0-EAO1}@bF`=`XFSl4WS>}b=agDrU73aeWs%~q) z7@#WP?mJcB*ynHn>cQm|KPmL*vxSXFF6{tx-HZDS!Sg`0Mn3!vt>chgO#yJ8yxBN$ zMLUZofpwO-wb&=?^fXQi=9GS)yF(++fckIX$%xl8iiii>Zf-jOuwZuqs81=2QOgk9 z=kJHDo>;%Wz)&Y>@lKp?)7W!Ju;U|LBuz3qQ`RE{` zQPJbw{LJzT!@nV9OG0NV1z8?u9UAUY2#IK*tg&!THo+>lJ?qCsted_FD(XHj=XQ4Q zlMn$WJovRVU#~g`ezzx1mv6gq_fzS9Z+2+&y{E%~@$2i#x7~J(kZiTSH-2t<*VTJJ z{C`d^t}htKk$?fM(pVr7V-h_&bYKbeSOj1aeoaRIpTv(S+KRC~-izC9@OuOQ*VuzW{TsBAFu`h~*x7GxV$gSnd=-%g0|_^%V`7NLKy^Mx zmMX}TB1liPeQ(T#iGz2Bwq>v<1NEx#v!dTMRK*B`S|&0Cp=|^Ce6aQ|3O-web-%0Q zwqS3NR!`|EcaBxt&3;H>k$23OG;g*1pn`&{F#Ix*NVmRDPHa7-R7hFCT-AAbY?J|= zh8N%T$Gz^fU8=uy|9Mzz5fMWUy+0j*V6L@&BFH?L2y@f@Y*`LS2|8DizaHPsS+K5B zu`*0{o7jwrM)iSd%Hi(|)W!O&d9L#iXK*_3DY7;c;Z@uj-cHj69wk_T@d~JN84X;+ z4)ITGv042+<>&e0 zY=_c^Xv5rRd-^S6Cn^taom$V`EI131*=f^H_a=AceFO^LJ)%F|KrsJ(OkYvQa5Yvo z{&Q&bhWl!(Oh+apWxDSJc1bs|7uX-X$b|Lo!x!K#a-{c;sk}SP({1ACgr~-@Dd1UX z1Z4((#$1$lC;|D`gYXsdFs0mo-p?QiQ~4wu(;V2#0zX289KGkhPNPiv?iYYHfK6ia zpQAWEoBuLa8C`e2A7?w$<*LcfAh-WpRP^tswA*P+HgSNS;M1;W2H+_8FSoj3zGEcgD%#xxL95TPNx@$CKR-9oFJIoL`cwz;U_nPZ8PmX) zM^ROB-Q+J41v_3FJvsc1v=i+hMv#5-x&j4Ugxg;4qXLNgX-^tkCdOyAv=kSExgN?x z0I9gBMhC;TNpy{{SY3hng48QyjWz&Fsf6C^PLn%%8{8q(4{3LBFr|N-h>>KDNUWE; z`bxo4DUI8Q&M{CvkfY6V$d+9joR3EaO79@Qu7w_`9XuWVaX%uAnLBQoLSab1PbYgW zNAEAiBr3;zl&HqDswyLmp>k6IP6mOoLgFcle6yTHo4n`m{ReaHzQ5k6Y#43P2iI>6M@Y%NtDpME=%r_lKe%=jUmD0HR#eLCUG`Qi1Zty58d4>S=2$=FN?% z7PiKk|5}2nDfCE1slZGlHen}B$1+BSu7+3$3l5dvOXZEBbn<|}<#8of({?39lgq^) z!;nk8%s$D09L!;Ynfd|{T^38uLH0%11T3U{R)j&gVmD48IyV zxCzGaDWGaMLb}p!UDcLx^rQsTf>Iv=u=-OoBP4AE^43qtQY_#>6)1GHNhtLFq{xC`wVHW*CRcAGz#~`Ru75H6UvZ?;aTrx$5llTJF$RMRJzKCpUr^e( zZ~S+e{~{_cEfW}7atLWSz_r2jlK*V$Kx9c|M!}w$eL;O5?eAkB^nO`rlTcPA=D0@O&HVrQ4 z=ka66D_uu8V|iffF+_$4{sX2!0h3Dzc6W=Wv9AMkuFfnXmct>!PXK4jq`(loQR_Uj z6^R9`$&7yP%iqQb_rzpGMkD&@{`)rR>@W9G07XW=TS^!w2)wlii!r9@J&b>3se zSM)2h%k0(2>gz{rNF|?NkXuN!%z9%cF(}Zebs&Auz$hyC*C-paEAufO)%L*`x{`XI z8--@AFOV-gez3w4#1fVF#2MLqZs;9wVfDj^$9y1wC)VJoe>A6N>;BUZ^E*e0xmAwU zNu4zfh2KGE+s>K3?s%;gmm8wEXGp%lfUB{z)|&0kn^Hq0EEBDXX{q!vo;mKdW*Cwz};^C>60sFvDw#-Vj3lX zeAZNq()W<}CRamc=j6`dCrfZ&;%)?(&IyiWFe8GOez!5?om1J6NR1)+O0wA9f<-A4Ep2 z2Ongeig$t$oH;QAI{8%z9QIy1=J3l72?&yQHT9xhwSC_F-<6h)l%6sOanzUGPQ5zH zwqEGVR*<8bphbRTA3`6u(4V5%{|%h9;9WpJye17xxYjP6=m1i#Bwu)@U_`{X#e`x< z`3>%d>RvJaLNPpJcUPU4YFRc;Go9L7&!xhc75uwkX}#qTJZRV*e;(Yt)ln-yBzdV% zVTh3=5E!dYRFVlC+Wxe8gdiady|4e%uu37oMR|w4Gn^HYV%9eXILwa^>xB#)d!xqt*Kb7;lZK^|@Uj>GJ9C!PQrh6%j9(KxhGtzGhThlWC~uHJ4> zL0%$W;YBXG4wHI6e;utJi~HkOdpzo$94ou>_L+J+oqd& z>kRnA-C^iR<+&;Ph0$L>oDE<&W!E<_P~2ay_oS>;FJ?ZAf(}>4|2c!X7gwXi+2-{T>&^AOzY#REvd~~E zw%Syyw+s35b%%qLuVZ*rh@S-fh4ROXFJyo>=lN2}Nzw4fmrd$SLP@m(zP_pAZ-_NS zi#(iCIt|CcnhM7uWIJ*seBv8cniI?uP61Zuf#=GLwX?8b@iV1^tmMK;eU?I;=wz-j z$9}s)7i2u06LDCbJ%pBN@XCN8M`vK{dUd&x2 zPuQYdez_g#{E!sglq2?G;*YFX^KXw+6C`jYaX!))4{zXlp8CfYmMdkjbbh~tXa5?} zXrG=l`-NZ%bZH%-#Im>LJWn4uCAbE6EGXE*wTA5_NFKFGvXh1{JrRmeq3-UCr!8~j z!P0CbyLDAFdLn$_fSG`+pZt&IPGM!&1n-ZPKBan_7t$6VYRn0L0<9{86yXATUm%d) z#bZ0GDxyE)c&LuD{~sVtx59Y7Zisl6XV(CxUEae-G*}8B-&uf#hk;Tnf@n!(eT}3Z z{(*7&+m5!gUd0fbxi+(&^nZxUf9e`n4LXC@^d71CUJ5{rqQ3VzyV zjcFovW1`&pgR^%Hv;}+dDE6_r%Mk2haG)S7SgrGjrS=E}xO;$qH!lcofM}m~=CsOq z|Cse|CY{h)?g8R++v}4b5aqvNiZHM5S;=;s$%yKu_KrR`@nZg*T~p5iZ=kRy5S}-g zsHwm}_Mb5bmRy#b*DPoTTva<47A(zNR{?95kD-z#xUgc%wKPFi44gDK7ihd{kK}p1 z@E4iYS#OKHj{xKVeqwUM4a$+ZsK&D2Xue7fX9t4cUY{1KO@{^*ZhFl;)D~9Pe!VZf zdY`*>-?ytjuU3Fh{%Sz?z8wHt19EKapAvlxJ+$ws_2$=(JUw2I)qFHAx^xOUjG2PQ zRYwq@L9VyUUMyN+Etqfc-n6NbD zbb-B3xS1goCpi)v`$L_Hq9jtLR_vb}Yl^!mwD&B&@eczL1%sUMN^l;6)2IKaY7GES zVXPJI&e@-p2^E-g_#|jO#32@r{wo}XFS2&oGRHgM??JhO+Rj^JT(L5m`yblu5Rtt3yaHBJCYnS2y;@&mv{# z)@=il&OJl|yj6=V^?@6xV%5o)&)Js_VBN<_KBkf#$6cA}0H|^cNlGm;(CdgPuv*{) zvF{Lv%;uUCNey>pA$1DwZlsiA!+?}^oNoo;;!|!;AxgI~a7ny0u&4V453HjfK9Q{4 zuvjF7_QJ_o_!!7J54M;c6gu%@Dqy*mk<|r<8<>o5@)`Z6fsvwGH-8ama1@__buLQZ z`A9r_NS_*ybKeLNCfoB=9OgO&o*^@eQ!r55SZC7=-a;fT zx^PQ3(0E$Z3~h{I8Oj68!id3CQ+qZyTikjMyqDHo_wq-}{<$Fho%g$b16^9C%IL2T zptqs83l3<$$p~c%HijaZzKCP9z6j~vOqAKjK#;W-JnBkDnZsF$YW_Ddg5TkI<4syg^t6^Kb+=fT z^iO}XR1g}u*PcH1bQu?J`po7Rc#gr6NALM@W|3kxe0LkXgSm1&sQZ!P<1y}aOK$8a z6d1hc3|4NDaQ3|rP2=HnSB62Hg2~2>04Ubhiwb?J5SlrzPjSDl?IN{*p!L{yv7dFQ z=Gg>My(0?YBh8LI8#Kn(k_|Ii)#!g^fHH*6WNBNo!puCTEp(G zBoCc=^gvP6S2SCcX!beLRC!A^Qm2~OP#bjVz#w^uYW8a+;rxdfQ@dDrVT?g?#?boY z#YCqi0Y7bL1z*ne`}A+3-eCQgS4%H{m;Kjw&EL}2UOFjah&|gz`nGjb?MC`7Q$5US zz6jKoO&^1%O_t3R-4yEqaz6}P_jxNW^#r8Y-8=frLYX%qorZm#`bCpZyzS$8!>>?x z$=2Pmutu^vX^%oiELcgLz1j-A7`ool!Cp-Qh$7j`@Gdn?Z|0ikzs@0&-o9~k^hNjs zb^)jbR2~rKuUR@_US;L&jp`OqfTqQL3@1yxeAHd4dt~({$}SRC{Af+_pJJb7szgn? z?`UrD3v`+C?{z4=>aU~+(h1!pzeSIeJm?%|EuyZ3VVRHV~pO4!eeFe!Pvi*11qo2~7QFa6{SV|8t7D_4$B{3P=G@VS!-8DSZ>=%&oK@gythy0u5Vg? zcXYD`wOq#pq0p+=(oHCpvwI{d=aYXEq0&Vo%~G8uN$+Vm6Vi5pWd=W*8Cm`|olTkx z-@SP&2KQFn0oFVD_Ha#UxRcPVV5K#w0>LZ>)PZY=db7*sVAlkmc|QH^f^Bfwn8~}j z+o!;@n-x>X*6lNAZ*t|%vaRN~4N>u*(547K=HfqrO)jkMHx;oe4$O$`LGxt|ZBPsg zG^O;TpMQTtJn=K`?|Br8Eu~gE@4I<9o&vGqM}Ix;*r@o-@xwtA!-6brMQnMM zi#}mszqf@+qW$&beAsj+#T$FqJm702)wMCj7xR*_uk}WJ1!7Mw^9cszcQp76mBUM) z5=<;we4R~-z8cmqgZ@1-nhbl)FK;YM{hK61E>#GuO-WDg_}Z2JvVJD$`{$uP=cY^I zQqpd&RGwKe`dOS4R2C_cgmYwz{^An0>_&8je8>9%vf#@}z+2Xp8@r4q| zv@csR5np+Q#891V{!V3zT{^)KV^d!VzrPIWm~7`{xyh(ZD}?17Li8HP1TJJ1S#4>w zGwR4#!gL-jg?ac!a>xq`3*nbMg%Z5((#h%tj;v{niNd9K>O9*WZXHvw@+{~Oc{d)h zM-949kfMY?T3ToLFBv$1{fi%)sTRPAD@=$s%g^9{Uz_9d5=1PZz6Y!Ozxq?8 zu^X-XU;WJ3iRnGvcQ{44{C%xSg>;$@qqhmdr+EZ~Y{$}5QcUi&=x1cSgYINnyNO?0 zAc)|i1`KZP_Eq_dho>@;29aNYsGdR1-nEyh^yee zuzk=u_&%a$`;2H6gkQ3W_Zg+7aJJ!%<>a$6(KLawR(YPNpx zg3%Z=gvN||8%##CY!Bd;ZT#8hgZd!Q#l`dRs)7P;_x>8~_NMEN1-xO-X1}Kac4k5U zrCIB(ZEvqLKLJ4A{jRGI`S~Uu?>>6T3dGrfX^=q@A1*w+l9}T_ER6L)(JJCJ3%_$v z&vh}9?N)jzexzIIGb5=Ni6 zo&CQi>}_1DJP$eucOWkfF-r#~jth5|?z({6y1LLQNOJ>DzAV0`T+CZw2q1j(>;{DD z=950|&UkeC#6(DV0OPl~12y;f2pgZRzCHS(ot>bMBY75qMb z=F}Zql2U&mT4a?)W9XFV2iKKKbRme#N#BJk0eKS@LF`%#!pyEKb%PhsoyQ19f4KBF4 zHWlnETuXA#U|?cWiSu&8dvkBkGd4Rb>#?(Y2Jk$7Qx6S<4#&Yq(guOE-G(N(vV=+XtoRtWGZ!5-6y}_<{u0YX@>DOWPwc( zP7#T%u#%vW*uuPu7J+pBgzBGC05+DsxAa%wuY}$cc9UPs-H-W^^YUfjL87g~98p+X z430%4)9N2e&3S zoSPT}eJ>T|E|EF3e6D{dNdFnq{Podt_kZSj2cToY7_A1lLPCOP+$DXar^2gBb@bir zahJ4jvzy#wtd!0X--Rk%yu|OoN!eB2@dbsLBZKmsvdyce+Az%>`O&KF+297=yrnXg zWFS+a?m&Eut~qtgr7={^2HpAc^0bH`HL*r_BqPH>%(aRgz-K~a@MjHC*zWUOBU^*h zi<&f=5{x}4l~|g%^5oYT^vKphjdHJF`)gxgq;;{}H9z(8RjSoecnkBz^mY~>4_ks> zRi*THWIi6$1@yBe^mf0Vj@zG(x8r(D3qShLCY{cy+f|}^@L55?d0$hV?-^?f8VnQJ zBpRO#r44?2|G}Xt|65%pqJwTDu{SM-BZ~FgFgjNxAGBb6Dd0D_NP&4kGR-a#ZOz~& z5JF}DqzrniRx&Vcr@eJ>{Bo4PnbR>p$}8ma$gS*((5@Tt)Ah;KAPD9AG~&t(Hb?OG zt(a`k&lJYO3^o!}OwMDcHT6>%L(HH;+ClQ)c1N1UcsGvo1-~!Okk-b~HAGkCp=)y) zkvN1dCM!xi+GF1MSl_hLOvq?m^ z-OViz1U|PN%aa+WlNqnK_Q#&%t%f;H*CtxZ{2jGXeI#isECgygsr&U5^c3T8?#g;& zZfcTiostmJmg~+N(A`kNNyI4x5iGpWABkeZ(Fcwug<3ZJY>tBscjb%U6;}b~K|x;p z@FsH{$mc|S(nGkG^95BlRO_uhKRxA2vz{gwbDdF`F|1P#_7olwdYllPd2Vnf5NGNyB{z9g(>G&?h*m^2 z#RfF#+`nj;GqLWOsOlq>Z2sw{6XTcu8>zTnDYD8lNs$$o;#Zf6BdN?teiWL}5!_?q z1HZ)7SKug9zqZ7+(4M)KU!+5%(nH;ip%B)S`$DGE_kwZkK5FYRsJ}GaXXa~1!)zvI zkf2s%f%Hu2&q~#`hUF;VjK^;e$q1MI=>gE?zl zxeZYSq%X5+kOy1^V83Q!j3)3LopYN+mPtfUz%(7d2>FgcF;vJtua4K9pn~Y&l4FBS z?AWl%s@WviHFqi3=A_BRV;w)e622cZo^X1h=LQ8yV!UwbqG--AnE&F|o@P4V6T;Hn zj#c1JJmSPh*tn9gWdJJFY-*=gx_+-A`xR1Qs|WOchx}rZYajB|ff>S*(8rpLtvt$& zNHk5`5*sz`O*W~)oYILTRz0XoQKrCDkBP^br>jf!Ed`NF?YBgDEB_NHm~a2U_>xns zbl?+Yf7p&6olL%zzDjKx6F6cwjLHkEyvC>-cq(XTe@F+JQV^b^(<~mL`OMOqGMchM zlJ}n4O8$?P;fRt*r-D+dO=)H3=!YS9P;Ls$7?w;+8yiY}N&0+VxWUNhtI(t0_U(3N zmKL>I!}GFmfz8UCZy+GXdqn1XDcWoxIQ@MkUZ%(2@%>=>1ar1@txmYn0I)>gZO$yo zYXdGvah?B8-dcx5+`e|l9C?@rm2hkxvP%GkiHaLO^tWlgxcDpU5rG{Pck1T58?QP* zBUm4%j}kEoYw-z};TB*+WuW$j?}lhFK8Wtb>`s1vpe>`QLLLO0Vnz9B#Q($6cd)i| zfVEw%J-ZjZBNKc5FX*U|!^ry=_igStX7@VoCNpLcdy=8UoTra`Rb%R%bc4^^br0Dt?|ZNoABkjUvqqn~jx%yGBr{W{ zo_Mm(*TsVDd?wl7HST_1y9@iKqW~wzjtQT;@7vGcx1;X(w?D63U|Sy-r~m&d>$b}z z+)F-B0_h16+^b%FJm{;igfd+sUl8UdZU*z4_H2K~1m(rWjfgl(GAl zB3B-BzRk~`>iSEgBCnDj6r$xH;9ncqe?C8IaWmIqg8UT(pfBw0h3T5V@1H!!sEp$f zaMxzRfTY!LEti$B3avPXIjS!rS5ukmCuT+e#b10OFFSqECWCklwy3SWgFNIt_P586 z=r6M}_cI}Of0pr}+1n;zaRl+ng*}zJI+I9;u`e9KyvKFik^+?bdP@iLE01Hf$8B|87)om^Wf)O@IGkqi$TQp3rY(@|w<>W~FXish&|!(#)tZZBETZ z!?sj4Ez@YoFg;eyRKc-OwJy@=jyTyt&qR$NqE5DgwTjvj&G~+IT*I3~*f1cFC^dZD zOT2EE?&Of9+_Y3WX|5~M?!OrTE~tNVIG2I-R{&DNrA`QC^8GV9frc_o3k2;$0h!2E zy{tjv5>b?golEIUw|Pt89Y5Oz9ouyQ^Jz$Si{d^tPLwfh64|_6D3quKw=dr=QI;s-h8V(foPi ziXO}Q=gO<;B?WS(#>q0+5QrY~r@`*b?x$#(gSRS;%0J@*>d9KqFjQi-g!*YlKq!Hb zRpRQe|DfvcfXiMjGgkf86rX~S%SJ*=!enzCuH0wwI$+xJrE;F zB<29*nPnZkm6*-j;wP8w-qPz9zi=CFqlJ8|0x;cJ!HNFPsS{6mlwGk_*CrT(B1Rn2 zNKa~j6rFjH9i?NkpQ3~F1FD5wm#edl^4a&$33L>jn!2PDcNAM| zW8#S`hK;Qo>GU=2#@3Eh=A*78R94fM=;lkRwbuRba~YD1=Ke5KM+*uwCksu_F_eVI zzEDaybmZ)j_=6$`IqQwO{tgy|ngFuNx_-Fya5}=m4bS@^LD7jF2)Vd?v0q*$S zmupMHUMM|vSTi!v>|aC10WgexzdVf#-5qXBfqn?_?ZaI>WQ8kkux{Gfm?N4T=|eaR zK=S*|w5b$kYMLDn%M~jWYKun%Yt%#8Gkj<zT>jH@3D8AMHt@k9x}X=fN2O%&1!L4~iK0RqlB`;6B) z>NozgiJ=i^Bs<@PuP>sIU?MVpp`RqNY{G4v2ZxPqN+tyU(c8fB#yJUXcs@5l_{vl@ zzAOeAa9!FUcLYDd!3$B2&H|EP5xv@c#(YgzW5P?V%W~BR=v=qApJMs3^6Nij%xpL* z$1i4slr)fK3^+5gzKk5)@0|ANSF^EKagCFssQj0H7odZOyk4#mb$%O8H=L(_)MGzg z0zao1A!F~mGdmw&xBtXZ8~~%o*`jPf&1}rdso14c(R2I!$CkN|?UPP6j%1y#ve{0n zkelxND=hmCgqk^bTfc-$s*+#1{ql^#SY<=u0t>|VIV&YsZ3eszVEydVd#Y1tsxv3u zt&{QgMWEVE*5IWVctzuO&z$K^wSsq}{P_+AvFNd!GkhNBP!GdU@Al~5g85p251X!c z5pB&sL-Dsa+!l_u;qjpry}LJxTo7=1vbnniXuTt9eF6AHn~i)8`o$FjZo9{N8EybK z@;|rUzBK^;k;l7Nzli7+H^0^Yr)qc?+dj3X(=>0VwR$f^-=KGK(Q&3%?k(CED)A~V zTRB_j`qvGLK6cRz_;h#ZoV33(ZqSH3mV(%Wbkt*t4#K1wv}6{Z2I%?(ukh@}pNuH&#e=d)%x|@BaZ~{$P1*qk zcpvpPOP-7O58K9l;%>m!uI@X-wn{GI;}@80m#V)9oj|M$BaQOoB01HB$T;r*nlfgp zASuC?A5n)pKz|wY*B(!p8?(W70ZYKINq;xthonzp4`ct?>zU3o!uGX5uTry2A*yGq z;y{12HWwd`o6gf3UXXjvqcz`|OgAJ~<)le%%?Cz^20ApPFB+CDj6tU{AN~NgU$eIf z8Q$tyHVUghjBUc_4#sP>a{*a#4z0h8ZJO!JbS>&cZ%SIc7~i*mP0{Wu9#c(3KCmbT z7D^V)Jxf!yP?;2GbWUrYn5$Nsc#%fLI?!V-u_yh+v9%13PH*LKWd*;Xj0@cM{k5KE z?}LK``bN6rpB5rSf9;)h(|<0?DcHa(K_w04Y8o^M%ik!i{E^ld6wTz;mdY;<@C*Lz zeed4h_7(xW{_hz7KZ3s6AHRQ4nX+ZR7QD5e@8=vk@S&l7`LPmJs z0rxgTL40<3f=<8f^s1V1u?RF@o?X&TG+#h<(E!kJI<-ZJbWWWFN*e=f4}7IXk$fFV z4C-L==e67q=_;>SbyHo(pc#$$kz3@jP>(x>N+tBz^(fJIvS3UrsB)%(L2KAM-mage zNZP942BSzvY`E`Dk>dJ!ERadJRtmo|d?0j)2Faj%`9uGGVPws~Q7eSH4YK}5zCcB? z&QjU1^VoT*4q{P0M*d@(aspba)Y=2EcYgehyIMqHA9(31}aIy@z24A6Tr46x^P!#<@vZ^cBoc*hVJG>dHHKqGBD6DJ~p|gvLd975=hw4R8gxC7^uzrO`9oQx@%@5 zbyXDX1@y6u;1M|nz#Eo)O^xup|Jxioc<3=u-BGGE^V+5FKn3^cVTHl09d+c8|4$zs zeQDA;1yG>p!%@VHTqj#kO^lt@;pWC$%YUsO$zj&t);YmtC3pz(y4282LXAJ(&ZGan zyk7I-%Ga<&Y!-k^vfN-L*^Q(XxO+8A#ig|t7j!->%J8vV|NPyOCm--pFW{j_Qy>tL z$m}q5y9V;ycZ>V$dvaVwF(R&S3`B>dR=!*5e<=|W)84olyJ}qbcR-9b;e!@=qUgr& zb-6qZ%|0|j!xQ~&aGAh1CfXB_s&r1qCIRa~+Tz>`tkVdWfFR#nS83rwnDgIgafmZX zNrL?Ot1ibNBKU%J(e!UdA#qY5N9n9%^kSIn2l4jtru_PT1H}bRAr(jE96JrHdr0!X zY@Q$Nwx%#anLInd$E6EM(}Ju8w%r&b9Xuh8ai{ps9K&tIyh}(l&-4_?=vERTOvth0 z%6?;90No4}(9kLxx%tC6?N+mrQS zjFd<}Oe_9SM}m*aSQdebwEEwyDELyN9-#5TI%psxNZ#lnF|s#bX9 z7RqFUqYGzSw6;E|#@GHJ&c9_m1J&t5IDw%siq1$(Z~G3P$sH?)2EeM+n%uKm^-a`Q z!1(6QBML>AOv&wD%gavjjsp1_aJfJedOqyXC^m|t_`6tGEb z2tTE#Lz}_WZBQpt>|4rU_-;!6g1NGTST(?aBVMvg+Mg|23HCik{y<~T8ZKO~IreN8 z`YC}Q(B;jTE>L!(c|padKEO&LR-d#%ZIf9$b!6056~VHs^SPdrVA9e`{>6I~O)@v` z2&?ZQ1pXd_$vnLrgaSkSNTfiKnDv1I z#vC~zyuuW|pC2nz|3*U_G`P-8g|I_w;0^|I6@DGr-H&;s?lM&PShEdQ_%FsgE4?yX zhNVh5lcAuhdz_4a0(q=;J}rIlOoG^=1YeqxtcFSwk1j?YsDL@5p~lA~K%K#vXMKU4 zP2kXHKuyoC}|2s_vx7d`=uFL7{=JI$7OTD zf?L|Sd1p82;A$jn17_sEU>{%Yon(v95+@C6r~2tl91h6K*f@u#hBUJ6Ut$dDbo8j& zwq3|U^xF}pZ(S=hWk&5gH(gtpY(|#~sj6p!C?CJKRUnXDze#$gBM@??S29o-*+ee$@yO)C zh1>h(f*Lme9T?MOz(hCxxqrT^Khsra-Bq&NKoY`KM3c+)ZTG(z30Bh2?<_^tM5*I8 z)X#AwO_ypuB01+k`DcuAX4n*EWCiMnvv|d?o4X6TgwenRMz1hpqYS%&uNw1Tto)eN z`{cT3=p>KyJh>3#>M&N4aZ!hy*qki$<}M-xXLU2!EZr;Ff>%?*Yhk9~eC-MNs6>Vi;1$ z1Msgk!{1(@Ejly(f#i{u?r}6G8XlG9KLb0`+h5r< ztf@O=4e%YrQw!mEqFy}zAB2{H)%&eQab=!C;!eeRuVq0RPyd`0G|e=wZ-k*uUP^TjFq! z`@CGvcBO3?;~}fONRi+$vF{!t(P~4==R$%zKcQ>r7RM2O(bb=8I04Z2w5C z8O8t9le_oY^JWrh-Tm#mpzXj<5XlNqeTaBzo!4@Vt!%|XetrTLO2wxh-%svIcJ}%} zb{-HSItTG?l-i_bs9(EH+=d126YTUPLYYSy*9M-QFb>@5kp>7OkaNztm>8+sKOxC- z-@0y&S)`B)hlZ&6Rjyuvw_?$H7)#DqjURS1@G^gOsF?QA_(tb%EfU{f=f)SI>^@n3 zIwyaW+iPggb?{5Om8RD%97_ozO&pZ1 zu6^K-{a;1!@Q+75AJvhG-_>eY#krLPGLq~V$d~ez9ankXLG0w5q2O(LjXPuqK$SsQ zKR#a$RW&K%>KBCE?ncfid(H!y!FtD!?V*7{zjemTs-|`BJ zLGjrBWAzpZ#a>84Eg{9U=984T8wgT(GjzqX24^%KG4(d_BmU8|lanHXNS+7#=CDw# zNt*Fxjcqu2GyH0@X~x!#B1|s4!ZF-9i8#;v2f_=vv6&n`p9Ky&%c7v_Gc1V}e+9~r zsCE&q%{$h#pfQHx)|T-495=kd70vNly_$>{whshxE{L%#5|u?uj_Er3c6#P@qMVBV zRKIE#XPmI#-_4#?gr-8(cTwn&1u`VZEM=N zzP_I~;@|os&Yi3{BP*gdvZ^wVwH9*H41U4sp+JuONV9oBNGcXqYD&BXVZ6os3af{6 zY5#}Y;@-9+c9%pBg#Ege2ctv>XXww0f&F&{a_Iy=+@BJS9;5vcyi3@#XiP=(V{GK^ z^Edvg&Yb~~e|*(JMfH>W<=KPMT=Lqwj3Dv}c(7WPd7NFPciPR4qt=yyfCr%WA>AltqzRybc@>Iv^RL6_n zY{$zl^KH!=nb z7q3ukxnr=WR&;<0`|QKXZ3=`~hnxp2+kJU3(W4MQqS;vVbet%*6K$Lb4t3l=5o8Hn zoH%JbSC>R@!VN>nuF(QGYzbmLO!=!cg3sK7w5fb_dYpnp-^BrbHtH&VYhz2 zgR41_dK0(2jC3{R0F*RDGz*kh%z+KB>UZj2cBW(#^ssr|UoIkoc}GRy1sBFq=FnJh zxheja&l6GVBst7n-erq@Fwz()@IcF>!`;ZgP!q=YwPbUAApsdraBOMj2-G}7$E9VJ z9kM~7M~WMqbrpcCZpFhB+MX&ScjWp`JX`oZtvk)Bwv|83*wumOzBy-BI&kkXcas=| zjg)5-CFz_0*+W;AKcL#i5TNam@t(a1i7r&PnH!yS{uf)DS}rGOhWn%K!Uxjpzawj* z-oql1E?-i<8+`ZElWw z^95eDYGYB#4e0V<3#m?^$ zEbmXGJ)zqTd{riEOVP32;Vx4$XKS!+CJZNpS0Rga7I4PO&2yqyMj z#^$~Cf!B1m?OzkK7aGkbA@wFW2Vm@Z8dCrxEeAPtr2RDY zCfyW1meCVGX?!!VaD02-Xon+kzK7yLjEy3Zh?{hu0lFRRI9_!2qa4y4CtD;Y@GM0S zW*zbZI@?|$87WxJ_Qa@qvrQUp)zM$(BJE?D3kD~26^Ox2g}6|>(2vhxv-r*36xESQ z*-oRzm=W*HCf<%le|?4^h$Q$d2FE4DuWP)PzRbJlk7|#%9kX^%WZS?;@V!u_IbVMrZAF7@g0C0sLYx%g}`0}{+>v9v&?1ApRpH2yM%6cxv9SM-d-5%31@bX*G7ss4^ zZtYqgxyi8<8Dg0i zrv!c}g~NJ5f>TX^Bcn#T4~3maCvWSISrgu>WRvmFLrs6U3$2k)mdSS%lTWGPOh08A zEI;L_EMMdr{tC2pA9dRYt(f7{Z-~5`b_ zUYe$d>b0>ZC!E@#5jwq0uhw3DXy=T|;7Y?H&I*cKZR(i?tM28`67}&+wSgN}`!HaQum9!xjj%fl zm^TKF&{BU*;&VIN*-Tb)G-jy|ZDe{9Rb_o6)?i0c{Zy3=v_$2^%Knn9OepgrNOB#q6 zkLXe&@lubAei!~~M5FRS6sjiZSF?avaMSNW{NXiL1h*S2tC_Y&i9O>2W(Y94mgq2la7islv zTFV8H2hCFczAcNUd3kM=#rpL-Y2NRmDxMLluSc?iJr~n98H+K8d@*UK?_;UP?N$Z0 z?%MR|{I8BVuk<@e3yW2i)gNdYevJH={shMbtid$i%6g6g&jIOE147y+uFXC<{{I-`C zLRLgtV0;hqYxDnO0awgrACVVmhu{U5DPke3gz2OBZ2z@$SY0a$Er*C%mqVRq!VmALPF%cYzdLGD{TJP+%tQ9qBZT<*OM*}# z^{C>W7t~@Gnmw&16?kT#c~tP=4-L65SiLh8m8RX1{j3Dp8j>4FsV(^i#R)xJV#dChgUFz=Y3^H8LiS}Tesd!@5=2Zkeq0pd@zK>!H z+B_~Uq8W!l1qLI9<%07#E&;R8H}M`8xvoo8+UBZw9Hz%=Hte!KA}O3!fLP%ZCZZ(PN)|0@C>?fk)(snA=7Dxj&%ly6XsWbCMwd=Nvt*QQmVpLlL23XT-f7(p7b%B}<|R)JuPVpYCrjfLOG;NjAL3d9HEzU1{!l#J z`f3D_-2rWu7GQ~_N&6kJf@+diUBlWS$Z|D|id*r!JJg|N2mn(=cDtFjiT# zsMlz|S1g$NnL1KtwP25ty-D>!4<&?R&VTa59?WfLLiLXxc zRJ_5?Q#4(-T&_lK7LoDl#eh5_R>j^>#E{d9E|~AouG8-1&??9mHW$vV27`GCg_#{2T}Dn zSAbn~Wrwr{VQL3+({p8dRIy8^6crsv9WNpJIT=ugjk{_l+ReXB7_}5%;^IrUHc@FyR9l z043~y_nT%q;qXIqd+5!#a8(S|tST5(Fy(>0YX;4Tqlql>j zOYcR8{HYMuXv{}EOACJemO+(TK9z=J-(BwsxxvB>aE&stkYtbem`l&4@T-b}ND}g% zYw9J+BBLvu|B{GzmWR0Y)0OP&ENyH08U`L!$WVDs`jfs zt3!jK2s0u8!s`=1J)!d_z`bj`>kyE)IsV^Q^0DXZYh0w?%09vB{|b=*0=&{du=>9u z;C?27DqMK~?lBAYYc`mL{gU+Csz2|kOWg%WIR>Rac@NNG6UtcP-!ra7_^XCSG7U{) zxWgU2_3}we3)p3QUG1HI0_@Ovgp_~&@Z#T;vqj^8>z2>nRKV&3fcx`98(gyr$QrG0 zgIz9x|M`7;k&6rtoUlC`Es{k0;eU(_n(z*svN$@gm+kh(ag%aaE9}zIPL}WP^%zh0 z9a7z)osA(UqAcyOznPOkS5y@2>+SJ3iD{!>nNyXBgjfqhvYQBp@9WDX@C{6&5`;(8 z7|j)Gz~n@ip2iUbFq}89=U>u`$xAzNV^>-=nu<&_|AWgd7s~Zs<%^a5nKLk78c(DqD>UmrO8-F`VNi|Pkw&X_AR^zV`pb2#L00ZzCQ z0@wX)$cSUenV|vtm~hB39r+Z{G>?Q^N439wf+Jnjq{KBDUN(D3gBR51zDZB@Bg40Q zL<2-2qgzpA6~oUK#Ux3ynV@jHV}pT>qlrlodAM=!@t1%Rw37%LL6Y_=6tKjM>~8%6 zqy_2G#e_haPjT6^#g)O^6)w;v3w}uz5NC)Mc#>S=)*^QTW0eTl?8At5m}T9$pu`D{ zS>^*nw?@UTM-~y`w}iWkAyKi<`X)2p(hu5FkgK)7Wi z!o{7Tq#Fa2>Z4ABwMKT+Bn)kB=;t4~of@>D=WQu(sChh){OkiP{(`z|OrN0L?&k&q zCXL0o_*v?xTCo&wS>RFw<)Sll1^Wg>`p~|f-1qy|Ukh_-e%?k=LP9oGGi5R@*6+7! zYyidII_;RnCNJo2+A4~&m<9eg#5x=#GxZOVmC_n7LbJ~NJ+;efh(ZT3cUYmEU*p(H zgxySEck zP9CQlZ{%s9n`~Pea1IZ62>w-1R!n`{rzNUwO78n!>F#488JAFcsr=OCt;JId-V8v~ zg4!7C#A^YCJ4g0cS(t&-+|kv{4IT~?d>*Sg6Du$C89&tx(1!LxQHw^#Sq+f`)>IZR zZ?YSQ(pvc(+Wp*!TUjz{zOrg+)~|3m-x`%mdF7h44j%?L&qnW+plL3jUSsf~d&|-1!#RL6%`>ViE5`Uk98Y$iA2`Stv_SBs zL@=gG4&8fhJiOx}cwt02&c!oop!Q{(umj|fG2MomW&Kz~VoxM9j~B!NJXO!I=#vAP zltp+3dZw@?(b|yrNU#M&%(hJ-rulE!`ra7h+xMH7DH?sCvoH`&qqD3@Q6P1OkLxBqC90Oz&z`Hu$zw>Rylz4)K) z{6A#SsnU!;+E;a4z^X*wCCT0s(%n0hhc8$cKS-o6VmXu2>V2q!MuDmZ$xCXDQda~bjC`%whc ze3B%&MFacY$h7yIP1i#Zrz)i{dtVU&zMKCkflU~wESUWxpe-Fkqx5#}j5W#Qi#PM> zX+K7c*Ckk^H31JAV9mQpVrAuHUC&{>Uf(9(-S|kGD0C{sI#$ zCg1zL-VlCivs)j%xl@1^jj`+QzSmoC9)^ei?a?6Q0HVSzv6^OSs}!Q=EplG0|F6`@ zb6t1p{;yK5!^F8mH|{f%VuiXh3h>HaWs`$^GDi!utErl1ca7qPi_XqA#TlSN=U2@< zCi9wM?=S(ha^if0bgv@-RN1f}hUH?dTpr%bY^_gZ41iqV^qoA5`v$;o^Bc5i{WQ4K z9~uXQw0r_EXHCWc*P}^*lqck8MzUp)u;uWD>`IE$9(x^`sYO!4q|- z!)rrn2T2gnh%H5QHR472rBspEMpIu#VwUzRllHBUt?e$6X!EAR8}tCzHWBmCL1~RmFegHN_c)1!k8*TJ=$=}KQ z_B7qUHDag1^b&4-&I2ln*JA=F5itE%dJ=@PamcVzt)X%h3q5u1`~5>cg=)1bqc~=w z)X)FHX^0<#Vf1!fsG9HLTp`d)(2@thbft0-pCB-&CQpc?^boF=;O(RTHcq&6%Dx*_ z#!1O~Ko5;XbHaVdR49V}tX8U1(zNR$rtbZIiWw_V9nUy)8Rtf)!`lx)x=4cUL-&IP0kE@37_=2!s zR^sbxX*G=4tw%|6le_(01`FNXexc_Aj^0yM$7j5mB*`g;%ZW{2{n06J2Vn9P4Utqf z&{Io`IR;ekJyIg6O}L4}o!c>Qh7VnU4ucyT2-qB`0@LXny#*wIYn`%uwq$ve0sX#g zRvO@8;DqT{i{IOW^@(5Izrv^)^g6!v;GkOt@c_{IS@3elsg&t{1*q-iZR<*+qpYh? zwUuf$rpkW>Id*P>Mqdnfa;k_sL|d*oC(XgrbNBVa2#cwp~Eh(~7Uca!7;QZ8X7a za0Z+lMuXn<hQs;2h@8%eB&!D7RdqKmI063QkkKgLhP=%C z*nUHtOd%i$B&3`WCc_`3AqPEE9A{0$uekZ_oPAMu_0ERbp|ET16pd|*`zy$%Q*ZVM zT-o5j3}tj`J(?#2am|wzIBF_$Qd|XO)Dhc6PCwxJ~E~8$+~?f@>b#ICYDe@kj$y_oYaHnttE!IThv5^GHGzmI{3rslBu7f z?;vMM$nNg+psncCPUHZ8FAJEJK)v(UpWp)gDHO z_rEy%uMdr$sGj~cP-?RlWH8m-V|I{#9H@?*%&F20c($NdihXwYkdlWHo1_~tPh+O4 z1rvV4W=rJlNrL`TO>`HqANJtJeYQ)$_mNfVeTy?>Ma-i*i0oRm#4}++dnEy2A1>HH zANEwz)TsFG6r);|zQNXKn&(QzdB1?yi|sY7Wx|9Nt`?)ZOZ_`;rG=yXc(B}{m@?7Z zT2x9s@|_fJWW_M}k%{Vn*iC(=IEvo8Qu>UyZ>f^5Li|y5l_Piw`8y`4(|3tA?<9;l zX-TaT&Oy!!0dd`)$maTi*E|Qo35KX8%Y8tPOn60nM-ydYjEi^j+pQ~JQSvWg7LR@} zzD0T(Ba(`Q-}SRUiui5eCgk%s?sWu8Pd=?}2Xu`TafF~%RZ_?q&@!$>Xe-*eMKbqx z?laXn0#T)OhEWyDNhgcO0KT?1_U;+NOOD&Bu0;} z@m$50x~cP=8-!tiYmE-g2<`+QG_eA)OxV}TxPfOpY;IFy|<~$ zd?9QK4=*+Q4uh)lXh((tYH%J|WMOu*q!MZZI+eRaWWR4APlXZIf!J@PnOfqRsqHp5 zHvj#E)ZD4+HQ#Ey5BV9SsOwuIg@LhOxgKBIpWzkaZyK|cS7lr0K$IP+?>~NJNCBTM zVq%kbdCIIZwdc||bj{rdBY_{B4}4ZbByQ9e!UCkrMQGF53x=t2N{Q)zVDwmQ zq!#r$NwE&s1HVho$lBG37!-k&>1eTusI)oxMU^RyLqNrvq6BbbAqJH&%wTf;&=pKM zqM`X~O~(2(WdNbw4u@ghF{uJAybHn@yX$n(04DXSyB zU#(SnBrWL)tmp-*JcyLL7^`08i(hA|4>}VLI-4SI#UgK~slSPpKZmOi7)XWY|QyjdnsuOD_+Z0^9@UTw~J?CvvE53f6hEtF&0PSNwE*mhvs zUS%uq_5XM2rAWtzeEG=vzpkX0tpk<{a)ONIb=9Oe`O7KKX`aW-JUO;Ez5izN{$G#( z{(p14rTuRJn5W}U`VGVN--J{i|6NiU>-@QsT*2OdT_I!DGo_irF4`6|*8Lf)12&aZ zT@F#Rq2CL1{N7>j^K|-*U}({#6uzp|$L?q<+kIzqrj|R6M{2xz3@aBc*(=Wfve3Ut z9p@86Bx(DDU`Nrr8|ZB6M;iQ(a*|c>#*0F4pp`*lorM_#G`8puqtwYt2V)`xj9K`i z8kHh!fLp|*LpB`uH#g&~?^pK0cGuEb5)>&40~SUtl$dbA?HYxVqBZY?m&E%^;rVuq ztkHOUjmwqPW!Hh7CLAbdx_38m z$7oQdLmV=>G{OqEs}7VT4Qgh($dSgF+=&Jho7@ThgRtDght5S?Q|5IM|tAu|=YbR=^zCmg0g>~>K*O`2tuzQAVXm)$gQLs_a zMtlU+8f(N95$SKCaB(zO*a}sQb^K^l`t1RqlVEAK8H`c_%f%hxE2yF}X4dh#7SPQ3 zZQn=O%CC`nU2eB9EiNNxee&OBF{4l%<_GsN5#}iKQv;Ym`aShcoi7JwCoj8$_W1tZ zZ^riSW$~+~6jRKe^g*sjp=!N-yY=(~V^H21k{ECb&u`X|fI-5+6Pp2EV1qLm3&-5X zo-Pw3ya4b5t&I!;KE9FqX{Fmu0zM=7&9`)n6OWuYa3gpR0aOTNy5{-yNM)eZ>Kwo7 zrO7e^g}>4dGvCV_+iAUkBnQCcZF8^HXIxIsC-?WL2`|eD!MAtzE5ThF9$%j z0hLpB-*tYky;3f2Pef&eebvovp4vj?L$BQXhcbYF zg%+#7lUq<@tiWX@>gaQ0xINGShyhCGw=JoESCCh=542@;ts|`I?ulB4AQw@V_3`cY z5we-<7E>*r(cE`UCV^vbt$7slCa zB{+^6=(}*Yvj`!h*G?Q!I3%!h?Ar}8^vTOu$DAmkE{V8Tqmc@kGA$8sGjPZVt3}e% z-3{$18KV<4RU?;_1k=@f7WZS~hJdWD6iHtR*S(v;cqhM!RkXNo5VfjRo+1AEY7!3=f@BqAAU*!zSSd_C@K{qd8`0J&Pw#aM>@j1fE8so+#d4YGL z;_7fr5fd=wC4OfyrLJgLXXZatA}eOm6kX>%#-opQ9Vy=^NZW-wlp`#SUJhN&WGfZ`oL6 zSDVh%o=KBw;UqDX{~}AZ+LFo$6x}!*EHwgEDz`P-a?<%CbmC=T?&&r?Kh&=rGb;x6 ziG)=8%(OD(pZi}_Pu%3M5Q1Pz!irAvOtRX=vGA4gonL4(Ig5Kq^?RJ*a2$D{t~502 z=kNn560Q2#*<|3MP|9ysmuWfZhMN*zDT$s_6F$7eJ&-8vO>0yAI)`5%_lLQmmxJ5J zYB+Hm+P&9v_Vfg|l9T05Cje9LCoH|UFA!<7mV^)5TvwuctwKnx^Xb95nm0|`NZWb~ z14xse?*llrEY8TqY=DrowfndpPe>S~@i8j?g=+A@IKHNLJE(&#yc4+%f-$P~iLh|Y z%_~4tE4EpWl$5ZOkzoBlYRJ^`4T^$2=NY8-bBa5(X5|P@_1W(@3=zeR>4t421XQ0!eieyKP_zPxJV{C} zBAiGYI&L+~ZonEPnnHb;4W-&d4b9&Ag6nZO=JjnuxL`*mZufm-BgTek+yoEMxK#wJ z&%!zD%?c({6BtkRTI@BhDsL_r|cu zA;~@=H*vu9DMS91shEGC|BtDBIgy&!C>nc^(6jbWqTPng(0)wV+@88&(IKVvrhe?; z{8Zr7!t*%Q7fwjbqL2Yla}{R%Do_g6 z{_+Cc4=tYy@G*KBjy(hb18RRPM~~Nc`VJ$>W_rLiI0+SCnwLR$Zx7@db6q-uYS{1I z^aTlK?Zq6O$1P68cEI##I6re8tfDM8`r7&YzF@;0d zl9cRv`|8&KUlX#^OPm*e{awxF^Y^a~Wc*tD>I)m+LwSiy-b6Iqnny)-$L3mSPqDB| z92!2IUCr(J_Ypk#6`Tf%OPne`tzFHh{`ZkegcS~T@7kV*pYX^S?+^V+=cnG{);11} zcS6yct1bi|Q%HpQNXJls_Jq2IJ%NwltyhrqS}uYbL_-+Xx(FPwi7Y~AU-E@oMXtbBqYtiepF<0Ps11aP z76)9^Q~w;oU5#~$e$(uI(V9r!C3y95Q;N|%Z*l*6MZ_>g-b^qRx^{DLlNDeFPZPC? zw36Pk}G<07kibY)H-vD|ob_O#;$bW<={yI{ITc!&jLT3*h#{VL7d=@Xh zzQqbz$!M9bhyXQmS0T7nXRs7DOzXkFJNGuYx+^x-k_4j)E;o&uttxrt9LRrL5>_9~ zG-Nf)7N2j&isnAN^FYUM5}C_M*I$$}6YuIjVk_7`fs9U!SJW}4Z8y%_26bb`;x+iy zI}U39wf-HcfUBP;06E3I`1JYKqlaW<2O@judX`nC6jI0&p0>IG8ge&HpqJT5o&-&e z?)xGBgemQ0t&NISXyUxsFBUvPhCE=-3i0pt$f!!h$$%i%0^iLWvkEWm)zC#I7v{)= ztmJ5tzSM~-Ow+I&{52Bt_4-^fZJS)sJ&@lv`YKdV zj{|I7L5L{hY#u14iHc*Np*OVtV@HYPgw7Z{oVGUYhhO|~LEJcHAk&}I& zIH`s%DWfsF!f`7nA;$AW=+BbgtWC44*jv*gI$vGPTF(`%oMle3+-7{ z%{2s0wwh4gXpb7;pD)OXYD#j{Z>Bswf@p%!Qu7oN4ZXwC>zE$?pc2IlrhR`xZ&%v~ zx$#$Spg`&d{7a@;KpzM#gA`qc;j!YFs8p{J%@T+khvS;bn{eR|E;difhRWDe0POd2 z4s&fXBhBaiy%vzyL$xF-Fj6E(Sdvv5ph){n0~ovAx@J2XdjSTRG~ z$L*5xP(Vg8T{=MX3t-GBeM^G3-k2LIVcN!!E3hh#^tw!0Rhvg$sdUZ9_@s;Ai$#~R z*cH;|xRwq^OKjgz+#n`;REhVwyL7vLySo5s&#UzBRsCpOL_j#SZacA#gv{3bWctXA zC|^@PJx`0vX3gkN5Y=xnrc!p^+9awbN-B(kMp7Ub7T|iZ3bT9nUL{*m>pD&n!H*IeTf$X# zYrg4h7&o|IWUaBqY;Aku#BASZzhyVHpGgv5g#4M+SzT9d6L0s9 z(07wR^)c8_{8mTpB+)ON<{AchMm^aqoT&4`h*9`?{d1wG)$cM(hUb)Twm6mj?L=w$ zO^nMDR5!$ zr}z)18Ow4JX(yiethC}!KtLDAN#QG6cu)v$_nAYuE$-ys8mS|vJ|-jb3wiDEm{#q^ z5wC6WUQB7ZN(t286a_l;1#*lF&q?v(G5xHD>YV>PWBW-v5)~*3IiunHPE|8tQtE<* z&Ai#^e~r3Q_d}MstU}|h7RY=YkndFmGCF;-?LBB&`XSDQ4}JTEt62YLEVJI~l4Lm~ zJn}QOa3jBz%bqT~&h-_-VK=@Pf-P1%T9v!y@Lg4Vu;!vLIn2pK?Q>+^i9X<%lUq<4 zlp3r8Dx3By(eyH)LNV?^VK`g=&O4fSzhyW7@JEN?2?+<3oz{E_5FBfL_}6|3tbXTN z17=$QryBt0YXBAgJOIUA#s$#4^Hwx@CZjllKdAK2axT=iE4n|d6XAl2I`)fU`|`Y{ zF}R=w++-ZiETuL@%|J&@p8OV{XdQVwi!d3H!WZtf&YrM$PK@WdUFyPXVBI&SE_yxfw_+NSdu)7&;CWD_lJvEDE=o5k+ z+uej2?2IXtr;-*>QzH7`x2zm}{}NopFXpCgxD1RE&uao9%>qDg+Q&@%fa{PD*eo=IBnC5o&_i(NvxvWjsR+ zjgU+E<24+h)~WmWP)6&o4@+rr_E*(~&TDj1z}LcF_tOS4hWMMaS`my5)i4<>twf=6 zS4RyBb0wF)LRO$c=LX|_P>0}p+!^7MySx@of@*Odo?pDLsq9t+A(pCjjWdJU{(1q` zj|lRm=cA0v%7*>jMlpS?1S-M>)iX6#hj(8RLSlhEK}qDoRIFAZ%FjOior3KqEA|04 z#H{h?{;<=`&1?~JXmZ15gfabH&Of|O9Nq<+P`NXtOS`A^k8=dGFtztb2(vYhFXaN@ zDfnpjNcBb+-}5#tCAk@PM12G9YsWq9JYxFA_by?^7K6r=NwzK<%<*=5C}hvw;Bz;> z45@!^Z%(UmgtibO(D>@|#$n7d(#hMA9s?u)_9Gc{T}|XPMn$@i2`*tgwV67|%90Pt zpzMs0*gue4`$d|4Nx^hsIT$RqOBFt) zGH!FScvt6HXaV$6KDylra)e8>HMXKyhh4nqwkS}D@BPm;#9Hm`#`^q8;+Wu-L-TXaxlY9VGP(( z`~7VKGqo~;-%qXAHx4xVk2q00QIM|6^4YAJ-aasbHQz_dA!`maSSvcjlR~ivR@&%6 z39HuYdn^Gbo^5h(#c0YYFE+`Sn`u>@4@PF9taBpNOR@wrUZA6R(2$?^)E1nCX7Isg z9*f0N0;P8szPgH?=_8!ABE2)BDQArc@1RTj_?pbIn89+ois`6fjA$7BK8$x;j7yoD z+yAV4@A0pK&Ps@xak5_>uk2{~7|Gc0t`Ct>7IlGz=&;_6Eb#mMud!6Z;3C-dT}c_& z)@WshJBg9)vUr(&!2`Hx2#=)0@@(ej@IrSI*Ta?}IdWpRJVPsywfYiS zl#M2Te{>uZqUJ`Ybtu?T{Go{SM#vNi|`iZOMqt;bOl$rL?K2BhY7imt|ubvc4K?VJ<2ez)ydoA-& zYPtHOp?bll{*K7N22cOyl-j^&3M#L-u{Yi`gwiyP>Lc+4N$aO}#RIjgOxF*3&ku4W z=VpcbpjD{cE%+S2u}^aBl!Oe?Zb9BlUT?C49ryh&V{$OVv3jY}uL4i{U@EbLn`6ei z3TU6&d(EJ>K;9{vy{L7;#N?b#lDj+%;G1ov*R=tjyn*SFNEh8)=$4uSaj|)_PO2o4 z?nvcER0W!{u*X!@g^eg`j*ES?W4{O`qPbZw=fD|jLbL*bQE<<&Zv}V_x-n0md(tz^ z7e@2zY9?=vZ>2;8og7BLn#Y0kMr zUqc~Iad>i-72-n1f1JsGmU*F6If??W%4A zKV_-O@hOI@$Xzfd{n)&8Zeqju04s{e%Vz4ofyshy!y}iKppmIRQbMDrj3QtkOVto2 z@~5?mu{xngZUUOc($#T+91r8TJ(RaZ$|Tys(AUU3+dPXfrkyqmFUAH%;S&Gl^Klug zBfdFv;uuE@F`xKc;-Cn-0JOweJ4n=`(7T!lVHdU&`{ZUg-oAG{0M`EFe|-{Gqe zt`D;A(eyCojP6Bj^mg6&aDh}k3sm$`RkfO6DuJQtXdsGIu`%gfFx{*s(zE~Q??mG7 zNU1)x7J|Z$E-N{b)Io@(pwCQj_%U6ZsVFM@RI~3Ms!{i-i>+Szt*>f8fG))$%D;H6 z4Q|#mrYG!{#bZ&ueB%*1?mY3#b>g`A3P?^1o`TDbLIusqe%jf?iF|>RD~vc6tN|6} z3GnZtuh0w~Ar)8wE`%8~$0wo?bEY@A%K=d(x8R z@VZT>BIf#TWJ%>fUqc~=BeJAlW(|KA)M_8NTY4SNr3=dk3;s^}v{U;j`JuB^`Jrcu zr(81#qbB0j;sP34Bxv3=&!6vhz~10Rg=z=1NR9ruuJ`*H;x`~^p~rWce|?94XlgUL zoV{uR@XNlo?p*yGNcyCS7y-QC=stfJoJ%nEL_t6H&p!x}KBv3hdg^@0OTF` z^@J7}4l|kn7+n}6-@T6@FMzHWIWdt7@z=dV2J%5J32m`FVKI*RFh_) z|NXw%LoJ$R47u?~4ymYq@#G=IeOSk{Ff1+Jhy*0UC}ZfQDbE(@Swm>!#6LH#qaS>) zdw2g5|7%iTFh;r1Tu`)r9r~5<7ictC(al{XV>*8jG?-UTa~m@wBv`Z!NUz&RFEj`e z7xs{lbeMP~^44u}ISUOg)_(IcwmgMT9&0m9v(;qk{xsC0z0=1^l#Z9seAZ5v=d-|< z1+AMyJ4M^FETUL4$Y^dO_;I53G8fNY(tN(1# zLx!y|S-&E>XqrpgJ={)F53W@-Wn7>XrCvLGfb+(~d$af6em(UM-ld_3up&+^DycB+ zDDED9KKytA;@3TCR;G#9dF;8kS?}PZ3)j;;Kk(yCb9!WRcv#OuDzmvevla5%7MS4b z+S9#@C^@nG>IixXVwmahKypA5Q>Lo;+EW~Aic{(nBxoSLDPXTWl@n(9fIp)u)G`8C z_hkeW7Xv%ggB{V=NKv&=RP^hO?rAPhz7}F>)S#FMj%c4FSa>b*kl@F_s5m&zqZ{9Z z9sv}9;x^h?VRnxaYmcf6Mp9xSoo$gYpfZRQ4ZXn&es^EgQX#HcPBDn)LMO&f5P61` z7~g>G2`v6jvEbApktX{Mw2#dfF^B5$lUHlj*a2;()HqN$z)M(256Yb9IJ^`S$Nncm z32hS7v^r}vs+}=suB{d3A;PWQ&mpPMFZA^!paglV?0Zjq@LG`_tPo4KV&Kv_K#f93 zX9J2WoNiiNzz{dE5`gtJ9?op49xgxEJIpm8#3+mPg?{ewDdktVEcL>if|e{}i)0Xx zfxkCoB9xu1%7dx2w5G&}KOlUO>+ZcRl~%`KQn04Q+z@;sPZ^C$X&ap)M%-YL!!16R-UNDqiG3@go&oPd!B*tJs3HPp}e;QdU89h}RCa>ed;P2WtQO<{0cAj%zg*&VeI1QfZM#`> z1}$Sf5Q?64&RL>H^^Dq;Ebo~b4)I?aCJeES7yE$!1z(0eWbP?76MXHbKL~Bze17Ym zC~R@Vl&P86KQ)@tjgDcC!{$aDb5Y{^T1A)E8_;mZSixUlLFi+UY4-kTBwUTx}iQnZV})yYSICZlaZeRDN~!i>6-uU}qK+FEjGuLD(oB?UA@+k}4*MZ+3hx^@TuM1Pq^KT?yXOS8jvURHzX*OBOT7U$D>n87Btu3Xn8mcYr^8d}9E0r*8iOXM@A%Fu@UjYEy}Dj$knWoBo1(8~hWrrxR)O zz%`#zOj2kejxQ$w&-(1MgpPAoljB4}kj`~u%|}ueA4xkIG_33ynXDoV|FhriQCC@b zPm#k$n*~%#&~Y8`jnNUQ2z)gVxhkt4uw-t6UQf>i;OKMUk~^+bT=P;&&_f{Jz;1OC zbP9=Isx>qVC{albl(iJV!ZFDVm=w<^;g#prr+pDOK9r?WzTS9XL!Dq}WKt23U?(8I zjxYGqnlFWEeK{8UkB|srcoU7{(@6=MDqFxrQ#SrO-Y@I zq=SieInk5nbBq11+EFo!MYkW&c8xLw8n`ZCE7wX9>KD3YHdpAjLvmB8K%}0Ln!qHn zIwr9+Td0?uG%X2M(uO$*S)nUMWEKBXnGO_#<%AuKRf0iqL&h9>_h3&+WrOXg8{AkP zEMYm4*vR-5&chJX)R17Hlb+BZfdD|7?l5yEe<5S9@l&v3r&(5Z8RIZ9Xa|ugz!B1Q z5Rej!j1g~>jM%|QVConduepS(r`q$M8v5u{sVbZ7h{Xal3UQSAYm3j5eT$c+xma1l znBb;#dXAo^5`4I}Q1;-KQwpeWG2RA>s(7WNs*n~|HxS9|kr{HAzJYq$MLCRxU4+01 z0Vw~Ek4tlK340!0t>FTovJE=7XuZfPRMHK6*zI*gVa zL0_B2wX%dr%3a+yKAh~dCR4$xKcaaQkGq@x30GV;yQ~~<^ zILmSg=Y|MIN-ap4`I&gf!E&&Q!ez^=4Vb_rtcNg_&4wtnG#Ig+j}kF5qp{dY*M`YC zq8LfNUdl0y844xqW)n05vc*CY&jt5094oQu40Q~lnT?T6cA!j6;ZT|237^0#hom@C zKFHCaCsn>sZh)zOKe$1yHH+I}XAm%-HEteLdh0g?39YALj1!Wo#)Ed3 z!gtVem9xnorNv&NUFGz078jo+bzmElXya45+rEE|2UESYN-U|nObQohTQ~=iEC{42AZ7N!I7I{O zjxF@61rmo>Hu0M@q{V(^${meU?C7kP0a`)_Way#+vNjfN+iEVw&CTwMy;NPk$MzXu zz-So{N0#5hq<+AeYFZ&-HPT4PcS)ysofrX%FX7A2N{B<-1MW5vLv&3U_{koOQXq`t z^MI8WBbOfKn+AxfXbwGPl2q-Z!5Cx(lv{m}8qnxLX7XvDqmFe_whdeHmZ;Vzl~WmE z^#9M^w*W_VooTiZ27JpK;f#~m6AIl35+tV)5^oI;(Lft%BP6Vc2^%M(rEZDdNZoQj z5SoA+hm38l2{=2c9eY?n`*&p>ZslO7rzHTIJsHi32+p?-j~%XM{#(NjFi4P|l;|(^B{3!TQ)9 z>Z0>myDYD*&(sNVg3M?g)X2X$r>m&LG#hDCtWl@9W302VM5-$0W ziXNI>|e~S*CzTawF% z`RlODUv%cV$BoH@qm%+f!f+#NSRMNyF-a4%n2h#qv3OU!6AlxhTZYh$>C#9u z3W;TJcci-@of-0t7;q=A4t^h$At8iSR>~u2bM2-EZR3Cx7Ac4e5^62l-0X!Fki|KI z87wNRs+MB3Oj2yTpi-eBRRW|9PCD9-Q`+DRUk}l$b78vdd=3Ys@;NB1r0wZ$B zXNh^%0s0V6v_-`k;%&yDnJwG1O_K>q7)DXh0g3Rmp$f4z(H=#H;Vn7G@rX>UJmqoA zyF}?IWXCw(iHajZ5KW4YEIi1h;($_(X{y)NEYu50CKrz*G1y&Ei4-XZZ>>&T#{pFljj9tf8l7@yDcl7>h_ zhl?f6bN~SXi?tx0SS-auyTjU6^uSy40Mr#peZzg_!H~1z=9&hlkLi96K4G#Zq-OgQJlA+Wv)|$SSfs! z4lw;fZ9;QxkI>%Hr)+L3up6DYc!c_QP1iP?AXEt?TG)u;J=#F*|*Xfr2EJ2l} z4XDt|IIWZ2Kp*h2C~fxWb^gTm zODIiPv&3nhKPWE;MLt8YC5rbzRwOlCtc!Ru8A(bcLCE!yc`87JNlJneXbbS`>(O)6 ztKEWlBTS?e+cPqqU+x~*YyJ3O#f(vusEzu0$~r@da2McCK-MM@Qy-b&(WHogDnoIB zjRoW=O7~^xU^*?OwyFUqLw)SCcP%u;oH3!=M1c_*JK3F! z%%-GiFbZXZK*a}Taf0uV9bUUkR0sOBPhF=>M!1vriS)J z{&@^fw%Q_MO8}Cv^~?3^v(ih747i?RsIujnKJ?Oy|H~1%HqG`B!3eb_3Hy*PJ-EJ4 zS5}Y}A@3~J&(wM$tnhIPdA0JKrKX`Ihr!qr&u_UWU{dVNK>Q_n4?@kM*DV&N;GOvZ zgu*>9r$sDh@&L{Khx`^$s6FDeL0JtQdfWPvC<8Oh3o9vg z?bF&DIe4_pkMdr3Pbe0Zb|u;+a+~_1J4jjy+2M48>}Rres*p}Fv2(?{2|a*3i#A#p z4k)NXfIRnT{}&x|h&DC8lMtmqypSi#9y>_P8$vAx@K=42P=ZXi+ADN&YW627O!m-e zl^}>UQAQIo$*@F54K)-YPJnv{d>E``%2S+=Zk9B3O0g#s0l72@T1tfcc3V2(^~q5j zz&&C)DzEX;pPL_OAV~0Q=Lf&^kfP+yr#NPTKtCiQk;PQRV+=SU2e@n#bSd4Z!Sal2 z{Ze8vauq<5U05rt2Up{M5V=DVVL={9jm!)~`C@tWlBYA_SdGDCjaiq{fj0u$GQ=f~*QysShEkC1<~yrV!vG*J=Tmy%_O_5_j_z|Dg< zyQDq^4CK-*-`e?03OT4qQPR2)sP9^b0XMuOr34CXl*tg*N>FPM=%VB@%u8KC!bU^Q zK*@*)xlL>^$*UIk^V)#kO5-L8X<~0wFeXovakZ zisGonw4fplnps4wEgdieNE`iJl`o64G}J9lTt9>nZHtTVh29;O&a0$*0!q)Za(Uz7 z+!f}~2C<6^s)xuHO&4&60R@R^^@WmP%WN{d?r@MHB|StL_Gb*%Z-wLOwp2&D3-MA( z*XtmrCf>E3=-d(79;aOUAbEs3WwecsppwxI?(u|JEe&D?YLDM8F$iVgs;yLC56X&h zLeUBKQZORHr0rdyWKs+H@O#V>(r=tru??QaZ5jkFkPwDfxPTkas}{t<$X?PEMRtG@ zA5S)9=N|F|h>l~J38Cz;V}LMHVq{LTdwMP>ORED723k0X<;n$csE5-aO%tiWimV!- z?xtf{HOd0;M6}0nMf57_Lh|Z=%USDDw zLauiISz~w>-N_peMDZ`_@Zvza>EU4p-yN-AiPi{N7z=jbwlFu zj1IyMWQDTIQ%q{Z3AQ~qHz&42VI+O5mfU{e-Lm^8^Bz;LktqF?J%5Zv8=69H^s_LpEW*c zj@)`WDyM^^X-N&#sq12cG-;nAw}ft{oS1YRhGbLPN@T=Hhi)BpgMLs3FlG~AEsU(z z&NwC7F}|uNl1fKYeM&C1NP|YGN@-5>rrE=!d(Q{}PZ4k&v2q?^G;Y(rEr}}c4c7Et zi*$WE-x`Au{4_g|bc?pK^q@`063Ri04>p+VSezWdnj8p;xG)%uoI)V%_33NN!;>6z zO_H}kaRlxuxS4KDwUF<)LOMGd8#b0H*pl9VO^?bq^lXG)$nsPnSD9X&ROvx>L^!(i z9{K5ZW-uWWHiCUWxMtmDqv(*(hQhO?_{z_$WMz>@adY(JDushWDL^4h>I5wAha+ef z>D|UzAB{yWHmXQhhXPVacV-y&vIv2p@U+71-gO<*?jsu#ec2w3cVQqN4ldnAkUfmy zjJE^2v4am|7gZN(PsEc+y&{HaTxBiLu8?=0r8JBNIobMa7Q65W3wZ6YMgigh5< zd_ZnsG&z%h#P(o@^8*@-0#7I)+yHZ8_XCk&-JAMS0hsWXTO3)EljCa#!V` zg3MIX2_i{MW~24MLjXKS2ap_g?h)h##E`Kn7c>TjVWzGX+h=#2;WD|Kk^byZibIrO zn?r*SIQ5Ba7P=)$^Kc0hPg>1f+%Efz;=SArQ4W+i&RIeFN3R^92kBj2<~keD#A4;? zKI{{`Df-!W%ytpfm`tCPiMvDhp-lCF_THSh54SbOZKYruF%m^W-(*4_8ISGtJ5W*? z34#M0i|A>N4yswiC;=9n-NVT36KIqX%q~EyMb=$*)s4c0DdAVH^J6^&l2DseiG~y8 z^TIHhs1zcUO-jOx-TzPJI-jvZQq+DBQeZaf`-F$3gcQmQpBaC)PTF3hI_xR)_$WYFD zRj{!Tkm877XLB)p$VmVd9YDLB2gK$@o8XxZ<_RI+!M;|)rg=+2K~cPcvGYm<`+@Wk zDdeqdV3&uh2>=Wuc8Qf9dAdglYEN2Eh&PB_uq5q(w)0`$LZmE8fiq<17>K)J^Epcs z5J_-m^H5ecI@Lc*RcLD!qGUlp0MPzij539`7?@~X^wZA&TnCHGl;+4ar@S6dtL4r! zJ@Zf^SFb^DLkxQ|Ef(H(2JGbPziy+z?vj|B)#tSYeS3Aimx7Yw&Q{jvx*V?Cc@n|Yy#LWfe znK=&V#y-Gdm=waa;-qXCASTrU(N)Y)PfCj$Athh6W~t0mup%Lg3#n>|mouZR)Ya5R z7A+YXpsjcvy?|Ruif#hs^myJ-s0dkDz_1k(-}P)WwyjDsebi{6FcjYLW=l+Yi0XGv z5i!M*aKchKBgyZonX0`4pp7;nv@ehXTxKaDlpM-z8AgMeP*%Ef%8^D?RV-|EP{JRV zh-P4q8w(6v8=^Dd<7+zXo zhf%8ONbyWyJceS?jY7ALBh`%{q-!Fgr4dmZQ`V4V2^>i@lGMgxef(JbG~-c{6FQ;^ zK(<7?BW^xFb-3|fBdX5JF*2T(=*0+C1SB5<96oM<{oh$qWdT3=>>Mc2sPb80BXmlHBOWK&)Ntn<0X7t86LR zkVCZQqsYu&h>&z~i9X3lgO725TUxicKaji$H+jV!(rge?RMG;tLA*e3sgZg}2Oz^v zO)JubALlwj2y^ZU!;EkwHffHOa7SDFGNUC$>*bgPGm{(`<5Z3v3OytuX9bx084!SS z1s_;04YJlfr5j?nFG$J(dGhfqEKIMD_r~ZNV!>z<_=1HnIhERZ^2A!1UKQhXmHSju z6L7QjOQlTsIS|*cqy@4#^Q=&!7i=?`CRYT?Uj|{#wZPd)yHG50!=5NEGm2De(|sYh zvnUx-&oLH=*(G4b1Leu}|CEr#uX}`)&xzWhP)$mBrKjW~5zI*I2j@Pd>Lk>yP#NVr zh)^TJBfF07NTQQCN6+_#`&+){YHeRst|cHKn0FVw}JvbYAJqv$QSFW!FS z%dOO>j~KE|zzPSL8S$%SfQ8YqG@rsCY5ozBil5Qx10khpFqMG&tWzrSmL{n4%kG99 zcD*2c`#Rh$hNv08i)_Sn?4d5sf834eCboL%N#UR!7x=_cC6$%s_9mIuQl^}Xk<~Gt zD3QP$kH`pXN?CLVHk#B@fsm`!d5P7GtCgU90amQK343Ee;l2~pr~iq)w1 zTBYApF(k&DZZaI5?Chn2{mpo6iGwE+*0OPE{#31EzYALGqWq?zb{2BP?7%@vqP~3U zmnQ`z&qKGMHsdI83t=t>;;sq_x3VGA9bV=@b0Nh@vs=td6uPUA1w!eWrlIET5;~qR z0hmWnl50O#NNMQ;S~quCUf!gM8>;H+=Oo~utJ(wInOAZJ8GZCHAX}ulU)*D zQGi#&RDiAq&*>SY@J_eanh+L3yM{_X09g+cU17+orFNb9lrzUrxwWm|WWqc=2*QO$ zDJ>9}1#`&@ozU*M%4vzaXGI%Vjs}!Y{7o4gK3^GZC2_r@qfTeP!W13*VP0G0F@W+NE z*%I3xvLvQKYs3@spblw78NizeCyBZy1}mi;s$d+|pszAOEYDcQ7{KNT*^#+%7pMx( zz)n&;B9JSTbQA=nFp1hCF|i>j+p32lR0?;^3ZpWYl`c{(`1Kvhx`rJo8%Ch=W6RXj zR+p|eDUHYt1%Ql)U-B}GOkAieGwexG$$4zb?g|HkGy!;6%jPU78f4kZGH;X2lOXv^ z+FYn(6gZeGw$d_7(&?iVRvqdQg>X)B%n*c|6HT*I)Zz+k6?4aS7m#F$9lD~C?GYD* z!K=;>Zop(ZM1U+3oB7V*sGBC0Z#vc03UQ9{MAP1;WdqO^WYpaNL7JAjmUx3TVSkqD zjN$9(Kg_icp;(}!gCj{+UUMbTQ39GuEhN#ts&DeZu#`gs#wxS@>6%iOHXX~sC3x`$ zbw8T)n6QbJ+2jMsx!mX#vk4OX&=8KEYL(i61=fIXK?pGOKl3w+NWb34x)XUAcK$3y0=y>2sN_uf2NG2RLzZOz%DqY^g zfk?%c928z%H5d*impzpePyv+opPX@*s5}2IV87gQr8%X`EGz3lk@Oqu5i3t%5R>0e`KNvbDlE0 zRO*MA&Mu9aVaT1K$&YSl%WOum0q`LlZC9{-*+edvTc6BtCkP40Ewrm_L;1^=yW%HZ z+aNa@^N3HzIlX}lElWnb(_N{MyeEc`dRdvd43mINks>3-z*2!jcZ>1yl4Y0I%|F~h zxWf#SpLk70a!&-(q5;qKiOc9Zy1NQwU7^uK3Kglxp$McxFqOoktyxh@Y%ty0k#BjR zm>i|T*VU0NP>~I<`Qe(>MHdE@lnRcHhK>X*VnSz1jG7rdre`y%TvQH-Zdb~Ldnp2- zLB_9kJ;gr>2&e=~Z;F)I*Lg>R6d76m33(bBH%~A=HRrV&SM9#d;bbJES#DkqH`lA4 ze8F>p1INbXh9ILWUI*zL87L5_qeAGiHd#yJY9-b>Tim~f(fKXqcw2;cp!P_DV0&6J zf2DOP6^lRwT5p*yj31}yD&m*L<#uC4%&_S99TENRC69Ro$dvCcLPEB30M{nWhk222#L|#hP$9o81uka{ zsFVg3gqRAL5nUcySsq%Iuvr&^AY7}by4MkN;Jd37yFo~5wB2boo;+9Xu)-|?RkDYc z>LFbR;q8Is1lLe%@Qvm2O*Sx2$?QZYkakUqN>MLA3%T&I_HA+LrI3}N{YmxD%GE!O zujSFM_b_V$1;^~@qZ<~*H=t(Vo4poKPulsX+i$JK1KUqb1`B7oBVAxPJ{l6pI@rG(o{5 zEN+e zt_!TK3)*#o&2V$lm)8Y1HQSqOg7tO-RKK~lDQGt}2cST0y}h}ywz;-`16H`MVbhkz z+6^_$R!u|Q`d}m8P_;m`js@*afyUy-#*YphRQ%|zWD96qK5j0X1lId zj7+@N+~BvMHGWst4xJJ8ZwxlBs}UaqYisLj1-;-}t=npw>qQety8!ikT}xe{(c09~ zxT&EjSZ)&uMJ0mZjkQf*vc(9Pu(!7aR7HZiqK=J$`gK8QOB=H#rU`~?Z)s?OBSMV3 zZoNSiAXLy^AG|HNuDSM(pda28%`~-a3^Ki&nnk5npsvoY53Upa4K!}Cn}UsZ)UHE1 zGzK>XY8!z{>lzvxp_YbvVxy(y1TI$&k2;B3rX8amI4F1r@JCC19Z;e%czcT&D{zTz zatYKQ*w7e6LTfx>ZLSp^gV|GzVH0Ecv55G>WsEI?#Tx954eM)fgK1&LS=Ug1M{rA% zrBg-F*=5T z?TAj+GEKzjum+|hao@6Xx?2RU#84dAloh0+A6{W&(^C;K@M4$2$S(X|CHWwvt$U*% z2|itMNOnNME0kH7@y)yor!ZWKAi@@igppn{fTkgZ3+ewPpmI&2Ue?(m9aDQ(oFYLX zuw@6{k&v{&rqz~=cR~C-CQc^t17!5*_Gp*Z_Z&78O$Kv;q(*Fz8(3fx!VPyO4`>$r z%*IQL#cA(N>zd<7@FmW3o*M|=pBlQ?DS#v*I9IcTmT!S0uU-hN+<~O#LE?LTP#5TR zZzYy+2EKBdJtRDiPK5Z&p?QC8-d}+_$ouEl;kflfwgFdPKG*QXwYL- zx?8?1Br1xwKoF4zv#0x7lE#gg7Rq02&D63Qnn{VVCai+52SwRiW`9HVr$os#C7>*` zS;X#%qf$rq1(`jkBdv0~;#IaFn=*5)1ae||nd40x|GXrI6LHmTiD;w)JSZWRoQMtN z<*PX>k(9DZ*Ol2TAv@h_(E?Txm*IP>soiG2uT{b}jOqR}b>Fx#$rQ=Xdu?l{%mRolS5AcJ&J8z;$L zOebZf1$|VCYjA={k!^*FtAz|2SeG<@x|541^x(~uNAV{MAqf6nDfeMxyW2vk~%1u9gq(Zd*!xNs^`xZEa>g+E$@t_%j1d8 z1rqMDV72H_0HAvibfc#>fg~cdccT59t{%sn_h9Es#AA>(3hoLC^#F23j7>i%dvraN zQPy3$vBfWUIeFPi2JtpQ6>og+omcKw=Uvb4(Sdt;qzl?1!=$mi zu?AYrDkxf65?1KVwa?Q#B8U%`rEPsZU~WWrp{;Hql>Ng#sM5@T^0sg(w~G+19t9cU#|lLFV~gojqOU+fvyZ%a&B=zvYjwvU2gFMHLlG7A{`otEgOBQL)Hp zFZpA2;A%fBk?>dlYPkra9)>hTWy(7LEcDaKL!oXeA>|-OLci( zOogNItVd#thiBFty3W^bs{Ic^yL3tA!dn+D7XOu5?&~FO;r8+!ZQUgnoLHEHwiNyd zB|3#74S331Z-o!r%j|Dh*TZM~){eFn?w>vK@0j=lO77s_J^Z^PyhD| z(N&a6_-A7c&Xf zNEn;DKC&a4D#fC^pz)qnI9d==N_VWPSYhv2St==6wqSXgc<{w9QkD2l54_W}a=G|N zKF2-?GPeR)>nl6H`i0WUl`DJ7%Iw&xg-e#K5W>DV6=R|tynCzYEtFgp`}mK$u#es8 z7|^Gqji>`XN0XEwEBtNk`j=h<|CWC~ZvX#dv;muZ{_}s?5^>yX`#+xl%l`lV|NrJE z6Rf*!N-!J&)_@;@^*JbR= z%yLt>Tq(a^%J0kH-{+2f-!s0c{NF6DZFz^^b4Q-ug}hK3jZp)cJ0hx{{wt?J(qztr)zzXb6Uvt%6Xm2 z-xX-@TalY?|Iug!g~uj?7w zbDgheYR`3Ex>i0|PvJ8R?cDeA^WVW|7}B{1 z@$;kb8HRFhxA-XgSNU#j|I1&i=|5Ss=k&!*&9%cr4^Cg>s~LX!`}k`(JZ+8dY(^CL z{eus}SZW@)?nY5j&0h?qrZ_L*P#)BOT59^=Y=Reeui7Nu^QFJ^48UP;dFC@NkLL>Vfm>A&vtK$M%Fok>ML14XJ{Nt}G{xZJ#QXZwHC|MYLJ^uMy_M8UU)Qq!Ibo^sAl75@rK1Yaro`<7Gp&#c)K ze5K&(ANK^$7VOz|cKY3q>b-uK%OD{twpoUkEriy;ig5kl=yy ziMMMWxO1*xt**H<>mCTty}3^OW!F8Bnp;};z|Of9(6>Wg{u1mlv{|sno-rqN%ad@7 zG9R6vA^7rvLii$mi8+RN_iQT-bjBffeHIwIO7@SV{}g0D`a^z-E{Y1OhkRpya6w%0 zj&H^k-|jWG@5CQcHZ$a8d_FM=PVx9uQGWN#$wTVapR;!Du4y>INfrt zGZ#-fqt5={?a$nFV!AK0dc4~EZsy0WgVmndsjl{kW~#?q$DAEd{=N^VkKT0XQ1RW9 z)pvUtVft&uw^m<2VV1ue$ebDL93R{DoGAZvU*QK2-S(i;OmIc1dJfAZMzkzcNMG9Mc4k2z;fOrM-HbH%>u&+I$%jlBc6AHH$2 z`n|i(3{)EB2fN>No*Fq{y({z4-|Ejr`B^u=*8bp%&sJAIGJN?LulK*UXtMad%clq0 z&*<+J?SH%X|Fp&jcV#Bde55_UlzD6F*2gzI^w}G$zcFk7nHo_(`C9R7|MSg(wqd>e zp@uV~@4Xs(Y$7xEzuwdOFUp@Detg6Iw^YtUo~=Y;>?I%Z}D5R9=hwu{SVKZeQ9~ok?4`s!=uahJwE63z%wsuuN`>4b@b@q zt4{U1gI9j|y2e9$ibenL+W(91#U6QMdGU*7N17l0Vb%V}=bavSRxf|#+`;pm$69+A zWG;-3zOK_nlpi{|@9?+3^2pPDU&HeAs*Y53o*wwsKJB$LFE@-Hb)Fwx@NWG5gRhUe zUwl@S-+k(lXZPN|56fTJE6Q)E+HiW{mwUDHzd1K}e*D#uR}UV)Fmd7a3+@+-M0wwv zvz|SC*S>q8{F%K~qI{(&|H6P){;ii^y*zs5HN`MZNs5&;95^=Vif08S!D{g1a?TL-`k~-aNc@$aiVhi??)6t!${8 zw@8#ftd-Bab?m?OzUF-B9K7N<|KoLU`NN`o<~iTxSx0W^oVKW;>W2%x<$rzd$&7Q{ zaSo2a#|s~s<@Z*-d4una?^M;1hx3#_b@Yqk*N3pyp}eR4hoF3?@6;2+RQ?q7{})>M z))&r2oy_I;d#jOkE_{$xe%$Hwoq6KSLs-5&tNh8M@yzSafq35bq5N}~E>roWxBO_w zxeJ-soMRihiFMyI%RdPHpXYn-@;3%@m*4#7NAdUD7pVM;Im_?6oEhkxvaq3QQC9ii zoI9WS2l(sC;AqbF4_D9g?H#Rtgvu}Ulpi^H^wrG&E*gCFJ>Soe0A~4Ds@|-#zu=qY z6z3_wdF{E8;hnx@%kjk|{LvAM@D9ox12N@m0?e_E7ZbDQs8XXroY>%UmQR|Y42<9~ksqf`39 zD$5V7srMbK?)ghB|0h}Hzf$OAMq9qxl76?>+3#ePU-j(3*81IV6c2nSPx)Uz?_7EB zNATy9lS1a4Fw375zpA=%zrA{S=E3-szr*rx4ZNkDADcgzF8-Z-?=kxLs!@LKH+LTR z_KMH$ulU5ir)S2e{$vA`KWUs_Bfo?4yPRF`PeAuC7~}u%YsdHZulP>~W)_{=J@dlU zC$Rh}>+_x|>;moK{O$fbdcdU*#1Gx*qJgZS}7 zqx^|I&Z(O-qI~^P78Kn(N3W0OdMOIJMQi%vaVJoeo=&m9>$As8KJ$35H?t7i01JjpRwFRd281nnzY-i%h z%m))N{$Gw5>+i&#k?QAe*d4lQIJEzse>b`3dxaH!J*&rxwbG-l$A5Jt^ZvxF%t&U` zyZ(m?p2~ddL#ObjqMo9{6=Or6K2^~7W6^&@Q2oJ2VmdB-dIFA)%O?E?R<6w4Fx@xp z)5SYxPkGDNv#6r*QibThu7HgkAH4f`de^5`z3&{=mk+JK9g{O|*gdgqvU>HDz0(ie zb@RQKY|($ce0rU)@uwd=v+LA6p$loM z%CXHYqrI)^^z4k2fraqCUS8~9<2U+z)3%Qn@0@bN*HckZcq(p|A8iPK?}i^;dHd75 z#3ms6Z^$oqt~xm;%8$2Syl?rG-P4P=-hA&c82B^=a&*I2k52UN>iv{x9N5C;zXdS< zlVgjZJ>O8l6yJEk?&&-4gYvtz@i$Dq{PQP1diyiGKD;nFh+2zVe(pC_7f2-fEU_9scUkW1`(pkC^J8<)U(tUycD~aJ|7r`M zGw{pvGh(1U>w51xE`(m62A_iX=>wl|TC-x}xg z|Chb5fs3k2|Gxtym?W^~s;LZWt<{$D&Yg~Vu&!V89Rm zHdSQ$*;wwa@**pUD?!u*uXW1!D2O+;1G+zj!qG=TAoX%^fdN1A!&iRW4mSUSTX*8q znrpUv#9#2+ZGcwsfiTN(*yYQqWmIpvJg~r^z{AIEeI0lmtHH~mO~T+jrUbS>>_t(- z9{~VP<7=tF+L?o>?X{OWiVXPu8(;CzB0aw*Sm3zNSWapLVB%&UFl%^*0-3PeG`CRs ziwm0Diwp)}_bcBp;a+gMYHPN%3;GZ&q$2nwQNwQn%%GaI@RVlIQUGT5SW&yqhz|ro z_jtj?%j@H+_>UxT5SAajMOS{P#3X)J(I4L0atWkGuBlyXz-OHe8#>7Yd+f&S11#$m zQT-Gzei4t?U*_U zEn%;~TWi6(Fke#Zb_3oOOl^i{pJ88bhpk`EO0fOwb>$Zxv)FbmiTt94SyKi~VeN5C zHW>{dH7;eE5BkvSo;?KJ83vW#?>{~R!4Mw`@s91uwnT`ptxGuq`tNEUZTZe%fclx% zf~UQJp#y*4v~7&lTGB}5kMJQ>cwxojWZSHqu{~=K4>~2L?7B2y&>*7$qmC|UgynnJ zSM6&0fQ3_NSpPDgf_GGuCEGqi1e@k)qkxI;|EY1 zT$xm|Eg&c5Vd>b;V=FK2xbg;AXVT-%Yaetx4CSA_?rn*NbT|?IZ2$mdK%2h;qs><% z6ntyS!^{bYFWqs)3Bn9`+l-$)4F@eItJg(uHK-EMFdX)x1We%wf24IL!e3uAY7N3) zh4_}pK+OQM-hLs%bm-79+}4T_rD6^q!6$AOF+L9BV=#Wj&^4zZe!`9`Vp&RnhM)Y^ zwD7;YQUvkVK=3Wci1`5P&kkVPY`!{-y4)e-pHC@+_~&;V5et%gX!uMv@=~bhTZm_R z{GPdFXL0$#Tin33o!}oN`1{8qeB!Pnd7G95Y4`&1nc45OjfVZ_t6+z{hWCoAc%(l* zKy5N#ok+Fh4cJ( z;0@m~GkkarpgfS^n-Ts1h&Z-0Q-}Xk4lsZHZ=YR96R%!{OcA6XjD${7fyhK5ikm^E zNyel0AMnN;+c{H*HywcE)T^gyL`8t@911x(rdl`SR<6+Ib139iXi?PTD<5( z$@+uv$rV`!{DGC%fO+wo@8y6eKj#K+lx#&n@?rcTIw~?C6cRWmWoez zO#iZNVg)$B30_v@PC-|mt_1$^?U>^bf8wSx9j|i=T_qwE{Q^z zXB3#A&k-r(Q+^cOOrKg=Hu=as!{}he0XRLR9`x(G$)4kpe3cd4?||@@7fAb27{Ocy zs9IBPAi*z9c@y@<6HM9Uql14!2P*jFEsud;)ear7FP~?;Ph9{>b|CuTGzh5!cJpaU z!Ec24BcN<@-RMWmD*nKht03mco4+kWULRN7R0F(7Yb3xInKh3W67KmH{2!lC~$xdl9EHYxa(YiBY2Tdtl-2A=cR zCXeJf4yhazpVuEBSz)3;3s^t713VO|;x36Lw8R5BX z);qcttOkDN_fN5%Yp>|&pVAHv(`L}juL#okUpLZn_`b>qO7gwjw8F`ddYXq**gR}S z8B_$Mm+4f z<`fa*YilDYN~{0rwYA$4UK^VCg(Q^-{o1oR0Z6SRhNi>UhDl*R4#e~KS`(Z-YV}V( z{9}I2@3ZaZe3li`Xe2mhIr`vr{LPBCw67i51IHi61@|ZONSXhL!|bTnb3b?kv^F}X zRa~{<-VY?UNX6Hh143s|WuZPigDvyP>5Be8D@frHdGn<_222*(SUU>fLHV%+5ATW& z?{U>(S|M*`DlmoX@hjJ+G96i8%zzj-A6Qk$!`?FnhpAA^pdevxj8f)F-G%nP~;3I|>-p{tuZ+uYTjrbNjrFC9RV;o`=kd9Yh5XzF-|- z3i`AMQa~;h&)@-9rr;yqIcEL$2YypH8l-gaVSiq1B;@V1~=9K^! zq5 z?+SHv zKg!Rv$ zSQ81azo-SK0M<+N|P}-wCJlFNsMlqPR`W8F_#O>Vfcet^Fsgc@5j8btGU(gYgSZg_6TbFV#9VBfD&Vu;;A7tDB`|ON`HevRz72HH2tUr(|E}_rcGoS6AQNhW_(8$p<_A#V;I&;Vejh{d z+hb0}DD&Us!G~F<{roUoe4`F;$9QQ+AjG4ApQ}A@2Kdn#6Kb) z_?&eHN#Kkbs7p`ys{!Mg9j0bxC<+{mp`wo_4|hF?@TS^93Vwj8I{PB5%5l``IbG!i zjHh={;ZzI?9CR?$(FccD$oNnNA2V}v61+90h0&JI@G=;bXRwSPK!3h-Ln{b$JvjVt z4j0^>w0BtD0 zmEgxBd;pyIhnor5}6Z*C1MY#%nfrJw7_ ziXDB9^;F{D$sa<&(F^%T%ovoRZ8<2Hn?h4FFn%nY_;2phe^<|_;ihoci51)XoKW!x zm>SRoiks?Xu~)r->mZ^}2I)VRACGKhEc@$8^zrasZna>hPh1?rlJLdJQ8JiG(gJVGc;)yMNl<=h! zZJT1weDx0`FSnbUZgUG&RaHPh1eoCX6F_acH@KPp_X^9YknNd0HUSfT{b);^f^S6a zq!*3Err$2vCB6jC;3XdI2mpZ)--9}`g8|I%*M}Vq*^n7@1gxbm_ii7igpV=X%t6%o z7||^X9Gn1D3BZjugMh$-jwM0V(M=G)BaCu|ZpsWj0_x0lVR}4@JWsJzq7jD&yoC0_ zNJtD06ohP95=vc$c(C1EmJ@nZ2)WV@!Ya(A!^(PP_TrI|b@Knu~F z737J6h!r?eq6^F@a8PHWc9~4QQT?O0o1!=AmjArP`G=9d*gd?|RL|qGi7{uW6d!0V zM1g}#?Vy|r92f=b9~lkjL<*iqrk3#_#yExpkbh9+#Er)aI2Ycx9t93sLf}*oBt%2I z8CXk|m9=a5radU!1?vlYza9BOygHPa&OtdJMu7vEM{AS4pq~*gd6EX#*mJR|a!4dI+qy1Z}v< z_^gAr`pHy5;@!>~PO|3Np#Du47;PJZSqXqrfq~uO?~}Y9zEu!J9_&Q}PZKFzRscBw zN=e42>9p?8#Dk}Sn3V_I(Ef^5)A8iND*K=e)y<)Gf9BZ+JKKc1o!!%fWNwF}4>Uv# zqyu+zXsiFsy-qJ9^TL&K59jzAN}Ava5^uya!;{`W2OSb(acp8_Ucjh*T*1!93--!$5GQ`_hGzl zr$~R^okYY=MX;cqetI*Yh&8}0|yRRJSQ`koXPn*xnNAbszBx@?}+)uTeqla7Kkq z#DxtIzyB{EmL`^dV)NE#iqW-)4ynbNy=@gO_MN^lft0!sF+RDOyB@?UN?(?zteJtc+C4=d6F1$BIt8;aY_R8E@?OBS70 z*!C*45e$>yXLdSSAG-ZJGa7P=!9k?(USMZINkaql0_9!Q=C1IX^_a-)?kl)$KduDR zt&%KfQNibS5FbEgID`BL9&W@PA7n6IRKCOKRhpm~ z|CiA7Rj-dKez&v(c;JxRAnj#4K#3h1;s*H^2XJ`+?EwxCP-4K^)-$vv$Q+Q;T0NKp zc^vHhuzVbZ$rA+9ADMQLSB=a64sep6_+j@0px?uzii_z|DEwl{-q6HK_9ko!$iZgk z0T0G|0MFqH=*Dh%mvveIb1Zi-Dh-<5swyiFM?$UrZb4ctw;yWc7^C=6r)MJrMvb_< z3-R9MsbNtP^1mdazszSoQ7K<^h)$#U(6e<_MemMDeHxa}a8un5E5Q7V40g)^DDqvG z@^SeUu>C*`qzq#p#M>i>j(YXI(hC=$AM9>;Hp3~7%O$$9Y}N`67N5tFF{nf2CB%OlY(I2~oQ!ef(|XXr4*Y0T@vEhF#@o^1 z>FB6uI}RZQEG7=1uM}#P!apqEWe^{dFQ8|QxqgBc8yT+p!i5XdtQWjc6B#lAWIpPE zlJv^_qiMNGFFwG)$*%bqqc#+?^+Q5SY*-l6XS;Nc*?Qkwhs6gMM(8KTyDh<5sz^kJksow?Zmuk?#!v9bM ziT>NpvXZ#E87=7AdEns0tT03K;W$}E2acV3m}a=V^BnJRIM4@r8h}J$kPzT}9^N+% zr8tE!!;_g zu(ttKy@F!_4osuLfJJosMcIH@X$~0Un@U%Tc~v!6VFy6H0D#qiOu%TJA%i#9xcs~< zw#jRrKk6r^b{!W$lO5RYb{75z3jYG$PD4&b$euU5)rfBp^Q^Ph^!=IHX=VCWc(CIR z)t8sI0yFy!cY7t9U-^fm67!2=-#b`ZTo3Aj1F^ohMtg!}Vilu%90uZfzw*C5pA@Hw)1mPNWa$7*R)T?6eNdA{weTw+b_a9p!H4&jc(g)Gp$q>RcIAOf zSgmhA@CttAAAtCwdC&iybE0m>>_3a_>dNnMa|`|D&j9OCW-4}nMc*Ngn>H1CAypi^T4}%WLE~1x z@K;OTjA zLTE*ESb%MShZIB1Dck1HKi?4f`5q6yr?{?^FXs4$FC|ua5C$GD4xr~z2PT#WlUy48 z%75pO+x+=%P*v&dS0y+npK|qc*`P}S>+D6{$tnku;N{3N9PH|X|93mslG=lID1@V2 z$Hor3-3QCBa(S`*F?(E7(;i7cZij#Q5I=YpI6LWC_f{7;!ipFARRghss}j7pKTY0` zBO_>3-My!{9nF-D_(o6?c{!~3{WlNo*(=qz7TKSH+Utc*5W!bLJx0&glz=_Iwobk4 zED-(5f1jxu?8*IZ$&;1+oZ=?H@wnGQv&&%lTUo>dj^-9NZMZvM^exR-FYWeNL{5f1GF0 z23{Yo09&Z8YS`bc7YZ3a{QIzRFN8Nd@@{*bz!!^yn;IIn?Qa>WJVQ1Slxz1|+rUJh zA09pHv+Ue=PgYjhBq0wvfG%M_E5i04!v33sx#(5(j|W2GpiS85^Ls?31H3-)x9@?py~XQG!3ZDV>uR`N zpb%BM2%y=J75kDzd6~vBqH+9$?q#0&?DmVPXDcgg;^TSKtExCS{97IJ&m8N}wZCdw z^~g3O9(1(yoqwhNvx9qvy$%*RnxOIF8^nKOs<`FSUOVgEo85M34^$L!H!It3o~Aeehzsa;CpCK+J%0>(T+%sx z*%Wco*~)D`aq4s{v=6*aXgr7@)yJRa4qey-9$UdVXc*~dYERXDRFZWFeB2^w4&g%Ux2R~ZDOQOw& z%Fnj}5S%Y6-oRFl^Pcen^r)%%x3ezZ1p23+v+wly<|5koK?!F^HlcpneyviQhu5f^-k0moxr&>cZPe*6O~mc z`rx++4UheKa5{<}jl*@IO8W=5odwtQRo)5Z@0F`SuW~QPV=iL@EVUfT ze@hYYw!@#jUKA+hz`);rD$ON&(aR^+c)ebM22$f8!e74Tzj72>*|^B6)b5 zXRi6;VpPDiosE?-=eG*bafY*R=y_la>vTQ`D+;|3&b^=dr~xo7ZWchj=h2MjP%}6L zrp0#?}h|$S82g9Ci zJzI3T-Zq;)>*ah}A1w*Qfu1^L)e7A}@O&v?PFqnEwSVOFadS2rm4nJ;3~PHo)1oam?DyPnfT8 zxnQbuIuzI0uc}yOD-P?dEE430QU&UI-)!`NEZX6X_DPCP9|Jwr>=pOT`l#sbc+UH( zQyTP%xOXzm0Qs+w&~3nq)HhEA9)Vf~X>wuO#SW2?`4=b8eIjwHdCGKAe73q0Duz2B z>M=)j2)4f}Um(VqD=Vrd`+U4U&I7#FUJmi^l4(8U0}bF4 z!F@=C{C{%kg{atX-rOK<1MkAw!pG9dmer!yUPa3P!0aKm8$eeOW$JR`_KPb2MW(Mq zj{Lo-i~(Rx8!`-S`x)dplLe%&8VUK3=Wiv{T$G0-K|_`gRTAodP2@YPUcG+Ve9*HW zeB)-NJ>dLBTG-7K519QxoxmNzL4Cm{;Qj==1X^qts@(ljr{5L&l=)les-NYYYih)c zNpJ!KZ7DAQ8nTf{Klv8 z_kTJMQZ@#ahcpz`U2wY55R2MR`jvIa!k{Nx%nQWb;&g6juE5&hKqYa+(V(HKV(y{) z;zh0ZR>28{7yn!hIOx-??z{E3LkGSe`DbA7IL_MhSul^`IEk0H!eqO%k>>{($UB2} zx915AYJa1^h&ISSQ%{?$LFb<_Pp#T1R>HpRhIWBNo*!wzht(pSP`9CeE2{w{12(1s zogWgnod!jJn*Ys)w@1AV>97DPpOqXPUS6GomNuejw0v+->~3teQ2QbI=x^PahkQN5 zG{x*|%@*Bo@>?zDqSfiyf5RRv1!A$p zdsuMZ0dwa`6oYG|Br>4x87QGu=VqPJZc;Ey8P8_}fjNP71{C4_}MZ}b= zK@c}5APo@h$`E0VSQvHhd8-c!#eKdCe8Qp*~gYunvaOn zKyEGrjh!2K^MoRjIcquh*0my3d&Iv&q^KkKuEY4`ZQ+q?=ZB1V ztLPuY-)g8U`3QA3fo3H6uOQKXG)@@B;x-}(FPtAr6}AB{fA!ou3&&j)Yr)pbQa=>j_n zwAvXWf0pC2fx8VLUysQqtkaAGdJo&{!e6#kU;S$AkcGAB%a}jd@8WX33>ZAHyZ?1T5fOpvYCG4K}KMN~_{ZEc`Y~5KyeDO2* z5~|*UMb`W$-)dNYPxX)YtsmG{V>ab&=u=tq(z**Zf2-!WYEJKiGVcHeYO=a9*9qG5 z7tqX;)vYYT3)Mo6dF|YAY6!c>Zs$L?`}?o-^64IKq)2AXP$Yw0&7})jrurPhf3+Xs zt){tAQC~BA0CO31I#{j_4q6~z-q_^mf1#~(p*0WT8!^7^t4Py|s3^t0ps%7*p#BXG z`hmQUvq^FxV3SLoHEqu?n4D*=#`t{*Kh`ui;3A&zl%)uK^hjxp0ljl?_=V0?LYO}uSOEPf$*=v^7k&}*I26?2!3E& zc%&=qbyUFU6t8u<*ZGDQ9DuGIM=T&6f2K*E&J;rYC(a8HpN;VAde%Yt4-~>9lWTFK z&7;@tDe>Mtrjf>f9Fp))7j;a6rF%tGehJ3^d13Zy?p*cyx9Sr23!??7{}S7t`q!uF zArUhlXOa>at_Zro0$IUgvzclR`=2U4D%6bd6^b=9F9u-v+pqkTjtJ&JQZ}99(m!97|2%`DjR&En^NKS6*=KBEKgzAJ zLjIdgj1f;u;P^LJ9}f9+!|R@pt^>BFl`Y9pR&eR{uRY}2CIYmMz{$8GBc5Z%QBeVt z9vyYz)BLgR{S$L-F#=GYVbdS3uJKG}RBXUU2SY4_-aK${RdscB5m(~B%JRJq<((Lm z_SOqZ_eu)NG%#>9`dj2^P4fQt02l|qpLidD8Sr}s{8pYAx>x=-t$Klg+hPq7Xbb4DOBbZw2TeYUqJ~^Zo2E` z9@gIDCaeoC4ESB(Ylc5E{eMSyhr)Ar*UF)68&LjEc&Pkc8#E4o-y>ho4I$Tx_-6!= zYqtc@Uo4`w%h$@^`raH!u9d&>{i*!B@;0q!PXN^4ka#LEM7!*1 zGEM4(Zo7L3HL1@?D92v$hWkT*LZR%br!n;pqDq>)z3+jaCizVeCQ5rHnfzKPBJQ36 z3JHO|Ozk0AtpN}9$t`+&-Igr@Kkf7N*R?zU9@6J(KrqY-zbqAhAhL0v(vor)p*KO| z7tb!EloujVYASk*6nfD`RGQqW<=WtPmSPNgDV2O_$P2xniW)gLd*PgsmI%g3| zn=>mn%Q|x@dN+2Ca=AEn7J3(~dW~M;sopwk*3vo4l`HgWXyqKYS5D5p1MkN}$3U57 z)yD}Kr%;KHL4No9n@#lR@q%@D?R_)kI?C^UfA=WH51%6AQ{;sE{qFb2|BNDIx`Lk} z<7dbT7CBuR=k@Q&K?iyd4xFH6D|p3E*zVVUf4p-1k|I8Wf>->APvwMja=P-q694i2 z*Oc}i8gwXr$!6KHQ2Y?(@RvWb^*~pDW!%3e{loPit48R z%CSnmRlzHMOq7gQ+UYMpCH*Boyy6#GWW3@>A^bgE;D1Ny-mye!eqpU&`D*k0u3z!P zx6Al;`No27@QRuHy&qnAe^r6(Xny1OnhAgN_@*CT@nh%84efoC`oB#X^|wIA7s&Xs zsmA-G{P6Gj;kEZZk?Wi3-#$P5Tp2%C#;@_a-@pHq$#`{tvHE^2^5rite|&`>K3v9! z-y;5$A3jRPN6qN^e*fz;6yZ+6YwzhI*UJ036hB|VEA_hQSHAMzqhm8~T)y&s$q%p0 zL;fz~pSTIW-VYxozt1RYma(4xc;#r8(-eHPjE}xWyjw2c|DAgZ-r|>T^81#k&NdMp zb7j1LzW(>#W9k~eUB(Z*34U-l_>X0LhTo6=_de7OzFi*Q-?~ZpN!{SL&L-c}Z-P%V zbuIs98Nat1yz>3aZpz;^hkQSFlky`d7quY%%$MLRP#7;Qu75 z>-lw8<@c8ZNWbyR{C3_87l`f-7}rI5fa)h1(*sri$Cw_Z`ZdP%yHtP0nBGJ6LyYOc zs()cj59u;q5QwA`)K&W3>Nsyq@1>64#`I8iTsEfPqmH-6^xo5<)}clkgUOpod&eMmRyLp!ArJ?>5Y*^hT*AA+csPI19O z7}J@rhjDsmzAQMsGhZ2UxqtU7_ZfV@CTB(O=ga99IbE?QE988}^|-bAza-Z`#IHVE zaQcs^TEG5T)J^^O$mK@+_5Z`&lzR;46HX~nnF85AJdM%=I`=~t`UvPO=k{*Wd*R28 zJNN&4(Vvp&qCcZQM))IG|IKm`OEI@2<#c~LkZ9`q{gsnUUB74ZH{GN!=q8_hoZi{a zywuJ8e>5SEHT$FZ#~+!H@6)-xEV@5n0QI0>`U#wVFV){qZs%n=ye-S;6*>J|oPP`O zw*&5O>e(}Z+&|9m{@wvy-#;{<>--<;=Kj&$q(2@&>hB+SeF~>{F)n1zT(Cg*DpD$Q z>9U+gQ>?i`m)MtOeP#W-hSeu#I(Q?g}b1 zd*R{*bC%7SJt8qKCV@gfSm(`Nfv%D$68V{(yKv!3rJRgkrsKROJeB%*hI)mHQO>ne zGSyP#*qj>0vrc?$^7z!ptdl29_*KRf>y*^-k7Xb%ibGjvE?qivrFG7t*~SFYa%=k2 zzf666QW}NAN=h1e(`sf;t`!Hb6d|E^v5p(3f9tB>`&_L*Uv7PBPS(7fWpkFMEtr{; zGbabX+0_q3GWCC*tKUtNCd1!m&s${8&6$I0Zm8evoNVjdnTuvGn4>VHNK36b4#8Qi zvvP7|6nUepUnxi`lTKzA~Dw>=}cTGwh{xwZaAz4}eJ2mjXLRQf_G2R#`3m;23I@Ta| z3;rn{f5z%K%D9DW{~O8b4rZ0qN$g2_A(Qm9uCt0!v%)t-#~T?@=pdglB&!TuT-+@+ zFpcP15>ENw!JyulXhK#xaGZL6V|$f|J`iWcCk60wb%ptDr^&t%MOhK>$dD`UH@6=5WXbctxK1N@H> z`;8SOMkj>MhB~IJtcY!o(L=hUV}kapS}RgkY^(;4(P^B44vVfJKl}F2lojcOq}&@1 zqj%h1$%STg>x;&9mWEDl5%+jdo@8FH+5N!?+n4xh>g)0%+Q$^3zo3OXs<~AiP0Ksu~;24Fg%%XG(jm{$%?3( zHgM>zXg4m|9qFQ^OT=S3((or4`;zcEv7ZSUhAx_#ddE70-dc9HQABO^^XMeffuoHI zr4u`Gn`K7gw9Ln2Nsh-oJgE~MF)G)3Sy{BwiMKrdw&=LcE-KHtQkA}>=t#1XRhq8% zChO%!>T~A?`lJb6XQ-cFt69YnpNdQslQgA}y#hTQNt#BGc?6*&L77ct5L*h~DjZ_J=>pd@mLAriys#Mwy1qDa=!5i{OkuVi&5ri}1N zd?%6#QJ-Wj!#G_WKpiFsBLqmMkjc8zGdj&of1tgJRux3CS7fkA$BLhzWRrm56I)aH{Ww zWk^fVdOopB8T#R4ymlU^8&Fc!taJ*Jeg|t6r*%<62N5ih8?ooa#~^eN*Cuth?lb> zjF5)J;d7F?Oh-~DIug2~;|Ev}x=bfjwMcf?+iW)khthKV>`48%jy;Y93-N&dga z>8yvpz0x^gcf?+$$7%|aI$rDBiMpwi9_}Ab>?HPd{m61#cC}Mh`gM>l=t$M%W}rif zUum0p6h>rKB6B^Rz)7}xvBw!*wYWI#Cxe3M=J-F*Ug_sqWYkW^bR_8_?ehJ}hOA@- z8SkHADp3%6Q*?V6Cg`RiWQ;b@k=TXUj)V>6i-H80U1O_nbVWzf4d@{D>b4Z*#)^Y$LIPqLy2+7Dhpq@R+!Obk#N;*Yxbafs zKh<7E`_tiPuVOnhLe>YzYcjk!9se?WMHb6aH3hk8RwNX!p99{w4qeCD?v%ZX?!sQ_ z2Xs9h7Tx*<>2C%)VwJ3P12@Sw?q6oFh+C_ho@W^StMvFAW`g^eY`eOQjp)~L{z>+# zlY$U$hX4(9q$%~(EmV<6i^j+e=(vG@b?5ArJaN;FAS50lFZbjAPhxsR>}1mdkuYiI z__UkZtM6e&Z&^XoI}IQ4WSv5_SGoyEj80-Pw?#)M#rdb&t9ac6L|!E)c1)-EsufKj ztfgykc^6i^mVR?O?vTAo@5;YQQyEc4#?Ew*K9-zhq~pf+>bB_k0ro0E7r#=MWwr3T zq7>tGNFCB@#r%uy6_#gooFOZDZcc8%%}hww&Xe#bS&&N7?@#`|V*lRuN>&iEO;^9`Lq~_a zbQNRBirkj0i>`O4AUC4pPTMQl<0V^G^g{rNx|4ku-9@zUry7Bjl|r|YCEs>iJF;%q zUd47zN31dpkJs(?;F+V#vJn zHtaiRuPiz`Ca6Y+NCwx3MA6CSYC=c6&Iys%3S+vWG@zhVT7z#>h@Xb>4?*91d{inkTpbQpqFBz0%V`*2ML6$TBo;1p5E% z{R@0#$z30cYm9kp8~kL!4=~3v-jQZ|H2qMkrJ0>I{nC!?c_C?bz4#%w)UBEJO5LKn zH8Zkz10f_KK)8gN<6*ey{qy>Q`)xaMm%W{fNVa(Xs5%QJ+v=EjR{g9V;Df z0(r$Q@j_ZQ2nYL&epQ=M?gaRqn--p?Th&bq7xMaT&Y@9efg@z?(ZHoD>lq zMpdgr-a;yalpH!9V7{o3G|H=_p{mW`_ez`>!p*|^+fSaXm?E!g8Y8TwFGEr;XGBYW zJ7;|?JFv4!Zlg(QQsT?2DmZwT;Q+|;v5p%| zBClG>=%}NWZOriHK)*`(ec3(uz~z->j1;}07}T8q%==vfjw&yK2r5Aysi1@9n4xyY zNR63-y)o>f2MxhP2gHI;DX%Jkf=0T$64x$dwoeitjAf)eKzSv_E&u{8NJq!ACx{Lg zbp^&L!?|7NFLBKQIyi%R8PV~AogWm8WNr#o_$+gu`GlcP1NLLdtMEb0myVqPWm9np zL<-9;Icf*aAMuF78MLxJZo{+Uoh615^T?!CWinwUTW!nDu$3b7>;6!+Nx;kcb7Hp7 zDdbh0R9Lnb;?ypWGdft{024_v0Q%xA*!j;Thmi&(Ld*jS%0Q?Oy}>_KD@$!7@Ewx(qth!1+~kftZs)4zQ{^2!dyn>+6#SPFm{2hkzU4Zvf|SJlb^ zM)>WBjsnyi5Voo(%<43fLDZ*(grV@)F;23MW3;4s4Y609vdz+&7`0_)3esIniUXZOfF*X!erDW%rU3FK8M?U68W zPj|=67vQVqzrD{ zW(W(wB?tU6Y#+tbf!+IrgMm!mM_gVdW^|lFGH|+xgfjx=jkk{?aEG)f z>Q`l8pVQ4M+kaIC@{qhlUtY0D;b}_&D>zinKK2&mJP7>*U${a{P_-sOUOfl^*gz-0 zdvF=(yor^RTCRlyf>pyfMg3WA2akVaBO2TRj1NG8}Hc>a|a z0RbDZ0L7_LUX|y4bg)I=a2OF!3mfAQ$z>NhhZtCPVFIe-LGC;ugJi-=;)9SzBK3%1 zXQ@I;NfE^LvfVyX{O#WE^WfxF7_OCaZLxabAg{3Et4J+CM+>s%(D4$JSBw#fUKQe> zlcFP=aX9~q*@T0_tXJsSN@5A8n$(QET5vRjL)DQ@P+mP~|5b%I4klWYgdn0LsL;M_ zU4llWELtVj$}5|8!V6?*@U{-}ssXSH(GjmGcnbZBeKMS0)vS2bUIm5~10=->oNNsR zKAGcwCZ2c39YiWsLYyLvbRFE7af%Kjh&yg~I5MoXn1~LLSBnoqUh$vewB${ky$T%M zUvd=A=RS&npk;f02ewqysnQDW9gCeEMv}G!D=(4h$)%k&BlCuwa9^BE3c<6vZ(eiianuAg}pd1z}rO$J6d6ijDX32!l z8lahE!wSo-CvOvJ@`@|bWy`D6Rhp{8UO8V(7)scr;yM>aA2#u42h1u3y$@yWK)8p@?$7tb} zBDF-&C4LKF=WV@|g0G{!?h`N$7Zh^0T^RQc3ryw?TQ0Z-8#=3DY%g>9O%5)|c2EYI z$Im2USj1$uW1$1&m86jA4pqo)5Okn43*l+c(Kq6p74PQfPA8+|6!J<+m~wuRO+o;R zuLv&RI&2?YyNof&punS2mT@F~D@8MBg5=04>Irdlq{ypMz#uJj|AO=o&*Wmdyh8Dd zA$35_A{@tvn)r83Adfn?dV=%E&%$|5S& zBE7+wS_^89s*Ahw4Q~$nDb6kKoE;T`p@r4>TUlj99TET`s4+mXQ zzbc+oULiX0LQih7+0k*!&Wajvp)hM#k)dGgw^yQs`tT{`RSnLwv><6;E)oTfXxf?# z_B8#nCmEJdKC~P*rLJ$<_AzgI!mQ#LnG79^zRn;EX*epHFT16c!_;&Le+UMxhRl&T zV3x&T(?1#=6YE#5Ab?$R(?^FMY97wyE?SM(;D`avhaypQO9(zuUNLfm>vbkYM&Jgc$5)k%7EA zd6W<}nW}pi>I}u88i{y9762VpZzw#Q;5qG6&>{MjWvF1IpIlx^f_lRMpXC+XR)7)F zA5!!^RFFg*Sy(k3tg!mx@z5~=<4BcSuuPYNjUy(InFW?0cpYvTj5W+DZ6(cWu?h>x zV2}yq72Y~ghO>mcsa3Ib0HXsh?Xsu)(S$6znP7~*3MUtm(Q)dK5D#eU6fwU`+!n*K z{7BW&59fQ-1In*dJq)HX2pgN6qEN?*VO1X;D6aqx$RJYU7%E~(aauT!Q#3rt7!f6w zof1&~Lgu#Uu*q_aoj;PVHJ>1_3J*eFF-#=00yeS=df)*aayuvUteKVE+y}M{Tk92& zV`=g#QNM~~#G(VFL=n-!Qnz5x0rHA>5GmZsx;mhv5!7`T4ZmT~!3*SWORjS<#rJYb zd4(ZJb`&hwWW_?<=~T6wwGlN<=fEyy5}Fw8=xnT(Dm5VqB?64G?B3J^mqOC^y zau+J3CCGs+@F&M|imJHdU)s|7evR)k})E@}yPf+RRhmfcJ^14S0|EJ zHq0%OH$(9X=Xe50X96RFi z;LJm?&W@BvFS8VUTCV21v2w zK;29%aAde((cV-DL%C`v7I&H94|FHS^eZeY9csu$5RXM@KT=*v8Q%G$(Xnhv0vM+Z z!RzI~;d}ylRl+iWxI2TvTZK&|(SOBxyi&>lq9k?LKClQp-lm$YUj_D{7qAW(yx?nn zf{V&z3}SY0bR8thE0Nnphp8eSpw2+Y#PX^D=g~q5X5%>XaKBOlgYY8^N#F}KFk{r7 z=D$LDRfmj}MvT%zb}qyR!3fTg@~V}H5z7Toth)?8t|A&%3+eJ|Vz0ZD)$%nNk?kDx zZ#Xt72bpXlf*`%b7GjcaVD{pXTV8kxI1#I8F8TolaRQ{Mjvl`F_uw$#k@9Le6CHJM zQrXhV-tFoZBgaKYz&L!RDca7Wy>Lb}-$CDi`TIlR+4BO_9F~I5D5-)^hYs|Mwt(7! zK}y-0yzkjw2t0e)@@g5prf&NHu-75s)DYPU8$9xTD43W1h|^JxYF zh$H1y0sJtbJt&uWT66&8Fh=H&WRMBul_W~Bqp1{Mlz58xrWG67K%!-0SafsXqTCG# zLU|`~_;)CE5}Q>SkqdSxW{M&Kgvqh48cC4pku9&1(GkciJh#j3EC=KObqYFc>gf>- z!h;vxu&Ay`iCVLzF0m^K93~?CnTa^m4ormkR}T9Ot3WGg1aoUy2Jz7$)p(4M3Df^r z(JcqZGmn;6;D-tQS9r^97CKVo)g;ACc!m`}Sd97=d)L`OV+{(;bJk(l2f~^d@8&fF z_9i4$dlh2CQYZWwghJ|mCOKlH1vM)?bZ}5R2tXX|Z=cUX2g9o22SAU zL1w00aiv92jcp>(!75hk1Fw|a=>YUE`A#?o20OgYI(`!{5-hcaE?6Kj45%aJ zRS~N7GIHhCyjlu6SfgNcSYw%q;aCh}=g*2RJND~I`jws`+nyZCuVFeI7$%Ha&Iz$6 zi>ts0saLUthtQL9wlPD`)mAMeoM|d1)*;E1SEA_RB~56mvs#iUui#Kj2_kW!d7E`A z2V)aOhujwAR$-@gic*Cv5h#{5+oTTXDXL5xQ06WU75D`bCLl3nW)T9*@z{ZN`XhG%V zlC>pM@~1jwrfP<4d`H78OsR2vT93^#Xdv+4jSCIH*% z5dQFvtpyZlXN9%CQSUt-I!+|7SWPN`WU#XePe|dFYRe%y5>F9MAg?4wuOAoXmY2Wi zUS}DHon2+5B0lL1*1a=83_S7FbBq|`7>VsH@cWVSYElMCLWet#Q;h?2IRHD>6vYj$ zwB!wyjFF?z!IFwUZBYeL8X3Gi2sjCw7#RmpGw?a2+b|wT-r_Nn0S_8@^9kHgPWyU6 zB+myj2fV}*LszH+JB%C`9jIUFK{(;9VI{WNq>50fkCp!gtg~d4q9&X{ zD8dGjQ0O(~GnSDO7JEOXyb2G12s#+lush4u!!~Oa0#z~~I8};}0>^OnQoLs@ zX{rJF16~=`f}^)8gi22!uh0NtMUGV?W^FmuSo3yg#$6q}?#obcsRH>|^WjVV=#pnn zVg?Z~PFl{x@${=O=+ETJ+k}l;F1gNW@(Rz&iA$f6Wph+g{Oyy-s|p-vuK2`&OkIP6 zDhnv{@v;N`$z?s_WvJ7x;Y-;#>fq$J8~thI)uQjrT!x{R;hZd@Lmp3&S7k$2a`s`# zVT5V;#PX^d$SX-ds5!=AD_e*bJi1jgE36yC5!(iO)B!0?>s|NtuDE{npyd_jUJ5!u zZ?8ho0mE1s@~R320VJmvhCQ*oS_1QY30@~D&>Rt%_lUu(-;R4RSDS%toofWO@D?xw zcDbdl1xw4E=V|q;5FIEb>`>)6M#4|bko1m`7Rut&eL~utee@ zEGw~a3wSYiA`|D932#9bjt!nJV~0>HzS0 z8zV!;2|lr8R@%4jz{siPl@uQ{7%YS7AqJhMD6y&2s_g1dxy!(azG9FAnN~u1LV3jo z2=g7|MN&stzhXsKGYiWrEDf=23)C~?@a72l47_VsQ(T2{WC7#ULFi=}Aer*Yt91{_ zS_=V`3Xqr@_XLKj8gA$l&uT(>h2ak_TIJ53g1kzXqLaug41d@%)KyS^IDMM83{fpY z7*-s$7i=9%cJG9YfLa0CgDFbyg!W)HfLIYqhDxE@vM;anfQvBgV~D|Yd6mT=6UZx+ zRBT`HhF*a~4Gk!o(ZImBy{(|-@X~;qMQPbPY?zde^k0D!I2#@DB47-wmcz>t^6Dtj zm!Ki=8y~d1lFDWbNtX7orOJU*pW20exS~Fr;UIhj1?Vq|QGPfpPAJ7)CJ28dCn_MU zz`&H`u?C=H-u1zopxu##V}=^Dq!|dAP%%3~zk=<<*7y~N03Y6Delep41BS2NFG6Fsn3qzKDL~W!Em%P#NrgA`sf?6Y0z`#VNFLK!%5W zH(|ag%c~m5B{?U{RY5f4RKQPyDbO}g#@zyG7Fc7+z?=Sp;j%(P=9T*$y=nno($LXJ zTr8O3;kknofPERVwOep1!4rDSak%Nn&@plT6`!=4M;gNem1cphm@m=pDY&6?*^|(n z=$FM19z@+BEr5QMyb?7dAiov_J&!gJklGvYS&08GcdWyJxF6YCtYO{P9OkHO~++YoebQ(9Ip!OQ~Q#EGf!H8T&(Yeb6}a4jE;%rl_a`A{uQS8 z+rWAiO0kLXUvLmxhJaKP4vDm48W&J|EmKAzCuZqaU`-TYGZmZ$Cx)a@z@ksI;J?Dl zbda`L07^+o6n9t_$qcm^On4G`RfIFz_L^F`W{3;*Xf|OjtIpd5yq$F|^v1WW(#yoa z9e{fA?RcWFm2zgs=3k}iSAcri6woae;{tG`6dCK>rdSFFI_Ns-C>UdR#n{ zX0AYS?Qa%yJsRY$vSGzy`=XWZ7Xk1tyiUjV|$#0Vshe zTe&T=WKwoHceDn$Tkv;h!2&F>Vc8*Rmq|tk%XW~N>`y3z7QtytE?vY7$UA1irbFwY zN}#@mu)<^1034ms14|!94{!g5{422fV4N+eIPG1oDT~nc~Q}mS3C!~ zf34u4G$}fQ{Hq$cD=}U#g}<=A6SP>_z66e@Dr60X1p%@?Gub&69W2?{*5JdHvFqA{ zBuV~UfFQ^+>^_TSf6hP*MZ^fGZ5&={0DM}B=$Kf)5+j|H-?$yFxv>SG<<=*N53-bC zOM&wixTsEeomm#xGtHBF20D1Cq9cO_NbhWP@aceMn`#A05!X@^BZ!BB0*R7E0O*i2 zeN{sqY^9z;UP=0p@z%X=Z?et1rYEBdgVfEXtI43eh2WimS01qZi+ zN=9D|`Yd~lBgu;3h`^H0;v3;y0v@pCa|g&PkqN9V19n2Uz_H}jJQyJCzmlGKvcqaEPjmChB3l( zI2JmB{417M1yEe2{?(F03jbcf^Ug2WHX(BhwtHNl9Nl7SXW(o8wfEzQCziR7F#_fF zq#XT{p=u+PxL!)hH^X_$F2yinOKyV9Y}nB7spS>#da|3dLyUtUhH)hGDsTpRpGQit zi7^;vIG|6-dbR~4Y=&12MvN@t2u|7^E1Y0v1+rjd-hr3>RN3f|%fc8PHi19%^Jm&z zxSLDW6vNJ5IR)NRmK@D2rznv8nOOb%WS{YjlthdeP%~8*Acq0b;qF*rb1A?G3x8J9 z*f)#l;N3Zn4%UznBTMEj$3;h=U*UOY$wLF*S{3dKkU{DRLkU%9v(M=m2hkyBcp^H$ znh=aM9IQfgG;F}y=r95nBd-J_xS`JjgD{73t`7VjN5{nSN)CWPX;79GQgfh^1okvn zdA1Avbc}=OupuE2Bj9IXSaFfDv^!P`K08+vF=DoL9x4qT1$%fTB@t+Hd9`Sx=S&PN zuj*#}LV`w`mI#`0%sl*@)L=n*1si24WDqt(K>J$2^Ztbdc_q3Q54Gg5mVgfMmK5fF zdBsrT#{=`E0CM%n1u}y$Q}dw}IaChrM6aF_I1>`VKB>1V>=_Kz3PfK5I+o+;u%05R zV!;?`IUIRK5u0wnGI(oa@=BZ}i$djT2WAqa;h?Q5ckuBK;R+FJo z2CdjDwvb5k6M#J-IE9}{Is?X!upnC+I^=Z!vOx#PE2;emNi`C#1>lz;e}-L%S@H@g zCq&0&Bq|2TlABvI1=M`>32P=V*OE5+iRIM^7-tf6*kc8f1l0hHKtOFVhz1rQ;>??c zl~+=c4=}^i*tXmm{OZ|7}Yzal)OTsC2j5<4FdQyC000oce zl`up{5vuW6+3sE0W-*e44!$+Dl_9Ufg5eX8rKH2zlf1lnK?g~p;R9=R_j_EVoMxLy z`%E$|F}*X5K|CK9s3>+Q!AJll9%?>7ha3}w?PK1$EK)XfM8~o2qelZ|K8Pa8IYG`E z4RRiAJ(*L1Jp+Tm&N3-Ff>>&JsYf~3WJSZD_tC*aC1S*IAF8{!-N(@}vAlAMVv^jb znr(t}5|BaC%#c%V6KRG?933h0%99c)=qSaUuB;)0Z;Fj^W)PO=Xn-&}3TXSV^)a6y zua0IApF3Dy*-Gh1Gj(7P4o+cJ*rl|=>&MZrj%-JEKBl~q@}YM70C`o0y+)`DB0G!- z{*;>~p^ueUY-pgvM3R4CK1Uyn3i7X5UPhj4UX{T`FU6X8kj41mlgcaDKEge^YWtvJ0-e+D%9(JZ zPgTas$?b7;@T^d11PsClqry8@1RXZRhj(WHW+<=9Ag>w$I*Pv2DH$V^$t!o!2IOCH z2RX$LriW*MFbjts_)~85=_!Kc7)FkZ4v<%pt`FG@QV9g&gC(HABA6#GmWmjGJB$k8 z;5|BVH}JRDf#z|KmLm3WLqYuZMo0wma1^{(iYP+3su8OYJ_$PmIu80fgtJrl!9_p^I(uX2m}E<}4jjKsF5VFztEQX44k@2_t?h!1 z1!vC+iwLC*=+F`R+XDu{a#d;QuogXHq--%_(6NN*;EWmwxR-6>8SFTdXI`Pa%GjOj z08&0{;~5~(M=on_c|+9$z@}-)-tEun>>S6)Waw~rtfa^*7R#u(77-ogBy=z_ur~%o zoak4_LI*5x36B1S=gUN1VJ>1VVJMEdyGtkve&x4{qj`4YSHNSLd~s(A1{2T$3a1NK zfxPlC0`WnqG^Jr!fn6Yu4j!r$#|WpOhv;BuOED20lWeJ|SwUh6_Hh>tH_e|(41#&= z(yj-r;ef`*!4gaY_JB3gSSgmzP{n)(2p}#4g@<>nAUbTs1TnIN3=*JYAw&mn_qNtO z&SZkjE1|cd4;Hisv5XiT9B2gFhtw`>0=3&b85VRE*GZgc~u4mL3BV-Xt^n)0i3M0Cu% z0eJ$8ek}_YFLM1lZ0?f=YH@*?`8jg;6K=an`jr>Gt-$Y)I}}#IYR0&LX9bU^d9fHB znBUI(p!2CRwF6aGgGI?^0sE1cdDt-MfM_^kq=kn>z{bx)$0YhyC?$fKSLVIlIW#~} zgNol(XXaB&&!F>IBbZ@$kE)zwvhoTJfS_BIi8e$Be=b3M(273Jh!)^4IGD)c=y?Zl znF&8$bwgPvIUb0fL{f!&rMn_C@F-S6YPC|hkM*mHWO-#VV$gvH z)&w2szF_U5;0?8ehgMkVEdx5hrC9`Y#JnGikbi>v@4~UrfeXw`@8l9yaxY=g!7xL= zLVW;fJ^_!3+e9n=c!IoIcIaq9PKe7(WMZ(#C}M^QKOPhp!W!VMqBpBD9KXWo5@T%< z`3_hn9)~)0EVXJO3I3~4fHndo%RrGbkp(m+h z8AAte6Tp4mRYbTwaRMqEzXdlRhYnzz$s>cwTLxf|l^i*2yXY31?aQs(I?0*DFi8?) zhSuj5JE{U%LYg{jT)c_6_yr^(G=lsqK3dDCNS5I=bP2R9cL@l~cD6mCXdb%mCk=ey z0#iai$RJH1oA?Pe@LzeGX2mg16Z}`6FAKJnWXCT)2<_-~M_Ey@Iu8pOR{NQTgF99P zDP=cvDPzS|@@$0!*qs^RRnVQ9Py)g$@3ZV)cRYC&phLsY^XZYT&fR*=GBH>uztSUkK6zbDaEH3WOh&2|w&9`QR? zz@itc0XBLGf54G3-rO_f6-P-}Rm1H1Mc~cjfj#_$yPtU5YQWZ(=Qx5dQ3#{}{! zTz+^rM`D_8c&BqUd_1r|VvK`M-L%aj?bDK|6ut;Zku{vOJ61&FTJ(m(D!w8cD-Pgc zasu8R>AnS>VRBD<7KwsEoqDTm=*8lv?C$~Nq`m!Uj!2;^IVG_ehmue`OAin`7VL5p zR)8t*VrXU}5QFjHBgDM0W_2BBGNB_eOu5PQ7bO6H$r}m{kSgd=VswPQtmPzLm>~Zu zL`NOOi(_i0D}YjX#|onZAyzm_UL~Zj1PtZLs~9>awg($fhX-?~U1Ta83V?}T+!`3& z-pSCUS$V7xa$=_Jvek6OC$41+D$CQ!es!)HR8P|Lm4%?g6Wsf+_aMlV+E z2*v^`wBa2qDU35A*eCg%a34%%6Z9iNURK@aen9N69_}faIs#b3WDu=P?M+ZX2>fknaKVt-BJfRpKN7^{;R;Li=SSoJttP!Rx zCT!~;Q?RF^BhgQCTzSQ%o|%9#JJDtv!dLQm31~Zr4~7O^EIx=D6f#l#%EC;#`WS*e zW2obLt`hdgMNcWJLwu00RAUQ*TT0*_PqwmyX!s=Cgz!bWBPHQ;$$hf=Dt9AtS^_gs zEO8O`+|bq&XB0%BxSfNfF@Jk1gB%O^X$yo<3ujG>$^<8!Yv7Hy8Zs(lmCzVJ<*e|t z;MhlU1{j`jpQ9~-%V`+%kYR!l<7#H1o-F9#^hJ9SUeOK3YR?h!Dsh)Qt^&E}NR;Kg zMC}dOS$C=|0N76e{A11vPcHE9;!H4JHBqnuBP?>o_JR6u5-Wr&fyy>@N)N@%!ogN% z1jz?r>lm&<;Q={LC(_`_Y>PQ#*HFa*wb? z4bj0&UFVvIoI71NpKLqBO(lFLLJFJ1r`%D~Tyz^i$1+rLS+EC_vAh5e zg%~-Jys}ah71}a{(X$V7dRmr|3@tE8@JLkX(aNfYl_sw&wJ7FAbnwi1H%D}sLo^8( zX#s4Y2u|IQ z+7sNZW`T8lFbwbo8$?2mmhbpIHbntCs%9t;BY^?ZfCDu}K*18C!_T0Tg7AGf)GbBC~FoM)51OIJ8$QV)xtx<0o4_G6XtNsv@@BVfP73X`LiE^*}Lrys{VpE%C0z?j1hJT(sU= z*d|zAETg@UvSBr2l#iiCWRS$|$v>!=Q8+I9^J6QoP8Ra8euf6zY9YrVS%ARSz#LJp zx%Na7#m=Eh<`t`{`^p7OK1TBgCXOb>M+y- z(7C4wrDSBq&w6B1`ziDKLM;oWx*Q3?l-&m?ua2XBc=FsHda}i+TV}T4DU$Pd;8z#z z6n$CniHRk(q*-}84l+?-u*9v8i5G}kmRH!MV18$?mmH=}t|zA?w;cD=mVy_U;I__N zhMpnsFBo+~sqWmr2rJ|`P}M4UmXNt1@m%dG^ebd8>tdaUOiSE4kr);+%QrC>YXZhO z$+1nu2-HgnEiXAe$28C08|zg|F}=M!!$9W8tqf#z|8K|gI-!1ro;S0=YT$24We^ZJ z$n5qen$v1lnRFGpp14I)?_m4j^b%V$b1BI8@T5It`8HeeK8Y7gr5><_7ai$umqSB% z4n2cG(zpX6ancBa_h_HhDdg2+m{n^_vVeZY;V@35slc_Wp*n;CcP3O@c^I?Sk1#+m zh7#MAG8edn6kc)wuLjC_vb^HAV`e74g3*y~n4CUM*ZQxpu?7rM0tVr$Dr+2N=46|i z`?RpankRVPQ_kulgP?N^+Uqe`P3*a1yVJ@Yac&_ylR2F)gFGY2L{L@oDHlYQh2eDVZLnhT>)0iCTM`v z!N3gD<1x;1bOru~n;XI~nLC0!nWGuRP*;2(KT%lrXbe{T3EL}Qc~M+i79#jELrXS5 z?X2pfK;utLFKOC(Wre^w9O_pw2bcdT`*?WwbWDMq&;Ut;+n4D8oY1t_?ln(=V9A*;W`( zXocv=Fv(BGI84mI9oFB@8#>oT=Tj15fPgf>6CVi&YL>l?9xW{Hwt#{q^j}Su*SCNz zi-5;g@=LQ|mG%g@3$WPo$-y3cmX{OQ+3g?&xiLWukcQ)krNE|$1@)SlpI$~Zd^%6> zG4rn^Qxxtkb=hlZ4}xIvgkc!F2MOj}oq8xK-^v|MY?5c&gSZ1$4W_KWog;>9P58yJ z(dZC$2$G!f$V?+xpanaA(JrQicAjIy}A{?~JfYPTx&gpi~xxv`>^*m_Cs)l(?61 zJHX%qoWv>C{kc6LdF3oGG%aC+VEsxC-*G^S9U}c3>Hi6ll!kK zNb{gwIL0|{(rNfJQ%aPM_Xnic2Pu8!H!UM+f%#h&ISs!S`EjeEE zh!(>iDdH$*T6+7MruKMcT3;F@!YVbXtdjoVspVCi0F0Jp^{WCJAP`2!%Y`uuMZCBS zLr!J1sa$A`@Z*7z;&B`<*|JZj-i}vN9v$bM99B(O6s80`5U{5c17>%Kyn^sY3FH;) zS8`pEzYn&+a!0X@pY@dXQ(tL8Er#hOR=?lX;MB2Ly5oz+2#r_w?lBoDw?Xv+m2Q7gE2fr=UZ;yX+`nYr+Iy zu-tUoVGxN*fUhrJL^NO=vD{k@yq?0JBGVR@eOO_K6By>9BL(K>rSzW;?5Xk!WQdEN zvwj7v!Pa^W1AHlqZ8aQQHS8(uWye{yAf%3o@wE(INLwHtl*aZ`>Q_q+_+FKg7e&9q zg;bD1xCN^!CAwZAPevlAK?J-4S?=*uR0TMG4j4>6hwgtSY#+zDne=#!Q$7xZoQxO% zGECK+ULyJxw8zgb>93Z6DOjZN6(luuiy?PdO$;2r7=t+O0_Uy&3Jeghfd2!5RfYj_ z8XgQjxr9DeCb5C41|*bLif)<9uw*gMfnXLm7p3JexGWi93n+r{$J+|n znrMJuv78YXB>99as$aAG|; zbmJD7lK$;U%c?_-q~Sr>G#<5lA@wUXK*6ibId&SS+zL4^L@c}n$AtdsKvolVS80p@f&Q&+;eA8o`I^rmtXCs;BV+*VUonwc|E8f`Sb*#y>ASAsA3_B@0P9d-2 zGM0nIyqoaZYE}zb5h^(%Y{69^UiA`IhMS%ygV|O~Y`=p7SqeyZ!UfI)d>Rizwu?== z5WJ$1gpLPp52mQoRrbn4r83+&nsBDWIa0ud8$XBcJI3qiPC-Ypud3BS0ZUs*14y?C zew)Mtl9POT9BR3PVFgupULbiDPtmt7an4JecfVWx3WMq5rwWQ?u_fpQWbu%QO^Ah= zEP`~x6MQY;zHt7Qol8jD4;oe__Ap@1$qOT|>X36QiA;vBDtyN@Zv^^xz7-J*CpJQ7 zMUwjAUD*batR*zh(Uij_TRf&LQ1&29=z1Wqf;ls(ltGh!;pEi6{!^3&0>eV0euBLCY)LJ~#+y&kt50cb7YGG3OfOU-2PCjDz!8^;k$qumDx= z8E$xzeG%aqd@iLg5Pikr_K}d7T|EL;m}AcjQpS@(F^%+r+k;TkfazTF4>fCWIVRRy z_z=28!(sb~d28n}*Aa~r;DYenMg~WjD?Xgq0Kw=a13PsW-5l6|H4h#wHk5FeVODbD2n>@Z-XqDt1T!SO%RsFA$#RNh zkfuX=TAvAFC5hj#amXeTtHbkvjhJwZuCZ!hT50r|4A!(<3#y1UU7~^W)ot;$h=YJ#6gQ=1EfTCT5&QF+Mn+pJgp; z0X7R;tfLb6uNnYqspt-ZNc>l2z`G>|ILIU2f@tp%T9(6>6zR3e|3Fu#-7H{MO8}E*SR<(JD6Imqa!E_D7c6pS zukIiQ9R?RTVzO*7Wx*b^K3HCb1_+oZcn!+Y=biPRA~`3lWN3+@WR}UIPrsLAqkJL> zce+z<6Z~0;WzQCpt||A=4|1Tq2<*U@buPm-on=ffVUA!^g+-7B`#f+{446K^(Sn$e zanRxutsurG6TnK!3W3@`51LgShdmD1Q$GQcf@QyWBcfh1b2xFg;C?SKRF@rh)cg}w zY|Kiuo!uh<6Wl)Jw#~q!6|b-{`N0r4`RMMw4P0Tz{d9pFj60v=)234GH_fo^T2*H30A0VCnVry1U@E~SB>DBo8+Ow9fVyspkMK3!Fd<+ z;J;n8b~NZ$Rj6exM#_?#NgXmkTETuDGfX7KWrD>DIw1QZqyAOe9)vH#96y_2b~1S- z&T~tFU@oBwopyU29zUL;)vf{2>k#*01y~$r_g&LgzHgk_UDULV3VsmoLwR{fz;6R3}?t+9ztH z@_WM*G6@$@2ET{(xT@AWitgwM=2NkAFd40}1y-B!S%oq)^j{Sr|Eg%WRM=D4!HXU( zj`lVJVTc7!;`yTCe8AzHP$(u{UI`=D9bm)aTA|c(=4VI@OF+q!I}(eY=xd;i;!iwj z#jrxpTg>_h{8vmZ%q)u>C4{VLEcJt_RxxT9o28meuFI2w{fG@c)0RJSs4B3wSo$T0 zj%4l#hT1yH03UhvML;Um5*|gqXUx_ZxPg-&#>%%Pn=cU#3*>m*a8v*GjBbq zKWfPEE-APKJ}U`!z&WO+Bn9%g=8~7^P(9U9{JE5f!B7sQu?&1NIu>e2%u2L~(2)`j z8wD=XD zQIl>WAY_m!sv(2mk%w@oYJ$At3>is;V~46e#Oh-+?s^Kh2{g%@@yBt?z@y*x5KZXP zk-G^XEF}>`4b^!#i6cHv`b9M(8B5$zXYCGcof0?}<3D9I`djx0T?ejL-%+d;Y-pP>~JU;oxqjY=EY3Wa1@T)geQD>mx=l30fXMDoC)L= zZXdQ#Kox}8BuUre{U|u9OWeGg!S?FyM6i8$RU^z$&Cm=9=70lA)Bq328+lcSBRr@& zdS#7aYd{kwe!nyO4Iu9;)UWDCN-eYp(Z_zu^Ek+5!6!0rXnn*O2R$ubh!)_M5dQG@ z!4jt-HGvWAIVnRqOK|qT37(>|-K}`X!M7kk&buXtwcz4poGGv5JPvZ`N$o-WTnfnJ z$f4?i|H`{iBgkr~`+;?D5O{>sbomfEpCaUnqfGfraIuv2A!EW@4O4FLG89OwmY`J; z&|zoAv65`b5XdVoK3TLc4Z+?#nsG2mJ|h{g1<~gtwhwe9F8i`QlvIHM!XzQyX3lKq zv<;I%*96hZVm6E}Nt)$Cd~Wdt>JIgk5EVLhj?BN3d@m(rwq z>K+sea|8^61_*kU!|(^U*!rSesjQ0k<1mAi91+&>`VWji*;71$?Tl%PVq4)odK{5Q zw~uepXUnTvh=@d9NExaT=uzP*p=C5VtKLwd1?_Pq4g%gSXKR46-2{Qg`B!pft$vV8 z4;A7&lI$u^lAVo-(-5=wa*&3Xj1E0ify?bOCBsRaDi|PTIKz&ocZ+_0dxD=f*k!!W z#4=VB=vQ2=YYDdxtkrCf+XN;+sD)OMosS}h1hIxPvmT#kg58?FK(Y0}0AY)x4CiVk z0c_E{n$7UKTXk3kD=aeB01kCmsDrAufV7=SMY2q&`s+N~+2U?OCvdpYW4JTZmn9Oz zviUKSrdX#cg7v}f#NxasWH6&XVGHBg!dW@t4x5jWX?aZ^sEx@hzUQa{=VYZD>QrH- zsI@-8nd$9!X%cKXzQEe=AfyZ>H(#XO=fyh?o+4Z!6i*0 zJ4;31$>dcX7(`M^>TU@qE&`KkfWVf4UeiV`b*SvkD+?X0Ux5Kqfoh6Uw}AyCL<*`v zV`V?EE{ozSQZN%ay&kF}uva>DcM^ZQW{r}b)j|e3f}v6kkQ6+|@~^Tjh)K{S(eMatsmvhgzbeC-^d&qh0{*LoBq{3ouQH>AqVDpGn6)eZ0<%^9 zl)>HJ9VAUHV~~1+`U8!`jFcEg%tGXxEF>zhdCprH|6Vb(D#B$_%|$o2icRt{Wdw?_ zC>g40(8T*-zzCi{AvAlBl2<%F`hQSnhL3x@x$nP{tK~vT1q;binGozue&JD+5FJYn z9eni0-9N}1Iv)dJInZ(xE}1ZzFiKU|E=Ah;Dg>Lj2zTctNB|%VG%8!MIZvWr@sf`$ z=zUBR01;8ceKUQi(4CS{M!4k|$I2_dU1E_V-JD^?HXs-v^PF0YhhAF_g9}NPR}ss+ zBLQGW!MvL-4_ICB7TBCvEQ`E?ip^PI&oDre2*$d?JcTet#3eYZW9Wccu|l|rX=9wg z4Cs*123j9nrNQ{G79m}VU0a-y#SuW>K3I}hfmuZ1Y#4Mf27_HjmcVCt0||DdyuySx z{`9gOD?V+9wnku0$m0`O5Xj*1y0t;%lwrd3%)C&wdE-7hZ2fkO4|2qI9x7M!dzYZr zcLDYS@!ZzE1)?G(ze8aPc`z~AW@34T(qIY7*TiEe;ZT7AvIN1<2}K`P`EEeyAIsE8 zu1?tjyl&9}@xd0bhA;?(Kjz`AhfqGGlq~r9SGo8{8v`pG6};qFw7^)ck*E+Hwm(^)iYTLoJ-*#yknM+ zs_7Jdwo=ehF}}Xyq9akB)dFN(Oo|TBuY?ic1|RlZae^W{pm;e&2=j5-YI|b{V+|_| za}=Jve|*j*ylKe01uWfM!cUe_OQ3QjR|*Qv@Coi%3H`U0+Sv_WL5y%#E$E!QYZm|= zML>tOybvQzIFC~R1BBg)#j>Mt?zw0SXu$3)WkV`J20%a9GGRjOB%k80FZwO$t;Mv! z37sdwtUQb?I^ZurMxU517{@O=!YDL7d4(8Rh7DbQ2Xu(_!HD2+ZNb~s$e9LV49{rs`K7gTxFFpF6k^S<`G@2^FRAGjnHjz(>h&T)$`% zCwi$FyP(K(}bx;&pl?~B>CzvY!P|MbRl&)W;p~LD|%=MzG z)f}%Sz$74Mksj6r;Jpvi;2{H~{2(q3WCmd?jO*J}^spuDd6Xk%0jL_$u?Xlu?x^|l zN-)xhGe`>@CRykR^eg94G}{(y?@OUS8K|plHm@>V|Ht#GKwwBtmteg$*1W`&bhJ-jd}1iirtD8sA2#?Cwa~Ps^B@Ok4{^Hq0q<9`v|f| zJyZ1AYigO28xs>l^4^qf0!)k!OYI1s24uOjE4T!4!#ZTY%hqqbUOW`&0|GZ595iz& z2OZq`HDO_1CJ7eNtPXK-iurLVmTSZq%nq6#huSAkOge$Q!qO%4)>UHcK{iHsujC+d z*_z_u~MAuzkT&lpVh;cfBV`q>|i+rucD`apL$==Rh59rgXk=}%+%YVC=&%ja+B za)k4X5q-`Lau40!+KSE(^qmrE7(yW;jrMlh2T{Az-Wzv^xyE4cVA#8TXB^EmW}{M}Scu-Cp%gU-yPNw%B~#Y#^hVL% zaBy3_BT~O^54+uHG}s>BYY)2@ql3YIwAJoM!>$^8JnU`mkGoNC9JTwM3u+3xgHCVz zAg3Dk`<*UNNxgV?6b-iZA5UDr6+O}IcZcnr=;r?BPH!u^+S}^(N8PBc-b*c`JKavS zd61*-%k=g&d3&@xP@}fTy+J=8b$jajVWieRQh!Hf^8y(y9}R}Nnf90_Jd6f=^w6xD z zeYK#Wzv&m(({`=jTHd%;d)LO=$``aErFkwa=5iO#MdSA7PM0XR)4i)mY{YzeZ!mlY z$W(-+qC2&Bj1@gA7T@0*>(}vf8$HGCoeduC-S3SqM<2>P^dSPN0`!wBjn<3>ULL?T z8$Fk&e(F=%IoDM4)s{T4p;-EAE1FU7$lIZ3FXeLbZnI&l_tU$A8AazFQbct3lKpCX zbEDVa9z^HVZ}f}$X1_n`-R>&}-nyf<#Bh=BG-Of{YlnL{c>elPuzC>`1VNC&IyLW$Mw5158uR&s9xv{;ezKJ$A zNH(aQqRn`mQ^>s>O`BfR3T1QS10~ZhM~Z~kpT61JxLIqwv(?^o)iwJ5Zf~@& zG3hZY-Hn}Y|F)vB%g7ApO7wMmYpW|y*BXu1)s5>n zuD9~Zi@Dn#rYuH%6E5by0-OIzdf@@KGP~xb^TyrYaLkKIcqsVRJ-pc)k2dxcZ)!?W z9f}L8`Jp+r`O{n?3I>qZjL1LIKM&2_rgi9V=kw7*?90ua{jUD5;2u<<>~4=YcH6_- zJ$kS}OF9IzlK-5=l%{DV$abFD*iw>iv%U3<8DM|78J$xfv$+rDEXyG8pJOH` zcA>HN35%-#`N#P$^~#5+n>20>`s42XF|}T}5RDG{TNm2&sq`&Hk@V=5}7{K*}Oe7t>ov`M)P9ywo!Cm=?DD}s=bXRKt#|o&l^QV zb?gv#>Pc*DZ14BCHa7CoOF{pk=V;yMSSj7#i%7TAJ4>6iHQDx*l)rG{q1etcqoJn& znfEr5Jav8OA^qi8>0~47&yVFJzg3CCSxq?#@GB#&DDCyO#`{Xc8nAkIcD%ny%Hqxe zsl$TtKIQgwYv?p27bHUQ~K;fMx2hieffq~J2U}b)JlhekyiNbNvf zwb~QC<}K06Zu@qZv~~dYoVYL}Bq#y=WLRwK; zW4E(5R=@4ecpK-rsNcOua8#7zx2wH2pW854Zdv1dFPq8pciv1MQlz09 zy%{O`d-PHLizP~Gbg#ecW_8KUL&mVPAgElPIXJg4Kl|u?W}kS;*5g3u3{&TS%Ty2X=bd8G(<3UkrEpf)|^+TTAA6wQ_43^)^ zE0!MJ$wznFI|k8Uc~AYsw`pT9uK#tMH*Vn%#rwUCO*B>C_$WDKL%XdD@UF3zhR) z8Cp?{J5qZVZxo}bQmM?%&FP+c)t8G4j->YW@v~;P~9KX1I#i&pS551_kczoqVM=`jr`{lQC*rpEvmDz z?0-Y}?)4unvh38-Pgyt7cCWkBdGOd5oRk)mk+LwKjFoaJ74)=#bl6`mX953YsxsQN zS_K|$4!d6{`s{L!t*j#QR;{){_4d5h z$J$0gB*6E^+^GFt#4FmsQVc@B>j_`TJ;ZY+)!TY7)K@dgczI&^<^~D#)>R^Rg790o zGovs|lWDX`GdEf*z00aaw+CthN@w5b4@e1R9VYisT)2sXmXGu=Y{k>_49K{S0-fXu zYx?I2BD0qmU}Rw-8yM^j2THF}QpN$pSBQPkJI{c2<0y56O(KFBKP?j=zXoaf zO3kO9qkf0_?e+G$Gw%DSJS%hsz(P4Nnb-JNb*={aOX z4ZGXqZrkcI3n+zJ4{IU{TjWR9`X%|Y$y=a^LK|UfKT!=mHI}6kcHp^nY63GFf6kxI zMSjBk8GkBn!~t~(J!slUBF))LX_Ijbb}?1&xAT22#p3Vm9c*+6Xv1!2qc=#DfqCQO z+3AhO8+Vk|7oFQv_6q%p@-a)^r5TPfJH{A|N10JgnR3({D9fzh*&%C6VN+Yr;+s>m z)|Nz{z58l(E1)JbEsHT5ZxS<1Ka;e%h#8uO2a+;FW%wl{K<{u-L^{K0?70v5spuSi zl4~Xn7m9gt_pyr_9gN(&8QFTMOUFdmA4Hhap4e7XKORiYQ_(s4JO)e&l=hVjNsMCRHaOZtFH^k;s_F~%8{vWe zk}p`K+Hdrq@|BfBmqU3bT`W^w4%t(>Se#=Y+bHgC8?<}6*?MxLw!Xf)v9@yU=GE55 zt?O$mPh4*`XZi{sc^$Fo4`vlvzQ@9atnrO8*`oJ0+T-zXs#P6A&oP%M=5k-R{wOtaAo4ez4?o&;~Q1X)=gQJO?|LybHh z?C&t-uiv_QRSAy*y_MhF9Y3KUKBHe{$W}XVxJxp`4OTTIE_q*t_!9I;G?#crcw}v3 z<*8dw+=!l~-&WOc`G7a_acpWYGkB8C{8MCmJ~H7`T9v>?%jVGjRnkn!RIzO@N6&C3 z!pvf#mCD^DLesswK}N&?A#g;cj9Jefz3`zk;q3EE)=8lk4svU#)o`I zhY&7YP{vS)!rpt`t=_i6tTHetu56rRJdj{f|1P1Whx8wd+*T|Uc;m|u&fD!ihbl7q zNE!(5u~}nvI^7S@788}SJKj;|L5J+{V2=cmLqtS>j!e?TBc^3TO?pmCBy5yfhF_Rz zh2Q9Tm}Zg$3A?tP(Z=oJV1F;N58oc{$>yzRseZRJ_I7{bF}r;dIavW5%0&J(@2kLm zF3GuG$8&)}TF1W8-DI2%7O$#x#2CLFM zc`4)qQ_GRWtC=C?1}a;A22(LGp<(u1DIeXeJ<-yE-&rdWWvJOGm?C)2;6>>#xUlFC zDxSHNfvp$rL}S~h!{KH8eSZ%o^4fR)G1AfPz8uW}QF9-He9ibM6`)6BCAl;@NDNED znG)CJkj!h}L4UvjYSl>bS;bV8N+mg1ZN(;o=wA0MxsZ1Eci1&sTsW^Dj|Tnj98tqI zsq>J)ws8cZo||RGz(R%{&ki02)W$)1Ii8w^a^Fh}01hxNz?hfQM~C_HX!mbRd+PMt zw+LMHq;^aPUf{v7#2(;>teJP&dnGTT<@(-hI#Tq0BA( za&Dv+Kp9q-vsl_bL8(%gW4TlI%e_%|zcbj_YwvW&+8VPGRKHAnhbdu*khMYQD>j;~ z<=U;Q>(5HtlPjz1%XMap6(zPJV?;(PH{61aN&1Lyq*8p)Gh%f{m$7(r7cRVWM`0xHt#sCBFXObn-5ZUy zkJj=ouP%B_y^){T-c-*xA_U&p-h5j}X9#h^h)G`6yQL;g25*1R>6+h(JbKy}Pm`mz zgndZy+^x~(@}{w%`h$CgFBMqzu8P6YdyOB&_jN@u(k+P zvu`43PosS&e(hTGI{#QQ%P&7G}nUsJY;xp^=$KVvC9e z7EM?YpOMJooQRJ8{;rZ^@mOLub8c*O@8jI*FE@8KezK;hhU3#241*aD28#VjP{uQgUzZmzG~xIP0XC|rlDD~;Cmwbsn^6F09C<$SEqd8PfN zod0`JM}PItQRjc>3k!7quToy9R?F0{xKJrnUONBxV*IdGaFA3NXR!4Q!SI4Ux^%uYw=h?(%#{@nnlq%&s2$TC zD9tIc_KX_25q<85+?dZr*Dk+*?_THqxm>TWhTGYJXPy}x@lYhw-jHW=Ilc2;JnAvs zOX+PNYb<>1elpJg&yDUpn0FA5S1XlN{;w>|6aUXw=1cPxeg1!;{L=Z~7w3nxuJhg8 zNEx)za96RB<+|wEXCtNLc;AJs(fRGj6C9fV=Pz{ckB99G$ieyn&5o=z8&>7^L5FoB z^F(g6)9vm>rQBP)TXzQ0=1x0$Hqu?k%1*kVw6zP{n}yt4b%7gWKPoa=RZh(!SmZA)wUgtwv>GzMStwVs5>N_~Bi z5*FS5VE^_VJ~@664es@$z5U_dVALJWMYrgLzBx{>z8UsL&%7nqpyO!$@#tbM*Y0eV z6t7;0$oTJcZAF4wvrd*FrxEHz*6z@D*8fs&d+ee820M-AVAzO8u@BJ$^h?@9lwLA| z+|0XOR~un-e`M7h_589#5bYROZ#IhM`7#gGo*T?X5=GUu6$i?+M>$n&jc z*xocrprbp3;dpC68Tz*F!Pfqejx%e_UCf<#GMmBw0Y%giWoR&xl(>i2kk*&So z-x;(!-Hr);iVHp`zAZ}F?C({GP-y#{JGr3|D$r9RVuLJPDJR7UnC(@>EgvC>6?u@_bd{Uz-6h?f);r zPn7VZE4H+*w^nOcqno$tiXtMRid<56_4A~uo0E@9OVK;_m8>r*p3mi?c#WV!HKPj8 zN`Gt4mV4PAZR=7mkLRKmZ2*J5IhxA>eG;VlybTFjC?BNyZmRKi=}WbH)WCuXbM@WVokxzFgXJ_0LT@53{+`rC#gVwTRTXZ5`mr>lssp z0y`U}D&$N-B)yb@u0-@qkF*Xob-km{nU|QlH&Ty>@VLaVd zN>;m1mRszNx!{co_@n-Fv96*FzX7d_YC|zLw7wv*lnzrOfqwHq&#=9( zlp;OHr==DajYQwkC>mO_eu|R}2AUF{A{~y7Ywsz|j;7<4)ymUXv_5?dXGpY78W6)g zPZXY0ip5q}z4L||K6$l1)kGfXwKl7!meXaQbR5T#5O5+hU@*UEM$kRH&E&5}*fsjo zz24}~Y~H@YsO;+Deab}8rpjQb0YzFAF|B?ucTdrmK8I%?r9ME$_VqekNaYr~TRb}& zq)!Ljb9$Z*-mGrQaL$ z%sSov0pW-i!DI4+G|%?v8Tm?cr`GySAvEqar{#je^negg9SJG9EoB%f-XJx3Pcc$& zv$xY5Ym1J-oQNfa5>-4?owXJ(`HH>q#c(_|Eo!4hBOwrr=rwA{ENhLpO^LYq%o&XK zx9&KO&y%r2qvX_ITQ=4>Z%|P466#9z)Agr5dNE$i+^Ia(E+6*+M9~Zrw;v@gS#(N&VI{WTN5J zRMfFUha_d5B9vIr-n^PbUXl`ZPf^FXyQeJYnc}P>8zuL~davQVS4xUFfJmMpbq(E$TT?T1KXSejbgZ+_O z7VQi?6J7s8iG!Z{!oE+#ZA}@Cw*FXL3X`PE0y?TxZlr(%ZM>IJ<#iD z+EPr`-eJ3(t@n0+f4i*<(F}7U=|%%BWoS=Vz@|Nu)F*vvv)2!^^VH&dBmr^;zmyii zn1FpEK{B%}i$({Ely@l{oKqt!zUe#But_X2*xK43j*JgNA866Q9CY@##;h7q6_UHX z&VHLbErZ-Xm2kXwr>BO{Wd@am(5X20n69+ur?>X~K0$R)$JBk%daujdokIoz#1xD) zwGI_YX)!;z)1zEOozKA9m~jdX6nmMea-l=LGD}45p_&?<%T*}t(-CS7Wzi)R?1(A! zZ0P$=L}!DDtQ5nH`3y1FQM}tT%&K2$o}{6+_jQ>eLmW9b_dNM{Xs$^UI5e2FhNJ@90!8eX@Ykn$=Qvw9aEmaIdXheRH|Bahn`o;$^Y=x9K1|jN&Ff zqe7yD$WMzBO%2;l_ZyIC*6Pf8@ipq~QN@PC5v%)}Xa*yZ@STC)o=NG@tf|uvG)Ynp zzLI+#BGMsuHWOl1PeX{cdb{u~T0+h^in`lWLrCo!I~p`f=jtj`^I%Ri1=a)zUrrn; z!M$&!QO>+iaiIv6{Sm(wv;gz!{-A%J=3*@cA#&MwxHy4gim{dlM2aNDwP(u8aUvL! zl`KEDv}UZj5;oFpq4n14wY8{ry%{xbTyL&WM#LI*F3i#KV4XQ;1l#mF>@m}DOFw5~5UTE`Zx?TvC~_EFSotCvX^whTKRazN@WCYn}T z?zHMPEe~`@(;6kyPN|tzGdtk2Oisp8xuxOlcE9(*wu84KvuWOv)gU}K29&X!wf;#8 z6&3W2WCz(J2fE;ap2_L*PuuO$9YPUrm?YAjcHxwRyg*n%y)WB|R$$4F>*tgTxW!tD zNP6qU<;hX5H=iDF%fw+5o0d7{NI&QqyGm<=`nTy#ZC_DGdNKCWz^FyjTjaZ^g1M?~ zT0kL%f3?HEZ{I1%hT-+-Inkr!YYSxJ?)GiPt|6Q|noKx1Q16d=S7?v(rk-yOp?A-D znpsDtP>dp7Iu)cn(rR~5f9~`&wUO=A>u(b_x>_VM!D;!lrF%FWDP~Y&`abP#>Ywh` z{#bk-#Pc~LBqOWD(YK_C_wKe?LnoZwlywpzNLkvEl_NP%j?C!As^Lu8ViYQ~c|#cO zyY1eNo+>NvIbE}PixpHwc;rCm^L08N#neUn>0LHI6wBP}?(A4h=$KHP+=)+#=S54f zOVF~R+o#vd&^aQ0F>5pyNTU)9l&us6g=<=8pv=LxR$dveZM`qj#z(qTu5C9SwV{q_ zGK_K3U~T0&?cQKzT3k;&f1UqJG~0LYx!dIzxYSe$+9;t>+vEL(P<2)7>(>XQa*U>P zViRfYU~H>STjaI*js2e4QPn`Zy?$43*Q7&`gKJxD<<=-7`@+7N-4*uTj@`e}_#JHH$rD1O9>fiBHqR3st*rA>EOIO~$(u-CM6ievZlZ0s_`6=KK_ z!XieGwA<}!BbEdsg@T4$V?2tAbIMB4rYD6g?Vdjk_UN>j$|#OlEs&!I>g!!k&TIb` zvn4XC6#Ak~>Bc4_jUDXzpw)t@gaGu4$$_D3fi_IUw&v-hgte&03;;(a0RJWGLuRoMQW} z{hhY;wo$lM3C;fP{q}8ghV*%QIr82qLfbiDWvsnRkx^&i>Sb%mD&oZq;c&F3%^O8f zo5MBs(f$pAz?wZFpXCs{_Lyj2MwOFuu}L(q#e01UH9!iCo%x6Xwpj znI4hB!7S~_yg(M*K2<3Dew1gugkImHk~?A+h*{~J_S{c#kz-p|+0Q*kV;Y~0rqIS< z$bP;KO^*eQCr*0)n3|{rNIN^Zm}3kKO190$`rwWBSP1cK^E};JwV0mO6Qj}aW!fh@ zFs>%IR3>;0PbDk&wBeYOYzr~@oZg^Ne`Rowtkyhjhja!<6T0C!Gwj(>F3zqRsBt56 zJQ%PNE?>|oA4`ZjJYk&5hIWTy&4JQMC6W}8D`0AueQe6al{xpY&z3yfxtOOl36D9u z^@Ac|?KD1+L1yS+tEa0VYjzcE@|WVV7qCl4Mx41glGIV#n1GF=bO-(RE(NA`4sujq znhTIw&={@2S_6hzG(gb{CT_cY&TOX?O;Jp_OInCd)1l3Gzi*6KZSFEDY?E(cQ>kR# zuDAknI0uNLDd>(o@EQh5f-AfDk%p|=Z(O;FAd(1CVzNd+{r#=>`dugmf4 zvghKnYFzHIe?|#l@{GHcmFA*)d!!`OO>2;_8Cg?yp*Wjw>nL6)L4ndlX}&f}9Qht- zw+S54H;sc|`-4dfRI9i$H18*evCs{d~~}< zSGV-WBQ2NomZzO#z4887ba6L$e0^%e?ho!M*NZYVxjjjT2zR5@4g&n-)Y+lxa(`L{_e?J&SH8we>;f*wDtj z^&Ib!cS=IIcc@j)oq<-~_bQ^{*a)@x(eC^)=#nPrTD&ptAa?{PfaE~DFV3s;n5LJ|}c>+UeV z?)3I}3sO&NT5VXkiL=AT*|&Pbt^HlH1GaSLDrAZfjgZDpPvjUljz-5^?Y~Q2&L~>b z>Y~Du6d!@Fom4Y49Jz&bL)jqeVREU}i z4En5JacOBmUzjygf|pDx?T9rbVn|h7`r4D|fk9$DW(^~k@xTnGrGhUjITn1cO@Pps za&gR(Zu8Ko4};-mPwgS`*LX0C%=;qWWui3S=-zk({tSY9h9g z@$bB51S{okTO1ElY1?#&FPDjqj>QGfUfrtdpzeZl9#9HX?QA>d5I? zO2yT>NnVn%^}L5nWr}Oh3NU457McOla>>xt*qfgNzJ1c7AE`i z*^#Hx@aB>;ZaPW``| z>r(C+Iq>v(!GmJpvaDKvQe@|CIrp?hf3SIJm%L&m_s35UjGrFB<#!q6PJw|ot z=?@fD(Kh0aF>7=8L{s!065oq)iXqk73k`EtMKGwHPoh`}b9E(5qY*m7jqD;v=-RVd zd1bF3ZT4FVU&9klS$BaF|ybII>Tgak`h=1Y`QEF>6FDSd+9(Hyp?}T)1PGUM>7rb^U>VzuKaJj8d z-1HgJz72-3G}bC4PEz$b9kX{H8Ya%ZGHrT9h>|amrDd2@h^FsSNu(~AnTcyv;?hpn!;GAZ{a;# z5206KeGuC4(YiRN@30@99fnp{@O3DrABMbvoJ8R|-91V;=#Ndn+;>B1)0edNK8K04 z;^gHWd5Vsf@BRpCVw>8lZz80|t;6cZE=5*oKe68VJQ<8+>{4j@?qFwsmv=QKX$C{8 zcRU#SX$?jdfDm&(H{HH{n+TfXwmmab2O_=r@d%>SZp)XM=Zp)LRWrTGa#og_fTuVO zg7MEvdU9^Fdoa)-5$~6a>x$*71pG?sMhF4DUB#G+cFt2G zl$Lpk98am!8!H{^a$9P{zAxrX*NTBMd(>{Dbu}H(yK^woIwCL}$a7o!$8^nY7HUJX-}|fu>T{967qaD3p-WDU%?BcR@i>85)l1Qdb$YmtJt;p$qTi)RjIhF!s zMxsZhIv?}N^uP6m+B=lW+ScktZ)BWG>?j^=ZM8>QGn3mMl|e`m400@Rh9%jkG>Y*nV+won^mz}p z%wz3HUJ3WuGz#Lvrqhd37=Kf&G0o15BLP20X0)GPQ|S%`m1g2O`;3oSRxKHV&Pxqg z&qTObR2;cz(>Xrk;El@aNn#jyM+PRLyO;$GVB(Zs9eCC= z5evg!4CRT^Q9!%-R8nHb@eCxr}b1|ht|1+qy1erGISSX=-5oB+?dXa>QyVW zXhWJWH5(sb!VG2F;J#`)tG%?nt9INx9V5CkP~R)NyJM?jxE;_$j%~?ICK>BgcZ0#pg0JVsHUhT;N1e12f%ApB3CFfV?}o|8^Cn0V zDAx|2=QE+Bbd9d-O^>`nxzRqQDt6=Bj079Uz5YH4gZ;jiqoVjahcdCa7FszYCFwxw zfKwOcs0fPzb`|luI5kIyHaEN4%=hC#L^+$3=Ca$CB+->^FNoF;L?yanjnEg1k6y=N zJJI&A9l*mTrL{X^t&uovJdE=-%{asP7*q=bh4oKPU;u-CW`p#_RU|+XkrGmAKhO zyEn(Sew4;zbOe820!Zl5ww@mC)5$60pf4L6;krNI05Ir*RCiS$2IHU*DSHRVTQQoH zL)WZ%dl1)&dp6w+ovArZcQPRF9jiC4&DyjjoIlu6X-f|?^xC=D5QfWeIAhY2?x@qz zP4q|;^!^^XkU2L(Vn3Q^9otwq3}GpPB}-R%A*EaZ9!t%=qXwmo!WuyBoUsW+-S2d@ zTSQlGiU*-cP<3~Iua!hs}3BZC)MDx~7sXv5kehjGtD=HZh``eEx6VO>`7fhqH$ zAg2osNPHxUqX{cOQ57koiTyr>MReeu9F&s$ zAeNSfR&_3_xwy=F*Em$Cq16RA=s4K0i>Wt6X<`oMt@GKuEn*EHIYoJvZxu4cf($ zOPM~&2@#5Ui5-hyL|aULOv=x@)8Ru?>OuQ^6Z1aY+azymOlZ_6QB3NaDad2aW5?qT zTvWy+!BHNInrXrWEf)1D0a2XYX5{8X7Nx$^Y@4~oj6ItvDEu@f{gn%TG$kQPTazaJ zg5p~g^U}v;dPa$`J}HyVY#cT5B!^K{tY~3cT!_!%66u&G2(fC9n`*OVc-L-U?g$UK zpE=}a(_T0<%HXmU8T8wYIpFdShsL)UL|gSB5^*&#Sq43a=ScHtv$5S9yV-Be68qbn zH$^Gd_VV^%g~{8!zBO(g&C2xMiQAMK6{a|XU5hJPA-+0*&^>)@Zv@^$>xSWpv~Bq% zx0KGTLXIGtdhSa#B;G0s@y3TilcB=l`WFuG>sl9x32UR93A-0{XDN+vhk;4K79zG- zR^3n;GqgO;V-)j4hY@y#)&PG%fWN2*&m!--vvDb!poY)Ly>}ZajRM}geJ`!ftpo~~ z7?g=;)&T#&&+#DXJo1(s&6rcRF*Hi%%`9^v*V@wF2VECnSGH|E9njii%ILO%b^ieS z$S`uu~QCiMhn~g=IaJHj_ zg*bt2Z#y9bboHq-(oKSDbas9@J75F@YR!TZ0m%AuIm&#r#mk9C)erXnq>aT9rN43r z%Hw%jsGa9W=IM!~S(DwSbJ$1wit+AB!cN-!(MO@D%W7^g=?vRIuQ$hKp?383FhWc= zfejBc<#o!40)fVWI28iI^=n8lL&)RWbQE%;$l{i!s9X^2@DydMB=dw`Nv}JCwd9UoOP(>_ zV?BXy$8!Kka`EZ9LkC;?5@2+rTKJX`zB$SGP}AA7 zhBHr!oqJ9`(6<4P`Hmdx)^l7*5VK51&R?m>LE4nI%Pc5N`i6ahUMQ_52}7Ps&*TI7yB@wv>N zhT0~^LbPPDIwaN@tM#L4^5T*4^+3vVOGhQ>jkQ zx*hbprjO20W5pvJW4AlJ&6I=nzO;NxW7nM2Af`NKleN{4!qrKdI|qrzT;wu`Yb7BJ zC`R$YnI@E+YdcWh4zZ|{=jOZt$67epesES-WbEiulv^Gr9QpI;npgD@-g${_IxY-QK2@t3YiQ zdz&Orf(bP;kvBPJXk(wTBl)!D>vQjEinLc6LX5&3zTa^yRo5L34%#~sDH}iv9iQHE zbBWI*t+vtuu9&J#5QkHm8PjXdOBU9FrSp6YlJT!IQuW_D=tDPgh^45 zX)12SS=;h^_6&*F(-p%(uuGJR2Q)xRo;3Cw12z3D1Qo)7x?4(C$J$BQ0UEI8gFA^2&%pXd=_R)YK{I zz>_Wj7E_cA?j5H))+^Ks|LjNzb_$a$_4%CFdxlzM2DKDQi`0AfF>uN0yhn zL{$m~-e$w2OSMATM$ri=0;0`sUkN1ZTa6KfE#VGc7+bk)rflDkM~Rf1Kq7@{1hzi5 zDLtLrL9@wPMD8d6RXluWoLEfZLhG54NQy1a6LED{+8B%rAVyk|R6&816KGtBxRF57V=TzGar*KQ5X$gwvWPr$?xf8z&X|hZXJH77R zu1mrYuFF#xaJ1j%ge+E@<=XO|E0ao_>yDpPr}i;HG|M)q27m^#w%sU$bl=!os)ty@ z`M`A6$JcfIFi8$+wE(k&yCX4PlM3iq1<4e>Q&QJe`MIxTgqT~pijmo zmB`~b9T)pktAp$z&J54niZ7$M`NF#O$QAW+^%ht&aE4ASJ;`b>E(OU?M@_dv=6s_o zzBw?c#FL|yS7!#(#^lJ;1_2?VQeuHQi8XDK1}RCT?zp4&lbH)Rc!DnFL~nz8?E`&} zrkKh22CpiGl%_HMRVfm9z=`=HR$?{!@O|;ISvSj@lIB)aJI5*}PTRPayYc_Pgw(Ms~p4Cl}FbZOs?buV$Le`=oP&4YpvY99KCBd2)wJ4vs$ zENbtMVAaDM(;gX_sH3w93@m{Znp;=<2s&KTK?u}|wVXXz>ciw-+gi_g=XEbFM%UUy zg)O=>&Eyx|>6y~9;P$g8HFPn#;l7RWi8&3aI@&;{1W3v}u+`X%?x0Ku>!$JQic4aO zl5JK+rqpH3oV0FtjC7iXN@1&FX^x6pt=Vgg6uxiJh@-RmX0Fa)*XVDtdVlPq=t!Ni zXvWxwx}4p)UB`D^Q9g*&~=%;{l#kPbmSj3tN6J zmWnB-ROGrk_61t7>1%#uBzw_?2PJEQ>p;WykeHaWGfj?~e|QY585PTXQ?b=D>0XK& zS&)OQ>nTo@2xt|`c!`w$Ga`|wL`D#wFuRd=^MvH5CSI$NIsHhEld+DLb9Fgftye6* z5WB!Z&c-CCAnQ;(Ch2<>D0HHZJwg`<*__F%HM!QIx_tmge>7w=w*xkm_0X?GEFW~&q+8_H;M!4^dr zF=5OsJMG3o&1V$Op^2-1b%8?#V{aTPXNs#YF|n)cPw2`{Ecf1e5q+RU$kBKhYI~RW1grX>se)AqeO7wD&sd8u*S&^)xt>TKn$6$CGm9ju_k~p~}oK zXJ^RQLBwZZD8V^OJ-W#`x(O5Gtj^AGB5l`)s8RLONyw#-ZQU7|D1{kB`=9Lma!K<8 zx;9%o&M-irqL}*!e8ZyphRh5t6Zp!i+}*B!pIHX!(-4xlZ}RzR=(8hnrub=Jeo)nc z2~$46M{l+}28kZsJYj5p+(xcygc^0rE`p$XTYM&%Ejbvv?A#pY{X_mxf8ad^aM79pOL1#X=w(R)E)%xWUOb{?VON>6so_jYPf2n(i?}PT)mF5!7G1v) zJyly>tzBP#I$FN5N?$}bS8qJATDz8y)^F&)Tkl$LU0;uGwpOpLtgpA4QT^#$?dHv^ zD~($HYAd>0dx~yOdRL=$b3JHg4Q} zdUfTAE9sg?CBH*T%l z$>(k?t3jTQ-nnwUnU7j4dZ5<3Zmzc0*3<;l*elo6j9couPN^ zck|Zj%^Pd2xrjli22lWCU0Hi)q*fq+{rp=sJCK5|8sl2+dZR_}f;Hz9nrOMv(>HF> z7NORCwdnzc0M&|`t>so@edWnko_ea+tlhfS5_qqzt3h+Mt5>7zt%jO!ZT0DBt+o2( zN<+h8wRN+$vPw{D+*nJExN5SNSz=r#3Tiz`^l|I@Rf5E7>+^4^ zwGx#?K9$h;wI^0v8qh!!xu;gt#0YzqFd`<5ynaM|;RxetMPfIiYd4xJ%Y+sooW_mo zPqv<3%OO-0oE^#5>Nf~5bv2O{Js&j#f)e4aS-VzyqO}H;LGR4TCENLE?Pja7Lcgf* z6+J2fxXPfqzNXens8tOzNK{ierV)rZ8IQSJiV=tauN%Tq@1{1K?2LPNNR-jl8*4;? zxn^y>7U>zQf9oykz1q620Ht}X)@a;XRs2Rh=m|BOwOfh`1&kKTMkfslsO1PGYm9&5At93ekiSyr!VToJTI9xFc`T~Vm0w^X-U^T`#> zj`AKg$rXW#TAdz2;KMrfos7b72Lc!p3t)=VyNSeN60Sy-WK`bOj~!O zA1gjP11fgFhgZ0=u;e$36dvp2Qk){3BbBgwj~$@n64QY1;CxD`izCFoFn@-0P!l zfqU*&Vw27wS58ZWMAmUzpK~0koqHhhm;F)fY-wI1Bcn0bFrvi0JKCde(?BII)*I*i ztFu`h(${U0Yn1Pk@Gs&uH>=wClCh1=C22ZGEKf<*ZE*%V_0=4mvYNli30%>B=uvx{ zmPRwSPw$$}N~7Y_7CMOt((L)ZmXUWOW=`v0;?0DrhJI0EJ(3mHH(3`_vcbg(8 zZCjj39OQG4OI0GHWz95ZqsOQ^-Q(&FdWeBJzV|r4cU|slHEA0jx-Z)M#yuqW#>O6$ zkOQ9^N{%RIYRT=9XJ5#HpL88QZ_Jp$wczq7`1sL`f82C7v~1>*0pQkY@2km2K|_yaoS#lu@v*D8=B0p}rg%k8@mlM$B}gM= z+2JOH!Dh0l8b$F4q-&em>}S@c4=i=%pca{fC7Xka*eUa&8$EVsJl?x_;ljOp_vUW* z_vZ$~+ZRl_$A!n$gld$!M~7~(vzTu!xRio&xkoF#BuBf%) zM!AP}sAO61ptB`!q@1~IrA_b{j&s7J`WjcgD19233d4?d-9|2UiUoVAaE%;UeN5i_ z_{5wT&>@#*)-bKr*KSD_Q>6+!-bK(h0x4T&%r(|^k;6X$CJ)} zLD&?3XB6Go){2M?Y&)50UY*<3D4`mJ5X*MkGfXb^w3y9L4A=+_<2>YOgJZ(+GCiz*;-1u#P{ zPRE;eVSHQGohq!@J3p3fOx70QkySEa8?53a+?ywh69RYcI8^H137HRWqMEivxsLx zj%+^1?cOM%qOrIk<<1-#-1xJYkM5aVgnN=+Kv#F0ycGh-RZ0UJrg`@$OQ_rKBt&bd zq>esuL)pXnI2NVQB%)&PPEV=QgS|Tk7w+9TIIqBbe&_by&fJ~x?vBFF)W_q`ZhLE_ zq~h*{c4xD+Kia&oub5u{^5EW4C=^Q7N`?L{Rx1Vk*ZfQsi}MTfb-|6TR*VBSFpu2!p);J;W|SWx&^y%qjT zG==k}LQy?le4&WpCH!aL-va+s(qKaVFIE@I6(s@)|B4!3;{O-pXHxt(Y}HA#b&l_k zCwvDXcwv4%1^>l`V!7z!zf>+QRHmZB3%YXo`6G`1C(qwnt4GbD_5fOo->6MBlTVYA za5iNlEuAkco-dS@t#M^#ExNkWXkA}xvD^I`dFh`Z3u#UJf*Y+>at=q@Y)}nuXW5q4e5p=r(Uh0z5UvqE8{3T|0=tjTUT#9MULm2wWrC= zPkn0FZrq|r8;u*Q+S{#$UE_d5G#|}OtFAQm^sIJ1*WbYrji}jrQVn*KzEX;Iu1LX- zmFvcvSez?H(}|s@#s5la!O6opus*T7c_p8Ff(|!zqqVI&${M;&2LPjD?Lsvl6$_<8 z^i;2_?Bd$3we{7N+8n*P6iq9$$9oTWT)MhXIhxj(^m@@Rd}nX`HgLJC$8)y0+Yz;S zJWc#RO}2jWqGmur9&C2Hcjww;Ei*36=ENoJvc;6DOox%!D8{2GbYP7@b6)585GksW zdUQ>(U!{+1u-bUHyA#!(T#a^nTf>1pLPY0Cbvo}zKO`fV1g24rO|a28(icoxSE~75 z9QSfhG2y;siJD1SwJ7vUI($PHc~6E3!+v{z*r(hLZLOHhA$Esyc~@nGXk^XNz$FTz zx(hLAGPg#lZ-8So`8O@(4`!> zu*L}Q&nnBUnY4_uT(!1k&ZAB;e>Y=sWI9Miw#2!;Gt|P(502>XsWA9RPh?(G(MmIQ z3W6S~(ZIJJahCD;-hdv?nfje8O%0EcR2b#6*irYq_H#)b!S&_PJ69>|c5(?9&8E$W zPLB>Y$<3ocPP2D|=5+e#2wb~QcKaPQ+)6X5ESBau#pfwymXl+ZB+#Jufo?yVdD8x# zTc?W|d!wy8T~}&ztDTRCbMFquy}AC*Z0tmed&y$CQsO$v@6hT0?;MOjsDLojpo^)l z(q)f4(3bjJ-~BkZHQ1e0C&Z8u5miP1)u0qh zL*jE$ZAS`O`ggIDuf%Md3N~Hqu^?Y(t~ZvO6Wq0jCK#xlf%Kj&evc{ns#9x6hIzTn zwnwEhapu?L9W7C8Mx8^P@y71V(k?bOv?Lz`63OmB-!h(Mr;cwO`{xpc(YC5;>=hjsno>9!O72-)8#HIR*)+m)<9t4r2pXaUJ`G%w+JYK zzpYP!wDeJ*s}$)x-F$NHR-j^~5T8+w=yjXV;Y+eBrmol2XU=$~+Mux~uAJ0XrB!=fDT0sF*3^6sD>QJQx&pH^L%D;A>GtyOZa>IvGbqx5Vg&43p$M|@I>R!Nsq z+ZG;z8EO%wy`Fi#u}7u zIhgVpX{Ca!38Irr`;tek&#jo?UZTj;RVC;wg(-!m^WXbp!cUGbb>;@*b+Z+@bVtnm zvr~*!Tk)qeCxy*TVH8uA(>|@yY18QSJzpkKG?#Foz%E>aZ(bqLtAEOuiKp#;roy{E z9>y@`vkX#n&0t86UC~$iwX7a#hJG5$Wo2Q8G)PYs)x$23zCY|lH#M@%pzHplvitE# zH+^vrzsD5_$i)k`P{s}%7|q*&8r;<`TCm-$lxi}tXF{MTXv7r>U|UPmIxMy6ohfIj zX{|?DqaH!=eVMv&2W;nC5<#aZ<{dedkkf_{>jFkM=M)89P27LfT=L-EhidJlNa=T5 z&y3Vwt1NkMU)D>D?fnto{v@RfNCU`aY5=qg&qrc9bCgjItC?L97EL4FZBq;pPdd1> zIWs8YZBD-0%xC%hfjbpvR40uNeFx>1qUj3ao zF70tH)p`|r*FhbYRF-A+rtkCselx+1Ydt1&qLM(V@<|}5FGZm`GITe`i+o4FiQ3x}-7_9}W8z@!2xa^y{}ozwfStHG!1vFkg&+5{q9ipbu* zGVbbwJo|XTksZ-IImaYR7u%SFCtQJmlnk2wf=C!?QtH}8Rs!yjE?+*A@T)RCP*+vprt>iqJAQC>_=Hm=p zIO@P%t}LfqlT!TWXk{fj-gcL+RHLq3&R^HawMTzOQsiBq2kk0)-a62SQMUO^cAKn} zTvjq6L&+3W9s33Md{!eYRHNp~TH|VMV%hE&Lo4H?*+Y-!Yygi zO_Lj)50axJPL9q|a`c=@KE76a*UGh9*OIckV|lx2NTn&RtW%OHb*D6L$|_fnnkt+lyGoUuL*qbC$Z*%hl( zjF(p$(N*=@t2y?hvJduJjS^^;c+wfQ3W!f#S!rB}o}?7+<<%S4ILH3NJ8rG6tToyA zQnSv5t#d*}n$KzSmb^|v6FE%%Ub{k=P8P9*Vvk5%4)!u8$TyP@8-nwtUYG34)7o41cFOKvo+zkX|NMbnAGnXd;NsSsYPV#QKW)3)5l8SCoTDk^|w+>>2oC_f^;b@Am$?jg5VEvZrKoNu$o5D^g zG#=XAVsuRjo7UB>5?sAM0!P(mi{=pOZwq__KG-)2@h8wdB3!?YOl>ETvtYS z8x8qJ0PB0wN#*Wt3cT*%t~Oigv~CK5?Hg%zKa=PG6j#XOKRmv>1ZPk0&*Lhq%EvPWxdthsrajOLCw0a68ArUFx^_7ypiuUtvP}E!3o-;78~V_(3nF}Af7ly!qJPenO@7~MnP^Y^BNM5W@ny5`oPRr=~)XBi-z|48Q z$2zn~4g3SV)Qg|#a5f2T(tP0{DGB-}=iClKZ7zDM%bEYSju~aj)A0g=iw@KU1)!ipYM~)8#=qrM#!i1?g z@Kjf7M%vk!g3V@DQ1OV1{O4pycW7uk7&n(|nfwF&B|+U@ZE7g8jd$beZC2bq>|>iY zDGbv&T{N2R?-@`^dL|1aofsx2b9!~fcxXrsURMU1QjDYPwQHG-?NOZ^o71as0k}9P z$Tom;!@ z{yx#${!j-sI__?4sf%Y~yz8;fu@3xJtc8>_htmj2+Vk92BuBY6h5Lp1!csKT>ffdV zS87M4J3*+7A{R~J`5yT)Q;13qVzv8xezo5n=Q;y@=e?%7neLpjN~U)Y_`Kx-h2^Jb zNueW54CSr^>;2ZnyL2c=@*8X&4|e#Ql7+gsxgDF{^m(^;@6V~XQwZ&8Iju&~U3NS3 zlq_%Y*pV4qALBWQNEzkR3HroOKGNey(}}`1-E&JPM5tz@sR)lM@V54>nrqrPFX2va z&(MQF&d$)TUWe5b`O*=q_Q-eu&DjX97sgylR8JF_pS9sFD48KkG)GAcwv)*&Z(f+v#m8a;In(|91XfuU{@jGo-i( zbMP1X(290$d(GT`j`OV4ByM+!e=m?UTGs|@FJo_uaBowRn6TODZbdV9y7ygJ z-_0%!U{8Y69p(P6@#y93zq7ZTVx>@sW|U~HbhhYqIwwl~U0m2I(BI2xFxI;%!y|Xz z`+4+y_TQO5G@-IgXgh5}x9N;hZ;QywP>;-N#-<3wPP{)G#s4P4-_@5|Khr(f94Iqg zms$G2K+#xl>zUE)gI-pJm(?w%EvwONoUb*m#g{}UGj|{SbQWbg^J&w$w$fbj=kh?O zkh?xGSCl-}Qv`O8)aR``lGhp&@T@!EWj(qBEJ4=|#IZx$9NZ;}j-F(VgB z<6C8PEO&dlr<06T<(zV02)+%|)uiv^>Z>>%|-p7xA$hvyY*Z}Lc z$z&eMW)rA?QJVUf%U1vV(e4W`uQx# zd^#uAg->Ud}%qLt#j>JMOjBu4l6F^wyJh7=~oB zciM&TFf$=fifax=J@$=+k9!l)2U*n1Cp@WQ-t11RtjhrUf?lhj8OM-laB>9i$U{8S zzB-?CnO?c$f;sKHjNE3Ev$cF(7Q42*e(-rSwZ-;o{vFO(J9ZT!DfEmHh{ zzB>O>{Qt%Hxo}Q9m@Y;Jt-0tN-5Y#oFuWKw?hGkrs&=6@1*B&_Fu2q1_o+ier+_OP zqN!~EiQpVsG8?>SCesmF`7~OlJ2TL7Sm6bd;1a%VGoN*v8?E> z*jZ4DLRpCR+p@Vd%G8;fNvvKmt0zmQovzuhmUA)s+?9?4MYOO~q6sgaFBZ=is!_3W zu~5A@U-*J(YZQI1dip{xci~*ll;Q&0DyN6l83aA9u)Vj_-eQxNHdOltt40_fVzc>9 zZCC5eccnAZ!S9#v!*NXdsqG;w=TFz9j$2ao@YhyXC zKblbr^p)E6=GB&{?RlN$8=FXUu5F(HiB!q_?Odoo|NtYn>nSLW!7!3V=}{X}b7%X)=snfMKvt5ASi>F@2! z2x+9ngP!Z}?@GTTCVrezy+Kg|4E9I@umDgD+S`7~P$b+wuJE;zMg#K5p zE)-(=U%9NBUefy2*OOMM*hxAvh_|c|tvL@qA(ae6cWzp7;k@MMP*t z%C?2NSW&Thu~58NDjuySUSvISSM8NMl4dxD+D>z%%UybX2@US??Ms|iX~R`YU~9LyPDP}HpAs{L0Ja`pSK>{6M~)q5Nsmgk z7xP+*dzdrZq=Dkn^IY1=)E;oK-?G!U$j~QdbO=*4U#{BT>DXHJI;eH6{Y;m%Tvv?1 z-S_R6W7eLm9M{o`-^!3xig!j4+N{-|ON5wmOhewdag*-Wpo3K#S2p;3S*y9R;WXyd z9Vcq+A9Y@s47PqQjcC>DCLHNkh#%;=?ZJVH^p$m!u8hqJ-9-ZRHdl`Ck>JBhD{D9C9wzl$k;+*NI(+XNjdoT|lB;6(^g*03 zs9iYkLfQHqtaU{szDz)nMxrzO{JOKe@UwiiI#r(^n}_I_&-RY8yyl{si6TnWlYvSj znJ6RQ4?+W~E>v3loRUPes?kL~5%rGSRA@=!y}a}pclW2c48R0*3$waF|2ci7#ce*A zB|*fV9J124kVW0$a4?*cO726xq|`LC<);QAVxViYsc~jjU;4ahZ%Ngy(JqzAR+PqK zP-yCgV%Vl$azIb#jNaJO7tXP{X2^>Frv2)sGI_egK6l$Q_M7P^4PHn7hU2E*7t1S3 zTUC#!k*-OEo#!@M-ZS5-y@nDBR7(;m_oxg#or@yW@<}O)_zbuRA8nut&m*zkN#W9& zLfZxxhSbdjbp0Vpk)!vYInF*U5xzG}5Pm%dxxJwaug14q> z(@$<^(@Pw<-GOHx*;xTI#>i*R2Dm>vtDr$6#g?WIJNEdH zAC)!f)3qUc{EXz6+8bi1f|gniS+U!n1yf?9_%^FB0m`I)>K! z3Z2U#Jmn+#LQ^Y?E?%RS54=X_A%hJ_FJN2u+Mb!!MTQ7>$zmn;&i=qqAVEmUMhdF! zk1e}65>1$k*&~ja5RE~JFu|MnG9q`8t5)_|80*CI!BBQIk<4d>XW)XJb~GIqQKe&flN=EjY>(nmMs*q{99oCBW5K;9E&+b8a>$ z%|mBLCyuTn9IRv(w;NwpK3HvzqtK>eE-jCx82!&faiZH zpQal3{}hS~FZq97j30AP5my-?%<@iR6c&s3$ek~gN)zU9b0lrV)s07eiWH4aq6nGR z_PVZ^4?~v`6;}>rvQV`ZsyAdvmfYOBt_{~|xv~26+b2mj&*d^*1Ub2#N!%`G_7gcr zj6pV5T8rl&nR$}TkDEGGl~v#w)MoLB6g8lR$|LDSbG~KII$+p3^b$tJKcRO`t=ED5 zs0QNwcTQhS=D9^UjVG$zT(KoW%we!Qy-ue+ZVRN$U#Va+K$6r{)z_6c)CLfV+-(kM zL>#pk(VbX{YtuFINc*K%_t_pbfl2ow)kzwaEiq7INiJ?vY1TGP*Xu>=w<|ef@e=mt z)lxLnL{KGstG9FQEnr2Gwox4cjo&UVZ&yRv5IFd4 z(=;jy)7oTwVB3yoL0+q^H?A0~`=N&(D#pH{@^h`G`l1l~qE^4Lx~|$EI$zY&Q&_u8 zl{oCpkr&xlq8*8>Yvs)?(%wt+-kbC(IC#Sx&6e&ZRyrN|m7@*qlUpN~oc7_&uoIcy zVqML%xesZ#wlc`Z;t3_E3ivW4;?+MytVPpWBOiVwA1yLxr~%Ib|W(gloMGvDc9w992n@%9>Bx|mCMI)6(z|0w5_VHF+k1EMy&6&PI~%}Mdd+GV zTVMT7UR38-)=rf~*ac+oAdyb0>V!qm`>dPW`2->&oC}eqpdjhRiHIa|L-HuP ztYwZK)(MsOp1l;=ZFStc`>qrENSqGm!P0w z`&~BZeIWAUxt#ly$DQoGlzWbM7>?!J4MvJIxd@H%&0n;}c!3~CKIu_DD$?(UFa1qr zf-QxEKeVwJGLqPnnju9DH2vzZlKFx>^#}by|6rHOV<}x>`rI_qv8=Or30IxS!+A62 zEWIs;pyyry<={c487PS9FQQ0-?e8vC7T$YFze6wlZhJ>PAe%BtG-^?VNUu|7`348> zHuxg38F{IGp?;OTW|pYEps_&tDx!CRl~32y59oG*5C!zYOG&Sn1NR%dqucyq@(#DI zH*elpxxT)!a-ADiTc5x2L~DJc*`ksRH`i~h=A#+rnP6%~kKtC6G*HMt4QfjdT1Bpp6hj_mVoMDIw$KK^rLi@8A~h~W15TAR1e#I7GPk0%vQs1)?1Cu zPm#Zv;A9tyKW`AOq)YgvB@RLn8R!Idg&zgbdtL4Ew$WvmD;Mc99UYF!f8o9|2TY-~ zB&Ak?_$~aJgvDi1UoAmjgFzj;kjT;sODaxGf`WS{A5A~Se_S+|1L;*hxzfB`xc|1o z{C$eD$gdZpw~gM@pU$UJM$$Ke-+U~6Z8mv9$p#wzJeOpe^_BG3H}TNjeSF!F+^9NY zh45k$DijGshJnCIKu2iJCOM z{IS%j{XrozW*4vgrY;ThF(A9=x;vxp@u1~4gruj~Wkw*F9(7$licad1DCPOb-!^*e zyk3-`_fis}3iRWagCUS$i%yc8=7)*W2+TC9hqneWHIh1=@cnlkg8?kI_RKFr{PK62 zxS*eq3t$o1++coA!WHn6<8X)hIR=-QNcP8yK`fxt8RaNIW;2ZWi8GE_IB<)hhg5bk zKM8EJ7bCI>8OQuEQHzdo6#u|90?^}8$_bdsfB!L<3g2UtBg4FpIm>iM+Q>_+)`acWh(o6Y2FUAkn|6#PADzT^d@t)Y@l3}a!WtY`c z(ZzoX7w4BSt0yz7#-^WgO3hmz&<`Ki-Int(otdXru9r(X7Ios`9`Nh{EcYZI*DK&N zQu1!E&GmacaOp(c>C{p`YSnaVy4kAVdcr0M>AyB^uC82PpJ@+o>o5(gB$4_v_g31Q zQ#+e-BM(yAY6wWYS66P~Ak_F)zqdYM`^W|_DFT=KP|n7-MvCdiYGc~(_bBGYgW^D3HAJjfR?-gx(be6$ zl%r%rO~vtYUXQpUUhYYQV>O925^l|&dP3K?R#kKcaHJ@5~u1XU2$aL!GVp7KKuX9OT zSPhFnRFcU^|RWdI|cYB@7Z|g*R`X7)CFvllt`cd%JO_vsuAhQ$3 zAo(qUR!%ud8ISrIw{0?X8IghlzL&%n7ciYCk9qY>FrO4>v&rb3U#Cx}xYJ{amX%^D zmf}L&eMZ?)gT~~%#H1jAk5qQGalIj;SvYO0@R=00NCV5tjj(TW*2i;koWu+}nf#>; z{snMf#*N9WJAmP6Jlxvdn?d_W`m%jD;nWcuesR_ZjR-vE{0A8mNaDvrg=cFX7Z+~g zptSlfZ_o|Y7qtD+g;KIVzQr&)4a5*pB3R3?#!$rj@8enDn|O)$7<`QE=?cN zv5sOwr?q&eCBJ|Z_2KW?##?UH)^Dx0qH-?hoqYA&r`c$)^bOLo+F=-X zQ?5<*eBg&!eBaRJWZ#fEk<3TEbg8q>pv%QgcXd8zT3U2U8r%avRFkM(OnC0a)bTYL z%KFbF*q->5OOnTfevTxAl;bMLC5ji~s7WyQ3C^4dXfw~8u=mB_#L?#LQ5m}@Aq1O6 zIx!8vR8M!tBaJ4^&xEvrhcr$iE9mFNIAD=XE(s?sj-nCs6VeJutl5;RD)FBqvULAo z=Fg_-oDU#H)+8gv-FKeWMulNwmZN+9i<0JgGKZe^iH6Qlhb{ww7s%81pj>_08a^0z zM{C{w7*tYUy>^)AAs&5HB1@xZdV7)^!EP@p-E6w6x12xkSrO)431+MhGB#kf+o5r_ zwzd{MD;8~I#bi23leKzp+*;2kdN=Z!-VCyU)lf6es(eJ5!Q0!jI^_afnqvJr8`myI z5ds0!GX~wakHtkuAjEVKHX2dLyMNo1l0RAi3zH;m2Obwaa2MeV=wY=Kx!T?8_U=-3 zwB7dot9nyDr( zg0+kBb&eN}CeN{g<;~^NggAXSJ0Lt4JLiUUI$4;V(bQ#fPm_7$K{}LOdG%BKyI%lz z_sR4BPk#Pm@(ZAksQ8?r0{w)qRVF5 z;~ZU9!)fqz>vMZ&hsV*^tx1wB6=3ztyUQ(mTn)4TjK0UMy~k*x+CW@WnDTXd%0lRA z7Y`MByckWN-%%)u&hOA@=XcE6k!hTodSCASQu9{r-}$@Al%b5h$Me(zP3VZAHjJ?R2}4QVfP&rOu4aO?S>MDtA;!1?9FS6?em) zzUNA))OmsSL^&F;TX>Uh#iARmJf?9s4n0s2>m`xzU@Bl5MgJAc;p{6Ui_;o$!>$! z7TKY<*dy@fS*nk54DnmfuqR8;ZG+0DV}m7I+M2a~{n@-^pV>!Q=*)#zOMZvb{q#dU z+`jBh@G2wf(sB+)VJ7rjzP;INprzxKa_x{yX8T{kr@~$(6&W%)+OD-ZH_@gE+lMx+ z$L<$BvhDhNV5IVI$83>#+N67GhhE|r+@;8wD8Guq(=B$v|E$c97>zs~`on{v6*fIW z`~!5!wvbciKiOrYkn6W6R^K-lOGtL1xQy~`g<3~)KYrN1+hOvh$@^8&#!IjNX}Yqn z=>Fk-x&?iHrp$?;gDGI;$a@1Vu#WbN>CBI)BTudl7M6hWzF!vTzNE`Wu|Kek9An!p zlNQ?CEFKo9SEW5X{i6L^ht;9tpqKx6_I`MJ>GRXm_!p6QAIi=%1|*^7r`aDqrxkNt zKFD?6!uugcl^BbP6a0f`12?t3O!1fS88IJi>N7a@;fvFUc&|O8bc}A;=vw#~Up~eW zzu(#rCaAjjG;i6LU59?d;H=S;Ubwk~ddyVWuFW&^53WpBn}uCVI{##rd>~PU=wfF` zAy-0a5yyaPo;qq&_SOFF6F;aE(GN{V_{!X-&P8RN%H5Fpx@j3csD_OUQ9*rj)6Lgt zJ7;b<@NDhMJVJvDpYgSu#L%u5z3jV+7f|Mzo$I}qpo)!H1~@+6rNa0J%uX`M5y7*_ za%u0$VQLka!jaeERV)UWk;MVjae#QT881zw|H)s}QY#0tvT7}6KNIAUN<|a_`j!ds zbeT)lsA$#PJMW08Zh!CKdtS(SA&QX_DavN2+FTr%ixCp@vj_2tm%XVG$yb>D3-K9{ z8D4e17rev>8pO-WEa;a82og$6bkU|Ws!Twc?3OI`!?_bK9m$qbu-q2Y6sfQ^P3oG& z6Kz72OPzYbCN`IHbT`s85>6GtSUXq zfBP!U$3tge2I_Tc9hA;wWy#u^989x?a`tU)EhN3(>kM?3bNOBLff;-N$~mq7+x>RjMqF7Zy^d7tWdZe9%OT(XBj#xDT4ilAhVwL95Fz?kz@$y545t zqpBeFTZbEvHkM^Q$Qo>{6VIi&&79K(o3Q)u)bzI5;PtazzUG zmX|*qe{o>_(8yvrokWypF|8~moebHidV5Vhf;1?ilxZec`Rns~q4BXXIn&suHw!H2PGSa-@*1;;chsk5(Vis8X1(2kCF5d~DWK7A+H)vFXfHY97r(wH(cE z7s@Qhf{m+GQcpn8D<#nFPnzo*Q;kd)u|M#T=QNqmq5iSV?2sE#dHXFT@LxxX$6=_M z*wGVeh7ytILU#)*PDafvt1wn3@oKMG001{h&YvPElX~X{X5cT*+(4_`k^hqw4N;Q9 z>}<#sY@+31HAeKz>Jw*dE3GhW1#*HpgP$jW;H<^Z_@Q9%9T0+<5)hO;5Z%fVqsFub zX9$rxgYa*`csd7GX=vZ~OlxUV|8p5tQ>_jf^%>~JSM$Z+Pc-%f$@l!Iyk>Q!rvw%N z({Gqy1sIeygj@#2sP>yAS^}s66F{%>F>OPN{Q2}lx%SMrLffh-DGJelqo=9{A9~pXoQ_a8m)994PV%N5!#?>WZh3JfEX=;F#?dL0* z(bDEFO!l2!Fe2px8X zHm1K9o=6r;%dV*jO|wWBf}7dhc_C7V1vSHEnd}D-e@p zPd+Jt8iHE141_0(A7Rj z_DM3V*AObe&lUQd5AiNZm}{iilx{d>KI&#}lrsDzsJj{t zt($2m1-4{Eq(11FEA(d{l$8T&`#=wK!0vpAp99AEK!;qRxA{YdS~zo?v*4XDZkftY3==%hk=qz`I!*D&sAIM2I* zZS!ca2}7c_=Emf11xn5@utp`!O;UED78aYz zKJN;_eCS=0;I(-!t+Pzy1Wwy5U^Wk!Wd?mmE40)RY2EQf& zVtrCFZ4H4P*-#V=mP@XXOzD&>>AtGrM<0UD_(2a}0X7AYDh3oKYX%QNfBHdA%m<^Q zXYQJk8W0alT2~4+HXEqoV>GHjoLhu&lD7w0sD0Ng}wb0d{3WS~Vc{SvQoN z53%8VD^yVSF5<#H4HWGPk^8WnH2pgo0GkbYe`BhbawKG*K4`tWhT;SD`bm(m0v}mI zA30q+)9CajeE>U+Z=46LQrRA#rb1Ek045vK56;O;> z^p63xlQqmH!kM`=Y+^SAXv2?|R~?v#X5dFX`>?Q)Si<^`;sXeke^V`E_4gFQ_d#j! zeNrE=I}ihGo`;shq?pe$VZqJSg2=D4&}ttD1)B?SMfd?k>X4+On{n^;&E z9&odbP`Y_PhfnWn@US5=C>joYlW<3agkf*w1GUHpIIC1xxH{WfPyiDI!SpLlnP&4$ zI6L94Mg>!BI}cUofE*YZF7TPvJjDB?g!nM6mFn;s5U|XKIN$lD2wZCAO5>pEH3+A)hObg27rMCYZ3tyoX^P^R=KNGRJoJnjS`AxW`&%Ekdl;_4ibo| zdDnAV1GEs%V?IFG#T1(L2Z*Y2S_x`@&H*7@A7pt&qmkD)SIFz>^y|X7yH@+!N`i%Q z>=>ebl$0x0sB4MPpPM^5V4@H_z%;9bu(7gUh4G9A*x5rD6?Lc}E)gjXoeH&X158{e5vsqiy^6el8sBt>jg6D=)X&8rR&S22*g2ztBEDgxFj(Xq z7Qe&4jfek9qqlcPq^I6Ko^S$IlW!mNAP0oq6+2#_&d&etq7W1f9TqvG7EBgC#;;U; z&j4+oXUxa-)`^C$LU`EJV140XXG(B|0N7Q2gfkFeyy7+4J`lcb782Be-<86lXaH0; z#8|G$P6l~+go=3}8v=e&0j{nPv{CxK76Vx3pr#depfDhE^8r7#tOQms3{rXxn3e+~ zSEyjG0kM7l1x`{v=jXs66y`w2(tjD!ld>md(Aw`Q^`6E; zp#lC)Wien}vKnNjlUOwgMq!I zGKGy=p-F@h4};X@Uk?PO=R;Qh5;lB?JIsLj!ns1Y)&I6JIBgZAftxJ&(WXQ<*b!~d zhO%oxENt$u^#N(!P!TMuv=*}ZC&7@}pDK4J-`r8>Sf*z&FTV|PzS_qZ(j;q zqgv(Gba~Xw)m@cy7Hy?1UI*AJHw06uU`E`_$_^3Tb3S45xkcQP_@CXK&H{DB*GKOZ z(0a)vs;Y;MZRLSfA*pKq2?8mSB{{y%x{?WsOCp@x5~~OcSVLoQDSHAv)2tZoL$WrP zwv#Z|x+#MuAD|@lp4usD^hnn_P4J@1Yo!kM@6q4nk{<1AqEX#ilU6RLYHyuM5rR?2 zb0Ko9fZnmq8VEF~@Y81%a@5O%=?bS{E8fdiL=hnN%^Ob5dgq^&)^^|X?2#a1?Ke?M zCMIZB8^Ii3eDk#XVCs^AQm*eKZm|NRjJdWLejwgr8}DgWrHPhvM&(w~4jD8!Hbx~i zb#?Wk_gNl=nn+Dz8BZgFBYYb8R_gE$bB4?Y&}foIU~Eh-3xGPWe~lf$n!#^AilCud z7ngTwZEKUr{KZ8U#un{xl3(b2#flUnU7#Y3!6&b4QTUfHUjvh=qwXRrjjhH*>Ny7g zvZKHur^SdUlIB9#4UUYBH8|)XfT={dr}D(`(-vYd5}c`}o_c=wHm}2Unj0Mn9;vOP z2o)|-B=9F5UAZlt*K4QRQv-PGq#loYFt-03_|`330cO_LBG1&SJF-`!Gn*v9n<==n z0(3ePA9QgT5Gpq5tbrzQ@hAW(Go75;WnxBQp!HR3&9yhc+TeE@1Mn>Zr%a*MhKWix z34SM52^QmYATwX5HE2!-73;j2bbwH*>~~yzEPawrXMy~&vGBBQa-cv92!KYISX>*qs#3n6zE{%IFK=ba5L`ah~28pl>Vf|swSfE_2QvUjQV?rtEOM=#D;sZgYo{e6!jobJr^yC z_dpc^ay=rLVUP^F!daKhksGCeT=4s#OSNL$Y+owOUOZSxnckeOZ`45O#xof~K@G(kTa!czcHYIV? zk*JCIwt4d#gm_9aL%YsDEZoNINr*Y ztAXA02k)MUJpuqnrc*D0b5lMvM);QHf14+pzW(4PZHFK25_BeN2()V&N$tvO$;UNg zh1-i0^?+x5zl$gr+y2I`1nCk3d@ZCr3Y#8<+|T6W26DYCl_+BTT_Bt&*ZrFbO&BQB zI5rlR%lQYu!%|c|{u_NUY#RZn|2jzTp4^(tR2sxJf&ood$791Y_=3a*?k45ItmkmvItr$o712bkX+TO7+(H)#4{$jh1OvNCYqG`20PRD0TkHjK6 zj2$6;;u%{-*ZY6Hc^MLh@0=4zzLD7$m;~3yP?X10`9O<&FQ0Sj0!hNygIP-piMlnh zzTKjgI&CNo*|&Hz@Uvov0Z!F53Mf_y(l9L2J zvce5Ji%cT^hG}C{y_kL)8&o5&vzf;VyJ<6)G!Z&6n!KI9!!2&YVlp7j6T_Nlbemmj zK{Y1oIngS}v#SFDwPgVoe0Vr(50HLX*8IY-13%@7wgUq2Pk#*U2-Xld;u3i@j+r+) zHaE!RE-u0j=G;Io)EX}$@32;+AR5V9pR>P#i*97BAZ`M;4L|LGm(DKhbXL7?)CH%T zS0XdQ65USjUoS|xi%1TOqy_D^Ym1I#Y+_ZgzO+_QCw^xp4LXw7MzaQ6(eR?lT&3NhQVfDO`77r4-uO{b3S!d% z_5B4L|Bgea^9{)y8yhZHS{!zRPIjI<$MF}R-0P(o>fPSCzI|EaD{HT4A?$ZCOCFoO zl0!zU#WPJ6N%L1S%=GD_Ck`NIVgf3)-VN71aWqv=H*axrbEDH7*A~?G=OLRH z{rNhZunVTTaoZC&tVVe$VjKT?UW?oh{jziLRodTIMj!C&?8VGRi$)DD7$Ts;xoene zqk5EJ4f!+a7N%`hks{I;-b@ym2yeDyYRKRwf)_{Q=3eDk?v=EO=TP+k(n#F)Fki^X z-YL*CDWy^G_}o_Yqn1C^hxtd4UCw*IE^3cG1Hlachp9f~bXa)<%Y$Vhh9YBo>{Rp- z#FF>0v&y_3UoqSgGZ2Bv!?ycYq)9_+nbrwctOV6zCR*d%Q{@rVD^_z4sf1BoB)L=K6wxC=P*s4awm!GUU!Kp0vOXZoPZfyOsNNjY)iB80D^YbHabY)cI zjiX$0>*3>WTa%7w#&tg1#Iu9yGR;IIg!08-y`n2R))xWIoC#2%+QfuP)|EmkS1;%a zyqJ!^@jG&ejs1=CchgdWewijzEcD+O-7y^Rcq4G(4tn?S%Mdb7XGFiuQlNRtqXQ3u zp)cR~4rivNCOd9q4?wGB(C^*1|B>Pjki2D3``64t7UZ;d_zd$=FtS707`SQ}j8@8{ zOgnJiV1*E;ypcV~9M1H3OF+jfS7-?02$(BqzS*NAcbf3VW77esxd;$Awo`RIh^bX*O9Kgs{xnCs{XedEGaJ^QU5!J!LO8ddcnKbdm zDc_#J24U~qpe2>*I79DF9JIW0eFucJ|9q(dnAD;USmD#Q04sMaWj@*h^qG?#!98gi z^C`YH4xVkNAZW|oC#%7ka)(QXvp9~eUF$Sts7F@oM;AJ0KuoUP_5?xa`c~8x=9_}A z;+zO-dbT99&+6dP!}%5VZe7lw{uyZO^_h;HFwtm?IBl4<-!HOVY@4^eGqd=wO(3hE zahmxzq-pYPBf(RL_-JG={d&qcp9$5wxa`xZMza2ZExFH`dkT_UcLk5YRuakO8p!J! zb{G(CO#g7nHF6EIR-282w?Yq9pL3eiB9 zBUAoNFZuoM$m?~H7wu-ZMRKK=BDrC&>9*LJIT7A%#mr)>3*%d4n}2fj;-L0qO-G}8 zPX@4c#-Aj?*vPnNs;t1Ex@ zw#Kw~nNignuKZJC}M7pt4-sPlMYA5ShB_6CL25hd8m! zg>V2(x;`viUZk6L+P0r{k2wY042T62$b;WDi}Z>*MP24%5)3fGA2%+K$TE#f1l@f0 z{uka{zMpYdnxTg7mN*5DPxStODIyJ}c+1QKZ(U2gre_kWO1 zZsKt9+N1VtkKv;wxE+|+VYgGRm|`MZ$H1{>_BC?bAoG~8y@Krk3y(~(_FB6;l+=`I z765^S)iX`;BFiVJi_=XNB@iOb`=0t}{vV5n$eWG#hy9V8v~>7#<+`|=bDEqitKTuo zA`5KeoaVGrPOi*D%8M^y0;+72sa0|ZI#&IazOwhk;$*5dQ0b>8K+bf078>&j#vhM$Cg@B-B)`J|39F~<}W5w~}pT(j@ z@uQi<(U|Kml&4iFjXOPWRTUXzI~{X#7bhMeG~TFRf=)k%=z8ln#C9h(0-p%XGX0Kc zZKiVNBeC;Jni3J>ms{;k4dcs367s@lmMeyfU>yPzl{{p^T_P@u3Z!jHU81(q-B^ zNJef>&MF;|JQ^!U44;j6BQI?wIfQ)Ns=7OnIG>a_>-E(1D8!OvH_8_Z>c|QmZ$bDs zRtfDZc{A7~d%{oJTG<>gieoqz<1Yh;s@@14sSuSONrY$9?%`)JTx{zrR(VA?2(FnM z_vemV$sb+G{TzD4##l1EU|ctva) zxDEd~8QX8NuDo0>kmEa@#hN+1aj^>!+y1YH@JwW}F7(YB3pQA|{7;mkPf@a1>0u&c zTY57(m_!Q5I zk0-&kP3~PpQp6Z^QE+l}{{06vet3ls<)_QP?Mh$a@z1VdO{Dg3Paay{dU0pXhGn;Y z`gOJA@gKMEx;?)o=If&W#(Rf`HfgP0yLQu&BWI7mpP$zr+H~;J9`37{jb)&uvV_cV z9{wQf7@mL8W-6!$KlqcD0Ibuen;`Y#E zUnfh;0yYx#QFnz6hAb>Tk!s~to_Diy#G6^f{X;WT@te)nt-$B7=svpM)@;%33BJbI zG5Te3)Mu8Ygf$f1J`!B}y1L!HQ88X2wuuW-Ew(SHzm~;IGp4-p2OJ}ZFWtSi zu>5BngO#?~ZgF}nT;Ub@7AJgn{bs5cb5eei$~s5Q8TvikZkzZ`&(T~YCCL-{7+*7I zGAj3)^GxRmPn0@W1)j&LEk!(qMG~8wd*8bKlDTS8 z{5i%V!-4(oU2i$ABr=}tmX~0qG|J;NbNvEZfu@BpHg(Th8)-Mfg&7#?^+V*4Ljv z64SlHmqIS)d7UWUNpOp0UK}hssveUc9XU+fccrGRa1J6>48P*}Bd>hqM^631$y>)L zjw?g-mGqfk!_pc{;xyj(Ev4bNKG4R~>ps+v*|d$1zs2$OpBB!YD+>G>sq3Xl@=Tl> zY*&PNVNk6lZ$$jp3%>jxfw{q=LpQwH)sD-8MSSI@=DyY-*dWp|p2WZ45k)4+Y_9X@f{e|x>&$u8RKh3b?ie(DtZcX-d|N0)hz^$wbn0tf1r zu?oY){*|{w&i6+~<<8}H;40&dhHm0|?2@U2H?K7K=Y&(NmvUsc2PFX$Hi&!H+=Jph zf|AHP*@kg%v=pZhrA;4u&DsrSwRrMV2+_5ktaRxC9W+n#AHt{7%7lV?Gcv6x@}MDQ zZq+p9yk>EF#p3oj56v<+l~5EnH`ObmJK~@E(nY82Y`noP`Jd81lx~07ex-LyTDpP* zC{yX;yK#ap^u7m!_le$C%H!(C6Y8Z9BpVp#&TK`s=2k@qlzR>R@>{E0sFoIy*@iNC zJ&zMSKCZfWlw;$+tN%l6Nzz#D>&?N)2l#iY<0pqM)vVh8WSWI}9*kT@OY&#_s4}!e zv)Q8Z=mqbJgo33GlZbMtc68X2FN=SzCa>Lr`7@;EubWgo^$SV+yQ@YqQG_q)8=w<= zGf5L!*7p*I(qFPu>Ijbt2S?WnPbDN)5N8rAq{pV6d0I7e$5c@tox8D#wr;dY=C$e9 zoAsG>2nV_t3~*F;xA){m?`)E;UWOXX)G04uYzQk>-KZ`QY+w#*O6%sV%}{p7s+KZk z4(-1!ggZ@VW1Hp=8qGkbS{>#~0~doC^FEsFkn^$4%wQ%){4;D=*VA_i$7`|L-CIB^*lj3e z<-UZ++7m|RcBf_(%|}Dxjo-JsJgyLLrg8``xIsj`2gcaXD``a5{XCA+)bplNoy(fi zSl)!TI$)CInDmPOIDtDk4tYBwKl0uaTE$`v?X1w8!#c>~VWW}m`nr{}*4yEtLyf_nJ6TnDE-bC?C#h;MIJf z9yz}8z|A-%_!{g|-7Rk(Tpm2PBcdq0c^4+-YWW>RT=9)LY|`(>d0g&?OP&LN_W(oY zhw~~G5+tQu`YU$GWr}Nx_4d7bI6+5Hu+1uee=WR>$Qs$~-nM%KsuPbdI#IaulI?BX zIZ5{-zs9tfyqZ^RBh4VV@}`8XVO8TziFK>(C@)L)^AmSl|@~hp#c@SV}3|e zlu(!xmpH0m1*HDO#=3Ivgj$Mj?Qt%3r8PAEVqlu{`HWsd%m)xh?!Yr+22`6LzsWV! zT8|+;K$_i+RBkkNiuCs#WxUf5={RfR{4$`<(dD7_l@Du8onmz>5obmH=R>xr{zgR6 zi|2L6KQZTXtsh5Qs8rUU-|{Bp-|l64rJfw1QiJtOUpi#UPP=iBu$|r#EuBj-t#5j=Lh*IOE^jOUXmnR?MT+&U0qg$2JSz357LWT= zTH#SPccmVpNch_b|Bp-8gr^J;<6yd1E~?Nn+;wh^HUmo+=MH@rUz!ZPuZn)M=}{nP1?FmkhcFZXLKA366{( zk&a*&0jy@2el3?%`nbtS$DFb93K4 z&JcKInSaZp=tbLJzjUb$s!h=MLX=fWdoRIB9W>DT_&3 z9nz)&^)KCfqh)AUv%{^|d6@Rubb_^_CaAnlbTzZSe$GAmzfB}%@(Hq#mwZj8KE4#b zPz8FmqP(7V(}f!%r~O^A9~+}LpDG`T(+HE)YsQ!SZv#(NtM8X|c2sW+=7M9N+G<@QpmCa!>^eF-*I%fFM-2s*Ndu`2Ad3Pvhsd@QQbCLXQ z0iNu$>P#_YKqOX_fAKL*0?LADT7#MvlBJeU0hDOFl`?mcNR%nwpnu2WXCBt8q_FfPVQ_ zRKN9FL{Z4^G_-#RY!{UOv5Q8^Y^^)#nA3#)cp~Y&T+B;*D}1&(>9eTqhfc2w$y|lK zSCf?TgG|8Kfff9Hu|L^5gXRfHmITG3Hi;$MHuZ!eVRt-j`#_UL<*DoU8Ql{3=u$0vOZkin`)5|6BS;z(VlB}#nx$8w6M=xb zCVF{1&z_mTQ2p0tv9=B6uk6XBWk?ysF(dy_i;P61h_4yfBfrf@yyp*Bk=RFNWumED z9*ZAO=a0~^1V3^k-O8O~W=nW-;(=*>{k|Wc91V&&qj?rO(pk6 zxLofCcP>=)pXI{GT*V3;t=f11xlB`)o6Ij_-0x{!Hl$b{k*2kkApzn9FEPwxpSyaW zpNPuGmC{#{eMx8bdtV@|AJ^ZRy0p>b5uG2sG@c%YTp^r@ii@KR@O=Nr`mcNc!wRms z38vZB(*b1J&Vm@&-7Jd4t;09BwQ3gV&e57tMCW=+spdRSAczl@ymm6&BKa< zT`S4!QvFi`QaS(Eaf8gpW6yV=C3rtzOHv=T)*fKK_gs3$vFc`;2Zg5sal*Q+df3}Vz9J?Rl*;ox$KBbt z`)(c|Plk{FJo~*1={S471nwusn|`EBnUFmT_kovc*JJQ@2hrgYGkkg{2lM^AlWf~?)Q6U3X7eWKo+@@H)++4vVBnl^h*?&F!<51raFRxw}s$iLL}i|50rbVyZoUX_c%-uA++~?%5sRh&&jC-9jBhO|99_KJLskgA-AO>`z*{U7u;7TbOZr z>#6cKM{+u}H=#%~Fl-k2iI5UaJBsdFF#DY*+xV9!x+}rze?WD?fOx^RbUZbD|%w0c@l;A>x{(u{wDBk~ZocisZ3jR~}=F7K1yFjs`blF#YzYtV6RxOA+dF z+Mn!lO_fW(yEH#6G5U@!!Jd0DQ9UD**iADWD~h@?KzBLyX@zGo17#f;=TmX3vm{+w zc`JU?{k7N1nGYuv!wVOeC9Jl__sNDeHhET5vJ;6@#?9wtZj?F1^dTDOmDJ|Pg~3Y+ zKLqza+{PA!LEEl1kmjMQJV}kc-IJJs>-AcatouorMvHsnxVf~Ns8A?(o*{2957@+P z#xE%1ywo>E{#JXrd@YjNOC(XN!hH4KKeQs=&>|+*`y!D9gYCjFn6jl&)K+0nyNu|9 zUOc&IR4WqxV+>{z&5dcpb%TmR0dMYeD@4Q|&IKOx!r#}U`kPgH`s3-wjfa9hkH;v_ z)}6plhf7Tg$=~BA6I#Wk5MiWM!GAlVwb$Q>aUmawp)!ARFKgXgQmj>v*(Q8hWjn<$ z^3gV(h;aQbJt7hxdPGm9w&6o07;;2~5dD$XoYP&5(~#Ea=#A24TvA>oUo zsl~h9&|Ngv47|bTOlO$)3ieAq=3q4cEYPqwjQ)f0eC@9~xZutM57Us*o@a)#n&vx5AbCh)@;)2Lq>v15w+hAn9A0G_+bZj$F# zVOrf%ptPgS%!O`X_@iA2q}RkV6_!?O`r7Wtflq=2H7du)8QA6NtVpvFdu`Ce;^Lt z|2{2g#_PtZ`e))(Rm0(W#wqtEXYF2|atW^I%$+8oOwkg=VyyUDYEw7)pYEGP-IDY6 zE4dpuOUAm>Z#*V?H48)S4AmiyNr*>Ls9(uc!32t^*j>#o6uz=PliG~h?(Djf#fa5Y zRjem%AfQc4oiJ@w9``-D{xc0R#(an*j{g+E^%Tr^l$TyL?tx$Hr+V1AVh>cOyJ9)# z-aYg%LwT}$lj?JOUW0AiVn^_+dRp{h{;In4j5Rcgt4~)4(@f7-t6WPFK0cAy!Oiqh zZUxz^#FudIlkDj2P{I)+)*#es>h_q#U6DPa@e4EFN}C(}?!ZOA{Wqjou+r`o-uLYh zh{;#SBHM0-{iOl)Cq&v^J-V72`-lm--BUepSKN#)JmF&hq0W#5EP`y3FaYQ~$czjR zWy@5zu#ZZALZ^4DR@}{Goukv8s7WNHI)`dz$0mNQB@JC1@r`0tT+H{0k zi98eX3j$sgow<0**oKUlyxSW)I26@lwItf{J{p+&Mm()<6x*dFQkMS6z$;<{r+s_5 zUus1O3mzBaCBYI~$%NJWG~AV-7dN$S86;DM5s7WVy*y+RB97boHoloQ7cLL~m2n#| z9n^ZY1#Or2Qmcczjo$30mm%QNNQTG)Wi&p#U*tMEra4i!o|Qf~tnVhR(o4a;=uM{x z7i}%+|3K2jkbUn>8h4-Aa#^DO5uDY0tkpel$2^YFRO-8BrHV5`x}Vl{$IHdy=!1#O zI##AC8lOskvyRp1%hujAVpa|X1$kB~LVN`$CcJ@4hpT@TUfE}hF~ww!86pvE=K!OA zyARP$s!Dm0x`kPXxH&3Feuy0DXh7VwDs4F3t@?I*?%w*S;ct1&2ma)Xa8O%L$oy|~ zF{H2h=d&v88+G@*X!+lDzX&ffv|lC3|CuG*1Oh7BxKBH#T};~{bnA#7d$)?-HSouW z+I}b1X>8F9ty{C3Pww5}ofd9Ua$SN!A=&4^3Uy=-QTgF}0Hb*gpQ61dW3DHks4id@ zUbC}u3q$@Q2MgjvfqB9UIHuk+cXldQWe|9CKPb2&Rml(W$@eNQCK$3*p7R=G71$u) z`iD$0BcZ#r-p6SX3px=qiN>=CJuA zYG{G5Lz8Y?1P4L&qWGL)=v2r}l{x&+&9QM|N)QT+;bDBuP~MUv;Xf4#+7e1+m$THd zpp>ZCTvr?R0HIk92yS{Kx|D9jKJRM-K9ltn>0_u#t%IL(X!J;xVMCn9LC?$j>~0z2 zI__s+BIMfSIcd0Fo@_X@?F;*FHUDM9GV91Ys)}gWCndmyNE$N1Zk0Zp-1l&CQ!23l9&dD8vhA7* znz)%7q{pH}*4gtz%|DoSjd!IiU1scdTlz%lW((7epJj7%$QORld^?5cs&YGw-j^IT zp=2}_!SS{$jVrV*9Y(k)?d<|gyPD!m>HQL*etksO_;-OY1_Om?I-yn;{w2F=zwx8q zkaX}Ab-)o*{C|i9O46<{elKAx=2wmu);7f<_$JUZg;7-t^+}0!L`ukS5eCYhNq$UX zg%QlRQAE^L=F)!tgl$C26i#?5g#``w5-iOO|ZA{)$%B>HDYOM`JC?lkS@qfC53vlxD|QcamEucp=_Tv_B-K zLhOj(Ul%;kY1-yp{n@H!{A;Kem6P5?@A%&sG7ez4eW0C+b0IXnsVw$vY&Leq!ZJLY zmr$ToP{}GVc;=Q;7U*w{zA^h)LH_U^Mem>Sh$U`w0L@g^3_@0Q=1UFfb&|^y}J-#*SpN+kF{JGGG!X)0Vr#M9v z*`8{#{g&Ivv*;JxQ^4;MoN!h}I#(q|7f1XUWMo$wQ=v$r#HK28 z?$%U=`&w%5Zgb;+rri7A-zhMPjQdh}@&LYv8IZOaXbl6e3)oG3#s&3q<2<^o8()lx z&z%ot3{h^GD_pG6Jjq@|+V!Su?<36RUVMk1TEv5-`lJk1qM;JihWC=k*|_zSO%_I; ziAJn}KUl@8!pq1nd)QC;TJnVwCR-Hsfr-AS$qdn4{yp*oTV1B&#tK$9?Rn&4m zq3K^+oMxfF4}TWqyyR8uj*K-5=HzoXV&2rYR%s|fHd#Suqlytsj_oU=*S(LS8!2Ue z!mf91y4}`YnB*N`UYYqtl{UXe^g)u>`%2Gf4D-d4S?xbY-Y(uTkzX{?hyZ3c>Ertr zQ)SIvbtt2L49}OlW|67K>?&YNtsJOD1=8Mov&zGK(acDD5aVWpmQ})a_MA~ze@1cf z>G|-1HECF90mTlAE@sjrl1317iva*nlaFo=S5Mp~jYL!N|uabBsxyECCtmkH`!@1;c+Z^h(BKy*bny@Tm zO54@@ImTl?n)YVT)pn<(C!VAwBQN;Bzcz5!kpF4vlUtwpn6Ge0ga@+UEQd)P-}5vR ze@D1uq$!bdMeqk=J-s$sjZ75sc}wiEy_|{2pFTg6?3?^FHiOnP9PH!a;C3eB2%2@5 z?HfwIHK6i}a6|AmObNs6oLF;;i*dEt-Zc`#g_>phTg<5B#=(kQQeWuv%mKaQiUOf0 zt~2`9%h65#9Z(_aTV9r?y4_@m#|wI*R@(w(^$JBlUT+RZo;t7+Ea`Q5uO-^_zS8_R zLkJdm9kc#{+eF}4U2d9H7G|?~#QR~q*Y#6z*|Y;~vxm%|CK=Bg^-w-*Nk8_+d}Vtg zH)HLC$j4wwM=V)fpYS)sk^eUTll;&5RME!~PO!)V{Egm!licJ>KJr<5;79&Zc<5>J zF5Jt%@V_Oj_Luy^!W4V<>jg-%M|`61WE<_r#!&cY?7sTDQWx{VY2O5j@%vVG3qRkY z3tn9Ha?-P;%9^khs5o5Xpz^D?kEULil8)AFiN^_Dy%oudpciyTWszxB)y*I>StJtq zIFd&i9?~;|kCTlD1?m?0DhQ^Td*H_|bji7TA@i9YPVJFOgkk19G%#oK0eAm|ae(Z9 zQTFCxO*$1BVyS0?EQpQJnsxs~|T9bOsXOLP~DdM!IXpn&BbARDd-JFOr#zkFUb zKIUz%JDhJN&unz{sekZki-#S11Cm-PZ_bTFumAtPW}(g^0hlYsWtI0|^oz|ERfk-~IZW`2o1oMErUeJXI9d%!|+MLU&?2zCO)jWUDL zzs>mRqq=hTDm&wJ$OJfuG}*M}rhl3A5((SBej=v2SokA1nH@fh537RfNZ|h#>2eS5fFf8vtC(85Ns;P^DcWkX(lu%6#!3e5K zSJy137dL(cl{y|mi8lz=&4ql&-4L#D6TN(B0NVUJbl_M{pZZ#6g<(l_7-!9-xDm+7mq%E*Za{s9@@A_rtF z>8@O`8{I?mNcTr(KY>R!#}Hd-D*7SZ_*7?amO#?-ke<^U?(kit9(M$-a2JUyWXMK( zPo1541a}{6h``7+8T?}7Sc1A7NA;Y|oqN0Ik1}RJ!wC6?Qu#h(->06u-X0d?l@ml&RX4fvDAlJz80K&m zBiKdz`^aL{0BYJw1b)c&G)Q+xhSI$pdi@W(M?$T~uoU?7@8Eqi~UTBTYIUShDDqLtWxdt~PiNSNrDq zq4dYsnqm|wW$9FpeBa3J*&gM#m}ad*7}KeBnP=744AN;L%F$GL6_>5uEw7$W6it@J zCp%eo3vyMEjktoglSq4;uA;HOyqillimzrOMawB)EBPr!4RSUU$>mb?RuFemqFuIP zO&yf6I|hYU0mzW)D2%%9)wjb674g5nQpx71d&vD znl89}ZQggg2z^_!9~=i4T1}>F{wWO_-@WijvgmykLDk z4K)TdngnQRNYRhPJHx~-H`@ijg0?a5#}p-?v==_IiivW!gih8ehG8#C5U?~58DCP= z<2T|e=*&2U@|0AYUcl^-O;z%3;6BG7;fUdDfSL)NKA%khOuqb4sJ0j+1ScOZT~itt z2z_WJd22YBRBmYmNKp67byXH@;BW z;hXCRCPlR_aPEkrp&hI-7@!$6Z+#Z6%yw*CzMB2zRpO$g#}lp7UefRm;eT5Bg2l)x zVeT4#Xl&4yvbaE_9cU&uIOCdL2k7XgijU)Rw?360^-vydp9@iB=>WL*4^X!*@Q&nnZ?8hfpv$jPhvVw;(dy3b<@t>RjJ_oPXDSG91JDUV7H#ZF@KMn8W~%^b zbBnG645U<)d4>y^&i>~9h$4hM*S=%7W^tIp?H?SKvdp{>Fu{?7sD*PjLnDBNTxjTF zwK~^HYeUQm=w%o>I*>F!$X)m2b7Ygj* zN0CvN))CuC^vAZ``%)r|5~(1e0JBJ~x#hJP3cuu;-%iBjFJQ zZyf{OokFuHBle_Zbq2;6zV5ACH%g{mc1o~0a^+nLZJqgP{M_D@dRe7G)>hW|*p_)5 z*&f*UiQI6>M&6o{ZsUtDA-%L>eqxmT4-up6soDYbotQtHD6lE8x9Ub7{dZ>2tYr*h zc1mvL2d`l=9%RYN?BV~LkSW^Y8K?FTQA9NIGLdL7YY7Nyl{ORer6=3!Dr}WiHSRQo zDdeQ>?iYmuJe3XZ?9OIiAr1hiw#YWX>#8?>VG;)0#%Kf7;Kd2sx{?C3AF^0oG%)Hh zi$&7bu~-Z6EShY&W=Z~StyTop127no2;&N`ReQkQEU(Wg(a?Ix*Oo3V_x#$E+~IGm zYuDt%ze6w2M-R#hvAmLB9DW|XE&t2qa((3AP(mbIDc_d{#;KG5L%s9-!*GS!vhXSC z$@(CNJ7)};E1;Iu+I5W!ZbdYJ-Q<=1VAAh463y=kJAL!0adrnAes@Bj`7g}{(SGbI zq93J1rAI2%i0ePP~;hHoBfvqb2@Y;#rF!I zuF=*>4}iVMW~42R6*Avi(l%|?!EUbh{Z+plB0KfH)n@envufALls*u^=`tj-M*Qu9 z9{~9Qv`Qyq+}#R*D*jKUQl&t%K@5pvNng!!oczVV7%54-`akQGzDZ~8vh`HTc=$wE zZNH=Tz2#`kgdrLUgSRwb>zrt`fQc3;bg>}a74C3GuoiddAl7A4I|%C%om>#9ACUue&G8ovzt$7-eRdqLZ}8ZhsZC;{LxhYCJ1EEHaCh`bp{zw=Ns6LEo)4?$>Im zq<}0Mx4`f<8Vt{K>SjqPDAR~N)OLm8HH!sJ8{SPsN$LHUiIWmY0Ffws_eJX4%EV?` zu%s-b@%0`L)M`>9f;j3-jT;n)Phr@JCi-xSbFoAF7j~h{MZB_MadkF*#xb#Zs}(WX z4b?p{xB|*5bNkMN^E>34iscr>{A`1glq*Z)mS$vkEmOucRVTC-HRUEgwIMoDT0)$X z#n^(jmlpgVyK4Cds^M44qU=M(U|ez$WcEsT`WS8W*B?&|aK5o2so#Hb?2?DU*UO#L z>PK!{?R3`eXDgjcY1}@^>&Kd%(29H@un}GCpxGHDKV@aQ&~%F=q2E(Ae?lb}8P7HV zS)qrt53I@t;A(4AzL0G(RC%4igpu9h3WG}>M_UNwchqhk_t-HF&GjDHhOesuT!B@$ ziZmbtP`x$Ev*2CxIW(3iG+4S^xqVMxS*@kFqg099p}-5{ig`u?|w&PD)?Fn)@xY%wuk`7DBP3Q2;MO&}VFiEfVxL3QtH} zMIAZmOm@QWNn7C%tB<{}8k=LYOBe!|Qu(V&7yme?vW#kv);4Qt?%2Gya1d*a^jhPe zeG9V%I#pXYJZ(7H$)CTFa2^Q+B!#D;^B3v_B@V(+!}4k^h^jghBmsg+oZ&PBJnAWp zUEE`?R=`Dma<9HglB(uA;9O@4wYSDKP!E|9WJ9EYd&5Bb>7m&p{F>JMi<}e~PEwfj zXmYLjPq2V*P1RJ@VR=vZS4ihAe`-2kdO`V%cb8~KLH{D8L$$n+vM@ya3JI_9G%kiN zSQVk=?}IZ0iU$j)gOrwH#~{foEhtEMOV>#{MZxxaR8hJum;wwo14Q0h!xr8PkxMSX zklHv@nJP)Lx|Dy#xH%G&E|P!Tp*0{AJH!_xD**cA|2MYF{=eCd;>|!y^)|plvGLSK z7|nbcs8*5BH^h$Tz3V?f|(8K!)bhA8uA|C1G# z3HRJ>o9JHXpq@g}yUG*ByQ4Y-p&GRUtuihTQ@|mT>bhZ2&0%_Vz8sFfU-B0(XrB-w z6c8;<;i~0QN#Qx*4s%DUImHn8yV>Jsx!I0pM#pLyc?>Oy;Y2WrQ1Q03`Bng-WX-k< z)jP6Rb!G(RRV38qQ~6I%SwV1pT}7~uq572&V+U`+X5l@&nAqtf9oqd|SL-XhagD`|8(gVa zE6E-1R%Uw^wyV63x9Ne;^j=0=zweYmFZU#5It+d4O7{0UWkp!$iYu}(%eQ}Hx;<>L zLgIl#bCTrSNXbhj?c}2M>`C(;t$7@+BLJ=dEwr@5Jh$#lnmN?m+6_p=KO{k5fNxs= zZG1cXPd%=8Ei;Lm@ily-VsJ7d<8hcN6d8NdUjdgMZ(JY$01M zed2Q}wwa=fPwLomYDpm9T9x7eQS!vm?KQ9Ci-)6ki zqnr~$e@`qsdX;o_&5GU9&L^^*Rll5#Fej%#N=BhnF)o<_Yso)GCjq+j>;Ww^!x#i1M=yOBtH5=NK4eA%w2{?8xQ z!~L&aB&LG8IqIK!MQe$b(v|HZ0Yb~s$#!Wmu{s0%@UUehmisnOkrrA-4A4kcq((5wNg8EmEG7!~|T_&UVRhili?Y`SsE zxb&aNHD#XQ6Ss)?i|~2=41#mLnF{32Vgyhd5|?;>H2O5*SPPpDLLN2@LM!-W-!5FVruZF#N}dJ_t!81){sx zawg^@f0?;-h`r8XIG2z!p#eQEbDQ14W+5#h5I88?y`Ke&9CL$%m&D@--u1BJTMyHs z+WW_m!Rct`HIqs{+mHtz|h>W zJ?2-#Ju%d=?QrfFp|C{}qTPc@TBo>IiuV~{r6SJ;R=vjq4uI^DY2VO{-Sp4t2pbsx z9vz~3?lAaiK-6S!G>A)s6^h-mqeW;<6GAu{e&oK@OgP`#`{lgpd_AsqyWE`;bw>|s14wE&t@>UOd zbrf%OASuBSaP__SLEno36haQ-IhR++_-DA&smfNA6Qd5hCbBPpf`a>b7~n%T`}ert zh83y!nrT1ku!0<=e&F|8n$2G+BAZ@qM^^}P<~sChq9 zoU`D4>piGxHFfx*oxyhS&xT){3o+d!F6ePMEt^+}K3y8s&jzp<-7^%D!kt+fqw*NM@={rq+Hs)+7&;N@G}q(v*??#K?Vf`NsbXeYNx2+VlpDT zN<~;uWm7nyl%FRNaHI&~hBz|wK6bE3Y6zS*Tr%Cd{zBn6(}FeL`I*SsK$W|=q7;iJ zrp}JWbWa&H-#{OPc=nQ+tLP*M?K1e$~| z4Ui}D|KJTRTOq3dmos!rA^fNN3A+clpAY}1`&mXnYY7vLM0-_NmRy^ucqVY+#H6A# z>ZXf|V#MFZ&&`R(HQxxo(?v`TZ!cN%t4iZh!UtZ*T%804M^Csak z6AsYu4JOXuNQHz6PlBc^jZ3M-^BCRogelM|h9EbN{`|B2H@4`O`g>n7Sy+kuKK{4m zj2qqT;2rSUulI$n%{bm<&nz^a#orct29i1hgM?>8150OpQQ+{%yU9)*pN5I}u5#J; z)adP{p3C@06W&K+s;$@eI{(XMSSHH<%X>6*8&;Tyadwj1`HgG*^*~CyR<+5D-q}PT zG`X8Ywb@#@cC>WS@8(RaG_!=h7B{f?_ge8H0ZGtdK43c1YqmW=n)2Gkc`>mj9vVJr z^L^|u$<5-2LU!eGx{ml`DRUMdB-^u6Q9a*yqRO95ix?RaS z&WddhjbGRvIm#VV?^G;?5yi7_yj!)EQW7&_G$UjldI6+nn|!@ zzbm#s@1gU*8*{+5feQGg2IbxY00a*pE*DOZqB0%s zeZ8H_bil`$FussuO8!12GCXr?wpdN7om250uM*$1FDWBi^@CV+reC8u81ks;3Pv+Q zddKJGPF4LA3|(p{GJG+oS{xP`r7ypOi5^11)VD+pp&oK|ZFWQCpUaKNpb7D^&3=VJ zz2Lzdz4Gb!fN3TdKy(?=O+4t&!$@~(TJsa<=!dYLIHjtDh1 zgV70+!(~u5_IZ}5cjk{>O&=+c1Ncb8IiFqp3Aw6*>szAVw=PBjzhV=<#Ncn_t{{@~ zhf?xa#h~Z10UQdOj)xiEvDZM zLx24ipkZZA%0>WGKN{C?z79KWP1HtO(>C$fO$p9JTCUyI{leLriQc3f(#?9-C^M@= z?D9liCEuE}qT76~Lfc}pUHs__%g_~xc79e{l+R$}j-*xlWwyYFP%apBR53nNkEGJz#96886z-)V#6x|x0q_=*{+|9!{7xl!ijs`Gg>tE%+)!U11M$X++H@M%czQsx0w}w?@8GaWi z&&r?^Ydxb+Q4Iz(kQj9DVIfQwAao37cPt4c8cB2q0YFbFU!Gbf-~-@Uz%wUT${bO; zTMYSTkm#tbh(&nM)b?<@nA*a;#2|9^V@izdbN0h7w0ku;v6-DE)?-tqSQ}aiWoGX&_+w(tz7n1;_TpdDwtEZ;Y*;1L9QF) zbp+sehE{5TZ1)Neji(bFq}=U9QmPYp0se@U3wP3X8hIk=r*8s+AddjB3beU%kqb#4 z=Y5galj9DDRF&5T-Ve{o-H9tYU#g^+nHM2XiR@R)-mC136u0kV$$=Fo?<8k5U4tF3 zmlidl(e-D2O3_>$0r>!;s?-6bNd%G_3x}=f3ol1+gVlAW5$J9Ps|ad-369>rfnyP1G*y&&M2^(d{y&jEmSwtDM={b-N;6K^ZXHTg}C-z{Uz zyo{19O55tZ@JGr(MtC= zZDCV8uB{yh=GC0z56n!50ClUQo}0K1e+WiK677gdl*ki`nI5zn7d;~&G~IThocS+O za&cN!&blNKZI-_xjDG}+R!B1afha;(=fqYnjSwzAG>RgmQ(_8I0;lCf_W|I$(!H69=lSHusj*GhL-cZ(QXQH|udX-zA#Gh3RgFpeUX zK_1b0*LcRBbxy4M;vg9G?Odu zfw=M>+>}@kYr6hMA|3AXCd^QHZ@10~tWlcBWna(h7cE69uik(V30F=WA4q@6SaOkg zjnzx@Z!01i&LIN{Ct7ayQb5_A%(uPhcZx(#hdvco`?iR9zVYGiW}CF%e=BS(E0>@|f3wm%Ep=s;vFq{0XjmhmApF2V$HNGf^5@+ot&5C&w4~PhS_Lzv2Wn*;rbA;j{kg%N_QQ;0O0=QQ&+t~m{vgT$QNo2GHX`sqt+t`;D#N}QRA2h*d?83S z^Tsw!7N%YCiOmcY6elMyPHHdTy{wE_r7(w zwks9Hs^37S?J1pNPN47eudZ2b#7@VbE9L&wt&U-13W=*M$0BT`Hk~nvi?zU6^bZFx z;i-;)K=xMF{lTLV6v^XP_M(GEc+#0hIZ-hD7$Cdg$ylbpQ%ubQWA@h_VuZ|hKywVT zU`Ue#H%Xj^B&~zrPkIua)#}p|+xfjLEGcUGlvfSB7mZrr?>^Mj$SZgTvTpFwhxm&T z6Gz1W!Q}&#X<2g-k?=BqGpBfBgNW&cmzUpE*u?k&mC*WBuTo%Ay8h;|R_J;i*!%Q5 z-7$LFZsIB{A@!@|79dC)^M@=CTcFItP7!H6{P}-ODd(q$w#pWnk1m9WrZJF&pbr!^ zYCVDiUD;3__^+uQXo<^9JOdJ*5^>o-( zJjGNX$><~U`oP0KU+SkUvt*q)wkt~gjoGa8oFcId&ZG zz*r9Q(eIW{rGP{vxDci@6{;P?{*+rfhzH; zIvW^I(#vQ<{x%VKEc4GS}qmi-`_~<#Lx!ZD0B|yAt;JIqTIK&fV6d&?sLg8~5PPU#T<=ew&APTV2mAA1Qx4qm79082P6X2$;xDiiX7?!^Qf-3Ka2 zWGM^@@h8m%3Y#_>{TsGFo+{JrhdhcdhCup88GV}ox<>2}+x)dmZ2Tw=XNQt}<2tr2 zA1?CdX;sOI+2}@pSg)1g?&JlnCp;qHo$f%ZF??AG6?EGN&dt&85atl}6^WRSGN>Oh zy`y4n-Od>#l&xztd5TgN@)kB>_w)|^FbsydnD$<~r{L3rwSxm%agC*v=@Kt=?RiJB z;7W~u@cQ-Ng0!z0zIL39r7+!cZ5$>sGrTe=9%iyAZ1#v8N3UpEJvw7D5E z;bDOn)T#I5!wIZVbtOm9=;G%`hE~CW{r8^Ir)HT2a>_s3@ z+ED((Ru=N3#tZXz5I@JhAT+@6o_a>6Kvl64WJx^#XGQeH(@79nOs^#k%ISs-KB3Tt z%rlZS-bp>=+95j-;l~fKab!?Xm6fO1$^$hQaz>R|K3H}*DuWW00WX^uW$=CD_?d-? ztv+7x({`URt-u@5Qq%IL7VtdHKuF$Hv-*PS9xshoFhR>n^j+V~{4O-0WrWS)8J`j0*l9of)(m26-96$ay<5|lp^eQvP!3J- zz?P5Ab9+{RNw`SkZc+`EPoNtUQ3C$u&?E#)v6G$BGm@lt{k$hEBUIm(vm)M0|Blwp zOxA68TU@FFf*|!V^EY>VWq{HL^m{@BTmUQhLzs#+p=HUSvEMm;Wh>C=?(Gj z>Yjyfr_pM0o@3mLrym2^dG*C;*d*r&P=fWZO0Y!*}C~Yysqx>mvcK%mgZ`p^Iva#Xee97KO+A0!d zB=qzy7;JZwv+hlX$hMcoo-Ah|<}^|HNNW5bDR#hE@1` zLcI;&tv%|2IJbg=HC|-mb&|P!IsZqjdL-U0h;AB@omG;~%(;#-vrId{6Qph2M-O(7 z#_nogA7m9gHZH0k4?^HE=UbJvF8&^xSf_=Jk;>)Z%aLhV4-t23%Y=2~*@h=!RYjfW zR9eK97TnT8jGX-8^#=-%#zZpn9?I(!FQYS4VuoM0u@Z+qI#NR|??C}q#G)xX-I>ZS zX0-ZQ@;yhusCM4F4fLoS!Y*Ze9)VB=iV>&_(Sl!dOxVITOoD+PxA|Yjw9Xs%l>zz-IwVdU>GX z$@T-kY;ib1*g+08bixDi{PqCIHIUu@am_DvfofAG8lF_qTSAnjXp&?tGR|${+eY`+ zfqt$^@;IlhCrtp5Dj9lfax0+k_JdM42qB2)&( zGAtbr+iow_KY4#y`9@5NrLDO6GRRi+j;$%v?EMUQyq(dRa}fK9i0$xp9UY< zJ=}jHFZjqBH!XeZy%;v~Ug!w&?R5V5Onxgo1j(b}{jM;^QLCcbpVy#&Pz&!xZYeJ$ zVuB4l8jj}aKE`*XhvB$2sq3-~8;K3Jh8R_I8?p&TMn`l+$qc;;%_#?}Y`N%B800xb z7~}d%6p!uiRwvu%U6;vZGgEuG;5v}r$3(m`yDzYmzaT@&k2U9e`4^sIae9i1+WRoM?xWoXvEE#G)eXi(RS1MOh=W7@Zw;oA!YH1TY zoSLZDpXu@Zi9RFNch66;p`Um;>m%ewA%Z{{fk)!+l_Aw{wI&|*=XU^jIv2b%bg6#1 z=CS#)6g)?O_UnamE0M86@Uzs0inos7D78&WS5ftMSNGO)#Us+XjWKXWoOs0_DhK3_EXc5-80-1d8T?Xb*hN$#+cQ+o-ksV zmyA=-H6bzvGt`DhqxZxjc(?7pe2y?+x(%Acb((OSO*^2wTH1Wd65Wd^nsxb;qIjN{ z^n*>I*lnwHCKhEfd}(#zY8wym)@IWliDzNzZ6x#y`PZK6vp2$Fp4*4F>QJm)nf_xU z15RH7%BnN%eDocUDMQMXLp+I}6iMBYcl8|eyy}Z4_h2Vd*e6Usv9;-K45$z9+%D9ul-h){g47Ow zR}eN!Uo&KPw$15|-SCk0#&9lU1e1`CT_Jbmf5WeSWwjfh@xeb@@9 z3i5MRJ%3jtf}Df`k${HQNMkh62gCSjF%aqht1>1dKI6?N%ZXY1FNs46P3PNV3m^9f z7|R_KuwZ&W%NvbN`s&&|VxdWMB$%G_A&SZxAx-ib!G;G^(0)4Ndjexw9hb3j1ic4D zQ-AGDK_*EvCsSscK6%q-%}LTcoQ5Ws#@C76Ok*pLa;BfEbH@<^tomkZ+1;e$7RfDn zKnY836~MBe`w^V2zrUFP&c^2TPKm}=RrJ5Q#GiVkv6dBmc-d=OKJtB4Rc%$h!ZGBl z^AV$i7e-Fyc&zhVOFyEGI(D4Zz)pVV{4n}yp_PGXwqY79PbQLa8#)hx^(xef;96w6 zm96HF#7(l_qj=Zrp3hAf?~k_zMUBPPej$A{VQ7BIDWjbx{S`(X<7%x&%nW zc;~*Te8HPN#Mz!~5ye@pI5m>C8$Uz1XzhQ_4PS8}eBOO1)DX$jEI$-v)F3g2v7Vg` z&izT0(>)igF@Ovew$mvu%-=uY7Y&Ez=<1Q505CCTB#*2z0_pl z^BtEt)N$4tbxf2Bce%KBQQvTAB?#NFw*-3IR@)_bZenltF$AXR(4nP^ZYan;^ZZKj zg@%`qbiXP_1N>F1$&xi>Zlz)M=6aV%^9mAALOODXT@^ZKFfH5~_&JPKEmH5Mai^sM z%Lh2fk+iQ8qy3hKpE7czHbdeiL-DQzR_6x}myfD9w(Q?Ov6SuN}kf z$HTPuT9hzo`loyf-{ig(L|s!_o?u4_THhz8?HmQ<@& zMF^bp6XB^|BO}(^@aIJBG2en_SMLWpSfo1}arg?wsZ6LnDkZeHT%5C-NpTX6CPu7b z4O-jb*AtxN6g;x4#$^0kMZP_W3c0*5@bG$Cq(I|l$7md3zEHN);^^1pv&+(J2CDfl zI1e(Wq#)b}wVD!19r{Gh@HHJg$EsqK*@H`P^jlCbPyl|i7mMgSctp_^&SC|rwJI?M)&&OpRR;~E_0GPbPD7~hKV3YYU`Md z>K_6<;+~blw6PZv!v@L!d;_NN5<3omt6UL^EGCds2K#D@lM14+lxksNaIsB-> zvYMCyx(XS$i7IG&;m-_Uv=kA<@m<{up+tW>osJ%Fm=k5~XOz9JdnaA~EyJ9q)~_Z6 zy^mx7rm997lOzi2kg5{rG&k)mHaneR+ywF#jeB}^_9$T>!w>Z*T+!ey^%pBRvIcn4 zDr2vAWHJ%HP1XPcx$4$|)T$BbsLzi>N5$Z-$@l`LHy^o0d}u&A4#1hq$d$w-f9-(u zQN}dOU`gv2HS*)lu)1elqkeoJgSMIke%+!?l>G`@vM?eIVlX+XJuryKhM07Q;fLI! zUU~XIyo@*D6irR$*3%ppym!p8*A;VX$yDitX(PNe@EtH1R)jwH{GD_!q^kdJ(tUUb zBjeQ-J4@6~%d!Qc9jvb1lm3F^Ntf%G6E}nD_Jju+VroW)1;SyJY|e0)62Iin5;nl8 zkzPLXM^1_NL#IDTKO$Wbb0$(}#&R+-Dv;$7-}LHcw^LxgdZmkL7bv5@$7wWqRXfYp zi-OIXTrPb=-`i+RIMYPi2EU^aeqx9vi>p=i*(?rK7p(e<>6%HewXI)|vkz5%$C6f0 z-W+VlTm})p+~!zSRN3d zrIl=Hwd~z`3x>~CgPZyKFzzv#2?L-2x6}Q-+)W>n347p$?TkrG(`dZEfo#mjus zG$hv?e^>1WP<$Qs&xi{$WLC2$yRPbrX{jlK3Lki)9>T42e^38~(5QWqZUcJ9e-Z{f zU6YuGKP4|%;~?#NJNS(d_yo|$#7OK)&=@0oDeru`CvCy1c5jH~$*1%zMQ>>qxF-`TzZ2 z?-J|cV$aTr5MN%fh3jx{kM~mY4H77ySs`-^ce=m_!h$1D2hi)SevR~=Yn!VeO@Z70 z1Ypsu<`hCdWhxyeMqtw;jRl?`ART&{pp}Be!=s5o!wf~9p~;2$RuH${M_BeqoEyr&@2KrdN7M^==sC}s^QRzZZe z^o`W&ADzKeZFag1i_p`R%v=Jr-gtp(zARqR;87RXn3dWp%cELU22=f~cJ?TwLZaN3n& z!cJL7nyo_-C$u48;TP6@Y{L@x+!@_r*c>a^Kk?i_m~WLSjn}UQtM5Nf`Shj*vt9x< z`*PXZF*4E>BxbHY>TTLfwrd5DDwP5YBK^y1K4{uQ^Y;lmzySfBq;?%6ok;uzn!`Bn zGZZN7LKmM6w4;jXx16Q-lH~7hL@hX$MQ`r~ose@V&em{ZyB0H4L%8x043BPn>}h2z zs7~4m-$`Y{;vBAz-Ngg7wZGXZz9d&FRvE6_^{H&8J%G?WFx6+4Bm*p&m9PgM2EAVY zSec>1yl=9MOFW>S4q)76$DW)ZAOIM&ox?WmI||W2pFIuxQ`rE2oZ??88t-B+1CM&Z zd+C3UQLJ*~?2_%u9ZH?4nh;vr(>Ob4;}Z0SY<_IEp+J6uY$(wEk2eD6iz}fhG{ZJPYxi(>VX)m{X$ovah%4libZ;>&mTQNhpsb*ub8rcJ9co1vLR zkpIUbU6^6k_=k!q(rQjJjB8cQ-P#Xuw7FO2Xk5`SZ1^ql0!a)OOx4SVscK21sp>)PACj#wP_=(;gbO=mSX` zn3@#+(*a7y-m8#dbX6=)_Gp^a27oSgOjPh6o3qs31hk=u zk6!;sUAFL>n#~yhm^FQfnO5sw7cJsufNks=$7_Nn-o3ceF#Z83V0hv2iO=HurC}Sq zdd%Gn7E{uTPBInd@8U!Zd5M@|^k5twIgNdQBL)y(DZaCX^LC?G_8K!fd;o0Sr7c#z zj4I4V;37#L-d?2G**B@>JK^!cY9%#@YJQua2e01(L3+#6(@mv~f+_-hC# z>7LrLZ|1tc*8pXzr>nr0}0ICw90QnIX? z_>*N9W`NS__E#lCdWi8Zr+D-oW&ZPuyimdpidi=NQue%^>jkIQECz}9kaC(x^&qg} z)CbCx`O}gnMxOLUm<%wpDP8SHFsu8LkcgvO8VaqH6^gFM1j zmRbY#(Qq_(2L$A=S!vvgN+}AUBp3lCD&&OjBx(4isuLXMKY)_jR6B>4sgsAd>MuhK zUAF`3-8p?6<*AE&f|U8<9>~nn%MQZ6SC3E@;)l;FzLp%rmoR>JjEu_e38`A{RgjX@ z1Z+#IBx@Q0j2Qs`NG)yzwy0J`$dBtH8rA#C*`iOETD@dT z_|gH28+l%G;|zSGg|LpzN6f8DbTc0G?gwlL(8=3F;Yb+ZyrbBG^-3K!310)6PN zuJY)ngyj!A!3%=}@QtAU(&9!A@QYcXFK-Pp5$P1K)@Uiq4i$fGwF4PgACVPPTdfwjUFfz`F~uLuF>7A&`|}YlDL~bumf6t_B4@ zwFjhRGV18$l>tieUVy;?X5YeWbb!NPbrVMb@}1BZgDxXKZ^e87-VGj2pJkKau7?a7 ze-U%FUUqD{7DRj9_jyAOx+XnTlz_4_a6ltBQ0mR-QL&5zo`k8t)h;QF25O+*0B|WIIXke(7if7;GtYCA<4~ek!5kx#rVozKEML` zhO)Q|5~UU`=^7R*7=UnYH8Ze7;js$yn*8&aDP!FxSst8Hc7E)#FkdG@^!ik_P??vl zL|Y4>6i24^0e=>k9k;mLd096R%6>O|5$N?Y zKG8(z6Xh(>tvuDN-}Xup@AT#9Z`Hg1Dn(8b*F!CAU>;0ki(RM`xh6tT#7cbXubYhl z0Ujt!ohwpSQBtH7I8w(ySqi5%Ee8dv8{l%n7qUw<%6G2yPD_U6`G~0ZuWzIaJc4b7XcCjS`BfDS~9~oTi7W7KV&XWeu|?Yu&z~ z*y97Y>Kxu0KdN-g)yEXum-fLJckI}^J$q5y3DXt9Qi4Z?^~R+33}^Mkd=@4}&}UV`Kw)Bd2sjFwqfVll2!P(lCdUoRwn^Snk9wo_lQFi; zA>i9SOI<>H5g?PyB4BU-Usa;TG+qiI93r5vJ?SnAeGn(z0KH{2gGn4UcSDv7_b1|4 zXr9rDu5&1|Hm_w`ZN5ss7`1Az685F$vHwHJV}s>lX0J2qK?rdkXU9-exdadPHscC4I=%!Wmkac@}~KRbo@3CU}K4^8SZ`i+n-7^F*OwNI;+>}gRkRc#+4dGI(rc_m|dEO}hBEIVOYelVU1bpNElCWd1te^8tDvP-pG zwd4uCG5k<>bE{NHt=y$@ z!JX0+cieFWcT_|KLHB+r&+`v6=M2Mq<}7oDb3X6ar=M{e`99)hlF@EN4KjjSxzLgj!^7{_4x6YEDX`(vupXDWp75HowSEmb!WfRD#jQcTjo0hvb z^sSDC(mUa#rI9m$TlZFKY1z3TwpxeK_otn}0_w9dI^c)l_&FMFfjHaAg5G?rIlmx$KIz(bRhCWmb)}j~lLL_NmUj z=_W8j``2R7NeE>}cE}}42V*nbKlH`uzUuJD{kl_`|7<%hOD>4~If5D~ut__4d*o2i zlG^LLNk3}${IUFx1sG+zR)w$^#h%zCsvRv-@xj*u+vr85u0;`V2nm+BXkK5`CthRFq^J5(_C#g^ z@oBWq0~^@@Ihd(aHsY2PW~0e`zu54(thtPl1BmSaPJN$O&{7jhGlhR+YG8}1mf0h! zoD1EP)DD(2v|4=BKef;qh%n`@msy+6+KgatmHVGP2{DuU*AOPH^uQAd?;5P8Ppl_e zo+Dvslj|=|M}$THW1zeA^ZkBD-owD5!5`WC8N%qmP3hr?^*2+3HOYmQI!axGAO3vc zicFEZr2<;AUY3gCj8cZCS4W9A0Y4h0?)UXrS+FkV{ZES$^?JfV03!(eGg*6x?YZv3 z3~#*eE%Y3$>GE#FapQ2m!n#+&86~XeMxUiDWr6)mOd&L$K8TAztuW2ob~Yg(>0XRDW!|-ndsk_oE~$ zG;I7z)S)_CqX9Okd8J}x^LiCE&ZK7J;M?YX{ss{%k(udKK0l^U@%tlXfq4%$Otxj_ z8fOju)bJ%aV1K&$+Sq26rZTOyHteInluF$i3lGh@BIc=}u-lat!~9PH`Ur7lmbt?H z5|0f4xDPO|Y!bX3SQ1`ib|u6F=Y6%LE-*hyz^+(c3}Saz&yJa&=5Hgj&EqkOyKxun zILC!;!}{OWQ=oHt(|4zSmtJd*_Fu3!b5Q3*j&8g-3n3=r*zagO>OuwtLTV%1CUL>O z==;L{$-&4jTl5CRaes_-;*8K}RvoeQGYFuwBUgGR*B71?)@LeBo@knWLxw!M?KES{ zdDredBd>CPq@$xn#ccgsRfHx0mPehmi~4R+kP)v0%xY^`)r~M(p8=lLp=O*10B8%@8Aea1E2P+$Caq5Y~w06uc91Ix{bhs_FSYW_*2IPELd zJ1U2r36LMGyXwalk#P~Z&QU90ga;vjrUScFc??Hdm=RupV6Mk|FL~^zY@;;mZ_2E+ks@BB1&_N@B)vgLWWhi-K%SnqxLsbhIJ4ve!AuaU{)3(@oQAv}N3+T9%?xjP zaa9hkJe}w0N;y#oWf3EMQ)teonmc&cesf&M=Cyzsw1%Hx$!1q9tmPv&cdf~*<8XlX zH@&K_A(nMwrD-iI)X4xmHaj2_>_^&VxATO@$CwZ!)LuO;YI`ma+}QX_6m;~+JA&Gq zPO2E91B#AMgjz}75xyc%ZbH8}$DtX^H3z#JLV)Rhec2yG!R{Zm(HCS#u%y?4N3ov+ z7hxUd{b@z0N7BFRweXR#-18$4{YkTak8_}Vc!xg_Zb4eaot@=CTpao060GaZSJ|gED zhU)s4(Ofp(+qwi3vBrCqGpLw|X(_u2H48b0t4_j9W5*(Hi{Xoy32&ZQI-V9AaI@zKWNdPfQ}@z>dxrIRRB-)Yu--53ctgxZKx0C}sw7(Y zXNF4C)1LxW>l``{w8vi!)2sG6)NG)=1NV*Sp8h(^VH5v|wbNE$RoLF70_+DJWlzWO zPI4$^k>{jg*gr{Q8^>_H9qfhO-3RbS3}kJ>V~_UPgV3eJ09Dc0c{q6LL^|(Z9c5hb z%MdqRv$;yB7u7!YM4wU-{4Ka<{H^%3L8)oP8W zkLQtlGn;bcQ8_Q zc64#Z6n93+5glP;%9DwZP<(;)LV2x^c%n{LUB~Z zouj8f&jI@g-v*9u31Fp-9;x~JE2H;alt$8~L$G*jf%yE?%Lz5yD7=d2^~4lk z(>orK{0G!Ldn3dlHDlFD__5&)vTFKB0bx43@%>-nPhHW+=S(EqD@58q<-;Gl0<*ua z=F|I--@s5ji0Q;2)aA z2tEqq4a``{1>!cdpg~_l{>}iiD7AF@`gCqr78yR=%9s~Rx5x+JtpJJn*k$iXNurE| z3x$U##(DbzptDZa$!_Tzq+h*VXp^n^Y2f{e6300oM=0km%pj+qp}5OW(c8|v1>eN~ zE0DhSn(*53^6hK0hG@wz?g^}xjQoKc)j zV)Hw>MvH33c()ud^rfpZ)vucpp2duc79xiB7XNyp6UsX~a0RIo-|x#}N;!^3LCs=Y zPHL&5MCvII3d=G&yrv8BtTZJ0baC@_;L%S|XZ8?eKD&2Lo>du(T55ztkv~ zDgc&V1$nA?f(&uiP>s&ep%5rQeN-^@30~3LjE6k;>MiM|$dyJcc8IPm5s;mtS0ykw z)%%w04=+i7DP?E8AQm6jz#ubtLZi}A_UjW&N5^c}ZTo^=fKkSiMn}V$J5P3-UMb ztlzY-FY{DuSB|OsP_temDMzW_PsnLyq7FOnh#3ubqU_3p>UYNkt5*V)n~48E7-3(; zaJ@Gx#@HNZA!C<@G6bxt>ch;PX<{fnx6mN)tws9)L$Y}ZAd=;l+hTkd*^0K#8H-~W z)&w0Iz%E*Ul7!5?X94AGqhiJUevcLaq1YCBy_cU{pDB<_h7;s3p0O>a}L;TMV{|561+ zRlURy=M<*?JH|u)XRK6V8>2nmkJ!$bN3@{#vndhmOo730MEq zd%YMK4D|OWV}^_=O9xf()Kv=*1s+J8Gua%tW$62j8HQ1#bWm@BfL+I%4MQgPO87ah z%uH9szM9@cL%BYsaBJP~Hq@+-R!rhl%|Y&ziCcUa={@tA!BG4J%Iirjzh$<{ze1tS zdab#R- zm`vYDpa3@0f!jL;n*p_$mBJ}Udrou7C_9xB*CI^Fd&wVxgtF{LspHA_JK=_vxR#Q)M`{~Z0S^w%-{HfBPV@BEVQ^*#*&aYu4)|ZDNRK13Dh+*`) zV0`9GbOK0_dFPEv^=GwphrsoLKU==0%1if?hkSCsVyDcr>W6PVfa?*Oq93ndR+-ltohFSrk6otbEh98hNaA zEy$D2+e?`FXobo?2kG4b-(fg6zf=%)I8*eU+UNv#!(VS;N1iE60_VPu_>qLVb|>6Gndi7*i8l-BCGpqRuK7M( zlPoN*bT2wQh$KY~6THq0J@XN7>5g`uT#v4p-1tq^XRaE)W4u8zowL(yV4)xobYN}~ z^Tjc-skbQjSsCWJIt})44T$a)KRylMAG9eOv2@nv%^qw&Nr?KJ5dP9xn2q}YvGq|* zIUVn>TsNv*={&c?S<)D8ug>!bq1>R-HCmQ!sprsc=#bzkqH+%GBvEhPXqM-|fJ;Q1;(>tNa2h(M!Yk$crFu;e-o ztS#Q=mrE@9H#Y&Mg=?+7;<80G;Ed9`h;)Miw4Ei!;|Z-Lh86&y3aU{I5q{KT?|#Ra z`JQCMi47c*yp~O0i6OeG3il!e;G!4V#kTg8!11kiJJTivjl#V?Y|3s*T@TCA zL$qwB002CV|I3Atq=SsH*>XPoU#}{SZM*yQPmY?79;Sh%HlYL%y}{)ERkx0{#o=W1 zwu48_sw!$PI#lQf-B~>sr+?0xQ%LIZS`E(<925kv%w_se3%(nZ{~2SttY$U=Pqn8% zLUgB*=;-)rJpd)p9X&R@b!mv0Q)jm6I~qKdxQU}~DUG;k-s838u$vJ4tUqrNe?6Df zI9gkai3~C>oq1M7yY5AdjTmvN8a-O;YTjB9J)|(aV|-LzDvB1r*99o}65UMEQ8@$Z z=`6L$?8{ioUj@2!1X=_s*63HyZ+4ma1i22Z#)YXyoMAugtM^!Qmf9$?Utfd_Y$*-) z&&qx+iwAc zS{lM#&N4^iLx>snH*vA|e;UQt+*%7>@v_6SE>r2>6ZD=ET~urH zA`GCp0*B}wE$_HQ42Ri!fppXKGr3 zO<2_>;Rmd5)l*M2KTHrg%hR~SzkpSeCYJb2Mag-$d&Bh*?%C~0+)ZIoxXed@2o{n zy9Fi>UM&LFnYE89n1sIQrGO$-s(N9V-w2lZ|U)`Bn4k2 zEH4k+mhIHBI%H<8z+V!UvzM?^Mzpb(O-pMK#h3=~`rqAZ!$^s&R&vk7#A7@Bf?i-r zd2S%}{IHqdduPER5gDsIGXGZH-@Kjriz@&a30wz2ng-x{8rXgmm3 zi7F0UAylw@tbb_n-6tvPQ~)$lOJO7;r>PuNTM8p|rX7nz;_m zfAl`*Ym34*gzxF_vZ~P{0!*{VdUQ zfoI{-u|8)<6&fpYF>2jUud^tWh)JSsfwL;TJZmIdssiT2&xe_@SzkBBPirekYgN0f zXe&HD+R`HvG9Eip`2Z;00wyWu0S#GiPPh^p7;Ygbg;l7J(ne|S-$?gS z9=dcoVP0r>0{Qe!Ffnl`(PO3hq}07>PmC`fR*Rse^;Q+y)lz6qz0b5tC2Q*R;wWhS zSi|*k7>uph69!_z!5$=++p?0nXxQ&E3v-ct)PgYvQQM=i>=oihapC-sUoqiAD3;!a zn9UWYd(=(3FPo5Cefg>H?X2mU8>Tx4(fb=YS`iUy@0bC_`%d9zYH+wn6&xh*JHGUX z{(dza1pXVvq&jfzRN8~gSaIB7^g!8bCHAi4>Rtp3jxxKE#I zK`xR$@a?$*kNrf!w|@{JsxuPCjItp#$U;61W+O$y>655%3yZTwgXOhzqSp8m+wht9 z5@)Uaw~c1~RFOpHy?A(tn>Ep27xg4zW3s0AvEnE0A{^ZZ(vxvNEKJF7`y}a=g&mUw zEnQ$ME|FI5kqn9sNOd?@utZR^oGsNNDOJqpnXhr9hAsv@B${A9jAx zj}O3&VWOM9xtYC(U6LusfW3-j%EJuQylpqU?QMNY&CxT`i%`KkH_33wVKo2TB~W07 ze7K$Q>e>K~iZJ^bza@layDa<(lCvs;xq<1lpE&Y_(XkpN&um3vaQM)ha%F5qm`;Jn zclD^nxL9)l%31HqxnL6~f=jy|^gabp^6(SA?3QT_QTmGMmk+W6I%0p;I_vkx7+*?4 zCr%8#^94$tT^_k!qBxT{l$K`sCJ$n{=_biCmb5DK6|Zzt?WBkQqj^vR9(Zq*w(v3j z+Xh_Em)*rg9IEHiRrZe7-WzC1!gl8v{|f`jN~I2Fr5k!bE%xA%=j3D6C+=ij6qC4E z<|To95-~);-;#5oL8{~~3(l3BF6&){tgL*%X7vXypTk~hDbCB|;HT9XXH|(z_O{E3 zS$Lp=*7ry@ZCywous!(X5QZ+3!G|yL@y5p!*{`EsQW7W$-PTeKY|P5CAlu(g+*e17 z8LGZl?=bYTlfIeLx@p)hlTSR9*nrC8XOh%wdK|c?xGKtmGYR2U=)Bw2vB~ofuLOI@ zJk~f}@DnMu7p$xMK+BS@$f*Tq46&et^3&j~Ib2mo-3RAp>}ux7?zk*NHP?5zqbb!7 z^r>`bHDYz{8#u|aVd~-R0!dYlKc`^iN@fba;3i!pDvA3M9kzBcPUeXRz1R-`d}X+b zV^hGlr^{s-UlRu{GR1zaf*kUTSMAl?Br0jczenXB;#goNg`oUpdL8|8FG22_|MH|A>BEV342QWNX%F+h+FGR7TL z)!R*C+SMF$akHQ{8%1tLN;6E0a=?;2f-*7xj5EE&+$KT!EfFqQ%W9&(bB{3Ru4Py0 zFyYL!mXI4Od$5q{y22_AyPxUJWB)wCwG^5Kfz6vmwR6wPr69Gcs8-kxKAd=2Le-8p zgu|%tw4H7ITrEJm_s#5Z3F?Usnqqn9}Us*ko4F=h*eQS& zlDHq139y=X7WXF_32sG-o^N~sW`{n~@6Cy%J1CKZOS?VN!_V6IdyOc zT5JZDl3Lp|!DLK(->v!HQ%6TxL+U)Ud>f+<2*YB&1*=@`P{W+9WYqm*UdTuvfUJn$ zu31if!E59mEN8}CGG zw6i|XWOph@M>hsNLc8LBx0d>Ou>X0iSK|Dcbd#i=g09z7b~{f+dzw41%x6e=J%s4P zv7gmPM@9$Fof~CrM3Z6f!@onk66i$X>f%fW>{i{w-a4f;JrCF8yKQ}N<7Nes7kRJd zA9ckTfJURPbE8q^l#S>-+xM8BwSzIXW8R$`(N^bRCSi-y8oc?FJ|30a*%@WMSD!iU z)kkw4)n#`j4W&IRulTq8f{AKDc}2KMU(4@mItigSwb~Fm{yHo#6SGC`NB`sHzSn|R z*2;B0so|Cc2`R^8oLpN>f~>~OY%%@_|FGg*HQY^A8jj1dv$>mmy2KqER({<-CZwOm5RKHImb;aU4+1+rcnF{od`#Ha7){Pvm82^oRcZIx}`KAt zLg>>!mG^nB&Z29D0rzYA*{p2{%8Y->JUTd~D?FGJuGt*jB z6y0praw>jvhoz%*9Au=m=&mE8jlS8WsaJ#_qbFXyFGlJ)ND{8yZ=8LX>pJRYQb;%L z6xi|VYd>jkuB=tD3+$o+QXK4R57??gbqr8cqN#dpH{i3KCpiR)_^xZPx22qS&YCrV_#S?IC{LW^HCL^mA0s zm!hLH+P~A)SJh7FxjS|)eI*-3>x>8#HYZv`ok*Zt5}M_fu?H2Ej$%PLul^}J%l^${ zrMfdk6*o9^)6p_^)*zc)8U7ti4z2x@A3U*7R^K1R_UULqszmwua_e<`Lbmy53=WO3 zNXQCrdTnhX-Oa70j9s!%mW4_z=`1{!^_D$3$WC2f5>%!s2Pr&-hT5klK8o1 zjQXLro>&v&S$g83t#B53A`Ra+;-jbV$Srw7-=1KSwK0?e!?5d@Vx7#Lk{3Kwd)}+} z*1vcWE@;Sp_mHs=t28)UKXgQ_e(CMJFic^wHFI##op2dbau~GcpkT80!OJ==SIoT- zy!^~s>G)X~JWy0O|ETS^{E9&x*0l`ebYnB<5w0|O`_*(ENZ8_b-g`2|t$G zm$Dj4d$SA-!e0d}cAvFd_|$StK2$@?{`Ti`gM+_?J#YoDduZFjLawP*_&ORQe`F>z zbnt*~cH%_)$cm0h)eK*CTv(|#&aYHkZh3dXaeZoGXu8)mGdkK;bbo`mFkc^t43fh(6(Yq za@+P|PS6!=(AgTcJ0-pt&LpI~AtDfT2yRxzEc zfV*FGkoU-x^u`vVoZ8q@OU2Bu7V^Y04;ZTvo@ch+u8EjxpW9*g5aQYW#u$9^Rzt+% z8RAOKfZnujnKq$6@0y?bX;0}Bjaow(>~lg0<7C!Yre*-{R2H0}2XDAXIPC@DCMCXt zNS`U~$JgEC8WHzspWDL7s7->CJ}LMafY@spNP&F#ZT;6-&TR;PFsQvU> zCj7n?+=cLfuxB-RY27ZErM{0BSvuCw6_)*K4{AA7<2#kYJXoN%5bSl<%k?$#?r6p~m>ctnhrXufno8Ti$cG!Pu_- zchn<*BhS{V9BVvO6o@$`YU>wbA^U=UW-4|3_b>%G{Bz9+JTdg%*+gI9)zP~4)@6SH zVRpNKtGArm@RxD&@Rs=xjHzz$?!{?4My7iYqFrbsb< ztKea(E3XJ*?*vND;I&$5J!`I3@pqaUb+GqFI-W3^Y-wH_6Y?80F2BS5UsuUJd z!t1*`zI{TnOC(b)q34rm1;VxVaj@C9NKQeAvhJ<3dQ)Q=&S#0WHrY3(Ky>EQza}Ey zX|q*>NFg*E;lhoE|tAJGnKWzIz9uaMtkeLL*8lE{Ks9oySk<(Hr8a^ z_Va}bEy;DK6V8J)MJLu=p@}HF@F=0(Y~IDeb|Rl0pUr$U zG$MP=KNQJmx?^Zs{uNNyN=dA)!O#4K6*rw4 z8=oY|pES39URFe)Odq`7zAog98dnGI3AKI13^la-e6>%Gf+l?IFgQ*)7Jau~aJ6P) z%YI`G)Bv#iW`U{u&>HlH{WR?+RbF3bo+BD{ZG3iW=tM#J=j}fr>2$QlBPXtFA6T^c z;nTEPN`FrMZz#g2lIHu&!u_>z=WTUTp9E=l_okMfl^>SKi9R&T1$fvX@fD$RuAMl! zii*9(rbCY&A#9tPSJHaW!25f5zmrb=A>p73Z=~y>sOJFmd~2a+W!M70`b$5)#nrDT ze9icwY3zlf_+z3EpR}oujRI+X#$bI13So0Y1BA0V2}fq0K?rXoxSAnxSlurb&F~wA z1VY)TKDX#BOm9O&!%A9$$C9s&9(G`mOjD^JU{t2MmNg8ec`$w5$|S?`AJavnrdst6 z5lA-#i%RPqX}BD{4C}LrR?Avk4wV<7+(-$4S~kk59@t4oOhoBO&$}R<>;k(Lv$;Db|38kre>`NQ${ADS~=S36t|%|*=$h%1PfHs z1zK-ido=U;x6oq}%F*QGwprnCn-uVnfYF@|<%uSq(oD;^d7W9v#*Fewgt}qSey=d0Jl~qdV^P=LB}>`JyeZziS=+ta?uJ;dG1;KX&;V9v6jB!=F+b zv+8^w*m}TY;cVDNIl|?o1Nza8_o~9H)=&3?6P_|vPapr<_wit@m6GE7&RnnMrv{t> z;~g1_t^;Pq#z(*GyQ$9@-5O{2mW?r6`0_IO`~?4!?gd@9GYH!F{B8$^-mR)TZQm~S zd+w9nyL32n!g0~gnAcPtz&}zspxkEU?Xy>s&00$jKX|~v(8~TSlJ+vh&b?~ff30ff zS)}qvJV>^YjFoNV+7hMvT|BN#hrc+f1gyQ{;|njw8$82&>uO`(e7f+5D9t)I zUE^_I5h-n!kZj)J>grlMd`u@-+|%1TvcICTk{BL#(`2;9H8-vDDmu8&Cm^yup4mk& z=t!fuyuUONGq2-rhOqaqHjqelB`Q&NzH6V<-h5Fv3*6$7T0%O~8#|9}z+`NZvcONN zFK@EZ-R4^aqz!5OcX_V{fIo8DoO9?27f<3#^((6u|H*?vWs(f5jI%of@&owhUSF|l zm&+s1`UP67tH0#LrR%|?zBL&hJo7QTX27wbDMg% z%I}OsfuT|43r^yVo%DNoS@F^>Z+t%UMS{ZBt$49=CswdE0M6k$;oOD?kb`8;1_K9$(bI6B2yy zCjO<3^2yt8MZN?1JE4J`i;T;wy}2rdwJtF0pCkP{qdMPS!?f2Kci6d`P@1i6;(AFN z&m5Bf4C5pGyH@XYnj#kKEWw>)WTnvXH-Mniy#@B|u%7XXJPm zppAe}dYoO_h_r!CN0+YG2Q^C2Gl#nITO-1oR&3vfRr>pe$Akxr&aclK~NA+b-5;va80)l96;hY|$hE0y<6CA17D%^Ju zX?jHSf1RS9@gQb2P+P4wXxzk`;m_I1ejU2;eK|Uw0^nTIWyT5F3teX(u_L0iv!9w}Fz-=m*?YPxHC-Gnv6ns7mY@4+sG+ z@py#Xxm{-PxHtQaK%NGibFs>B>1jsM!J{p?V0^!8f_%CC63 zQ5)X=>pb^q0lU2;j&%33x-y}v5|s~4sZwCRYsPv&;$%CWNncP4L|{Foqa}N_7>*Wa zQc(3hAMrQ&%#Ct<%i`wD1bQfsrb;dv(vZE5F`bAEr(C9O9<)S*!PTF@Cqsp=dCThY z_WWq|Mq`RcW~TRq+iv^Qk)!$6F(9{aTvp4u)(RSB)FsOB=h>S{%r?b8=W5+dmfGal zX*rc(YO*3NTR;928;}}Y6jr9$wd|{yrFK~ict@H`e$+l2M{5G|1NZ>;G9WqlkL0An zKr;Q5Vzz7?5FN}N5zM~=w#s~L9Zq~aTbdve8FpDLkbu zCc<7?3naAKW%)R9x1|t2m`wkqDZ>MKI_*$*7>1Z5W;5FoHQQw{bKyiBmjK*Z?qRws zFM6q!?UDi~;KZ#t;?Mk9t9^6CLNK&OlVo8oJZ&kQSZX8gog)twTG8Z0g6d{L*jN%+=;y^O=%mCe< z4zb$D$Cl&7y_OO$W*f+10DHk)s5qZ(t^autMC#IQB@U)SD-Xj9w6V7@G}M=hGoM6R zxeI4_yVk3L)3#d*wV7=copv}--yZf-9)A`F)a)$^3A}F(Q38enG8k`j;Z{o_n%RcU z*OURJuc$ott9SuTOc83`tXfm%XD+k^G&8({W=r89e>Q#Zto9aWg&-wI`~pbrpECq> zHpQCIat}#5Biq_PcQh9zg6Xs(2U4LWxA1DrLB>%_p*?@rdGA~;vyE`F9hUDb>yP8c z4D@3!+c&I4Ep_IIIsB!NoA#Is<`R%jJKhy0UCt4cm)h_SDY6(87o^=T3o#dl#Bsx@ zV2XA-wge{@S_%==WYPysIMRHnF-NSo)CPA*#B63+KeTZN*T$5_o)P3PS*TkI3D6WVV!2QtPnaWa;?I(< zr(nO~#L978J;0nB_EJ6mECR6j>`<}{=y1n@Z`@9yf5wSP%5%sPFxCqwM1BQf@07$1HfX;HW~0-3n*a{Vs>!-!&p4t zc^aL5!%dn5Yze?t8E6Ll$g{5*y$lqWbP{L{@f0$5SG^bT2$#8}KtJHbGeG@Okr<~G zXeCapWGPex3L@-R5hQ`*xQxMMnXNtK9en3@c1Te>)G0*<6m(u3mk896zrB~28Vx9x8@9=g zvlL2}+GNOISEHxLa?60kS4}7pCoaqpzX2?CNckm1!^d&~!I}(s+yUJZuG@}n0P^Cv zhJc|qzfLWdX}8mzVbWBf`lM3oe?NWfe+hTpetp8-U$aZc=y1SJ7TX-STZy^uuU&hK z3&2r?=CA$uU)j;;e|;TL)Dgz$)Dyq50YP2Z=4OqhFb?R@&M73IwTdi-Okmi#o=nj(8-F8pCBv;qdv6Ya7ZocMvI&>LllRegg=@x6pYA|6^iAga zHV!n6`#-8lf9Lh!kni@qPOC1pz5!WWTVf(2jR57l1Q7_7W;BC!R64zO*3$B>go zlz*2~|ELhXn2x+v9u#_2{Bpx-#pgqw_=kDJ3oDh<=pklR(2RD>rNxl;$&h|IyBl>n zC9wOw@ac^ee$GNHKljh~LwWxp(Pho2Nftkl@i(0SdSn6-W1K*|vKrSHQ~aGcc6brH zU3$e~?{4*ntnH@F_vIE`xTo+PhlCcg>Cmq9m5;GJWj+9ab(442{4>ga*VFT~(Rn zQS=R1=HmUy*F)g%%0yfesbc*{qMWpS6UkjyMg&OEXwg3ovD&ga|MhZV$a3!rXM}hd zd)a{Ny;je0&2)sdS(ntTTC?y8jA5%r^itJVO zEB|C|$56dv*UdQn5L~ITE(kxJeNN%Oui7^F<(E2$4|I*n%nJVp6ajcW>ejmWSy>*F z{VKA3N%0rg_#Nz6__gIQUZ7vrh%nauw^?mERGv{?Rj=bllpu)vz~J`*h98(7oh^ z$4gO{HsObu0Dv)EsbNHsyZ-FI4HM!^kwrC*g%GoRelilX%!@c}x2jJ<@Krfx5c+SM zXY1A0+sLwiebhUCebSQ6NxT#yqe|@_#Wttw%|?_pM@R}lZ^`psP5%T1;foZ~r6(aT zlXdpgMptUYdR)7^R|`!;yQ@-Q%j?)Sw%*M%=sg{i@Qh?thqh_|(YAxXCsIw6Yb?jL!=%qwa<8<+x%lVm6`k2F0x6M zY`ZsBnUcv%hiQ$1q6V9rIp0<8Q9hqRPm}X>9cU_5wR{BcL_1o6(83$@lm$X6sMLvY zh~yo~vAsnm3_?I;-ZQlEs!s&o^Q$9KQ!E@za${ZmwJa|VHssf_yuBeD;)I3pFPV5u zFtHQi*Cp>^yNUN_tXBm~QL)klbAK$Bw8%yy7M3HQEjyeGDE7pYI)skBxQzLE2ek8e z_+4LygYR4A0To5F^=HH_LquM243;%!5an%388tGbjBf7omJ$7MP7f%^CbOdTh{Mo^ z3G}9aBt;JM{EvavskwNbgg5q=ZkFw5akEjT!GOrs`Z z{(a<#SlKL7R{E%6WGwQ2mhjPBgTKVAdh;L@F%)$$GxAJTmL8N>HDqx>?ZG--cjAj) zbJ5JwBhs3QiA+0ztA2nLuEx& z{rgS%_EO}42}!VS=HYF2-Ltr>VkH-|LWu0ZP2T2hi`maOp^LiOlB_@&}O`Cp;<``{-*@BMz7b zZzMe8NnJxf2=Xetjo^pjyD0;SMuz-QBmNd=^Cs~Z${k|#;;6WXE&lRo&4=b0PGMJ_z=I|i8R7um)Bno13jWWp;B`G>mPC?lr3n@#eZXndXh{uC~Ygx~z^NjgUTm@HO;FE-}b}o_$ zja$L#HLQ2k`DEfryq}u9ZFeGNQM|#fJBqv}$4>7x{|FPJIk$n?gns$?8+A3(@Cj;E zq*Vaz4UZ~s*uwE|8#ieFKa9P3T+&CT2~+gsrQ9mJY~ zT_3Yd^ELM}yw$RcEkC>YSS4B1QO zU-1q+2o&Xy?)$qhAvUk_38~xWi+6J64vk6!G#)4)pQV|zeJt|Bqys81N3@&(l<{^g zy6mUxt3Q#Br+tlU;f*KTw(#y@elxy>j%e>k(}iSn-XFM+ryo;n(^?2U4a;W=p@Hy* zn8SFV1?-aZ4Y38gc2$%;CY)bZZN}iVw*}1;V5T~dfbe^ol_rm#SLL;}bhSXWsqO?Q z6iGV@Hr#R~?E?kxIY|jk3q()<1{t5_<5bhh@nlSxjVD(o5br?Z%n+)Ux)Wxk+02mB ze(%gJQ-<@z8V$6c0KbRTrhj$=9-vxz+-JdZb-GW?yDNPVV2P{C;o@=){ zpM@<$Y^GoiwL~}y{D+|bjFMWm5Z%rjXZ&lB{Af>5S@V*7#qF63G*8OJg^5}$cd(C( zXEAUzm42y%2v27~R#wc1thi>LO{?q7xR=LMJ>n0=DT~tTI}a8-U@pfMjBaUIj=j6x zf2Gg2@K#rK*`MV!Nb#K72?x*r}tMwVmdjk z^0$TXjgx4pa;Jb7$>ly^ZVjt1^XDdd+};?%XknJlIKWr^cqVTm^zG5!CiHFKC2nwr z4>B5LHE}u*ICsa#o9rKdp!L1ea{}L(mszqrZPeL{9yOpyolZgguFF6S1se!{Rh0vJ z^)mwg1ybbSf1id}YWuM=!DUd~59b2y;2!cn@h^b-WG($7_gbnX$j2aXD3N|^G{1*E zJhR)0cude%?I86ylBoUur# zKsl0_JGK2al4ppae2vf&{Ja=NGE3IF@VCuger=951&i);A9-xd|J*cZ;BCal{6@;u zZq5Mv_hml7j8Do^D7Ir>PDPC7+Waa%ifqDJXZ>GOj?dgrkUM$Bf+tY&c|J}n+(6PN z;LtQcSbmYb1s+YkH<8xOEXdmet79%#6r!yeNX4-=K6zQ-;R3n?#D}D%HFTaPWc3tC z$VkBBj&nn`j1f%yl{(+>L`-o05){dzWETe(07ijrNF!Vt(8byBl~8;3>+O)N;_UXA z-5-vhX;7dnZ%f>|9gVdw$+it?)3CA#c)_{?LBI(QXShly&XrZPiqT)8GRBkbr z@h}9|h-p_;WGbe1)@P2={LF5ICGJJ|AyL57`BDxEcf{5v>crUQ~Jzzl!Q zC2iH!UB0Ig{%)9HFLU*qsV*tFHGEpLP||Kjta{1-y2ef<)qjm4yfXIV&-1A`4;s7@ zbSi)1g51mpX<^AsX#4uCP?`T4`I$14p-dA;`MSkfqva(#^Er&|5aIAh{aL@uaLpdx zm1|k_MD&inw}@AeJY*gavj=vORwG-6jOn?BD^URD?NA!p181q#Wp5R|duJamE8CX; zAg;FT9CS6gAK?ANYxl9+T4d#6n4lVdTh+*k!wcodnRcd>6wK7>z> z-SzQ5brq_RE9>~Zwz}PY55!Ot$S7L*$Ha`A2cO%f?=ce-!j`yEgD(yM9ni!LYxUo9 zZqIX}fI{v7!~_2pw~(hLI9J_(1!VkhRu)#y{OD= zzizOX<|d-~YFM6U(Ho%l ziqzl}g4UomkRIQL$|ZM+SHTBOwN2zkW|~$$nu{~{kq_l=;WYD_1qPSzS_U%wNKmkk zL5h&|wp83h^CxXo0sv-4Hn~@l<{wq6rhROJ{z%o#E3{EAZ>E;Cn*gGfDWvP6-zd8- zg^IG9nbEp&x3(7C&;i5*5s^a8thx_zd);^04G?OYIbC~`qbT2Ex`rjXTTo>kCa`@K z+HU*yZmgqJmRq+SkOsFOF+oe$;2Kf?8E5hB(tn`Ej(@v7&w1|!W2tNyG^4*oysA&{ z?+B5bbbBeh5r39%cH?<;et%GLj{O1tK-0KjOED^Vehnl(*I2vC%EH-&%C* zi)>U5A`)pSAi3R_p4ns%nI|zLPcWH%%ya)^$z33CF+B+alx@fwQnc4a?cXg6o6%ZMoyQcsihszI|n3hO= zX=m!j5TokqU5k=Ct^5GaUzf%>+~*VSC2+CqpDA!6g~e2K&2or*MGbbrHkJV~tR<4j zeKX!(JHH3`EaDyGz1YTi#8U}^rIMGy?2>$Tudp-{_7ah8zCJE-7|PBEX=FFgM+Drb zS8}ahdwh@lDbcEUQ~~Yjy>@D+;~rZlWL7#nXnP0*-jfYEo&J^D(I*UM`wyPBIb4wW zc5!><=YcVKnf-HPu#47?aReat<{ZyYDi)Sn(8eTX1j`1!f9q>fLox z*1Vh|*A^3(NzShu(Ln-aUtl%ba}eaEQg{cAR*t5UeWNy=AobEo7Wqc(yLqe)MNq4E6$$~Td11A$NT3@O3i2+n)B`7MGM>d5O= z{vDNX{RdFQid}cwg-(u_KVPfzr(Ipu+qKL7&2IhM61(bhNh`V@wopH0U5QNhELV_D zIP1?R9uyvm)UJAa@Itd^0TjUyu*)pYd2}9m;0l67LicNNdi$~X zqKRE{Qf{U=CbrM`R%B)Ai>)Agha7}aB63r$V$?3 z9dh?>=Fvyh2bb!8Fu#ccKg*;OK7Y}k#R=3{QYouHo{c^kfLo7Jl2_6*^K?|N2VCg7 zdbdsPEAu8LHzCFFo(Jy&L&b|6JBG-IM;=gM%b8!2osY|~sj5XOkpL4sxEY-SoUNv? zIrI9*w0l+dcf-M&a0}P&)Y)`Jm96X3eANTh;Akobx%DmsC|fG=IM7{ncHn}h<7||o zv!*?gW`|Mq4@Ff#(*L!UZ}ibm>o=~h)8)@60xgY}udH;CH|jfTj4iNRZp12vm5szogx20XS|%G4L1swa%~=%=QJVtnns5MP=&>E)Yqv4;sUVs0RrB9vx z`Y=Q%SXy5jLGVjUII^a7hSGbWv1B(x&kJP-48`G_3EE+1Uc#})uY<&o!*jbXs@eiT zLjnE(A2Xi3DeUc7XjUa4;QmVWYX7oH19NxJkpn+VNid@;~9-u&Hh)mdJwgU@&k z+OyNp zo*za(RYqTd``WsnhfJIme}72a@25zwTy9f@x=4oDlul<^KzgP=#HSwCNWO}OewU3- z!^f{=jh4R#B&X-IbIao@CvdS4F<&-cS@EZNe(+wA{KEJGe#W}N#;+%nVtRxlZz*xO zM^R=ro@;FIZE{KB=l~%rC-vhf_NN}?E^u9i%k71BV1PRx1`q-gPKC&wo*u!O+Z2Hm z@7br%(-x=eE}-h~PGoi?(M6=CHmQBOlPyntF`(|A!~3yb4!;{n-8-9GRrs#dzGP9uGGajBi!>HsBazgTPAF_ zZIfBau1!LZq6KbUmsj;pW%eSj4J5280+9qgTRPx^dbQ=6aNyM0OwO65%a`wLx`2Dk z`r%;d@h$y*Az|*Mk~CGcw!NH-jA;!8cExUv{PCXGz4ppjt>eD3Yv~xO=tCLCB@gv? zhy;cujZwhNCaI9a`u2V{BTxMzzG%jtvmc~u9k5ooP!Wgq8 zk!K$7Rv;c?grh#3oUIp>wKw9FhbL1$rXxt{mUmpGTO#Bd)d}8|KP~9}nj%j;*CgTz zZ7Bmc=}Ri#ODbQ%xUOh{ChTigkc~hEY+uF?&1Z=Tx`iOIHowGnZcRlFNeJpPK6rOUwA*(U|3NKd)~b`o85T=L$@3SAFj+-=!#j-M!sZxBQVHGgMvV zX?hbE%oTcLDbPa9TdX3HBH)E-SEkFIj^Iv{pr}iW|#21n-Q%@J}pl%0D zpL^S;5(&Oex-6m~%L;Bt2&3j*E-P(gNoxg*gG;nw13bL}Ul09D8i zOY|s-|91gSwHBxWM@u|4 z^n`!Bzujc&$FZ_@MtH7DCU*6?5b2rK2qsah$}94ps|TXLH`-@A6hJy#>^q)J=&wyp zz%uLY<888e-^HAWbg{l?ii53ydkX!VRFoeHV2>oth~3u>XLk2m zS3@+%EUr~_)aQ4#yfgW`;aG0u!EITw!_`Rt!9PBMvpVOkaLg$ziG=N!BaA5b7xL4;yG#%W4F9#&-ny zB);wS8O<}Py1A{qU8sZ2hNN(7U|pHQ4ivL&W2=2h!+{@=)1+dVTR(Sh8@2QVRU({k z{7$U>RsgHT?SBWWU1{BFugbgXcRU!bpZm^+E@U1k>GHku&L=egC3(Nd@mJln^-y*G zn)~UF#`hr;aC?BKsqzd=-S9VI(}sWKH|f7pJSIrc;TOxz2m!c}KT!}`kZFo7G8MM0ZIL{Sr6a3`w$LdxBdauoU(xM;>$B1;&7}+33m)a63vTq&9!3~-VRIs3 z#XW5dg&aEq6Qq;)tEl0lN2r4VE6Ij%IP1Ofe4f!Ok=yWgZM_BXMonW;{8detsmg#R z`wzyN^P=W+(La9XodnLXJl&8z{mBR z%{oeHk#=stL+?<6Wy=&q)eX zo&alat>^5S0i*62Q|DI&V&LE}wT5M^`r6`5j5AH4Be;~RA!4^za;OxL{Zm=vv4;J? zR9ZQ`+Ui5_q}{`endsU{v0Y*yOpxkQ)3?|Kh%f$&YYE7o9_Tl@FGo%4Tg5Yv&guS? zG~ldxM@o0kd^rj#s#_~|k2%9=)JIyFc<2{SZHRBt*FIhHbpWHpoS2Sfp;!{h8gta! zeSeltRS~=PEDUHvwO(k-1Q>i*ptvnC7%_hZ9M6i_P@r_|Ro35$dn~(rKwQ~{e=j23 z|Fr)au`W*B@=^TtBmZ7pkIa#nu3k^CP7OCAI<-g63LDDLu4q~1#slobKWPt;Aism(UktZ%aZR%WeiiKE&E1}KMQ z1nm>Sf*HA5?LFoCN7$1Lrah6^J|s^F8c+0C=5f#bUGK(_B1fg>(k4y^E8rNdcrS(H zmEAD-2e%+9UmYT1S6ER)PZa7o63^a(jG(6g$=fA3 zs6@V`fVX9mnpp0{fNu(r`467S%mw`*EutV*{fgjDL*h95N%jd=l|uL#jylCSh&s)f z8wAZ@C`s>BUJNh9iN5pbNlnR6cU|uvgFWBf)n`}wEFJ1T%n0CXyVCqlg?G6p=EvshX9XmK zlf27&K<_`9qJ~ZeA3EDNs~u4605@&e2M50%?li*U~1YT0*esEO2DY)@n;7MjlyvuVo3d{c+~$ZM8T- zT4Hz}bKK3wv143N(fk1&%)cd6&lHt)p6TFX`*t-!G9bi&wCqHP&jJBM``YmVw@voD zErz>5xpvD@agg({86k^ZApAJd=BcPU6grtWPaG6D+2FU04!0$DR&ZO}W9q_*y+0Rl z@cMtH6uOIpd%%UQGua%&E#sSrH5qZ=H(c7& zE)i6t>bx`_ywR!{t4necV#;`F`VE^8IK-2w>9TQI@t7pVgGQ61UkFx#u#YGjjfGE# zfN21`+4ekpWp(#{>`9tz4nxH(tTj7BZ1<6li92yG!@lvx%U=qtYjw5DOD`zTDmH`w z>)861p@*s)Jp}iR(L$x`=ASIA)KPPAvlUbPgg$i!or$NY50c<>O2jD3)zEv0jH;k; zsVDsQv@H_72-q%JU@)Ao#NdQN&O1^rRSV4argw{qL(U4)#OoO`V(dkWMEv?BQu6Z$ z=eF!qc~dUKhqpN`mAW(k zaZ1_aB{XUk=#n&DrMk`#$IHSW3^|rhU}rVpFDM!B67zN=@+XLQ`-BC`JB#9XC0=9- z>TDdcc)Y>x!|$vr+)4^AGt3zeY3g*<6H~2Av82|wNA+ZKF5B@94ss^6|NXgwH9hj( zl2+8uq*f{VC%f0Az2$&dCKHVYA2q%yO-?cXwT-rzw#H)VR{ixPt z9)=cQ$qnRkRYdKUcCC+?@kO?$$ez`|7E1i)svE2gD_6{J$H#3=g7I7`kve{a6n8!A znmIEL2dsblPP#l~%J@ zOEow1D_=Y+y$h1=>KM7!bEImd+$OUWi&(IIL5VoGp#WxEt3xS>-|2`sPVwR^?Z||$ zS2-I(?x(}Yp7>9?eBD=GXX~guc*+8sFO)bRS9|}r4Y`Wse{`B%L60B9eqcYe#dg<@ z3jhq8JJBZ*hOa0tcdLu1fh1ZO7w7J>gX{6ria;e&3$bE6d$E9HZ>M_#E-?e-F2oW% zxqTjQ{OeYt`w}}aqgyeAz$hv|N{3D$*MJ&@Wu8BwU5`5LN7pVMI$Kc}r@u+VKVr}N zKOiO`R0nuvv2%27y(*Vh)-D>)umy!0P*h$$T);hsy-l(4BYppL^bz-St&mP6+EEnJ ztXtAeWEN@^-LQVDxuOUZZZQseq2Clhq!l!$Q<=Lwa^5{NF1>bdNJCAGyQKSg2c%yq zj;}V&eIDs}oq71072xoH8H*fN_RNCy1(g(Ne*M!Us_K%Q9b7{^@}9iPlqJvFVR2>B zr~uCNLAiX%+HE^jSOPR}9V=h{cY$L`ml0lOfqX{{<`>ux7j(BHCv~UGbte)SpKIl^ zs+pFqxWY6dQ1HF&i#2&coPZv1yVl!%m8k=34kJ(3h*PbV6sc0KlT%y`_3Atm@^-=I zUQ}IwMHpv|06Ov`lD0x*v~nb)NcRg@r%+-^9`bbNd&ACr$f5%tax6KJJT-&WQ_p%` zrbelJ9}3Je$`9)xM>i_7Psm`H8fTcAXi3fv3B6v{U21s0)utrz3QIAl#2YUwXxSEN z%JXDzq4soOpRSJUv9Yh`o?u_NN`BIh3n<~pS5H5+>N9>M+^yQu$BKpDviSHArXKWg zapjq;p~^@Zk5w&*rtsfaJjO^0)c={t>5#jyLpF}0?s(}WtNo-}U z9YA)s>z>Yi%~Kh3O!r>EU@4UL;%}O>mH{F$9r7?pokZ)q-<$hD$pi{I3}9@-)LK$M z8-EUHsrvvKK{r%3vTLvu*zvM)v!Rr@9xQD*XN8Xo;N3BPfNGiPgVp`7lsI0q|B{`F5bxI zE`96ajqEC$TZ(mLElVl|2$2IeSl~}F0*$Aogy)@B7MdSn7m%+y3vhArCHax_(*1te zb@IMs{JfZiy+zPx>}ux!E2z%?4}YYd>Nc1KV) zRerS{>WOFAipK~0YG9oF+%b#``6?RId8CY5>yO#%dY=Ckip?xd0|9r_$2GGzk#|vr zmp?&0&0xHvGc?7V9)}WyBQ92>r5{V7kp(OYVl6@=Jf~}7`MFga6u1TQzu-nC>^ZSK zG9Xo}Ds`0HBW%qoE0JyJw5hWOm1y#g04(gC-anuA+ zK{&+#)GqvBKD5>Be@E(ceoF~0sT~QLdhh?nSlv3l1l$FwY?XX5Dp6;YTSngQ(I!}k ziljw8KkNoCNH$@8A>Fob8JMAM4|0*Ql1-duTZBDhkxW)ns;Fa^=C`p>Bocf}6RWpO zBI{Vx#0u18(^k<2$*^>x(D;E}xHXaurpDrU3FB z@(%P#P}mdt^k3rl@PxScppKECuC^xDMO|O_ET^7eeiN%Pnf4B*juzbfd(0*QDOiBS>uwgr}?rkM2b@BdRw#40V>la@g{J|DhOc@CEmt>&T7LC zKxvss_I^-dD|&E`5lp(mhnQ0yK{*b^AL$K?fZ?ANh5TmWlmz0R@Q}W#?*zZ9gt&%% z*#YY)n2A#)6Yk{EJrVNj!qb8gcJ+H3nBqfOS9p%?h6|B<3%bI$BxQA#)I>(7m-x)o zMyziNc8P`65*H3TpT9;Lft@Ha_t zvX|2FyWTRvF-$u}^_{wV6Uf2^I9sF>Po;_Uqcj(1#?CS{=4+A(@R&S^T^H~ zODNo}c3?wTRtdvb4Bw5Q?FaE(l1!MTQ;oiU^5~I<-q!&WK`osU)pw2{#)26qePi>J zB-i)~w_?51rB&c@ADye_5WMb0z$+T=6SkvVtu|N0GO0j)#_Z&{v&M7(L0=;z7L; zU3*z)r|zR~5iy2+d?Av1>7L*#Lg09>v}`(7cZNPw+Sc2;y|MQTa3T&^WPLHu?7IMh zc&~rn+?eFmk7Iarhu`drTT(>{6A^NiGD|{U#4lY&r5+>Bj3WYP$fKRFzooQCg;YsO zzR5;9#u9JIHbh#vJ91q`s#wQaaSsQTpcYne9r@!{iaq0C)ru-{pH?0ssXLni>!7-= z2bGkKzvk`7mh}G2Za|`Q)V(?pVKDg#iH?r&(a)&HG#a!anmJNHi3#V-E)_s~?sD35 zWwHk@E3lPTv^HcxI)d7_4gr5oO#r>lwJi8%Hw^8yfkLwsXAFNrl2FL|=|0#eK+zSl zY`A9Tka!9)%%s)S&NM@VkS|DME;1bNvmpO50fpPfzuv z{yJ+(vhD1Y&kMp{t-l&s+!S^vc751N)6{wM=EbhxyUpCG?DxH1PIY%MgSRlSIukE1 zPcP5Ko?eoJ`}m%FY3slsufGK10{oTSi;=rG?4!ZSPp@7h`ug|#pYZ?QAC9)r*9WZB zn*8CIXp1L5F^^n}H**i0b{4go$}vFraD?Y&{Nsz}kH$H*yI_kH3|E^?kc< z4s93K zGlg#03h=bBm3CaS4@+vOT+qnMA!H3v7bSRmCbdLuq5Szk5Hwov$eT%~JuwFYlnwbe z=up5sjypEL<;6y^`EW9{95y%#RYH4Wq>br*)bV2B+N^PbdR1Aa%X4$=9pTzO4p?fk zagxs?ttX?ihW8J4pz`B}MUkHa5Zc+zGJDK)JZ}oxb$klCk;VEFEQU_k*qujFX=~jW zGHn88PCIjsgg|eU&AvvQsqQ&zBa z#t8nzPXMYqEjP&QH$rmDY!>mBJ>UiV+FJa70B~+md+(-#)1jN1HP!`9qL4Hj3msp7 z0PhJ_r?hwzBVA&>budJWi?c8O5LCLD?FwKqZ00c&ydd z6rPzmu;hw93rrnXtdt2h5n}{`a@HIc>yk}U3sBT{BXYL!qT5iMr0fFe2wiz&IYMY| z4O!qu<;hMB(S)NWn?cQj()Irfh;0Q2G-|DaDoAQkUz>>jx- z%^G9`;BDo;9Wkt)1si(ETM4=kx)ta*rQR&LQ~H-Q=Z)T~-2sXT)3$tHW(s)5^tmjwu95X6UfT*3jNUg_YZr^^ zV2ebSnwDWo++5e*fup2enoR8F7As_gmNP z?)#jQv?f`Cv(sj{?d@fx;h@n2q>-5>NMk%fXUpUr*^Ig&CGGp^Xl6+%A%}R7Wo9pZiQOylSX4VX(!%Y2G+`XIq$c!P@nh33{D~PMT7q_ z?KhzCZU)?=9&_*j{*nc|~U(LyTi(N_g2Mr!auvni( zqP3Ncu704wpN=&Qo0;27XHWgJH__HzdIv@cHq>ux#Mq5d(A;#VNG|F4y| zIXGYu9xx%NnQTE&ooy)G?v8+WODfBYq5&8jC(T8kCfx?xBap9jgy}g*-5J&^?ZlD9 zTy=PVH#0$-P%3+*RyR)1OB@^tuTffh3tC9d7c&Z$GCBgYl}jn4DOvCrE0#tpc$DQ6 z>hj1q$ASi0OvbZ$E3j8UV^$XOXcUf*HZiT($BOn|w?(!n#n@6^b=Mo~ndDso3@&SC zpJS7kOQg<`6XsIqjTb3qRg$uo8-twDSJ$940vq zsFlK3x=Z~)+Iaa=Z43L@C=@fD&g&rK8FvJV-$}PgeHFnhRv>3SiL{t?b#GN|xCIbH zb)}!jvI~wwB_D+uR(EqXk@J})gFsk?A$UEtf3e6frD-n4nWe_8{YIqrS;3^2G9X~w zGU^}&=N)El6-b;d_iSLZP3&MHPGS)DE&Df?a!rXafq27yoeE3X&F@{{6KieoCfQ+y zkE{)~z!Dc9xNaxaz+^-n1)DDxcWKFtMnmQWJ*#Z*2pM%uhG@643J4W%qj*f+@klbG zlpS<}gVCld)JvI|d}F5j10z1}vlS)m=M3<8^I#22nA-z#jCnCa8|;@`&{ML7V}p(* zy&Q1OYY5EHf*+qb)9X5uY$yW{y{?SZ+{izDvA(+2-69vrE8Lv#$9XYyj(12snj?;B zJdq7H$(#7zz94-fi4K0th|I#&RrH5UIgbxY4#LI<9qaG9m>vdAhiA=f((ykI4aAJC z#fM>sUW4BiRom=?JJGo`C#dZzZDn@3oLEGl919h+9Vu?zJ!8vbVr|~xPCLzS>%##N{LQG{|gN) z0r{rE{3jlKbmVIX!!v_|v;-)+*K+qFUPApMb{Kpf8u*pZQkU`7WT9xYAx5gD5dUnH z>HZuhH?B3uE`li4wHHej2W(*J{F zqQSAe|7{#9a9w^-TME_YuPvHAKByoh85ylP#i>4Qk2m z4#{jaB&^YJRL{6?5XNh1FQf+44g>zmV*`HjxEjL#B>N8(1j~}4=%jnXY6tm7_fA9Xy^?N*i`^mshvb1B#rb zxcB-V^w1JmllgDL=pP zHxwT2hQtpCaW_d635?acp72VLQcbzv&G{YvqMl}u9F4fGks&zGZi~%{7fV2rocn{0 z7?{s(UR{h-z*$TQv#{X=KwZdl8B3Bd4aL@b0+y)y!1NG7@uN;oQo8o_xPSQl7rUw{)7c1{+(mdQsC&7iR{l=xi%g$-DJ2{m>3mIn zLK=t5LL)Ta)_ZCX%Ifs7kqUwA)k#bV!hms>kG;wqgHGu$I4RMADUIs&)zAN zQ$xBtmoi1=9?5Gt%4MsDi2wOwm_j=+|0S}KQq57uW>I#i5*cnQ;cle$+;D{ZIt18^ zG~LlkLBU@Jd;h)=6YD=mt^u&y9dXxWTxr#`hN012YD@+*AYQ0#h}noSH$GE+Hv9zy zDq5#~g>|U?`Rw5q3N$*`t`>K8_M! zll$n_Cwws+0(Li(H;QW{H!qzbc$iSLA#1E*NO2!yMD7z;gqL>IV{19H0DxP64yBKSJ+ zGS<#Qo)zL_vl*zFKcCfiIW5lRtLcx_(x8^^D>``?UWiM?c;?flz_nY1C5P^TKBO~k zCT^6)T4D&_^vimJxs2JSh$)N}Sl-JYM0i$l_mk%E9ZOgN(7}#?n!|RdG*8(1v{26~ z# zW2@~b&N*7l^$PDn;3*dG^OvzF36`SV)ekUzO)j<*ql*R`wx1(TR~5onTcnOZk-d*+ zgBN{*ucrCgj?T;zRTGHiy`Lt31Ixp+FlQi(O?IBTpYoc!$Xlb7CJS4VkFXi9N`_>e)q<}L0{uA)a|)GUau z`|m7jo5w*NA>f#UBq8Qk2x)euR$%z!=TB26v?ugZ$k7IaxX=T?EAD1NZ5zQn7y z4<)l$cijkKS(wKZndA<3uGE?a9MF#}0w6@x{U1_MPdM`Fzu_k!4=Ciz#@zJ0|HjY% z-|&MT&=J5#{x^P>SeH{|5s>CYRrC);b=2|_F&(w&duDix6!56PQEt{zmH#W`D5yKN z#mqzggPmI)nj*jrAm4HakX1>pk_Hg}9*wISrFH7;FTF?;psTxuc>Q>O(>CT!U?AYJNBC$Xo>N!hl|B zG(}w?cy9;Y2lt*$4QlVGd!M0{uale1%T$$1Lg{hBIb4&fqN(`d2xttW znhCyaOn0>)YjxuHYw}yps?_HpSc?2zG&?m1G3IK-r5zIRLfaF1qbF`lE-=x*n?}MV zil9#QKF^xF#s{2|Qo%_wS<3S`nz+{Gj#fQ)8tx3McvxyIX4N|RdS=DXaTjQE%maPe zx9pUIKWKY z#?TP5U#16Z(~u)ovX^CuMWzs&s<4C5O$=B(#YX>?l<~#pD2Haz3N35M-%OgnLU0^) zOc$Y(os~k=FQ^4n@vW)aW@ubJMxrfd9uZwWdxlqpXovpD{EVo`_NYTnwbU{p@G69M zM|r#D_+b%0e;?SD3_-4Vd7;Xj&cJZoUkUeb7c?O7jQ2q|$Q^pa9EQOQ3nCqMqK46f z>&^gtsDtUN6U?!UFf|5epV;xzRfmQyXF0(mmq($1js*X?JQ>YPY-zk%h8z8lAF zO%>jJ5-gDe?geB=0YwS=--cHdI^JD4v zB9reSjFglL-|Wr#oRF%H9g{Z#?Lr227EHdM%JD#4fBiCg7omgOZd#vMvvVNF!Uj8& z&AZQ&zN;g<5?$o{v%(8~0bQ1m$yBtjtSrKe;y8#tLf=a5XPC1#GI<%Q$8}EW1%G6D zJG0n+XQ!<6A5GIM?T7l7&&BVcH=sG8FFeFp${mM&?4V2u;nH7^=2|@9{XcBIdpy(c z|36+NNm-&Ovn3U;dS#WDOvaK*rO;93lvF}tgkiR%9Ez=?D2$>grzAO>^Q5wJn)5K4 z)6CABoqkWR_viEbe81n@=Z`&~cDv2>ybh1+c|ESj<9@$iI~+;D;2>9sSiI+1mdjSL z__Ge1osw8!qw@hyh-lc#SPwmi5;tn~!Hpm(fEN!uC=T6aCwdllF(ZZpS8#$hG4^Ct zw29x0?>4b~=R(gwJB>O3o-NfLF=JS};IxU6jpz(0azZJ009BMG^r3eF1(^bF)MToO z6I%_rSh*96f%##vnEJ<#(oXtIbURln$ORSXFH|Y)rkJ}4{B}~1l0sQZMMy{gN@!*zYEnlRj`qPKsFN^ zIl*~6py+Cp^^{%K=-I>BLw2v&2qACZdblz9BoWJiPgWu(Fogm6Sm%DAaX_KO=bR_z zBHo)PX6x^X;pdTTdQF@U7?{6PaEFLBc91}M{`|r1H*YFYKtm4Bp{9X@-hp{$T7E^! zA7w5`VTt8%OH5l9(*stSU{^J9YnKCJ#) zh>mC2E@dL`Y@HY>nH2FgJ}1&nFwIL>zut4_tP9mf#@!O5n#o_Ao~2uxYt=6$kJ(UO z-Dz#ifvEd0W}hacqfdHxGWVl>VdH4Kq2j!j*NZ2QsTtM3Oxt+J_1cTDbsPMe00mUe zm;tTs!nm&8Wy_Be5qKs2#0Z(ONXWS~c;%{#hqIBJ-p|JVYsD(c$_eYf>+{&qlk6YpvkmefC z0wnR6n&YkGhcJjaO2MA2v*AHbugz!=fcONQoo!4;b=it&Fq+(ozBs6~DIgm$x~9ax zKC>R!ZQ5CF9v<_19uRJ+SrHuIjMC_!Z$?aP4mL7D?sROmSe|a-Ki>HQrW!TA^k!dH zB3H9+as1+32cRWXlUqIz(LH8IQ16C2)aH_2p@7a;|54G&853WcFrrIuWGGgmMlVZR z%#X4*2;v`esf+B|n=;GoJ4H*>1{ve`X5L2ZM!)*I)Q{!R^0N7zzq9uIvz}*A;$uEx zV|VAE#2ztSRPh?lyS_dy;;b12SV)W)_ny!@B+no@s6x zeTl8b?6Y1viSx`X;l%b5E{B;8v+U-buM-wsG&g4Vc+3}cy5;+14-;Bqf{+_Qhu*cf zywQnF$yZGYoUo~a0zN7B|Ey7xPCuM6(ZCKGz2^oEOb)3%Oc7akcsy}-k=_W#bkATit zYQb(&Oqs_K)1~Wxs0=@F_`$0PV46WB?RS8UedcKC#MlSu!({)DaZZ`82}u@Fu_C=)w|VH?Hr}9%OL? zS-HytUh#<3>Q;npsoEPWk;MmxcI!MbOJ@`28}={QO}zV?Ysk)~;>#w+&VtB$b(g;t zj-HsX83_M&V&cE5K_IhlMq_L3Cx?zTE6I%KcQHXVz({Fy03CjgDEV#d2((f)%ApR` ze{hCe$YuY&x}@%R-YlzhNz>02cxt6Q=uETOR^I>h(8^uW^#6J2^5_dN4Uc2;up1nz zKR`J2BIntqK0Rew+P*VXuVf`zB`Ui3E^y94oy&q<6JQtX-8;hW_$~eC=}?ISm9k!P zMU1krUU(*d9@({3fG@(PL=Np*5a!g%y(?c^a>Dh=mC%IL&p&`?al#Fk!#bN2#m~@A zKu6eAk>c~Pfr<%ppxe`s7pOS*Ez{)Hw)g5n3l1aQU9uIsI90>;8+%xG(J^HAXP4$& zy9p0U_M+!c&OA8&6nfTuF*naZABxn(&R-LuPFrHWoD0hXmf2zF6%-(nSiY(sm zrS5{zu(+as6AUkFLw;6XZp8AOfb_86Z%VBNS^)-Q@_dQ1SCKYyUBM?IE+`phRVRNPKSDas4Y&kurF`1an&B%Bss=Qcm($aCMjuYMq zow4gO4D=!fzwSGql^f9Y#~%6TE7{I|ri6j$Ab5WzUwr)@Dye%Ty*(zM+lWLT&ouh# zk-7#U@aV&iOAmDZoT%ldovB8!5|Lx})welP^Uj%#CS1y`okqf**RQD0Ho}A=jWlZJ z@?95r`W0ibI&Ez59?`Avw|%^ z%{osHeHluLS{%MV49nHu9Fij{{S)1kq>b#GtMF9i{goEwUcdjBb$^+SWr;^XIpvFb z687C?rgG%MrC6O6rv*fs&# z4(6l!#q_c?8~J8}k##$(dTEs`J`_NV3Jl2B#>~YA-JRUf3^VNU(SmueF|6cHddZwD zLUmA8)L9iRSc#X#k##<%?ULNs{2@xsb;`E#N7j=b_RV|I859xI7GaDBfmN5IibUSC zs6+332ERCmMD-e^|BYO+|SSQ+*I_L4hXMD^1 zsQL{83(I-;n^^(uQkTK;oPkrfPU;jy1&*jJk4Jbj^}OSn$SZ^17!7NavQ`4ZaN`c_ z4*${AXT|qahf@s#sXH5)F;>@jdMQKEfv(O!P>aBlK5-ISL8)-uE%`_PMmZ?3KaT#1 zqGz6Oy(8t7U|`#P@X7&Iakw<*tEhC4oS3D63aTz=?fydvPKnZ>(`j8AlItlyjujP( z#f8E|#?Y4oT+_h>KT{N_Ik^0+;A+@-xbGik**&z7)whJ z!u<5{tv9bou%HzzAT|qTavZe;RqlgEAmN$Gs(1RM2S>%5hW-%$3|kjhyog#Sh5Bb* zx(cgv#a*ef8DJd3oPH6ySpRPR*Qc1OPNn+Rce4i;xgSPV=6W*xBeneM8d66Ry%VmG zb^ds#HG8^)P6-T%SUT5g>8{LV4zZzD%G{)7M3l3|ZxmT)11w$1eo{}j2e?>FZkk^^ z_ja1!7-qV3UwNkro_m`X+7&2g{_yhjrKv?2Q21JqToN$t&2TPSsxaQ5WYds<(%{P7N>Fcm^DuY5-G(Z9XWTvI}zHp zt*rLAOAHR>{9y}&^V(laNVX_0Z$Pv_7!7)qwTZz$^!Eicq)l=+Ow5=oqCTA7Yyqr8 zY`v_k4UP(_aOgnd>=X(w{#$-l8qa_I!&A5U!4e%@`Khi&g-^EN9U;ycAx_{7ZF%Mg zj*_<9^7cIUidTCahyQ-hifb1Vz@+D;v&WcuJ`LlhO;h#48eauiTQdBQ39;9Fjx{r) z)TUBgZgXcZ_9Q=j{xqW39&jOZK(DX{kg0rGt}0@73-3@($-tNmO8%5S_Q9>e#Ydy) zku^ZY8iCOt~?A#R$wjLPFTvDj-Fwph>N>OX6G za9Nd&-2rk&$i6GQX!<=jt$RUMV>4L_3%zwY5#bqLb+I^Y-sXXSlnv$LoHVv~Q3-p49!$c(%QB3Vsa1MXd$Xwc$zUTabT<@xZRViL6q5Y$e{} zFR0FC$pk*YsbzQ4lbuVxQ8}aL*Ic*Zwo@nEj~4c~!&>b2ItvH19593D+!Pi+S`x^t zN@&*i7_wA_tc^qHB4){@_o1}L^EEw{aF>F2gx>@o`<}`Me!o@^zyFguz?>=wac!_( zCnTuP`x%%IkX05PvoydumGw$g_iM0~DT5~wvg7d7Dapnby7}~EL_;^S$>KPlgZhp6 zxMYV?v1r+!3XGb>(Dn=R`F9R#B?NV6&iO_>_E_w+^A578a*S%p4&NGBJ*q}M^SiQP zNu5ooGqN@btkViCB#9~;*nhqo%%(l`)9kIxFK{bCek}Q=s+y=?E!U!_QUVe@&cB(v zQ_t8%EH2odftGeMLRuKZhIcADTN3j8E~{0zQak<_0D1CWv`^XvDg;xT zyHJr?GDv57>%%z3N410moy22>TjuF1qF02=he}h4FYxcfiBoD@4b5a=@=|{KephweCyg*^7*oL$4XCd(qb{ffkzrE#@ns z3w7==3G05#+cz*PGK3GU6$tKGvrro!1hFXdV^ViXAGF(hbqkVnu+wt8`{KhDUAEHc zb7qR|8KOwe(bE$(;!DhlRy|3z6r4oPe9vFbnNS8#W6{V&))q9m&Iis<$>vi+^_F@ACbTe>;c1#j8d zrny)Qx=PlB>QuU~Q#gpBU>FB3QN`=jFRUPhkf9dtq6p?B`fRwKFve4{77!VdIHTLv z1cpN|8!Av=U(*Yc1o!6`6&t z>YV$E4$-G{Hiz$UB6+MMVhuCCPYiD)H~x?1w9O^~Sy+u&RUhvg@uA0qt^lyT?-F*= zfA=3@Qa348@VeWo?%m_$R;%!g+Y9Wu3mLAGcUz1Qge3Ga8JD6LIdeO&R&f>}o~Q)! zR4cQ!or8#pk~fF<8|9(~&u8U(8BoLxii0HT93Mvk0j|8SGLM?TM?;nc%U zD?0?e$C6*f+tv!f&+ZGAenm2)>0)_(OGa7M~nR3CMtaA5}&gGfw}FD(ewriQTDF zYpe8S{6>U_bjyL!;&tgo906{Totc=`&wd>%Z11N9D7jjZnlSZW%&a}`ZbDe^#MVDE zmr^pV^A5|(NQ6IimW8Y^v>3}@SmRXN9X%SSggm0b!d~O}PuTokjgN^l!E1pY*8_d} zp9*Q)FItVqn}6A|#P(nN`Qjety}NI*G4k|FCd@3>sn9k{H;yRYLg@ws>2_-fe#rm2 zLt~)MRP&MFo%|59yU&1q>!5Ny16GZv*?h1vtk<-d@$RKr$fF|nSCN{-q8y?ni+=9 z(?F5}s}H(o?VS&Q@tM*3&4FM#O2fV|R2m|rsrSiCnHMc>!Y$QEb6S29z<9_BMp4$y z1oZJ;gNTX*UOtT!)ayTiRk-h2T6(tl?cQ%^r;ysdVfJM_a1r&AXmYAtGZZ}r4 zb}#j{_{^+@qX-glc)iu#bp3Ar*|>YMxix2M6zjT)UVMusgS#I;dpmqKZJc>2I6As+ zGpK=GoTm6{Rq9PR=tyXJb-A0^pL4VF$$a;mx|OoeL8AX{z@GVOok#!zqf zjei1-HkQA86yZUAx%pB}__6s8dU}=h>|xm(>@PH+5b{zQ9vPHzzMp$TUKlQ)f9Kd6 zrbjKEM7{zuf_CMHyn=_0XL<<)%H;h6qw-SW2Y8JiU~-MkC8A8S5&HuEdotvC928}u zad%Daaw7b7EQ|#(2@E?jPoZvY(au+a}#N zo4(9zWo2tuG(*ayqC!f4C&JUI?hP+O`%2dO6jB&xa zQ5vCVLsv`*d}>b)tWOzA4&23Z&|-RQe=jOHDoOpsz2Csb+m3nt;NH~FxBh7KOU_wp z*d|D=Y?XV_&IuHR@4kxe(Q^XQ_ZHj1?jQ^;6U;a`AI=fUCFHQgut`VjQ4~gzglCa< zl6S)ENa-aG5SlH6vU+Ks%zh_j==Q%q z-F^6*^%&!c7aXg)GXo7MN7mg*jxg_hVB%YMLbiM0Zw_TowFV}(3N#Qsn-kG4hf|(d zA1`lC{(eS6AKVnHCqPcROYY}87ykVEBw`nDhXfkrj6P<$N<)dO3jV+IcZ!PK#4jYZC3^R3!RNm%er-o` ztp3{DD_Pl2#K^BaeLWwvl`XdGL^8P*3VyiHO|GN0$8OzM^P#Po8L*2t>mRbM#V%%} z472^rZwz~tWjK{(sh>nX|uZfHHM`qgr!7w|166dzO0qzr#vS&MYpWtR5auTg^%^S8t@@NFSeXRLPNIj6B}Q;nkFpsqGJ;l9|ySdcwaH=9ONQoUK3KEE1_`$Dn_ zjfFJ1_?&s?K{S`1>(_WL8fYHij5hD6Z-APFKq zfCrK$KVUhAy?(RKf*p0YB6D#gpLWWp^*Peob@ERo6u`YW`*PIs8%p#ja2{%-p$)|L z5&3TJ_)KUaLqDFuFx+RdFHAiYq6!~P`bK`lk!X(#^IB2`j@_#9ZQ^^XTAjzy*-Hp>>wcLZhSj`VW46CZqf$FlKsstQn z*)S`g(i5e7)_D=FAsAn@5bSK>^0}BHEgrjGyHl%5jK5YXxj3XYk~d zD5CLDR+#%qPCkKm7Lg2D%H$cQ+Abv36!Defuw%8ExP^!}h_R$eGL7 zj!=A@PDUc+zg1fdjS1fKsIf37h~l#1J||@Ji@2yn{%>snn7t^9b8pw1GsH=|4>|No zNShQdekS|7ptrG-nIP2SgTQT$g;EQN;RgsDA9e5JYU`ovJWu^3N# z&344T5f%AJlMzWqrt-K15$<#wu2dDukdCuGGWo3@U+|)=$2iyTE-&~>t;l)h4rW5- zqq^xZh~n4Hj&wFCd^eeY7($A>YINQG8!AImS^}Mc+mPd4w}r>E&z+Qd$;%vC6@O#2 zWy=MI^m%+CE&&B1hW7MVpUh-wB;xv2Q--uq>XE-$2)U=u`O!q2G-nyC6aDBaOppGZ z0KlR`?!}7~&3}-MZ7Kq-tMMXQK;fPz=5)Hs7RqgxPa?ald6WaU>)M>%nBw~!*=f$Y z-Xv!IZMWl?n{#F+j-+f)c1%+IEB2f zzx7Vk%HjI@eE*E6QP*f4^Q$d~*njC2312jr{5t>2stVG?2rU~dJ5zcU`GCV;v!w1q zcL&!OH&$J5j|Kv=lVheS^f|+(S5ob!H>td{#5cfU9w}KLGEXZmOp!gC2)^=zr7-Ji zK!004B7FeA;|{?Pl@a|2Re=prWs1ADU!APdpH6YS76z0DAf_iTrO>(HrdPEz!Y})! zO6c+=AsAD5df1HZ()>=^nG6Dph>j zDjnHuJ*{Uf)cL7;Ex?-fXyltb6zA#xI0z#@4Nn$IG$T$zg@)*lS(0ZH5BqF72r5m4 znio(M=I;*!>}OI`r%i!JylSg-!71}Fn0u%RMT1QqW|P_1#7_gAx@@toq#Yvk1?t7s zOPU8&j$K)>lj{i$vC30IL%OBnC*Cxi1bvg*5r}+{w^Ri^8#|NrnCsz-aQ}-{0&8TK z9@U3xR&eV)ZI}%cwQXd(FWxRU(&m)~3=wKAV%EDd9X+oCpoU9{bWV#`UE5Sb+typ!%mcHX#}CifqnaIoCBkRE1@ywZQ{=bpo2scKNW z%`(=dHN6L;l0w0qKsM)Xz;iC(+YEc{_`lG(f={8RaL?9%8@&J%t4H<&5m8C)n!H*& zgz>_aZQvyXM}8m}m%XDz3cn~~V`s=+FGaVV43QIAgj-K19=l;$Ejs2wOY2)!M|iDBx;xaP`Ka0;OQz23@)~~ zn~pUgb{1^Jv!3Qfz%?K#lV^}0#lbVim|Q9vu{yovwXjizW>i}r7eWkou6+%CzzP3* za>JY;sO5}zIMPzc$EZF=(^T;+Lt0Ym-(+_o1eXN9G$MhaPZW@i-8 zLjl05c>>kMRi1e#xGED>^SrLCvj&?94F52C*PTZT53!SDIFKb#4@x7w z0UHYqCl7}so-WV7cn;tQ5VVa>k!I{t@&vn)U!P*{Z1fkQHd+VyO_B+n>v)FZJ^j{) zje$dy>_4H`OzC{#rdxQ{W^!tM^}Omf{2*O`^{InF$YRl()Q49BKhs|!ugEm&56Rzg zRQ+6J_7V4~J*0+{B_GIXj>T(}`FPs(A{{tSiNW89FV|-2pr;L@9wxh=Cmh0qHnP8V zwJUCxjC&>VsQ2~jv)KZk#b)FZo!MtrpUvH0$c>p&t=E`f+aijb*O2+CPgSQlEir>r z(O#|`xPfd@om_*z1avb)yx*t8-JZz4!jZn001T0-a7fT6076i?oj7Ztc#bV|pYrGm z=qs3b4EWl{iap4WwP*3NAD?r~IEK8{-}Mys*d3O^xW-OhqiHA<_Q`1Sa207=96Kfm z1J(rW9C@VVO394fV<-^{>?O!NuY^Uq!xZ@m`*%(o7DMkG!>)U&P~iWo5V(1)JUR&2 zW~Tr{p!#PI@&OQg`~X?7n>L#>lbvAa%$flsae**He%3^YOM&iLM1>^DL=9SvvfH>( zI<1#*!+QbNU*-Msv(dk!w_F!l;J+M+<*D+^ug`Dk*@RuM-;(Ck2S_(T`4Kc^%5FIB zVtr{FwuRWK_zZpKcv!3LstkU>Z9pqUq8S8a>Sgih;}%ZEssL(Rwx;e@-Fs+bI{!8H zXgHAb6HTy#tjsVaJbLbX5uiG3#(X=5t(A)pBabKu{2p|`B6JSr>ERZFU)d7`VFJgy zWP>SQ-m)OqCH)j=*jB}CvgF6VN$l$*rx^(v8E^1Z*q73_P0}?oU=LXE2Ktw58S$8% zn>9$lo>R2LdSGRwj{m+oeun;xBe(|ieWxcaxrBYRpg3dy*2GGWiP;ALxrTm%E^Atq zVmb}trvhEtu4hc<>Mp5RI6*+Yd_&%Lf5mC!+pHesf*p@MzdTMZ*xDTIbD8e~`SdvX zM0kBb*G9~+s~2*jYG7Iw=u*Mf!=-TzvNVgMeD(kIPS|#Ai&+ltJ@mKZEU?Hdc?qaI zLv$JGJ@hPb-Z>Zj&ISLdOWqlF5Y6{!p zzRCDbyR7nkCa`N;p0Z~bj!My^R9x}@UZwL$4eL=y+&{JD94}4lw){D$1~`?I`cK&s z%DyZxX&j3z#z-scMLuWrQZ$RB&(-OZAAJ`eG|sB9^~d1c>@1v`Dqz+ojDc*-sJk2T z2(0s+>772l2esh;$1km# zIs;BvI<|6G0_1Y7ayuHuZ64Xj=-A&0Vn*Un< zsJC;Ja#68I+Z1b6q52ORpHXgfu|K5iER&Uze` z_raXnPk?K@flA?c`50WKgFt`U%w9JoLV;xuz|#p}@*DFWl$5|R{9i3%mb^KFSWiQn zO!UCmY*f;MU)$)dPmH7$706T&Q*1fHQU+5gE0m|GTi!A&9dsG1Mf`7-#Mp(HGMahZ zT-;eaaE2D(AJT*?>v9Re71;6$qkhREcwjv<2u+914z+;fl{edQw-W4zJ?^6?g?8Ia zP-oWVbM@xXM+<=^5=wXqxPcx$J4&{D$X)?9ohxUv*IX$B4jWpwT=2gWcLwksLki{` z-;Z0Bbsz5&RWDqlW?lPxm8IijD}xL|1HVfuRWHtItJ{_>m7BGX*RJkhb1f^a^@5ha zcToZrAtQjlBMKP-76YuCc}H2Od~eAd1S5?q?KEqnCyUV8ZF8%-5yPBM?V}z1|!ZPKj1K#>dUn|qyxNGf-|2iTQSSIP#b%J+v|hIO@C2d z_6l64RkKRoB0m`!XO$e$;2s3_1{ZniLD@zJJRSiB)t~xbCl=Sst>{8lNx<)2-)bXn z7Ggj%t!TNTN!eF=(ATx^zI09PWicU85n0%VEtwlS3T62M@FkwL(qgCKc0vNpCc3%v ze0^_-^cIe0zNndA#FDg0V(y0_3+L2G(@V$c12zq``~sf__GaUz-zBb5c=>ZSwqTEU zyU@7x-t*6y+L5@&dflb-zR@-GQXo@Dssn7(js2vRe(#o@S{X> zjODs75J$46y_s9QnI8Pl`jjOVNd0n|u<5v@d7#9pfd=eKa*gh|d4zC#phykA?8Nt; zfl)oW{h!KSkDjW>ISKrvejh!2et$NSWA`q6?ATf!ob0IAeM8t%|{bup>U6H)ot&q!1GC{m~xNXj#dbxQ(tBR z-}~+<*Fp@&(`<0ZaXH5s*6z08OsR)YCwmOYtE@pnHP?sDR%za$Vsq@;5 z3%OInUb-ef5cq_&NEBX^Z^fXlk$(MY>%Ne6xJm|c&s$n`O7;M9_bUhH{-j-|?kbqs zUFH!Wp12p*Z~4)~Fxkx{^>H)U%WCLPhI9{_w6MRgZ1n<*dTzgP-hFF7Yz#KJN>DIy zFq)uE&QyE7dKSkbjKQissBBAPzIsHgiKck`teXe%reN;ZyNR@2i@&eq?cq!19n{l~ zrla43d)M;5d(EZt>ki%`{SXd1kzSgt87;xeVuS^~+PyHR(GsiR3#7v{QTShgs?bLd zen~FY=d(w{Z&(v*#mAlUgm+c3IUzpbD3rVhzCLbrjdHgx(RjnPI@MfbOVOnHPjsuc zV($KpEzS1>&vv0Nr1cHwQ;U&Tdm=KinGpR;9`f8TPY~DJJy~8g&=;Y)2^OGwFaL+g zVN2M&#nxbBGr|GpKvUm|kLKsZr<)D`7CaH33jNm8^|=t^6UV)5sTQYy$k&tVuH@A3 zc|3WN_x(U}*T!{{PbBMaY_|i|eo1;Nuh)dCcQ+Mn_)`AiwDoo;`EbXipGrr~?quXn zr+UAeoO0!<b| zbcFxj@nzt8sdvdJ=}tlxfFG=aM0l726f;N)kQRxs&UYgUm}`tIlc5^DDA!|x9VBCk z<@;pBzyO-{+=D26JI_ip`GaK8N7p8E@>Wv^pCcxMODI#4E0KV<#m`C*djQyN$HhC&SJaNUo{}(<;vHja)~H^j5SqIE zehS}=U4?x)+vd2}wD^~EtjhvfT!r^V8n>+s$kGa(zi|hKNyS%C z#I3fC6Haw5ZCm3i+w|@p0X710elBs}yzfPy!=X;EARK}_a6S<#UdeW4VQ7T zB~-$SijW!Z4qKG28{JAlD|&*r6H`B+v3k&SDLe72>J#r+mx(PDg$`xL`x#8<5LtkEm}yCUqL+zeM^EnY+=qj zGVK(AKedIriRa9zG+L1|uLw(W1V^?w; zTg!8LZ`8$llPAO=^ra^l#vOevaxmjQFhA!U$E1h0FLJ7~&99c|Y|r@SXq3Uz<2x|; z=W1@tjzoOG7M?c-t%~ei7dYGvxnmX2IDI`+wSyYIG zq1OvzI8ka}^Z@3<{(zMZ6qUE|b%Kn$z_Fi*C$^I}d8#R-xCiJ-6(BX=L9?|12pQ6( zGC+=nzGHmPPF28OT~e+Af>we~w-hsA zZ_WX1V8$^ieG~yv+>2U+Wv~;_vF=h0tA}2A0-VgkK$RoT8ZEGG_135oB2a~6{0DY* zaQtFKV~%@^1pvI5O;S8(#Z{L7RgaGH@4vK3akms2G_!3!;2P%0u2AX6(5*wDM$z?3 zq+GqW+STx2+Izn%%HCukETT6qdCxEvj`(IM#Ia0ztkljAK{iXs0R z^O(#q8~|e6mGy2O*~@-!{WIKbd>Rz!Z{DmixZRU7{=U|wU1r?j;oVN%?%MA*5i3(m z#cEgba(+=CPpSv=Rx4%gGM0v~?ghM$+S{;i_8Aj4Us5L;ldLxN1Af){o;`f^4t|ZM z`6qSbWpFPLoz)Jz;kfw8bf%1c3z088nvC@=aU&JU4vcP~Xj2iRfj{nJoghYIS27&m z2=04x&ZAsc;MoC4lNBH{WaECwg*seEM!sNPo&=*bsXCafmj(ObBy{D;_xMlX6r~i?N_wwiRPUII<3dKYG6qky-%EB z2k_!uWCba5#{ljY%1viDJ1rexg%&d5c!qubFRAuj@!Bj6z#Ah5@UMciI;P%$NQMr- z9EK&^SkYgKv}D5jgMA5=I%@C*E2UO81f^oNA%$w*_qo&jsrUNf12kO}>S2aaM)0=b z&&8`ib^r774A}<2t%EzMG0PdwpnlBGpNS*93X;WCf@77__9Q@O#MuSPHHDV004bKARgx`=b^;z7>g&aNmH!w7UDV~Sw}Yi+gF~6DC;0_I zERE0oIY-yGd)SQuUH&A7ki{4f{7>XPcM$#Rs5<{Jx*^J>9jWUqkhpFzFX+@rWt+;T z_I(G^AUuFh>y$!=17a-`s}Z-kwtaN%e;22=&Bg@V|Ja9D;&&~Lj>##E<6v;KkNIm> zG#Nvno4sQFtlpMLj)9V8R~r9B?x3*F+tx;d4$@)}t%g}FO^1lv^+puQ6R%EnVXPkA z)&{gWEt!7C$f>~XfL_dC@|HG%SI?Rcnn1SlpfkJ!K9X6 zqpn35Q{sHGc3Uhjm=j4PqbGq?>hG`cSJ>48LSZ&lhy_{;1iBzx^-h?sOeSsv>P{zm zk7a+suf|8dUv>IkFXmK1vPy5l@-6MjGwgh@`_$Z9ipEgk zgxG`g+0`d&gXGpT49S5>|4Y0<;`I!Z_4s?-VBETL4{hJ9WI@br+H{y8=g5M`vyAni zYSz(++ls#WfYsp=YnS*a(o@Mp13}UhHm3pj7*n4M3`!l>fF%#tfy%S~79v$}nWcom zr>xZ2LA&*zS+nn>+$HjTg0pX+`~x!odcsfH5d_nGNSMWxG<-qcrkQJ$;&g*Zhg#&J z?XuuO&^y^YZ2-2un)Qbw2F6BxHol+IYpF6H=N%xf9S?o zdzn;pLXyFAH#!9EITd_c=exv~oG*KIk#kV#3QTYzaAa@cX(}M?R^DuXy_f$E{T0EC zyoTG1DAsRd{X^JE?05$0QtzNSE7gs?!rDh3u0qVJ0CHNPE6JFcPRAiC>7M_S65Rfh z_uO=stG+{7V-chajQyxOz43e6l(uy)9n%Jl2evw(bC64GcT zmMnJQeaA-ax*k0)57(S+E;BeRu3t51lm*+W1h9>pPCD)bGuqkYtmJjlD%DLIr{HW6 zoyFY=2DAWjp^R-z_+)sUHc|j28^~&HDt(=c>V5t9>hA6-N&xHVB}(3V`#-Jte!&tu z8TDYh`9#Los0<~tso5Rw<*>S(YKLF=r)?Ik+(}s!s)_5JRK@; zNkeig0z)w7=qtyiquPMqm0uec*AdD3Hk96jm<)O0J!VQ2P7cer@;hziwSS56EgyE9 zh(d@h=PkNyBW%JkM_?i+cmcJ`p+ogyj@6hgpg%DRslo8Mxtq5;`WkR2RiB-D$=Nye z?c=25G?zqR>6Jq6d%|}19ug8uW zvn67OM%@L_ct7a@q&Dm6OqdoScoLv?47N_~Cp7_Jmp#8o6Pmpa?dJgw)Dkn|4l^NF ze*d~dvqXisi73(uZ%En;C%EZOu}`>#hqOQODXKaUgu2UI*1>vnib{_@rfGS>`i2WqMkjA}MI$P8+Nte)n`QI-wv4OJrzFlMpfUi6T} zo}`5r0NK(^a!Tk5PzSH(Uxmg&8|-_*HP{x}O2C&y|Ash0oB<;ryFQ|Mk{aPzI{}?( zw9MTWKvm8Fh!02j6JZcg%X#TWe8jl3(}K?A?nMB41pGsjkJKshBr*x=TT+*K!+aFB zcrdafVjSdz&(R+P*mEaF@!g_aV2N6fQ~gf4=Xl==nFDM804&{{sMSpXjq^Wz9ymVZ ziR@54%MQU)X|@4G_8^n4V;Cp_J*^fS(^XsiqVGy%uTF_@UvUXB#8)9-FxleMUQlVh zDx~&TTQ%%)7-s))E2@8_K_=c3p}Rn#z^y0hBjO*8UV9)nh+4b= z3NTu-6=a8=Q+&YH0(~9S16kBr-vyXA^$CYp6D9w~aBkR-v<1Mnbq|5gDOEu35KqeA z(~_dnPef2^tZ+y0vs0ltXaG_a`ODgu1kC6FBwB)b&Wp*TspWCB314uK-HI`Ej$lop zSk*#JtTcrl-39?jNC2fD4sev|2S`7@0>^FjTCfg-wZ&vKF|Egt`~8j|(Et(wybRls zzhcg;K!Db2nU@NvpLe}D;X${!TKPGdm}QH88$s+1iApwmQ8GA|Q}uFNR=t*%(Dmw% ztvT@+;^nZS8lzF>W4|zmp@W^BrTa5Gk*wh|%h202x4FLZC+7Rd_TPA6MajGSRB-eO zF)HGVIDqS$l&tf%dU$`7B`6V9{yW1kk7rd3bGu~kPFMffNwBor2pVKB1{_+3tS_UE z8!Ub1%oxRM?(%Nh@m0%h>Ja*-&tcZi<00PAWNKmgi`7?6hEBqZx11GmH-qbapD=Ry ziDhGzoAZhe!Yu}3p|2nYyd7d_;c@uVwnbjglS0ujqbXYb*e<*P=3X!erIq4niO~Q; z{B98e2nu7Gw}af)()=6Q>jI_|=HUA*OuqFfr>_hPoli$hyPk)zer-UXx=zlmSDrW> z?rN)ySXtTK;;A}D#J@T+2%HT4#+Ty!QqVwr8WuKhxh;8y3=Px?d=C|`M7xrIy!opz zbI~x+n|x0lKUa0J4taU@QRb#%mq5|6>64*hr%#;>P3Jce8r&M(cHwai^!sH3f@ASc zlu_V-+&S0r{`bo2t5!+tD0vT<)O+$XKeS$QYR#{@OG0P=dL1pvDx;dTi<2RT0N(UpNrxn%;)0h^D`` z!jnyhaZ!~GR;NK^t;=;_#~aMa%2fUnx?7sQ?n2Ok8dS!Tz2B~;52R@=@(0qQ;qt{2 zxWsD#qCNlWDs9)WD2BY&>zg>7L;n+8l@x^qtFp2BU{#wLu`~@dUv+F;FsEk_M~A(T z071Hx4tkxH)I!lPHJWv{6K_jIGP2OcMnNxkW$lT#rYc0^_q!@1*6U zk~eTPk69E!SN@c5Xke z>p%&6PW9ftE71QriJ^oje$m3>ygnJ5j6i0cKnPeC000bc_FwTPz~LNJ>)>k<`j?dx z05HTd(=r@4BR*?r!oPyoVfKgjK7Z1KY!CaVO>J?D)z1uNS!I?w_2b0gR;R0!2V~tf zk8;2?;VvsMxw65uqD_NyWuc};9Og<_1=Dv~Q|u^qk6YXi1kPU!21}|NPuJrJ)!MUa)vi4w_9k|$@U-@9?M>}jn;;@JWAD9EGYEnZ zBf`(`zx&*Oo!9j`=Q{U!U+=LqHpIAlWVQ1$?ptMtVeHlk!}!N7<(sax8;NpeYj5I+ zij|AjE6n-Tj>kb1@4cW=+@B~H4w z2M2zy5it3U(ULs~sY!=@9bx+~UsP_Ij(Kq>5Fjf?Ii4+i(%8JT#B}XylGmcY%<}EA z&-jP_B0@aOhZrxZ2qXcVRdWQ3dK?euO`La+a%kSvdEa}~oREoU^`AedjJY?-Joj8# z%VT}BqX7Y7yGj! zJDmIDtUG+6*K?CCxpsYR!G_O?xA^zOO<>LMTqw-ozu*Dzigh2nQJwgBtCdGe^{(38 zb@Z^=mPrR8C>N7YBl6^s*BGF@C&(Odlv#3yHgo8M!+yz{y=*MES>WuH(%wVS@MBd@ zF=coGa)xuy6fSKu4Y zA;LGm5?4YRFE@@vK?3uYtA_UUr*u{qkb}AuW)HGio=sDlSo-~)*^8H>5 z<{3lMD)F-b2c*0D=ew-S9x?&#gCVMaE}i%!YQ|^mof>;XHb8&G_r=i^>$J+NWMw0@ zk|)&hM8Ge{Aw<@BZTu^lAdlttDd2LAAvKP4AfNfNI_UTLHIDCGCr7Ne(tDnsp~+t( z;o*#_z!!Ki3hze7NE^Yj7#Pv?V&nBp2Kw3kuxXW6{2qVt$HFIX+rMG^e-d+j46Vi2 zDC6DUz8lPcttaCmw)Ola7ir~wJe}tD9yn0)TlOI(i>6d9H1sEDu;fQy($dIH8|c!T z10~;o3Emd?^?>J`Sdpb)t{`e_5Aw78SG^Q}Fp*I#Tcigs{!1b}>MhT&JOwTz#GyBNhTlpJRl5^%=q@N{s+=+AZY(`86 zw~_$qc9822x-BCkx|U?s7&JY9?UD}Wzu>KT6`@At$)3Ssk;y@azkCgd-7>Nud(sD_ zplFs!<|*g;P`j3wu3P6Kk6+&{xhFm7yZWax{mh;CyIG>8gAH1**fIO+%2GqYxTyV= z;Z*C>G?xAQ_Y`mCBh}aOUq925d{Es9)r()8D*`_}^ho2|A zFX5Y;sDN!h0XLh$2f_FH+0bplBxQn%7RK1#WJ!y2fze7_Y&}J89VJ5V>`#0ae_?Uh z>!;N5Z9|G`TXaLx&Bdzg-l^i`2R@%lL3W7`-JsqXT0q(%?M6o0cVavz$rE%BB*bt2 z^>En~ThiqTLySFs%~^=p$cQ?P0waQ1Zx7FPf*-$v{$zo7CMar=mLl`+R6uopE^$SvY&#}_63NnR}_!jWGUMFg5FhfsaJ&@Q)4;?)@pJ72&dR!xMglW-652ayQB8c zq1j#%lBxIMk|K`XiPCS4c^CBDC5TM=L%&w@e%HMy?~H0_@8l)Q&9N{^S;WGLPsQ zev=D9>41{bi=#FF`$Jp_J)Ch-F+99&(N>YYi>*mdIg52R@nFEaSn`p?BeClkEWOEv zx%8Co$7?$q3U%ySo8b@5gqhQ%!i|;c&&qo<-vt$~OeD-pBox$;*~;wEUQaeWsXV^< zv3bBYsMtIT{zJY~`M%5-?A4xgk}Dm<#=Y_SS=NFvBkmqhnknKU9toCn?fCj8ZX~r+ z(;)hheJTbzKMLKVkqki{GjCm{#QC+g)77;90?hbB!3>^m#$(O{-#94d9>G>l%9X!T zo;}02Qd#Ag+|4w_h6$VP-Gbz2L?;Km??h$Oc9B%!K04RGIJh%}^wgMz-t%#s>s%@Z zsi|Tmd4>BDbA-6wwSm6SvfFo`{>z+h`14`eGW(Z8$+h3-F&Dl5n@P`>hJOt{(wO}4 z5%BKBF^P>U>G6ij3*R)hv45XveC_?YmsCm~>tAm+^3&elK+htU@h6sJb%BTVf9Zsm#>Oc)GB&x%(CrP8##J^whdW3 zlU_rAQUla|{4s)%}8d7}6N`hAt|dEQoBMyvPr zhp%Dp;?4p1Zr>UJ{>7{r7d3f@mzpSm%yfHtKcX|+$huZc`gyw2GHQ{Ii)P!UmtO9W?OXib5KCiI$l zyfg4vTJ9yi(chy24>#!bQM4$6^AhnR2KOJWZO4btsX6n%J2~sH(fl}A`Z{2v7o5J6 z^vH+Yhuv@XqSp@x6P>)19@`T}AlqiaO|aO&a?@v4L8M1_M+p}pVDbCXFxaj}%dbYC z?8D0E?^d0Ilo$DH3Qpd>X|*+m-i#5sY{P!DCy21MmK@r^nH$$y6=w5nUZ~W>3ZEDH zYrxY1y0wDyGo}dP^CTAyxUPwAt;O67L#*I8!7@(k0B?aKZGpfb^AnbEu&4T1RtkoT zZ)kjwZ;*%a0z4Vma3hP5;($=tyW~s@7ANHc@>D|-y!3BzWbb6_+vQXFvrTd^e^OeL zt<6--6M8nexXNR4GAi`6r%KoyeY91g6^g>@k`ez^sgju4{iBuo#P5rFwR7da`&BED)ri>@XpKp$!3BXRO&G-KE*w!KH61UfCtv}g&u_D_|OI50gL#EbG+O6Rp z5l5G(NhYBFYTElUc84$iCz9_tWa+DBxv4#fd8-=QB}+z^5h=6?LqKzO6|+L@E;n`5 zM^(R&vZA$0@C>y^l#iOWNk=62ca-Z3CCrU#jGwwadjOAf;u25YBgkFngX@IP4RPAb zq=hb?PM!^{tRRybR)G3{8yj15ngK@(H-&=<&m=NFIXY_ltN7Lw86M3{9h_VlZ@LUc zgz1SqM3!(@C7IHR=pXfpX~i$GgXKQIt8#-;Jy=S8j`p0d14RFGc*;}t8CLl|C>Xtv znm2{~@Tz)D{dLTDBJK%}aespQz4BB_M|DtJZDd+@tc(|hPAzX$9WM`}<1d0uPEzCZ z2Vp*8@sALTCEH9$GSfeO{nXp)G{#mjBh}`vmk*zmoUf#VukDILZg(1=PWN(B6 zta8nDtvzXkV}yQk>3#NiU*ci)zZ456jf!>y@6`dp)N&%gN8I0-q|LUCJ;ASHzzTM! zV>up8t$8{8g!9%md|PVzRq8Ak6RlB}h`pA&TKuy+Ab-wfI?d53il332-2i40?_BNC zRf(?s$-bA;jdeWE_bSi&RaW_(O#gZD^y}F#P4#*I7R`(C=)|WmFtCMBsH8f@MgDZE zoCp;8C0}`Bpd2rnk%i)`Ddd>ri8Y~c(C5QM`}CQr1!|Ui&;CzV&(Y>db80Qes{Vu( zTSS(RY@NGs0Es(6S9KW~W?549*oEH3L%lck{ZB}ryxhbdVivGSTYwVvX?uC`y zE#rwwM-K-2YCERm-u}D95||#`{S&Mz(R^iW!4EXL%v9Zq>5Vb$Ids#iMlySG8U+gX z4@Zm0d^vFv<6nE3y<6#j*cFp+bXe2+lE<7JNy5Xgo7xflOP9uu@8**W8F9g>xZ~gL z)md&=hL+hV_@7Fx^3~bLIe)s>oEAsuM?k_nm>Q+RQ$NjL=Hp~D3>N%87ODqq0$LSW zNxchUzvKaqCv#?MK05{d`{B!9m)fG6*_UKc}ql zB+lWWA?k-JAwCz$w}rRa>0v}Uq81M~Bl^oQLpBe^I{@QnaBB83sqwFVa`(G)k$bYO zh(-F1egPRp;tCfO*ngsLkwu6uIvkwSYve3r?C z2RnFMVtS;vE}3&o-xfEXDsH=JU;X7aJi6lH(YoZ}L8kVH0JilR=tESu^_kK_47O_! z4X51kx3aCCzWxEi-07rY>b{?zEBgz6gQk3b5FQXY0X(Kz}_@D1nxe}VQ zLQmE91{oVqZSy|tS(mxufXo7qg{YLCiClyB*w313%5=|3F-k;Yp^5&p!Pg8Ol=vqL zhxDliKdn-dr)tEirn=Hta&zN8$cr;#TkzQ^^3$^Uk&!NtbVbve-c&*H19(5ytRjsg z+w0O*Aa!2_`;0HbDP5vA z_bz-Q(D3d6Qut&x7s}}^mwLBW^HPeB;cOqCEPEp?%Z4Kye^;r;gh`6W4BfNYOuCSg zrD7Y~6<>7<+)z~!Puh>CzFMr{3~fo=oKG&DUj2Z+y3lKE{e40<%bWKn*3=Dn!$gyS zW9l+XbeJx2ORUl}{Pp%n$H2@SFPL1fEwn18_FLuU-%2UruiN#NR#5*4Jzd8c!@h~s ztX6K3ika63{4?C#?#r=(mHJY@@F-jlHsIfSlP6S%Pp%=a|LaQH^#CUqnLcV!u`lwcTLdZ11`seKB8ib*9|J*$8eJ}blS?<|Ldyt-Xeo*xc z78C1bV4RP+IE*a&rl$?;Kmx*V0|5HXzz)tgx8U>jD>nTZw90#fGDJ~rtllBxROUb?Lf$Ga9S&!F@*dA33I*gaN+*?yTLF39 z2WSIGX~54w;iDjG~FGGDFI?bu4}H`IdE@t4)z-77(6 zq_P~fBZ(P3nkRpgW2(# z1bX_7Kr?}^;$ARgR*;8%N4fjg2GZIaocGul%?GrU{GDD(s#L9E3Ay2^Iv>Ypb*@X- z=LDrlc}k>sP?OM!M2>{Ve$;6XkV_ri2PaFv3a2_6I#k*yEQ`AyOn*oYD0{+l(J90i z&1C#xOJfZH`|<81-+g3kh&i9ZG($hlP%k4@KudHd#a9y}aI1AzDlT2$CvM#)rTH~s zbckn=IX^vLH_P;=Jx`&kgX5U}bdK}XMxJJDpa`FvMwWBxPSD&{j+e&Dw8wb=?+Sh% ziB$3TrLnOa^6%dQUvPeid9UVa@aFLAG$lPTd1{LBfxxIbM)Kd;#LPUQKLObRc1m%& zytVO`gCYnbJ)u%Tft}=!ilfBT#NVDL(IcuCuj9D{jgWqgn z5QW|Q0?kd>{KeDo$mao=>hBW41yRpG*Bdgq9nn_OeBRB~HOT&47WUk;pVwudwvy@d z?!iZntj|85A4@~}O9Q|$vWK7x!=I^utZaRq32`3#xT+3sb@XX<(uXVCq|2zTMw#4b zkG!$Pw;98@AyvsTwB0uKR)3ntyDCp6&6D*1>|x@$9?^aoIVvZ!d;Q5*8ylNcFISii zt#Wp}+o)DgvU;vK@ymCH<|b+SZ#VotyQyfqSvs_#2*i*x0k0tQ3i%tLh|GL}8HO%9 zT|lOnk!0a7ofJR>tZE=v|LNTmMsa`kQ^!VKYs_p_`iiLZ)l_FDeM090#!Seyo!I?j zP{tAa%+nbD^z-fP@IVi{>x6ldWWCugkBwMnOI zzB4d5N?QRdo=M#1;?K%4-QeOA;2+E1=Xz}_AjxCEoA3xsmCQByjptOMps-%`MP6L2 z&RZ|ZCt;0D)}Bm#ZR~|1ByHmL2_q+M>}?6WW{|hVY7M6tjj=555$&+yqf@V^o==Cv zn8Lmt3@HHG+NKo#>8DTTxla~*pNt#oN2+rVGSQlviD}|{6;vCMk`kpH=bCChQMGL( z8xu)@0Jr%7ipaC5f?;j*tk_$t;0#?Iy@L$B6ktSh>}N&);8z?;g(d85;@gXreDBLF z(;D6usGA7Qc^GTA72TE4XHFnzGoAXk?CjT(I_(|Hce)i{Go;OThjg@)=1@%OUu3*& zQptvG$Qrvz_}8U(Q|)|gw$;0FathAj0>$KwF|lef4aFbmJqzo0i^POtH0{u|(Vb}p zvgP3tP7g!10SOs7UuDCSrZ!d%I_muwPg{A(d3`?r_l#>lvFmM20^d9C=eeR19RFuq zZlsK=|7>WP7?9vON4Ku3txCs=oSeKfvSr-}2h2(VZn!ELQ&uo5nh6!%?TZ_&+*u}E zLNqj66(VeYOb?K>QDW}~hZSj6ajKSDwz)YSI@6zQ$Q`%`vi37_!s|jGtS7%MsP6ri z9BEbl>hl*NWd{bs-3%!it%p?NJr97C-(|!8=||fEEtgmw-P@H#X01qnP!+;k=v8#3+8z}?fWzQYHlE%bz#SL_-CYNq#nNudzxHH zy^e7WiLN$ZgwSUb+wif|Kwp2AXhxWBtk<^t7$0w+u$|5G0-mEMKZ;tVWMxY`7O;$q zVRT3_y+nNuBy+R&!;`I*n;_-6j6#+D-YE-Z<;3(b4)MR?1yqcorD zhI?<27UfSB+1t7|3u)>zO6|9|wg&&aHiULdac@L{N#%^wH1rG8FxnfkLI@xY3tP zFZg2y`KkPq6Fd~H`L3o%j#GjJzcPW~wwUFl1B9&f_S z&-4uc+9t;;Y$}-b0Ju{mhWzdSF7%wkgK-r@Qb&8s6HPsTGjaN>zMv4^#64q+WLp2DISu`A2r{=cc8hjMm`KYz;Nl(~8#a9Lf8-^) z;pnG&F{14XGy`oBg3q6!qhGvJj(g(VQ<%Hu5=WtLRZMHCqb)Worb)Av7B4V#!V($Q z?77&bG4jX4u;{t$Ow@6-S6={=Vr#gr&HOE-^eVD}5$5piOF&!3!zYBT6!fr})remB zj1eQL*V9Ja$TN{I)h>#hHpgQ3S-{DpI*pp!@`9A%J^SaHOh2>oQg*(mjP5Q6{%8H? z&&W*Nua64>DjQ-J8KdQ@j8KJxI9gV#4;;x;r0m;$wpN-sdp7R|b6kh#9y?Q~Z_%Xw z6|+ctk=1+Bt~a`DVdM4cxlt&c)!Wwn=n1-PQB9_eu)4TKok)+faXz8`YdZE6JnF96cT&dgq_4@zBDxK4d9b1V} z1)cs;BenToUvFshuVmSO6<$-1zKR4S$`b#n=GOKfdaNh-5xfvgTgp4gAeyjaEhb_U zb#9hv{dXaNHq|D2GfS*{SlqipDj;?TuiVlkAu#-69;iX$8N)%FmHdxoXbLWV$g%X- z&I|6znU~VsqoXVg@{yl~OFnn6-@Y4q75S#PHAq-a^h1(hM*Wi)!8N3^47x}u+?R(% z@$Uqh=bvNfqKvt)$`o^om5Jv@j&7eq`bhfTZd#Q7%V}∨>X2<)4s+bZG#wl&a;q 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

sJ>T?_1vIDV(zISp3`q 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�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 -1gJELowI8Cu%7@DHMBNx>bkObLk6Kq|ZGq~A ze(4kHnd`Aq=lkd9aWs}bhy1%1Zseg|&>JdE^0YJUdb8Udt;;i1;)*pS zpgWN;mjRu{NY$ZQi;L|crHl^uqMKx&TzHd{F79lqu|}0fXIx7qb@YFlZac46Dk z25}UT78r!kr>SK-mr>`VIkk(6zGjgn?8BC!iKzeJrPcWuX_X6CY>Dd*3EJ>+HG7*$ zb!~~Jj;|yLF9k*B=Q&OCZG3SsRuq^8M+`zlA`bW80zP5>H~xdvtC2>zAA&30MEOH* z#OdDt>D#04)|nD;L>JqZQ#Zrw%b%$9wbgH5#0JpL=?_!72%H6{vJ(RDl~LQ;{SKoZ z5UA`NonrD*wx^MwYWD7^h5rsu4}ah>U3H%T=E|$yKQQ4-LO}6auw-Jgu7~k>`I;lE zJImdu!-Nt^9(8K)X1!M05z}izTC_IGP~hmW)!d{hG>^7(d9mE64&YOJ#3@b0eNoCb zLZ!>O+Qe`!=Bv>Kb&YQZ?a_#~L9!zNW4SKUl!xB?aryo7-|TR1cD(gq2D>Jh(YTqr z?vU#kp$8!0usx3m(%@CsiSOr2h%aTjx@l|kWKz2Fx*h)%q9+*# z{enfR{izk)U8R=uMqGmui19!jBOEuY}*OKjk+6o113izZ6_%lQvoZB#m zFG?@@b}zLC7jPKJzu`$&ImzS}sS+DI)~ z_JEDlo)+0jGw8gn6h`>|t(0~T-OAMRQd{YL`+%(^0)VocTH`&vp^0x7+|tB5i)?Ii z3Ul}OC?a&+-(w=0+~s>3KXj|77M|Md2^Zro(z$u-m~B4B3ROfCnRd1sH_z4pE=B}egxLu}r#BZ4I!ttQ>mZoD;3*&OX_1Hrh@c%{=U#XgGz$6OfUC%U|Bl*e7T5 zP?RofEzC#f<<;;-xDq-7ovDMlzezQGG3At>n*~3AhEe)FPh_Mp^%AS*#>l7P7Av-K z*q$YClgaqn8^Axi>#Z%$-+NGH_~5^D z#8pvGxh!gHQ&2m54y@$Ee@$0TEx3`|V|DdZ9Z_E$fz9hP2;;2R`D*$o^=U*^i`T#;G zRtknr3o+hBq+7GUyDL}ndjusi1`Ds^2kdrr!QHO@HoKkU^5g%qOK2Tbm9NjwI)v)) z?+_M}5gz`-GJ={=gs6&p9@{_(C#e}qOiej_1(&&>Yk@QCN7-`N!jAXfwD!u3&Uf~9 z5CH2Q=hYhklSx^=EK!&`iiNCrnX{-q@+=aTz@O&t^$}8@W^OWq#ar;5p{48|`@&k* z(wtwS+HK28EA#y~da8$Nx`*_-9>3Z=jPr9~=)N^1U2o$vcE9O$j-s)>y}4|s&_bBB z?>-;v?>H4>XMBFW9vG8jZ#|fETE>&sI}E#*N5{?GUFTaX63e>JP}7TM_@!@Ya?IP5 zOZk5af>FdGPBP&Q(uw+x!1!^mOREp1lkmUo3;^M!@W1^(%j-gq3BEn^KDzn|a>73| zdhSm-G5}lh*2j^gbRJH|UC!H?Lro_Q>B)OHhi{b`NW5~X&-Cnx(JiZUGJQ+q${*d~ zKf_r+z^3ORPw^G7GctONdm5`m1Q*<#xVWe;ZZI?nZv1_Ge*NMF4XM7o>dGtrz)MR# zxQyr5Q^WR$!)xozqP3z>serh9qdnu8LlcD7MsoFwo>W26q2UoQ>XaMJYt)j+{dwv* z%O?ePWtJJG&jg<@!kRII<4=>sU9$5y**Lx%bVO;XLvOzRu0qtaQl=hqxg2P+=^j4W z)jR=X6^SrYQ!41FRdHd)wa~hH<}xmD3#~(V_SKcvd|UtQdvNfOS-PTZJa^CBs*gIk zsy{ikba;l2X(Tt>#1T%$eqC72*lm>3qBNU@Sutd+S-PXx1_#DBy)i8QG*!u7X%cYV zL|Uwu(+izN;~SJtYqN_ep{G2jyu~jX+b$g~Bh8kkPPLwm>SiV_=mmCuL=5qB_$R3T zTQZ{WB8v?ByCHuKXH^?R4?D*j z+ozm3256cIwWN8>Njh% z-mK(4l?$IL`K&j~B#7eI9DP5tgQ|2;_(Yd-ZU_2XHM^_L)>iY~?y*B+rYp5OWWIzX z8i}8ueo~Fn0{i+;xl^a~2*D~>UBsN{h`uef#|HG|^;c$}XTF`>=jpf0`S4%=3fIFyz5#6H^xSmfsB zCS#|me$rp&^1qy@LLL5~b-?)gyC_s#a#I_u-5CuP37$n#Yz$u$7JD|InJML^Mu za~bCLvd`tGF5GMfjzX4S#+)(5 zwr0kxJaEi}6|ykLs5oZ^V%jz{sHQoiEI*sfo9SQT#a{*rnSnIy6W~crQ`w@I5y+?S;+L}%pRruxub}iMdnb(M=@)>%IA)!t{0gD`qv>n zVD)ncOgLp^4x4mvOAW59RbucNApCCc&EEbGd$TChlnMG?!1Wvdl%5!!+oFzdGa-8c zKMxLoLdsW^5>%jl!VfS)GH&+>-J#{zH+e z>mW6a?Os>xV|iZ%Hv@bg0dy7yo1grN09^2=7v(^`Fgi^H-LrD+mr%|6oW~K3bv=*i z&<4V9^q^id5qDrbz*%?Oqb?WXiDHgVuq-{BB_$srSE;j&7Un}_@Jtp&xeXja$ZA2> z@d(#u;-v@@U#=UcKP23x|BT{JvT9w!9PMfL)ZI^Ym0kdiL~y(cGls};3&H03bj{PQapi%Jp9j7To|ZA-W~B)yNA|JpTY)? zYMO1$ysU|?edz(0*1xf`L{~{i7I}81ogc%v_h+5g;l{!7>D%Vfn{_YpQld#nhMJB! z(SjGE*7VJ9sT-VfrGbUTo6swNbY&hB7df%%v;1@Bp0hWnSp)mlH3bLc>R2u3Lp4tE zewh%jY)g0MjAxoA5~c|Mwem?8=T^CQi3wedtZier)jT}iY7v+m5?3t`p;ORDmQ61> zyR7b%UMlrpOzw$stUHe+I~d3Eu=OmlG4yb1Z+x?v59aPX5_1m!;#oezwbTZtI-WMF zCeZve+3~KEr)cr+6RokHxK62&FE;>j9#Wr zA<5KCokG&;J9qmnCbq|p`%uc9^kdlOvlpE`i*jn!a{+v6%`@4oaOMvUy7KBM0hEQX zTzPf$esAM+i^R;9KO<^=Br%LPkttCk>15me@Nzi($Y~7!k|J?Q7E2&YVQf9f0^hY? zk?}eh4UxL>@K)F^&1%V5jiaTnkk|3TO9iXt2dt?TjF)B}EFvqjSDqt^t$~NO_}u}s z1e_n-gcNg@RhdD=X+$`Gv(&w%PWpFQ%$c#Rxv9^#t0lNK`XPo5iZt%xc^)sUo1M@o zeKt>>MQfN1i38oRguFHMfA$b$T+D0X(#GHj`7HC&JSr0mmyzwpHQ#@Cye9T&Nw2^b zD7?q<&F3sz(!0fCv2$j1I@XpMYK+BLe(@e`?q7C-h$Jd(pFxtpRwoM^f1m8g6B9k2O>Uj~&dp}IkKZ4(gyr`4nqT|s zmEVRKp1sZH;ihH1riD8QP)Hro_tT3^Z@Fx1QZyD(jxVmqFeM#Qrr-9(z?4Ki^MWA0 z9=5vKw?7XXIph=0yA#Eu?fs+U)8l<3@l30|s8@B~G&9N*4l$1) zsqV5rZ}EnRLq5-e>z7gg+L_sIL~yhD5>nI7I8?t|CjqBl$N-Fc`oa`5`kA4*!%y;J z8B>Lq7a|3xa;C_R{S1FTLvF%Pn(j&5EV$}e*mhIYj1K}+CjGi`Dm5n#gj!6+Vf-qm zLj!y@eHnV<{~d2g#Vlc!l_HIsv44HlE|4U zd?tA}C%~_~lDG`@T|}|K(FlPE9hS_xS^GUr1~cSp>wdw*fKjnDh|TjiTC4M%>l}iU z1%I49nmw+Ps+b1xjkyZ#@E_4=xFo4gMVeb;`wk>z$zF zu{o1ymGC@4XcI~g*Qx=AFE-VQm{e;JA;C&+pHuc z&T23+KDGXj^RG?Y&>Z$eZmEYZ+|B0s1INwa07N}7N~8auenpkQ>q)QQCCQ^d?0igU z1x(^Ft_?GlrAxh@tOp4DVXJ0<(1UHK=8T?tm(P>%6EiWP48G8WdIL-ZeSZ($9^Nng z+FlDwFX=j%@4gLJo%-Fqu)6N)Z18C5l^adJvC`QB9`LO8NQ-7p&*`BwXD%WcU5CuC z`v~nDh^4*{67?^2xo41(wA;6xd(z$8OzFid_3?JyD=Ra{zuTW*Sg!bLy|xqu_oyWo z&5)|BYUnb0rfKbYRw6f#=}9Rq6LdW^k|WnBK5VO2EnHq%ztf^H9oAC(>shGU}`9Y-4dV;wkK&~~!hWjfg%F*f|#`c$I6o_s+Y z@KvI3y=HuyvZvYzhOJ)RapY-g-Fb9oY`zH_LPhZ)@(qL~;lDWw18={W^m zdBI)mbzlgvR<-YS`)TCuaN$?e`X|2&p);Z<{7c3%lPp9wGefLi4!moH*2@u3^iQ%7 zf?@b~3FT>|5Kn7I9b%^Rh{?7rx{2<#RpKi~6P`X5wj%c8JwYW1;Yzn zP5R>=D$;Q+XOpa1LONZrRoZr1vb@8L$J0hUqBP|kBwY>$F40pr*ERE6nhx}SAu5!C zGIs{O@l=?pSO7UUo1_G?76$W8_^($}E!WdQ;`Ymp-NPB({P|V*zqxeVq%F{X+uGyu zx-_z6CP{s9`g-R$pFD}Q>G3h_p+7H<_BV^6{jCcaeEIoVKc7|qqa9xr>AywCxTpSC zxm>TL>VH(rjW6{-ewCl)Wc?34+26hhNMor~T`H9qDFV{?-4+4S>K?P}azx=y^U#_? zmR)9g<;74b3f4CF1!_zyQ_tn5quVh}g1QTy;^3YZAy~wSh2`3ipOBTCxqogAJ`o|T zy|%dSxkEqVnyT%=NA_sk??)HmQFL`T91K5kOLW0@8=EB(GanBTZU$)hDtMl*V`6%K z8U#drz7UGv<eIDX8$vITgsFPiAl-H8qp3&K}+F|Neh6&0nSso z9XoCGQqTER75SyNL#}Sl={tP?N^$Co)#N4L6))9z+S4MwuAmZg=B6?d`jzX`^|H(< z7M9p44P%hDTfJMZopW_fV@o+Gt<-(|Ho9o9YC2|V{C#`W8jWks54 zSTgg1npY11 zLacZkR_YDWqw{NL!wI~cdXkQLDSR#YC^RE?0!Y@lu($FE3@NK_=^Ie*`QU*|?rMt4 zW=hk|M76KUH4^LS@*Ak>TB_*s`G9i>Rms~Z5P|0<-rNJpj=Z$98DkwN+kHNwtNdv= z?iC09qSp(QIGalzV8;!fTI@m zJLz1qY3#xTeQ{s3pU8rADNcTz48l}Zzvc)wF4pe$+IeU2>ra<{=ogljbiqqtdd9Dc zS9dbIS4dxoQk+laAP!V=Ac&uE%5+1gtkZPSZoZ%5=ba>&=2RB3=_xl0W44TZ- zqpfyOqKnh`Fy3Yl0CAQ|g1&P=q;(qyTRRoW$-&A;ePJiYZNHNmMl^LgbJv-k3}3OL zgRJtZKvruIW995O$37`y*@g#|CHP{G5vfWnB=j3QH5L$j%sQotj82in~By#Gw` zflIFZhNrd`ful>BW7}XK!4nA~^_gQ^0Wl<;E_FId!sx#{AZW>%5RJUYYgiTh#&9s8 zF@`@N45Vk@z)43z@{H*E{0ba+IKeM0zE?eu5np5pl>o5_rw~G zy-{w4hZUj~^H856iwFCRfnsabORPfE-ttb7;WM;jSEOogNsNNwnC>t%d>d zBl}S#P>-WV#yv(ZjP?(lBp?voUUSXOB6s&gBr(P3T)2;2+?ZB4EaZEJ#KIhKnl``g z=TOWg?F5>!N3HN6moI$Ve6Kl*NC=#8fNYPg)U-Xc;Nd`tzNvjmR0~WqCnhv?SD8On zXO&C@V`!Rsi`@A#q?=_i>rE!+d#&$VhcHNs%}!i`oa?1JwPc{N>QcED7^!l^@B=N_ zhDmm?77}P!exI1>s9z9fPo)PB1C8kz`{3<-L6W&$CB&>QAl{^WddZYS=25T1+<%83q8Y1QPW)GS!aC(Is3d9KylOPM;FO>i-5VKkI?jk7`=UQQBQDtUmo^Ng z(#Y7=@YvZ$f(MlI@>2>VzvU}Gkb<*<+%3|voGKr*yL||8i)2xKlX%c2EFhXT85<<$ zBWg})-e&?XoP+I=&Whey;vV&l4DfDP5c2o{PX_cE0ws#mkm<7uW}ToY8X_GV$|&gf z>DS5tJXPt7jwQDF)Nr{V8cSJVTniSOI2y2sgAmi_fRjC#RJ=Aa-|QLAl-2L!$W=Qs zGOqe&h}Qa>_NUQuZ&cIB}}EN96HI0r5lv>jC<-4YgGI0UE$@#1t{F=x8utKd#$39@EyUI`d1S{8G$%o zDKxV~oEf2Q5Wmcy4a(1b*lQbqJWIzEu<6=eiO3`LlF2-dis0*0WM~TEUPD=wffYWX z$7}3R+mVnil}LFG2TTbz2IH~;I`3IEye2Bs>nIg!OXUs&cfOYqJ2o+FPG{F<*fs?I zx_2FA-HsI!415Gji|6#wCi&j!Y4hl)_4f5HiJPZp9}IizT^*nCSM8Z+-(gN)wjh(| z49D${1l!k>et&6ljn(vG&Q3oJFMGu4lXMkz+u*oZxKFNPg$3tw;G;#FnTCILHF-r( zXq)JQjlO^hTh6h$o4w9Qp8e5y6w!6Z(Wr18CpAp*S9yUn0tu)W+IfZfp@M^;eeAxS<+`?o$8zf5dj=I8HU7_MNgn4F=uu$dyB|3p~ z!t{G*BUT3zDv5hwc9_U8?-Y&9=IQ0I6+g_q==4UN3EZ`M?Tb+xj5Zt&Z%8mWKHT5? zZudP=Mv_TJ?2yZ{Yh!^UycKQDv_yRGI?E2JK|)+0j9hIb@_-kB-eg|ow< zFRszwGBImhHO(_Xm^hu6!3^DxQ8YP+q^BultZ0vLz&o!lpwl#!i{+9J8|7lD?CDM! zQ0Al$)541c6V}J*o}zL@d{oM>2rmIfU~6_QWqo*tb(WUA6R_PX3C z*2A~k{|FB^!eQJYhPVv`(t%H&(76Lp1Y76coJ=>mw`1Zq0fn8m9O%B8u zM@kj);7cGHy>q&OFrmaEsj=59^9p7IY?tLq@u=Ya*(e?v3Spkqix6ZAy04%ie14HgB{NPV+%a z5e=89KvkhdohyL=O^)Eq+8*5*$4Gi|!76C4Hlv|O<+?Y0NeIu?vp5L)`(pT-4*Syb zFG}n_vBF#UPeabnBFC+C-DC*z&nJC|bD$Sz!>-Hwh;)G^DgkL{tmst z&hq~BPP|+yD}Fm7_GQc(KD{z>F~EqWE?_LOOAK8r_*}!$LZEc~R7&3Q>cxSrG}~!X z_Pf$(=bTHxP(Vq9L1b!7cLVzF$O%NQ?o9&i`T~L?;4#i2Er2DIy~}5l{zn!w&CIgW zJ>>12ln{eom@YY{S4HpSL$rLNmS-h@0;M0k+ueP4kPrc5X9U<}P5^ljiPBhs6!)ZL z>ig-$vuIq|v1$97Bl=-;#zwMc#jY!Scs&-jR=%V9o-hT6s_LXH#e54;g?cQ$u4-KnpRK8&oDw+l}fc>99CwIHRznT3RR)4`BH@JOn;SP6Z4 z^J-RUk{CvHA(j%T21sOC(bBZLLf)*_FX8yonet=dt-R=T!kY59=X@;?q2qC&zS0{5 zN+#lhBq;#(>5ZMXPR*k!#k1$nWW-ITwnLK|iOtiw_8COwO1&ml4Pq!`bx$$$cb7!% z)8oVD-qBX;@F-JEmBA{dIh_4p*)NgyWkBrx@H*oR>Xv9HupHfrcnQdN`Lfpq-lpTQ z=^bb$^z^%EEUAifwoa+?{ISuSj?}lV5b~y~Tq9Azg5hivLtK;lC|bFWdaH00E4+$x zao&01^sd+nZdp=8Qs`y5%h0^Ul2jTQpX9oTR^y6opH7s5vX5vYO?0<6nB0aR2@6F1 zge2vwZheIUM-gqeHs0_ZJw4w4?z>&$^`APq_>z`KJ;VDM+tyaY^W{@mGT{aht7e{- zEZUqdf**(1*r7n&JU;bCL)MS!oObU4ELwV(PXlgWLMo=b^l%iSE02X@aE_=u>()?I z&`^h!i(>d;4)Oi!M5V~kK~9d^z_G(ri5eNSw(N|3%p9OF8~i}nnb2K`!`8;mfzh6% zY$@`c%M`2(78{k^#>7J<_>$&`jo<7}2l#Phn&F4%pD>#{p%vmliRVqH_^k%nA)5q==FW18Tqm7Lw8&Q&iK2VK1>#kajp!#JAH63#BF~A8q z0~lsw@e@QJMr9$k&aM%97(erU{O(})Q&l%Yyl97_HRGKed^Fl)Q?N|+c&@9c>-Utg z17&LxH0&Sk0RjVVdV^|(uopXW4?1_skaw5(lAFUOFn!zp7%@{yZ*+$@dS7;gDIP#I z@2mQSvND#s0$U-{VG@qOx49r-W2E(*1f7!WV#J)Py;^*Kzz%D0JY9;i+%qB@yOWPJ zrK8Rz%0}MwqBxpj2Vb)GS*htZt@dgNwU=40SP`Vgy2`!jEh(_!r^^@8m_kL8Hj*wa zgd?uP?nL~uf#bRnM|`s&qh8=}yw8pDNlq~{I>~U=Dc4$KYA_rzV*D>ga5PrL8}4kX z%%kkHSm?5Lh4?&`q~^~gX&h$ZRD@%&lyDHnrtxh4+Ky?&H^cEijL)}$!0D9`n4Pyj z4M#d}cp5JeJT8G3HXC3l4Sl(^)%;I9_HK6Da7CDvMZQKA+@dYnrwNK&+a<)SZli5f z$&@3IXtZ1V2jTwS?t5sqSbtIqn|qryOHsQM#t_}RaN_tH;dx8N zEQh(C=ns0G30#A*7b^voz1r-_wsaOPfg*80#PDWHBk&T6 zdP5XNQGebe`ApIg`|Q=x&UeD`9lkp_ zE&)ibYE_Hjebj3r$TA(bVX({7>!)2OQT{| zBV259Ew-;^(yX>fgxq{}UseJW5!{P?PR_W>sDpevwuU}0;?)ZehU;RWG!yJa(mg~X zp4!ANkKmgKCy3#Il>y*y^*hzvBW7b>6xk5mKw=Tv zeGVOF2b*)pbn$vgItLR2C)_XEwn<|p75xByg@*^078z@)cAk}6!d(_t@ zu@}-S+iHw677P4rBDLAI#ZDd2EH)0_316$uSZs7g*1by9e@oV znMxlcRXO1dCakGpxmm?1S}}1rV@)gB8&fZ=;q>BU#FP?C5-Qf_d{1~_|8Ol>7neGA zix$hBF~hCd4dVUz5D(8=kOoc`*()(yQ$P6k{cbq*v;JYJQa_Ojg}M$SZoiTwG)Clo3l7WUY1txnlciPF_MmV^nhTFRg?Wi=CHoHEN*Y$=Kv6WzF? zA@DHs#wiBt?^&gIK@1u0g6IIKA?l~BmYk0~7iF~m)5Y)y&Bn{lP$U4Z8?9}D(4ikz z)MMQ(W2YE3B3OSpE(WIknu23T!BNzgXVgqY%AGxSl6t$d_wGm(NTUJj4>&ckfirP- zVr3Igz~l<%@C{Kfn^E7a=^hRttXPGBh6%GQDVh)Q%7;o37yO&ByjxGj(IiwUc`{BH6_sy1C6h=efIuVZR$IP_P3gFl;@ozA;|TA5>~JO zq*{yfwitajm-ql}K$5@q7eWG2c7f(tKw>@(N&9dUN$ho9Oi@Cr3{+CL2EOIK1H!$s zP}h?YAq~*^F>b1;@kCQ!%p#G&I@3rQIz<}=(=gu1bvfQHe3R!vWl3W7vZOLW5roiX z?+g9W)^l-I zw)h%h)-6uu#GMqsL9pa!Z^q7D7KeB!zQMvrfXuj#Ef-c0mluZP@d#@b6KupCK{ z3-1y`rno#MUe5-z%6+e!IU2H%e7$xe^vgIRcmbfe3lM z%03hGdO8}Jc9(iHw>b`TufmEdqT%86=sXnf2`l>?>)K{d7F*Oy-3Pgd0Q=g>p^q&C z0%&+_cFPBuwZs*H>f9Xj*I*^t08D!Mn{R5a!D{+e z8I-B^NnlzCwvh-h&>|C)1ew`6sG8~7ZcXPePf%?J9;iWrbBD|z>4@!CluyEMh;!6o z*(fA7o`FnVUqR+#^NKR?XYttY)LwsTq5F5%@A})b;+;S(xx?v;NG(!ZjKz36j27AG z)V#o`%uBFMFHG%u;zEyZY4zpA9B3aUF9mbTA1VYmkA9&JeQ${{H<%@g3c`dWfUh7{ z2qk4Int$YJ(Y(47=bD(dg1Kl=Cv&gp6gl9l-DSr5DNgMvb>hJuV7tBUJKZ02Lp+Gtua&i|9a+)wUM{dB7GqQ##-LY;xPBnU zDRk?Twa+^q#kMo{xN?%QH5IeR)vT>4*{y+Jj_!()tt)GB?J6irE-%Q&^oF zHk7z>f+&k3v#_e$qj`%?ZHbR#-Ikn@0L<@3KGrkPJ_D9&4}_(`@H$2PxSN#3>GrfG zkZ<>NzuV2+()xW{T1#zdc>%C{$d*?AFk8BBwsds+n$Y?#k%6^&;GwgPh9kRGhQ$$h zpI%EjHHov)b)Q>(>|O67P9;=~mbDMe{H&Kb$p#0th?j#@Tdt0}LX2o9R_iEYu{^C{ z)m=$%3UwNo8LTBn#+nQz7R<(5rz`gPeg?6?!-UdN=Q_!l-JW+q&lQB`LD@7vw4z(q zVeNsTNILjJU}ujiNkCFyhi|<_*XAy|?k{>}-lEN^rWRm`!Afe1)q)+0cb=2xsi3|F zPPhk0m-bi{h7!Wf-lLj+3rt#D9s6Qcw8*sYUKA`VEvO;pSUdO$0r-1k2mAAIYX-}@ zTv@KoyEEmvcczj$#40wgdTx)2?*BEbNv$Z0Tn(d7nmew+0?^7l2)_3)AAEiwW_o@e zc9zZS$L26Y`{S<@y3lzzhWZi{6t5Z!OWZaB6G!lNieB zO4?^~Pe|Y*cBIGJ6V;)-;(9hEr3*9)YfLPp+kH>;%-vepoI+U(-G@eES&pvwD9aEc zxVXz!h`(-Tgy6J56ecmn9!YAW0U@UTTA{~P5xO){#l+@<78-N1SAICD{o?l zt>YcpnQ$d*UhlV)e~P9TPICBByW?(F8y?6@6W@-nB(4nx@~04pU_iD>;@0SavDeVA zf2DtOo2aN*$`@eo0gpgJS@_0&QMO-{@Wm15p%K5Qm15n~;IJkLPLS*=f50dPDcpLr z*1-5R?yXJV7*7o_rJ=xebXN`y6!x>Y6=|?y8)SXYT86~#(*AJ4-di7d88Tr-!4r@7 zIpRgwt`y4c@*0n@yl{hL_dC!l&Yh-C%eWMZFqj3J(jsEvzPg3CpEDq#9SGm3J>aCj zh?s3#?R9!_4ci|CGqW%y)wAbaxp&^FaaQcBgeQXl!7Y33kIg~%FdFw#qg4xD2_8|Y zt|qYoUjMPGZ->%^00EDio$OwXq6OU|4A*;QV=zvFWk&zy?XZkS+MS0CBzLF&uQpqFx+O9sr(@R=asNnEQW0Sn8Z;`JXo0?z~XPo-BgS2;g*9qvYeUw=vBCNeCh(n;DX?0`CRyazOLqV0-@&?rX1xJ1 zL}O1rh*dxsU-m}bU>z&UThp*j#D(aAK{pm>gmSU|Cm4P^l5tOq2?oi%Pnyow;Txjk ziO!rbW)}alxq0Xgw~|sARnjU>Yeb5LCR^NQ^qgWpGO=?)2{;gI-Ak#!s(P0zro{fZ z$d5I-j`LYm9qD<^42Yv(PqwQbJA<}5Ik+1s;X{bi3D??`7^@81ZXJN#10kc!WSjtvr+6%#=GV)ZKVaEDN+Ml)`!*m zXx$QVVbHrPy$knda;4JVS80r_Sdsv4u~b-MnH2Jva)6DsZ7WG;)^ZBAK{d($r|n-b zUL|@MdyJ|yu<8SGrImSKX483s`*98;`Z=pS9DD;#X(OBzC7Q{a(9g zI`xypmSQ?9i3W}Pw)9?3ZuPzu-^=RJN%-tuN@-%bAKRe{E_%g7w@roc?uBio4Z4v` zW!g$qodQTJ>DY~4XZN0?R!J|=ncJo$9;-Wqj{I65Tt;Yc;~K7ADTAPmHzz6RL1 zbP-K^KK;0_ji$Gs^(P1v8L4MlKO%^+nt3mks_$YzjL(bEB7V9D`EbrzsG>WSWQaksZ<@J!3M9JZ zb?bgi$qwajzDXzeLQzl_BZvzvnLK@6<1u*rBTk1M@@%S8xakFYvLyQNAGS-6BXGbK6PCXBQzsgA4Z zj#p2-9JiJO!@aO$O))sWMV+x<9F;cN*(!mMrY-MfMr`0K%5dB%zf2-1(~b86NLU%H z4BN9S_g=P&ciH|L=5U4bI8%ikz*-LY3Lw?)=kMVbD;4Q&q=8hpm2_>h=U{cWm8!g@ zZkxKPe%e>9s@1VoX{^{fBrbk38r&PF_3-$g>FhK2jWIv|r&g=h8>#r8TH{Oo&tK=q zkN+_djlX^Dk5+J7B=)ENJBj_7uKu}}ovSHaS*>d%Wqqky3d<{N^_8{KiXR5_b?DW!5)C`M!D8V(5@4cvIsB;69J5Eg0q5gMWP#7y#2W+(feZC< z*gw{gTvHH;M0HI}C_d~50G~}(jL`O*QaS;rV9H1u%7N#c3__z}ZI&=isOa@qD~9if z6EKm%O;4lh`%*M)$etIHbO!)j@Jq4L6ghi1&ESSZe5pCYlEWMaB;5t_-t_Dey+|On zP5cr=QS&M4`>l}!$`qYyC;S#|s8_xiyaIUV0Jfl@TTDq2+nfc2`?9S_UY@V1x++yoGdXU zp}T{fz1N~(+B|%1eJhaPqsTWjJ=aavSAi*%xz^Hi<$!uqWg@l2)EWq?`PwDcVNr|< zNC0N^sm@%QOekw+2fO~n!phH?*^AGdS$H6P5Ao|7enMTb;*Rf}WE__M&>i!nE+4<- z4E`$ofV-iA8ZRH07;B)l?2CaBu)2E{qb*<==dvo2JEq3c>pflSuCZb2OjAZ2m`5Z6p zpD%H;Lv)1XFo0fB24B&eJ&ETpo@4@r%W)t-xvkTUgLlis>y`3=j}4o#%0yD41STEC z$L)U8py z*1^_YU|NZCQ8|}MDPQ!{Ds|w+LHo!BSJVLF>Puh?+ao?t$!~POmNp(<3M(?@`0dQ%W)(h*0-J(rq^k+g*|;dYpCgepV_pxg3$KmW`DUW~H{9 z-?vzOwX=8H+S@$Xr{5Pu5U%#JtIH}Gc5a3)yZRcCIU@*7gk$nE+FUY%`P*Klon!?v z$DNyJj0X9T^4aJvYgN^syQ)j%&wa?c3bPkgW%+@Lj|BPy<+-}R%z?;-Lb8K#=W>Y) zb?Q*reIipgz=*GxMTX2LEOO|)6*kwDVNo)-*UROf_^B%9V)OEFNs8$CiIsiF@T|xHCn^R%_l2B3+2P@li&bbSPywcazOdK(tui5=1vNao&5t#@u z_J;D21{-VXzJsrFd6T9pNu_x^E@R*zDwHx-RlAU>#L-2^O|U}%r#ECMra@?}uUlLD zhb^xL>>W>{;Dvsf>WR#=a*bM>6l-`r(sogHl zy=@{=>y@)xaf=>LdLdKjHCSi(<&a*^oT(mk29;q zperm$&t}$25*4txAo`tFQ?^-q(UatElk~w@x+DkMOVIu5T{YI z*;_TiBAbIyphrrta>K*s+w4OY+tB{*u4JwIzNu+B%B2LKmq~Lnft_}T>wWv`j(*=_ z7P`J7Kxs@D&(0J4BwW;nv7SX3@pZ&m=2^WqV|_=bN3Gp0TH+6_ z!`9~gx8LJ6FIhJhvliCM*4exAMe?W^kuH7>&sJ7cRg z>h@5oQ4r6~P@Th|JY{a+>S{7TiMGg$>s7^*g#Uw{)cmQ0SIrsnyu-~~d#67f?i~9l z#;$t`zhsuyb%k;LMB7X3UHaVR+nzc+^eSFzeARm*eb}p+s&vh$RI9h&x1hsTb2Gee zK}J|+9ALOKb?8+g1Bl900%f-TsgP^B{&!DjWlrbPC4DKyDI-Zr9}neN!I;6cZR!XL z+9xOwUv{&%Ob7?c8)~`)8(4}t6DaAbUwUYGaoCbtF zKwYBfXLDqUt=;_}HuedV@9*A=-|V*eC61ZYatbsiKo9{151Le)N_bKdw$v_Y_WOrY zj6HV5wl$dksy9$@G1;!O)V@SjkT&R5(zvV=4i2BEC=xu7ZIe0OZ8I^UCoWiwSS#qUS;w3E}WrtPaht*wk5c(Hn3v0M6RR z+ut=shhf=50yWit8hjk-yHm|s`^6OLMioFTIJ#cc48#vGrS6ccJTZD!Zzg2(6WVVU zvp!z{K|j$ z&&ziA9i1&6(ZT(+z{we!saXsq;~>zN)VyG?rkIVpmty{aZxyNnT}505i!nKh3D80( zz4($#cT3)LD=_0A{Sq3S#bg|-)StQP>EcgG1q3ZrUADxfE9zzfYR)B%=2M7nqYjrm zkd^X6{UT^1!LU**<+%l?4CG=>JkvjnTzq^fbD8E;Xn(ZQyk$q9dO5P5%I*q}$VEjk zo@(Ar326~>Lz`sNVw4Osy4=2mA%1ho&$zw$!X1X>-%3=p7Bdspa&^}3^c^KeV*qFAjDi_K%z^6sc|fh!jey0Wo4cWY;64Inx}di@sSzEnDl14li>Vu2uy79AND(l0hYG#l0(Asy_Olhp$%){-9peQCLgzg!1jl7$& zDJac@`W&dqRfHnKMTg36e1L}CYxfj0OKROOuKQo5KkxN9DIN4t z6CsLG!dz%ok^UKno2G3n$EJor5qF3=U^}fqoE4Ro*mC`bxR9zO*&Rl)7LXU_jn1*T z@g~Cs!J~izxd|bLmt%-O3Y=@&{|t$yEh6BwG+pE}2Og@YCL3b%+@zfmCQQ`-soL{a z4+;js@Q~b;Hh9TOJX{q7)jU`eZMWT!iP@6Q+g9`F-62Ulht0RG)7{qIcgNcgIq#I1 zmsNaG)f-TF0o@v!W#01e6feW%dN$q$#2ijtq2ywS$vxd_9vyoI?<5&M&O-2zcA$ny z=EQb2yUc<*+ynRw>dyG8yquVGBc(W@=62tQf}l1?90s$dBKWkK=tMGT;!n3{d> zow?>x-vDZ%{`=P6=KkU7j#VVxc1j4pDL0UTlv4;aI!FjyU#-;WpHIVauQ=!{Lj)>E zVoev-N;WO1i2Ph&6)NvO8(*xRh>Z${))Ei^kuVc|GYG#oofSN00f0ad2iUsl#gR2_ zu&2|2k>K!*27MNDl}|>f#OYDjeyvYB*w>n8*A&uxmsJyqBd#Z$Oq@D;{+#5gw=jG+ ziEixeAGh$xa#Q1ot_yA_f@AG0GDhcab#)ubTBFZ3=7tN1t?7<0mu~CbPBBzWNkb)i zGZl*1f6A5uH9QsWuo8qgN!XkogewaA=icq$+)H(H?j;%@4kPta$(JEi=}s@IzUG=M z^^P-+TX_gNjX4+HPDzBnL*cwoC& z_lUaEXTvV>Jj86x0WD*cnFC!jK+CAKq_F(+*`TE!4*!n8m4dDBTZczG`+I<`662Io z8Bp}Sns{75y2BZ3;oIJT7GcWX1CTTy@KyWo_KR!+uBgm9#y%T9D}>L^@X^IbgpW`7 zDB`1ykMXm4-GBiISCwR9tB5|Td!J5P}@#-W_i(l^c0Z_B!r~ za@^c9PY2XatO8XK2NwnFM}VcoMl;JjGxMJZRt8Z5~-Qf9dv|Gm9-hXZxEmQqr5zNCj!@STLv0qj#@ew`zQhY>uMd zxe|zJ=duCK|4Ka=qFYgsnmfQX*!diVi1A#BI6YPDV!D1h)73x$x^kY6nSU4 zLW5-6V>7sfq|EKsExI(P)xqKZ@%{!ZWskZqp&UO4Om&7v0&>+L(1t+I5EhO?9(!lW z>tj38HX&8%65e4@lOU{HoU;m*PF{-G1W!&*gOOqr-~8MLsv@)FxzpOqbH-Q6jeJ+}fb zlgt{SrD#l&g(4K z1h-XC*iF?HGivu9W3IMG6UV+jOW@H_Nu)XGt47Cnd{t5`P~{bHbyQXA**@oRZ%1mm zw3wO)L=fb-7d$Q%43P3Md8Aq$aYg%VOqR(`*Te+#Lhiuf{sBC_Hs2G=x3j^{&+4OM z**x31i*Y%R#+^&K;P@eQY_|PVuRVLK)e8aY!}#K049*0}O?&Z`YTWQ6j>OhiMwIpJ z)d0~$*IYzxaI>(x#8Lnq!W!bo(jq+83}Qlw(_26dyyg4i&W!bhoIYwYu-niZ7)VvW z!k+OUENG6Xsau|$g^+|CZ1-!{Wy5Vkvh$o?1MV_kFq8271sG4WrFRPW zdT)Ce;!mSCMw|QNoKP5Bs?a%+{4Qj$^B&x|5fCC??!3HR75&T&c0++e5N-M9pb)#7t|+w&;mJUAlp2EADHRn)!@Y zN6ZRK<~eQ4ggn7m6Uu!yP9R;`Z6HMrmNUC-TCg~oK%M3SX3J$>FHGmbT;yXH85GL->($*|g$Z`p*7q>K>F=^Ld?4k|p$4@1aQrli9=0{(fVB zZ)@kfcZbd6o&CMp&5jUS@!ipV4NgnzLOWm9Lj zdAIjwZ~uqAFn2E1r4vU19LH49X^8|AnNwsZC?Ta&5@5U*9!)*t(?z#j^+Mi}GFo>= zJ!JGj`Xz!mg?C`>U^^6328l*+BrAq3Nq(@V2GvldO}SzY=s%!5=06P9xs(H;Z8 z-D+;O4s#8Md!HRyrOOB(J*#i&KSP_J)`QGot;`EDW#5|jRswz(eoMjmfnymM|E#wJ z?jQP=UV{g|l~(oK^VasxW|;MJ?^}9n9`csCN7G|16rq|5ZNE1{H6>B|L@^fI0vr(J z@@a^Y*uKTz6n?*A@0KDgp3^rwPBMFNMbbU==e;rf{P)$B!Pf;4i81Ow&TFLpkR$9ygSar2lf_~#^Y>fOo{o~N>p*B^V&F^(-sbJrfn`)4!`*(+&S7PmGVRt z-Jj)reqJ9NyY^m{X0>bWHDB*K?DE~t+oL!0+uA@|&Wh-tVq+J{|1~#xmoTr! z=fL=!s=AcfaL!uAX~JWzJUu+mOQ?aNn9z-~$JGd06y&Ic=NqSw6+OU)=wjh{ID*rX zL_4=Xjg~Gt9dTNt->HjEF+ls~!4A6+s6hIOr2cF6ri%syHp79&v#~bpllc78tf{YO zaiX_pae%JqJjGBoG!DFRF-WYRLyN7F7|V|D;xREEit=NPv}2K1mT1DWXH1U=Xb(QJ zx_!SNU4%!`)!lF~{3JFm9=m_-VyVGRjEBR1%(vmIU@CQ+cko1ucJ?-Q-)*)w)A`$G zwgMUaAyOAV$4~KWFgErLNm;*Vc=JNzV{=f;_K+4xH1V(>E!1qalBcIMrPHJLN5`$V zN2fa*8$@#d^{*LUH;>-Z*C5xG}qaRFU1Z-cn4vr1j90$7Xysk z^0&i|x7|ECZS5YU1~R(6)6?_zh*f*^W+f^7+M!4k z^r!5NbC~5!+2fudCKImcP2beCF*#@d<3$Cq^7je-Ny{BXx8p=)g7@l=8eci8G~Bao z^K8XFdvDvVx@WfCOZ)6^rd`zu+J7_cs%85O)xxpv-TfcvU;7yK!0|Yjqkq2rb~PXV znT_)K&|awRo$t2UYz?TP`S0w#;nZA6dfry0Xegyb1fwas-Hc5BXAKZg`Br65Ct1RT zN!`%SU&W5X+^~b52;K~9tWeW9Ko(lz9`C}gObovUMkMYnL|t8RY&_*%_hfPCW{QOq4+fucGwfGl3fC7`@pZcsC3sN6Y%_BW_%oYz z^QhBP1Sg!rAOjANh%bT-^RqJ;5In=h_g|qjG&gmMX6)^-~={HF(njg8H$l4)`ble2zN~d4+ zss9c?57hsPPxjJQ^FN{UT5ybe^uP5+DXssl)axr>^uNExkBL&Llu9p`N~=qiN)Wu7 z`4jxG{XX2>4}WNdd#%=Hc)Z;@YK1$S@n7b>6mVi|Kgmp+gQ&z6*?P{pY>J2{l)T|P ziPVlb1LWT*9g3Gmh@yc zGmy+gjM7o-fSU#>m&<~eaLNR@iXX#SWMavT6HOv6s2BuWCe;}=zzk5@Me_#Wo%UGD zS3=WSa1{qe5*A_el87UIH-K}+Svw~7GdZNSvs%k2C)SfNgTdsy&8r*PTzDMMlbEVx z=0yLduO+i#p{WXC0_ma{f!}cB*IbGL2hpaMBbkdit26o(n=mZ|S$|ZU!ZI`~zO6H6 zkUQv4E|%z6mkx+4&eIk)uQ+`U)-sgrR3Kr4vA+lE5Sj`t1uNw8-3Q{lC2`jW68^V@ z=)KpdXvB%n8=C5V99?iuv|}@9%EH0z2U@W z97(t}OMWy?VW4>cIoi%F;krMGy*03tD!;fUZUSa4CQq2;W9JLWSrRl+IWO}Qe-ZE( zJP7RvHZqup#OC}2+xtHderp{8vq^#&Q=_}Jhk$uxR5->EVUzxNx3@!5@jTo&Z>&Ic zG;)XIp$DhDs~8;vF%sboa#aF$jBh{G%Ui?I;@a zW%>I^;19oy9jg$aZ_j$&E*<^ZUC?jeuyjA^^}7yLu$4w)t~j~h9rRsY6rj^uxbUw4 z6u;A$Rfm^!GKBaqMv*32Ky32Gq;Eq0ISlpOtXi&uZ5^ETZ2el+J~4a@rGW(Vj0=(^ z0?8VRVGB7wY$PmKKt;%%xVHzGyP32qntCGzoTDLvnKbCYlQ_LN9wE%-0G6&t1A)nBkU_|0G+;UY~04<&j>A2p~K39ig8a_S{7M0hNjNwxh`8u@8~DI6Wm zu!D=-rTcv`j5XI_pP$gXSK?XjyWm^{drQVAyaHroD#+k=a{jV@yLTl^7eEDG-ZSFWbluxa-f zxbYn){`zjx>qb)d$17HZ_jhTTPZ1k%IUZlHEid2P+!S?g%PNl1;Vok~PIX1g1QfgG zSnLh-7MM)Ggyoz~?lixYB0Y`I4h%%)hJ$E{J><_LNp8|EhLr+J7Q8#!!2 zFNbGmcPw{e6wWju)`9_FOyoV4#Jng6BkV|^3qjW&`21ZMHc7B7ON=jj*NPFNTaX_@`4}pt!zf(Eh+eOLGmIU zf&~9r#2{hdfE>7KaF#r#LgFtczQWY!*74>JBK?Q`32*Rc)9noE3Q6T?d;i_;X83;p zUAX`HxVf`uiE8Wn)?P^X0AFqH?>##XcXu|3#0$|sK5TBb-Zl^49DOEj&zMi}-X?CK zYddf$$gW3`@KPq?*52A|hzWd9k-&3s2~x(LAd^m0vY~f}HU$j%=mw4P0To71X zK#${z3*FY?(6bX|+I?ux?!+0Ci-sigO$2F1Q*i+^@NCT*fiahhDwo8|s!U+ZVQ9oS z7K0Yj1@z|3g|pM=4S6W$;eTAgKYz`_RW;!M_U1?MTg7zvj+Pk~8XW{n!*7e6N+xgfcVPS7?cqZo43qfL65@&G{=70W)s^Hm*0-iMUiO_) zFr!mOk!IhCR9z!!y{WU~i-`$zx?;dTFqz1Cs4zr}w@oCWo|$Q7J*?EuchGq~H) z>Ul%rESQvJF5{bFVAm3_h41*OTOFs_;_dxmI03f(MCf*Z*!w%7-`w~1_u!ZbRNR5L zol*L9+Jz8|yXNT9T-m7sR;%@j4DeT2DuXw}@jr+p-(^=dO=Gi*$qY zs@p;OB?gz+q-fIA!or%lQKX(Gm~dapc|10TPGh4_Oqkq?dIX;56#2RRa0cni9J5!OLle|#5e4Xx)#1?{VEY2po5D@ET&*gJp$- zCET$5y~&BiG*q+AOfYMN$0*D0EgpiK!+lD3uL{bx&!GRp83i8s_la1WeF+>3XWWO_ zkB5bFpUgo*vAQ)wwbGh18~yL=+K8NeL}sJDXzYv7I0foDBNaEt^K$ll{&fg;LS(B9 zw_DJ_vFh#U-RmV`)e&Jr=*?UTq(0rYx&q#<{U4MVP}w_}&MgsvN*hEW_CvxxcxnyJ8l6w)RaKhe zV_LR|W&yWblUN_I2BM4_h#JpJBr0vbB1(L$Q$@9%QJV|twL2Z+5LHzS1vZMxF;@dY zGS06Bx;`TA9GbAu&lO6XwQun&%~CT@Kbqg;(o)dcKfuz6YhUInG(7t|x-i%6G4g71 ziHhcNvlQmeAfkFU#Lh+_-+A3_(ark9<)Ij@gyHPz}^{AJP0O0llJG)e*5-J%_r zLu+olS>9{DSw1>$?(T-U@ohe9f2KOY?OHe3XGsM}6t=t|`MJp1EjnWbwXZaj*%XAa z8S+|%57RhUcOmMk%ai1dgdY_&!WX~{16!QnRk*^Z$7yu*UGPRX?Ymg3V|RmfwBYy# z=1$xoFd+^)cWYtQ_P_Kk_gAT#2d=fou}F7x%R9hW?F*XShfy@nRq_R{5Q0(@^xJj; z8p?CxU~kLxUxogw7Qzl#+S?k^Zj{SfW@&v-_1=Kyk(MCGWi$6kXCfT-(f(F3NQI8C z1?wU^vEz^iJ%rbj_%b3yZ6+0dh==Db)D}3IH$PSe;a&Xuem4mX>y_|BwSFSsi$4Tg zP>Ju3PyD5r4+-pzHMGpg zl}mOB>>26%%%&VP;}nB+IxhkPNEDFsMC(BfzX?mXt0ilu+(E7@NgfAt5mX_Bu&878 zEe_T(2a?18T1e@#dz|!!$qm=}WkoHC7^eN2LRd#3jQ@sLTV_5=>q* zuD|3tdnfu=hjRFnzw;_E1v+2%z*KDV=4{YsAd{z~|0ki$`cGsSa0 zW=8PZ;HValhJCn+#8agvuJGa{V!(uMxBugLcaJjpu{&sJY}P`Itjw#Lv~X+Nx%rs?f7Q+nqGQicBEWV$~L^tTq?II zpFqHJ_`KTl-cwz*Dc@l3|PXt5Ww8iU9!~;&*iqkD{9jd#)pWUOAHkmeSwH*_} zRq+t}NYc(fB9nYys=3@m271Sq3}Lq)duBe=GS8FV`$m%UxGiU#PbJl+lF_E7&}G;h za8?Xq9z2&YT7ML|{UTT|uH_?xOnJT5! zDyq|~sH9ff8H}gf=;ckWwlcliN_}dzWx0TnT>GgR;HAb%_`w#?1oZewNJfr^BfAs+ zS@8QS_wQC^HFLMhiGE(5Bu<8zcMyr!@3xM1{?=lywRHbn&CMO%()#_mf}^F~e)NlY zXoNCwd0}oaL%vX&06r35fhiTV&nw73^0b1T3A{6|X<3M@nBhmM z%S!X}FRD56Zm;`Jmn|2EE}+?n@?sld7YY%r>_I0{4ElS~g{JqjV!F}mKE0xfd|#FC z2THtB6Sk-z3+K(i02OZ|r#GrB8@1v#s`7adQwx*VczT7kP_OV@h^m$!1W~g#s#-aj z3vt!z)J9cjY*EF?;dYCvi*3=&v1^I3bxksd@B?gmj_HBY{S!Z7^=~QZ^`OsM_&s=yddkxezzgU^Ih8nM-Rpf7Ti*b`7iZ0jKtI z<{IkRYpBQ?>ZMt0sPh`?6}N`QXRV=T)=+QEKZp9t%r!K!*HF_n%tW{iUPA*2cRh@5 z$D?-m_u*L#owrq$7?b#j_)_9Jg&X6Q#$)1R3!V|r(e4Dx$5BaAW9U;sX{c&&j(|b`E4j)jyvq?8EC#Ry8GhjD(RRn2 z$!qvg?&FYUMuAy=7e;t}P)|Q-q#vyC1883gV5)-A?JhA5Ye^=nTCj{WHl27L%uo58 zH863sJ0&QNL}O(9%5Nf7{dU1x(bt?sEuISs#lRL;G_FEh9eB)e06-JR@%xfiLsrZZ_Cy^#&n zYkf9~{>Q+czfOpn0BD!0#j)k4PbY-Dly?Xfc)ZM7VgSR~*#WAvd3651Hk&{9S-dRX zTv@z8cP(_37*XN#j1Bll%( zv75|_4}_Jqxj)-?!D|pOxgF<;0)7>Xc$!jvlFq+$;`T$2+ouu%0yuwFJR6 z5kG2w-_2^nJ-a+qPuua8WXOOA)6>US#2uT`=$wud{OKd>)W)~3@5YgE?DTtY+~;5U zNcYN{VtAVVS?A9WC56M0-nF!HoSS}FB4}f#(cP_4hmCOEVe57{+AF8p*G}YDzH8jC zvO2dlPs8fkTNESqSUHiYUX5KT?$4VmO%ra((IAFv7#1cfO@?^h7T%PZx5RZ-DxJs+ z#t(@DV29^o9flPKU#$8NX$^(m_In-D+;lRiX1F2JCp@TFro0njGYDdW(!KV_=Ae5R zjeFC_w_XZqokTUtrs92wqDKAjX#XIguLjy7v~jSrdAiqBdl9g}Qd&z1<0%dLqpynx zI#>dyjp;Nyk2{^_#?PA0#$bHUbcm{ySF)#L)qLXal6<+Wqu42A-5xtiBWWLiZL*T8 z7b88=4SIH4eTLIMtR&4nuvDgN%*ac%4C_PM>ckDJ5dWvPPj^Tf!ZxiX`k)RmaqvVz z?qF`SUMBSGU+Lf6<_naN&lljO0$(MrEJAM~_T-gR0$&f`*p_A6vNYAQ0v{WU#U5BO zJCj+bJyCDKxotee39-O5iX;d$_bP0Z^bqqjZCx16S1a6c`XQ~B`0V|&VBL8V+JckM zXy2Z}4Mvc@b&x>=bQ#5KM3{=jBC}aF>lMY@{XYC~3n!eb9_;?QEapdE8Ic<=(O*wIX&0l*arF@V)-?c1GVRO@~Jp`;+IdK#` zbsr29;;Rw-SIfq-F3rpyBn)cQjIiZ39UPZ3?=n+D2zWgt@PG-JV1qq}*sb9V34KfO zkqxgW{r==S&L=3iEFfjq`>?diOwUr-?uf_f*(6hu1ir+%2628Phi7J0q)bk-kA zFrhXoNelw$ZcO(N%3fMI5w_G2U&BLGgoj9;lWx-)1-L$$09M)=Ca5&XheGxdUH6D$xt*!h#zP6Eo zYjn8!0Kjf60@pR1q0v0dhihnGbYm4|tt@`xfZ4h+R?daX+G;jPdO)(0?)~K=K;i(- z2a0!b@moMYN=(UbLO^Un(o(E9j^pK%m>SgGbgNRUdnZ_ zw`Fq?lU|izD2NZ-i*6**W3$^Gt-I}2FiD?+4BsfTgCpnl7^%;DKRO@F_9ElG6hKZu zFUvOJi-df$4h}ItLuI9$%4U0=RLzfSuu6mJje_JDv;uV-P4vp^*L|5{Y|Gz#lU4SR z88KMbOX0A?8I8Ke?0)6LqA zZf60psHF0{y{(yCIyf7~1_;hVS~bqf2zTZwb;6Y6DEOJ=5Y@~fUY^)$rJP+s#3EcH zJ8Dvsnkgw5!*7-@-fLA^s8wx|%cq#bA{1!AO{J@xJ(p_YO(D@HYD9N&iMElzw-?(w%WaOTPpZL(BuP(3gD+{{|9yTw zKmLDp;RFEl1ZD3T(O|R!5^``Qb+BLiv$2O0tx?LBNAe z#&NGJQ7<+FOE)kH0Wbxd7>{$=*$xYSbUy)Q%yHBNVDQ4clw{Dz#MHSf$~w)GTshJ3 z`Vw@tKO|nXD@sev*J(q!M>IjMqJuJ|*CHVVai3Gmbns$0;RlNHES4a;&K*Z3+gdi54Y}CrBKRnZ?Gz zyMk=rRYc=-!(7`WbG{mOC*Wz2DvL8@#nA{kO@n^#swdzUuLZeso)hu8!weTVOku}K zL|84B0UBIxmez82%}KB1EoxJ)73&N-m=&MCJ$Yp6=1dJ92#h$LXO4L0A4a0fX|)cJ zSPidlp?H{)Fg&Kgd<{ zVT%UbKMxN?>~W>?a>N(r{k%+)#eq0^)-sIk#;}JX-3*dtSdc668p^^HBV{WxvzNdo zZ%Ss;%@^Kd1?#I`m)KI1wzqv3NFZ{uB;k-|0~HsWs!_Lb1DK(-Z}Xl=DTSGNm+ zx;YLRr6&6A(FKQ0wl&kOIdCo{9?@->k{FaJ#&vg0LPVz^^<%cf^?5a!mWI{MqpPg7Q;p(kU+*_ zy+GG{b)^oKd9gzORO-bB{;k#uVXacE;;VY8$p5@7mMit(Lut8uQh-lzfqhsDP--u~ zs5J0fwT90ZwaRj>ir?zo6p9~=sFM|=H8d)a)*xR&Qi99~uQe##R)YB23jy<5`v02$ zN`XnlI~4Jk{y@q~HI5TT5CGubf>}Z(ex^KF@X#m@&wICpv}&`A<1LjE?o>>{QgXDk zTTQA@qO?*;+m#z(PL(~wuw2foIz?K*znt-)_fx@Jl^RYjA@rkN0rO6eP*nw&dZMTM zv+Zi-4BJXpyO#+gi0>1eXjiABBGd&*8CGTX50fBVcYtfbhp)dz1`_9U7ku;e*WbD) zyurcqufKjy&+LmqfY6BNrPA||eOW?|Au9p25Nq{Kss1hf2IwlS1Z8fzil#8la6nF( z;fY@Qrd*|_WdLNEAo6*+@jO681WW%=d4_N%30c|rO{Gk2D;TO$4d9RQyi$8kANA)F zDH>LwEwA9E3cd7AwM6Z!7^+$c5D@XaT751dPGJ@BU&R!wD`>ikrWmPK3J@ysyjFhB z?xpmEuMDPGqnEy^HK=I~Bh^-e1~+|4v#4V;pxO@Wm|-0+)v+0MY(^a;)$vk&H9(*R zE@}v;2KvAZ8`z8nHlu-&8hkw)!Sl!b5w81&^RYv%DOm0k^6Dc2Pt12ZhngLzGD263 zy$lTdEn3ivw&+Zr6Ql64cb#m?i3qeF3Mi{7D8(rYxV7_MAmH=MCHKyILnHt|IDXAAsi-PC7l#VA^x7UK-%iF69eh{Us40jnb~68TLRLveQ&1n z1EpPkLf@)7D~ph}O8J%h;Xz(2@gn)eHBoxwB@I2|u=dGVQqe#}WXL6O6@Jbz*V#Z1 zH-47w*at>pjz0jN3BXqY+N;Iv+z#b$zVYW)O7BK0%a69I&d)TYtx{gHqiLaDtn>@4 zuk_MeT6xAo%3inTjv7HeDeBu+<>Y~-69s9jN;1!gC=Zh0v~Gi^=ev59=Y-vPt?G+x zikjSIQ!0r~kttTc`6g+jUo|23s=2KYgS6>oEQx%#yOcI%-9$30k7)rf_tH z)t@UnvE5dqFz}Rx9?ZjWP4XXzNX=p_0RnMrny^AH;q}#=!#56U^C42a;dPwcbS|BI zCK?LA`6gU(ebi^CuJA@8y0K0_2BK(3N-2OM5ohV!ke%jUy$U}x=<16i^o;F#V(MU1 z8sIhXdq_HYX6b6#887o3eeyc@9Lvn4-$d-brxl7IP+^aqvQ?{tF&DPV00e{(B1pi*92*@%N=LX0@sS8Wk+Db-U5%$s0& z>NMGh%?`J=NdJvRz|pLikNJOdWw+Wiv7NKurCHSHU{@P?-i-I2Lm1sgoe5{zGolJK zm=LsLuDxlhij5{w5J#ovpnC)&l^Mae?s_v&u{ zFJ}_7PTdx!2FV?tPK{&0#BWtT(H*@phGaEAgUu-$OSAhj8s9|GpkUQSN3GHvtWj31 zQLZd<2<7S&Lz7HE(@CzdHg%mUDSkv5L;L>P%o|^}H@-Y4$%O|na}t3h55XSKBE-7< z7{t1~5V0YbX|G*2;f~^2-PgMS6Sd) zb$wKLeYGSap6B7Q&iT4jDa%fRpQLE`P5b(qjmly?o-YdBFVf0Z&m#!cTJpx!rT}u9 zAehu(**B)9H>R4Mi>;O<2qrVwJ*Tuf`^MC#2?C0|*x?qsF)u&&#?-sTDV#jxG^(JX>CESnxL+KOe*pR&Td=5ky^o4CPCGAtY1(Y~@SC^|7*uBw82n zUwH_tUQa1sR;JE+8c~~Ua8n>F%5DW&lX5WyvWbA#b(`Ae9@YD_?j!-SD@p9%nAV+? zrqMZ)FQ#mDK$=*}7d@KmU|Fgow<->04@80q;M^(Cj zJu{VelEO27L^=8FUw^34|uk)hwO`C?K1?jP8E;iUTqm@gKz&MjiTNTc+hXTC^T z=N`#?kyOTd=8MIYvA3Bu1aUnB{_W0^0K20zby zv6#W{cWb^_kRbe#%@>X!ENs4*O#v1$U!*C(&of^nDZpcyFA@~MH(xA70e-*civ=mb zAK852%yADgUt}c|NSZI^=zmo7YSTncXy*PNB8^rc8LWs@E_1F z;oE~2;jS04IHYmw@6h6qMA$Pe4halA&*Cu08umCAhpauFQ6kEOv~n*ds?p>T_);-y zff$&7yNXc_Yadv!VpOWw0Mb!>sTlRZiczxaR4k&Y0=3S?no?#0zoe3E%IZ|%rvrNMJ}6dd|0_8Q}khewWQTwyjYUaMLw`tQvGKYORD{n#geLzRtBm1?^XsW zlSuwwFN2hM%CpNL%?oRKKp7-czvyR{K|&q|XD(Z~3=$9*|3K|6b&elg2Fb6zb59wh z#v*W7TgigMslHYhfy3I%M`PCNKa*LTDuYyCj9Gg~86*Hxy|D;fL!a}xWstBFRz$p~ zJWe?qBY2!Ds;`BRRsFM()pQx8hajuP${^Jirby7oJfsX#V<915&-tEW zNiP?Hh6aNr4p`W=i~w5`0S!dNdX1q?v;Kz&zvj@pyC!g-p8><(_{1v=Exk>9=@h!~Yizbw+-}KIb8R1()AGZA|Xz ze+`~`-_!Qw{-X!I(RxV#enY!Q=sG8_ z{eOMPeJCxxTspz$N&dh7>x9Rn|LFTT?{&r_<#}@?igK?hQeJFdK+mSJZTQUvh zjU)rbe2C|{ryu@Qs&skiPTpHDetz<2O`F({203aFejAqZi7}(jQf;C*J{weCmQ36`$1dQAZty5tNKMPt@;UbR&t;ui^ z4_X%s7x~>n>!Ohve`sjs&on_-%)AaPjz3UpZM-2u$}3`LM(w*C@wP9anIqAwValu& z!g?9?Rp`wrdRcBHh$OlNMeBJ?Ky=j`6ELyR0$!nKC>?%X4p;Nw7%JLWR{knX&F=&L zK5-<(>(isChWJt2KXt7`k5GJirX)zO^6ZxYAyY49QZu2D_>CE~nQ%ZbYKdsZspP$H zKv2K(*O!d8Ur18bQn|5670>$bxQeIU zp0M$`OdF<=j`);daAFTUY@FJRQL4M1_8|YdVWbxsgUPt zc|sFlB{e7kxW}+RykJ!+7tM%9v`Ul`HRTlpoNKB~Ymo+{H!s-G(?+^Rr#I?`wuGn5 zJ$Sa+dj0OZ(_Ng=vtqcT#red!tS2e-rD-?hNy)E>$1ZR=zpfb!1wH$sWEl*XhSxFo zCI$rJMmAr6SC-Y>^yszr^);a@DZGa<=>og1d2gOYLU*HXF$kJ&n-W&7 zHt}I+Q9sN*Lm8;v?X$dSF=*RdWpkKfW*{oY3@i#Ce58XDcfII^=c;Q#LR z;bCHr_BUylPVqR@FQa~{{qEcsb~D~6&3&Vk^~U@`N{L(K-rUGs%mxf2{9SUKjibZY zbK3K_Q*V^!zk;tbW(G8q@g8F%{c;Li(@jd*Yd*?c^AS(zC~M8l+3n@q={3)P1z%^) zZ1b>{^&UMA^~)J+c1>oic{6j(Yyji$k}KHE20+u?jRE(*UWX_Eb1HmA%^lqtkhF{^ zM&0ZV{$H=cT=|=C+;OP{?E&p8C7{dH@+FZ_I2$!~^C(3GQF>}0{6T+7{3P|ZsNZZ( zF#Hu{@(0R)Ugi14$CxkwRT`z0YFhqlR7zjuzhC3W%75O;CM3Y`m);${E`*o@$iJbxQN~y7p!wq)dnMk$rJU`^3d5W0gKx&PlrrWh_4n!kkf4=CU z8hD2VA6TkIws9iw(bnPV{?^t}>)5#E5C{?v&-sGdpGHgl-dX2aY&j~g&})33+>-c? zwx6C^-7Jm5bpzQ`44uZh@opqAYO!BO*0?Q<$_@9dVxFzoXU4&9R9>~ujK|oh{L;Ov zt_Pz^$vvx?XJz-S{^ZH1;%cm&^~T)YZGF1LZOuOFM{PFj&?7ACXn5rVOE-cy4BX58 z4aMPhqfWnVie4KQRn!+d&BN29_eaOAw@0VVqqnE0q6`-vIyBV+3u!l@wD(v>Im2{E z8*t(ojE{#O3)1f{Dn;;b^h|$0#?$nh$94+Gw}e>6lenDttICu;vu38(lV36u?Oi3y z>&aQ4xDuY^s8eoaK5SlNcg0^~WB={jePSAS_Kv@AZRqF&Q$5owMQrD=e<ATYD zCqlb21*9$0TAbcnCYPQ6V!C5vE;90O*7uhA$mri^*V13}QPQ4`CfDO_f}g&+Z5g{_ z)*=s&q=50p{$?u>eoNS%DF74ro4I9p%T$0S;fjQ_E@SwfnGx@ySwhJDpqu2*njc+a zdJNav;ErX{ZYc(SI*4wbnwJgUL-XOtc5hkA`^Gxj`3?_ShllSDXy#L64g1}vQ=Kz# zCc(5gCPuCCr3gQ22bcl&A5-^{Bs4(wyvDwFIE7tmMd|daqRtlF@ z-`WE*3U`+Gjf-P}>oTK2Fw5HGEV$g=Z*E#wKEmU$D8mIbx+qKyIQ4SU5m4U7IO!Kr z`tw48mg&gO_*v|9e2MA8hZggNI&s1I;+4;zFb0}6VU^sp3xhvF(|lx^Y(Tga4RU@9 zcJ`X;r<&}iI@M1#)lXIWdHi7DcVp%NtQtIi>|o$I^l%xRpYjjls4Pl(papYLpogb7 z!%hb(_r>-F-8 z^wPxyn~73Varl(>5$_ts^V1@8&WFcuiKgs^Pft%rW5U@Z@Ze7i;nV6<*4NS0Sewv3 zL;5B*1Q;Jm;G2l!_Xs`F*>o~aMLa-?VinTjyXaf{qs^g5y)GX&j<{AVmtHUbP^|>1 z>racJI}k&TP2Noal5zza^bN!J+F?Gv+3{lSZyP*T`>m z%~PYFzwM?TOI7B-ZKoa!!TOv3lmi`^V*rcmJ@1V-2EsAztrHq`&+5eg{vp-Z>6$asV;PV%S(Ls_14b3qcX;9 z0IXCN1i(sdK>)1O7X?7+@*V(`?(PA=AF~1Q$7}$+%?3coYri}IIt?l)^}D0i=~naT z_>?4VM9d5KW6Zgt2mwNF10coF3A@%=@8TjFsnd7w9}&OV9(-gY!%@F|Gra1J!mSZC z&AlGRAA6g^=E2cs3JV$ql2z>4~pVw!J7fZLD zQmJg3kJu^SP2(qje&#->7V=zRxsWt#>YbTdWM|aj1O(^w<1Lg+vghQTr6qr+@`CJO zf4G{Xzw_aLn^9l9z#o@Ad7fIv|I#yAMX+vV)t|K*89YzjLz}YfIpz0vq$j7mZ3&dW0@=ZBR&6HU{;jOiGfRB zFo-Gr&9?bwI}tskI0w=9TU#05YcV}Zo+4`&w!`}9`cFxNS790(z~LI151P}0CtOBml&-Z(f8Ogs%8R-P7>Yg z(G=V}{n)*e{UF(^_MpzLoqOIjZol%bS25n^KEQt1+nqhvtcBP;*2BE#0Fbhc|3KCY zADv7i5p*z!F6ONRO*3Y*?G1R@ySRMFh@Jk7WAOKTG@NlXc6`5e=5G9=eW$NaGQ*xA zm4XKLpN-;6{F}aEvKzxIzx#}5a^Qp`179#tlUHUQW>VOgpu(rHeMBO9^z{#ea1GxA zwuMnD@g>}KlL@e1H$QlZ2-kGynG?`uUFxc z{^v~{yTpWv7ddSmzgD0!E4OYHjE{TsxGBhCd9xR}H^g9d86 zFoTKb`Ha4H^)gGg4H1Ajwt91(h*L-Jc+}{n;pMshrh=!C3O=Vbt!LJQ4&iK6ic?^{xmVYz`w% zqY+8Mpy4&mt@jUb-8^&PD~;Lw%J&VJfz)Q9Ceg~K5tMo}B_4`bQ}R7s08}Ai%H&~E z!2|q~L^@!ETfemB4JO)$SR=-5UKg5DqY zbwl8ssJ5~7-RXAo`_}2(R`clHA)Uct^KI*Nx3%}(@%GQq3ciinKr>rV5YV1n5YG6b zBK*Zvgh?HPXb;$;n|Qvh&sY5Coxzyc89c9+rk-!}^K$CB>1Xv3R8QG(^2gRgxg)65 zvX6k?$vlE&dv^p=?M*)oqkBoe#%u!jI|GyI#vgD}4cU3|J_9c&l6fpy_s*j64N}jI zZ-ypE-Dr3w2?DQZPkPq~x}zJg62b$G{UYMPGo?+Ragh0RDzW6YpA2W6Q!$1Ai+p@n z0zXKa_)0k{BVOpDryeokeY7_eH|p4tlEJ8^CDAH*?T0o(_^|9mO4M~tY{xV6 zW+WLObfbi+h|hXAb~2uzxc&jTbJ9f$+*GxZ$(?l8<2k2;b=N%$mKR<^`=Z?&n4#m$q08yzm$PSrK`~Gzeav)TZbPU$xb8$TV+l<= zL)Z1ZJ<2##Z~kSsJjWKAU{wJo7pp3}Zc46nXB|y>#<6I^4ZG_`c(%i6h7#U&=|S=! zC8o#?>L-EU?HW^N#vot4@`2eC#CHobzSu4pSpV8t&3y(1FMGdRzJT9K{IQ$(%Wt@C zIXA<)&E+A4mwQxW<$Aa`yfMC7On03x7H4K9fv3Y_?k`{^wJsZ2^~Uc0#+%bO+kaDk zj&35f1wWooMB;@o$L*HOrBW$xePNvY0~_t0PQT^{9rf6!MWn&)HGA=eYrxge26&MOa}DP>(N-_9G?ZF$LTi#-@qKHk+_Q#?KmXaitlrbh z>O$Sr@0m<}pwK8 zKG*->;i>z_nD75jzcm^u|NmOKT>awz|7-kA`~R02?fybB0K1cqB&Z*CE=Rrb_@)Pm zGR&Q|V=l2vh>zo0Q-}_Z;eX}b4_`-vxN|wY&S!@WyhN;drL;)cz$$vpnhh9*-*GsB zyLaJAt)z>tEtRXpS*%s6Yt?cxtRUQ!>b3pe;G^gn;ko}6O_BcggA|YqK5BOh8slu7 z{W)5k=Ht8iCrv3|EfB%L(E{qxT3+QtR#z=UkJ|CQVGTRufJ6J9L{XUxHi$QP{MWKlqV6bizBWYJ* zW&<4yoxe_q-r|(|?f%t}#9XLMhv&}Kg4f%-V*L!kSC57-gx%rb*;u{GNRnie)7@}F z3!~TX!jCYA-oW@k4_PJF9a0Bhg>Tz~JKh-hib|?_A?U~g8eX+;dsmaIP>K`;Gz-=> zuy`o;tq4IG@OQgycgCSBW*}|8lKAs=>IcRP)OnBF7X;WJNIuF{@&!)Os`Xz;j`|P} z&s*R%P6`^Ekh`ttZIJ^>>06Mrl{GDT@Hgt=Z`&tGm|Bw>3c>ndNZUh)caAkhgU;QW zIo73b5!|iH5Xct|2=e8VP4&nWa z#;&FTyDM^~1GK4lZAkF{)EiFXWD`V&xHjoJ6`XvxH}F$K5;`w=CgyzV%|L=pOEW_>vxyLYA1 z@sJKEz8*@ZSRQ7eQ{^PGlC-^-ff0hEeY0onSd6oKbZz82Te2>vamw%2Gru1#WRrZ>l1Xxu}p;8 z|IzkQHF~#wsQ3eapRFy%hxBW!UMt$r1Di-fk_g+|a&0IP4JO)5d+&ix4M+43Vo$tp zU{mdO1#;4pDF}toHJGc(P}mup#n5O1LNvI}nrOlqbunPDGeVqb@7=&>VjGbFz2s~& z=2WC%;MIK9z95pRm_v5P&X4-LvTNW|Un7Nh98PqY#$I)23UAE0v8z!t2TCdKiP?VY=QIH^b4# zm=iLX-7Z%=4&*nwa27MJ=_#Zk7CSFdk#u!(dTDT!5|T+bEhl%3pB33Z-JxrgA0p1+ z88G9BcIz4UM?>|BQBnLGP${YXQHd4uCXYGeGW3J(fz%KZAYz*kkZo*$hk5BDam3is zbFdWlVpIF!s0$?g1Uad**yS%oP4~b|!X|<8J$6f|YR;XKo zJ^?RqDASlraRk2x?(A&RGZd4W2!I>xUJUo5TiFX_cXv);?3mE*8rB326zy}Y5YGT) zr>52glevcxD}Pg^k#a~lPi*O!m?nh9s7BeYC4{T5ME65+^X~cV!uz%bmdH z24WHTMxff8NSW6`gx3HScURN}lT`%)4dW8;nz6e`-FzO9Q z2GqUcOx*R&P&_rvO_dBwL!_6olt>d@3F6MRNfZ_8eFhreLp5% zlQ7t9a^y{`;2FhriNuRYP^6uYY->A->P6D?C{f#EUOdXfRRr9i@JQ`PV_|TM@RNJO zSHvM7T-NJ8vr@W?bS*}0!_Vsy96<+otO>$cS$p#1{-MvVc6IXs71E}@_5^U9anEqd zHEGoF8p)*qnc-H++fd*yuw}G!T&j)P4Glk_U7@dXugqB3Ab6AVCgBX9JmJFd2J{m1 z$qU#O>;YR?AHiFQwr*C9(A88u&L>a)w(b4C8$6j=DYTya^XC-~y_H(?vkQl=WEKwH zPX77OI-)WXU9;1T-Bxq&-N7mCj3}RjC+ki+;M0WbX1mWDDplYFq1%LYX-3p$MI(-F z=pjWC@;*+k1qy~Ej5CvEEdVB5--I@TC;e^@ha~=p;y87Tez)n>{Q8F%<&*Ft%AyTP zXrzv=ubw=C`2075tta$m<>bSQD*abGnLWxb$!65Fo*V>#Is@u;9G1#;oCb}tLjSGO zIMHw_gF_R#cJS5An4%=$J)*G@1 z4=BOq#G_ufQBeg%h+pb5XpEw?qKr7@_!4DXW-E1|waHTE)Dy}a&4eJ1-0ye8sUMUVL=8tYVO15Ywjhl~ zkapXWOpP@&3`J3w_`2p%^C01#V5XVwS=~bJn?OC)Y&*LdN}WD3n}0+LyBrM%M1a*X z*sI66_SnO@l9IVi;(ATl&)uUlZ1UTqv$e2P=Kqz#4=6usDzn0o`BnJlM7tmy$dmmm zUV9^FqI^iAp6JpNtI0S{4envXIPNJPy(Wh7*zyak&xIFE3?Y_vrDc{bP$fvqmfon7 z8FNvIafrcq&q{@hNgK>UB+L~xL;``;k`>)|xXh2$+Z4ke*kvbTCuVvjSjQZ;h9g?A z@8->X=JhCI!8Ps)w|*6ki-Boxyk$B*rJCXKlW=G;9auP%s(I5HI-7g%StA9PDt+nA zn(m>E&10oDrE}xnLr+e( z_xEMqi3h%Km8lu1bS03OZO6ajrhDn@fy}3L)K>Q5!f(YOvP~ z1G-K?Um~hCob-_x7PzKb3d3AQszS#S39D8Cb90K}hE>qh3pF^?RZ!5a-+^L;^9Ivh zDwzr&DC?})i#5pTGLFWCGZX5kfwmV9!D5!(B3Ng`g-ApxgN5Kt#)7%-a00CQCNHXI zD~oydiv)c$`J~btTa!}WABa|*%-MfaJ3)20rYUpo*1LQ6T5jVhn#`qJTt(XB>w2FgMlJl8{fLwvV@e$@ass+-VI{kwbu zEr9SH-wa>VTW`FbQeWPLNSXl#C&+Cj;u{|j-yl(crv%un^C%}NoFTc%M%5GH4Q|?E zKJd;2SF^wz`5j04Sko}W4$sB*DH=T<%083qAY|RZZDP9Hp+^eu+&>M`@ zkIkR*#$AcB!^j4#V7GcBk*;D1ZO38j*?Jl%QQbW1%zVgLOCq;)N!(Dpm6MG!E0b1I zjjCCV=&D$~qzjjwsz-UStCs*}TGL3wn0!4eEpGH1`L!5szIgTOY58e^C>s4zdYYV8 zJ!@Jk$+>42qkWkymdkP)Nb~D=TSq&8Ye^$u+26v%sK_d|*h?&bqPi6O9CTuR-)`gS z6OF?OT@ro)Dj!#t+SrD#tPG-d9y3r;!ts!{%Sa0r;hrOnH={09ONwnzt!UQXoKU;k zcewHZG~+DDhi%Cc;g!qQ0MK|y0>veB>VS-!5hNe36mT{ijjjKHL(WsGX>N2 zd9Tkb6LbsCg90aGf=optb6XZIR^`NHfAWvE-C;8>+(VwkXQR#&Q?3={4lh=%PD+6d z!Lm1=j=Ie@V0t?O4VKZMup40te7f>X>LXuABQ~rO)cf$lRmcp0`}PluYXfMTlWQW@ z;t4RrlfUiixP&gA*h#F~uebHdOaE)uP%&Eq1rMyS@|ZR^ss0qJo~ODCP-YEi@1WOR zlkPtEpr8EQgElcJgE&gpdS=uwrEaA}Xq(CO4LJQvPG3o9S$d)>Pk&>pp9?HCDeCK( zuHN~*uu{)}m4;RLvVOE))6-3QSxg-a^^29%EC2{5V;svS*;()w+56sU!_s#aN!zGf z#1i76gB!+Z>Tk{!n9+v)YoLE=D}uFp%x*8Hoq#10W$ti}FdyEu?}`}!{nAx1H~cQ@ zy$T})b!w;c#DSiHV&zdvG}wqpF^mmh)EKYQ<~z0ctzINKZ=>k6P%kIV-h50ItfP@N zntG-oq}u%riK+8J6JH}WXGWfR+7UXrj>3=lga$UDb&GBIhB=gT+3ueg!tO*&oTK&t zW^}^&^b1|5tDd-kCXBRr#gI$kilFapj|~4zgBdr;c6`OIp}#(98{KZw-f`W*WGvj` zh>KlLqct!hgmmOCsiP5*%JWIzZW~>w?x=Tm28DyhJMs;!8yxHa-g8|sGM^!`X^NIW za!J}2XYwu{-eQ~?kDnw^m+J}@F^AW8mfo>Iqo%{Ne%FbxPuvy}(sMUNyy%=c(cW>n zYi1lGhO7&1%W(F-raXIiZ!JThCYG(2PQ-1XpZKGL^|*J-x3{3E_hKl|fOko*64fa7 z8xMyA3D<=aL*9~;Cpv+W8)oH1bUS}D3;?WJSoBR~?uMGXy~$r{isWvuYkFKG6s_tD z=F;6!D!wN4t6;=oxQ1s191WuwsJTs8x#N=7Ro>XupJ3kB9JN9Na0+ zFa(J(H`|#AUyFH4h&cl){q_C@3__M&&?C-p(F9BHaTaAXWqvSb{ebG}M8qwdQHW)* zV7Rl#Z_echpLjfixjl0EL>E^w#tNs#;Nt{qV3@!pEcu<;TCk~(%2^%NjGl#I1RXCd7@`f z`B{wl{Rfc~uEGd-A^>sRq1fK>73euO)j+FkhaS-^Y!@b&v(LkJdVpz^Rxw<Y=69ieb_O^N1UlMLm*V$Czf?L^<(Y*$Axhn1tY~X(UwfIXT0^h_96|1$)O{ zkz=ozW1nXF(?B7&kv|zas-J&DEAs)vyGuTjvS*t(eeY^j=UlDY^wp{gEY)XTt;W>V z+Sq#H-A4Zes^&7fEv}|+7Pgqxd{2bCc-%>i^;iAsIBb$8`_9 zfQL(tSF!xYjN5845yZChQ51Q}BW~b+4x^d7qzN&RrM%c|d)?O(oS47}c*sg*gvG-- zQ*~2)+qqmLdnsZY*qs0?&u7q3Vr6foh9}}*oP(w3G3crBgj+TUQF56X5jzu9svf(@ z8Y*_Fy%2SR9Jv8ry(32XlN>56FY!iYDEC;b4O5Ik5_?Ct*R(6K$F#Ck;l#4CK__YW zYxsATC=COdy)68Wd*#O`_P&+veFKd77cSXD>bfyNm45+%N`ZgHz|_xyeji9T4KO_( zkS5hbj|!wIqFH+&kk&sRNE6D$2Lfp&$!1Kc9@7w9&g4e!17Qcl6$`^J9{|EBNV8=5 z(Ln9By;hF_Yrhx@pTe}|Ul!9=9tgzMN5QnU&%m@k5Z8U^Y-9j&B@5OUM#I&|0O8d~ z2jP{+2jO3WXiVYZ#|GibZwA8Nq8<#wl?Q@w^>aWNc-Y7-CM}IqB{RF7sVZib`M5XI z>O8I(Ao7~R&HvOZ-PewJ0#+QZhq!3&T zi^ZbVbrAbMkX-F(Nm~|^P_ftk*c@~Zqj4{p$`5uo_!R7Hp6)f@hRSy&BPT zt&D{osU$Ny!vV`T)Tx8o)B-BWCROpZ@{;ErVGHcO&=1@N$Co3>WdXePxCH@>+M-$W z1gi<%nP=~x1?%Z}c|50~pTWIZK+-xsv*7qaf)6V=@334sVUNIgjV>-dfHmoC%rjR^ z&A-17)@LOyU?)OxfwneY<6vYxty$YV7zaUe!AVETbuVFpxEvAuCQTcH**3ZGvhJv= zS_pUhO|1RZ^UI4xVU4f%-yJ*Ui}>VO1BRw{B;>U28EVNS0Qx?mz5x7k;x8wmXtA<7^TeQ#Vv~jPuY0 zz7}{Z2b9h@n@As#v%9>d9DE#-B|@|YNpQxwr?!o*L44`g}vAU7-vhd zA%}eK&@TvIGV2Kso75VbWZ=xic@BH*==bV_0YUGi83c`1*m{7O z+~jGeLFe#i21>bzF`4J^8n~-^R92%Cja|oCbp%474P@Qdo}3KSfnmmv)m;wMEpfVm zqQB0yyNRXS^Nwp!H`~jTg4(!4#5C$m#_+U-5zE+rItm;-+dbQX@j*33I<%;)8^NkQ zC3?XEjBP+S5rn*L*iC#VW_SEqW<&;W6s5B@Pp+InR&ZvBNQ~O)UgLu z!=oiV+i?WxI>pY3GVaeh@G{0`VdaX4XL7(qyjSK9qK>Xn{SWn3_ zz&(48@<~1o98aZGYAltiOQpt|iLN*IhiC=@Pt9=SVX`!|tZ-v#1EEX^NRN^J0_F`j zK}?#X9K4CL4>s_gOjy2$Wj($mkV&|J#UFdu7^*1?cQ?lidGRY#Lus%MFh<9C`5K{- zI1u)RQ4y76)#yGXd#AapLwKT7Ub*hb3=iT&z1Gv$JI8|G2jh~sQz7V6&Cka_0yM;1 zA0-;_%v$@W%fjAP@}Ya+FX4|D{6$s4WTYAIk9L zE+cTHQb`g*(~b8+4Q*G@7OAo;)%zHfN)4>2T=u_80`xqNRlx_~mILMjRJHs0dl=hF zU3wcuNZZ1kEzm~x9IE!MhP7B?Q#uQ=Q=-e zOJBKf>GhL)mfA2&ow-a2KhKN{1}XAkm@xhF?RnPVzl@(k<#>?Qxo_Kd0cJDKu~soI^io-uXtjH%7^jHyp~##Fcb zJ@&VJm(Hnrtd)GiFc$Kcc3IRB9RPspIGIvCv|o2CANC zsxOM$3_GdV2+d9taYBeNl};^qVqD)=KId|0*j8s>%F6VmT#-vjtSBTv4G427b8OPB z$=KQBEY+HIk!w>Id23@9JgiK^1F<@4aI5>hA{S7d&4jTFln|#z)&xM5Vnwf=sHUs& z{Gv&Cjm!fF<6oSU#T;}^=E8D1)x zs#g5fybu8krdGL<@^en*X-g!H_7pOgDpHyioO4RJamEw^OO!m+H``Xs#DA8pxa_>v z9?4eR+HzO!i@U>T*@`Pq{y_c?Ch+X@{2l7E+&t&PaN4sr3DcEFhw05<0H*(s`9J(@ znEv?=5Ef+W8DLzu0B)Pz?>*`NSdeb4c^y0ir0tzsJxQ>&Y51-^I()zWg0uhVI6Do` zjV$cFFj`*uTo``h!|;4Gz53{2yz&K2|IyKO8jM#S4#q1G&Rvv?&4;fmgjClXi&STo zC>ct>q^i&EkBL|@4}J@M=JBPMa$l1GBHf6eB&6M!g0)23;ztG`#HUcH*HYQsuS~J}uCU!*6*a)TtS6HBTMW?|Gf08KTGa0PA(Xd+zurf>Acfgr)W1ryy8f z4&N#6aGULv)C3~XAWUdp$X+hTwH8ctf8?u;Q71Q%?Y@dH3ZeW?zwSl@Y&{eP@~lTQ znD~2(IrGk9V|#c&hY^0GFU!HuilnipkSjMnAbT6H{J+uqL+|8-euLf)57)&GAuFW^ zSSxB370(#>0kT0-zqj@zko_;+mP#Dc$7+w&vanSWXvNP{(a<&(QCH|oMQ+L` zFS{&?KHiS9eDXGJHr(`hJInIP8@$P%W#0Hr`Q!sBJ22bg2UYnLBMX04C8L^ra+g(i zPE{UyOFnrrRsP)KNmk{PC%@&+smhDol22ZCl|Q$5JF4=@+qC7*X^XeBDxbW;Tl`t& zjo*?_K9H(ArwTu4$tO3d@Mnu(t;i>L*>dO9;-M?@$&+dEXN4!(l24v|#hp`&7g>={ zF)#3Eg}0+6pS(>KcTN>awjrOq!4>{&@y1u=lMkfj&Z)@{8uH0an*7<|SDW(5T{he~ zHF)TzeDY)({MqD5Hsq5h-*o5H;6*m&lb7A#&n9n2Lq2(%n(myMyqyjC1QT0VL5EAE_L^CDN| zQ&ftgk>TxlEuXwiEAE_DcspOqCvWfyf4=68Uy)Bfkk{^<>ipoPd~%aIf4<~b>+&fM z9`2l8^3Zkp+YOh@*?Z<$;*DppLO1jm-5NmRCni8=k0tcpS;0! z{(Q+BUzbllkeBY9R{23qKDo&%f7bZbRr%yDYwnzCJoKu3@?>iKxyqBQ$tO>K)tytM z-BWO8;ld^0*tTukPCB+b9XsjRw#|-h+qP}nw)0I+otc`y=5{Xk?XKEy)vkA~^+aQ~ z{k-){9N+4Dm&L=x7K^2<1sYp3IRW=TjkktlC5EEEMU;Ih^EUtv!JIz;9cf2Kj^WSu zo1eWzW%(uF8g*K|^Bw?=;KI|+k+E;y`%M|o_3L?4+4r?&CTDAR+aQc~jK^K;3PI5A z;Oo!UlZhwOX!UpZI5YH9a79na@x5owC&S6TMAf@4HNW(d>(#N$(u+jJyG_8|hf)Ur zg>6Og?8Mob{KM_z>DQe7#nqg}!zq3LV-q`^052Ht?DY3Yr1UNO{JV+IA1@`AUj`VA zOtvI{%rKKqMDCNhgAdV_6(zg1D(@A_v%QGvQgDVKeAH3&q%7ZeYL`E4wUr2(=ztO4 zW|y_ZE7dXkI^C*?l|;2c7a4Fq%A?ri=6>&3!0~-^6N) z-y9j5JgWcqnbGTz#UomRzChzoqZ7f%I>12Yq=?n?LWp!gxROO${PGZ$Hl&TzC{dB~JE9>07O$mb)-mnhGp6+<;aK zG-NHNUd|OX@A!`K%3l$I0(Z#H(+#u=bmG)NR7Hc>6^U}e72$M9B3r_4S^wtFl|_Vw zSBhi)DZ+bK4;6?B-dA%?D}YooIhEOZf^~c{m4-Fl{G^+OwHZ#R{$)IW$ka!s_fmT# z-d&KD6z^{`i<2?&SnHKfradWaaWUT3AlPkA)hOne7?B$Oz=hU6u;EI)I#hIlJlDm@ z@Z0pbKSi|SQcw>Np^1?m@}G+SD7H>drO{EM`CFNMa~QcRVRTb-&g7%ngA*(XnQc^` zoqq)1#)f7(ZuBpCKzyjdu@YU=5>h;D1n?cG=11O13^YUKG~sV(Y+dO!xz9w!V65;f zdb3mq4;=P{BwUrtOa9xr@YE!3@T$NNN&b_iNE1ik*G_Gd14Rk&%mkS{?GC{k>MD)- ze9jGN>UJCJ;e<9<_19?=rmepL{ckDsQeM{6YV`8|a8SD3|Wd2kKZ;DiBW%|jm_&3C8KaRnf^jkfw_b3NE3Tg(|e zbI%Jj@F@(t>7kT~6Q&4jbo(%4o=Y|^fYK-!g%0Y@S|`%?L_xQtvwsbnn$6H!(YY`; z*dA9V<@3;Wxomf+WfZ2}$sWzU|F#Ii$pW_6+wb z@U>A=k+tjA7UkWf;d8y-B`vkXW_y2!NV9d)do83W=w0+U5lp+-Z9Zp+T`DMPzgxYK z+GL~f!*wf^;=+5))GLB}vOGaVqmGBU8~Ow_l`HZ;bz^Zaa5qd21>J#?qf z7A%>6wQ)X00uH$4$X0ut@~U1?);~9www>g(p07d1Z#~-Sz1&HV&e3<>f;_pCDboIN z-E8@0adm3`tFut>eg@UGGuub4?_@UC3C=O_ce8aGD4fP?L?SV>oPM&!cYH}v?n4{6 zCgCrLS_{zTrHiZI4UQo$tFKTji&JzrtKo?f4sQCa`8`Rzzw7A(J+MhBw&*TpnbXbuPG)2 zX3TroZ6i2>8PF{tS!uBeZHBEtj@>*t+%Ik`aOqF?4Mdb%u|2Lug>5bzItQk)F?oOT z@m{w4BK8Ps;ZNp|jlj38t_b-!a6Ol>X_z+*`vfQI<)!!_dIiKN7letTU)Fluf2aJ*1f*8Kjww|B9~*g3vnTCk;o-lL+`(M zM)l>jS=rgZNpob+lGU8@km5rv{#b-HH^V62_$^xKGevUlxU8iD;n(2Pu)=J=#cd%@ z0)_&_?X70@>tVYTx6n=uL=(YTFMFdv}5Hzo2((BJjCHk6O~!S!b$c0Z+E60tI} zkwp#DLdQzC_U)78C=LgaDpVElb`+;;slk4+*;fuHiX98;@J zUw)26)2)x%BRyiR5%wEPws#iiobeBpzHRj@IgPOQktnwb@HmZHqEeMP1aTRkNK<}L z-_fO+Dro{ieK|6DVe1)$7{U#=#=!4MYBtqu8aAgLC3T&$(BuyVySl^y#s-A~haC&m z2897;h=1F`HpSuRB2R_-{5qoM?QW{&nn?I7{op>jJcDngN8Xj8;(QI=3P)sKLFWPj zNRtfLi6pYH7%#-RZ@;8Jk^pW+-cb(+mGc5Uk^KTqBlMRlJvFro2i^Swv@ht-zrQB? z1sHFtE>zy5+6AOsWrz-gFW#Ams}Fv5vON5IL-y97wTb9|8idR1yP(H_y+ z8skfrM*!%Hp22_xLBPlXK=9-<)V^fl8j}$d-^k}XRJm*2yzpL7RsD1>#FreH6f)WtV8S zO64;-(U;4;K~t8^REb0w6ngw7LJ3Rfbd$@dZ^^la&>40yMpX7-bq(Zk0@=qOfx*v$ zN$)TWUL8G#WLkTxPKrRElA92jODc}Cddl3OTSmxF{3$KV!rTa37-j^I||k+IYLRZ+&(NB z2DqRu6w!uixsKg7u1D4su-&$x7s)#q8_z@}Ngl&y{stggB-S-#XaA%%e75M|NH`PF zABYaD+e|<-!=P<5Qg3@*4k<93YeKY*q{N4`$y=rFqkyPnO;g%iBDhA~)$-O`6Sj%t ztOgpwe(VRfYD0T-biqa9-oja*8+Ov_ssNC(8ho&Jr#T82oM^Hms; z=9QysBcKct9E;LMJlx)T1ueOtyOst=DdG#VH zu}rxRSHP&HA)TDH-~Cw_p(v}t=~1jv(~y^cA1zi1Wl|ZyMqVp+d$k1HksBc@U+;u2 zQ4QEv@*3|xTuM~nVs5JAbB7yB?NBm>SNVK!bs8t4mzY+f#kGt3^3iNFs}=^}c^03+ ziHC)Vv($L+OwghqbkXXh>iV8((xu8YKU9wY=!sa5#OtmpVfR^g(Nw7} zg%rIx&YnhO7|h10_*S>38f@>~R#OrhpakIPa(&S`;!8sN2CQRdg;V~NOf6FfyeZf1 zr=>+CP>vYNtobcmEo5~?Z@Fev$uTm@KeqsrN|}qB9*mioNYY_TF+(*jL^^=|vf~8v zvE9MPcSMJyP}yTUdkSD-En`aH3(gRcSTJ6ubr1ROnP*-w9yexps3T4A=*vg)6R&W# zYXvMblt*_ngbXkcQ zALb&X?PEVRY?3U`K7Gl6eBuE<(K$vnx3QTOuivTV)Z1;S#S+X}d#CbS(U&{wlh9mk z(tLjPTmOPo9pRZ3PZ9-OC*QUT6%4bgiSCfI5PVi`2ts)!^4cmMW!yUD5II~CxWN}b zdcbO~0ni}H`#h84Tzwp$*a>Mx++=CN0u%zQXRxebxrSkIj_SpWaE=4hgYV{fjCm7N zfmtL!qrD2O8!|koNL9KH4U%=$Whn4gn2(ps}m6y&CvoU?p{5t-QSLni@Ep;Xcetueg9ZK zvOfC4n)-HO0#?q09v0qv-p4UNf1>DxPrg}5h{8p$oRnzh&9aoR*e}wG)imV`tmn}c z^i&!PFHuciKQboSTE1l24RfWC0+|H6LP2Dm>tvKbUkHeVRVRK5!x*;Gii_}*17zWk z7rw)aT2&}Dl|F^#w&C=*wkACr@f;Xp>#JXE9Ja@BjmM5h>k}!BR8ytNn86PYnhfX{ zN~B)GAdXpLnjBOMYw|ZMIR7Y3O{qyk2)8;kzPnX}snB^6=@ z_QxCzIBd_ZtwHToxZ!if^*N~F$g#uAmEZDAKnHVA&5gP9kh*$|)F>-^IP?0T&x+;y z2!ER8cAxxp=u}BaQb6eFfn^AzN5>d!0>M^bF%NGP>y-u7g^)tBZC{Ypfv43f-N_(S z%J|L{&lTVd_!|K8e(!>RkcyI*We&!WR1J@&dxg7y{hQM`WDZynis2&2Lg~Vke5Y`F z+h@S!6T=Vqe2RDI=@B~RK72t$LZ(HfYE!FAn3aS0g15n!#d_tiq}O|0M{;{0M_*_i zH^4_ALOJ1StS4Uio4jW&bf!vg=TD=o>;lN$(}eW z0&^(W-Rr03m`4%)sov02wH$tS8m*E~pKwbt7RVj5O{5Q?n3Ec*RQjyq7JPe?{niUw z1RqJA0i^5^BrF4xaE};20X26A4*>Cp+cXfNwnkOmFHR&NW8D7XiHPcoPE{@FiKnLd zaV=|mL?D%~TwLdOYbtUm3v0T!_e_@@7k3AHZ0TGYWgb*Dx${s4=q>pQ0Q64t<67kxFPzng1=ebiscQPU$>mREG;)`A7A z54d^=J%x9%=AczDZ{zQ2dw=WHq&oqzNU0YhKd;bN`gk*2XHUi)+O zBblh)^=LXQNeD|m3m6SiGv$TRTp^EjIw3|u6f3{3VhNX7X61^nKzRf4 ztX8cj@0N?jQPM8-AwDIN=WjG6NBikY#Bbz})0>5|z9{FfA`l0p@x4$PuMT=8R6MFt ziAb~7gUV;zZvHvOv}^i+XEyz2df>OwA-adA6F-{sSU$Pg>cKUgb2D8?34ZKvcXnAi zA_R9wQ0Jejgq-MwjMc&aI*JUuF{i)yfn|eQ-A>Znd#zc6+XNoSTa#&Am1g1RBq&Ey3K#nXDewQw2d@%yLZ(=T{vpT&!Y!LaD#x!{p z)l3E{k7*_0@#OyJ$$OjR65+_S>ef9K%ktRVzvA}5(B&t3;#icJekqE1F4wF>^#_#Wu0=VHI6~YP}F39EG=uk)7g$r(37K_v~W5D$Djq`qS&T^H&1{v6wdKygV{KdaKhIa~J-cpAs8aO|TGHU4RjT$k zL%;k~hY9jY*F?g*KidAB(i>fwZNWMMj=t73aAy74;6p@>w}amBZkki|%X5~n^epFgc-E1aunH1-SpTqoU84ZKE##8gVWm(AU?Ty|SV+nwaM1N() zV9gG2wC`bjaE$$~*`{iH&9N+tc&(AH`u+uY`TOZrv+iJYQLP%lEuh|qxN$Qu^>rJn z-nwFG9Wt^}RiNJ5fIZ_lxi9UJzsuqf4P}qwWY3Qi6PlIh7E<@Z6skE;JR%~~L5QfP zPi{{ex2TPmGkG>Ii58JnktW@j2+VvLR2Eu^?0-^TT5W_f0#O+*%HAXdR+0L1fwcIj zUVCQdaWZ;IxxLH+dS`q5E}R&@Ot%k?1HX&pj$y(xi{7dgjAED@@Nvt76YXg@j=YEP zK>B7mF*?2o#H#O&h36zy-VtKkPzXeFc3qwuAxgQhc5aV@h~(Fq)pVds$!@&yx^oo8 z4~~Htj$nyM5vO9|Oj==q<@X^c%RciC{%HHI#e!@4w*}{lAl^P~?y6gtZxR(A+JB>V*Y7z-Dc1g4XAKFy)9(ew~R zYIpt@f)hK(Jg7S~|A_G7*2dyW6SXC)ECjx@$fGGrYg%D$=wD8KRQ8Dy?#{C4;TY*? zy`J70C3&2u3=ycmZjhi1Rbm;mmO*=Ig^bPu?gyog+^1iNw7ZJ=2~T|}G{PxWob@uT z*9wNV@Y*wpdfJI@Kn)meBEy_HjAV`LJTkwJDZfc}8QqZ95v`1w5W}Y&@wc`C{w6-|04GNe#8?fZ+wt@KiJxy_U-;lf0&dWj8PO5>Dw)x~b5nWG=D;|rER$h_Yi?f4r4H{g^i<_A>7*=;a*VE`+c z39&m>Ut1JbRB+@>RIftsivgORi*ru#W89h$OOtUXySFc#Uhl2ShCxaH531;W`5#mf z%cC|n$3ylu?%3*)`LZEAqT=F=p`QggwUxPPvEy06;;;n#XBCreKt2{$=Oq+Vv`l=6 zS>25mM`y11I?Q{E>Z!)R3zEjn*0J~f55@O_=AFv1U`xMIhXea@uv|w^Z}g4k z9AGObNOEk=DkEA7}(h7fX-Co5oUz_KH&e*&}BA4!rEFt*2fWgQQm& z{)R29UQAR36;K8|VBCUQQhx?89nakdSA*3-22z~QN_%I1a-qb3XL{{{`P0^39H~B69&L|V93+L zB@(5nw)#x}FROSfe~K4?yQDZ<;u`s*D#}g6EFtl^7uxX8>8>Mt_+L>N8tE4Nl#93w zu4%F}=?yF&_l5p$LU4G}={XQ{=hz*g z6JQd5WW|RVDGyh36+4gvmL+66r5y47Oge_#kvlRP9ICnh(u!Y7ixdgt@rQT`u@8-^ z%}9mVazo&gy+&o6q)f*SN=FH|pUFL~dw-#Z>#!QxW?hc8YkOm=1Zi0f*IHd&G3ubLkyHfr+Ay8O`awx6|T9GsIAnZIF@$UR62YK}*%q7}r2Wl0 z*ZGwR+TF|%3nB04`LE{J>FD-u*;PLn9H*cWTL%tjjZ0}f%q}WsN4nVKGqMo$|1cJj znl?5C3w1Hu0vf9Ed)?h2c5Wnf=zf$%<1O5jgQmaXEB&sYi&fR#T4iI;-%OcdACp9z zgwNmdr<^ZcU;JFAAn2~3bI(Fh;FT@juWQ0B*?akf0JlH*i9`Bu$Q?s0aO{1>iiwjZS z!5ee(9K2NOk@tf-0fiD!L{sBHN^-XT3l8e-Q3{Vl{U$cYoZ$SHie1#B68IDe)Gp-(<+QgY7)7Kcl{3%|>=i>#7o zGX$zDO~$|VZfk4Vb!uw{{E^7K7_EJ{xjfimM$?}0*D*P9vIj@#*R$NE#X00P5$T(&{<|@#^k3X*bmE&=R2Wx_ z#QyFEML(QQJNymNGRz$Qk@Bm?cDbFSn==QtPHCgi3a~|fC5^zcWGs6|Mu43zBSEZ( zS)x4|M#%Mj9R7mGiR;hA5|@m+K}>b!U8Ip98{C1ugZS$>i6oZCT~MS#_EsH*K5W4T zS0X);jGQ|16BomjIdr)x&{dUC66a`mBdfAm3E#zSVPitKMy77M{ZWCrjnO_BHI(`em0Vkz!4&iy0^{Ft-=W}_K9`p zo~7)~E-^1!5)ymM-v+B>rl+@VW(Qj~4@`V+u5Puyi!>qPO9Yc^(~bfNwMHVJ?D9fV z5(z3ctnQtFr~nR@THKhyE8HpbP{$V7(7Wi8+8!)fO#@r8k0V>|Tn1VK!MDp|-fW*# zY5UjBA}%=8EcxNCZx)TBqmVpn&v8VB8bf!|rLU(UHLtB}v3r!R{9};f*&wry0)?T8 zK}m(Fg_6E|hxfC3pEdXME~ZPDf`&2hE`!ewSq^3i=saKbb9g5_cL-SY#f>M zNWq;c>@WY|Su0SCA{u=B;Uk-J+SJtoG^Lrk1)*f!4f66-}e z&n_Fd4{tTZlk^p*qaiW_+?sXj+$K8m&9jg;2LbM}~K&)3qjM$iJg0{~ohx%=Ws{o{CVd2kgJ`}dy3u?p2--k@6DrrFP7Z4Ixi z=6U|K^eZmGoK#=3w(zX_?ec~1BvaD?*f^!5{iLfXjX?$p8{2+=a4qG!aj`YZq~|#) zyU;$I2ra)w+-gP}vmu`A!5eK19v0VSvH5qsV0qv;TB9`UXh0fdopaFar#aL9<&nq` z0^03-=9qs%xK62h%T^NO7qtncJ8JhM<)T6QYF4U(f7wIRY_te47Dw0C zMD;5YDqmqidK=sa4}7|fhXyPfFkyr711+QLRL`bF>g|P1vpi*>DC=ICQ=E*#?>VLK z!V*qIX8ExxDqfGYp}LiaH7mY|1vAYl!2!#2B-*D-;`tBSro*H(N9A%fvgst?O5ay4eG zX8ajvPpYUFYb$U?lis5eiecgG)ARN|wL#+Pm?@@at`~)yI zN_n#}7XVV+TaUBr5vR6HLzFT;XvtU`M<1R> z%&FQ=5~z5l4gw{)CPz-aQ$xwF{*V9^qCUt%sXF zNC}65iabL{W23PZ(kp#qX1+dIz2{Il4|5*=Mkck^VR&t=9v+?lC*qWDp^vX2D?CmN zEoZr8*22*Jtm;(;^+cDU*h}Gw>oBy9?-{PD#&|K1@XXOlgH{Y^`yM!|ve}Iq<+;OF z&fD(=hH&ejS0 z7r16#%`4xrr6w?5K}~d*fcy6E(TGGAJRq0tMNUltw0hs0MJcTY@AgbBId+_oro@XU z!z1)*WYQ$QpaD_7tpFSI4oeT6r66)FLU$W{Tu1e)MGKA8!&Hq{9^wn2d^GWS^fl)& zGKi!j>wFWry)x#T;||`%0O^;uZtfPF;Rm~xW+$2w>MWwW(A1_TmsN)Ux}UFz6>Wk)M6$vZhY~AW zpjwCxHF^Es0DDHR@_M#=d6>U$-vs)_#SKlxjIhaDnEp5d1vI4FmiVGZW#TC>ZhnNF zHrmmel&d`0bh6xPQ!G4s51XDBRGZ${I`d_#sG7U>UFVLJ{kdu-vo(2xA_i;7@q!lj z+cmAFKC_<&*>yO?5C6|ZvkM(tV{ECN>oePO6CYO0rH6S6dF7m{EfUc!(xCJ?nJzsy zh&4cdo7az7f%b(<>*H`Y*SlBt*sEv3=PN?>AO7cE`<8&0nr~T8_W%?h^EF}bPkCw$ z#)HA>PT5yFeGa%qP?!Q4z9NuH|V$* zO|@P0*wd50qSr^@G(VNpU^t8mwwIg_)ZdKcTaIQ85T9Y}i2BTp#1kD@X>uJ-` zMC>Lqk}`Zxql(jZTRn|v0J<~-9*H5&V1Yb0brw{1lgZx-QP&r90H9oI}lh4T!w_&M!tZ; z=;1SBxeejc%Q5>_WQ=8Vs$*T+{m4x!t)N!5vp~+O0}O(T*_M)`x zAzYSuLTDV>LEdL)2!HM7ckHfK(gJWwH=HF#8F=y;D$n<{8-fzP!0J6nD%53-pds^F`w>h$X~FxK|XdvXEMIX-Eguo#r|5dkv6hD z&eZA1@`R1)$bBM;0yuD-6-~dJ*dUui!D(&oxx9w~%h7|uK6L~zl?iy>>;y(E)Qy)Y)v|-%8Q6Am$SMiY~4jiUI%$O}X zK;`;x!`RC}2lA>a6X#isn-ZBeqNA4{OU}5SHRJGz(mW#7lO!u|=c&!-g&yd%Pcse) zf&i^(5r;BXIKO%=(DpEkl+0m%ksLw9CEU7on56h6j|xpwJ0Rtc3M<~$H%CVLr4xdD z?m_}Vjsfj5VFOvsLP<7_`Cb*cgbCXl^O(PxVx=SDkl{WVRj-Zyt-rFB0+zrsLWIs` zupNg;>G(8vkF{8{s&@f@8Chpu8&FP3Yz)&%aU3hgk_nI?6Zl~M>l4sQ8yk4|F$8JW zQpk?Swvf?q$R=8SLA;fkflWlchp?9mqbiD5{`bN_YgR$xlX$7sxCYJCk z<{GqDm?V@q^(KzyIwB*(a^gA_m27%aEwR}=SA=xT4YoCNzPQ113LHu#^A&LnZ0C=)veb?p95{c9Tm0B6=Yh5J z4V1G-3MZAMC!qFBaI2BQ^Y_FF93h76{?Zaqv9q-^eASa8wFa%hLnpiu9iw7@Q~2zi zB`EMetK2A0W!R0lq7V~UJ1f(1vWP#I#I0#Qqzw9FQK&olO0mGxwFw7EkF zU^6I@`dE0e?qJSG^{|I(Z^@RK78KA;?>qOzoZxYFhf;eR-5{F0Ybg%26GCAS7l7xh zn}RsxV;1zaG=MR?<`D}s<7-KRc~K(Iu3aS(dW}*>VOiRhJh+wXA=FYSK~0E1aX#1x zDH|Zc03*11<3!<8jy8++8B~5*P5s+Z=2$by1NhkA<8FPT_-6UFw7|Q z)3Qn+k%tbt$8q$$+-&v!(ys7BCyfV>vWnTKrc)fWzgPM*F!&fS63&CjlA;|w_d%IX z@ycRLKlHH%2@34D0}f53NdxQ$Ya3L~BlCVDmYTj7QD$?f4ZpK%sZ0d}D-e!Y$)Qw@ zL7qQ^F3psWN+^-$RHGEjgnO8|fJL4{lWpIZqK}N-8p$B_lz|+cG2&P)pHT@&T+~J1 znc!^rQ}pk7T)rKeTWGtI+PRx4t~FfDA7h>}m}t&>T@LOsvmS)lURbym`#LAnN523v zLxiiOiHIknwR z3Q2fj5tv~jlNM*O15T6>_3?_B%S@XFd`T@n!4EhT3a?5f(O)S=vF|9XOhE|^-e+)8 z>b%TXyK`|z;{4F)eQyK{pSFU7|L$33+>m%_%w~V^Dtg=P?4^jX7PkT?SLpq~XvUSN zvfGQTdzY^3;~~w$Zx%$r;iKhLs%dypiRv=VoM|U0c231_(~QP}fH*~>H6>4N)f}gT z!v+A^ae~Y~b6Mr-AAlscrrYB2`2(Z3upg_S_$=Y#?V`NTexYeQ?brNoyp*PDvLt^@ z%PjN}@rsB`fLqrVzsF)BG9#bJF5Rc&?cYMWLKM{yX7FwC@#ak-j`MgPj!~i+RyTQA1a-6H`lfA{#Z_n~DSjBanpLetG-86;R4^!1 zm|)l6s~%Wit42Y|D*x%<2bFL83MW_UCqhY#TF!A_jg^{Y;8PZN7+u{ElmW}k_{cxp zr>qapnHNeVsXWoxMe!KN@dI(^;Z{L6XC6>rto%>2YIvV~vQ`1d@q*eIC*L&N7IeWGZdE80b|EmzZ!1d!(m0+4r z=+$9fV7|-*RcpoH#ldGYzXAGIk=Y9AlN&R8x!_0usfeajluaWM2>Sa~^P0_D^dJB{ z41+h7>@puU_J8y=1y4~0F|s&!yEp*uefjZ*V``RBojDNTX$V6}!QwH!Du|BQFgG<`m0 z*aEs=R_=ufY)>S~ugUp%eU*#&k|llX*BnUM7?!T}fMoN!wzy#lei$im1Uf6Tkta-{ z;qsIl&nsh0%RIW19K6w^khWd#bM&eX|E1p&?SPSc&q{QWXt~4O?6S?Y(GZP6f&8wU zrR-ltY<-+`8m3koEar1z!lBRn3R-HiUK;wr)Kh`;sWyIjYNYsoAqZSU>M*O}*C(&- zOr}kZPVNHBwJwsLe>GWE+*Z3L(7g7mMRN+uN}_5zi!7aa_t}mKq?tI6nPyzwx8=-( zn^RW=&i-0{N};`--<@#P6H2k-JL{dI76VHZxV*dUX!6$=kbS8I)?Ld zlKZ!9=1OhBd*OYV@pAYA+!tr00lvDwQW(8P%HIJ?Q&WwAp7y5>0D$xDt^OTQ6TmsB zp+iiwpQvRRZX8)O!(ZI2yrTM~kb;(&^fa0l0&0!qeg*RtbJCE9b+I;xun@gSb89&? z5XQIi9C(0?8!@8cUk1%%AZo75PrC4&-@BseN8g^^jFk=l%((ZfvBCft|F1^O^q#jGm_l?bXc|b z1Vu4&V)w88OK33p`p8-gxIaeRJGG&0D)svm2*SAqtM+Od`8so*mH7h%q`s<1k!m#Z zu5n11j)1{R(KO15mtR)zNipfslS++aKv3G;)3#EYqcBjC#%5?9+;bv12 ztmObVAL^ph;f2r<4Re@D@(`Xa8*Etk!ChA6SxF{@SX>DiMi-EaPLzRcPzG;Q>G1Lz z3LYbVk zRLx)Ph_%|B^g`#2MRSD9Tq|N}Hu{KaQ;7}s-3Xz?w360NFt%v}vPuS~mSZ1J5=D*h>cC>8KAqni*aFNPvj#v*=u(Ty`h0_Y@0r9qwyIe zObDDfYTlVsXSe9X1FQN7Wn<{y2D@Ja!<8008mZEWx)+IC;vji0Q}tO6aa;p!V@FDU zIdMwq-VY1?_3`U|ivDQbx6v;;-`Un(t=l=W7^jQ-%Bzt!O#`A*z@hKB%mqFkCqNc1 z31*N#35BI%e4v0Rc&TxG%J38&H*S=wOLE}ub>ZF1P-){vB|-3OA9j$kvJJC!NU#|} zH&?gfEO6hI58BER&9khql;Mo@`na5c7ARcCY9P_!7=|<({Ldy$JzSg><^CqQ&P?#( z0`gcKDw^*~g4U-}aqs=Y>V-)pWYS4mk&LB2ZHslR1q7(^Y-*@?+JKXNICnPmv6F!J z0-yNXs-2zGDT3|4&t@M^tfeN}c3p(GfJm}Bd)~XcC`Oq~bozas{x5G}OQ&I&bA4!A zSnqA|B&?FPSPz3eigv~j-;?pO?;Tw|r!yU-qSmnojR}D6v_pADvb3fUdY}(t%|R;F zdq?|H#qJGfr2gcl>MkaP>NQPKWf-dInv{#`*?h&gz#gT47f@$sCf9btAga5vRFj zM&Uq}6y~id?5a8B%9*BjZ3EYwYI=2sdxjOmv)To#0cjsEpU3t!pGPl%$4o@ zziqcsX7!Fnpu)O@C?IP{668(U!eZiKDv5KWsIGJc_Y!JZ&i-hXIKZ33_KLKkyBivx zv~2x7@75nd z9t0WQ&-77}^2)O-^(7%$@KKhPIL-%-{iVj35ipCUCP9Vui)(j0-*d$)TTN*>t;ZWY zc)cxA{MUQ*l9SQaFWiA>o`AB;KRs>Lw%yv#rYeif^lo48E4F;cPrfXEfa98-#T7W{Vf>we$_d$l|N}v%B_;bQpTL;{67AE$pIIn{pz__ z;OwrlvHmAz^BLhv_X4m{y;y1lw6wR~bpT#C-`ww_;Ndz9-ZKMlu`|7EdvDT#hGqh( zX{U1CwFgIvj|8G&7f2E&ZxwiE;8fVT7|c00d(!&hC4#C%?EsG}cXF<5{eIptG!%7@ zev4x|uLUhDw79nt1yG7FC?;Yq1Mmcv0jaJ7A~mC;m?zYfrFhxRWfIzn-;Ye6mC79& zJARMwAJ+UyPGw_GLJ>!gz~t(V(j;iiuDl7Fxm&lsP4B-`LpE^HpBil|H7*RC&05rV zsx$zkmqU91m{vtJ{L!ED5fQRL;T#7auHeSp`>`dfev_C!rd6WFwtea&d`UBEXM;CQ z{wvE}P2cj~)1$Atkx~DpB{jAGT-}|O&*Me!3?ibk)}qGM!Y6Rne&-vFZF(A_AT(Oe zB3zmW4vk+B(w>JfyjsAaW-j%~V09aD#NL((&&BM(;x~rra&8RMb+;Sn$d}#b$KX_~ z6t3D%mtu}%3lCXi@d2ZCo<@r83JIlaLz81D3M3mSgvePA6V zGDa_)=o@WVX$C0vV(4zzSRyW=tme1$C~>^@6?oew%j(i7D6$Pfend~iE@B5D1~~<2 z3$)n`cWM`wW8OwhsOL#%t(M$q@fEN&mMt@~=nI!_QnKkS@DE5zoO=TZNYCod1TDu` zUTrsT?^nE2f%?;Xn$6*Vx#S;5bs?@)FZ4_E?|lT~cH(j7i_hfdtIX&8mmwL9Q=b=t zw_X|S5B|7S;4Q{HhM4@?1J~?T*C!Ti2jhJU($trY8MZQep`!0Q9VqWMx>M47-pSt@ z1%Rb9U)-Wv&UEj>A&tMv25hUi(RnL~b7;mWZ z=N#OrIr88u2*N!68;EMMo%Ht=#4Dx^58m6JxoCQq!0yMI;S93o8m$7}66c|QCZ$*s z$TKNe;7W$EBuyKtW?*-GIw-(Ue8al*_TO&Qs#}NUZQRc|a|@DQ?zG$PFXROc-uzmw zNqi8$+wbr5nCqnAyVM5pkjR?Ys#QJ$R0IiXK*uUQ#DBl3P*=_h-UyzfIa+gnQ1U(N z`fcSX480#O6IRzWbld%E4WUUa3=YS}WXrrBPGh!~_W06CVYP39c2AB>YZy`=uSqX< zo&Q+zRp4GNAQg?Gmul&?lR_%=-zmUwA2MBT>aQ?J`MS(3jE%DEf9Dk&+77@5^V9^j zaBJK%hW$M~7?FBSvO;(GUE1KFKYT-z{e(7CD85Y&4?72U;C#^<Khh`Df>b2F@CWj}@P!?ja8h%oVwg9UGw)6tPpY zwMk4y*NVxhNmB&P0>-wny(zLr@}eZiZS(yZD?SFPo4ECp)clWHh9 zW#z)zcpMUM7(Nse*9ACwb~k=aPrdh6Vor8ESpvVxN4Q=kq?rXJ#m!6h?I$M4N3>d! z+8Xko97K?mqO#psDlf3M(&s`2g!CxLTlY0v0fgXeb zaP`;cZ_u=i9>_m7Lnfy81j?$vhS~}aLn8y?7SzD+tM@e!NByz&O-L_>w9#So3bcNV$tp2pD9#vo3#9-3>ddCk2sO79uZmA+qJovQ3n%Kj@#!>b5f4%ihoQpCm+paVdywSJOw?o1|D|rDg}4 zbD9pv9?%l2s^95Vi8>LY{tuxAS!UqV zg01ZROD%kR<^40XU+8f9<^i!r9^B`9vRKzkyJzm3j&JA}Y37zrCD=?1HiuezN^ zJ|mMkfZ3CQf+%Ug#$iD!cO|^jYJ+UL;=IDdDg|#U9(AlPB7HiDhSVxaLtKu4K&m2t z9o4QMMDZmhl-8`VXCw#T)x!f}8h^_76G*Bzki3jl4VS#l#cHr$P@ zdpB~)*=(%71RD!3!Hzd%dl4Plu|sxNicA|XSDx@@MrF^QP2CP&eF-*KUxE$q5^O9u zo6UMIh^oH9W3^iE+gLW1vG}SbsK(Ngg@VO%SXx#=VP`cIXhH9f>dfN`ADU{@(NW_+$e{rS2kB7e`PC;{IJstq_Yc8YyDXny^^o>SNvICF0fZ! zy);AM>=Xm_BE$&O2AmwyWn2d=Oyrrg{8d$J3r$+fM7sJ%XXItEPG088DGRI`;eSY| z5~>~zuDE+;q_uo8A#B{nVC%0OB3N?N{CtUn5N}p(?f2ntDB7Q?Gfm)T;|lHnK(|NRys;^r(}~QUQ{KoB)$| zvWZn~Jnm#u!szPjW#rW*H>SSYrutR#YU&W`-YYj2U9X;X9c(17S5}bp4j~2C#ETYF z*JZ+6T0G6(TVFigScSPpFkOPVMlekQZNr~s+lNS2d|PC-POW8UwUGQZvTNojU)rPG ztmdARzqifB=VZjew3|;w)m7pk^y}MhZ#oW7Pfjm7XN}_n6u?G6vvET*7!(_9*suP5 zzmfd2p8T_x{Ii<)lR=UAFRO=XzkQlNS1Oz?PRVj?S4+uiB(Y5sJpU`9e;5j-y7fXoFMG!fnyWiU{ zs`iTtzUW{k4t|fr?eeAr~$UuPGRMTz^1n`5%)Y;7x zUB~Fs=?J=QTp<%-o@0*R0Lgv&;c2kv5@9%FgFmNNKSl7m+-4ir&ha8Yb7TfBtXwXK z8~{3xqnK3EDt&--1|`e9{13t2qVx=obd|_<8=7Wf^=tq=YQv!@UUH*Jezb>d6OEmb z;61wZc_P!nLEAyHmJ0F8C_Xl7H5NhD-U7o;C1Mp}@e?kc(r2e)cNXo1M6VE-N5tw@ z95J5>`J-q=M_w3>!^wO&oKNCn9_L4yd$R%(Svd{yc7Q--$vKl~r}XuttvO+f!&>Qj zhTWc|NnOrkLL2rNA$$>$QW#t?q$a!>Ah745XcGna5F`UeG98lGi(^hfi-=ux&sE>! zPl>TvXDtF{9X@d`9-sdM7avuwXdbsTLqqT+WR|xemJeb>lHxNhg?D50JmPY?>>aRa zNcgV}WRhRxXs5BiMt9W^indKYjb2Zo87Jwp^S6e1Kb8*~ea$wj+M9=lpDCI~KlBA@q{?L=_jYX2eUggV@4=Nc(Ygcfe&k8pJN` z`3&RX0!RYpcUnwhs(E9>=xQbqK^YBUyQ_}QT}j>m{mP;v5>RUrAMZtUD{moM%A`Kn zt5qsn>y`R?WosA00^ISY6&|s%QFLdyKR0W;bX%0y?60HOG6zA%x5S`fCNob+QY#04 zGP9mA|!`55__6t3{7akVMJW!I*34iF695ZZr*& za}&rkygxA|16&UxBOq75|K6r^o;Hus?dIZj>x`2JNIa^9<6dt*MV$|gem(mO&_V*b zQQD2G+#;r1QHs>OlXlb0Rk*Je{d;Dm3)Sim4x8?t;g`h{ib+hlocaU2+eaJ<7{hhy zCdd;fL>eFoCLz6Yj%h+If0>%No}L)Di~Dt5&pE|f#T8(ReOX2t@T1H5W|2%?IpAEV z1WC#XLnnP40p_8^f7hx>5@n|G9zgaB0u3boyS9@5*6Qw_|0yis_7-ufiao%#0w@-c zsyi&MkgaNJj+sVMPagzh>vhQfXGDLKRi?2w_?J5~;Y$1)-BV)tF@7`E>Mq z&ylbASy}%jVW;@IcdY3DvAtQXr|ZAewl{vS|MFY>*!nMtbN*K-{!*>3S2q907JvCy ztmfh>ro?e{dxOhbloe?E-R9QP?LV={!PV?OiRpYaA@GcXoZG}ihPg4_s3Gp&q? z63l2BEb=2wfU2yj$!az;A)yRm6^q!6)KQJ4_(sGMBquy;ntN19J|Ti25}BcavCSf$ z_fTTuYL4nGS{6kgH?Fwk96E+LBR3W?gJOBcurvFNh_SH>R}e;N>nE}~iStW~4xj2uWp{rOEkVr+_JY`U;KB=kJysV@>7s+L3_*h`cGS9cp#XFT|#9Wf;%A&JT zuvX>f39h=FdXgQ#bza^c6Ev+%#d;vO9%l<+bU&DBt0PlU(Nqj~wV>EOh_V8v&=TS{ za6J3%{g_+UTQi^Zc19JMvDjmwMVBGE?`EC!Uh1XDw8jAvU57d-O#fI#hi2jrpqFON z5;m(XU&)j~J0Bm5v`))ein*fcBvd{NO!O0)~ArJ$J7w9IOPZEVg&t(>sNFg};U zhvcG-5!qOMbdx=ei$7;547Tllp%TZ_5yu{8UI?x7ldJ_C-i&x z_rKfk(Qla>wO+hAzWAx#I%|?*n1pE^FipZlw9NF9o`=0@PmPQU%2WWGKD%W=IY4cr z*C148F252=J|3AoPZLv<#G}?I^{$;|IN52Qou6XV%e=WdC~@H!Z)AAao zEQEFc7lnTWdtPY@A}iW}0Ui++Db=YhE{u(e;XPbg#uerj!ESsdvn9M{VyR3NePHpI z^Aq}bT^Dj_m*$^IBlk_S#Bz`ZMz*2@f|mR{kc;CXSL>0mKlXnyfVeQRLF?~cg_RN; zv54&K!|XPi5&LJ0s2cL-8^zBTi*<{?H^pTN*$^jOH^m`_WyeAJyfSGM3$GmXkhGcEy~i3GJ7P>LX_ zQPo@@O8fpW8hN8?$u}-wx*KU@tFQ9dQJaW5Fz$|ObvI0EI3Rb@r1WZVFHNjbN;{N( z8Qhmdx?X5y9-0in?AIf1qdj2z{VB~>DDnu^ak-+VR*ghoYr2f15M51C$aDG-ZiKh0 zQ5t^1QfkJ&3~tB~I5EG@cXlutkHz6AHC9<9K;Q$PIU{b@hM(RJ42+zrXx~B?^ivc~ z!s)%ydm&kJ3BWtAbP&8Mqv#$ECt{5`$O$p-;_T$@+e36e-; zON`+n<6MX@?K4O55!IWGQN|a?nVsuQRx<*?h)UmeC%UmXJC82LptWP=DI`r7=>nI| z%)F@Hi>$D|kyI#n)O}ifGU2M;DwFT#ZPPeH4t+Pf{jiux)X#(&We>bgkRsmvJgjbq zufol3FZ3iZqS9`#_mfe>V$&Ch5zybcXopd$I!`LJkv7@oo|sz7iX|-$1Q(ktG{alESaG+PC@g40~Ov6+A|e+58B3#M&{P(C*FM zIX^vZH#;3+1%&kypGnKnpZ*{I?6ZQ=IqqyoRZYkww0?%qpo*dPIg{(kk! zKV+7xxz1Yx6-=o=o(VPkWQKYw08nfDrABQemC?LtJsL%aPUPb`f|XvOV6#U^_Chwt zqmdMM_U1dtSQ%G^p{_I5Oo2A7n$H#{-W@hpxd0*JsAfi({@y zI6#l@Gv0D68l4DD(vXW6Ng(C5t%KOv@CI(=M(-;JOd-BoOd`TR{&BgBfShsmvW$62!U{D!10F6|lm1etjKDqr`{sqF z^znopaxpR>`yr;G|Aa5X*XM`t@tdWSOnMB9k-!Fiee<+_ASqHCOpeKN>W2i8Z$$lwlWlAp>bF&2LH(+U+Av5b`C95%E%FTM@aGiu(^1=xqJAVs zZB`8R+p780Z#4qhv)f&KN;U*zqxz^*sxJ>RcR<{DX-{Bt#R=4tC$RbTCs0qocF_sw zsGUch05RpwsyzW8nUYe#Kiif6RX<L-`nv>JD$ZIX-q2< z>8wK16SMPQ)0M{cq^XoEsjf7oa3}qti2eWI<}=?q`e8}unqcoqPV<^YeQONB#r(GM zjTf43xsw#qSg2Xnt0vs5g-`wgt#ZP>>f>Jio43hfcjhKAz>_?ETi!5#g%;_^H5Ca1SQSw83g zZ=e33+2`jQqbgmgZ_*Knu2#A!5PcRt`TD*Xdqvh=dvLqZNVpI6kdwX7SEkehAmgk0DVNCxhF44-^qQy_Wp zW&VSU+NjuVR4dPI;(9cFV#k7-(!3_`eI-RjzA~p;5h)P#+FjB;NV_>4}kH zY&!X)djZL#CMI%0NkSP^OD;IQ+9!^3E{(&G$u>VGRiSiZrw67)(F)g`C)rOx#_xRl z4x|5)&36{n>lTbAkQHcgr1FI`QWHkSOzeOuX#GT)Od_(;FTD1|FcbQ~#ubS9L83v4 zgi9j?ZUvacQm@k7QVjLWSm#xeOya03^Z3p~0E41=wI&7A@~U;qQ^chzmlaL7iCP{`RKFQc)WQXaS~Ya+*B)x77~`@-%`3od4t2p{Y}nH>hf%Fm zR@~#AFS^H%Kh(!w^!h*Qiq{t%XYE@ZXQr&99H-f6-k~lA56i~Mu6=$xnYvfHf_oBl zXN$}1CV2Bw$Yl!gCf}Khh&%S_jYWvK6IzZgh)8%?S#TV6!`Ht(pN{Tl({A|J@ny38 z9Oo`TQ6+&>44vAFF4RDO({Ax+tr{{PO{1ZNB>AB%c&a}gTwV?(&nvu{U&bFxtZF|= zR+}x^?h+jS6Lnd#7lB3JFBISPzLQUD$xllh=FGv$Eci3iwx3%QE?YyOZeO2;ri$hvx{fSWwzLv^W!vZ{_V#|IId^2~g z_*e=k#^27T!KA}?`H8*fa<|`_WlwiWP=UO{XBRc@@PiZ}Y2wn?)?C1Dp_0@>H6HK$}-J+X}Q_E0$!=wz}YKzqzoISK-?eU=`-M zK=-!3@sa2w-Md>70oYtWp5~Wjui67yQbyk#dh$SO=>y3x8C=U8DT<-utyb^-N;xBY zO0_S(fnO2ThI2gYowgKzr0CF`goQ8A;f%74~xd76eDc!1qe-%=1FF@*T57OZRP;X>FZOj8H zP;Wm;z&WprkR|ZHzK4)+SbM~Ed9v7`o!4MU(4+bsr{uL7|A*WIPmaxPN%ADgZ&S@j z5-?BNw4eM+Q})8HS%NYLvl3*AVyX&1U}Azdc7@GP~FDcLiWKpL`?0W?H!}#n_E+hq2$D0cU5=>lnKNuv^~> zV;#fD@9Vs?7?fX%qu-vvW@pdqO=eUtVp|Ga)H z-_o@9FVef^n{LUqS$XnAkav-O?m4y-;zDmI;WhWQCrMesmyxzJ2%YGUV$EIOa&L_8 zW`A4Xet+rBY$cxF{Hbn>CY8|JW;eDbK|NWM zfETk~O{Mr@vcJ?_hM$i5)@PC`muc6WN=r<4+tJl*Wg70-3AR#^4E1ESK%HPyCa@cI z&!>7KaTR>8lAu114A}asSJPUeK~HUYhaP>lp0mYTW>oFV`t*ETV*O9(`E!{_zxk%E ze^5fjwyvR#+;(TZ8!1j=+ASc1O7e(cEOxamg=6)jTVz~^!5(LWRLh(HhEV?=C$iZL z`ehx46uIgj!)pD@It@8=z+a1+4e6*A{f1ZoTCcqPhjty3rBuGM^N>EB?LPG6*R~%D zlf-Z%4}h?hJb7FbB7IGKUQH_)IPx~4WZxaCOl3oAR9~RsS1l4-lPH_ z@*5N-7`bU8kq)&?nt9aqYL6u`X!8*VlIy_C2p2}OTXqJJ?5vcO*5PtYX)6yQaRytD zI)m`*4G=WK&6&~U-j$yJ*nMeQ7P^ey~ywRl%yAn`aXF9 z_mA!X^^JqhR`!odb)2#>JM|aoDETGj$jv4Eh8?C7C!Gp0O*flLS|S!os!7VYpzV}p zS6|b6N*=COQm?4zy#mpdU)+Ss&(zRqYF;BMb9%PpRD!%_5*TCx(`+h1Wz$WmbSy+Z z(t$(6-fK_9(@tbMLQA_0) zB3LJvsQ!cMc0~N6;dp}jF;7_syhTBsb!Prviy&JL2$g^`Wq``z8)%+mu3$(*Z>8GL zMD7~O=FEbd*=(}=;>F$FU3q-jk3N^XvlpL%jDZxT>654!z3!x^KoFmpg+^^#=@fh zfU7rld%f|LIiMM3cmM;l91xtE`|plh`;Ei!;AHo-v?$bGW%LC@Yc%GPDq!8=#2pcDy{zG>N)VyLArPJ48}V5BlRD! zd{f6q>k4yIr!IhwLcaSP_%R$`r)HpeWv3*jMN-8R+trduc0r~NQRqq+m6Jc=fkGFC z$*XQpJ0cAfE~vTbpH^HBo|(CNnYrE#uAvps?G1;t?m5!!{aQ_?PSc?&H5G)5f25a` zhk5qweCC~jDOknT!;sU#B$I9$&6V(h`pCP_pL%`a%o5A~YnH7hx$R|($R~odh*R?? z!^O~Ruf`W0DzJUr??;#O>kPURo1%}ytNDmaFwojrzvF&rTtMoe`TG3r#UX0Lh09Uh zG$Dh|tF^4JQJ#(qJrKRGWN~EKbjd3d+8v}XKLI=M(wm#Z+mp8`1%VB^dpQ^mW)E(% z@EwsWS}8Lp*arx1({;gkluBlcOW8-&GW{=w4ilosGO=7c97(IuUf*9gGnT{iIC?D6 z&{B1(Oj>%u$HMg1VBWI1ctf;^r<~9;i7NE81=eim$d#vpnPkEZ4@T?drU$df%>(7OoDG2Th8xSB+hi;!V z>Tv(?WdD8mrrrGWdGmPx!y*adRe);G^T|YPDM~=(+=awt=o(gDt)ZM;30+%u^fxXr zR|=|I`uA2@O3qbz0B^ij!LM{WTs>PRhIdP(GB%M&F=T1u69uGgp=6~SX-jBX?U}_3 zPXZ$#$l}6%JQesN@@z_yfI$p5C+&x8WLgIe_pxM2aD0ctUpzM8v99ZfDK*F;rzA!> zxy444^oZEdTDj6zpcVLJRULX5OoL9)fD%;$<1tC_$0w(;ZMX?CD18qYW-!B*Byo>~ z0|P`^nns*(P!i_hDrH(-lIw9v-EkDfvNf`}F#<+&6}k8p%}J&KQ%NozS@TOrViQ|w z(0XvRJvB)%M^!-X9{>-j!lg0o&j+MgUyi%eJ|hHgD&X!o>$gPqV2Dsn`|Pq~#4fwbWG|RGjA+3H7VXEsZPNMG)y5ax(q{tC#r)v8Suf{< zp%jfJShx2>SI<+I(eh9w@=4lktQ_$;R2)VDwPiEa`6>_P3o)WIuuk zcM-`>I*RsK(MPsOQswHX0rVGMy0Y64MH<)`!DUbYr_f#R|5hg$3+1-;I<+X*EL^De6Eq)&JiL4}yB*?a1FvPVEe{)KK@?tgA^43)&O$Kl-YOR3 zChVl?kW)rzOe|3$J~5^pNd|yN<;~^i)(2zNfrs2m)Qj+>a~j{emb!$EryA{{SV1D@ zKznM&^IOq=2Qg{Mpn~1l^;lHG!L|~A*o4!}qU$My)9^sD%(Q`NKJRO@2*#~oEmg`;*qEfOYn(5^wc19=QIdbP6G;!r< z%I$@M)IEj7&&;ciuCw7K*A!q1NhP{c1E` zM`*=5G^Ta%^XZ_=T#Ub(5%#Uez3B6L4<-5er1*=$2z?>fdFSiaaK-h8`=V!J*Xt*2 z%TmIsLIWQUpcL#d&A%FUQIn7{hp7*vwSQ++={L&`+0og(4-0q1qGwRLXeU1nOXhPu zu%e*N=rijVm+^RrcF<@-iG})2kVLaJHLmHPa~(cn0&%BkZT=*M>;`QA@yO9^_E0U4 zqS=c}k^^7VD(DEYv0i(*-u*mXr`4^?M6rnZ7tx3XMRp3rk$FqkIu*j}@z|mw-OYO< z1O^k!_kbfl?~kL{HzowP$`WRFR%48}*vk`3dt%dbipV*MO-gCroU~y}Y37011Z0|7r%FM_^-1c=e{ zX3V`wwPP7eoNVl26NWKFeYUS1d(@kNph9Y&*nQ+RJ$ zd(^nvfSt6C%aALa18{v@*Ez%(rjM2coVO3l!MSoD;Pz5A=88liG+whxjJ!RbUlQhu zUBrNi$(IT+W+fuJf*L6+t(}0$h>r}lS&&K7+&E(%_udu>( zjQ!)}6y4R$QVeO{}Z%W}QT@xTe>rE(xLZ5(-kVG0b;_}@x_#-{%w6lwy-t+BA z`x0Weo&8ozCp9dByM$b-(x{c9^>(ZI+4sG&!9`gCS7FAqI+MDi2dc`*r_T9=H4*42pRgIOF6uS&*kehs?I_{ld)1;4D%@mqg&M1|l3@M>E!1SmrkZH!5Ijfwh!O{LhZy_;o*z?Eh81`4#V29{;nwQQNAg<9}+~_21)vev6+} z|F81RKdAB7{>>CUO6j(C2;QImIwr|=l;8GiW4&4<3GXp&zc&9x+J3RZo7?-Vd=qZJ ztkYVnmG#Q@dUZ3bZtiaG>{b&^zy2_|8lic^#f3a|adV+ew106C{6P&?3%<1}&YoRr zE%|Z6PrSyRzupncX84?XU0vecg>gb`ZsMo~mqvAT-Z=wXykpy>%3m?8tgRO(j464F z`@!>IHf4KW?Ck2(`D7LrF5xTlZSX{&N!V*0pH&#=4xSgq%_UkrRGh%})WQ3w#!l!@ z%TnOMIvY%B)u@3PqjrlOp@Es0O=pm|qqBxJ+0v6&<<79lt(-HtMjN={I73ho?yo@$5my;E@UX&)w_qY+H7~&IrwkV|#$t}xJ2{mVOhY(20?({twKQ|; z<5BP_iYDvbA*3Qa)NXc~XOjLG+Z`FHgnN&L-V+QZQLlqUdzI9VXc=7=Jkkp#X#f(5 zHL`FXr)Y~}i)BwRzpA-r=;Vvo|QFcTH(dTj-Xkx z4c_0E@dZ%{?Z*dpCi>=TK4mSBPm5#vv=tz2O{M#8zdMnZ4%*@%^FhDlMiu>qSV5`azA1S+wK2e1LptTzgfoRpooJu=;NTkNjw(lvVQ( z_$)$lk^lzn@g?2g5zO?g`{7N1xmeO}=Od#9arfzX*AGU_X-u7XhPCX26B4eSr%0wD zkn-(1g#{brj#2&i%B} zBzSZyFYw=LU>s#Kv+pW1$|i%xdE3|?h-qNzK!yiOgG~vIBbIl1gc9Op7>(6wuI4Qk;C1}8Y-SxK@Nz!< z#Az>fdc^_uxJurg1gsM6d!shxpQa?;oy-mKH~!7m(dl6m;_}6tz=ST9FJ>*X+ycvmpr39FFR*+*UIQV|;PEIRAsy2KsvdIJ2?&LQ@jOn2 zs5{3U2%xZmyHvOw_C;VaGty*o=H)MfQ#}_@KsFDz76Pii0#Y0~6fVL_B_kbFgq422QIM1iJ_CR^w_&nTu`hDjI$KC#J zaNzyLorRSW4TN%o#<&}!Y0Y!4`(NAKkjf|sS(ZZ#_z-&$R-se!+i2dzL?th_&I?-! zo~Ef)p-2>g)y~dbz;MLQI*ByZqT&^a#DmF?AFJ=U^$w?}1!nj1;5#1=wfV>WyEY!QQxAQnKFhJOaTwivpAo2~q z0Z(^Mhy#}qC=pA!-tj zTr)KVk}wR&^bTAlXA z@yTn1m8}Kc8A+m-^O^7?wneUWKTluS*~&L-MP}ynjh$06xo9GvKi>BKNOA@X$^8`~_qB|17vS3YpMPm!G+RQBz zNjfxGgmwztK;jp5W$t*5b#w(3KES8W-Y9w=h&%jYP zQOiopR?EJZ@vv`VW~By9b-lJ(7LS8miGfSxxXN)#;v<%1 zQvm6ne~!dXJfFx@w#=X(##K%`hZ>zu^XT7yrIj? zjmzm<8@uKd30ISd6N+rWI~tqYgiIXIQG9(EjV@+(i?rAwiI0m$rS{{0r#W4$rf}Y= zF(A0b45QKY?1paO>j#6NCAo@xx-LzW-%}E)K}??-&5hG_yDZc;H-)Kb5CWSk6{ff-Z#J5@zd$V$=1uX03~Mg~BVVTlF2gIN`3bHKt%L4xAWv zuVX_3C46SW`6_l^HZT_H;(~(WEzX(&_0*`%JuI2W@EyE?!LIK!sq4xy00tG7-{O!qTh3 z)Y3(eI8p)%8p<7qm7;ZNv4E-1Dt)~zxe`Q(J;PyF!h)+AB!&lL_GM9WGSAmDnTXI(A6foEYpXY6j`uAT};Dmcy)UdMWDF^$4NMysV5-NYb(CZId}$ey5ra zMX2APQ%9f7@V~=Kd6O15fmZl1LsMp%SkN2jqbUitI+Oea#c=eQwLV7tr{^m z7NRrhnp#}9_Og!?VPgtnyf?;L_*ln;`M5FF~*~*T+}#& zHwmij-puDxkiBCEKkt0ZLnuf}f=kwVqpMK;0Q|JmJUc%XfOO?CHdCm;!NR`1J#5<< z#dndHR%L>2*-`?vIGn&2LYT2jYGIdUc)nkf(_;5pM9$pMg1{Ng#2uyysM*zVz;t4H zPPsDSiCtu^&Ac2~=U*s{HAlUuZD5|+SBpp`Z#0epoBUuX`BQxJ)V;!`LSiZoWDti- zQLb{V$q`Q-J*KmK_Ed9nn5!dQcl~NQAOOKX)I(tnmC@W*fE)NwS)43$KrCAJ-8GQ( zZT2EMs{_bn)+j#eIYj-OJHU{DehHFyHx4;5fI~%;#f#0Gp4;VJ6LTVz^le3^Nc2;C zGoPAQAji<0i;AG_#*sY@v3dZGs_SwPK8q9y*Br`AXRbu?sjq-yI;Kvdj)#U-6Copw zvQ{*2@YwFMS-o4#v(9dm#wH#?JS{yTSI(djjGJJ08g0NcCE|`XQzSV_(&hfhBCtNoQ}{Lwl5{!G#LSyEd^ABO)eoWLz4XCHLt63P>`d53?joFD z6GYdGmNG82n^cq0&A8tYr39S%^G(bjOwr z3S-v$;1s?r0%*`lYVXVuwQ862H6C19kxQ4B5Hm9gn2%#K2Ucn=WQ5A_+4Mh!=X}U> zO{5@xa(wu~XpV*sNywIY1H8&imQa@THu6L^7`g5zNTgB!mgTsd-(?dt$Eu5_z%OdB z9|5O4k)g*|LN=6KkGUNS@G2z=B;J+8FO~2;{Vvb3mnSSHe4HxiU`ZvFdWb0Ias4<_ zr@FBR3M83iT}laZ-vT)zNy>@uOk$2xEYUM8_QsQe@n$-?_maaZBq9aZ2XaDm--|@B z?t0{V$GE`!c~wHIs7eLArOho8B9gCHyyR; ztX<90F_1~!jP)Y@rWNCUJ`|vnK}|cmr@K=P|Hv)JiuOpPM~@@YCLM@5S~vE#Gp9z8GVd zK(w9&Y262D2Zr8m?ARV`m^{?&5#&nVWoOfvQ zi5zYH{Dn!Wp2jb32K@=$hZnp69NSB(ZHc2#>tat?3rR#K6g)B0@?o8M08`9-^ht_rv8Bu>_afQN zxH=d-$NF9q=wzZ3GOIA2?L=ty09lsHlo6in)1l(at?N1Z>J z0-Qsh#5OsEEgfdi?X_oW;rsruA-EV+RC}dqR~_{G2c$b_XIHgmm69P*Id&N-Mlrn| zjJmVzWWa_*FbGLJ(^+ihvy)^A0Bt~$zs)M#Rju+dsLKfRkH=iRhTRYed#(#`-BaPq zH{vE==SAtV7icwOJvq-+w=xs{`rDAO0a;QnHBDR)D%&V>Vw4{pBdkU@HnMs#S_;C& z5vKW(%zEOgP5ULbucNeHFS~v`jl%qLKE{oXai`~phv%mktrLh!$Bm<=FF2?3aQLTC zkOSoB;3xX~tFWM*GQ1gIx6X>hgZ}rj0;&4rPl#16nXs5$ULqeTXL)~o75?|PUEi`9 zi{jq(k0Jx&lzNg6W$oqRy^EX1Jq7~$r~{*YGJ__$YkMI&2dmI=-U=7zV{vHSs4t4m za6JCRp2xu_h`0uGizcv8^Ps%cFweD>u#7%sAF{DAC}n3~Y@EN9MAm>iA69m3n!vLZ zaV;U}#x2G#&Q4MeiCt>8NrWX1)L^Aan%7T42B7pqDYwp7`Jj7#(}P- zaGXw673==gn)NN{9ZZM2Baaf$wrbuA6dTjlW2=eG+~pmA_566Y|jJgCUAq-Z`(U zc>uGR=pReIBxczc6URX2gp8)jB$A9<&-~&BG62KJo z^~E+4eRcCr%J;%l)kr=b`K3@vW}izBg+v`mW-+`{$?jk+o2X(x-Zi4KT#Q#?b>rnr zI8EPN;9W1mYDH3TnSyi@`GQ>pw&H3GW?nkAp(=?WYR$D3(j$goqta^WCkHe~+*Oz~ zSJl>rWuP>EMAi6Y4P8&tON#7@xxUxQkHx^&6YXa_Ymeur;^-UaTT450H4BnP%}ifM@|Thluec@v!cLAZADk>!RYFe;p&1W>fXS3^1 zg!gsehIs4SgWr(~+-$?cN@y(9j%3(E?OF1p=e1(^_png^{`;L`+Qq~yR>HNdMf^q@ zT8QOEX7axl1Bg0?2)fQ2orYDkEle2%9Xnf0T@tGq(RsaFz!qC7hC$p+O|vU+|fe^sQ(J z_YOJ~$tqGo5?uPk1VZVhK5o2c^RE$RA4JesAvfbpY>x6b>hH9|8|^-5f}7p!;L1{| zRbZc0Bj-A=%mQ;D@KCjRN?itH zDR&kpFWWiRT)%qR${vyNTEsF1z3_GO%}Kkd&gi}|w0rSAv4($*CzCN3f)rY=TubJY zI0S2+y=92AglU5IoeM1yw=c;TzeQ$`Bt#CJe&D$nPsPK8e3?hj_bbC$dz7N*~5pXnC zf;h10s(o^L(dt|rd^m0#wf4on#L9Gaqp03$CJD}w$AX?RF!!R;f(WIeS%4TWMWzs+ zp$Q5#J;OZTHWxB+87CsD)3cukT{VD8^dgg?H;0YRJGonzUTOoO@+G!eIB6GMhP>G@ zVjCqkN%a5|?6??47-8*x0;A0@gpmuAj3vH>`4>$raUiVIdg(fEkU=BTwm-Mc?Eu5{ z5JvrfOfl~@2FS;p{GExuS1^ihL4HGoNB!#R%51P}^OCYNyNnE@Avw=vB1Du;0p4RH zUoFLpSOV~oSNrv7>y?SU>$@u7jC_MNOK-d>Lg?m?t^H-#>fIdvxg6 zy{FS`w;G39XyY+&OFZ!Cw;`lv+2jcR$@}pq55FrccvQn+ikxvaU$zJx$par7pY;OK z)Y8RaK`fSb@6g0J{4C$9zDvhGW)VEGO{)9SH&orU& zA2bi_GwErPFE}|r!=)^Yy0?-42Jb0+UkZ6Z;?dS|?vsf}TgQ1%9vrk+y_ANSC)L&7 zAI~p`(Yj8<98+VhhsY?Hvw0atP6REf$#V z{`&d8W_@ze4K$Kh?vH;A3-&8R3WU5}kc{>BzlWJ`g>TWfbjrk=CGFb_bxTPBZZbar z!A_D2I9Riar6eM<8PF@45w;Gbbdu5eS*_;Y8PY#N8t^`2qr~~jUR=ImjpMpLp*$HW z*LRWEgUqxxb9Fn|9Vu~b11|i`bz0d^!e8ZRX%-HCor4@GkxX>otCWywu*JrwSNvtbQi92T#xe}&amHtp&*`&aNJZdU3guY)l| z`W-qqsGu7S{Xn?mvu68EgQnd-B!moKy$WlOe1B9;zdx$V`!_T1-#^&rqI0+2Dwavb z$&L0h8|}%9=zJ1bhu4|;eX$uxbr8X07@lyNc`1|tp`%Alpkfo2qz?f z8pe5uFa{OVZhce0y!zbxct%E}`()e+8 zZo(pPQq0=ZXaYO?h`rE%lE9>t$?K@mc`uVCW;5?)Uta!eiW=}5OHDmkWl?XKD`6-z zH8o9^WFJX$U@m5qtnH*0tz5kQ0*rfX1ZRF^+~ZMm0kw6tM@@YkpJk=um2>v%KVM(? zmi)}O^j!IcT76C1f8zD|n@;OL1ktKhUOksA*HjsGtoYG5z62GXO&_ekY#Ln;VlHz4 z;>HMqXhwt#!o$rea(;4WSP2s%irp*6ve8zsrWYD!A;JKdJt58%2|_5vWP|`Ey@M+Y z^RU_4Z#VMjyq(>RSi}`QXo&8ERA+DPr6z{o`GP742l@s-^nQnMPI9Ev`D~99iLC-gNM>#>1wvEWax+#re zex5<5x{PL=*lOE7Bwp?fUe2qNJ9S&F2qAMjFD7?79mM`dA9tYphwU#u(7d%`o{G*i z8p{Pil+!RmTz|eO=LdZLn(Oekb<}yk5R&EvZWN1Z=Hcd}9&UOMFF7^$u1DP{7t;Fc z4#1m-d(kY0_9+of^nCnv#OF^c$1qFq)B=jy<{_;`9Vs^j0f%_oA?H+kHUdrZ#K@Tb8J# z#Eac)i#p4e%#z^eXk9uST=r|3qc-)i=^P4ioAXID}MC^M*t*CVE2b+w=pl z|1+*7_~`k5&HA*oWyqm*rlU<#$Rd&ELTc1N5W27R(_dQs2HIu%ORI%c?zdj1zeE&G zMZWCS^S-Rgmm8Ns`rF3-doyppmj3d%VZYq$X7<8KcKl^EO4G2`8H~0zx+i7COMM%L ziM3|PV$!D(Kt;sIt^mu~eTRcd|HjNa6UjM5L>;~{A4s_N&z|i0aWDAAo9JS;=ko9T zkHgUayIS)9swcwsv;anOe0k`_K-mDP^dMPYX0m#6Ts?QP%pjf2fo(p*O`$PAji-Hq zm<=?iA4F&;p@kn7y??GLnD8WnD0>tdUiP=_47d6fZe`93Ol3y-#=HXy`VqG&=kpdJ z$9>M{5*;clwe`hZxT~xc_O;vYtaqbn9-?b#j=ZUVlQhgFc0hzW8ZsHiwdcpU@D~Z5 z^nX+He0qmeb-;IG1+a@T(_{gtT)%CR;2D7|ekLGN`u@7`pi9WjFmeZw4M%@1-!%>YH`$tQ2^KVP)>PtPu_ zmanAYDsNCC{G*aL!kXqVqMA3t)-AzL%`VoQ9hWOzw9>N=r_JuX5khubk%921kG{KYA08%OW#Q^9RuH;bj~i$ zPCQs+`P=DrVW^rMX)qo#TiAAM>zMM4HuyKQHe?MDu+Gjc7}AT{KWsMI7jK$0rmf0; zY6K!e{qNZjkr~lAIA}L5v^R6s;f%@{v6VANa>RDd97&h;PR<<35ifJ*NFZ@oO#`Hp z9g=~_hvWTsk{qP_tvXasme5tfCwVa9P)$W!RkI^xFLp#NJ3`#Cc0@fpBDs}tBRe8- zWm88dBT_LnBqrr7HWe#EgL2l3L8tFNblgmJ0^AF4T;q)Ni`VC!)03Z?ZTH3#3R&q|V4B{QhqJUTgR{?vHiv@5LGqXirm-!<$F z_~n35xv!*A#|*MITnwr$7Z?7&S zy!-QPw_A+)XSYoLKk8>?|8K9=@z=g%dH?T?&Dz#hy8rj~M)mjp-@nCAe)DYf%zhe6 z`)}Li&}3$?@gdgs41Fnz#(~Nx10xDNakaiiD`?t;ZL2Mwo3Lhb-_u{zHT^D-b_qA* zfix@TOd15_b-Di+2TSw&=mm*My@}4aBq>4fzM-r0r@q2vAb^bbdKROAp?Z zsf{IF*13jCco$uUoNU6qS*PO(f>gRvd%$IXwhzm}xmH5p0tRSb>FUCRd!c&qz==E<~Z$ioB&?j&e#Mn8kvUL1iytxL4d9oy&{Iwu{MMES3ISC5YmoKX{_x^bDFdbaq%)-Kckv`mcS>mt4H`qbP5Ro?kbyq4Yw?@74 zqPJ|m49_CY)jS=t&fA&emelK&Quvy%1kWEeNF1qEtJU>ty|N9PR3kt;*y#h;6OOeJ zuvRbUVp@F5ED;0ExTMA0N=Ym_U6X-r0B8#4N+LCPT7Y5NHRWMLIg*8z*1tKOMqRY- z!YB|Yoj%rFClBehvWl8_K#~w$)J5rQ9DM+M=#ROA2?wnR+2sxp+@J;xOSoEBH6!d5f?mA-Yx{u)tR{_8GuxhC=x7N_9}cAm^H7jgNE2BD6XvHF%3pxlYukfFg(

)|z{Lco_y+r^op+IPe#izQbn)zo?S8O2zNhoOqsU>2AM z5h*#Cd5>a@Vrl{#wYUwfu_vpa+|?RPLv95W3CNOGnv&kQFqG6B$PjB2@58WF{>ZgLoR1H)5_1pc0sl zLYG2*Ch-;&tQm4W45ES2l#>ZW+!OU7$t8>w{LGCWIFX(}@rENd zIL*FfM&wQx&k=NMKwdJkUT}?+0p78s1d=%8CFx#k<$q`0lvH>J1%_*2s*{$zCeA5z zMgj+4u#!bJ54|8Yc$i1?GzcYJvha=R;j75NGHE=Pv=By^8QS;+=4fz-qdY88G4Bq| z%%VxW%dIGSmYXJ_jv9}U-I%c}nt1F=B$aD!i-IqQ(KQ-bfDMZKQu$!XKVh2l#dvCt z(SIMWx-pCiLL7+G#fdTbd>Wgrn11iHAwhUkM}(oR2p2HGBg2|qJ>}RQg^<$`8g)#; zg&tHWR0d+14IM=5D#K$$B9gFeBvIilTt5y=L%SR<`GNHXN-bg^gV3B-j*P`gMGkS2 zDx>Gja5|E~s5>mtJ7h~>GTJAYdFgcApZ8=L%tT_p?WNRJ(V{74u0Z+GQ$*y=r82*u z%bNlB-zo7+eDb9IEh5CRM}2EblvX`fdY<5GRI~!#fwnRQ;YyK`S<4+xc^AaM3_6UZ z;fx5Lf#sY7uG7;Wd>-`Y+!RQ&lI0~1m>Qc0>N#rvVGL=zn| zr6Oa=hELyi`&_3+f?N!obwf64NZ%>Ry#}>RXf3EbeGItUaniH3Y-F$r&fnhLl=doh zwI&Z-P}u@UaXs+mZ&mrq!TebfmX#|Pp5$?-u8cIi&|=A=!3o_=T@zb%Ca zE!c5ipR>st1CLG)T5nqWl1fW+RJ345j^L!o$)JahUIYoH1blw5{z9wGYM}GSUpog z!q7F|3R>~>&80H41?Vgno3@bNHzC)7LE`%qZRbJrc@|l`+wib^w<|ZCD@b7HC9Rrn zz-Fo#`ZIG7wq_fWKoaNzteP>_inmDxP6@E()Lfi@Z2HCqL%ON+?lnMGct>=S$O6ip zl z;R-Qp(Je`Al0{31p-x^F>`-*rbJb>OfDH+87+LYysg1SYD38S}?5gJ^+ybAgCrgc@{OXAnJL(RLjrXqb%A zK66%FEC)Z?GUke8(>a81u4fl=k1*3qP+tYV1{1HUYlr#>oz_ThI?dDAmuhglzNif$ z8i7h&G_XIIlUQc!q+1mLpqUJM^YJ_$%G-(NFl8s)9X^N^DdrMjEHUUJ{ZWCtX-au? z6TM+~a4S{pj2y71edFoU^=3xa3*@ob@UJTgRGTFzq3D6weD^YDTg_M^Q|;8;Tbe~m zr!9J7K@xOa{hPL82%Ekq=yJ0cYpm1JbX4|~MDJly)|$E|HxDt|rYm0ClGsyeTgXxx zGn)sUrK?h-G=EbG&cQsEfC5^Bj(H{ zZ)Ld)NpVRztKg|Gb~0&C5<(^LVGb+l=;o?{R)Wmnr8FF17^b0l4-xj>AoQ7FYmnAQ1>u9FALbMSL4gpX0SeVmZ5 z(62_{(ghR@K7&Q^Z5&Mdb`~JeB1yooe%XGnXaso+dc){PuX538 zM8H8jL66d|96)z88qbNkaIM*aZ4jNLcwsKZ>+%Hp!D3CQ01210nUayfEPmK3Hdu#! zpyUr+4u0}emFtqS$mY6T8bAs+bJRWfeAFia`kEGIslRLO! zXM{GJGZANFmG^E5#-AgpRWVB3K{;7YCcqUfX@M+%pJQTecKLjjQUqzHjf9i0h6!3~ z;EmFzBv#r{fYwgijfM2E#wjGm_002*G)Oa**-exbIF)J197aXdrwkPek`NGcurrRR zCxwLoBMiq}1H=jvfx7VcHAcvk25w>;p%0|2C~s>TU3aH_Zma=;=7z2`*tD3+&gj9C z=SeWRF{WTO8%TS`Gs%LHXANXQHJ$~&A&G{Gb~lC7W2F8@F$>VRJw&c3FSC$E$7q}tU&FyNzDv(qTwHX zW9lf|MTJnjvQK}<{ix{4^G zXX$vM!w9amT^j%tB{a1FJ`!MDe*LTl==LaqN8y3VV)P-jMBJZm5U&Z+2b!fp4j+V){QV(GLXJH(1V z5gJEB5lv!{@uCTVK{ZHGTH}X!Mxxu;#JeQ-4^0XEWk;qV*v!2uP_ezMH*}!UHXihd z$zNrp1#fnUSl$ib0?J}1Gr=l>bdR?&8!R1n)iKT3Fp-cDmTJvYUh9bT1R3lz;x-GT zJel-!gg_ePiIoW|8A;V~Z7*(U`#}BYV&uG?L|macX9+2Dkp~R%A#6CAL0Zt=cxy1nOw; z1ruAleJx!q9?k11rwy?7pK$D|NsmbQf`frQXcnh^9}NZe%7*uodEQ^xy(8WkLSfVlE zw1&me1RZ^en@?73mmj2nm{M^x@L{VgeiUx~E&|FjQGdmbXMTu7>H;b9Lq#^X(U7#j zxRv!Ai5rnioU|o+?tZf_y4_5RW^ist3tXcnphC&h;FiNI*+o5{vcD=3exf>Vm&bWLU|=_jMHebU43Ho41S7jx|y zZCT^uXC(kbqoMG)Z_^*EG#(>{htMk?+|Gw|O(Ss@i35Xp$hFFqj_L=#+s2FCLkVj( zzk81<>(3k_L~nzb3+|o<0c7Kpy5@9kEDhJC!&DMR8cxR#q$WIYQ8@o{dvbz#3lTpN zd&eAPm{jjO??uctcW zOoK9=f}J>G5&BEkz8VZne>`FF68mo%%7jhw09Y6v@i|6g?wn%+bb@Qdb&RE?rhSc7 z#qZ$4pRx}Uv3{8)Mg72FJCiQeNjNr9={Z{aN$W^vfnKu^HKqsh(4HDmrJpjpdpV@) zMSnb!1Lza?>2sVZ2VS942OfYh$m~5~EO4DjbbXE(=^`ck#Kub~8B|UvgqYJ;*vOl_ zH9nehfE*Tzx4^p3;ZAp|Bwi92qR(;xE~6~B60RE0GUS<+h@G-=uBGi1FEj==MX|WY zf(f61`@n>XvSP%k5UQO5R~+_VJ~+>oucr%*cH&4TmIzdlRj)X)j;tEM6usN;i`@Z8 zK*xO@Vff^RJ?M!odO)&7XrW4-k_$`~bwA)*ep=Qx0M` zW~P{n56BaeL4g%Y1siUS$`w_a#7n>tzrw~-ikpKFkpm)GxHd^%1Q_Z5#hqqB5a+aM z&_y#s+9A4VQKK8jQh$b}=j7OoBB6DGT|k|3+BFbw1Zvr&v$c}b;+SQd7!9wOku#ts z1!@x{W;}#uQRAtJ8c4j#9Iy-113Cmb=#bgFb7%+<9`Znta*{pR7?!b-^UWjNi7IzB zc^MiKx>T_pc}zsAcRP}80xe}iES%6^KPEL+|6Sq+r-W)-E2+d+EK2f+KqKlQzB^4? zMMKL4tUuBxb1NX9dflS?y2l9}t;hT1|8J@fe_un+FnXd;KA7oSxF;TvhI{@e_f#`Ir6X z=~?*GyXJ9lg6V&1(RxrIgC1xdhv@x|dJ32j(Yfu`+jnQ-yOYC%W}8EJU(nn6!SJ-v zK5I2QD0Kg0>ma$QwMK`Qy%zq|I(vuuQD*VjT;upd_`Y>~PzswZo~ZekQxwi<9t1Qu zI?=b9^kwUK|M2{Pqk~`5496#D1Si@Vt@G@JL1V_6*=aE}e{j@n6a0?P8n0W2EqW!w ziQlx&j!~NfuxrT5_sW zpARZ^kl1ec;p7~wg!X-SfB}IS06-xT`HiF`moSoE(>XtCD!e;q44}iq@VL28>ut0@ zgq>#l$JRdJ5VV`8jTV6)fz$0aW;r<)f>SHw@CZwqKLQ8Nj}NiicJt5Yw4WSIz#NUY zglzz(ckaPYEqXalD1G=PeuTbohyQ`l=p;O9e2{4E4~ibNOdHOf#0o+Rhn!9UB~>cc<@V!M!_$f53~wlMawAL}jp$S4{uDZen!1c}(!)>(toa zM;#V^8J?ikbk6CrwT}5v0_>M>bE|z|?i0f~eA8$hqTEah$LP%`1VT*7xMmN;AX%qa zVjKutZ|GI~@AUM-#I5}hzN4df-K1fSgCAR#b6O?>)yC~g{@)5_UT(Qm?Ht%8-;Jw8^a0ZCdpJX zS0uWSyR1K`cZmEpwpv{7tn5b^9{H{}9l9qB6l5o(Kup{Y}&hg_v@Lb7U z?e7t@@B_Vpr+|FG;?WQC-ZO31XSBq`dGFb*$iyj&oa~ayB-V149~hdKq3mL~SH)Q zD3js(dp1`?or-J-9&&7<3I0Tfclt>)ZvyTkcsCka%(VW&5-{7Ao3_UVKjHP~NP6A; zsLy5Rr-2ln!_&cXPb;1;6PEe;bjg6yR~H8e0wgoCF~N@}fx%5EFb5$>dM4!R2tjSr z@rX7gd4!}U5aAmP#X_10>_`N%mJE3``6s9j%l#STZVv~agqQ{#CrRU&IK`5DkqC*U z8x(2a)!Pxt;-5tcF!;UovXr{cxXoemDrcTX=UPoXZM^QB9Fjb8_`#Q@_xz40Qkw7o z<&@XEr)765(&WIg9_9tn5bu$Wz6t7}H7q&h%9@#s=Crp}s6Xffi);3^m)zdn{U z&vzQo-bJ_t-Pt_}w&G{FT?u3Nhw;O>|1gTo6$eYae6TN)Fe0}Az9A4$OlMrR?u6n0 z>*4uR_|c>(>Zd4{Jm5IgfEL8d#6@d+qnG`Oo2R_%_C7^Zrhwl|#0fIS2}{l%=%$TF zKa|2MiE7iqkgJ?PW|1#SDDx2yOe)xqgh6TmUO;uNIYu2!&J+Ut@z0lyAc2=YYbzC4 zZ`{-;MP2xEr(?LXL2S4lg|+1bCXAdDIYIS>Rk4>+Rzh+H2Z8x-^bGK^4POa#a${=} zqHt%TNlh+ze_RSpqD@YTj3B>6M%D)U&#s#Ff6mX!`fuZYKf0V>mwR9Tj^*{=Dz!>= zBVGTkzFGgh{@ZWy^Ws@}Oyq7iwC9Wx#HUgqYd38C*fw+npEp>H*bVn@rm(gXOY0Ey zKK*q}+>Lv)??bDEWN|<|YB#J^Dx2#S61}$YnC!at%P+Le?5A6yk~!XI9R)k@JCLvF(7ufnI@r{Q`i z4;QNy`u%C;>0aQzH-Bj}`Wt@{3=B@~dKca60xUEvkn9S3;SWEA8w7ww-{UKqou{Rr zasL1Zp%WvLdT?LToj;SdNAd^y!s}b@YGio&T~BwP>PK=|^yK<_@oyF;ZeVBzCT8W= zK7X!X{gRsee@~xgUiiO9Pi0qHEB&8Mi+=z4?SEGCfBEOvu>TeOf2&fhRMY&wMqmHV z|9^uY%m2+eC)ht1fGvfe2h-V{^cGZu<@SYCl=7yESMjv&CaflMNAgCj8L9l`_u;^vB9Z>Af z@h}?g8OcZ5>h5__J91JU;P(g`l6?mIWGP&)O3y-W_@!B4IopygoQ*#@@DDk?lbb|Y z>o*6WOaB$K2tH#Bg@s>+qkZF7T+<=JS z5Y-G{&C9xb2 zuH0g6-IAOa{=qbXHcc+mTgEg*`u7o}XS5k2mQydn)lmwiiIS<0HkGb#kbTjDrl{zB z{+$`nIX~q94Q{zH^j?^C2*E?l!E?mHx8!>838 zZ6@8dC7U|Fl_b0r7MY)Cw8*3Q`gEowFb|Iyg@{G8PmX|}aQ~b5L7LTQqdX7cl>$-z zkQ;Gvd~$KrdArA)fHS(-x172e-dz4dWv(~F?saSs?TY>|t&1R8a49=s@Ln6WH-~TW z)>A^2R_6kXm$p4y#muntP80uYU$lSXce?IA0o;|hga5*UZ-@ZJyTQ82$(oGg*^3Eh zR`*`?qaHI#6nWI8A)0lfyd$Q^gtcgIl(FDZyV*FPB{Vwk3PthUs14wAcgiJABz#fY zHo~OKwc5mSF7B)8HBF6gM&0R@z#!ETK(X8uY0g8>{pH1n7yn^j=T^s{hcMVT$&4n< z+)amC$4ET@3y1G{N|=VIx?a3mE+M&;`Rak~&6CrCFx{-gyL8gL=Cpls+R>If+?Kww zYScwVhW%llXxE%KFw?C$cQ*O~n8sHHmL$w>WP6n&$H5#mk3z#CGDCj;NVnr}!t|u# zpx>}atv?$jcUNiTvN!I+2y%@U-dFxagOR&mn5CYa(HqHrKplk!HYNO*7T~WCb#U&( z0=}rczQaCmwTVwz=41 zDE`Qu;@sgu*5{V?q<8NU~|QieKhs$7r>GJI5^)w%K%ba zmVE&rb*9Ha(!6vTC`Axn4N4jJrJzi0F9k~P+b;kmF#xpP)E@6?fF{0uBuEp_JO;4I zB`k$+Cn9n@JZ2`Egz}2PUkd8X##6vfZqf(0^q2}oT3JfH!`1q1D2U=Qj<4n$+U{)? zKagQdkIgiW%R8p@1;{c2AN7?SOWQi$XqFjNcS=6#Uh>jM@`6+YyplKhLcUO~Fkh&8 zY{V_ygvrG73Ct^^VCLLRZU>orXFKPwy)P@txA?C^Zr->jiX}eUSv>T%d#_S7!^}JZ zH82tFh?xFf7airgQd6719!yau>0xF=I!ys^&RHtiB6{dXdefbuHOBnvYS80Ma$5tO zs|B*$YfDj>&fX#}YHJo<8~c@tDb~z zva0>>VKv(FxjzQ7Z*TD$!*?n(sadG91bs4h~%f^{z{!!&mAmqRVNaa3JNj{Mr!vUgc(&D3ktHWJU zFSspg^FT;DM-FTk!@p-crUk8$^L7o%ln`r`XwyYH5ki8sqm-R&ZO zv?*%Gmi?J2ew_d4iu<43z-;OR#{+lgiweNx>}p zy=hsS72I%&KIUKXF?j&NJy=C8bfOfSc@)mjGhd7?@8F@zqnx|E1ZO3w8fln@zTQ7T zR~bpfw%$98H*&FiuHs$b8LCsxG++L~+H2h#>_~UU(g2yg#06Uw10QnN`=T#XAof1z z{LvQLn>w@4smz{6SSxGzDkEuyZ_nP9j6{_t;W}0F;2!G%kmcpzw3a5)&#Pvo+e?w5 zspE^8BR4NBML#u#TWE6k)0op2t2=qDkt85?50JUm;}f*LvX0{?WD^zOb{C_s!!flk?Vb3kk69 zqj;1TFLxF7Z@h|xC-9f$u=*$fD^bF~Jefw_naLzBmp;dcGhTg`P9DXzCb)uQQy@mXs&{CN6?>?L9 z?>H6XXM8r<3yjNguoo;jEfY!W9fpNv=d5vf=wfR{W7+csYI@MTe*Fhp9LqM(kW6@oa-x19Fn-+QGV15b$MFBLD*%R9!vDwrv$`kznDE~GrKjlK9KKcNMG}=ubEa2Mf^JoVlj&P}ul&&;|1Dhf z18RB|@)BQxI-{b;Y@oSH#Bd?aNr;Qu;znar;KqmJv&r-4^h%B8)lgoE2VP$vAY{C_ zmwN4RJf7HK7VQ;n_q} zywaJ(Dp*Kk#}8BDHHw+(GMu4DpQ&`fGoaZf3(CrI<*^)Qg9Y$gcX=={_=+kbb# zg=0XbnNh0=(0$iFEA(#rMZL|sWPI|szvVoz-{>?8Y?aq1ez}}R-A{YGj!?hZUG!wF z@VQ$0Tr1{1StUgjzZU5Gg%i|eg3@QYluIYj-|G2O9W>uG&JWKV5i?V%-y!!Q6wyfh z{PK%hlpX=szsa4tppTHOa@$AFd4c%bqhM@MPac0|;JonZB%HHPSBv4_{~o%(Ym28! zLi{mP;cq*D9?P9Ndji699}9L%_^j!>{TGQ-dUta2K4Izhzi=e0=&5~n4v5H&g9D~c znR(J*7K;BkRfQ(}N&A5D^> z!ZnVH3!cIcg6m?5`2F?oI{0whIBM;?)hFL2VhwTCH}erE;W?{SVfvp=1anWx4SEbL z^510_Cl)Ka?!5(1+3-ku*2oXVf_GwjnH4^6ao$s+alvH55!xOMm?xTwkF)UtNEJok zbr*rn&_ivb!iA9^CQ^6KGYAViO{%bd5NF0)o)JB4%O#gHJhr1s^{L3s?lT=*vM=|S2g)SKTaMhRcQx|S=07oe=E@R0%#kXeO zS^L6wCcKcPB~Ha9D-hSVSwTH58Rf;<?c*L=p$j?%4G-v)>s$csS3A4z3m5EWzdtdEq->0D$xi9puL;8jF zuYF-6C?of^$pE+1%T=^WynF!)pC7+JKKbc*5ogM{pjRTUKlqpQ!sy%{8~C;mvmX)X z!3j_(nXHjkDaRPgCYrf!?n*8lfp1JVKr^y^;LC^^JIWT5Fqn9Dme4V`rJ}t5ONptQ zAhnElgTDC3ioOYM0s4Fc)Oj@8{NgVJ=z>4JEC-r}$!Q|#o{eMw2-B=Dd35MqlVw7O z4iI@`0P~v3xP#yU$-3X2_PG&H6mx!p73tY6DfI}sOPw9`XgNe)o-2Z=w1FcC*(}I5 z9+BEiz7%2N%RLkHhl0EGKV!I)s#+7cqdm)>hWn|l(o3L`431Y}4zt-?W;`~}iyK^@ zZ{ZLBc~!S?___;Nd08N5PniS_PNNBTsJ*?F<_Yx5_Mb0sVPFb5?=Yy{ht^M@q6Us@ z8nEVG*2L7l_JB+4-&onA>!c%_yu8)P&*0qqqpqvHe|mOt)abn5^D-|bn}l?zY|e=` zyb!ad?|w_&;8Z9LJS^UVUioiV;W2TM6F^@SpR@Fwy)`X*vF}||bU>|+ooX>u=M=-s zq*N_)y!%9Z+)P}jR8BE%g5l&|lW(-yTXKmVL-jcSmj71E$}$RIf{|U1QLOIM zU?LiFgYPda!^_^DP<{+L?D%hYr2CIKxz8N0%UndF&5~huf<&3ER2QwNvuH&xQ>Ty= zYBHyg^!hFZzoo?X*l`~!xr_c5zWMx3=dYrg+VxTd&+K`jm=!Mkp_gvI>Lie|6jp1m zIvg zr_(V?H@5FZ?9!^1Ow~AB`WAH^uf0;R+J3;gS|NC8<-szlGJEYgqS!ik2*l^7ED~^i zaFbHZRaRvM5tk9+`pwe!mL?fKHW<=)if2VUuxB8lS^Dgr zx{P+Q8d3-PVFh(-=>IuFkZCdRger^%O4Fl3}5+6kn*C^b$uQdyhU@6BFV+p@=o8^iY&14a$i;Z zCHZX~2k@#&43OS(|EiiuU|49y&t=4KjxSIxzey8$aS3Kg-`m&%T7;BIa63Ypz-}f~ z%2aeX^Wy~c>KGN^Cln7pnR|Xwk0h9w2mJm^D)Pab`IWJy7X2gj^eGw+7}6?t3_)h; zU!*?c^X?Asx(~6bBSP3One(JB zefP>ALjuq7L8ElS#v7baEgbDFNh^1`LV(f0j?6xF`c4W_{W#cj;Rik;_)18GKf zkD^r52dD+2q$w5~PiivwTNWSjL95LtTy!UjkKUbh&MwYQjK-5Sd(o^KylGZcBpPBq zf~I=N@x0|bVh+V3C$8T_!-;dV-HGC6>m{U?opY%Ev`zy~KahhME9SxybLLrKxx-KL zVi{M3R~I6Mr*fvKj{OvWK1FT9&sy$D!YsJ!SlD$-)QS&+Q>Og72`V)w4uV=v57>gp{2yjN8vx_p>XQbtEq-GnIv&$ z4xh{3%?a=$uOu%+V;9jZa5_aILXS1GejdEDY%oW!w&5528VD+u2eEtpPJ4A;ai2p- zvXGDS-)4`iq9&$Md}ppgH~g%<7oW|zOZm$`N-5w?T0XMS6x$}I zld!~c6?&&XK&a(i85W)FX{~C6GVMZCzApPg_+V*qF(LiWT?Qnq5&Zt;0d*?H{otLT z)UmmgY?bb0B1citf;0TqrAQBU{%dePW2EP8fPAPqB z@|T)$hFdV9Sdkw>>;Lq}`K(ZD?<)85>IzM5xnZ@iqVa~Q@?$Nm83QXUunRc2hRsSr z;=BP<6I1K|xcJ(%56w|e)Ry|vjl0!6`@;9;NC09Un5N19FTbHl;Prek?33m(9QQsY ztOBNR825(BRO!;FCmR96aoB1ZAo5_xsXJq!(dElD{KQI3Dub^yq2B;AK|kJu!Nc&< zukE$4{F1JN`R<2s$C=;V13P=3%?2N>zjANWZ>)CqhzNK#d!$t}XXo@tnsXPCj;^mP z?)e1md#I&;3=+*ReYqE~k#yL%U3)Uz+brq%D~<7X)2k@6B);2UUs$dAX1%U71^2im zH_ec)tm^18cBZWLJg<a=%7@b9${bK_-o3M6r*k!ud9SJu4*j}bk-$1?~ z0DPC2Tdx`4CLKcZl8*K`U-HETGholVclHefvj{nWe_&EjPPqQ**vpxUomba^WT1Pt zSC?y*hU;NHaYcV%u~8#TrR9&5TikE&SGU+qjEaU3o*Mh_x&M222=Rj?BiKv1ld=Ye zYQq;0)=^|+Mb`?R=Z(F7Tc*ycypXH^w)bIM*CJ!a5>C%KGGVuy=hON$mFTu zvT{lZ&;nDESJt!rn%cXPw5|n7F-N$bt=wzKUB}!NXXg}h z_6x{2+!S>Y>23(lSjdl3imu@W|)@X0sl97dO z=fl|m9qG82vnkdrDV;9aD(yS1SlMC0$5|&HahhrYnl2{;SLjo>)?M>hnhy;AL0l+@ zWVS|wStiX?Jb+xAO-ce;4}3?7MjurjC zs@2U}s{co|Uj4oQ$8YlUBH8~#&-tI<1Y~QyQeUrBAJYV6>tD7Bh<5i_+?OK?TaC7L zg}iW;=~Wg(rzm*a+!yFEtwKGwn~v^hvy_4-{R-Y(gxGrCx#K8 zjyyJ*u2+NUEr{qkE4b&jN04Ok2?GH257MN+9Fm@c20?5E02$WEm@eBJNn28jf)~_| zrIdqC4^z;R?nY+J<#>kZd_;CiFZ1wr9M3rZ4AGXdWFlhHa&m)s2ehE|uw}{upmBhU zRPM&k8ofSnF;!)L=xEH{&AEJsA73d!eX+W{0L)Qqgk~9mkW7x3??}p>ib*Ro_wcnrvH18e= zgk14BtZi~%4>)~suN1+wD6G*bljlESyU`*L@Ti=Iy&qohja@SK- zfGI-{65YP$6BO3b?Qfx{Yo(^!=L0SvRi$XNKm?!H8MvoX9eKTV5Mv)`+kG{qtNeL9 z8j_s_0M(<01dO8W-!<62S>;i^7 z?YBIhUZ-xvTB6?cTG-9KwfaDo&T!2mnh`e;GV-XOEObCKtgWBK(kT9t)}pS<7>&#P zop)_jN)7)MYRjGI47h9d_JPHuW9`**tajfwO_ZnI=hDii4vk*PIFe|FI~d-1J*Eww zv#s8tiqrMDEb_hIX>F~18Pk5$z^g?V)H1G

&K)b9CN03y)9E@~(Fr7BB+>wP@aX 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 z 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 diff --git a/macusbfb/LICENSE b/macusbfb/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/macusbfb/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/macusbfb/Makefile b/macusbfb/Makefile new file mode 100644 index 0000000..ec8ddc0 --- /dev/null +++ b/macusbfb/Makefile @@ -0,0 +1,95 @@ +########################################################################## +# User configuration and firmware specific object files +########################################################################## + +# The target, flash and ram of the LPC1xxx microprocessor. +# Use for the target the value: LPC11xx, LPC13xx or LPC17xx +TARGET = LPC13xx +FLASH = 32K +SRAM = 8K + +# For USB support the LPC1xxx reserves 384 bytes from the sram, +# if you don't want to use the USB features, just use 0 here. +SRAM_USB = 384 + +VPATH = +OBJS = main.o debug.o font_8x8.o usb.o + +########################################################################## +# Library files +########################################################################## +VPATH += core core/cpu +VPATH += core/systick +VPATH += core/libc core/wdt +OBJS += cpu.o systick.o +OBJS += stdio.o string.o +OBJS += sysinit.o + +########################################################################## +# GNU GCC compiler prefix and location +########################################################################## +CROSS_COMPILE = arm-elf- +AS = $(CROSS_COMPILE)gcc +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)gcc +SIZE = $(CROSS_COMPILE)size +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +OUTFILE = firmware + +########################################################################## +# Startup files +########################################################################## + +LD_PATH = lpc1xxx +LD_SCRIPT = $(LD_PATH)/linkscript.ld +LD_TEMP = $(LD_PATH)/memory.ld + +ifeq (LPC11xx,$(TARGET)) + CORTEX_TYPE=m0 +else + CORTEX_TYPE=m3 +endif + +CPU_TYPE = cortex-$(CORTEX_TYPE) +VPATH += lpc1xxx +OBJS += $(TARGET)_handlers.o LPC1xxx_startup.o + +########################################################################## +# Compiler settings, parameters and flags +########################################################################## +# +CFLAGS = -c -Os -I. -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -DTARGET=$(TARGET) -fno-builtin -g +ASFLAGS = -c -Os -I. -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -D__ASSEMBLY__ -x assembler-with-cpp -g +LDFLAGS = -Wl,--gc-sections -mthumb -g +OCFLAGS = --strip-unneeded + +all: firmware + ../checksum/checksum firmware.bin +#Enable this to write to the firmware to the lpc. Change sdx in wherever your lpc +#shows up. +# sudo rmmod macusbfb || true +# while [ ! -e /dev/sdx ]; do sleep 1; done; sudo mcopy -o -i /dev/sdx firmware.bin ::/; sudo blockdev --flushbufs /dev/sdx + +%.o : %.c + $(CC) $(CFLAGS) -o $@ $< + +%.o : %.s + $(AS) $(ASFLAGS) -o $@ $< + +firmware: $(OBJS) $(SYS_OBJS) + -@echo "MEMORY" > $(LD_TEMP) + -@echo "{" >> $(LD_TEMP) + -@echo " flash(rx): ORIGIN = 0x00000000, LENGTH = $(FLASH)" >> $(LD_TEMP) + -@echo " sram(rwx): ORIGIN = 0x10000000+$(SRAM_USB), LENGTH = $(SRAM)-$(SRAM_USB)" >> $(LD_TEMP) + -@echo "}" >> $(LD_TEMP) + -@echo "INCLUDE $(LD_SCRIPT)" >> $(LD_TEMP) + $(LD) $(LDFLAGS) -T $(LD_TEMP) -o $(OUTFILE).elf $(OBJS) + -@echo "" + $(SIZE) $(OUTFILE).elf + -@echo "" + $(OBJCOPY) $(OCFLAGS) -O binary $(OUTFILE).elf $(OUTFILE).bin + $(OBJCOPY) $(OCFLAGS) -O ihex $(OUTFILE).elf $(OUTFILE).hex + +clean: + rm -f $(OBJS) $(LD_TEMP) $(OUTFILE).elf $(OUTFILE).bin $(OUTFILE).hex diff --git a/macusbfb/asm_routines.s b/macusbfb/asm_routines.s new file mode 100644 index 0000000..234faa1 --- /dev/null +++ b/macusbfb/asm_routines.s @@ -0,0 +1,41 @@ + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .section ".text" + .thumb + + .global _start + .type _start, %function +_start: + +/* fill .bss with 0 using byte stores */ + ldr r0, =_bss + ldr r1, =_ebss + mov r2, #0 +.L0: + strb r2, [r0], #1 + cmp r0, r1 + bcc.n .L0 + +/* copy initialized .data from rom to ram */ + ldr r0, =_data + ldr r1, =_edata + ldr r2, =_ldata +.L1: + ldrb r3, [r2], #1 + strb r3, [r0], #1 + cmp r0, r1 + bcc.n .L1 + +/* branch to main */ + ldr r0, =main+1 + bx r0 + .size _start, .-_start + + + .section ".CRP._0x02FC","a",%progbits + .globl CRP_Key +CRP_Key: + .word 0xFFFFFFFF + + .end diff --git a/macusbfb/build/codelite/LPC1343 Workspace.tags b/macusbfb/build/codelite/LPC1343 Workspace.tags new file mode 100644 index 0000000000000000000000000000000000000000..97df34dba68f9503a33ee3306a4b28a21bc69486 GIT binary patch literal 3762176 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 z�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

  • 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

    Wsk1SCzdqLT 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%0A!q$g2Xl0upNL$Q8IM79lq;- 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%0DH*X2g< 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 WK&u6)UVx4hpfv*2AV7@*)FeR70@NZv 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

    i))7Q)7uFka? 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�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

    F1FYTX}T>sqXAEc#TT)zbsL0K9qLZ<-x4*k>4< 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 literal 0 HcmV?d00001 diff --git a/macusbfb/build/codelite/LPC1343 Workspace.workspace b/macusbfb/build/codelite/LPC1343 Workspace.workspace new file mode 100644 index 0000000..f676a7d --- /dev/null +++ b/macusbfb/build/codelite/LPC1343 Workspace.workspace @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/macusbfb/build/codelite/LPC1343 Workspace.workspace.session b/macusbfb/build/codelite/LPC1343 Workspace.workspace.session new file mode 100644 index 0000000..6efcc9f --- /dev/null +++ b/macusbfb/build/codelite/LPC1343 Workspace.workspace.session @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macusbfb/build/codelite/LPC1343_CodeBase.project b/macusbfb/build/codelite/LPC1343_CodeBase.project new file mode 100644 index 0000000..f2d1f28 --- /dev/null +++ b/macusbfb/build/codelite/LPC1343_CodeBase.project @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # Make sure that we are using SWD +monitor interface SWD +# Set monitor speed +monitor speed 1000 +# Set device ID to LPC1343 +monitor flash device = LPC1343 +# Set monitor to little endian +monitor endian little +# Enable flash download +monitor flash download = 1 + +# Transfer the firmware to the device +load "../../firmware.elf" + +# Reset device and start execution +monitor reset + + + + + lpcrc firmware.bin + + + + make clean + make + + + + None + $(WorkspacePath)/../../ + + + + + + + + + + + + + + + + + + + + + + make clean + make + + + + None + $(WorkspacePath) + + + + + + + + + + + + + + + + + diff --git a/macusbfb/build/codelite/tags b/macusbfb/build/codelite/tags new file mode 100644 index 0000000..e8976b0 --- /dev/null +++ b/macusbfb/build/codelite/tags @@ -0,0 +1,4 @@ +rx_data C:\Documents and Settings\Kevin\My Documents\My Dropbox\microBuilder\Code\LPC1343\LPC1343_CodeBase\main.c /^static chb_rx_data_t rx_data;$/;" variable line:66 +main C:\Documents and Settings\Kevin\My Documents\My Dropbox\microBuilder\Code\LPC1343\LPC1343_CodeBase\main.c /^int main (void)$/;" function line:70 signature:(void) returns:int +__putchar C:\Documents and Settings\Kevin\My Documents\My Dropbox\microBuilder\Code\LPC1343\LPC1343_CodeBase\main.c /^void __putchar(char c) $/;" function line:186 signature:(char c) returns:void +puts C:\Documents and Settings\Kevin\My Documents\My Dropbox\microBuilder\Code\LPC1343\LPC1343_CodeBase\main.c /^int puts ( const char * str )$/;" function line:191 signature:( const char * str ) returns:int diff --git a/macusbfb/build/crossworks/LPC1343_CodeBase.hzp b/macusbfb/build/crossworks/LPC1343_CodeBase.hzp new file mode 100644 index 0000000..a8941d4 --- /dev/null +++ b/macusbfb/build/crossworks/LPC1343_CodeBase.hzp @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macusbfb/build/crossworks/LPC1343_CodeBase.hzs b/macusbfb/build/crossworks/LPC1343_CodeBase.hzs new file mode 100644 index 0000000..e2b2073 --- /dev/null +++ b/macusbfb/build/crossworks/LPC1343_CodeBase.hzs @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macusbfb/build/crossworks/flash_placement.xml b/macusbfb/build/crossworks/flash_placement.xml new file mode 100644 index 0000000..963e460 --- /dev/null +++ b/macusbfb/build/crossworks/flash_placement.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macusbfb/checksum/Makefile b/macusbfb/checksum/Makefile new file mode 100644 index 0000000..b859c2b --- /dev/null +++ b/macusbfb/checksum/Makefile @@ -0,0 +1,3 @@ + +checksum: main.o + gcc -o checksum main.o \ No newline at end of file diff --git a/macusbfb/checksum/main.c b/macusbfb/checksum/main.c new file mode 100644 index 0000000..ac2dbe8 --- /dev/null +++ b/macusbfb/checksum/main.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include + +int main(int argc, char** argv) { + int fd; + unsigned char* file; + int i; + unsigned long ivt_CRC; + + if (argc!=2) { + printf("Usage: %s file.bin\n"); + exit(0); + } + + fd=open(argv[1], O_RDWR); + if (fd<0) { + perror("opening file"); + exit(1); + } + file=(char*)mmap(NULL, 1024, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); + if (file==(unsigned char*)-1) { + perror("mmap"); + exit(1); + } + + ivt_CRC = 0; + /* Calculate a native checksum of the little endian vector table: */ + for(i = 0; i < (7*4);) { + ivt_CRC += file[i++]; + ivt_CRC += file[i++] << 8; + ivt_CRC += file[i++] << 16; + ivt_CRC += file[i++] << 24; + } + /* Negate the result and place in the vector at 0x14 as little endian + * again. The resulting vector table should checksum to 0. */ + ivt_CRC = (unsigned long)-ivt_CRC; + for(i = 0; i < 4; i++) { + file[i + (7*4)] = (unsigned char)(ivt_CRC >> (8 * i)); + } + + + /* Check checksum: */ + ivt_CRC = 0; + for(i = 0; i < (0x20);) { + ivt_CRC += file[i++]; + ivt_CRC += file[i++] << 8; + ivt_CRC += file[i++] << 16; + ivt_CRC += file[i++] << 24; + } + printf("Checksum over vector table now is %lu.\n",ivt_CRC); + + + munmap(file, 1024); + close(fd); +} + diff --git a/macusbfb/core/adc/adc.c b/macusbfb/core/adc/adc.c new file mode 100644 index 0000000..d6e5afb --- /dev/null +++ b/macusbfb/core/adc/adc.c @@ -0,0 +1,188 @@ +/**************************************************************************/ +/*! + @file adc.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section Description + + SW-based single-channel A/D conversion. If you wish to convert + multiple ADC channels simultaneously, this code will need to be + modified to work in BURST mode. + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "core/adc/adc.h" + + void main (void) + { + cpuInit(); + adcInit(); + + uint32_t results = 0; + while(1) + { + // Get A/D conversion results from A/D channel 0 + results = adcRead(0); + } + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ +/**************************************************************************/ + +#include "adc.h" + +/**************************************************************************/ +/*! + @brief Returns the conversion results on the specified ADC channel. + + This function will manually start an A/D conversion on a single + channel and return the results. + + @param[in] channelNum + The A/D channel [0..7] that will be used during the A/D + conversion. (Note that only A/D channel's 0..3 are + configured by default in adcInit.) + + @return 0 if an overrun error occured, otherwise a 10-bit value + containing the A/D conversion results. + @warning Only AD channels 0..3 are configured for A/D in adcInit. + If you wish to use A/D pins 4..7 they will also need to + be added to the adcInit function. +*/ +/**************************************************************************/ +uint32_t adcRead (uint8_t channelNum) +{ + uint32_t regVal, adcData; + + /* make sure that channel number is 0..7 */ + if ( channelNum >= 8 ) + { + // ToDo: Change this to throw an exception back + channelNum = 0; + } + + /* deselect all channels */ + ADC_AD0CR &= ~ADC_AD0CR_SEL_MASK; + + /* switch channel and start converting */ + ADC_AD0CR |= (ADC_AD0CR_START_STARTNOW | (1 << channelNum)); + + /* wait until end of A/D convert */ + while ( 1 ) + { + // Get data register results for the requested channel + regVal = (*(pREG32(ADC_AD0DR0))); // + (4 * channelNum); + + /* read result of A/D conversion */ + if (regVal & ADC_DR_DONE) + { + break; + } + } + + /* stop ADC */ + ADC_AD0CR &= ~ADC_AD0CR_START_MASK; + + /* return 0 if an overrun occurred */ + if ( regVal & ADC_DR_OVERRUN ) + { + return (0); + } + + /* return conversion results */ + adcData = (regVal >> 6) & 0x3FF; + return (adcData); +} + +/**************************************************************************/ +/*! + @brief Initialises the A/D converter and configures channels 0..3 + for 10-bit, SW-controlled A/D conversion. + + @return Nothing +*/ +/**************************************************************************/ +void adcInit (void) +{ + /* Disable Power down bit to the ADC block. */ + SCB_PDRUNCFG &= ~(SCB_PDRUNCFG_ADC); + + /* Enable AHB clock to the ADC. */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_ADC); + + /* Digital pins need to have the 'analog' bit set in addition + to changing their pin function */ + + /* Set AD0 to analog input */ + IOCON_JTAG_TDI_PIO0_11 &= ~(IOCON_JTAG_TDI_PIO0_11_ADMODE_MASK | + IOCON_JTAG_TDI_PIO0_11_FUNC_MASK | + IOCON_JTAG_TDI_PIO0_11_MODE_MASK); + IOCON_JTAG_TDI_PIO0_11 |= (IOCON_JTAG_TDI_PIO0_11_FUNC_AD0 & + IOCON_JTAG_TDI_PIO0_11_ADMODE_ANALOG); + + /* Set AD1 to analog input */ + IOCON_JTAG_TMS_PIO1_0 &= ~(IOCON_JTAG_TMS_PIO1_0_ADMODE_MASK | + IOCON_JTAG_TMS_PIO1_0_FUNC_MASK | + IOCON_JTAG_TMS_PIO1_0_MODE_MASK); + IOCON_JTAG_TMS_PIO1_0 |= (IOCON_JTAG_TMS_PIO1_0_FUNC_AD1 & + IOCON_JTAG_TMS_PIO1_0_ADMODE_ANALOG); + + /* Set AD2 to analog input */ + IOCON_JTAG_TDO_PIO1_1 &= ~(IOCON_JTAG_TDO_PIO1_1_ADMODE_MASK | + IOCON_JTAG_TDO_PIO1_1_FUNC_MASK | + IOCON_JTAG_TDO_PIO1_1_MODE_MASK); + IOCON_JTAG_TDO_PIO1_1 |= (IOCON_JTAG_TDO_PIO1_1_FUNC_AD2 & + IOCON_JTAG_TDO_PIO1_1_ADMODE_ANALOG); + + /* Set AD3 to analog input */ + IOCON_JTAG_nTRST_PIO1_2 &= ~(IOCON_JTAG_nTRST_PIO1_2_ADMODE_MASK | + IOCON_JTAG_nTRST_PIO1_2_FUNC_MASK | + IOCON_JTAG_nTRST_PIO1_2_MODE_MASK); + IOCON_JTAG_nTRST_PIO1_2 |= (IOCON_JTAG_nTRST_PIO1_2_FUNC_AD3 & + IOCON_JTAG_nTRST_PIO1_2_ADMODE_ANALOG); + + /* Note that in SW mode only one channel can be selected at a time (AD0 in this case) + To select multiple channels, ADC_AD0CR_BURST_HWSCANMODE must be used */ + ADC_AD0CR = (ADC_AD0CR_SEL_AD0 | /* SEL=1,select channel 0 on ADC0 */ + (((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 1000000 - 1 ) << 8) | /* CLKDIV = Fpclk / 1000000 - 1 */ + ADC_AD0CR_BURST_SWMODE | /* BURST = 0, no BURST, software controlled */ + ADC_AD0CR_CLKS_10BITS | /* CLKS = 0, 11 clocks/10 bits */ + ADC_AD0CR_START_NOSTART | /* START = 0 A/D conversion stops */ + ADC_AD0CR_EDGE_RISING); /* EDGE = 0 (CAP/MAT signal falling, trigger A/D conversion) */ + + return; +} diff --git a/macusbfb/core/adc/adc.h b/macusbfb/core/adc/adc.h new file mode 100644 index 0000000..e2588a9 --- /dev/null +++ b/macusbfb/core/adc/adc.h @@ -0,0 +1,47 @@ +/**************************************************************************/ +/*! + @file adc.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/**************************************************************************/ + +#ifndef _ADC_H_ +#define _ADC_H_ + +#include "projectconfig.h" + +uint32_t adcRead (uint8_t channelNum); +void adcInit (void); + +#endif diff --git a/macusbfb/core/cmd/cmd.c b/macusbfb/core/cmd/cmd.c new file mode 100644 index 0000000..3685bb1 --- /dev/null +++ b/macusbfb/core/cmd/cmd.c @@ -0,0 +1,260 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. +*******************************************************************/ + +/**************************************************************************/ +/*! + @file cmd.c + @author Christopher Wang (Freaklabs) + Modified by: K. Townsend (microBuilder.eu) + @date 19 May 2010 + + Original code taken from the FreakUSB Open Source USB Device Stack + http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html + + If it works well, you can thank Akiba at Freaklabs. If it fails + miserably, you can blame me (since parts of it it were rather + ungraciously modified). :-) + +*/ +/**************************************************************************/ + +#include +#include + +#include "cmd.h" +#include "cmd_tbl.h" + +#ifdef CFG_PRINTF_UART +#include "core/uart/uart.h" +#endif + +#ifdef CFG_PRINTF_USBCDC + #include "core/usbcdc/cdcuser.h" + static char usbcdcBuf [32]; +#endif + +static uint8_t msg[CFG_INTERFACE_MAXMSGSIZE]; +static uint8_t *msg_ptr; + +/**************************************************************************/ +/*! + @brief Polls the relevant incoming message queue to see if anything + is waiting to be processed. +*/ +/**************************************************************************/ +void cmdPoll() +{ + #if defined CFG_PRINTF_UART + while (uartRxBufferDataPending()) + { + uint8_t c = uartRxBufferRead(); + cmdRx(c); + } + #endif + + #if defined CFG_PRINTF_USBCDC + int numBytesToRead, numBytesRead, numAvailByte; + + CDC_OutBufAvailChar (&numAvailByte); + if (numAvailByte > 0) + { + numBytesToRead = numAvailByte > 32 ? 32 : numAvailByte; + numBytesRead = CDC_RdOutBuf (&usbcdcBuf[0], &numBytesToRead); + int i; + for (i = numBytesToRead; i > 0; --i) + { + cmdRx(usbcdcBuf[i-1]); + } + } + #endif +} + +/**************************************************************************/ +/*! + @brief Handles a single incoming character. If a new line is + detected, the entire command will be passed to the command + parser. If a text character is detected, it will be added to + the message buffer until a new line is detected (up to the + maximum queue size, CFG_INTERFACE_MAXMSGSIZE). + + @param[in] c + The character to parse. +*/ +/**************************************************************************/ +void cmdRx(uint8_t c) +{ + // read out the data in the buffer and echo it back to the host. + switch (c) + { + case '\r': + case '\n': + // terminate the msg and reset the msg ptr. then send + // it to the handler for processing. + *msg_ptr = '\0'; + printf("%s", CFG_INTERFACE_NEWLINE); + cmdParse((char *)msg); + msg_ptr = msg; + break; + + case '\b': + printf("%c",c); + if (msg_ptr > msg) + { + msg_ptr--; + } + break; + + default: + printf("%c",c); + *msg_ptr++ = c; + break; + } +} + +/**************************************************************************/ +/*! + @brief Displays the command prompt. The text that appears is defined + in projectconfig.h. +*/ +/**************************************************************************/ +static void cmdMenu() +{ + printf(CFG_INTERFACE_NEWLINE); + printf(CFG_INTERFACE_PROMPT); +} + +/**************************************************************************/ +/*! + @brief Parse the command line. This function tokenizes the command + input, then searches for the command table entry associated + with the commmand. Once found, it will jump to the + corresponding function. + + @param[in] cmd + The entire command string to be parsed +*/ +/**************************************************************************/ +void cmdParse(char *cmd) +{ + size_t argc, i = 0; + char *argv[30]; + + argv[i] = strtok(cmd, " "); + do + { + argv[++i] = strtok(NULL, " "); + } while ((i < 30) && (argv[i] != NULL)); + + argc = i; + for (i=0; i < CMD_COUNT; i++) + { + if (!strcmp(argv[0], cmd_tbl[i].command)) + { + if ((argc == 2) && !strcmp (argv [1], "?")) + { + // Display paramter help menu on 'command ?' + printf ("%s%s%s", cmd_tbl[i].description, CFG_INTERFACE_NEWLINE, CFG_INTERFACE_NEWLINE); + printf ("%s%s", cmd_tbl[i].parameters, CFG_INTERFACE_NEWLINE); + } + else if ((argc - 1) < cmd_tbl[i].minArgs) + { + // Too few arguments supplied + printf ("Too few arguments to command (%d expected)%s", cmd_tbl[i].minArgs, CFG_INTERFACE_NEWLINE); + } + else if ((argc - 1) > cmd_tbl[i].maxArgs) + { + // Too many arguments supplied + printf ("Too many arguments to command (%d maximum)%s", cmd_tbl[i].maxArgs, CFG_INTERFACE_NEWLINE); + } + else + { + // Dispatch command to the appropriate function + cmd_tbl[i].func(argc - 1, &argv [1]); + } + + // Refresh the command prompt + cmdMenu(); + return; + } + } + printf("Command not recognized: '%s'%s", cmd, CFG_INTERFACE_NEWLINE); + + cmdMenu(); +} + +/**************************************************************************/ +/*! + @brief Initialises the command line using the appropriate interface +*/ +/**************************************************************************/ +void cmdInit() +{ + #if defined CFG_INTERFACE && defined CFG_INTERFACE_UART + // Check if UART is already initialised + uart_pcb_t *pcb = uartGetPCB(); + if (!pcb->initialised) + { + uartInit(CFG_UART_BAUDRATE); + } + #endif + + // init the msg ptr + msg_ptr = msg; + + // Show the menu + cmdMenu(); +} + +/**************************************************************************/ +/*! + 'help' command handler +*/ +/**************************************************************************/ +void cmd_help(uint8_t argc, char **argv) +{ + size_t i; + + printf("Command Description%s", CFG_INTERFACE_NEWLINE); + printf("------- -----------%s", CFG_INTERFACE_NEWLINE); + + // Display full command list + for (i=0; i < CMD_COUNT; i++) + { + if (!cmd_tbl[i].hidden) + { + printf ("%-20s %s%s", cmd_tbl[i].command, cmd_tbl[i].description, CFG_INTERFACE_NEWLINE); + } + } + + printf("%sCommand parameters can be seen by entering: ?%s", CFG_INTERFACE_NEWLINE, CFG_INTERFACE_NEWLINE); +} diff --git a/macusbfb/core/cmd/cmd.h b/macusbfb/core/cmd/cmd.h new file mode 100644 index 0000000..b16a1e3 --- /dev/null +++ b/macusbfb/core/cmd/cmd.h @@ -0,0 +1,60 @@ +/**************************************************************************/ +/*! + @file cmd.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef __CMD_H__ +#define __CMD_H__ + +#include "projectconfig.h" + +typedef struct +{ + char *command; + uint8_t minArgs; + uint8_t maxArgs; + uint8_t hidden; + void (*func)(uint8_t argc, char **argv); + const char *description; + const char *parameters; +} cmd_t; + +void cmdPoll(); +void cmdRx(uint8_t c); +void cmdParse(char *cmd); +void cmdInit(); + +#endif \ No newline at end of file diff --git a/macusbfb/core/cpu/cpu.c b/macusbfb/core/cpu/cpu.c new file mode 100644 index 0000000..a9db00c --- /dev/null +++ b/macusbfb/core/cpu/cpu.c @@ -0,0 +1,191 @@ +/**************************************************************************/ +/*! + @file cpu.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Initialises the CPU and any core clocks. By default, the core clock + is set to run at 72MHz. In order to reduce power consumption all pins + are set to GPIO and input by cpuInit. + + @section EXAMPLE + @code + #include "lpc134x.h" + #include "core/cpu/cpu.h" + + int main (void) + { + // Initialise the CPU and setup the PLL + cpuInit(); + + while(1) + { + } + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "cpu.h" +#include "core/gpio/gpio.h" + +/**************************************************************************/ +/*! + @brief Configures the main clock/PLL + + The speed at which the MCU operates is set here using the SCB_PLLCTRL + register, and the SCB_PLLCLKSEL register can be used to select which + oscillator to use to generate the system clocks (the internal 12MHz + oscillator or an external crystal). + + @param[in] multiplier + The PLL multiplier + +*/ +/**************************************************************************/ +void cpuPllSetup (cpuMultiplier_t multiplier) +{ + uint32_t i; + + // Power up system oscillator + SCB_PDRUNCFG &= ~(SCB_PDRUNCFG_SYSOSC_MASK); + + // Setup the crystal input (bypass disabled, 1-20MHz crystal) + SCB_SYSOSCCTRL = (SCB_SYSOSCCTRL_BYPASS_DISABLED | SCB_SYSOSCCTRL_FREQRANGE_1TO20MHZ); + + for (i = 0; i < 200; i++) + { + __asm volatile ("NOP"); + } + + // Configure PLL + SCB_PLLCLKSEL = SCB_CLKSEL_SOURCE_MAINOSC; // Select external crystal as PLL clock source + SCB_PLLCLKUEN = SCB_PLLCLKUEN_UPDATE; // Update clock source + SCB_PLLCLKUEN = SCB_PLLCLKUEN_DISABLE; // Toggle update register once + SCB_PLLCLKUEN = SCB_PLLCLKUEN_UPDATE; // Update clock source again + + // Wait until the clock is updated + while (!(SCB_PLLCLKUEN & SCB_PLLCLKUEN_UPDATE)); + + // Set clock speed + switch (multiplier) + { + case CPU_MULTIPLIER_2: + SCB_PLLCTRL = (SCB_PLLCTRL_MULT_2 | (1 << SCB_PLLCTRL_DIV_BIT)); + break; + case CPU_MULTIPLIER_3: + SCB_PLLCTRL = (SCB_PLLCTRL_MULT_3 | (1 << SCB_PLLCTRL_DIV_BIT)); + break; + case CPU_MULTIPLIER_4: + SCB_PLLCTRL = (SCB_PLLCTRL_MULT_4 | (1 << SCB_PLLCTRL_DIV_BIT)); + break; + case CPU_MULTIPLIER_5: + SCB_PLLCTRL = (SCB_PLLCTRL_MULT_5 | (1 << SCB_PLLCTRL_DIV_BIT)); + break; + case CPU_MULTIPLIER_6: + SCB_PLLCTRL = (SCB_PLLCTRL_MULT_6 | (1 << SCB_PLLCTRL_DIV_BIT)); + break; + case CPU_MULTIPLIER_1: + default: + SCB_PLLCTRL = (SCB_PLLCTRL_MULT_1 | (1 << SCB_PLLCTRL_DIV_BIT)); + break; + } + + // Enable system PLL + SCB_PDRUNCFG &= ~(SCB_PDRUNCFG_SYSPLL_MASK); + + // Wait for PLL to lock + while (!(SCB_PLLSTAT & SCB_PLLSTAT_LOCK)); + + // Setup main clock (use PLL output) + SCB_MAINCLKSEL = SCB_MAINCLKSEL_SOURCE_SYSPLLCLKOUT; + SCB_MAINCLKUEN = SCB_MAINCLKUEN_UPDATE; // Update clock source + SCB_MAINCLKUEN = SCB_MAINCLKUEN_DISABLE; // Toggle update register once + SCB_MAINCLKUEN = SCB_MAINCLKUEN_UPDATE; + + // Wait until the clock is updated + while (!(SCB_MAINCLKUEN & SCB_MAINCLKUEN_UPDATE)); + + // Disable USB clock by default (enabled in USB code) + SCB_PDRUNCFG |= (SCB_PDSLEEPCFG_USBPAD_PD); // Power-down USB PHY + SCB_PDRUNCFG |= (SCB_PDSLEEPCFG_USBPLL_PD); // Power-down USB PLL + + // Set system AHB clock + SCB_SYSAHBCLKDIV = SCB_SYSAHBCLKDIV_DIV1; + + // Enabled IOCON clock for I/O related peripherals + SCB_SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_IOCON; +} + +/**************************************************************************/ +/*! + @brief Initialises the CPU, setting up the PLL, etc. +*/ +/**************************************************************************/ +void cpuInit (void) +{ + + // Set all GPIO pins to input by default + GPIO_GPIO0DIR &= ~(GPIO_IO_ALL); + GPIO_GPIO1DIR &= ~(GPIO_IO_ALL); + GPIO_GPIO2DIR &= ~(GPIO_IO_ALL); + GPIO_GPIO3DIR &= ~(GPIO_IO_ALL); + + // Setup PLL (etc.) + cpuPllSetup(CPU_MULTIPLIER_6); +} + +/**************************************************************************/ +/*! + @brief Get's the CPU Device ID +*/ +/**************************************************************************/ +cpuDeviceID_t cpuGetDeviceID (void) +{ + switch (SCB_DEVICEID) + { + case (SCB_DEVICEID_LPC1311FHN33): + return cpuDeviceID_LPC1311; + case (SCB_DEVICEID_LPC1313FHN33): + return cpuDeviceID_LPC1313; + case (SCB_DEVICEID_LPC1342FHN33): + return cpuDeviceID_LPC1342; + case (SCB_DEVICEID_LPC1343FHN33): + return cpuDeviceID_LPC1343; + default: + return cpuDeviceID_Unknown; + } + return cpuDeviceID_Unknown; +} diff --git a/macusbfb/core/cpu/cpu.h b/macusbfb/core/cpu/cpu.h new file mode 100644 index 0000000..fbb764d --- /dev/null +++ b/macusbfb/core/cpu/cpu.h @@ -0,0 +1,79 @@ +/**************************************************************************/ +/*! + @file cpu.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _CPU_H_ +#define _CPU_H_ + +#include "projectconfig.h" + +/**************************************************************************/ +/*! + @brief Indicates the value for the PLL multiplier +*/ +/**************************************************************************/ +typedef enum +{ + CPU_MULTIPLIER_1 = 0, + CPU_MULTIPLIER_2, + CPU_MULTIPLIER_3, + CPU_MULTIPLIER_4, + CPU_MULTIPLIER_5, + CPU_MULTIPLIER_6 +} +cpuMultiplier_t; + +/**************************************************************************/ +/*! + @brief Indicates the value returned by the DEVICEID register +*/ +/**************************************************************************/ +typedef enum +{ + cpuDeviceID_Unknown = 0, + cpuDeviceID_LPC1311, + cpuDeviceID_LPC1313, + cpuDeviceID_LPC1342, + cpuDeviceID_LPC1343 +} +cpuDeviceID_t; + +void cpuPllSetup (cpuMultiplier_t multiplier); +void cpuInit (void); +cpuDeviceID_t cpuGetDeviceID (void); + +#endif \ No newline at end of file diff --git a/macusbfb/core/gpio/gpio.c b/macusbfb/core/gpio/gpio.c new file mode 100644 index 0000000..bf3c117 --- /dev/null +++ b/macusbfb/core/gpio/gpio.c @@ -0,0 +1,665 @@ +/**************************************************************************/ +/*! + @file gpio.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Controls the general purpose digital IO. + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "gpio.h" + +#ifdef CFG_CHIBI +#include "drivers/chibi/chb_drvr.h" +volatile uint32_t chibi_counter = 0; +#endif + +volatile uint32_t gpio0_counter = 0; +volatile uint32_t gpio1_counter = 0; +volatile uint32_t gpio2_counter = 0; +volatile uint32_t gpio3_counter = 0; +volatile uint32_t p0_1_counter = 0; +volatile uint32_t p1_1_counter = 0; +volatile uint32_t p2_1_counter = 0; +volatile uint32_t p3_1_counter = 0; + +/**************************************************************************/ +/*! + @brief IRQ Handler for GPIO port 0 (currently checks pin 0.1) +*/ +/**************************************************************************/ +void PIOINT0_IRQHandler(void) +{ + uint32_t regVal; + + gpio0_counter++; + + regVal = gpioIntStatus(0, 1); + if (regVal) + { + p0_1_counter++; + gpioIntClear(0, 1); + } + return; +} + +/**************************************************************************/ +/*! + @brief IRQ Handler for GPIO port 1 (currently checks pin 1.1) +*/ +/**************************************************************************/ +void PIOINT1_IRQHandler(void) +{ + uint32_t regVal; + + gpio1_counter++; + +#ifdef CFG_CHIBI + // Check for interrupt on 1.8 + regVal = gpioIntStatus(1, 8); + if (regVal) + { + chibi_counter++; + chb_ISR_Handler(); + gpioIntClear(1, 8); + } +#else + regVal = gpioIntStatus(1, 1); + if ( regVal ) + { + p1_1_counter++; + gpioIntClear(1, 1); + } +#endif + + return; +} + +/**************************************************************************/ +/*! + @brief IRQ Handler for GPIO port 2 (currently checks pin 2.1) +*/ +/**************************************************************************/ +void PIOINT2_IRQHandler(void) +{ + uint32_t regVal; + + gpio2_counter++; + regVal = gpioIntStatus(2, 1); + if ( regVal ) + { + p2_1_counter++; + gpioIntClear(2, 1); + } + return; +} + +/**************************************************************************/ +/*! + @brief IRQ Handler for GPIO port 3 (currently checks pin 3.1) +*/ +/**************************************************************************/ +void PIOINT3_IRQHandler(void) +{ + uint32_t regVal; + + gpio3_counter++; + regVal = gpioIntStatus(3, 1); + if ( regVal ) + { + p3_1_counter++; + gpioIntClear(3, 1); + } + return; +} + +/**************************************************************************/ +/*! + @brief Initialises GPIO and enables the GPIO interrupt + handler for all GPIO ports. +*/ +/**************************************************************************/ +void gpioInit (void) +{ + /* Enable AHB clock to the GPIO domain. */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_GPIO); + + /* Set up NVIC when I/O pins are configured as external interrupts. */ + NVIC_EnableIRQ(EINT0_IRQn); + NVIC_EnableIRQ(EINT1_IRQn); + NVIC_EnableIRQ(EINT2_IRQn); + NVIC_EnableIRQ(EINT3_IRQn); + return; +} + +/**************************************************************************/ +/*! + @brief Sets the direction (input/output) for a specific port pin + + @param[in] portNum + The port number (0..3) + @param[in] bitPos + The bit position (0..11) + @param[in] dir + The pin direction (gpioDirection_Input or + gpioDirection_Output) +*/ +/**************************************************************************/ +void gpioSetDir (uint32_t portNum, uint32_t bitPos, gpioDirection_t dir) +{ + switch (portNum) + { + case 0: + if (gpioDirection_Output == dir) + { + GPIO_GPIO0DIR |= (1 << bitPos); + } + else + { + GPIO_GPIO0DIR &= ~(1 << bitPos); + } + break; + case 1: + if (gpioDirection_Output == dir) + { + GPIO_GPIO1DIR |= (1 << bitPos); + } + else + { + GPIO_GPIO1DIR &= ~(1 << bitPos); + } + break; + case 2: + if (gpioDirection_Output == dir) + { + GPIO_GPIO2DIR |= (1 << bitPos); + } + else + { + GPIO_GPIO2DIR &= ~(1 << bitPos); + } + break; + case 3: + if (gpioDirection_Output == dir) + { + GPIO_GPIO3DIR |= (1 << bitPos); + } + else + { + GPIO_GPIO3DIR &= ~(1 << bitPos); + } + break; + } +} + +/**************************************************************************/ +/*! + @brief Gets the value for a specific port pin + + @param[in] portNum + The port number (0..3) + @param[in] bitPos + The bit position (0..31) + + @return The current value for the specified port pin (0..1) +*/ +/**************************************************************************/ +uint32_t gpioGetValue (uint32_t portNum, uint32_t bitPos) +{ + uint32_t value = 0; + + switch (portNum) + { + case 0: + value = (GPIO_GPIO0DATA & (1 << bitPos)) ? 1 : 0; + break; + case 1: + value = (GPIO_GPIO1DATA & (1 << bitPos)) ? 1 : 0; + break; + case 2: + value = (GPIO_GPIO2DATA & (1 << bitPos)) ? 1 : 0; + break; + case 3: + value = (GPIO_GPIO3DATA & (1 << bitPos)) ? 1 : 0; + break; + default: + break; + } + + return value; +} + +/**************************************************************************/ +/*! + @brief Sets the value for a specific port pin (only relevant when a + pin is configured as output). + + @param[in] portNum + The port number (0..3) + @param[in] bitPos + The bit position (0..31) + @param[in] bitValue + The value to set for the specified bit (0..1). 0 will set + the pin low and 1 will set the pin high. +*/ +/**************************************************************************/ +void gpioSetValue (uint32_t portNum, uint32_t bitPos, uint32_t bitVal) +{ + switch (portNum) + { + case 0: + if (1 == bitVal) + { + GPIO_GPIO0DATA |= (1 << bitPos); + } + else + { + GPIO_GPIO0DATA &= ~(1 << bitPos); + } + break; + case 1: + if (1 == bitVal) + { + GPIO_GPIO1DATA |= (1 << bitPos); + } + else + { + GPIO_GPIO1DATA &= ~(1 << bitPos); + } + break; + case 2: + if (1 == bitVal) + { + GPIO_GPIO2DATA |= (1 << bitPos); + } + else + { + GPIO_GPIO2DATA &= ~(1 << bitPos); + } + break; + case 3: + if (1 == bitVal) + { + GPIO_GPIO3DATA |= (1 << bitPos); + } + else + { + GPIO_GPIO3DATA &= ~(1 << bitPos); + } + break; + default: + break; + } +} + +/**************************************************************************/ +/*! + @brief Sets the interrupt sense, event, etc. + + @param[in] portNum + The port number (0..3) + @param[in] bitPos + The bit position (0..31) + @param[in] sense + Whether the interrupt should be configured as edge or level + sensitive. + @param[in] edge + Whether one edge or both trigger an interrupt. + @param[in] event + Whether the rising or the falling edge (high or low) + should be used to trigger the interrupt. + + @section Example + + @code + // Initialise gpio + gpioInit(); + // Set GPIO1.8 to input + gpioSetDir(1, 8, gpioDirection_Input); + // Disable the internal pullup/down resistor on P1.8 + gpioSetPullup (&IOCON_PIO1_8, gpioPullupMode_Inactive); + // Setup an interrupt on GPIO1.8 + gpioSetInterrupt(1, // Port + 8, // Pin + gpioInterruptSense_Edge, // Edge/Level Sensitive + gpioInterruptEdge_Single, // Single/Double Edge + gpioInterruptEvent_ActiveHigh); // Rising/Falling + // Enable the interrupt + gpioIntEnable(1, 8); + @endcode +*/ +/**************************************************************************/ +void gpioSetInterrupt (uint32_t portNum, uint32_t bitPos, gpioInterruptSense_t sense, gpioInterruptEdge_t edge, gpioInterruptEvent_t event) +{ + switch (portNum) + { + case 0: + if (gpioInterruptSense_Edge) + { + GPIO_GPIO0IS &= ~(0x1<= I2C_MAX_TIMEOUT ) + { + retVal = FALSE; + break; + } + timeout++; + } + return( retVal ); +} + +/***************************************************************************** +** Function name: I2CStop +** +** Descriptions: Set the I2C stop condition, if the routine +** never exit, it's a fatal bus error. +** +** parameters: None +** Returned value: true or never return +** +*****************************************************************************/ +uint32_t i2cStop( void ) +{ + I2C_I2CCONSET = I2C_I2CCONSET_STO; /* Set Stop flag */ + I2C_I2CCONCLR = I2C_I2CCONCLR_SIC; /* Clear SI flag */ + + /*--- Wait for STOP detected ---*/ + while( I2C_I2CCONSET & I2C_I2CCONSET_STO ); + return TRUE; +} + +/***************************************************************************** +** Function name: I2CInit +** +** Descriptions: Initialize I2C controller +** +** parameters: mode is I2CMODE_MASTER or I2CMODE_SLAVE +** Returned value: true or false, return false if the I2C +** interrupt handler was not installed correctly +** +*****************************************************************************/ +uint32_t i2cInit( i2cMode_t mode ) +{ + /* It seems to be bit0 is for I2C, different from + UM. To be retested along with SSP reset. SSP and I2C + reset are overlapped, a known bug, for now, both SSP + and I2C use bit 0 for reset enable. Once the problem + is fixed, change to "#if 1". */ +#if 1 + SCB_PRESETCTRL |= (0x1<<1); +#else + SCB_PRESETCTRL |= (0x1<<0); +#endif + + // Enable I2C clock + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_I2C); + + // Configure pin 0.4 for SCL + IOCON_PIO0_4 &= ~(IOCON_PIO0_4_FUNC_MASK | IOCON_PIO0_4_I2CMODE_MASK); + IOCON_PIO0_4 |= (IOCON_PIO0_4_FUNC_I2CSCL); + + // Configure pin 0.5 for SDA + IOCON_PIO0_5 &= ~(IOCON_PIO0_5_FUNC_MASK | IOCON_PIO0_5_I2CMODE_MASK); + IOCON_PIO0_5 |= IOCON_PIO0_5_FUNC_I2CSDA; + + // Clear flags + I2C_I2CCONCLR = I2C_I2CCONCLR_AAC | + I2C_I2CCONCLR_SIC | + I2C_I2CCONCLR_STAC | + I2C_I2CCONCLR_I2ENC; + + // See p.128 for appropriate values for SCLL and SCLH +#if I2C_FAST_MODE_PLUS + IOCON_PIO0_4 |= (IOCON_PIO0_4_I2CMODE_FASTPLUSI2C); + IOCON_PIO0_5 |= (IOCON_PIO0_5_I2CMODE_FASTPLUSI2C); + I2C_I2CSCLL = I2C_SCLL_HS_SCLL; + I2C_I2CSCLH = I2C_SCLH_HS_SCLH; +#else + I2C_I2CSCLL = I2C_SCLL_SCLL; + I2C_I2CSCLH = I2C_SCLH_SCLH; +#endif + + if ( mode == I2CMODE_SLAVE ) + { + I2C_I2CADR0 = I2C_SLAVEADDR; + } + + /* Enable the I2C Interrupt */ + NVIC_EnableIRQ(I2C_IRQn); + I2C_I2CCONSET = I2C_I2CCONSET_I2EN; + + return( TRUE ); +} + +/***************************************************************************** +** Function name: I2CEngine +** +** Descriptions: The routine to complete a I2C transaction +** from start to stop. All the intermitten +** steps are handled in the interrupt handler. +** Before this routine is called, the read +** length, write length, I2C master buffer, +** and I2C command fields need to be filled. +** see i2cmst.c for more details. +** +** parameters: None +** Returned value: true or false, return false only if the +** start condition can never be generated and +** timed out. +** +*****************************************************************************/ +uint32_t i2cEngine( void ) +{ + I2CMasterState = I2CSTATE_IDLE; + RdIndex = 0; + WrIndex = 0; + if ( i2cStart() != TRUE ) + { + i2cStop(); + return ( FALSE ); + } + + while ( 1 ) + { + if ( I2CMasterState == I2CSTATE_DATA_NACK ) + { + i2cStop(); + break; + } + } + return ( TRUE ); +} diff --git a/macusbfb/core/i2c/i2c.h b/macusbfb/core/i2c/i2c.h new file mode 100644 index 0000000..530f7b0 --- /dev/null +++ b/macusbfb/core/i2c/i2c.h @@ -0,0 +1,98 @@ +/**************************************************************************/ +/*! + @file i2c.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _I2C_H_ +#define _I2C_H_ + +#define I2C_FAST_MODE_PLUS 0 + +#define I2C_BUFSIZE 12 +#define I2C_MAX_TIMEOUT 0xFF + +#define I2C_SLAVEADDR 0xA0 + +#define I2C_SCLH_SCLH 0x00000180 /* I2C SCL Duty Cycle High Reg */ +#define I2C_SCLL_SCLL 0x00000180 /* I2C SCL Duty Cycle Low Reg */ +#define I2C_SCLH_HS_SCLH 0x00000030 /* Fast Plus I2C SCL Duty Cycle High Reg */ +#define I2C_SCLL_HS_SCLL 0x00000030 /* Fast Plus I2C SCL Duty Cycle Low Reg */ + +#include "projectconfig.h" + +typedef enum i2cMode_e +{ + I2CMODE_MASTER = 0x01, + I2CMODE_SLAVE = 0x02 +} +i2cMode_t; + +typedef enum i2cErr_e +{ + I2CERR_BUSERROR = 0x00, + I2CERR_STARTTX = 0x08, + I2CERR_REPEATEDSTARTTX = 0x10, + I2CERR_SLAWTX_ACKRX = 0x18, + I2CERR_SLAWTX_NACKRX = 0x20, + I2CERR_DATTX_ACKRX = 0x28, + I2CERR_DATTX_NACKRX = 0x30, + I2CERR_ARBLOST = 0x38, + I2CERR_SLARTX_ACKRX = 0x40, + I2CERR_SLARTX_NACKRX = 0x48, + I2CERR_DATRX_ACKTX = 0x50, + I2CERR_DATRX_NACKTX = 0x58, + I2CERR_NOINFO = 0xf8 +} +i2cErr_t; + +typedef enum i2cState_e +{ + I2CSTATE_IDLE = 0, + I2CSTATE_STARTED, + I2CSTATE_RESTARTED, + I2CSTATE_REPEATED_START, + I2CSTATE_DATA_ACK, + I2CSTATE_DATA_NACK +} +i2cState_t; + +extern void I2C_IRQHandler( void ); +extern uint32_t i2cInit( i2cMode_t mode ); +extern uint32_t i2cStart( void ); +extern uint32_t i2cStop( void ); +extern uint32_t i2cEngine( void ); + +#endif diff --git a/macusbfb/core/libc/stdio.c b/macusbfb/core/libc/stdio.c new file mode 100755 index 0000000..0ec7887 --- /dev/null +++ b/macusbfb/core/libc/stdio.c @@ -0,0 +1,475 @@ +/* + * Software License Agreement (BSD License) + * + * Based on original stdio.c released by Atmel + * Copyright (c) 2008, Atmel Corporation + * All rights reserved. + * + * Modified by Roel Verdult, Copyright (c) 2010 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +//------------------------------------------------------------------------------ +// Headers +//------------------------------------------------------------------------------ + +#include +#include +#include + +//------------------------------------------------------------------------------ +// Local Definitions +//------------------------------------------------------------------------------ + +// Maximum string size allowed (in bytes). +#define MAX_STRING_SIZE 100 + +//------------------------------------------------------------------------------ +// Global Variables +//------------------------------------------------------------------------------ + +// Required for proper compilation. +//struct _reent r = {0, (FILE*) 0, (FILE*) 1, (FILE*) 0}; +//struct _reent *_impure_ptr = &r; + +//------------------------------------------------------------------------------ +// Local Functions +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// Writes a character inside the given string. Returns 1. +// \param pStr Storage string. +// \param c Character to write. +//------------------------------------------------------------------------------ +signed int append_char(char *pStr, char c) +{ + *pStr = c; + return 1; +} + +//------------------------------------------------------------------------------ +// Writes a string inside the given string. +// Returns the size of the written +// string. +// \param pStr Storage string. +// \param pSource Source string. +//------------------------------------------------------------------------------ +signed int PutString(char *pStr, char fill, signed int width, const char *pSource) +{ + signed int num = 0; + + while (*pSource != 0) { + + *pStr++ = *pSource++; + num++; + } + + width -= num; + while (width > 0) { + + *pStr++ = fill; + num++; + width--; + } + + return num; +} + +//------------------------------------------------------------------------------ +// Writes an unsigned int inside the given string, using the provided fill & +// width parameters. +// Returns the size in characters of the written integer. +// \param pStr Storage string. +// \param fill Fill character. +// \param width Minimum integer width. +// \param value Integer value. +//------------------------------------------------------------------------------ +signed int PutUnsignedInt( + char *pStr, + char fill, + signed int width, + unsigned int value) +{ + signed int num = 0; + + // Take current digit into account when calculating width + width--; + + // Recursively write upper digits + if ((value / 10) > 0) { + + num = PutUnsignedInt(pStr, fill, width, value / 10); + pStr += num; + } + // Write filler characters + else { + + while (width > 0) { + + append_char(pStr, fill); + pStr++; + num++; + width--; + } + } + + // Write lower digit + num += append_char(pStr, (value % 10) + '0'); + + return num; +} + +//------------------------------------------------------------------------------ +// Writes a signed int inside the given string, using the provided fill & width +// parameters. +// Returns the size of the written integer. +// \param pStr Storage string. +// \param fill Fill character. +// \param width Minimum integer width. +// \param value Signed integer value. +//------------------------------------------------------------------------------ +signed int PutSignedInt( + char *pStr, + char fill, + signed int width, + signed int value) +{ + signed int num = 0; + unsigned int absolute; + + // Compute absolute value + if (value < 0) { + + absolute = -value; + } + else { + + absolute = value; + } + + // Take current digit into account when calculating width + width--; + + // Recursively write upper digits + if ((absolute / 10) > 0) { + + if (value < 0) { + + num = PutSignedInt(pStr, fill, width, -(absolute / 10)); + } + else { + + num = PutSignedInt(pStr, fill, width, absolute / 10); + } + pStr += num; + } + else { + + // Reserve space for sign + if (value < 0) { + + width--; + } + + // Write filler characters + while (width > 0) { + + append_char(pStr, fill); + pStr++; + num++; + width--; + } + + // Write sign + if (value < 0) { + + num += append_char(pStr, '-'); + pStr++; + } + } + + // Write lower digit + num += append_char(pStr, (absolute % 10) + '0'); + + return num; +} + +//------------------------------------------------------------------------------ +// Writes an hexadecimal value into a string, using the given fill, width & +// capital parameters. +// Returns the number of char written. +// \param pStr Storage string. +// \param fill Fill character. +// \param width Minimum integer width. +// \param maj Indicates if the letters must be printed in lower- or upper-case. +// \param value Hexadecimal value. +//------------------------------------------------------------------------------ +signed int PutHexa( + char *pStr, + char fill, + signed int width, + unsigned char maj, + unsigned int value) +{ + signed int num = 0; + + // Decrement width + width--; + + // Recursively output upper digits + if ((value >> 4) > 0) { + + num += PutHexa(pStr, fill, width, maj, value >> 4); + pStr += num; + } + // Write filler chars + else { + + while (width > 0) { + + append_char(pStr, fill); + pStr++; + num++; + width--; + } + } + + // Write current digit + if ((value & 0xF) < 10) { + + append_char(pStr, (value & 0xF) + '0'); + } + else if (maj) { + + append_char(pStr, (value & 0xF) - 10 + 'A'); + } + else { + + append_char(pStr, (value & 0xF) - 10 + 'a'); + } + num++; + + return num; +} + +//------------------------------------------------------------------------------ +// Global Functions +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +/// Stores the result of a formatted string into another string. Format +/// arguments are given in a va_list instance. +/// Return the number of characters written. +/// \param pStr Destination string. +/// \param length Length of Destination string. +/// \param pFormat Format string. +/// \param ap Argument list. +//------------------------------------------------------------------------------ +signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap) +{ + char fill; + unsigned char width; + signed int num = 0; + signed int size = 0; + + // Clear the string + if (pStr) { + + *pStr = 0; + } + + // Phase string + while (*pFormat != 0 && size < length) { + + // Normal character + if (*pFormat != '%') { + + *pStr++ = *pFormat++; + size++; + } + // Escaped '%' + else if (*(pFormat+1) == '%') { + + *pStr++ = '%'; + pFormat += 2; + size++; + } + // Token delimiter + else { + + fill = ' '; + width = 0; + pFormat++; + + // Parse filler + if (*pFormat == '0') { + + fill = '0'; + pFormat++; + } + + // Ignore justifier + if (*pFormat == '-') { + pFormat++; + } + + // Parse width + while ((*pFormat >= '0') && (*pFormat <= '9')) { + + width = (width*10) + *pFormat-'0'; + pFormat++; + } + + // Check if there is enough space + if (size + width > length) { + + width = length - size; + } + + // Parse type + switch (*pFormat) { + case 'd': + case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break; + case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break; + case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break; + case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break; + case 's': num = PutString(pStr, fill, width, va_arg(ap, char *)); break; + case 'c': num = append_char(pStr, va_arg(ap, unsigned int)); break; + default: + return EOF; + } + + pFormat++; + pStr += num; + size += num; + } + } + + // NULL-terminated (final \0 is not counted) + if (size < length) { + + *pStr = 0; + } + else { + + *(--pStr) = 0; + size--; + } + + return size; +} + +//------------------------------------------------------------------------------ +/// Stores the result of a formatted string into another string. Format +/// arguments are given in a va_list instance. +/// Return the number of characters written. +/// \param pString Destination string. +/// \param length Length of Destination string. +/// \param pFormat Format string. +/// \param ... Other arguments +//------------------------------------------------------------------------------ +signed int snprintf(char *pString, size_t length, const char *pFormat, ...) +{ + va_list ap; + signed int rc; + + va_start(ap, pFormat); + rc = vsnprintf(pString, length, pFormat, ap); + va_end(ap); + + return rc; +} + +//------------------------------------------------------------------------------ +/// Stores the result of a formatted string into another string. Format +/// arguments are given in a va_list instance. +/// Return the number of characters written. +/// \param pString Destination string. +/// \param pFormat Format string. +/// \param ap Argument list. +//------------------------------------------------------------------------------ +signed int vsprintf(char *pString, const char *pFormat, va_list ap) +{ + return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap); +} + +//------------------------------------------------------------------------------ +/// Outputs a formatted string on the DBGU stream. Format arguments are given +/// in a va_list instance. +/// \param pFormat Format string +/// \param ap Argument list. +//------------------------------------------------------------------------------ +signed int vprintf(const char *pFormat, va_list ap) +{ + char pStr[MAX_STRING_SIZE]; + char pError[] = "stdio.c: increase MAX_STRING_SIZE\r\n"; + + // Write formatted string in buffer + if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) { + + puts(pError); + while (1); // Increase MAX_STRING_SIZE + } + + // Display string + return puts(pStr); +} + +//------------------------------------------------------------------------------ +/// Outputs a formatted string on the DBGU stream, using a variable number of +/// arguments. +/// \param pFormat Format string. +//------------------------------------------------------------------------------ +signed int printf(const char *pFormat, ...) +{ + va_list ap; + signed int result; + + // Forward call to vprintf + va_start(ap, pFormat); + result = vprintf(pFormat, ap); + va_end(ap); + + return result; +} + + +//------------------------------------------------------------------------------ +/// Writes a formatted string inside another string. +/// \param pStr Storage string. +/// \param pFormat Format string. +//------------------------------------------------------------------------------ +signed int sprintf(char *pStr, const char *pFormat, ...) +{ + va_list ap; + signed int result; + + // Forward call to vsprintf + va_start(ap, pFormat); + result = vsprintf(pStr, pFormat, ap); + va_end(ap); + + return result; +} \ No newline at end of file diff --git a/macusbfb/core/libc/string.c b/macusbfb/core/libc/string.c new file mode 100755 index 0000000..733fc06 --- /dev/null +++ b/macusbfb/core/libc/string.c @@ -0,0 +1,311 @@ +/* + * Software License Agreement (BSD License) + * + * Based on original stdio.c released by Atmel + * Copyright (c) 2008, Atmel Corporation + * All rights reserved. + * + * Modified by Roel Verdult, Copyright (c) 2010 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +//------------------------------------------------------------------------------ +// Headers +//------------------------------------------------------------------------------ + +#include + +//------------------------------------------------------------------------------ +// Global Functions +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +/// Copies data from a source buffer into a destination buffer. The two buffers +/// must NOT overlap. Returns the destination buffer. +/// \param pDestination Destination buffer. +/// \param pSource Source buffer. +/// \param num Number of bytes to copy. +//------------------------------------------------------------------------------ +void * memcpy(void *pDestination, const void *pSource, size_t num) +{ + unsigned char *pByteDestination; + unsigned char *pByteSource; + unsigned int *pAlignedSource = (unsigned int *) pSource; + unsigned int *pAlignedDestination = (unsigned int *) pDestination; + + // If num is more than 4 bytes, and both dest. and source are aligned, + // then copy dwords + if ((((unsigned int) pAlignedDestination & 0x3) == 0) + && (((unsigned int) pAlignedSource & 0x3) == 0) + && (num >= 4)) { + + while (num >= 4) { + + *pAlignedDestination++ = *pAlignedSource++; + num -= 4; + } + } + + // Copy remaining bytes + pByteDestination = (unsigned char *) pAlignedDestination; + pByteSource = (unsigned char *) pAlignedSource; + while (num--) { + + *pByteDestination++ = *pByteSource++; + } + + return pDestination; +} + +//------------------------------------------------------------------------------ +/// Fills a memory region with the given value. Returns a pointer to the +/// memory region. +/// \param pBuffer Pointer to the start of the memory region to fill +/// \param value Value to fill the region with +/// \param num Size to fill in bytes +//------------------------------------------------------------------------------ +void * memset(void *pBuffer, int value, size_t num) +{ + unsigned char *pByteDestination; + unsigned int *pAlignedDestination = (unsigned int *) pBuffer; + unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value; + + // Set words if possible + if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) { + while (num >= 4) { + *pAlignedDestination++ = alignedValue; + num -= 4; + } + } + // Set remaining bytes + pByteDestination = (unsigned char *) pAlignedDestination; + while (num--) { + *pByteDestination++ = value; + } + return pBuffer; +} + +void* memmove(void *s1, const void *s2, size_t n) +{ + char *s=(char*)s2, *d=(char*)s1; + + if(d > s){ + s+=n-1; + d+=n-1; + while(n){ + *d--=*s--; + n--; + } + }else if(d < s) + while(n){ + *d++=*s++; + n--; + } + return s1; +} + + +//----------------------------------------------------------------------------- +/// Search a character in the given string. +/// Returns a pointer to the character location. +/// \param pString Pointer to the start of the string to search. +/// \param character The character to find. +//----------------------------------------------------------------------------- +char * strchr(const char *pString, int character) +{ + char * p = (char *)pString; + char c = character & 0xFF; + + while(*p != c) { + if (*p == 0) { + return 0; + } + p++; + } + return p; +} + +//----------------------------------------------------------------------------- +/// Return the length of a given string +/// \param pString Pointer to the start of the string. +//----------------------------------------------------------------------------- +size_t strlen(const char *pString) +{ + unsigned int length = 0; + + while(*pString++ != 0) { + length++; + } + return length; +} + + +//----------------------------------------------------------------------------- +/// Search a character backword from the end of given string. +/// Returns a pointer to the character location. +/// \param pString Pointer to the start of the string to search. +/// \param character The character to find. +//----------------------------------------------------------------------------- +char * strrchr(const char *pString, int character) +{ + char *p = 0; + + while(*pString != 0) { + if (*pString++ == character) { + p = (char*)pString; + } + } + return p; +} + +//----------------------------------------------------------------------------- +/// Copy from source string to destination string +/// Return a pointer to the destination string +/// \param pDestination Pointer to the destination string. +/// \param pSource Pointer to the source string. +//----------------------------------------------------------------------------- +char * strcpy(char *pDestination, const char *pSource) +{ + char *pSaveDest = pDestination; + + for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination); + return pSaveDest; +} + +//----------------------------------------------------------------------------- +/// Compare the first specified bytes of 2 given strings +/// Return 0 if equals +/// Return >0 if 1st string > 2nd string +/// Return <0 if 1st string < 2nd string +/// \param pString1 Pointer to the start of the 1st string. +/// \param pString2 Pointer to the start of the 2nd string. +/// \param count Number of bytes that should be compared. +//----------------------------------------------------------------------------- +int strncmp(const char *pString1, const char *pString2, size_t count) +{ + int r; + + while(count) { + r = *pString1 - *pString2; + if (r == 0) { + if (*pString1 == 0) { + break; + } + pString1++; + pString2++; + count--; + continue; + } + return r; + } + return 0; +} + +//----------------------------------------------------------------------------- +/// Copy the first number of bytes from source string to destination string +/// Return the pointer to the destination string. +/// \param pDestination Pointer to the start of destination string. +/// \param pSource Pointer to the start of the source string. +/// \param count Number of bytes that should be copied. +//----------------------------------------------------------------------------- +char * strncpy(char *pDestination, const char *pSource, size_t count) +{ + char *pSaveDest = pDestination; + + while (count) { + *pDestination = *pSource; + if (*pSource == 0) { + break; + } + pDestination++; + pSource++; + count--; + } + return pSaveDest; +} + +// Following code is based on the BSD licensed code released by UoC +// Copyright (c) 1988 Regents of the University of California + +int strcmp(const char *s1, const char *s2) +{ + while (*s1 == *s2++) + if (*s1++ == 0) + return (0); + return (*(unsigned char *)s1 - *(unsigned char *)--s2); +} + +char *strtok(char *s, const char *delim) +{ + static char *last; + return strtok_r(s, delim, &last); +} + +char *strtok_r(char *s, const char *delim, char **last) +{ + char *spanp; + int c, sc; + char *tok; + + + if (s == NULL && (s = *last) == NULL) + return (NULL); + + /* + * Skip (span) leading delimiters (s += strspn(s, delim), sort of). + */ +cont: + c = *s++; + for (spanp = (char *)delim; (sc = *spanp++) != 0;) { + if (c == sc) + goto cont; + } + + if (c == 0) { /* no non-delimiter characters */ + *last = NULL; + return (NULL); + } + tok = s - 1; + + /* + * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). + * Note that delim must have one NUL; we stop if we see that, too. + */ + for (;;) { + c = *s++; + spanp = (char *)delim; + do { + if ((sc = *spanp++) == c) { + if (c == 0) + s = NULL; + else + s[-1] = 0; + *last = s; + return (tok); + } + } while (sc != 0); + } + /* NOTREACHED */ +} diff --git a/macusbfb/core/pmu/pmu.c b/macusbfb/core/pmu/pmu.c new file mode 100644 index 0000000..204a1d0 --- /dev/null +++ b/macusbfb/core/pmu/pmu.c @@ -0,0 +1,380 @@ +/**************************************************************************/ +/*! + @file pmu.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Controls the power management features of the LPC1343, allowing you + to enter sleep/deep-sleep or deep power-down mode. + + For examples of how to enter either mode, see the comments for the + functions pmuSleep(), pmuDeepSleep() and pmuPowerDown(). + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "core/gpio/gpio.h" +#include "core/cpu/cpu.h" +#include "core/timer32/timer32.h" +#include "pmu.h" + +#define PMU_WDTCLOCKSPEED_HZ 10000 + +/**************************************************************************/ +/*! + Wakeup interrupt handler +*/ +/**************************************************************************/ +void WAKEUP_IRQHandler(void) +{ + uint32_t regVal; + + // Disable the deep sleep timer + TMR_TMR32B0TCR = TMR_TMR32B0TCR_COUNTERENABLE_DISABLED; + + /* This handler takes care of all the port pins if they + are configured as wakeup source. */ + regVal = SCB_STARTSRP0; + if (regVal != 0) + { + SCB_STARTRSRP0CLR = regVal; + } + + // Reconfigure system clock/PLL + cpuPllSetup(CPU_MULTIPLIER_6); + + // Reconfigure CT32B0 + timer32Init(0, TIMER32_DEFAULTINTERVAL); + timer32Enable(0); + + /* See tracker for bug report. */ + __asm volatile ("NOP"); + + return; +} + +/**************************************************************************/ +/*! + Setup the clock for the watchdog timer. The default setting is 10kHz. +*/ +/**************************************************************************/ +static void pmuWDTClockInit (void) +{ + /* Configure watchdog clock */ + /* Freq. = 0.5MHz, div = 50: WDT_OSC = 10kHz */ + SCB_WDTOSCCTRL = SCB_WDTOSCCTRL_FREQSEL_0_5MHZ | + SCB_WDTOSCCTRL_DIVSEL_DIV50; + + /* Set clock source (use internal oscillator) */ + // SCB_WDTCLKSEL = SCB_WDTCLKSEL_SOURCE_INPUTCLOCK; + SCB_WDTCLKSEL = SCB_WDTCLKSEL_SOURCE_INTERNALOSC; + SCB_WDTCLKUEN = SCB_WDTCLKUEN_UPDATE; + SCB_WDTCLKUEN = SCB_WDTCLKUEN_DISABLE; + SCB_WDTCLKUEN = SCB_WDTCLKUEN_UPDATE; + + /* Wait until updated */ + while (!(SCB_WDTCLKUEN & SCB_WDTCLKUEN_UPDATE)); + + /* Set divider */ + SCB_WDTCLKDIV = SCB_WDTCLKDIV_DIV1; + + /* Enable WDT clock */ + SCB_PDRUNCFG &= ~(SCB_PDRUNCFG_WDTOSC); + + // Switch main clock to WDT output + SCB_MAINCLKSEL = SCB_MAINCLKSEL_SOURCE_WDTOSC; + SCB_MAINCLKUEN = SCB_MAINCLKUEN_UPDATE; // Update clock source + SCB_MAINCLKUEN = SCB_MAINCLKUEN_DISABLE; // Toggle update register once + SCB_MAINCLKUEN = SCB_MAINCLKUEN_UPDATE; + + // Wait until the clock is updated + while (!(SCB_MAINCLKUEN & SCB_MAINCLKUEN_UPDATE)); +} + +/**************************************************************************/ +/*! + @brief Initialises the power management unit +*/ +/**************************************************************************/ +void pmuInit( void ) +{ + /* Enable all clocks, even those turned off at power up. */ + SCB_PDRUNCFG &= ~(SCB_PDRUNCFG_WDTOSC_MASK | + SCB_PDRUNCFG_SYSOSC_MASK | + SCB_PDRUNCFG_ADC_MASK); + + return; +} + +/**************************************************************************/ +/*! + @brief Puts select peripherals in sleep mode. + + This function will put the device into sleep mode. Most gpio pins + can be used to wake the device up, but the pins must first be + configured for this in pmuInit. + + @section Example + + @code + // Configure wakeup sources before going into sleep/deep-sleep. + // By default, pin 0.1 is configured as wakeup source (falling edge) + pmuInit(); + + // Enter sleep mode + pmuSleep(); + @endcode +*/ +/**************************************************************************/ +void pmuSleep() +{ + SCB_PDAWAKECFG = SCB_PDRUNCFG; + __asm volatile ("WFI"); + return; +} + +/**************************************************************************/ +/*! + @brief Turns off select peripherals and puts the device in deep-sleep + mode. + + The device can be configured to wakeup from deep-sleep mode after a + specified delay by supplying a non-zero value to the wakeupSeconds + parameter. This will configure CT32B0 to toggle pin 0.1 (CT32B0_MAT2) + after x seconds, waking the device up. The timer will be configured + to run off the WDT OSC while in deep-sleep mode, meaning that WDTOSC + should not be powered off (using the sleepCtrl parameter) when a + wakeup delay is specified. + + The sleepCtrl parameter is used to indicate which peripherals should + be put in sleep mode (see the SCB_PDSLEEPCFG register for details). + + @param[in] sleepCtrl + The bits to set in the SCB_PDSLEEPCFG register. This + controls which peripherals will be put in sleep mode. + @param[in] wakeupSeconds + The number of seconds to wait until the device will + wakeup. If you do not wish to wakeup after a specific + delay, enter a value of 0. + + @code + uint32_t pmuRegVal; + + // Initialise power management unit + pmuInit(); + + // Put peripherals into sleep mode + pmuRegVal = SCB_PDSLEEPCFG_IRCOUT_PD | + SCB_PDSLEEPCFG_IRC_PD | + SCB_PDSLEEPCFG_FLASH_PD | + SCB_PDSLEEPCFG_USBPLL_PD | + SCB_PDSLEEPCFG_SYSPLL_PD | + SCB_PDSLEEPCFG_SYSOSC_PD | + SCB_PDSLEEPCFG_ADC_PD | + SCB_PDSLEEPCFG_BOD_PD; + + // Enter deep sleep mode (wakeup after 5 seconds) + // By default, pin 0.1 is configured as wakeup source + pmuDeepSleep(pmuRegVal, 5); + @endcode +*/ +/**************************************************************************/ +void pmuDeepSleep(uint32_t sleepCtrl, uint32_t wakeupSeconds) +{ + SCB_PDAWAKECFG = SCB_PDRUNCFG; + sleepCtrl |= (1 << 9) | (1 << 11); + SCB_PDSLEEPCFG = sleepCtrl; + SCB_SCR |= SCB_SCR_SLEEPDEEP; + + /* Configure system to run from WDT and set TMR32B0 for wakeup */ + if (wakeupSeconds > 0) + { + // Make sure WDTOSC isn't disabled in PDSLEEPCFG + SCB_PDSLEEPCFG &= ~(SCB_PDSLEEPCFG_WDTOSC_PD); + + // Disable 32-bit timer 0 if currently in use + TMR_TMR32B0TCR = TMR_TMR32B0TCR_COUNTERENABLE_DISABLED; + + // Disable internal pullup on 0.1 + gpioSetPullup(&IOCON_PIO0_1, gpioPullupMode_Inactive); + + // Reconfigure clock to run from WDTOSC + pmuWDTClockInit(); + + /* Enable the clock for CT32B0 */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B0); + + /* Configure 0.1 as Timer0_32 MAT2 */ + IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK; + IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CT32B0_MAT2; + + /* Set appropriate timer delay */ + TMR_TMR32B0MR0 = PMU_WDTCLOCKSPEED_HZ * wakeupSeconds; + + /* Configure match control register to raise an interrupt and reset on MR0 */ + TMR_TMR32B0MCR |= (TMR_TMR32B0MCR_MR0_INT_ENABLED | TMR_TMR32B0MCR_MR0_RESET_ENABLED); + + /* Configure external match register to set 0.1 high on match */ + TMR_TMR32B0EMR &= ~(0xFF<<4); // Clear EMR config bits + TMR_TMR32B0EMR |= TMR_TMR32B0EMR_EMC2_HIGH; // Set MAT2 (0.1) high on match + + /* Enable wakeup interrupts (any I/O pin can be used as a wakeup source) */ + //NVIC_EnableIRQ(WAKEUP0_IRQn); // P0.0 + NVIC_EnableIRQ(WAKEUP1_IRQn); // P0.1 (CT32B0_MAT2) + //NVIC_EnableIRQ(WAKEUP2_IRQn); // P0.2 + //NVIC_EnableIRQ(WAKEUP3_IRQn); // P0.3 + //NVIC_EnableIRQ(WAKEUP4_IRQn); // P0.4 + //NVIC_EnableIRQ(WAKEUP5_IRQn); // P0.5 + //NVIC_EnableIRQ(WAKEUP6_IRQn); // P0.6 + //NVIC_EnableIRQ(WAKEUP7_IRQn); // P0.7 + //NVIC_EnableIRQ(WAKEUP8_IRQn); // P0.8 + //NVIC_EnableIRQ(WAKEUP9_IRQn); // P0.9 + //NVIC_EnableIRQ(WAKEUP10_IRQn); // P0.10 + //NVIC_EnableIRQ(WAKEUP11_IRQn); // P0.11 + //NVIC_EnableIRQ(WAKEUP12_IRQn); // P1.0 + //NVIC_EnableIRQ(WAKEUP13_IRQn); // P1.1 + //NVIC_EnableIRQ(WAKEUP14_IRQn); // P1.2 + //NVIC_EnableIRQ(WAKEUP15_IRQn); // P1.3 + //NVIC_EnableIRQ(WAKEUP16_IRQn); // P1.4 + //NVIC_EnableIRQ(WAKEUP17_IRQn); // P1.5 + //NVIC_EnableIRQ(WAKEUP18_IRQn); // P1.6 + //NVIC_EnableIRQ(WAKEUP19_IRQn); // P1.7 + //NVIC_EnableIRQ(WAKEUP20_IRQn); // P1.8 + //NVIC_EnableIRQ(WAKEUP21_IRQn); // P1.9 + //NVIC_EnableIRQ(WAKEUP22_IRQn); // P1.10 + //NVIC_EnableIRQ(WAKEUP23_IRQn); // P1.11 + //NVIC_EnableIRQ(WAKEUP24_IRQn); // P2.0 + //NVIC_EnableIRQ(WAKEUP25_IRQn); // P2.1 + //NVIC_EnableIRQ(WAKEUP26_IRQn); // P2.2 + //NVIC_EnableIRQ(WAKEUP27_IRQn); // P2.3 + //NVIC_EnableIRQ(WAKEUP28_IRQn); // P2.4 + //NVIC_EnableIRQ(WAKEUP29_IRQn); // P2.5 + //NVIC_EnableIRQ(WAKEUP30_IRQn); // P2.6 + //NVIC_EnableIRQ(WAKEUP31_IRQn); // P2.7 + //NVIC_EnableIRQ(WAKEUP32_IRQn); // P2.8 + //NVIC_EnableIRQ(WAKEUP33_IRQn); // P2.9 + //NVIC_EnableIRQ(WAKEUP34_IRQn); // P2.10 + //NVIC_EnableIRQ(WAKEUP35_IRQn); // P2.11 + //NVIC_EnableIRQ(WAKEUP36_IRQn); // P3.0 + //NVIC_EnableIRQ(WAKEUP37_IRQn); // P3.1 + //NVIC_EnableIRQ(WAKEUP38_IRQn); // P3.2 + //NVIC_EnableIRQ(WAKEUP39_IRQn); // P3.3 + + /* Use RISING EDGE for wakeup detection. */ + SCB_STARTAPRP0 |= SCB_STARTAPRP0_APRPIO0_1; + + /* Clear all wakeup sources */ + SCB_STARTRSRP0CLR = SCB_STARTRSRP0CLR_MASK; + + /* Enable Port 0.1 as wakeup source. */ + SCB_STARTERP0 |= SCB_STARTERP0_ERPIO0_1; + + /* Start the timer */ + TMR_TMR32B0TCR = TMR_TMR32B0TCR_COUNTERENABLE_ENABLED; + } + + __asm volatile ("WFI"); + return; +} + +/**************************************************************************/ +/*! + @brief Puts the device in deep power-down mode. + + This function will configure the PMU control register and enter + deep power-down mode. Pre-determined values are stored in the four + general-purpose registers (PMU_GPREG0..3), which can be used to persist + any essential system settings while the device is in deep power-down + mode, so long as 3.3V is still available. + + @warning The only way to wake a device up from deep power-down mode + is to set a low-level on P1.4. If 3.3V power is lost, the + values stored in the four general-purpose registers will + also be lost. + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "core/pmu/pmu.h" + + int main(void) + { + cpuInit(); + pmuInit(); + + // Enter power-down mode + pmuPowerDown(); + + while(1) + { + // Device was woken up by WAKEUP pin + } + } + @endcode +*/ +/**************************************************************************/ +void pmuPowerDown( void ) +{ + uint32_t regVal; + + if ( (PMU_PMUCTRL & ((0x1<<8) | (PMU_PMUCTRL_DPDFLAG))) != 0x0 ) + { + /* Check sleep and deep power down bits. If sleep and/or + deep power down mode are entered, clear the PCON bits. */ + regVal = PMU_PMUCTRL; + regVal |= ((0x1<<8) | + (PMU_PMUCTRL_DPDEN_SLEEP) | + (PMU_PMUCTRL_DPDFLAG)); + PMU_PMUCTRL = regVal; + + if ( (PMU_GPREG0 != 0x12345678)||(PMU_GPREG1 != 0x87654321) + ||(PMU_GPREG2 != 0x56781234)||(PMU_GPREG3 != 0x43218765) ) + { + while (1); + } + } + else + { + /* If in neither sleep nor deep-sleep mode, enter deep power down mode. */ + PMU_GPREG0 = 0x12345678; + PMU_GPREG1 = 0x87654321; + PMU_GPREG2 = 0x56781234; + PMU_GPREG3 = 0x43218765; + SCB_SCR |= SCB_SCR_SLEEPDEEP; + PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN; + __asm volatile ("WFI"); + } + return; +} diff --git a/macusbfb/core/pmu/pmu.h b/macusbfb/core/pmu/pmu.h new file mode 100644 index 0000000..58504e6 --- /dev/null +++ b/macusbfb/core/pmu/pmu.h @@ -0,0 +1,50 @@ +/**************************************************************************/ +/*! + @file pmu.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef __PMU_H__ +#define __PMU_H__ + +#include "projectconfig.h" + +void WAKEUP_IRQHandler( void ); +void pmuInit( void ); +void pmuSleep( void ); +void pmuDeepSleep(uint32_t sleepCtrl, uint32_t wakeupSeconds); +void pmuPowerDown( void ); + +#endif diff --git a/macusbfb/core/ssp/ssp.c b/macusbfb/core/ssp/ssp.c new file mode 100644 index 0000000..54f32ee --- /dev/null +++ b/macusbfb/core/ssp/ssp.c @@ -0,0 +1,293 @@ +/**************************************************************************/ +/*! + @file ssp.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Generic code for SSP/SPI communications. By default, the SSP block + is initialised in SPI master mode. + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "core/ssp/ssp.h" + ... + cpuInit(); + sspInit(0, sspClockPolarity_High, sspClockPhase_RisingEdge); + ... + uint8_t request[SSP_FIFOSIZE]; + uint8_t response[SSP_FIFOSIZE]; + + // Send 0x9C to the slave device and wait for a response + request[0] = 0x80 | 0x1C; + // Toggle the select pin + ssp0Select(); + // Send 1 byte from the request buffer + sspSend(0, (uint8_t *)&request, 1); + // Receive 1 byte into the response buffer + sspReceive(0, (uint8_t *)&response, 1); + // Reset the select pin + ssp0Deselect(); + // Print the results + debug_printf("Ox%x ", response[0]); + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include "ssp.h" +#include "core/gpio/gpio.h" + +/* Statistics for all interrupts */ +volatile uint32_t interruptRxStat = 0; +volatile uint32_t interruptOverRunStat = 0; +volatile uint32_t interruptRxTimeoutStat = 0; + +/**************************************************************************/ +/*! + @brief SSP0 interrupt handler for SPI communication + + The algorithm is, if RXFIFO is at least half full, + start receive until it's empty; if TXFIFO is at least + half empty, start transmit until it's full. + This will maximize the use of both FIFOs and performance. +*/ +/**************************************************************************/ +void SSP_IRQHandler (void) +{ + uint32_t regValue; + + regValue = SSP_SSP0MIS; + + /* Check for overrun interrupt */ + if ( regValue & SSP_SSP0MIS_RORMIS_FRMRCVD ) + { + interruptOverRunStat++; + SSP_SSP0ICR = SSP_SSP0ICR_RORIC_CLEAR; // Clear interrupt + } + + /* Check for timeout interrupt */ + if ( regValue & SSP_SSP0MIS_RTMIS_NOTEMPTY ) + { + interruptRxTimeoutStat++; + SSP_SSP0ICR = SSP_SSP0ICR_RTIC_CLEAR; // Clear interrupt + } + + /* Check if Rx buffer is at least half-full */ + if ( regValue & SSP_SSP0MIS_RXMIS_HALFFULL ) + { + // ToDo: Receive until it's empty + interruptRxStat++; + } + return; +} + +/**************************************************************************/ +/*! + @brief Initialises the SSP0 port + + By default, SSP0 is set to SPI frame-format with 8-bit data. Pin 2.11 + is routed to serve as serial clock (SCK), and SSEL (0.2) is set to + GPIO to allow manual control of when the SPI port is enabled or + disabled. Overrun and timeout interrupts are both enabled. + + @param[in] portNum + The SPI port to use (0..1) + @param[in] polarity + Indicates whether the clock should be held high + (sspClockPolarity_High) or low (sspClockPolarity_Low) + when inactive. + @param[in] phase + Indicates whether new bits start on the leading + (sspClockPhase_RisingEdge) or falling + (sspClockPhase_FallingEdge) edge of clock transitions. + + @note sspSelect() and sspDeselect() macros have been defined in + ssp.h to control the SSEL line without having to know the + specific pin being used. +*/ +/**************************************************************************/ +void sspInit (uint8_t portNum, sspClockPolarity_t polarity, sspClockPhase_t phase) +{ + gpioInit(); + + if (portNum == 0) + { + /* Reset SSP */ + SCB_PRESETCTRL &= ~SCB_PRESETCTRL_SSP0_MASK; + SCB_PRESETCTRL |= SCB_PRESETCTRL_SSP0_RESETDISABLED; + + /* Enable AHB clock to the SSP domain. */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_SSP0); + + /* Divide by 1 (SSPCLKDIV also enables to SSP CLK) */ + // SCB_SSP0CLKDIV = SCB_SSP0CLKDIV_DIV1; // 1 = 4.0MHz + SCB_SSP0CLKDIV = SCB_SSP0CLKDIV_DIV10; // 10 = 400 KHz + + /* Set P0.8 to SSP MISO */ + IOCON_PIO0_8 &= ~IOCON_PIO0_8_FUNC_MASK; + IOCON_PIO0_8 |= IOCON_PIO0_8_FUNC_MISO0; + + /* Set P0.9 to SSP MOSI */ + IOCON_PIO0_9 &= ~IOCON_PIO0_9_FUNC_MASK; + IOCON_PIO0_9 |= IOCON_PIO0_9_FUNC_MOSI0; + + /* Set 2.11 to SSP SCK (0.6 and 0.10 can also be used) */ + IOCON_SCKLOC = IOCON_SCKLOC_SCKPIN_PIO2_11; + IOCON_PIO2_11 = IOCON_PIO2_11_FUNC_SCK0; + + /* Set P0.2/SSEL to GPIO output and high */ + IOCON_PIO0_2 &= ~IOCON_PIO0_2_FUNC_MASK; + IOCON_PIO0_2 |= IOCON_PIO0_2_FUNC_GPIO; + gpioSetDir(SSP0_CSPORT, SSP0_CSPIN, 1); + gpioSetValue(SSP0_CSPORT, SSP0_CSPIN, 1); + gpioSetPullup(&IOCON_PIO0_2, gpioPullupMode_Inactive); // Board has external pull-up + + /* DIV1 -- (PCLK / (CPSDVSR × [SCR+1])) = (72,000,000 / (2 x [8 + 1])) = 4.0 MHz */ + /* DIV10 -- (PCLK / (CPSDVSR × [SCR+1])) = (7,200,000 / (2 x [8 + 1])) = 400 KHz */ + uint32_t configReg = ( SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit + | SSP_SSP0CR0_FRF_SPI // Frame format = SPI + | SSP_SSP0CR0_SCR_8); // Serial clock rate = 8 + + // Set clock polarity + if (polarity == sspClockPolarity_High) + configReg |= SSP_SSP0CR0_CPOL_HIGH; // Clock polarity = High between frames + else + configReg &= ~SSP_SSP0CR0_CPOL_MASK; // Clock polarity = Low between frames + + // Set edge transition + if (phase == sspClockPhase_FallingEdge) + configReg |= SSP_SSP0CR0_CPHA_SECOND; // Clock out phase = Trailing edge clock transition + else + configReg &= ~SSP_SSP0CR0_CPHA_MASK; // Clock out phase = Leading edge clock transition + + // Assign config values to SSP0CR0 + SSP_SSP0CR0 = configReg; + + /* Clock prescale register must be even and at least 2 in master mode */ + SSP_SSP0CPSR = SSP_SSP0CPSR_CPSDVSR_DIV2; + + /* Clear the Rx FIFO */ + uint8_t i, Dummy=Dummy; + for ( i = 0; i < SSP_FIFOSIZE; i++ ) + { + Dummy = SSP_SSP0DR; + } + + /* Enable the SSP Interrupt */ + NVIC_EnableIRQ(SSP_IRQn); + + /* Set SSPINMS registers to enable interrupts + * enable all error related interrupts */ + SSP_SSP0IMSC = ( SSP_SSP0IMSC_RORIM_ENBL // Enable overrun interrupt + | SSP_SSP0IMSC_RTIM_ENBL); // Enable timeout interrupt + + /* Enable device and set it to master mode, no loopback */ + SSP_SSP0CR1 = SSP_SSP0CR1_SSE_ENABLED | SSP_SSP0CR1_MS_MASTER | SSP_SSP0CR1_LBM_NORMAL; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Sends a block of data to the SSP0 port + + @param[in] portNum + The SPI port to use (0..1) + @param[in] buf + Pointer to the data buffer + @param[in] length + Block length of the data buffer +*/ +/**************************************************************************/ +void sspSend (uint8_t portNum, uint8_t *buf, uint32_t length) +{ + uint32_t i; + uint8_t Dummy = Dummy; + + if (portNum == 0) + { + for (i = 0; i < length; i++) + { + /* Move on only if NOT busy and TX FIFO not full. */ + while ((SSP_SSP0SR & (SSP_SSP0SR_TNF_NOTFULL | SSP_SSP0SR_BSY_BUSY)) != SSP_SSP0SR_TNF_NOTFULL); + SSP_SSP0DR = *buf; + buf++; + + while ( (SSP_SSP0SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY ); + /* Whenever a byte is written, MISO FIFO counter increments, Clear FIFO + on MISO. Otherwise, when SSP0Receive() is called, previous data byte + is left in the FIFO. */ + Dummy = SSP_SSP0DR; + } + } + + return; +} + +/**************************************************************************/ +/*! + @brief Receives a block of data from the SSP0 port + + @param[in] portNum + The SPI port to use (0..1) + @param[in] buf + Pointer to the data buffer + @param[in] length + Block length of the data buffer +*/ +/**************************************************************************/ +void sspReceive(uint8_t portNum, uint8_t *buf, uint32_t length) +{ + uint32_t i; + + if (portNum == 0) + { + for ( i = 0; i < length; i++ ) + { + /* As long as the receive FIFO is not empty, data can be received. */ + SSP_SSP0DR = 0xFF; + + /* Wait until the Busy bit is cleared */ + while ( (SSP_SSP0SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY ); + + *buf = SSP_SSP0DR; + buf++; + } + } + + return; +} + diff --git a/macusbfb/core/ssp/ssp.h b/macusbfb/core/ssp/ssp.h new file mode 100644 index 0000000..19b2ca9 --- /dev/null +++ b/macusbfb/core/ssp/ssp.h @@ -0,0 +1,85 @@ +/**************************************************************************/ +/*! + @file ssp.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _SSP_H_ +#define _SSP_H_ + +#include "projectconfig.h" +#include "core/gpio/gpio.h" + +#define SSP_FIFOSIZE 8 /* SPI read and write buffer size */ +#define SSP_MAX_TIMEOUT 0xFF + +#define SSP0_CSPORT 0 +#define SSP0_CSPIN 2 + +/* Macro definitions to enable and disable SPI */ +#define ssp0Select() do {gpioSetValue(SSP0_CSPORT, SSP0_CSPIN, 0);} while (0) +#define ssp0Deselect() do {gpioSetValue(SSP0_CSPORT, SSP0_CSPIN, 1);} while (0) + +/**************************************************************************/ +/*! + Indicates whether the clock should be high or low between frames. +*/ +/**************************************************************************/ +typedef enum sspClockPolarity_e +{ + sspClockPolarity_Low = 0, + sspClockPolarity_High +} +sspClockPolarity_t; + +/**************************************************************************/ +/*! + Indicates whether the bits start at the rising or falling edge of + the clock transition. +*/ +/**************************************************************************/ +typedef enum sspClockPhase_e +{ + sspClockPhase_RisingEdge = 0, + sspClockPhase_FallingEdge +} +sspClockPhase_t; + +extern void SSP_IRQHandler (void); +void sspInit (uint8_t portNum, sspClockPolarity_t polarity, sspClockPhase_t phase); +void sspSend (uint8_t portNum, uint8_t *buf, uint32_t length); +void sspReceive (uint8_t portNum, uint8_t *buf, uint32_t length); + +#endif diff --git a/macusbfb/core/systick/systick.c b/macusbfb/core/systick/systick.c new file mode 100644 index 0000000..8bccc94 --- /dev/null +++ b/macusbfb/core/systick/systick.c @@ -0,0 +1,135 @@ +/**************************************************************************/ +/*! + @file systick.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Controls the 24-bit 'system tick' clock, which can be used as a + generic timer or to control time sharing with an embedded real-time + operating system (such as FreeRTOS). + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "core/systick/systick.h" + + void main (void) + { + cpuInit(); + + // Start systick timer with one tick every 10ms + systickInit(10); + + while(1) + { + } + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "systick.h" + +#ifdef CFG_SDCARD +#include "drivers/fatfs/diskio.h" +volatile uint32_t fatTicks = 0; +#endif + +volatile uint32_t msTicks; // 1ms tick counter + +void SysTick_Handler (void) +{ + msTicks++; + + #ifdef CFG_SDCARD + fatTicks++; + if (fatTicks == 10) + { + fatTicks = 0; + disk_timerproc(); + } + #endif +} + +static uint32_t systickConfig(uint32_t ticks) +{ + // Check if 'ticks' is greater than maximum value + if (ticks > SYSTICK_STRELOAD_MASK) + { + return (1); + } + + // Set reload register + SYSTICK_STRELOAD = (ticks & SYSTICK_STRELOAD_MASK) - 1; + + // Load the systick counter value + SYSTICK_STCURR = 0; + + // Enable systick IRQ and timer + SYSTICK_STCTRL = SYSTICK_STCTRL_CLKSOURCE | + SYSTICK_STCTRL_TICKINT | + SYSTICK_STCTRL_ENABLE; + + return (0); +} + + +void systickInit (uint32_t delayMs) +{ + systickConfig ((CFG_CPU_CCLK / 1000) * delayMs); +} + +void systickDelay (uint32_t delayTicks) +{ + uint32_t curTicks; + curTicks = msTicks; + + // Make sure delay is at least 1 tick in case of division, etc. + if (delayTicks == 0) delayTicks = 1; + + if (curTicks > 0x00FFFFFF - delayTicks) + { + // Rollover will occur during delay + while (msTicks >= curTicks) + { + while (msTicks < (delayTicks - (0x00FFFFFF - curTicks))); + } + } + else + { + while ((msTicks - curTicks) < delayTicks); + } +} diff --git a/macusbfb/core/systick/systick.h b/macusbfb/core/systick/systick.h new file mode 100644 index 0000000..cf19955 --- /dev/null +++ b/macusbfb/core/systick/systick.h @@ -0,0 +1,47 @@ +/**************************************************************************/ +/*! + @file systick.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _SYSTICK_H_ +#define _SYSTICK_H_ + +#include "projectconfig.h" + +void systickInit (uint32_t delayMs); +void systickDelay (uint32_t delayTicks) ; + +#endif \ No newline at end of file diff --git a/macusbfb/core/timer16/timer16.c b/macusbfb/core/timer16/timer16.c new file mode 100644 index 0000000..ec48c5d --- /dev/null +++ b/macusbfb/core/timer16/timer16.c @@ -0,0 +1,476 @@ +/**************************************************************************/ +/*! + @file timer16.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Generic code for both 16-bit timers. + + @warning 16-bit timers are limited to roughly ~0.91ms (or 910uS) on + a system running at 72MHz since: + @code + 1 mS = CFG_CPU_CCLK / 1000 + = 72000000 / 1000 + = 72000 'ticks' + @endcode + Meaning that 0xFFFF (65535) 'ticks' = 0.910208 milliseconds + or 910 microseconds. + + @section Example + + @code + #include "/core/cpu/cpu.h" + #include "/core/timer16/timer16.h" + + // Instantiated in timer16.h + extern volatile uint32_t timer16_0_counter; + ... + cpuInit(); + + // Initialise timer0 with a delay of 0xFFFF, which will cause the + // timer interrupt to fire every 65535 ticks and increment + // timer16_0_counter by 1 + timer16Init(0, 0xFFFF); + + // Enable the timer + timer16Enable(0); + + // At this point timer16_0_counter should start incrementing by 1 + // every 65535 ticks + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "timer16.h" + +volatile uint32_t timer16_0_counter = 0; +volatile uint32_t timer16_1_counter = 0; + +/**************************************************************************/ +/*! + @brief Causes a blocking delay for the specified number of + clock ticks. + + @note The exact duration of this delay depends on the speed of the + system clock, but it will invariably be short because of the + 16-bit limitation. For example, on a system with a 72MHz + clock, a 1mS delay would be equal to 72,000 ticks, which is + already above the maximum 16-bit value of 65,535. Thus, the + maximum delay measured in mS with a 72MHz clock is ~0.91mS. + + @param[in] timerNum + The 16-bit timer to user (0..1) + @param[in] delayInTicks + The number of clock ticks to delay (0..65534) + + @section Example + + @code + #include "/core/cpu/cpu.h" + #include "/core/timer16/timer16.h" + + int main(void) + { + cpuInit(); + + // Initialise timer 0 ... delay is provided but not used here + timer16Init(0, 0xFFFF); + + // Enable the timer + timer16Enable(0); + + while(1) + { + // Cause blocking delay for 36000 ticks (0.5mS @ 72MHz) + // Note: The delay must be 65534 or less (16-bit value) + timer16DelayTicks(0, 36000); + } + } + @endcode +*/ +/**************************************************************************/ +void timer16DelayTicks(uint8_t timerNum, uint16_t delayInTicks) +{ + // ToDo: Verify incoming value + + if (timerNum == 0) + { + /* Reset the timer */ + TMR_TMR16B0TCR = TMR_TMR16B0TCR_COUNTERRESET_ENABLED; + + /* Set the prescaler to zero */ + TMR_TMR16B0PR = 0x00; + + TMR_TMR16B0MR0 = delayInTicks; + + /* Reset all interrupts */ + TMR_TMR16B0IR = TMR_TMR16B0IR_MASK_ALL; + + /* Stop timer on match (MR0) */ + TMR_TMR16B0MCR = TMR_TMR16B0MCR_MR0_STOP_ENABLED; + + /* Start timer */ + TMR_TMR16B0TCR = TMR_TMR16B0TCR_COUNTERENABLE_ENABLED; + + /* Wait until the delay time has elapsed */ + while (TMR_TMR16B0TCR & TMR_TMR16B0TCR_COUNTERENABLE_ENABLED); + } + + else if (timerNum == 1) + { + /* Reset the timer */ + TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERRESET_ENABLED; + + /* Set the prescaler to zero */ + TMR_TMR16B1PR = 0x00; + + TMR_TMR16B1MR0 = delayInTicks; + + /* Reset all interrupts */ + TMR_TMR16B1IR = TMR_TMR16B1IR_MASK_ALL; + + /* Stop timer on match (MR0) */ + TMR_TMR16B1MCR = TMR_TMR16B1MCR_MR0_STOP_ENABLED; + + /* Start timer */ + TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERENABLE_ENABLED; + + /* Wait until the delay time has elapsed */ + while (TMR_TMR16B1TCR & TMR_TMR16B1TCR_COUNTERENABLE_ENABLED); + } + + return; +} + +/**************************************************************************/ +/*! + @brief Causes a blocking delay for the specified number of + microseconds + + @warning The maximum delay in uS will depend on the clock speed, + but running at 72MHz the maximum delay (MR = 0xFFFF) + would be 910uS (0xFFFF / 72 = 910), or 0.91 milliseconds. + + @param[in] timerNum + The 16-bit timer to user (0..1) + @param[in] delayInUs + The number of microseconds to wait + + @section Example + + @code + #include "/core/cpu/cpu.h" + #include "/core/timer16/timer16.h" + + int main(void) + { + cpuInit(); + + // Initialise timer 0 ... delay is provided but not used here + timer16Init(0, 0xFFFF); + + // Enable the timer + timer16Enable(0); + + while(1) + { + // Cause blocking delay for 500 microseconds (0.5mS) + timer16DelayUS(0, 500); + } + } + @endcode +*/ +/**************************************************************************/ +void timer16DelayUS(uint8_t timerNum, uint16_t delayInUS) +{ + // ToDo: Check if the appropriate timer is enabled first? + + if (timerNum == 0) + { + /* Reset the timer */ + TMR_TMR16B0TCR = TMR_TMR16B0TCR_COUNTERRESET_ENABLED; + + /* Set the prescaler to zero */ + TMR_TMR16B0PR = 0x00; + + TMR_TMR16B0MR0 = delayInUS * ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV)/1000000); + + /* Reset all interrupts */ + TMR_TMR16B0IR = TMR_TMR16B0IR_MASK_ALL; + + /* Stop timer on match (MR0) */ + TMR_TMR16B0MCR = TMR_TMR16B0MCR_MR0_STOP_ENABLED; + + /* Start timer */ + TMR_TMR16B0TCR = TMR_TMR16B0TCR_COUNTERENABLE_ENABLED; + + /* Wait until the delay time has elapsed */ + while (TMR_TMR16B0TCR & TMR_TMR16B0TCR_COUNTERENABLE_ENABLED); + } + + else if (timerNum == 1) + { + /* Reset the timer */ + TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERRESET_ENABLED; + + /* Set the prescaler to zero */ + TMR_TMR16B1PR = 0x00; + + TMR_TMR16B1MR0 = delayInUS * ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV)/1000000); + + /* Reset all interrupts */ + TMR_TMR16B1IR = TMR_TMR16B1IR_MASK_ALL; + + /* Stop timer on match (MR0) */ + TMR_TMR16B1MCR = TMR_TMR16B1MCR_MR0_STOP_ENABLED; + + /* Start timer */ + TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERENABLE_ENABLED; + + /* Wait until the delay time has elapsed */ + while (TMR_TMR16B1TCR & TMR_TMR16B1TCR_COUNTERENABLE_ENABLED); + } + + return; +} + +/**************************************************************************/ +/*! + @brief Interrupt handler for 16-bit timer 0 +*/ +/**************************************************************************/ +void TIMER16_0_IRQHandler(void) +{ + /* Clear the interrupt flag */ + TMR_TMR16B0IR = TMR_TMR16B0IR_MR0; + + /* Increment timer counter by 1 (it will automatically roll back to 0) */ + timer16_0_counter++; + return; +} + +/**************************************************************************/ +/*! + @brief Interrupt handler for 16-bit timer 1 +*/ +/**************************************************************************/ +void TIMER16_1_IRQHandler(void) +{ + /* Clear the interrupt flag */ + TMR_TMR16B1IR = TMR_TMR16B1IR_MR0; + + /* Increment timer counter by 1 (it will automatically roll back to 0) */ + timer16_1_counter++; + return; +} + +/**************************************************************************/ +/*! + @brief Enables the specified timer + + @param[in] timerNum + The 16-bit timer to enable (0..1) +*/ +/**************************************************************************/ +void timer16Enable(uint8_t timerNum) +{ + if ( timerNum == 0 ) + { + TMR_TMR16B0TCR = TMR_TMR16B0TCR_COUNTERENABLE_ENABLED; + } + + else if (timerNum == 1) + { + TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERENABLE_ENABLED; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Disables the specified timer + + @param[in] timerNum + The 16-bit timer to disable (0..1) +*/ +/**************************************************************************/ +void timer16Disable(uint8_t timerNum) +{ + if ( timerNum == 0 ) + { + TMR_TMR16B0TCR = TMR_TMR16B0TCR_COUNTERENABLE_DISABLED; + } + + else if (timerNum == 1) + { + TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERENABLE_DISABLED; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Resets the specified timer + + @param[in] timerNum + The 16-bit timer to reset (0..1) +*/ +/**************************************************************************/ +void timer16Reset(uint8_t timerNum) +{ + uint32_t regVal; + + if ( timerNum == 0 ) + { + regVal = TMR_TMR16B0TCR; + regVal |= TMR_TMR16B0TCR_COUNTERRESET_ENABLED; + TMR_TMR16B0TCR = regVal; + } + + else if (timerNum == 1) + { + regVal = TMR_TMR16B1TCR; + regVal |= TMR_TMR16B1TCR_COUNTERRESET_ENABLED; + TMR_TMR16B1TCR = regVal; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Initialises the specified 16-bit timer, sets the timer + interval, resets the timer, and configures the interrupt + handler. + + Initialises a 16-bit timer with the supplied timer interval (the + amount of time that passes between each timer 'tick'). Every time that + this interval elapses, the timer's interrupt will be fired and the + appropriate counter variable will be incremented by one (For example, + with CT16B0, 'timer16_0_counter' would be incremented). + + @param[in] timerNum + The 16-bit timer to initiliase (0..1) + @param[in] timerInterval + The number of clock 'ticks' between resets (0..65534) + + @warning Care needs to be taken when configuring the timers since + the pins are all multiplexed with other peripherals. This + code is provided as a starting point, but it will need to + be adjusted according to your own situation and + pin/peripheral requirements +*/ +/**************************************************************************/ +void timer16Init(uint8_t timerNum, uint16_t timerInterval) +{ + // If timerInterval is invalid, use the default value + if (timerInterval < 1) + { + timerInterval = TIMER16_DEFAULTINTERVAL; + } + + if ( timerNum == 0 ) + { + /* Enable the clock for CT16B0 */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT16B0); + + /* The physical pins associated with CT16B0 are not enabled by + default in order to avoid conflicts with other peripherals. + Pin 0.10 (CT16B0_MAT2), for example, can not be used while + debugging with a hardware debugger. If you require one or + more of these pins, simply uncomment the code below */ + + /* Configure PIO0.2 as Timer0_16 CAP0 */ + // IOCON_PIO0_2 &= ~IOCON_PIO0_2_FUNC_MASK; + // IOCON_PIO0_2 |= IOCON_PIO0_2_FUNC_CT16B0_CAP0; + + /* Configure PIO0.8 as Timer0_16 MAT0 */ + // IOCON_PIO0_8 &= ~IOCON_PIO0_8_FUNC_MASK; + // IOCON_PIO0_8 |= IOCON_PIO0_8_FUNC_CT16B0_MAT0; + + /* Configure PIO0.9 as Timer0_16 MAT1 */ + // IOCON_PIO0_9 &= ~IOCON_PIO0_9_FUNC_MASK; + // IOCON_PIO0_9 |= IOCON_PIO0_9_FUNC_CT16B0_MAT1; + + /* Configure PIO0.10 as Timer0_16 MAT3 */ + // IOCON_JTAG_TCK_PIO0_10 &= ~IOCON_JTAG_TCK_PIO0_10_FUNC_MASK; + // IOCON_JTAG_TCK_PIO0_10 |= IOCON_JTAG_TCK_PIO0_10_FUNC_CT16B0_MAT2; + + timer16_0_counter = 0; + TMR_TMR16B0MR0 = timerInterval; + + /* Configure match control register to raise an interrupt and reset on MR0 */ + TMR_TMR16B0MCR = (TMR_TMR16B0MCR_MR0_INT_ENABLED | TMR_TMR16B0MCR_MR0_RESET_ENABLED); + + /* Enable the TIMER0 interrupt */ + NVIC_EnableIRQ(TIMER_16_0_IRQn); + } + + else if ( timerNum == 1 ) + { + /* Enable the clock for CT16B1 */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT16B1); + + /* The physical pins associated with CT16B0 are not enabled by + default in order to avoid conflicts with other peripherals. + Pin 0.10 (CT16B0_MAT2), for example, can not be used while + debugging with a hardware debugger. If you require one or + more of these pins, simply uncomment the code below */ + + /* Configure PIO1.8 as Timer1_16 CAP0 */ + // IOCON_PIO1_8 &= ~IOCON_PIO1_8_FUNC_MASK; + // IOCON_PIO1_8 |= IOCON_PIO1_8_FUNC_CT16B1_CAP0; + + /* Configure PIO1.9 as Timer1_16 MAT0 */ + // IOCON_PIO1_9 &= ~IOCON_PIO1_9_FUNC_MASK; + // IOCON_PIO1_9 |= IOCON_PIO1_9_FUNC_CT16B1_MAT0; + + /* Configure PIO1.10 as Timer1_16 MAT1 */ + // IOCON_PIO1_10 &= ~IOCON_PIO1_10_FUNC_MASK; + // IOCON_PIO1_10 |= IOCON_PIO1_10_FUNC_CT16B1_MAT1; + + timer16_1_counter = 0; + TMR_TMR16B1MR0 = timerInterval; + + /* Configure match control register to raise an interrupt and reset on MR0 */ + TMR_TMR16B1MCR = (TMR_TMR16B1MCR_MR0_INT_ENABLED | TMR_TMR16B1MCR_MR0_RESET_ENABLED); + + /* Enable the TIMER1 Interrupt */ + NVIC_EnableIRQ(TIMER_16_1_IRQn); + } + return; +} diff --git a/macusbfb/core/timer16/timer16.h b/macusbfb/core/timer16/timer16.h new file mode 100644 index 0000000..dda4d9c --- /dev/null +++ b/macusbfb/core/timer16/timer16.h @@ -0,0 +1,59 @@ +/**************************************************************************/ +/*! + @file timer16.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef __TIMER16_H__ +#define __TIMER16_H__ + +#include "projectconfig.h" + +#define TIMER16_DEFAULTINTERVAL (0xFFFF) // ~0.91mS @ 72MHz, ~1.37mS @ 48MHz + +#define TIMER16_CCLK_100US ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 10000) +#define TIMER16_CCLK_1MS ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 1000) + +void TIMER16_0_IRQHandler(void); +void TIMER16_1_IRQHandler(void); + +void timer16DelayTicks(uint8_t timerNum, uint16_t delayInTicks); +void timer16DelayUS(uint8_t timerNum, uint16_t delayInUS); +void timer16Enable(uint8_t timerNum); +void timer16Disable(uint8_t timerNum); +void timer16Reset(uint8_t timerNum); +void timer16Init(uint8_t timerNum, uint16_t timerInterval); + +#endif diff --git a/macusbfb/core/timer32/timer32.c b/macusbfb/core/timer32/timer32.c new file mode 100644 index 0000000..cccd377 --- /dev/null +++ b/macusbfb/core/timer32/timer32.c @@ -0,0 +1,344 @@ +/**************************************************************************/ +/*! + @file timer32.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Generic code for 32-bit timers. By default, the timers are configured + to generate an interrupt once every 100 microseconds, incrementing a + global variable once per tick. + + @warning Please note that the ROM-based USB drivers on the LPC1343 + require the use of 32-bit Timer 1. If you plan on using the + ROM-based USB functionality, you should restrict your timer + usage to 32-bit timer 0. + + @section Example + + @code + #include "/core/cpu/cpu.h" + #include "/core/timer32/timer32.h" + ... + cpuInit(); + + // Initialise 32-bit timer 0 with 100uS ticks + timer32Init(0, TIMER32_DEFAULTINTERVAL); + + // Enable timer 0 + timer32Enable(0); + + // Cause a blocking delay for 1 second (1000mS) + timer32Delay(0, TIMER32_DELAY_1MS * 1000); + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "timer32.h" + +volatile uint32_t timer32_0_counter = 0; +volatile uint32_t timer32_1_counter = 0; + +/**************************************************************************/ +/*! + @brief Causes a blocking delay for the specified number of + timer ticks. The duration of each 'tick' is determined by + the 'timerInterval' property supplied to timer32Init. + + @param[in] timerNum + The 32-bit timer to user (0..1) + @param[in] delay + The number of counter increments to wait +*/ +/**************************************************************************/ +void timer32Delay(uint8_t timerNum, uint32_t delay) +{ + uint32_t curTicks; + + if (timerNum == 0) + { + curTicks = timer32_0_counter; + if (curTicks > 0xFFFFFFFF - delay) + { + // Rollover will occur during delay + while (timer32_0_counter >= curTicks) + { + while (timer32_0_counter < (delay - (0xFFFFFFFF - curTicks))); + } + } + else + { + while ((timer32_0_counter - curTicks) < delay); + } + } + + else if (timerNum == 1) + { + curTicks = timer32_1_counter; + if (curTicks > 0xFFFFFFFF - delay) + { + // Rollover will occur during delay + while (timer32_1_counter >= curTicks) + { + while (timer32_1_counter < (delay - (0xFFFFFFFF - curTicks))); + } + } + else + { + while ((timer32_1_counter - curTicks) < delay); + } + } + + return; +} + +/**************************************************************************/ +/*! + @brief Interrupt handler for 32-bit timer 0 +*/ +/**************************************************************************/ +void TIMER32_0_IRQHandler(void) +{ + /* Clear the interrupt flag */ + TMR_TMR32B0IR = TMR_TMR32B0IR_MR0; + + /* If you wish to perform some action after each timer 'tick' (such as + incrementing a counter variable) you can do so here */ + timer32_0_counter++; + + return; +} + +/**************************************************************************/ +/*! + @brief Interrupt handler for 32-bit timer 1 +*/ +/**************************************************************************/ +void TIMER32_1_IRQHandler(void) +{ + /* Clear the interrupt flag */ + TMR_TMR32B1IR = TMR_TMR32B1IR_MR0; + + /* If you wish to perform some action after each timer 'tick' (such as + incrementing a counter variable) you can do so here */ + timer32_1_counter++; + + return; +} + +/**************************************************************************/ +/*! + @brief Enables the specified timer + + @param[in] timerNum + The 32-bit timer to enable (0..1) +*/ +/**************************************************************************/ +void timer32Enable(uint8_t timerNum) +{ + if ( timerNum == 0 ) + { + TMR_TMR32B0TCR = TMR_TMR32B0TCR_COUNTERENABLE_ENABLED; + } + + else if (timerNum == 1) + { + TMR_TMR32B1TCR = TMR_TMR32B1TCR_COUNTERENABLE_ENABLED; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Disables the specified timer + + @param[in] timerNum + The 32-bit timer to disable (0..1) +*/ +/**************************************************************************/ +void timer32Disable(uint8_t timerNum) +{ + if ( timerNum == 0 ) + { + TMR_TMR32B0TCR = TMR_TMR32B0TCR_COUNTERENABLE_DISABLED; + } + + else if (timerNum == 1) + { + TMR_TMR32B1TCR = TMR_TMR32B1TCR_COUNTERENABLE_DISABLED; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Resets the specified timer + + @param[in] timerNum + The 32-bit timer to reset (0..1) +*/ +/**************************************************************************/ +void timer32Reset(uint8_t timerNum) +{ + uint32_t regVal; + + if ( timerNum == 0 ) + { + regVal = TMR_TMR32B0TCR; + regVal |= TMR_TMR32B0TCR_COUNTERRESET_ENABLED; + TMR_TMR32B0TCR = regVal; + } + + else if (timerNum == 1) + { + regVal = TMR_TMR32B1TCR; + regVal |= TMR_TMR32B1TCR_COUNTERRESET_ENABLED; + TMR_TMR32B1TCR = regVal; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Initialises the specified 32-bit timer, and configures the + timer to raise an interrupt and reset on match on MR0. + + @param[in] timerNum + The 32-bit timer to initiliase (0..1) + @param[in] timerInterval + The number of clock 'ticks' between resets (0..0xFFFFFFFF) + + @note Care needs to be taken when configuring the timers since the + pins are all multiplexed with other peripherals. This code is + provided as a starting point, but it will need to be adjusted + according to your own situation and pin/peripheral requirements +*/ +/**************************************************************************/ +void timer32Init(uint8_t timerNum, uint32_t timerInterval) +{ + // If timerInterval is invalid, use the default value + if (timerInterval < 1) + { + timerInterval = TIMER32_DEFAULTINTERVAL; + } + + if ( timerNum == 0 ) + { + /* Enable the clock for CT32B0 */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B0); + + /* The physical pins associated with CT32B0 are not enabled by + default in order to avoid conflicts with other peripherals. If + you wish to use any of the pin-dependant functionality, simply + uncomment the appropriate lines below. */ + + /* Configure PIO1.5 as Timer0_32 CAP0 */ + // IOCON_PIO1_5 &= ~IOCON_PIO1_5_FUNC_MASK; + // IOCON_PIO1_5 |= IOCON_PIO1_5_FUNC_CT32B0_CAP0; + + /* Configure PIO1.6 as Timer0_32 MAT0 */ + // IOCON_PIO1_6 &= ~IOCON_PIO1_6_FUNC_MASK; + // IOCON_PIO1_6 |= IOCON_PIO1_6_FUNC_CT32B0_MAT0; + + /* Configure PIO1.7 as Timer0_32 MAT1 */ + // IOCON_PIO1_7 &= ~IOCON_PIO1_7_FUNC_MASK; + // IOCON_PIO1_7 |= IOCON_PIO1_7_FUNC_CT32B0_MAT1; + + /* Configure PIO0.1 as Timer0_32 MAT2 */ + // IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK; + // IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CT32B0_MAT2; + + /* Configure PIO0.11 as Timer0_32 MAT3 */ + /* Note: This pint can not be used with JTAG/SWD */ + // IOCON_JTAG_TDI_PIO0_11 &= ~IOCON_JTAG_TDI_PIO0_11_FUNC_MASK; + // IOCON_JTAG_TDI_PIO0_11 |= IOCON_JTAG_TDI_PIO0_11_FUNC_CT32B0_MAT3; + + timer32_0_counter = 0; + TMR_TMR32B0MR0 = timerInterval; + + /* Configure match control register to raise an interrupt and reset on MR0 */ + TMR_TMR32B0MCR = (TMR_TMR32B0MCR_MR0_INT_ENABLED | TMR_TMR32B0MCR_MR0_RESET_ENABLED); + + /* Enable the TIMER0 interrupt */ + NVIC_EnableIRQ(TIMER_32_0_IRQn); + } + + else if ( timerNum == 1 ) + { + /* Enable the clock for CT32B1 */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B1); + + /* The physical pins associated with CT32B0 are not enabled by + default in order to avoid conflicts with other peripherals. */ + + /* Configure PIO1.0 as Timer1_32 CAP0 */ + /* Note: This pint can not be used with JTAG/SWD */ + // IOCON_JTAG_TMS_PIO1_0 &= ~IOCON_JTAG_TMS_PIO1_0_FUNC_MASK; + // IOCON_JTAG_TMS_PIO1_0 |= IOCON_JTAG_TMS_PIO1_0_FUNC_CT32B1_CAP0; + + /* Configure PIO1.1 as Timer1_32 MAT0 */ + /* Note: This pint can not be used with JTAG/SWD */ + // IOCON_JTAG_TDO_PIO1_1 &= ~IOCON_JTAG_TDO_PIO1_1_FUNC_MASK; + // IOCON_JTAG_TDO_PIO1_1 |= IOCON_JTAG_TDO_PIO1_1_FUNC_CT32B1_MAT0; + + /* Configure PIO1.2 as Timer1_32 MAT1 */ + /* Note: This pint can not be used with JTAG/SWD */ + // IOCON_JTAG_nTRST_PIO1_2 &= ~IOCON_JTAG_nTRST_PIO1_2_FUNC_MASK; + // IOCON_JTAG_nTRST_PIO1_2 |= IOCON_JTAG_nTRST_PIO1_2_FUNC_CT32B1_MAT1; + + /* Configure PIO1.3 as Timer1_32 MAT2 */ + /* Note: This pint can not be used with JTAG/SWD */ + // IOCON_SWDIO_PIO1_3 &= ~IOCON_SWDIO_PIO1_3_FUNC_MASK; + // IOCON_SWDIO_PIO1_3 |= IOCON_SWDIO_PIO1_3_FUNC_CT32B1_MAT2; + + /* Configure PIO1.4 as Timer1_32 MAT3 */ + // IOCON_PIO1_4 &= ~IOCON_PIO1_4_FUNC_MASK; + // IOCON_PIO1_4 |= IOCON_PIO1_4_FUNC_CT32B1_MAT3; + + timer32_1_counter = 0; + TMR_TMR32B1MR0 = timerInterval; + + /* Configure match control register to raise an interrupt and reset on MR0 */ + TMR_TMR32B1MCR = (TMR_TMR32B1MCR_MR0_INT_ENABLED | TMR_TMR32B1MCR_MR0_RESET_ENABLED); + + /* Enable the TIMER1 Interrupt */ + NVIC_EnableIRQ(TIMER_32_1_IRQn); + } + return; +} + + diff --git a/macusbfb/core/timer32/timer32.h b/macusbfb/core/timer32/timer32.h new file mode 100644 index 0000000..ef2dc5e --- /dev/null +++ b/macusbfb/core/timer32/timer32.h @@ -0,0 +1,66 @@ +/**************************************************************************/ +/*! + @file timer32.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef __TIMER32_H__ +#define __TIMER32_H__ + +#include "projectconfig.h" + +#define TIMER32_CCLK_1US ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 1000000) +#define TIMER32_CCLK_10US ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 100000) +#define TIMER32_CCLK_100US ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 10000) +#define TIMER32_CCLK_1MS ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 1000) +#define TIMER32_CCLK_10MS ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 100) +#define TIMER32_CCLK_100MS ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 10) +#define TIMER32_CCLK_1S (CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) +#define TIMER32_DEFAULTINTERVAL (TIMER32_CCLK_100US) + +#define TIMER32_DELAY_100US (1) // 100uS delay = 1 tick +#define TIMER32_DELAY_1MS (10) // 1mS delay = 10 ticks +#define TIMER32_DELAY_1S (10000) // 1S delay = 10000 ticks + +void TIMER32_0_IRQHandler(void); +void TIMER32_1_IRQHandler(void); + +void timer32Delay(uint8_t timerNum, uint32_t delay); +void timer32Enable(uint8_t timerNum); +void timer32Disable(uint8_t timerNum); +void timer32Reset(uint8_t timerNum); +void timer32Init(uint8_t timerNum, uint32_t timerInterval); + +#endif diff --git a/macusbfb/core/uart/uart.c b/macusbfb/core/uart/uart.c new file mode 100644 index 0000000..ca91562 --- /dev/null +++ b/macusbfb/core/uart/uart.c @@ -0,0 +1,346 @@ +/**************************************************************************/ +/*! + @file uart.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Generic code for UART-based communication. Incoming text is stored + in a FIFO Queue for safer processing. + + @section Example: Sending text via UART + + @code + #include "core/cpu/cpu.h" + #include "core/uart/uart.h" + ... + #define UARTBUFFERSIZE 5 + ... + cpuInit(); + uartInit(57600); + ... + uint8_t uartBuffer[UARTBUFFERSIZE] = { 'T', 'e', 's', 't', '\n' }; + + // Send contents of uartBuffer + uartSend((uint8_t *)uartBuffer, UARTBUFFERSIZE); + @endcode + + @section Example: Reading from UART + + @code + + #include "core/cpu/cpu.h" + #include "core/uart/uart.h" + + cpuInit(); + uartInit(57600); + + // Get a reference to the UART control block + uart_pcb_t *pcb = uartGetPCB(); + + // Read any text available in the queue + while (uartRxBufferDataPending()) + { + // Read the first available character + uint8_t c = uartRxBufferRead(); + + // read out the data in the buffer and echo it back to the host. + switch (c) + { + case '\r': + printf("\n\r"); + break; + default: + printf("%c", c); + break; + } + } + + #endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include + +#include "uart.h" + +#ifdef CFG_INTERFACE_UART + #include "core/cmd/cmd.h" +#endif + +/**************************************************************************/ +/*! + UART protocol control block, which is used to safely access the + RX FIFO buffer from elsewhere in the code. This should be accessed + through 'uartGetPCB()'. +*/ +/**************************************************************************/ +static uart_pcb_t pcb; + +/**************************************************************************/ +/*! + IRQ to handle incoming data, etc. +*/ +/**************************************************************************/ +void UART_IRQHandler(void) +{ + uint8_t IIRValue, LSRValue; + uint8_t Dummy = Dummy; + + IIRValue = UART_U0IIR; + IIRValue &= ~(UART_U0IIR_IntStatus_MASK); /* skip pending bit in IIR */ + IIRValue &= UART_U0IIR_IntId_MASK; /* check bit 1~3, interrupt identification */ + + // 1.) Check receiver line status + if (IIRValue == UART_U0IIR_IntId_RLS) + { + LSRValue = UART_U0LSR; + // Check for errors + if (LSRValue & (UART_U0LSR_OE | UART_U0LSR_PE | UART_U0LSR_FE | UART_U0LSR_RXFE | UART_U0LSR_BI)) + { + /* There are errors or break interrupt */ + /* Read LSR will clear the interrupt */ + pcb.status = LSRValue; + Dummy = UART_U0RBR; /* Dummy read on RX to clear interrupt, then bail out */ + return; + } + // No error and receive data is ready + if (LSRValue & UART_U0LSR_RDR_DATA) + { + /* If no error on RLS, normal ready, save into the data buffer. */ + /* Note: read RBR will clear the interrupt */ + uartRxBufferWrite(UART_U0RBR); + } + } + + // 2.) Check receive data available + else if (IIRValue == UART_U0IIR_IntId_RDA) + { + // Add incoming text to UART buffer + uartRxBufferWrite(UART_U0RBR); + } + + // 3.) Check character timeout indicator + else if (IIRValue == UART_U0IIR_IntId_CTI) + { + /* Bit 9 as the CTI error */ + pcb.status |= 0x100; + } + + // 4.) Check THRE (transmit holding register empty) + else if (IIRValue == UART_U0IIR_IntId_THRE) + { + /* Check status in the LSR to see if valid data in U0THR or not */ + LSRValue = UART_U0LSR; + if (LSRValue & UART_U0LSR_THRE) + { + pcb.pending_tx_data = 0; + } + else + { + pcb.pending_tx_data= 1; + } + } + return; +} + +/**************************************************************************/ +/*! + @brief Get a pointer to the UART's protocol control block, which can + be used to control the RX FIFO buffer and check whether UART + has already been initialised or not. + + @section Example + + @code + // Make sure that UART is initialised + uart_pcb_t *pcb = uartGetPCB(); + if (!pcb->initialised) + { + uartInit(CFG_UART_BAUDRATE); + } + @endcode + +*/ +/**************************************************************************/ +uart_pcb_t *uartGetPCB() +{ + return &pcb; +} + +/**************************************************************************/ +/*! + @brief Initialises UART at the specified baud rate. + + @param[in] baudRate + The baud rate to use when configuring the UART. +*/ +/**************************************************************************/ +void uartInit(uint32_t baudrate) +{ + uint32_t fDiv; + uint32_t regVal; + + NVIC_DisableIRQ(UART_IRQn); + + // Clear protocol control blocks + memset(&pcb, 0, sizeof(uart_pcb_t)); + pcb.pending_tx_data = 0; + uartRxBufferInit(); + + /* Set 1.6 UART RXD */ + IOCON_PIO1_6 &= ~IOCON_PIO1_6_FUNC_MASK; + IOCON_PIO1_6 |= IOCON_PIO1_6_FUNC_UART_RXD; + + /* Set 1.7 UART TXD */ + IOCON_PIO1_7 &= ~IOCON_PIO1_7_FUNC_MASK; + IOCON_PIO1_7 |= IOCON_PIO1_7_FUNC_UART_TXD; + + /* Enable UART clock */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_UART); + SCB_UARTCLKDIV = SCB_UARTCLKDIV_DIV1; /* divided by 1 */ + + /* 8 bits, no Parity, 1 Stop bit */ + UART_U0LCR = (UART_U0LCR_Word_Length_Select_8Chars | + UART_U0LCR_Stop_Bit_Select_1Bits | + UART_U0LCR_Parity_Disabled | + UART_U0LCR_Parity_Select_OddParity | + UART_U0LCR_Break_Control_Disabled | + UART_U0LCR_Divisor_Latch_Access_Enabled); + + /* Baud rate */ + regVal = SCB_UARTCLKDIV; + fDiv = (((CFG_CPU_CCLK * SCB_SYSAHBCLKDIV)/regVal)/16)/baudrate; + + UART_U0DLM = fDiv / 256; + UART_U0DLL = fDiv % 256; + + /* Set DLAB back to 0 */ + UART_U0LCR = (UART_U0LCR_Word_Length_Select_8Chars | + UART_U0LCR_Stop_Bit_Select_1Bits | + UART_U0LCR_Parity_Disabled | + UART_U0LCR_Parity_Select_OddParity | + UART_U0LCR_Break_Control_Disabled | + UART_U0LCR_Divisor_Latch_Access_Disabled); + + /* Enable and reset TX and RX FIFO. */ + UART_U0FCR = (UART_U0FCR_FIFO_Enabled | + UART_U0FCR_Rx_FIFO_Reset | + UART_U0FCR_Tx_FIFO_Reset); + + /* Read to clear the line status. */ + regVal = UART_U0LSR; + + /* Ensure a clean start, no data in either TX or RX FIFO. */ + while (( UART_U0LSR & (UART_U0LSR_THRE|UART_U0LSR_TEMT)) != (UART_U0LSR_THRE|UART_U0LSR_TEMT) ); + while ( UART_U0LSR & UART_U0LSR_RDR_DATA ) + { + /* Dump data from RX FIFO */ + regVal = UART_U0RBR; + } + + /* Set the initialised flag in the protocol control block */ + pcb.initialised = 1; + + /* Enable the UART Interrupt */ + NVIC_EnableIRQ(UART_IRQn); + UART_U0IER = UART_U0IER_RBR_Interrupt_Enabled | UART_U0IER_RLS_Interrupt_Enabled; + + return; +} + +/**************************************************************************/ +/*! + @brief Sends the contents of supplied text buffer over UART. + + @param[in] bufferPtr + Pointer to the text buffer + @param[in] bufferPtr + The size of the text buffer + + @section Example + + @code + // Set 5-character text buffer + uint8_t uartBuffer[5] = { 'T', 'e', 's', 't', '\n' }; + // Send contents of uartBuffer + uartSend((uint8_t *)uartBuffer, 5); + @endcode + +*/ +/**************************************************************************/ +void uartSend (uint8_t *bufferPtr, uint32_t length) +{ + while (length != 0) + { + /* THRE status, contain valid data */ + while ( !(UART_U0LSR & UART_U0LSR_THRE) ); + UART_U0THR = *bufferPtr; + + bufferPtr++; + length--; + } + + return; +} + +/**************************************************************************/ +/*! + @brief Sends a single byte over UART. + + @param[in] byte + Byte value to send + + @section Example + + @code + // Send 0xFF over UART + uartSendByte(0xFF); + // Send 'B' over UART (note single quotes) + uartSendByte('B'); + @endcode + +*/ +/**************************************************************************/ +void uartSendByte (uint8_t byte) +{ + /* THRE status, contain valid data */ + while ( !(UART_U0LSR & UART_U0LSR_THRE) ); + UART_U0THR = byte; + + return; +} + + + diff --git a/macusbfb/core/uart/uart.h b/macusbfb/core/uart/uart.h new file mode 100644 index 0000000..4cf3a45 --- /dev/null +++ b/macusbfb/core/uart/uart.h @@ -0,0 +1,76 @@ +/**************************************************************************/ +/*! + @file uart.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef __UART_H__ +#define __UART_H__ + +#include "projectconfig.h" + +// Buffer used for circular fifo +typedef struct _uart_buffer_t +{ + uint8_t ep_dir; + volatile uint8_t len; + volatile uint8_t wr_ptr; + volatile uint8_t rd_ptr; + uint8_t buf[CFG_UART_BUFSIZE]; +} uart_buffer_t; + +// UART Protocol control block +typedef struct _uart_pcb_t +{ + BOOL initialised; + uint32_t status; + uint32_t pending_tx_data; + uart_buffer_t rxfifo; +} uart_pcb_t; + +void UART_IRQHandler(void); +uart_pcb_t *uartGetPCB(); +void uartInit(uint32_t Baudrate); +void uartSend(uint8_t *BufferPtr, uint32_t Length); +void uartSendByte (uint8_t byte); + +// Rx Buffer access control +void uartRxBufferInit(); +uint8_t uartRxBufferRead(); +void uartRxBufferWrite(uint8_t data); +void uartRxBufferClearFIFO(); +uint8_t uartRxBufferDataPending(); + +#endif diff --git a/macusbfb/core/uart/uart_buf.c b/macusbfb/core/uart/uart_buf.c new file mode 100644 index 0000000..48b153b --- /dev/null +++ b/macusbfb/core/uart/uart_buf.c @@ -0,0 +1,129 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. +*******************************************************************/ + +/**************************************************************************/ +/*! + @file uart_buf.c + @author Christopher Wang (Freaklabs) + Modified by: K. Townsend (microBuilder.eu) + @date 19 May 2010 + + Original code taken from the FreakUSB Open Source USB Device Stack + http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html + + If it works well, you can thank Akiba at Freaklabs. If it fails + miserably, you can blame me (since parts of it it were rather + ungraciously modified). :-) + +*/ +/**************************************************************************/ + +#include "uart.h" + +/**************************************************************************/ +/*! + Initialises the RX FIFO buffer +*/ +/**************************************************************************/ +void uartRxBufferInit() +{ + uart_pcb_t *pcb = uartGetPCB(); + pcb->rxfifo.len = 0; +} + +/**************************************************************************/ +/*! + Read one byte out of the RX buffer. This function will return the byte + located at the array index of the read pointer, and then increment the + read pointer index. If the read pointer exceeds the maximum buffer + size, it will roll over to zero. +*/ +/**************************************************************************/ +uint8_t uartRxBufferRead() +{ + uart_pcb_t *pcb = uartGetPCB(); + uint8_t data; + + data = pcb->rxfifo.buf[pcb->rxfifo.rd_ptr]; + pcb->rxfifo.rd_ptr = (pcb->rxfifo.rd_ptr + 1) % CFG_UART_BUFSIZE; + pcb->rxfifo.len--; + return data; +} + +/**************************************************************************/ +/*! + Write one byte into the RX buffer. This function will write one + byte into the array index specified by the write pointer and increment + the write index. If the write index exceeds the max buffer size, then it + will roll over to zero. +*/ +/**************************************************************************/ +void uartRxBufferWrite(uint8_t data) +{ + uart_pcb_t *pcb = uartGetPCB(); + + pcb->rxfifo.buf[pcb->rxfifo.wr_ptr] = data; + pcb->rxfifo.wr_ptr = (pcb->rxfifo.wr_ptr + 1) % CFG_UART_BUFSIZE; + pcb->rxfifo.len++; +} + +/**************************************************************************/ +/*! + Clear the fifo read and write pointers and set the length to zero. +*/ +/**************************************************************************/ +void uartRxBufferClearFIFO() +{ + uart_pcb_t *pcb = uartGetPCB(); + + pcb->rxfifo.rd_ptr = 0; + pcb->rxfifo.wr_ptr = 0; + pcb->rxfifo.len = 0; +} + +/**************************************************************************/ +/*! + Check whether there is any data pending on the RX buffer. +*/ +/**************************************************************************/ +uint8_t uartRxBufferDataPending() +{ + uart_pcb_t *pcb = uartGetPCB(); + + if (pcb->rxfifo.len != 0) + { + return 1; + } + + return 0; +} diff --git a/macusbfb/core/usbcdc/cdc.h b/macusbfb/core/usbcdc/cdc.h new file mode 100644 index 0000000..f7af7d3 --- /dev/null +++ b/macusbfb/core/usbcdc/cdc.h @@ -0,0 +1,236 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: CDC.h + * Purpose: USB Communication Device Class Definitions + * Version: V1.00 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __CDC_H +#define __CDC_H + +/*---------------------------------------------------------------------------- + * Definitions based on usbcdc11.pdf (www.usb.org) + *---------------------------------------------------------------------------*/ +// Communication device class specification version 1.10 +#define CDC_V1_10 0x0110 + +// Communication interface class code +// (usbcdc11.pdf, 4.2, Table 15) +#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 + +// Communication interface class subclass codes +// (usbcdc11.pdf, 4.3, Table 16) +#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01 +#define CDC_ABSTRACT_CONTROL_MODEL 0x02 +#define CDC_TELEPHONE_CONTROL_MODEL 0x03 +#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04 +#define CDC_CAPI_CONTROL_MODEL 0x05 +#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06 +#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07 + +// Communication interface class control protocol codes +// (usbcdc11.pdf, 4.4, Table 17) +#define CDC_PROTOCOL_COMMON_AT_COMMANDS 0x01 + +// Data interface class code +// (usbcdc11.pdf, 4.5, Table 18) +#define CDC_DATA_INTERFACE_CLASS 0x0A + +// Data interface class protocol codes +// (usbcdc11.pdf, 4.7, Table 19) +#define CDC_PROTOCOL_ISDN_BRI 0x30 +#define CDC_PROTOCOL_HDLC 0x31 +#define CDC_PROTOCOL_TRANSPARENT 0x32 +#define CDC_PROTOCOL_Q921_MANAGEMENT 0x50 +#define CDC_PROTOCOL_Q921_DATA_LINK 0x51 +#define CDC_PROTOCOL_Q921_MULTIPLEXOR 0x52 +#define CDC_PROTOCOL_V42 0x90 +#define CDC_PROTOCOL_EURO_ISDN 0x91 +#define CDC_PROTOCOL_V24_RATE_ADAPTATION 0x92 +#define CDC_PROTOCOL_CAPI 0x93 +#define CDC_PROTOCOL_HOST_BASED_DRIVER 0xFD +#define CDC_PROTOCOL_DESCRIBED_IN_PUFD 0xFE + +// Type values for bDescriptorType field of functional descriptors +// (usbcdc11.pdf, 5.2.3, Table 24) +#define CDC_CS_INTERFACE 0x24 +#define CDC_CS_ENDPOINT 0x25 + +// Type values for bDescriptorSubtype field of functional descriptors +// (usbcdc11.pdf, 5.2.3, Table 25) +#define CDC_HEADER 0x00 +#define CDC_CALL_MANAGEMENT 0x01 +#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 +#define CDC_DIRECT_LINE_MANAGEMENT 0x03 +#define CDC_TELEPHONE_RINGER 0x04 +#define CDC_REPORTING_CAPABILITIES 0x05 +#define CDC_UNION 0x06 +#define CDC_COUNTRY_SELECTION 0x07 +#define CDC_TELEPHONE_OPERATIONAL_MODES 0x08 +#define CDC_USB_TERMINAL 0x09 +#define CDC_NETWORK_CHANNEL 0x0A +#define CDC_PROTOCOL_UNIT 0x0B +#define CDC_EXTENSION_UNIT 0x0C +#define CDC_MULTI_CHANNEL_MANAGEMENT 0x0D +#define CDC_CAPI_CONTROL_MANAGEMENT 0x0E +#define CDC_ETHERNET_NETWORKING 0x0F +#define CDC_ATM_NETWORKING 0x10 + +// CDC class-specific request codes +// (usbcdc11.pdf, 6.2, Table 46) +// see Table 45 for info about the specific requests. +#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define CDC_SET_COMM_FEATURE 0x02 +#define CDC_GET_COMM_FEATURE 0x03 +#define CDC_CLEAR_COMM_FEATURE 0x04 +#define CDC_SET_AUX_LINE_STATE 0x10 +#define CDC_SET_HOOK_STATE 0x11 +#define CDC_PULSE_SETUP 0x12 +#define CDC_SEND_PULSE 0x13 +#define CDC_SET_PULSE_TIME 0x14 +#define CDC_RING_AUX_JACK 0x15 +#define CDC_SET_LINE_CODING 0x20 +#define CDC_GET_LINE_CODING 0x21 +#define CDC_SET_CONTROL_LINE_STATE 0x22 +#define CDC_SEND_BREAK 0x23 +#define CDC_SET_RINGER_PARMS 0x30 +#define CDC_GET_RINGER_PARMS 0x31 +#define CDC_SET_OPERATION_PARMS 0x32 +#define CDC_GET_OPERATION_PARMS 0x33 +#define CDC_SET_LINE_PARMS 0x34 +#define CDC_GET_LINE_PARMS 0x35 +#define CDC_DIAL_DIGITS 0x36 +#define CDC_SET_UNIT_PARAMETER 0x37 +#define CDC_GET_UNIT_PARAMETER 0x38 +#define CDC_CLEAR_UNIT_PARAMETER 0x39 +#define CDC_GET_PROFILE 0x3A +#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define CDC_SET_ETHERNET_PMP_FILTER 0x41 +#define CDC_GET_ETHERNET_PMP_FILTER 0x42 +#define CDC_SET_ETHERNET_PACKET_FILTER 0x43 +#define CDC_GET_ETHERNET_STATISTIC 0x44 +#define CDC_SET_ATM_DATA_FORMAT 0x50 +#define CDC_GET_ATM_DEVICE_STATISTICS 0x51 +#define CDC_SET_ATM_DEFAULT_VC 0x52 +#define CDC_GET_ATM_VC_STATISTICS 0x53 + +// Communication feature selector codes +// (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) +#define CDC_ABSTRACT_STATE 0x01 +#define CDC_COUNTRY_SETTING 0x02 + +// Feature Status returned for ABSTRACT_STATE Selector +// (usbcdc11.pdf, 6.2.3, Table 48) +#define CDC_IDLE_SETTING (1 << 0) +#define CDC_DATA_MULTPLEXED_STATE (1 << 1) + + +// Control signal bitmap values for the SetControlLineState request +// (usbcdc11.pdf, 6.2.14, Table 51) +#define CDC_DTE_PRESENT (1 << 0) +#define CDC_ACTIVATE_CARRIER (1 << 1) + +// CDC class-specific notification codes +// (usbcdc11.pdf, 6.3, Table 68) +// see Table 67 for Info about class-specific notifications +#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00 +#define CDC_RESPONSE_AVAILABLE 0x01 +#define CDC_AUX_JACK_HOOK_STATE 0x08 +#define CDC_RING_DETECT 0x09 +#define CDC_NOTIFICATION_SERIAL_STATE 0x20 +#define CDC_CALL_STATE_CHANGE 0x28 +#define CDC_LINE_STATE_CHANGE 0x29 +#define CDC_CONNECTION_SPEED_CHANGE 0x2A + +// UART state bitmap values (Serial state notification). +// (usbcdc11.pdf, 6.3.5, Table 69) +#define CDC_SERIAL_STATE_OVERRUN (1 << 6) // receive data overrun error has occurred +#define CDC_SERIAL_STATE_PARITY (1 << 5) // parity error has occurred +#define CDC_SERIAL_STATE_FRAMING (1 << 4) // framing error has occurred +#define CDC_SERIAL_STATE_RING (1 << 3) // state of ring signal detection +#define CDC_SERIAL_STATE_BREAK (1 << 2) // state of break detection +#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) // state of transmission carrier +#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) // state of receiver carrier + + +/*---------------------------------------------------------------------------- + * Structures based on usbcdc11.pdf (www.usb.org) + *---------------------------------------------------------------------------*/ + +// Header functional descriptor +// (usbcdc11.pdf, 5.2.3.1) +// This header must precede any list of class-specific descriptors. +typedef struct _CDC_HEADER_DESCRIPTOR{ + uint8_t bFunctionLength; // size of this descriptor in bytes + uint8_t bDescriptorType; // CS_INTERFACE descriptor type + uint8_t bDescriptorSubtype; // Header functional descriptor subtype + uint16_t bcdCDC; // USB CDC specification release version +} __attribute__((packed)) CDC_HEADER_DESCRIPTOR; + +//Call management functional descriptor +// (usbcdc11.pdf, 5.2.3.2) +// Describes the processing of calls for the communication class interface. +typedef struct _CDC_CALL_MANAGEMENT_DESCRIPTOR { + uint8_t bFunctionLength; // size of this descriptor in bytes + uint8_t bDescriptorType; // CS_INTERFACE descriptor type + uint8_t bDescriptorSubtype; // call management functional descriptor subtype + uint8_t bmCapabilities; // capabilities that this configuration supports + uint8_t bDataInterface; // interface number of the data class interface used for call management (optional) +} __attribute__((packed)) CDC_CALL_MANAGEMENT_DESCRIPTOR; + +// Abstract control management functional descriptor +// (usbcdc11.pdf, 5.2.3.3) +// Describes the command supported by the communication interface class with the Abstract Control Model subclass code. +typedef struct _CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR { + uint8_t bFunctionLength; // size of this descriptor in bytes + uint8_t bDescriptorType; // CS_INTERFACE descriptor type + uint8_t bDescriptorSubtype; // abstract control management functional descriptor subtype + uint8_t bmCapabilities; // capabilities supported by this configuration +} __attribute__((packed)) CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR; + +// Union functional descriptors +// (usbcdc11.pdf, 5.2.3.8) +// Describes the relationship between a group of interfaces that can be considered to form a functional unit. +typedef struct _CDC_UNION_DESCRIPTOR { + uint8_t bFunctionLength; // size of this descriptor in bytes + uint8_t bDescriptorType; // CS_INTERFACE descriptor type + uint8_t bDescriptorSubtype; // union functional descriptor subtype + uint8_t bMasterInterface; // interface number designated as master +} __attribute__((packed)) CDC_UNION_DESCRIPTOR; + +// Union functional descriptors with one slave interface +// (usbcdc11.pdf, 5.2.3.8) +typedef struct _CDC_UNION_1SLAVE_DESCRIPTOR { + CDC_UNION_DESCRIPTOR sUnion; // Union functional descriptor + uint8_t bSlaveInterfaces[1]; // Slave interface 0 +} __attribute__((packed)) CDC_UNION_1SLAVE_DESCRIPTOR; + +// Line coding structure +// Format of the data returned when a GetLineCoding request is received +// (usbcdc11.pdf, 6.2.13) +typedef struct _CDC_LINE_CODING { + uint32_t dwDTERate; // Data terminal rate in bits per second + uint8_t bCharFormat; // Number of stop bits + uint8_t bParityType; // Parity bit type + uint8_t bDataBits; // Number of data bits +} __attribute__((packed)) CDC_LINE_CODING; + +// Notification header +// Data sent on the notification endpoint must follow this header. +// see USB_SETUP_PACKET in file usb.h +typedef USB_SETUP_PACKET CDC_NOTIFICATION_HEADER; + +#endif /* __CDC_H */ + diff --git a/macusbfb/core/usbcdc/cdcuser.c b/macusbfb/core/usbcdc/cdcuser.c new file mode 100644 index 0000000..07236df --- /dev/null +++ b/macusbfb/core/usbcdc/cdcuser.c @@ -0,0 +1,371 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: cdcuser.c + * Purpose: USB Communication Device Class User module + * Version: V1.10 + *---------------------------------------------------------------------------- +* This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#include "projectconfig.h" + +#include "usb.h" +#include "usbhw.h" +#include "usbcfg.h" +#include "usbcore.h" +#include "cdc.h" +#include "cdcuser.h" + +// unsigned char BulkBufIn [USB_CDC_BUFSIZE]; // Buffer to store USB IN packet +unsigned char BulkBufOut [USB_CDC_BUFSIZE]; // Buffer to store USB OUT packet +unsigned char NotificationBuf [10]; + +CDC_LINE_CODING CDC_LineCoding = {9600, 0, 0, 8}; +unsigned short CDC_SerialState = 0x0000; +unsigned short CDC_DepInEmpty = 1; // Data IN EP is empty + +/*---------------------------------------------------------------------------- + We need a buffer for incoming data on USB port because USB receives + much faster than UART transmits + *---------------------------------------------------------------------------*/ +/* Buffer masks */ +#define CDC_BUF_SIZE (64) // Output buffer in bytes (power 2) + // large enough for file transfer +#define CDC_BUF_MASK (CDC_BUF_SIZE-1ul) + +/* Buffer read / write macros */ +#define CDC_BUF_RESET(cdcBuf) (cdcBuf.rdIdx = cdcBuf.wrIdx = 0) +#define CDC_BUF_WR(cdcBuf, dataIn) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.wrIdx++] = (dataIn)) +#define CDC_BUF_RD(cdcBuf) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.rdIdx++]) +#define CDC_BUF_EMPTY(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx) +#define CDC_BUF_FULL(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx+1) +#define CDC_BUF_COUNT(cdcBuf) (CDC_BUF_MASK & (cdcBuf.wrIdx - cdcBuf.rdIdx)) + + +// CDC output buffer +typedef struct __CDC_BUF_T +{ + unsigned char data[CDC_BUF_SIZE]; + unsigned int wrIdx; + unsigned int rdIdx; +} CDC_BUF_T; + +CDC_BUF_T CDC_OutBuf; // buffer for all CDC Out data + +/*---------------------------------------------------------------------------- + read data from CDC_OutBuf + *---------------------------------------------------------------------------*/ +int CDC_RdOutBuf (char *buffer, const int *length) +{ + int bytesToRead, bytesRead; + + /* Read *length bytes, block if *bytes are not avaialable */ + bytesToRead = *length; + bytesToRead = (bytesToRead < (*length)) ? bytesToRead : (*length); + bytesRead = bytesToRead; + + + // ... add code to check for underrun + + while (bytesToRead--) { + *buffer++ = CDC_BUF_RD(CDC_OutBuf); + } + return (bytesRead); +} + +/*---------------------------------------------------------------------------- + write data to CDC_OutBuf + *---------------------------------------------------------------------------*/ +int CDC_WrOutBuf (const char *buffer, int *length) +{ + int bytesToWrite, bytesWritten; + + // Write *length bytes + bytesToWrite = *length; + bytesWritten = bytesToWrite; + + + // ... add code to check for overwrite + + while (bytesToWrite) { + CDC_BUF_WR(CDC_OutBuf, *buffer++); // Copy Data to buffer + bytesToWrite--; + } + + return (bytesWritten); +} + +/*---------------------------------------------------------------------------- + check if character(s) are available at CDC_OutBuf + *---------------------------------------------------------------------------*/ +int CDC_OutBufAvailChar (int *availChar) +{ + *availChar = CDC_BUF_COUNT(CDC_OutBuf); + + return (0); +} +/* end Buffer handling */ + + +/*---------------------------------------------------------------------------- + CDC Initialisation + Initializes the data structures and serial port + Parameters: None + Return Value: None + *---------------------------------------------------------------------------*/ +void CDC_Init (void) +{ + CDC_DepInEmpty = 1; + CDC_SerialState = CDC_GetSerialState(); + + CDC_BUF_RESET(CDC_OutBuf); +} + + +/*---------------------------------------------------------------------------- + CDC SendEncapsulatedCommand Request Callback + Called automatically on CDC SEND_ENCAPSULATED_COMMAND Request + Parameters: None (global SetupPacket and EP0Buf) + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_SendEncapsulatedCommand (void) +{ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC GetEncapsulatedResponse Request Callback + Called automatically on CDC Get_ENCAPSULATED_RESPONSE Request + Parameters: None (global SetupPacket and EP0Buf) + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_GetEncapsulatedResponse (void) +{ + /* ... add code to handle request */ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC SetCommFeature Request Callback + Called automatically on CDC Set_COMM_FATURE Request + Parameters: FeatureSelector + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector) +{ + /* ... add code to handle request */ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC GetCommFeature Request Callback + Called automatically on CDC Get_COMM_FATURE Request + Parameters: FeatureSelector + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector) +{ + /* ... add code to handle request */ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC ClearCommFeature Request Callback + Called automatically on CDC CLEAR_COMM_FATURE Request + Parameters: FeatureSelector + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector) +{ + /* ... add code to handle request */ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC SetLineCoding Request Callback + Called automatically on CDC SET_LINE_CODING Request + Parameters: none (global SetupPacket and EP0Buf) + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_SetLineCoding (void) +{ + CDC_LineCoding.dwDTERate = (EP0Buf[0] << 0) + | (EP0Buf[1] << 8) + | (EP0Buf[2] << 16) + | (EP0Buf[3] << 24); + CDC_LineCoding.bCharFormat = EP0Buf[4]; + CDC_LineCoding.bParityType = EP0Buf[5]; + CDC_LineCoding.bDataBits = EP0Buf[6]; + + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC GetLineCoding Request Callback + Called automatically on CDC GET_LINE_CODING Request + Parameters: None (global SetupPacket and EP0Buf) + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_GetLineCoding (void) +{ + EP0Buf[0] = (CDC_LineCoding.dwDTERate >> 0) & 0xFF; + EP0Buf[1] = (CDC_LineCoding.dwDTERate >> 8) & 0xFF; + EP0Buf[2] = (CDC_LineCoding.dwDTERate >> 16) & 0xFF; + EP0Buf[3] = (CDC_LineCoding.dwDTERate >> 24) & 0xFF; + EP0Buf[4] = CDC_LineCoding.bCharFormat; + EP0Buf[5] = CDC_LineCoding.bParityType; + EP0Buf[6] = CDC_LineCoding.bDataBits; + + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC SetControlLineState Request Callback + Called automatically on CDC SET_CONTROL_LINE_STATE Request + Parameters: ControlSignalBitmap + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap) { + + /* ... add code to handle request */ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC SendBreak Request Callback + Called automatically on CDC Set_COMM_FATURE Request + Parameters: 0xFFFF start of Break + 0x0000 stop of Break + 0x#### Duration of Break + Return Value: TRUE - Success, FALSE - Error + *---------------------------------------------------------------------------*/ +uint32_t CDC_SendBreak (unsigned short wDurationOfBreak) { + + /* ... add code to handle request */ + return (TRUE); +} + + +/*---------------------------------------------------------------------------- + CDC_BulkIn call on DataIn Request + Parameters: none + Return Value: none + *---------------------------------------------------------------------------*/ +void CDC_BulkIn(void) +{ +// int numBytesRead, numBytesAvail; +// +// // ToDo: Modify BulkIn to send incoming data to USB +// +// ser_AvailChar (&numBytesAvail); +// +// // ... add code to check for overwrite +// +// numBytesRead = ser_Read ((char *)&BulkBufIn[0], &numBytesAvail); +// +// // send over USB +// if (numBytesRead > 0) { +// USB_WriteEP (CDC_DEP_IN, &BulkBufIn[0], numBytesRead); +// } +// else { +// CDC_DepInEmpty = 1; +// } +// +// +} + + +/*---------------------------------------------------------------------------- + CDC_BulkOut call on DataOut Request + Parameters: none + Return Value: none + *---------------------------------------------------------------------------*/ +void CDC_BulkOut(void) +{ + int numBytesRead; + + // get data from USB into intermediate buffer + numBytesRead = USB_ReadEP(CDC_DEP_OUT, &BulkBufOut[0]); + + // ... add code to check for overwrite + + // store data in a buffer to transmit it over serial interface + CDC_WrOutBuf ((char *)&BulkBufOut[0], &numBytesRead); +} + + +/*---------------------------------------------------------------------------- + Get the SERIAL_STATE as defined in usbcdc11.pdf, 6.3.5, Table 69. + Parameters: none + Return Value: SerialState as defined in usbcdc11.pdf + *---------------------------------------------------------------------------*/ +unsigned short CDC_GetSerialState (void) +{ + // unsigned short temp; + + CDC_SerialState = 0; + // ser_LineState (&temp); + // + // if (temp & 0x8000) CDC_SerialState |= CDC_SERIAL_STATE_RX_CARRIER; + // if (temp & 0x2000) CDC_SerialState |= CDC_SERIAL_STATE_TX_CARRIER; + // if (temp & 0x0010) CDC_SerialState |= CDC_SERIAL_STATE_BREAK; + // if (temp & 0x4000) CDC_SerialState |= CDC_SERIAL_STATE_RING; + // if (temp & 0x0008) CDC_SerialState |= CDC_SERIAL_STATE_FRAMING; + // if (temp & 0x0004) CDC_SerialState |= CDC_SERIAL_STATE_PARITY; + // if (temp & 0x0002) CDC_SerialState |= CDC_SERIAL_STATE_OVERRUN; + + return (CDC_SerialState); +} + + +/*---------------------------------------------------------------------------- + Send the SERIAL_STATE notification as defined in usbcdc11.pdf, 6.3.5. + *---------------------------------------------------------------------------*/ +void CDC_NotificationIn (void) +{ + NotificationBuf[0] = 0xA1; // bmRequestType + NotificationBuf[1] = CDC_NOTIFICATION_SERIAL_STATE; // bNotification (SERIAL_STATE) + NotificationBuf[2] = 0x00; // wValue + NotificationBuf[3] = 0x00; + NotificationBuf[4] = 0x00; // wIndex (Interface #, LSB first) + NotificationBuf[5] = 0x00; + NotificationBuf[6] = 0x02; // wLength (Data length = 2 bytes, LSB first) + NotificationBuf[7] = 0x00; + NotificationBuf[8] = (CDC_SerialState >> 0) & 0xFF; // UART State Bitmap (16bits, LSB first) + NotificationBuf[9] = (CDC_SerialState >> 8) & 0xFF; + + USB_WriteEP (CDC_CEP_IN, &NotificationBuf[0], 10); // send notification +} + +extern void usbcdcSendByte(uint8_t c) +{ + // Ugly delay required ... need to add buffer and handle this better! :-) + uint32_t i, delay; + delay = ((CFG_CPU_CCLK/SCB_SYSAHBCLKDIV) / 25000); + for ( i = 0; i < delay; i++ ) + { + __asm("nop"); + } + + // Send byte to EP + USB_WriteEP (CDC_DEP_IN, (unsigned char *)&c, 1); + CDC_DepInEmpty = 1; +} + diff --git a/macusbfb/core/usbcdc/cdcuser.h b/macusbfb/core/usbcdc/cdcuser.h new file mode 100644 index 0000000..0730e7a --- /dev/null +++ b/macusbfb/core/usbcdc/cdcuser.h @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: cdcuser.h + * Purpose: USB Communication Device Class User module Definitions + * Version: V1.10 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __CDCUSER_H__ +#define __CDCUSER_H__ + +/* CDC buffer handling */ +extern int CDC_RdOutBuf (char *buffer, const int *length); +extern int CDC_WrOutBuf (const char *buffer, int *length); +extern int CDC_OutBufAvailChar (int *availChar); + + +/* CDC Data In/Out Endpoint Address */ +#define CDC_DEP_IN 0x83 +#define CDC_DEP_OUT 0x03 + +/* CDC Communication In Endpoint Address */ +#define CDC_CEP_IN 0x81 + +/* CDC Requests Callback Functions */ +extern uint32_t CDC_SendEncapsulatedCommand (void); +extern uint32_t CDC_GetEncapsulatedResponse (void); +extern uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector); +extern uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector); +extern uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector); +extern uint32_t CDC_GetLineCoding (void); +extern uint32_t CDC_SetLineCoding (void); +extern uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap); +extern uint32_t CDC_SendBreak (unsigned short wDurationOfBreak); + +/* CDC Bulk Callback Functions */ +extern void CDC_BulkIn (void); +extern void CDC_BulkOut (void); + +/* CDC Notification Callback Function */ +extern void CDC_NotificationIn (void); + +/* CDC Initialization Function */ +extern void CDC_Init (void); + +/* CDC prepare the SERAIAL_STATE */ +extern unsigned short CDC_GetSerialState (void); + +/* flow control */ +extern unsigned short CDC_DepInEmpty; // DataEndPoint IN empty + +extern void usbcdcSendByte(uint8_t c); + +#endif /* __CDCUSER_H__ */ + diff --git a/macusbfb/core/usbcdc/config.h b/macusbfb/core/usbcdc/config.h new file mode 100644 index 0000000..28af6b5 --- /dev/null +++ b/macusbfb/core/usbcdc/config.h @@ -0,0 +1,41 @@ +/***************************************************************************** + * config.h: config file for usbcdc example for NXP LPC13xx Family + * Microprocessors + * + * Copyright(C) 2008, NXP Semiconductor + * All rights reserved. + * + * History + * 2008.07.19 ver 1.00 Preliminary version, first Release + * +******************************************************************************/ + +/* +Overview: + This example shows how to use the USB driver to implement a CDC class USB peripheral. + To run this example, you must attach a USB cable to the board. See + the "Getting Started Guide" appendix for details. + +How to use: + Click the debug toolbar button. + Click the go button. + Plug the LPCXpresso's target side into a PC using a USB cable retrofit + or a 3rd party base board. + + * You should be able to see a new COM port on your PC. +*/ + +#define NXP_VID 0x1FC9 +#define MY_VID 0x???? + +#define USB_VENDOR_ID NXP_VID // Vendor ID +#define USB_PROD_ID 0x0003 // Product ID +#define USB_DEVICE 0x0100 // Device ID + +#define LED_PORT 0 // Port for led +#define LED_BIT 7 // Bit on port for led + + +/********************************************************************************* +** End Of File +*********************************************************************************/ diff --git a/macusbfb/core/usbcdc/usb.h b/macusbfb/core/usbcdc/usb.h new file mode 100644 index 0000000..6ba0aeb --- /dev/null +++ b/macusbfb/core/usbcdc/usb.h @@ -0,0 +1,228 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usb.h + * Purpose: USB Definitions + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __USB_H__ +#define __USB_H__ + + +typedef union { + uint16_t W; + struct { + uint8_t L; + uint8_t H; + } __attribute__((packed)) WB; +} __attribute__((packed)) WORD_BYTE; + + +/* bmRequestType.Dir */ +#define REQUEST_HOST_TO_DEVICE 0 +#define REQUEST_DEVICE_TO_HOST 1 + +/* bmRequestType.Type */ +#define REQUEST_STANDARD 0 +#define REQUEST_CLASS 1 +#define REQUEST_VENDOR 2 +#define REQUEST_RESERVED 3 + +/* bmRequestType.Recipient */ +#define REQUEST_TO_DEVICE 0 +#define REQUEST_TO_INTERFACE 1 +#define REQUEST_TO_ENDPOINT 2 +#define REQUEST_TO_OTHER 3 + +/* bmRequestType Definition */ +typedef union _REQUEST_TYPE { + struct _BM { + uint8_t Recipient : 5; + uint8_t Type : 2; + uint8_t Dir : 1; + } __attribute__((packed)) BM; + uint8_t B; +} __attribute__((packed)) REQUEST_TYPE; + +/* USB Standard Request Codes */ +#define USB_REQUEST_GET_STATUS 0 +#define USB_REQUEST_CLEAR_FEATURE 1 +#define USB_REQUEST_SET_FEATURE 3 +#define USB_REQUEST_SET_ADDRESS 5 +#define USB_REQUEST_GET_DESCRIPTOR 6 +#define USB_REQUEST_SET_DESCRIPTOR 7 +#define USB_REQUEST_GET_CONFIGURATION 8 +#define USB_REQUEST_SET_CONFIGURATION 9 +#define USB_REQUEST_GET_INTERFACE 10 +#define USB_REQUEST_SET_INTERFACE 11 +#define USB_REQUEST_SYNC_FRAME 12 + +/* USB GET_STATUS Bit Values */ +#define USB_GETSTATUS_SELF_POWERED 0x01 +#define USB_GETSTATUS_REMOTE_WAKEUP 0x02 +#define USB_GETSTATUS_ENDPOINT_STALL 0x01 + +/* USB Standard Feature selectors */ +#define USB_FEATURE_ENDPOINT_STALL 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 + +/* USB Default Control Pipe Setup Packet */ +typedef struct _USB_SETUP_PACKET { + REQUEST_TYPE bmRequestType; + uint8_t bRequest; + WORD_BYTE wValue; + WORD_BYTE wIndex; + uint16_t wLength; +} __attribute__((packed)) USB_SETUP_PACKET; + + +/* USB Descriptor Types */ +#define USB_DEVICE_DESCRIPTOR_TYPE 1 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2 +#define USB_STRING_DESCRIPTOR_TYPE 3 +#define USB_INTERFACE_DESCRIPTOR_TYPE 4 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 5 +#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6 +#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7 +#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8 +#define USB_OTG_DESCRIPTOR_TYPE 9 +#define USB_DEBUG_DESCRIPTOR_TYPE 10 +#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 11 + +/* USB Device Classes */ +#define USB_DEVICE_CLASS_RESERVED 0x00 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 +#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 +#define USB_DEVICE_CLASS_MONITOR 0x04 +#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05 +#define USB_DEVICE_CLASS_POWER 0x06 +#define USB_DEVICE_CLASS_PRINTER 0x07 +#define USB_DEVICE_CLASS_STORAGE 0x08 +#define USB_DEVICE_CLASS_HUB 0x09 +#define USB_DEVICE_CLASS_MISCELLANEOUS 0xEF +#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF + +/* bmAttributes in Configuration Descriptor */ +#define USB_CONFIG_POWERED_MASK 0x40 +#define USB_CONFIG_BUS_POWERED 0x80 +#define USB_CONFIG_SELF_POWERED 0xC0 +#define USB_CONFIG_REMOTE_WAKEUP 0x20 + +/* bMaxPower in Configuration Descriptor */ +#define USB_CONFIG_POWER_MA(mA) ((mA)/2) + +/* bEndpointAddress in Endpoint Descriptor */ +#define USB_ENDPOINT_DIRECTION_MASK 0x80 +#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00) +#define USB_ENDPOINT_IN(addr) ((addr) | 0x80) + +/* bmAttributes in Endpoint Descriptor */ +#define USB_ENDPOINT_TYPE_MASK 0x03 +#define USB_ENDPOINT_TYPE_CONTROL 0x00 +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 +#define USB_ENDPOINT_TYPE_BULK 0x02 +#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 +#define USB_ENDPOINT_SYNC_MASK 0x0C +#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00 +#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04 +#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08 +#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C +#define USB_ENDPOINT_USAGE_MASK 0x30 +#define USB_ENDPOINT_USAGE_DATA 0x00 +#define USB_ENDPOINT_USAGE_FEEDBACK 0x10 +#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20 +#define USB_ENDPOINT_USAGE_RESERVED 0x30 + +/* USB Standard Device Descriptor */ +typedef struct _USB_DEVICE_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} __attribute__((packed)) USB_DEVICE_DESCRIPTOR; + +/* USB 2.0 Device Qualifier Descriptor */ +typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} __attribute__((packed)) USB_DEVICE_QUALIFIER_DESCRIPTOR; + +/* USB Standard Configuration Descriptor */ +typedef struct _USB_CONFIGURATION_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR; + +/* USB Standard Interface Descriptor */ +typedef struct _USB_INTERFACE_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR; + +/* USB Standard Endpoint Descriptor */ +typedef struct _USB_ENDPOINT_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR; + +/* USB String Descriptor */ +typedef struct _USB_STRING_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bString/*[]*/; +} __attribute__((packed)) USB_STRING_DESCRIPTOR; + +/* USB Common Descriptor */ +typedef struct _USB_COMMON_DESCRIPTOR { + uint8_t bLength; + uint8_t bDescriptorType; +} __attribute__((packed)) USB_COMMON_DESCRIPTOR; + + +#endif /* __USB_H__ */ diff --git a/macusbfb/core/usbcdc/usbcfg.h b/macusbfb/core/usbcdc/usbcfg.h new file mode 100644 index 0000000..3e0acf2 --- /dev/null +++ b/macusbfb/core/usbcdc/usbcfg.h @@ -0,0 +1,157 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbcfg.h + * Purpose: USB Custom Configuration + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------- + * History: + * V1.20 Added vendor specific support + * V1.00 Initial Version + *---------------------------------------------------------------------------*/ + +#ifndef __USBCFG_H__ +#define __USBCFG_H__ + + +//*** <<< Use Configuration Wizard in Context Menu >>> *** + + +/* +// USB Configuration +// USB Power +// Default Power Setting +// <0=> Bus-powered +// <1=> Self-powered +// Max Number of Interfaces <1-256> +// Max Number of Endpoints <1-32> +// Max Endpoint 0 Packet Size +// <8=> 8 Bytes <16=> 16 Bytes <32=> 32 Bytes <64=> 64 Bytes +// DMA Transfer +// Use DMA for selected Endpoints +// Endpoint 0 Out +// Endpoint 0 In +// Endpoint 1 Out +// Endpoint 1 In +// Endpoint 2 Out +// Endpoint 2 In +// Endpoint 3 Out +// Endpoint 3 In +// Endpoint 4 Out +// Endpoint 4 In +// +// +*/ + +#define USB_POWER 0 +#define USB_IF_NUM 1 +#define USB_LOGIC_EP_NUM 5 +#define USB_EP_NUM 10 +#define USB_MAX_PACKET0 64 + +/* +// USB Event Handlers +// Device Events +// Power Event +// Reset Event +// Suspend Event +// Resume Event +// Remote Wakeup Event +// Start of Frame Event +// Error Event +// +// Endpoint Events +// Endpoint 0 Event +// Endpoint 1 Event +// Endpoint 2 Event +// Endpoint 3 Event +// Endpoint 4 Event +// Endpoint 5 Event +// Endpoint 6 Event +// Endpoint 7 Event +// Endpoint 8 Event +// Endpoint 9 Event +// Endpoint 10 Event +// Endpoint 11 Event +// Endpoint 12 Event +// Endpoint 13 Event +// Endpoint 14 Event +// Endpoint 15 Event +// +// USB Core Events +// Set Configuration Event +// Set Interface Event +// Set/Clear Feature Event +// +// +*/ + +#define USB_POWER_EVENT 0 +#define USB_RESET_EVENT 1 +#define USB_SUSPEND_EVENT 1 +#define USB_RESUME_EVENT 1 +#define USB_WAKEUP_EVENT 0 +#define USB_SOF_EVENT 0 +#define USB_ERROR_EVENT 0 +#define USB_EP_EVENT 0x000B +#define USB_CONFIGURE_EVENT 1 +#define USB_INTERFACE_EVENT 0 +#define USB_FEATURE_EVENT 0 + + +/* +// USB Class Support +// enables USB Class specific Requests +// Human Interface Device (HID) +// Interface Number <0-255> +// +// Mass Storage +// Interface Number <0-255> +// +// Audio Device +// Control Interface Number <0-255> +// Streaming Interface 1 Number <0-255> +// Streaming Interface 2 Number <0-255> +// +// Communication Device +// Control Interface Number <0-255> +// Bulk Interface Number <0-255> +// Max Communication Device Buffer Size +// <8=> 8 Bytes <16=> 16 Bytes <32=> 32 Bytes <64=> 64 Bytes +// +// +*/ + +#define USB_CLASS 1 +#define USB_HID 0 +#define USB_HID_IF_NUM 0 +#define USB_MSC 0 +#define USB_MSC_IF_NUM 0 +#define USB_AUDIO 0 +#define USB_ADC_CIF_NUM 0 +#define USB_ADC_SIF1_NUM 1 +#define USB_ADC_SIF2_NUM 2 +#define USB_CDC 1 +#define USB_CDC_CIF_NUM 0 +#define USB_CDC_DIF_NUM 1 +#define USB_CDC_BUFSIZE 64 + +/* +// USB Vendor Support +// enables USB Vendor specific Requests +// +*/ +#define USB_VENDOR 0 + + +#endif /* __USBCFG_H__ */ diff --git a/macusbfb/core/usbcdc/usbcore.c b/macusbfb/core/usbcdc/usbcore.c new file mode 100644 index 0000000..f422aab --- /dev/null +++ b/macusbfb/core/usbcdc/usbcore.c @@ -0,0 +1,1057 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbcore.c + * Purpose: USB Core Module + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------- + * History: + * V1.20 Added vendor specific requests + * Changed string descriptor handling + * Reworked Endpoint0 + * V1.00 Initial Version + *----------------------------------------------------------------------------*/ +#include "projectconfig.h" + +#include "usb.h" +#include "usbcfg.h" +#include "usbhw.h" +#include "usbcore.h" +#include "usbdesc.h" +#include "usbuser.h" + +#if (USB_CLASS) + +#if (USB_AUDIO) +#include "audio.h" +#include "adcuser.h" +#endif + +#if (USB_HID) +#include "hid.h" +#include "hiduser.h" +#endif + +#if (USB_MSC) +#include "msc.h" +#include "mscuser.h" +extern MSC_CSW CSW; +#endif + +#if (USB_CDC) +#include "cdc.h" +#include "cdcuser.h" +#endif + +#endif + +#if (USB_VENDOR) +#include "vendor.h" +#endif + +uint16_t USB_DeviceStatus; +uint8_t USB_DeviceAddress; +volatile uint8_t USB_Configuration; +uint32_t USB_EndPointMask; +uint32_t USB_EndPointHalt; +uint32_t USB_EndPointStall; /* EP must stay stalled */ +uint8_t USB_NumInterfaces; +uint8_t USB_AltSetting[USB_IF_NUM]; + +uint8_t EP0Buf[USB_MAX_PACKET0]; + + +USB_EP_DATA EP0Data; + +USB_SETUP_PACKET SetupPacket; + + +/* + * Reset USB Core + * Parameters: None + * Return Value: None + */ + +void USB_ResetCore (void) { + + USB_DeviceStatus = USB_POWER; + USB_DeviceAddress = 0; + USB_Configuration = 0; + USB_EndPointMask = 0x00010001; + USB_EndPointHalt = 0x00000000; + USB_EndPointStall = 0x00000000; +} + + +/* + * USB Request - Setup Stage + * Parameters: None (global SetupPacket) + * Return Value: None + */ + +void USB_SetupStage (void) { + USB_ReadEP(0x00, (uint8_t *)&SetupPacket); +} + + +/* + * USB Request - Data In Stage + * Parameters: None (global EP0Data) + * Return Value: None + */ + +void USB_DataInStage (void) { + uint32_t cnt; + + if (EP0Data.Count > USB_MAX_PACKET0) { + cnt = USB_MAX_PACKET0; + } else { + cnt = EP0Data.Count; + } + cnt = USB_WriteEP(0x80, EP0Data.pData, cnt); + EP0Data.pData += cnt; + EP0Data.Count -= cnt; +} + + +/* + * USB Request - Data Out Stage + * Parameters: None (global EP0Data) + * Return Value: None + */ + +void USB_DataOutStage (void) { + uint32_t cnt; + + cnt = USB_ReadEP(0x00, EP0Data.pData); + EP0Data.pData += cnt; + EP0Data.Count -= cnt; +} + + +/* + * USB Request - Status In Stage + * Parameters: None + * Return Value: None + */ + +void USB_StatusInStage (void) { + USB_WriteEP(0x80, NULL, 0); +} + + +/* + * USB Request - Status Out Stage + * Parameters: None + * Return Value: None + */ + +void USB_StatusOutStage (void) { + USB_ReadEP(0x00, EP0Buf); +} + + +/* + * Get Status USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqGetStatus (void) { + uint32_t n, m; + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + EP0Data.pData = (uint8_t *)&USB_DeviceStatus; + break; + case REQUEST_TO_INTERFACE: + if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { + *((uint16_t __attribute__((packed)) *)EP0Buf) = 0; + EP0Data.pData = EP0Buf; + } else { + return (FALSE); + } + break; + case REQUEST_TO_ENDPOINT: + n = SetupPacket.wIndex.WB.L & 0x8F; + m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); + if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) { + *((uint16_t __attribute__((packed)) *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0; + EP0Data.pData = EP0Buf; + } else { + return (FALSE); + } + break; + default: + return (FALSE); + } + return (TRUE); +} + + +/* + * Set/Clear Feature USB Request + * Parameters: sc: 0 - Clear, 1 - Set + * (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqSetClrFeature (uint32_t sc) { + uint32_t n, m; + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) { + if (sc) { + USB_WakeUpCfg(TRUE); + USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP; + } else { + USB_WakeUpCfg(FALSE); + USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP; + } + } else { + return (FALSE); + } + break; + case REQUEST_TO_INTERFACE: + return (FALSE); + case REQUEST_TO_ENDPOINT: + n = SetupPacket.wIndex.WB.L & 0x8F; + m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); + if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) { + if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) { + if (sc) { + USB_SetStallEP(n); + USB_EndPointHalt |= m; + } else { + if ((USB_EndPointStall & m) != 0) { + return (TRUE); + } + USB_ClrStallEP(n); +#if (USB_MSC) + if ((n == MSC_EP_IN) && ((USB_EndPointHalt & m) != 0)) { + /* Compliance Test: rewrite CSW after unstall */ + if (CSW.dSignature == MSC_CSW_Signature) { + USB_WriteEP(MSC_EP_IN, (uint8_t *)&CSW, sizeof(CSW)); + } + } +#endif + USB_EndPointHalt &= ~m; + } + } else { + return (FALSE); + } + } else { + return (FALSE); + } + break; + default: + return (FALSE); + } + return (TRUE); +} + + +/* + * Set Address USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqSetAddress (void) { + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L; + break; + default: + return (FALSE); + } + return (TRUE); +} + + +/* + * Get Descriptor USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqGetDescriptor (void) { + uint8_t *pD; + uint32_t len, n; + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + switch (SetupPacket.wValue.WB.H) { + case USB_DEVICE_DESCRIPTOR_TYPE: + EP0Data.pData = (uint8_t *)USB_DeviceDescriptor; + len = USB_DEVICE_DESC_SIZE; + break; + case USB_CONFIGURATION_DESCRIPTOR_TYPE: + pD = (uint8_t *)USB_ConfigDescriptor; + for (n = 0; n != SetupPacket.wValue.WB.L; n++) { + if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength != 0) { + pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; + } + } + if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength == 0) { + return (FALSE); + } + EP0Data.pData = pD; + len = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; + break; + case USB_STRING_DESCRIPTOR_TYPE: + pD = (uint8_t *)USB_StringDescriptor; + for (n = 0; n != SetupPacket.wValue.WB.L; n++) { + if (((USB_STRING_DESCRIPTOR *)pD)->bLength != 0) { + pD += ((USB_STRING_DESCRIPTOR *)pD)->bLength; + } + } + if (((USB_STRING_DESCRIPTOR *)pD)->bLength == 0) { + return (FALSE); + } + EP0Data.pData = pD; + len = ((USB_STRING_DESCRIPTOR *)EP0Data.pData)->bLength; + break; + default: + return (FALSE); + } + break; + case REQUEST_TO_INTERFACE: + switch (SetupPacket.wValue.WB.H) { +#if USB_HID + case HID_HID_DESCRIPTOR_TYPE: + if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { + return (FALSE); /* Only Single HID Interface is supported */ + } + EP0Data.pData = (uint8_t *)USB_ConfigDescriptor + HID_DESC_OFFSET; + len = HID_DESC_SIZE; + break; + case HID_REPORT_DESCRIPTOR_TYPE: + if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { + return (FALSE); /* Only Single HID Interface is supported */ + } + EP0Data.pData = (uint8_t *)HID_ReportDescriptor; + len = HID_ReportDescSize; + break; + case HID_PHYSICAL_DESCRIPTOR_TYPE: + return (FALSE); /* HID Physical Descriptor is not supported */ +#endif + default: + return (FALSE); + } + break; + default: + return (FALSE); + } + + if (EP0Data.Count > len) { + EP0Data.Count = len; + } + + return (TRUE); +} + +/* + * Get Configuration USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqGetConfiguration (void) { + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + // Added cast to avoid warnings due to USB_Configuration being volatile (KTownsend) + EP0Data.pData = (uint8_t *)&USB_Configuration; + break; + default: + return (FALSE); + } + return (TRUE); +} + +/* + * Set Configuration USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqSetConfiguration (void) { + USB_COMMON_DESCRIPTOR *pD; + uint32_t alt = 0; + uint32_t n, m; + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + + if (SetupPacket.wValue.WB.L) { + pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; + while (pD->bLength) { + switch (pD->bDescriptorType) { + case USB_CONFIGURATION_DESCRIPTOR_TYPE: + if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) { + USB_Configuration = SetupPacket.wValue.WB.L; + USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces; + for (n = 0; n < USB_IF_NUM; n++) { + USB_AltSetting[n] = 0; + } + for (n = 1; n < 16; n++) { + if (USB_EndPointMask & (1 << n)) { + USB_DisableEP(n); + } + if (USB_EndPointMask & ((1 << 16) << n)) { + USB_DisableEP(n | 0x80); + } + } + USB_EndPointMask = 0x00010001; + USB_EndPointHalt = 0x00000000; + USB_EndPointStall= 0x00000000; + USB_Configure(TRUE); + if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_POWERED_MASK) { + USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED; + } else { + USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED; + } + } else { + UsbAddPtr((void **)&pD, ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength); + continue; + } + break; + case USB_INTERFACE_DESCRIPTOR_TYPE: + alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; + break; + case USB_ENDPOINT_DESCRIPTOR_TYPE: + if (alt == 0) { + n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; + m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); + USB_EndPointMask |= m; + USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); + USB_EnableEP(n); + USB_ResetEP(n); + } + break; + } + UsbAddPtr((void **)&pD, pD->bLength); + } + } + else { + USB_Configuration = 0; + for (n = 1; n < 16; n++) { + if (USB_EndPointMask & (1 << n)) { + USB_DisableEP(n); + } + if (USB_EndPointMask & ((1 << 16) << n)) { + USB_DisableEP(n | 0x80); + } + } + USB_EndPointMask = 0x00010001; + USB_EndPointHalt = 0x00000000; + USB_EndPointStall = 0x00000000; + USB_Configure(FALSE); + } + + if (USB_Configuration != SetupPacket.wValue.WB.L) { + return (FALSE); + } + break; + default: + return (FALSE); + } + return (TRUE); +} + + +/* + * Get Interface USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqGetInterface (void) { + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_INTERFACE: + if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { + EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L; + } else { + return (FALSE); + } + break; + default: + return (FALSE); + } + return (TRUE); +} + + +/* + * Set Interface USB Request + * Parameters: None (global SetupPacket) + * Return Value: TRUE - Success, FALSE - Error + */ + +static inline uint32_t USB_ReqSetInterface (void) { + USB_COMMON_DESCRIPTOR *pD; + uint32_t ifn = 0, alt = 0, old = 0, msk = 0; + uint32_t n, m; + uint32_t set; + + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_INTERFACE: + if (USB_Configuration == 0) return (FALSE); + set = FALSE; + pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; + while (pD->bLength) { + switch (pD->bDescriptorType) { + case USB_CONFIGURATION_DESCRIPTOR_TYPE: + if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) { + UsbAddPtr((void **)&pD, ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength); + continue; + } + break; + case USB_INTERFACE_DESCRIPTOR_TYPE: + ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber; + alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; + msk = 0; + if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) { + set = TRUE; + old = USB_AltSetting[ifn]; + USB_AltSetting[ifn] = (uint8_t)alt; + } + break; + case USB_ENDPOINT_DESCRIPTOR_TYPE: + if (ifn == SetupPacket.wIndex.WB.L) { + n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; + m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); + if (alt == SetupPacket.wValue.WB.L) { + USB_EndPointMask |= m; + USB_EndPointHalt &= ~m; + USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); + USB_EnableEP(n); + USB_ResetEP(n); + msk |= m; + } + else if ((alt == old) && ((msk & m) == 0)) { + USB_EndPointMask &= ~m; + USB_EndPointHalt &= ~m; + USB_DisableEP(n); + } + } + break; + } + UsbAddPtr((void **)&pD, pD->bLength); + } + break; + default: + return (FALSE); + } + + return (set); +} + +/* + * USB Endpoint 0 Event Callback + * Parameters: event + * Return Value: none + */ + +void USB_EndPoint0 (uint32_t event) { + + switch (event) { + case USB_EVT_SETUP: + USB_SetupStage(); + USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir); + EP0Data.Count = SetupPacket.wLength; /* Number of bytes to transfer */ + switch (SetupPacket.bmRequestType.BM.Type) { + + case REQUEST_STANDARD: + switch (SetupPacket.bRequest) { + case USB_REQUEST_GET_STATUS: + if (!USB_ReqGetStatus()) { + goto stall_i; + } + USB_DataInStage(); + break; + + case USB_REQUEST_CLEAR_FEATURE: + if (!USB_ReqSetClrFeature(0)) { + goto stall_i; + } + USB_StatusInStage(); +#if USB_FEATURE_EVENT + USB_Feature_Event(); +#endif + break; + + case USB_REQUEST_SET_FEATURE: + if (!USB_ReqSetClrFeature(1)) { + goto stall_i; + } + USB_StatusInStage(); +#if USB_FEATURE_EVENT + USB_Feature_Event(); +#endif + break; + + case USB_REQUEST_SET_ADDRESS: + if (!USB_ReqSetAddress()) { + goto stall_i; + } + USB_StatusInStage(); + break; + + case USB_REQUEST_GET_DESCRIPTOR: + if (!USB_ReqGetDescriptor()) { + goto stall_i; + } + USB_DataInStage(); + break; + + case USB_REQUEST_SET_DESCRIPTOR: +/*stall_o:*/ USB_SetStallEP(0x00); /* not supported */ + EP0Data.Count = 0; + break; + + case USB_REQUEST_GET_CONFIGURATION: + if (!USB_ReqGetConfiguration()) { + goto stall_i; + } + USB_DataInStage(); + break; + + case USB_REQUEST_SET_CONFIGURATION: + if (!USB_ReqSetConfiguration()) { + goto stall_i; + } + USB_StatusInStage(); +#if USB_CONFIGURE_EVENT + USB_Configure_Event(); +#endif + break; + + case USB_REQUEST_GET_INTERFACE: + if (!USB_ReqGetInterface()) { + goto stall_i; + } + USB_DataInStage(); + break; + + case USB_REQUEST_SET_INTERFACE: + if (!USB_ReqSetInterface()) { + goto stall_i; + } + USB_StatusInStage(); +#if USB_INTERFACE_EVENT + USB_Interface_Event(); +#endif + break; + + default: + goto stall_i; + } + break; /* end case REQUEST_STANDARD */ + +#if USB_CLASS + case REQUEST_CLASS: + switch (SetupPacket.bmRequestType.BM.Recipient) { + + case REQUEST_TO_DEVICE: + goto stall_i; /* not supported */ + + case REQUEST_TO_INTERFACE: +#if USB_HID + if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) { /* IF number correct? */ + switch (SetupPacket.bRequest) { + case HID_REQUEST_GET_REPORT: + if (HID_GetReport()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case HID_REQUEST_SET_REPORT: + EP0Data.pData = EP0Buf; /* data to be received */ + goto setup_class_ok; + case HID_REQUEST_GET_IDLE: + if (HID_GetIdle()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case HID_REQUEST_SET_IDLE: + if (HID_SetIdle()) { + USB_StatusInStage(); /* send Acknowledge */ + goto setup_class_ok; + } + break; + case HID_REQUEST_GET_PROTOCOL: + if (HID_GetProtocol()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case HID_REQUEST_SET_PROTOCOL: + if (HID_SetProtocol()) { + USB_StatusInStage(); /* send Acknowledge */ + goto setup_class_ok; + } + break; + } + } +#endif /* USB_HID */ +#if USB_MSC + if (SetupPacket.wIndex.WB.L == USB_MSC_IF_NUM) { /* IF number correct? */ + switch (SetupPacket.bRequest) { + case MSC_REQUEST_RESET: + if ((SetupPacket.wValue.W == 0) && /* RESET with invalid parameters -> STALL */ + (SetupPacket.wLength == 0)) { + if (MSC_Reset()) { + USB_StatusInStage(); + goto setup_class_ok; + } + } + break; + case MSC_REQUEST_GET_MAX_LUN: + if ((SetupPacket.wValue.W == 0) && /* GET_MAX_LUN with invalid parameters -> STALL */ + (SetupPacket.wLength == 1)) { + if (MSC_GetMaxLUN()) { + EP0Data.pData = EP0Buf; + USB_DataInStage(); + goto setup_class_ok; + } + } + break; + } + } +#endif /* USB_MSC */ +#if USB_AUDIO + if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) || /* IF number correct? */ + (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) || + (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) { + switch (SetupPacket.bRequest) { + case AUDIO_REQUEST_GET_CUR: + case AUDIO_REQUEST_GET_MIN: + case AUDIO_REQUEST_GET_MAX: + case AUDIO_REQUEST_GET_RES: + if (ADC_IF_GetRequest()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case AUDIO_REQUEST_SET_CUR: +// case AUDIO_REQUEST_SET_MIN: +// case AUDIO_REQUEST_SET_MAX: +// case AUDIO_REQUEST_SET_RES: + EP0Data.pData = EP0Buf; /* data to be received */ + goto setup_class_ok; + } + } +#endif /* USB_AUDIO */ +#if USB_CDC + if ((SetupPacket.wIndex.WB.L == USB_CDC_CIF_NUM) || /* IF number correct? */ + (SetupPacket.wIndex.WB.L == USB_CDC_DIF_NUM)) { + switch (SetupPacket.bRequest) { + case CDC_SEND_ENCAPSULATED_COMMAND: + EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ + goto setup_class_ok; + case CDC_GET_ENCAPSULATED_RESPONSE: + if (CDC_GetEncapsulatedResponse()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case CDC_SET_COMM_FEATURE: + EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ + goto setup_class_ok; + case CDC_GET_COMM_FEATURE: + if (CDC_GetCommFeature(SetupPacket.wValue.W)) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case CDC_CLEAR_COMM_FEATURE: + if (CDC_ClearCommFeature(SetupPacket.wValue.W)) { + USB_StatusInStage(); /* send Acknowledge */ + goto setup_class_ok; + } + break; + case CDC_SET_LINE_CODING: + EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ + goto setup_class_ok; + case CDC_GET_LINE_CODING: + if (CDC_GetLineCoding()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case CDC_SET_CONTROL_LINE_STATE: + if (CDC_SetControlLineState(SetupPacket.wValue.W)) { + USB_StatusInStage(); /* send Acknowledge */ + goto setup_class_ok; + } + break; + case CDC_SEND_BREAK: + if (CDC_SendBreak(SetupPacket.wValue.W)) { + USB_StatusInStage(); /* send Acknowledge */ + goto setup_class_ok; + } + break; + } + } +#endif /* USB_CDC */ + goto stall_i; /* not supported */ + /* end case REQUEST_TO_INTERFACE */ + + case REQUEST_TO_ENDPOINT: +#if USB_AUDIO + switch (SetupPacket.bRequest) { + case AUDIO_REQUEST_GET_CUR: + case AUDIO_REQUEST_GET_MIN: + case AUDIO_REQUEST_GET_MAX: + case AUDIO_REQUEST_GET_RES: + if (ADC_EP_GetRequest()) { + EP0Data.pData = EP0Buf; /* point to data to be sent */ + USB_DataInStage(); /* send requested data */ + goto setup_class_ok; + } + break; + case AUDIO_REQUEST_SET_CUR: +// case AUDIO_REQUEST_SET_MIN: +// case AUDIO_REQUEST_SET_MAX: +// case AUDIO_REQUEST_SET_RES: + EP0Data.pData = EP0Buf; /* data to be received */ + goto setup_class_ok; + } +#endif /* USB_AUDIO */ + goto stall_i; + /* end case REQUEST_TO_ENDPOINT */ + + default: + goto stall_i; + } +setup_class_ok: /* request finished successfully */ + break; /* end case REQUEST_CLASS */ +#endif /* USB_CLASS */ + +#if USB_VENDOR + case REQUEST_VENDOR: + switch (SetupPacket.bmRequestType.BM.Recipient) { + + case REQUEST_TO_DEVICE: + if (!USB_ReqVendorDev(TRUE)) { + goto stall_i; /* not supported */ + } + break; + + case REQUEST_TO_INTERFACE: + if (!USB_ReqVendorIF(TRUE)) { + goto stall_i; /* not supported */ + } + break; + + case REQUEST_TO_ENDPOINT: + if (!USB_ReqVendorEP(TRUE)) { + goto stall_i; /* not supported */ + } + break; + + default: + goto stall_i; + } + + if (SetupPacket.wLength) { + if (SetupPacket.bmRequestType.BM.Dir == REQUEST_DEVICE_TO_HOST) { + USB_DataInStage(); + } + } else { + USB_StatusInStage(); + } + + break; /* end case REQUEST_VENDOR */ +#endif /* USB_VENDOR */ + + default: +stall_i: USB_SetStallEP(0x80); + EP0Data.Count = 0; + break; + } + break; /* end case USB_EVT_SETUP */ + + case USB_EVT_OUT: + if (SetupPacket.bmRequestType.BM.Dir == REQUEST_HOST_TO_DEVICE) { + if (EP0Data.Count) { /* still data to receive ? */ + USB_DataOutStage(); /* receive data */ + if (EP0Data.Count == 0) { /* data complete ? */ + switch (SetupPacket.bmRequestType.BM.Type) { + + case REQUEST_STANDARD: + goto stall_i; /* not supported */ + +#if (USB_CLASS) + case REQUEST_CLASS: + switch (SetupPacket.bmRequestType.BM.Recipient) { + case REQUEST_TO_DEVICE: + goto stall_i; /* not supported */ + + case REQUEST_TO_INTERFACE: +#if USB_HID + if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) { /* IF number correct? */ + switch (SetupPacket.bRequest) { + case HID_REQUEST_SET_REPORT: + if (HID_SetReport()) { + USB_StatusInStage(); /* send Acknowledge */ + goto out_class_ok; + } + break; + } + } +#endif /* USB_HID */ +#if USB_AUDIO + if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) || /* IF number correct? */ + (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) || + (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) { + switch (SetupPacket.bRequest) { + case AUDIO_REQUEST_SET_CUR: +// case AUDIO_REQUEST_SET_MIN: +// case AUDIO_REQUEST_SET_MAX: +// case AUDIO_REQUEST_SET_RES: + if (ADC_IF_SetRequest()) { + USB_StatusInStage(); /* send Acknowledge */ + goto out_class_ok; + } + break; + } + } +#endif /* USB_AUDIO */ +#if USB_CDC + if ((SetupPacket.wIndex.WB.L == USB_CDC_CIF_NUM) || /* IF number correct? */ + (SetupPacket.wIndex.WB.L == USB_CDC_DIF_NUM)) { + switch (SetupPacket.bRequest) { + case CDC_SEND_ENCAPSULATED_COMMAND: + if (CDC_SendEncapsulatedCommand()) { + USB_StatusInStage(); /* send Acknowledge */ + goto out_class_ok; + } + break; + case CDC_SET_COMM_FEATURE: + if (CDC_SetCommFeature(SetupPacket.wValue.W)) { + USB_StatusInStage(); /* send Acknowledge */ + goto out_class_ok; + } + break; + case CDC_SET_LINE_CODING: + if (CDC_SetLineCoding()) { + USB_StatusInStage(); /* send Acknowledge */ + goto out_class_ok; + } + break; + } + } +#endif /* USB_CDC */ + goto stall_i; + /* end case REQUEST_TO_INTERFACE */ + + case REQUEST_TO_ENDPOINT: +#if USB_AUDIO + switch (SetupPacket.bRequest) { + case AUDIO_REQUEST_SET_CUR: +// case AUDIO_REQUEST_SET_MIN: +// case AUDIO_REQUEST_SET_MAX: +// case AUDIO_REQUEST_SET_RES: + if (ADC_EP_SetRequest()) { + USB_StatusInStage(); /* send Acknowledge */ + goto out_class_ok; + } + break; + } +#endif /* USB_AUDIO */ + goto stall_i; + /* end case REQUEST_TO_ENDPOINT */ + + default: + goto stall_i; + } +out_class_ok: /* request finished successfully */ + break; /* end case REQUEST_CLASS */ +#endif /* USB_CLASS */ + +#if USB_VENDOR + case REQUEST_VENDOR: + switch (SetupPacket.bmRequestType.BM.Recipient) { + + case REQUEST_TO_DEVICE: + if (!USB_ReqVendorDev(FALSE)) { + goto stall_i; /* not supported */ + } + break; + + case REQUEST_TO_INTERFACE: + if (!USB_ReqVendorIF(FALSE)) { + goto stall_i; /* not supported */ + } + break; + + case REQUEST_TO_ENDPOINT: + if (!USB_ReqVendorEP(FALSE)) { + goto stall_i; /* not supported */ + } + break; + + default: + goto stall_i; + } + + USB_StatusInStage(); + + break; /* end case REQUEST_VENDOR */ +#endif /* USB_VENDOR */ + + default: + goto stall_i; + } + } + } + } else { + USB_StatusOutStage(); /* receive Acknowledge */ + } + break; /* end case USB_EVT_OUT */ + + case USB_EVT_IN : + if (SetupPacket.bmRequestType.BM.Dir == REQUEST_DEVICE_TO_HOST) { + USB_DataInStage(); /* send data */ + } else { + if (USB_DeviceAddress & 0x80) { + USB_DeviceAddress &= 0x7F; + USB_SetAddress(USB_DeviceAddress); + } + } + break; /* end case USB_EVT_IN */ + + case USB_EVT_OUT_STALL: + USB_ClrStallEP(0x00); + break; + + case USB_EVT_IN_STALL: + USB_ClrStallEP(0x80); + break; + + } +} diff --git a/macusbfb/core/usbcdc/usbcore.h b/macusbfb/core/usbcdc/usbcore.h new file mode 100644 index 0000000..4ee6630 --- /dev/null +++ b/macusbfb/core/usbcdc/usbcore.h @@ -0,0 +1,87 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbcore.h + * Purpose: USB Core Definitions + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __USBCORE_H__ +#define __USBCORE_H__ + +#include "usbcfg.h" + +/* USB Endpoint Data Structure */ +typedef struct _USB_EP_DATA { + uint8_t *pData; + uint16_t Count; +} USB_EP_DATA; + +/* USB Core Global Variables */ +extern uint16_t USB_DeviceStatus; +extern uint8_t USB_DeviceAddress; +volatile extern uint8_t USB_Configuration; +extern uint32_t USB_EndPointMask; +extern uint32_t USB_EndPointHalt; +extern uint32_t USB_EndPointStall; +extern uint8_t USB_AltSetting[USB_IF_NUM]; + +/* USB Endpoint 0 Buffer */ +extern uint8_t EP0Buf[USB_MAX_PACKET0]; + +/* USB Endpoint 0 Data Info */ +extern USB_EP_DATA EP0Data; + +/* USB Setup Packet */ +extern USB_SETUP_PACKET SetupPacket; + +/* USB Core Functions */ +extern void USB_ResetCore (void); + +/* Newer C compilers make it really difficult to add + * an integer to a pointer */ +static inline void UsbAddPtr(void **vpptr, uint32_t n); + +/* + * Add a number of bytes to a pointer's address + * Harder than you might think. Some compilers say: + * Expected an lvalue -- Assignment expects its first operand to be + * an lvalue. Please note that a cast removes the lvaluedness of an + * expression. + * + * vpptr = void pointer to pointer + * n = number of bytes to add to pointer + * Call looks like: AddPtr((void **)&myPointer, 8); + */ +static inline void UsbAddPtr(void **vpptr, uint32_t n) +{ + /* Declare a pointer to a pointer to a byte. Only a byte pointer + * can be incremented by a number of bytes. Other pointers will + * increment by a multiple of what they point to. + */ + uint8_t **bpptr; + + /* Convert our void pointer to a pointer to a byte pointer to a pointer */ + bpptr = (uint8_t **)vpptr; + + /* Add 'n' bytes to our pointer value */ + (*bpptr) += n; +} + + + + + + + +#endif /* __USBCORE_H__ */ diff --git a/macusbfb/core/usbcdc/usbdesc.c b/macusbfb/core/usbcdc/usbdesc.c new file mode 100644 index 0000000..56a5001 --- /dev/null +++ b/macusbfb/core/usbcdc/usbdesc.c @@ -0,0 +1,202 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbdesc.c + * Purpose: USB Descriptors + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------- + * History: + * V1.20 Changed string descriptor handling + * V1.00 Initial Version + *---------------------------------------------------------------------------*/ +#include "projectconfig.h" +#include "usb.h" +#include "cdc.h" +#include "usbcfg.h" +#include "usbdesc.h" +#include "config.h" + + +/* USB Standard Device Descriptor */ +const uint8_t USB_DeviceDescriptor[] = { + USB_DEVICE_DESC_SIZE, /* bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */ + WBVAL(0x0200), /* 2.0 */ /* bcdUSB */ + USB_DEVICE_CLASS_COMMUNICATIONS, /* bDeviceClass CDC*/ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + USB_MAX_PACKET0, /* bMaxPacketSize0 */ + WBVAL(USB_VENDOR_ID), /* idVendor */ + WBVAL(USB_PROD_ID), /* idProduct */ + WBVAL(USB_DEVICE), /* 1.00 */ /* bcdDevice */ + 0x01, /* iManufacturer */ + 0x02, /* iProduct */ + 0x03, /* iSerialNumber */ + 0x01 /* bNumConfigurations: one possible configuration*/ +}; + +/* USB Configuration Descriptor */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ +const uint8_t USB_ConfigDescriptor[] = { +/* Configuration 1 */ + USB_CONFIGUARTION_DESC_SIZE, /* bLength */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */ + WBVAL( /* wTotalLength */ + 1*USB_CONFIGUARTION_DESC_SIZE + + 1*USB_INTERFACE_DESC_SIZE + /* communication interface */ + 0x0013 + /* CDC functions */ + 1*USB_ENDPOINT_DESC_SIZE + /* interrupt endpoint */ + 1*USB_INTERFACE_DESC_SIZE + /* data interface */ + 2*USB_ENDPOINT_DESC_SIZE /* bulk endpoints */ + ), + 0x02, /* bNumInterfaces */ + 0x01, /* bConfigurationValue: 0x01 is used to select this configuration */ + 0x00, /* iConfiguration: no string to describe this configuration */ + USB_CONFIG_BUS_POWERED /*|*/ /* bmAttributes */ +/*USB_CONFIG_REMOTE_WAKEUP*/, + USB_CONFIG_POWER_MA(100), /* bMaxPower, device power consumption is 100 mA */ +/* Interface 0, Alternate Setting 0, Communication class interface descriptor */ + USB_INTERFACE_DESC_SIZE, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_CDC_CIF_NUM, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoint used */ + CDC_COMMUNICATION_INTERFACE_CLASS, /* bInterfaceClass: Communication Interface Class */ + CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass: Abstract Control Model */ + 0x00, /* bInterfaceProtocol: no protocol used */ + 0x5E, /* iInterface: */ +/*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ + CDC_HEADER, /* bDescriptorSubtype: Header Func Desc */ + WBVAL(CDC_V1_10), /* 1.10 */ /* bcdCDC */ +/*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ + CDC_CALL_MANAGEMENT, /* bDescriptorSubtype: Call Management Func Desc */ + 0x01, /* bmCapabilities: device handles call management */ + 0x01, /* bDataInterface: CDC data IF ID */ +/*Abstract Control Management Functional Descriptor*/ + 0x04, /* bFunctionLength */ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ + CDC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities: SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported */ +/*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ + CDC_UNION, /* bDescriptorSubtype: Union func desc */ + USB_CDC_CIF_NUM, /* bMasterInterface: Communication class interface is master */ + USB_CDC_DIF_NUM, /* bSlaveInterface0: Data class interface is slave 0 */ +/*Endpoint 1 Descriptor*/ /* event notification (optional) */ + USB_ENDPOINT_DESC_SIZE, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_ENDPOINT_IN(1), /* bEndpointAddress */ + USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */ + WBVAL(0x0010), /* wMaxPacketSize */ + 0x02, /* 2ms */ /* bInterval */ +/* Interface 1, Alternate Setting 0, Data class interface descriptor*/ + USB_INTERFACE_DESC_SIZE, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_CDC_DIF_NUM, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: no alternate setting */ + 0x02, /* bNumEndpoints: two endpoints used */ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass: Data Interface Class */ + 0x00, /* bInterfaceSubClass: no subclass available */ + 0x00, /* bInterfaceProtocol: no protocol used */ + 0x5E, /* iInterface: */ +/* Endpoint, EP3 Bulk Out */ + USB_ENDPOINT_DESC_SIZE, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_ENDPOINT_OUT(3), /* bEndpointAddress */ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ + WBVAL(USB_CDC_BUFSIZE), /* wMaxPacketSize */ + 0x00, /* bInterval: ignore for Bulk transfer */ +/* Endpoint, EP3 Bulk In */ + USB_ENDPOINT_DESC_SIZE, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ + USB_ENDPOINT_IN(3), /* bEndpointAddress */ + USB_ENDPOINT_TYPE_BULK, /* bmAttributes */ + WBVAL(USB_CDC_BUFSIZE), /* wMaxPacketSize */ + 0x00, /* bInterval: ignore for Bulk transfer */ +/* Terminator */ + 0 /* bLength */ +}; + + + + +/* USB String Descriptor (optional) */ +const uint8_t USB_StringDescriptor[] = { +/* Index 0x00: LANGID Codes */ + 0x04, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + WBVAL(0x0409), /* US English */ /* wLANGID */ +/* Index 0x01: Manufacturer */ + (13*2 + 2), /* bLength (13 Char + Type + lenght) */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'N',0, + 'X',0, + 'P',0, + ' ',0, + 'S',0, + 'E',0, + 'M',0, + 'I',0, + 'C',0, + 'O',0, + 'N',0, + 'D',0, + ' ',0, +/* Index 0x02: Product */ + (17*2 + 2), /* bLength ( 17 Char + Type + lenght) */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'N',0, + 'X',0, + 'P',0, + ' ',0, + 'L',0, + 'P',0, + 'C',0, + '1',0, + '3',0, + 'x',0, + 'x',0, + ' ',0, + 'V',0, + 'C',0, + 'O',0, + 'M',0, + ' ',0, +/* Index 0x03: Serial Number */ + (12*2 + 2), /* bLength (12 Char + Type + lenght) */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'D',0, + 'E',0, + 'M',0, + 'O',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, +/* Index 0x04: Interface 0, Alternate Setting 0 */ + ( 4*2 + 2), /* bLength (4 Char + Type + lenght) */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'V',0, + 'C',0, + 'O',0, + 'M',0, +}; diff --git a/macusbfb/core/usbcdc/usbdesc.h b/macusbfb/core/usbcdc/usbdesc.h new file mode 100644 index 0000000..b6eeddc --- /dev/null +++ b/macusbfb/core/usbcdc/usbdesc.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbdesc.h + * Purpose: USB Descriptors Definitions + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __USBDESC_H__ +#define __USBDESC_H__ + + +#define WBVAL(x) ((x) & 0xFF),(((x) >> 8) & 0xFF) + +#define USB_DEVICE_DESC_SIZE (sizeof(USB_DEVICE_DESCRIPTOR)) +#define USB_CONFIGUARTION_DESC_SIZE (sizeof(USB_CONFIGURATION_DESCRIPTOR)) +#define USB_INTERFACE_DESC_SIZE (sizeof(USB_INTERFACE_DESCRIPTOR)) +#define USB_ENDPOINT_DESC_SIZE (sizeof(USB_ENDPOINT_DESCRIPTOR)) + +extern const uint8_t USB_DeviceDescriptor[]; +extern const uint8_t USB_ConfigDescriptor[]; +extern const uint8_t USB_StringDescriptor[]; + + +#endif /* __USBDESC_H__ */ diff --git a/macusbfb/core/usbcdc/usbhw.c b/macusbfb/core/usbcdc/usbhw.c new file mode 100644 index 0000000..8c52b28 --- /dev/null +++ b/macusbfb/core/usbcdc/usbhw.c @@ -0,0 +1,568 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbhw.c + * Purpose: USB Hardware Layer Module for Philips LPC17xx + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------- + * History: + * V1.20 Added USB_ClearEPBuf + * V1.00 Initial Version + *----------------------------------------------------------------------------*/ +#include "projectconfig.h" /* LPC13xx definitions */ +#include "usb.h" +#include "usbcfg.h" +#include "usbreg.h" +#include "usbhw.h" +#include "usbcore.h" +#include "usbuser.h" + + +/* + * USB and IO Clock configuration only. + * The same as call PeriClkIOInit(IOCON_USB); + * The purpose is to reduce the code space for + * overall USB project and reserve code space for + * USB debugging. + * Parameters: None + * Return Value: None + */ +void USBIOClkConfig( void ) +{ + /* Enable AHB clock to the GPIO domain. */ + SCB_SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_GPIO; + + /* Enable Timer32_1, IOCON, and USB blocks */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B1 | SCB_SYSAHBCLKCTRL_IOCON | SCB_SYSAHBCLKCTRL_USB_REG); + + // Setup USB clock + SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPAD_PD); // Power-up USB PHY + SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPLL_PD); // Power-up USB PLL + + SCB_USBPLLCLKSEL = SCB_USBPLLCLKSEL_SOURCE_MAINOSC; // Select PLL Input + SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE; // Update Clock Source + SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_DISABLE; // Toggle Update Register + SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE; + + // Wait until the USB clock is updated + while (!(SCB_USBPLLCLKUEN & SCB_USBPLLCLKUEN_UPDATE)); + + // Set USB clock to 48MHz (12MHz x 4) + SCB_USBPLLCTRL = (SCB_USBPLLCTRL_MULT_4); + while (!(SCB_USBPLLSTAT & SCB_USBPLLSTAT_LOCK)); // Wait Until PLL Locked + SCB_USBCLKSEL = SCB_USBCLKSEL_SOURCE_USBPLLOUT; + + // Set USB pin functions + IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK; + IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT + IOCON_PIO0_3 &= ~IOCON_PIO0_3_FUNC_MASK; + IOCON_PIO0_3 |= IOCON_PIO0_3_FUNC_USB_VBUS; // VBus + IOCON_PIO0_6 &= ~IOCON_PIO0_6_FUNC_MASK; + IOCON_PIO0_6 |= IOCON_PIO0_6_FUNC_USB_CONNECT; // Soft Connect + + return; +} + +/* + * Delay number of clock cycles + * Parameters: Delay length + * Return Value: None + */ + +void delay (uint32_t length ) +{ + uint32_t i; + + for ( i = 0; i < length; i++ ) + { + __asm("nop"); + } + return; +} + +/* + * Get Endpoint Physical Address + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: Endpoint Physical Address + */ + +uint32_t EPAdr (uint32_t EPNum) +{ + uint32_t val; + + val = (EPNum & 0x0F) << 1; + if (EPNum & 0x80) { + val += 1; + } + return (val); +} + + +/* + * Write Command + * Parameters: cmd: Command + * Return Value: None + */ + +void WrCmd (uint32_t cmd) +{ + USB_DEVINTCLR = CCEMTY_INT; + USB_CMDCODE = cmd; + while ((USB_DEVINTST & (CCEMTY_INT | DEV_STAT_INT)) == 0); +} + + +/* + * Write Command Data + * Parameters: cmd: Command + * val: Data + * Return Value: None + */ + +void WrCmdDat (uint32_t cmd, uint32_t val) +{ + WrCmd(cmd); + WrCmd(val); +} + + +/* + * Write Command to Endpoint + * Parameters: cmd: Command + * val: Data + * Return Value: None + */ + +void WrCmdEP (uint32_t EPNum, uint32_t cmd) +{ + WrCmd(CMD_SEL_EP(EPAdr(EPNum))); + WrCmd(cmd); +} + + +/* + * Read Command Data + * Parameters: cmd: Command + * Return Value: Data Value + */ + +uint32_t RdCmdDat (uint32_t cmd) +{ + USB_DEVINTCLR = CCEMTY_INT | CDFULL_INT; + USB_CMDCODE = cmd; + while ((USB_DEVINTST & (CDFULL_INT | DEV_STAT_INT)) == 0); + return (USB_CMDDATA); +} + + +/* + * USB Initialize Function + * Called by the User to initialize USB + * Return Value: None + */ + +void USB_Init (void) +{ + // Setup USB clock and pins + USBIOClkConfig(); + +#if USB_FIQ_EVENT + /* It's important that only BULK and FRAME(ISO) can be routed + to FIQ. */ + USB_DEVFIQSEL = 0x01; /* SOF Use FIQ */ + + /* Enable the USB Interrupt */ + NVIC_EnableIRQ(USB_FIQn); +#endif + + /* Enable the USB Interrupt */ + NVIC_EnableIRQ(USB_IRQn); + + USB_Reset(); + USB_SetAddress(0); + return; +} + + +/* + * USB Connect Function + * Called by the User to Connect/Disconnect USB + * Parameters: con: Connect/Disconnect + * Return Value: None + */ + +void USB_Connect (uint32_t con) +{ + WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con ? DEV_CON : 0)); +} + + +/* + * USB Reset Function + * Called automatically on USB Reset + * Return Value: None + */ + +void USB_Reset (void) +{ + USB_DEVINTCLR = 0x000FFFFF; + /* Enable all eight(8) EPs, note: EP won't be ready until it's + configured/enabled when device sending SetEPStatus command + to the command engine. */ + USB_DEVINTEN = DEV_STAT_INT | (0xFF<<1) | + (USB_SOF_EVENT ? FRAME_INT : 0); + return; +} + + +/* + * USB Suspend Function + * Called automatically on USB Suspend + * Return Value: None + */ + +void USB_Suspend (void) +{ + /* Performed by Hardware */ +} + + +/* + * USB Resume Function + * Called automatically on USB Resume + * Return Value: None + */ + +void USB_Resume (void) +{ + /* Performed by Hardware */ +} + + +/* + * USB Remote Wakeup Function + * Called automatically on USB Remote Wakeup + * Return Value: None + */ + +void USB_WakeUp (void) +{ + if (USB_DeviceStatus & USB_GETSTATUS_REMOTE_WAKEUP) + { + WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(DEV_CON)); + } +} + + +/* + * USB Remote Wakeup Configuration Function + * Parameters: cfg: Enable/Disable + * Return Value: None + */ + +void USB_WakeUpCfg (uint32_t cfg) +{ + cfg = cfg; /* Not needed */ +} + + +/* + * USB Set Address Function + * Parameters: adr: USB Address + * Return Value: None + */ + +void USB_SetAddress (uint32_t adr) +{ + WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr)); /* Don't wait for next */ + WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr)); /* Setup Status Phase */ +} + + +/* + * USB Configure Function + * Parameters: cfg: Configure/Deconfigure + * Return Value: None + */ + +void USB_Configure (uint32_t cfg) +{ + WrCmdDat(CMD_CFG_DEV, DAT_WR_BYTE(cfg ? CONF_DVICE : 0)); + return; +} + + +/* + * Configure USB Endpoint according to Descriptor + * Parameters: pEPD: Pointer to Endpoint Descriptor + * Return Value: None + */ + +void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD) +{ + return; +} + + +/* + * Set Direction for USB Control Endpoint + * Parameters: dir: Out (dir == 0), In (dir <> 0) + * Return Value: None + */ + +void USB_DirCtrlEP (uint32_t dir) +{ + dir = dir; /* Not needed */ +} + + +/* + * Enable USB Endpoint + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: None + */ + +void USB_EnableEP (uint32_t EPNum) +{ + WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0)); +} + + +/* + * Disable USB Endpoint + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: None + */ + +void USB_DisableEP (uint32_t EPNum) +{ + WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_DA)); +} + + +/* + * Reset USB Endpoint + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: None + */ + +void USB_ResetEP (uint32_t EPNum) +{ + WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0)); +} + + +/* + * Set Stall for USB Endpoint + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: None + */ + +void USB_SetStallEP (uint32_t EPNum) +{ + WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_ST)); +} + + +/* + * Clear Stall for USB Endpoint + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: None + */ + +void USB_ClrStallEP (uint32_t EPNum) +{ + WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0)); +} + + +/* + * Clear USB Endpoint Buffer + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * Return Value: None + */ + +void USB_ClearEPBuf (uint32_t EPNum) +{ + WrCmdEP(EPNum, CMD_CLR_BUF); +} + + +/* + * Read USB Endpoint Data + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * pData: Pointer to Data Buffer + * Return Value: Number of bytes read + */ + +uint32_t USB_ReadEP (uint32_t EPNum, uint8_t *pData) +{ + uint32_t cnt, n; + + USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_RD_EN; + /* 3 clock cycles to fetch the packet length from RAM. */ + delay( 5 ); + + do + { + cnt = USB_RXPLEN; + } while ((cnt & PKT_DV) == 0); + cnt &= PKT_LNGTH_MASK; + + for (n = 0; n < (cnt + 3) / 4; n++) + { + *((uint32_t __attribute__((packed)) *)pData) = USB_RXDATA; + pData += 4; + } + + USB_CTRL = 0; + + if ((EPNum & 0x80) != 0x04) + { /* Non-Isochronous Endpoint */ + WrCmdEP(EPNum, CMD_CLR_BUF); + } + + return (cnt); +} + + +/* + * Write USB Endpoint Data + * Parameters: EPNum: Endpoint Number + * EPNum.0..3: Address + * EPNum.7: Dir + * pData: Pointer to Data Buffer + * cnt: Number of bytes to write + * Return Value: Number of bytes written + */ + +uint32_t USB_WriteEP (uint32_t EPNum, uint8_t *pData, uint32_t cnt) +{ + uint32_t n; + + USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_WR_EN; + /* 3 clock cycles to fetch the packet length from RAM. */ + delay( 5 ); + USB_TXPLEN = cnt; + + for (n = 0; n < (cnt + 3) / 4; n++) + { + USB_TXDATA = *((uint32_t __attribute__((packed)) *)pData); + pData += 4; + } + + USB_CTRL = 0; + + WrCmdEP(EPNum, CMD_VALID_BUF); + + return (cnt); +} + +/* + * Get USB Last Frame Number + * Parameters: None + * Return Value: Frame Number + */ + +uint32_t USB_GetFrame (void) +{ + uint32_t val; + + WrCmd(CMD_RD_FRAME); + val = RdCmdDat(DAT_RD_FRAME); + val = val | (RdCmdDat(DAT_RD_FRAME) << 8); + + return (val); +} + + +/* + * USB Interrupt Service Routine + */ + +#ifdef CFG_USBCDC +void USB_IRQHandler (void) +{ + uint32_t disr, val, n, m; + + disr = USB_DEVINTST; /* Device Interrupt Status */ + USB_DEVINTCLR = disr; + + /* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */ + if (disr & DEV_STAT_INT) + { + WrCmd(CMD_GET_DEV_STAT); + val = RdCmdDat(DAT_GET_DEV_STAT); /* Device Status */ + if (val & DEV_RST) { /* Reset */ + USB_Reset(); + } + if (val & DEV_CON_CH) { /* Connect change */ + } + if (val & DEV_SUS_CH) { /* Suspend/Resume */ + } + goto isr_end; + } + + + /* Endpoint's Interrupt */ + if (disr & (0xFF<<1)) { + /* if any of the EP0 through EP7 is set, or bit 1 through 9 on disr */ + for (n = 0; n < USB_EP_NUM; n++) { /* Check All Endpoints */ + /* skip frame interrupt at bit 0 in disr */ +// if (disr & ((1 << n)<<1)) { + if ((disr>>1) & (1 << n)) { + m = n >> 1; + /* clear EP interrupt by sending cmd to the command engine. */ + WrCmd(CMD_SEL_EP_CLRI(n)); + val = RdCmdDat(DAT_SEL_EP_CLRI(n)); + if ((n & 1) == 0) { /* OUT Endpoint */ + if (n == 0) { /* Control OUT Endpoint */ + if (val & EP_SEL_STP) { /* Setup Packet */ + if (USB_P_EP[0]) { + USB_P_EP[0](USB_EVT_SETUP); + continue; + } + } + } + if (USB_P_EP[m]) { + USB_P_EP[m](USB_EVT_OUT); + } + } else { /* IN Endpoint */ + if (USB_P_EP[m]) { + USB_P_EP[m](USB_EVT_IN); + } + } + } + } + } +isr_end: + return; +} + +#endif \ No newline at end of file diff --git a/macusbfb/core/usbcdc/usbhw.h b/macusbfb/core/usbcdc/usbhw.h new file mode 100644 index 0000000..f31d7d3 --- /dev/null +++ b/macusbfb/core/usbcdc/usbhw.h @@ -0,0 +1,62 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbhw.h + * Purpose: USB Hardware Layer Definitions + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------- + * History: + * V1.20 Added USB_ClearEPBuf + * V1.00 Initial Version + *----------------------------------------------------------------------------*/ + +#ifndef __USBHW_H__ +#define __USBHW_H__ + + +/* USB Error Codes */ +#define USB_ERR_PID 0x0001 /* PID Error */ +#define USB_ERR_UEPKT 0x0002 /* Unexpected Packet */ +#define USB_ERR_DCRC 0x0004 /* Data CRC Error */ +#define USB_ERR_TIMOUT 0x0008 /* Bus Time-out Error */ +#define USB_ERR_EOP 0x0010 /* End of Packet Error */ +#define USB_ERR_B_OVRN 0x0020 /* Buffer Overrun */ +#define USB_ERR_BTSTF 0x0040 /* Bit Stuff Error */ +#define USB_ERR_TGL 0x0080 /* Toggle Bit Error */ + +/* USB Hardware Functions */ +extern void USBIOClkConfig (void); +extern void USB_Init (void); +extern void USB_Connect (uint32_t con); +extern void USB_Reset (void); +extern void USB_Suspend (void); +extern void USB_Resume (void); +extern void USB_WakeUp (void); +extern void USB_WakeUpCfg (uint32_t cfg); +extern void USB_SetAddress (uint32_t adr); +extern void USB_Configure (uint32_t cfg); +extern void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD); +extern void USB_DirCtrlEP (uint32_t dir); +extern void USB_EnableEP (uint32_t EPNum); +extern void USB_DisableEP (uint32_t EPNum); +extern void USB_ResetEP (uint32_t EPNum); +extern void USB_SetStallEP (uint32_t EPNum); +extern void USB_ClrStallEP (uint32_t EPNum); +extern void USB_ClearEPBuf (uint32_t EPNum); +extern uint32_t USB_ReadEP (uint32_t EPNum, uint8_t *pData); +extern uint32_t USB_WriteEP (uint32_t EPNum, uint8_t *pData, uint32_t cnt); +extern uint32_t USB_GetFrame(void); +extern void USB_IRQHandler (void); + + +#endif /* __USBHW_H__ */ diff --git a/macusbfb/core/usbcdc/usbreg.h b/macusbfb/core/usbcdc/usbreg.h new file mode 100644 index 0000000..d059e6a --- /dev/null +++ b/macusbfb/core/usbcdc/usbreg.h @@ -0,0 +1,134 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: USBREG.H + * Purpose: USB Hardware Layer Definitions for NXP LPC13xx + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __USBREG_H +#define __USBREG_H + +/* Device Interrupt Bit Definitions */ +#define FRAME_INT (0x1<<0) +#define EP0_INT (0x1<<1) +#define EP1_INT (0x1<<2) +#define EP2_INT (0x1<<3) +#define EP3_INT (0x1<<4) +#define EP4_INT (0x1<<5) +#define EP5_INT (0x1<<6) +#define EP6_INT (0x1<<7) +#define EP7_INT (0x1<<8) +#define DEV_STAT_INT (0x1<<9) +#define CCEMTY_INT (0x1<<10) +#define CDFULL_INT (0x1<<11) +#define RxENDPKT_INT (0x1<<12) +#define TxENDPKT_INT (0x1<<13) + +/* Rx & Tx Packet Length Definitions */ +#define PKT_LNGTH_MASK 0x000003FF +#define PKT_DV 0x00000400 +#define PKT_RDY 0x00000800 + +/* USB Control Definitions */ +#define CTRL_RD_EN 0x00000001 +#define CTRL_WR_EN 0x00000002 + +/* Command Codes */ +#define CMD_SET_ADDR 0x00D00500 +#define CMD_CFG_DEV 0x00D80500 +#define CMD_SET_MODE 0x00F30500 +#define CMD_RD_INT 0x00F40500 +#define DAT_RD_INT 0x00F40200 +#define CMD_RD_FRAME 0x00F50500 +#define DAT_RD_FRAME 0x00F50200 +#define CMD_RD_CHIP_ID 0x00FD0500 +#define DAT_RD_CHIP_ID 0x00FD0200 + +#define CMD_SET_DEV_STAT 0x00FE0500 +#define CMD_GET_DEV_STAT 0x00FE0500 +#define DAT_GET_DEV_STAT 0x00FE0200 +#define CMD_GET_ERR_CODE 0x00FF0500 +#define DAT_GET_ERR_CODE 0x00FF0200 + +#define DAT_WR_BYTE(x) (0x00000100 | ((x) << 16)) +#define CMD_SEL_EP(x) (0x00000500 | ((x) << 16)) +#define DAT_SEL_EP(x) (0x00000200 | ((x) << 16)) +#define CMD_SEL_EP_CLRI(x) (0x00400500 | ((x) << 16)) +#define DAT_SEL_EP_CLRI(x) (0x00400200 | ((x) << 16)) +#define CMD_SET_EP_STAT(x) (0x00400500 | ((x) << 16)) +#define CMD_CLR_BUF 0x00F20500 +#define CMD_VALID_BUF 0x00FA0500 + +/* Device Address Register Definitions */ +#define DEV_ADDR_MASK 0x7F +#define DEV_EN 0x80 + +/* Device Configure Register Definitions */ +#define CONF_DVICE 0x01 + +/* Device Mode Register Definitions */ +#define AP_CLK 0x01 +#define INAK_CI 0x02 +#define INAK_CO 0x04 +#define INAK_AI 0x08 +#define INAK_AO 0x10 + +/* Device Status Register Definitions */ +#define DEV_CON 0x01 +#define DEV_CON_CH 0x02 +#define DEV_SUS 0x04 +#define DEV_SUS_CH 0x08 +#define DEV_RST 0x10 + +/* Error Code Register Definitions */ +#define ERR_EC_MASK 0x0F +#define ERR_EA 0x10 + +/* Error Status Register Definitions */ +#define ERR_NOERROR 0x00 +#define ERR_PID_ENCODE 0x01 +#define ERR_UNKNOWN_PID 0x02 +#define ERR_UNEXPECT_PKT 0x03 +#define ERR_TCRC 0x04 +#define ERR_DCRC 0x05 +#define ERR_TIMEOUT 0x06 +#define ERR_BABBIE 0x07 +#define ERR_EOF_PKT 0x08 +#define ERR_TX_RX_NAK 0x09 +#define ERR_SENT_STALL 0x0A +#define ERR_BUF_OVERRUN 0x0B +#define ERR_SENT_EPT_PKT 0x0C +#define ERR_BIT_STUFF 0x0D +#define ERR_SYNC 0x0E +#define ERR_TOGGLE_BIT 0x0F + +/* Endpoint Select Register Definitions */ +#define EP_SEL_F 0x01 +#define EP_SEL_ST 0x02 +#define EP_SEL_STP 0x04 +#define EP_SEL_PO 0x08 +#define EP_SEL_EPN 0x10 +#define EP_SEL_B_1_FULL 0x20 +#define EP_SEL_B_2_FULL 0x40 + +/* Endpoint Status Register Definitions */ +#define EP_STAT_ST 0x01 +#define EP_STAT_DA 0x20 +#define EP_STAT_RF_MO 0x40 +#define EP_STAT_CND_ST 0x80 + +/* Clear Buffer Register Definitions */ +#define CLR_BUF_PO 0x01 + +#endif /* __USBREG_H */ diff --git a/macusbfb/core/usbcdc/usbuser.c b/macusbfb/core/usbcdc/usbuser.c new file mode 100644 index 0000000..54f7b9e --- /dev/null +++ b/macusbfb/core/usbcdc/usbuser.c @@ -0,0 +1,208 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usbuser.c + * Purpose: USB Custom User Module + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#include "projectconfig.h" + +#include "usb.h" +#include "usbcfg.h" +#include "usbhw.h" +#include "usbcore.h" +#include "usbuser.h" +#include "cdcuser.h" + + +/* + * USB Power Event Callback + * Called automatically on USB Power Event + * Parameter: power: On(TRUE)/Off(FALSE) + */ + +#if USB_POWER_EVENT +void USB_Power_Event (uint32_t power) { +} +#endif + + +/* + * USB Reset Event Callback + * Called automatically on USB Reset Event + */ + +#if USB_RESET_EVENT +void USB_Reset_Event (void) { + USB_ResetCore(); +} +#endif + + +/* + * USB Suspend Event Callback + * Called automatically on USB Suspend Event + */ + +#if USB_SUSPEND_EVENT +void USB_Suspend_Event (void) { +} +#endif + + +/* + * USB Resume Event Callback + * Called automatically on USB Resume Event + */ + +#if USB_RESUME_EVENT +void USB_Resume_Event (void) { +} +#endif + + +/* + * USB Remote Wakeup Event Callback + * Called automatically on USB Remote Wakeup Event + */ + +#if USB_WAKEUP_EVENT +void USB_WakeUp_Event (void) { +} +#endif + + +/* + * USB Start of Frame Event Callback + * Called automatically on USB Start of Frame Event + */ + +#if USB_SOF_EVENT +void USB_SOF_Event (void) { +} +#endif + + +/* + * USB Error Event Callback + * Called automatically on USB Error Event + * Parameter: error: Error Code + */ + +#if USB_ERROR_EVENT +void USB_Error_Event (uint32_t error) { +} +#endif + + +/* + * USB Set Configuration Event Callback + * Called automatically on USB Set Configuration Request + */ + +#if USB_CONFIGURE_EVENT +void USB_Configure_Event (void) { + + if (USB_Configuration) { /* Check if USB is configured */ + /* add your code here */ + } +} +#endif + + +/* + * USB Set Interface Event Callback + * Called automatically on USB Set Interface Request + */ + +#if USB_INTERFACE_EVENT +void USB_Interface_Event (void) { +} +#endif + + +/* + * USB Set/Clear Feature Event Callback + * Called automatically on USB Set/Clear Feature Request + */ + +#if USB_FEATURE_EVENT +void USB_Feature_Event (void) { +} +#endif + + +#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL) + +/* USB Endpoint Events Callback Pointers */ +void (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = { + P_EP(0), + P_EP(1), + P_EP(2), + P_EP(3), + P_EP(4), +}; + + +/* + * USB Endpoint 1 Event Callback + * Called automatically on USB Endpoint 1 Event + * Parameter: event + */ + +void USB_EndPoint1 (uint32_t event) { + uint16_t temp; + static uint16_t serialState; + + switch (event) { + case USB_EVT_IN: + temp = CDC_GetSerialState(); + if (serialState != temp) { + serialState = temp; + CDC_NotificationIn(); /* send SERIAL_STATE notification */ + } + break; + } +} + + +/* + * USB Endpoint 2 Event Callback + * Called automatically on USB Endpoint 2 Event + * Parameter: event + */ + +void USB_EndPoint2 (uint32_t event) +{ + event = event; +} + + +/* + * USB Endpoint 3 Event Callback + * Called automatically on USB Endpoint 3 Event + * Parameter: event + */ + +void USB_EndPoint3 (uint32_t event) { + switch (event) { + case USB_EVT_OUT: + CDC_BulkOut (); /* data received from Host */ + break; + case USB_EVT_IN: + CDC_BulkIn (); /* data expected from Host */ + break; + } +} + + diff --git a/macusbfb/core/usbcdc/usbuser.h b/macusbfb/core/usbcdc/usbuser.h new file mode 100644 index 0000000..e4109ec --- /dev/null +++ b/macusbfb/core/usbcdc/usbuser.h @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: USBUSER.H + * Purpose: USB Custom User Definitions + * Version: V1.10 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2005-2009 Keil Software. + *---------------------------------------------------------------------------*/ + +#ifndef __USBUSER_H__ +#define __USBUSER_H__ + + +/* USB Device Events Callback Functions */ +extern void USB_Power_Event (uint32_t power); +extern void USB_Reset_Event (void); +extern void USB_Suspend_Event (void); +extern void USB_Resume_Event (void); +extern void USB_WakeUp_Event (void); +extern void USB_SOF_Event (void); +extern void USB_Error_Event (uint32_t error); + +/* USB Endpoint Callback Events */ +#define USB_EVT_SETUP 1 /* Setup Packet */ +#define USB_EVT_OUT 2 /* OUT Packet */ +#define USB_EVT_IN 3 /* IN Packet */ +#define USB_EVT_OUT_NAK 4 /* OUT Packet - Not Acknowledged */ +#define USB_EVT_IN_NAK 5 /* IN Packet - Not Acknowledged */ +#define USB_EVT_OUT_STALL 6 /* OUT Packet - Stalled */ +#define USB_EVT_IN_STALL 7 /* IN Packet - Stalled */ + +/* USB Endpoint Events Callback Pointers */ +extern void (* const USB_P_EP[USB_LOGIC_EP_NUM])(uint32_t event); + +/* USB Endpoint Events Callback Functions */ +extern void USB_EndPoint0 (uint32_t event); +extern void USB_EndPoint1 (uint32_t event); +extern void USB_EndPoint2 (uint32_t event); +extern void USB_EndPoint3 (uint32_t event); +extern void USB_EndPoint4 (uint32_t event); + +/* USB Core Events Callback Functions */ +extern void USB_Configure_Event (void); +extern void USB_Interface_Event (void); +extern void USB_Feature_Event (void); + + +#endif /* __USBUSER_H__ */ diff --git a/macusbfb/core/usbhid-rom/rom_drivers.h b/macusbfb/core/usbhid-rom/rom_drivers.h new file mode 100644 index 0000000..1026608 --- /dev/null +++ b/macusbfb/core/usbhid-rom/rom_drivers.h @@ -0,0 +1,76 @@ +/**************************************************************************/ +/*! + @file rom_drivers.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef ROM_DRIVERS_H_ +#define ROM_DRIVERS_H_ + +#include "sysdefs.h" + +typedef struct _USB_DEVICE_INFO +{ + uint16_t DevType; + uint32_t DevDetailPtr; +} USB_DEV_INFO; + +typedef struct _USBD +{ + void (*init_clk_pins)(void); + void (*isr)(void); + void (*init)( USB_DEV_INFO * DevInfoPtr ); + void (*connect)(uint32_t con); +} USBD; + +typedef struct _ROM +{ + const USBD * pUSBD; +} ROM; + +typedef struct _HID_DEVICE_INFO +{ + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint32_t StrDescPtr; + uint8_t InReportCount; + uint8_t OutReportCount; + uint8_t SampleInterval; + void (*InReport)(uint8_t src[], uint32_t length); + void (*OutReport)(uint8_t dst[], uint32_t length); +} HID_DEVICE_INFO; + +#endif diff --git a/macusbfb/core/usbhid-rom/usb.h b/macusbfb/core/usbhid-rom/usb.h new file mode 100644 index 0000000..2e55b8c --- /dev/null +++ b/macusbfb/core/usbhid-rom/usb.h @@ -0,0 +1,240 @@ +/*---------------------------------------------------------------------------- + * U S B - K e r n e l + *---------------------------------------------------------------------------- + * Name: usb.h + * Purpose: USB Definitions + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#ifndef __USB_H__ +#define __USB_H__ + +#include "sysdefs.h" + +typedef union +{ + uint16_t W; + struct + { + uint8_t L; + uint8_t H; + } __attribute__ ((packed)) WB; +} __attribute__ ((packed)) WORD_BYTE; + + +/* bmRequestType.Dir */ +#define REQUEST_HOST_TO_DEVICE 0 +#define REQUEST_DEVICE_TO_HOST 1 + +/* bmRequestType.Type */ +#define REQUEST_STANDARD 0 +#define REQUEST_CLASS 1 +#define REQUEST_VENDOR 2 +#define REQUEST_RESERVED 3 + +/* bmRequestType.Recipient */ +#define REQUEST_TO_DEVICE 0 +#define REQUEST_TO_INTERFACE 1 +#define REQUEST_TO_ENDPOINT 2 +#define REQUEST_TO_OTHER 3 + +/* bmRequestType Definition */ +typedef union _REQUEST_TYPE +{ + struct _BM + { + uint8_t Recipient : 5; + uint8_t Type : 2; + uint8_t Dir : 1; + } __attribute__ ((packed)) BM; + uint8_t B; +} __attribute__ ((packed)) REQUEST_TYPE; + +/* USB Standard Request Codes */ +#define USB_REQUEST_GET_STATUS 0 +#define USB_REQUEST_CLEAR_FEATURE 1 +#define USB_REQUEST_SET_FEATURE 3 +#define USB_REQUEST_SET_ADDRESS 5 +#define USB_REQUEST_GET_DESCRIPTOR 6 +#define USB_REQUEST_SET_DESCRIPTOR 7 +#define USB_REQUEST_GET_CONFIGURATION 8 +#define USB_REQUEST_SET_CONFIGURATION 9 +#define USB_REQUEST_GET_INTERFACE 10 +#define USB_REQUEST_SET_INTERFACE 11 +#define USB_REQUEST_SYNC_FRAME 12 + +/* USB GET_STATUS Bit Values */ +#define USB_GETSTATUS_SELF_POWERED 0x01 +#define USB_GETSTATUS_REMOTE_WAKEUP 0x02 +#define USB_GETSTATUS_ENDPOINT_STALL 0x01 + +/* USB Standard Feature selectors */ +#define USB_FEATURE_ENDPOINT_STALL 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 + +/* USB Default Control Pipe Setup Packet */ +typedef struct _USB_SETUP_PACKET +{ + REQUEST_TYPE bmRequestType; + uint8_t bRequest; + WORD_BYTE wValue; + WORD_BYTE wIndex; + uint16_t wLength; +} __attribute__ ((packed)) USB_SETUP_PACKET; + + +/* USB Descriptor Types */ +#define USB_DEVICE_DESCRIPTOR_TYPE 1 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2 +#define USB_STRING_DESCRIPTOR_TYPE 3 +#define USB_INTERFACE_DESCRIPTOR_TYPE 4 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 5 +#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6 +#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7 +#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8 +#define USB_OTG_DESCRIPTOR_TYPE 9 +#define USB_DEBUG_DESCRIPTOR_TYPE 10 +#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 11 + +/* USB Device Classes */ +#define USB_DEVICE_CLASS_RESERVED 0x00 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 +#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 +#define USB_DEVICE_CLASS_MONITOR 0x04 +#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05 +#define USB_DEVICE_CLASS_POWER 0x06 +#define USB_DEVICE_CLASS_PRINTER 0x07 +#define USB_DEVICE_CLASS_STORAGE 0x08 +#define USB_DEVICE_CLASS_HUB 0x09 +#define USB_DEVICE_CLASS_MISCELLANEOUS 0xEF +#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF + +/* bmAttributes in Configuration Descriptor */ +#define USB_CONFIG_POWERED_MASK 0x40 +#define USB_CONFIG_BUS_POWERED 0x80 +#define USB_CONFIG_SELF_POWERED 0xC0 +#define USB_CONFIG_REMOTE_WAKEUP 0x20 + +/* bMaxPower in Configuration Descriptor */ +#define USB_CONFIG_POWER_MA(mA) ((mA)/2) + +/* bEndpointAddress in Endpoint Descriptor */ +#define USB_ENDPOINT_DIRECTION_MASK 0x80 +#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00) +#define USB_ENDPOINT_IN(addr) ((addr) | 0x80) + +/* bmAttributes in Endpoint Descriptor */ +#define USB_ENDPOINT_TYPE_MASK 0x03 +#define USB_ENDPOINT_TYPE_CONTROL 0x00 +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 +#define USB_ENDPOINT_TYPE_BULK 0x02 +#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 +#define USB_ENDPOINT_SYNC_MASK 0x0C +#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00 +#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04 +#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08 +#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C +#define USB_ENDPOINT_USAGE_MASK 0x30 +#define USB_ENDPOINT_USAGE_DATA 0x00 +#define USB_ENDPOINT_USAGE_FEEDBACK 0x10 +#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20 +#define USB_ENDPOINT_USAGE_RESERVED 0x30 + +/* USB Standard Device Descriptor */ +typedef struct _USB_DEVICE_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} __attribute__ ((packed)) USB_DEVICE_DESCRIPTOR; + +/* USB 2.0 Device Qualifier Descriptor */ +typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} __attribute__ ((packed)) USB_DEVICE_QUALIFIER_DESCRIPTOR; + +/* USB Standard Configuration Descriptor */ +typedef struct _USB_CONFIGURATION_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} __attribute__ ((packed)) USB_CONFIGURATION_DESCRIPTOR; + +/* USB Standard Interface Descriptor */ +typedef struct _USB_INTERFACE_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} __attribute__ ((packed)) USB_INTERFACE_DESCRIPTOR; + +/* USB Standard Endpoint Descriptor */ +typedef struct _USB_ENDPOINT_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} __attribute__ ((packed)) USB_ENDPOINT_DESCRIPTOR; + +/* USB String Descriptor */ +typedef struct _USB_STRING_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bString/*[]*/; +} __attribute__ ((packed)) USB_STRING_DESCRIPTOR; + +/* USB Common Descriptor */ +typedef struct _USB_COMMON_DESCRIPTOR +{ + uint8_t bLength; + uint8_t bDescriptorType; +} __attribute__ ((packed)) USB_COMMON_DESCRIPTOR; + +#endif diff --git a/macusbfb/core/usbhid-rom/usbconfig.c b/macusbfb/core/usbhid-rom/usbconfig.c new file mode 100644 index 0000000..a9dc375 --- /dev/null +++ b/macusbfb/core/usbhid-rom/usbconfig.c @@ -0,0 +1,111 @@ +/**************************************************************************/ +/*! + @file usbconfig.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "usb.h" +#include "usbconfig.h" + +/* USB String Descriptor (optional) */ +const uint8_t USB_HIDStringDescriptor[] = +{ + /* Index 0x00: LANGID Codes */ + 0x04, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + WBVAL(0x0409), /* US English */ /* wLANGID */ + /* Index 0x04: Manufacturer */ + 0x1C, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'm',0, + 'i',0, + 'c',0, + 'r',0, + 'o',0, + 'B',0, + 'u',0, + 'i',0, + 'l',0, + 'd',0, + 'e',0, + 'r',0, + ' ',0, + /* Index 0x20: Product */ + 0x28, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'L',0, + 'P',0, + 'C',0, + '1',0, + '3',0, + '4',0, + '3',0, + ' ',0, + 'R',0, + 'e',0, + 'f',0, + '.',0, + ' ',0, + 'B',0, + 'o',0, + 'a',0, + 'r',0, + 'd',0, + ' ',0, + /* Index 0x48: Serial Number */ + 0x1A, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + '0',0, + /* Index 0x62: Interface 0, Alternate Setting 0 */ + 0x0E, /* bLength */ + USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ + 'H',0, + 'I',0, + 'D',0, + ' ',0, + ' ',0, + ' ',0, +}; diff --git a/macusbfb/core/usbhid-rom/usbconfig.h b/macusbfb/core/usbhid-rom/usbconfig.h new file mode 100644 index 0000000..c279b84 --- /dev/null +++ b/macusbfb/core/usbhid-rom/usbconfig.h @@ -0,0 +1,68 @@ +/**************************************************************************/ +/*! + @file usbconfig.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _USBCONFIG_H_ +#define _USBCONFIG_H_ + +#define USB_VID 0x1FC9 + +#define USB_VENDOR_ID USB_VID // Vendor ID +#define USB_PROD_ID 0x0003 // Product ID +#define USB_DEVICE 0x0100 // Device ID + +#define WBVAL(x) ((x) & 0xFF),(((x) >> 8) & 0xFF) + +#define USB_DEVICE_DESC_SIZE (sizeof(USB_DEVICE_DESCRIPTOR)) +#define USB_CONFIGUARTION_DESC_SIZE (sizeof(USB_CONFIGURATION_DESCRIPTOR)) +#define USB_INTERFACE_DESC_SIZE (sizeof(USB_INTERFACE_DESCRIPTOR)) +#define USB_ENDPOINT_DESC_SIZE (sizeof(USB_ENDPOINT_DESCRIPTOR)) + +#define HID_DESC_OFFSET 0x0012 +#define HID_DESC_SIZE (sizeof(HID_DESCRIPTOR)) +#define HID_REPORT_DESC_SIZE (sizeof(HID_ReportDescriptor)) + +#include "projectconfig.h" + +extern const uint8_t USB_DeviceDescriptor[]; +extern const uint8_t USB_ConfigDescriptor[]; +extern const uint8_t USB_HIDStringDescriptor[]; + +extern const uint8_t HID_ReportDescriptor[]; +extern const uint16_t HID_ReportDescSize; + +#endif \ No newline at end of file diff --git a/macusbfb/core/usbhid-rom/usbhid.c b/macusbfb/core/usbhid-rom/usbhid.c new file mode 100644 index 0000000..af34cf1 --- /dev/null +++ b/macusbfb/core/usbhid-rom/usbhid.c @@ -0,0 +1,181 @@ +/**************************************************************************/ +/*! + @file usbhid.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "core/usbhid-rom/usb.h" +#include "core/usbhid-rom/usbconfig.h" +#include "core/usbhid-rom/rom_drivers.h" +#include "core/gpio/gpio.h" + +#include "usbhid.h" + +USB_DEV_INFO DeviceInfo; +HID_DEVICE_INFO HidDevInfo; +ROM ** rom = (ROM **)0x1fff1ff8; + +/**************************************************************************/ +/*! + @brief Gets the HID In Report (the report going from the LPC1343 to + the USB host) +*/ +/**************************************************************************/ +void usbHIDGetInReport (uint8_t src[], uint32_t length) +{ + uint8_t PCInReportData = 0; + + // ToDo: Move this logic elsewhere to keep code 'generic' + + // If LED enabled set bit 0 to 1 + if (!gpioGetValue(CFG_LED_PORT, CFG_LED_PIN)) + { + PCInReportData |= 1<<0; + } + + src[0] = PCInReportData; +} + +/**************************************************************************/ +/*! + @brief Sets the HID Out Report (the report coming in from the USB + host to the LPC1343). +*/ +/**************************************************************************/ +void usbHIDSetOutReport (uint8_t dst[], uint32_t length) +{ + uint8_t PCOutReportData = dst[0]; + // Check bit 0 in the incoming report to determine is LED should + // be enabled or disabled (1 = enabled, 0 = disabled) + if (PCOutReportData & (1<<0)) + { + // Enable LED (set low) + gpioSetValue (CFG_LED_PORT, CFG_LED_PIN, 0); + } + else + { + // Disable LED (set high) + gpioSetValue (CFG_LED_PORT, CFG_LED_PIN, 1); + } +} + +/**************************************************************************/ +/*! + @brief Initialises the USB port + + The ROM-based USB HID code is capable of configuring the PLL and pins + for USB, but there seems to be a bug in the code that sets the system + clock to 48MHz (normally the USB and System clocks can be configured + seperately). As such, this code does not use the "init_clk_pins()" + function in the rom, and the USB clock and pins are manually + configured. +*/ +/**************************************************************************/ +void usbHIDInit (void) +{ + // Setup USB clock + SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPAD_PD); // Power-up USB PHY + SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPLL_PD); // Power-up USB PLL + + SCB_USBPLLCLKSEL = SCB_USBPLLCLKSEL_SOURCE_MAINOSC; // Select PLL Input + SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE; // Update Clock Source + SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_DISABLE; // Toggle Update Register + SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE; + + // Wait until the USB clock is updated + while (!(SCB_USBPLLCLKUEN & SCB_USBPLLCLKUEN_UPDATE)); + + // Set USB clock to 48MHz (12MHz x 4) + SCB_USBPLLCTRL = (SCB_USBPLLCTRL_MULT_4); + while (!(SCB_USBPLLSTAT & SCB_USBPLLSTAT_LOCK)); // Wait Until PLL Locked + SCB_USBCLKSEL = SCB_USBCLKSEL_SOURCE_USBPLLOUT; + + // Set USB pin functions + IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK; + IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT + IOCON_PIO0_3 &= ~IOCON_PIO0_3_FUNC_MASK; + IOCON_PIO0_3 |= IOCON_PIO0_3_FUNC_USB_VBUS; // VBus + IOCON_PIO0_6 &= ~IOCON_PIO0_6_FUNC_MASK; + IOCON_PIO0_6 |= IOCON_PIO0_6_FUNC_USB_CONNECT; // Soft Connect + + // Disable internal resistor on VBUS (0.3) + gpioSetPullup(&IOCON_PIO0_3, gpioPullupMode_Inactive); + + // HID Device Info + volatile int n; + HidDevInfo.idVendor = USB_VENDOR_ID; + HidDevInfo.idProduct = USB_PROD_ID; + HidDevInfo.bcdDevice = USB_DEVICE; + HidDevInfo.StrDescPtr = (uint32_t)&USB_HIDStringDescriptor[0]; + #ifdef CFG_USBHID_EXAMPLE + HidDevInfo.InReportCount = 2; + HidDevInfo.OutReportCount = 2; + #else + HidDevInfo.InReportCount = 1; + HidDevInfo.OutReportCount = 1; + #endif + HidDevInfo.SampleInterval = 0x20; + HidDevInfo.InReport = usbHIDGetInReport; + HidDevInfo.OutReport = usbHIDSetOutReport; + + DeviceInfo.DevType = USB_DEVICE_CLASS_HUMAN_INTERFACE; + DeviceInfo.DevDetailPtr = (uint32_t)&HidDevInfo; + + /* Enable Timer32_1, IOCON, and USB blocks (for USB ROM driver) */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B1 | SCB_SYSAHBCLKCTRL_IOCON | SCB_SYSAHBCLKCTRL_USB_REG); + + /* Use pll and pin init function in rom */ + /* Warning: This will also set the system clock to 48MHz! */ + // (*rom)->pUSBD->init_clk_pins(); + + /* insert a delay between clk init and usb init */ + for (n = 0; n < 75; n++) {__asm("nop");} + + (*rom)->pUSBD->init(&DeviceInfo); /* USB Initialization */ + (*rom)->pUSBD->connect(TRUE); /* USB Connect */ +} + +/**************************************************************************/ +/*! + @brief Passes the USB interrupt to the internal ROM-based handler +*/ +/**************************************************************************/ +#ifdef CFG_USBHID +void USB_IRQHandler() +{ + (*rom)->pUSBD->isr(); +} +#endif + diff --git a/macusbfb/core/usbhid-rom/usbhid.h b/macusbfb/core/usbhid-rom/usbhid.h new file mode 100644 index 0000000..2c284d8 --- /dev/null +++ b/macusbfb/core/usbhid-rom/usbhid.h @@ -0,0 +1,48 @@ +/**************************************************************************/ +/*! + @file usbhid.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _USBCONFIG_H_ +#define _USBCONFIG_H_ + +#include "projectconfig.h" + +void usbHIDGetInReport (uint8_t src[], uint32_t length); +void usbHIDSetOutReport (uint8_t dst[], uint32_t length); +void usbHIDInit (void); + +#endif diff --git a/macusbfb/core/wdt/wdt.c b/macusbfb/core/wdt/wdt.c new file mode 100644 index 0000000..08e6421 --- /dev/null +++ b/macusbfb/core/wdt/wdt.c @@ -0,0 +1,145 @@ +/**************************************************************************/ +/*! + @file wdt.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Sets up the watchdog timer (WDT). The WDT allows you to monitor + whether the device is still executing properly. If the watchdog + isn't 'fed' within a pre-determined delay, it will raise an interrupt + allowing you to decide if you want to reset the device, etc. + + @code + #include "core/cpu/cpu.h" + #include "core/wdt/wdt.h" + ... + cpuInit(); + wdtInit(); + wdtFeed(); + ... + while (1) + { + // Keep the watchdog happy by regularly feeding it + wdtFeed(); + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "wdt.h" + +#define WDT_FEED_VALUE (0x003FFFFF) + +volatile uint32_t wdt_counter; + +/**************************************************************************/ +/*! + IRQ Handler when the watchdog times out. Any actions that you wish + to take when a timeout occurs should be called from here. +*/ +/**************************************************************************/ +void WDT_IRQHandler(void) +{ + /* Clear the time-out interrupt flag */ + WDT_WDMOD &= ~WDT_WDMOD_WDTOF; + wdt_counter++; +} + +/**************************************************************************/ +/*! + Setup the clock for the watchdog timer. The default setting is 250kHz. +*/ +/**************************************************************************/ +static void wdtClockSetup (void) +{ + /* Watchdog Configuration */ + /* Freq. = 0.5MHz, div = 2: WDT_OSC = 250kHz */ + SCB_WDTOSCCTRL = SCB_WDTOSCCTRL_FREQSEL_0_5MHZ | + SCB_WDTOSCCTRL_DIVSEL_DIV2; + + /* Set clock source (use external crystal) */ + SCB_WDTCLKSEL = SCB_WDTCLKSEL_SOURCE_INPUTCLOCK; + SCB_WDTCLKUEN = SCB_WDTCLKUEN_UPDATE; + SCB_WDTCLKUEN = SCB_WDTCLKUEN_DISABLE; + SCB_WDTCLKUEN = SCB_WDTCLKUEN_UPDATE; + + /* Wait until updated */ + while (!(SCB_WDTCLKUEN & SCB_WDTCLKUEN_UPDATE)); + + /* Set divider */ + SCB_WDTCLKDIV = SCB_WDTCLKDIV_DIV1; + + /* Enable WDT clock */ + SCB_PDRUNCFG &= ~(SCB_PDRUNCFG_WDTOSC); +} + +/**************************************************************************/ +/*! + Initialises the watchdog timer and sets up the interrupt. +*/ +/**************************************************************************/ +void wdtInit (void) +{ + /* Setup the WDT clock */ + wdtClockSetup(); + + /* Enable AHB clock to the WDT domain. */ + SCB_SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_WDT; + + wdt_counter = 0; + + /* Enable the WDT interrupt */ + NVIC_EnableIRQ(WDT_IRQn); + + /* Set timeout value (must be at least 0x000000FF) */ + WDT_WDTC = WDT_FEED_VALUE; + + /* Enable the watchdog timer (without system reset) */ + WDT_WDMOD = WDT_WDMOD_WDEN_ENABLED | + WDT_WDMOD_WDRESET_DISABLED; +} + +/**************************************************************************/ +/*! + Feeds the watchdog to keep it from timing out. +*/ +/**************************************************************************/ +void wdtFeed (void) +{ + /* Pet the watchdog */ + WDT_WDFEED = WDT_WDFEED_FEED1; + WDT_WDFEED = WDT_WDFEED_FEED2; +} + diff --git a/macusbfb/core/wdt/wdt.h b/macusbfb/core/wdt/wdt.h new file mode 100644 index 0000000..b52a91f --- /dev/null +++ b/macusbfb/core/wdt/wdt.h @@ -0,0 +1,47 @@ +/**************************************************************************/ +/*! + @file wdt.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _WDT_H_ +#define _WDT_H_ + +#include "projectconfig.h" + +void wdtInit (void); +void wdtFeed (void); + +#endif \ No newline at end of file diff --git a/macusbfb/debug.c b/macusbfb/debug.c new file mode 100644 index 0000000..efc9cd5 --- /dev/null +++ b/macusbfb/debug.c @@ -0,0 +1,60 @@ +/* +Firmware for a Macintosh display adapter connected over USB +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +extern unsigned char fontdata_8x8[]; +extern void dramSetByte(int x, int y, char byte); + + +/**************************************************************************/ +/*! + @brief Sends a single byte to a pre-determined peripheral (UART, etc.). + + @param[in] byte + Byte value to send +*/ +/**************************************************************************/ +void __putchar(const char c) { + static int x=0; + static int y=0; + if (c=='\n') { + x=0; + y+=8; + } else { + int i; + for (i=0; i<8; i++) { + dramSetByte(x,y+i,fontdata_8x8[c*8+i]); + } + x+=1; + } +} + +/**************************************************************************/ +/*! + @brief Sends a string to a pre-determined end point (UART, etc.). + + @param[in] str + Text to send +*/ +/**************************************************************************/ +int puts(const char * str) +{ + while(*str) __putchar(*str++); + return 0; +} + + diff --git a/macusbfb/drivers/chibi/chb.c b/macusbfb/drivers/chibi/chb.c new file mode 100644 index 0000000..11860f1 --- /dev/null +++ b/macusbfb/drivers/chibi/chb.c @@ -0,0 +1,202 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +#include +#include + +#include "chb.h" +#include "chb_drvr.h" +#include "chb_buf.h" + +static chb_pcb_t pcb; + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_init() +{ + memset(&pcb, 0, sizeof(chb_pcb_t)); + pcb.src_addr = chb_get_short_addr(); + chb_drvr_init(); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +chb_pcb_t *chb_get_pcb() +{ + return &pcb; +} + +/**************************************************************************/ +/*! + Requires the dest addr, location to store data, and len of payload. + Returns the length of the hdr. +*/ +/**************************************************************************/ +static U8 chb_gen_hdr(U8 *hdr, U16 addr, U8 len) +{ + U8 *hdr_ptr = hdr; + + // calc frame size and put in 0 position of array + // frame size = hdr sz + payload len + fcs len + *hdr_ptr++ = CHB_HDR_SZ + len + CHB_FCS_LEN; + + // use default fcf byte 0 val but test for ack request. we won't request + // ack if broadcast. all other cases we will. + *hdr_ptr++ = CHB_FCF_BYTE_0 | ((addr != 0xFFFF) << CHB_ACK_REQ_POS); + *hdr_ptr++ = CHB_FCF_BYTE_1; + + *hdr_ptr++ = pcb.seq++; + + // fill out dest pan ID, dest addr, src addr + *(U16 *)hdr_ptr = CHB_PAN_ID; + hdr_ptr += sizeof(U16); + *(U16 *)hdr_ptr = addr; + hdr_ptr += sizeof(U16); + *(U16 *)hdr_ptr = pcb.src_addr; + hdr_ptr += sizeof(U16); + + // return the len of the header + return hdr_ptr - hdr; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +U8 chb_write(U16 addr, U8 *data, U8 len) +{ + U8 status, frm_len, hdr_len, hdr[CHB_HDR_SZ + 1]; + + while (len > 0) + { + // calculate which frame len to use. if greater than max payload, split + // up operation. + frm_len = (len > CHB_MAX_PAYLOAD) ? CHB_MAX_PAYLOAD : len; + + // gen frame header + hdr_len = chb_gen_hdr(hdr, addr, len); + + // send data to chip + status = chb_tx(hdr, data, len); + + if (status != CHB_SUCCESS) + { + switch (status) + { + case RADIO_SUCCESS: + // fall through + case CHB_SUCCESS_DATA_PENDING: + pcb.txd_success++; + break; + + case CHB_NO_ACK: + pcb.txd_noack++; + break; + + case CHB_CHANNEL_ACCESS_FAILURE: + pcb.txd_channel_fail++; + break; + + default: + break; + } + return status; + } + + // adjust len and restart + len = len - frm_len; + } + return CHB_SUCCESS; +} + +/**************************************************************************/ +/*! + Read data from the buffer. Need to pass in a buffer of at leasts max frame + size and two 16-bit containers for the src and dest addresses. + + The read function will automatically populate the addresses and the data with + the frm payload. It will then return the len of the payload. +*/ +/**************************************************************************/ +U8 chb_read(chb_rx_data_t *rx) +{ + U8 i, len, *data_ptr; + + data_ptr = rx->data; + + // first byte is always len. check it to make sure + // we have a valid len byte. + if ((len = chb_buf_read()) > CHB_MAX_FRAME_LENGTH) + { + return 0; + } + *data_ptr++ = len; + + // load the rest of the data into buffer + for (i=0; idata + 6; // location of dest addr + rx->dest_addr = *(U16 *)data_ptr; + data_ptr += sizeof(U16); + rx->src_addr = *(U16 *)data_ptr; + data_ptr += sizeof(U16); + + // move the payload down to the beginning of the data buffer + memmove(rx->data, data_ptr, len - CHB_HDR_SZ); + + // if the data in the rx buf is 0, then clear the rx_flag. otherwise, keep it raised + if (!chb_buf_get_len()) + { + pcb.data_rcv = false; + } + + // finally, return the len of the payload + return len - CHB_HDR_SZ - CHB_FCS_LEN; +} + diff --git a/macusbfb/drivers/chibi/chb.h b/macusbfb/drivers/chibi/chb.h new file mode 100644 index 0000000..1a5dd00 --- /dev/null +++ b/macusbfb/drivers/chibi/chb.h @@ -0,0 +1,99 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +#ifndef CHIBI_H +#define CHIBI_H + +#include "types.h" + +#define CHB_HDR_SZ 9 // FCF + seq + pan_id + dest_addr + src_addr (1 + 2 + 1 + 2 + 2 + 2) +#define CHB_FCS_LEN 2 +#define CHB_MAX_PAYLOAD 100 + + +// frame_type = data +// security enabled = false +// frame pending = false +// ack request = false +// pan ID compression = true +#define CHB_FCF_BYTE_0 0x41 + +// dest addr = 16-bit +// frame version = 802.15.4 (not 2003) +// src addr = 16-bit +#define CHB_FCF_BYTE_1 0x98 + +#define CHB_ACK_REQ_POS 5 + +enum +{ + CHB_SUCCESS = 0, + CHB_SUCCESS_DATA_PENDING = 1, + CHB_CHANNEL_ACCESS_FAILURE = 3, + CHB_NO_ACK = 5, + CHB_INVALID = 7 +}; + +// Chibi Protocol control block +typedef struct +{ + U16 src_addr; + U8 seq; + volatile bool data_rcv; + volatile bool tx_end; + + // stats + U16 rcvd_xfers; + U16 txd_success; + U16 txd_noack; + U16 txd_channel_fail; + U16 underrun; + U8 battlow; + U8 ed; + U8 crc; +} chb_pcb_t; + +typedef struct +{ + U8 len; + U16 src_addr; + U16 dest_addr; + U8 data[CHB_MAX_PAYLOAD]; +} chb_rx_data_t; + +void chb_init(); +chb_pcb_t *chb_get_pcb(); +U8 chb_write(U16 addr, U8 *data, U8 len); +U8 chb_read(chb_rx_data_t *rx); + +#endif diff --git a/macusbfb/drivers/chibi/chb_buf.c b/macusbfb/drivers/chibi/chb_buf.c new file mode 100644 index 0000000..5624e58 --- /dev/null +++ b/macusbfb/drivers/chibi/chb_buf.c @@ -0,0 +1,87 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +#include +#include "chb_buf.h" + +static U8 chb_buf[CHB_BUF_SZ]; +static U8 rd_ptr, wr_ptr, len; + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_buf_init() +{ + rd_ptr = 0; + wr_ptr = 0; + len = 0; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_buf_write(U8 data) +{ + chb_buf[wr_ptr] = data; + wr_ptr = (wr_ptr + 1) % CHB_BUF_SZ; + len++; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +U8 chb_buf_read() +{ + U8 data; + + data = chb_buf[rd_ptr]; + rd_ptr = (rd_ptr + 1) % CHB_BUF_SZ; + len--; + return data; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +U8 chb_buf_get_len() +{ + return len; +} diff --git a/macusbfb/drivers/chibi/chb_buf.h b/macusbfb/drivers/chibi/chb_buf.h new file mode 100644 index 0000000..6b69d1e --- /dev/null +++ b/macusbfb/drivers/chibi/chb_buf.h @@ -0,0 +1,46 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +#ifndef CHB_BUF_H +#define CHB_BUF_H + +#include "types.h" + +#define CHB_BUF_SZ 128 + +void chb_buf_init(); +void chb_buf_write(U8 data); +U8 chb_buf_read(); +U8 chb_buf_get_len(); + +#endif diff --git a/macusbfb/drivers/chibi/chb_drvr.c b/macusbfb/drivers/chibi/chb_drvr.c new file mode 100644 index 0000000..a1d29c9 --- /dev/null +++ b/macusbfb/drivers/chibi/chb_drvr.c @@ -0,0 +1,890 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +#include +#include "chb.h" +#include "chb_drvr.h" +#include "chb_buf.h" +#include "chb_spi.h" +#include "chb_eeprom.h" + +#include "core/systick/systick.h" + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +static U8 chb_get_state() +{ + return chb_reg_read(TRX_STATUS) & 0x1f; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +static U8 chb_get_status() +{ + return chb_reg_read(TRX_STATE) >> CHB_TRAC_STATUS_POS; +} + +/**************************************************************************/ +/*! + Cause a blocking delay for x microseconds +*/ +/**************************************************************************/ +static void chb_delay_us(U16 usec) +{ + U8 ticks = CFG_CPU_CCLK / 1000000; + do + { + do + { + __asm volatile("nop"); + } while (--ticks); + } while (--usec); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_reset() +{ + CHB_RST_DISABLE(); + CHB_SLPTR_DISABLE(); + + // wait a bit while transceiver wakes up + chb_delay_us(TIME_P_ON_TO_CLKM_AVAIL); + + // reset the device + CHB_RST_ENABLE(); + chb_delay_us(TIME_RST_PULSE_WIDTH); + CHB_RST_DISABLE(); + + // check that we have the part number that we're expecting + while (1) + { + // if you're stuck in this loop, that means that you're not reading + // the version and part number register correctly. possible that version number + // changes. if so, update version num in header file + if ((chb_reg_read(VERSION_NUM) == CHB_AT86RF212_VER_NUM) && (chb_reg_read(PART_NUM) == CHB_AT86RF212_PART_NUM)) + { + break; + } + } +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +U8 chb_reg_read(U8 addr) +{ + U8 val = 0; + + /* Add the register read command to the register address. */ + addr |= 0x80; + + CHB_ENTER_CRIT(); + CHB_SPI_ENABLE(); + + /*Send Register address and read register content.*/ + val = chb_xfer_byte(addr); + val = chb_xfer_byte(val); + + CHB_SPI_DISABLE(); + CHB_LEAVE_CRIT(); + + return val; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +U16 chb_reg_read16(U8 addr) +{ + U8 i; + U16 val = 0; + + for (i=0; i<2; i++) + { + addr |= chb_reg_read(addr + i) << (8 * i); + } + return val; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_reg_write(U8 addr, U8 val) +{ + U8 dummy; + + /* Add the Register Write command to the address. */ + addr |= 0xC0; + + CHB_ENTER_CRIT(); + CHB_SPI_ENABLE(); + + /*Send Register address and write register content.*/ + dummy = chb_xfer_byte(addr); + dummy = chb_xfer_byte(val); + + CHB_SPI_DISABLE(); + CHB_LEAVE_CRIT(); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_reg_write16(U8 addr, U16 val) +{ + U8 i; + + for (i=0; i<2; i++) + { + chb_reg_write(addr + i, val >> (8 * i)); + } +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_reg_write64(U8 addr, U8 *val) +{ + U8 i; + + for (i=0; i<8; i++) + { + chb_reg_write(addr + i, *(val + i)); + } +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_reg_read_mod_write(U8 addr, U8 val, U8 mask) +{ + U8 tmp; + + tmp = chb_reg_read(addr); + val &= mask; // mask off stray bits from val + tmp &= ~mask; // mask off bits in reg val + tmp |= val; // copy val into reg val + chb_reg_write(addr, tmp); // write back to reg +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_frame_write(U8 *hdr, U8 hdr_len, U8 *data, U8 data_len) +{ + U8 i, dummy; + + // dont allow transmission longer than max frame size + if ((hdr_len + data_len) > 127) + { + return; + } + + // initiate spi transaction + CHB_ENTER_CRIT(); + CHB_SPI_ENABLE(); + + // send fifo write command + dummy = chb_xfer_byte(CHB_SPI_CMD_FW); + + // write hdr contents to fifo + for (i=0; i= CHB_MIN_FRAME_LENGTH) && (len <= CHB_MAX_FRAME_LENGTH)) + { + chb_buf_write(len); + + for (i=0; i 3) + { + channel = 0; + } + + channel = (channel << 1) + 11; + + chb_reg_read_mod_write(CC_CTRL_1, 0x4, 0x7); // set 769 MHz base frequency for China + chb_reg_write(CC_CTRL_0, channel); // set the center frequency for the channel + +#else + //if (channel == 0) + //{ + // // Channel 0 is for European use only. make sure we are using channel page 2, + // // channel 0 settings for 100 kbps + // if ((chb_reg_read(TRX_CTRL_2) & 0x3f) != 0x08) + // { + // chb_reg_read_mod_write(TRX_CTRL_2, 0x08, 0x3f); + // } + //} + //else if (channel > 10) + //{ + // // if the channel is out of bounds for page 2, then default to channel 1 and + // // assume we're on the US frequency of 915 MHz + // channel = 1; + // if ((chb_reg_read(TRX_CTRL_2) & 0x3f) != 0x0c) + // { + // chb_reg_read_mod_write(TRX_CTRL_2, 0x0c, 0x3f); + // } + //} + //else + //{ + // // Channels 1-10 are for US frequencies of 915 MHz + // if ((chb_reg_read(TRX_CTRL_2) & 0x3f) != 0x0c) + // { + // chb_reg_read_mod_write(TRX_CTRL_2, 0x0c, 0x3f); + // } + //} + + chb_reg_read_mod_write(PHY_CC_CCA, channel, 0x1f); +#endif + + // add a delay to allow the PLL to lock if in active mode. + state = chb_get_state(); + if ((state == RX_ON) || (state == PLL_ON)) + { + chb_delay_us(TIME_PLL_LOCK_TIME); + } + + return ((chb_reg_read(PHY_CC_CCA) & 0x1f) == channel) ? RADIO_SUCCESS : RADIO_TIMED_OUT; +} + +/**************************************************************************/ +/*! + Set the power level +*/ +/**************************************************************************/ +void chb_set_pwr(U8 val) +{ + chb_reg_write(PHY_TX_PWR, val); +} + +/**************************************************************************/ +/*! + Set the TX/RX state machine state. Some manual manipulation is required + for certain operations. Check the datasheet for more details on the state + machine and manipulations. +*/ +/**************************************************************************/ +U8 chb_set_state(U8 state) +{ + U8 curr_state, delay; + + // if we're sleeping then don't allow transition + if (gpioGetValue(CHB_SLPTRPORT, CHB_SLPTRPIN)) + { + return RADIO_WRONG_STATE; + } + + // if we're in a transition state, wait for the state to become stable + curr_state = chb_get_state(); + if ((curr_state == BUSY_TX_ARET) || (curr_state == BUSY_RX_AACK) || (curr_state == BUSY_RX) || (curr_state == BUSY_TX)) + { + while (chb_get_state() == curr_state); + } + + // At this point it is clear that the requested new_state is: + // TRX_OFF, RX_ON, PLL_ON, RX_AACK_ON or TX_ARET_ON. + // we need to handle some special cases before we transition to the new state + switch (state) + { + case TRX_OFF: + /* Go to TRX_OFF from any state. */ + CHB_SLPTR_DISABLE(); + chb_reg_read_mod_write(TRX_STATE, CMD_FORCE_TRX_OFF, 0x1f); + chb_delay_us(TIME_ALL_STATES_TRX_OFF); + break; + + case TX_ARET_ON: + if (curr_state == RX_AACK_ON) + { + /* First do intermediate state transition to PLL_ON, then to TX_ARET_ON. */ + chb_reg_read_mod_write(TRX_STATE, CMD_PLL_ON, 0x1f); + chb_delay_us(TIME_RX_ON_PLL_ON); + } + break; + + case RX_AACK_ON: + if (curr_state == TX_ARET_ON) + { + /* First do intermediate state transition to RX_ON, then to RX_AACK_ON. */ + chb_reg_read_mod_write(TRX_STATE, CMD_RX_ON, 0x1f); + chb_delay_us(TIME_PLL_ON_RX_ON); + } + break; + } + + /* Now we're okay to transition to any new state. */ + chb_reg_read_mod_write(TRX_STATE, state, 0x1f); + + /* When the PLL is active most states can be reached in 1us. However, from */ + /* TRX_OFF the PLL needs time to activate. */ + delay = (curr_state == TRX_OFF) ? TIME_TRX_OFF_PLL_ON : TIME_RX_ON_PLL_ON; + chb_delay_us(delay); + + if (chb_get_state() == state) + { + return RADIO_SUCCESS; + } + return RADIO_TIMED_OUT; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_set_ieee_addr(U8 *addr) +{ + chb_eeprom_write(CHB_EEPROM_IEEE_ADDR, addr, 8); + chb_reg_write64(IEEE_ADDR_0, addr); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_get_ieee_addr(U8 *addr) +{ + chb_eeprom_read(CHB_EEPROM_IEEE_ADDR, addr, 8); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_set_short_addr(U16 addr) +{ + U8 *addr_ptr = (U8 *)&addr; + chb_pcb_t *pcb = chb_get_pcb(); + + chb_eeprom_write(CHB_EEPROM_SHORT_ADDR, addr_ptr, 2); + chb_reg_write16(SHORT_ADDR_0, addr); + pcb->src_addr = addr; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +U16 chb_get_short_addr() +{ + int16_t addr; + + chb_eeprom_read(CHB_EEPROM_SHORT_ADDR, (uint8_t*)&addr, 2); + return addr; +} +/**************************************************************************/ +/*! + Set the high gain mode pin for the CC1190 +*/ +/**************************************************************************/ +#if (CHB_CC1190_PRESENT) +void chb_set_hgm(U8 enb) +{ + if (enb) + { + gpioSetValue(CHB_CC1190_HGM_PORT, CHB_CC1190_HGM_PIN, 1); + } + else + { + gpioSetValue(CHB_CC1190_HGM_PORT, CHB_CC1190_HGM_PIN, 0); + } +} +#endif + +/**************************************************************************/ +/*! + Load the data into the fifo, initiate a transmission attempt, + and return the status of the transmission attempt. +*/ +/**************************************************************************/ +U8 chb_tx(U8 *hdr, U8 *data, U8 len) +{ + U8 state = chb_get_state(); + chb_pcb_t *pcb = chb_get_pcb(); + + if ((state == BUSY_TX) || (state == BUSY_TX_ARET)) + { + return RADIO_WRONG_STATE; + } + + // TODO: check why we need to transition to the off state before we go to tx_aret_on + chb_set_state(TRX_OFF); + chb_set_state(TX_ARET_ON); + + // TODO: try and start the frame transmission by writing TX_START command instead of toggling + // sleep pin...i just feel like it's kind of weird... + + // write frame to buffer. first write header into buffer (add 1 for len byte), then data. + chb_frame_write(hdr, CHB_HDR_SZ + 1, data, len); + + // TEST - check data in buffer + //{ + // U8 i, len, tmp[30]; + // + // len = 1 + CHB_HDR_SZ + len; + // chb_sram_read(0, len, tmp); + // for (i=0; itx_end); + pcb->tx_end = false; + + // check the status of the transmission + return chb_get_status(); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +static void chb_radio_init() +{ + U8 ieee_addr[8]; + + // reset chip + chb_reset(); + + // disable intps while we config the radio + chb_reg_write(IRQ_MASK, 0); + + // force transceiver off while we configure the intps + chb_reg_read_mod_write(TRX_STATE, CMD_FORCE_TRX_OFF, 0x1F); + + // make sure the transceiver is in the off state before proceeding + while ((chb_reg_read(TRX_STATUS) & 0x1f) != TRX_OFF); + + // set radio cfg parameters + // **note** uncomment if these will be set to something other than default + //chb_reg_read_mod_write(XAH_CTRL_0, CHB_MAX_FRAME_RETRIES << CHB_MAX_FRAME_RETRIES_POS, 0xF << CHB_MAX_FRAME_RETRIES_POS); + //chb_reg_read_mod_write(XAH_CTRL_0, CHB_MAX_CSMA_RETRIES << CHB_MAX_CSMA_RETIRES_POS, 0x7 << CHB_MAX_CSMA_RETIRES_POS); + //chb_reg_read_mod_write(CSMA_SEED_1, CHB_CSMA_SEED1 << CHB_CSMA_SEED1_POS, 0x7 << CHB_CSMA_SEED1_POS); + //chb_ret_write(CSMA_SEED0, CHB_CSMA_SEED0); + //chb_reg_read_mod_write(PHY_CC_CCA, CHB_CCA_MODE << CHB_CCA_MODE_POS,0x3 << CHB_CCA_MODE_POS); + //chb_reg_write(CCA_THRES, CHB_CCA_ED_THRES); + + // set frame version that we'll accept + chb_reg_read_mod_write(CSMA_SEED_1, CHB_FRM_VER << CHB_FVN_POS, 3 << CHB_FVN_POS); + + // set interrupt mask + // re-enable intps while we config the radio + chb_reg_write(IRQ_MASK, (1<ed = chb_reg_read(PHY_ED_LEVEL); + + // get the crc + pcb->crc = (chb_reg_read(PHY_RSSI) & (1<<7)) ? 1 : 0; + + // if the crc is not valid, then do not read the frame and set the rx flag + if (pcb->crc) + { + // get the data + chb_frame_read(); + pcb->rcvd_xfers++; + pcb->data_rcv = true; + } + } + else + { + pcb->tx_end = true; + } + intp_src &= ~CHB_IRQ_TRX_END_MASK; + while (chb_set_state(RX_AACK_ON) != RADIO_SUCCESS); + } + else if (intp_src & CHB_IRQ_TRX_UR_MASK) + { + intp_src &= ~CHB_IRQ_TRX_UR_MASK; + pcb->underrun++; + } + else if (intp_src & CHB_IRQ_PLL_UNLOCK_MASK) + { + intp_src &= ~CHB_IRQ_PLL_UNLOCK_MASK; + } + else if (intp_src & CHB_IRQ_PLL_LOCK_MASK) + { + intp_src &= ~CHB_IRQ_PLL_LOCK_MASK; + } + else if (intp_src & CHB_IRQ_BAT_LOW_MASK) + { + intp_src &= ~CHB_IRQ_BAT_LOW_MASK; + pcb->battlow++; + } + else + { + } + } + CHB_LEAVE_CRIT(); +} diff --git a/macusbfb/drivers/chibi/chb_drvr.h b/macusbfb/drivers/chibi/chb_drvr.h new file mode 100644 index 0000000..d2b502a --- /dev/null +++ b/macusbfb/drivers/chibi/chb_drvr.h @@ -0,0 +1,368 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +#ifndef CHIBI_DRVR_H +#define CHIBI_DRVR_H + +#include "types.h" +#include "projectconfig.h" +#include "core/gpio/gpio.h" + +#define CHB_CC1190_PRESENT 0 /// Set to 1 if CC1190 is being used +#define CHB_CHINA 0 +#define CHB_EEPROM_IEEE_ADDR CFG_CHIBI_EEPROM_IEEEADDR +#define CHB_EEPROM_SHORT_ADDR CFG_CHIBI_EEPROM_SHORTADDR +#define CHB_AT86RF212_VER_NUM 0x01 +#define CHB_AT86RF212_PART_NUM 0x07 +// #define CHB_BPSK 0 // set to 1 if want to use BPSK rather than OQPSK + +#define CHB_SPI_CMD_RW 0xC0 /**< Register Write (short mode). */ +#define CHB_SPI_CMD_RR 0x80 /**< Register Read (short mode). */ +#define CHB_SPI_CMD_FW 0x60 /**< Frame Transmit Mode (long mode). */ +#define CHB_SPI_CMD_FR 0x20 /**< Frame Receive Mode (long mode). */ +#define CHB_SPI_CMD_SW 0x40 /**< SRAM Write. */ +#define CHB_SPI_CMD_SR 0x00 /**< SRAM Read. */ +#define CHB_SPI_CMD_RADDRM 0x7F /**< Register Address Mask. */ + +#define CHB_IRQ_BAT_LOW_MASK 0x80 /**< Mask for the BAT_LOW interrupt. */ +#define CHB_IRQ_TRX_UR_MASK 0x40 /**< Mask for the TRX_UR interrupt. */ +#define CHB_IRQ_TRX_END_MASK 0x08 /**< Mask for the TRX_END interrupt. */ +#define CHB_IRQ_RX_START_MASK 0x04 /**< Mask for the RX_START interrupt. */ +#define CHB_IRQ_PLL_UNLOCK_MASK 0x02 /**< Mask for the PLL_UNLOCK interrupt. */ +#define CHB_IRQ_PLL_LOCK_MASK 0x01 /**< Mask for the PLL_LOCK interrupt. */ + +#define CHB_EINTPORT 1 +#define CHB_EINTPIN 8 +#define CHB_EINTPIN_IOCONREG IOCON_PIO1_8 +#define CHB_RSTPORT 1 +#define CHB_RSTPIN 9 +#define CHB_RSTPIN_IOCONREG IOCON_PIO1_9 +#define CHB_SLPTRPORT 1 +#define CHB_SLPTRPIN 10 +#define CHB_SLPTRPIN_IOCONREG IOCON_PIO1_10 + +// if CC1190 present, set up the ports and pins for high gain mode control +#if (CHB_CC1190_PRESENT) + #define CHB_CC1190_HGM_PORT 1 + #define CHB_CC1190_HGM_PIN 11 + #define CHB_CC1190_HGM_IOCONREG IOCON_PIO1_11 +#endif + +//#define CHB_DDR_SLPTR DDRF +//#define CHB_DDR_RST DDRF +//#define CHB_RADIO_IRQ INT6_vect +//#define CHB_RADIO_IRQ_PIN INT6 + +#define CHB_ENTER_CRIT() __disable_irq() +#define CHB_LEAVE_CRIT() __enable_irq() +#define CHB_RST_ENABLE() do {gpioSetValue(CHB_RSTPORT, CHB_RSTPIN, 0); systickDelay(1 / CFG_SYSTICK_DELAY_IN_MS);} while (0) +#define CHB_RST_DISABLE() do {gpioSetValue(CHB_RSTPORT, CHB_RSTPIN, 1); systickDelay(1 / CFG_SYSTICK_DELAY_IN_MS);} while (0) +#define CHB_SLPTR_ENABLE() do {gpioSetValue(CHB_SLPTRPORT, CHB_SLPTRPIN, 1); systickDelay(1 / CFG_SYSTICK_DELAY_IN_MS);} while (0) +#define CHB_SLPTR_DISABLE() do {gpioSetValue(CHB_SLPTRPORT, CHB_SLPTRPIN, 0); systickDelay(1 / CFG_SYSTICK_DELAY_IN_MS);} while (0) + +// CCA constants +enum +{ + CCA_ED = 1, /**< Use energy detection above threshold mode. */ + CCA_CARRIER_SENSE = 2, /**< Use carrier sense mode. */ + CCA_CARRIER_SENSE_WITH_ED = 3 /**< Use a combination of both energy detection and carrier sense. */ +}; + +// configuration parameters +enum +{ + CHB_CHANNEL = 1, + CHB_PAN_ID = 0x1234, + CHB_TX_PWR = 0x0, + CHB_SHORT_ADDR = 0x0, + CHB_IEEE_ADDR = 0x0, + CHB_MAX_FRAME_RETRIES = 3, + CHB_MAX_CSMA_RETRIES = 4, + CHB_CCA_MODE = CCA_ED, + CHB_MIN_BE = 3, + CHB_MAX_BE = 5, + CHB_CCA_ED_THRES = 0x7, + CHB_CSMA_SEED0 = 0, + CHB_CSMA_SEED1 = 0, + CHB_FRM_VER = 1 // accept 802.15.4 ver 0 or 1 frames +}; + +// register addresses +enum +{ + TRX_STATUS = 0x01, + TRX_STATE = 0x02, + TRX_CTRL_0 = 0x03, + TRX_CTRL_1 = 0x04, + PHY_TX_PWR = 0x05, + PHY_RSSI = 0x06, + PHY_ED_LEVEL = 0x07, + PHY_CC_CCA = 0x08, + CCA_THRES = 0x09, + RX_CTRL = 0x0a, + SFD_VALUE = 0x0b, + TRX_CTRL_2 = 0x0c, + ANT_DIV = 0x0d, + IRQ_MASK = 0x0e, + IRQ_STATUS = 0x0f, + VREG_CTRL = 0x10, + BATMON = 0x11, + XOSC_CTRL = 0x12, + CC_CTRL_0 = 0x13, + CC_CTRL_1 = 0x14, + RX_SYN = 0x15, + RF_CTRL_0 = 0x16, + XAH_CTRL_1 = 0x17, + FTN_CTRL = 0x18, + RF_CTRL_1 = 0x19, + PLL_CF = 0x1a, + PLL_DCU = 0x1b, + PART_NUM = 0x1c, + VERSION_NUM = 0x1d, + MAN_ID_0 = 0x1e, + MAN_ID_1 = 0x1f, + SHORT_ADDR_0 = 0x20, + SHORT_ADDR_1 = 0x21, + PAN_ID_0 = 0x22, + PAN_ID_1 = 0x23, + IEEE_ADDR_0 = 0x24, + IEEE_ADDR_1 = 0x25, + IEEE_ADDR_2 = 0x26, + IEEE_ADDR_3 = 0x27, + IEEE_ADDR_4 = 0x28, + IEEE_ADDR_5 = 0x29, + IEEE_ADDR_6 = 0x2a, + IEEE_ADDR_7 = 0x2b, + XAH_CTRL_0 = 0x2c, + CSMA_SEED_0 = 0x2d, + CSMA_SEED_1 = 0x2e, + CSMA_BE = 0x2f +}; + +// random defines +enum +{ + CHB_MAX_FRAME_RETRIES_POS = 4, + CHB_MAX_CSMA_RETIRES_POS = 1, + CHB_CSMA_SEED1_POS = 0, + CHB_CCA_MODE_POS = 5, + CHB_AUTO_CRC_POS = 5, + CHB_TRX_END_POS = 3, + CHB_TRAC_STATUS_POS = 5, + CHB_FVN_POS = 6, + CHB_OQPSK_TX_OFFSET = 2, + CHB_BPSK_TX_OFFSET = 3, + CHB_MIN_FRAME_LENGTH = 3, + CHB_MAX_FRAME_LENGTH = 0x7f, + CHB_PA_EXT_EN_POS = 7 +}; + +// transceiver timing +enum{ + TIME_RST_PULSE_WIDTH = 1, + TIME_P_ON_TO_CLKM_AVAIL = 380, + TIME_SLEEP_TO_TRX_OFF = 240, + TIME_TRX_OFF_TO_SLEEP = 35, + TIME_PLL_ON_TRX_OFF = 1, + TIME_TRX_OFF_RX_ON = 110, + TIME_RX_ON_TRX_OFF = 1, + TIME_PLL_ON_RX_ON = 1, + TIME_RX_ON_PLL_ON = 1, + TIME_PLL_LOCK_TIME = 110, + TIME_BUSY_TX_PLL_ON = 32, + TIME_ALL_STATES_TRX_OFF = 1, + TIME_RESET_TRX_OFF = 26, + TIME_TRX_IRQ_DELAY = 9, + TIME_TRX_OFF_PLL_ON = 110, + TIME_IRQ_PROCESSING_DLY = 32 +}; + +// trac status +enum{ + TRAC_SUCCESS = 0, + TRAC_SUCCESS_DATA_PENDING = 1, + TRAC_WAIT_FOR_ACK = 2, + TRAC_CHANNEL_ACCESS_FAIL = 3, + TRAC_NO_ACK = 5, + TRAC_INVALID = 7 +}; + +// radio statuses +enum{ + RADIO_SUCCESS = 0x40, /**< The requested service was performed successfully. */ + RADIO_UNSUPPORTED_DEVICE, /**< The connected device is not an Atmel AT86RF212. */ + RADIO_INVALID_ARGUMENT, /**< One or more of the supplied function arguments are invalid. */ + RADIO_TIMED_OUT, /**< The requested service timed out. */ + RADIO_WRONG_STATE, /**< The end-user tried to do an invalid state transition. */ + RADIO_BUSY_STATE, /**< The radio transceiver is busy receiving or transmitting. */ + RADIO_STATE_TRANSITION_FAILED, /**< The requested state transition could not be completed. */ + RADIO_CCA_IDLE, /**< Channel is clear, available to transmit a new frame. */ + RADIO_CCA_BUSY, /**< Channel busy. */ + RADIO_TRX_BUSY, /**< Transceiver is busy receiving or transmitting data. */ + RADIO_BAT_LOW, /**< Measured battery voltage is lower than voltage threshold. */ + RADIO_BAT_OK, /**< Measured battery voltage is above the voltage threshold. */ + RADIO_CRC_FAILED, /**< The CRC failed for the actual frame. */ + RADIO_CHANNEL_ACCESS_FAILURE, /**< The channel access failed during the auto mode. */ + RADIO_NO_ACK, /**< No acknowledge frame was received. */ +}; + +// transceiver commands +enum +{ + CMD_NOP = 0, + CMD_TX_START = 2, + CMD_FORCE_TRX_OFF = 3, + CMD_FORCE_PLL_ON = 4, + CMD_RX_ON = 6, + CMD_TRX_OFF = 8, + CMD_PLL_ON = 9, + CMD_RX_AACK_ON = 22, + CMD_TX_ARET_ON = 25 +}; + +// transceiver states +enum +{ + P_ON = 0, + BUSY_RX = 1, + BUSY_TX = 2, + RX_ON = 6, + TRX_OFF = 8, + PLL_ON = 9, + SLEEP = 15, + BUSY_RX_AACK = 17, + BUSY_TX_ARET = 18, + RX_AACK_ON = 22, + TX_ARET_ON = 25, + RX_ON_NOCLK = 28, + RX_AACK_ON_NOCLK = 29, + BUSY_RX_AACK_NOCLK = 30, + TRANS_IN_PROG = 31 +}; + +// transceiver interrupt register +enum +{ + IRQ_PLL_LOCK = 0, + IRQ_PLL_UNLOCK = 1, + IRQ_RX_START = 2, + IRQ_TRX_END = 3, + IRQ_CCA_ED_READY = 4, + IRQ_AMI = 5, + IRQ_TRX_UR = 6, + IRQ_BAT_LOW = 7 +}; + +// transceiver modes +enum +{ + OQPSK_868MHZ = 0, + OQPSK_915MHZ = 1, + OQPSK_780MHZ = 2, + BPSK40_915MHZ = 3, + BPSK20_868MHZ = 4 +}; + +// See Table 7-15 for details +enum +{ + CHB_PWR_EU1_2DBM = 0x63, // EU (868MHz) Linearized PA mode + CHB_PWR_EU1_1DBM = 0x64, // Note: BPSK 20kbit/s only! + CHB_PWR_EU1_0DBM = 0x65, + CHB_PWR_EU2_5DBM = 0xE7, // EU (868MHz) Boost mode (but > supply current) + CHB_PWR_EU2_4DBM = 0xE8, // 4-5dBM BPSK 20 kbit/s only! + CHB_PWR_EU2_3DBM = 0xE9, // 0-3dBM O-QPSK 100/200/400 kbit/s or BPSK + CHB_PWR_EU2_2DBM = 0xEA, + CHB_PWR_EU2_1DBM = 0xCB, + CHB_PWR_EU2_0DBM = 0xAB, + CHB_PWR_NA_10DBM = 0xC0, // North America (915MHz) + CHB_PWR_NA_9DBM = 0xA1, + CHB_PWR_NA_8DBM = 0x81, + CHB_PWR_NA_7DBM = 0x82, + CHB_PWR_NA_6DBM = 0x83, + CHB_PWR_NA_5DBM = 0x60, + CHB_PWR_NA_4DBM = 0x61, + CHB_PWR_NA_3DBM = 0x41, + CHB_PWR_NA_2DBM = 0x42, + CHB_PWR_NA_1DBM = 0x22, + CHB_PWR_NA_0DBM = 0x23, + CHB_PWR_CHINA_5DBM = 0xE7, // China (780MHz) + CHB_PWR_CHINA_4DBM = 0xE8, + CHB_PWR_CHINA_3DBM = 0xE9, + CHB_PWR_CHINA_2DBM = 0xEA, + CHB_PWR_CHINA_1DBM = 0xCA, + CHB_PWR_CHINA_0DBM = 0xAA +}; + +// init +void chb_drvr_init(); + +// data access +U8 chb_reg_read(U8 addr); +U16 chb_reg_read16(U8 addr); +void chb_reg_write(U8 addr, U8 val); +void chb_reg_write16(U8 addr, U16 val); +void chb_reg_write64(U8 addr, U8 *val); +void chb_reg_read_mod_write(U8 addr, U8 val, U8 mask); +void chb_frame_write(U8 *hdr, U8 hdr_len, U8 *data, U8 data_len); + +// general configuration +void chb_set_mode(U8 mode); +U8 chb_set_channel(U8 channel); +void chb_set_pwr(U8 val); +void chb_set_ieee_addr(U8 *addr); +void chb_get_ieee_addr(U8 *addr); +void chb_set_short_addr(U16 addr); +U16 chb_get_short_addr(); +U8 chb_set_state(U8 state); + +// Power management +U8 chb_radio_sleep(void); + +// data transmit +U8 chb_tx(U8 *hdr, U8 *data, U8 len); + +#if (CHB_CC1190_PRESENT) + void chb_set_hgm(U8 enb); +#endif + +#ifdef CHB_DEBUG +// sram access +void chb_sram_read(U8 addr, U8 len, U8 *data); +void chb_sram_write(U8 addr, U8 len, U8 *data); +#endif + +void chb_ISR_Handler (void); + +#endif + diff --git a/macusbfb/drivers/chibi/chb_eeprom.c b/macusbfb/drivers/chibi/chb_eeprom.c new file mode 100644 index 0000000..4d8dd5e --- /dev/null +++ b/macusbfb/drivers/chibi/chb_eeprom.c @@ -0,0 +1,85 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +/*! + \file + \ingroup + + +*/ +/**************************************************************************/ +#include "chb_eeprom.h" +#include "drivers/eeprom/mcp24aa/mcp24aa.h" + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_eeprom_write(uint16_t addr, uint8_t *buf, uint16_t size) +{ + // Instantiate error message placeholder + mcp24aaError_e error = MCP24AA_ERROR_OK; + + // Write the address one byte at a time + uint16_t a = 0; + while (a < size) + { + error = mcp24aaWriteByte(addr + a, buf[a]); + if (error) + { + // ToDo: Handle any errors + } + a++; + } +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_eeprom_read(uint16_t addr, uint8_t *buf, uint16_t size) +{ + // Instantiate error message placeholder + mcp24aaError_e error = MCP24AA_ERROR_OK; + + // Read the contents of address 0x0125 + error = mcp24aaReadBuffer(addr, buf, size); + + if (error) + { + // ToDo: Handle any errors + } +} + diff --git a/macusbfb/drivers/chibi/chb_eeprom.h b/macusbfb/drivers/chibi/chb_eeprom.h new file mode 100644 index 0000000..3c3df71 --- /dev/null +++ b/macusbfb/drivers/chibi/chb_eeprom.h @@ -0,0 +1,50 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +/*! + \file + \ingroup + + +*/ +/**************************************************************************/ +#ifndef CHB_EEPROM_H +#define CHB_EEPROM_H + +#include "projectconfig.h" +#include "types.h" + +void chb_eeprom_write(U16 addr, U8 *buf, U16 size); +void chb_eeprom_read(U16 addr, U8 *buf, U16 size); + +#endif diff --git a/macusbfb/drivers/chibi/chb_spi.c b/macusbfb/drivers/chibi/chb_spi.c new file mode 100644 index 0000000..e552184 --- /dev/null +++ b/macusbfb/drivers/chibi/chb_spi.c @@ -0,0 +1,77 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +/*! + \file + \ingroup + + +*/ +/**************************************************************************/ +#include "chb.h" +#include "chb_spi.h" +#include "core/ssp/ssp.h" + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +void chb_spi_init() +{ + // initialise spi, high between frames and transition on trailing edge + sspInit(0, sspClockPolarity_High, sspClockPhase_FallingEdge); + + // set the slave select to idle + CHB_SPI_DISABLE(); +} + +/**************************************************************************/ +/*! + This function both reads and writes data. For write operations, include data + to be written as argument. For read ops, use dummy data as arg. Returned + data is read byte val. +*/ +/**************************************************************************/ +U8 chb_xfer_byte(U8 data) +{ + /* Move on only if NOT busy and TX FIFO not full */ + while ((SSP_SSP0SR & (SSP_SSP0SR_TNF_MASK | SSP_SSP0SR_BSY_MASK)) != SSP_SSP0SR_TNF_NOTFULL); + SSP_SSP0DR = data; + + /* Wait until the busy bit is cleared and receive buffer is not empty */ + while ((SSP_SSP0SR & (SSP_SSP0SR_BSY_MASK | SSP_SSP0SR_RNE_MASK)) != SSP_SSP0SR_RNE_NOTEMPTY); + + // Read the queue + return SSP_SSP0DR; +} diff --git a/macusbfb/drivers/chibi/chb_spi.h b/macusbfb/drivers/chibi/chb_spi.h new file mode 100644 index 0000000..220feb7 --- /dev/null +++ b/macusbfb/drivers/chibi/chb_spi.h @@ -0,0 +1,62 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. + +*******************************************************************/ +/*! + \file + \ingroup + + +*/ +/**************************************************************************/ + +#ifndef CHB_SPI_H +#define CHB_SPI_H + +#include "projectconfig.h" +#include "core/gpio/gpio.h" + +#define CHB_SSPORT (0) // P0.2 = SSEL +#define CHB_SSPIN (2) + +#define CHB_SPI_ENABLE() do {gpioSetValue(CHB_SSPORT, CHB_SSPIN, 0);} while (0) // Drive SSEL low +#define CHB_SPI_DISABLE() do {gpioSetValue(CHB_SSPORT, CHB_SSPIN, 1);} while (0) // Drive SSEL high + +#define CHB_SPIPORT 0 +#define CHB_SCK 1 // PB.1 - Output: SPI Serial Clock (SCLK) +#define CHB_MOSI 2 // PB.2 - Output: SPI Master out - slave in (MOSI) +#define CHB_MISO 3 // PB.3 - Input: SPI Master in - slave out (MISO) + +void chb_spi_init(); +U8 chb_xfer_byte(U8 data); + +#endif diff --git a/macusbfb/drivers/chibi/types.h b/macusbfb/drivers/chibi/types.h new file mode 100644 index 0000000..c551bbc --- /dev/null +++ b/macusbfb/drivers/chibi/types.h @@ -0,0 +1,54 @@ +/******************************************************************* + Copyright (C) 2009 FreakLabs + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Originally written by Christopher Wang aka Akiba. + Please post support questions to the FreakLabs forum. +*******************************************************************/ +/*! + \file types.h + \ingroup usb +*/ +/*******************************************************************/ +#ifndef TYPES_H +#define TYPES_H + +#include +#include + +// Standard data types +typedef uint8_t U8; /// Generic 8 bit unsigned data type +typedef uint16_t U16; /// Generic 16 bit unsigned data type +typedef uint32_t U32; /// Generic 32 bit unsigned data type +typedef uint64_t U64; /// Generic 64 bit unsigned data type + +typedef int8_t S8; /// Generic 8 bit signed data type +typedef int16_t S16; /// Generic 16 bit signed data type +typedef int32_t S32; /// Generic 32 bit signed data type + +#endif diff --git a/macusbfb/drivers/eeprom/at25040/at25040.c b/macusbfb/drivers/eeprom/at25040/at25040.c new file mode 100644 index 0000000..49e50f1 --- /dev/null +++ b/macusbfb/drivers/eeprom/at25040/at25040.c @@ -0,0 +1,297 @@ +/**************************************************************************/ +/*! + @file at25040.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Driver for Atmel's AT25010a/AT25020a/AT25040a 1K/2K/4K serial EEPROM. + + @note The AT25xxx has an 8-byte buffer, including 1 command byte + and one address offset byte, meaning that a maximum of 6 + bytes can be read or written in one operation. An error + will be returned if a value greater than 6 is passed in + for bufferLength with the eepromRead and eepromWrite + methods. + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "drivers/eeprom/at25040/at25040.h" + + int main(void) + { + cpuInit(); + at25Init(); + + // Set read and write buffers + uint8_t wBuffer[1]; + uint8_t rBuffer[1]; + + // Instantiate error message placeholder + at25Error_e error = AT25_ERROR_OK; + + // Write 0xAA to EEPROM at address 0x0000 + wBuffer[0] = 0xAA; + error = at25Write(0x0000, wBuffer, 1); + if (error) + { + // Log the error message or take appropriate actions + switch (error) + { + case (AT25_ERROR_TIMEOUT_WFINISH): + // EEPROM timed out waiting for the write to finish + break; + case (AT25_ERROR_TIMEOUT_WE): + // EEPROM timed out waiting for write-enable + break; + case (AT25_ERROR_ADDRERR): + // Address is out of range + break; + } + } + + // Read the EEPROM at address 0x0000 + at25Read(0x0000, rBuffer, 1); + ... + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "at25040.h" +#include "core/ssp/ssp.h" +#include "core/gpio/gpio.h" + +#define AT25_SELECT() gpioSetValue(0, 2, 0) +#define AT25_DESELECT() gpioSetValue(0, 2, 1) + +uint32_t i, timeout; +uint8_t src_addr[SSP_FIFOSIZE]; +uint8_t dest_addr[SSP_FIFOSIZE]; + +/**************************************************************************/ +/*! + @brief Sends the write enable command (WREN/0x06) +*/ +/**************************************************************************/ +static void at25WriteEnable() +{ + AT25_SELECT(); + src_addr[0] = AT25_WREN; + sspSend(0, (uint8_t *)src_addr, 1); + AT25_DESELECT(); + + // Delay for at least 250nS (1nS @ 72MHz = ~0.0072 ticks) + for (i = 0; i < 100; i++); +} + +/**************************************************************************/ +/*! + @brief Gets the value of the Read Status Register (RDSR/0x05) + + @return The 8-bit value returned by the Read Status Register +*/ +/**************************************************************************/ +static uint8_t at25GetRSR() +{ + AT25_SELECT(); + src_addr[0] = AT25_RDSR; + sspSend(0, (uint8_t *)src_addr, 1); + sspReceive(0, (uint8_t *)dest_addr, 1); + AT25_DESELECT(); + return dest_addr[0] & (AT25_RDSR_WEN | AT25_RDSR_RDY); +} + +/**************************************************************************/ +/*! + @brief Initialises the SPI block (CLK set low when inactive, trigger + on leading edge). +*/ +/**************************************************************************/ +void at25Init (void) +{ + sspInit(0, sspClockPolarity_Low, sspClockPhase_RisingEdge); +} + +/**************************************************************************/ +/*! + @brief Reads the specified number of bytes from the supplied address. + + This function will read one or more bytes starting at the supplied + address. + + @param[in] address + The 16-bit address where the read will start. The maximum + value for the address depends on the size of the EEPROM + @param[in] *buffer + Pointer to the buffer that will store the read results + @param[in] bufferLength + Length of the buffer +*/ +/**************************************************************************/ +at25Error_e at25Read (uint16_t address, uint8_t *buffer, uint32_t bufferLength) +{ + if (address >= AT25_MAXADDRESS) + { + return AT25_ERROR_ADDRERR; + } + + if (bufferLength > 6) + { + return AT25_ERROR_BUFFEROVERFLOW; + } + + timeout = 0; + while ( timeout < SSP_MAX_TIMEOUT ) + { + // Wait until the device is ready + uint8_t status = at25GetRSR() & AT25_RDSR_RDY; + if (status == 0) + { + break; + } + timeout++; + } + if ( timeout == SSP_MAX_TIMEOUT ) + { + return AT25_ERROR_TIMEOUT_WE; + } + + AT25_SELECT(); + // Read command (0x03), append A8 if > addr 256 bytes + src_addr[0] = address > 0xFF ? AT25_READ | AT25_A8 : AT25_READ; + src_addr[1] = (address); + sspSend(0, (uint8_t *)src_addr, 2); + sspReceive(0, (uint8_t *)&dest_addr[2], bufferLength); + AT25_DESELECT(); + + // Fill response buffer + for (i = 0; i < bufferLength; i++) + { + buffer[i] = dest_addr[i + 2]; + } + + return AT25_ERROR_OK; +} + +/**************************************************************************/ +/*! + @brief Writes the supplied bytes at a specified address. + + This function will write one or more bytes starting at the supplied + address. + + @param[in] address + The 16-bit address where the write will start. The + maximum value for the address depends on the size of the + EEPROM + @param[in] *buffer + Pointer to the buffer that contains the values to write. + @param[in] bufferLength + Length of the buffer +*/ +/**************************************************************************/ +at25Error_e at25Write (uint16_t address, uint8_t *buffer, uint32_t bufferLength) +{ + if (address >= AT25_MAXADDRESS) + { + return AT25_ERROR_ADDRERR; + } + + if (bufferLength > 6) + { + return AT25_ERROR_BUFFEROVERFLOW; + } + + // Set write enable latch + at25WriteEnable(); + + timeout = 0; + while ( timeout < SSP_MAX_TIMEOUT ) + { + // Wait until the device is write enabled + if (at25GetRSR() == AT25_RDSR_WEN) + { + break; + } + timeout++; + } + if ( timeout == SSP_MAX_TIMEOUT ) + { + return AT25_ERROR_TIMEOUT_WE; + } + + for (i = 0; i < bufferLength; i++) // Init RD and WR buffer + { + src_addr[i+2] = buffer[i]; // leave two bytes for cmd and offset(8 bits) + dest_addr[i] = 0; + } + + AT25_SELECT(); + // Write command (0x02), append A8 if addr > 256 bytes + src_addr[0] = address > 0xFF ? AT25_WRITE | AT25_A8 : AT25_WRITE; + src_addr[1] = (address); + sspSend(0, (uint8_t *)src_addr, bufferLength + 2); + AT25_DESELECT(); + + // Wait at least 3ms + for (i = 0; i < ((CFG_CPU_CCLK / 1000) * 3); i++); + + timeout = 0; + while ( timeout < SSP_MAX_TIMEOUT ) + { + // Check status to see if write cycle is done or not + AT25_SELECT(); + src_addr[0] = AT25_RDSR; + sspSend(0, (uint8_t *)src_addr, 1); + sspReceive(0, (uint8_t *)dest_addr, 1); + AT25_DESELECT(); + // Wait until device is ready + if ((dest_addr[0] & AT25_RDSR_RDY) == 0x00) + { + break; + } + timeout++; + } + if ( timeout == SSP_MAX_TIMEOUT ) + { + return AT25_ERROR_TIMEOUT_WFINISH; + } + + for (i = 0; i < 300; i++); // Wait at least 250ns + + return AT25_ERROR_OK; +} diff --git a/macusbfb/drivers/eeprom/at25040/at25040.h b/macusbfb/drivers/eeprom/at25040/at25040.h new file mode 100644 index 0000000..f9d720e --- /dev/null +++ b/macusbfb/drivers/eeprom/at25040/at25040.h @@ -0,0 +1,85 @@ +/**************************************************************************/ +/*! + @file at25040.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _AT25040_H_ +#define _AT25040_H_ + +#include "projectconfig.h" + +#define AT25_RDSR_RDY 0x01 +#define AT25_RDSR_WEN 0x02 +#define AT25_A8 0x08 // For addresses > 0xFF (AT25040 only) A8 must be added to R/W commands +#define AT25_MAXADDRESS 0x0200 // AT25040 = 0X0200, AT25020 = 0x100, AT25010 = 0x80 + +/**************************************************************************/ +/*! + AT25040 Commands +*/ +/**************************************************************************/ +typedef enum +{ + AT25_WREN = 0x06, + AT25_WRDI = 0x04, + AT25_RDSR = 0x05, + AT25_WRSR = 0x01, + AT25_READ = 0x03, + AT25_WRITE = 0x02 +} at25_Commands_e; + +/**************************************************************************/ +/*! + Error messages +*/ +/**************************************************************************/ +typedef enum +{ + AT25_ERROR_OK = 0, // Everything executed normally + AT25_ERROR_TIMEOUT_WE, // Timed out waiting for write enable status + AT25_ERROR_TIMEOUT_WFINISH, // Timed out waiting for write to finish + AT25_ERROR_ADDRERR, // Address out of range + AT25_ERROR_BUFFEROVERFLOW, // Max 6 bytes can be read/written in one operation + AT2_ERROR_LAST +} +at25Error_e; + +void at25Init (void); +at25Error_e at25Read (uint16_t address, uint8_t *buffer, uint32_t bufferLength); +at25Error_e at25Write (uint16_t address, uint8_t *buffer, uint32_t bufferLength); + +#endif diff --git a/macusbfb/drivers/eeprom/mcp24aa/mcp24aa.c b/macusbfb/drivers/eeprom/mcp24aa/mcp24aa.c new file mode 100644 index 0000000..6782fab --- /dev/null +++ b/macusbfb/drivers/eeprom/mcp24aa/mcp24aa.c @@ -0,0 +1,325 @@ +/**************************************************************************/ +/*! + @file mcp24aa.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Driver for Microchip's 24AA32AF serial EEPROM. This driver assumes + that the address is set to 1010 000. + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "drivers/eeprom/mcp24aa/mcp24aa.h" + + int main(void) + { + cpuInit(); + + mcp24aaInit(); + + // Instantiate error message placeholder + mcp24aaError_e error = MCP24AA_ERROR_OK; + + // Create read buffer (1 byte) + uint8_t buffer[1] = { 0x00 }; + + // Write 0xCC at address 0x125 + error = mcp24aaWriteByte(0x0125, 0xCC); + if (error) + { + // Handle any errors + switch (error) + { + case (MCP24AA_ERROR_I2CINIT): + // Unable to initialise I2C + break; + case (MCP24AA_ERROR_ADDRERR): + // Address out of range + break; + default: + break; + } + } + + // Read the contents of address 0x0125 + error = MCP24AA_ERROR_OK; + error = mcp24aaReadByte(0x0125, buffer); + if (error) + { + // Handle any errors + switch (error) + { + case (MCP24AA_ERROR_I2CINIT): + // Unable to initialise I2C + break; + case (MCP24AA_ERROR_ADDRERR): + // Address out of range + break; + default: + break; + } + } + + uint8_t results = buffer[0]; + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "mcp24aa.h" +#include "core/systick/systick.h" +#include "core/i2c/i2c.h" + +extern volatile uint8_t I2CMasterBuffer[I2C_BUFSIZE]; +extern volatile uint8_t I2CSlaveBuffer[I2C_BUFSIZE]; +extern volatile uint32_t I2CReadLength, I2CWriteLength; + +uint32_t i, timeout; + +/**************************************************************************/ +/*! + @brief Initialises the I2C block +*/ +/**************************************************************************/ +mcp24aaError_e mcp24aaInit() +{ + // Initialise I2C + if (i2cInit(I2CMODE_MASTER) == FALSE) + { + return MCP24AA_ERROR_I2CINIT; /* Fatal error */ + } + return MCP24AA_ERROR_OK; +} + +/**************************************************************************/ +/*! + @brief Reads the specified number of bytes from the supplied address. + + This function will read one or more bytes starting at the supplied + address. A maximum of 8 bytes can be read in one operation. + + @param[in] address + The 16-bit address where the read will start. The maximum + value for the address depends on the size of the EEPROM + @param[in] *buffer + Pointer to the buffer that will store the read results + @param[in] bufferLength + Length of the buffer +*/ +/**************************************************************************/ +mcp24aaError_e mcp24aaReadBuffer (uint16_t address, uint8_t *buffer, uint32_t bufferLength) +{ + if (address >= MCP24AA_MAXADDR) + { + return MCP24AA_ERROR_ADDRERR; + } + + if (bufferLength > 8) + { + return MCP24AA_ERROR_BUFFEROVERFLOW; + } + + // ToDo: Check if I2C is ready + + // Clear buffers + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + I2CSlaveBuffer[i] = 0x00; + } + + // Write address bits to enable random read + I2CWriteLength = 3; + I2CReadLength = bufferLength; + I2CMasterBuffer[0] = MCP24AA_ADDR; // I2C device address + I2CMasterBuffer[1] = ((address >> 8) & 0xFF); // Address (high byte) + I2CMasterBuffer[2] = (address & 0xFF); // Address (low byte) + // If you wish to read, you need to append the address w/read bit, though this + // needs to be placed one bit higher than the size of I2CWriteLength which + // may be unexpected + I2CMasterBuffer[3] = MCP24AA_ADDR | MCP24AA_READBIT; + + // Transmit command + i2cEngine(); + + // Fill response buffer + for (i = 0; i < bufferLength; i++) + { + buffer[i] = I2CSlaveBuffer[i]; + } + + return MCP24AA_ERROR_OK; +} + +/**************************************************************************/ +/*! + @brief Writes the supplied bytes at a specified address. + + This function will write one or more bytes starting at the supplied + address. A maximum of 8 bytes can be written in one operation. + + @param[in] address + The 16-bit address where the write will start. The + maximum value for the address depends on the size of the + EEPROM + @param[in] *buffer + Pointer to the buffer that contains the values to write. + @param[in] bufferLength + Length of the buffer +*/ +/**************************************************************************/ +mcp24aaError_e mcp24aaWriteBuffer (uint16_t address, uint8_t *buffer, uint32_t bufferLength) +{ + if (address >= MCP24AA_MAXADDR) + { + return MCP24AA_ERROR_ADDRERR; + } + + if (bufferLength > 8) + { + return MCP24AA_ERROR_BUFFEROVERFLOW; + } + + // ToDo: Check if I2C is ready + + // Clear write buffer + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + // Write address bits and data to the master buffer + I2CWriteLength = 3 + bufferLength; + I2CReadLength = 0; + I2CMasterBuffer[0] = MCP24AA_ADDR; // I2C device address + I2CMasterBuffer[1] = ((address >> 8) & (0xFF)); // Address (high byte) + I2CMasterBuffer[2] = (address & 0xFF); // Address (low byte) + for (i = 0; i < bufferLength; i++) + { + I2CMasterBuffer[i+3] = buffer[i]; + } + + // Transmit command + i2cEngine(); + + // Wait at least 10ms + systickDelay(10 / CFG_SYSTICK_DELAY_IN_MS); + + return MCP24AA_ERROR_OK; +} + +/**************************************************************************/ +/*! + @brief Reads one byte from the supplied address. + + This function will read one byte starting at the supplied address. + + @param[in] address + The 16-bit address where the read will start. The maximum + value for the address depends on the size of the EEPROM + @param[in] *buffer + Pointer to the buffer that will store the read results + + @code + #include "core/cpu/cpu/h" + #include "drivers/eeprom/mcp24aa/mcp24aa.h" + ... + cpuInit(); + mcp24aaInit(); + + // Create read buffer (1 byte) + uint8_t buffer[1] = { 0x00 }; + + // Write 0xEE and address 0x0120 + mcp24aaWriteByte(0x0120, 0xEE); + + // Populate buffer with contents of 0x0120 + mcp24aaReadByte(0x0120, buffer); + + // results should equal 0xEE + uint8_t results = buffer[0]; + @endcode +*/ +/**************************************************************************/ +mcp24aaError_e mcp24aaReadByte (uint16_t address, uint8_t *buffer) +{ + return mcp24aaReadBuffer(address, buffer, 1); +} + +/**************************************************************************/ +/*! + @brief Writes one byte to the supplied address. + + This function will write one byte at the supplied address. + + @param[in] address + The 16-bit address where the write will start. The maximum + value for the address depends on the size of the EEPROM + @param[in] value + The data to be written to the EEPROM + + @code + #include "core/cpu/cpu/h" + #include "drivers/eeprom/mcp24aa/mcp24aa.h" + ... + cpuInit(); + mcp24aaInit(); + + // Create read buffer (1 byte) + uint8_t buffer[1] = { 0x00 }; + + // Write 0xEE and address 0x0120 + mcp24aaWriteByte(0x0120, 0xEE); + + // Populate buffer with contents of 0x0120 + mcp24aaReadByte(0x0120, buffer); + + // results should equal 0xEE + uint8_t results = buffer[0]; + @endcode +*/ +/**************************************************************************/ +mcp24aaError_e mcp24aaWriteByte (uint16_t address, uint8_t value) +{ + // Set read buffer + uint8_t wBuffer[1]; + + // Write byte to EEPROM at specified address + wBuffer[0] = value; + return mcp24aaWriteBuffer(address, wBuffer, 1); +} + diff --git a/macusbfb/drivers/eeprom/mcp24aa/mcp24aa.h b/macusbfb/drivers/eeprom/mcp24aa/mcp24aa.h new file mode 100644 index 0000000..ac55468 --- /dev/null +++ b/macusbfb/drivers/eeprom/mcp24aa/mcp24aa.h @@ -0,0 +1,67 @@ +/**************************************************************************/ +/*! + @file mcp24aa.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _MCP24AA_H_ +#define _MCP24AA_H_ + +#include "projectconfig.h" + +#define MCP24AA_ADDR 0xA0 // 10100000 +#define MCP24AA_RW 0x01 +#define MCP24AA_READBIT 0x01 +#define MCP24AA_MAXADDR 0xFFF // 4K = 4096 + +typedef enum +{ + MCP24AA_ERROR_OK = 0, // Everything executed normally + MCP24AA_ERROR_I2CINIT, // Unable to initialise I2C + MCP24AA_ERROR_I2CBUSY, // I2C already in use + MCP24AA_ERROR_ADDRERR, // Address out of range + MCP24AA_ERROR_BUFFEROVERFLOW, // Max 8 bytes can be read/written in one operation + MCP24AA_ERROR_LAST +} +mcp24aaError_e; + +mcp24aaError_e mcp24aaInit (void); +mcp24aaError_e mcp24aaReadBuffer (uint16_t address, uint8_t *buffer, uint32_t bufferLength); +mcp24aaError_e mcp24aaWriteBuffer (uint16_t address, uint8_t *buffer, uint32_t bufferLength); +mcp24aaError_e mcp24aaReadByte (uint16_t address, uint8_t *buffer); +mcp24aaError_e mcp24aaWriteByte (uint16_t address, uint8_t value); + + +#endif diff --git a/macusbfb/drivers/fatfs/ccsbcs.c b/macusbfb/drivers/fatfs/ccsbcs.c new file mode 100644 index 0000000..968192f --- /dev/null +++ b/macusbfb/drivers/fatfs/ccsbcs.c @@ -0,0 +1,540 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - Local code bidirectional converter (C)ChaN, 2009 */ +/* (SBCS code pages) */ +/*------------------------------------------------------------------------*/ +/* 437 U.S. (OEM) +/ 720 Arabic (OEM) +/ 1256 Arabic (Windows) +/ 737 Greek (OEM) +/ 1253 Greek (Windows) +/ 1250 Central Europe (Windows) +/ 775 Baltic (OEM) +/ 1257 Baltic (Windows) +/ 850 Multilingual Latin 1 (OEM) +/ 852 Latin 2 (OEM) +/ 1252 Latin 1 (Windows) +/ 855 Cyrillic (OEM) +/ 1251 Cyrillic (Windows) +/ 866 Russian (OEM) +/ 857 Turkish (OEM) +/ 1254 Turkish (Windows) +/ 858 Multilingual Latin 1 + Euro (OEM) +/ 862 Hebrew (OEM) +/ 1255 Hebrew (Windows) +/ 874 Thai (OEM, Windows) +/ 1258 Vietnam (OEM, Windows) +*/ + +#include "ff.h" + + +#if _CODE_PAGE == 437 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 720 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, + 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, + 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0xO650, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 737 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, + 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 775 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, + 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, + 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, + 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, + 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, + 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, + 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 850 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 852 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, + 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, + 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, + 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, + 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, + 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 855 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, + 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, + 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, + 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, + 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, + 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, + 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, + 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 857 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, + 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 858 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 862 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 866 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 874 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, + 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, + 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, + 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, + 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, + 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +#elif _CODE_PAGE == 1250 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +}; + +#elif _CODE_PAGE == 1251 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F +}; + +#elif _CODE_PAGE == 1252 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +#elif _CODE_PAGE == 1253 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +}; + +#elif _CODE_PAGE == 1254 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +}; + +#elif _CODE_PAGE == 1255 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +}; + +#elif _CODE_PAGE == 1256 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 +} + +#elif _CODE_PAGE == 1257 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 +}; + +#elif _CODE_PAGE == 1258 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +}; + +#endif + + +#if !_TBLDEF || !_USE_LFN +#error This file is not needed in current configuration. Remove from the project. +#endif + + +WCHAR ff_convert ( /* Converted character, Returns zero on error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + WCHAR c; + + + if (src < 0x80) { /* ASCII */ + c = src; + + } else { + if (dir) { /* OEMCP to Unicode */ + c = (src >= 0x100) ? 0 : Tbl[src - 0x80]; + + } else { /* Unicode to OEMCP */ + for (c = 0; c < 0x80; c++) { + if (src == Tbl[c]) break; + } + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/macusbfb/drivers/fatfs/diskio.h b/macusbfb/drivers/fatfs/diskio.h new file mode 100644 index 0000000..c891a32 --- /dev/null +++ b/macusbfb/drivers/fatfs/diskio.h @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------- +/ Low level disk interface modlue include file R0.05 (C)ChaN, 2007 +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO + +#define _READONLY 0 /* 1: Read-only mode */ +#define _USE_IOCTL 1 + +#include "integer.h" + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + +DSTATUS disk_initialize (BYTE); +DSTATUS disk_status (BYTE); +DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); +#if _READONLY == 0 +DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); +#endif +DRESULT disk_ioctl (BYTE, BYTE, void*); +void disk_timerproc (void); + + + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + + +/* Command code for disk_ioctrl() */ + +/* Generic command */ +#define CTRL_SYNC 0 /* Mandatory for write functions */ +#define GET_SECTOR_COUNT 1 /* Mandatory for only f_mkfs() */ +#define GET_SECTOR_SIZE 2 +#define GET_BLOCK_SIZE 3 /* Mandatory for only f_mkfs() */ +#define CTRL_POWER 4 +#define CTRL_LOCK 5 +#define CTRL_EJECT 6 +/* MMC/SDC command */ +#define MMC_GET_TYPE 10 +#define MMC_GET_CSD 11 +#define MMC_GET_CID 12 +#define MMC_GET_OCR 13 +#define MMC_GET_SDSTAT 14 +/* ATA/CF command */ +#define ATA_GET_REV 20 +#define ATA_GET_MODEL 21 +#define ATA_GET_SN 22 + + + +/* Card type flags (CardType) */ +#define CT_MMC 0x01 /* MMC ver 3 */ +#define CT_SD1 0x02 /* SD ver 1 */ +#define CT_SD2 0x04 /* SD ver 2 */ +#define CT_SDC (CT_SD1|CT_SD2) /* SD */ +#define CT_BLOCK 0x08 /* Block addressing */ + + +#define _DISKIO +#endif diff --git a/macusbfb/drivers/fatfs/ff.c b/macusbfb/drivers/fatfs/ff.c new file mode 100644 index 0000000..4747019 --- /dev/null +++ b/macusbfb/drivers/fatfs/ff.c @@ -0,0 +1,3154 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.07e (C)ChaN, 2009 +/-----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) patition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algolithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a plysical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close +/ without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same +/ or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. +/ Added long file name support. +/ Added multiple code page support. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size support. +/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. +/ Fixed wrong cache control in f_lseek(). +/ Added relative path feature. +/ Added f_chdir() and f_chdrive(). +/ Added proper case conversion to extended char. +/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. +/ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. +/ Fixed name matching error on the 13 char boundary. +/ Added a configuration option, _LFN_UNICODE. +/ Changed f_readdir() to return the SFN with always upper +/ case on non-LFN cfg. +/---------------------------------------------------------------------------*/ + +#include "projectconfig.h" +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 0x007E +#error Wrong include file (ff.h). +#endif + +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area must not be used in re-entrant configuration. +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } + +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res + +#endif + +#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } + +#ifndef NULL +#define NULL 0 +#endif + +/* Name status flags */ +#define NS 11 /* Offset of name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ + + + + +/*-------------------------------------------------------------------------- + + Private Work Area + +---------------------------------------------------------------------------*/ + +#if _DRIVES < 1 || _DRIVES > 9 +#error Number of drives must be 1-9. +#endif +static +FATFS *FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ + +static +WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH +static +BYTE Drive; /* Current drive */ +#endif + + +#if _USE_LFN == 1 /* LFN with static LFN working buffer */ +static +WCHAR LfnBuf[_MAX_LFN + 1]; +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR *lp = LfnBuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#elif _USE_LFN > 1 /* LFN with dynamic LFN working buffer */ +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR lbuf[_MAX_LFN + 1], *lp = lbuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#else /* No LFN */ +#define NAMEBUF(sp,lp) BYTE sp[12] +#define INITBUF(dj,sp,lp) dj.fn = sp + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, int cnt) { + char *d = (char*)dst; + const char *s = (const char *)src; + while (cnt--) *d++ = *s++; +} + +/* Fill memory */ +static +void mem_set (void* dst, int val, int cnt) { + char *d = (char*)dst; + while (cnt--) *d++ = (char)val; +} + +/* Compare memory to memory */ +static +int mem_cmp (const void* dst, const void* src, int cnt) { + const char *d = (const char *)dst, *s = (const char *)src; + int r = 0; + while (cnt-- && (r = *d++ - *s++) == 0) ; + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { + while (*str && *str != chr) str++; + return *str; +} + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT + +static +BOOL lock_fs ( + FATFS *fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS *fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Change window offset */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT move_window ( + FATFS *fs, /* File system object */ + DWORD sector /* Sector number to make apperance in the fs->win[] */ +) /* Move to zero only writes back dirty window */ +{ + DWORD wsect; + + + wsect = fs->winsect; + if (wsect != sector) { /* Changed current window */ +#if !_FS_READONLY + if (fs->wflag) { /* Write back dirty window if needed */ + if (disk_write(fs->drive, fs->win, wsect, 1) != RES_OK) + return FR_DISK_ERR; + fs->wflag = 0; + if (wsect < (fs->fatbase + fs->sects_fat)) { /* In FAT area */ + BYTE nf; + for (nf = fs->n_fats; nf > 1; nf--) { /* Refrect the change to all FAT copies */ + wsect += fs->sects_fat; + disk_write(fs->drive, fs->win, wsect, 1); + } + } + } +#endif + if (sector) { + if (disk_read(fs->drive, fs->win, sector, 1) != RES_OK) + return FR_DISK_ERR; + fs->winsect = sector; + } + } + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Clean-up cached data */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ + FATFS *fs /* File system object */ +) +{ + FRESULT res; + + + res = move_window(fs, 0); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { + fs->winsect = 0; + mem_set(fs->win, 0, 512); + ST_WORD(fs->win+BS_55AA, 0xAA55); + ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); + disk_write(fs->drive, fs->win, fs->fsi_sector, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drive, CTRL_SYNC, (void*)NULL) != RES_OK) + res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + + +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Interal error, Else:Cluster status */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to get the link information */ +) +{ + UINT wc, bc; + DWORD fsect; + + + if (clst < 2 || clst >= fs->max_clust) /* Range check */ + return 1; + + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc = fs->win[bc & (SS(fs) - 1)]; bc++; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc |= (WORD)fs->win[bc & (SS(fs) - 1)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fsect + (clst / (SS(fs) / 2)))) break; + return LD_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)]); + + case FS_FAT32 : + if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; + return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occured at the disk I/O layer */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY + +FRESULT put_fat ( + FATFS *fs, /* File system object */ + DWORD clst, /* Cluster# to be changed in range of 2 to fs->max_clust - 1 */ + DWORD val /* New value to mark the cluster */ +) +{ + UINT bc; + BYTE *p; + DWORD fsect; + FRESULT res; + + + if (clst < 2 || clst >= fs->max_clust) { /* Range check */ + res = FR_INT_ERR; + + } else { + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fsect + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + ST_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)], (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fsect + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + ST_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)], val); + break; + + default : + res = FR_INT_ERR; + } + fs->wflag = 1; + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to remove a chain from */ +) +{ + FRESULT res; + DWORD nxt; + + + if (clst < 2 || clst >= fs->max_clust) { /* Check the range of cluster# */ + res = FR_INT_ERR; + + } else { + res = FR_OK; + while (clst < fs->max_clust) { /* Not a last link? */ + nxt = get_fat(fs, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ + if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ + if (res != FR_OK) break; + if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } + clst = nxt; /* Next cluster */ + } + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch or Create a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ +) +{ + DWORD cs, ncl, scl, mcl; + + + mcl = fs->max_clust; + if (clst == 0) { /* Create new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if (scl == 0 || scl >= mcl) scl = 1; + } + else { /* Stretch existing chain */ + cs = get_fat(fs, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* It is an invalid cluster */ + if (cs < mcl) return cs; /* It is already followed by next cluster */ + scl = clst; + } + + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= mcl) { /* Wrap around */ + ncl = 2; + if (ncl > scl) return 0; /* No free custer */ + } + cs = get_fat(fs, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 0xFFFFFFFF || cs == 1)/* An error occured */ + return cs; + if (ncl == scl) return 0; /* No free custer */ + } + + if (put_fat(fs, ncl, 0x0FFFFFFF)) /* Mark the new cluster "in use" */ + return 0xFFFFFFFF; + if (clst != 0) { /* Link it to the previous one if needed */ + if (put_fat(fs, clst, ncl)) + return 0xFFFFFFFF; + } + + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + + return ncl; /* Return new cluster number */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + + +DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->max_clust - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Seek directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_seek ( + DIR *dj, /* Pointer to directory object */ + WORD idx /* Directory index number */ +) +{ + DWORD clst; + WORD ic; + + + dj->index = idx; + clst = dj->sclust; + if (clst == 1 || clst >= dj->fs->max_clust) /* Check start cluster range */ + return FR_INT_ERR; + if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ + clst = dj->fs->dirbase; + + if (clst == 0) { /* Static table */ + dj->clust = clst; + if (idx >= dj->fs->n_rootdir) /* Index is out of range */ + return FR_INT_ERR; + dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); /* Sector# */ + } + else { /* Dynamic table */ + ic = SS(dj->fs) / 32 * dj->fs->csize; /* Entries per cluster */ + while (idx >= ic) { /* Follow cluster chain */ + clst = get_fat(dj->fs, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= dj->fs->max_clust) /* Reached to end of table or int error */ + return FR_INT_ERR; + idx -= ic; + } + dj->clust = clst; + dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32); /* Sector# */ + } + + dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32; /* Ptr to the entry in the sector */ + + return FR_OK; /* Seek succeeded */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */ + DIR *dj, /* Pointer to directory object */ + BOOL streach /* FALSE: Do not streach table, TRUE: Streach table if needed */ +) +{ + DWORD clst; + WORD i; + + + i = dj->index + 1; + if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + + if (!(i % (SS(dj->fs) / 32))) { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if (dj->clust == 0) { /* Static table */ + if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ + return FR_NO_FILE; + } + else { /* Dynamic table */ + if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + if (clst >= dj->fs->max_clust) { /* When it reached end of dynamic table */ +#if !_FS_READONLY + BYTE c; + if (!streach) return FR_NO_FILE; /* When do not streach, report EOT */ + clst = create_chain(dj->fs, dj->clust); /* Streach cluster chain */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + /* Clean-up streached table */ + if (move_window(dj->fs, 0)) return FR_DISK_ERR; /* Flush active window */ + mem_set(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ + dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ + for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if (move_window(dj->fs, 0)) return FR_DISK_ERR; + dj->fs->winsect++; + } + dj->fs->winsect -= c; /* Rewind window address */ +#else + return FR_NO_FILE; /* Report EOT */ +#endif + } + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect(dj->fs, clst); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32; + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ + + +static +BOOL cmp_lfn ( /* TRUE:Matched, FALSE:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ +) +{ + int i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Get offset in the LFN buffer */ + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + wc = ff_wtoupper(uc); /* Convert it to upper case */ + if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return FALSE; /* Not matched */ + } else { + if (uc != 0xFFFF) return FALSE; /* Check filler */ + } + } while (++s < 13); /* Repeat until all chars in the entry are checked */ + + if ((dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i]) /* Last segment matched but different length */ + return FALSE; + + return TRUE; /* The part of LFN matched */ +} + + + +static +BOOL pick_lfn ( /* TRUE:Succeeded, FALSE:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + int i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return FALSE; /* Check filler */ + } + } while (++s < 13); /* Read all character in the entry */ + + if (dir[LDIR_Ord] & 0x40) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return TRUE; +} + + +#if !_FS_READONLY +static +void fit_lfn ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ +) +{ + int i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD(dir+LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective char */ + ST_WORD(dir+LfnOfs[s], wc); /* Put it */ + if (!wc) wc = 0xFFFF; /* Padding chars following last char */ + } while (++s < 13); + if (wc == 0xFFFF || !lfnbuf[i]) ord |= 0x40; /* Bottom LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Create numbered name */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname ( + BYTE *dst, /* Pointer to genartated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD num /* Sequense number */ +) +{ + char ns[8]; + int i, j; + + + mem_cpy(dst, src, 11); + + if (num > 5) { /* On many collisions, generate a hash number instead of sequencial number */ + do num = (num >> 1) + (num << 15) + (WORD)*lfn++; while (*lfn); + } + + /* itoa */ + i = 7; + do { + ns[i--] = (num % 10) + '0'; + num /= 10; + } while (num); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Calculate sum of an SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +BYTE sum_sfn ( + const BYTE *dir /* Ptr to directory entry */ +) +{ + BYTE sum = 0; + int n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( + DIR *dj /* Pointer to the directory object linked to the file name */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_seek(dj, 0); /* Rewind directory object */ + if (res != FR_OK) return res; + +#if _USE_LFN + ord = sum = 0xFF; +#endif + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dj->lfn) { + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ + ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break; /* SFN matched? */ + } + } +#else /* Non LFN configuration */ + if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +FRESULT dir_read ( + DIR *dj /* Pointer to the directory object that pointing the entry to be read */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord = 0xFF, sum = 0xFF; +#endif + + res = FR_NO_FILE; + while (dj->sect) { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; + dj->lfn_idx = dj->index; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN? */ + dj->lfn_idx = 0xFFFF; /* It has no LFN. */ + break; + } + } +#else /* Non LFN configuration */ + if (c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dj->sect = 0; + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN /* LFN configuration */ + WORD n, ne, is; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dj->fn; lfn = dj->lfn; + mem_cpy(sn, fn, 12); + + if (_FS_RPATH && (sn[NS] & NS_DOT)) return FR_INVALID_NAME; /* Cannot create dot entry */ + + if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NS] = 0; dj->lfn = NULL; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dj); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NS] = sn[NS]; dj->lfn = lfn; + } + + if (sn[NS] & NS_LFN) { /* When LFN is to be created, reserve reserve an SFN + LFN entries. */ + for (ne = 0; lfn[ne]; ne++) ; + ne = (ne + 25) / 13; + } else { /* Otherwise reserve only an SFN entry. */ + ne = 1; + } + + /* Reserve contiguous entries */ + res = dir_seek(dj, 0); + if (res != FR_OK) return res; + n = is = 0; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; /* Check the entry status */ + if (c == 0xE5 || c == 0) { /* Is it a blank entry? */ + if (n == 0) is = dj->index; /* First index of the contigulus entry */ + if (++n == ne) break; /* A contiguous entry that requiered count is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + + if (res == FR_OK && ne > 1) { /* Initialize LFN entry if needed */ + res = dir_seek(dj, is); + if (res == FR_OK) { + sum = sum_sfn(dj->fn); /* Sum of the SFN tied to the LFN */ + ne--; + do { /* Store LFN entries in bottom first */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); + dj->fs->wflag = 1; + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK && --ne); + } + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, 0); + if (res == FR_OK) { + do { /* Find a blank entry for the SFN */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; + if (c == 0xE5 || c == 0) break; /* Is it a blank entry? */ + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + } +#endif + + if (res == FR_OK) { /* Initialize the SFN entry */ + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + dir = dj->dir; + mem_set(dir, 0, 32); /* Clean the entry */ + mem_cpy(dir, dj->fn, 11); /* Put SFN */ + dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT); /* Put NT flag */ + dj->fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; +#if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_seek(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ + if (res == FR_OK) { + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if (dj->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, dj->index); + if (res == FR_OK) { + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( + DIR *dj, /* Pointer to the directory object */ + const XCHAR **path /* Pointer to pointer to the segment in the path string */ +) +{ +#ifdef _EXCVT + static const BYTE cvt[] = _EXCVT; +#endif + +#if _USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + int i, ni, si, di; + const XCHAR *p; + + /* Create LFN in Unicode */ + si = di = 0; + p = *path; + lfn = dj->lfn; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ + if (di >= _MAX_LFN) /* Reject too long name */ + return FR_INVALID_NAME; +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* If it is a DBC 1st byte */ + b = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(b)) /* Reject invalid code for DBC */ + return FR_INVALID_NAME; + w = (w << 8) + b; + } + w = ff_convert(w, 1); /* Convert OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ + return FR_INVALID_NAME; + lfn[di++] = w; /* Store the Unicode char */ + } + *path = &p[si]; /* Rerurn pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH + if ((di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */ + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { + lfn[di] = 0; + for (i = 0; i < 11; i++) + dj->fn[i] = (i < di) ? '.' : ' '; + dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Strip trailing spaces and dots */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + if (!di) return FR_INVALID_NAME; /* Reject null string */ + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + mem_set(dj->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN char */ + if (!w) break; /* Break on enf of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII char */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = cvt[w - 0x80]; /* Convert extended char to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Double byte char */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dj->fn[i++] = (BYTE)(w >> 8); + } else { /* Single byte char */ + if (!w || chk_chr("+,;[=]", w)) { /* Replace illegal chars for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN; /* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dj->fn[i++] = (BYTE)w; + } + + if (dj->fn[0] == 0xE5) dj->fn[0] = 0x05; /* If the first char collides with deleted mark, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ + cf |= NS_LFN; + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dj->fn[NS] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + int ni, si, i; + const char *p; + + /* Create file name in directory form */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; + p = *path; +#if _FS_RPATH + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Rerurn pointer to the next segment */ + sfn[NS] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = p[si++]; + if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended char */ +#ifdef _EXCVT + c = cvt[c - 0x80]; /* Convert extend char (SBCS) */ +#else + b |= 3; /* Eliminate NT flag if ext char is exist */ +#if !_DF1S /* ASCII only cfg */ + return FR_INVALID_NAME; +#endif +#endif + } + if (IsDBCS1(c)) { /* DBC 1st byte? */ + d = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ + return FR_INVALID_NAME; + sfn[i++] = c; + sfn[i++] = d; + } else { /* Single byte code */ + if (chk_chr(" \"*+,[=]|\x7F", c)) /* Reject illegal chrs for SFN */ + return FR_INVALID_NAME; + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Rerurn pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (!i) return FR_INVALID_NAME; /* Reject null string */ + if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Filename has only small capital) */ + + sfn[NS] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +void get_fileinfo ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to the file information to be filled */ +) +{ + int i; + BYTE c, nt, *dir; + char *p; + + + p = fno->fname; + if (dj->sect) { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for (i = 0; i < 8; i++) { /* Copy name body */ + c = dir[i]; + if (c == ' ') break; + if (c == 0x05) c = 0xE5; + if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; + *p++ = c; + } + if (dir[8] != ' ') { /* Copy name extension */ + *p++ = '.'; + for (i = 8; i < 11; i++) { + c = dir[i]; + if (c == ' ') break; + if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; + *p++ = c; + } + } + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + } + *p = 0; + +#if _USE_LFN + if (fno->lfname) { + XCHAR *tp = fno->lfname; + WCHAR w, *lfn; + + i = 0; + if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ + lfn = dj->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN char */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM conversion */ + if (!w) { i = 0; break; } /* Could not convert, no LFN */ + if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC */ + tp[i++] = (XCHAR)(w >> 8); +#endif + if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overrun, no LFN */ + tp[i++] = (XCHAR)w; + } + } + tp[i] = 0; /* Terminator */ + } +#endif +} +#endif /* _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const XCHAR *path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE *dir, last; + + + while (!_USE_LFN && *path == ' ') path++; /* Skip leading spaces */ +#if _FS_RPATH + if (*path == '/' || *path == '\\') { /* There is a heading separator */ + path++; dj->sclust = 0; /* Strip it and start from the root dir */ + } else { /* No heading saparator */ + dj->sclust = dj->fs->cdir; /* Start from the current dir */ + } +#else + if (*path == '/' || *path == '\\') /* Strip heading separator if exist */ + path++; + dj->sclust = 0; /* Start from the root dir */ +#endif + + if ((UINT)*path < ' ') { /* Null path means the start directory itself */ + res = dir_seek(dj, 0); + dj->dir = NULL; + + } else { /* Follow path */ + for (;;) { + res = create_name(dj, &path); /* Get a segment */ + if (res != FR_OK) break; + res = dir_find(dj); /* Find it */ + last = *(dj->fn+NS) & NS_LAST; + if (res != FR_OK) { /* Could not find the object */ + if (res == FR_NO_FILE && !last) + res = FR_NO_PATH; + break; + } + if (last) break; /* Last segment match. Function completed. */ + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ + res = FR_NO_PATH; break; + } + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load boot record and check if it is an FAT boot record */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + if (disk_read(fs->drive, fs->win, sect, 1) != RES_OK) /* Load boot record */ + return 3; + if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + + if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */ + return 0; + if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) + return 0; + + return 1; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Make sure that the file system is valid */ +/*-----------------------------------------------------------------------*/ + + +FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occured */ + const XCHAR **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE chk_wp /* !=0: Check media write protection for write access */ +) +{ + BYTE fmt, *tbl; + UINT vol; + DSTATUS stat; + DWORD bsect, fsize, tsect, mclst; + const XCHAR *p = *path; + FATFS *fs; + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ + p += 2; *path = p; /* Return pointer to the path name */ + } else { /* No drive number is given */ +#if _FS_RPATH + vol = Drive; /* Use current drive */ +#else + vol = 0; /* Use drive 0 */ +#endif + } + + /* Check if the logical drive is valid or not */ + if (vol >= _DRIVES) /* Is the drive number valid? */ + return FR_INVALID_DRIVE; + *rfs = fs = FatFs[vol]; /* Returen pointer to the corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock file system */ + + if (fs->fs_type) { /* If the logical drive has been mounted */ + stat = disk_status(fs->drive); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + return FR_OK; /* The file system object is valid */ + } + } + + /* The logical drive must be mounted. Following code attempts to mount the volume */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drive = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drive); /* Initialize low level disk I/O layer */ + if (stat & STA_NOINIT) /* Check if the drive is ready */ + return FR_NOT_READY; +#if _MAX_SS != 512 /* Get disk sector size if needed */ + if (disk_ioctl(fs->drive, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) + return FR_NO_FILESYSTEM; +#endif +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + /* Search FAT partition on the drive */ + fmt = check_fs(fs, bsect = 0); /* Check sector 0 as an SFD format */ + if (fmt == 1) { /* Not an FAT boot record, it may be patitioned */ + /* Check a partition listed in top of the partition table */ + tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */ + if (tbl[4]) { /* Is the partition existing? */ + bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ + fmt = check_fs(fs, bsect); /* Check the partition */ + } + } + if (fmt == 3) return FR_DISK_ERR; + if (fmt || LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* No valid FAT patition is found */ + return FR_NO_FILESYSTEM; + + /* Initialize the file system object */ + fsize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ + if (!fsize) fsize = LD_DWORD(fs->win+BPB_FATSz32); + fs->sects_fat = fsize; + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + fsize *= fs->n_fats; /* (Number of sectors in FAT area) */ + fs->fatbase = bsect + LD_WORD(fs->win+BPB_RsvdSecCnt); /* FAT start sector (lba) */ + fs->csize = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Nmuber of root directory entries */ + tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + fs->max_clust = mclst = (tsect /* Last cluster# + 1 (Number of clusters + 2) */ + - LD_WORD(fs->win+BPB_RsvdSecCnt) - fsize - fs->n_rootdir / (SS(fs)/32) + ) / fs->csize + 2; + + fmt = FS_FAT12; /* Determine the FAT sub type */ + if (mclst >= 0xFF7) fmt = FS_FAT16; /* Number of clusters >= 0xFF5 */ + if (mclst >= 0xFFF7) fmt = FS_FAT32; /* Number of clusters >= 0xFFF5 */ + + if (fmt == FS_FAT32) + fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + else + fs->dirbase = fs->fatbase + fsize; /* Root directory start sector (lba) */ + fs->database = fs->fatbase + fsize + fs->n_rootdir / (SS(fs)/32); /* Data start sector (lba) */ + +#if !_FS_READONLY + /* Initialize allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->wflag = 0; + /* Get fsinfo if needed */ + if (fmt == FS_FAT32) { + fs->fsi_flag = 0; + fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); + if (disk_read(fs->drive, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + } + } +#endif + fs->fs_type = fmt; /* FAT sub-type */ + fs->winsect = 0; /* Invalidate sector cache */ +#if _FS_RPATH + fs->cdir = 0; /* Current directory (root dir) */ +#endif + fs->id = ++Fsid; /* File system mount ID */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/dir object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ + FATFS *fs, /* Pointer to the file system object */ + WORD id /* Member id of the target object to be checked */ +) +{ + if (!fs || !fs->fs_type || fs->id != id) + return FR_INVALID_OBJECT; + + ENTER_FF(fs); /* Lock file system */ + + if (disk_status(fs->drive) & STA_NOINIT) + return FR_NOT_READY; + + return FR_OK; +} + + + + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Locical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ +) +{ + FATFS *rfs; + + + if (vol >= _DRIVES) /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + rfs = FatFs[vol]; /* Get current fs object */ + + if (rfs) { +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; +#endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL *fp, /* Pointer to the blank file object */ + const XCHAR *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + fp->fs = NULL; /* Clear file object */ +#if !_FS_READONLY + mode &= (FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW); + res = chk_mounted(&path, &dj.fs, (BYTE)(mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW))); +#else + mode &= FA_READ; + res = chk_mounted(&path, &dj.fs, 0); +#endif + if (res != FR_OK) LEAVE_FF(dj.fs, res); + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + +#if !_FS_READONLY + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + DWORD ps, cl; + + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ + res = dir_register(&dj); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + mode |= FA_CREATE_ALWAYS; + dir = dj.dir; /* Created entry (SFN entry) */ + } + else { /* Any object is already existing */ + if (mode & FA_CREATE_NEW) /* Cannot create new */ + LEAVE_FF(dj.fs, FR_EXIST); + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & (AM_RDO | AM_DIR))) /* Cannot overwrite it (R/O or DIR) */ + LEAVE_FF(dj.fs, FR_DENIED); + if (mode & FA_CREATE_ALWAYS) { /* Resize it to zero on over write mode */ + cl = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); /* Get start cluster */ + ST_WORD(dir+DIR_FstClusHI, 0); /* cluster = 0 */ + ST_WORD(dir+DIR_FstClusLO, 0); + ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ + dj.fs->wflag = 1; + ps = dj.fs->winsect; /* Remove the cluster chain */ + if (cl) { + res = remove_chain(dj.fs, cl); + if (res) LEAVE_FF(dj.fs, res); + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + } + res = move_window(dj.fs, ps); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + } + } + if (mode & FA_CREATE_ALWAYS) { + dir[DIR_Attr] = 0; /* Reset attribute */ + ps = get_fattime(); + ST_DWORD(dir+DIR_CrtTime, ps); /* Created time */ + dj.fs->wflag = 1; + mode |= FA__WRITTEN; /* Set file changed flag */ + } + } + /* Open an existing file */ + else { +#endif /* !_FS_READONLY */ + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & AM_DIR)) /* It is a directory */ + LEAVE_FF(dj.fs, FR_NO_FILE); +#if !_FS_READONLY + if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ + LEAVE_FF(dj.fs, FR_DENIED); + } + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#endif + fp->flag = mode; /* File access mode */ + fp->org_clust = /* File start cluster */ + ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fptr = 0; fp->csect = 255; /* File pointer */ + fp->dsect = 0; + fp->fs = dj.fs; fp->id = dj.fs->id; /* Owner file system object of the file */ + + LEAVE_FF(dj.fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE *rbuff = buff; + + + *br = 0; /* Initialize bytes read */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data transferred */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector offset in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_read(fp->fs->drive, rbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if !_FS_READONLY && _FS_MINIMIZE <= 2 +#if _FS_TINY + if (fp->fs->wflag && fp->fs->winsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs)); +#else + if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs)); +#endif +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + rcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = buff; + + + *bw = 0; /* Initialize bytes written */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */ + + for ( ; btw; /* Repeat until all data transferred */ + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->org_clust; /* Follow from the origin */ + if (clst == 0) /* When there is no cluster chain, */ + fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ + } else { /* Middle or end of the file */ + clst = create_chain(fp->fs, fp->curr_clust); /* Follow or streach cluster chain */ + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } +#if _FS_TINY + if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */ + ABORT(fp->fs, FR_DISK_ERR); +#else + if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_write(fp->fs->drive, wbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if _FS_TINY + if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->fs->wflag = 0; + } +#else + if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->flag &= ~FA__DIRTY; + } +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */ + if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR); + fp->fs->winsect = sect; + } +#else + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (fp->fptr < fp->fsize && + disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= FA__DIRTY; +#endif + } + + if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ + fp->flag |= FA__WRITTEN; /* Set file changed flag */ + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD tim; + BYTE *dir; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ +#if !_FS_TINY /* Write-back dirty buffer */ + if (fp->flag & FA__DIRTY) { + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + LEAVE_FF(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + /* Update the directory entry */ + res = move_window(fp->fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_WORD(dir+DIR_FstClusLO, fp->org_clust); /* Update start cluster */ + ST_WORD(dir+DIR_FstClusHI, fp->org_clust >> 16); + tim = get_fattime(); /* Updated time */ + ST_DWORD(dir+DIR_WrtTime, tim); + fp->flag &= ~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync(fp->fs); + } + } + } + + LEAVE_FF(fp->fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL *fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + + +#if _FS_READONLY + res = validate(fp->fs, fp->id); + if (res == FR_OK) fp->fs = NULL; + LEAVE_FF(fp->fs, res); +#else + res = f_sync(fp); + if (res == FR_OK) fp->fs = NULL; + return res; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Current Drive/Directory */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH + +FRESULT f_chdrive ( + BYTE drv /* Drive number */ +) +{ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + + Drive = drv; + + return FR_OK; +} + + + + +FRESULT f_chdir ( + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + dir = dj.dir; /* Pointer to the entry */ + if (!dir) { + dj.fs->cdir = 0; /* No entry (root dir) */ + } else { + if (dir[DIR_Attr] & AM_DIR) /* Reached to the dir */ + dj.fs->cdir = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + else + res = FR_NO_PATH; /* Could not reach the dir (it is a file) */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj.fs, res); +} + +#endif + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL *fp, /* Pointer to the file object */ + DWORD ofs /* File pointer from top of file */ +) +{ + FRESULT res; + DWORD clst, bcs, nsect, ifptr; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->fsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; fp->csect = 255; + if (ofs > 0) { + bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->curr_clust; + } else { /* When seek to back cluster, */ + clst = fp->org_clust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(fp->fs, 0); + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->org_clust = clst; + } +#endif + fp->curr_clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(fp->fs, clst); /* Force streached if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(fp->fs, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fp->fs->max_clust) ABORT(fp->fs, FR_INT_ERR); + fp->curr_clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + fp->csect = (BYTE)(ofs / SS(fp->fs)); /* Sector offset in the cluster */ + if (ofs % SS(fp->fs)) { + nsect = clust2sect(fp->fs, clst); /* Current sector */ + if (!nsect) ABORT(fp->fs, FR_INT_ERR); + nsect += fp->csect; + fp->csect++; + } + } + } + if (fp->fptr % SS(fp->fs) && nsect != fp->dsect) { +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drive, fp->buf, nsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->fsize) { /* Set changed flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } +#endif + + LEAVE_FF(fp->fs, res); +} + + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directroy Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR *dj, /* Pointer to directory object to create */ + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj->fs, 0); + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + res = follow_path(dj, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + dir = dj->dir; + if (dir) { /* It is not the root dir */ + if (dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } else { /* The object is not a directory */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dj->id = dj->fs->id; + res = dir_seek(dj, 0); /* Rewind dir */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entry in Sequense */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR *dj, /* Pointer to the open directory object */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + + + res = validate(dj->fs, dj->id); /* Check validity of the object */ + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + if (!fno) { + res = dir_seek(dj, 0); + } else { + res = dir_read(dj); + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dj, fno); /* Get the object information */ + res = dir_next(dj, FALSE); /* Increment index for next */ + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + } + } + } + + LEAVE_FF(dj->fs, res); +} + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const XCHAR *path, /* Pointer to the file path */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follwo completed */ + if (dj.dir) /* Found an object */ + get_fileinfo(&dj, fno); + else /* It is root dir */ + res = FR_INVALID_NAME; + } + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const XCHAR *path, /* Pointer to the logical drive number (root dir) */ + DWORD *nclst, /* Pointer to the variable to return number of free clusters */ + FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ +) +{ + FRESULT res; + DWORD n, clst, sect, stat; + UINT i; + BYTE fat, *p; + + + /* Get drive number */ + res = chk_mounted(&path, fatfs, 0); + if (res != FR_OK) LEAVE_FF(*fatfs, res); + + /* If number of free cluster is valid, return it without cluster scan. */ + if ((*fatfs)->free_clust <= (*fatfs)->max_clust - 2) { + *nclst = (*fatfs)->free_clust; + LEAVE_FF(*fatfs, FR_OK); + } + + /* Get number of free clusters */ + fat = (*fatfs)->fs_type; + n = 0; + if (fat == FS_FAT12) { + clst = 2; + do { + stat = get_fat(*fatfs, clst); + if (stat == 0xFFFFFFFF) LEAVE_FF(*fatfs, FR_DISK_ERR); + if (stat == 1) LEAVE_FF(*fatfs, FR_INT_ERR); + if (stat == 0) n++; + } while (++clst < (*fatfs)->max_clust); + } else { + clst = (*fatfs)->max_clust; + sect = (*fatfs)->fatbase; + i = 0; p = 0; + do { + if (!i) { + res = move_window(*fatfs, sect++); + if (res != FR_OK) + LEAVE_FF(*fatfs, res); + p = (*fatfs)->win; + i = SS(*fatfs); + } + if (fat == FS_FAT16) { + if (LD_WORD(p) == 0) n++; + p += 2; i -= 2; + } else { + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + p += 4; i -= 4; + } + } while (--clst); + } + (*fatfs)->free_clust = n; + if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; + *nclst = n; + + LEAVE_FF(*fatfs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD ncl; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + if (fp->fsize > fp->fptr) { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(fp->fs, fp->org_clust); + fp->org_clust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(fp->fs, fp->curr_clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fp->fs->max_clust) { + res = put_fat(fp->fs, fp->curr_clust, 0x0FFFFFFF); + if (res == FR_OK) res = remove_chain(fp->fs, ncl); + } + } + } + if (res != FR_OK) fp->flag |= FA__ERROR; + + LEAVE_FF(fp->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File or Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const XCHAR *path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + NAMEBUF(sfn, lfn); + BYTE *dir; + DWORD dclst; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + + dir = dj.dir; + if (!dir) /* Is it the root directory? */ + LEAVE_FF(dj.fs, FR_INVALID_NAME); + if (dir[DIR_Attr] & AM_RDO) /* Is it a R/O object? */ + LEAVE_FF(dj.fs, FR_DENIED); + dclst = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + + if (dir[DIR_Attr] & AM_DIR) { /* It is a sub-directory */ + if (dclst < 2) LEAVE_FF(dj.fs, FR_INT_ERR); + mem_cpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_seek(&sdj, 2); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + res = dir_read(&sdj); + if (res == FR_OK) res = FR_DENIED; /* Not empty sub-dir */ + if (res != FR_NO_FILE) LEAVE_FF(dj.fs, res); + } + + res = dir_remove(&dj); /* Remove directory entry */ + if (res == FR_OK) { + if (dclst) + res = remove_chain(dj.fs, dclst); /* Remove the cluster chain */ + if (res == FR_OK) res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir, n; + DWORD dsect, dclst, pclst, tim; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any file or directory is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res != FR_NO_FILE) /* Any error occured */ + LEAVE_FF(dj.fs, res); + + dclst = create_chain(dj.fs, 0); /* Allocate a new cluster for new directory table */ + res = FR_OK; + if (dclst == 0) res = FR_DENIED; + if (dclst == 1) res = FR_INT_ERR; + if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) + res = move_window(dj.fs, 0); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + dsect = clust2sect(dj.fs, dclst); + + dir = dj.fs->win; /* Initialize the new directory table */ + mem_set(dir, 0, SS(dj.fs)); + mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + tim = get_fattime(); + ST_DWORD(dir+DIR_WrtTime, tim); + ST_WORD(dir+DIR_FstClusLO, dclst); + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + mem_cpy(dir+32, dir, 32); /* Create ".." entry */ + dir[33] = '.'; + pclst = dj.sclust; + if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase) + pclst = 0; + ST_WORD(dir+32+DIR_FstClusLO, pclst); + ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16); + for (n = 0; n < dj.fs->csize; n++) { /* Write dot entries and clear left sectors */ + dj.fs->winsect = dsect++; + dj.fs->wflag = 1; + res = move_window(dj.fs, 0); + if (res) LEAVE_FF(dj.fs, res); + mem_set(dir, 0, SS(dj.fs)); + } + + res = dir_register(&dj); + if (res != FR_OK) { + remove_chain(dj.fs, dclst); + } else { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tim); /* Crated time */ + ST_WORD(dir+DIR_FstClusLO, dclst); /* Table start cluster */ + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change File Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const XCHAR *path, /* Pointer to the file path */ + BYTE value, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } else { /* File or sub directory */ + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const XCHAR *path, /* Pointer to the file/directory name */ + const FILINFO *fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Root directory */ + res = FR_INVALID_NAME; + } else { /* File or sub-directory */ + ST_WORD(dir+DIR_WrtTime, fno->ftime); + ST_WORD(dir+DIR_WrtDate, fno->fdate); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const XCHAR *path_old, /* Pointer to the old name */ + const XCHAR *path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR dj_old, dj_new; + NAMEBUF(sfn, lfn); + BYTE buf[21], *dir; + DWORD dw; + + + INITBUF(dj_old, sfn, lfn); + res = chk_mounted(&path_old, &dj_old.fs, 1); + if (res == FR_OK) { + dj_new.fs = dj_old.fs; + res = follow_path(&dj_old, path_old); /* Check old object */ + if (_FS_RPATH && res == FR_OK && (dj_old.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + } + if (res != FR_OK) LEAVE_FF(dj_old.fs, res); /* The old object is not found */ + + if (!dj_old.dir) LEAVE_FF(dj_old.fs, FR_NO_FILE); /* Is root dir? */ + mem_cpy(buf, dj_old.dir+DIR_Attr, 21); /* Save the object information */ + + mem_cpy(&dj_new, &dj_old, sizeof(DIR)); + res = follow_path(&dj_new, path_new); /* Check new object */ + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ + res = dir_register(&dj_new); /* Register the new object */ + if (res == FR_OK) { + dir = dj_new.dir; /* Copy object information into new entry */ + mem_cpy(dir+13, buf+2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + dj_old.fs->wflag = 1; + if (dir[DIR_Attr] & AM_DIR) { /* Update .. entry in the directory if needed */ + dw = clust2sect(dj_new.fs, (DWORD)LD_WORD(dir+DIR_FstClusHI) | LD_WORD(dir+DIR_FstClusLO)); + if (!dw) { + res = FR_INT_ERR; + } else { + res = move_window(dj_new.fs, dw); + dir = dj_new.fs->win+32; + if (res == FR_OK && dir[1] == '.') { + dw = (dj_new.fs->fs_type == FS_FAT32 && dj_new.sclust == dj_new.fs->dirbase) ? 0 : dj_new.sclust; + ST_WORD(dir+DIR_FstClusLO, dw); + ST_WORD(dir+DIR_FstClusHI, dw >> 16); + dj_new.fs->wflag = 1; + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj_old); /* Remove old entry */ + if (res == FR_OK) + res = sync(dj_old.fs); + } + } + } + + LEAVE_FF(dj_old.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (Available on only _FS_TINY cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL *fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btr, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + + + *bf = 0; + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check error flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr && (*func)(NULL, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } + fp->csect++; /* Next sector address in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current data sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect - 1; + if (move_window(fp->fs, sect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + fp->dsect = sect; + rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ + if (rcnt > btr) rcnt = btr; + rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); + if (!rcnt) ABORT(fp->fs, FR_INT_ERR); + } + + LEAVE_FF(fp->fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create File System on the Drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Multiple of 32 and <= 2048 */ +#define N_FATS 1 /* 1 or 2 */ +#define MAX_SECTOR 131072000UL /* Maximum partition size */ +#define MIN_SECTOR 2000UL /* Minimum partition size */ + + +FRESULT f_mkfs ( + BYTE drv, /* Logical drive number */ + BYTE partition, /* Partitioning rule 0:FDISK, 1:SFD */ + WORD allocsize /* Allocation unit size [bytes] */ +) +{ + static const DWORD sstbl[] = { 2048000, 1024000, 512000, 256000, 128000, 64000, 32000, 16000, 8000, 4000, 0 }; + static const WORD cstbl[] = { 32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512 }; + BYTE fmt, m, *tbl; + DWORD b_part, b_fat, b_dir, b_data; /* Area offset (LBA) */ + DWORD n_part, n_rsv, n_fat, n_dir; /* Area size */ + DWORD n_clst, d, n; + WORD as; + FATFS *fs; + DSTATUS stat; + + + /* Check validity of the parameters */ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + if (partition >= 2) return FR_MKFS_ABORTED; + + /* Check mounted drive and clear work area */ + fs = FatFs[drv]; + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + drv = LD2PD(drv); + + /* Get disk statics */ + stat = disk_initialize(drv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != 512 /* Get disk sector size */ + if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK + || SS(fs) > _MAX_SS) + return FR_MKFS_ABORTED; +#endif + if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR) + return FR_MKFS_ABORTED; + if (n_part > MAX_SECTOR) n_part = MAX_SECTOR; + b_part = (!partition) ? 63 : 0; /* Boot sector */ + n_part -= b_part; + for (d = 512; d <= 32768U && d != allocsize; d <<= 1) ; /* Check validity of the allocation unit size */ + if (d != allocsize) allocsize = 0; + if (!allocsize) { /* Auto selection of cluster size */ + d = n_part; + for (as = SS(fs); as > 512U; as >>= 1) d >>= 1; + for (n = 0; d < sstbl[n]; n++) ; + allocsize = cstbl[n]; + } + if (allocsize < SS(fs)) allocsize = SS(fs); + + allocsize /= SS(fs); /* Number of sectors per cluster */ + + /* Pre-compute number of clusters and FAT type */ + n_clst = n_part / allocsize; + fmt = FS_FAT12; + if (n_clst >= 0xFF5) fmt = FS_FAT16; + if (n_clst >= 0xFFF5) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + switch (fmt) { + case FS_FAT12: + n_fat = ((n_clst * 3 + 1) / 2 + 3 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + case FS_FAT16: + n_fat = ((n_clst * 2) + 4 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + default: + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 33 - partition; + n_dir = 0; + } + b_fat = b_part + n_rsv; /* FATs start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory start sector */ + b_data = b_dir + n_dir; /* Data start sector */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_MKFS_ABORTED; + n = (b_data + n - 1) & ~(n - 1); + n_fat += (n - b_data) / N_FATS; + /* b_dir and b_data are no longer used below */ + + /* Determine number of cluster and final check of validity of the FAT type */ + n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; + if ( (fmt == FS_FAT16 && n_clst < 0xFF5) + || (fmt == FS_FAT32 && n_clst < 0xFFF5)) + return FR_MKFS_ABORTED; + + /* Create partition table if needed */ + if (!partition) { + DWORD n_disk = b_part + n_part; + + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win+MBR_Table; + ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ + if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ + n_disk = n_disk / 63 / 255; + tbl[7] = (BYTE)n_disk; + tbl[6] = (BYTE)((n_disk >> 2) | 63); + } else { + ST_WORD(&tbl[6], 0xFFFF); + } + tbl[5] = 254; + if (fmt != FS_FAT32) /* System ID */ + tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06; + else + tbl[4] = 0x0c; + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_part); /* Partition size in LBA */ + ST_WORD(tbl+64, 0xAA55); /* Signature */ + if (disk_write(drv, fs->win, 0, 1) != RES_OK) + return FR_DISK_ERR; + partition = 0xF8; + } else { + partition = 0xF0; + } + + /* Create boot record */ + tbl = fs->win; /* Clear buffer */ + mem_set(tbl, 0, SS(fs)); + ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ + ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ + tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + ST_WORD(tbl+BPB_RootEntCnt, SS(fs) / 32 * n_dir); /* Number of rootdir entries */ + if (n_part < 0x10000) { /* Number of total sectors */ + ST_WORD(tbl+BPB_TotSec16, n_part); + } else { + ST_DWORD(tbl+BPB_TotSec32, n_part); + } + tbl[BPB_Media] = partition; /* Media descripter */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_part); /* Hidden sectors */ + n = get_fattime(); /* Use current time as a VSN */ + if (fmt != FS_FAT32) { + ST_DWORD(tbl+BS_VolID, n); /* Volume serial number */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of secters per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME FAT ", 19); /* Volume lavel, FAT signature */ + } else { + ST_DWORD(tbl+BS_VolID32, n); /* Volume serial number */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of secters per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (bs+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (bs+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME FAT32 ", 19); /* Volume lavel, FAT signature */ + } + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ + if (SS(fs) > 512U) { + ST_WORD(tbl+SS(fs)-2, 0xAA55); + } + if (disk_write(drv, tbl, b_part+0, 1) != RES_OK) + return FR_DISK_ERR; + if (fmt == FS_FAT32) + disk_write(drv, tbl, b_part+6, 1); + + /* Initialize FAT area */ + for (m = 0; m < N_FATS; m++) { + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + if (fmt != FS_FAT32) { + n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + n |= partition; + ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl+4, 0xFFFFFFFF); + ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ + } + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + mem_set(tbl, 0, SS(fs)); /* Following FAT entries are filled by zero */ + for (n = 1; n < n_fat; n++) { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } + } + + /* Initialize Root directory */ + m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); + do { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } while (--m); + + /* Create FSInfo record if needed */ + if (fmt == FS_FAT32) { + ST_WORD(tbl+BS_55AA, 0xAA55); + ST_DWORD(tbl+FSI_LeadSig, 0x41615252); + ST_DWORD(tbl+FSI_StrucSig, 0x61417272); + ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); + ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); + disk_write(drv, tbl, b_part+1, 1); + disk_write(drv, tbl, b_part+7, 1); + } + + return (disk_ioctl(drv, CTRL_SYNC, (void*)NULL) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ +char* f_gets ( + char* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer */ + FIL* fil /* Pointer to the file object */ +) +{ + int i = 0; + char *p = buff; + UINT rc; + + + while (i < len - 1) { /* Read bytes until buffer gets filled */ + f_read(fil, p, 1, &rc); + if (rc != 1) break; /* Break when no data to read */ +#if _USE_STRFUNC >= 2 + if (*p == '\r') continue; /* Strip '\r' */ +#endif + i++; + if (*p++ == '\n') break; /* Break when reached end of line */ + } + *p = 0; + return i ? buff : NULL; /* When no data read (eof or error), return with error. */ +} + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ +int f_putc ( + int chr, /* A character to be output */ + FIL* fil /* Ponter to the file object */ +) +{ + UINT bw; + char c; + + +#if _USE_STRFUNC >= 2 + if (chr == '\n') f_putc ('\r', fil); /* LF -> CRLF conversion */ +#endif + if (!fil) { /* Special value may be used to switch the destination to any other device */ + /* put_console(chr); */ + return chr; + } + c = (char)chr; + f_write(fil, &c, 1, &bw); /* Write a byte to the file */ + return bw ? chr : EOF; /* Return the result */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ +int f_puts ( + const char* str, /* Pointer to the string to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + int n; + + + for (n = 0; *str; str++, n++) { + if (f_putc(*str, fil) == EOF) return EOF; + } + return n; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ +int f_printf ( + FIL* fil, /* Pointer to the file object */ + const char* str, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + UCHAR c, f, r; + ULONG val; + char s[16]; + int i, w, res, cc; + + + va_start(arp, str); + + for (cc = res = 0; cc != EOF; res += cc) { + c = *str++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape cahracter */ + cc = f_putc(c, fil); + if (cc != EOF) cc = 1; + continue; + } + w = f = 0; + c = *str++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *str++; + } + while (c >= '0' && c <= '9') { /* Precision */ + w = w * 10 + (c - '0'); + c = *str++; + } + if (c == 'l') { /* Prefix: Size is long int */ + f |= 2; c = *str++; + } + if (c == 's') { /* Type is string */ + cc = f_puts(va_arg(arp, char*), fil); + continue; + } + if (c == 'c') { /* Type is character */ + cc = f_putc(va_arg(arp, int), fil); + if (cc != EOF) cc = 1; + continue; + } + r = 0; + if (c == 'd') r = 10; /* Type is signed decimal */ + if (c == 'u') r = 10; /* Type is unsigned decimal */ + if (c == 'X') r = 16; /* Type is unsigned hexdecimal */ + if (r == 0) break; /* Unknown type */ + if (f & 2) { /* Get the value */ + val = (ULONG)va_arg(arp, long); + } else { + val = (c == 'd') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int); + } + /* Put numeral string */ + if (c == 'd') { + if (val & 0x80000000) { + val = 0 - val; + f |= 4; + } + } + i = sizeof(s) - 1; s[i] = 0; + do { + c = (UCHAR)(val % r + '0'); + if (c > '9') c += 7; + s[--i] = c; + val /= r; + } while (i && val); + if (i && (f & 4)) s[--i] = '-'; + w = sizeof(s) - 1 - w; + while (i && i > w) s[--i] = (f & 1) ? '0' : ' '; + cc = f_puts(&s[i], fil); + } + + va_end(arp); + return (cc == EOF) ? cc : res; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/macusbfb/drivers/fatfs/ff.h b/macusbfb/drivers/fatfs/ff.h new file mode 100644 index 0000000..c24d6c7 --- /dev/null +++ b/macusbfb/drivers/fatfs/ff.h @@ -0,0 +1,596 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include file R0.07e (C)ChaN, 2009 +/----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/----------------------------------------------------------------------------*/ + +#ifndef _FATFS +#define _FATFS 0x007E + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if _FATFS != _FFCONFIG +#error Wrong configuration file (ffconf.h). +#endif + + +/* DBCS code ranges and SBCS extend char conversion table */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} + +#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ + 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} + +#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + + +/* Character code support macros */ + +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) + +#if _DF1S /* DBCS configuration */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* SBCS configuration */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + + +/* Definitions corresponds to multi partition */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ + +typedef struct _PARTITION { + BYTE pd; /* Physical drive# */ + BYTE pt; /* Partition # (0-3) */ +} PARTITION; + +extern +const PARTITION Drives[]; /* Logical drive# to physical location conversion table */ +#define LD2PD(drv) (Drives[drv].pd) /* Get physical drive# */ +#define LD2PT(drv) (Drives[drv].pt) /* Get partition# */ + +#else /* Single partition configuration */ + +#define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */ +#define LD2PT(drv) 0 /* Always mounts the 1st partition */ + +#endif + + + +/* Definitions corresponds to multiple sector size */ + +#if _MAX_SS == 512 /* Single sector size */ +#define SS(fs) 512U + +#elif _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096 /* Multiple sector size */ +#define SS(fs) ((fs)->s_size) + +#else +#error Sector size must be 512, 1024, 2048 or 4096. + +#endif + + + +/* Type of file name on FatFs API */ + +#if _LFN_UNICODE && _USE_LFN +typedef WCHAR XCHAR; /* Unicode */ +#else +typedef char XCHAR; /* SBCS, DBCS */ +#endif + + + +/* File system object structure */ + +typedef struct _FATFS_ { + BYTE fs_type; /* FAT sub type */ + BYTE drive; /* Physical drive number */ + BYTE csize; /* Number of sectors per cluster */ + BYTE n_fats; /* Number of FAT copies */ + BYTE wflag; /* win[] dirty flag (1:must be written back) */ + BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (0 on FAT32) */ +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if _MAX_SS != 512 + WORD s_size; /* Sector size */ +#endif +#if !_FS_READONLY + DWORD last_clust; /* Last allocated cluster */ + DWORD free_clust; /* Number of free clusters */ + DWORD fsi_sector; /* fsinfo sector */ +#endif +#if _FS_RPATH + DWORD cdir; /* Current directory (0:root)*/ +#endif + DWORD sects_fat; /* Sectors per fat */ + DWORD max_clust; /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */ + DWORD fatbase; /* FAT start sector */ + DWORD dirbase; /* Root directory start sector (Cluster# on FAT32) */ + DWORD database; /* Data start sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS];/* Disk access window for Directory/FAT */ +} FATFS; + + + +/* Directory object structure */ + +typedef struct _DIR_ { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + WORD index; /* Current read/write index number */ + DWORD sclust; /* Table start cluster (0:Static table) */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the current SFN entry in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ +#if _USE_LFN + WCHAR* lfn; /* Pointer to the LFN working buffer */ + WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ +#endif +} DIR; + + + +/* File object structure */ + +typedef struct _FIL_ { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE flag; /* File status flags */ + BYTE csect; /* Sector address in the cluster */ + DWORD fptr; /* File R/W pointer */ + DWORD fsize; /* File size */ + DWORD org_clust; /* File start cluster */ + DWORD curr_clust; /* Current cluster */ + DWORD dsect; /* Current data sector */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector containing the directory entry */ + BYTE* dir_ptr; /* Ponter to the directory entry in the window */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS];/* File R/W buffer */ +#endif +} FIL; + + + +/* File status structure */ + +typedef struct _FILINFO_ { + DWORD fsize; /* File size */ + WORD fdate; /* Last modified date */ + WORD ftime; /* Last modified time */ + BYTE fattrib; /* Attribute */ + char fname[13]; /* Short file name (8.3 format) */ +#if _USE_LFN + XCHAR* lfname; /* Pointer to the LFN buffer */ + int lfsize; /* Size of LFN buffer [chrs] */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* 0 */ + FR_DISK_ERR, /* 1 */ + FR_INT_ERR, /* 2 */ + FR_NOT_READY, /* 3 */ + FR_NO_FILE, /* 4 */ + FR_NO_PATH, /* 5 */ + FR_INVALID_NAME, /* 6 */ + FR_DENIED, /* 7 */ + FR_EXIST, /* 8 */ + FR_INVALID_OBJECT, /* 9 */ + FR_WRITE_PROTECTED, /* 10 */ + FR_INVALID_DRIVE, /* 11 */ + FR_NOT_ENABLED, /* 12 */ + FR_NO_FILESYSTEM, /* 13 */ + FR_MKFS_ABORTED, /* 14 */ + FR_TIMEOUT /* 15 */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ +FRESULT f_open (FIL*, const XCHAR*, BYTE); /* Open or create a file */ +FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ +FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ +FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ +FRESULT f_close (FIL*); /* Close an open file object */ +FRESULT f_opendir (DIR*, const XCHAR*); /* Open an existing directory */ +FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ +FRESULT f_stat (const XCHAR*, FILINFO*); /* Get file status */ +FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ +FRESULT f_truncate (FIL*); /* Truncate file */ +FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ +FRESULT f_unlink (const XCHAR*); /* Delete an existing file or directory */ +FRESULT f_mkdir (const XCHAR*); /* Create a new directory */ +FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */ +FRESULT f_utime (const XCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ +FRESULT f_rename (const XCHAR*, const XCHAR*); /* Rename/Move a file or directory */ +FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ +FRESULT f_mkfs (BYTE, BYTE, WORD); /* Create a file system on the drive */ +FRESULT f_chdir (const XCHAR*); /* Change current directory */ +FRESULT f_chdrive (BYTE); /* Change current drive */ + +#if _USE_STRFUNC +int f_putc (int, FIL*); /* Put a character to the file */ +int f_puts (const char*, FIL*); /* Put a string to the file */ +int f_printf (FIL*, const char*, ...); /* Put a formatted string to the file */ +char* f_gets (char*, int, FIL*); /* Get a string from the file */ +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#ifndef EOF +#define EOF -1 +#endif +#endif + + + +/*--------------------------------------------------------------*/ +/* User defined functions */ + +/* Real time clock */ +#if !_FS_READONLY +DWORD get_fattime (void); /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ + /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ +#endif + +/* Unicode - OEM code conversion */ +#if _USE_LFN +WCHAR ff_convert (WCHAR, UINT); +WCHAR ff_wtoupper (WCHAR); +#endif + +/* Sync functions */ +#if _FS_REENTRANT +BOOL ff_cre_syncobj(BYTE, _SYNC_t*); +BOOL ff_del_syncobj(_SYNC_t); +BOOL ff_req_grant(_SYNC_t); +void ff_rel_grant(_SYNC_t); +#endif + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_OPEN_EXISTING 0x00 +#if _FS_READONLY == 0 +#define FA_WRITE 0x02 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA__WRITTEN 0x20 +#define FA__DIRTY 0x40 +#endif +#define FA__ERROR 0x80 + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* FatFs refers the members in the FAT structures with byte offset instead +/ of structure member because there are incompatibility of the packing option +/ between various compilers. */ + +#define BS_jmpBoot 0 +#define BS_OEMName 3 +#define BPB_BytsPerSec 11 +#define BPB_SecPerClus 13 +#define BPB_RsvdSecCnt 14 +#define BPB_NumFATs 16 +#define BPB_RootEntCnt 17 +#define BPB_TotSec16 19 +#define BPB_Media 21 +#define BPB_FATSz16 22 +#define BPB_SecPerTrk 24 +#define BPB_NumHeads 26 +#define BPB_HiddSec 28 +#define BPB_TotSec32 32 +#define BS_55AA 510 + +#define BS_DrvNum 36 +#define BS_BootSig 38 +#define BS_VolID 39 +#define BS_VolLab 43 +#define BS_FilSysType 54 + +#define BPB_FATSz32 36 +#define BPB_ExtFlags 40 +#define BPB_FSVer 42 +#define BPB_RootClus 44 +#define BPB_FSInfo 48 +#define BPB_BkBootSec 50 +#define BS_DrvNum32 64 +#define BS_BootSig32 66 +#define BS_VolID32 67 +#define BS_VolLab32 71 +#define BS_FilSysType32 82 + +#define FSI_LeadSig 0 +#define FSI_StrucSig 484 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 + +#define MBR_Table 446 + +#define DIR_Name 0 +#define DIR_Attr 11 +#define DIR_NTres 12 +#define DIR_CrtTime 14 +#define DIR_CrtDate 16 +#define DIR_FstClusHI 20 +#define DIR_WrtTime 22 +#define DIR_WrtDate 24 +#define DIR_FstClusLO 26 +#define DIR_FileSize 28 +#define LDIR_Ord 0 +#define LDIR_Attr 11 +#define LDIR_Type 12 +#define LDIR_Chksum 13 +#define LDIR_FstClusLO 26 + + + +/*--------------------------------*/ +/* Multi-byte word access macros */ + +#if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) +#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) +#else /* Use byte-by-byte access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8) +#define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24) +#endif + + +#endif /* _FATFS */ diff --git a/macusbfb/drivers/fatfs/ffconf.h b/macusbfb/drivers/fatfs/ffconf.h new file mode 100644 index 0000000..c543fc4 --- /dev/null +++ b/macusbfb/drivers/fatfs/ffconf.h @@ -0,0 +1,166 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.07e (C)ChaN, 2009 +/----------------------------------------------------------------------------/ +/ +/ CAUTION! Do not forget to make clean the project after any changes to +/ the configuration options. +/ +/----------------------------------------------------------------------------*/ +#ifndef _FFCONFIG +#define _FFCONFIG 0x007E + + +/*---------------------------------------------------------------------------/ +/ Function and Buffer Configurations +/----------------------------------------------------------------------------*/ + +#define _FS_TINY 1 /* 0 or 1 */ +/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system +/ object instead of the sector buffer in the individual file object for file +/ data transfer. This reduces memory consumption 512 bytes each file object. */ + + +#define _FS_READONLY 0 /* 0 or 1 */ +/* Setting _FS_READONLY to 1 defines read only configuration. This removes +/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, +/ f_truncate and useless f_getfree. */ + + +#define _FS_MINIMIZE 1 /* 0, 1, 2 or 3 */ +/* The _FS_MINIMIZE option defines minimization level to remove some functions. +/ +/ 0: Full function. +/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename +/ are removed. +/ 2: f_opendir and f_readdir are removed in addition to level 1. +/ 3: f_lseek is removed in addition to level 2. */ + + +#define _USE_STRFUNC 0 /* 0, 1 or 2 */ +/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ + + +#define _USE_MKFS 0 /* 0 or 1 */ +/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ + + +#define _USE_FORWARD 0 /* 0 or 1 */ +/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ + + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/----------------------------------------------------------------------------*/ + +#define _CODE_PAGE 858 +/* The _CODE_PAGE specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) +/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) +/ 949 - Korean (DBCS, OEM, Windows) +/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) +/ 1250 - Central Europe (Windows) +/ 1251 - Cyrillic (Windows) +/ 1252 - Latin 1 (Windows) +/ 1253 - Greek (Windows) +/ 1254 - Turkish (Windows) +/ 1255 - Hebrew (Windows) +/ 1256 - Arabic (Windows) +/ 1257 - Baltic (Windows) +/ 1258 - Vietnam (OEM, Windows) +/ 437 - U.S. (OEM) +/ 720 - Arabic (OEM) +/ 737 - Greek (OEM) +/ 775 - Baltic (OEM) +/ 850 - Multilingual Latin 1 (OEM) +/ 858 - Multilingual Latin 1 + Euro (OEM) +/ 852 - Latin 2 (OEM) +/ 855 - Cyrillic (OEM) +/ 866 - Russian (OEM) +/ 857 - Turkish (OEM) +/ 862 - Hebrew (OEM) +/ 874 - Thai (OEM, Windows) +/ 1 - ASCII only (Valid for non LFN cfg.) +*/ + + +#define _USE_LFN 0 /* 0, 1 or 2 */ +#define _MAX_LFN 64 /* Maximum LFN length to handle (12 to 255) */ +/* The _USE_LFN option switches the LFN support. +/ +/ 0: Disable LFN. _MAX_LFN and _LFN_UNICODE have no effect. +/ 1: Enable LFN with static working buffer on the bss. NOT REENTRANT. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ +/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When enable LFN, +/ two Unicode handling functions ff_convert() and ff_wtoupper() must be added +/ to the project. */ + + +#define _LFN_UNICODE 0 /* 0 or 1 */ +/* To switch the character code set on FatFs API to Unicode, +/ enable LFN feature and set _LFN_UNICODE to 1. +*/ + + +#define _FS_RPATH 0 /* 0 or 1 */ +/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir, +/ f_chdrive function are available. +/ Note that output of the f_readdir fnction is affected by this option. */ + + + +/*---------------------------------------------------------------------------/ +/ Physical Drive Configurations +/----------------------------------------------------------------------------*/ + +#define _DRIVES 2 +/* Number of volumes (logical drives) to be used. */ + + +#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ +/* Maximum sector size to be handled. +/ Always set 512 for memory card and hard disk but a larger value may be +/ required for floppy disk (512/1024) and optical disk (512/2048). +/ When _MAX_SS is larger than 512, GET_SECTOR_SIZE command must be implememted +/ to the disk_ioctl function. */ + + +#define _MULTI_PARTITION 0 /* 0 or 1 */ +/* When _MULTI_PARTITION is set to 0, each volume is bound to the same physical +/ drive number and can mount only first primaly partition. When it is set to 1, +/ each volume is tied to the partitions listed in Drives[]. */ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/----------------------------------------------------------------------------*/ + +#define _WORD_ACCESS 0 /* 0 or 1 */ +/* The _WORD_ACCESS option defines which access method is used to the word +/ data on the FAT volume. +/ +/ 0: Byte-by-byte access. Always compatible with all platforms. +/ 1: Word access. Do not choose this unless following condition is met. +/ +/ When the byte order on the memory is big-endian or address miss-aligned +/ word access results incorrect behavior, the _WORD_ACCESS must be set to 0. +/ If it is not the case, the value can also be set to 1 to improve the +/ performance and code size. */ + + +#define _FS_REENTRANT 0 /* 0 or 1 */ +#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ +#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ +/* The _FS_REENTRANT option switches the reentrancy of the FatFs module. +/ +/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. +/ 1: Enable reentrancy. Also user provided synchronization handlers, +/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj +/ function must be added to the project. */ + + +#endif /* _FFCONFIG */ diff --git a/macusbfb/drivers/fatfs/integer.h b/macusbfb/drivers/fatfs/integer.h new file mode 100644 index 0000000..3b39dfb --- /dev/null +++ b/macusbfb/drivers/fatfs/integer.h @@ -0,0 +1,34 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER + +#if 0 +#include +#else + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef signed char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +#endif + +#define _INTEGER +#endif diff --git a/macusbfb/drivers/fatfs/mmc.c b/macusbfb/drivers/fatfs/mmc.c new file mode 100644 index 0000000..936b00f --- /dev/null +++ b/macusbfb/drivers/fatfs/mmc.c @@ -0,0 +1,669 @@ +/*-----------------------------------------------------------------------*/ +/* MMCv3/SDv1/SDv2 (in SPI mode) control module (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */ +/* are platform dependent. */ +/*-----------------------------------------------------------------------*/ + + +#include "projectconfig.h" +#include "diskio.h" +#include "core/gpio/gpio.h" +#include "core/ssp/ssp.h" +#include "core/systick/systick.h" + + +/* Definitions for MMC/SDC command */ +#define CMD0 (0x40+0) /* GO_IDLE_STATE */ +#define CMD1 (0x40+1) /* SEND_OP_COND (MMC) */ +#define ACMD41 (0xC0+41) /* SEND_OP_COND (SDC) */ +#define CMD8 (0x40+8) /* SEND_IF_COND */ +#define CMD9 (0x40+9) /* SEND_CSD */ +#define CMD10 (0x40+10) /* SEND_CID */ +#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ +#define ACMD13 (0xC0+13) /* SD_STATUS (SDC) */ +#define CMD16 (0x40+16) /* SET_BLOCKLEN */ +#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ +#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (0x40+23) /* SET_BLOCK_COUNT (MMC) */ +#define ACMD23 (0xC0+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */ +#define CMD24 (0x40+24) /* WRITE_BLOCK */ +#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD55 (0x40+55) /* APP_CMD */ +#define CMD58 (0x40+58) /* READ_OCR */ + + +/* Port Controls (Platform dependent) */ +#define CS_LOW() gpioSetValue(SSP0_CSPORT, SSP0_CSPIN, 0) +#define CS_HIGH() gpioSetValue(SSP0_CSPORT, SSP0_CSPIN, 1) + +// #define FCLK_SLOW() /* Set slow clock (100k-400k) */ +// #define FCLK_FAST() /* Set fast clock (depends on the CSD) */ + +#define FDELAY(ms) systickDelay(ms) // Assumes delay = 1ms, ugly + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +BYTE Timer1, Timer2; /* 100Hz decrement timer */ + +static +BYTE CardType; /* Card type flags */ + +/**************************************************************************/ +/*! + Set SSP clock to slow (400 KHz) +*/ +/**************************************************************************/ +static void FCLK_SLOW() +{ + /* Divide by 10 (SSPCLKDIV also enables to SSP CLK) */ + SCB_SSP0CLKDIV = SCB_SSP0CLKDIV_DIV10; + + /* (PCLK / (CPSDVSR × [SCR+1])) = (7,200,000 / (2 x [8 + 1])) = 400 KHz */ + uint32_t configReg = ( SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit + | SSP_SSP0CR0_FRF_SPI // Frame format = SPI + | SSP_SSP0CR0_SCR_8); // Serial clock rate = 8 + + // Set clock polarity + configReg &= ~SSP_SSP0CR0_CPOL_MASK; // Clock polarity = Low between frames + + // Set edge transition + configReg &= ~SSP_SSP0CR0_CPHA_MASK; // Clock out phase = Leading edge clock transition + + // Assign config values to SSP0CR0 + SSP_SSP0CR0 = configReg; + + /* Clock prescale register must be even and at least 2 in master mode */ + SSP_SSP0CPSR = SSP_SSP0CPSR_CPSDVSR_DIV2; +} + +/**************************************************************************/ +/*! + Set SSP clock to fast (4.0 MHz) +*/ +/**************************************************************************/ +static void FCLK_FAST() +{ + /* Divide by 1 (SSPCLKDIV also enables to SSP CLK) */ + SCB_SSP0CLKDIV = SCB_SSP0CLKDIV_DIV1; + + /* (PCLK / (CPSDVSR × [SCR+1])) = (72,000,000 / (2 x [8 + 1])) = 4.0 MHz */ + uint32_t configReg = ( SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit + | SSP_SSP0CR0_FRF_SPI // Frame format = SPI + | SSP_SSP0CR0_SCR_8); // Serial clock rate = 8 + + // Set clock polarity + configReg &= ~SSP_SSP0CR0_CPOL_MASK; // Clock polarity = Low between frames + + // Set edge transition + configReg &= ~SSP_SSP0CR0_CPHA_MASK; // Clock out phase = Leading edge clock transition + + // Assign config values to SSP0CR0 + SSP_SSP0CR0 = configReg; + + /* Clock prescale register must be even and at least 2 in master mode */ + SSP_SSP0CPSR = SSP_SSP0CPSR_CPSDVSR_DIV2; +} + +/*-----------------------------------------------------------------------*/ +/* Transmit a byte to MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +//#define xmit_spi(dat) (SSPSend((uint8_t*)&(dat), 1)) +static void xmit_spi(BYTE dat) +{ + sspSend(0, (uint8_t*) &dat, 1); +} + + +/*-----------------------------------------------------------------------*/ +/* Receive a byte from MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +BYTE rcvr_spi (void) +{ + BYTE data = 0; + + sspReceive(0, &data, 1); + + return data; +} + +/* Alternative macro to receive data fast */ + +#define rcvr_spi_m(dst) \ + do { \ + sspReceive(0, (uint8_t*)(dst), 1); \ + } while(0) + + + + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +BYTE wait_ready (void) +{ + BYTE res; + + + Timer2 = 50; /* Wait for ready in timeout of 500ms */ + rcvr_spi(); + do + res = rcvr_spi(); + while ((res != 0xFF) && Timer2); + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Deselect the card and release SPI bus */ +/*-----------------------------------------------------------------------*/ + +static +void deselect (void) +{ + CS_HIGH(); + rcvr_spi(); +} + + + +/*-----------------------------------------------------------------------*/ +/* Select the card and wait ready */ +/*-----------------------------------------------------------------------*/ + +static +BOOL select (void) /* TRUE:Successful, FALSE:Timeout */ +{ + CS_LOW(); + if (wait_ready() != 0xFF) { + deselect(); + return FALSE; + } + return TRUE; +} + + + +/*-----------------------------------------------------------------------*/ +/* Power Control (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions and chk_power always returns 1. */ + +static +void power_on (void) +{ +} + +static +void power_off (void) +{ +} + +static +int chk_power(void) /* Socket power state: 0=off, 1=on */ +{ + return 1; +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +BOOL rcvr_datablock ( + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be multiple of 4) */ +) +{ + BYTE token; + + + Timer1 = 20; + do { /* Wait for data packet in timeout of 200ms */ + token = rcvr_spi(); + } while ((token == 0xFF) && Timer1); + if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */ + + do { /* Receive the data block into buffer */ + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + } while (btr -= 4); + rcvr_spi(); /* Discard CRC */ + rcvr_spi(); + + return TRUE; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +static +BOOL xmit_datablock ( + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data/Stop token */ +) +{ + BYTE resp, wc; + + + if (wait_ready() != 0xFF) return FALSE; + + xmit_spi(token); /* Xmit data token */ + if (token != 0xFD) { /* Is data token */ + wc = 0; + do { /* Xmit the 512 byte data block to MMC */ + xmit_spi(*buff++); + xmit_spi(*buff++); + } while (--wc); + xmit_spi(0xFF); /* CRC (Dummy) */ + xmit_spi(0xFF); + resp = rcvr_spi(); /* Reveive data response */ + if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */ + return FALSE; + } + + return TRUE; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (cmd & 0x80) { /* ACMD is the command sequense of CMD55-CMD */ + cmd &= 0x7F; + res = send_cmd(CMD55, 0); + if (res > 1) return res; + } + + /* Select the card and wait for ready */ + deselect(); + if (!select()) return 0xFF; + + /* Send command packet */ + xmit_spi(cmd); /* Start + Command index */ + xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xmit_spi((BYTE)arg); /* Argument[7..0] */ + n = 0x01; /* Dummy CRC + Stop */ + if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */ + xmit_spi(n); + + /* Receive command response */ + if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do + res = rcvr_spi(); + while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + + + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + BYTE n, cmd, ty, ocr[4]; + + gpioSetDir( SSP0_CSPORT, SSP0_CSPIN, 1 ); /* CS */ + gpioSetDir( CFG_SDCARD_CDPORT, CFG_SDCARD_CDPIN, 0 ); /* Card Detect */ + + if (drv) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Force socket power on */ + FCLK_SLOW(); + for (n = 10; n; n--) rcvr_spi(); /* 80 dummy clocks */ + + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 100; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDHC */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); /* Get trailing return value of R7 resp */ + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + while (Timer1 && send_cmd(ACMD41, 1UL << 30)); /* Wait for leaving idle state (ACMD41 with HCS bit) */ + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* SDv2 */ + } + } + } else { /* SDSC or MMC */ + if (send_cmd(ACMD41, 0) <= 1) { + ty = CT_SD1; cmd = ACMD41; /* SDv1 */ + } else { + ty = CT_MMC; cmd = CMD1; /* MMCv3 */ + } + while (Timer1 && send_cmd(cmd, 0)); /* Wait for leaving idle state */ + if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Set R/W block length to 512 */ + ty = 0; + } + } + CardType = ty; + deselect(); + + if (ty) { /* Initialization succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + FCLK_FAST(); + } else { /* Initialization failed */ + power_off(); + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) + count = 0; + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd(CMD12, 0); /* STOP_TRANSMISSION */ + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) + count = 0; + } + else { /* Multiple block write */ + if (CardType & CT_SDC) send_cmd(ACMD23, count); + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */ + count = 1; + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; +} +#endif /* _READONLY == 0 */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +#if _USE_IOCTL != 0 +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + WORD csize; + + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (ctrl == CTRL_POWER) { + switch (*ptr) { + case 0: /* Sub control code == 0 (POWER_OFF) */ + if (chk_power()) + power_off(); /* Power off */ + res = RES_OK; + break; + case 1: /* Sub control code == 1 (POWER_ON) */ + power_on(); /* Power on */ + res = RES_OK; + break; + case 2: /* Sub control code == 2 (POWER_GET) */ + *(ptr+1) = (BYTE)chk_power(); + res = RES_OK; + break; + default : + res = RES_PARERR; + } + } + else { + if (Stat & STA_NOINIT) return RES_NOTRDY; + + switch (ctrl) { + case CTRL_SYNC : /* Make sure that no pending write process. Do not remove this or written sector might not left updated. */ + if (select()) { + res = RES_OK; + deselect(); + } + break; + + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + 1; + *(DWORD*)buff = (DWORD)csize << 10; + } else { /* SDC ver 1.XX or MMC*/ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = (DWORD)csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_SECTOR_SIZE : /* Get R/W sector size (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */ + if (CardType & CT_SD2) { /* SDC ver 2.00 */ + if (send_cmd(ACMD13, 0) == 0) { /* Read SD status */ + rcvr_spi(); + if (rcvr_datablock(csd, 16)) { /* Read partial block */ + for (n = 64 - 16; n; n--) rcvr_spi(); /* Purge trailing data */ + *(DWORD*)buff = 16UL << (csd[10] >> 4); + res = RES_OK; + } + } + } else { /* SDC ver 1.XX or MMC */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { /* Read CSD */ + if (CardType & CT_SD1) { /* SDC ver 1.XX */ + *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1); + } else { /* MMC */ + *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1); + } + res = RES_OK; + } + } + break; + + case MMC_GET_TYPE : /* Get card type flags (1 byte) */ + *ptr = CardType; + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 /* READ_CSD */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 /* READ_CID */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 4; n; n--) *ptr++ = rcvr_spi(); + res = RES_OK; + } + break; + + case MMC_GET_SDSTAT : /* Receive SD statsu as a data block (64 bytes) */ + if (send_cmd(ACMD13, 0) == 0) { /* SD_STATUS */ + rcvr_spi(); + if (rcvr_datablock(ptr, 64)) + res = RES_OK; + } + break; + + default: + res = RES_PARERR; + } + + deselect(); + } + + return res; +} +#endif /* _USE_IOCTL != 0 */ + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Interrupt Procedure (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* This function must be called in period of 10ms */ + +void disk_timerproc (void) +{ + static BYTE pv; + BYTE n, s; + + + n = Timer1; /* 100Hz decrement timer */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + + n = pv; + // pv = SOCKPORT & (SOCKWP | SOCKINS); /* Sample socket switch */ + pv = 0; // gpioGetValue( 0, 1 ); + +// if (n == pv) { /* Have contacts stabled? */ +// s = Stat; +// +// /* write protect NOT supported */ +// +// /* check card detect */ +// if (pv) /* (Socket empty) */ +// s |= (STA_NODISK | STA_NOINIT); +// else /* (Card inserted) */ +// s &= ~STA_NODISK; +// +// Stat = s; +// } +} + + diff --git a/macusbfb/drivers/lcd/drawing.c b/macusbfb/drivers/lcd/drawing.c new file mode 100644 index 0000000..089fd7e --- /dev/null +++ b/macusbfb/drivers/lcd/drawing.c @@ -0,0 +1,688 @@ +/**************************************************************************/ +/*! + @file drawing.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + drawLine and drawCircle adapted from a tutorial by Leonard McMillan: + http://www.cs.unc.edu/~mcmillan/ + + drawString based on an example from Eran Duchan: + http://www.pavius.net/downloads/tools/53-the-dot-factory + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include + +#include "drawing.h" + +/**************************************************************************/ +/* */ +/* ----------------------- Private Methods ------------------------------ */ +/* */ +/**************************************************************************/ + +/**************************************************************************/ +/*! + @brief Draws a single bitmap character +*/ +/**************************************************************************/ +static void drawCharBitmap(const uint16_t xPixel, const uint16_t yPixel, uint16_t color, const uint8_t *glyph, uint8_t glyphHeightPages, uint8_t glyphWidthBits) +{ + uint16_t verticalPage, horizBit, currentY, currentX; + uint16_t indexIntoGlyph; + + // set initial current y + currentY = yPixel; + currentX = xPixel; + + // for each page of the glyph + for (verticalPage = glyphHeightPages; verticalPage > 0; --verticalPage) + { + // for each horizontol bit + for (horizBit = 0; horizBit < glyphWidthBits; ++horizBit) + { + // next byte + indexIntoGlyph = (glyphHeightPages * horizBit) + verticalPage - 1; + + currentX = xPixel + (horizBit); + // send the data byte + if (glyph[indexIntoGlyph] & (0X80)) drawPixel(currentX, currentY, color); + if (glyph[indexIntoGlyph] & (0X40)) drawPixel(currentX, currentY - 1, color); + if (glyph[indexIntoGlyph] & (0X20)) drawPixel(currentX, currentY - 2, color); + if (glyph[indexIntoGlyph] & (0X10)) drawPixel(currentX, currentY - 3, color); + if (glyph[indexIntoGlyph] & (0X08)) drawPixel(currentX, currentY - 4, color); + if (glyph[indexIntoGlyph] & (0X04)) drawPixel(currentX, currentY - 5, color); + if (glyph[indexIntoGlyph] & (0X02)) drawPixel(currentX, currentY - 6, color); + if (glyph[indexIntoGlyph] & (0X01)) drawPixel(currentX, currentY - 7, color); + } + // next line of pages + currentY += 8; + } +} + +#if defined CFG_LCD_INCLUDESMALLFONTS & CFG_LCD_INCLUDESMALLFONTS == 1 +/**************************************************************************/ +/*! + @brief Draws a single smallfont character +*/ +/**************************************************************************/ +static void drawCharSmall(uint16_t x, uint16_t y, uint16_t color, uint8_t c, struct FONT_DEF font) +{ + uint8_t col, column[font.u8Width]; + + // Check if the requested character is available + if ((c >= font.u8FirstChar) && (c <= font.u8LastChar)) + { + // Retrieve appropriate columns from font data + for (col = 0; col < font.u8Width; col++) + { + column[col] = font.au8FontTable[((c - 32) * font.u8Width) + col]; // Get first column of appropriate character + } + } + else + { + // Requested character is not available in this font ... send a space instead + for (col = 0; col < font.u8Width; col++) + { + column[col] = 0xFF; // Send solid space + } + } + + // Render each column + uint16_t xoffset, yoffset; + for (xoffset = 0; xoffset < font.u8Width; xoffset++) + { + for (yoffset = 0; yoffset < (font.u8Height + 1); yoffset++) + { + uint8_t bit = 0x00; + bit = (column[xoffset] << (8 - (yoffset + 1))); // Shift current row bit left + bit = (bit >> 7); // Shift current row but right (results in 0x01 for black, and 0x00 for white) + if (bit) + { + drawPixel(x + xoffset, y + yoffset, color); + } + } + } +} +#endif + +/**************************************************************************/ +/*! + @brief Helper method to accurately draw individual circle points +*/ +/**************************************************************************/ +static void drawCirclePoints(int cx, int cy, int x, int y, uint16_t color) +{ + if (x == 0) + { + drawPixel(cx, cy + y, color); + drawPixel(cx, cy - y, color); + drawPixel(cx + y, cy, color); + drawPixel(cx - y, cy, color); + } + else if (x == y) + { + drawPixel(cx + x, cy + y, color); + drawPixel(cx - x, cy + y, color); + drawPixel(cx + x, cy - y, color); + drawPixel(cx - x, cy - y, color); + } + else if (x < y) + { + drawPixel(cx + x, cy + y, color); + drawPixel(cx - x, cy + y, color); + drawPixel(cx + x, cy - y, color); + drawPixel(cx - x, cy - y, color); + drawPixel(cx + y, cy + x, color); + drawPixel(cx - y, cy + x, color); + drawPixel(cx + y, cy - x, color); + drawPixel(cx - y, cy - x, color); + } +} + +/**************************************************************************/ +/* */ +/* ----------------------- Public Methods ------------------------------- */ +/* */ +/**************************************************************************/ + +/**************************************************************************/ +/*! + @brief Draws a single pixel at the specified location + + @param[in] x + Horizontal position + @param[in] y + Vertical position + @param[in] color + Color used when drawing +*/ +/**************************************************************************/ +void drawPixel(uint16_t x, uint16_t y, uint16_t color) +{ + // Redirect to LCD + lcdDrawPixel(x, y, color); +} + +/**************************************************************************/ +/*! + @brief Fills the screen with the specified color + + @param[in] color + Color used when drawing +*/ +/**************************************************************************/ +void drawFill(uint16_t color) +{ + lcdFillRGB(color); +} + +/**************************************************************************/ +/*! + @brief Draws a simple color test pattern +*/ +/**************************************************************************/ +void drawTestPattern(void) +{ + lcdTest(); +} + +#if defined CFG_LCD_INCLUDESMALLFONTS & CFG_LCD_INCLUDESMALLFONTS == 1 +/**************************************************************************/ +/*! + @brief Draws a string using a small font (6 of 8 pixels high). + + @param[in] x + Starting x co-ordinate + @param[in] y + Starting y co-ordinate + @param[in] color + Color to use when rendering the font + @param[in] text + The string to render + @param[in] font + Pointer to the FONT_DEF to use when drawing the string + + @section Example + + @code + + #include "drivers/lcd/fonts/smallfonts.h" + + drawStringSmall(1, 210, WHITE, "5x8 System (Max 40 Characters)", Font_System5x8); + drawStringSmall(1, 220, WHITE, "7x8 System (Max 30 Characters)", Font_System7x8); + + @endcode +*/ +/**************************************************************************/ +void drawStringSmall(uint16_t x, uint16_t y, uint16_t color, char* text, struct FONT_DEF font) +{ + uint8_t l; + for (l = 0; l < strlen(text); l++) + { + drawCharSmall(x + (l * (font.u8Width + 1)), y, color, text[l], font); + } +} +#endif + +/**************************************************************************/ +/*! + @brief Draws a string using the supplied font + + @param[in] x + Starting x co-ordinate + @param[in] y + Starting y co-ordinate + @param[in] color + Color to use when rendering the font + @param[in] fontInfo + Pointer to the FONT_INFO to use when drawing the string + @param[in] str + The string to render + + @section Example + + @code + + #include "drivers/lcd/fonts/consolas9.h" + + drawString(1, 90, GREEN, &consolas9ptFontInfo, "Consolas 9 (38 chars wide)"); + drawString(1, 105, GREEN, &consolas9ptFontInfo, "12345678901234567890123456789012345678"); + + @endcode +*/ +/**************************************************************************/ +void drawString(uint16_t x, uint16_t y, uint16_t color, const FONT_INFO *fontInfo, char *str) +{ + uint16_t currentX, charWidth, characterToOutput; + const FONT_CHAR_INFO *charInfo; + uint16_t charOffset; + + // set current x, y to that of requested + currentX = x; + + // while not NULL + while (*str != 0) + { + // get character to output + characterToOutput = *str; + + // get char info + charInfo = fontInfo->charInfo; + + // some fonts have character descriptors, some don't + if (charInfo != NULL) + { + // get correct char offset + charInfo += (characterToOutput - fontInfo->startChar); + + // get width from char info + charWidth = charInfo->widthBits; + + // get offset from char info + charOffset = charInfo->offset; + } + else + { + // if no char info, char width is always 5 + charWidth = 5; + + // char offset - assume 5 * letter offset + charOffset = (characterToOutput - fontInfo->startChar) * 5; + } + + // Send individual characters + drawCharBitmap(currentX, y, color, &fontInfo->data[charOffset], fontInfo->heightPages, charWidth); + + // next char X + currentX += charWidth + 1; + + // next char + str++; + } +} + +/**************************************************************************/ +/*! + @brief Returns the width in pixels of a string when it is rendered + + This method can be used to determine whether a string will fit + inside a specific area, or if it needs to be broken up into multiple + lines to be properly rendered on the screen. + + This function only applied to bitmap fonts (which can have variable + widths). All smallfonts (if available) are fixed width and can + easily have their width calculated without costly functions like + this one. + + @param[in] fontInfo + Pointer to the FONT_INFO for the font that will be used + @param[in] str + The string that will be rendered +*/ +/**************************************************************************/ +uint32_t drawGetStringWidth(const FONT_INFO *fontInfo, char *str) +{ + uint32_t currChar, width = 0; + uint32_t startChar = fontInfo->startChar; + + // until termination + for (currChar = *str; currChar; currChar = *(++str)) + { + // if char info exists for the font, use width from there + if (fontInfo->charInfo != NULL) + { + width += fontInfo->charInfo[currChar - startChar].widthBits + 1; + } + else + { + width += 5 + 1; + } + } + + /* return the wdith */ + return width; +} + +/**************************************************************************/ +/*! + @brief Draws a Bresenham line + + Based on: http://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html + + @param[in] x0 + Starting x co-ordinate + @param[in] y0 + Starting y co-ordinate + @param[in] x1 + Ending x co-ordinate + @param[in] y1 + Ending y co-ordinate + @param[in] color + Color used when drawing +*/ +/**************************************************************************/ +void drawLine ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color ) +{ + // Check if we can used the optimised horizontal line method + if (y0 == y1) + { + lcdDrawHLine(x0, x1, y0, color); + return; + } + + // Draw non horizontal line + int dy = y1 - y0; + int dx = x1 - x0; + int stepx, stepy; + + if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } + if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } + dy <<= 1; // dy is now 2*dy + dx <<= 1; // dx is now 2*dx + + drawPixel(x0, y0, color); + if (dx > dy) + { + int fraction = dy - (dx >> 1); // same as 2*dy - dx + while (x0 != x1) + { + if (fraction >= 0) + { + y0 += stepy; + fraction -= dx; // same as fraction -= 2*dx + } + x0 += stepx; + fraction += dy; // same as fraction -= 2*dy + drawPixel(x0, y0, color); + } + } + else + { + int fraction = dx - (dy >> 1); + while (y0 != y1) + { + if (fraction >= 0) + { + x0 += stepx; + fraction -= dy; + } + y0 += stepy; + fraction += dx; + drawPixel(x0, y0, color); + } + } +} + +/**************************************************************************/ +/*! + @brief Draws a circle + + Based on: http://www.cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html + + @param[in] xCenter + The horizontal center of the circle + @param[in] yCenter + The vertical center of the circle + @param[in] radius + The circle's radius in pixels + @param[in] color + Color used when drawing +*/ +/**************************************************************************/ +void drawCircle (uint16_t xCenter, uint16_t yCenter, uint16_t radius, uint16_t color) +{ + int x = 0; + int y = radius; + int p = (5 - radius*4)/4; + + drawCirclePoints(xCenter, yCenter, x, y, color); + while (x < y) + { + x++; + if (p < 0) + { + p += 2*x+1; + } + else + { + y--; + p += 2*(x-y)+1; + } + drawCirclePoints(xCenter, yCenter, x, y, color); + } +} + +/**************************************************************************/ +/*! + @brief Draws a simple (empty) rectangle + + @param[in] x0 + Starting x co-ordinate + @param[in] y0 + Starting y co-ordinate + @param[in] x1 + Ending x co-ordinate + @param[in] y1 + Ending y co-ordinate + @param[in] color + Color used when drawing +*/ +/**************************************************************************/ +void drawRectangle ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) +{ + uint16_t x, y; + + if (y1 < y0) + { + // Swich y1 and y0 + y = y1; + y1 = y0; + y0 = y; + } + + if (x1 < x0) + { + // Swich x1 and x0 + x = x1; + x1 = x0; + x0 = x; + } + + drawLine (x0, y0, x1, y0, color); + drawLine (x1, y0, x1, y1, color); + drawLine (x1, y1, x0, y1, color); + drawLine (x0, y1, x0, y0, color); +} + +/**************************************************************************/ +/*! + @brief Draws a filled rectangle + + @param[in] x0 + Starting x co-ordinate + @param[in] y0 + Starting y co-ordinate + @param[in] x1 + Ending x co-ordinate + @param[in] y1 + Ending y co-ordinate + @param[in] color + Color used when drawing +*/ +/**************************************************************************/ +void drawRectangleFilled ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) +{ + int height; + uint16_t x, y; + + if (y1 < y0) + { + // Swich y1 and y0 + y = y1; + y1 = y0; + y0 = y; + } + + if (x1 < x0) + { + // Swich x1 and x0 + x = x1; + x1 = x0; + x0 = x; + } + + height = y1 - y0; + for (height = y0; y1 > height - 1; ++height) + { + drawLine(x0, height, x1, height, color); + } +} + +/**************************************************************************/ +/*! + @brief Converts a 24-bit RGB color to an equivalent 16-bit RGB565 value + + @param[in] r + 8-bit red + @param[in] g + 8-bit green + @param[in] b + 8-bit blue + + @section Example + + @code + + // Get 16-bit equivalent of 24-bit color + uint16_t gray = drawRGB24toRGB565(0x33, 0x33, 0x33); + + @endcode +*/ +/**************************************************************************/ +uint16_t drawRGB24toRGB565(uint8_t r, uint8_t g, uint8_t b) +{ + return ((r / 8) << 11) | ((g / 4) << 5) | (b / 8); +} + +/**************************************************************************/ +/*! + @brief Draws a progress bar with rounded corners + + @param[in] x + Starting x location + @param[in] y + Starting y location + @param[in] width + Total width of the progress bar in pixels + @param[in] borderColor + 16-bit color for the outer border + @param[in] fillColor + 16-bit color for the outer border fill + @param[in] barBorderColor + 16-bit color for the inner bar's border + @param[in] barFillColor + 16-bit color for the inner bar's fill + @param[in] progress + Progress percentage (between 0 and 100) + + @section Example + + @code + + // Get 16-bit equivalent of 24-bit color + uint16_t gray = drawRGB24toRGB565(0x33, 0x33, 0x33); + + // Draw a the progress bar + drawProgressBar(10, 200, 100, 20, WHITE, gray, WHITE, BLUE, 90); + + @endcode +*/ +/**************************************************************************/ +void drawProgressBar ( uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t borderColor, uint16_t fillColor, uint16_t barBorderColor, uint16_t barFillColor, uint8_t progress ) +{ + // Draw border with rounded corners + drawLine(x+2, y, x + width - 2, y, borderColor); + drawLine(x + width, y + 2, x + width, y + height - 2, borderColor); + drawLine(x + width - 2, y + height, x + 2, y + height, borderColor); + drawLine(x, y + height - 2, x, y + 2, borderColor); + drawPixel(x + 1, y + 1, borderColor); + drawPixel(x + width - 1, y + 1, borderColor); + drawPixel(x + 1, y + height - 1, borderColor); + drawPixel(x + width - 1, y + height - 1, borderColor); + + // Fill outer container + drawLine(x+1, y+2, x+1, y+height-2, fillColor); + drawLine(x+2, y+height-1, x+width-2, y+height-1, fillColor); + drawLine(x+width-1, y+height-2, x+width-1, y+2, fillColor); + drawLine(x+width-2, y+1, x+2, y+1, fillColor); + drawRectangleFilled(x+2, y+2, x+width-2, y+height-2, fillColor); + + // Progress bar + if (progress > 0 && progress <= 100) + { + // Calculate bar size + uint16_t bw; + bw = (width - 6); // bar at 100% + if (progress != 100) + { + bw = (bw * progress) / 100; + } + drawRectangle(x + 3, y + 3, bw + x + 3, y + height - 3, barBorderColor); + drawRectangleFilled(x + 4, y + 4, bw + x + 3 - 1, y + height - 4, barFillColor); + } +} + +#ifdef CFG_SDCARD +/**************************************************************************/ +/*! + @brief Loads an image from an SD card and renders it +*/ +/**************************************************************************/ +void drawImageFromFile(uint16_t x, uint16_t y, char *filename) +{ + lcdDrawImageFromFile(x, y, filename); +} +#endif + +/**************************************************************************/ +/*! + @brief Renders a bitmap image +*/ +/**************************************************************************/ +void drawImage(uint16_t x, uint16_t y, uint16_t *data) +{ + lcdDrawImage(x, y, data); +} + + diff --git a/macusbfb/drivers/lcd/drawing.h b/macusbfb/drivers/lcd/drawing.h new file mode 100644 index 0000000..f318583 --- /dev/null +++ b/macusbfb/drivers/lcd/drawing.h @@ -0,0 +1,70 @@ +/**************************************************************************/ +/*! + @file drawing.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#ifndef __DRAWING_H__ +#define __DRAWING_H__ + +#include "projectconfig.h" +#include "lcd.h" +#include "drivers/lcd/fonts/bitmapfonts.h" + +#if defined CFG_LCD_INCLUDESMALLFONTS & CFG_LCD_INCLUDESMALLFONTS == 1 + #include "drivers/lcd/fonts/smallfonts.h" +#endif + +void drawTestPattern ( void ); +void drawPixel ( uint16_t x, uint16_t y, uint16_t color ); +void drawFill ( uint16_t color ); +void drawString ( uint16_t x, uint16_t y, uint16_t color, const FONT_INFO *fontInfo, char *str ); +void drawLine ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color ); +void drawCircle ( uint16_t xCenter, uint16_t yCenter, uint16_t radius, uint16_t color ); +void drawRectangle ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color); +void drawRectangleFilled ( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color); +void drawImage ( uint16_t x, uint16_t y, uint16_t *data ); +void drawProgressBar ( uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t borderColor, uint16_t fillColor, uint16_t barBorderColor, uint16_t barFillColor, uint8_t progress ); +uint32_t drawGetStringWidth ( const FONT_INFO *fontInfo, char *str ); +uint16_t drawRGB24toRGB565 ( uint8_t r, uint8_t g, uint8_t b ); + +#if defined CFG_LCD_INCLUDESMALLFONTS & CFG_LCD_INCLUDESMALLFONTS == 1 +void drawStringSmall ( uint16_t x, uint16_t y, uint16_t color, char* text, struct FONT_DEF font ); +#endif + +#if defined CFG_SDCARD +void drawImageFromFile ( uint16_t x, uint16_t y, char *filename ); +#endif + +#endif diff --git a/macusbfb/drivers/lcd/fonts/DotFactorySettings.png b/macusbfb/drivers/lcd/fonts/DotFactorySettings.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d87c5dd2300bdefd678df5aad8f81b38466c8e GIT binary patch literal 34083 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

    `Dvu45{TwXnm{ZMkRv8)QapFfYNc_M~J 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 JN}pJK_&+;m5di=I literal 0 HcmV?d00001 diff --git a/macusbfb/drivers/lcd/fonts/bitmapfonts.h b/macusbfb/drivers/lcd/fonts/bitmapfonts.h new file mode 100644 index 0000000..fd6a328 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/bitmapfonts.h @@ -0,0 +1,68 @@ +/**************************************************************************/ +/*! + @file bitmapfonts.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#ifndef __BITMAPFONTS_H__ +#define __BITMAPFONTS_H__ + +#include "projectconfig.h" + +/**************************************************************************/ +/*! + @brief Describes a single character's display information +*/ +/**************************************************************************/ +typedef struct +{ + const uint8_t widthBits; // width, in bits (or pixels), of the character + const uint16_t offset; // offset of the character's bitmap, in bytes, into the the FONT_INFO's data array +} FONT_CHAR_INFO; + +/**************************************************************************/ +/*! + @brief Describes a single font +*/ +/**************************************************************************/ +typedef struct +{ + const uint8_t heightPages; // height, in pages (8 pixels), of the font's characters + const uint8_t startChar; // the first character in the font (e.g. in charInfo and data) + const FONT_CHAR_INFO* charInfo; // pointer to array of char information + const uint8_t* data; // pointer to generated array of character visual representation +} FONT_INFO; + +#endif + diff --git a/macusbfb/drivers/lcd/fonts/consolas11.c b/macusbfb/drivers/lcd/fonts/consolas11.c new file mode 100644 index 0000000..ac588d7 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/consolas11.c @@ -0,0 +1,895 @@ +/**************************************************************************/ +/*! + @file consolas11.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include "consolas11.h" + +/* +** Font data for Consolas 11pt +*/ + +/* Character bitmaps for Consolas 11pt */ +const uint8_t consolas11ptCharBitmaps[] = +{ + /* @0 ' ' (2 pixels wide) */ + 0x00, 0x00, /* */ + 0x00, 0x00, /* */ + + /* @4 '!' (2 pixels wide) */ + 0x1B, 0xF8, /* ## ####### */ + 0x18, 0x00, /* ## */ + + /* @8 '"' (5 pixels wide) */ + 0x00, 0x38, /* ### */ + 0x00, 0x38, /* ### */ + 0x00, 0x00, /* */ + 0x00, 0x38, /* ### */ + 0x00, 0x38, /* ### */ + + /* @18 '#' (8 pixels wide) */ + 0x02, 0x40, /* # # */ + 0x1F, 0x40, /* ##### # */ + 0x02, 0xF8, /* # ##### */ + 0x02, 0x40, /* # # */ + 0x02, 0x40, /* # # */ + 0x1F, 0x40, /* ##### # */ + 0x02, 0xF8, /* # ##### */ + 0x02, 0x40, /* # # */ + + /* @34 '$' (6 pixels wide) */ + 0x10, 0x70, /* # ### */ + 0x10, 0x88, /* # # # */ + 0x7F, 0xC8, /* ######### # */ + 0x11, 0x3C, /* # # #### */ + 0x19, 0x08, /* ## # # */ + 0x0E, 0x00, /* ### */ + + /* @46 '%' (8 pixels wide) */ + 0x10, 0x30, /* # ## */ + 0x18, 0x48, /* ## # # */ + 0x06, 0x48, /* ## # # */ + 0x03, 0x30, /* ## ## */ + 0x0C, 0x80, /* ## # */ + 0x12, 0x60, /* # # ## */ + 0x12, 0x10, /* # # # */ + 0x0C, 0x08, /* ## # */ + + /* @62 '&' (8 pixels wide) */ + 0x0E, 0x00, /* ### */ + 0x19, 0x70, /* ## # ### */ + 0x10, 0xC8, /* # ## # */ + 0x11, 0x88, /* # ## # */ + 0x16, 0x48, /* # ## # # */ + 0x0C, 0x70, /* ## ### */ + 0x1F, 0x00, /* ##### */ + 0x10, 0x00, /* # */ + + /* @78 ''' (2 pixels wide) */ + 0x00, 0x38, /* ### */ + 0x00, 0x38, /* ### */ + + /* @82 '(' (4 pixels wide) */ + 0x0F, 0xC0, /* ###### */ + 0x30, 0x30, /* ## ## */ + 0x40, 0x08, /* # # */ + 0x80, 0x04, /* # # */ + + /* @90 ')' (4 pixels wide) */ + 0x80, 0x04, /* # # */ + 0x40, 0x08, /* # # */ + 0x30, 0x30, /* ## ## */ + 0x0F, 0xC0, /* ###### */ + + /* @98 '*' (5 pixels wide) */ + 0x00, 0x90, /* # # */ + 0x00, 0x60, /* ## */ + 0x01, 0xF8, /* ###### */ + 0x00, 0x60, /* ## */ + 0x00, 0x90, /* # # */ + + /* @108 '+' (7 pixels wide) */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x1F, 0xC0, /* ####### */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + + /* @122 ',' (3 pixels wide) */ + 0x80, 0x00, /* # */ + 0xD8, 0x00, /* ## ## */ + 0x78, 0x00, /* #### */ + + /* @128 '-' (4 pixels wide) */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + + /* @136 '.' (2 pixels wide) */ + 0x18, 0x00, /* ## */ + 0x18, 0x00, /* ## */ + + /* @140 '/' (6 pixels wide) */ + 0x40, 0x00, /* # */ + 0x38, 0x00, /* ### */ + 0x0E, 0x00, /* ### */ + 0x03, 0x80, /* ### */ + 0x00, 0x70, /* ### */ + 0x00, 0x18, /* ## */ + + /* @152 '0' (7 pixels wide) */ + 0x07, 0xE0, /* ###### */ + 0x0A, 0x10, /* # # # */ + 0x11, 0x08, /* # # # */ + 0x11, 0x88, /* # ## # */ + 0x10, 0x88, /* # # # */ + 0x08, 0x50, /* # # # */ + 0x07, 0xE0, /* ###### */ + + /* @166 '1' (6 pixels wide) */ + 0x10, 0x20, /* # # */ + 0x10, 0x10, /* # # */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + + /* @178 '2' (6 pixels wide) */ + 0x10, 0x10, /* # # */ + 0x18, 0x08, /* ## # */ + 0x14, 0x08, /* # # # */ + 0x12, 0x08, /* # # # */ + 0x11, 0x18, /* # # ## */ + 0x10, 0xF0, /* # #### */ + + /* @190 '3' (6 pixels wide) */ + 0x10, 0x08, /* # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x09, 0xC8, /* # ### # */ + 0x07, 0x70, /* ### ### */ + + /* @202 '4' (8 pixels wide) */ + 0x06, 0x00, /* ## */ + 0x07, 0x00, /* ### */ + 0x04, 0xC0, /* # ## */ + 0x04, 0x60, /* # ## */ + 0x04, 0x18, /* # ## */ + 0x1F, 0xF8, /* ########## */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + + /* @218 '5' (5 pixels wide) */ + 0x10, 0xF8, /* # ##### */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x09, 0x88, /* # ## # */ + 0x0F, 0x08, /* #### # */ + + /* @228 '6' (6 pixels wide) */ + 0x07, 0xE0, /* ###### */ + 0x19, 0x10, /* ## # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x18, 0x88, /* ## # # */ + 0x0F, 0x00, /* #### */ + + /* @240 '7' (6 pixels wide) */ + 0x00, 0x08, /* # */ + 0x18, 0x08, /* ## # */ + 0x0E, 0x08, /* ### # */ + 0x03, 0x88, /* ### # */ + 0x00, 0xF8, /* ##### */ + 0x00, 0x18, /* ## */ + + /* @252 '8' (6 pixels wide) */ + 0x0E, 0x70, /* ### ### */ + 0x19, 0x48, /* ## # # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x11, 0x48, /* # # # # */ + 0x0E, 0x70, /* ### ### */ + + /* @264 '9' (6 pixels wide) */ + 0x00, 0xF0, /* #### */ + 0x11, 0x18, /* # # ## */ + 0x11, 0x08, /* # # # */ + 0x11, 0x08, /* # # # */ + 0x08, 0x98, /* # # ## */ + 0x07, 0xE0, /* ###### */ + + /* @276 ':' (2 pixels wide) */ + 0x18, 0xC0, /* ## ## */ + 0x18, 0xC0, /* ## ## */ + + /* @280 ';' (3 pixels wide) */ + 0x80, 0x00, /* # */ + 0xD8, 0xC0, /* ## ## ## */ + 0x78, 0xC0, /* #### ## */ + + /* @286 '<' (5 pixels wide) */ + 0x03, 0x00, /* ## */ + 0x07, 0x80, /* #### */ + 0x0C, 0xC0, /* ## ## */ + 0x08, 0x40, /* # # */ + 0x10, 0x20, /* # # */ + + /* @296 '=' (6 pixels wide) */ + 0x02, 0x80, /* # # */ + 0x02, 0x80, /* # # */ + 0x02, 0x80, /* # # */ + 0x02, 0x80, /* # # */ + 0x02, 0x80, /* # # */ + 0x02, 0x80, /* # # */ + + /* @308 '>' (5 pixels wide) */ + 0x10, 0x20, /* # # */ + 0x08, 0x40, /* # # */ + 0x0C, 0xC0, /* ## ## */ + 0x07, 0x80, /* #### */ + 0x03, 0x00, /* ## */ + + /* @318 '?' (4 pixels wide) */ + 0x1B, 0x08, /* ## ## # */ + 0x19, 0x08, /* ## # # */ + 0x01, 0x10, /* # # */ + 0x00, 0xE0, /* ### */ + + /* @326 '@' (8 pixels wide) */ + 0x3F, 0x80, /* ####### */ + 0x40, 0x60, /* # ## */ + 0x9F, 0x10, /* # ##### # */ + 0x91, 0x88, /* # # ## # */ + 0x90, 0x88, /* # # # # */ + 0xDF, 0x88, /* ## ###### # */ + 0x10, 0x10, /* # # */ + 0x0F, 0xE0, /* ####### */ + + /* @342 'A' (7 pixels wide) */ + 0x1C, 0x00, /* ### */ + 0x07, 0x80, /* #### */ + 0x04, 0x78, /* # #### */ + 0x04, 0x08, /* # # */ + 0x04, 0x78, /* # #### */ + 0x07, 0xC0, /* ##### */ + 0x1C, 0x00, /* ### */ + + /* @356 'B' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x19, 0xC8, /* ## ### # */ + 0x0F, 0x70, /* #### ### */ + + /* @368 'C' (6 pixels wide) */ + 0x07, 0xE0, /* ###### */ + 0x08, 0x10, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x08, 0x10, /* # # */ + + /* @380 'D' (7 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x18, 0x08, /* ## # */ + 0x0C, 0x10, /* ## # */ + 0x07, 0xE0, /* ###### */ + + /* @394 'E' (5 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + + /* @404 'F' (5 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x01, 0x08, /* # # */ + 0x01, 0x08, /* # # */ + 0x01, 0x08, /* # # */ + 0x01, 0x08, /* # # */ + + /* @414 'G' (7 pixels wide) */ + 0x07, 0xC0, /* ##### */ + 0x0C, 0x30, /* ## ## */ + 0x18, 0x18, /* ## ## */ + 0x10, 0x08, /* # # */ + 0x11, 0x08, /* # # # */ + 0x11, 0x08, /* # # # */ + 0x1F, 0x10, /* ##### # */ + + /* @428 'H' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x00, 0x80, /* # */ + 0x00, 0x80, /* # */ + 0x00, 0x80, /* # */ + 0x00, 0x80, /* # */ + 0x1F, 0xF8, /* ########## */ + + /* @440 'I' (5 pixels wide) */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + + /* @450 'J' (5 pixels wide) */ + 0x08, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x0F, 0xF8, /* ######### */ + + /* @460 'K' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x01, 0x80, /* ## */ + 0x03, 0xC0, /* #### */ + 0x06, 0x60, /* ## ## */ + 0x08, 0x10, /* # # */ + 0x10, 0x08, /* # # */ + + /* @472 'L' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + + /* @484 'M' (7 pixels wide) */ + 0x1F, 0xF0, /* ######### */ + 0x00, 0x18, /* ## */ + 0x03, 0xE0, /* ##### */ + 0x03, 0x80, /* ### */ + 0x00, 0x70, /* ### */ + 0x00, 0x08, /* # */ + 0x1F, 0xF8, /* ########## */ + + /* @498 'N' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x00, 0x38, /* ### */ + 0x00, 0xC0, /* ## */ + 0x07, 0x00, /* ### */ + 0x18, 0x00, /* ## */ + 0x1F, 0xF8, /* ########## */ + + /* @510 'O' (8 pixels wide) */ + 0x07, 0xE0, /* ###### */ + 0x08, 0x30, /* # ## */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x0C, 0x10, /* ## # */ + 0x07, 0xE0, /* ###### */ + + /* @526 'P' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x01, 0x08, /* # # */ + 0x01, 0x08, /* # # */ + 0x01, 0x08, /* # # */ + 0x00, 0x98, /* # ## */ + 0x00, 0xF0, /* #### */ + + /* @538 'Q' (7 pixels wide) */ + 0x07, 0xE0, /* ###### */ + 0x08, 0x10, /* # # */ + 0x10, 0x08, /* # # */ + 0x70, 0x08, /* ### # */ + 0x90, 0x08, /* # # # */ + 0x88, 0x10, /* # # # */ + 0xC7, 0xE0, /* ## ###### */ + + /* @552 'R' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x00, 0x88, /* # # */ + 0x01, 0x88, /* ## # */ + 0x07, 0x88, /* #### # */ + 0x1C, 0x70, /* ### ### */ + 0x10, 0x00, /* # */ + + /* @564 'S' (6 pixels wide) */ + 0x10, 0x70, /* # ### */ + 0x10, 0x88, /* # # # */ + 0x10, 0x88, /* # # # */ + 0x11, 0x88, /* # ## # */ + 0x11, 0x08, /* # # # */ + 0x0E, 0x00, /* ### */ + + /* @576 'T' (7 pixels wide) */ + 0x00, 0x08, /* # */ + 0x00, 0x08, /* # */ + 0x00, 0x08, /* # */ + 0x1F, 0xF8, /* ########## */ + 0x00, 0x08, /* # */ + 0x00, 0x08, /* # */ + 0x00, 0x08, /* # */ + + /* @590 'U' (6 pixels wide) */ + 0x0F, 0xF8, /* ######### */ + 0x18, 0x00, /* ## */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x18, 0x00, /* ## */ + 0x0F, 0xF8, /* ######### */ + + /* @602 'V' (7 pixels wide) */ + 0x00, 0x38, /* ### */ + 0x03, 0xE0, /* ##### */ + 0x1F, 0x00, /* ##### */ + 0x10, 0x00, /* # */ + 0x0F, 0x00, /* #### */ + 0x01, 0xE0, /* #### */ + 0x00, 0x38, /* ### */ + + /* @616 'W' (8 pixels wide) */ + 0x00, 0xF8, /* ##### */ + 0x1F, 0x80, /* ###### */ + 0x18, 0x00, /* ## */ + 0x07, 0x80, /* #### */ + 0x03, 0xC0, /* #### */ + 0x1C, 0x00, /* ### */ + 0x1F, 0x80, /* ###### */ + 0x00, 0xF8, /* ##### */ + + /* @632 'X' (8 pixels wide) */ + 0x10, 0x08, /* # # */ + 0x18, 0x18, /* ## ## */ + 0x0E, 0x60, /* ### ## */ + 0x03, 0xC0, /* #### */ + 0x03, 0xC0, /* #### */ + 0x0E, 0x60, /* ### ## */ + 0x18, 0x18, /* ## ## */ + 0x10, 0x08, /* # # */ + + /* @648 'Y' (7 pixels wide) */ + 0x00, 0x08, /* # */ + 0x00, 0x30, /* ## */ + 0x00, 0xC0, /* ## */ + 0x1F, 0x00, /* ##### */ + 0x00, 0xC0, /* ## */ + 0x00, 0x30, /* ## */ + 0x00, 0x08, /* # */ + + /* @662 'Z' (7 pixels wide) */ + 0x10, 0x08, /* # # */ + 0x1C, 0x08, /* ### # */ + 0x16, 0x08, /* # ## # */ + 0x11, 0x88, /* # ## # */ + 0x10, 0x68, /* # ## # */ + 0x10, 0x38, /* # ### */ + 0x00, 0x08, /* # */ + + /* @676 '[' (3 pixels wide) */ + 0xFF, 0xFC, /* ############## */ + 0x80, 0x04, /* # # */ + 0x80, 0x04, /* # # */ + + /* @682 '\' (6 pixels wide) */ + 0x00, 0x08, /* # */ + 0x00, 0x70, /* ### */ + 0x01, 0xC0, /* ### */ + 0x07, 0x00, /* ### */ + 0x38, 0x00, /* ### */ + 0x60, 0x00, /* ## */ + + /* @694 ']' (3 pixels wide) */ + 0x80, 0x04, /* # # */ + 0x80, 0x04, /* # # */ + 0xFF, 0xFC, /* ############## */ + + /* @700 '^' (5 pixels wide) */ + 0x00, 0xC0, /* ## */ + 0x00, 0x30, /* ## */ + 0x00, 0x08, /* # */ + 0x00, 0x30, /* ## */ + 0x00, 0xC0, /* ## */ + + /* @710 '_' (8 pixels wide) */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + + /* @726 '`' (3 pixels wide) */ + 0x00, 0x08, /* # */ + 0x00, 0x18, /* ## */ + 0x00, 0x10, /* # */ + + /* @732 'a' (6 pixels wide) */ + 0x0C, 0x00, /* ## */ + 0x12, 0x80, /* # # # */ + 0x12, 0x40, /* # # # */ + 0x12, 0x40, /* # # # */ + 0x0A, 0x40, /* # # # */ + 0x1F, 0x80, /* ###### */ + + /* @744 'b' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x80, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x08, 0xC0, /* # ## */ + 0x07, 0x80, /* #### */ + + /* @756 'c' (6 pixels wide) */ + 0x0F, 0x00, /* #### */ + 0x08, 0x80, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + + /* @768 'd' (6 pixels wide) */ + 0x0F, 0x00, /* #### */ + 0x18, 0x80, /* ## # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x08, 0x40, /* # # */ + 0x1F, 0xF8, /* ########## */ + + /* @780 'e' (6 pixels wide) */ + 0x0F, 0x80, /* ##### */ + 0x1A, 0xC0, /* ## # ## */ + 0x12, 0x40, /* # # # */ + 0x12, 0x40, /* # # # */ + 0x12, 0xC0, /* # # ## */ + 0x13, 0x80, /* # ### */ + + /* @792 'f' (6 pixels wide) */ + 0x00, 0x80, /* # */ + 0x00, 0x80, /* # */ + 0x1F, 0xF0, /* ######### */ + 0x00, 0x88, /* # # */ + 0x00, 0x88, /* # # */ + 0x00, 0x08, /* # */ + + /* @804 'g' (7 pixels wide) */ + 0x7F, 0x80, /* ######## */ + 0x94, 0x40, /* # # # # */ + 0x94, 0x40, /* # # # # */ + 0x94, 0x40, /* # # # # */ + 0x94, 0x40, /* # # # # */ + 0x93, 0xC0, /* # # #### */ + 0x60, 0x40, /* ## # */ + + /* @818 'h' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x00, 0x80, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x1F, 0x80, /* ###### */ + + /* @830 'i' (6 pixels wide) */ + 0x10, 0x40, /* # # */ + 0x10, 0x58, /* # # ## */ + 0x1F, 0xD8, /* ####### ## */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + + /* @842 'j' (5 pixels wide) */ + 0x40, 0x40, /* # # */ + 0x80, 0x40, /* # # */ + 0x80, 0x40, /* # # */ + 0xC0, 0x58, /* ## # ## */ + 0x7F, 0xD8, /* ######### ## */ + + /* @852 'k' (6 pixels wide) */ + 0x1F, 0xF8, /* ########## */ + 0x02, 0x00, /* # */ + 0x05, 0x00, /* # # */ + 0x0C, 0x80, /* ## # */ + 0x18, 0xC0, /* ## ## */ + 0x10, 0x40, /* # # */ + + /* @864 'l' (6 pixels wide) */ + 0x10, 0x08, /* # # */ + 0x10, 0x08, /* # # */ + 0x1F, 0xF8, /* ########## */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + + /* @876 'm' (7 pixels wide) */ + 0x1F, 0xC0, /* ####### */ + 0x00, 0xC0, /* ## */ + 0x00, 0x40, /* # */ + 0x1F, 0xC0, /* ####### */ + 0x00, 0xC0, /* ## */ + 0x00, 0x40, /* # */ + 0x1F, 0xC0, /* ####### */ + + /* @890 'n' (6 pixels wide) */ + 0x1F, 0xC0, /* ####### */ + 0x00, 0x80, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x1F, 0x80, /* ###### */ + + /* @902 'o' (7 pixels wide) */ + 0x0F, 0x00, /* #### */ + 0x18, 0x80, /* ## # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x08, 0xC0, /* # ## */ + 0x07, 0x80, /* #### */ + + /* @916 'p' (6 pixels wide) */ + 0xFF, 0xC0, /* ########## */ + 0x10, 0x80, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x08, 0xC0, /* # ## */ + 0x07, 0x80, /* #### */ + + /* @928 'q' (6 pixels wide) */ + 0x0F, 0x00, /* #### */ + 0x18, 0x80, /* ## # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x08, 0x40, /* # # */ + 0xFF, 0xC0, /* ########## */ + + /* @940 'r' (6 pixels wide) */ + 0x1F, 0xC0, /* ####### */ + 0x00, 0x80, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x01, 0x80, /* ## */ + + /* @952 's' (5 pixels wide) */ + 0x11, 0x80, /* # ## */ + 0x12, 0x40, /* # # # */ + 0x12, 0x40, /* # # # */ + 0x12, 0x40, /* # # # */ + 0x0C, 0x40, /* ## # */ + + /* @962 't' (7 pixels wide) */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x0F, 0xF0, /* ######## */ + 0x18, 0x40, /* ## # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + 0x10, 0x40, /* # # */ + + /* @976 'u' (6 pixels wide) */ + 0x0F, 0xC0, /* ###### */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x10, 0x00, /* # */ + 0x08, 0x00, /* # */ + 0x1F, 0xC0, /* ####### */ + + /* @988 'v' (7 pixels wide) */ + 0x00, 0xC0, /* ## */ + 0x03, 0x80, /* ### */ + 0x1C, 0x00, /* ### */ + 0x10, 0x00, /* # */ + 0x0C, 0x00, /* ## */ + 0x03, 0x80, /* ### */ + 0x00, 0xC0, /* ## */ + + /* @1002 'w' (7 pixels wide) */ + 0x1F, 0xC0, /* ####### */ + 0x10, 0x00, /* # */ + 0x0E, 0x00, /* ### */ + 0x01, 0x00, /* # */ + 0x0E, 0x00, /* ### */ + 0x10, 0x00, /* # */ + 0x0F, 0xC0, /* ###### */ + + /* @1016 'x' (7 pixels wide) */ + 0x10, 0x40, /* # # */ + 0x18, 0xC0, /* ## ## */ + 0x0D, 0x80, /* ## ## */ + 0x02, 0x00, /* # */ + 0x0D, 0x80, /* ## ## */ + 0x18, 0xC0, /* ## ## */ + 0x10, 0x40, /* # # */ + + /* @1030 'y' (8 pixels wide) */ + 0x80, 0x00, /* # */ + 0x80, 0xC0, /* # ## */ + 0x83, 0x80, /* # ### */ + 0x6C, 0x00, /* ## ## */ + 0x30, 0x00, /* ## */ + 0x0C, 0x00, /* ## */ + 0x03, 0x80, /* ### */ + 0x00, 0xC0, /* ## */ + + /* @1046 'z' (6 pixels wide) */ + 0x10, 0x40, /* # # */ + 0x18, 0x40, /* ## # */ + 0x16, 0x40, /* # ## # */ + 0x13, 0x40, /* # ## # */ + 0x10, 0xC0, /* # ## */ + 0x10, 0x40, /* # # */ + + /* @1058 '{' (5 pixels wide) */ + 0x01, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x7E, 0xF8, /* ###### ##### */ + 0x80, 0x04, /* # # */ + 0x80, 0x04, /* # # */ + + /* @1068 '|' (1 pixels wide) */ + 0xFF, 0xFE, /* ############### */ + + /* @1070 '}' (5 pixels wide) */ + 0x80, 0x04, /* # # */ + 0x80, 0x04, /* # # */ + 0x7E, 0xF8, /* ###### ##### */ + 0x01, 0x00, /* # */ + 0x01, 0x00, /* # */ + + /* @1080 '~' (7 pixels wide) */ + 0x03, 0x00, /* ## */ + 0x00, 0x80, /* # */ + 0x00, 0x80, /* # */ + 0x01, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x01, 0x80, /* ## */ +}; + +/* Character descriptors for Consolas 11pt */ +/* { [Char width in bits], [Offset into consolas11ptCharBitmaps in bytes] } */ +const FONT_CHAR_INFO consolas11ptCharDescriptors[] = +{ + {2, 0}, /* */ + {2, 4}, /* ! */ + {5, 8}, /* " */ + {8, 18}, /* # */ + {6, 34}, /* $ */ + {8, 46}, /* % */ + {8, 62}, /* & */ + {2, 78}, /* ' */ + {4, 82}, /* ( */ + {4, 90}, /* ) */ + {5, 98}, /* * */ + {7, 108}, /* + */ + {3, 122}, /* , */ + {4, 128}, /* - */ + {2, 136}, /* . */ + {6, 140}, /* / */ + {7, 152}, /* 0 */ + {6, 166}, /* 1 */ + {6, 178}, /* 2 */ + {6, 190}, /* 3 */ + {8, 202}, /* 4 */ + {5, 218}, /* 5 */ + {6, 228}, /* 6 */ + {6, 240}, /* 7 */ + {6, 252}, /* 8 */ + {6, 264}, /* 9 */ + {2, 276}, /* : */ + {3, 280}, /* ; */ + {5, 286}, /* < */ + {6, 296}, /* = */ + {5, 308}, /* > */ + {4, 318}, /* ? */ + {8, 326}, /* @ */ + {7, 342}, /* A */ + {6, 356}, /* B */ + {6, 368}, /* C */ + {7, 380}, /* D */ + {5, 394}, /* E */ + {5, 404}, /* F */ + {7, 414}, /* G */ + {6, 428}, /* H */ + {5, 440}, /* I */ + {5, 450}, /* J */ + {6, 460}, /* K */ + {6, 472}, /* L */ + {7, 484}, /* M */ + {6, 498}, /* N */ + {8, 510}, /* O */ + {6, 526}, /* P */ + {7, 538}, /* Q */ + {6, 552}, /* R */ + {6, 564}, /* S */ + {7, 576}, /* T */ + {6, 590}, /* U */ + {7, 602}, /* V */ + {8, 616}, /* W */ + {8, 632}, /* X */ + {7, 648}, /* Y */ + {7, 662}, /* Z */ + {3, 676}, /* [ */ + {6, 682}, /* \ */ + {3, 694}, /* ] */ + {5, 700}, /* ^ */ + {8, 710}, /* _ */ + {3, 726}, /* ` */ + {6, 732}, /* a */ + {6, 744}, /* b */ + {6, 756}, /* c */ + {6, 768}, /* d */ + {6, 780}, /* e */ + {6, 792}, /* f */ + {7, 804}, /* g */ + {6, 818}, /* h */ + {6, 830}, /* i */ + {5, 842}, /* j */ + {6, 852}, /* k */ + {6, 864}, /* l */ + {7, 876}, /* m */ + {6, 890}, /* n */ + {7, 902}, /* o */ + {6, 916}, /* p */ + {6, 928}, /* q */ + {6, 940}, /* r */ + {5, 952}, /* s */ + {7, 962}, /* t */ + {6, 976}, /* u */ + {7, 988}, /* v */ + {7, 1002}, /* w */ + {7, 1016}, /* x */ + {8, 1030}, /* y */ + {6, 1046}, /* z */ + {5, 1058}, /* { */ + {1, 1068}, /* | */ + {5, 1070}, /* } */ + {7, 1080}, /* ~ */ +}; + +/* Font information for Consolas 11pt */ +const FONT_INFO consolas11ptFontInfo = +{ + 2, /* Character height */ + ' ', /* Start character */ + consolas11ptCharDescriptors, /* Character decriptor array */ + consolas11ptCharBitmaps, /* Character bitmap array */ +}; + + diff --git a/macusbfb/drivers/lcd/fonts/consolas11.h b/macusbfb/drivers/lcd/fonts/consolas11.h new file mode 100644 index 0000000..30a551f --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/consolas11.h @@ -0,0 +1,6 @@ +#include "bitmapfonts.h" + +/* Font data for Consolas 11pt */ +extern const uint8_t consolas11ptCharBitmaps[]; +extern const FONT_CHAR_INFO consolas11ptCharDescriptors[]; +extern const FONT_INFO consolas11ptFontInfo; diff --git a/macusbfb/drivers/lcd/fonts/consolas16.c b/macusbfb/drivers/lcd/fonts/consolas16.c new file mode 100644 index 0000000..01d8bf6 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/consolas16.c @@ -0,0 +1,1199 @@ +/**************************************************************************/ +/*! + @file consolas11.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include "consolas16.h" + +/* +** Font data for Consolas 16pt +*/ + +/* Character bitmaps for Consolas 16pt */ +const uint8_t consolas16ptCharBitmaps[] = +{ + /* @0 ' ' (2 pixels wide) */ + 0x00, 0x00, 0x00, /* */ + 0x00, 0x00, 0x00, /* */ + + /* @6 '!' (3 pixels wide) */ + 0x0E, 0xFF, 0xC0, /* ### ########## */ + 0x0E, 0xFF, 0xC0, /* ### ########## */ + 0x0E, 0xFF, 0xC0, /* ### ########## */ + + /* @15 '"' (8 pixels wide) */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x00, 0x00, /* */ + 0x00, 0x00, 0x00, /* */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x07, 0xC0, /* ##### */ + + /* @39 '#' (11 pixels wide) */ + 0x01, 0x80, 0x00, /* ## */ + 0x0F, 0xCC, 0x00, /* ###### ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x01, 0xBF, 0x80, /* ## ####### */ + 0x01, 0x8C, 0x00, /* ## ## */ + 0x01, 0x8C, 0x00, /* ## ## */ + 0x0F, 0xCC, 0x00, /* ###### ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x01, 0xBF, 0x80, /* ## ####### */ + 0x01, 0x8C, 0x00, /* ## ## */ + 0x00, 0x0C, 0x00, /* ## */ + + /* @72 '$' (10 pixels wide) */ + 0x06, 0x0E, 0x00, /* ## ### */ + 0x0C, 0x1F, 0x00, /* ## ##### */ + 0x7C, 0x3F, 0x80, /* ##### ####### */ + 0x7F, 0xF9, 0x80, /* ############ ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x7F, 0xE0, /* ## ########## */ + 0x0E, 0x61, 0xE0, /* ### ## #### */ + 0x07, 0xE1, 0x80, /* ###### ## */ + 0x07, 0xE3, 0x00, /* ###### ## */ + 0x03, 0xC0, 0x00, /* #### */ + + /* @102 '%' (12 pixels wide) */ + 0x08, 0x07, 0x80, /* # #### */ + 0x0C, 0x08, 0x40, /* ## # # */ + 0x07, 0x08, 0x40, /* ### # # */ + 0x03, 0x88, 0x40, /* ### # # */ + 0x01, 0xC7, 0x80, /* ### #### */ + 0x00, 0x70, 0x00, /* ### */ + 0x07, 0xB8, 0x00, /* #### ### */ + 0x08, 0x4E, 0x00, /* # # ### */ + 0x08, 0x47, 0x00, /* # # ### */ + 0x08, 0x43, 0x80, /* # # ### */ + 0x07, 0x80, 0xC0, /* #### ## */ + 0x00, 0x00, 0x40, /* # */ + + /* @138 '&' (12 pixels wide) */ + 0x03, 0xC0, 0x00, /* #### */ + 0x07, 0xE7, 0x00, /* ###### ### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0E, 0x3F, 0xC0, /* ### ######## */ + 0x0C, 0x78, 0xC0, /* ## #### ## */ + 0x0C, 0xF8, 0xC0, /* ## ##### ## */ + 0x0D, 0xEF, 0xC0, /* ## #### ###### */ + 0x07, 0xCF, 0x80, /* ##### ##### */ + 0x07, 0xE7, 0x80, /* ###### #### */ + 0x0F, 0xE0, 0x00, /* ####### */ + 0x0C, 0xE0, 0x00, /* ## ### */ + 0x08, 0x00, 0x00, /* # */ + + /* @174 ''' (3 pixels wide) */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x07, 0xC0, /* ##### */ + + /* @183 '(' (6 pixels wide) */ + 0x03, 0xF8, 0x00, /* ####### */ + 0x0F, 0xFE, 0x00, /* ########### */ + 0x3F, 0xFF, 0x00, /* ############## */ + 0x7C, 0x07, 0xC0, /* ##### ##### */ + 0xF0, 0x01, 0xE0, /* #### #### */ + 0x40, 0x00, 0x40, /* # # */ + + /* @201 ')' (6 pixels wide) */ + 0x40, 0x00, 0x40, /* # # */ + 0xF0, 0x01, 0xE0, /* #### #### */ + 0x7C, 0x07, 0xC0, /* ##### ##### */ + 0x1F, 0xFF, 0x80, /* ############## */ + 0x0F, 0xFE, 0x00, /* ########### */ + 0x03, 0xF8, 0x00, /* ####### */ + + /* @219 '*' (9 pixels wide) */ + 0x00, 0x11, 0x00, /* # # */ + 0x00, 0x3B, 0x80, /* ### ### */ + 0x00, 0x1B, 0x00, /* ## ## */ + 0x00, 0x7F, 0xC0, /* ######### */ + 0x00, 0x7F, 0xC0, /* ######### */ + 0x00, 0x7F, 0xC0, /* ######### */ + 0x00, 0x1B, 0x00, /* ## ## */ + 0x00, 0x1B, 0x00, /* ## ## */ + 0x00, 0x11, 0x00, /* # # */ + + /* @246 '+' (11 pixels wide) */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + 0x07, 0xFE, 0x00, /* ########## */ + 0x07, 0xFE, 0x00, /* ########## */ + 0x07, 0xFE, 0x00, /* ########## */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + + /* @279 ',' (6 pixels wide) */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC6, 0x00, 0x00, /* ## ## */ + 0x7E, 0x00, 0x00, /* ###### */ + 0x7E, 0x00, 0x00, /* ###### */ + 0x3C, 0x00, 0x00, /* #### */ + + /* @297 '-' (6 pixels wide) */ + 0x00, 0xC0, 0x00, /* ## */ + 0x00, 0xC0, 0x00, /* ## */ + 0x00, 0xC0, 0x00, /* ## */ + 0x00, 0xC0, 0x00, /* ## */ + 0x00, 0xC0, 0x00, /* ## */ + 0x00, 0xC0, 0x00, /* ## */ + + /* @315 '.' (4 pixels wide) */ + 0x06, 0x00, 0x00, /* ## */ + 0x0F, 0x00, 0x00, /* #### */ + 0x0F, 0x00, 0x00, /* #### */ + 0x06, 0x00, 0x00, /* ## */ + + /* @327 '/' (9 pixels wide) */ + 0x20, 0x00, 0x00, /* # */ + 0x38, 0x00, 0x00, /* ### */ + 0x3F, 0x00, 0x00, /* ###### */ + 0x0F, 0xC0, 0x00, /* ###### */ + 0x01, 0xF0, 0x00, /* ##### */ + 0x00, 0x7E, 0x00, /* ###### */ + 0x00, 0x1F, 0x80, /* ###### */ + 0x00, 0x03, 0xC0, /* #### */ + 0x00, 0x00, 0xC0, /* ## */ + + /* @354 '0' (11 pixels wide) */ + 0x01, 0xFC, 0x00, /* ####### */ + 0x03, 0xFE, 0x00, /* ######### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x0F, 0xC7, 0x80, /* ###### #### */ + 0x0C, 0x61, 0x80, /* ## ## ## */ + 0x0C, 0x71, 0x80, /* ## ### ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0F, 0x1F, 0x80, /* #### ###### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x03, 0xFF, 0x00, /* ########## */ + 0x01, 0xFC, 0x00, /* ####### */ + + /* @387 '1' (9 pixels wide) */ + 0x0C, 0x06, 0x00, /* ## ## */ + 0x0C, 0x03, 0x00, /* ## ## */ + 0x0C, 0x03, 0x00, /* ## ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + + /* @414 '2' (9 pixels wide) */ + 0x0C, 0x01, 0x00, /* ## # */ + 0x0E, 0x03, 0x00, /* ### ## */ + 0x0F, 0x01, 0x80, /* #### ## */ + 0x0F, 0x81, 0x80, /* ##### ## */ + 0x0D, 0xC1, 0x80, /* ## ### ## */ + 0x0C, 0xE3, 0x80, /* ## ### ### */ + 0x0C, 0x7F, 0x80, /* ## ######## */ + 0x0C, 0x3F, 0x00, /* ## ###### */ + 0x0C, 0x1E, 0x00, /* ## #### */ + + /* @441 '3' (9 pixels wide) */ + 0x06, 0x03, 0x00, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0E, 0x7F, 0x80, /* ### ######## */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x07, 0xEF, 0x00, /* ###### #### */ + 0x03, 0xC0, 0x00, /* #### */ + + /* @468 '4' (11 pixels wide) */ + 0x01, 0xC0, 0x00, /* ### */ + 0x01, 0xE0, 0x00, /* #### */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x01, 0x9E, 0x00, /* ## #### */ + 0x01, 0x8F, 0x00, /* ## #### */ + 0x01, 0x83, 0x80, /* ## ### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x01, 0x80, 0x00, /* ## */ + 0x01, 0x80, 0x00, /* ## */ + + /* @501 '5' (9 pixels wide) */ + 0x0C, 0x3F, 0x80, /* ## ####### */ + 0x0C, 0x3F, 0x80, /* ## ####### */ + 0x0C, 0x3F, 0x80, /* ## ####### */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0E, 0x71, 0x80, /* ### ### ## */ + 0x07, 0xF1, 0x80, /* ####### ## */ + 0x07, 0xE1, 0x80, /* ###### ## */ + 0x03, 0xC0, 0x00, /* #### */ + + /* @528 '6' (10 pixels wide) */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x07, 0xFE, 0x00, /* ########## */ + 0x0F, 0xFF, 0x00, /* ############ */ + 0x0E, 0x67, 0x00, /* ### ## ### */ + 0x0C, 0x33, 0x80, /* ## ## ### */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0E, 0x31, 0x80, /* ### ## ## */ + 0x0F, 0xF1, 0x80, /* ######## ## */ + 0x07, 0xE1, 0x80, /* ###### ## */ + 0x03, 0xC0, 0x00, /* #### */ + + /* @558 '7' (9 pixels wide) */ + 0x00, 0x01, 0x80, /* ## */ + 0x08, 0x01, 0x80, /* # ## */ + 0x0E, 0x01, 0x80, /* ### ## */ + 0x0F, 0x81, 0x80, /* ##### ## */ + 0x07, 0xE1, 0x80, /* ###### ## */ + 0x01, 0xFD, 0x80, /* ####### ## */ + 0x00, 0x3F, 0x80, /* ####### */ + 0x00, 0x0F, 0x80, /* ##### */ + 0x00, 0x03, 0x80, /* ### */ + + /* @585 '8' (10 pixels wide) */ + 0x03, 0x8E, 0x00, /* ### ### */ + 0x07, 0xDF, 0x00, /* ##### ##### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x79, 0x80, /* ## #### ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x71, 0x80, /* ## ### ## */ + 0x0C, 0x79, 0x80, /* ## #### ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x07, 0xDF, 0x00, /* ##### ##### */ + 0x03, 0x8F, 0x00, /* ### #### */ + + /* @615 '9' (10 pixels wide) */ + 0x00, 0x1E, 0x00, /* #### */ + 0x0C, 0x3F, 0x00, /* ## ###### */ + 0x0C, 0x7F, 0x80, /* ## ######## */ + 0x0C, 0x63, 0x80, /* ## ## ### */ + 0x0C, 0x61, 0x80, /* ## ## ## */ + 0x0E, 0x61, 0x80, /* ### ## ## */ + 0x07, 0x23, 0x80, /* ### # ### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x03, 0xFF, 0x00, /* ########## */ + 0x00, 0xFC, 0x00, /* ###### */ + + /* @645 ':' (4 pixels wide) */ + 0x06, 0x18, 0x00, /* ## ## */ + 0x0F, 0x3C, 0x00, /* #### #### */ + 0x0F, 0x3C, 0x00, /* #### #### */ + 0x06, 0x18, 0x00, /* ## ## */ + + /* @657 ';' (6 pixels wide) */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC6, 0x18, 0x00, /* ## ## ## */ + 0x7E, 0x3C, 0x00, /* ###### #### */ + 0x7E, 0x3C, 0x00, /* ###### #### */ + 0x3C, 0x18, 0x00, /* #### ## */ + + /* @675 '<' (8 pixels wide) */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0xF0, 0x00, /* #### */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x03, 0x9C, 0x00, /* ### ### */ + 0x07, 0x0E, 0x00, /* ### ### */ + 0x06, 0x06, 0x00, /* ## ## */ + 0x0E, 0x07, 0x00, /* ### ### */ + 0x04, 0x02, 0x00, /* # # */ + + /* @699 '=' (9 pixels wide) */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + 0x01, 0x98, 0x00, /* ## ## */ + + /* @726 '>' (8 pixels wide) */ + 0x04, 0x02, 0x00, /* # # */ + 0x0E, 0x07, 0x00, /* ### ### */ + 0x06, 0x06, 0x00, /* ## ## */ + 0x07, 0x0E, 0x00, /* ### ### */ + 0x03, 0x9C, 0x00, /* ### ### */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x00, 0xF0, 0x00, /* #### */ + 0x00, 0x60, 0x00, /* ## */ + + /* @750 '?' (7 pixels wide) */ + 0x0E, 0xF0, 0xC0, /* ### #### ## */ + 0x0E, 0xF0, 0xC0, /* ### #### ## */ + 0x0E, 0xF0, 0xC0, /* ### #### ## */ + 0x00, 0x39, 0xC0, /* ### ### */ + 0x00, 0x3F, 0x80, /* ####### */ + 0x00, 0x1F, 0x80, /* ###### */ + 0x00, 0x0F, 0x00, /* #### */ + + /* @771 '@' (11 pixels wide) */ + 0x0F, 0xF0, 0x00, /* ######## */ + 0x3F, 0xFC, 0x00, /* ############ */ + 0x70, 0x1F, 0x00, /* ### ##### */ + 0xE3, 0xE3, 0x80, /* ### ##### ### */ + 0xC7, 0xF9, 0xC0, /* ## ######## ### */ + 0xC7, 0x98, 0xC0, /* ## #### ## ## */ + 0xC3, 0xF8, 0xC0, /* ## ####### ## */ + 0xC6, 0x78, 0xC0, /* ## ## #### ## */ + 0x67, 0x03, 0x80, /* ## ### ### */ + 0x07, 0xFF, 0x80, /* ############ */ + 0x01, 0xFE, 0x00, /* ######## */ + + /* @804 'A' (11 pixels wide) */ + 0x0E, 0x00, 0x00, /* ### */ + 0x0F, 0xC0, 0x00, /* ###### */ + 0x03, 0xF8, 0x00, /* ####### */ + 0x01, 0xFF, 0x00, /* ######### */ + 0x01, 0x8F, 0x80, /* ## ##### */ + 0x01, 0x81, 0x80, /* ## ## */ + 0x01, 0x8F, 0x80, /* ## ##### */ + 0x01, 0xFF, 0x80, /* ########## */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xC0, 0x00, /* ###### */ + 0x0E, 0x00, 0x00, /* ### */ + + /* @837 'B' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0E, 0x7F, 0x80, /* ### ######## */ + 0x0F, 0xFF, 0x00, /* ############ */ + 0x07, 0xEF, 0x00, /* ###### #### */ + 0x03, 0xC0, 0x00, /* #### */ + + /* @867 'C' (9 pixels wide) */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x03, 0xFE, 0x00, /* ######### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x0F, 0x07, 0x80, /* #### #### */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x06, 0x03, 0x00, /* ## ## */ + + /* @894 'D' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x07, 0x03, 0x80, /* ### ### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x03, 0xFE, 0x00, /* ######### */ + 0x00, 0xFC, 0x00, /* ###### */ + + /* @924 'E' (8 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + + /* @948 'F' (8 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x61, 0x80, /* ## ## */ + 0x00, 0x61, 0x80, /* ## ## */ + 0x00, 0x61, 0x80, /* ## ## */ + 0x00, 0x61, 0x80, /* ## ## */ + 0x00, 0x61, 0x80, /* ## ## */ + + /* @972 'G' (11 pixels wide) */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x03, 0xFE, 0x00, /* ######### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x07, 0x07, 0x00, /* ### ### */ + 0x0E, 0x03, 0x80, /* ### ### */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0C, 0x31, 0x80, /* ## ## ## */ + 0x0F, 0xF1, 0x80, /* ######## ## */ + 0x0F, 0xF1, 0x80, /* ######## ## */ + 0x07, 0xF3, 0x00, /* ####### ## */ + + /* @1005 'H' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x30, 0x00, /* ## */ + 0x00, 0x30, 0x00, /* ## */ + 0x00, 0x30, 0x00, /* ## */ + 0x00, 0x30, 0x00, /* ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + + /* @1035 'I' (9 pixels wide) */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + + /* @1062 'J' (8 pixels wide) */ + 0x06, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0E, 0x01, 0x80, /* ### ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x07, 0xFF, 0x80, /* ############ */ + 0x03, 0xFF, 0x80, /* ########### */ + + /* @1086 'K' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0xF8, 0x00, /* ##### */ + 0x03, 0xFE, 0x00, /* ######### */ + 0x07, 0x8F, 0x00, /* #### #### */ + 0x0F, 0x07, 0x80, /* #### #### */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x08, 0x00, 0x80, /* # # */ + + /* @1116 'L' (8 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + + /* @1140 'M' (9 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x0F, 0x80, /* ##### */ + 0x00, 0xFE, 0x00, /* ####### */ + 0x00, 0xE0, 0x00, /* ### */ + 0x00, 0x7E, 0x00, /* ###### */ + 0x00, 0x07, 0x80, /* #### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + + /* @1167 'N' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x0F, 0x80, /* ##### */ + 0x00, 0x7E, 0x00, /* ###### */ + 0x03, 0xF0, 0x00, /* ###### */ + 0x0F, 0x80, 0x00, /* ##### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + + /* @1197 'O' (11 pixels wide) */ + 0x01, 0xFC, 0x00, /* ####### */ + 0x07, 0xFE, 0x00, /* ########## */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x0E, 0x03, 0x80, /* ### ### */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0E, 0x03, 0x80, /* ### ### */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x03, 0xFF, 0x00, /* ########## */ + 0x01, 0xFC, 0x00, /* ####### */ + + /* @1230 'P' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0xC1, 0x80, /* ## ## */ + 0x00, 0xC1, 0x80, /* ## ## */ + 0x00, 0xC1, 0x80, /* ## ## */ + 0x00, 0xE3, 0x80, /* ### ### */ + 0x00, 0x7F, 0x00, /* ####### */ + 0x00, 0x7F, 0x00, /* ####### */ + 0x00, 0x1E, 0x00, /* #### */ + + /* @1260 'Q' (11 pixels wide) */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x07, 0xFE, 0x00, /* ########## */ + 0x07, 0xFF, 0x00, /* ########### */ + 0x0E, 0x03, 0x80, /* ### ### */ + 0x3C, 0x01, 0x80, /* #### ## */ + 0x7C, 0x01, 0x80, /* ##### ## */ + 0xFC, 0x01, 0x80, /* ###### ## */ + 0xEE, 0x03, 0x80, /* ### ### ### */ + 0xC7, 0xFF, 0x00, /* ## ########### */ + 0xC3, 0xFF, 0x00, /* ## ########## */ + 0x41, 0xFC, 0x00, /* # ####### */ + + /* @1293 'R' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x61, 0x80, /* ## ## */ + 0x00, 0x61, 0x80, /* ## ## */ + 0x01, 0xF1, 0x80, /* ##### ## */ + 0x07, 0xFF, 0x80, /* ############ */ + 0x0F, 0xBF, 0x00, /* ##### ###### */ + 0x0E, 0x1E, 0x00, /* ### #### */ + 0x08, 0x00, 0x00, /* # */ + + /* @1323 'S' (10 pixels wide) */ + 0x06, 0x0E, 0x00, /* ## ### */ + 0x0C, 0x1F, 0x00, /* ## ##### */ + 0x0C, 0x3F, 0x80, /* ## ####### */ + 0x0C, 0x39, 0x80, /* ## ### ## */ + 0x0C, 0x71, 0x80, /* ## ### ## */ + 0x0C, 0x71, 0x80, /* ## ### ## */ + 0x0E, 0x71, 0x80, /* ### ### ## */ + 0x07, 0xE1, 0x80, /* ###### ## */ + 0x07, 0xE3, 0x00, /* ###### ## */ + 0x03, 0xC0, 0x00, /* #### */ + + /* @1353 'T' (11 pixels wide) */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x80, /* ## */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x80, /* ## */ + + /* @1386 'U' (10 pixels wide) */ + 0x03, 0xFF, 0x80, /* ########### */ + 0x07, 0xFF, 0x80, /* ############ */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0E, 0x00, 0x00, /* ### */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0E, 0x00, 0x00, /* ### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x07, 0xFF, 0x80, /* ############ */ + 0x03, 0xFF, 0x80, /* ########### */ + + /* @1416 'V' (11 pixels wide) */ + 0x00, 0x03, 0x80, /* ### */ + 0x00, 0x1F, 0x80, /* ###### */ + 0x00, 0xFF, 0x80, /* ######### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xC0, 0x00, /* ###### */ + 0x0E, 0x00, 0x00, /* ### */ + 0x0F, 0xC0, 0x00, /* ###### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x00, 0xFF, 0x00, /* ######## */ + 0x00, 0x1F, 0x80, /* ###### */ + 0x00, 0x03, 0x80, /* ### */ + + /* @1449 'W' (10 pixels wide) */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0x00, 0x00, /* #### */ + 0x01, 0xF0, 0x00, /* ##### */ + 0x00, 0x18, 0x00, /* ## */ + 0x00, 0xF8, 0x00, /* ##### */ + 0x07, 0xC0, 0x00, /* ##### */ + 0x0F, 0x00, 0x00, /* #### */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + + /* @1479 'X' (11 pixels wide) */ + 0x08, 0x00, 0x80, /* # # */ + 0x0E, 0x01, 0x80, /* ### ## */ + 0x0F, 0x07, 0x80, /* #### #### */ + 0x07, 0xCF, 0x00, /* ##### #### */ + 0x01, 0xFF, 0x00, /* ######### */ + 0x00, 0x7E, 0x00, /* ###### */ + 0x01, 0xFE, 0x00, /* ######## */ + 0x03, 0xCF, 0x00, /* #### #### */ + 0x0F, 0x87, 0x80, /* ##### #### */ + 0x0E, 0x01, 0x80, /* ### ## */ + 0x0C, 0x00, 0x80, /* ## # */ + + /* @1512 'Y' (11 pixels wide) */ + 0x00, 0x00, 0x80, /* # */ + 0x00, 0x03, 0x80, /* ### */ + 0x00, 0x0F, 0x80, /* ##### */ + 0x00, 0x3F, 0x00, /* ###### */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xE0, 0x00, /* ####### */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x00, 0x3F, 0x00, /* ###### */ + 0x00, 0x0F, 0x80, /* ##### */ + 0x00, 0x03, 0x80, /* ### */ + 0x00, 0x00, 0x80, /* # */ + + /* @1545 'Z' (9 pixels wide) */ + 0x0C, 0x01, 0x80, /* ## ## */ + 0x0F, 0x01, 0x80, /* #### ## */ + 0x0F, 0x81, 0x80, /* ##### ## */ + 0x0D, 0xE1, 0x80, /* ## #### ## */ + 0x0C, 0xF9, 0x80, /* ## ##### ## */ + 0x0C, 0x3D, 0x80, /* ## #### ## */ + 0x0C, 0x0F, 0x80, /* ## ##### */ + 0x0C, 0x07, 0x80, /* ## #### */ + 0x0C, 0x01, 0x80, /* ## ## */ + + /* @1572 '[' (6 pixels wide) */ + 0xFF, 0xFF, 0xE0, /* ################### */ + 0xFF, 0xFF, 0xE0, /* ################### */ + 0xFF, 0xFF, 0xE0, /* ################### */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xC0, 0x00, 0x60, /* ## ## */ + + /* @1590 '\' (10 pixels wide) */ + 0x00, 0x00, 0x40, /* # */ + 0x00, 0x01, 0xC0, /* ### */ + 0x00, 0x07, 0xC0, /* ##### */ + 0x00, 0x1F, 0x00, /* ##### */ + 0x00, 0xFC, 0x00, /* ###### */ + 0x03, 0xF0, 0x00, /* ###### */ + 0x0F, 0x80, 0x00, /* ##### */ + 0x3E, 0x00, 0x00, /* ##### */ + 0x38, 0x00, 0x00, /* ### */ + 0x20, 0x00, 0x00, /* # */ + + /* @1620 ']' (6 pixels wide) */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xFF, 0xFF, 0xE0, /* ################### */ + 0xFF, 0xFF, 0xE0, /* ################### */ + 0xFF, 0xFF, 0xE0, /* ################### */ + + /* @1638 '^' (9 pixels wide) */ + 0x00, 0x30, 0x00, /* ## */ + 0x00, 0x3C, 0x00, /* #### */ + 0x00, 0x3E, 0x00, /* ##### */ + 0x00, 0x07, 0x80, /* #### */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x07, 0x80, /* #### */ + 0x00, 0x3E, 0x00, /* ##### */ + 0x00, 0x38, 0x00, /* ### */ + 0x00, 0x30, 0x00, /* ## */ + + /* @1665 '_' (12 pixels wide) */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + 0xC0, 0x00, 0x00, /* ## */ + + /* @1701 '`' (5 pixels wide) */ + 0x00, 0x00, 0x40, /* # */ + 0x00, 0x00, 0xC0, /* ## */ + 0x00, 0x01, 0xC0, /* ### */ + 0x00, 0x01, 0x80, /* ## */ + 0x00, 0x01, 0x00, /* # */ + + /* @1716 'a' (9 pixels wide) */ + 0x07, 0x00, 0x00, /* ### */ + 0x0F, 0x98, 0x00, /* ##### ## */ + 0x0F, 0xCC, 0x00, /* ###### ## */ + 0x0C, 0xCC, 0x00, /* ## ## ## */ + 0x0C, 0xCC, 0x00, /* ## ## ## */ + 0x06, 0xCC, 0x00, /* ## ## ## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x0F, 0xF8, 0x00, /* ######### */ + + /* @1743 'b' (10 pixels wide) */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0C, 0x18, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x07, 0xFC, 0x00, /* ######### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x01, 0xF0, 0x00, /* ##### */ + + /* @1773 'c' (8 pixels wide) */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x06, 0x18, 0x00, /* ## ## */ + + /* @1797 'd' (10 pixels wide) */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x06, 0x0C, 0x00, /* ## ## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + + /* @1827 'e' (10 pixels wide) */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x0E, 0xDC, 0x00, /* ### ## ### */ + 0x0C, 0xCC, 0x00, /* ## ## ## */ + 0x0C, 0xCC, 0x00, /* ## ## ## */ + 0x0C, 0xDC, 0x00, /* ## ## ### */ + 0x0C, 0xFC, 0x00, /* ## ###### */ + 0x06, 0xF8, 0x00, /* ## ##### */ + 0x00, 0xF0, 0x00, /* #### */ + + /* @1857 'f' (10 pixels wide) */ + 0x00, 0x18, 0x00, /* ## */ + 0x00, 0x18, 0x00, /* ## */ + 0x00, 0x18, 0x00, /* ## */ + 0x0F, 0xFF, 0x00, /* ############ */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x00, 0x18, 0xC0, /* ## ## */ + 0x00, 0x18, 0xC0, /* ## ## */ + 0x00, 0x18, 0xC0, /* ## ## */ + 0x00, 0x00, 0xC0, /* ## */ + + /* @1887 'g' (10 pixels wide) */ + 0x76, 0x00, 0x00, /* ### ## */ + 0x77, 0x70, 0x00, /* ### ### ### */ + 0xFF, 0xF8, 0x00, /* ############# */ + 0xCD, 0xFC, 0x00, /* ## ## ####### */ + 0xCD, 0x8C, 0x00, /* ## ## ## ## */ + 0xCD, 0x8C, 0x00, /* ## ## ## ## */ + 0xCD, 0xFC, 0x00, /* ## ## ####### */ + 0xFC, 0xFC, 0x00, /* ###### ###### */ + 0x7C, 0x7C, 0x00, /* ##### ##### */ + 0x38, 0x0C, 0x00, /* ### ## */ + + /* @1917 'h' (9 pixels wide) */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x00, 0x18, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xF8, 0x00, /* ######### */ + + /* @1944 'i' (9 pixels wide) */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0F, 0xFD, 0xC0, /* ########## ### */ + 0x0F, 0xFD, 0xC0, /* ########## ### */ + 0x0F, 0xFD, 0xC0, /* ########## ### */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + + /* @1971 'j' (8 pixels wide) */ + 0x60, 0x0C, 0x00, /* ## ## */ + 0xC0, 0x0C, 0x00, /* ## ## */ + 0xC0, 0x0C, 0x00, /* ## ## */ + 0xC0, 0x0C, 0x00, /* ## ## */ + 0xE0, 0x0C, 0x00, /* ### ## */ + 0xFF, 0xFD, 0xC0, /* ############## ### */ + 0x7F, 0xFD, 0xC0, /* ############# ### */ + 0x3F, 0xFD, 0xC0, /* ############ ### */ + + /* @1995 'k' (9 pixels wide) */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x00, 0xE0, 0x00, /* ### */ + 0x01, 0xF0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x0C, 0x04, 0x00, /* ## # */ + + /* @2022 'l' (9 pixels wide) */ + 0x0C, 0x00, 0xC0, /* ## ## */ + 0x0C, 0x00, 0xC0, /* ## ## */ + 0x0C, 0x00, 0xC0, /* ## ## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0F, 0xFF, 0xC0, /* ############## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + + /* @2049 'm' (11 pixels wide) */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x00, 0x0C, 0x00, /* ## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xF8, 0x00, /* ######### */ + + /* @2082 'n' (9 pixels wide) */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x00, 0x18, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xF8, 0x00, /* ######### */ + + /* @2109 'o' (10 pixels wide) */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x07, 0xFC, 0x00, /* ######### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x01, 0xF0, 0x00, /* ##### */ + + /* @2139 'p' (10 pixels wide) */ + 0xFF, 0xFC, 0x00, /* ############## */ + 0xFF, 0xFC, 0x00, /* ############## */ + 0xFF, 0xFC, 0x00, /* ############## */ + 0x0C, 0x18, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x07, 0xFC, 0x00, /* ######### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x01, 0xF0, 0x00, /* ##### */ + + /* @2169 'q' (10 pixels wide) */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0F, 0xF8, 0x00, /* ######### */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x06, 0x0C, 0x00, /* ## ## */ + 0xFF, 0xFC, 0x00, /* ############## */ + 0xFF, 0xFC, 0x00, /* ############## */ + 0xFF, 0xFC, 0x00, /* ############## */ + + /* @2199 'r' (9 pixels wide) */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x00, 0x18, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x3C, 0x00, /* #### */ + 0x00, 0x3C, 0x00, /* #### */ + 0x00, 0x38, 0x00, /* ### */ + + /* @2226 's' (9 pixels wide) */ + 0x06, 0x38, 0x00, /* ## ### */ + 0x0C, 0x78, 0x00, /* ## #### */ + 0x0C, 0xFC, 0x00, /* ## ###### */ + 0x0C, 0xEC, 0x00, /* ## ### ## */ + 0x0C, 0xCC, 0x00, /* ## ## ## */ + 0x0C, 0xCC, 0x00, /* ## ## ## */ + 0x0F, 0xCC, 0x00, /* ###### ## */ + 0x07, 0x98, 0x00, /* #### ## */ + 0x03, 0x80, 0x00, /* ### */ + + /* @2253 't' (10 pixels wide) */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x0C, 0x00, /* ## */ + 0x07, 0xFF, 0x80, /* ############ */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0F, 0xFF, 0x80, /* ############# */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0C, 0x0C, 0x00, /* ## ## */ + + /* @2283 'u' (9 pixels wide) */ + 0x07, 0xFC, 0x00, /* ######### */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0C, 0x00, 0x00, /* ## */ + 0x06, 0x00, 0x00, /* ## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0xFC, 0x00, /* ########## */ + + /* @2310 'v' (11 pixels wide) */ + 0x00, 0x0C, 0x00, /* ## */ + 0x00, 0x3C, 0x00, /* #### */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x07, 0xE0, 0x00, /* ###### */ + 0x0F, 0x00, 0x00, /* #### */ + 0x0C, 0x00, 0x00, /* ## */ + 0x0F, 0x00, 0x00, /* #### */ + 0x07, 0xE0, 0x00, /* ###### */ + 0x01, 0xF8, 0x00, /* ###### */ + 0x00, 0x3C, 0x00, /* #### */ + 0x00, 0x0C, 0x00, /* ## */ + + /* @2343 'w' (11 pixels wide) */ + 0x01, 0xFC, 0x00, /* ####### */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x0F, 0x00, 0x00, /* #### */ + 0x0F, 0x00, 0x00, /* #### */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x00, 0x60, 0x00, /* ## */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x0F, 0x00, 0x00, /* #### */ + 0x0E, 0x00, 0x00, /* ### */ + 0x0F, 0xFC, 0x00, /* ########## */ + 0x01, 0xFC, 0x00, /* ####### */ + + /* @2376 'x' (10 pixels wide) */ + 0x08, 0x04, 0x00, /* # # */ + 0x0E, 0x0C, 0x00, /* ### ## */ + 0x0F, 0x3C, 0x00, /* #### #### */ + 0x03, 0xF8, 0x00, /* ####### */ + 0x00, 0xE0, 0x00, /* ### */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x07, 0xF8, 0x00, /* ######## */ + 0x0E, 0x1C, 0x00, /* ### ### */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x08, 0x04, 0x00, /* # # */ + + /* @2406 'y' (11 pixels wide) */ + 0xC0, 0x0C, 0x00, /* ## ## */ + 0xC0, 0x3C, 0x00, /* ## #### */ + 0xC1, 0xF8, 0x00, /* ## ###### */ + 0xE7, 0xE0, 0x00, /* ### ###### */ + 0x7F, 0x00, 0x00, /* ####### */ + 0x3E, 0x00, 0x00, /* ##### */ + 0x0F, 0x80, 0x00, /* ##### */ + 0x03, 0xE0, 0x00, /* ##### */ + 0x00, 0xF8, 0x00, /* ##### */ + 0x00, 0x3C, 0x00, /* #### */ + 0x00, 0x0C, 0x00, /* ## */ + + /* @2439 'z' (8 pixels wide) */ + 0x0C, 0x0C, 0x00, /* ## ## */ + 0x0E, 0x0C, 0x00, /* ### ## */ + 0x0F, 0x8C, 0x00, /* ##### ## */ + 0x0F, 0xCC, 0x00, /* ###### ## */ + 0x0C, 0xFC, 0x00, /* ## ###### */ + 0x0C, 0x7C, 0x00, /* ## ##### */ + 0x0C, 0x1C, 0x00, /* ## ### */ + 0x0C, 0x0C, 0x00, /* ## ## */ + + /* @2463 '{' (9 pixels wide) */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0xE0, 0x00, /* ### */ + 0x3F, 0xFF, 0x80, /* ############### */ + 0x7F, 0xFF, 0xC0, /* ################# */ + 0xFF, 0x9F, 0xE0, /* ######### ######## */ + 0xE0, 0x00, 0xE0, /* ### ### */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xC0, 0x00, 0x60, /* ## ## */ + + /* @2490 '|' (3 pixels wide) */ + 0xFF, 0xFF, 0xF8, /* ##################### */ + 0xFF, 0xFF, 0xF8, /* ##################### */ + 0xFF, 0xFF, 0xF8, /* ##################### */ + + /* @2499 '}' (9 pixels wide) */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xC0, 0x00, 0x60, /* ## ## */ + 0xE0, 0x00, 0xE0, /* ### ### */ + 0xFF, 0x9F, 0xE0, /* ######### ######## */ + 0x7F, 0xFF, 0xC0, /* ################# */ + 0x3F, 0xFF, 0x80, /* ############### */ + 0x00, 0x70, 0x00, /* ### */ + 0x00, 0x60, 0x00, /* ## */ + 0x00, 0x60, 0x00, /* ## */ + + /* @2526 '~' (11 pixels wide) */ + 0x00, 0xC0, 0x00, /* ## */ + 0x00, 0xF0, 0x00, /* #### */ + 0x00, 0x30, 0x00, /* ## */ + 0x00, 0x30, 0x00, /* ## */ + 0x00, 0x70, 0x00, /* ### */ + 0x00, 0xE0, 0x00, /* ### */ + 0x01, 0xC0, 0x00, /* ### */ + 0x01, 0x80, 0x00, /* ## */ + 0x01, 0x80, 0x00, /* ## */ + 0x01, 0xE0, 0x00, /* #### */ + 0x00, 0x60, 0x00, /* ## */ +}; + +/* Character descriptors for Consolas 16pt */ +/* { [Char width in bits], [Offset into consolas16ptCharBitmaps in bytes] } */ +const FONT_CHAR_INFO consolas16ptCharDescriptors[] = +{ + {2, 0}, /* */ + {3, 6}, /* ! */ + {8, 15}, /* " */ + {11, 39}, /* # */ + {10, 72}, /* $ */ + {12, 102}, /* % */ + {12, 138}, /* & */ + {3, 174}, /* ' */ + {6, 183}, /* ( */ + {6, 201}, /* ) */ + {9, 219}, /* * */ + {11, 246}, /* + */ + {6, 279}, /* , */ + {6, 297}, /* - */ + {4, 315}, /* . */ + {9, 327}, /* / */ + {11, 354}, /* 0 */ + {9, 387}, /* 1 */ + {9, 414}, /* 2 */ + {9, 441}, /* 3 */ + {11, 468}, /* 4 */ + {9, 501}, /* 5 */ + {10, 528}, /* 6 */ + {9, 558}, /* 7 */ + {10, 585}, /* 8 */ + {10, 615}, /* 9 */ + {4, 645}, /* : */ + {6, 657}, /* ; */ + {8, 675}, /* < */ + {9, 699}, /* = */ + {8, 726}, /* > */ + {7, 750}, /* ? */ + {11, 771}, /* @ */ + {11, 804}, /* A */ + {10, 837}, /* B */ + {9, 867}, /* C */ + {10, 894}, /* D */ + {8, 924}, /* E */ + {8, 948}, /* F */ + {11, 972}, /* G */ + {10, 1005}, /* H */ + {9, 1035}, /* I */ + {8, 1062}, /* J */ + {10, 1086}, /* K */ + {8, 1116}, /* L */ + {9, 1140}, /* M */ + {10, 1167}, /* N */ + {11, 1197}, /* O */ + {10, 1230}, /* P */ + {11, 1260}, /* Q */ + {10, 1293}, /* R */ + {10, 1323}, /* S */ + {11, 1353}, /* T */ + {10, 1386}, /* U */ + {11, 1416}, /* V */ + {10, 1449}, /* W */ + {11, 1479}, /* X */ + {11, 1512}, /* Y */ + {9, 1545}, /* Z */ + {6, 1572}, /* [ */ + {10, 1590}, /* \ */ + {6, 1620}, /* ] */ + {9, 1638}, /* ^ */ + {12, 1665}, /* _ */ + {5, 1701}, /* ` */ + {9, 1716}, /* a */ + {10, 1743}, /* b */ + {8, 1773}, /* c */ + {10, 1797}, /* d */ + {10, 1827}, /* e */ + {10, 1857}, /* f */ + {10, 1887}, /* g */ + {9, 1917}, /* h */ + {9, 1944}, /* i */ + {8, 1971}, /* j */ + {9, 1995}, /* k */ + {9, 2022}, /* l */ + {11, 2049}, /* m */ + {9, 2082}, /* n */ + {10, 2109}, /* o */ + {10, 2139}, /* p */ + {10, 2169}, /* q */ + {9, 2199}, /* r */ + {9, 2226}, /* s */ + {10, 2253}, /* t */ + {9, 2283}, /* u */ + {11, 2310}, /* v */ + {11, 2343}, /* w */ + {10, 2376}, /* x */ + {11, 2406}, /* y */ + {8, 2439}, /* z */ + {9, 2463}, /* { */ + {3, 2490}, /* | */ + {9, 2499}, /* } */ + {11, 2526}, /* ~ */ +}; + +/* Font information for Consolas 16pt */ +const FONT_INFO consolas16ptFontInfo = +{ + 3, /* Character height */ + ' ', /* Start character */ + consolas16ptCharDescriptors, /* Character decriptor array */ + consolas16ptCharBitmaps, /* Character bitmap array */ +}; diff --git a/macusbfb/drivers/lcd/fonts/consolas16.h b/macusbfb/drivers/lcd/fonts/consolas16.h new file mode 100644 index 0000000..7b65a05 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/consolas16.h @@ -0,0 +1,6 @@ +#include "bitmapfonts.h" + +/* Font data for Consolas 16pt bold */ +extern const uint8_t consolas16ptCharBitmaps[]; +extern const FONT_CHAR_INFO consolas16ptCharDescriptors[]; +extern const FONT_INFO consolas16ptFontInfo; diff --git a/macusbfb/drivers/lcd/fonts/consolas9.c b/macusbfb/drivers/lcd/fonts/consolas9.c new file mode 100644 index 0000000..feda405 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/consolas9.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/*! + @file consolas11.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include "consolas9.h" + +/* +** Font data for Consolas 9pt +*/ + +/* Character bitmaps for Consolas 9pt */ +const uint8_t consolas9ptCharBitmaps[] = +{ + /* @0 ' ' (2 pixels wide) */ + 0x00, 0x00, /* */ + 0x00, 0x00, /* */ + + /* @4 '!' (2 pixels wide) */ + 0x37, 0xC0, /* ## ##### */ + 0x30, 0x00, /* ## */ + + /* @8 '"' (3 pixels wide) */ + 0x01, 0xC0, /* ### */ + 0x00, 0x00, /* */ + 0x01, 0xC0, /* ### */ + + /* @14 '#' (6 pixels wide) */ + 0x09, 0x00, /* # # */ + 0x3D, 0x00, /* #### # */ + 0x0B, 0xC0, /* # #### */ + 0x3D, 0x00, /* #### # */ + 0x0B, 0xC0, /* # #### */ + 0x09, 0x00, /* # # */ + + /* @26 '$' (5 pixels wide) */ + 0x21, 0x80, /* # ## */ + 0x72, 0x40, /* ### # # */ + 0x2F, 0xE0, /* # ####### */ + 0x24, 0x40, /* # # # */ + 0x18, 0x00, /* ## */ + + /* @36 '%' (7 pixels wide) */ + 0x23, 0xC0, /* # #### */ + 0x12, 0x40, /* # # # */ + 0x0B, 0xC0, /* # #### */ + 0x3E, 0x00, /* ##### */ + 0x25, 0x00, /* # # # */ + 0x3C, 0x80, /* #### # */ + 0x00, 0x40, /* # */ + + /* @50 '&' (7 pixels wide) */ + 0x18, 0x00, /* ## */ + 0x25, 0x80, /* # # ## */ + 0x22, 0x40, /* # # # */ + 0x2E, 0x40, /* # ### # */ + 0x39, 0xC0, /* ### ### */ + 0x3C, 0x00, /* #### */ + 0x20, 0x00, /* # */ + + /* @64 ''' (1 pixels wide) */ + 0x01, 0xC0, /* ### */ + + /* @66 '(' (3 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x60, 0xC0, /* ## ## */ + 0x80, 0x20, /* # # */ + + /* @72 ')' (3 pixels wide) */ + 0x80, 0x20, /* # # */ + 0x60, 0xC0, /* ## ## */ + 0x1F, 0x00, /* ##### */ + + /* @78 '*' (5 pixels wide) */ + 0x02, 0x80, /* # # */ + 0x01, 0x00, /* # */ + 0x07, 0xC0, /* ##### */ + 0x01, 0x00, /* # */ + 0x02, 0x80, /* # # */ + + /* @88 '+' (5 pixels wide) */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + 0x1F, 0x00, /* ##### */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + + /* @98 ',' (3 pixels wide) */ + 0x80, 0x00, /* # */ + 0xF0, 0x00, /* #### */ + 0x70, 0x00, /* ### */ + + /* @104 '-' (4 pixels wide) */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + + /* @112 '.' (2 pixels wide) */ + 0x30, 0x00, /* ## */ + 0x30, 0x00, /* ## */ + + /* @116 '/' (5 pixels wide) */ + 0x40, 0x00, /* # */ + 0x30, 0x00, /* ## */ + 0x0E, 0x00, /* ### */ + 0x01, 0x80, /* ## */ + 0x00, 0x40, /* # */ + + /* @126 '0' (6 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x38, 0xC0, /* ### ## */ + 0x24, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x31, 0xC0, /* ## ### */ + 0x0F, 0x80, /* ##### */ + + /* @138 '1' (5 pixels wide) */ + 0x20, 0x80, /* # # */ + 0x20, 0x40, /* # # */ + 0x3F, 0xC0, /* ######## */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + + /* @148 '2' (5 pixels wide) */ + 0x20, 0x80, /* # # */ + 0x30, 0x40, /* ## # */ + 0x28, 0x40, /* # # # */ + 0x24, 0x40, /* # # # */ + 0x23, 0x80, /* # ### */ + + /* @158 '3' (5 pixels wide) */ + 0x20, 0x40, /* # # */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x1D, 0x80, /* ### ## */ + + /* @168 '4' (6 pixels wide) */ + 0x0C, 0x00, /* ## */ + 0x0A, 0x00, /* # # */ + 0x09, 0x00, /* # # */ + 0x08, 0xC0, /* # ## */ + 0x3F, 0xC0, /* ######## */ + 0x08, 0x00, /* # */ + + /* @180 '5' (5 pixels wide) */ + 0x23, 0xC0, /* # #### */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x32, 0x40, /* ## # # */ + 0x1C, 0x40, /* ### # */ + + /* @190 '6' (5 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x22, 0xC0, /* # # ## */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x1C, 0x00, /* ### */ + + /* @200 '7' (5 pixels wide) */ + 0x00, 0x40, /* # */ + 0x30, 0x40, /* ## # */ + 0x1C, 0x40, /* ### # */ + 0x03, 0x40, /* ## # */ + 0x00, 0xC0, /* ## */ + + /* @210 '8' (5 pixels wide) */ + 0x1D, 0x80, /* ### ## */ + 0x27, 0x40, /* # ### # */ + 0x22, 0x40, /* # # # */ + 0x26, 0x40, /* # ## # */ + 0x1D, 0x80, /* ### ## */ + + /* @220 '9' (5 pixels wide) */ + 0x23, 0x80, /* # ### */ + 0x24, 0x40, /* # # # */ + 0x24, 0x40, /* # # # */ + 0x14, 0x40, /* # # # */ + 0x0F, 0x80, /* ##### */ + + /* @230 ':' (2 pixels wide) */ + 0x33, 0x00, /* ## ## */ + 0x33, 0x00, /* ## ## */ + + /* @234 ';' (3 pixels wide) */ + 0x80, 0x00, /* # */ + 0xF3, 0x00, /* #### ## */ + 0x73, 0x00, /* ### ## */ + + /* @240 '<' (5 pixels wide) */ + 0x04, 0x00, /* # */ + 0x0A, 0x00, /* # # */ + 0x11, 0x00, /* # # */ + 0x11, 0x00, /* # # */ + 0x20, 0x80, /* # # */ + + /* @250 '=' (5 pixels wide) */ + 0x0A, 0x00, /* # # */ + 0x0A, 0x00, /* # # */ + 0x0A, 0x00, /* # # */ + 0x0A, 0x00, /* # # */ + 0x0A, 0x00, /* # # */ + + /* @260 '>' (5 pixels wide) */ + 0x20, 0x80, /* # # */ + 0x11, 0x00, /* # # */ + 0x11, 0x00, /* # # */ + 0x0A, 0x00, /* # # */ + 0x04, 0x00, /* # */ + + /* @270 '?' (4 pixels wide) */ + 0x34, 0x40, /* ## # # */ + 0x34, 0x40, /* ## # # */ + 0x04, 0x80, /* # # */ + 0x03, 0x80, /* ### */ + + /* @278 '@' (7 pixels wide) */ + 0x3E, 0x00, /* ##### */ + 0xC1, 0x80, /* ## ## */ + 0x9C, 0xC0, /* # ### ## */ + 0x92, 0x40, /* # # # # */ + 0x9E, 0x40, /* # #### # */ + 0x10, 0xC0, /* # ## */ + 0x0F, 0x80, /* ##### */ + + /* @292 'A' (5 pixels wide) */ + 0x3C, 0x00, /* #### */ + 0x0B, 0x80, /* # ### */ + 0x08, 0x40, /* # # */ + 0x0B, 0x80, /* # ### */ + 0x3C, 0x00, /* #### */ + + /* @302 'B' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x1D, 0x80, /* ### ## */ + + /* @312 'C' (5 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x30, 0x80, /* ## # */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + + /* @322 'D' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x30, 0xC0, /* ## ## */ + 0x0F, 0x80, /* ##### */ + + /* @332 'E' (4 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + + /* @340 'F' (4 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x02, 0x40, /* # # */ + 0x02, 0x40, /* # # */ + 0x02, 0x40, /* # # */ + + /* @348 'G' (6 pixels wide) */ + 0x0F, 0x00, /* #### */ + 0x10, 0x80, /* # # */ + 0x20, 0x40, /* # # */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x3E, 0x40, /* ##### # */ + + /* @360 'H' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x3F, 0xC0, /* ######## */ + + /* @370 'I' (5 pixels wide) */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x3F, 0xC0, /* ######## */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + + /* @380 'J' (4 pixels wide) */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x1F, 0xC0, /* ####### */ + + /* @388 'K' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x06, 0x00, /* ## */ + 0x09, 0x00, /* # # */ + 0x10, 0x80, /* # # */ + 0x20, 0x40, /* # # */ + + /* @398 'L' (4 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + + /* @406 'M' (6 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x03, 0x00, /* ## */ + 0x04, 0x00, /* # */ + 0x03, 0x00, /* ## */ + 0x3F, 0xC0, /* ######## */ + 0x20, 0x00, /* # */ + + /* @418 'N' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x01, 0xC0, /* ### */ + 0x06, 0x00, /* ## */ + 0x38, 0x00, /* ### */ + 0x3F, 0xC0, /* ######## */ + + /* @428 'O' (6 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x30, 0xC0, /* ## ## */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x30, 0xC0, /* ## ## */ + 0x0F, 0x80, /* ##### */ + + /* @440 'P' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x04, 0x40, /* # # */ + 0x04, 0x40, /* # # */ + 0x04, 0x40, /* # # */ + 0x03, 0x80, /* ### */ + + /* @450 'Q' (6 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x30, 0xC0, /* ## ## */ + 0x60, 0x40, /* ## # */ + 0xA0, 0x40, /* # # # */ + 0xB0, 0xC0, /* # ## ## */ + 0x8F, 0x80, /* # ##### */ + + /* @462 'R' (6 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x04, 0x40, /* # # */ + 0x04, 0x40, /* # # */ + 0x0C, 0x40, /* ## # */ + 0x3B, 0x80, /* ### ### */ + 0x20, 0x00, /* # */ + + /* @474 'S' (5 pixels wide) */ + 0x21, 0x80, /* # ## */ + 0x22, 0x40, /* # # # */ + 0x22, 0x40, /* # # # */ + 0x24, 0x40, /* # # # */ + 0x18, 0x40, /* ## # */ + + /* @484 'T' (5 pixels wide) */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + 0x3F, 0xC0, /* ######## */ + 0x00, 0x40, /* # */ + 0x00, 0x40, /* # */ + + /* @494 'U' (5 pixels wide) */ + 0x1F, 0xC0, /* ####### */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + 0x1F, 0xC0, /* ####### */ + + /* @504 'V' (5 pixels wide) */ + 0x03, 0xC0, /* #### */ + 0x1E, 0x00, /* #### */ + 0x20, 0x00, /* # */ + 0x1E, 0x00, /* #### */ + 0x01, 0xC0, /* ### */ + + /* @514 'W' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x1C, 0x00, /* ### */ + 0x02, 0x00, /* # */ + 0x1C, 0x00, /* ### */ + 0x3F, 0xC0, /* ######## */ + + /* @524 'X' (7 pixels wide) */ + 0x20, 0x40, /* # # */ + 0x30, 0xC0, /* ## ## */ + 0x0F, 0x00, /* #### */ + 0x07, 0x00, /* ### */ + 0x09, 0xC0, /* # ### */ + 0x30, 0x40, /* ## # */ + 0x20, 0x00, /* # */ + + /* @538 'Y' (7 pixels wide) */ + 0x00, 0x40, /* # */ + 0x01, 0x80, /* ## */ + 0x03, 0x00, /* ## */ + 0x3C, 0x00, /* #### */ + 0x03, 0x00, /* ## */ + 0x01, 0x80, /* ## */ + 0x00, 0x40, /* # */ + + /* @552 'Z' (5 pixels wide) */ + 0x20, 0x40, /* # # */ + 0x38, 0x40, /* ### # */ + 0x26, 0x40, /* # ## # */ + 0x21, 0xC0, /* # ### */ + 0x20, 0x40, /* # # */ + + /* @562 '[' (3 pixels wide) */ + 0xFF, 0xC0, /* ########## */ + 0x80, 0x40, /* # # */ + 0x80, 0x40, /* # # */ + + /* @568 '\' (5 pixels wide) */ + 0x00, 0x40, /* # */ + 0x01, 0x80, /* ## */ + 0x0E, 0x00, /* ### */ + 0x30, 0x00, /* ## */ + 0x40, 0x00, /* # */ + + /* @578 ']' (3 pixels wide) */ + 0x80, 0x40, /* # # */ + 0x80, 0x40, /* # # */ + 0xFF, 0xC0, /* ########## */ + + /* @584 '^' (5 pixels wide) */ + 0x03, 0x00, /* ## */ + 0x00, 0x80, /* # */ + 0x00, 0x40, /* # */ + 0x00, 0x80, /* # */ + 0x03, 0x00, /* ## */ + + /* @594 '_' (7 pixels wide) */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + 0x80, 0x00, /* # */ + + /* @608 '`' (3 pixels wide) */ + 0x00, 0x20, /* # */ + 0x00, 0x60, /* ## */ + 0x00, 0x40, /* # */ + + /* @614 'a' (5 pixels wide) */ + 0x18, 0x00, /* ## */ + 0x25, 0x00, /* # # # */ + 0x25, 0x00, /* # # # */ + 0x35, 0x00, /* ## # # */ + 0x3E, 0x00, /* ##### */ + + /* @624 'b' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x23, 0x00, /* # ## */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x1E, 0x00, /* #### */ + + /* @634 'c' (5 pixels wide) */ + 0x1E, 0x00, /* #### */ + 0x33, 0x00, /* ## ## */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + + /* @644 'd' (5 pixels wide) */ + 0x1E, 0x00, /* #### */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x11, 0x00, /* # # */ + 0x3F, 0xC0, /* ######## */ + + /* @654 'e' (5 pixels wide) */ + 0x1E, 0x00, /* #### */ + 0x35, 0x00, /* ## # # */ + 0x25, 0x00, /* # # # */ + 0x25, 0x00, /* # # # */ + 0x26, 0x00, /* # ## */ + + /* @664 'f' (7 pixels wide) */ + 0x02, 0x00, /* # */ + 0x02, 0x00, /* # */ + 0x3F, 0x80, /* ####### */ + 0x02, 0x40, /* # # */ + 0x02, 0x40, /* # # */ + 0x02, 0x40, /* # # */ + 0x00, 0x40, /* # */ + + /* @678 'g' (6 pixels wide) */ + 0xFE, 0x00, /* ####### */ + 0xA9, 0x00, /* # # # # */ + 0xA9, 0x00, /* # # # # */ + 0xA9, 0x00, /* # # # # */ + 0x67, 0x00, /* ## ### */ + 0x01, 0x00, /* # */ + + /* @690 'h' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x02, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x3E, 0x00, /* ##### */ + + /* @700 'i' (5 pixels wide) */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x3F, 0x60, /* ###### ## */ + 0x20, 0x60, /* # ## */ + 0x20, 0x00, /* # */ + + /* @710 'j' (4 pixels wide) */ + 0x81, 0x00, /* # # */ + 0x81, 0x00, /* # # */ + 0x81, 0x60, /* # # ## */ + 0x7F, 0x60, /* ####### ## */ + + /* @718 'k' (5 pixels wide) */ + 0x3F, 0xC0, /* ######## */ + 0x04, 0x00, /* # */ + 0x0A, 0x00, /* # # */ + 0x11, 0x00, /* # # */ + 0x20, 0x00, /* # */ + + /* @728 'l' (5 pixels wide) */ + 0x20, 0x40, /* # # */ + 0x20, 0x40, /* # # */ + 0x3F, 0xC0, /* ######## */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + + /* @738 'm' (5 pixels wide) */ + 0x3F, 0x00, /* ###### */ + 0x01, 0x00, /* # */ + 0x3F, 0x00, /* ###### */ + 0x01, 0x00, /* # */ + 0x3F, 0x00, /* ###### */ + + /* @748 'n' (5 pixels wide) */ + 0x3F, 0x00, /* ###### */ + 0x03, 0x00, /* ## */ + 0x01, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x3E, 0x00, /* ##### */ + + /* @758 'o' (5 pixels wide) */ + 0x1E, 0x00, /* #### */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x1E, 0x00, /* #### */ + + /* @768 'p' (5 pixels wide) */ + 0xFF, 0x00, /* ######## */ + 0x23, 0x00, /* # ## */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x1E, 0x00, /* #### */ + + /* @778 'q' (5 pixels wide) */ + 0x1E, 0x00, /* #### */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + 0x11, 0x00, /* # # */ + 0xFF, 0x00, /* ######## */ + + /* @788 'r' (5 pixels wide) */ + 0x3F, 0x00, /* ###### */ + 0x02, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x03, 0x00, /* ## */ + + /* @798 's' (4 pixels wide) */ + 0x26, 0x00, /* # ## */ + 0x25, 0x00, /* # # # */ + 0x29, 0x00, /* # # # */ + 0x19, 0x00, /* ## # */ + + /* @806 't' (5 pixels wide) */ + 0x01, 0x00, /* # */ + 0x01, 0x00, /* # */ + 0x3F, 0xC0, /* ######## */ + 0x21, 0x00, /* # # */ + 0x21, 0x00, /* # # */ + + /* @816 'u' (5 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x20, 0x00, /* # */ + 0x20, 0x00, /* # */ + 0x30, 0x00, /* ## */ + 0x3F, 0x00, /* ###### */ + + /* @826 'v' (5 pixels wide) */ + 0x07, 0x00, /* ### */ + 0x18, 0x00, /* ## */ + 0x20, 0x00, /* # */ + 0x18, 0x00, /* ## */ + 0x07, 0x00, /* ### */ + + /* @836 'w' (5 pixels wide) */ + 0x1F, 0x00, /* ##### */ + 0x30, 0x00, /* ## */ + 0x0E, 0x00, /* ### */ + 0x18, 0x00, /* ## */ + 0x3F, 0x00, /* ###### */ + + /* @846 'x' (7 pixels wide) */ + 0x20, 0x00, /* # */ + 0x31, 0x00, /* ## # */ + 0x0B, 0x00, /* # ## */ + 0x04, 0x00, /* # */ + 0x0B, 0x00, /* # ## */ + 0x31, 0x00, /* ## # */ + 0x20, 0x00, /* # */ + + /* @860 'y' (6 pixels wide) */ + 0x80, 0x00, /* # */ + 0x83, 0x00, /* # ## */ + 0xDC, 0x00, /* ## ### */ + 0x30, 0x00, /* ## */ + 0x0C, 0x00, /* ## */ + 0x03, 0x00, /* ## */ + + /* @872 'z' (5 pixels wide) */ + 0x21, 0x00, /* # # */ + 0x31, 0x00, /* ## # */ + 0x2D, 0x00, /* # ## # */ + 0x23, 0x00, /* # ## */ + 0x21, 0x00, /* # # */ + + /* @882 '{' (5 pixels wide) */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + 0x7B, 0x80, /* #### ### */ + 0x80, 0x40, /* # # */ + 0x80, 0x40, /* # # */ + + /* @892 '|' (1 pixels wide) */ + 0xFF, 0xF0, /* ############ */ + + /* @894 '}' (5 pixels wide) */ + 0x80, 0x40, /* # # */ + 0x80, 0x40, /* # # */ + 0x7B, 0x80, /* #### ### */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + + /* @904 '~' (6 pixels wide) */ + 0x0C, 0x00, /* ## */ + 0x04, 0x00, /* # */ + 0x04, 0x00, /* # */ + 0x08, 0x00, /* # */ + 0x08, 0x00, /* # */ + 0x0C, 0x00, /* ## */ +}; + +/* Character descriptors for Consolas 9pt */ +/* { [Char width in bits], [Offset into consolas9ptCharBitmaps in bytes] } */ +const FONT_CHAR_INFO consolas9ptCharDescriptors[] = +{ + {2, 0}, /* */ + {2, 4}, /* ! */ + {3, 8}, /* " */ + {6, 14}, /* # */ + {5, 26}, /* $ */ + {7, 36}, /* % */ + {7, 50}, /* & */ + {1, 64}, /* ' */ + {3, 66}, /* ( */ + {3, 72}, /* ) */ + {5, 78}, /* * */ + {5, 88}, /* + */ + {3, 98}, /* , */ + {4, 104}, /* - */ + {2, 112}, /* . */ + {5, 116}, /* / */ + {6, 126}, /* 0 */ + {5, 138}, /* 1 */ + {5, 148}, /* 2 */ + {5, 158}, /* 3 */ + {6, 168}, /* 4 */ + {5, 180}, /* 5 */ + {5, 190}, /* 6 */ + {5, 200}, /* 7 */ + {5, 210}, /* 8 */ + {5, 220}, /* 9 */ + {2, 230}, /* : */ + {3, 234}, /* ; */ + {5, 240}, /* < */ + {5, 250}, /* = */ + {5, 260}, /* > */ + {4, 270}, /* ? */ + {7, 278}, /* @ */ + {5, 292}, /* A */ + {5, 302}, /* B */ + {5, 312}, /* C */ + {5, 322}, /* D */ + {4, 332}, /* E */ + {4, 340}, /* F */ + {6, 348}, /* G */ + {5, 360}, /* H */ + {5, 370}, /* I */ + {4, 380}, /* J */ + {5, 388}, /* K */ + {4, 398}, /* L */ + {6, 406}, /* M */ + {5, 418}, /* N */ + {6, 428}, /* O */ + {5, 440}, /* P */ + {6, 450}, /* Q */ + {6, 462}, /* R */ + {5, 474}, /* S */ + {5, 484}, /* T */ + {5, 494}, /* U */ + {5, 504}, /* V */ + {5, 514}, /* W */ + {7, 524}, /* X */ + {7, 538}, /* Y */ + {5, 552}, /* Z */ + {3, 562}, /* [ */ + {5, 568}, /* \ */ + {3, 578}, /* ] */ + {5, 584}, /* ^ */ + {7, 594}, /* _ */ + {3, 608}, /* ` */ + {5, 614}, /* a */ + {5, 624}, /* b */ + {5, 634}, /* c */ + {5, 644}, /* d */ + {5, 654}, /* e */ + {7, 664}, /* f */ + {6, 678}, /* g */ + {5, 690}, /* h */ + {5, 700}, /* i */ + {4, 710}, /* j */ + {5, 718}, /* k */ + {5, 728}, /* l */ + {5, 738}, /* m */ + {5, 748}, /* n */ + {5, 758}, /* o */ + {5, 768}, /* p */ + {5, 778}, /* q */ + {5, 788}, /* r */ + {4, 798}, /* s */ + {5, 806}, /* t */ + {5, 816}, /* u */ + {5, 826}, /* v */ + {5, 836}, /* w */ + {7, 846}, /* x */ + {6, 860}, /* y */ + {5, 872}, /* z */ + {5, 882}, /* { */ + {1, 892}, /* | */ + {5, 894}, /* } */ + {6, 904}, /* ~ */ +}; + +/* Font information for Consolas 9pt */ +const FONT_INFO consolas9ptFontInfo = +{ + 2, /* Character height */ + ' ', /* Start character */ + consolas9ptCharDescriptors, /* Character decriptor array */ + consolas9ptCharBitmaps, /* Character bitmap array */ +}; diff --git a/macusbfb/drivers/lcd/fonts/consolas9.h b/macusbfb/drivers/lcd/fonts/consolas9.h new file mode 100644 index 0000000..483880d --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/consolas9.h @@ -0,0 +1,6 @@ +#include "bitmapfonts.h" + +/* Font data for Consolas 9pt */ +extern const uint8_t consolas9ptCharBitmaps[]; +extern const FONT_CHAR_INFO consolas9ptCharDescriptors[]; +extern const FONT_INFO consolas9ptFontInfo; diff --git a/macusbfb/drivers/lcd/fonts/smallfonts.c b/macusbfb/drivers/lcd/fonts/smallfonts.c new file mode 100644 index 0000000..925f122 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/smallfonts.c @@ -0,0 +1,561 @@ +/* Partially based on original code for the KS0108 by Stephane Rey */ +/* Current version by Kevin Townsend */ + +/**************************************************************************/ +/*! + @file smallfonts.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include "sysdefs.h" +#include "smallfonts.h" + +#if defined CFG_LCD_INCLUDESMALLFONTS & CFG_LCD_INCLUDESMALLFONTS == 1 + +/* Global variables */ +const struct FONT_DEF Font_System3x6 = {3, 6, 32, 96, au8FontSystem3x6}; +const struct FONT_DEF Font_System5x8 = {5, 8, 32, 128, au8FontSystem5x8}; +const struct FONT_DEF Font_System7x8 = {7, 8, 32, 128, au8FontSystem7x8}; +const struct FONT_DEF Font_8x8 = {8, 8, 32, 128, au8Font8x8}; +const struct FONT_DEF Font_8x8Thin = {8, 8, 32, 128, au8Font8x8Thin}; + +/* System 3x6 - UPPER CASE ONLY */ +const uint8_t au8FontSystem3x6[]= { + 0x00,0x00,0x00, /* Space */ + 0x00,0x5C,0x00, /* ! */ + 0x0C,0x00,0x0C, /* " */ + 0x7C,0x28,0x7C, /* # */ + 0x7C,0x44,0x7C, /* 0x */ + 0x24,0x10,0x48, /* % */ + 0x28,0x54,0x08, /* & */ + 0x00,0x0C,0x00, /* ' */ + 0x38,0x44,0x00, /* ( */ + 0x44,0x38,0x00, /* ) */ + 0x20,0x10,0x08, /* // */ + 0x10,0x38,0x10, /* + */ + 0x80,0x40,0x00, /* , */ + 0x10,0x10,0x10, /* - */ + 0x00,0x40,0x00, /* . */ + 0x20,0x10,0x08, /* / */ + 0x38,0x44,0x38, /* 0 */ + 0x00,0x7C,0x00, /* 1 */ + 0x64,0x54,0x48, /* 2 */ + 0x44,0x54,0x28, /* 3 */ + 0x1C,0x10,0x7C, /* 4 */ + 0x4C,0x54,0x24, /* 5 */ + 0x38,0x54,0x20, /* 6 */ + 0x04,0x74,0x0C, /* 7 */ + 0x28,0x54,0x28, /* 8 */ + 0x08,0x54,0x38, /* 9 */ + 0x00,0x50,0x00, /* : */ + 0x80,0x50,0x00, /* ; */ + 0x10,0x28,0x44, /* < */ + 0x28,0x28,0x28, /* = */ + 0x44,0x28,0x10, /* > */ + 0x04,0x54,0x08, /* ? */ + 0x38,0x4C,0x5C, /* @ */ + 0x78,0x14,0x78, /* A */ + 0x7C,0x54,0x28, /* B */ + 0x38,0x44,0x44, /* C */ + 0x7C,0x44,0x38, /* D */ + 0x7C,0x54,0x44, /* E */ + 0x7C,0x14,0x04, /* F */ + 0x38,0x44,0x34, /* G */ + 0x7C,0x10,0x7C, /* H */ + 0x00,0x7C,0x00, /* I */ + 0x20,0x40,0x3C, /* J */ + 0x7C,0x10,0x6C, /* K */ + 0x7C,0x40,0x40, /* L */ + 0x7C,0x08,0x7C, /* M */ + 0x7C,0x04,0x7C, /* N */ + 0x7C,0x44,0x7C, /* O */ + 0x7C,0x14,0x08, /* P */ + 0x38,0x44,0x78, /* Q */ + 0x7C,0x14,0x68, /* R */ + 0x48,0x54,0x24, /* S */ + 0x04,0x7C,0x04, /* T */ + 0x7C,0x40,0x7C, /* U */ + 0x3C,0x40,0x3C, /* V */ + 0x7C,0x20,0x7C, /* W */ + 0x6C,0x10,0x6C, /* X */ + 0x1C,0x60,0x1C, /* Y */ + 0x64,0x54,0x4C, /* Z */ + 0x7C,0x44,0x00, /* [ */ + 0x08,0x10,0x20, /* \ */ + 0x44,0x7C,0x00, /* ] */ + 0x08,0x04,0x08, /* ^ */ + 0x80,0x80,0x80, /* _ */ + 0x04,0x08,0x00 /* ` */ +}; + +/* System 5x8 */ +const uint8_t au8FontSystem5x8[]= +{ + 0x00,0x00,0x00,0x00,0x00, /* Space */ + 0x00,0x00,0x4f,0x00,0x00, /* ! */ + 0x00,0x07,0x00,0x07,0x00, /* " */ + 0x14,0x7f,0x14,0x7f,0x14, /* # */ + 0x24,0x2a,0x7f,0x2a,0x12, /* 0x */ + 0x23,0x13,0x08,0x64,0x62, /* % */ + 0x36,0x49,0x55,0x22,0x20, /* & */ + 0x00,0x05,0x03,0x00,0x00, /* ' */ + 0x00,0x1c,0x22,0x41,0x00, /* ( */ + 0x00,0x41,0x22,0x1c,0x00, /* ) */ + 0x14,0x08,0x3e,0x08,0x14, /* // */ + 0x08,0x08,0x3e,0x08,0x08, /* + */ + 0x50,0x30,0x00,0x00,0x00, /* , */ + 0x08,0x08,0x08,0x08,0x08, /* - */ + 0x00,0x60,0x60,0x00,0x00, /* . */ + 0x20,0x10,0x08,0x04,0x02, /* / */ + 0x3e,0x51,0x49,0x45,0x3e, /* 0 */ + 0x00,0x42,0x7f,0x40,0x00, /* 1 */ + 0x42,0x61,0x51,0x49,0x46, /* 2 */ + 0x21,0x41,0x45,0x4b,0x31, /* 3 */ + 0x18,0x14,0x12,0x7f,0x10, /* 4 */ + 0x27,0x45,0x45,0x45,0x39, /* 5 */ + 0x3c,0x4a,0x49,0x49,0x30, /* 6 */ + 0x01,0x71,0x09,0x05,0x03, /* 7 */ + 0x36,0x49,0x49,0x49,0x36, /* 8 */ + 0x06,0x49,0x49,0x29,0x1e, /* 9 */ + 0x00,0x36,0x36,0x00,0x00, /* : */ + 0x00,0x56,0x36,0x00,0x00, /* ; */ + 0x08,0x14,0x22,0x41,0x00, /* < */ + 0x14,0x14,0x14,0x14,0x14, /* = */ + 0x00,0x41,0x22,0x14,0x08, /* > */ + 0x02,0x01,0x51,0x09,0x06, /* ? */ + 0x3e,0x41,0x5d,0x55,0x1e, /* @ */ + 0x7e,0x11,0x11,0x11,0x7e, /* A */ + 0x7f,0x49,0x49,0x49,0x36, /* B */ + 0x3e,0x41,0x41,0x41,0x22, /* C */ + 0x7f,0x41,0x41,0x22,0x1c, /* D */ + 0x7f,0x49,0x49,0x49,0x41, /* E */ + 0x7f,0x09,0x09,0x09,0x01, /* F */ + 0x3e,0x41,0x49,0x49,0x7a, /* G */ + 0x7f,0x08,0x08,0x08,0x7f, /* H */ + 0x00,0x41,0x7f,0x41,0x00, /* I */ + 0x20,0x40,0x41,0x3f,0x01, /* J */ + 0x7f,0x08,0x14,0x22,0x41, /* K */ + 0x7f,0x40,0x40,0x40,0x40, /* L */ + 0x7f,0x02,0x0c,0x02,0x7f, /* M */ + 0x7f,0x04,0x08,0x10,0x7f, /* N */ + 0x3e,0x41,0x41,0x41,0x3e, /* O */ + 0x7f,0x09,0x09,0x09,0x06, /* P */ + 0x3e,0x41,0x51,0x21,0x5e, /* Q */ + 0x7f,0x09,0x19,0x29,0x46, /* R */ + 0x26,0x49,0x49,0x49,0x32, /* S */ + 0x01,0x01,0x7f,0x01,0x01, /* T */ + 0x3f,0x40,0x40,0x40,0x3f, /* U */ + 0x1f,0x20,0x40,0x20,0x1f, /* V */ + 0x3f,0x40,0x38,0x40,0x3f, /* W */ + 0x63,0x14,0x08,0x14,0x63, /* X */ + 0x07,0x08,0x70,0x08,0x07, /* Y */ + 0x61,0x51,0x49,0x45,0x43, /* Z */ + 0x00,0x7f,0x41,0x41,0x00, /* [ */ + 0x02,0x04,0x08,0x10,0x20, /* \ */ + 0x00,0x41,0x41,0x7f,0x00, /* ] */ + 0x04,0x02,0x01,0x02,0x04, /* ^ */ + 0x40,0x40,0x40,0x40,0x40, /* _ */ + 0x00,0x00,0x03,0x05,0x00, /* ` */ + 0x20,0x54,0x54,0x54,0x78, /* a */ + 0x7F,0x44,0x44,0x44,0x38, /* b */ + 0x38,0x44,0x44,0x44,0x44, /* c */ + 0x38,0x44,0x44,0x44,0x7f, /* d */ + 0x38,0x54,0x54,0x54,0x18, /* e */ + 0x04,0x04,0x7e,0x05,0x05, /* f */ + 0x08,0x54,0x54,0x54,0x3c, /* g */ + 0x7f,0x08,0x04,0x04,0x78, /* h */ + 0x00,0x44,0x7d,0x40,0x00, /* i */ + 0x20,0x40,0x44,0x3d,0x00, /* j */ + 0x7f,0x10,0x28,0x44,0x00, /* k */ + 0x00,0x41,0x7f,0x40,0x00, /* l */ + 0x7c,0x04,0x7c,0x04,0x78, /* m */ + 0x7c,0x08,0x04,0x04,0x78, /* n */ + 0x38,0x44,0x44,0x44,0x38, /* o */ + 0x7c,0x14,0x14,0x14,0x08, /* p */ + 0x08,0x14,0x14,0x14,0x7c, /* q */ + 0x7c,0x08,0x04,0x04,0x00, /* r */ + 0x48,0x54,0x54,0x54,0x24, /* s */ + 0x04,0x04,0x3f,0x44,0x44, /* t */ + 0x3c,0x40,0x40,0x20,0x7c, /* u */ + 0x1c,0x20,0x40,0x20,0x1c, /* v */ + 0x3c,0x40,0x30,0x40,0x3c, /* w */ + 0x44,0x28,0x10,0x28,0x44, /* x */ + 0x0c,0x50,0x50,0x50,0x3c, /* y */ + 0x44,0x64,0x54,0x4c,0x44, /* z */ + 0x08,0x36,0x41,0x41,0x00, /* { */ + 0x00,0x00,0x77,0x00,0x00, /* | */ + 0x00,0x41,0x41,0x36,0x08, /* } */ + 0x08,0x08,0x2a,0x1c,0x08, /* <- */ + 0x08,0x1c,0x2a,0x08,0x08, /* -> */ + 0xff,0xff,0xff,0xff,0xff, /*  */ +}; + +/* System 7x8 */ +const uint8_t au8FontSystem7x8[]= +{ + 0, 0, 0, 0, 0, 0, 0, //' ' + 0, 6, 95, 95, 6, 0, 0, //'!' + 0, 7, 7, 0, 7, 7, 0, //'"' + 20, 127, 127, 20, 127, 127, 20, //'#' + 36, 46, 107, 107, 58, 18, 0, //'$' + 70, 102, 48, 24, 12, 102, 98, //'%' + 48, 122, 79, 93, 55, 122, 72, //'&' + 4, 7, 3, 0, 0, 0, 0, //''' + 0, 28, 62, 99, 65, 0, 0, //'(' + 0, 65, 99, 62, 28, 0, 0, //')' + 8, 42, 62, 28, 28, 62, 42, //'*' + 8, 8, 62, 62, 8, 8, 0, //'+' + 0, 128, 224, 96, 0, 0, 0, //',' + 8, 8, 8, 8, 8, 8, 0, //'-' + 0, 0, 96, 96, 0, 0, 0, //'.' + 96, 48, 24, 12, 6, 3, 1, //'/' + 62, 127, 113, 89, 77, 127, 62, //'0' + 64, 66, 127, 127, 64, 64, 0, //'1' + 98, 115, 89, 73, 111, 102, 0, //'2' + 34, 99, 73, 73, 127, 54, 0, //'3' + 24, 28, 22, 83, 127, 127, 80, //'4' + 39, 103, 69, 69, 125, 57, 0, //'5' + 60, 126, 75, 73, 121, 48, 0, //'6' + 3, 3, 113, 121, 15, 7, 0, //'7' + 54, 127, 73, 73, 127, 54, 0, //'8' + 6, 79, 73, 105, 63, 30, 0, //'9' + 0, 0, 102, 102, 0, 0, 0, //':' + 0, 128, 230, 102, 0, 0, 0, //';' + 8, 28, 54, 99, 65, 0, 0, //'<' + 36, 36, 36, 36, 36, 36, 0, //'=' + 0, 65, 99, 54, 28, 8, 0, //'>' + 2, 3, 81, 89, 15, 6, 0, //'?' + 62, 127, 65, 93, 93, 31, 30, //'@' + 124,126, 19, 19, 126, 124, 0, //'A' + 65, 127, 127, 73, 73, 127, 54, //'B' + 28, 62, 99, 65, 65, 99, 34, //'C' + 65, 127, 127, 65, 99, 62, 28, //'D' + 65, 127, 127, 73, 93, 65, 99, //'E' + 65, 127, 127, 73, 29, 1, 3, //'F' + 28, 62, 99, 65, 81, 115, 114, //'G' + 127,127, 8, 8, 127, 127, 0, //'H' + 0, 65, 127, 127, 65, 0, 0, //'I' + 48, 112, 64, 65, 127, 63, 1, //'J' + 65, 127, 127, 8, 28, 119, 99, //'K' + 65, 127, 127, 65, 64, 96, 112, //'L' + 127,127, 14, 28, 14, 127, 127, //'M' + 127,127, 6, 12, 24, 127, 127, //'N' + 28, 62, 99, 65, 99, 62, 28, //'O' + 65, 127, 127, 73, 9, 15, 6, //'P' + 30, 63, 33, 113, 127, 94, 0, //'Q' + 65, 127, 127, 9, 25, 127, 102, //'R' + 38, 111, 77, 89, 115, 50, 0, //'S' + 3, 65, 127, 127, 65, 3, 0, //'T' + 127,127, 64, 64, 127, 127, 0, //'U' + 31, 63, 96, 96, 63, 31, 0, //'V' + 127,127, 48, 24, 48, 127, 127, //'W' + 67, 103, 60, 24, 60, 103, 67, //'X' + 7, 79, 120, 120, 79, 7, 0, //'Y' + 71, 99, 113, 89, 77, 103, 115, //'Z' + 0, 127, 127, 65, 65, 0, 0, //'[' + 1, 3, 6, 12, 24, 48, 96, //'\' + 0, 65, 65, 127, 127, 0, 0, //']' + 8, 12, 6, 3, 6, 12, 8, //'^' + 128,128, 128, 128, 128, 128, 128, //'_' + 0, 0, 3, 7, 4, 0, 0, //'`' + 32, 116, 84, 84, 60, 120, 64, //'a' + 65, 127, 63, 72, 72, 120, 48, //'b' + 56, 124, 68, 68, 108, 40, 0, //'c' + 48, 120, 72, 73, 63, 127, 64, //'d' + 56, 124, 84, 84, 92, 24, 0, //'e' + 72, 126, 127, 73, 3, 2, 0, //'f' + 56, 188, 164, 164, 252, 120, 0, //'g' + 65, 127, 127, 8, 4, 124, 120, //'h' + 0, 68, 125, 125, 64, 0, 0, //'i' + 96, 224, 128, 128, 253, 125, 0, //'j' + 65, 127, 127, 16, 56, 108, 68, //'k' + 0, 65, 127, 127, 64, 0, 0, //'l' + 120,124, 28, 56, 28, 124, 120, //'m' + 124,124, 4, 4, 124, 120, 0, //'n' + 56, 124, 68, 68, 124, 56, 0, //'o' + 0, 252, 252, 164, 36, 60, 24, //'p' + 24, 60, 36, 164, 248, 252, 132, //'q' + 68, 124, 120, 76, 4, 28, 24, //'r' + 72, 92, 84, 84, 116, 36, 0, //'s' + 0, 4, 62, 127, 68, 36, 0, //'t' + 60, 124, 64, 64, 60, 124, 64, //'u' + 28, 60, 96, 96, 60, 28, 0, //'v' + 60, 124, 112, 56, 112, 124, 60, //'w' + 68, 108, 56, 16, 56, 108, 68, //'x' + 60, 188, 160, 160, 252, 124, 0, //'y' + 76, 100, 116, 92, 76, 100, 0, //'z' + 8, 8, 62, 119, 65, 65, 0, //'{' + 0, 0, 0, 119, 119, 0, 0, //'|' + 65, 65, 119, 62, 8, 8, 0, //'}' + 2, 3, 1, 3, 2, 3, 1, //'~' + 255,129, 129, 129, 129, 129, 255, //'' + 14, 159, 145, 177, 251, 74, 0 //'Á' +}; + +/* 8x8 Normal */ +const uint8_t au8Font8x8[]= { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ASCII - 32 + 0x00,0x00,0x00,0x5F,0x5F,0x00,0x00,0x00, // ASCII - 33 + 0x00,0x00,0x03,0x07,0x00,0x07,0x03,0x00, // ASCII - 34 + 0x00,0x10,0x74,0x1C,0x77,0x1C,0x17,0x04, // ASCII - 35 + 0x00,0x24,0x2E,0x2A,0x7F,0x2A,0x3A,0x10, // ASCII - 36 + 0x00,0x4C,0x6A,0x76,0x1A,0x6A,0x56,0x33, // ASCII - 37 + 0x00,0x30,0x7A,0x4F,0x5D,0x37,0x7A,0x48, // ASCII - 38 + 0x00,0x00,0x04,0x07,0x03,0x00,0x00,0x00, // ASCII - 39 + 0x00,0x00,0x00,0x1C,0x3E,0x63,0x41,0x00, // ASCII - 40 + 0x00,0x00,0x41,0x63,0x3E,0x1C,0x00,0x00, // ASCII - 41 + 0x00,0x08,0x2A,0x3E,0x1C,0x3E,0x2A,0x08, // ASCII - 42 + 0x00,0x08,0x08,0x3E,0x3E,0x08,0x08,0x00, // ASCII - 43 + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, // ASCII - 44 + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, // ASCII - 45 + 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, // ASCII - 46 + 0x00,0x60,0x30,0x18,0x0C,0x06,0x03,0x01, // ASCII - 47 + 0x00,0x1C,0x3E,0x61,0x43,0x3E,0x1C,0x00, // ASCII - 48 + 0x00,0x00,0x44,0x7F,0x7F,0x40,0x00,0x00, // ASCII - 49 + 0x00,0x46,0x67,0x71,0x59,0x4F,0x66,0x00, // ASCII - 50 + 0x00,0x22,0x63,0x49,0x4D,0x7F,0x32,0x00, // ASCII - 51 + 0x00,0x18,0x1C,0x52,0x7F,0x7F,0x50,0x00, // ASCII - 52 + 0x00,0x2F,0x6F,0x45,0x45,0x7D,0x39,0x00, // ASCII - 53 + 0x00,0x3C,0x7E,0x4B,0x49,0x79,0x30,0x00, // ASCII - 54 + 0x00,0x07,0x43,0x71,0x7D,0x0F,0x03,0x00, // ASCII - 55 + 0x00,0x36,0x7F,0x4D,0x59,0x7F,0x36,0x00, // ASCII - 56 + 0x00,0x06,0x4F,0x49,0x69,0x3F,0x1E,0x00, // ASCII - 57 + 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, // ASCII - 58 + 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, // ASCII - 59 + 0x00,0x00,0x08,0x1C,0x36,0x63,0x41,0x00, // ASCII - 60 + 0x00,0x14,0x14,0x14,0x14,0x14,0x14,0x00, // ASCII - 61 + 0x00,0x00,0x41,0x63,0x36,0x1C,0x08,0x00, // ASCII - 62 + 0x00,0x02,0x07,0x51,0x59,0x0F,0x06,0x00, // ASCII - 63 + 0x00,0x3E,0x41,0x5D,0x55,0x5D,0x51,0x1E, // ASCII - 64 + 0x00,0x40,0x70,0x1D,0x17,0x1F,0x78,0x60, // ASCII - 65 + 0x00,0x41,0x7F,0x7F,0x49,0x4F,0x7E,0x30, // ASCII - 66 + 0x00,0x1C,0x3E,0x63,0x41,0x41,0x42,0x27, // ASCII - 67 + 0x00,0x41,0x7F,0x7F,0x41,0x63,0x3E,0x1C, // ASCII - 68 + 0x00,0x41,0x7F,0x7F,0x49,0x5D,0x41,0x63, // ASCII - 69 + 0x00,0x41,0x7F,0x7F,0x49,0x1D,0x01,0x03, // ASCII - 70 + 0x00,0x1C,0x3E,0x63,0x41,0x51,0x72,0x77, // ASCII - 71 + 0x00,0x7F,0x7F,0x08,0x08,0x7F,0x7F,0x00, // ASCII - 72 + 0x00,0x00,0x41,0x7F,0x7F,0x41,0x00,0x00, // ASCII - 73 + 0x00,0x30,0x70,0x41,0x41,0x7F,0x3F,0x01, // ASCII - 74 + 0x00,0x7F,0x7F,0x08,0x1C,0x77,0x63,0x41, // ASCII - 75 + 0x00,0x41,0x7F,0x7F,0x41,0x40,0x60,0x70, // ASCII - 76 + 0x00,0x7F,0x7E,0x0C,0x18,0x0C,0x7E,0x7F, // ASCII - 77 + 0x00,0x7F,0x7E,0x0C,0x18,0x30,0x7F,0x7F, // ASCII - 78 + 0x00,0x1C,0x3E,0x63,0x41,0x63,0x3E,0x1C, // ASCII - 79 + 0x00,0x41,0x7F,0x7F,0x49,0x09,0x0F,0x06, // ASCII - 80 + 0x00,0x1C,0x3E,0x63,0x51,0x63,0x3E,0x1C, // ASCII - 81 + 0x00,0x7F,0x7F,0x09,0x19,0x7F,0x66,0x40, // ASCII - 82 + 0x00,0x66,0x6F,0x4D,0x59,0x7B,0x33,0x00, // ASCII - 83 + 0x00,0x03,0x41,0x7F,0x7F,0x41,0x03,0x00, // ASCII - 84 + 0x00,0x3F,0x7F,0x40,0x40,0x40,0x7F,0x3F, // ASCII - 85 + 0x00,0x03,0x0F,0x3D,0x70,0x1D,0x07,0x01, // ASCII - 86 + 0x00,0x0F,0x7F,0x30,0x1C,0x30,0x7F,0x0F, // ASCII - 87 + 0x00,0x63,0x77,0x1C,0x1C,0x77,0x63,0x00, // ASCII - 88 + 0x01,0x03,0x47,0x7C,0x78,0x47,0x03,0x01, // ASCII - 89 + 0x00,0x67,0x73,0x59,0x4D,0x67,0x73,0x00, // ASCII - 90 + 0x00,0x00,0x00,0x7F,0x7F,0x41,0x41,0x00, // ASCII - 91 + 0x00,0x01,0x03,0x06,0x0C,0x18,0x30,0x60, // ASCII - 92 + 0x00,0x00,0x41,0x41,0x7F,0x7F,0x00,0x00, // ASCII - 93 + 0x00,0x00,0x04,0x06,0x03,0x06,0x04,0x00, // ASCII - 94 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ASCII - 95 + 0x00,0x00,0x01,0x03,0x06,0x04,0x00,0x00, // ASCII - 96 + 0x00,0x68,0x6C,0x54,0x54,0x3C,0x78,0x40, // ASCII - 97 + 0x00,0x41,0x7F,0x3F,0x6C,0x44,0x7C,0x38, // ASCII - 98 + 0x00,0x38,0x7C,0x44,0x44,0x6C,0x2C,0x00, // ASCII - 99 + 0x00,0x38,0x7C,0x44,0x49,0x3F,0x7F,0x40, // ASCII - 100 + 0x00,0x38,0x7C,0x54,0x54,0x5C,0x58,0x00, // ASCII - 101 + 0x00,0x00,0x48,0x7E,0x7F,0x49,0x0B,0x02, // ASCII - 102 + 0x00,0x48,0x7C,0x34,0x34,0x2C,0x68,0x44, // ASCII - 103 + 0x00,0x41,0x7F,0x7F,0x08,0x04,0x7C,0x78, // ASCII - 104 + 0x00,0x00,0x44,0x7D,0x7D,0x40,0x00,0x00, // ASCII - 105 + 0x00,0x60,0x60,0x04,0x7D,0x7D,0x00,0x00, // ASCII - 106 + 0x00,0x41,0x7F,0x7F,0x10,0x78,0x6C,0x44, // ASCII - 107 + 0x00,0x00,0x41,0x7F,0x7F,0x40,0x00,0x00, // ASCII - 108 + 0x00,0x7C,0x7C,0x0C,0x78,0x0C,0x7C,0x78, // ASCII - 109 + 0x00,0x44,0x7C,0x7C,0x08,0x04,0x7C,0x78, // ASCII - 110 + 0x00,0x38,0x7C,0x44,0x44,0x7C,0x38,0x00, // ASCII - 111 + 0x00,0x04,0x7C,0x78,0x24,0x24,0x3C,0x18, // ASCII - 112 + 0x00,0x18,0x3C,0x24,0x24,0x78,0x7C,0x00, // ASCII - 113 + 0x00,0x44,0x7C,0x78,0x4C,0x04,0x1C,0x18, // ASCII - 114 + 0x00,0x48,0x5C,0x5C,0x74,0x74,0x24,0x00, // ASCII - 115 + 0x00,0x00,0x04,0x3E,0x7F,0x44,0x24,0x00, // ASCII - 116 + 0x00,0x3C,0x7C,0x40,0x40,0x3C,0x7C,0x40, // ASCII - 117 + 0x00,0x04,0x1C,0x3C,0x60,0x30,0x1C,0x04, // ASCII - 118 + 0x00,0x1C,0x7C,0x30,0x1C,0x30,0x7C,0x1C, // ASCII - 119 + 0x00,0x44,0x6C,0x3C,0x10,0x78,0x6C,0x44, // ASCII - 120 + 0x00,0x44,0x4C,0x1C,0x70,0x64,0x1C,0x0C, // ASCII - 121 + 0x00,0x4C,0x64,0x74,0x5C,0x4C,0x64,0x00, // ASCII - 122 + 0x00,0x08,0x08,0x3E,0x77,0x41,0x41,0x00, // ASCII - 123 + 0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00, // ASCII - 124 + 0x00,0x41,0x41,0x77,0x3E,0x08,0x08,0x00, // ASCII - 125 + 0x00,0x02,0x01,0x01,0x03,0x02,0x02,0x01, // ASCII - 126 + 0x00,0x60,0x78,0x4E,0x47,0x5E,0x78,0x60, // ASCII - 127 + 0x00,0x1C,0x3E,0x23,0x41,0x41,0x42,0x27, // ASCII - 128 + 0x00,0x3D,0x7D,0x40,0x41,0x3D,0x7C,0x40, // ASCII - 129 +}; + +/* 8x8 Thin */ +const uint8_t au8Font8x8Thin[]= { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x00, + 0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00, + 0x00,0x14,0x7F,0x14,0x14,0x7F,0x14,0x00, + 0x00,0x24,0x2A,0x6B,0x6B,0x2A,0x12,0x00, + 0x00,0x46,0x26,0x10,0x08,0x64,0x62,0x00, + 0x30,0x4A,0x45,0x4D,0x32,0x48,0x48,0x00, + 0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00, + 0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00, + 0x00,0x00,0x41,0x22,0x1C,0x00,0x00,0x00, + 0x08,0x2A,0x1C,0x1C,0x1C,0x2A,0x08,0x00, + 0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, + 0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, + 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00, + 0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x00, + 0x00,0x3E,0x61,0x51,0x49,0x45,0x3E,0x00, + 0x00,0x44,0x42,0x7F,0x40,0x40,0x00,0x00, + 0x00,0x62,0x51,0x51,0x49,0x49,0x66,0x00, + 0x00,0x22,0x41,0x49,0x49,0x49,0x36,0x00, + 0x10,0x18,0x14,0x52,0x7F,0x50,0x10,0x00, + 0x00,0x27,0x45,0x45,0x45,0x45,0x39,0x00, + 0x00,0x3C,0x4A,0x49,0x49,0x49,0x30,0x00, + 0x00,0x03,0x01,0x71,0x09,0x05,0x03,0x00, + 0x00,0x36,0x49,0x49,0x49,0x49,0x36,0x00, + 0x00,0x06,0x49,0x49,0x49,0x29,0x1E,0x00, + 0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x00, + 0x00,0x00,0x80,0x66,0x00,0x00,0x00,0x00, + 0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00, + 0x00,0x24,0x24,0x24,0x24,0x24,0x24,0x00, + 0x00,0x00,0x00,0x41,0x22,0x14,0x08,0x00, + 0x00,0x02,0x01,0x01,0x51,0x09,0x06,0x00, + 0x00,0x3E,0x41,0x5D,0x55,0x55,0x1E,0x00, + 0x00,0x7C,0x12,0x11,0x11,0x12,0x7C,0x00, + 0x00,0x41,0x7F,0x49,0x49,0x49,0x36,0x00, + 0x00,0x1C,0x22,0x41,0x41,0x41,0x22,0x00, + 0x00,0x41,0x7F,0x41,0x41,0x22,0x1C,0x00, + 0x00,0x41,0x7F,0x49,0x5D,0x41,0x63,0x00, + 0x00,0x41,0x7F,0x49,0x1D,0x01,0x03,0x00, + 0x00,0x1C,0x22,0x41,0x51,0x51,0x72,0x00, + 0x00,0x7F,0x08,0x08,0x08,0x08,0x7F,0x00, + 0x00,0x00,0x41,0x7F,0x41,0x00,0x00,0x00, + 0x00,0x30,0x40,0x40,0x41,0x3F,0x01,0x00, + 0x00,0x41,0x7F,0x08,0x14,0x22,0x41,0x40, + 0x00,0x41,0x7F,0x41,0x40,0x40,0x60,0x00, + 0x00,0x7F,0x01,0x02,0x04,0x02,0x01,0x7F, + 0x00,0x7F,0x01,0x02,0x04,0x08,0x7F,0x00, + 0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,0x00, + 0x00,0x41,0x7F,0x49,0x09,0x09,0x06,0x00, + 0x00,0x1E,0x21,0x21,0x31,0x21,0x5E,0x40, + 0x00,0x41,0x7F,0x49,0x19,0x29,0x46,0x00, + 0x00,0x26,0x49,0x49,0x49,0x49,0x32,0x00, + 0x00,0x03,0x01,0x41,0x7F,0x41,0x01,0x03, + 0x00,0x3F,0x40,0x40,0x40,0x40,0x3F,0x00, + 0x00,0x0F,0x10,0x20,0x40,0x20,0x10,0x0F, + 0x00,0x3F,0x40,0x40,0x38,0x40,0x40,0x3F, + 0x00,0x41,0x22,0x14,0x08,0x14,0x22,0x41, + 0x00,0x01,0x02,0x44,0x78,0x44,0x02,0x01, + 0x00,0x43,0x61,0x51,0x49,0x45,0x43,0x61, + 0x00,0x7F,0x41,0x41,0x41,0x00,0x00,0x00, + 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x00, + 0x00,0x41,0x41,0x41,0x7F,0x00,0x00,0x00, + 0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x00, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00, + 0x00,0x20,0x54,0x54,0x54,0x54,0x78,0x40, + 0x00,0x01,0x7F,0x30,0x48,0x48,0x48,0x30, + 0x00,0x38,0x44,0x44,0x44,0x44,0x28,0x00, + 0x00,0x30,0x48,0x48,0x48,0x31,0x7F,0x40, + 0x00,0x38,0x54,0x54,0x54,0x54,0x18,0x00, + 0x00,0x00,0x48,0x7E,0x49,0x01,0x02,0x00, + 0x00,0x98,0xA4,0xA4,0xA4,0xA4,0x78,0x04, + 0x00,0x41,0x7F,0x08,0x04,0x04,0x78,0x00, + 0x00,0x00,0x44,0x7D,0x40,0x00,0x00,0x00, + 0x00,0x60,0x80,0x80,0x80,0x84,0x7D,0x00, + 0x00,0x01,0x7F,0x10,0x28,0x44,0x40,0x00, + 0x00,0x00,0x41,0x7F,0x40,0x00,0x00,0x00, + 0x00,0x7C,0x04,0x04,0x78,0x04,0x04,0x78, + 0x00,0x7C,0x08,0x04,0x04,0x04,0x78,0x00, + 0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00, + 0x00,0x84,0xFC,0x98,0x24,0x24,0x18,0x00, + 0x00,0x18,0x24,0x24,0x98,0xFC,0x84,0x00, + 0x00,0x44,0x7C,0x48,0x04,0x04,0x18,0x00, + 0x00,0x48,0x54,0x54,0x54,0x54,0x24,0x00, + 0x00,0x04,0x04,0x3F,0x44,0x44,0x20,0x00, + 0x00,0x3C,0x40,0x40,0x40,0x20,0x7C,0x00, + 0x00,0x0C,0x10,0x20,0x40,0x20,0x10,0x0C, + 0x00,0x3C,0x40,0x40,0x38,0x40,0x40,0x3C, + 0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00, + 0x00,0x9C,0xA0,0xA0,0xA0,0xA0,0x7C,0x00, + 0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00, + 0x00,0x08,0x08,0x36,0x41,0x41,0x00,0x00, + 0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00, + 0x00,0x00,0x41,0x41,0x36,0x08,0x08,0x00, + 0x00,0x02,0x01,0x01,0x02,0x02,0x01,0x00, + 0x00,0x70,0x48,0x44,0x42,0x44,0x48,0x70, + 0x00,0x0E,0x91,0x91,0xB1,0xB1,0x4A,0x00, + 0x00,0x3A,0x40,0x40,0x40,0x7A,0x40,0x00, + 0x00,0x38,0x54,0x54,0x55,0x55,0x18,0x00, + 0x00,0x22,0x55,0x55,0x55,0x79,0x42,0x00, + 0x00,0x21,0x54,0x54,0x54,0x78,0x41,0x00, + 0x00,0x20,0x55,0x55,0x54,0x78,0x40,0x00, + 0x00,0x20,0x54,0x55,0x54,0x78,0x40,0x00, + 0x00,0x18,0x24,0xA4,0xA4,0xE4,0x40,0x00, + 0x00,0x3A,0x55,0x55,0x55,0x55,0x1A,0x00, + 0x00,0x39,0x54,0x54,0x54,0x54,0x19,0x00, + 0x00,0x38,0x55,0x55,0x54,0x54,0x18,0x00, + 0x00,0x00,0x01,0x44,0x7C,0x41,0x00,0x00, + 0x02,0x01,0x45,0x7D,0x41,0x01,0x02,0x00, + 0x00,0x00,0x01,0x45,0x7C,0x40,0x00,0x00, + 0x00,0x79,0x14,0x12,0x12,0x14,0x79,0x00, + 0x00,0x70,0x28,0x2B,0x2B,0x28,0x70,0x00, + 0x00,0x44,0x7C,0x54,0x55,0x45,0x00,0x00, + 0x00,0x20,0x54,0x54,0x58,0x38,0x54,0x54, + 0x00,0x7C,0x0A,0x09,0x09,0x7F,0x49,0x49, + 0x00,0x30,0x4A,0x49,0x49,0x4A,0x30,0x00, + 0x00,0x32,0x48,0x48,0x48,0x48,0x32,0x00, + 0x00,0x30,0x49,0x4A,0x48,0x48,0x30,0x00, + 0x00,0x38,0x42,0x41,0x41,0x42,0x38,0x00, + 0x00,0x38,0x41,0x42,0x40,0x40,0x38,0x00, + 0x00,0x1A,0xA0,0xA0,0xA0,0xA0,0x7A,0x00, + 0x00,0x19,0x24,0x42,0x42,0x24,0x19,0x00, + 0x00,0x3D,0x40,0x40,0x40,0x40,0x3D,0x00, + 0x00,0x18,0x24,0x24,0xE7,0x24,0x24,0x00, + 0x00,0x68,0x5E,0x49,0x41,0x42,0x20,0x00, + 0x00,0x15,0x16,0x7C,0x16,0x15,0x00,0x00, + 0x81,0xFF,0x85,0x05,0x17,0xFA,0x90,0x50, + 0x40,0x88,0x88,0x7F,0x09,0x09,0x02,0x00, + 0x00,0x20,0x54,0x54,0x55,0x79,0x40,0x00, +}; + +#endif \ No newline at end of file diff --git a/macusbfb/drivers/lcd/fonts/smallfonts.h b/macusbfb/drivers/lcd/fonts/smallfonts.h new file mode 100644 index 0000000..99ad045 --- /dev/null +++ b/macusbfb/drivers/lcd/fonts/smallfonts.h @@ -0,0 +1,72 @@ +/**************************************************************************/ +/*! + @file smallfonts.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#ifndef __SMALLFONTS_H_ +#define __SMALLFONTS_H_ + +/* Partially based on original code for the KS0108 by Stephane Rey */ +/* Current version by Kevin Townsend */ +/* Last Updated: 12 May 2009 */ + +#include "projectconfig.h" + +#if defined CFG_LCD_INCLUDESMALLFONTS & CFG_LCD_INCLUDESMALLFONTS == 1 + +struct FONT_DEF +{ + uint8_t u8Width; /* Character width for storage */ + uint8_t u8Height; /* Character height for storage */ + uint8_t u8FirstChar; /* The first character available */ + uint8_t u8LastChar; /* The last character available */ + uint8_t *au8FontTable; /* Font table start address in memory */ +}; + +extern const struct FONT_DEF Font_System3x6; +extern const struct FONT_DEF Font_System5x8; +extern const struct FONT_DEF Font_System7x8; +extern const struct FONT_DEF Font_8x8; +extern const struct FONT_DEF Font_8x8Thin; + +extern const uint8_t au8FontSystem3x6[]; +extern const uint8_t au8FontSystem5x8[]; +extern const uint8_t au8FontSystem7x8[]; +extern const uint8_t au8Font8x8[]; +extern const uint8_t au8Font8x8Thin[]; + +#endif + +#endif diff --git a/macusbfb/drivers/lcd/hw/ILI9325.c b/macusbfb/drivers/lcd/hw/ILI9325.c new file mode 100644 index 0000000..781da20 --- /dev/null +++ b/macusbfb/drivers/lcd/hw/ILI9325.c @@ -0,0 +1,362 @@ +/**************************************************************************/ +/*! + @file ILI9325.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#include "ILI9325.h" + +/*************************************************/ +/* Private Methods */ +/*************************************************/ + +/*************************************************/ +void ili9325Delay(unsigned int t) +{ + unsigned char t1; + while(t--) + for ( t1=10; t1 > 0; t1-- ) + { + __asm("nop"); + } +} + +/*************************************************/ +void ili9325WriteCmd(uint16_t command) +{ + CLR_CS_CD; // Saves 7 commands compared to "CLR_CS; CLR_CD;" + SET_RD_WR; // Saves 7 commands compared to "SET_RD; SET_WR;" + ILI9325_GPIO2DATA_DATA = (command >> (8 - ILI9325_DATA_OFFSET)); + CLR_WR; + SET_WR; + ILI9325_GPIO2DATA_DATA = command << ILI9325_DATA_OFFSET; + CLR_WR; + SET_WR_CS; // Saves 7 commands compared to "SET_WR; SET_CS;" +} + +/*************************************************/ +void ili9325WriteData(uint16_t data) +{ + CLR_CS; + SET_CD_RD_WR; // Saves 14 commands compared to "SET_CD; SET_RD; SET_WR" + ILI9325_GPIO2DATA_DATA = (data >> (8 - ILI9325_DATA_OFFSET)); + CLR_WR; + SET_WR; + ILI9325_GPIO2DATA_DATA = data << ILI9325_DATA_OFFSET; + CLR_WR; + SET_WR_CS; // Saves 7 commands compared to "SET_WR, SET_CS;" +} + +/*************************************************/ +void ili9325Command(uint16_t command, uint16_t data) +{ + // Provided for convenience sake ... shouldn't be used + // in critical sections since it adds an extra + // branch, etc. + ili9325WriteCmd(command); + ili9325WriteData(data); +} + +uint16_t ili9325BGR2RGB(uint16_t color) +{ + uint16_t r, g, b; + + b = (color>>0) & 0x1f; + g = (color>>5) & 0x3f; + r = (color>>11) & 0x1f; + + return( (b<<11) + (g<<5) + (r<<0) ); +} + +/*********************************************************** + Read pixel from LCD controller at current position +***********************************************************/ +uint16_t ili9325Read(void) +{ + // ToDo + + return 0; +} + +/*************************************************/ +void ili9325SetCursor(uint16_t x, uint16_t y) +{ + ili9325Command(0x0020, x-1); // GRAM Address Set (Horizontal Address) (R20h) + ili9325Command(0x0021, y-1); // GRAM Address Set (Vertical Address) (R21h) +} + +/*************************************************/ +static void ili9325InitDisplay(void) +{ + // Clear data line + GPIO_GPIO2DATA &= ~ILI9325_DATA_MASK; + + SET_RD; + SET_WR; + SET_CS; + SET_CD; + + // Reset display + CLR_RESET; + ili9325Delay(10000); + SET_RESET; + ili9325Delay(500); + + ili9325Command(0x00FF, 0x0001); + ili9325Command(0x00F3, 0x0008); + ili9325WriteCmd(0x00F3); + + ili9325Command(0x0001, 0x0100); // Driver Output Control Register (R01h) + ili9325Command(0x0002, 0x0700); // LCD Driving Waveform Control (R02h) + ili9325Command(0x0003, 0x1030); // Entry Mode (R03h) + ili9325Command(0x0008, 0x0302); + ili9325Command(0x0009, 0x0000); + ili9325Command(0x0010, 0x0000); // Power Control 1 (R10h) + ili9325Command(0x0011, 0x0007); // Power Control 2 (R11h) + ili9325Command(0x0012, 0x0000); // Power Control 3 (R12h) + ili9325Command(0x0013, 0x0000); // Power Control 4 (R13h) + ili9325Delay(1000); + ili9325Command(0x0010, 0x14B0); // Power Control 1 (R10h) + ili9325Delay(500); + ili9325Command(0x0011, 0x0007); // Power Control 2 (R11h) + ili9325Delay(500); + ili9325Command(0x0012, 0x008E); // Power Control 3 (R12h) + ili9325Command(0x0013, 0x0C00); // Power Control 4 (R13h) + ili9325Command(0x0029, 0x0015); // NVM read data 2 (R29h) + ili9325Delay(500); + ili9325Command(0x0030, 0x0000); // Gamma Control 1 + ili9325Command(0x0031, 0x0107); // Gamma Control 2 + ili9325Command(0x0032, 0x0000); // Gamma Control 3 + ili9325Command(0x0035, 0x0203); // Gamma Control 6 + ili9325Command(0x0036, 0x0402); // Gamma Control 7 + ili9325Command(0x0037, 0x0000); // Gamma Control 8 + ili9325Command(0x0038, 0x0207); // Gamma Control 9 + ili9325Command(0x0039, 0x0000); // Gamma Control 10 + ili9325Command(0x003C, 0x0203); // Gamma Control 13 + ili9325Command(0x003D, 0x0403); // Gamma Control 14 + ili9325Command(0x0050, 0x0000); // Window Horizontal RAM Address Start (R50h) + ili9325Command(0x0051, 0x00EF); // Window Horizontal RAM Address End (R51h) + ili9325Command(0x0052, 0X0000); // Window Vertical RAM Address Start (R52h) + ili9325Command(0x0053, 0x013F); // Window Vertical RAM Address End (R53h) + ili9325Command(0x0060, 0xa700); // Driver Output Control (R60h) + ili9325Command(0x0061, 0x0001); // Driver Output Control (R61h) + ili9325Command(0x0090, 0X0029); // Panel Interface Control 1 (R90h) + + // Display On + ili9325Command(0x0007, 0x0133); // Display Control (R07h) + ili9325Delay(500); + ili9325WriteCmd(0x0022); +} + +/*************************************************/ +void ili9325Home(void) +{ + ili9325Command(0x0020, 0X0000); // GRAM Address Set (Horizontal Address) (R20h) + ili9325Command(0x0021, 0X0000); // GRAM Address Set (Vertical Address) (R21h) + ili9325WriteCmd(0x0022); // Write Data to GRAM (R22h) +} + +/*************************************************/ +void ili9325SetWindow(uint16_t x, uint16_t y, uint16_t x1, uint16_t y1) +{ + ili9325Command(0x0050, x-1); // Window Horizontal RAM Address Start (R50h) + ili9325Command(0x0051, x1-1); // Window Horizontal RAM Address End (R51h) + ili9325Command(0x0052, y-1); // Window Vertical RAM Address Start (R52h) ) + ili9325Command(0x0053, y1-1); // Window Vertical RAM Address End (R53h) +} + +/*************************************************/ +/* Public Methods */ +/*************************************************/ + +/*************************************************/ +void lcdInit(void) +{ + // Set control line pins to output + gpioSetDir(ILI9325_CS_PORT, ILI9325_CS_PIN, 1); + gpioSetDir(ILI9325_CD_PORT, ILI9325_CD_PIN, 1); + gpioSetDir(ILI9325_WR_PORT, ILI9325_WR_PIN, 1); + gpioSetDir(ILI9325_RD_PORT, ILI9325_RD_PIN, 1); + + // Set data port pins to output + ILI9325_GPIO2DATA_SETOUTPUT; + + // Disable pullups + gpioSetPullup(&IOCON_PIO2_1, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_2, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_3, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_4, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_5, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_6, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_7, gpioPullupMode_Inactive); + gpioSetPullup(&IOCON_PIO2_8, gpioPullupMode_Inactive); + + // Set backlight + gpioSetDir(ILI9325_BL_PORT, ILI9325_BL_PIN, 1); // set to output + gpioSetValue(ILI9325_BL_PORT, ILI9325_BL_PIN, 0); // turn on + + // Initialize the display + ili9325InitDisplay(); + + // Fill black + lcdFillRGB(BLACK); +} + +/*************************************************/ +void lcdTest(void) +{ + uint32_t i,j; + ili9325Home(); + + for(i=0;i<320;i++) + { + for(j=0;j<240;j++) + { + if(i>279)ili9325WriteData(WHITE); + else if(i>239)ili9325WriteData(BLUE); + else if(i>199)ili9325WriteData(GREEN); + else if(i>159)ili9325WriteData(CYAN); + else if(i>119)ili9325WriteData(RED); + else if(i>79)ili9325WriteData(MAGENTA); + else if(i>39)ili9325WriteData(YELLOW); + else ili9325WriteData(BLACK); + } + } +} + +/*************************************************/ +void lcdFillRGB(uint16_t data) +{ + unsigned int i; + ili9325Home(); + + uint32_t pixels = 320*240; + for ( i=0; i < pixels; i++ ) + { + ili9325WriteData(data); + } +} + +/*************************************************/ +void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) +{ + ili9325WriteCmd(0x0020); // GRAM Address Set (Horizontal Address) (R20h) + ili9325WriteData(x-1); + ili9325WriteCmd(0x0021); // GRAM Address Set (Vertical Address) (R21h) + ili9325WriteData(y-1); + ili9325WriteCmd(0x0022); // Write Data to GRAM (R22h) + ili9325WriteData(color); +} + +/*************************************************/ +void lcdDrawHLine(uint16_t x0, uint16_t x1, uint16_t y, uint16_t color) +{ + // Allows for slightly better performance than setting individual pixels + uint16_t x, pixels; + + if (x1 < x0) + { + // Switch x1 and x0 + x = x1; + x1 = x0; + x0 = x; + } + + ili9325WriteCmd(0x0020); // GRAM Address Set (Horizontal Address) (R20h) + ili9325WriteData(x0-1); + ili9325WriteCmd(0x0021); // GRAM Address Set (Vertical Address) (R21h) + ili9325WriteData(y-1); + ili9325WriteCmd(0x0022); // Write Data to GRAM (R22h) + for (pixels = 0; pixels < x1 - x0 + 1; pixels++) + { + ili9325WriteData(color); + } +} + +#ifdef CFG_SDCARD +/**************************************************************************/ +/*! + @brief Loads an image from an SD card and renders it +*/ +/**************************************************************************/ +void lcdDrawImageFromFile(uint16_t x, uint16_t y, char *filename) +{ +} +#endif + +/**************************************************************************/ +/*! + @brief Renders a bitmap image +*/ +/**************************************************************************/ +void lcdDrawImage(uint16_t x, uint16_t y, const uint16_t *data) +{ + // data[0] = Width + // data[1] = height + // data[2] = Compression + // data[3] = Compression Window + // data[4] = Pixel Data ... + + uint16_t line, width; + uint32_t currentPixel, totalPixels; + + width = 0; + + // Calculate total pixels (width * height) + totalPixels = data[0] * data[1]; + currentPixel = 0; + + // Draw individual pixels + for (line = 0; line < data[1]; line++) + { + // Set cursor to starting x, y position + ili9325SetCursor(x, y + line); + // Prepare to write data to GRAM + ili9325WriteCmd(0x0022); // Write Data to GRAM (R22h) + do + { + ili9325WriteData(data[currentPixel]); + currentPixel++; + } while (--width); + width = data[0]; // Reset width counter + } +} + +/*************************************************/ +uint16_t lcdGetPixel(uint16_t x, uint16_t y) +{ + ili9325SetCursor(x, y); + ili9325WriteCmd(0x0022); + return (ili9325Read()); +} diff --git a/macusbfb/drivers/lcd/hw/ILI9325.h b/macusbfb/drivers/lcd/hw/ILI9325.h new file mode 100644 index 0000000..f457d3f --- /dev/null +++ b/macusbfb/drivers/lcd/hw/ILI9325.h @@ -0,0 +1,119 @@ +/**************************************************************************/ +/*! + @file ILI9325.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#ifndef __ILI9325_H__ +#define __ILI9325_H__ + +#include "projectconfig.h" + +#include "drivers/lcd/lcd.h" +#include "core/gpio/gpio.h" + +// Control pins +#define ILI9325_CS_PORT 1 // CS (LCD Pin 7) +#define ILI9325_CS_PIN 8 +#define ILI9325_CD_PORT 1 // CS/RS (LCD Pin 8) +#define ILI9325_CD_PIN 9 +#define ILI9325_WR_PORT 1 // WR (LCD Pin 9) +#define ILI9325_WR_PIN 10 +#define ILI9325_RD_PORT 1 // RD (LCD Pin 10) +#define ILI9325_RD_PIN 11 + +// These combined pin definitions are for optimisation purposes. +// If the pin values above are modified the bit equivalents +// below will also need to be updated +#define ILI9325_CS_CD_PINS 0x300 // 8 + 9 +#define ILI9325_RD_WR_PINS 0xC00 // 11 + 10 +#define ILI9325_WR_CS_PINS 0x500 // 10 + 8 +#define ILI9325_CD_RD_WR_PINS 0xE00 // 9 + 11 + 10 + +// Backlight and Reset pins +#define ILI9325_RES_PORT 3 // LCD Reset (LCD Pin 31) +#define ILI9325_RES_PIN 3 +#define ILI9325_BL_PORT 2 // Backlight Enable (LCD Pin 16) +#define ILI9325_BL_PIN 9 + +// Data pins +// Note: data pins must be consecutive and on the same port +#define ILI9325_DATA_PORT 2 // 8-Pin Data Port +#define ILI9325_DATA_PIN1 1 +#define ILI9325_DATA_PIN2 2 +#define ILI9325_DATA_PIN3 3 +#define ILI9325_DATA_PIN4 4 +#define ILI9325_DATA_PIN5 5 +#define ILI9325_DATA_PIN6 6 +#define ILI9325_DATA_PIN7 7 +#define ILI9325_DATA_PIN8 8 +#define ILI9325_DATA_MASK 0x000001FE +#define ILI9325_DATA_OFFSET 1 // Offset = PIN1 + +// These registers allow fast single operation clear+set of bits (see section 8.5.1 of LPC1343 UM) +#define ILI9325_GPIO2DATA_DATA (*(pREG32 (GPIO_GPIO2_BASE + (ILI9325_DATA_MASK << 2)))) +#define ILI9325_GPIO1DATA_WR (*(pREG32 (GPIO_GPIO1_BASE + ((1 << ILI9325_WR_PIN) << 2)))) +#define ILI9325_GPIO1DATA_CD (*(pREG32 (GPIO_GPIO1_BASE + ((1 << ILI9325_CD_PIN) << 2)))) +#define ILI9325_GPIO1DATA_CS (*(pREG32 (GPIO_GPIO1_BASE + ((1 << ILI9325_CS_PIN) << 2)))) +#define ILI9325_GPIO1DATA_RD (*(pREG32 (GPIO_GPIO1_BASE + ((1 << ILI9325_RD_PIN) << 2)))) +#define ILI9325_GPIO3DATA_RES (*(pREG32 (GPIO_GPIO3_BASE + ((1 << ILI9325_RES_PIN) << 2)))) +#define ILI9325_GPIO1DATA_CS_CD (*(pREG32 (GPIO_GPIO1_BASE + ((ILI9325_CS_CD_PINS) << 2)))) +#define ILI9325_GPIO1DATA_RD_WR (*(pREG32 (GPIO_GPIO1_BASE + ((ILI9325_RD_WR_PINS) << 2)))) +#define ILI9325_GPIO1DATA_WR_CS (*(pREG32 (GPIO_GPIO1_BASE + ((ILI9325_WR_CS_PINS) << 2)))) +#define ILI9325_GPIO1DATA_CD_RD_WR (*(pREG32 (GPIO_GPIO1_BASE + ((ILI9325_CD_RD_WR_PINS) << 2)))) + +// Macros to set data bus direction to input/output +#define ILI9325_GPIO2DATA_SETINPUT GPIO_GPIO2DIR &= ~ILI9325_DATA_MASK +#define ILI9325_GPIO2DATA_SETOUTPUT GPIO_GPIO2DIR |= ILI9325_DATA_MASK + +// Macros for control line state +#define CLR_CD ILI9325_GPIO1DATA_CD = (0) +#define SET_CD ILI9325_GPIO1DATA_CD = (1 << ILI9325_CD_PIN) +#define CLR_CS ILI9325_GPIO1DATA_CS = (0) +#define SET_CS ILI9325_GPIO1DATA_CS = (1 << ILI9325_CS_PIN) +#define CLR_WR ILI9325_GPIO1DATA_WR = (0) +#define SET_WR ILI9325_GPIO1DATA_WR = (1 << ILI9325_WR_PIN) +#define CLR_RD ILI9325_GPIO1DATA_RD = (0) +#define SET_RD ILI9325_GPIO1DATA_RD = (1 << ILI9325_RD_PIN) +#define CLR_RESET ILI9325_GPIO3DATA_RES = (0) +#define SET_RESET ILI9325_GPIO3DATA_RES = (1 << ILI9325_RES_PIN) + +// These 'combined' macros are defined to improve code performance by +// reducing the number of instructions in heavily used functions +#define CLR_CS_CD ILI9325_GPIO1DATA_CS_CD = (0); +#define SET_RD_WR ILI9325_GPIO1DATA_RD_WR = (ILI9325_RD_WR_PINS); +#define SET_WR_CS ILI9325_GPIO1DATA_WR_CS = (ILI9325_WR_CS_PINS); +#define SET_CD_RD_WR ILI9325_GPIO1DATA_CD_RD_WR = (ILI9325_CD_RD_WR_PINS); + +#endif diff --git a/macusbfb/drivers/lcd/lcd.h b/macusbfb/drivers/lcd/lcd.h new file mode 100644 index 0000000..26cfdb4 --- /dev/null +++ b/macusbfb/drivers/lcd/lcd.h @@ -0,0 +1,71 @@ +/**************************************************************************/ +/*! + @file lcd.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#ifndef __LCD_H__ +#define __LCD_H__ + +#include "projectconfig.h" + +// Color definitions +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +// Method prototypes + +// Any LCD needs to implement these common methods, which allow the low-level +// initialisation and pixel-setting details to be abstracted away from the +// higher level drawing and graphics code. + +extern void lcdInit(void); +extern void lcdFillRGB(uint16_t data); +extern void lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color); +extern void lcdDrawHLine(uint16_t x0, uint16_t x1, uint16_t y, uint16_t color); +extern void lcdTest(void); +extern void lcdDrawImage(uint16_t x, uint16_t y, const uint16_t *data); +extern uint16_t lcdGetPixel(uint16_t x, uint16_t y); + +#ifdef CFG_SDCARD +extern void lcdDrawImageFromFile(uint16_t x, uint16_t y, char *filename); +#endif + +#endif diff --git a/macusbfb/drivers/sensors/lm75b/lm75b.c b/macusbfb/drivers/sensors/lm75b/lm75b.c new file mode 100644 index 0000000..18cd6ca --- /dev/null +++ b/macusbfb/drivers/sensors/lm75b/lm75b.c @@ -0,0 +1,190 @@ +/**************************************************************************/ +/*! + @file lm75b.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section DESCRIPTION + + Driver for NXP's LM75B I2C temperature sensor. This temperature + sensor has an accuracy of 0.125°C, and returns a temperature value + in degrees celsius where each unit is equal to 0.125°C. For example, + if the temperature reading is 198, it means that the temperature in + degree celsius is: 198 / 8 = 24.75°C. + + @section Example + + @code + #include "core/cpu/cpu.h" + #include "drivers/sensors/lm75b/lm75b.h" + + int main(void) + { + cpuInit(); + + int32_t temp = 0; + + // Initialise the LM75B + lm75bInit(); + + while (1) + { + // Get the current temperature (in 0.125°C units) + lm75bGetTemperature(&temp); + + // Multiply value by 125 for fixed-point math (0.125°C per unit) + temp *= 125; + + // Use modulus operator to display decimal value + printf("Current Temperature: %d.%d C\n", temp / 1000, temp % 1000); + + // Alternatively, you could also use floating point math, though + // this will result in larger compiled code if you add in floating + // point support for printf, etc. + // + // float tempFloat = 0.0F; + // lm75bGetTemperature(&temp); + // tempFloat = (float)temp / 8.0F; + } + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include "lm75b.h" + +extern volatile uint8_t I2CMasterBuffer[I2C_BUFSIZE]; +extern volatile uint8_t I2CSlaveBuffer[I2C_BUFSIZE]; +extern volatile uint32_t I2CReadLength, I2CWriteLength; + +uint32_t i; + +static lm75bError_e lm75bWrite8 (uint8_t reg, uint32_t value) +{ + // Clear write buffers + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + I2CWriteLength = 3; + I2CReadLength = 0; + I2CMasterBuffer[0] = LM75B_ADDRESS; // I2C device address + I2CMasterBuffer[1] = reg; // Command register + I2CMasterBuffer[2] = (value & 0xFF); // Value to write + i2cEngine(); + return LM75B_ERROR_OK; +} + +static lm75bError_e lm75bRead16(uint8_t reg, int32_t *value) +{ + // Clear write buffers + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + I2CWriteLength = 2; + I2CReadLength = 2; + I2CMasterBuffer[0] = LM75B_ADDRESS; // I2C device address + I2CMasterBuffer[1] = reg; // Command register + // Append address w/read bit + I2CMasterBuffer[2] = LM75B_ADDRESS | LM75B_READBIT; + i2cEngine(); + + // Shift values to create properly formed integer + *value = ((I2CSlaveBuffer[0] << 8) | I2CSlaveBuffer[1]) >> 5; + + // Sign extend negative numbers + if (I2CSlaveBuffer[0] & 0x80) + { + // Negative number + *value |= 0xFFFFFC00; + } + return LM75B_ERROR_OK; +} + +/**************************************************************************/ +/*! + @brief Initialises the I2C block +*/ +/**************************************************************************/ +lm75bError_e lm75bInit(void) +{ + // Initialise I2C + if (i2cInit(I2CMODE_MASTER) == FALSE) + { + return LM75B_ERROR_I2CINIT; /* Fatal error */ + } + + return LM75B_ERROR_OK; + + // Set device to shutdown mode by default (saves power) + // return lm75bConfigWrite (LM75B_CONFIG_SHUTDOWN_SHUTDOWN); +} + +/**************************************************************************/ +/*! + @brief Reads the current temperature from the LM75B + + @note This method will assign a signed 32-bit value (int32) to 'temp', + where each unit represents +/- 0.125°C. To convert the numeric + value to degrees celsius, you must divide the value of 'temp' + by 8. This conversion is not done automatically, since you may + or may not want to use floating point math for the calculations. +*/ +/**************************************************************************/ +lm75bError_e lm75bGetTemperature (int32_t *temp) +{ + // Turn device on + // lm75bConfigWrite (LM75B_CONFIG_SHUTDOWN_POWERON); + + // Read temperature + lm75bError_e error = LM75B_ERROR_OK; + error = lm75bRead16 (LM75B_REGISTER_TEMPERATURE, temp); + + // Shut device back down + // lm75bConfigWrite (LM75B_CONFIG_SHUTDOWN_SHUTDOWN); + + return error; +} + +/**************************************************************************/ +/*! + @brief Writes the supplied 8-bit value to the LM75B config register +*/ +/**************************************************************************/ +lm75bError_e lm75bConfigWrite (uint8_t configValue) +{ + return lm75bWrite8 (LM75B_REGISTER_CONFIGURATION, configValue); +} diff --git a/macusbfb/drivers/sensors/lm75b/lm75b.h b/macusbfb/drivers/sensors/lm75b/lm75b.h new file mode 100644 index 0000000..b159dbe --- /dev/null +++ b/macusbfb/drivers/sensors/lm75b/lm75b.h @@ -0,0 +1,70 @@ +/**************************************************************************/ +/*! + @file lm75b.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _LM75B_H_ +#define _LM75B_H_ + +#include "projectconfig.h" +#include "core/i2c/i2c.h" + +#define LM75B_ADDRESS (0x90) // 100 1000 shifted left 1 bit = 0x90 +#define LM75B_READBIT (0x01) + +#define LM75B_REGISTER_TEMPERATURE (0x00) +#define LM75B_REGISTER_CONFIGURATION (0x01) + +#define LM75B_CONFIG_SHUTDOWN_MASK (0x01) +#define LM75B_CONFIG_SHUTDOWN_POWERON (0x00) +#define LM75B_CONFIG_SHUTDOWN_SHUTDOWN (0x01) + +typedef enum +{ + LM75B_ERROR_OK = 0, // Everything executed normally + LM75B_ERROR_I2CINIT, // Unable to initialise I2C + LM75B_ERROR_I2CBUSY, // I2C already in use + LM75B_ERROR_LAST +} +lm75bError_e; + +lm75bError_e lm75bInit(void); +lm75bError_e lm75bGetTemperature (int32_t *temp); +lm75bError_e lm75bConfigWrite (uint8_t configValue); + +#endif + + diff --git a/macusbfb/font_8x8.c b/macusbfb/font_8x8.c new file mode 100644 index 0000000..54d6c21 --- /dev/null +++ b/macusbfb/font_8x8.c @@ -0,0 +1,2571 @@ +/**********************************************/ +/* */ +/* Font file generated by cpi2fnt */ +/* */ +/**********************************************/ + +#define FONTDATAMAX 2048 + +const unsigned char fontdata_8x8[FONTDATAMAX] = { + + /* 0 0x00 '^@' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 1 0x01 '^A' */ + 0x7e, /* 01111110 */ + 0x81, /* 10000001 */ + 0xa5, /* 10100101 */ + 0x81, /* 10000001 */ + 0xbd, /* 10111101 */ + 0x99, /* 10011001 */ + 0x81, /* 10000001 */ + 0x7e, /* 01111110 */ + + /* 2 0x02 '^B' */ + 0x7e, /* 01111110 */ + 0xff, /* 11111111 */ + 0xdb, /* 11011011 */ + 0xff, /* 11111111 */ + 0xc3, /* 11000011 */ + 0xe7, /* 11100111 */ + 0xff, /* 11111111 */ + 0x7e, /* 01111110 */ + + /* 3 0x03 '^C' */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0x10, /* 00010000 */ + 0x00, /* 00000000 */ + + /* 4 0x04 '^D' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0x10, /* 00010000 */ + 0x00, /* 00000000 */ + + /* 5 0x05 '^E' */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + + /* 6 0x06 '^F' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + + /* 7 0x07 '^G' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 8 0x08 '^H' */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xe7, /* 11100111 */ + 0xc3, /* 11000011 */ + 0xc3, /* 11000011 */ + 0xe7, /* 11100111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* 9 0x09 '^I' */ + 0x00, /* 00000000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x42, /* 01000010 */ + 0x42, /* 01000010 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 10 0x0a '^J' */ + 0xff, /* 11111111 */ + 0xc3, /* 11000011 */ + 0x99, /* 10011001 */ + 0xbd, /* 10111101 */ + 0xbd, /* 10111101 */ + 0x99, /* 10011001 */ + 0xc3, /* 11000011 */ + 0xff, /* 11111111 */ + + /* 11 0x0b '^K' */ + 0x0f, /* 00001111 */ + 0x07, /* 00000111 */ + 0x0f, /* 00001111 */ + 0x7d, /* 01111101 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x78, /* 01111000 */ + + /* 12 0x0c '^L' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + + /* 13 0x0d '^M' */ + 0x3f, /* 00111111 */ + 0x33, /* 00110011 */ + 0x3f, /* 00111111 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x70, /* 01110000 */ + 0xf0, /* 11110000 */ + 0xe0, /* 11100000 */ + + /* 14 0x0e '^N' */ + 0x7f, /* 01111111 */ + 0x63, /* 01100011 */ + 0x7f, /* 01111111 */ + 0x63, /* 01100011 */ + 0x63, /* 01100011 */ + 0x67, /* 01100111 */ + 0xe6, /* 11100110 */ + 0xc0, /* 11000000 */ + + /* 15 0x0f '^O' */ + 0x18, /* 00011000 */ + 0xdb, /* 11011011 */ + 0x3c, /* 00111100 */ + 0xe7, /* 11100111 */ + 0xe7, /* 11100111 */ + 0x3c, /* 00111100 */ + 0xdb, /* 11011011 */ + 0x18, /* 00011000 */ + + /* 16 0x10 '^P' */ + 0x80, /* 10000000 */ + 0xe0, /* 11100000 */ + 0xf8, /* 11111000 */ + 0xfe, /* 11111110 */ + 0xf8, /* 11111000 */ + 0xe0, /* 11100000 */ + 0x80, /* 10000000 */ + 0x00, /* 00000000 */ + + /* 17 0x11 '^Q' */ + 0x02, /* 00000010 */ + 0x0e, /* 00001110 */ + 0x3e, /* 00111110 */ + 0xfe, /* 11111110 */ + 0x3e, /* 00111110 */ + 0x0e, /* 00001110 */ + 0x02, /* 00000010 */ + 0x00, /* 00000000 */ + + /* 18 0x12 '^R' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + + /* 19 0x13 '^S' */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* 20 0x14 '^T' */ + 0x7f, /* 01111111 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7b, /* 01111011 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x00, /* 00000000 */ + + /* 21 0x15 '^U' */ + 0x3e, /* 00111110 */ + 0x61, /* 01100001 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x86, /* 10000110 */ + 0x7c, /* 01111100 */ + + /* 22 0x16 '^V' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 23 0x17 '^W' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + + /* 24 0x18 '^X' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 25 0x19 '^Y' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 26 0x1a '^Z' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 27 0x1b '^[' */ + 0x00, /* 00000000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xfe, /* 11111110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 28 0x1c '^\' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 29 0x1d '^]' */ + 0x00, /* 00000000 */ + 0x24, /* 00100100 */ + 0x66, /* 01100110 */ + 0xff, /* 11111111 */ + 0x66, /* 01100110 */ + 0x24, /* 00100100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 30 0x1e '^^' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 31 0x1f '^_' */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 32 0x20 ' ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 33 0x21 '!' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 34 0x22 '"' */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x24, /* 00100100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 35 0x23 '#' */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 36 0x24 '$' */ + 0x18, /* 00011000 */ + 0x3e, /* 00111110 */ + 0x60, /* 01100000 */ + 0x3c, /* 00111100 */ + 0x06, /* 00000110 */ + 0x7c, /* 01111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 37 0x25 '%' */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x66, /* 01100110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 38 0x26 '&' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 39 0x27 ''' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 40 0x28 '(' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + + /* 41 0x29 ')' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + + /* 42 0x2a '*' */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0xff, /* 11111111 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 43 0x2b '+' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 44 0x2c ',' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + + /* 45 0x2d '-' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 46 0x2e '.' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 47 0x2f '/' */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + 0x80, /* 10000000 */ + 0x00, /* 00000000 */ + + /* 48 0x30 '0' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 49 0x31 '1' */ + 0x18, /* 00011000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 50 0x32 '2' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x06, /* 00000110 */ + 0x1c, /* 00011100 */ + 0x30, /* 00110000 */ + 0x66, /* 01100110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 51 0x33 '3' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x06, /* 00000110 */ + 0x3c, /* 00111100 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 52 0x34 '4' */ + 0x1c, /* 00011100 */ + 0x3c, /* 00111100 */ + 0x6c, /* 01101100 */ + 0xcc, /* 11001100 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x1e, /* 00011110 */ + 0x00, /* 00000000 */ + + /* 53 0x35 '5' */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 54 0x36 '6' */ + 0x38, /* 00111000 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 55 0x37 '7' */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + + /* 56 0x38 '8' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 57 0x39 '9' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x78, /* 01111000 */ + 0x00, /* 00000000 */ + + /* 58 0x3a ':' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 59 0x3b ';' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + + /* 60 0x3c '<' */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + + /* 61 0x3d '=' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 62 0x3e '>' */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x00, /* 00000000 */ + + /* 63 0x3f '?' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 64 0x40 '@' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xde, /* 11011110 */ + 0xde, /* 11011110 */ + 0xde, /* 11011110 */ + 0xc0, /* 11000000 */ + 0x78, /* 01111000 */ + 0x00, /* 00000000 */ + + /* 65 0x41 'A' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 66 0x42 'B' */ + 0xfc, /* 11111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 67 0x43 'C' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 68 0x44 'D' */ + 0xf8, /* 11111000 */ + 0x6c, /* 01101100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x6c, /* 01101100 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + + /* 69 0x45 'E' */ + 0xfe, /* 11111110 */ + 0x62, /* 01100010 */ + 0x68, /* 01101000 */ + 0x78, /* 01111000 */ + 0x68, /* 01101000 */ + 0x62, /* 01100010 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 70 0x46 'F' */ + 0xfe, /* 11111110 */ + 0x62, /* 01100010 */ + 0x68, /* 01101000 */ + 0x78, /* 01111000 */ + 0x68, /* 01101000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* 71 0x47 'G' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xce, /* 11001110 */ + 0x66, /* 01100110 */ + 0x3a, /* 00111010 */ + 0x00, /* 00000000 */ + + /* 72 0x48 'H' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 73 0x49 'I' */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 74 0x4a 'J' */ + 0x1e, /* 00011110 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x78, /* 01111000 */ + 0x00, /* 00000000 */ + + /* 75 0x4b 'K' */ + 0xe6, /* 11100110 */ + 0x66, /* 01100110 */ + 0x6c, /* 01101100 */ + 0x78, /* 01111000 */ + 0x6c, /* 01101100 */ + 0x66, /* 01100110 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* 76 0x4c 'L' */ + 0xf0, /* 11110000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x62, /* 01100010 */ + 0x66, /* 01100110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 77 0x4d 'M' */ + 0xc6, /* 11000110 */ + 0xee, /* 11101110 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 78 0x4e 'N' */ + 0xc6, /* 11000110 */ + 0xe6, /* 11100110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0xce, /* 11001110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 79 0x4f 'O' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 80 0x50 'P' */ + 0xfc, /* 11111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* 81 0x51 'Q' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xce, /* 11001110 */ + 0x7c, /* 01111100 */ + 0x0e, /* 00001110 */ + + /* 82 0x52 'R' */ + 0xfc, /* 11111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x6c, /* 01101100 */ + 0x66, /* 01100110 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* 83 0x53 'S' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 84 0x54 'T' */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x5a, /* 01011010 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 85 0x55 'U' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 86 0x56 'V' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 87 0x57 'W' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 88 0x58 'X' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 89 0x59 'Y' */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 90 0x5a 'Z' */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x8c, /* 10001100 */ + 0x18, /* 00011000 */ + 0x32, /* 00110010 */ + 0x66, /* 01100110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 91 0x5b '[' */ + 0x3c, /* 00111100 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 92 0x5c '\' */ + 0xc0, /* 11000000 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x06, /* 00000110 */ + 0x02, /* 00000010 */ + 0x00, /* 00000000 */ + + /* 93 0x5d ']' */ + 0x3c, /* 00111100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 94 0x5e '^' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 95 0x5f '_' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + + /* 96 0x60 '`' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 97 0x61 'a' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 98 0x62 'b' */ + 0xe0, /* 11100000 */ + 0x60, /* 01100000 */ + 0x7c, /* 01111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + + /* 99 0x63 'c' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 100 0x64 'd' */ + 0x1c, /* 00011100 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 101 0x65 'e' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 102 0x66 'f' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x60, /* 01100000 */ + 0xf8, /* 11111000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* 103 0x67 'g' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0xf8, /* 11111000 */ + + /* 104 0x68 'h' */ + 0xe0, /* 11100000 */ + 0x60, /* 01100000 */ + 0x6c, /* 01101100 */ + 0x76, /* 01110110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* 105 0x69 'i' */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 106 0x6a 'j' */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + + /* 107 0x6b 'k' */ + 0xe0, /* 11100000 */ + 0x60, /* 01100000 */ + 0x66, /* 01100110 */ + 0x6c, /* 01101100 */ + 0x78, /* 01111000 */ + 0x6c, /* 01101100 */ + 0xe6, /* 11100110 */ + 0x00, /* 00000000 */ + + /* 108 0x6c 'l' */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 109 0x6d 'm' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xec, /* 11101100 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0x00, /* 00000000 */ + + /* 110 0x6e 'n' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* 111 0x6f 'o' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 112 0x70 'p' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + + /* 113 0x71 'q' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0x1e, /* 00011110 */ + + /* 114 0x72 'r' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x76, /* 01110110 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x00, /* 00000000 */ + + /* 115 0x73 's' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 116 0x74 't' */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0xfc, /* 11111100 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x36, /* 00110110 */ + 0x1c, /* 00011100 */ + 0x00, /* 00000000 */ + + /* 117 0x75 'u' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 118 0x76 'v' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 119 0x77 'w' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xd6, /* 11010110 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 120 0x78 'x' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 121 0x79 'y' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + + /* 122 0x7a 'z' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x4c, /* 01001100 */ + 0x18, /* 00011000 */ + 0x32, /* 00110010 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 123 0x7b '{' */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x70, /* 01110000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0e, /* 00001110 */ + 0x00, /* 00000000 */ + + /* 124 0x7c '|' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 125 0x7d '}' */ + 0x70, /* 01110000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* 126 0x7e '~' */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 127 0x7f '' */ + 0x00, /* 00000000 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 128 0x80 '€' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0x78, /* 01111000 */ + + /* 129 0x81 '' */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 130 0x82 '‚' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 131 0x83 'ƒ' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 132 0x84 '„' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 133 0x85 '…' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 134 0x86 '†' */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 135 0x87 '‡' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x7e, /* 01111110 */ + 0x0c, /* 00001100 */ + 0x38, /* 00111000 */ + + /* 136 0x88 'ˆ' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 137 0x89 '‰' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 138 0x8a 'Š' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 139 0x8b '‹' */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 140 0x8c 'Œ' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 141 0x8d '' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 142 0x8e 'Ž' */ + 0xc6, /* 11000110 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 143 0x8f '' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 144 0x90 '' */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xf8, /* 11111000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 145 0x91 '‘' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0xd8, /* 11011000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 146 0x92 '’' */ + 0x3e, /* 00111110 */ + 0x6c, /* 01101100 */ + 0xcc, /* 11001100 */ + 0xfe, /* 11111110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xce, /* 11001110 */ + 0x00, /* 00000000 */ + + /* 147 0x93 '“' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 148 0x94 '”' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 149 0x95 '•' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 150 0x96 '–' */ + 0x78, /* 01111000 */ + 0x84, /* 10000100 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 151 0x97 '—' */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 152 0x98 '˜' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + + /* 153 0x99 '™' */ + 0xc6, /* 11000110 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 154 0x9a 'š' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 155 0x9b '›' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 156 0x9c 'œ' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x64, /* 01100100 */ + 0xf0, /* 11110000 */ + 0x60, /* 01100000 */ + 0x66, /* 01100110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 157 0x9d '' */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 158 0x9e 'ž' */ + 0xf8, /* 11111000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xfa, /* 11111010 */ + 0xc6, /* 11000110 */ + 0xcf, /* 11001111 */ + 0xc6, /* 11000110 */ + 0xc7, /* 11000111 */ + + /* 159 0x9f 'Ÿ' */ + 0x0e, /* 00001110 */ + 0x1b, /* 00011011 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* 160 0xa0 ' ' */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 161 0xa1 '¡' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 162 0xa2 '¢' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 163 0xa3 '£' */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 164 0xa4 '¤' */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* 165 0xa5 '¥' */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0xe6, /* 11100110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0xce, /* 11001110 */ + 0x00, /* 00000000 */ + + /* 166 0xa6 '¦' */ + 0x3c, /* 00111100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x3e, /* 00111110 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 167 0xa7 '§' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 168 0xa8 '¨' */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x63, /* 01100011 */ + 0x3e, /* 00111110 */ + 0x00, /* 00000000 */ + + /* 169 0xa9 '©' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 170 0xaa 'ª' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 171 0xab '«' */ + 0x63, /* 01100011 */ + 0xe6, /* 11100110 */ + 0x6c, /* 01101100 */ + 0x7e, /* 01111110 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x0f, /* 00001111 */ + + /* 172 0xac '¬' */ + 0x63, /* 01100011 */ + 0xe6, /* 11100110 */ + 0x6c, /* 01101100 */ + 0x7a, /* 01111010 */ + 0x36, /* 00110110 */ + 0x6a, /* 01101010 */ + 0xdf, /* 11011111 */ + 0x06, /* 00000110 */ + + /* 173 0xad '­' */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 174 0xae '®' */ + 0x00, /* 00000000 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x66, /* 01100110 */ + 0x33, /* 00110011 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 175 0xaf '¯' */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0x66, /* 01100110 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 176 0xb0 '°' */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + + /* 177 0xb1 '±' */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + + /* 178 0xb2 '²' */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + + /* 179 0xb3 '³' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 180 0xb4 '´' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 181 0xb5 'µ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 182 0xb6 '¶' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 183 0xb7 '·' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 184 0xb8 '¸' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 185 0xb9 '¹' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x06, /* 00000110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 186 0xba 'º' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 187 0xbb '»' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 188 0xbc '¼' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x06, /* 00000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 189 0xbd '½' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 190 0xbe '¾' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 191 0xbf '¿' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 192 0xc0 'À' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 193 0xc1 'Á' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 194 0xc2 'Â' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 195 0xc3 'Ã' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 196 0xc4 'Ä' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 197 0xc5 'Å' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 198 0xc6 'Æ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 199 0xc7 'Ç' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 200 0xc8 'È' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x30, /* 00110000 */ + 0x3f, /* 00111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 201 0xc9 'É' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3f, /* 00111111 */ + 0x30, /* 00110000 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 202 0xca 'Ê' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf7, /* 11110111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 203 0xcb 'Ë' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xf7, /* 11110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 204 0xcc 'Ì' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x30, /* 00110000 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 205 0xcd 'Í' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 206 0xce 'Î' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf7, /* 11110111 */ + 0x00, /* 00000000 */ + 0xf7, /* 11110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 207 0xcf 'Ï' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 208 0xd0 'Ð' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 209 0xd1 'Ñ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 210 0xd2 'Ò' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 211 0xd3 'Ó' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x3f, /* 00111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 212 0xd4 'Ô' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 213 0xd5 'Õ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 214 0xd6 'Ö' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3f, /* 00111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 215 0xd7 '×' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xff, /* 11111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 216 0xd8 'Ø' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 217 0xd9 'Ù' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 218 0xda 'Ú' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 219 0xdb 'Û' */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* 220 0xdc 'Ü' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* 221 0xdd 'Ý' */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + + /* 222 0xde 'Þ' */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + + /* 223 0xdf 'ß' */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 224 0xe0 'à' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0xc8, /* 11001000 */ + 0xdc, /* 11011100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 225 0xe1 'á' */ + 0x78, /* 01111000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xd8, /* 11011000 */ + 0xcc, /* 11001100 */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + + /* 226 0xe2 'â' */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* 227 0xe3 'ã' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 228 0xe4 'ä' */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 229 0xe5 'å' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* 230 0xe6 'æ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0xc0, /* 11000000 */ + + /* 231 0xe7 'ç' */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 232 0xe8 'è' */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + + /* 233 0xe9 'é' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 234 0xea 'ê' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0xee, /* 11101110 */ + 0x00, /* 00000000 */ + + /* 235 0xeb 'ë' */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x3e, /* 00111110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 236 0xec 'ì' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 237 0xed 'í' */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x7e, /* 01111110 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7e, /* 01111110 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + + /* 238 0xee 'î' */ + 0x1e, /* 00011110 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x7e, /* 01111110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x1e, /* 00011110 */ + 0x00, /* 00000000 */ + + /* 239 0xef 'ï' */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 240 0xf0 'ð' */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 241 0xf1 'ñ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 242 0xf2 'ò' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 243 0xf3 'ó' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 244 0xf4 'ô' */ + 0x0e, /* 00001110 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 245 0xf5 'õ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + + /* 246 0xf6 'ö' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 247 0xf7 '÷' */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 248 0xf8 'ø' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 249 0xf9 'ù' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 250 0xfa 'ú' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 251 0xfb 'û' */ + 0x0f, /* 00001111 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0xec, /* 11101100 */ + 0x6c, /* 01101100 */ + 0x3c, /* 00111100 */ + 0x1c, /* 00011100 */ + + /* 252 0xfc 'ü' */ + 0x6c, /* 01101100 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 253 0xfd 'ý' */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 254 0xfe 'þ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 255 0xff 'ÿ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + +}; diff --git a/macusbfb/gpio.h b/macusbfb/gpio.h new file mode 100644 index 0000000..157eba0 --- /dev/null +++ b/macusbfb/gpio.h @@ -0,0 +1,5 @@ +//Macros to quickly modify gpio values + +#define GPIOMOD(port, mask, bits) (* (pREG32 (0x50000000+(0x10000*port)+(mask<<2))))=bits +#define GPIOSET(port, bits) GPIOMOD(port, (1< V, the + hysteresis of the WAKEUP input pin has to be disabled in order for the chip to wake up + from Deep power-down mode. */ + +#define PMU_GPREG4_GPDATA_MASK ((unsigned int) 0xFFFFF800) +#define PMU_GPREG4_WAKEUPHYS_MASK ((unsigned int) 0x00000400) +#define PMU_GPREG4_WAKEUPHYS_HYSTERESISENABLED ((unsigned int) 0x00000400) +#define PMU_GPREG4_WAKEUPHYS_HYSTERESISDISABLED ((unsigned int) 0x00000000) +#define PMU_GPREG4_GPDATA_MASK ((unsigned int) 0xFFFFF800) + +/*############################################################################## +## I/O Control (IOCON) +##############################################################################*/ + +#define IOCON_BASE_ADDRESS (0x40044000) + +/* Values that should be common to all pins, though they are also defined + on the individual pin level in case they change with a pin on any future + device */ + +#define IOCON_COMMON_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_COMMON_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_COMMON_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_COMMON_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_COMMON_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_COMMON_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_COMMON_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_COMMON_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_COMMON_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_6 (*(pREG32 (0x40044000))) +#define IOCON_PIO2_6_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_6_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_6_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_6_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_6_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_6_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_6_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_6_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_6_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_6_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_0 (*(pREG32 (0x40044008))) +#define IOCON_PIO2_0_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_0_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_0_FUNC_DTR ((unsigned int) 0x00000001) +#define IOCON_PIO2_0_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_0_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_0_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_0_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_0_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_0_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_0_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_0_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_nRESET_PIO0_0 (*(pREG32 (0x4004400C))) +#define IOCON_nRESET_PIO0_0_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_nRESET_PIO0_0_FUNC_RESET ((unsigned int) 0x00000000) +#define IOCON_nRESET_PIO0_0_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_nRESET_PIO0_0_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_nRESET_PIO0_0_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_nRESET_PIO0_0_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_nRESET_PIO0_0_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_nRESET_PIO0_0_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_nRESET_PIO0_0_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_nRESET_PIO0_0_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_nRESET_PIO0_0_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_1 (*(pREG32 (0x40044010))) +#define IOCON_PIO0_1_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_1_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_1_FUNC_CLKOUT ((unsigned int) 0x00000001) +#define IOCON_PIO0_1_FUNC_CT32B0_MAT2 ((unsigned int) 0x00000002) +#define IOCON_PIO0_1_FUNC_USB_FTOGGLE ((unsigned int) 0x00000003) +#define IOCON_PIO0_1_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_1_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_1_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_1_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_1_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_1_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_1_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_1_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO1_8 (*(pREG32 (0x40044014))) +#define IOCON_PIO1_8_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_8_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_8_FUNC_CT16B1_CAP0 ((unsigned int) 0x00000001) +#define IOCON_PIO1_8_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_8_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_8_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_8_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_8_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_8_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_8_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_8_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_2 (*(pREG32 (0x4004401C))) +#define IOCON_PIO0_2_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_2_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_2_FUNC_SSEL ((unsigned int) 0x00000001) +#define IOCON_PIO0_2_FUNC_CT16B0_CAP0 ((unsigned int) 0x00000002) +#define IOCON_PIO0_2_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_2_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_2_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_2_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_2_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_2_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_2_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_2_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_7 (*(pREG32 (0x40044020))) +#define IOCON_PIO2_7_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_7_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_7_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_7_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_7_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_7_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_7_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_7_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_7_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_7_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_8 (*(pREG32 (0x40044024))) +#define IOCON_PIO2_8_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_8_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_8_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_8_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_8_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_8_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_8_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_8_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_8_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_8_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_1 (*(pREG32 (0x40044028))) +#define IOCON_PIO2_1_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_1_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_1_FUNC_DSR ((unsigned int) 0x00000001) +#define IOCON_PIO2_1_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_1_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_1_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_1_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_1_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_1_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_1_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_1_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_3 (*(pREG32 (0x4004402C))) +#define IOCON_PIO0_3_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_3_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_3_FUNC_USB_VBUS ((unsigned int) 0x00000001) +#define IOCON_PIO0_3_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_3_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_3_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_3_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_3_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_3_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_3_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_3_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_4 (*(pREG32 (0x40044030))) +#define IOCON_PIO0_4_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_4_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_4_FUNC_I2CSCL ((unsigned int) 0x00000001) +#define IOCON_PIO0_4_I2CMODE_MASK ((unsigned int) 0x00000300) +#define IOCON_PIO0_4_I2CMODE_STANDARDI2C ((unsigned int) 0x00000000) +#define IOCON_PIO0_4_I2CMODE_STANDARDIO ((unsigned int) 0x00000100) +#define IOCON_PIO0_4_I2CMODE_FASTPLUSI2C ((unsigned int) 0x00000200) + +#define IOCON_PIO0_5 (*(pREG32 (0x40044034))) +#define IOCON_PIO0_5_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_5_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_5_FUNC_I2CSDA ((unsigned int) 0x00000001) +#define IOCON_PIO0_5_I2CMODE_MASK ((unsigned int) 0x00000300) +#define IOCON_PIO0_5_I2CMODE_STANDARDI2C ((unsigned int) 0x00000000) +#define IOCON_PIO0_5_I2CMODE_STANDARDIO ((unsigned int) 0x00000100) +#define IOCON_PIO0_5_I2CMODE_FASTPLUSI2C ((unsigned int) 0x00000200) + +#define IOCON_PIO1_9 (*(pREG32 (0x40044038))) +#define IOCON_PIO1_9_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_9_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_9_FUNC_CT16B1_MAT0 ((unsigned int) 0x00000001) +#define IOCON_PIO1_9_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_9_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_9_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_9_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_9_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_9_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_9_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_9_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO3_4 (*(pREG32 (0x4004403C))) +#define IOCON_PIO3_4_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO3_4_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO3_4_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO3_4_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO3_4_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO3_4_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO3_4_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO3_4_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO3_4_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO3_4_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_4 (*(pREG32 (0x40044040))) +#define IOCON_PIO2_4_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_4_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_4_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_4_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_4_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_4_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_4_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_4_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_4_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_4_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_5 (*(pREG32 (0x40044044))) +#define IOCON_PIO2_5_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_5_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_5_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_5_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_5_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_5_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_5_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_5_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_5_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_5_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO3_5 (*(pREG32 (0x40044048))) +#define IOCON_PIO3_5_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO3_5_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO3_5_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO3_5_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO3_5_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO3_5_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO3_5_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO3_5_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO3_5_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO3_5_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_6 (*(pREG32 (0x4004404C))) +#define IOCON_PIO0_6_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_6_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_6_FUNC_USB_CONNECT ((unsigned int) 0x00000001) +#define IOCON_PIO0_6_FUNC_SCK ((unsigned int) 0x00000002) +#define IOCON_PIO0_6_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_6_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_6_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_6_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_6_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_6_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_6_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_6_HYS_ENABLE ((unsigned int) 0x00000020) + + +#define IOCON_PIO0_7 (*(pREG32 (0x40044050))) +#define IOCON_PIO0_7_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_7_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_7_FUNC_CTS ((unsigned int) 0x00000001) +#define IOCON_PIO0_7_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_7_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_7_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_7_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_7_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_7_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_7_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_7_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_9 (*(pREG32 (0x40044054))) +#define IOCON_PIO2_9_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_9_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_9_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_9_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_9_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_9_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_9_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_9_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_9_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_9_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_10 (*(pREG32 (0x40044058))) +#define IOCON_PIO2_10_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_10_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_10_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_10_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_10_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_10_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_10_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_10_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_10_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_10_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_2 (*(pREG32 (0x4004405C))) +#define IOCON_PIO2_2_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_2_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_2_FUNC_DCD ((unsigned int) 0x00000001) +#define IOCON_PIO2_2_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_2_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_2_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_2_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_2_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_2_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_2_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_2_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_8 (*(pREG32 (0x40044060))) +#define IOCON_PIO0_8_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_8_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_8_FUNC_MISO0 ((unsigned int) 0x00000001) +#define IOCON_PIO0_8_FUNC_CT16B0_MAT0 ((unsigned int) 0x00000002) +#define IOCON_PIO0_8_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_8_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_8_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_8_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_8_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_8_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_8_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_8_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO0_9 (*(pREG32 (0x40044064))) +#define IOCON_PIO0_9_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO0_9_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO0_9_FUNC_MOSI0 ((unsigned int) 0x00000001) +#define IOCON_PIO0_9_FUNC_CT16B0_MAT1 ((unsigned int) 0x00000002) +#define IOCON_PIO0_9_FUNC_SWO ((unsigned int) 0x00000003) +#define IOCON_PIO0_9_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO0_9_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO0_9_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO0_9_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO0_9_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO0_9_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO0_9_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO0_9_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_JTAG_TCK_PIO0_10 (*(pREG32 (0x40044068))) +#define IOCON_JTAG_TCK_PIO0_10_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_JTAG_TCK_PIO0_10_FUNC_SWCLK ((unsigned int) 0x00000000) +#define IOCON_JTAG_TCK_PIO0_10_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_JTAG_TCK_PIO0_10_FUNC_SCK ((unsigned int) 0x00000002) +#define IOCON_JTAG_TCK_PIO0_10_FUNC_CT16B0_MAT2 ((unsigned int) 0x00000003) +#define IOCON_JTAG_TCK_PIO0_10_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_JTAG_TCK_PIO0_10_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TCK_PIO0_10_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_JTAG_TCK_PIO0_10_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_JTAG_TCK_PIO0_10_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_JTAG_TCK_PIO0_10_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_JTAG_TCK_PIO0_10_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TCK_PIO0_10_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO1_10 (*(pREG32 (0x4004406C))) +#define IOCON_PIO1_10_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_10_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_10_FUNC_AD6 ((unsigned int) 0x00000001) +#define IOCON_PIO1_10_FUNC_CT16B1_MAT1 ((unsigned int) 0x00000002) +#define IOCON_PIO1_10_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_10_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_10_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_10_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_10_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_10_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_10_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_10_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_PIO1_10_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_PIO1_10_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_PIO1_10_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_PIO2_11 (*(pREG32 (0x40044070))) +#define IOCON_PIO2_11_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO2_11_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO2_11_FUNC_SCK0 ((unsigned int) 0x00000001) +#define IOCON_PIO2_11_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO2_11_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO2_11_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO2_11_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO2_11_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO2_11_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO2_11_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO2_11_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_JTAG_TDI_PIO0_11 (*(pREG32 (0x40044074))) +#define IOCON_JTAG_TDI_PIO0_11_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_JTAG_TDI_PIO0_11_FUNC_TDI ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDI_PIO0_11_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_JTAG_TDI_PIO0_11_FUNC_AD0 ((unsigned int) 0x00000002) +#define IOCON_JTAG_TDI_PIO0_11_FUNC_CT32B0_MAT3 ((unsigned int) 0x00000003) +#define IOCON_JTAG_TDI_PIO0_11_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_JTAG_TDI_PIO0_11_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDI_PIO0_11_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_JTAG_TDI_PIO0_11_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_JTAG_TDI_PIO0_11_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_JTAG_TDI_PIO0_11_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_JTAG_TDI_PIO0_11_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDI_PIO0_11_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_JTAG_TDI_PIO0_11_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_JTAG_TDI_PIO0_11_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDI_PIO0_11_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_JTAG_TMS_PIO1_0 (*(pREG32 (0x40044078))) +#define IOCON_JTAG_TMS_PIO1_0_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_JTAG_TMS_PIO1_0_FUNC_TMS ((unsigned int) 0x00000000) +#define IOCON_JTAG_TMS_PIO1_0_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_JTAG_TMS_PIO1_0_FUNC_AD1 ((unsigned int) 0x00000002) +#define IOCON_JTAG_TMS_PIO1_0_FUNC_CT32B1_CAP0 ((unsigned int) 0x00000003) +#define IOCON_JTAG_TMS_PIO1_0_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_JTAG_TMS_PIO1_0_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TMS_PIO1_0_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_JTAG_TMS_PIO1_0_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_JTAG_TMS_PIO1_0_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_JTAG_TMS_PIO1_0_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_JTAG_TMS_PIO1_0_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TMS_PIO1_0_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_JTAG_TMS_PIO1_0_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_JTAG_TMS_PIO1_0_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_JTAG_TMS_PIO1_0_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_JTAG_TDO_PIO1_1 (*(pREG32 (0x4004407C))) +#define IOCON_JTAG_TDO_PIO1_1_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_JTAG_TDO_PIO1_1_FUNC_TDO ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDO_PIO1_1_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_JTAG_TDO_PIO1_1_FUNC_AD2 ((unsigned int) 0x00000002) +#define IOCON_JTAG_TDO_PIO1_1_FUNC_CT32B1_MAT0 ((unsigned int) 0x00000003) +#define IOCON_JTAG_TDO_PIO1_1_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_JTAG_TDO_PIO1_1_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDO_PIO1_1_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_JTAG_TDO_PIO1_1_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_JTAG_TDO_PIO1_1_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_JTAG_TDO_PIO1_1_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_JTAG_TDO_PIO1_1_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDO_PIO1_1_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_JTAG_TDO_PIO1_1_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_JTAG_TDO_PIO1_1_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_JTAG_TDO_PIO1_1_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_JTAG_nTRST_PIO1_2 (*(pREG32 (0x40044080))) +#define IOCON_JTAG_nTRST_PIO1_2_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_JTAG_nTRST_PIO1_2_FUNC_TRST ((unsigned int) 0x00000000) +#define IOCON_JTAG_nTRST_PIO1_2_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_JTAG_nTRST_PIO1_2_FUNC_AD3 ((unsigned int) 0x00000002) +#define IOCON_JTAG_nTRST_PIO1_2_FUNC_CT32B1_MAT1 ((unsigned int) 0x00000003) +#define IOCON_JTAG_nTRST_PIO1_2_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_JTAG_nTRST_PIO1_2_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_JTAG_nTRST_PIO1_2_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_JTAG_nTRST_PIO1_2_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_JTAG_nTRST_PIO1_2_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_JTAG_nTRST_PIO1_2_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_JTAG_nTRST_PIO1_2_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_JTAG_nTRST_PIO1_2_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_JTAG_nTRST_PIO1_2_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_JTAG_nTRST_PIO1_2_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_JTAG_nTRST_PIO1_2_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_PIO3_0 (*(pREG32 (0x40044084))) +#define IOCON_PIO3_0_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO3_0_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO3_0_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO3_0_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO3_0_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO3_0_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO3_0_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO3_0_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO3_0_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO3_0_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO3_1 (*(pREG32 (0x40044088))) +#define IOCON_PIO3_1_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO3_1_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO3_1_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO3_1_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO3_1_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO3_1_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO3_1_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO3_1_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO3_1_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO3_1_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO2_3 (*(pREG32 (0x4004408C))) +#define IOCON_PIO2_3_FUNC_MASK 0x7 +#define IOCON_PIO2_3_MODE_MASK 0x18 +#define IOCON_PIO2_3_HYS_MASK 0x20 +#define IOCON_PIO2_3_HYS 0x20 + +#define IOCON_SWDIO_PIO1_3 (*(pREG32 (0x40044090))) +#define IOCON_SWDIO_PIO1_3_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_SWDIO_PIO1_3_FUNC_SWDIO ((unsigned int) 0x00000000) +#define IOCON_SWDIO_PIO1_3_FUNC_GPIO ((unsigned int) 0x00000001) +#define IOCON_SWDIO_PIO1_3_FUNC_AD4 ((unsigned int) 0x00000002) +#define IOCON_SWDIO_PIO1_3_FUNC_CT32B1_MAT2 ((unsigned int) 0x00000004) +#define IOCON_SWDIO_PIO1_3_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_SWDIO_PIO1_3_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_SWDIO_PIO1_3_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_SWDIO_PIO1_3_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_SWDIO_PIO1_3_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_SWDIO_PIO1_3_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_PIO1_4 (*(pREG32 (0x40044094))) +#define IOCON_PIO1_4_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_4_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_4_FUNC_AD5 ((unsigned int) 0x00000001) +#define IOCON_PIO1_4_FUNC_CT32B1_MAT3 ((unsigned int) 0x00000002) +#define IOCON_PIO1_4_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_4_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_4_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_4_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_4_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_4_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_4_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_4_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_PIO1_4_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_PIO1_4_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_PIO1_4_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_PIO1_11 (*(pREG32 (0x40044098))) +#define IOCON_PIO1_11_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_11_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_11_FUNC_AD7 ((unsigned int) 0x00000001) +#define IOCON_PIO1_11_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_11_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_11_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_11_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_11_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_11_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_11_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_11_HYS_ENABLE ((unsigned int) 0x00000020) +#define IOCON_PIO1_11_ADMODE_MASK ((unsigned int) 0x00000080) +#define IOCON_PIO1_11_ADMODE_ANALOG ((unsigned int) 0x00000000) +#define IOCON_PIO1_11_ADMODE_DIGITAL ((unsigned int) 0x00000080) + +#define IOCON_PIO3_2 (*(pREG32 (0x4004409C))) +#define IOCON_PIO3_2_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO3_2_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO3_2_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO3_2_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO3_2_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO3_2_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO3_2_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO3_2_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO3_2_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO3_2_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO1_5 (*(pREG32 (0x400440A0))) +#define IOCON_PIO1_5_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_5_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_5_FUNC_RTS ((unsigned int) 0x00000001) +#define IOCON_PIO1_5_FUNC_CT32B0_CAP0 ((unsigned int) 0x00000002) +#define IOCON_PIO1_5_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_5_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_5_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_5_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_5_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_5_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_5_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_5_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO1_6 (*(pREG32 (0x400440A4))) +#define IOCON_PIO1_6_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_6_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_6_FUNC_UART_RXD ((unsigned int) 0x00000001) +#define IOCON_PIO1_6_FUNC_CT32B0_MAT0 ((unsigned int) 0x00000002) +#define IOCON_PIO1_6_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_6_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_6_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_6_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_6_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_6_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_6_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_6_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO1_7 (*(pREG32 (0x400440A8))) +#define IOCON_PIO1_7_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO1_7_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO1_7_FUNC_UART_TXD ((unsigned int) 0x00000001) +#define IOCON_PIO1_7_FUNC_CT32B0_MAT1 ((unsigned int) 0x00000002) +#define IOCON_PIO1_7_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO1_7_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO1_7_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO1_7_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO1_7_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO1_7_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO1_7_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO1_7_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_PIO3_3 (*(pREG32 (0x400440AC))) +#define IOCON_PIO3_3_FUNC_MASK ((unsigned int) 0x00000007) +#define IOCON_PIO3_3_FUNC_GPIO ((unsigned int) 0x00000000) +#define IOCON_PIO3_3_MODE_MASK ((unsigned int) 0x00000018) +#define IOCON_PIO3_3_MODE_INACTIVE ((unsigned int) 0x00000000) +#define IOCON_PIO3_3_MODE_PULLDOWN ((unsigned int) 0x00000008) +#define IOCON_PIO3_3_MODE_PULLUP ((unsigned int) 0x00000010) +#define IOCON_PIO3_3_MODE_REPEATER ((unsigned int) 0x00000018) +#define IOCON_PIO3_3_HYS_MASK ((unsigned int) 0x00000020) +#define IOCON_PIO3_3_HYS_DISABLE ((unsigned int) 0x00000000) +#define IOCON_PIO3_3_HYS_ENABLE ((unsigned int) 0x00000020) + +#define IOCON_SCKLOC (*(pREG32 (0x400440B0))) +#define IOCON_SCKLOC_SCKPIN_MASK ((unsigned int) 0x00000003) +#define IOCON_SCKLOC_SCKPIN_PIO0_10 ((unsigned int) 0x00000000) // Set SCK function to pin 0.10 +#define IOCON_SCKLOC_SCKPIN_PIO2_11 ((unsigned int) 0x00000001) // Set SCK function to pin 2.11 +#define IOCON_SCKLOC_SCKPIN_PIO0_6 ((unsigned int) 0x00000003) // Set SCK function to pin 0.6 + +/*############################################################################## +## Nested Vectored Interrupt Controller +##############################################################################*/ + +#define NVIC_BASE_ADDRESS (0xE000E100) + +typedef struct +{ + volatile uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + volatile uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + volatile uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + volatile uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + volatile uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + volatile uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + volatile uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */ +} NVIC_Type; + +#define NVIC ((NVIC_Type *) NVIC_BASE_ADDRESS) + +static inline void __enable_irq() { __asm volatile ("cpsie i"); } +static inline void __disable_irq() { __asm volatile ("cpsid i"); } + +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** LPC13xx Specific Interrupt Numbers *******************************************************/ + WAKEUP0_IRQn = 0, /*!< All I/O pins can be used as wakeup source. */ + WAKEUP1_IRQn = 1, /*!< There are 40 pins in total for LPC17xx */ + WAKEUP2_IRQn = 2, + WAKEUP3_IRQn = 3, + WAKEUP4_IRQn = 4, + WAKEUP5_IRQn = 5, + WAKEUP6_IRQn = 6, + WAKEUP7_IRQn = 7, + WAKEUP8_IRQn = 8, + WAKEUP9_IRQn = 9, + WAKEUP10_IRQn = 10, + WAKEUP11_IRQn = 11, + WAKEUP12_IRQn = 12, + WAKEUP13_IRQn = 13, + WAKEUP14_IRQn = 14, + WAKEUP15_IRQn = 15, + WAKEUP16_IRQn = 16, + WAKEUP17_IRQn = 17, + WAKEUP18_IRQn = 18, + WAKEUP19_IRQn = 19, + WAKEUP20_IRQn = 20, + WAKEUP21_IRQn = 21, + WAKEUP22_IRQn = 22, + WAKEUP23_IRQn = 23, + WAKEUP24_IRQn = 24, + WAKEUP25_IRQn = 25, + WAKEUP26_IRQn = 26, + WAKEUP27_IRQn = 27, + WAKEUP28_IRQn = 28, + WAKEUP29_IRQn = 29, + WAKEUP30_IRQn = 30, + WAKEUP31_IRQn = 31, + WAKEUP32_IRQn = 32, + WAKEUP33_IRQn = 33, + WAKEUP34_IRQn = 34, + WAKEUP35_IRQn = 35, + WAKEUP36_IRQn = 36, + WAKEUP37_IRQn = 37, + WAKEUP38_IRQn = 38, + WAKEUP39_IRQn = 39, + I2C_IRQn = 40, /*!< I2C Interrupt */ + TIMER_16_0_IRQn = 41, /*!< 16-bit Timer0 Interrupt */ + TIMER_16_1_IRQn = 42, /*!< 16-bit Timer1 Interrupt */ + TIMER_32_0_IRQn = 43, /*!< 32-bit Timer0 Interrupt */ + TIMER_32_1_IRQn = 44, /*!< 32-bit Timer1 Interrupt */ + SSP_IRQn = 45, /*!< SSP Interrupt */ + UART_IRQn = 46, /*!< UART Interrupt */ + USB_IRQn = 47, /*!< USB Regular Interrupt */ + USB_FIQn = 48, /*!< USB Fast Interrupt */ + ADC_IRQn = 49, /*!< A/D Converter Interrupt */ + WDT_IRQn = 50, /*!< Watchdog timer Interrupt */ + BOD_IRQn = 51, /*!< Brown Out Detect(BOD) Interrupt */ + EINT3_IRQn = 53, /*!< External Interrupt 3 Interrupt */ + EINT2_IRQn = 54, /*!< External Interrupt 2 Interrupt */ + EINT1_IRQn = 55, /*!< External Interrupt 1 Interrupt */ + EINT0_IRQn = 56, /*!< External Interrupt 0 Interrupt */ +} IRQn_t; + +static inline void NVIC_EnableIRQ(IRQn_t IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +static inline void NVIC_DisableIRQ(IRQn_t IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/*############################################################################## +## GPIO - General Purpose I/O +##############################################################################*/ + +#define GPIO_GPIO0_BASE (0x50000000) +#define GPIO_GPIO1_BASE (0x50010000) +#define GPIO_GPIO2_BASE (0x50020000) +#define GPIO_GPIO3_BASE (0x50030000) + +#define GPIO_GPIO0DATA (*(pREG32 (0x50003FFC))) // Port data register +#define GPIO_GPIO0DIR (*(pREG32 (0x50008000))) // Data direction register +#define GPIO_GPIO0IS (*(pREG32 (0x50008004))) // Interrupt sense register +#define GPIO_GPIO0IBE (*(pREG32 (0x50008008))) // Interrupt both edges register +#define GPIO_GPIO0IEV (*(pREG32 (0x5000800C))) // Interrupt event register +#define GPIO_GPIO0IE (*(pREG32 (0x50008010))) // Interrupt mask register +#define GPIO_GPIO0RIS (*(pREG32 (0x50008014))) // Raw interrupt status register +#define GPIO_GPIO0MIS (*(pREG32 (0x50008018))) // Masked interrupt status register +#define GPIO_GPIO0IC (*(pREG32 (0x5000801C))) // Interrupt clear register + +#define GPIO_GPIO1DATA (*(pREG32 (0x50013FFC))) // Port data register +#define GPIO_GPIO1DIR (*(pREG32 (0x50018000))) // Data direction register +#define GPIO_GPIO1IS (*(pREG32 (0x50018004))) // Interrupt sense register +#define GPIO_GPIO1IBE (*(pREG32 (0x50018008))) // Interrupt both edges register +#define GPIO_GPIO1IEV (*(pREG32 (0x5001800C))) // Interrupt event register +#define GPIO_GPIO1IE (*(pREG32 (0x50018010))) // Interrupt mask register +#define GPIO_GPIO1RIS (*(pREG32 (0x50018014))) // Raw interrupt status register +#define GPIO_GPIO1MIS (*(pREG32 (0x50018018))) // Masked interrupt status register +#define GPIO_GPIO1IC (*(pREG32 (0x5001801C))) // Interrupt clear register + +#define GPIO_GPIO2DATA (*(pREG32 (0x50023FFC))) // Port data register +#define GPIO_GPIO2DIR (*(pREG32 (0x50028000))) // Data direction register +#define GPIO_GPIO2IS (*(pREG32 (0x50028004))) // Interrupt sense register +#define GPIO_GPIO2IBE (*(pREG32 (0x50028008))) // Interrupt both edges register +#define GPIO_GPIO2IEV (*(pREG32 (0x5002800C))) // Interrupt event register +#define GPIO_GPIO2IE (*(pREG32 (0x50028010))) // Interrupt mask register +#define GPIO_GPIO2RIS (*(pREG32 (0x50028014))) // Raw interrupt status register +#define GPIO_GPIO2MIS (*(pREG32 (0x50028018))) // Masked interrupt status register +#define GPIO_GPIO2IC (*(pREG32 (0x5002801C))) // Interrupt clear register + +#define GPIO_GPIO3DATA (*(pREG32 (0x50033FFC))) // Port data register +#define GPIO_GPIO3DIR (*(pREG32 (0x50038000))) // Data direction register +#define GPIO_GPIO3IS (*(pREG32 (0x50038004))) // Interrupt sense register +#define GPIO_GPIO3IBE (*(pREG32 (0x50038008))) // Interrupt both edges register +#define GPIO_GPIO3IEV (*(pREG32 (0x5003800C))) // Interrupt event register +#define GPIO_GPIO3IE (*(pREG32 (0x50038010))) // Interrupt mask register +#define GPIO_GPIO3RIS (*(pREG32 (0x50038014))) // Raw interrupt status register +#define GPIO_GPIO3MIS (*(pREG32 (0x50038018))) // Masked interrupt status register +#define GPIO_GPIO3IC (*(pREG32 (0x5003801C))) // Interrupt clear register + +#define GPIO_IO_P0 ((unsigned int) 0x00000001) +#define GPIO_IO_P1 ((unsigned int) 0x00000002) +#define GPIO_IO_P2 ((unsigned int) 0x00000004) +#define GPIO_IO_P3 ((unsigned int) 0x00000008) +#define GPIO_IO_P4 ((unsigned int) 0x00000010) +#define GPIO_IO_P5 ((unsigned int) 0x00000020) +#define GPIO_IO_P6 ((unsigned int) 0x00000040) +#define GPIO_IO_P7 ((unsigned int) 0x00000080) +#define GPIO_IO_P8 ((unsigned int) 0x00000100) +#define GPIO_IO_P9 ((unsigned int) 0x00000200) +#define GPIO_IO_P10 ((unsigned int) 0x00000400) +#define GPIO_IO_P11 ((unsigned int) 0x00000800) +#define GPIO_IO_ALL ((unsigned int) 0x00000FFF) + +/*############################################################################## +## USB +##############################################################################*/ + +/* USB registers are defined in USB code */ +#define USB_BASE_ADDRESS (0x40020000) + +/* USB Device Interrupt Status Register */ +#define USB_DEVINTST (*(pREG32 (0x40020000))) +#define USB_DEVINTST_FRAME_MASK ((unsigned int) 0x00000001) +#define USB_DEVINTST_FRAME ((unsigned int) 0x00000001) // Frame interrupt +#define USB_DEVINTST_EP0_MASK ((unsigned int) 0x00000002) +#define USB_DEVINTST_EP0 ((unsigned int) 0x00000002) // USB core interrupt for EP0 +#define USB_DEVINTST_EP1_MASK ((unsigned int) 0x00000004) +#define USB_DEVINTST_EP1 ((unsigned int) 0x00000004) // USB core interrupt for EP1 +#define USB_DEVINTST_EP2_MASK ((unsigned int) 0x00000008) +#define USB_DEVINTST_EP2 ((unsigned int) 0x00000008) // USB core interrupt for EP2 +#define USB_DEVINTST_EP3_MASK ((unsigned int) 0x00000010) +#define USB_DEVINTST_EP3 ((unsigned int) 0x00000010) // USB core interrupt for EP3 +#define USB_DEVINTST_EP4_MASK ((unsigned int) 0x00000020) +#define USB_DEVINTST_EP4 ((unsigned int) 0x00000020) // USB core interrupt for EP4 +#define USB_DEVINTST_EP5_MASK ((unsigned int) 0x00000040) +#define USB_DEVINTST_EP5 ((unsigned int) 0x00000040) // USB core interrupt for EP5 +#define USB_DEVINTST_EP6_MASK ((unsigned int) 0x00000080) +#define USB_DEVINTST_EP6 ((unsigned int) 0x00000080) // USB core interrupt for EP6 +#define USB_DEVINTST_EP7_MASK ((unsigned int) 0x00000100) +#define USB_DEVINTST_EP7 ((unsigned int) 0x00000100) // USB core interrupt for EP7 +#define USB_DEVINTST_DEV_START_MASK ((unsigned int) 0x00000200) +#define USB_DEVINTST_DEV_START ((unsigned int) 0x00000200) +#define USB_DEVINTST_CC_EMPTY_MASK ((unsigned int) 0x00000400) +#define USB_DEVINTST_CC_EMPTY ((unsigned int) 0x00000400) +#define USB_DEVINTST_CD_FULL_MASK ((unsigned int) 0x00000800) +#define USB_DEVINTST_CD_FULL ((unsigned int) 0x00000800) +#define USB_DEVINTST_RxENDPKT_MASK ((unsigned int) 0x00001000) +#define USB_DEVINTST_RxENDPKT ((unsigned int) 0x00001000) +#define USB_DEVINTST_TxENDPKT_MASK ((unsigned int) 0x00002000) +#define USB_DEVINTST_TxENDPKT ((unsigned int) 0x00002000) + +/* USB Device Interrupt Enable Register */ +#define USB_DEVINTEN (*(pREG32 (0x40020004))) +#define USB_DEVINTEN_FRAME_MASK ((unsigned int) 0x00000001) +#define USB_DEVINTEN_FRAME ((unsigned int) 0x00000001) +#define USB_DEVINTEN_EP0_MASK ((unsigned int) 0x00000002) +#define USB_DEVINTEN_EP0 ((unsigned int) 0x00000002) +#define USB_DEVINTEN_EP1_MASK ((unsigned int) 0x00000004) +#define USB_DEVINTEN_EP1 ((unsigned int) 0x00000004) +#define USB_DEVINTEN_EP2_MASK ((unsigned int) 0x00000008) +#define USB_DEVINTEN_EP2 ((unsigned int) 0x00000008) +#define USB_DEVINTEN_EP3_MASK ((unsigned int) 0x00000010) +#define USB_DEVINTEN_EP3 ((unsigned int) 0x00000010) +#define USB_DEVINTEN_EP4_MASK ((unsigned int) 0x00000020) +#define USB_DEVINTEN_EP4 ((unsigned int) 0x00000020) +#define USB_DEVINTEN_EP5_MASK ((unsigned int) 0x00000040) +#define USB_DEVINTEN_EP5 ((unsigned int) 0x00000040) +#define USB_DEVINTEN_EP6_MASK ((unsigned int) 0x00000080) +#define USB_DEVINTEN_EP6 ((unsigned int) 0x00000080) +#define USB_DEVINTEN_EP7_MASK ((unsigned int) 0x00000100) +#define USB_DEVINTEN_EP7 ((unsigned int) 0x00000100) +#define USB_DEVINTEN_DEV_START_MASK ((unsigned int) 0x00000200) +#define USB_DEVINTEN_DEV_START ((unsigned int) 0x00000200) +#define USB_DEVINTEN_CC_EMPTY_MASK ((unsigned int) 0x00000400) +#define USB_DEVINTEN_CC_EMPTY ((unsigned int) 0x00000400) +#define USB_DEVINTEN_CD_FULL_MASK ((unsigned int) 0x00000800) +#define USB_DEVINTEN_CD_FULL ((unsigned int) 0x00000800) +#define USB_DEVINTEN_RxENDPKT_MASK ((unsigned int) 0x00001000) +#define USB_DEVINTEN_RxENDPKT ((unsigned int) 0x00001000) +#define USB_DEVINTEN_TxENDPKT_MASK ((unsigned int) 0x00002000) +#define USB_DEVINTEN_TxENDPKT ((unsigned int) 0x00002000) + +/* USB Device Interrupt Clear Register */ +#define USB_DEVINTCLR (*(pREG32 (0x40020008))) +#define USB_DEVINTCLR_FRAME_MASK ((unsigned int) 0x00000001) +#define USB_DEVINTCLR_FRAME ((unsigned int) 0x00000001) +#define USB_DEVINTCLR_EP0_MASK ((unsigned int) 0x00000002) +#define USB_DEVINTCLR_EP0 ((unsigned int) 0x00000002) +#define USB_DEVINTCLR_EP1_MASK ((unsigned int) 0x00000004) +#define USB_DEVINTCLR_EP1 ((unsigned int) 0x00000004) +#define USB_DEVINTCLR_EP2_MASK ((unsigned int) 0x00000008) +#define USB_DEVINTCLR_EP2 ((unsigned int) 0x00000008) +#define USB_DEVINTCLR_EP3_MASK ((unsigned int) 0x00000010) +#define USB_DEVINTCLR_EP3 ((unsigned int) 0x00000010) +#define USB_DEVINTCLR_EP4_MASK ((unsigned int) 0x00000020) +#define USB_DEVINTCLR_EP4 ((unsigned int) 0x00000020) +#define USB_DEVINTCLR_EP5_MASK ((unsigned int) 0x00000040) +#define USB_DEVINTCLR_EP5 ((unsigned int) 0x00000040) +#define USB_DEVINTCLR_EP6_MASK ((unsigned int) 0x00000080) +#define USB_DEVINTCLR_EP6 ((unsigned int) 0x00000080) +#define USB_DEVINTCLR_EP7_MASK ((unsigned int) 0x00000100) +#define USB_DEVINTCLR_EP7 ((unsigned int) 0x00000100) +#define USB_DEVINTCLR_DEV_START_MASK ((unsigned int) 0x00000200) +#define USB_DEVINTCLR_DEV_START ((unsigned int) 0x00000200) +#define USB_DEVINTCLR_CC_EMPTY_MASK ((unsigned int) 0x00000400) +#define USB_DEVINTCLR_CC_EMPTY ((unsigned int) 0x00000400) +#define USB_DEVINTCLR_CD_FULL_MASK ((unsigned int) 0x00000800) +#define USB_DEVINTCLR_CD_FULL ((unsigned int) 0x00000800) +#define USB_DEVINTCLR_RxENDPKT_MASK ((unsigned int) 0x00001000) +#define USB_DEVINTCLR_RxENDPKT ((unsigned int) 0x00001000) +#define USB_DEVINTCLR_TxENDPKT_MASK ((unsigned int) 0x00002000) +#define USB_DEVINTCLR_TxENDPKT ((unsigned int) 0x00002000) + +/* USB Device Interrupt Set Register */ +#define USB_DEVINTSET (*(pREG32 (0x4002000C))) +#define USB_DEVINTSET_FRAME_MASK ((unsigned int) 0x00000001) +#define USB_DEVINTSET_FRAME ((unsigned int) 0x00000001) +#define USB_DEVINTSET_EP0_MASK ((unsigned int) 0x00000002) +#define USB_DEVINTSET_EP0 ((unsigned int) 0x00000002) +#define USB_DEVINTSET_EP1_MASK ((unsigned int) 0x00000004) +#define USB_DEVINTSET_EP1 ((unsigned int) 0x00000004) +#define USB_DEVINTSET_EP2_MASK ((unsigned int) 0x00000008) +#define USB_DEVINTSET_EP2 ((unsigned int) 0x00000008) +#define USB_DEVINTSET_EP3_MASK ((unsigned int) 0x00000010) +#define USB_DEVINTSET_EP3 ((unsigned int) 0x00000010) +#define USB_DEVINTSET_EP4_MASK ((unsigned int) 0x00000020) +#define USB_DEVINTSET_EP4 ((unsigned int) 0x00000020) +#define USB_DEVINTSET_EP5_MASK ((unsigned int) 0x00000040) +#define USB_DEVINTSET_EP5 ((unsigned int) 0x00000040) +#define USB_DEVINTSET_EP6_MASK ((unsigned int) 0x00000080) +#define USB_DEVINTSET_EP6 ((unsigned int) 0x00000080) +#define USB_DEVINTSET_EP7_MASK ((unsigned int) 0x00000100) +#define USB_DEVINTSET_EP7 ((unsigned int) 0x00000100) +#define USB_DEVINTSET_DEV_START_MASK ((unsigned int) 0x00000200) +#define USB_DEVINTSET_DEV_START ((unsigned int) 0x00000200) +#define USB_DEVINTSET_CC_EMPTY_MASK ((unsigned int) 0x00000400) +#define USB_DEVINTSET_CC_EMPTY ((unsigned int) 0x00000400) +#define USB_DEVINTSET_CD_FULL_MASK ((unsigned int) 0x00000800) +#define USB_DEVINTSET_CD_FULL ((unsigned int) 0x00000800) +#define USB_DEVINTSET_RxENDPKT_MASK ((unsigned int) 0x00001000) +#define USB_DEVINTSET_RxENDPKT ((unsigned int) 0x00001000) +#define USB_DEVINTSET_TxENDPKT_MASK ((unsigned int) 0x00002000) +#define USB_DEVINTSET_TxENDPKT ((unsigned int) 0x00002000) + +/* USB Command Code Register */ +#define USB_CMDCODE (*(pREG32 (0x40020010))) +#define USB_CMDCODE_CMD_PHASE_READ ((unsigned int) 0x00000100) +#define USB_CMDCODE_CMD_PHASE_WRITE ((unsigned int) 0x00000200) +#define USB_CMDCODE_CMD_PHASE_COMMAND ((unsigned int) 0x00000500) +#define USB_CMDCODE_CMD_PHASE_MASK ((unsigned int) 0x0000FF00) +#define USB_CMDCODE_CMD_CODE_MASK ((unsigned int) 0x00FF0000) +#define USB_CMDCODE_CMD_WDATA_MASK ((unsigned int) 0x00FF0000) + +/* USB Command Data Register */ +#define USB_CMDDATA (*(pREG32 (0x40020014))) +#define USB_CMDDATA_CMD_RDATA_MASK ((unsigned int) 0x000000FF) + +/* USB Receive Data Register */ +#define USB_RXDATA (*(pREG32 (0x40020018))) + +/* USB Transmit Data Register */ +#define USB_TXDATA (*(pREG32 (0x4002001C))) + +/* USB Receive Packet Length Register */ +#define USB_RXPLEN (*(pREG32 (0x40020020))) +#define USB_RXPLEN_PKT_LNGTH_MASK ((unsigned int) 0x000003FF) +#define USB_RXPLEN_DV_MASK ((unsigned int) 0x00000400) +#define USB_RXPLEN_DV ((unsigned int) 0x00000400) + +/* USB Transmit Packet Length Register */ +#define USB_TXPLEN (*(pREG32 (0x40020024))) +#define USB_TXPLEN_PKT_LNGTH_MASK 0x3FF + +/* USB Control Register */ +#define USB_CTRL (*(pREG32 (0x40020028))) +#define USB_CTRL_RD_EN_MASK ((unsigned int) 0x00000001) +#define USB_CTRL_RD_EN ((unsigned int) 0x00000001) +#define USB_CTRL_WR_EN_MASK ((unsigned int) 0x00000002) +#define USB_CTRL_WR_EN ((unsigned int) 0x00000002) +#define USB_CTRL_LOG_ENDPOINT_MASK ((unsigned int) 0x0000003C) + +/* USB Device FIQ Select Register */ +#define USB_DEVFIQSEL (*(pREG32 (0x4002002C))) +#define USB_DEVFIQSEL_FRAME_MASK ((unsigned int) 0x00000001) +#define USB_DEVFIQSEL_FRAME ((unsigned int) 0x00000001) +#define USB_DEVFIQSEL_BULKOUT_MASK ((unsigned int) 0x00000002) +#define USB_DEVFIQSEL_BULKOUT ((unsigned int) 0x00000002) +#define USB_DEVFIQSEL_BULKIN_MASK ((unsigned int) 0x00000004) +#define USB_DEVFIQSEL_BULKIN ((unsigned int) 0x00000004) + +/*############################################################################## +## UART +##############################################################################*/ + +#define UART_BASE_ADDRESS (0x40008000) + +#define UART_U0RBR (*(pREG32 (0x40008000))) // Receive buffer +#define UART_U0THR (*(pREG32 (0x40008000))) // Transmitter holding register +#define UART_U0DLL (*(pREG32 (0x40008000))) // Divisor latch LSB +#define UART_U0DLM (*(pREG32 (0x40008004))) // Divisor latch MSB +#define UART_U0IER (*(pREG32 (0x40008004))) // Interrupt enable +#define UART_U0IIR (*(pREG32 (0x40008008))) // Interrupt identification +#define UART_U0FCR (*(pREG32 (0x40008008))) // FIFO control +#define UART_U0MCR (*(pREG32 (0x40008010))) // Modem control +#define UART_U0LCR (*(pREG32 (0x4000800C))) // Line control +#define UART_U0LSR (*(pREG32 (0x40008014))) // Line status +#define UART_U0MSR (*(pREG32 (0x40008018))) // Modem status +#define UART_U0SCR (*(pREG32 (0x4000801C))) // Scratch pad +#define UART_U0ACR (*(pREG32 (0x40008020))) // Auto-baud control +#define UART_U0FDR (*(pREG32 (0x40008028))) // Fractional divider +#define UART_U0TER (*(pREG32 (0x40008030))) // Transmit enable +#define UART_U0RS485CTRL (*(pREG32 (0x4000804C))) // RS485 control register +#define UART_U0RS485ADRMATCH (*(pREG32 (0x40008050))) // RS485 address match +#define UART_U0RS485DLY (*(pREG32 (0x40008054))) // RS485 Delay value +#define UART_U0FIFOLVL (*(pREG32 (0x40008058))) // UART FIFO level + +#define UART_U0RBR_MASK ((unsigned int) 0x000000FF) + +#define UART_U0IER_RBR_Interrupt_MASK ((unsigned int) 0x00000001) // Enables the received data available interrupt +#define UART_U0IER_RBR_Interrupt_Enabled ((unsigned int) 0x00000001) +#define UART_U0IER_RBR_Interrupt_Disabled ((unsigned int) 0x00000000) +#define UART_U0IER_THRE_Interrupt_MASK ((unsigned int) 0x00000002) // Enables the THRE interrupt +#define UART_U0IER_THRE_Interrupt_Enabled ((unsigned int) 0x00000002) +#define UART_U0IER_THRE_Interrupt_Disabled ((unsigned int) 0x00000000) +#define UART_U0IER_RLS_Interrupt_MASK ((unsigned int) 0x00000004) // Enables the Rx line status interrupt +#define UART_U0IER_RLS_Interrupt_Enabled ((unsigned int) 0x00000004) +#define UART_U0IER_RLS_Interrupt_Disabled ((unsigned int) 0x00000000) +#define UART_U0IER_ABEOIntEn_MASK ((unsigned int) 0x00000100) // End of auto-baud interrupt +#define UART_U0IER_ABEOIntEn_Enabled ((unsigned int) 0x00000100) +#define UART_U0IER_ABEOIntEn_Disabled ((unsigned int) 0x00000000) +#define UART_U0IER_ABTOIntEn_MASK ((unsigned int) 0x00000200) // Auto-baud timeout interrupt +#define UART_U0IER_ABTOIntEn_Enabled ((unsigned int) 0x00000200) +#define UART_U0IER_ABTOIntEn_Disabled ((unsigned int) 0x00000000) + +#define UART_U0IIR_IntStatus_MASK ((unsigned int) 0x00000001) // Interrupt status +#define UART_U0IIR_IntStatus_InterruptPending ((unsigned int) 0x00000001) +#define UART_U0IIR_IntStatus_NoInterruptPending ((unsigned int) 0x00000000) +#define UART_U0IIR_IntId_MASK ((unsigned int) 0x0000000E) // Interrupt identification +#define UART_U0IIR_IntId_RLS ((unsigned int) 0x00000006) // Receive line status +#define UART_U0IIR_IntId_RDA ((unsigned int) 0x00000004) // Receive data available +#define UART_U0IIR_IntId_CTI ((unsigned int) 0x0000000C) // Character time-out indicator +#define UART_U0IIR_IntId_THRE ((unsigned int) 0x00000002) // THRE interrupt +#define UART_U0IIR_IntId_MODEM ((unsigned int) 0x00000000) // Modem interrupt +#define UART_U0IIR_FIFO_Enable_MASK ((unsigned int) 0x000000C0) +#define UART_U0IIR_ABEOInt_MASK ((unsigned int) 0x00000100) // End of auto-baud interrupt +#define UART_U0IIR_ABEOInt ((unsigned int) 0x00000100) +#define UART_U0IIR_ABTOInt_MASK ((unsigned int) 0x00000200) // Auto-baud time-out interrupt +#define UART_U0IIR_ABTOInt ((unsigned int) 0x00000200) + +#define UART_U0FCR_FIFO_Enable_MASK ((unsigned int) 0x00000001) // UART FIFOs enabled/disabled +#define UART_U0FCR_FIFO_Enabled ((unsigned int) 0x00000001) +#define UART_U0FCR_FIFO_Disabled ((unsigned int) 0x00000000) +#define UART_U0FCR_Rx_FIFO_Reset_MASK ((unsigned int) 0x00000002) +#define UART_U0FCR_Rx_FIFO_Reset ((unsigned int) 0x00000002) // Clear Rx FIFO +#define UART_U0FCR_Tx_FIFO_Reset_MASK ((unsigned int) 0x00000004) +#define UART_U0FCR_Tx_FIFO_Reset ((unsigned int) 0x00000004) // Clear Tx FIFO +#define UART_U0FCR_Rx_Trigger_Level_Select_MASK ((unsigned int) 0x000000C0) // Chars written before before interrupt +#define UART_U0FCR_Rx_Trigger_Level_Select_1Char ((unsigned int) 0x00000000) +#define UART_U0FCR_Rx_Trigger_Level_Select_4Char ((unsigned int) 0x00000040) +#define UART_U0FCR_Rx_Trigger_Level_Select_8Char ((unsigned int) 0x00000080) +#define UART_U0FCR_Rx_Trigger_Level_Select_12Char ((unsigned int) 0x000000C0) + +#define UART_U0MCR_DTR_Control_MASK ((unsigned int) 0x00000001) // Source for modem output pin DTR +#define UART_U0MCR_DTR_Control ((unsigned int) 0x00000001) +#define UART_U0MCR_RTS_Control_MASK ((unsigned int) 0x00000002) // Source for modem output pin RTS +#define UART_U0MCR_RTS_Control ((unsigned int) 0x00000002) +#define UART_U0MCR_Loopback_Mode_Select_MASK ((unsigned int) 0x00000010) // Diagnostic loopback mode +#define UART_U0MCR_Loopback_Mode_Select_Enabled ((unsigned int) 0x00000010) +#define UART_U0MCR_Loopback_Mode_Select_Disabled ((unsigned int) 0x00000000) +#define UART_U0MCR_RTSen_MASK ((unsigned int) 0x00000040) // Disable auto-rts flow control +#define UART_U0MCR_RTSen_Enabled ((unsigned int) 0x00000040) +#define UART_U0MCR_RTSen_Disabled ((unsigned int) 0x00000000) +#define UART_U0MCR_CTSen_MASK ((unsigned int) 0x00000080) // Disable auto-cts flow control +#define UART_U0MCR_CTSen_Enabled ((unsigned int) 0x00000080) +#define UART_U0MCR_CTSen_Disabled ((unsigned int) 0x00000000) + +#define UART_U0LCR_Word_Length_Select_MASK ((unsigned int) 0x00000003) // Word Length Selector +#define UART_U0LCR_Word_Length_Select_5Chars ((unsigned int) 0x00000000) +#define UART_U0LCR_Word_Length_Select_6Chars ((unsigned int) 0x00000001) +#define UART_U0LCR_Word_Length_Select_7Chars ((unsigned int) 0x00000002) +#define UART_U0LCR_Word_Length_Select_8Chars ((unsigned int) 0x00000003) +#define UART_U0LCR_Stop_Bit_Select_MASK ((unsigned int) 0x00000004) // Stop bit select +#define UART_U0LCR_Stop_Bit_Select_1Bits ((unsigned int) 0x00000000) +#define UART_U0LCR_Stop_Bit_Select_2Bits ((unsigned int) 0x00000004) +#define UART_U0LCR_Parity_Enable_MASK ((unsigned int) 0x00000008) // Parity enable +#define UART_U0LCR_Parity_Enabled ((unsigned int) 0x00000008) +#define UART_U0LCR_Parity_Disabled ((unsigned int) 0x00000000) +#define UART_U0LCR_Parity_Select_MASK ((unsigned int) 0x00000030) // Parity select +#define UART_U0LCR_Parity_Select_OddParity ((unsigned int) 0x00000000) +#define UART_U0LCR_Parity_Select_EvenParity ((unsigned int) 0x00000010) +#define UART_U0LCR_Parity_Select_Forced1 ((unsigned int) 0x00000020) +#define UART_U0LCR_Parity_Select_Forced0 ((unsigned int) 0x00000030) +#define UART_U0LCR_Break_Control_MASK ((unsigned int) 0x00000040) // Break transmission control +#define UART_U0LCR_Break_Control_Enabled ((unsigned int) 0x00000040) +#define UART_U0LCR_Break_Control_Disabled ((unsigned int) 0x00000000) +#define UART_U0LCR_Divisor_Latch_Access_MASK ((unsigned int) 0x00000080) // Divisor latch access +#define UART_U0LCR_Divisor_Latch_Access_Enabled ((unsigned int) 0x00000080) +#define UART_U0LCR_Divisor_Latch_Access_Disabled ((unsigned int) 0x00000000) + +#define UART_U0LSR_RDR_MASK ((unsigned int) 0x00000001) // Receiver data ready +#define UART_U0LSR_RDR_EMPTY ((unsigned int) 0x00000000) // U0RBR is empty +#define UART_U0LSR_RDR_DATA ((unsigned int) 0x00000001) // U0RBR contains valid data +#define UART_U0LSR_OE_MASK ((unsigned int) 0x00000002) // Overrun error +#define UART_U0LSR_OE ((unsigned int) 0x00000002) +#define UART_U0LSR_PE_MASK ((unsigned int) 0x00000004) // Parity error +#define UART_U0LSR_PE ((unsigned int) 0x00000004) +#define UART_U0LSR_FE_MASK ((unsigned int) 0x00000008) // Framing error +#define UART_U0LSR_FE ((unsigned int) 0x00000008) +#define UART_U0LSR_BI_MASK ((unsigned int) 0x00000010) // Break interrupt +#define UART_U0LSR_BI ((unsigned int) 0x00000010) +#define UART_U0LSR_THRE_MASK ((unsigned int) 0x00000020) // Transmitter holding register empty +#define UART_U0LSR_THRE ((unsigned int) 0x00000020) +#define UART_U0LSR_TEMT_MASK ((unsigned int) 0x00000040) // Transmitter empty +#define UART_U0LSR_TEMT ((unsigned int) 0x00000040) +#define UART_U0LSR_RXFE_MASK ((unsigned int) 0x00000080) // Error in Rx FIFO +#define UART_U0LSR_RXFE ((unsigned int) 0x00000080) + +#define UART_U0MSR_Delta_CTS_MASK ((unsigned int) 0x00000001) // State change of input CTS +#define UART_U0MSR_Delta_CTS ((unsigned int) 0x00000001) +#define UART_U0MSR_Delta_DSR_MASK ((unsigned int) 0x00000002) // State change of input DSR +#define UART_U0MSR_Delta_DSR ((unsigned int) 0x00000002) +#define UART_U0MSR_Trailing_Edge_RI_MASK ((unsigned int) 0x00000004) // Low to high transition of input RI +#define UART_U0MSR_Trailing_Edge_RI ((unsigned int) 0x00000004) +#define UART_U0MSR_Delta_DCD_MASK ((unsigned int) 0x00000008) // State change of input DCD +#define UART_U0MSR_Delta_DCD ((unsigned int) 0x00000008) +#define UART_U0MSR_CTS_MASK ((unsigned int) 0x00000010) // Clear to send state +#define UART_U0MSR_CTS ((unsigned int) 0x00000010) +#define UART_U0MSR_DSR_MASK ((unsigned int) 0x00000020) // Data set ready state +#define UART_U0MSR_DSR ((unsigned int) 0x00000020) +#define UART_U0MSR_RI_MASK ((unsigned int) 0x00000040) // Ring indicator state +#define UART_U0MSR_RI ((unsigned int) 0x00000040) +#define UART_U0MSR_DCD_MASK ((unsigned int) 0x00000080) // Data carrier detect state +#define UART_U0MSR_DCD ((unsigned int) 0x00000080) + +#define UART_U0ACR_Start_MASK ((unsigned int) 0x00000001) // Auto-baud start/stop +#define UART_U0ACR_Start ((unsigned int) 0x00000001) +#define UART_U0ACR_Stop ((unsigned int) 0x00000000) +#define UART_U0ACR_Mode_MASK ((unsigned int) 0x00000002) // Auto-baud mode select +#define UART_U0ACR_Mode_Mode1 ((unsigned int) 0x00000000) +#define UART_U0ACR_Mode_Mode2 ((unsigned int) 0x00000002) +#define UART_U0ACR_AutoRestart_MASK ((unsigned int) 0x00000004) +#define UART_U0ACR_AutoRestart_NoRestart ((unsigned int) 0x00000000) +#define UART_U0ACR_AutoRestart_Restart ((unsigned int) 0x00000004) // Restart in case of time-out +#define UART_U0ACR_ABEOIntClr_MASK ((unsigned int) 0x00000100) // End of auto-baud interrupt clear bit +#define UART_U0ACR_ABEOIntClr ((unsigned int) 0x00000100) +#define UART_U0ACR_ABTOIntClr_MASK ((unsigned int) 0x00000200) // Auto-baud timeout interrupt clear bit +#define UART_U0ACR_ABTOIntClr ((unsigned int) 0x00000200) + +#define UART_U0FDR_DIVADDVAL_MASK ((unsigned int) 0x0000000F) // Fractional divider: prescaler register +#define UART_U0FDR_MULVAL_MASK ((unsigned int) 0x000000F0) // Fractional divider: prescaler multiplier + +#define UART_U0TER_TXEN_MASK ((unsigned int) 0x00000080) // UART transmit enable +#define UART_U0TER_TXEN_Enabled ((unsigned int) 0x00000080) +#define UART_U0TER_TXEN_Disabled ((unsigned int) 0x00000000) + +#define UART_U0RS485CTRL_NMMEN_MASK ((unsigned int) 0x00000001) // Normal multi-drop mode +#define UART_U0RS485CTRL_NMMEN ((unsigned int) 0x00000001) +#define UART_U0RS485CTRL_RXDIS_MASK ((unsigned int) 0x00000002) // Receiver +#define UART_U0RS485CTRL_RXDIS ((unsigned int) 0x00000002) +#define UART_U0RS485CTRL_AADEN_MASK ((unsigned int) 0x00000004) // Auto-address detect +#define UART_U0RS485CTRL_AADEN ((unsigned int) 0x00000004) +#define UART_U0RS485CTRL_SEL_MASK ((unsigned int) 0x00000008) +#define UART_U0RS485CTRL_SEL_RTS ((unsigned int) 0x00000000) // Use RTS for direction control +#define UART_U0RS485CTRL_SEL_DTS ((unsigned int) 0x00000008) // Use DTS for direction control +#define UART_U0RS485CTRL_DCTRL_MASK ((unsigned int) 0x00000010) // Enable/Disable auto-direction control +#define UART_U0RS485CTRL_DCTRL_Disabled ((unsigned int) 0x00000000) +#define UART_U0RS485CTRL_DCTRL_Enabled ((unsigned int) 0x00000010) +#define UART_U0RS485CTRL_OINV_MASK ((unsigned int) 0x00000020) // Reverse polarity of direction control signal on RTS/DTR pin +#define UART_U0RS485CTRL_OINV_Normal ((unsigned int) 0x00000000) +#define UART_U0RS485CTRL_OINV_Inverted ((unsigned int) 0x00000020) + +#define UART_U0FIFOLVL_RXFIFOLVL_MASK ((unsigned int) 0x0000000F) +#define UART_U0FIFOLVL_RXFIFOLVL_Empty ((unsigned int) 0x00000000) +#define UART_U0FIFOLVL_RXFIFOLVL_Full ((unsigned int) 0x0000000F) +#define UART_U0FIFOLVL_TXFIFOLVL_MASK ((unsigned int) 0x00000F00) +#define UART_U0FIFOLVL_TXFIFOLVL_Empty ((unsigned int) 0x00000000) +#define UART_U0FIFOLVL_TXFIFOLVL_Full ((unsigned int) 0x00000F00) + +/*############################################################################## +## SSP - Synchronous Serial Port +##############################################################################*/ + +#define SSP_SSP0_BASE_ADDRESS (0x40040000) + +#define SSP_SSP0CR0 (*(pREG32 (0x40040000))) // Control register 0 +#define SSP_SSP0CR1 (*(pREG32 (0x40040004))) // Control register 1 +#define SSP_SSP0DR (*(pREG32 (0x40040008))) // Data register +#define SSP_SSP0SR (*(pREG32 (0x4004000C))) // Status register +#define SSP_SSP0CPSR (*(pREG32 (0x40040010))) // Clock prescale register +#define SSP_SSP0IMSC (*(pREG32 (0x40040014))) // Interrupt mask set/clear register +#define SSP_SSP0RIS (*(pREG32 (0x40040018))) // Raw interrupt status register +#define SSP_SSP0MIS (*(pREG32 (0x4004001C))) // Masked interrupt status register +#define SSP_SSP0ICR (*(pREG32 (0x40040020))) // SSPICR interrupt clear register + +/* SSP0CR0 (SSP0 Control Register 0) + This register controls the basic operation of the SSP controller. */ + +#define SSP_SSP0CR0_DSS_MASK ((unsigned int) 0x0000000F) // Data size select +#define SSP_SSP0CR0_DSS_4BIT ((unsigned int) 0x00000003) +#define SSP_SSP0CR0_DSS_5BIT ((unsigned int) 0x00000004) +#define SSP_SSP0CR0_DSS_6BIT ((unsigned int) 0x00000005) +#define SSP_SSP0CR0_DSS_7BIT ((unsigned int) 0x00000006) +#define SSP_SSP0CR0_DSS_8BIT ((unsigned int) 0x00000007) +#define SSP_SSP0CR0_DSS_9BIT ((unsigned int) 0x00000008) +#define SSP_SSP0CR0_DSS_10BIT ((unsigned int) 0x00000009) +#define SSP_SSP0CR0_DSS_11BIT ((unsigned int) 0x0000000A) +#define SSP_SSP0CR0_DSS_12BIT ((unsigned int) 0x0000000B) +#define SSP_SSP0CR0_DSS_13BIT ((unsigned int) 0x0000000C) +#define SSP_SSP0CR0_DSS_14BIT ((unsigned int) 0x0000000D) +#define SSP_SSP0CR0_DSS_15BIT ((unsigned int) 0x0000000E) +#define SSP_SSP0CR0_DSS_16BIT ((unsigned int) 0x0000000F) +#define SSP_SSP0CR0_FRF_MASK ((unsigned int) 0x00000030) // Frame format +#define SSP_SSP0CR0_FRF_SPI ((unsigned int) 0x00000000) +#define SSP_SSP0CR0_FRF_TI ((unsigned int) 0x00000010) +#define SSP_SSP0CR0_FRF_MWIRE ((unsigned int) 0x00000020) +#define SSP_SSP0CR0_CPOL_MASK ((unsigned int) 0x00000040) // Clock out polarity +#define SSP_SSP0CR0_CPOL_LOW ((unsigned int) 0x00000000) +#define SSP_SSP0CR0_CPOL_HIGH ((unsigned int) 0x00000040) +#define SSP_SSP0CR0_CPHA_MASK ((unsigned int) 0x00000080) // Clock out phase +#define SSP_SSP0CR0_CPHA_FIRST ((unsigned int) 0x00000000) +#define SSP_SSP0CR0_CPHA_SECOND ((unsigned int) 0x00000080) + +/* Serial Clock Rate. The number of prescaler-output clocks per + bit on the bus, minus one. Given that CPSDVSR is the + prescale divider, and the APB clock PCLK clocks the + prescaler, the bit frequency is PCLK / (CPSDVSR × [SCR+1]). */ + +#define SSP_SSP0CR0_SCR_MASK ((unsigned int) 0x0000FF00) // Serial clock rate +#define SSP_SSP0CR0_SCR_1 ((unsigned int) 0x00000100) +#define SSP_SSP0CR0_SCR_2 ((unsigned int) 0x00000200) +#define SSP_SSP0CR0_SCR_3 ((unsigned int) 0x00000300) +#define SSP_SSP0CR0_SCR_4 ((unsigned int) 0x00000400) +#define SSP_SSP0CR0_SCR_5 ((unsigned int) 0x00000500) +#define SSP_SSP0CR0_SCR_6 ((unsigned int) 0x00000600) +#define SSP_SSP0CR0_SCR_7 ((unsigned int) 0x00000700) +#define SSP_SSP0CR0_SCR_8 ((unsigned int) 0x00000800) +#define SSP_SSP0CR0_SCR_9 ((unsigned int) 0x00000900) +#define SSP_SSP0CR0_SCR_10 ((unsigned int) 0x00000A00) +#define SSP_SSP0CR0_SCR_11 ((unsigned int) 0x00000B00) +#define SSP_SSP0CR0_SCR_12 ((unsigned int) 0x00000C00) +#define SSP_SSP0CR0_SCR_13 ((unsigned int) 0x00000D00) +#define SSP_SSP0CR0_SCR_14 ((unsigned int) 0x00000E00) +#define SSP_SSP0CR0_SCR_15 ((unsigned int) 0x00000F00) +#define SSP_SSP0CR0_SCR_16 ((unsigned int) 0x00001000) + +/* SSP0CR1 (SSP0 Control Register 1) + This register controls certain aspects of the operation of the SSP controller. */ + +#define SSP_SSP0CR1_LBM_MASK ((unsigned int) 0x00000001) // Loop back mode +#define SSP_SSP0CR1_LBM_NORMAL ((unsigned int) 0x00000000) +#define SSP_SSP0CR1_LBM_INVERTED ((unsigned int) 0x00000001) // MISO/MOSI are reversed +#define SSP_SSP0CR1_SSE_MASK ((unsigned int) 0x00000002) // SSP enable +#define SSP_SSP0CR1_SSE_DISABLED ((unsigned int) 0x00000000) +#define SSP_SSP0CR1_SSE_ENABLED ((unsigned int) 0x00000002) +#define SSP_SSP0CR1_MS_MASK ((unsigned int) 0x00000004) // Master/Slave Mode +#define SSP_SSP0CR1_MS_MASTER ((unsigned int) 0x00000000) +#define SSP_SSP0CR1_MS_SLAVE ((unsigned int) 0x00000004) +#define SSP_SSP0CR1_SOD_MASK ((unsigned int) 0x00000008) // Slave output disable + +/* SSP0DR (SSP0 Data Register) + Software can write data to be transmitted to this register, and read data that has been + received. */ + +#define SSP_SSP0DR_MASK ((unsigned int) 0x0000FFFF) // Data + +/* SSP0SR (SSP0 Status Register) + This read-only register reflects the current status of the SSP controller. */ + +#define SSP_SSP0SR_TFE_MASK ((unsigned int) 0x00000001) // Transmit FIFO empty +#define SSP_SSP0SR_TFE_EMPTY ((unsigned int) 0x00000001) +#define SSP_SSP0SR_TFE_NOTEMPTY ((unsigned int) 0x00000000) +#define SSP_SSP0SR_TNF_MASK ((unsigned int) 0x00000002) // Transmit FIFO not full +#define SSP_SSP0SR_TNF_NOTFULL ((unsigned int) 0x00000002) +#define SSP_SSP0SR_TNF_FULL ((unsigned int) 0x00000000) +#define SSP_SSP0SR_RNE_MASK ((unsigned int) 0x00000004) // Receive FIFO not empty +#define SSP_SSP0SR_RNE_NOTEMPTY ((unsigned int) 0x00000004) +#define SSP_SSP0SR_RNE_EMPTY ((unsigned int) 0x00000000) +#define SSP_SSP0SR_RFF_MASK ((unsigned int) 0x00000008) // Receive FIFO full +#define SSP_SSP0SR_RFF_FULL ((unsigned int) 0x00000008) +#define SSP_SSP0SR_RFF_NOTFULL ((unsigned int) 0x00000000) +#define SSP_SSP0SR_BSY_MASK ((unsigned int) 0x00000010) // Busy Flag +#define SSP_SSP0SR_BSY_IDLE ((unsigned int) 0x00000000) +#define SSP_SSP0SR_BSY_BUSY ((unsigned int) 0x00000010) + +/* SSP0CPSR (SSP0 Clock Prescale Register) + This register controls the factor by which the Prescaler divides the SSP peripheral clock + SSP_PCLK to yield the prescaler clock that is, in turn, divided by the SCR factor in + SSP0CR0, to determine the bit clock. */ + +#define SSP_SSP0CPSR_CPSDVSR_MASK ((unsigned int) 0x000000FF) +#define SSP_SSP0CPSR_CPSDVSR_DIV2 ((unsigned int) 0x00000002) +#define SSP_SSP0CPSR_CPSDVSR_DIV4 ((unsigned int) 0x00000004) +#define SSP_SSP0CPSR_CPSDVSR_DIV10 ((unsigned int) 0x0000000A) +#define SSP_SSP0CPSR_CPSDVSR_DIV12 ((unsigned int) 0x0000000C) +#define SSP_SSP0CPSR_CPSDVSR_DIV16 ((unsigned int) 0x00000010) +#define SSP_SSP0CPSR_CPSDVSR_DIV20 ((unsigned int) 0x00000014) + +/* SSP0IMSC (SSP0 Interrupt Mask Set/Clear Register) + This register controls whether each of the four possible interrupt conditions in the SSP + controller are enabled. Note that ARM uses the word “masked” in the opposite sense from + classic computer terminology, in which “masked” meant “disabled”. ARM uses the word + “masked” to mean “enabled”. To avoid confusion we will not use the word “masked”. */ + +#define SSP_SSP0IMSC_RORIM_MASK ((unsigned int) 0x00000001) // Receive overrun interrupt +#define SSP_SSP0IMSC_RORIM_ENBL ((unsigned int) 0x00000001) +#define SSP_SSP0IMSC_RORIM_DSBL ((unsigned int) 0x00000000) +#define SSP_SSP0IMSC_RTIM_MASK ((unsigned int) 0x00000002) // Receive timeout interrupt +#define SSP_SSP0IMSC_RTIM_ENBL ((unsigned int) 0x00000002) +#define SSP_SSP0IMSC_RTIM_DSBL ((unsigned int) 0x00000000) +#define SSP_SSP0IMSC_RXIM_MASK ((unsigned int) 0x00000004) // Rx FIFO >= 1/2 full interrupt +#define SSP_SSP0IMSC_RXIM_ENBL ((unsigned int) 0x00000004) +#define SSP_SSP0IMSC_RXIM_DSBL ((unsigned int) 0x00000000) +#define SSP_SSP0IMSC_TXIM_MASK ((unsigned int) 0x00000008) // Tx FIFO >= 1/2 empty interrupt +#define SSP_SSP0IMSC_TXIM_ENBL ((unsigned int) 0x00000008) +#define SSP_SSP0IMSC_TXIM_DSBL ((unsigned int) 0x00000000) + +/* SSP0RIS (SSP0 Raw Interrupt Status Register) + This read-only register contains a 1 for each interrupt condition that is asserted, + regardless of whether or not the interrupt is enabled in the SSP0IMSC. */ + +#define SSP_SSP0RIS_RORRIS_MASK ((unsigned int) 0x00000001) // Frame received while Rx FIFO full +#define SSP_SSP0RIS_RORRIS_RCVD ((unsigned int) 0x00000001) +#define SSP_SSP0RIS_RTRIS_MASK ((unsigned int) 0x00000002) // Rx FIFO not empty no read within timeout +#define SSP_SSP0RIS_RTRIS_NOTEMPTY ((unsigned int) 0x00000002) +#define SSP_SSP0RIS_RXRIS_MASK ((unsigned int) 0x00000004) // Rx FIFO >= half full +#define SSP_SSP0RIS_RXRIS_HALFFULL ((unsigned int) 0x00000004) +#define SSP_SSP0RIS_TXRIS_MASK ((unsigned int) 0x00000008) // Tx FIF0 >= half-empty +#define SSP_SSP0RIS_TXRIS_HALFEMPTY ((unsigned int) 0x00000008) + +/* SSP0MIS (SSP0 Masked Interrupt Status Register) + This read-only register contains a 1 for each interrupt condition that is asserted and + enabled in the SSP0IMSC. When an SSP interrupt occurs, the interrupt service routine + should read this register to determine the cause(s) of the interrupt. */ + +#define SSP_SSP0MIS_RORMIS_MASK ((unsigned int) 0x00000001) // Frame received while Rx FIFO full +#define SSP_SSP0MIS_RORMIS_FRMRCVD ((unsigned int) 0x00000001) +#define SSP_SSP0MIS_RTMIS_MASK ((unsigned int) 0x00000002) // Rx FIFO not empty no read withing timeout +#define SSP_SSP0MIS_RTMIS_NOTEMPTY ((unsigned int) 0x00000002) +#define SSP_SSP0MIS_RXMIS_MASK ((unsigned int) 0x00000004) // Rx FIFO >= half full +#define SSP_SSP0MIS_RXMIS_HALFFULL ((unsigned int) 0x00000004) +#define SSP_SSP0MIS_TXMIS_MASK ((unsigned int) 0x00000008) // Tx FIFO >= half-empty +#define SSP_SSP0MIS_TXMIS_HALFEMPTY ((unsigned int) 0x00000008) + +/* SSP0ICR (SSP0 Interrupt Clear Register) + Software can write one or more one(s) to this write-only register, to clear the + corresponding interrupt condition(s) in the SSP controller. Note that the other two interrupt + conditions can be cleared by writing or reading the appropriate FIFO, or disabled by + clearing the corresponding bit in SSP0IMSC. */ + +#define SSP_SSP0ICR_RORIC_MASK ((unsigned int) 0x00000001) // Clears RORIC interrupt flag +#define SSP_SSP0ICR_RORIC_CLEAR ((unsigned int) 0x00000001) +#define SSP_SSP0ICR_RTIC_MASK ((unsigned int) 0x00000002) // Clear Rx FIFO not empty/no read flag +#define SSP_SSP0ICR_RTIC_CLEAR ((unsigned int) 0x00000002) + +/*############################################################################## +## I2C +##############################################################################*/ + +#define I2C_BASE_ADDRESS (0x40000000) + +#define I2C_I2CCONSET (*(pREG32 (0x40000000))) // I2C control set register +#define I2C_I2CSTAT (*(pREG32 (0x40000004))) // I2C status register +#define I2C_I2CDAT (*(pREG32 (0x40000008))) // I2C data register +#define I2C_I2CADR0 (*(pREG32 (0x4000000C))) // I2C slave address register +#define I2C_I2CSCLH (*(pREG32 (0x40000010))) // I2C SCL HIGH/LOW duty cycle register +#define I2C_I2CSCLL (*(pREG32 (0x40000014))) +#define I2C_I2CCONCLR (*(pREG32 (0x40000018))) // I2C control clear register +#define I2C_I2CMMCTRL (*(pREG32 (0x4000001C))) // I2C monitor control register +#define I2C_I2CADR1 (*(pREG32 (0x40000020))) // I2C slave address register 1 +#define I2C_I2CADR2 (*(pREG32 (0x40000024))) // I2C slave address register 2 +#define I2C_I2CADR3 (*(pREG32 (0x40000028))) // I2C slave address register 3 +#define I2C_I2CDATA_BUFFER (*(pREG32 (0x4000002C))) // I2C data buffer register +#define I2C_I2CMASK0 (*(pREG32 (0x40000030))) // I2C mask register 0 +#define I2C_I2CMASK1 (*(pREG32 (0x40000034))) // I2C mask register 1 +#define I2C_I2CMASK2 (*(pREG32 (0x40000038))) // I2C mask register 2 +#define I2C_I2CMASK3 (*(pREG32 (0x4000003C))) // I2C mask register 3 + +/* I2CCONSET (I2C Control Set register) + The I2CONSET registers control setting of bits in the I2CON register that controls + operation of the I2C interface. Writing a one to a bit of this register causes the + corresponding bit in the I2C control register to be set. Writing a zero has no effect. */ + +#define I2C_I2CCONSET_AA_MASK ((unsigned int) 0x00000004) +#define I2C_I2CCONSET_AA ((unsigned int) 0x00000004) // Asset acknowlegde flag +#define I2C_I2CCONSET_SI_MASK ((unsigned int) 0x00000008) +#define I2C_I2CCONSET_SI ((unsigned int) 0x00000008) // I2C interrupt flag +#define I2C_I2CCONSET_STO_MASK ((unsigned int) 0x00000010) +#define I2C_I2CCONSET_STO ((unsigned int) 0x00000010) // Stop flag +#define I2C_I2CCONSET_STA_MASK ((unsigned int) 0x00000020) +#define I2C_I2CCONSET_STA ((unsigned int) 0x00000020) // Start flag +#define I2C_I2CCONSET_I2EN_MASK ((unsigned int) 0x00000040) +#define I2C_I2CCONSET_I2EN ((unsigned int) 0x00000040) // I2C interface enable + +/* I2CSTAT (I2C Status register) + Each I2C Status register reflects the condition of the corresponding I2C interface. The I2C + Status register is Read-Only. */ + +#define I2C_I2CSTAT_Status_MASK ((unsigned int) 0x000000F8) // Status information + +/* I2CADR0 (I2C Slave Address register) + These registers are readable and writable and are only used when an I2C interface is set + to slave mode. */ + +#define I2C_I2CADR0_GC_MASK ((unsigned int) 0x00000001) +#define I2C_I2CADR0_GC ((unsigned int) 0x00000001) // General call enable bit +#define I2C_I2CADR0_Address_MASK ((unsigned int) 0x000000FE) // I2C device address for slave mode + +/* I2CCONCLR (I2C Control Clear register) + The I2CONCLR registers control clearing of bits in the I2CON register that controls + operation of the I2C interface. Writing a one to a bit of this register causes the + corresponding bit in the I2C control register to be cleared. Writing a zero has no effect. */ + +#define I2C_I2CCONCLR_AAC_MASK ((unsigned int) 0x00000004) // Assert acknowledge clear bit +#define I2C_I2CCONCLR_AAC ((unsigned int) 0x00000004) +#define I2C_I2CCONCLR_SIC_MASK ((unsigned int) 0x00000008) // I2C interrupt clear bit +#define I2C_I2CCONCLR_SIC ((unsigned int) 0x00000008) +#define I2C_I2CCONCLR_STAC_MASK ((unsigned int) 0x00000020) // Start flag clear bit +#define I2C_I2CCONCLR_STAC ((unsigned int) 0x00000020) +#define I2C_I2CCONCLR_I2ENC_MASK ((unsigned int) 0x00000040) // I2C interface disable bit +#define I2C_I2CCONCLR_I2ENC ((unsigned int) 0x00000040) + +/* I2CMMCTRL (I2C Monitor mode control register) + This register controls the Monitor mode which allows the I2C module to monitor traffic on + the I2C bus without actually participating in traffic or interfering with the I2C bus. */ + +#define I2C_I2CMMCTRL_MM_ENA_MASK ((unsigned int) 0x00000001) // Monitor mode enable +#define I2C_I2CMMCTRL_MM_ENA_ENABLED ((unsigned int) 0x00000001) +#define I2C_I2CMMCTRL_MM_ENA_DISABLED ((unsigned int) 0x00000000) +#define I2C_I2CMMCTRL_ENA_SCL_MASK ((unsigned int) 0x00000002) // SCL output enable +#define I2C_I2CMMCTRL_ENA_SCL_HOLDLOW ((unsigned int) 0x00000002) +#define I2C_I2CMMCTRL_ENA_SCL_FORCEHIGH ((unsigned int) 0x00000000) +#define I2C_I2CMMCTRL_MATCH_ALL_MASK ((unsigned int) 0x00000008) // Select interrupt register match +#define I2C_I2CMMCTRL_MATCH_ALL_NORMAL ((unsigned int) 0x00000000) +#define I2C_I2CMMCTRL_MATCH_ALL_ANYADDRESS ((unsigned int) 0x00000008) + +/* I2CADR1..3 (I2C Slave Address registers) + These registers are readable and writable and are only used when an I2C interface is set + to slave mode. In master mode, this register has no effect. The LSB of I2ADR is the + General Call bit. When this bit is set, the General Call address (0x00) is recognized. */ + +#define I2C_I2CADR1_GC_MASK ((unsigned int) 0x00000001) // General call enable bit +#define I2C_I2CADR1_GC ((unsigned int) 0x00000001) +#define I2C_I2CADR1_Address_MASK ((unsigned int) 0x000000FE) + +#define I2C_I2CADR2_GC_MASK ((unsigned int) 0x00000001) // General call enable bit +#define I2C_I2CADR2_GC ((unsigned int) 0x00000001) +#define I2C_I2CADR2_Address_MASK ((unsigned int) 0x000000FE) + +#define I2C_I2CADR3_GC_MASK ((unsigned int) 0x00000001) // General call enable bit +#define I2C_I2CADR3_GC ((unsigned int) 0x00000001) +#define I2C_I2CADR3_Address_MASK ((unsigned int) 0x000000FE) + +/* I2CMASK0..3 (I2C Mask registers) */ + +#define I2C_I2CMASK0_MASK_MASK ((unsigned int) 0x000000FE) + +#define I2C_I2CMASK1_MASK_MASK ((unsigned int) 0x000000FE) + +#define I2C_I2CMASK2_MASK_MASK ((unsigned int) 0x000000FE) + +#define I2C_I2CMASK3_MASK_MASK ((unsigned int) 0x000000FE) + +/*############################################################################## +## 16-Bit Timers (CT16B0/1) +##############################################################################*/ + +#define TMR_CT16B0_BASE_ADDRESS (0x4000C000) + +#define TMR_TMR16B0IR (*(pREG32 (0x4000C000))) // Interrupt register +#define TMR_TMR16B0TCR (*(pREG32 (0x4000C004))) // Timer control register +#define TMR_TMR16B0TC (*(pREG32 (0x4000C008))) // Timer counter +#define TMR_TMR16B0PR (*(pREG32 (0x4000C00C))) // Prescale register +#define TMR_TMR16B0PC (*(pREG32 (0x4000C010))) // Prescale counter register +#define TMR_TMR16B0MCR (*(pREG32 (0x4000C014))) // Match control register +#define TMR_TMR16B0MR0 (*(pREG32 (0x4000C018))) // Match register 0 +#define TMR_TMR16B0MR1 (*(pREG32 (0x4000C01C))) // Match register 1 +#define TMR_TMR16B0MR2 (*(pREG32 (0x4000C020))) // Match register 2 +#define TMR_TMR16B0MR3 (*(pREG32 (0x4000C024))) // Match register 3 +#define TMR_TMR16B0CCR (*(pREG32 (0x4000C028))) // Capture control register +#define TMR_TMR16B0CR0 (*(pREG32 (0x4000C02C))) // Capture register +#define TMR_TMR16B0EMR (*(pREG32 (0x4000C03C))) // External match register +#define TMR_TMR16B0CTCR (*(pREG32 (0x4000C070))) // Count control register +#define TMR_TMR16B0PWMC (*(pREG32 (0x4000C074))) // PWM control register + +#define TMR_TMR16B0IR_MR0_MASK ((unsigned int) 0x00000001) // Interrupt flag for match channel 0 +#define TMR_TMR16B0IR_MR0 ((unsigned int) 0x00000001) +#define TMR_TMR16B0IR_MR1_MASK ((unsigned int) 0x00000002) // Interrupt flag for match channel 1 +#define TMR_TMR16B0IR_MR1 ((unsigned int) 0x00000002) +#define TMR_TMR16B0IR_MR2_MASK ((unsigned int) 0x00000004) // Interrupt flag for match channel 2 +#define TMR_TMR16B0IR_MR2 ((unsigned int) 0x00000004) +#define TMR_TMR16B0IR_MR3_MASK ((unsigned int) 0x00000008) // Interrupt flag for match channel 3 +#define TMR_TMR16B0IR_MR3 ((unsigned int) 0x00000008) +#define TMR_TMR16B0IR_CR0_MASK ((unsigned int) 0x00000010) // Interrupt flag for capture channel 0 event +#define TMR_TMR16B0IR_CR0 ((unsigned int) 0x00000010) +#define TMR_TMR16B0IR_MASK_ALL ((unsigned int) 0x0000001F) + +#define TMR_TMR16B0TCR_COUNTERENABLE_MASK ((unsigned int) 0x00000001) // Counter enable +#define TMR_TMR16B0TCR_COUNTERENABLE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR16B0TCR_COUNTERENABLE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0TCR_COUNTERRESET_MASK ((unsigned int) 0x00000002) +#define TMR_TMR16B0TCR_COUNTERRESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR16B0TCR_COUNTERRESET_DISABLED ((unsigned int) 0x00000002) + +#define TMR_TMR16B0MCR_MR0_INT_MASK ((unsigned int) 0x00000001) // Interrupt on MRO +#define TMR_TMR16B0MCR_MR0_INT_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR16B0MCR_MR0_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR0_RESET_MASK ((unsigned int) 0x00000002) // Reset on MR0 +#define TMR_TMR16B0MCR_MR0_RESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR16B0MCR_MR0_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR0_STOP_MASK ((unsigned int) 0x00000004) // Stop on MR0 +#define TMR_TMR16B0MCR_MR0_STOP_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR16B0MCR_MR0_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR1_INT_MASK ((unsigned int) 0x00000008) // Interrupt on MR1 +#define TMR_TMR16B0MCR_MR1_INT_ENABLED ((unsigned int) 0x00000008) +#define TMR_TMR16B0MCR_MR1_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR1_RESET_MASK ((unsigned int) 0x00000010) // Reset on MR1 +#define TMR_TMR16B0MCR_MR1_RESET_ENABLED ((unsigned int) 0x00000010) +#define TMR_TMR16B0MCR_MR1_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR1_STOP_MASK ((unsigned int) 0x00000020) // Stop on MR1 +#define TMR_TMR16B0MCR_MR1_STOP_ENABLED ((unsigned int) 0x00000020) +#define TMR_TMR16B0MCR_MR1_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR2_INT_MASK ((unsigned int) 0x00000040) // Interrupt on MR2 +#define TMR_TMR16B0MCR_MR2_INT_ENABLED ((unsigned int) 0x00000040) +#define TMR_TMR16B0MCR_MR2_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR2_RESET_MASK ((unsigned int) 0x00000080) // Reset on MR2 +#define TMR_TMR16B0MCR_MR2_RESET_ENABLED ((unsigned int) 0x00000080) +#define TMR_TMR16B0MCR_MR2_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR2_STOP_MASK ((unsigned int) 0x00000100) // Stop on MR2 +#define TMR_TMR16B0MCR_MR2_STOP_ENABLED ((unsigned int) 0x00000100) +#define TMR_TMR16B0MCR_MR2_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR3_INT_MASK ((unsigned int) 0x00000200) // Interrupt on MR3 +#define TMR_TMR16B0MCR_MR3_INT_ENABLED ((unsigned int) 0x00000200) +#define TMR_TMR16B0MCR_MR3_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR3_RESET_MASK ((unsigned int) 0x00000400) // Reset on MR3 +#define TMR_TMR16B0MCR_MR3_RESET_ENABLED ((unsigned int) 0x00000400) +#define TMR_TMR16B0MCR_MR3_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0MCR_MR3_STOP_MASK ((unsigned int) 0x00000800) // Stop on MR3 +#define TMR_TMR16B0MCR_MR3_STOP_ENABLED ((unsigned int) 0x00000800) +#define TMR_TMR16B0MCR_MR3_STOP_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR16B0CCR_CAP0RE_MASK ((unsigned int) 0x00000001) // Capture on rising edge +#define TMR_TMR16B0CCR_CAP0RE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR16B0CCR_CAP0RE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0CCR_CAP0FE_MASK ((unsigned int) 0x00000002) // Capture on falling edge +#define TMR_TMR16B0CCR_CAP0FE_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR16B0CCR_CAP0FE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0CCR_CAP0I_MASK ((unsigned int) 0x00000004) // Interrupt on CAP0 event +#define TMR_TMR16B0CCR_CAP0I_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR16B0CCR_CAP0I_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR16B0EMR_EM0_MASK ((unsigned int) 0x00000001) // External match 0 +#define TMR_TMR16B0EMR_EM0 ((unsigned int) 0x00000001) +#define TMR_TMR16B0EMR_EMC0_MASK ((unsigned int) 0x00000030) +#define TMR_TMR16B0EMR_EMC0_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B0EMR_EMC0_LOW ((unsigned int) 0x00000010) +#define TMR_TMR16B0EMR_EMC0_HIGH ((unsigned int) 0x00000020) +#define TMR_TMR16B0EMR_EMC0_TOGGLE ((unsigned int) 0x00000030) +#define TMR_TMR16B0EMR_EM1_MASK ((unsigned int) 0x00000002) // External match 1 +#define TMR_TMR16B0EMR_EM1 ((unsigned int) 0x00000002) +#define TMR_TMR16B0EMR_EMC1_MASK ((unsigned int) 0x000000C0) +#define TMR_TMR16B0EMR_EMC1_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B0EMR_EMC1_LOW ((unsigned int) 0x00000040) +#define TMR_TMR16B0EMR_EMC1_HIGH ((unsigned int) 0x00000080) +#define TMR_TMR16B0EMR_EMC1_TOGGLE ((unsigned int) 0x000000C0) +#define TMR_TMR16B0EMR_EM2_MASK ((unsigned int) 0x00000004) // External match 2 +#define TMR_TMR16B0EMR_EM2 ((unsigned int) 0x00000004) +#define TMR_TMR16B0EMR_EMC2_MASK ((unsigned int) 0x00000300) +#define TMR_TMR16B0EMR_EMC2_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B0EMR_EMC2_LOW ((unsigned int) 0x00000100) +#define TMR_TMR16B0EMR_EMC2_HIGH ((unsigned int) 0x00000200) +#define TMR_TMR16B0EMR_EMC2_TOGGLE ((unsigned int) 0x00000300) +#define TMR_TMR16B0EMR_EM3_MASK ((unsigned int) 0x00000008) // External match 3 +#define TMR_TMR16B0EMR_EM3 ((unsigned int) 0x00000008) +#define TMR_TMR16B0EMR_EMC3_MASK ((unsigned int) 0x00000C00) +#define TMR_TMR16B0EMR_EMC3_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B0EMR_EMC3_LOW ((unsigned int) 0x00000400) +#define TMR_TMR16B0EMR_EMC3_HIGH ((unsigned int) 0x00000800) +#define TMR_TMR16B0EMR_EMC3_TOGGLE ((unsigned int) 0x00000C00) + +#define TMR_TMR16B0CTCR_CTMODE_MASK ((unsigned int) 0x00000003) // Counter/Timer mode +#define TMR_TMR16B0CTCR_CTMODE_TIMER ((unsigned int) 0x00000000) // Timer Mode: Every rising PCLK edge +#define TMR_TMR16B0CTCR_CTMODE_COUNTERRISING ((unsigned int) 0x00000001) // Counter: TC increments on rising edge of input +#define TMR_TMR16B0CTCR_CTMODE_COUNTERFALLING ((unsigned int) 0x00000002) // Counter: TC increments on falling edge of input +#define TMR_TMR16B0CTCR_CTMODE_COUNTERBOTH ((unsigned int) 0x00000003) // Counter: TC increments on both edges of input +#define TMR_TMR16B0CTCR_CINPUTSELECT_MASK ((unsigned int) 0x0000000C) +#define TMR_TMR16B0CTCR_CINPUTSELECT ((unsigned int) 0x00000000) // CINPUTSELECT must be set to 00 + +#define TMR_TMR16B0PWMC_PWM0_MASK ((unsigned int) 0x00000001) +#define TMR_TMR16B0PWMC_PWM0_ENABLED ((unsigned int) 0x00000001) // PWM mode is enabled for CT16Bn_MAT0 +#define TMR_TMR16B0PWMC_PWM0_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0PWMC_PWM1_MASK ((unsigned int) 0x00000002) +#define TMR_TMR16B0PWMC_PWM1_ENABLED ((unsigned int) 0x00000002) // PWM mode is enabled for CT16Bn_MAT1 +#define TMR_TMR16B0PWMC_PWM1_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0PWMC_PWM2_MASK ((unsigned int) 0x00000004) +#define TMR_TMR16B0PWMC_PWM2_ENABLED ((unsigned int) 0x00000004) // PWM mode is enabled for CT16Bn_MAT2 +#define TMR_TMR16B0PWMC_PWM2_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B0PWMC_PWM3_MASK ((unsigned int) 0x00000008) +#define TMR_TMR16B0PWMC_PWM3_ENABLED ((unsigned int) 0x00000008) +#define TMR_TMR16B0PWMC_PWM3_DISABLED ((unsigned int) 0x00000000) + +#define TMR_CT16B1_BASE_ADDRESS (0x40010000) + +#define TMR_TMR16B1IR (*(pREG32 (0x40010000))) // Interrupt register +#define TMR_TMR16B1TCR (*(pREG32 (0x40010004))) // Timer control register +#define TMR_TMR16B1TC (*(pREG32 (0x40010008))) // Timer counter +#define TMR_TMR16B1PR (*(pREG32 (0x4001000C))) // Prescale register +#define TMR_TMR16B1PC (*(pREG32 (0x40010010))) // Prescale counter register +#define TMR_TMR16B1MCR (*(pREG32 (0x40010014))) // Match control register +#define TMR_TMR16B1MR0 (*(pREG32 (0x40010018))) // Match register 0 +#define TMR_TMR16B1MR1 (*(pREG32 (0x4001001C))) // Match register 1 +#define TMR_TMR16B1MR2 (*(pREG32 (0x40010020))) // Match register 2 +#define TMR_TMR16B1MR3 (*(pREG32 (0x40010024))) // Match register 3 +#define TMR_TMR16B1CCR (*(pREG32 (0x40010028))) // Capture control register +#define TMR_TMR16B1CR0 (*(pREG32 (0x4001002C))) // Capture register +#define TMR_TMR16B1EMR (*(pREG32 (0x4001003C))) // External match register +#define TMR_TMR16B1CTCR (*(pREG32 (0x40010070))) // Count control register +#define TMR_TMR16B1PWMC (*(pREG32 (0x40010074))) // PWM control register + +#define TMR_TMR16B1IR_MR0_MASK ((unsigned int) 0x00000001) // Interrupt flag for match channel 0 +#define TMR_TMR16B1IR_MR0 ((unsigned int) 0x00000001) +#define TMR_TMR16B1IR_MR1_MASK ((unsigned int) 0x00000002) // Interrupt flag for match channel 1 +#define TMR_TMR16B1IR_MR1 ((unsigned int) 0x00000002) +#define TMR_TMR16B1IR_MR2_MASK ((unsigned int) 0x00000004) // Interrupt flag for match channel 2 +#define TMR_TMR16B1IR_MR2 ((unsigned int) 0x00000004) +#define TMR_TMR16B1IR_MR3_MASK ((unsigned int) 0x00000008) // Interrupt flag for match channel 3 +#define TMR_TMR16B1IR_MR3 ((unsigned int) 0x00000008) +#define TMR_TMR16B1IR_CR0_MASK ((unsigned int) 0x00000010) // Interrupt flag for capture channel 0 event +#define TMR_TMR16B1IR_CR0 ((unsigned int) 0x00000010) +#define TMR_TMR16B1IR_MASK_ALL ((unsigned int) 0x0000001F) + +#define TMR_TMR16B1TCR_COUNTERENABLE_MASK ((unsigned int) 0x00000001) // Counter enable +#define TMR_TMR16B1TCR_COUNTERENABLE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR16B1TCR_COUNTERENABLE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1TCR_COUNTERRESET_MASK ((unsigned int) 0x00000002) +#define TMR_TMR16B1TCR_COUNTERRESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR16B1TCR_COUNTERRESET_DISABLED ((unsigned int) 0x00000002) + +#define TMR_TMR16B1MCR_MR0_INT_MASK ((unsigned int) 0x00000001) // Interrupt on MRO +#define TMR_TMR16B1MCR_MR0_INT_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR16B1MCR_MR0_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR0_RESET_MASK ((unsigned int) 0x00000002) // Reset on MR0 +#define TMR_TMR16B1MCR_MR0_RESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR16B1MCR_MR0_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR0_STOP_MASK ((unsigned int) 0x00000004) // Stop on MR0 +#define TMR_TMR16B1MCR_MR0_STOP_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR16B1MCR_MR0_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR1_INT_MASK ((unsigned int) 0x00000008) // Interrupt on MR1 +#define TMR_TMR16B1MCR_MR1_INT_ENABLED ((unsigned int) 0x00000008) +#define TMR_TMR16B1MCR_MR1_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR1_RESET_MASK ((unsigned int) 0x00000010) // Reset on MR1 +#define TMR_TMR16B1MCR_MR1_RESET_ENABLED ((unsigned int) 0x00000010) +#define TMR_TMR16B1MCR_MR1_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR1_STOP_MASK ((unsigned int) 0x00000020) // Stop on MR1 +#define TMR_TMR16B1MCR_MR1_STOP_ENABLED ((unsigned int) 0x00000020) +#define TMR_TMR16B1MCR_MR1_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR2_INT_MASK ((unsigned int) 0x00000040) // Interrupt on MR2 +#define TMR_TMR16B1MCR_MR2_INT_ENABLED ((unsigned int) 0x00000040) +#define TMR_TMR16B1MCR_MR2_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR2_RESET_MASK ((unsigned int) 0x00000080) // Reset on MR2 +#define TMR_TMR16B1MCR_MR2_RESET_ENABLED ((unsigned int) 0x00000080) +#define TMR_TMR16B1MCR_MR2_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR2_STOP_MASK ((unsigned int) 0x00000100) // Stop on MR2 +#define TMR_TMR16B1MCR_MR2_STOP_ENABLED ((unsigned int) 0x00000100) +#define TMR_TMR16B1MCR_MR2_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR3_INT_MASK ((unsigned int) 0x00000200) // Interrupt on MR3 +#define TMR_TMR16B1MCR_MR3_INT_ENABLED ((unsigned int) 0x00000200) +#define TMR_TMR16B1MCR_MR3_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR3_RESET_MASK ((unsigned int) 0x00000400) // Reset on MR3 +#define TMR_TMR16B1MCR_MR3_RESET_ENABLED ((unsigned int) 0x00000400) +#define TMR_TMR16B1MCR_MR3_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1MCR_MR3_STOP_MASK ((unsigned int) 0x00000800) // Stop on MR3 +#define TMR_TMR16B1MCR_MR3_STOP_ENABLED ((unsigned int) 0x00000800) +#define TMR_TMR16B1MCR_MR3_STOP_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR16B1CCR_CAP0RE_MASK ((unsigned int) 0x00000001) // Capture on rising edge +#define TMR_TMR16B1CCR_CAP0RE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR16B1CCR_CAP0RE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1CCR_CAP0FE_MASK ((unsigned int) 0x00000002) // Capture on falling edge +#define TMR_TMR16B1CCR_CAP0FE_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR16B1CCR_CAP0FE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1CCR_CAP0I_MASK ((unsigned int) 0x00000004) // Interrupt on CAP0 event +#define TMR_TMR16B1CCR_CAP0I_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR16B1CCR_CAP0I_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR16B1EMR_EM0_MASK ((unsigned int) 0x00000001) // External match 0 +#define TMR_TMR16B1EMR_EM0 ((unsigned int) 0x00000001) +#define TMR_TMR16B1EMR_EMC0_MASK ((unsigned int) 0x00000030) +#define TMR_TMR16B1EMR_EMC0_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B1EMR_EMC0_LOW ((unsigned int) 0x00000010) +#define TMR_TMR16B1EMR_EMC0_HIGH ((unsigned int) 0x00000020) +#define TMR_TMR16B1EMR_EMC0_TOGGLE ((unsigned int) 0x00000030) +#define TMR_TMR16B1EMR_EM1_MASK ((unsigned int) 0x00000002) // External match 1 +#define TMR_TMR16B1EMR_EM1 ((unsigned int) 0x00000002) +#define TMR_TMR16B1EMR_EMC1_MASK ((unsigned int) 0x000000C0) +#define TMR_TMR16B1EMR_EMC1_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B1EMR_EMC1_LOW ((unsigned int) 0x00000040) +#define TMR_TMR16B1EMR_EMC1_HIGH ((unsigned int) 0x00000080) +#define TMR_TMR16B1EMR_EMC1_TOGGLE ((unsigned int) 0x000000C0) +#define TMR_TMR16B1EMR_EM2_MASK ((unsigned int) 0x00000004) // External match 2 +#define TMR_TMR16B1EMR_EM2 ((unsigned int) 0x00000004) +#define TMR_TMR16B1EMR_EMC2_MASK ((unsigned int) 0x00000300) +#define TMR_TMR16B1EMR_EMC2_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B1EMR_EMC2_LOW ((unsigned int) 0x00000100) +#define TMR_TMR16B1EMR_EMC2_HIGH ((unsigned int) 0x00000200) +#define TMR_TMR16B1EMR_EMC2_TOGGLE ((unsigned int) 0x00000300) +#define TMR_TMR16B1EMR_EM3_MASK ((unsigned int) 0x00000008) // External match 3 +#define TMR_TMR16B1EMR_EM3 ((unsigned int) 0x00000008) +#define TMR_TMR16B1EMR_EMC3_MASK ((unsigned int) 0x00000C00) +#define TMR_TMR16B1EMR_EMC3_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR16B1EMR_EMC3_LOW ((unsigned int) 0x00000400) +#define TMR_TMR16B1EMR_EMC3_HIGH ((unsigned int) 0x00000800) +#define TMR_TMR16B1EMR_EMC3_TOGGLE ((unsigned int) 0x00000C00) + +#define TMR_TMR16B1CTCR_CTMODE_MASK ((unsigned int) 0x00000003) // Counter/Timer mode +#define TMR_TMR16B1CTCR_CTMODE_TIMER ((unsigned int) 0x00000000) // Timer Mode: Every rising PCLK edge +#define TMR_TMR16B1CTCR_CTMODE_COUNTERRISING ((unsigned int) 0x00000001) // Counter: TC increments on rising edge of input +#define TMR_TMR16B1CTCR_CTMODE_COUNTERFALLING ((unsigned int) 0x00000002) // Counter: TC increments on falling edge of input +#define TMR_TMR16B1CTCR_CTMODE_COUNTERBOTH ((unsigned int) 0x00000003) // Counter: TC increments on both edges of input +#define TMR_TMR16B1CTCR_CINPUTSELECT_MASK ((unsigned int) 0x0000000C) +#define TMR_TMR16B1CTCR_CINPUTSELECT ((unsigned int) 0x00000000) // CINPUTSELECT must be set to 00 + +#define TMR_TMR16B1PWMC_PWM0_MASK ((unsigned int) 0x00000001) +#define TMR_TMR16B1PWMC_PWM0_ENABLED ((unsigned int) 0x00000001) // PWM mode is enabled for CT16Bn_MAT0 +#define TMR_TMR16B1PWMC_PWM0_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1PWMC_PWM1_MASK ((unsigned int) 0x00000002) +#define TMR_TMR16B1PWMC_PWM1_ENABLED ((unsigned int) 0x00000002) // PWM mode is enabled for CT16Bn_MAT1 +#define TMR_TMR16B1PWMC_PWM1_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1PWMC_PWM2_MASK ((unsigned int) 0x00000004) +#define TMR_TMR16B1PWMC_PWM2_ENABLED ((unsigned int) 0x00000004) // PWM mode is enabled for CT16Bn_MAT2 +#define TMR_TMR16B1PWMC_PWM2_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR16B1PWMC_PWM3_MASK ((unsigned int) 0x00000008) +#define TMR_TMR16B1PWMC_PWM3_ENABLED ((unsigned int) 0x00000008) +#define TMR_TMR16B1PWMC_PWM3_DISABLED ((unsigned int) 0x00000000) + +/*############################################################################## +## 32-Bit Timers (CT32B0/1) +##############################################################################*/ + +#define TMR_CT32B0_BASE_ADDRESS (0x40014000) + +#define TMR_TMR32B0IR (*(pREG32 (0x40014000))) // Interrupt register +#define TMR_TMR32B0TCR (*(pREG32 (0x40014004))) // Timer control register +#define TMR_TMR32B0TC (*(pREG32 (0x40014008))) // Timer counter +#define TMR_TMR32B0PR (*(pREG32 (0x4001400C))) // Prescale register +#define TMR_TMR32B0PC (*(pREG32 (0x40014010))) // Prescale counter register +#define TMR_TMR32B0MCR (*(pREG32 (0x40014014))) // Match control register +#define TMR_TMR32B0MR0 (*(pREG32 (0x40014018))) // Match register 0 +#define TMR_TMR32B0MR1 (*(pREG32 (0x4001401C))) // Match register 1 +#define TMR_TMR32B0MR2 (*(pREG32 (0x40014020))) // Match register 2 +#define TMR_TMR32B0MR3 (*(pREG32 (0x40014024))) // Match register 3 +#define TMR_TMR32B0CCR (*(pREG32 (0x40014028))) // Capture control register +#define TMR_TMR32B0CR0 (*(pREG32 (0x4001402C))) // Capture register +#define TMR_TMR32B0EMR (*(pREG32 (0x4001403C))) // External match register +#define TMR_TMR32B0CTCR (*(pREG32 (0x40014070))) // Count control register +#define TMR_TMR32B0PWMC (*(pREG32 (0x40014074))) // PWM control register + +#define TMR_TMR32B0IR_MR0_MASK ((unsigned int) 0x00000001) // Interrupt flag for match channel 0 +#define TMR_TMR32B0IR_MR0 ((unsigned int) 0x00000001) +#define TMR_TMR32B0IR_MR1_MASK ((unsigned int) 0x00000002) // Interrupt flag for match channel 1 +#define TMR_TMR32B0IR_MR1 ((unsigned int) 0x00000002) +#define TMR_TMR32B0IR_MR2_MASK ((unsigned int) 0x00000004) // Interrupt flag for match channel 2 +#define TMR_TMR32B0IR_MR2 ((unsigned int) 0x00000004) +#define TMR_TMR32B0IR_MR3_MASK ((unsigned int) 0x00000008) // Interrupt flag for match channel 3 +#define TMR_TMR32B0IR_MR3 ((unsigned int) 0x00000008) +#define TMR_TMR32B0IR_CR0_MASK ((unsigned int) 0x00000010) // Interrupt flag for capture channel 0 event +#define TMR_TMR32B0IR_CR0 ((unsigned int) 0x00000010) +#define TMR_TMR32B0IR_MASK_ALL ((unsigned int) 0x0000001F) + +#define TMR_TMR32B0TCR_COUNTERENABLE_MASK ((unsigned int) 0x00000001) // Counter enable +#define TMR_TMR32B0TCR_COUNTERENABLE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR32B0TCR_COUNTERENABLE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0TCR_COUNTERRESET_MASK ((unsigned int) 0x00000002) +#define TMR_TMR32B0TCR_COUNTERRESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR32B0TCR_COUNTERRESET_DISABLED ((unsigned int) 0x00000002) + +#define TMR_TMR32B0MCR_MR0_INT_MASK ((unsigned int) 0x00000001) // Interrupt on MRO +#define TMR_TMR32B0MCR_MR0_INT_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR32B0MCR_MR0_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR0_RESET_MASK ((unsigned int) 0x00000002) // Reset on MR0 +#define TMR_TMR32B0MCR_MR0_RESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR32B0MCR_MR0_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR0_STOP_MASK ((unsigned int) 0x00000004) // Stop on MR0 +#define TMR_TMR32B0MCR_MR0_STOP_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR32B0MCR_MR0_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR1_INT_MASK ((unsigned int) 0x00000008) // Interrupt on MR1 +#define TMR_TMR32B0MCR_MR1_INT_ENABLED ((unsigned int) 0x00000008) +#define TMR_TMR32B0MCR_MR1_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR1_RESET_MASK ((unsigned int) 0x00000010) // Reset on MR1 +#define TMR_TMR32B0MCR_MR1_RESET_ENABLED ((unsigned int) 0x00000010) +#define TMR_TMR32B0MCR_MR1_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR1_STOP_MASK ((unsigned int) 0x00000020) // Stop on MR1 +#define TMR_TMR32B0MCR_MR1_STOP_ENABLED ((unsigned int) 0x00000020) +#define TMR_TMR32B0MCR_MR1_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR2_INT_MASK ((unsigned int) 0x00000040) // Interrupt on MR2 +#define TMR_TMR32B0MCR_MR2_INT_ENABLED ((unsigned int) 0x00000040) +#define TMR_TMR32B0MCR_MR2_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR2_RESET_MASK ((unsigned int) 0x00000080) // Reset on MR2 +#define TMR_TMR32B0MCR_MR2_RESET_ENABLED ((unsigned int) 0x00000080) +#define TMR_TMR32B0MCR_MR2_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR2_STOP_MASK ((unsigned int) 0x00000100) // Stop on MR2 +#define TMR_TMR32B0MCR_MR2_STOP_ENABLED ((unsigned int) 0x00000100) +#define TMR_TMR32B0MCR_MR2_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR3_INT_MASK ((unsigned int) 0x00000200) // Interrupt on MR3 +#define TMR_TMR32B0MCR_MR3_INT_ENABLED ((unsigned int) 0x00000200) +#define TMR_TMR32B0MCR_MR3_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR3_RESET_MASK ((unsigned int) 0x00000400) // Reset on MR3 +#define TMR_TMR32B0MCR_MR3_RESET_ENABLED ((unsigned int) 0x00000400) +#define TMR_TMR32B0MCR_MR3_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0MCR_MR3_STOP_MASK ((unsigned int) 0x00000800) // Stop on MR3 +#define TMR_TMR32B0MCR_MR3_STOP_ENABLED ((unsigned int) 0x00000800) +#define TMR_TMR32B0MCR_MR3_STOP_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR32B0CCR_CAP0RE_MASK ((unsigned int) 0x00000001) // Capture on rising edge +#define TMR_TMR32B0CCR_CAP0RE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR32B0CCR_CAP0RE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0CCR_CAP0FE_MASK ((unsigned int) 0x00000002) // Capture on falling edge +#define TMR_TMR32B0CCR_CAP0FE_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR32B0CCR_CAP0FE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0CCR_CAP0I_MASK ((unsigned int) 0x00000004) // Interrupt on CAP0 event +#define TMR_TMR32B0CCR_CAP0I_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR32B0CCR_CAP0I_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR32B0EMR_EM0_MASK ((unsigned int) 0x00000001) // External match 0 +#define TMR_TMR32B0EMR_EM0 ((unsigned int) 0x00000001) +#define TMR_TMR32B0EMR_EMC0_MASK ((unsigned int) 0x00000030) +#define TMR_TMR32B0EMR_EMC0_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B0EMR_EMC0_LOW ((unsigned int) 0x00000010) +#define TMR_TMR32B0EMR_EMC0_HIGH ((unsigned int) 0x00000020) +#define TMR_TMR32B0EMR_EMC0_TOGGLE ((unsigned int) 0x00000030) +#define TMR_TMR32B0EMR_EM1_MASK ((unsigned int) 0x00000002) // External match 1 +#define TMR_TMR32B0EMR_EM1 ((unsigned int) 0x00000002) +#define TMR_TMR32B0EMR_EMC1_MASK ((unsigned int) 0x000000C0) +#define TMR_TMR32B0EMR_EMC1_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B0EMR_EMC1_LOW ((unsigned int) 0x00000040) +#define TMR_TMR32B0EMR_EMC1_HIGH ((unsigned int) 0x00000080) +#define TMR_TMR32B0EMR_EMC1_TOGGLE ((unsigned int) 0x000000C0) +#define TMR_TMR32B0EMR_EM2_MASK ((unsigned int) 0x00000004) // External match 2 +#define TMR_TMR32B0EMR_EM2 ((unsigned int) 0x00000004) +#define TMR_TMR32B0EMR_EMC2_MASK ((unsigned int) 0x00000300) +#define TMR_TMR32B0EMR_EMC2_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B0EMR_EMC2_LOW ((unsigned int) 0x00000100) +#define TMR_TMR32B0EMR_EMC2_HIGH ((unsigned int) 0x00000200) +#define TMR_TMR32B0EMR_EMC2_TOGGLE ((unsigned int) 0x00000300) +#define TMR_TMR32B0EMR_EM3_MASK ((unsigned int) 0x00000008) // External match 3 +#define TMR_TMR32B0EMR_EM3 ((unsigned int) 0x00000008) +#define TMR_TMR32B0EMR_EMC3_MASK ((unsigned int) 0x00000C00) +#define TMR_TMR32B0EMR_EMC3_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B0EMR_EMC3_LOW ((unsigned int) 0x00000400) +#define TMR_TMR32B0EMR_EMC3_HIGH ((unsigned int) 0x00000800) +#define TMR_TMR32B0EMR_EMC3_TOGGLE ((unsigned int) 0x00000C00) + +#define TMR_TMR32B0CTCR_CTMODE_MASK ((unsigned int) 0x00000003) // Counter/Timer mode +#define TMR_TMR32B0CTCR_CTMODE_TIMER ((unsigned int) 0x00000000) // Timer Mode: Every rising PCLK edge +#define TMR_TMR32B0CTCR_CTMODE_COUNTERRISING ((unsigned int) 0x00000001) // Counter: TC increments on rising edge of input +#define TMR_TMR32B0CTCR_CTMODE_COUNTERFALLING ((unsigned int) 0x00000002) // Counter: TC increments on falling edge of input +#define TMR_TMR32B0CTCR_CTMODE_COUNTERBOTH ((unsigned int) 0x00000003) // Counter: TC increments on both edges of input +#define TMR_TMR32B0CTCR_CINPUTSELECT_MASK ((unsigned int) 0x0000000C) +#define TMR_TMR32B0CTCR_CINPUTSELECT ((unsigned int) 0x00000000) // CINPUTSELECT must be set to 00 + +#define TMR_TMR32B0PWMC_PWM0_MASK ((unsigned int) 0x00000001) +#define TMR_TMR32B0PWMC_PWM0_ENABLED ((unsigned int) 0x00000001) // PWM mode is enabled for CT32Bn_MAT0 +#define TMR_TMR32B0PWMC_PWM0_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0PWMC_PWM1_MASK ((unsigned int) 0x00000002) +#define TMR_TMR32B0PWMC_PWM1_ENABLED ((unsigned int) 0x00000002) // PWM mode is enabled for CT32Bn_MAT1 +#define TMR_TMR32B0PWMC_PWM1_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0PWMC_PWM2_MASK ((unsigned int) 0x00000004) +#define TMR_TMR32B0PWMC_PWM2_ENABLED ((unsigned int) 0x00000004) // PWM mode is enabled for CT32Bn_MAT2 +#define TMR_TMR32B0PWMC_PWM2_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B0PWMC_PWM3_MASK ((unsigned int) 0x00000008) +#define TMR_TMR32B0PWMC_PWM3_ENABLED ((unsigned int) 0x00000008) // PWM mode is enabled for CT32Bn_MAT3 +#define TMR_TMR32B0PWMC_PWM3_DISABLED ((unsigned int) 0x00000000) + +#define TMR_CT32B1_BASE_ADDRESS (0x40018000) + +#define TMR_TMR32B1IR (*(pREG32 (0x40018000))) // Interrupt register +#define TMR_TMR32B1TCR (*(pREG32 (0x40018004))) // Timer control register +#define TMR_TMR32B1TC (*(pREG32 (0x40018008))) // Timer counter +#define TMR_TMR32B1PR (*(pREG32 (0x4001800C))) // Prescale register +#define TMR_TMR32B1PC (*(pREG32 (0x40018010))) // Prescale counter register +#define TMR_TMR32B1MCR (*(pREG32 (0x40018014))) // Match control register +#define TMR_TMR32B1MR0 (*(pREG32 (0x40018018))) // Match register 0 +#define TMR_TMR32B1MR1 (*(pREG32 (0x4001801C))) // Match register 1 +#define TMR_TMR32B1MR2 (*(pREG32 (0x40018020))) // Match register 2 +#define TMR_TMR32B1MR3 (*(pREG32 (0x40018024))) // Match register 3 +#define TMR_TMR32B1CCR (*(pREG32 (0x40018028))) // Capture control register +#define TMR_TMR32B1CR0 (*(pREG32 (0x4001802C))) // Capture register +#define TMR_TMR32B1EMR (*(pREG32 (0x4001803C))) // External match register +#define TMR_TMR32B1CTCR (*(pREG32 (0x40018070))) // Count control register +#define TMR_TMR32B1PWMC (*(pREG32 (0x40018074))) // PWM control register + +#define TMR_TMR32B1IR_MR0_MASK ((unsigned int) 0x00000001) // Interrupt flag for match channel 0 +#define TMR_TMR32B1IR_MR0 ((unsigned int) 0x00000001) +#define TMR_TMR32B1IR_MR1_MASK ((unsigned int) 0x00000002) // Interrupt flag for match channel 1 +#define TMR_TMR32B1IR_MR1 ((unsigned int) 0x00000002) +#define TMR_TMR32B1IR_MR2_MASK ((unsigned int) 0x00000004) // Interrupt flag for match channel 2 +#define TMR_TMR32B1IR_MR2 ((unsigned int) 0x00000004) +#define TMR_TMR32B1IR_MR3_MASK ((unsigned int) 0x00000008) // Interrupt flag for match channel 3 +#define TMR_TMR32B1IR_MR3 ((unsigned int) 0x00000008) +#define TMR_TMR32B1IR_CR0_MASK ((unsigned int) 0x00000010) // Interrupt flag for capture channel 0 event +#define TMR_TMR32B1IR_CR0 ((unsigned int) 0x00000010) +#define TMR_TMR32B1IR_MASK_ALL ((unsigned int) 0x0000001F) + +#define TMR_TMR32B1TCR_COUNTERENABLE_MASK ((unsigned int) 0x00000001) // Counter enable +#define TMR_TMR32B1TCR_COUNTERENABLE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR32B1TCR_COUNTERENABLE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1TCR_COUNTERRESET_MASK ((unsigned int) 0x00000002) +#define TMR_TMR32B1TCR_COUNTERRESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR32B1TCR_COUNTERRESET_DISABLED ((unsigned int) 0x00000002) + +#define TMR_TMR32B1MCR_MR0_INT_MASK ((unsigned int) 0x00000001) // Interrupt on MRO +#define TMR_TMR32B1MCR_MR0_INT_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR32B1MCR_MR0_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR0_RESET_MASK ((unsigned int) 0x00000002) // Reset on MR0 +#define TMR_TMR32B1MCR_MR0_RESET_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR32B1MCR_MR0_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR0_STOP_MASK ((unsigned int) 0x00000004) // Stop on MR0 +#define TMR_TMR32B1MCR_MR0_STOP_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR32B1MCR_MR0_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR1_INT_MASK ((unsigned int) 0x00000008) // Interrupt on MR1 +#define TMR_TMR32B1MCR_MR1_INT_ENABLED ((unsigned int) 0x00000008) +#define TMR_TMR32B1MCR_MR1_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR1_RESET_MASK ((unsigned int) 0x00000010) // Reset on MR1 +#define TMR_TMR32B1MCR_MR1_RESET_ENABLED ((unsigned int) 0x00000010) +#define TMR_TMR32B1MCR_MR1_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR1_STOP_MASK ((unsigned int) 0x00000020) // Stop on MR1 +#define TMR_TMR32B1MCR_MR1_STOP_ENABLED ((unsigned int) 0x00000020) +#define TMR_TMR32B1MCR_MR1_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR2_INT_MASK ((unsigned int) 0x00000040) // Interrupt on MR2 +#define TMR_TMR32B1MCR_MR2_INT_ENABLED ((unsigned int) 0x00000040) +#define TMR_TMR32B1MCR_MR2_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR2_RESET_MASK ((unsigned int) 0x00000080) // Reset on MR2 +#define TMR_TMR32B1MCR_MR2_RESET_ENABLED ((unsigned int) 0x00000080) +#define TMR_TMR32B1MCR_MR2_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR2_STOP_MASK ((unsigned int) 0x00000100) // Stop on MR2 +#define TMR_TMR32B1MCR_MR2_STOP_ENABLED ((unsigned int) 0x00000100) +#define TMR_TMR32B1MCR_MR2_STOP_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR3_INT_MASK ((unsigned int) 0x00000200) // Interrupt on MR3 +#define TMR_TMR32B1MCR_MR3_INT_ENABLED ((unsigned int) 0x00000200) +#define TMR_TMR32B1MCR_MR3_INT_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR3_RESET_MASK ((unsigned int) 0x00000400) // Reset on MR3 +#define TMR_TMR32B1MCR_MR3_RESET_ENABLED ((unsigned int) 0x00000400) +#define TMR_TMR32B1MCR_MR3_RESET_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1MCR_MR3_STOP_MASK ((unsigned int) 0x00000800) // Stop on MR3 +#define TMR_TMR32B1MCR_MR3_STOP_ENABLED ((unsigned int) 0x00000800) +#define TMR_TMR32B1MCR_MR3_STOP_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR32B1CCR_CAP0RE_MASK ((unsigned int) 0x00000001) // Capture on rising edge +#define TMR_TMR32B1CCR_CAP0RE_ENABLED ((unsigned int) 0x00000001) +#define TMR_TMR32B1CCR_CAP0RE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1CCR_CAP0FE_MASK ((unsigned int) 0x00000002) // Capture on falling edge +#define TMR_TMR32B1CCR_CAP0FE_ENABLED ((unsigned int) 0x00000002) +#define TMR_TMR32B1CCR_CAP0FE_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1CCR_CAP0I_MASK ((unsigned int) 0x00000004) // Interrupt on CAP0 event +#define TMR_TMR32B1CCR_CAP0I_ENABLED ((unsigned int) 0x00000004) +#define TMR_TMR32B1CCR_CAP0I_DISABLED ((unsigned int) 0x00000000) + +#define TMR_TMR32B1EMR_EM0_MASK ((unsigned int) 0x00000001) // External match 0 +#define TMR_TMR32B1EMR_EM0 ((unsigned int) 0x00000001) +#define TMR_TMR32B1EMR_EMC0_MASK ((unsigned int) 0x00000030) +#define TMR_TMR32B1EMR_EMC0_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B1EMR_EMC0_LOW ((unsigned int) 0x00000010) +#define TMR_TMR32B1EMR_EMC0_HIGH ((unsigned int) 0x00000020) +#define TMR_TMR32B1EMR_EMC0_TOGGLE ((unsigned int) 0x00000030) +#define TMR_TMR32B1EMR_EM1_MASK ((unsigned int) 0x00000002) // External match 1 +#define TMR_TMR32B1EMR_EM1 ((unsigned int) 0x00000002) +#define TMR_TMR32B1EMR_EMC1_MASK ((unsigned int) 0x000000C0) +#define TMR_TMR32B1EMR_EMC1_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B1EMR_EMC1_LOW ((unsigned int) 0x00000040) +#define TMR_TMR32B1EMR_EMC1_HIGH ((unsigned int) 0x00000080) +#define TMR_TMR32B1EMR_EMC1_TOGGLE ((unsigned int) 0x000000C0) +#define TMR_TMR32B1EMR_EM2_MASK ((unsigned int) 0x00000004) // External match 2 +#define TMR_TMR32B1EMR_EM2 ((unsigned int) 0x00000004) +#define TMR_TMR32B1EMR_EMC2_MASK ((unsigned int) 0x00000300) +#define TMR_TMR32B1EMR_EMC2_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B1EMR_EMC2_LOW ((unsigned int) 0x00000100) +#define TMR_TMR32B1EMR_EMC2_HIGH ((unsigned int) 0x00000200) +#define TMR_TMR32B1EMR_EMC2_TOGGLE ((unsigned int) 0x00000300) +#define TMR_TMR32B1EMR_EM3_MASK ((unsigned int) 0x00000008) // External match 3 +#define TMR_TMR32B1EMR_EM3 ((unsigned int) 0x00000008) +#define TMR_TMR32B1EMR_EMC3_MASK ((unsigned int) 0x00000C00) +#define TMR_TMR32B1EMR_EMC3_DONOTHING ((unsigned int) 0x00000000) +#define TMR_TMR32B1EMR_EMC3_LOW ((unsigned int) 0x00000400) +#define TMR_TMR32B1EMR_EMC3_HIGH ((unsigned int) 0x00000800) +#define TMR_TMR32B1EMR_EMC3_TOGGLE ((unsigned int) 0x00000C00) + +#define TMR_TMR32B1CTCR_CTMODE_MASK ((unsigned int) 0x00000003) // Counter/Timer mode +#define TMR_TMR32B1CTCR_CTMODE_TIMER ((unsigned int) 0x00000000) // Timer Mode: Every rising PCLK edge +#define TMR_TMR32B1CTCR_CTMODE_COUNTERRISING ((unsigned int) 0x00000001) // Counter: TC increments on rising edge of input +#define TMR_TMR32B1CTCR_CTMODE_COUNTERFALLING ((unsigned int) 0x00000002) // Counter: TC increments on falling edge of input +#define TMR_TMR32B1CTCR_CTMODE_COUNTERBOTH ((unsigned int) 0x00000003) // Counter: TC increments on both edges of input +#define TMR_TMR32B1CTCR_CINPUTSELECT_MASK ((unsigned int) 0x0000000C) +#define TMR_TMR32B1CTCR_CINPUTSELECT ((unsigned int) 0x00000000) // CINPUTSELECT must be set to 00 + +#define TMR_TMR32B1PWMC_PWM0_MASK ((unsigned int) 0x00000001) +#define TMR_TMR32B1PWMC_PWM0_ENABLED ((unsigned int) 0x00000001) // PWM mode is enabled for CT32Bn_MAT0 +#define TMR_TMR32B1PWMC_PWM0_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1PWMC_PWM1_MASK ((unsigned int) 0x00000002) +#define TMR_TMR32B1PWMC_PWM1_ENABLED ((unsigned int) 0x00000002) // PWM mode is enabled for CT32Bn_MAT1 +#define TMR_TMR32B1PWMC_PWM1_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1PWMC_PWM2_MASK ((unsigned int) 0x00000004) +#define TMR_TMR32B1PWMC_PWM2_ENABLED ((unsigned int) 0x00000004) // PWM mode is enabled for CT32Bn_MAT2 +#define TMR_TMR32B1PWMC_PWM2_DISABLED ((unsigned int) 0x00000000) +#define TMR_TMR32B1PWMC_PWM3_MASK ((unsigned int) 0x00000008) +#define TMR_TMR32B1PWMC_PWM3_ENABLED ((unsigned int) 0x00000008) // PWM mode is enabled for CT32Bn_MAT3 +#define TMR_TMR32B1PWMC_PWM3_DISABLED ((unsigned int) 0x00000000) + +/*############################################################################## +## System Tick Timer +##############################################################################*/ + +#define SYSTICK_BASE_ADDRESS (0xE000E000) + +#define SYSTICK_STCTRL (*(pREG32 (0xE000E010))) // System tick control +#define SYSTICK_STRELOAD (*(pREG32 (0xE000E014))) // System timer reload +#define SYSTICK_STCURR (*(pREG32 (0xE000E018))) // System timer current +#define SYSTICK_STCALIB (*(pREG32 (0xE000E01C))) // System timer calibration + +/* STCTRL (System Timer Control and status register) + The STCTRL register contains control information for the System Tick Timer, and provides + a status flag. */ + +#define SYSTICK_STCTRL_ENABLE (0x00000001) // System tick counter enable +#define SYSTICK_STCTRL_TICKINT (0x00000002) // System tick interrupt enable +#define SYSTICK_STCTRL_CLKSOURCE (0x00000004) // NOTE: This isn't documented but is based on NXP examples +#define SYSTICK_STCTRL_COUNTFLAG (0x00010000) // System tick counter flag + +/* STRELOAD (System Timer Reload value register) + The STRELOAD register is set to the value that will be loaded into the System Tick Timer + whenever it counts down to zero. This register is loaded by software as part of timer + initialization. The STCALIB register may be read and used as the value for STRELOAD if + the CPU or external clock is running at the frequency intended for use with the STCALIB + value. */ + +#define SYSTICK_STRELOAD_MASK (0x00FFFFFF) + +/* STCURR (System Timer Current value register) + The STCURR register returns the current count from the System Tick counter when it is + read by software. */ + +#define SYSTICK_STCURR_MASK (0x00FFFFFF) + +/* STCALIB (System Timer Calibration value register) */ + +#define SYSTICK_STCALIB_TENMS_MASK (0x00FFFFFF) +#define SYSTICK_STCALIB_SKEW_MASK (0x40000000) +#define SYSTICK_STCALIB_NOREF_MASK (0x80000000) + +/*############################################################################## +## ADC +##############################################################################*/ + +#define ADC_AD0_BASE_ADDRESS (0x4001C000) + +#define ADC_AD0CR (*(pREG32 (0x4001C000))) // ADC Control Register +#define ADC_AD0GDR ((unsigned int) 0x4001C004) // ADC Global Data Register +#define ADC_AD0INTEN ((unsigned int) 0x4001C00C) // ADC Interrupt Enable Register +#define ADC_AD0DR0 ((unsigned int) 0x4001C010) // ADC Data Register 0 +#define ADC_AD0DR1 ((unsigned int) 0x4001C014) // ADC Data Register 1 +#define ADC_AD0DR2 ((unsigned int) 0x4001C018) // ADC Data Register 2 +#define ADC_AD0DR3 ((unsigned int) 0x4001C01C) // ADC Data Register 3 +#define ADC_AD0DR4 ((unsigned int) 0x4001C020) // ADC Data Register 4 +#define ADC_AD0DR5 ((unsigned int) 0x4001C024) // ADC Data Register 5 +#define ADC_AD0DR6 ((unsigned int) 0x4001C028) // ADC Data Register 6 +#define ADC_AD0DR7 ((unsigned int) 0x4001C02C) // ADC Data Register 7 +#define ADC_AD0STAT ((unsigned int) 0x4001C030) // ADC Status Register + +#define ADC_AD0CR_SEL_MASK (0x000000FF) +#define ADC_AD0CR_SEL_AD0 (0x00000001) +#define ADC_AD0CR_SEL_AD1 (0x00000002) +#define ADC_AD0CR_SEL_AD2 (0x00000004) +#define ADC_AD0CR_SEL_AD3 (0x00000008) +#define ADC_AD0CR_SEL_AD4 (0x00000010) +#define ADC_AD0CR_SEL_AD5 (0x00000020) +#define ADC_AD0CR_SEL_AD6 (0x00000040) +#define ADC_AD0CR_SEL_AD7 (0x00000080) +#define ADC_AD0CR_CLKDIV_MASK (0x0000FF00) +#define ADC_AD0CR_BURST_MASK (0x00010000) +#define ADC_AD0CR_BURST_SWMODE (0x00000000) +#define ADC_AD0CR_BURST_HWSCANMODE (0x00010000) +#define ADC_AD0CR_CLKS_MASK (0x000E0000) +#define ADC_AD0CR_CLKS_10BITS (0x00000000) +#define ADC_AD0CR_CLKS_9BITS (0x00020000) +#define ADC_AD0CR_CLKS_8BITS (0x00040000) +#define ADC_AD0CR_CLKS_7BITS (0x00060000) +#define ADC_AD0CR_CLKS_6BITS (0x00080000) +#define ADC_AD0CR_CLKS_5BITS (0x000A0000) +#define ADC_AD0CR_CLKS_4BITS (0x000C0000) +#define ADC_AD0CR_CLKS_3BITS (0x000E0000) +#define ADC_AD0CR_START_MASK (0x07000000) +#define ADC_AD0CR_START_NOSTART (0x00000000) +#define ADC_AD0CR_START_STARTNOW (0x01000000) +#define ADC_AD0CR_EDGE_MASK (0x08000000) +#define ADC_AD0CR_EDGE_FALLING (0x08000000) +#define ADC_AD0CR_EDGE_RISING (0x00000000) + +/* AD9GDR (A/D Global Data Register) + The A/D Global Data Register contains the result of the most recent A/D conversion. This + includes the data, DONE, and Overrun flags, and the number of the A/D channel to which + the data relates. */ + +#define ADC_AD0GDR_RESULT_MASK (0x0000FFC0) +#define ADC_AD0GDR_CHN_MASK (0x07000000) // Channel from which the results were converted +#define ADC_AD0GDR_OVERUN_MASK (0x40000000) +#define ADC_AD0GDR_OVERUN (0x40000000) +#define ADC_AD0GDR_DONE_MASK (0x80000000) +#define ADC_AD0GDR_DONE (0x80000000) + +/* AD0STAT (A/D Status Register) + The A/D Status register allows checking the status of all A/D channels simultaneously. + The DONE and OVERRUN flags appearing in the ADDRn register for each A/D channel + are mirrored in ADSTAT. The interrupt flag (the logical OR of all DONE flags) is also found + in ADSTAT. */ + +#define ADC_AD0STAT_DONE0_MASK (0x00000001) +#define ADC_AD0STAT_DONE0 (0x00000001) +#define ADC_AD0STAT_DONE1_MASK (0x00000002) +#define ADC_AD0STAT_DONE1 (0x00000002) +#define ADC_AD0STAT_DONE2_MASK (0x00000004) +#define ADC_AD0STAT_DONE2 (0x00000004) +#define ADC_AD0STAT_DONE3_MASK (0x00000008) +#define ADC_AD0STAT_DONE3 (0x00000008) +#define ADC_AD0STAT_DONE4_MASK (0x00000010) +#define ADC_AD0STAT_DONE4 (0x00000010) +#define ADC_AD0STAT_DONE5_MASK (0x00000020) +#define ADC_AD0STAT_DONE5 (0x00000020) +#define ADC_AD0STAT_DONE6_MASK (0x00000040) +#define ADC_AD0STAT_DONE6 (0x00000040) +#define ADC_AD0STAT_DONE7_MASK (0x00000080) +#define ADC_AD0STAT_DONE7 (0x00000080) +#define ADC_AD0STAT_OVERRUN0_MASK (0x00000100) +#define ADC_AD0STAT_OVERRUN0 (0x00000100) +#define ADC_AD0STAT_OVERRUN1_MASK (0x00000200) +#define ADC_AD0STAT_OVERRUN1 (0x00000200) +#define ADC_AD0STAT_OVERRUN2_MASK (0x00000400) +#define ADC_AD0STAT_OVERRUN2 (0x00000400) +#define ADC_AD0STAT_OVERRUN3_MASK (0x00000800) +#define ADC_AD0STAT_OVERRUN3 (0x00000800) +#define ADC_AD0STAT_OVERRUN4_MASK (0x00001000) +#define ADC_AD0STAT_OVERRUN4 (0x00001000) +#define ADC_AD0STAT_OVERRUN5_MASK (0x00002000) +#define ADC_AD0STAT_OVERRUN5 (0x00002000) +#define ADC_AD0STAT_OVERRUN6_MASK (0x00004000) +#define ADC_AD0STAT_OVERRUN6 (0x00004000) +#define ADC_AD0STAT_OVERRUN7_MASK (0x00008000) +#define ADC_AD0STAT_OVERRUN7 (0x00008000) +#define ADC_AD0STAT_ADINT_MASK (0x00010000) +#define ADC_AD0STAT_ADINT (0x00010000) + +/* ADINTEN0 (A/D Interrupt Enable Register) + This register allows control over which A/D channels generate an interrupt when a + conversion is complete. For example, it may be desirable to use some A/D channels to + monitor sensors by continuously performing conversions on them. The most recent + results are read by the application program whenever they are needed. In this case, an + interrupt is not desirable at the end of each conversion for some A/D channels. */ + +#define ADC_AD0INTEN_ADINTEN0_MASK (0x00000001) +#define ADC_AD0INTEN_ADINTEN0 (0x00000001) +#define ADC_AD0INTEN_ADINTEN1_MASK (0x00000002) +#define ADC_AD0INTEN_ADINTEN1 (0x00000002) +#define ADC_AD0INTEN_ADINTEN2_MASK (0x00000004) +#define ADC_AD0INTEN_ADINTEN2 (0x00000004) +#define ADC_AD0INTEN_ADINTEN3_MASK (0x00000008) +#define ADC_AD0INTEN_ADINTEN3 (0x00000008) +#define ADC_AD0INTEN_ADINTEN4_MASK (0x00000010) +#define ADC_AD0INTEN_ADINTEN4 (0x00000010) +#define ADC_AD0INTEN_ADINTEN5_MASK (0x00000020) +#define ADC_AD0INTEN_ADINTEN5 (0x00000020) +#define ADC_AD0INTEN_ADINTEN6_MASK (0x00000040) +#define ADC_AD0INTEN_ADINTEN6 (0x00000040) +#define ADC_AD0INTEN_ADINTEN7_MASK (0x00000080) +#define ADC_AD0INTEN_ADINTEN7 (0x00000080) +#define ADC_AD0INTEN_ADGINTEN_MASK (0x00000100) +#define ADC_AD0INTEN_ADGINTEN_ENABLE (0x00000100) +#define ADC_AD0INTEN_ADGINTEN_DISABLE (0x00000000) + +/* AD0DR0..7 (A/D Data Registers) + The A/D Data Register hold the result when an A/D conversion is complete, and also + include the flags that indicate when a conversion has been completed and when a + conversion overrun has occurred. */ + +#define ADC_DR_V_MASK (0x0000FFC0) +#define ADC_DR_OVERRUN_MASK (0x40000000) +#define ADC_DR_OVERRUN (0x40000000) +#define ADC_DR_DONE_MASK (0x80000000) +#define ADC_DR_DONE (0x80000000) + +/*############################################################################## +## WDT - Watchdog Timer +##############################################################################*/ + +#define WDT_BASE_ADDRESS (0x40004000) + +#define WDT_WDMOD (*(pREG32 (0x40004000))) // Watchdog mode register +#define WDT_WDTC (*(pREG32 (0x40004004))) // Watchdog timer constant register +#define WDT_WDFEED (*(pREG32 (0x40004008))) // Watchdog feed sequence register +#define WDT_WDTV (*(pREG32 (0x4000400C))) // Watchdog timer value register + +/* WDMOD (Watchdog Mode register) + The WDMOD register controls the operation of the Watchdog through the combination of + WDEN and RESET bits. Note that a watchdog feed must be performed before any + changes to the WDMOD register take effect. */ + +#define WDT_WDMOD_WDEN_DISABLED (0x00000000) // Watchdog enable bit +#define WDT_WDMOD_WDEN_ENABLED (0x00000001) +#define WDT_WDMOD_WDEN_MASK (0x00000001) +#define WDT_WDMOD_WDRESET_DISABLED (0x00000000) // Watchdog reset enable bit +#define WDT_WDMOD_WDRESET_ENABLED (0x00000002) +#define WDT_WDMOD_WDRESET_MASK (0x00000002) +#define WDT_WDMOD_WDTOF (0x00000004) // Watchdog time-out interrupt flag +#define WDT_WDMOD_WDTOF_MASK (0x00000004) // Set when the watchdog times out +#define WDT_WDMOD_WDINT (0x00000008) // Watchdog timer interrupt flag +#define WDT_WDMOD_WDINT_MASK (0x00000008) + +/* WDFEED (Watchdog Feed register) + Writing 0xAA followed by 0x55 to this register will reload the Watchdog timer with the + WDTC value. This operation will also start the Watchdog if it is enabled via the WDMOD + register. Setting the WDEN bit in the WDMOD register is not sufficient to enable the + Watchdog. A valid feed sequence must be completed after setting WDEN before the + Watchdog is capable of generating a reset. Until then, the Watchdog will ignore feed + errors. After writing 0xAA to WDFEED, access to any Watchdog register other than writing + 0x55 to WDFEED causes an immediate reset/interrupt when the Watchdog is enabled. + The reset will be generated during the second PCLK following an incorrect access to a + Watchdog register during a feed sequence. + Interrupts should be disabled during the feed sequence. An abort condition will occur if an + interrupt happens during the feed sequence. */ + +#define WDT_WDFEED_FEED1 (0x000000AA) +#define WDT_WDFEED_FEED2 (0x00000055) + +#endif \ No newline at end of file diff --git a/macusbfb/lpc1xxx/LPC11xx_handlers.c b/macusbfb/lpc1xxx/LPC11xx_handlers.c new file mode 100644 index 0000000..9d0d131 --- /dev/null +++ b/macusbfb/lpc1xxx/LPC11xx_handlers.c @@ -0,0 +1,170 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// The GCC compiler defines the current architecture derived from the -mcpu argument. +// When target cpu is the cortex-m0, it automatically defines __ARM_ARCH_6M__ +#ifndef __ARM_ARCH_6M__ + #error "The target ARM cpu must be Cortex-M0 compatible (-mcpu=cortex-m0)" +#endif + +// Declare a weak alias macro as described in the GCC manual[1][2] +#define WEAK_ALIAS(f) __attribute__ ((weak, alias (#f))); +#define SECTION(s) __attribute__ ((section(s))) + +/****************************************************************************** + * Forward undefined IRQ handlers to an infinite loop function. The Handlers + * are weakly aliased which means that (re)definitions will overide these. + *****************************************************************************/ + +void irq_undefined() { + // Do nothing when occured interrupt is not defined, just keep looping + while(1); +} + +void CAN_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void SSP1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void I2C_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER16_0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER16_1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER32_0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER32_1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void SSP0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void UART_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void USB_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void USB_FIQHandler(void) WEAK_ALIAS(irq_undefined); +void ADC_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void WDT_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void BOD_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void FMC_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT3_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT2_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void WAKEUP_IRQHandler(void) WEAK_ALIAS(irq_undefined); + +/***************************************************************************** + * Forward undefined fault handlers to an infinite loop function. The Handlers + * are weakly aliased which means that (re)definitions will overide these. + ****************************************************************************/ + +void fault_undefined() { + // Do nothing when occured interrupt is not defined, just keep looping + while(1); +} + +void NMI_Handler(void) WEAK_ALIAS(fault_undefined); +void HardFault_Handler(void) WEAK_ALIAS(fault_undefined); +void MemManage_Handler(void) WEAK_ALIAS(fault_undefined); +void BusFault_Handler(void) WEAK_ALIAS(fault_undefined); +void UsageFault_Handler(void) WEAK_ALIAS(fault_undefined); +void SVCall_Handler(void) WEAK_ALIAS(fault_undefined); +void DebugMon_Handler(void) WEAK_ALIAS(fault_undefined); +void PendSV_Handler(void) WEAK_ALIAS(fault_undefined); +void SysTick_Handler(void) WEAK_ALIAS(fault_undefined); + +/****************************************************************************** + * Forward undefined IRQ handlers to an infinite loop function. The Handlers + * are weakly aliased which means that (re)definitions will overide these. + *****************************************************************************/ + +// Prototype the entry values, which are handled by the linker script +extern void stack_entry; +extern void boot_entry(void); + +// Defined irq vectors using simple c code following the description in a white +// paper from ARM[3] and code example from Simonsson Fun Technologies[4]. +// These vectors are placed at the memory location defined in the linker script +const void *vectors[] SECTION(".irq_vectors") = +{ + // Stack and program reset entry point + (void*)&stack_entry, // The initial stack pointer + boot_entry, // The reset handler + + // Various fault handlers + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + MemManage_Handler, // MemManage_Handler + BusFault_Handler, // BusFault_Handler + UsageFault_Handler, // UsageFault_Handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + SVCall_Handler, // SVCall handler + DebugMon_Handler, // DebugMon_Handler + 0, // Reserved + PendSV_Handler, // The PendSV handler + SysTick_Handler, // The SysTick handler + + // Wakeup I/O pins handlers + WAKEUP_IRQHandler, // PIO0_0 Wakeup + WAKEUP_IRQHandler, // PIO0_1 Wakeup + WAKEUP_IRQHandler, // PIO0_2 Wakeup + WAKEUP_IRQHandler, // PIO0_3 Wakeup + WAKEUP_IRQHandler, // PIO0_4 Wakeup + WAKEUP_IRQHandler, // PIO0_5 Wakeup + WAKEUP_IRQHandler, // PIO0_6 Wakeup + WAKEUP_IRQHandler, // PIO0_7 Wakeup + WAKEUP_IRQHandler, // PIO0_8 Wakeup + WAKEUP_IRQHandler, // PIO0_9 Wakeup + WAKEUP_IRQHandler, // PIO0_10 Wakeup + WAKEUP_IRQHandler, // PIO0_11 Wakeup + WAKEUP_IRQHandler, // PIO1_0 Wakeup + + // Specific peripheral irq handlers + CAN_IRQHandler, // CAN + SSP1_IRQHandler, // SSP1 + I2C_IRQHandler, // I2C0 + TIMER16_0_IRQHandler, // CT16B0 (16-bit Timer 0) + TIMER16_1_IRQHandler, // CT16B1 (16-bit Timer 1) + TIMER32_0_IRQHandler, // CT32B0 (32-bit Timer 0) + TIMER32_1_IRQHandler, // CT32B1 (32-bit Timer 1) + SSP0_IRQHandler, // SSP0 + UART_IRQHandler, // UART0 + USB_IRQHandler, // USB IRQ + USB_FIQHandler, // USB FIQ + ADC_IRQHandler, // ADC (A/D Converter) + WDT_IRQHandler, // WDT (Watchdog Timer) + BOD_IRQHandler, // BOD (Brownout Detect) + FMC_IRQHandler, // Flash (IP2111 Flash Memory Controller) + PIOINT3_IRQHandler, // PIO INT3 + PIOINT2_IRQHandler, // PIO INT2 + PIOINT1_IRQHandler, // PIO INT1 + PIOINT0_IRQHandler, // PIO INT0 +}; + +/****************************************************************************** + * References + * [1] http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html + * [2] http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html + * [3] http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf + * [4] http://fun-tech.se/stm32/OlimexBlinky/mini.php + *****************************************************************************/ + diff --git a/macusbfb/lpc1xxx/LPC13xx_handlers.c b/macusbfb/lpc1xxx/LPC13xx_handlers.c new file mode 100644 index 0000000..7fe40c4 --- /dev/null +++ b/macusbfb/lpc1xxx/LPC13xx_handlers.c @@ -0,0 +1,193 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// The GCC compiler defines the current architecture derived from the -mcpu argument. +// When target cpu is the cortex-m3, it automatically defines __ARM_ARCH_7M__ +#ifndef __ARM_ARCH_7M__ + #error "The target ARM cpu must be Cortex-M3 compatible (-mcpu=cortex-m3)" +#endif + +// Declare a weak alias macro as described in the GCC manual[1][2] +#define WEAK_ALIAS(f) __attribute__ ((weak, alias (#f))); +#define SECTION(s) __attribute__ ((section(s))) + +/****************************************************************************** + * Forward undefined IRQ handlers to an infinite loop function. The Handlers + * are weakly aliased which means that (re)definitions will overide these. + *****************************************************************************/ + +void irq_undefined() { + // Do nothing when occured interrupt is not defined, just keep looping + while(1); +} + +void I2C_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER16_0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER16_1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER32_0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void TIMER32_1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void SSP_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void UART_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void USB_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void USB_FIQHandler(void) WEAK_ALIAS(irq_undefined); +void ADC_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void WDT_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void BOD_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void FMC_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT3_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT2_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT1_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void PIOINT0_IRQHandler(void) WEAK_ALIAS(irq_undefined); +void WAKEUP_IRQHandler(void) WEAK_ALIAS(irq_undefined); + +/***************************************************************************** + * Forward undefined fault handlers to an infinite loop function. The Handlers + * are weakly aliased which means that (re)definitions will overide these. + ****************************************************************************/ + +void fault_undefined() { + // Do nothing when occured interrupt is not defined, just keep looping + while(1); +} + +void NMI_Handler(void) WEAK_ALIAS(fault_undefined); +void HardFault_Handler(void) WEAK_ALIAS(fault_undefined); +void MemManage_Handler(void) WEAK_ALIAS(fault_undefined); +void BusFault_Handler(void) WEAK_ALIAS(fault_undefined); +void UsageFault_Handler(void) WEAK_ALIAS(fault_undefined); +void SVCall_Handler(void) WEAK_ALIAS(fault_undefined); +void DebugMon_Handler(void) WEAK_ALIAS(fault_undefined); +void PendSV_Handler(void) WEAK_ALIAS(fault_undefined); +void SysTick_Handler(void) WEAK_ALIAS(fault_undefined); + +/****************************************************************************** + * Forward undefined IRQ handlers to an infinite loop function. The Handlers + * are weakly aliased which means that (re)definitions will overide these. + *****************************************************************************/ + +// Prototype the entry values, which are handled by the linker script +extern void* stack_entry; +extern void boot_entry(void); + +// Defined irq vectors using simple c code following the description in a white +// paper from ARM[3] and code example from Simonsson Fun Technologies[4]. +// These vectors are placed at the memory location defined in the linker script +const void *vectors[] SECTION(".irq_vectors") = +{ + // Stack and program reset entry point + &stack_entry, // The initial stack pointer + boot_entry, // The reset handler + + // Various fault handlers + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + MemManage_Handler, // The MPU fault handler + BusFault_Handler, // The bus fault handler + UsageFault_Handler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + SVCall_Handler, // SVCall handler + DebugMon_Handler, // Debug monitor handler + 0, // Reserved + PendSV_Handler, // The PendSV handler + SysTick_Handler, // The SysTick handler + + // Wakeup I/O pins handlers + WAKEUP_IRQHandler, // PIO0_0 Wakeup + WAKEUP_IRQHandler, // PIO0_1 Wakeup + WAKEUP_IRQHandler, // PIO0_2 Wakeup + WAKEUP_IRQHandler, // PIO0_3 Wakeup + WAKEUP_IRQHandler, // PIO0_4 Wakeup + WAKEUP_IRQHandler, // PIO0_5 Wakeup + WAKEUP_IRQHandler, // PIO0_6 Wakeup + WAKEUP_IRQHandler, // PIO0_7 Wakeup + WAKEUP_IRQHandler, // PIO0_8 Wakeup + WAKEUP_IRQHandler, // PIO0_9 Wakeup + WAKEUP_IRQHandler, // PIO0_10 Wakeup + WAKEUP_IRQHandler, // PIO0_11 Wakeup + WAKEUP_IRQHandler, // PIO1_0 Wakeup + WAKEUP_IRQHandler, // PIO1_1 Wakeup + WAKEUP_IRQHandler, // PIO1_2 Wakeup + WAKEUP_IRQHandler, // PIO1_3 Wakeup + WAKEUP_IRQHandler, // PIO1_4 Wakeup + WAKEUP_IRQHandler, // PIO1_5 Wakeup + WAKEUP_IRQHandler, // PIO1_6 Wakeup + WAKEUP_IRQHandler, // PIO1_7 Wakeup + WAKEUP_IRQHandler, // PIO1_8 Wakeup + WAKEUP_IRQHandler, // PIO1_9 Wakeup + WAKEUP_IRQHandler, // PIO1_10 Wakeup + WAKEUP_IRQHandler, // PIO1_11 Wakeup + WAKEUP_IRQHandler, // PIO2_0 Wakeup + WAKEUP_IRQHandler, // PIO2_1 Wakeup + WAKEUP_IRQHandler, // PIO2_2 Wakeup + WAKEUP_IRQHandler, // PIO2_3 Wakeup + WAKEUP_IRQHandler, // PIO2_4 Wakeup + WAKEUP_IRQHandler, // PIO2_5 Wakeup + WAKEUP_IRQHandler, // PIO2_6 Wakeup + WAKEUP_IRQHandler, // PIO2_7 Wakeup + WAKEUP_IRQHandler, // PIO2_8 Wakeup + WAKEUP_IRQHandler, // PIO2_9 Wakeup + WAKEUP_IRQHandler, // PIO2_10 Wakeup + WAKEUP_IRQHandler, // PIO2_11 Wakeup + WAKEUP_IRQHandler, // PIO3_0 Wakeup + WAKEUP_IRQHandler, // PIO3_1 Wakeup + WAKEUP_IRQHandler, // PIO3_2 Wakeup + WAKEUP_IRQHandler, // PIO3_3 Wakeup + + // Specific peripheral irq handlers + I2C_IRQHandler, // I2C0 + TIMER16_0_IRQHandler, // CT16B0 (16-bit Timer 0) + TIMER16_1_IRQHandler, // CT16B1 (16-bit Timer 1) + TIMER32_0_IRQHandler, // CT32B0 (32-bit Timer 0) + TIMER32_1_IRQHandler, // CT32B1 (32-bit Timer 1) + SSP_IRQHandler, // SSP0 + UART_IRQHandler, // UART0 + USB_IRQHandler, // USB IRQ + USB_FIQHandler, // USB FIQ + ADC_IRQHandler, // ADC (A/D Converter) + WDT_IRQHandler, // WDT (Watchdog Timer) + BOD_IRQHandler, // BOD (Brownout Detect) + FMC_IRQHandler, // Flash (IP2111 Flash Memory Controller) + PIOINT3_IRQHandler, // PIO INT3 + PIOINT2_IRQHandler, // PIO INT2 + PIOINT1_IRQHandler, // PIO INT1 + PIOINT0_IRQHandler, // PIO INT0 +}; + +/****************************************************************************** + * References + * [1] http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html + * [2] http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html + * [3] http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf + * [4] http://fun-tech.se/stm32/OlimexBlinky/mini.php + *****************************************************************************/ + diff --git a/macusbfb/lpc1xxx/LPC1xxx_startup.c b/macusbfb/lpc1xxx/LPC1xxx_startup.c new file mode 100644 index 0000000..db54ec3 --- /dev/null +++ b/macusbfb/lpc1xxx/LPC1xxx_startup.c @@ -0,0 +1,65 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// These are defined and created by the linker, locating them in memory +extern unsigned char _etext; +extern unsigned char _data; +extern unsigned char _edata; +extern unsigned char _bss; +extern unsigned char _ebss; + +// Prototype the required startup functions +extern void main(void); + +// The entry point of the application, prepare segments, +// initialize the cpu and execute main() +void boot_entry(void) +{ + register unsigned char *src, *dst; + + // Get physical data address and copy it to sram + src = &_etext; + dst = &_data; + while(dst < &_edata) { + *dst++ = *src++; + } + + // Clear the bss segment + dst = &_bss; + while(dst < &_ebss) { + *dst++ = 0; + } + + // Execute the code at the program entry point + main(); + + // Do nothing when returned from main, just keep looping + while(1); +} diff --git a/macusbfb/lpc1xxx/linkscript.ld b/macusbfb/lpc1xxx/linkscript.ld new file mode 100644 index 0000000..f3e5059 --- /dev/null +++ b/macusbfb/lpc1xxx/linkscript.ld @@ -0,0 +1,77 @@ +/* + * Software License Agreement (BSD License) + * + * Copyright (c) 2010, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +sram_top = ORIGIN(sram) + LENGTH(sram); +ENTRY(boot_entry) + +SECTIONS +{ + .text : + { + KEEP(*(.irq_vectors)) + *(.text*) + *(.rodata*) + } > flash + + /* + * More information about Special Section Indexes is available in the + * free "ELF for the ARM Architecture" document from ARM Limited + * http://simplemachines.it/doc/aaelf.pdf + * + */ + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > flash + __exidx_start = .; + .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > flash + __exidx_end = .; + + _etext = .; + + .data : AT (__exidx_end) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > sram + + /* zero initialized data */ + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > sram + + end = .; + + /* For GDB compatibility we decrease the top with 16 bytes */ + stack_entry = sram_top - 16; +} diff --git a/macusbfb/main.c b/macusbfb/main.c new file mode 100644 index 0000000..c1f9a62 --- /dev/null +++ b/macusbfb/main.c @@ -0,0 +1,454 @@ +/* +Firmware for a Macintosh display adapter connected over USB +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "sysinit.h" +#include "lpc134x.h" +#include +#include "usb.h" +#include "gpio.h" + +//Mac display = 512x342 +//Pixel clock = 15.6672MHz + +//Refresh freq = 60.15 +//Scan rate: 22KHz (?) +//Vbl = 28 scan lines +//Hbl = 192 pixels +// Total: 714x370 'pixels' +//1 line = 64 bytes aan data + +//Ok, the HBL is really funky and actually a HDrive... +//More info: http://members.optusnet.com.au/eviltim/macmp3/macmp3.htm + + +/* +Timings: +Per line: 512 pixels, 202 non-visible 'pixels' +SPI FIFO buffer is 128 pixels -> 384 pixels in which we have to keep pushing the buffer, 330 in which we don't. + +*/ + + +#define NOP() __asm volatile ("NOP") + + +#define LEDPORT 2 +#define LEDBIT 6 +#define HSYNCPORT 0 +#define HSYNCBIT 10 //=CT16B0_MAT2 +#define VSYNCPORT 0 +#define VSYNCBIT 7 +#define VIDEOPORT 0 +#define VIDEOBIT 9 + +#define DRAMDPORT 1 +#define DRAMAPORT 1 +//DRAM D pins: P1_8 - P1_11 +//DRAM A pins: P1_0 - P1-7 +#define DRAMDMASK 0x0F00 +#define DRAMDSHIFT 8 +#define DRAMAMASK 0x00FF +#define DRAMASHIFT 0 +#define DRAMWPORT 3 +#define DRAMWBIT 1 +#define DRAMRASPORT 3 +#define DRAMRASBIT 0 +#define DRAMCASPORT 3 +#define DRAMCASBIT 3 +#define DRAMGPORT 2 +#define DRAMGBIT 11 + +#define GPIOFANPORT 2 +#define GPIOFANBIT 4 +#define GPIOMONPORT 2 +#define GPIOMONBIT 2 +#define GPIOEJECTPORT 2 +#define GPIOEJECTBIT 10 +#define GPIOHDLEDPORT 3 +#define GPIOHDLEDBIT 2 + +#define SENDLINE_BUFFER 1 +#define SENDLINE_FREETIME 2 + +volatile int linePos; +volatile int wordPos; +volatile int dramRow=0; +volatile int doSendLine; +char usbData[64]; +int usbDataLen; +int usbDataProcessed; + +struct GpioPins_t { + int port; + int bit; +}; + +const struct GpioPins_t gpioPins[]={ + {GPIOFANPORT, GPIOFANBIT}, //Fan enable + {GPIOMONPORT, GPIOMONBIT}, //Monitor enable + {GPIOEJECTPORT, GPIOEJECTBIT}, //Floppy eject + {GPIOHDLEDPORT, GPIOHDLEDBIT}, //HD led +}; + + +void gpioSet(int gpio, int val) { + if (gpio>=4) return; + if (val) { + GPIOSET(gpioPins[gpio].port, gpioPins[gpio].bit); + } else { + GPIOCLEAR(gpioPins[gpio].port, gpioPins[gpio].bit); + } +} + + +//Timing note: One NOP is 13ns. + +//Takes a while to set up the line, so this should be called a bit before the real data has to be sent. +void sendLine(int line) { + int dramCol; + + GPIOCLEAR(LEDPORT, LEDBIT); + + GPIOMOD(DRAMAPORT, DRAMAMASK, line<>DRAMDSHIFT); \ + GPIOSET(DRAMCASPORT, DRAMCASBIT); + + int from=0; int to=128; + if (line>=256) { + from=128; + to=256; + } + for (dramCol=from; dramCol32) state=stSync; + //Pre-calc row and col. + row=(pos>>6); + if (pos<16384) { + col=(pos&0x3f)<<1; + } else { + col=((pos&0x3f)|0x40)<<1; + } + state=stRunningFirst; + break; + case stRunning: + case stRunningFirst: + if (state==stRunningFirst || (firstlast&1)) { + GPIO_GPIO1DIR=DRAMDMASK|DRAMAMASK; + GPIOMOD(DRAMAPORT, DRAMAMASK, row<>4)<=256?128:0))<>4)&0xf; + GPIOMOD(DRAMDPORT, DRAMDMASK, i<=256?128:0))<=VIDEOLINESTART && linePos>=4; + i=inv[i&0xf]; +*/ + if ((dramRow)&1) i=0xa; else i=0x5; + GPIOMOD(DRAMDPORT, DRAMDMASK, i<0) { + int x; + int firstlast; + int credits; +#define STARTCREDS 1 + firstlast=1; + credits=STARTCREDS; + while (firstlast!=2) { + if (credits<0) firstlast|=2; + if ((usbDataProcessed+1)==usbDataLen) firstlast|=2; + credits-=processByte(usbData[usbDataProcessed++], firstlast); + if (usbDataProcessed==usbDataLen) { + firstlast=2; + usbDataLen=0; + usbDataProcessed=0; + } + firstlast&=(~1); + } + } else { + usbHandle(); + } + } +} diff --git a/macusbfb/projectconfig.h b/macusbfb/projectconfig.h new file mode 100644 index 0000000..b62ddb1 --- /dev/null +++ b/macusbfb/projectconfig.h @@ -0,0 +1,53 @@ +/**************************************************************************/ +/*! + @file projectconfig.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _PROJECTCONFIG_H_ +#define _PROJECTCONFIG_H_ + +#include "lpc134x.h" +#include "sysdefs.h" +//#include "drivers/chibi/chb_drvr.h" + +/* Core CPU Settings (reference only) */ +#define CFG_CPU_CCLK (72000000) // Ref. only. Clock speed actually set in "core/cpu/cpu.c" + +/* Systick Timer Settings */ +#define CFG_SYSTICK_DELAY_IN_MS (1) // The number of milliseconds between each tick of the systick timer + + +#endif diff --git a/macusbfb/sysdefs.h b/macusbfb/sysdefs.h new file mode 100644 index 0000000..625d24f --- /dev/null +++ b/macusbfb/sysdefs.h @@ -0,0 +1,64 @@ +/**************************************************************************/ +/*! + @file sysdefs.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include + +#ifndef _SYSDEFS_H_ +#define _SYSDEFS_H_ + +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +typedef volatile uint8_t REG8; +typedef volatile uint16_t REG16; +typedef volatile uint32_t REG32; +typedef unsigned int BOOL; + +#define pREG8 (REG8 *) +#define pREG16 (REG16 *) +#define pREG32 (REG32 *) + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#endif diff --git a/macusbfb/sysinit.c b/macusbfb/sysinit.c new file mode 100644 index 0000000..9cfb9ac --- /dev/null +++ b/macusbfb/sysinit.c @@ -0,0 +1,156 @@ +/**************************************************************************/ +/*! + @file sysinit.c + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#include +#include + +#include "sysinit.h" + +#include "core/cpu/cpu.h" +#include "core/pmu/pmu.h" + +#ifdef CFG_PRINTF_UART + #include "core/uart/uart.h" +#endif + +#ifdef CFG_INTERFACE + #include "core/cmd/cmd.h" +#endif + +#ifdef CFG_CHIBI + #include "drivers/chibi/chb.h" + static chb_rx_data_t rx_data; +#endif + +#ifdef CFG_USBHID + #include "core/usbhid-rom/usbhid.h" +#endif + +#ifdef CFG_USBCDC + #include "core/usbcdc/usb.h" + #include "core/usbcdc/usbcore.h" + #include "core/usbcdc/usbhw.h" + #include "core/usbcdc/cdcuser.h" +#endif + +#ifdef CFG_LCD + #include "drivers/lcd/lcd.h" + #include "drivers/lcd/drawing.h" + #include "drivers/lcd/fonts/consolas9.h" + #include "drivers/lcd/fonts/consolas11.h" + #include "drivers/lcd/fonts/consolas16.h" + #include "drivers/lcd/fonts/smallfonts.h" +#endif + +#ifdef CFG_I2CEEPROM + #include "drivers/eeprom/mcp24aa/mcp24aa.h" +#endif + +#ifdef CFG_SDCARD + #include "core/ssp/ssp.h" + #include "drivers/fatfs/diskio.h" + #include "drivers/fatfs/ff.h" + static FILINFO Finfo; + static FATFS Fatfs[1]; + static uint8_t buf[64]; +#endif + +/**************************************************************************/ +/*! + Configures the core system clock and sets up any mandatory + peripherals like the systick timer, UART for printf, etc. + + This function should set the HW to the default state you wish to be + in coming out of reset/startup, such as disabling or enabling LEDs, + setting specific pin states, etc. +*/ +/**************************************************************************/ +void systemInit() +{ + // Setup the cpu and core clock + cpuInit(); + + // Initialise the systick timer (delay set in projectconfig.h) +// systickInit(CFG_SYSTICK_DELAY_IN_MS); + + /* Enable AHB clock to the GPIO domain. */ + SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_GPIO); + +} + + +#if 0 +/**************************************************************************/ +/*! + @brief Sends a single byte to a pre-determined peripheral (UART, etc.). + + @param[in] byte + Byte value to send +*/ +/**************************************************************************/ +void __putchar(const char c) +{ + #ifdef CFG_PRINTF_UART + // Send output to UART + uartSendByte(c); + #endif + + #ifdef CFG_PRINTF_USBCDC + usbcdcSendByte(c); + #endif + + #if defined CFG_PRINTF_NONE + // Ignore output + #endif +} + +/**************************************************************************/ +/*! + @brief Sends a string to a pre-determined end point (UART, etc.). + + @param[in] str + Text to send +*/ +/**************************************************************************/ +int puts(const char * str) +{ + while(*str) __putchar(*str++); + return 0; +} + +#endif \ No newline at end of file diff --git a/macusbfb/sysinit.h b/macusbfb/sysinit.h new file mode 100644 index 0000000..f7beabd --- /dev/null +++ b/macusbfb/sysinit.h @@ -0,0 +1,50 @@ +/**************************************************************************/ +/*! + @file sysinit.h + @author K. Townsend (microBuilder.eu) + @date 22 March 2010 + @version 0.10 + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2010, microBuilder SARL + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef __SYSINIT_H__ +#define __SYSINIT_H__ + +#include "projectconfig.h" + +#include "core/gpio/gpio.h" +#include "core/systick/systick.h" + +// Function prototypes +void systemInit(); + +#endif \ No newline at end of file diff --git a/macusbfb/usb.c b/macusbfb/usb.c new file mode 100644 index 0000000..753f968 --- /dev/null +++ b/macusbfb/usb.c @@ -0,0 +1,319 @@ +/* +Firmware for a Macintosh display adapter connected over USB +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +//Implement a simple USB interface thingy which can receive bulk packets. +//No interrupts are used because of timing issues in the main code. + +#include "lpc134x.h" +#include + +#define NOP() __asm volatile ("NOP") +#define PACKED __attribute__((__packed__)) + +//Comment out to get debugging stuff on the monitor. +#define printf(bla, ...) {} + +extern void gpioSet(int gpio, int val); + +typedef struct { + unsigned char bmRequestType; + unsigned char bRequest; + unsigned short wValue; + unsigned short wIndex; + unsigned short wLength; +} PACKED setupPacketTp; + +//Descriptor ref: +//http://www.usbmadesimple.co.uk/ums_4.htm + +char myDevDescriptor[]={ + 18, //length (18?) + 1, //descriptor type + 0x02,0x00, //usb ver + 0xff, //class + 0, //subclass + 0, //protocol + 64, //max packet size + 0x34,0x12, //vendor id + 0xAA,0x55, //product id + 0x00,0x01, //device release + 0x00, //manuf str index + 0x00, //prod str index + 0x00, //serial str index + 0x01 //no of possible configs +}; + +char myConfDescriptor[]={ + //main config descriptor + 9, //length of this descr + 02, //type (config descr) + 32,0, //total length + 01, //no of interfaces + 01, //select config no 1 to use this + 00, //string descr of this config + 0x80, //attributes + 100, //max current drawn in 2ma steps + //iface1 condfig descriptor + 9, //len + 4, //type (iface descr) + 0, //iface number this descr describes + 0, //alternate setting for this iface + 2, //number of endpoints + 0xff, //iface class + 0, //Iface subclass + 0, //Iface protocol + 0, //String descr of this iface + //Endpoint descriptor + 7, //len + 5, //type (endpoint descr) + 0x3, //address. IN iface = +0x80 + 0x2, //attributes + 32,0, //max packet size + 10, //Interval to poll for data, in ms + //Endpoint descriptor + 7, //len + 5, //type (endpoint descr) + 0x83, //address. IN iface = +0x80 + 0x2, //attributes + 32,0, //max packet size + 10, //Interval to poll for data, in ms +}; + +static int myAddr=0; + +static void dumpHex(unsigned char *buf, int len) { + int x; + if (len==0) return; + for (x=0; x0) dumpHex((unsigned char* )data, len); +} + +int readFromEp(int ep, unsigned int *data, int maxlen) { + int x, dummy; + USB_CTRL=((ep&0xF)<<2)|(1<<0); + NOP(); NOP(); NOP(); + int plen; + do { + plen=USB_RXPLEN; + } while ((plen&0x400)==0); + plen&=0x3ff; + + if (plen!=maxlen) printf("Ep %x: recv %i bufflen=%i!\n", ep, plen, maxlen); + for (x=0; x<(plen); x+=4) { + if (xmaxlen?maxlen:plen; +} + +inline short swap16(unsigned short word) { + return ((word&0xff)<<8)|(word>>8); +} + +static inline void handleSetupPacket(setupPacketTp *p) { +//A printf("Setup packet, type=%i, req=%i, val=%i, idx=%i\n", p->bmRequestType, p->bRequest, p->wValue, p->wIndex); +// dumpHex((unsigned char* )p, 8); + if (p->bmRequestType==0x80 && p->bRequest==6) { + //Get descriptor. + int index=swap16(p->wIndex); + int len=p->wLength; + if (swap16(p->wValue)==1) { + //Dev descriptor. Write to ep. + writeToEp(0, (unsigned int *)myDevDescriptor, myDevDescriptor[0]); + printf("Dev desc written.\n"); + } else if (swap16(p->wValue)==2) { + int resplen=myConfDescriptor[2]+(myConfDescriptor[3]<<8); + if (resplen>len) resplen=len; + writeToEp(0, (unsigned int *)myConfDescriptor, len); + printf("Conf desc written.\n"); + } else { + printf("EEK! Unhandled descriptor request!\n"); + } + } else if (p->bmRequestType==00 && p->bRequest==5) { + //Set address + //First send Ack with our old addresss 0 + writeToEp(0, NULL, 0); + //Then set new address. + myAddr=(p->wValue&0x7F); + + wrCmd(0xD0); + wrData(myAddr|0x80); + wrCmd(0xD0); + wrData(myAddr|0x80); + printf("Set addr to %i.\n",myAddr); + } else if (p->bmRequestType==00 && p->bRequest==9) { + //Set configuration. + //Just allow, there's only one of them anyway. + writeToEp(0, NULL, 0); + //Ok, other stuff can come in now. + wrCmd(0xD8); + wrData(1); + printf("Enabled other endpoints!\n"); + } else if (p->bmRequestType==0x40 && p->bRequest==1) { //vendor specific, gpio control, host->dev + //Modify output wIndex to wValue + gpioSet(p->wIndex, p->wValue); + } else { + printf("EEK! Unhandled setup packet!\n"); + } +} + +extern char usbData[64]; +extern int usbDataLen; + + +void usbHandle() { + //Handle all the USB stuff by looking at any interrupts that would have been triggered. + int ints=USB_DEVINTST; + USB_DEVINTCLR=ints; +// if ((ints&0x1fe)!=0) printf("Int status %x\n", ints); + if (ints&(1<<7)) { + int epstatus=rdCmd(0x46); + printf("Ep3 int, status=%x\n", epstatus); + usbDataLen=readFromEp(3, usbData, 64); + return; + } + if (ints&(1<<8)) { + int epstatus=rdCmd(0x47); + printf("Ep3.1 int, status=%x\n", epstatus); + } + + if (ints&(1<<1)) { + //Endpoint0 int + int epstatus=rdCmd(0x40); +// printf("Ep0 int, status=%x\n", epstatus); + if (epstatus&(1<<2)) { + //Setup-packet. + unsigned char setupPacket[8]; + readFromEp(0, (unsigned int *)setupPacket, 8); + handleSetupPacket((setupPacketTp*) setupPacket); + } + } + if (ints&(1<<9)) { + //Device status change + int status=rdCmd(0xfe); +// printf("Dev status is now %x\n",status); + if (!(status&1)) { + //Reconnect, damn you! +/* + wrCmd(0xFE); + wrData(0x1); + myAddr=0; +*/ + } + } +} diff --git a/macusbfb/usb.h b/macusbfb/usb.h new file mode 100644 index 0000000..a2a35c3 --- /dev/null +++ b/macusbfb/usb.h @@ -0,0 +1,3 @@ +void usbInit(); +void usbHandle(); +void usbConnect(); diff --git a/macusbfb/usbgpio.c b/macusbfb/usbgpio.c new file mode 100644 index 0000000..2ff6bd2 --- /dev/null +++ b/macusbfb/usbgpio.c @@ -0,0 +1,48 @@ +/* +Firmware for a Macintosh display adapter connected over USB +Copyright (C) 2010 Jeroen Domburg + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "gpio.h" +#include "usbgpio.h" + +//Handler for the USB-exposed GPIO pins + +struct GpioPins_t { + int port; + int bit; +}; + +const struct GpioPins_t gpioPins[]={ + {0, 11}, //Fan enable, can be pwmmed too + {2, 2}, //Monitor enable + {2, 10}, //Floppy eject + {3, 2}, //HD led +} + + +void gpioSet(int gpio, int val) { + if (gpio>4) return; + if (val) { + GPIOSET(gpioPins[gpio].port, gpioPins[gpio].bit); + } else { + GPIOCLEAR(gpioPins[gpio].port, gpioPins[gpio].bit); + } +} + +int gpioGet(int gpio) { + //Not implemented (yet) +} + diff --git a/macusbfb/usbgpio.h b/macusbfb/usbgpio.h new file mode 100644 index 0000000..eb4ecf3 --- /dev/null +++ b/macusbfb/usbgpio.h @@ -0,0 +1,2 @@ +void gpioSet(int gpio, int val); +int gpioGet(int gpio);