From 8b8bc41cac34759602dc7668df9edb038839b238 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Wed, 17 Aug 2016 15:02:23 -0500 Subject: Squashed 'import-layers/meta-raspberrypi/' content from commit 2745399 Change-Id: I8a89d81813dea98209d089ef500a403ea4da5d9d git-subtree-dir: import-layers/meta-raspberrypi git-subtree-split: 2745399f75d7564fcc586d0365ff73be47849d0e Signed-off-by: Patrick Williams --- import-layers/meta-raspberrypi/.gitignore | 5 + import-layers/meta-raspberrypi/COPYING.MIT | 17 + import-layers/meta-raspberrypi/README | 349 +++ .../classes/linux-raspberrypi-base.bbclass | 39 + .../classes/sdcard_image-rpi.bbclass | 185 ++ import-layers/meta-raspberrypi/conf/layer.conf | 14 + .../conf/machine/include/rpi-base.inc | 53 + .../conf/machine/include/rpi-default-providers.inc | 9 + .../conf/machine/include/rpi-default-settings.inc | 3 + .../conf/machine/include/rpi-default-versions.inc | 3 + .../conf/machine/include/tune-arm1176jzf-s.inc | 15 + .../meta-raspberrypi/conf/machine/raspberrypi.conf | 12 + .../conf/machine/raspberrypi0.conf | 8 + .../conf/machine/raspberrypi2.conf | 12 + .../conf/machine/raspberrypi3.conf | 11 + .../files/custom-licenses/Broadcom | 25 + .../recipes-bsp/bootfiles/bcm2835-bootfiles.bb | 39 + .../recipes-bsp/bootfiles/rpi-config_git.bb | 110 + .../recipes-bsp/common/firmware.inc | 8 + .../formfactor/formfactor/raspberrypi/machconfig | 6 + .../recipes-bsp/formfactor/formfactor_0.0.bbappend | 1 + .../0001-bcm43xx-Add-bcm43xx-3wire-variant.patch | 26 + ...-UART-speed-must-be-reset-after-the-firmw.patch | 37 + ...003-Increase-firmware-load-timeout-to-30s.patch | 25 + ...-Move-the-43xx-firmware-into-lib-firmware.patch | 25 + .../bluez5/bluez5/BCM43430A1.hcd | Bin 0 -> 35976 bytes .../bluez5/bluez5/brcm43438.service | 12 + .../recipes-connectivity/bluez5/bluez5_%.bbappend | 26 + .../recipes-core/images/rpi-basic-image.bb | 6 + .../recipes-core/images/rpi-hwup-image.bb | 7 + .../recipes-core/images/rpi-test-image.bb | 4 + .../packagegroups/packagegroup-rpi-test.bb | 27 + .../psplash/files/psplash-raspberrypi-img.h | 3210 ++++++++++++++++++++ .../recipes-core/psplash/psplash_git.bbappend | 2 + .../recipes-devtools/bcm2835/bcm2835_1.46.bb | 40 + .../files/remove-initscript-lsb-dependency.patch | 77 + .../recipes-devtools/pi-blaster/pi-blaster.inc | 21 + .../recipes-devtools/pi-blaster/pi-blaster_git.bb | 3 + ...0001-include-asm-ioctl.h-for-ioctl-define.patch | 33 + .../recipes-devtools/python/python-rtimu_git.bb | 15 + .../python/python-sense-hat_2.1.0.bb | 28 + .../rpi-gpio/0001-Remove-nested-functions.patch | 294 ++ .../recipes-devtools/python/rpi-gpio_0.6.1.bb | 21 + ...-types.h-explicitly-for-getting-caddr_t-d.patch | 30 + .../recipes-devtools/python/rpio_0.10.0.bb | 20 + .../0001-Add-initial-cross-compile-support.patch | 410 +++ ...de-asm-ioctl.h-directly-for-_IOC_SIZEBITS.patch | 58 + .../recipes-devtools/wiringPi/wiringpi_git.bb | 34 + .../recipes-graphics/eglinfo/eglinfo-fb_%.bbappend | 1 + .../eglinfo/eglinfo-x11_%.bbappend | 2 + ...-applications-to-set-next-resource-handle.patch | 208 ++ ...ayland-Add-support-for-the-Wayland-winsys.patch | 1880 ++++++++++++ .../0003-wayland-Add-Wayland-example.patch | 866 ++++++ ...-wayland-egl-Add-bcm_host-to-dependencies.patch | 28 + ...emove-faulty-assert-to-make-weston-happy-.patch | 29 + ...6-zero-out-wl-buffers-in-egl_surface_free.patch | 33 + ...007-initialize-front-back-wayland-buffers.patch | 34 + .../userland/userland/0008-Remove-RPC_FLUSH.patch | 27 + .../userland/0009-fix-cmake-dependency-race.patch | 78 + .../0010-Fix-enum-conversion-warnings.patch | 99 + ...Fix-for-framerate-with-nested-composition.patch | 60 + .../0012-build-shared-library-for-vchostif.patch | 28 + ...nt-buffer-wrapping-interface-for-dispmanx.patch | 92 + .../recipes-graphics/userland/userland_git.bb | 73 + .../recipes-graphics/vc-graphics/files/egl.pc | 10 + .../recipes-graphics/vc-graphics/files/vchiq.sh | 24 + .../vc-graphics/vc-graphics-hardfp.bb | 6 + .../recipes-graphics/vc-graphics/vc-graphics.bb | 6 + .../recipes-graphics/vc-graphics/vc-graphics.inc | 56 + .../recipes-graphics/wayland/weston_%.bbappend | 4 + .../recipes-graphics/weston/weston_%.bbappend | 7 + .../xorg-xserver/xserver-xf86-config/rpi/xorg.conf | 6 + .../rpi/xorg.conf.d/10-evdev.conf | 40 + .../rpi/xorg.conf.d/98-pitft.conf | 5 + .../rpi/xorg.conf.d/99-calibration.conf | 6 + .../xorg-xserver/xserver-xf86-config_0.1.bbappend | 19 + .../linux-firmware/LICENSE.broadcom_brcm80211 | 205 ++ .../linux-firmware/brcmfmac43430-sdio.bin | Bin 0 -> 368957 bytes .../linux-firmware/brcmfmac43430-sdio.txt | 66 + .../linux-firmware/linux-firmware_git.bbappend | 33 + .../0001-dts-add-overlay-for-pitft22.patch | 110 + .../0001-dts-add-overlay-for-pitft22.patch | 110 + ...ove-unused-sm_cache_map_vector-definition.patch | 31 + .../linux-raspberrypi-4.1/0003-fix-gcc6.patch | 78 + .../recipes-kernel/linux/linux-raspberrypi.inc | 69 + .../linux/linux-raspberrypi/defconfig | 1 + .../recipes-kernel/linux/linux-raspberrypi_3.18.bb | 14 + .../recipes-kernel/linux/linux-raspberrypi_4.1.bb | 12 + .../recipes-kernel/linux/linux-raspberrypi_4.4.bb | 8 + .../recipes-kernel/linux/linux-rpi.inc | 138 + ...o-acquire-buffer-when-src-pad-isn-t-activ.patch | 48 + .../0001-config-files-path.patch | 137 + .../0002-fix-decoder-flushing.patch | 16 + .../0003-no-timeout-on-get-state.patch | 16 + ...erly-handle-drain-requests-while-flushing.patch | 69 + ...-gst_omx_video_dec_set_format-if-there-s-.patch | 30 + ...-unref-allocator-after-getting-it-from-al.patch | 48 + ...mxvideodec-Use-gstglmemoryegl-for-the-RPi.patch | 115 + .../gstreamer1.0-omx/0001-config-files-path.patch | 137 + ...o-acquire-buffer-when-src-pad-isn-t-activ.patch | 47 + .../0003-fix-decoder-flushing.patch | 15 + .../0003-no-timeout-on-get-state.patch | 16 + ...erly-handle-drain-requests-while-flushing.patch | 69 + ...-gst_omx_video_dec_set_format-if-there-s-.patch | 30 + .../gstreamer/gstreamer1.0-omx_1.2.0.bbappend | 24 + .../gstreamer/gstreamer1.0-omx_git.bbappend | 22 + .../gstreamer/gstreamer1.0-plugins-bad_%.bbappend | 2 + ...Makefile.include-which-includes-hardcoded.patch | 77 + ...nd-headers-from-ffmpeg-are-installed-in-u.patch | 53 + .../0003-Remove-strip-step-in-Makefile.patch | 39 + ...PEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch | 31 + .../omxplayer/fix-tar-command-with-DIST.patch | 21 + .../omxplayer/use-native-pkg-config.patch | 19 + .../recipes-multimedia/omxplayer/omxplayer_git.bb | 71 + .../lib/image/canned-wks/sdimage-raspberrypi.wks | 6 + 115 files changed, 11175 insertions(+) create mode 100644 import-layers/meta-raspberrypi/.gitignore create mode 100644 import-layers/meta-raspberrypi/COPYING.MIT create mode 100644 import-layers/meta-raspberrypi/README create mode 100644 import-layers/meta-raspberrypi/classes/linux-raspberrypi-base.bbclass create mode 100644 import-layers/meta-raspberrypi/classes/sdcard_image-rpi.bbclass create mode 100644 import-layers/meta-raspberrypi/conf/layer.conf create mode 100644 import-layers/meta-raspberrypi/conf/machine/include/rpi-base.inc create mode 100644 import-layers/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc create mode 100644 import-layers/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc create mode 100644 import-layers/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc create mode 100644 import-layers/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc create mode 100644 import-layers/meta-raspberrypi/conf/machine/raspberrypi.conf create mode 100644 import-layers/meta-raspberrypi/conf/machine/raspberrypi0.conf create mode 100644 import-layers/meta-raspberrypi/conf/machine/raspberrypi2.conf create mode 100644 import-layers/meta-raspberrypi/conf/machine/raspberrypi3.conf create mode 100644 import-layers/meta-raspberrypi/files/custom-licenses/Broadcom create mode 100644 import-layers/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb create mode 100644 import-layers/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb create mode 100644 import-layers/meta-raspberrypi/recipes-bsp/common/firmware.inc create mode 100644 import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor/raspberrypi/machconfig create mode 100644 import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor_0.0.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/BCM43430A1.hcd create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/brcm43438.service create mode 100644 import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb create mode 100644 import-layers/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb create mode 100644 import-layers/meta-raspberrypi/recipes-core/images/rpi-test-image.bb create mode 100644 import-layers/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb create mode 100644 import-layers/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h create mode 100644 import-layers/meta-raspberrypi/recipes-core/psplash/psplash_git.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.46.bb create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster.inc create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu_git.bb create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/python-sense-hat_2.1.0.bb create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/rpi-gpio_0.6.1.bb create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/rpio/0001-include-sys-types.h-explicitly-for-getting-caddr_t-d.patch create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/wiringPi/files/0001-Add-initial-cross-compile-support.patch create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi/0001-include-asm-ioctl.h-directly-for-_IOC_SIZEBITS.patch create mode 100644 import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi_git.bb create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-fb_%.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-x11_%.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0001-Allow-applications-to-set-next-resource-handle.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0003-wayland-Add-Wayland-example.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0004-wayland-egl-Add-bcm_host-to-dependencies.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0006-zero-out-wl-buffers-in-egl_surface_free.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0007-initialize-front-back-wayland-buffers.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0008-Remove-RPC_FLUSH.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0009-fix-cmake-dependency-race.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0010-Fix-enum-conversion-warnings.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0011-Fix-for-framerate-with-nested-composition.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0012-build-shared-library-for-vchostif.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0013-implement-buffer-wrapping-interface-for-dispmanx.patch create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/userland/userland_git.bb create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/weston/weston_%.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/10-evdev.conf create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf create mode 100644 import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/LICENSE.broadcom_brcm80211 create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.bin create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.txt create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware_git.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-3.18/0001-dts-add-overlay-for-pitft22.patch create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0001-dts-add-overlay-for-pitft22.patch create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0002-vmcs-Remove-unused-sm_cache_map_vector-definition.patch create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0003-fix-gcc6.patch create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/defconfig create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_3.18.bb create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.1.bb create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.4.bb create mode 100644 import-layers/meta-raspberrypi/recipes-kernel/linux/linux-rpi.inc create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-config-files-path.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0002-fix-decoder-flushing.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0003-no-timeout-on-get-state.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0004-Properly-handle-drain-requests-while-flushing.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0006-omxvideodec-unref-allocator-after-getting-it-from-al.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0007-omxvideodec-Use-gstglmemoryegl-for-the-RPi.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-config-files-path.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0002-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-fix-decoder-flushing.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.2.0.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch create mode 100644 import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb create mode 100644 import-layers/meta-raspberrypi/scripts/lib/image/canned-wks/sdimage-raspberrypi.wks (limited to 'import-layers') diff --git a/import-layers/meta-raspberrypi/.gitignore b/import-layers/meta-raspberrypi/.gitignore new file mode 100644 index 000000000..bd5616a90 --- /dev/null +++ b/import-layers/meta-raspberrypi/.gitignore @@ -0,0 +1,5 @@ +build* +*~ +.*.swp +*.orig +*.rej diff --git a/import-layers/meta-raspberrypi/COPYING.MIT b/import-layers/meta-raspberrypi/COPYING.MIT new file mode 100644 index 000000000..fb950dc69 --- /dev/null +++ b/import-layers/meta-raspberrypi/COPYING.MIT @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/import-layers/meta-raspberrypi/README b/import-layers/meta-raspberrypi/README new file mode 100644 index 000000000..c39f9edeb --- /dev/null +++ b/import-layers/meta-raspberrypi/README @@ -0,0 +1,349 @@ +Quick links +=========== +Git repository web frontend: + http://git.yoctoproject.org/cgit/cgit.cgi/meta-raspberrypi/ +Mailing list (yocto mailing list): + yocto@yoctoproject.org +Issues management (redmine): + http://redmine.gherzan.ro/projects/meta-raspberrypi + + +Contents: +========= +1. Description +2. Yocto BSP Layer - Raspberry Pi + 2.A. How to use it + 2.B. Images +3. Optional build configuration + 3.A. Compressed deployed files + 3.B. GPU memory + 3.C. Add purchased license codecs + 3.D. Disable overscan + 3.E. Set overclocking options + 3.F. Video camera support with V4L2 drivers + 3.G. Enable offline compositing support + 3.H. Enable kgdb over console support + 3.I. Boot to U-Boot + 3.J. Image with Initramfs + 3.K. Device tree support + 3.L. Enable SPI bus + 3.M. Enable I2C + 3.N. Enable PiTFT support + 3.O. Enable UART support +4. Extra apps + 4.A. omxplayer +5. Board Configuration + 5.A. Audio Routing +6. Source code and mirrors +7. Contribution + 7.A. Mailing List + 7.B. Redmine +8. Maintainers + + +1. Description +============== + +This is the general hardware specific BSP overlay for the RaspberryPi device. + +More information can be found at: + http://www.raspberrypi.org/ (Official Site) + +The core BSP part of meta-raspberrypi should work with different +OpenEmbedded/Yocto distributions and layer stacks, such as: +* Distro-less (only with OE-Core). +* Angstrom. +* Yocto/Poky (main focus of testing). + +2. Yocto BSP Layer - RaspberryPi +================================ + +This layer depends on: + +URI: git://git.yoctoproject.org/poky +branch: master +revision: HEAD + +URI: git://git.openembedded.org/meta-openembedded +layers: meta-oe, meta-multimedia +branch: master +revision: HEAD + +2.A. How to use it +================== +a. source poky/oe-init-build-env rpi-build +b. Add needed layer to bblayers.conf: + - meta-raspberrypi +c. Set MACHINE in local.conf to one of the supported boards: + - raspberrypi + - raspberrypi0 + - raspberrypi2 + - raspberrypi3 +d. bitbake rpi-hwup-image +e. dd to a SD card the generated sdimg file (use xzcat if rpi-sdimg.xz is used) +f. Boot your RPI. + +2.B. Images +-=========== +* rpi-hwup-image + Hardware up image +* rpi-basic-image + Based on rpi-hwup-image with some added features (ex: splash) +* rpi-test-image + Image based on rpi-basic-image which includes most of the packages in this + layer and some media samples. + +3. Optional build configuration +=============================== + +There are a set of ways in which a user can influence different paramenters of the build. +We list here the ones that are closely related to this BSP or specific to it. For the rest +please check: http://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html + +3.A. Compressed deployed files +============================== +1. Overwrite IMAGE_FSTYPES in local.conf + IMAGE_FSTYPES = "tar.bz2 ext3.xz" +2. Overwrite SDIMG_ROOTFS_TYPE in local.conf + SDIMG_ROOTFS_TYPE = "ext3.xz" +3. Overwrite SDIMG_COMPRESSION in local.conf + SDIMG_COMPRESSION = "xz" +*Accommodate the values above to your own needs (ex: ext3 / ext4). + +3.B. GPU memory +=============== +Variable : Details +GPU_MEM : GPU memory in megabyte. Sets the memory split between the ARM and + GPU. ARM gets the remaining memory. Min 16. Default 64. +GPU_MEM_256 : GPU memory in megabyte for the 256MB Raspberry Pi. Ignored by the + 512MB RP. Overrides gpu_mem. Max 192. Default not set. +GPU_MEM_512 : GPU memory in megabyte for the 512MB Raspberry Pi. Ignored by the + 256MB RP. Overrides gpu_mem. Max 448. Default not set. +GPU_MEM_1024: GPU memory in megabyte for the 1024MB Raspberry Pi. Ignored by the + 256MB/512MB RP. Overrides gpu_mem. Max 944. Default not set. + +3.C. Add purchased license codecs +================================= +To add you own licenses use variables KEY_DECODE_MPG2 and KEY_DECODE_WVC1 in +local.conf. Example: +KEY_DECODE_MPG2 = "12345678" +KEY_DECODE_WVC1 = "12345678" +You can supply more licenses separated by comma. Example: +KEY_DECODE_WVC1 = "0x12345678,0xabcdabcd,0x87654321" + +3.D. Disable overscan +===================== +By default the GPU adds a black border around the video output to compensate for +TVs which cut off part of the image. To disable this set this variable in +local.conf: +DISABLE_OVERSCAN = "1" + +3.E. Set overclocking options +============================= +The Raspberry PI can be overclocked. As of now overclocking up to the "Turbo +Mode" is officially supported by the raspbery and does not void warranty. +Check the config.txt for a detailed description of options and modes. Example: +# Turbo mode +ARM_FREQ = "1000" +CORE_FREQ = "500" +SDRAM_FREQ = "500" +OVER_VOLTAGE = "6" + +3.F. Video camera support with V4L2 drivers +=========================================== +Set this variable to enable support for the video camera (Linux 3.12.4+ required) +VIDEO_CAMERA = "1" + +3.G. Enable offline compositing support +======================================= +Set this variable to enable support for dispmanx offline compositing +DISMANX_OFFLINE = "1" + +This will enable the firmware to fall back to off-line compositing of +Dispmanx elements. Normally the compositing is done on-line, during scanout, +but cannot handle too many elements. With off-line enabled, an off-screen +buffer is allocated for compositing. When scene complexity (number and sizes +of elements) is high, compositing will happen off-line into the buffer. + +Heavily recommended for Wayland/Weston. + +See: http://wayland.freedesktop.org/raspberrypi.html + +3.H. Enable kgdb over console support +===================================== +To add the kdbg over console (kgdboc) parameter to the kernel command line, +set this variable in local.conf: +ENABLE_KGDB = "1" + +3.I. Boot to U-Boot +=================== +To have u-boot load kernel image, set in your local.conf +KERNEL_IMAGETYPE = "uImage" + +This will make kernel.img be u-boot image which will load uImage. +By default, kernel.img is the actual kernel image (ex. Image). + +3.J. Image with Initramfs +========================= +To build an initramfs image : + * Set this 3 kernel variables (in linux-raspberrypi.inc for example) + - kernel_configure_variable BLK_DEV_INITRD y + - kernel_configure_variable INITRAMFS_SOURCE "" + - kernel_configure_variable RD_GZIP y + * Set the yocto variables (in linux-raspberrypi.inc for example) + - INITRAMFS_IMAGE = "" + - INITRAMFS_IMAGE_BUNDLE = "1" + * Set the meta-rasberrypi variable (in raspberrypi.conf for example) + - KERNEL_INITRAMFS = "-initramfs" + +3.K. Device tree support +========================= +Device tree for RPi is only supported when using linux-raspberrypi 3.18+ +kernels. + + * Set KERNEL_DEVICETREE (in conf/machine/raspberrypi.conf) + - the trailer is added to the kernel image before kernel install task. + While creating the SDCard image, this modified kernel is put on + boot partition (as kernel.img) as well as DeviceTree blobs (.dtb files). + +NOTE: KERNEL_DEVICETREE is default enabled for kernel >= 3.18 and always disabled for + older kernel versions. + +3.L. Enable SPI bus +==================== +When using device tree kernels, set this variable to enable the SPI bus +ENABLE_SPI_BUS = "1" + +3.M. Enable I2C +=============== +When using device tree kernels, set this variable to enable I2C +ENABLE_I2C = "1" + +3.N. Enable PiTFT support +========================= +Basic support for using PiTFT screens can be enabled by adding +below in local.conf: + +MACHINE_FEATURES += "pitft" + - This will enable SPI bus and i2c device-trees, it will also setup + framebuffer for console and x server on PiTFT. + +NOTE: To get this working the overlay for the PiTFT model must be build, + added and specified as well (dtoverlay= in config.txt) + +Below is a list of currently supported PiTFT models in meta-raspberrypi, +the modelname should be added as a MACHINE_FEATURES in local.conf like below: + - MACHINE_FEATURES += "pitft " + +List of currently supported models: + - pitft22 + - pitft28r + +3.O. Enable UART +=============== + +RaspberryPi 1, 2 and CM will have UART console enabled by default. + +RaspberryPi 3 does not have the UART enabled by default because this needs a +fixed core frequency and enable_uart wil set it to the minimum. Certain +operations - 60fps h264 decode, high quality deinterlace - which aren't +performed on the ARM may be affected, and we wouldn't want to do that to users +who don't want to use the serial port. Users who want serial console support on +RaspberryPi3 will have to explicitely set in local.conf: ENABLE_UART = "1". + +Ref.: https://github.com/raspberrypi/firmware/issues/553 + https://github.com/RPi-Distro/repo/issues/22 + +4. Extra apps +============= + +4.A. omxplayer +============== +omxplayer depends on libav which has a commercial license. So in order to be +able to compile omxplayer you will need to whiteflag the commercial license +adding to you local.conf: +LICENSE_FLAGS_WHITELIST = "commercial" + +5. Board Configuration +====================== + +5.A. Audio Routing +================== +To load audio driver + + modprobe snd-bcm2835 + +To test audio playback + + e.g. aplay test.wav + +Note that without HDMI connected this emits audio from the 3.5in jack connector +as expected. However With an HDMI display connected there is no audio output from +the jack connector. + +To force the audio routing via the 3.5in jack connector use + + amixer cset numid=3 1 + +Options to amixer cset are: + + 0=auto + 1=headphones + 2=hdmi + +6. Source code and mirrors +========================== + +Main repo: + git://git.yoctoproject.org/meta-raspberrypi + http://git.yoctoproject.org/git/meta-raspberrypi + +Github mirror: + https://github.com/agherzan/meta-raspberrypi + +Bitbucket mirror: + https://bitbucket.org/agherzan/meta-raspberrypi + + +7. Contributing +=============== + +7.A. Mailing list +================= +The main communication tool we use is a mailing list: + yocto@yoctoproject.org + https://lists.yoctoproject.org/listinfo/yocto + +Feel free to ask any kind of questions but always prepend your email subject +with "[meta-raspberrypi]". This is because we use the 'yocto' mailing list and +not a perticular 'meta-raspberrypi' mailing list. + +To contribute to this layer you should send the patches for review to the +above specified mailing list. +The patches should be compliant with the openembedded patch guidelines: +http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines + + +When creating patches, please use something like: + + git format-patch -s --subject-prefix='meta-raspberrypi][PATCH' origin + +When sending patches to mailing list, please use something like: + + git send-email --to yocto@yoctoproject.org + +7.B. Github issues +================== +In order to manage and trace the meta-raspberrypi issues, we use github issues: + https://github.com/agherzan/meta-raspberrypi/issues + +If you push patches which have a github issue associated, please provide the +issue number in the commit log just before "Signed-off-by" line(s). Example line +for a bug: + [Issue #13] + + +8. Maintainers +============== + + Andrei Gherzan diff --git a/import-layers/meta-raspberrypi/classes/linux-raspberrypi-base.bbclass b/import-layers/meta-raspberrypi/classes/linux-raspberrypi-base.bbclass new file mode 100644 index 000000000..40beef1d8 --- /dev/null +++ b/import-layers/meta-raspberrypi/classes/linux-raspberrypi-base.bbclass @@ -0,0 +1,39 @@ +inherit linux-kernel-base + + +def get_dts(d, ver): + staging_dir = d.getVar("STAGING_KERNEL_BUILDDIR", True) + dts = d.getVar("KERNEL_DEVICETREE", True) + + # d.getVar() might return 'None' as a normal string + # leading to 'is None' check isn't enough. + # TODO: Investigate if this is a bug in bitbake + if ver is None or ver == "None": + ''' if 'ver' isn't set try to grab the kernel version + from the kernel staging ''' + ver = get_kernelversion_file(staging_dir) + + if ver is not None: + min_ver = ver.split('.', 3) + else: + return dts + + # Always turn off device tree support for kernel's < 3.18 + try: + if int(min_ver[0]) <= 3: + if int(min_ver[1]) < 18: + dts = "" + except IndexError: + min_ver = None + + return dts + + +def split_overlays(d, out): + dts = get_dts(d, None) + if out: + overlays = oe.utils.str_filter_out('\S+\-overlay\.dtb$', dts, d) + else: + overlays = oe.utils.str_filter('\S+\-overlay\.dtb$', dts, d) + + return overlays diff --git a/import-layers/meta-raspberrypi/classes/sdcard_image-rpi.bbclass b/import-layers/meta-raspberrypi/classes/sdcard_image-rpi.bbclass new file mode 100644 index 000000000..57cefea08 --- /dev/null +++ b/import-layers/meta-raspberrypi/classes/sdcard_image-rpi.bbclass @@ -0,0 +1,185 @@ +inherit image_types +inherit linux-raspberrypi-base + +# +# Create an image that can by written onto a SD card using dd. +# +# The disk layout used is: +# +# 0 -> IMAGE_ROOTFS_ALIGNMENT - reserved for other data +# IMAGE_ROOTFS_ALIGNMENT -> BOOT_SPACE - bootloader and kernel +# BOOT_SPACE -> SDIMG_SIZE - rootfs +# + +# Default Free space = 1.3x +# Use IMAGE_OVERHEAD_FACTOR to add more space +# <---------> +# 4MiB 40MiB SDIMG_ROOTFS +# <-----------------------> <----------> <----------------------> +# ------------------------ ------------ ------------------------ +# | IMAGE_ROOTFS_ALIGNMENT | BOOT_SPACE | ROOTFS_SIZE | +# ------------------------ ------------ ------------------------ +# ^ ^ ^ ^ +# | | | | +# 0 4MiB 4MiB + 40MiB 4MiB + 40Mib + SDIMG_ROOTFS + +# This image depends on the rootfs image +IMAGE_TYPEDEP_rpi-sdimg = "${SDIMG_ROOTFS_TYPE}" + +# Set kernel and boot loader +IMAGE_BOOTLOADER ?= "bcm2835-bootfiles" + +# Set initramfs extension +KERNEL_INITRAMFS ?= "" + +# Kernel image name +SDIMG_KERNELIMAGE_raspberrypi ?= "kernel.img" +SDIMG_KERNELIMAGE_raspberrypi2 ?= "kernel7.img" + +# Boot partition volume id +BOOTDD_VOLUME_ID ?= "${MACHINE}" + +# Boot partition size [in KiB] (will be rounded up to IMAGE_ROOTFS_ALIGNMENT) +BOOT_SPACE ?= "40960" + +# Set alignment to 4MB [in KiB] +IMAGE_ROOTFS_ALIGNMENT = "4096" + +# Use an uncompressed ext3 by default as rootfs +SDIMG_ROOTFS_TYPE ?= "ext3" +SDIMG_ROOTFS = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.${SDIMG_ROOTFS_TYPE}" + +IMAGE_DEPENDS_rpi-sdimg = " \ + parted-native \ + mtools-native \ + dosfstools-native \ + virtual/kernel:do_deploy \ + ${IMAGE_BOOTLOADER} \ + ${@bb.utils.contains('KERNEL_IMAGETYPE', 'uImage', 'u-boot', '',d)} \ + " + +# SD card image name +SDIMG = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.rpi-sdimg" + +# Compression method to apply to SDIMG after it has been created. Supported +# compression formats are "gzip", "bzip2" or "xz". The original .rpi-sdimg file +# is kept and a new compressed file is created if one of these compression +# formats is chosen. If SDIMG_COMPRESSION is set to any other value it is +# silently ignored. +#SDIMG_COMPRESSION ?= "" + +# Additional files and/or directories to be copied into the vfat partition from the IMAGE_ROOTFS. +FATPAYLOAD ?= "" + +IMAGEDATESTAMP = "${@time.strftime('%Y.%m.%d',time.gmtime())}" +IMAGE_CMD_rpi-sdimg[vardepsexclude] += "IMAGEDATESTAMP" +IMAGE_CMD_rpi-sdimg[vardepsexclude] += "DATETIME" + +IMAGE_CMD_rpi-sdimg () { + + # Align partitions + BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1) + BOOT_SPACE_ALIGNED=$(expr ${BOOT_SPACE_ALIGNED} - ${BOOT_SPACE_ALIGNED} % ${IMAGE_ROOTFS_ALIGNMENT}) + SDIMG_SIZE=$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE) + + echo "Creating filesystem with Boot partition ${BOOT_SPACE_ALIGNED} KiB and RootFS $ROOTFS_SIZE KiB" + + # Check if we are building with device tree support + DTS="${@get_dts(d, None)}" + + # Initialize sdcard image file + dd if=/dev/zero of=${SDIMG} bs=1024 count=0 seek=${SDIMG_SIZE} + + # Create partition table + parted -s ${SDIMG} mklabel msdos + # Create boot partition and mark it as bootable + parted -s ${SDIMG} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) + parted -s ${SDIMG} set 1 boot on + # Create rootfs partition to the end of disk + parted -s ${SDIMG} -- unit KiB mkpart primary ext2 $(expr ${BOOT_SPACE_ALIGNED} \+ ${IMAGE_ROOTFS_ALIGNMENT}) -1s + parted ${SDIMG} print + + # Create a vfat image with boot files + BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDIMG} unit b print | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 512 /2 }') + rm -f ${WORKDIR}/boot.img + mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/bcm2835-bootfiles/* ::/ + if test -n "${DTS}"; then + # Device Tree Overlays are assumed to be suffixed by '-overlay.dtb' string and will be put in a dedicated folder + DT_OVERLAYS="${@split_overlays(d, 0)}" + DT_ROOT="${@split_overlays(d, 1)}" + + # Copy board device trees to root folder + for DTB in ${DT_ROOT}; do + DTB_BASE_NAME=`basename ${DTB} .dtb` + + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTB_BASE_NAME}.dtb ::${DTB_BASE_NAME}.dtb + done + + # Copy device tree overlays to dedicated folder + mmd -i ${WORKDIR}/boot.img overlays + for DTB in ${DT_OVERLAYS}; do + DTB_BASE_NAME=`basename ${DTB} .dtb` + + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTB_BASE_NAME}.dtb ::overlays/${DTB_BASE_NAME}.dtb + done + fi + case "${KERNEL_IMAGETYPE}" in + "uImage") + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/u-boot.bin ::${SDIMG_KERNELIMAGE} + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}${KERNEL_INITRAMFS}-${MACHINE}.bin ::uImage + ;; + *) + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}${KERNEL_INITRAMFS}-${MACHINE}.bin ::${SDIMG_KERNELIMAGE} + ;; + esac + + if [ -n ${FATPAYLOAD} ] ; then + echo "Copying payload into VFAT" + for entry in ${FATPAYLOAD} ; do + # add the || true to stop aborting on vfat issues like not supporting .~lock files + mcopy -i ${WORKDIR}/boot.img -s -v ${IMAGE_ROOTFS}$entry :: || true + done + fi + + # Add stamp file + echo "${IMAGE_NAME}-${IMAGEDATESTAMP}" > ${WORKDIR}/image-version-info + mcopy -i ${WORKDIR}/boot.img -v ${WORKDIR}//image-version-info :: + + # Burn Partitions + dd if=${WORKDIR}/boot.img of=${SDIMG} conv=notrunc seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync + # If SDIMG_ROOTFS_TYPE is a .xz file use xzcat + if echo "${SDIMG_ROOTFS_TYPE}" | egrep -q "*\.xz" + then + xzcat ${SDIMG_ROOTFS} | dd of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync + else + dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync + fi + + # Optionally apply compression + case "${SDIMG_COMPRESSION}" in + "gzip") + gzip -k9 "${SDIMG}" + ;; + "bzip2") + bzip2 -k9 "${SDIMG}" + ;; + "xz") + xz -k "${SDIMG}" + ;; + esac +} + +ROOTFS_POSTPROCESS_COMMAND += " rpi_generate_sysctl_config ; " + +rpi_generate_sysctl_config() { + # systemd sysctl config + test -d ${IMAGE_ROOTFS}${sysconfdir}/sysctl.d && \ + echo "vm.min_free_kbytes = 8192" > ${IMAGE_ROOTFS}${sysconfdir}/sysctl.d/rpi-vm.conf + + # sysv sysctl config + IMAGE_SYSCTL_CONF="${IMAGE_ROOTFS}${sysconfdir}/sysctl.conf" + test -e ${IMAGE_ROOTFS}${sysconfdir}/sysctl.conf && \ + sed -e "/vm.min_free_kbytes/d" -i ${IMAGE_SYSCTL_CONF} + echo "" >> ${IMAGE_SYSCTL_CONF} && echo "vm.min_free_kbytes = 8192" >> ${IMAGE_SYSCTL_CONF} +} diff --git a/import-layers/meta-raspberrypi/conf/layer.conf b/import-layers/meta-raspberrypi/conf/layer.conf new file mode 100644 index 000000000..bea5a6556 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/layer.conf @@ -0,0 +1,14 @@ +# We have a conf and classes directory, append to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have a recipes directory containing .bb and .bbappend files, add to BBFILES +BBFILES += "${LAYERDIR}/recipes*/*/*.bb \ + ${LAYERDIR}/recipes*/*/*.bbappend" + +BBFILE_COLLECTIONS += "raspberrypi" +BBFILE_PATTERN_raspberrypi := "^${LAYERDIR}/" +BBFILE_PRIORITY_raspberrypi = "9" + +# Additional license directories. +LICENSE_PATH += "${LAYERDIR}/files/custom-licenses" + diff --git a/import-layers/meta-raspberrypi/conf/machine/include/rpi-base.inc b/import-layers/meta-raspberrypi/conf/machine/include/rpi-base.inc new file mode 100644 index 000000000..56ca83e1e --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/include/rpi-base.inc @@ -0,0 +1,53 @@ +include conf/machine/include/rpi-default-settings.inc +include conf/machine/include/rpi-default-versions.inc +include conf/machine/include/rpi-default-providers.inc + +SOC_FAMILY = "rpi" +include conf/machine/include/soc-family.inc + +IMAGE_FSTYPES ?= "tar.bz2 ext3 rpi-sdimg" + +XSERVER = " \ + xserver-xorg \ + xf86-input-evdev \ + xf86-input-mouse \ + xf86-input-keyboard \ + xf86-video-fbdev \ + " + +# Really supported starting from linux-raspberrypi 3.18.y only +KERNEL_DEVICETREE ?= " \ + bcm2708-rpi-b.dtb \ + bcm2708-rpi-b-plus.dtb \ + bcm2709-rpi-2-b.dtb \ + bcm2710-rpi-3-b.dtb \ + \ + overlays/hifiberry-amp-overlay.dtb \ + overlays/hifiberry-dac-overlay.dtb \ + overlays/hifiberry-dacplus-overlay.dtb \ + overlays/hifiberry-digi-overlay.dtb \ + overlays/i2c-rtc-overlay.dtb \ + overlays/iqaudio-dac-overlay.dtb \ + overlays/iqaudio-dacplus-overlay.dtb \ + overlays/lirc-rpi-overlay.dtb \ + overlays/pitft22-overlay.dtb \ + overlays/pitft28-resistive-overlay.dtb \ + overlays/pps-gpio-overlay.dtb \ + overlays/rpi-ft5406-overlay.dtb \ + overlays/w1-gpio-overlay.dtb \ + overlays/w1-gpio-pullup-overlay.dtb \ + overlays/pi3-miniuart-bt-overlay.dtb \ + " +KERNEL_IMAGETYPE ?= "Image" + +MACHINE_FEATURES += "apm usbhost keyboard vfat ext2 screen touchscreen alsa bluetooth wifi sdio" + +# Raspberry Pi has no hardware clock +MACHINE_FEATURES_BACKFILL_CONSIDERED = "rtc" + +MACHINE_EXTRA_RRECOMMENDS += " kernel-modules" + +# Set Raspberrypi splash image +SPLASH = "psplash-raspberrypi" + +IMAGE_BOOT_FILES ?= "bcm2835-bootfiles/* ${KERNEL_IMAGETYPE};${SDIMG_KERNELIMAGE}" diff --git a/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc b/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc new file mode 100644 index 000000000..359870d83 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-providers.inc @@ -0,0 +1,9 @@ +# RaspberryPi BSP default providers + +PREFERRED_PROVIDER_virtual/kernel ?= "linux-raspberrypi" +PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg" +PREFERRED_PROVIDER_virtual/egl ?= "userland" +PREFERRED_PROVIDER_virtual/libgles2 ?= "userland" +PREFERRED_PROVIDER_virtual/libgl ?= "mesa-gl" +PREFERRED_PROVIDER_virtual/mesa ?= "mesa-gl" +PREFERRED_PROVIDER_jpeg ?= "jpeg" diff --git a/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc b/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc new file mode 100644 index 000000000..716a8bbb7 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-settings.inc @@ -0,0 +1,3 @@ +# RaspberryPi BSP default settings + +IMAGE_CLASSES += "sdcard_image-rpi" diff --git a/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc b/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc new file mode 100644 index 000000000..c879ddea9 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/include/rpi-default-versions.inc @@ -0,0 +1,3 @@ +# RaspberryPi BSP default versions + +PREFERRED_VERSION_linux-raspberrypi ?= "4.1.%" diff --git a/import-layers/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc b/import-layers/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc new file mode 100644 index 000000000..b6fcc59cc --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/include/tune-arm1176jzf-s.inc @@ -0,0 +1,15 @@ +DEFAULTTUNE ?= "armv6" + +require conf/machine/include/arm/arch-armv6.inc + +TUNEVALID[arm1176jzfs] = "Enable arm1176jzfs specific processor optimizations" +TUNE_CCARGS += "${@bb.utils.contains("TUNE_FEATURES", "arm1176jzfs", "-mtune=arm1176jzf-s", "", d)}" +TUNE_CCARGS += "${@bb.utils.contains("TUNE_FEATURES", "vfp", "-mfpu=vfp", "", d)}" + +AVAILTUNES += "arm1176jzfs arm1176jzfshf" +ARMPKGARCH_tune-arm1176jzfs = "arm1176jzfs" +ARMPKGARCH_tune-arm1176jzfshf = "arm1176jzfs" +TUNE_FEATURES_tune-arm1176jzfs = "${TUNE_FEATURES_tune-armv6} arm1176jzfs" +TUNE_FEATURES_tune-arm1176jzfshf = "${TUNE_FEATURES_tune-arm1176jzfs} callconvention-hard" +PACKAGE_EXTRA_ARCHS_tune-arm1176jzfs = "${PACKAGE_EXTRA_ARCHS_tune-armv6}" +PACKAGE_EXTRA_ARCHS_tune-arm1176jzfshf = "${PACKAGE_EXTRA_ARCHS_tune-armv6hf} arm1176jzfshf-vfp" diff --git a/import-layers/meta-raspberrypi/conf/machine/raspberrypi.conf b/import-layers/meta-raspberrypi/conf/machine/raspberrypi.conf new file mode 100644 index 000000000..72beeb881 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/raspberrypi.conf @@ -0,0 +1,12 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi http://www.raspberrypi.org/ Board + +DEFAULTTUNE ?= "arm1176jzfshf" + +require conf/machine/include/tune-arm1176jzf-s.inc +include conf/machine/include/rpi-base.inc + +SERIAL_CONSOLE = "115200 ttyAMA0" + +UBOOT_MACHINE = "rpi_config" diff --git a/import-layers/meta-raspberrypi/conf/machine/raspberrypi0.conf b/import-layers/meta-raspberrypi/conf/machine/raspberrypi0.conf new file mode 100644 index 000000000..ccf9ae7b9 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/raspberrypi0.conf @@ -0,0 +1,8 @@ +#@TYPE: Machine +#@NAME: RaspberryPi Zero Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi Zero board (https://www.raspberrypi.org/blog/raspberry-pi-zero) + +MACHINEOVERRIDES = "raspberrypi:${MACHINE}" +include conf/machine/raspberrypi.conf + +SERIAL_CONSOLE = "115200 ttyAMA0" diff --git a/import-layers/meta-raspberrypi/conf/machine/raspberrypi2.conf b/import-layers/meta-raspberrypi/conf/machine/raspberrypi2.conf new file mode 100644 index 000000000..d50ef700d --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/raspberrypi2.conf @@ -0,0 +1,12 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 2 Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi 2 + +DEFAULTTUNE ?= "cortexa7thf-neon-vfpv4" + +require conf/machine/include/tune-cortexa7.inc +include conf/machine/include/rpi-base.inc + +SERIAL_CONSOLE = "115200 ttyAMA0" + +UBOOT_MACHINE = "rpi_2_config" diff --git a/import-layers/meta-raspberrypi/conf/machine/raspberrypi3.conf b/import-layers/meta-raspberrypi/conf/machine/raspberrypi3.conf new file mode 100644 index 000000000..cb6056eb8 --- /dev/null +++ b/import-layers/meta-raspberrypi/conf/machine/raspberrypi3.conf @@ -0,0 +1,11 @@ +#@TYPE: Machine +#@NAME: RaspberryPi 3 Development Board +#@DESCRIPTION: Machine configuration for the RaspberryPi 3 + +MACHINEOVERRIDES = "raspberrypi2:${MACHINE}" + +MACHINE_EXTRA_RRECOMMENDS += "linux-firmware-brcm43430" + +include conf/machine/raspberrypi2.conf + +SERIAL_CONSOLE = "115200 ttyS0" diff --git a/import-layers/meta-raspberrypi/files/custom-licenses/Broadcom b/import-layers/meta-raspberrypi/files/custom-licenses/Broadcom new file mode 100644 index 000000000..258268161 --- /dev/null +++ b/import-layers/meta-raspberrypi/files/custom-licenses/Broadcom @@ -0,0 +1,25 @@ +Copyright (c) 2012, Broadcom Europe Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + diff --git a/import-layers/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb b/import-layers/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb new file mode 100644 index 000000000..b279e1551 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb @@ -0,0 +1,39 @@ +DESCRIPTION = "Closed source binary files to help boot the ARM on the BCM2835." +LICENSE = "Proprietary" + +LIC_FILES_CHKSUM = "file://LICENCE.broadcom;md5=4a4d169737c0786fb9482bb6d30401d1" + +inherit deploy + +include recipes-bsp/common/firmware.inc + +RDEPENDS_${PN} = "rpi-config" + +COMPATIBLE_MACHINE = "raspberrypi" + +S = "${RPIFW_S}/boot" + +PR = "r3" + +do_deploy() { + install -d ${DEPLOYDIR}/${PN} + + for i in ${S}/*.elf ; do + cp $i ${DEPLOYDIR}/${PN} + done + for i in ${S}/*.dat ; do + cp $i ${DEPLOYDIR}/${PN} + done + for i in ${S}/*.bin ; do + cp $i ${DEPLOYDIR}/${PN} + done + + # Add stamp in deploy directory + touch ${DEPLOYDIR}/${PN}/${PN}-${PV}.stamp +} + +addtask deploy before do_package after do_install +do_deploy[dirs] += "${DEPLOYDIR}/${PN}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + diff --git a/import-layers/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb b/import-layers/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb new file mode 100644 index 000000000..4bc8eb73d --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb @@ -0,0 +1,110 @@ +DESCRIPTION = "Commented config.txt file for the Raspberry Pi. \ + The Raspberry Pi config.txt file is read by the GPU before \ + the ARM core is initialised. It can be used to set various \ + system configuration parameters." +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +COMPATIBLE_MACHINE = "raspberrypi" + +SRCREV = "648ffc470824c43eb0d16c485f4c24816b32cd6f" +SRC_URI = "git://github.com/Evilpaul/RPi-config.git;protocol=git;branch=master \ + " + +S = "${WORKDIR}/git" + +PR = "r4" + +PITFT="${@bb.utils.contains("MACHINE_FEATURES", "pitft", "1", "0", d)}" +PITFT22="${@bb.utils.contains("MACHINE_FEATURES", "pitft22", "1", "0", d)}" +PITFT28r="${@bb.utils.contains("MACHINE_FEATURES", "pitft28r", "1", "0", d)}" + +inherit deploy + +do_deploy() { + install -d ${DEPLOYDIR}/bcm2835-bootfiles + + cp ${S}/config.txt ${DEPLOYDIR}/bcm2835-bootfiles/ + + if [ -n "${KEY_DECODE_MPG2}" ]; then + sed -i '/#decode_MPG2/ c\decode_MPG2=${KEY_DECODE_MPG2}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${KEY_DECODE_WVC1}" ]; then + sed -i '/#decode_WVC1/ c\decode_WVC1=${KEY_DECODE_WVC1}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${DISABLE_OVERSCAN}" ]; then + sed -i '/#disable_overscan/ c\disable_overscan=${DISABLE_OVERSCAN}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${ARM_FREQ}" ]; then + sed -i '/#arm_freq/ c\arm_freq=${ARM_FREQ}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${CORE_FREQ}" ]; then + sed -i '/#core_freq/ c\core_freq=${CORE_FREQ}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${SDRAM_FREQ}" ]; then + sed -i '/#sdram_freq/ c\sdram_freq=${SDRAM_FREQ}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${OVER_VOLTAGE}" ]; then + sed -i '/#over_voltage/ c\over_voltage=${OVER_VOLTAGE}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + # GPU memory + if [ -n "${GPU_MEM}" ]; then + sed -i '/#gpu_mem=/ c\gpu_mem=${GPU_MEM}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${GPU_MEM_256}" ]; then + sed -i '/#gpu_mem_256/ c\gpu_mem_256=${GPU_MEM_256}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${GPU_MEM_512}" ]; then + sed -i '/#gpu_mem_512/ c\gpu_mem_512=${GPU_MEM_512}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + if [ -n "${GPU_MEM_1024}" ]; then + sed -i '/#gpu_mem_1024/ c\gpu_mem_1024=${GPU_MEM_1024}' ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + # Video camera support + if [ -n "${VIDEO_CAMERA}" ]; then + echo "# Enable video camera" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "start_x=1" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + # Offline compositing support + if [ -n "${DISPMANX_OFFLINE}" ]; then + echo "# Enable offline compositing" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dispmanx_offline=1" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + # SPI bus support + if [ -n "${ENABLE_SPI_BUS}" ] || [ "${PITFT}" = "1" ]; then + echo "# Enable SPI bus" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dtparam=spi=on" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + if [ -n "${ENABLE_I2C}" ] || [ "${PITFT}" = "1" ]; then + echo "# Enable I2C" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dtparam=i2c1=on" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dtparam=i2c_arm=on" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + # PiTFT22 display support + if [ "${PITFT22}" = "1" ]; then + echo "# Enable PITFT22 display" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dtoverlay=pitft22,rotate=270,speed=32000000,txbuflen=32768" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + if [ "${PITFT28r}" = "1" ]; then + echo "# Enable PITFT28r display" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dtoverlay=pitft28-resistive,rotate=90,speed=32000000,txbuflen=32768" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi + + # UART support + if [ "${ENABLE_UART}" = "1" ]; then + echo "# Enable UART" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "enable_uart=1" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt + fi +} + +addtask deploy before do_package after do_install +do_deploy[dirs] += "${DEPLOYDIR}/bcm2835-bootfiles" + +PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/import-layers/meta-raspberrypi/recipes-bsp/common/firmware.inc b/import-layers/meta-raspberrypi/recipes-bsp/common/firmware.inc new file mode 100644 index 000000000..9df61565c --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-bsp/common/firmware.inc @@ -0,0 +1,8 @@ +RPIFW_SRCREV ?= "390f53ed0fd79df274bdcc81d99e09fa262f03ab" +RPIFW_DATE ?= "20160622" +RPIFW_SRC_URI ?= "git://github.com/raspberrypi/firmware.git;protocol=git;branch=master" +RPIFW_S ?= "${WORKDIR}/git" + +SRC_URI = "${RPIFW_SRC_URI}" +SRCREV = "${RPIFW_SRCREV}" +PV = "${RPIFW_DATE}" diff --git a/import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor/raspberrypi/machconfig b/import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor/raspberrypi/machconfig new file mode 100644 index 000000000..bef4ce3c9 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor/raspberrypi/machconfig @@ -0,0 +1,6 @@ +HAVE_TOUCHSCREEN=0 +HAVE_KEYBOARD=1 + +DISPLAY_CAN_ROTATE=0 +DISPLAY_ORIENTATION=0 +DISPLAY_DPI=133 diff --git a/import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor_0.0.bbappend b/import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor_0.0.bbappend new file mode 100644 index 000000000..72d991c7e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-bsp/formfactor/formfactor_0.0.bbappend @@ -0,0 +1 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch new file mode 100644 index 000000000..3bc02c49e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0001-bcm43xx-Add-bcm43xx-3wire-variant.patch @@ -0,0 +1,26 @@ +From b4f2b77472aeb967d3a7595e8a965785c7a37c87 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Feb 2016 16:40:46 +0000 +Subject: [PATCH 1/4] bcm43xx: Add bcm43xx-3wire variant + +--- + tools/hciattach.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 59a76a7..5861d33 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1144,6 +1144,9 @@ struct uart_t uart[] = { + { "bcm43xx", 0x0000, 0x0000, HCI_UART_H4, 115200, 3000000, + FLOW_CTL, DISABLE_PM, NULL, bcm43xx, NULL }, + ++ { "bcm43xx-3wire", 0x0000, 0x0000, HCI_UART_3WIRE, 115200, 3000000, ++ 0, DISABLE_PM, NULL, bcm43xx, NULL }, ++ + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + +-- +1.9.1 + diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch new file mode 100644 index 000000000..5a0a434a3 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch @@ -0,0 +1,37 @@ +From e145c9621f976063e5c573db1f2053d906f63427 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Feb 2016 16:39:09 +0000 +Subject: [PATCH 2/4] bcm43xx: The UART speed must be reset after the firmware download + +--- + tools/hciattach_bcm43xx.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c +index 81f38cb..0b792e0 100644 +--- a/tools/hciattach_bcm43xx.c ++++ b/tools/hciattach_bcm43xx.c +@@ -366,11 +366,8 @@ int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, + return -1; + + if (bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { +- fprintf(stderr, "Patch not found, continue anyway\n"); ++ fprintf(stderr, "Patch not found for %s, continue anyway\n", chip_name); + } else { +- if (bcm43xx_set_speed(fd, ti, speed)) +- return -1; +- + if (bcm43xx_load_firmware(fd, fw_path)) + return -1; + +@@ -380,6 +377,7 @@ int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, + return -1; + } + ++ sleep(1); + if (bcm43xx_reset(fd)) + return -1; + } +-- +1.9.1 + diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch new file mode 100644 index 000000000..f9f09ebb0 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0003-Increase-firmware-load-timeout-to-30s.patch @@ -0,0 +1,25 @@ +From d41dc2046dd08d8c95197f677e224506f5b39bdd Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 20 Jan 2016 16:00:37 +0000 +Subject: [PATCH 3/4] Increase firmware load timeout to 30s + +--- + tools/hciattach.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 5861d33..4141796 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1293,7 +1293,7 @@ int main(int argc, char *argv[]) + { + struct uart_t *u = NULL; + int detach, printpid, raw, opt, i, n, ld, err; +- int to = 10; ++ int to = 30; + int init_speed = 0; + int send_break = 0; + pid_t pid; +-- +1.9.1 + diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch new file mode 100644 index 000000000..dadce354e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/0004-Move-the-43xx-firmware-into-lib-firmware.patch @@ -0,0 +1,25 @@ +From 76681284b0ea49852041fdb97a35175089a08781 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 23 Feb 2016 17:52:29 +0000 +Subject: [PATCH 4/4] Move the 43xx firmware into /lib/firmware + +--- + tools/hciattach_bcm43xx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/hciattach_bcm43xx.c b/tools/hciattach_bcm43xx.c +index 0b792e0..207f668 100644 +--- a/tools/hciattach_bcm43xx.c ++++ b/tools/hciattach_bcm43xx.c +@@ -43,7 +43,7 @@ + #include "hciattach.h" + + #ifndef FIRMWARE_DIR +-#define FIRMWARE_DIR "/etc/firmware" ++#define FIRMWARE_DIR "/lib/firmware" + #endif + + #define FW_EXT ".hcd" +-- +1.9.1 + diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/BCM43430A1.hcd b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/BCM43430A1.hcd new file mode 100644 index 000000000..162275ac0 Binary files /dev/null and b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/BCM43430A1.hcd differ diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/brcm43438.service b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/brcm43438.service new file mode 100644 index 000000000..d57125c57 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5/brcm43438.service @@ -0,0 +1,12 @@ +[Unit] +Description=Broadcom BCM43438 bluetooth HCI +ConditionPathIsDirectory=/proc/device-tree/soc/gpio@7e200000/bt_pins +Before=bluetooth.service +After=dev-ttyAMA0.device + +[Service] +Type=simple +ExecStart=/usr/bin/hciattach -n /dev/ttyAMA0 bcm43xx 921600 noflow - + +[Install] +WantedBy=multi-user.target diff --git a/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend new file mode 100644 index 000000000..89798a4db --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-connectivity/bluez5/bluez5_%.bbappend @@ -0,0 +1,26 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI_append_raspberrypi3 = " \ + file://BCM43430A1.hcd \ + file://0001-bcm43xx-Add-bcm43xx-3wire-variant.patch \ + file://0002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch \ + file://0003-Increase-firmware-load-timeout-to-30s.patch \ + file://0004-Move-the-43xx-firmware-into-lib-firmware.patch \ + file://brcm43438.service \ + " + +do_install_append_raspberrypi3() { + install -d ${D}/lib/firmware/brcm/ + install -m 0644 ${WORKDIR}/BCM43430A1.hcd ${D}/lib/firmware/brcm/BCM43430A1.hcd + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/brcm43438.service ${D}${systemd_unitdir}/system + fi +} + +FILES_${PN}_append_raspberrypi3 = " \ + /lib/firmware/brcm/BCM43430A1.hcd \ + " + +SYSTEMD_SERVICE_${PN}_raspberrypi3 += "brcm43438.service" diff --git a/import-layers/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb b/import-layers/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb new file mode 100644 index 000000000..623a5a78f --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb @@ -0,0 +1,6 @@ +# Base this image on rpi-hwup-image +include rpi-hwup-image.bb + +SPLASH = "psplash-raspberrypi" + +IMAGE_FEATURES += "ssh-server-dropbear splash" diff --git a/import-layers/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb b/import-layers/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb new file mode 100644 index 000000000..486ea59ef --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb @@ -0,0 +1,7 @@ +# Base this image on core-image-minimal +include recipes-core/images/core-image-minimal.bb + +# Include modules in rootfs +IMAGE_INSTALL += " \ + kernel-modules \ + " diff --git a/import-layers/meta-raspberrypi/recipes-core/images/rpi-test-image.bb b/import-layers/meta-raspberrypi/recipes-core/images/rpi-test-image.bb new file mode 100644 index 000000000..b5602a605 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-core/images/rpi-test-image.bb @@ -0,0 +1,4 @@ +# Base this image on rpi-basic-image +include rpi-basic-image.bb + +IMAGE_INSTALL_append = " packagegroup-rpi-test" diff --git a/import-layers/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb b/import-layers/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb new file mode 100644 index 000000000..29e995e0c --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-core/packagegroups/packagegroup-rpi-test.bb @@ -0,0 +1,27 @@ +DESCRIPTION = "RaspberryPi Test Packagegroup" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +inherit packagegroup + +RDEPENDS_${PN} = "\ + omxplayer \ + bcm2835-tests \ + wiringpi \ + rpio \ + rpi-gpio \ + pi-blaster \ + python-rtimu \ + python-sense-hat \ + connman \ + connman-client \ + crda \ + bluez5 \ +" + +RRECOMMENDS_${PN} = "\ + bigbuckbunny-1080p \ + bigbuckbunny-480p \ + bigbuckbunny-720p \ + ${MACHINE_EXTRA_RRECOMMENDS} \ +" diff --git a/import-layers/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h b/import-layers/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h new file mode 100644 index 000000000..de29ee916 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-core/psplash/files/psplash-raspberrypi-img.h @@ -0,0 +1,3210 @@ +/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ + +#define POKY_IMG_ROWSTRIDE (2280) +#define POKY_IMG_WIDTH (570) +#define POKY_IMG_HEIGHT (720) +#define POKY_IMG_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */ +#define POKY_IMG_RLE_PIXEL_DATA ((uint8*) \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\332\0\0\0" \ + "\0\7\0\0\0\7\0\0\0$\0\0\0C\0\0\0U\0\0\0O\0\0\0C\0\0\0\37\377\0\0\0\0" \ + "\372\0\0\0\0\3\0\0\0\4\0\0\0)\0\0\0F\202\0\0\0U\2\0\0\0G\0\0\0\37\377" \ + "\0\0\0\0\377\0\0\0\0\262\0\0\0\0\4\0\0\0\27\0\0\0g\0\0\0\264\0\0\0\366" \ + "\206\0\0\0\377\4\0\0\0\356\0\0\0\271\0\0\0t\0\0\0-\377\0\0\0\0\363\0" \ + "\0\0\0\4\0\0\0-\0\0\0|\0\0\0\311\0\0\0\371\206\0\0\0\377\4\0\0\0\356" \ + "\0\0\0\250\0\0\0\\\0\0\0\10\377\0\0\0\0\377\0\0\0\0\223\0\0\0\0\5\0\0" \ + "\0\10\0\0\0\77\0\0\0i\0\0\0\214\0\0\0\240\202\0\0\0\252\6\0\0\0\241\0" \ + "\0\0\231\0\0\0\214\0\0\0c\0\0\0""7\0\0\0\15\214\0\0\0\0\3\0\0\0\30\0" \ + "\0\0\220\0\0\0\366\215\0\0\0\377\3\0\0\0\320\0\0\0l\0\0\0\17\377\0\0" \ + "\0\0\355\0\0\0\0\3\0\0\0\35\0\0\0\202\0\0\0\335\215\0\0\0\377\3\0\0\0" \ + "\352\0\0\0\204\0\0\0\17\214\0\0\0\0\6\0\0\0\26\0\0\0B\0\0\0l\0\0\0\223" \ + "\0\0\0\231\0\0\0\245\202\0\0\0\252\5\0\0\0\234\0\0\0\205\0\0\0a\0\0\0" \ + "1\0\0\0\2\377\0\0\0\0\364\0\0\0\0\4\0\0\0\12\0\0\0]\0\0\0\267\0\0\0\367" \ + "\214\0\0\0\377\4\0\0\0\333\0\0\0\232\0\0\0V\0\0\0\24\206\0\0\0\0\3\0" \ + "\0\0\6\0\0\0\204\0\0\0\366\221\0\0\0\377\3\0\0\0\363\0\0\0\226\0\0\0" \ + ")\377\0\0\0\0\350\0\0\0\0\4\0\0\0\1\0\0\0F\0\0\0\257\0\0\0\374\221\0" \ + "\0\0\377\3\0\0\0\350\0\0\0a\0\0\0\1\206\0\0\0\0\4\0\0\0!\0\0\0e\0\0\0" \ + "\251\0\0\0\351\214\0\0\0\377\4\0\0\0\357\0\0\0\242\0\0\0G\0\0\0\2\377" \ + "\0\0\0\0\357\0\0\0\0\3\0\0\0\16\0\0\0|\0\0\0\352\222\0\0\0\377\4\0\0" \ + "\0\375\0\0\0\311\0\0\0r\0\0\0\34\202\0\0\0\0\2\0\0\0/\0\0\0\321\225\0" \ + "\0\0\377\4\0\0\0\376\0\0\0\272\0\0\0M\0\0\0\2\213\0\0\0\0\2\0\0\0\17" \ + "\0\0\0\37\202\0\0\0\"\1\0\0\0\12\377\0\0\0\0\303\0\0\0\0\1\0\0\0\23\202" \ + "\0\0\0\"\2\0\0\0\33\0\0\0\13\213\0\0\0\0\3\0\0\0\14\0\0\0j\0\0\0\327" \ + "\226\0\0\0\377\2\0\0\0\271\0\0\0\32\202\0\0\0\0\3\0\0\0.\0\0\0\206\0" \ + "\0\0\334\223\0\0\0\377\3\0\0\0\326\0\0\0_\0\0\0\3\377\0\0\0\0\353\0\0" \ + "\0\0\3\0\0\0\2\0\0\0i\0\0\0\351\227\0\0\0\377\4\0\0\0\375\0\0\0\301\0" \ + "\0\0\223\0\0\0\371\231\0\0\0\377\3\0\0\0\334\0\0\0r\0\0\0\22\203\0\0" \ + "\0\0\6\0\0\0\3\0\0\0""4\0\0\0k\0\0\0\241\0\0\0\313\0\0\0\360\204\0\0" \ + "\0\377\5\0\0\0\376\0\0\0\341\0\0\0\251\0\0\0f\0\0\0\30\377\0\0\0\0\273" \ + "\0\0\0\0\4\0\0\0*\0\0\0w\0\0\0\270\0\0\0\353\205\0\0\0\377\5\0\0\0\350" \ + "\0\0\0\302\0\0\0\224\0\0\0^\0\0\0&\204\0\0\0\0\3\0\0\0""3\0\0\0\222\0" \ + "\0\0\357\231\0\0\0\377\3\0\0\0\354\0\0\0\215\0\0\0\325\230\0\0\0\377" \ + "\2\0\0\0\323\0\0\0F\377\0\0\0\0\351\0\0\0\0\2\0\0\0\34\0\0\0\275\270" \ + "\0\0\0\377\5\0\0\0\372\0\0\0\266\0\0\0r\0\0\0\245\0\0\0\353\215\0\0\0" \ + "\377\3\0\0\0\375\0\0\0\255\0\0\0""5\377\0\0\0\0\266\0\0\0\0\3\0\0\0\2" \ + "\0\0\0Q\0\0\0\311\216\0\0\0\377\4\0\0\0\335\0\0\0\224\0\0\0{\0\0\0\324" \ + "\270\0\0\0\377\3\0\0\0\376\0\0\0\225\0\0\0\11\377\0\0\0\0\346\0\0\0\0" \ + "\2\0\0\0""7\0\0\0\351\316\0\0\0\377\2\0\0\0\272\0\0\0""1\377\0\0\0\0" \ + "\263\0\0\0\0\2\0\0\0P\0\0\0\326\316\0\0\0\377\2\0\0\0\314\0\0\0\31\377" \ + "\0\0\0\0\326\0\0\0\0\6\0\0\0\22\0\0\0V\0\0\0\216\0\0\0\260\0\0\0\323" \ + "\0\0\0\365\203\0\0\0\377\7\0\0\0\372\0\0\0\344\0\0\0\314\0\0\0\264\0" \ + "\0\0\236\0\0\0\217\0\0\0\366\320\0\0\0\377\3\0\0\0\375\0\0\0\240\0\0" \ + "\0\33\377\0\0\0\0\257\0\0\0\0\2\0\0\0""3\0\0\0\300\321\0\0\0\377\7\0" \ + "\0\0\341\0\0\0\214\0\0\0\242\0\0\0\271\0\0\0\322\0\0\0\350\0\0\0\376" \ + "\203\0\0\0\377\6\0\0\0\355\0\0\0\313\0\0\0\250\0\0\0\205\0\0\0E\0\0\0" \ + "\10\377\0\0\0\0\304\0\0\0\0\4\0\0\0\3\0\0\0Y\0\0\0\305\0\0\0\374\341" \ + "\0\0\0\377\3\0\0\0\363\0\0\0y\0\0\0\7\377\0\0\0\0\253\0\0\0\0\3\0\0\0" \ + "\26\0\0\0\233\0\0\0\375\341\0\0\0\377\3\0\0\0\365\0\0\0\261\0\0\0<\377" \ + "\0\0\0\0\301\0\0\0\0\2\0\0\0J\0\0\0\332\346\0\0\0\377\3\0\0\0\337\0\0" \ + "\0o\0\0\0\15\202\0\0\0\0\5\0\0\0\7\0\0\0-\0\0\0G\0\0\0^\0\0\0t\202\0" \ + "\0\0w\4\0\0\0u\0\0\0f\0\0\0H\0\0\0\31\377\0\0\0\0\214\0\0\0\0\4\0\0\0" \ + "\1\0\0\0$\0\0\0T\0\0\0h\203\0\0\0w\5\0\0\0q\0\0\0Z\0\0\0\77\0\0\0&\0" \ + "\0\0\3\202\0\0\0\0\3\0\0\0\34\0\0\0\211\0\0\0\360\346\0\0\0\377\2\0\0" \ + "\0\277\0\0\0)\377\0\0\0\0\275\0\0\0\0\3\0\0\0\6\0\0\0\217\0\0\0\376\351" \ + "\0\0\0\377\4\0\0\0\360\0\0\0\262\0\0\0\327\0\0\0\373\212\0\0\0\377\4" \ + "\0\0\0\342\0\0\0\236\0\0\0O\0\0\0\4\377\0\0\0\0\205\0\0\0\0\4\0\0\0\16" \ + "\0\0\0e\0\0\0\256\0\0\0\357\212\0\0\0\377\4\0\0\0\367\0\0\0\314\0\0\0" \ + "\267\0\0\0\372\351\0\0\0\377\2\0\0\0\365\0\0\0c\377\0\0\0\0\273\0\0\0" \ + "\0\2\0\0\0\11\0\0\0\265\374\0\0\0\377\3\0\0\0\345\0\0\0w\0\0\0\14\377" \ + "\0\0\0\0\4\0\0\0\0\0\0\0\34\0\0\0\225\0\0\0\364\374\0\0\0\377\1\0\0\0" \ + "\203\377\0\0\0\0\271\0\0\0\0\2\0\0\0\6\0\0\0\274\377\0\0\0\377\3\0\0" \ + "\0\351\0\0\0_\0\0\0\1\374\0\0\0\0\3\0\0\0\11\0\0\0\204\0\0\0\370\377" \ + "\0\0\0\377\1\0\0\0\207\377\0\0\0\0\253\0\0\0\0\4\0\0\0\15\0\0\0#\0\0" \ + "\0""8\0\0\0M\203\0\0\0U\7\0\0\0P\0\0\0@\0\0\0""0\0\0\0\37\0\0\0\17\0" \ + "\0\0\0\0\0\0\235\377\0\0\0\377\203\0\0\0\377\2\0\0\0\271\0\0\0\27\372" \ + "\0\0\0\0\2\0\0\0""3\0\0\0\332\377\0\0\0\377\203\0\0\0\377\7\0\0\0c\0" \ + "\0\0\2\0\0\0\22\0\0\0#\0\0\0""3\0\0\0D\0\0\0T\203\0\0\0U\4\0\0\0I\0\0" \ + "\0""2\0\0\0\35\0\0\0\11\377\0\0\0\0\227\0\0\0\0\6\0\0\0\22\0\0\0L\0\0" \ + "\0\202\0\0\0\260\0\0\0\336\0\0\0\367\377\0\0\0\377\222\0\0\0\377\2\0" \ + "\0\0\347\0\0\0""5\370\0\0\0\0\2\0\0\0`\0\0\0\370\377\0\0\0\377\222\0" \ + "\0\0\377\6\0\0\0\363\0\0\0\324\0\0\0\246\0\0\0v\0\0\0>\0\0\0\11\377\0" \ + "\0\0\0\216\0\0\0\0\4\0\0\0*\0\0\0\177\0\0\0\322\0\0\0\376\377\0\0\0\377" \ + "\230\0\0\0\377\2\0\0\0\364\0\0\0I\366\0\0\0\0\2\0\0\0{\0\0\0\376\377" \ + "\0\0\0\377\230\0\0\0\377\4\0\0\0\371\0\0\0\277\0\0\0k\0\0\0\30\377\0" \ + "\0\0\0\210\0\0\0\0\3\0\0\0\3\0\0\0T\0\0\0\307\377\0\0\0\377\235\0\0\0" \ + "\377\2\0\0\0\373\0\0\0`\363\0\0\0\0\2\0\0\0\2\0\0\0\225\377\0\0\0\377" \ + "\235\0\0\0\377\3\0\0\0\374\0\0\0\253\0\0\0""9\377\0\0\0\0\205\0\0\0\0" \ + "\2\0\0\0R\0\0\0\333\332\0\0\0\377\1\5\7\2\377\304\0\0\0\377\2\0\0\0\376" \ + "\0\0\0e\361\0\0\0\0\2\0\0\0\2\0\0\0\236\306\0\0\0\377\1\5\7\2\377\331" \ + "\0\0\0\377\2\0\0\0\300\0\0\0""1\377\0\0\0\0\3\0\0\0\0\0\0\0$\0\0\0\276" \ + "\334\0\0\0\377\4\21\31\6\377V|\35\377/D\20\377\5\7\2\377\302\0\0\0\377" \ + "\2\0\0\0\375\0\0\0_\357\0\0\0\0\2\0\0\0\1\0\0\0\230\304\0\0\0\377\4\0" \ + "\1\0\377\37-\13\377Nq\33\377)<\16\377\332\0\0\0\377\3\0\0\0\375\0\0\0" \ + "\232\0\0\0\16\375\0\0\0\0\2\0\0\0d\0\0\0\366\300\0\0\0\377\6\4\6\1\377" \ + "Dc\27\377Ec\30\377-@\17\377\24\34\7\377\1\2\0\377\230\0\0\0\377\5#3\14" \ + "\377t\250(\377j\231$\377=W\25\377\13\20\4\377\301\0\0\0\377\2\0\0\0\376" \ + "\0\0\0g\355\0\0\0\0\2\0\0\0\2\0\0\0\235\303\0\0\0\377\5\3\4\1\377-B\20" \ + "\377^\207\40\377u\251(\377Fe\30\377\231\0\0\0\377\5\14\22\4\377%5\15" \ + "\377=Y\25\377Or\33\377\21\31\6\377\277\0\0\0\377\2\0\0\0\342\0\0\0""9" \ + "\373\0\0\0\0\1\0\0\0\206\303\0\0\0\377\2\7\13\3\377^\207\40\377\202u" \ + "\251(\377\5o\240&\377X\177\36\377:T\24\377\32&\11\377\2\3\1\377\225\0" \ + "\0\0\377\1""7P\23\377\202u\251(\377\3q\243'\377C`\27\377\14\22\4\377" \ + "\300\0\0\0\377\2\0\0\0\373\0\0\0U\354\0\0\0\0\1\0\0\0\213\302\0\0\0\377" \ + "\3\4\5\1\3771G\21\377h\226#\377\202u\251(\377\2X\177\36\377\2\3\1\377" \ + "\225\0\0\0\377\4\21\30\6\3770F\20\377Or\33\377i\227$\377\202u\251(\377" \ + "\2o\240&\377\32%\11\377\301\0\0\0\377\2\0\0\0\367\0\0\0S\370\0\0\0\0" \ + "\2\0\0\0\2\0\0\0\232\305\0\0\0\377\2\6\11\2\377X\177\36\377\205u\251" \ + "(\377\4n\237&\377Pt\33\3771F\21\377\15\23\5\377\222\0\0\0\377\2\0\1\0" \ + "\377Nq\33\377\203u\251(\377\3r\244'\377Ec\30\377\14\21\4\377\222\0\0" \ + "\0\377\2\10\13\3\377\5\7\2\377\253\0\0\0\377\2\0\0\0\374\0\0\0Z\352\0" \ + "\0\0\0\1\0\0\0\217\256\0\0\0\377\1\14\22\4\377\222\0\0\0\377\3\3\4\1" \ + "\3773J\21\377i\230$\377\203u\251(\377\2h\226$\377\12\16\3\377\222\0\0" \ + "\0\377\4\5\7\2\377'8\15\377Gf\30\377f\224#\377\205u\251(\377\2k\232%" \ + "\377\26\40\10\377\303\0\0\0\377\2\0\0\0\374\0\0\0a\367\0\0\0\0\1\0\0" \ + "\0\212\307\0\0\0\377\2\4\5\1\377Ps\33\377\207u\251(\377\4u\250(\377Z" \ + "\202\37\3772H\21\377\13\21\4\377\220\0\0\0\377\2\6\11\2\377d\220\"\377" \ + "\204u\251(\377\3o\241&\3779R\23\377\4\6\1\377\220\0\0\0\377\3\2\3\1\377" \ + "W}\36\377#3\14\377\253\0\0\0\377\2\0\0\0\371\0\0\0\\\202\0\0\0""3\1\0" \ + "\0\0""7\202\0\0\0D\1\0\0\0F\203\0\0\0U\1\0\0\0\37\324\0\0\0\0\1\0\0\0" \ + "2\202\0\0\0U\1\0\0\0S\203\0\0\0D\1\0\0\0""4\202\0\0\0""3\1\0\0\0\203" \ + "\255\0\0\0\377\3\21\30\6\377Tz\35\377\27!\10\377\221\0\0\0\377\2%6\15" \ + "\377d\221\"\377\204u\251(\377\2t\247(\377\32&\11\377\220\0\0\0\377\4" \ + "\4\6\1\377&6\15\377Np\33\377p\242&\377\207u\251(\377\2e\222#\377\21\31" \ + "\6\377\305\0\0\0\377\2\0\0\0\374\0\0\0Q\365\0\0\0\0\1\0\0\0^\311\0\0" \ + "\0\377\2\1\2\0\377Dc\27\377\211u\251(\377\4t\250(\377W}\36\377)<\16\377" \ + "\4\5\1\377\216\0\0\0\377\1#3\14\377\206u\251(\377\2g\225#\377(:\16\377" \ + "\220\0\0\0\377\4.C\20\377u\251(\377Ps\33\377\14\22\4\377\264\0\0\0\377" \ + "\3\0\0\0\367\0\0\0\200\0\0\0\6\320\0\0\0\0\2\0\0\0\23\0\0\0\252\266\0" \ + "\0\0\377\4\2\3\1\377:T\24\377q\244'\377Rv\34\377\220\0\0\0\377\2\25\36" \ + "\7\377X\177\36\377\206u\251(\377\1Gg\30\377\217\0\0\0\377\3\34(\11\377" \ + "Ij\31\377o\240&\377\211u\251(\377\2^\207\40\377\13\20\4\377\307\0\0\0" \ + "\377\2\0\0\0\364\0\0\0+\351\0\0\0\0\3\0\0\0\20\0\0\0""6\0\0\0]\204\0" \ + "\0\0f\5\0\0\0]\0\0\0M\0\0\0=\0\0\0D\0\0\0\361\256\0\0\0\377\3\15\23\5" \ + "\377\26\40\10\377\4\5\1\377\232\0\0\0\377\1B_\27\377\213u\251(\377\3" \ + "m\236%\377Ca\27\377\24\34\7\377\215\0\0\0\377\1\\\205\40\377\207u\251" \ + "(\377\2Qu\34\377\13\21\4\377\216\0\0\0\377\5\3\4\1\377n\237&\377u\251" \ + "(\377m\236%\377*=\16\377\265\0\0\0\377\2\0\0\0\307\0\0\0+\316\0\0\0\0" \ + "\2\0\0\0K\0\0\0\342\266\0\0\0\377\2\25\36\7\377_\211\40\377\202u\251" \ + "(\377\1\37-\13\377\216\0\0\0\377\3\2\3\1\377:T\24\377r\245'\377\206u" \ + "\251(\377\2t\247(\377\14\22\4\377\214\0\0\0\377\3\10\14\3\3775L\22\377" \ + "b\216\"\377\213u\251(\377\2^\210\40\377\7\12\2\377\231\0\0\0\377\3\1" \ + "\1\0\377\20\27\5\377\26\40\10\377\255\0\0\0\377\5\0\0\0\322\0\0\0""5" \ + "\0\0\0A\0\0\0Q\0\0\0a\204\0\0\0f\3\0\0\0U\0\0\0/\0\0\0\10\332\0\0\0\0" \ + "\4\0\0\0\30\0\0\0d\0\0\0\257\0\0\0\351\272\0\0\0\377\11\2\3\1\377Ij\31" \ + "\377t\247(\377d\221\"\377Qu\34\377>Z\25\377+>\17\377\30\"\10\377\6\10" \ + "\2\377\224\0\0\0\377\2\0\1\0\377Ii\31\377\214u\251(\377\3u\250(\377P" \ + "t\33\377\30\"\10\377\213\0\0\0\377\1""4K\22\377\210u\251(\377\2m\235" \ + "%\377*<\16\377\216\0\0\0\377\1Or\33\377\203u\251(\377\2Ps\33\377\12\17" \ + "\3\377\264\0\0\0\377\3\0\0\0\371\0\0\0~\0\0\0\3\312\0\0\0\0\2\0\0\0\21" \ + "\0\0\0\246\266\0\0\0\377\3\1\2\0\3778P\23\377r\245'\377\202u\251(\377" \ + "\2o\240&\377\3\4\1\377\215\0\0\0\377\2\25\36\7\377^\210\40\377\210u\251" \ + "(\377\1W~\36\377\213\0\0\0\377\3\13\17\4\377\77[\25\377o\240&\377\214" \ + "u\251(\377\2d\220\"\377\11\15\3\377\224\0\0\0\377\11\2\3\1\377\22\32" \ + "\6\377&6\15\3778Q\23\377Lm\32\377_\211\40\377q\243'\377b\216\"\377\16" \ + "\24\5\377\270\0\0\0\377\5\0\0\0\375\0\0\0\337\0\0\0\235\0\0\0R\0\0\0" \ + "\14\323\0\0\0\0\4\0\0\0\2\0\0\0N\0\0\0\275\0\0\0\376\276\0\0\0\377\2" \ + "\0\1\0\377=Y\25\377\205u\251(\377\6t\250(\377`\213!\377Fe\30\377,@\17" \ + "\377\22\33\6\377\0\1\0\377\220\0\0\0\377\2\4\6\1\377b\215!\377\216u\251" \ + "(\377\2Ty\35\377\30\"\10\377\211\0\0\0\377\1\32%\11\377\212u\251(\377" \ + "\2Ln\32\377\6\11\2\377\214\0\0\0\377\1""0F\20\377\204u\251(\377\2i\230" \ + "$\377\35*\12\377\265\0\0\0\377\2\0\0\0\276\0\0\0\27\310\0\0\0\0\2\0\0" \ + "\0""3\0\0\0\336\266\0\0\0\377\2\13\21\4\377W~\36\377\204u\251(\377\1" \ + "Ty\35\377\214\0\0\0\377\3\0\1\0\3772H\21\377r\244'\377\211u\251(\377" \ + "\1=W\25\377\211\0\0\0\377\3\12\17\3\377B_\27\377q\243'\377\215u\251(" \ + "\377\2r\245'\377\27!\10\377\221\0\0\0\377\5\13\17\4\377$4\14\377>Z\25" \ + "\377Y\200\36\377p\242&\377\205u\251(\377\2Z\202\37\377\10\14\3\377\275" \ + "\0\0\0\377\3\0\0\0\370\0\0\0\244\0\0\0""4\320\0\0\0\0\2\0\0\0M\0\0\0" \ + "\333\303\0\0\0\377\2""2H\21\377t\250(\377\210u\251(\377\5m\235%\377S" \ + "x\34\3779S\24\377\35*\12\377\3\4\1\377\215\0\0\0\377\1\33&\11\377\217" \ + "u\251(\377\3u\250(\377Np\33\377\21\31\6\377\207\0\0\0\377\1\33&\11\377" \ + "\213u\251(\377\2e\222#\377\30#\10\377\213\0\0\0\377\1&7\15\377\205u\251" \ + "(\377\3t\247(\3779R\23\377\1\1\0\377\216\0\0\0\377\2,@\17\377\20\27\5" \ + "\377\244\0\0\0\377\2\0\0\0\346\0\0\0>\306\0\0\0\0\2\0\0\0h\0\0\0\370" \ + "\245\0\0\0\377\2\3\5\1\3779R\23\377\217\0\0\0\377\2\40.\13\377j\232$" \ + "\377\205u\251(\377\1Ii\31\377\213\0\0\0\377\2\11\15\3\377Qu\34\377\213" \ + "u\251(\377\1>Y\25\377\207\0\0\0\377\3\6\10\2\377:T\24\377o\240&\377\217" \ + "u\251(\377\1=Y\25\377\216\0\0\0\377\4\24\34\7\3771G\21\377Kl\32\377e" \ + "\222#\377\211u\251(\377\2Pt\33\377\4\6\1\377\301\0\0\0\377\2\0\0\0\300" \ + "\0\0\0,\314\0\0\0\0\2\0\0\0\24\0\0\0\247\306\0\0\0\377\2.B\20\377u\250" \ + "(\377\213u\251(\377\4o\241&\377Rv\34\3771F\21\377\20\27\5\377\213\0\0" \ + "\0\377\1d\220\"\377\220u\251(\377\3s\246'\377@]\26\377\6\11\2\377\205" \ + "\0\0\0\377\1""4L\22\377\214u\251(\377\2r\245'\3770F\20\377\212\0\0\0" \ + "\377\1%5\15\377\207u\251(\377\2Rw\34\377\6\11\2\377\215\0\0\0\377\3""6" \ + "N\23\377l\234%\377\33'\11\377\244\0\0\0\377\3\0\0\0\373\0\0\0v\0\0\0" \ + "\1\302\0\0\0\0\2\0\0\0\13\0\0\0\243\246\0\0\0\377\3\11\15\3\377Y\201" \ + "\37\377Z\203\37\377\216\0\0\0\377\2""6N\23\377t\250(\377\206u\251(\377" \ + "\1Hh\31\377\212\0\0\0\377\2\27\"\10\377h\226#\377\214u\251(\377\1W~\36" \ + "\377\205\0\0\0\377\3\0\1\0\377*=\16\377j\231$\377\221u\251(\377\1\21" \ + "\31\6\377\212\0\0\0\377\4\10\13\3\377'8\15\377Hg\30\377h\226$\377\214" \ + "u\251(\377\2Pt\33\377\2\3\1\377\303\0\0\0\377\3\0\0\0\371\0\0\0\200\0" \ + "\0\0\5\311\0\0\0\0\2\0\0\0$\0\0\0\337\310\0\0\0\377\1""8P\23\377\217" \ + "u\251(\377\4d\221\"\377Db\27\377\"2\14\377\3\5\1\377\207\0\0\0\377\1" \ + "Y\200\36\377\222u\251(\377\2i\227$\377'9\15\377\203\0\0\0\377\2\4\5\1" \ + "\377e\222#\377\216u\251(\377\2Gf\30\377\3\4\1\377\210\0\0\0\377\1:T\24" \ + "\377\210u\251(\377\2a\215!\377\20\27\5\377\214\0\0\0\377\4.B\20\377u" \ + "\251(\377r\244'\377)<\16\377\245\0\0\0\377\2\0\0\0\256\0\0\0\11\300\0" \ + "\0\0\0\2\0\0\0\36\0\0\0\324\246\0\0\0\377\4\22\33\6\377e\222#\377u\251" \ + "(\377Rv\34\377\214\0\0\0\377\2\4\5\1\377Jk\31\377\210u\251(\377\1^\210" \ + "\40\377\211\0\0\0\377\2*=\16\377q\243'\377\215u\251(\377\2u\250(\377" \ + "\30\"\10\377\203\0\0\0\377\2\24\34\7\377X\177\36\377\223u\251(\377\1" \ + "\6\11\2\377\207\0\0\0\377\4\30\"\10\377:T\24\377Z\203\37\377t\247(\377" \ + "\216u\251(\377\2X\177\36\377\3\5\1\377\306\0\0\0\377\2\0\0\0\276\0\0" \ + "\0\15\307\0\0\0\0\2\0\0\0#\0\0\0\341\311\0\0\0\377\2\0\1\0\377Tz\35\377" \ + "\221u\251(\377\4n\236%\377Hh\31\377\37,\13\377\1\2\0\377\203\0\0\0\377" \ + "\2\6\10\2\377o\240&\377\224u\251(\377\4V|\35\377\22\32\6\377\0\0\0\377" \ + "Ca\27\377\220u\251(\377\2Z\203\37\377\12\16\3\377\206\0\0\0\377\2\0\1" \ + "\0\377a\214!\377\211u\251(\377\2l\234%\377\31$\11\377\213\0\0\0\377\1" \ + "%6\15\377\202u\251(\377\2u\250(\3773J\22\377\245\0\0\0\377\2\0\0\0\274" \ + "\0\0\0\16\276\0\0\0\0\2\0\0\0(\0\0\0\337\246\0\0\0\377\2\30#\10\377l" \ + "\234%\377\202u\251(\377\1Ii\31\377\213\0\0\0\377\2\7\13\3\377Z\202\37" \ + "\377\211u\251(\377\2t\250(\377\21\31\6\377\206\0\0\0\377\2\1\1\0\377" \ + "\77[\26\377\220u\251(\377\5a\215!\377\6\11\2\377\6\10\2\377@\\\26\377" \ + "s\246'\377\224u\251(\377\1\"1\14\377\204\0\0\0\377\3\22\33\6\377;U\24" \ + "\377d\220\"\377\221u\251(\377\2m\235%\377\14\22\4\377\310\0\0\0\377\2" \ + "\0\0\0\276\0\0\0\11\305\0\0\0\0\2\0\0\0\16\0\0\0\331\313\0\0\0\377\2" \ + "\16\25\5\377s\246'\377\223u\251(\377\5j\230$\377B_\26\377\31$\10\377" \ + "\0\0\0\377Ca\27\377\226u\251(\377\2r\244'\377Sw\34\377\222u\251(\377" \ + "\2e\222#\377\22\32\6\377\205\0\0\0\377\1(:\16\377\213u\251(\377\2o\241" \ + "&\377\36,\12\377\212\0\0\0\377\1\33'\11\377\204u\251(\377\1:T\24\377" \ + "\245\0\0\0\377\2\0\0\0\326\0\0\0\37\274\0\0\0\0\2\0\0\0G\0\0\0\363\246" \ + "\0\0\0\377\2\34)\12\377o\240&\377\203u\251(\377\1\77[\25\377\212\0\0" \ + "\0\377\2\13\17\4\377_\212!\377\213u\251(\377\1Km\32\377\205\0\0\0\377" \ + "\2\4\6\1\377Or\33\377\222u\251(\377\2\\\205\40\377h\226$\377\226u\251" \ + "(\377\5`\213!\377\6\11\2\377\15\23\4\3775L\22\377^\210\40\377\224u\251" \ + "(\377\1""1F\21\377\312\0\0\0\377\1\0\0\0\250\305\0\0\0\0\1\0\0\0\242" \ + "\251\0\0\0\377\10\21\30\6\377&7\15\3779R\23\377Kl\32\377Ty\35\377_\211" \ + "\40\377h\226$\377q\244'\377\202u\251(\377\1s\246'\377\202m\236%\377\7" \ + "d\221\"\377U{\35\377Gf\30\3778Q\23\377)<\16\377\27!\10\377\4\5\1\377" \ + "\220\0\0\0\377\1Or\33\377\226u\251(\377\1i\230$\377\254u\251(\377\2m" \ + "\235%\377\35*\12\377\203\0\0\0\377\2\15\23\5\377l\234%\377\214u\251(" \ + "\377\2q\244'\377#2\14\377\211\0\0\0\377\1\24\34\7\377\205u\251(\377\2" \ + "@]\26\377\0\1\0\377\244\0\0\0\377\2\0\0\0\341\0\0\0'\272\0\0\0\0\2\0" \ + "\0\0O\0\0\0\367\246\0\0\0\377\2!0\13\377p\242&\377\204u\251(\377\1""7" \ + "P\23\377\211\0\0\0\377\2\15\23\5\377d\220\"\377\215u\251(\377\1(:\16" \ + "\377\203\0\0\0\377\2\12\17\3\377[\204\37\377\254u\251(\377\2j\231$\377" \ + "t\250(\377\225u\251(\377\2m\236%\377\5\7\2\377\217\0\0\0\377\12\1\1\0" \ + "\377\21\30\6\377$4\14\3773J\22\377B_\27\377Qu\34\377`\213!\377l\234%" \ + "\377m\236%\377q\243'\377\202u\251(\377\11t\247(\377j\232$\377a\215!\377" \ + "X\177\36\377Nq\33\377\77[\25\377,@\17\377\27\"\10\377\2\3\1\377\247\0" \ + "\0\0\377\1\0\0\0h\303\0\0\0\0\1\0\0\0E\250\0\0\0\377\2\24\35\7\377j\232" \ + "$\377\223u\251(\377\6t\247(\377d\220\"\377Nq\33\3779S\24\377\35*\12\377" \ + "\4\6\1\377\213\0\0\0\377\1:T\24\377\304u\251(\377\5r\245'\377*=\16\377" \ + "\0\0\0\377\3\5\1\377\\\205\37\377\216u\251(\377\2r\244'\377!/\13\377" \ + "\210\0\0\0\377\1\23\33\6\377\206u\251(\377\1@]\26\377\245\0\0\0\377\2" \ + "\0\0\0\352\0\0\0+\270\0\0\0\0\2\0\0\0X\0\0\0\374\246\0\0\0\377\2\40." \ + "\13\377r\244'\377\205u\251(\377\1""7P\23\377\210\0\0\0\377\2\13\20\4" \ + "\377d\220\"\377\216u\251(\377\5o\241&\377\24\34\7\377\0\0\0\377\22\33" \ + "\6\377e\222#\377\304u\251(\377\1X\177\36\377\213\0\0\0\377\6\1\1\0\377" \ + "\25\36\7\3772H\21\377Hi\31\377]\207\40\377p\242&\377\223u\251(\377\2" \ + "q\244'\3772H\21\377\246\0\0\0\377\2\0\0\0\363\0\0\0\30\301\0\0\0\0\2" \ + "\0\0\0\2\0\0\0\320\251\0\0\0\377\2+>\17\377t\250(\377\227u\251(\377\5" \ + "r\245'\377Y\201\37\377=X\25\377\34)\12\377\1\2\0\377\207\0\0\0\377\1" \ + "=W\25\377\305u\251(\377\3u\250(\377:T\24\377Fe\30\377\220u\251(\377\2" \ + "p\242&\377\35*\12\377\207\0\0\0\377\1\34)\12\377\207u\251(\377\1;U\24" \ + "\377\245\0\0\0\377\2\0\0\0\351\0\0\0*\266\0\0\0\0\2\0\0\0P\0\0\0\372" \ + "\246\0\0\0\377\2\34(\11\377p\242&\377\206u\251(\377\1@]\26\377\207\0" \ + "\0\0\377\2\11\15\3\377a\214!\377\220u\251(\377\3d\220\"\377$4\14\377" \ + "m\236%\377\305u\251(\377\1`\213!\377\210\0\0\0\377\4\21\31\6\3774K\22" \ + "\377Qu\34\377m\235%\377\230u\251(\377\2Mo\32\377\1\2\0\377\247\0\0\0" \ + "\377\1\0\0\0\224\301\0\0\0\0\1\0\0\0>\253\0\0\0\377\2-B\20\377u\250(" \ + "\377\232u\251(\377\4l\234%\377Kl\32\377'8\15\377\6\11\2\377\203\0\0\0" \ + "\377\2\4\6\1\377f\223#\377\331u\251(\377\2o\240&\377\26\37\7\377\206" \ + "\0\0\0\377\1""1F\21\377\210u\251(\377\1""5L\22\377\245\0\0\0\377\2\0" \ + "\0\0\340\0\0\0\37\264\0\0\0\0\2\0\0\0E\0\0\0\367\246\0\0\0\377\2\27\"" \ + "\10\377n\237&\377\207u\251(\377\1Ty\35\377\206\0\0\0\377\2\5\7\2\377" \ + "\\\205\40\377\331u\251(\377\2u\250(\377\31$\10\377\203\0\0\0\377\4\1" \ + "\2\0\377\34)\12\377@\\\26\377c\217\"\377\233u\251(\377\2Os\33\377\2\3" \ + "\1\377\250\0\0\0\377\2\0\0\0\365\0\0\0\15\300\0\0\0\0\1\0\0\0\227\254" \ + "\0\0\0\377\2""0F\20\377u\250(\377\234u\251(\377\5r\245'\377V|\35\377" \ + "2I\21\377\22\32\6\377Or\33\377\333u\251(\377\2h\226$\377\14\22\4\377" \ + "\205\0\0\0\377\1Z\202\37\377\210u\251(\377\2u\250(\377/D\20\377\245\0" \ + "\0\0\377\2\0\0\0\335\0\0\0\30\262\0\0\0\0\2\0\0\0<\0\0\0\365\246\0\0" \ + "\0\377\2\24\34\7\377l\234%\377\210u\251(\377\2s\246'\377\13\20\4\377" \ + "\204\0\0\0\377\2\1\1\0\377Ps\33\377\333u\251(\377\5f\223#\377\26\40\10" \ + "\377'9\15\377Kl\32\377l\234%\377\235u\251(\377\2Rv\34\377\3\4\1\377\252" \ + "\0\0\0\377\1\0\0\0[\300\0\0\0\0\1\0\0\0\351\255\0\0\0\377\1""3J\21\377" \ + "\375u\251(\377\2_\211\40\377\5\7\2\377\203\0\0\0\377\1\40.\13\377\212" \ + "u\251(\377\2t\250(\377*<\16\377\245\0\0\0\377\2\0\0\0\314\0\0\0\14\260" \ + "\0\0\0\0\2\0\0\0(\0\0\0\355\246\0\0\0\377\2\21\30\6\377j\230$\377\212" \ + "u\251(\377\1Db\27\377\204\0\0\0\377\1@]\26\377\375u\251(\377\2Ty\35\377" \ + "\3\5\1\377\253\0\0\0\377\1\0\0\0\257\277\0\0\0\0\1\0\0\0\40\257\0\0\0" \ + "\377\1""6N\22\377\375u\251(\377\1Lm\32\377\202\0\0\0\377\2\16\24\5\377" \ + "k\232%\377\213u\251(\377\2s\246'\377%5\15\377\245\0\0\0\377\2\0\0\0\277" \ + "\0\0\0\7\256\0\0\0\0\2\0\0\0\35\0\0\0\345\246\0\0\0\377\2\15\23\5\377" \ + "g\224#\377\214u\251(\377\1'9\15\377\202\0\0\0\377\1(:\16\377\375u\251" \ + "(\377\2V}\35\377\4\6\1\377\254\0\0\0\377\1\0\0\0\343\277\0\0\0\0\1\0" \ + "\0\0N\260\0\0\0\377\1""8R\23\377\375u\251(\377\3""2H\21\377\31$\10\377" \ + "i\230$\377\215u\251(\377\2r\244'\377\34)\12\377\245\0\0\0\377\2\0\0\0" \ + "\246\0\0\0\1\254\0\0\0\0\2\0\0\0\20\0\0\0\324\246\0\0\0\377\2\10\14\3" \ + "\377b\216\"\377\215u\251(\377\4s\246'\3773J\21\377\23\33\6\377o\241&" \ + "\377\374u\251(\377\2X\177\36\377\5\7\2\377\256\0\0\0\377\1\0\0\0\23\276" \ + "\0\0\0\0\1\0\0\0l\261\0\0\0\377\1Z" \ + "\25\377\77[\25\377Jk\31\377X\177\36\377j\232$\377\377u\251(\377\217u" \ + "\251(\377\2_\211\40\377\6\11\2\377\212\0\0\0\377\3h\226#\377u\250(\377" \ + "1F\21\377\227\0\0\0\377\2\0\0\0\350\0\0\0\32\250\0\0\0\0\2\0\0\0E\0\0" \ + "\0\375\230\0\0\0\377\4\25\36\7\377l\234%\377u\251(\377\27!\10\377\212" \ + "\0\0\0\377\1A^\26\377\377u\251(\377\217u\251(\377\14p\242&\377\\\205" \ + "\37\377Nq\33\377A^\26\377>Z\25\377:T\24\3777O\23\3772I\21\377/D\20\377" \ + "+>\17\377'8\15\377$4\14\377\206\37-\13\377\1\36,\12\377\207\27\"\10\377" \ + "\1\21\31\6\377\206\20\27\5\377\1\6\11\2\377\220\0\0\0\377\1\0\0\0D\276" \ + "\0\0\0\0\1\0\0\0p\222\0\0\0\377\1Np\33\377\377u\251(\377\260u\251(\377" \ + "\2Y\200\36\377\3\5\1\377\210\0\0\0\377\1\16\25\5\377\202u\251(\377\2" \ + "u\250(\3771F\21\377\227\0\0\0\377\2\0\0\0\311\0\0\0\7\246\0\0\0\0\2\0" \ + "\0\0\"\0\0\0\356\230\0\0\0\377\2\27!\10\377n\236%\377\202u\251(\377\1" \ + "2H\21\377\211\0\0\0\377\1""7P\23\377\377u\251(\377\260u\251(\377\2j\230" \ + "$\377\11\15\3\377\220\0\0\0\377\1\0\0\0""5\276\0\0\0\0\1\0\0\0X\222\0" \ + "\0\0\377\2\13\17\4\377k\232%\377\377u\251(\377\260u\251(\377\2Ij\31\377" \ + "\0\1\0\377\207\0\0\0\377\1(:\16\377\203u\251(\377\2t\247(\377)<\16\377" \ + "\227\0\0\0\377\1\0\0\0\215\245\0\0\0\0\2\0\0\0\5\0\0\0\307\230\0\0\0" \ + "\377\2\21\30\6\377i\230$\377\203u\251(\377\1Ln\32\377\210\0\0\0\377\2" \ + "'8\15\377t\250(\377\377u\251(\377\260u\251(\377\1%5\15\377\221\0\0\0" \ + "\377\1\0\0\0\36\276\0\0\0\0\1\0\0\0>\223\0\0\0\377\1$4\14\377\377u\251" \ + "(\377\261u\251(\377\1\17" \ + "\377u\250(\377\211u\251(\377\4""6N\22\377\0\0\0\377\2\3\1\377Ty\35\377" \ + "\377u\251(\377\261u\251(\377\2d\220\"\377\4\6\1\377\222\0\0\0\377\2\0" \ + "\0\0\366\0\0\0\16\300\0\0\0\0\2\0\0\0\2\0\0\0\343\224\0\0\0\377\2\6\11" \ + "\2\377g\225#\377\377u\251(\377\261u\251(\377\3d\220\"\377\13\20\4\377" \ + "W}\36\377\213u\251(\377\1:T\24\377\226\0\0\0\377\1\0\0\0\264\235\0\0" \ + "\0\0\2\0\0\0\17\0\0\0\345\227\0\0\0\377\2\32&\11\377r\244'\377\212u\251" \ + "(\377\3n\236%\377\17\25\5\377Hg\30\377\377u\251(\377\261u\251(\377\2" \ + "t\250(\377\34(\11\377\223\0\0\0\377\1\0\0\0\254\302\0\0\0\0\1\0\0\0\215" \ + "\225\0\0\0\377\1%5\15\377\377u\251(\377\262u\251(\377\1o\240&\377\214" \ + "u\251(\377\2t\250(\377\40.\13\377\226\0\0\0\377\1\0\0\0N\234\0\0\0\0" \ + "\1\0\0\0\216\227\0\0\0\377\2\11\15\3\377h\226#\377\214u\251(\377\1o\240" \ + "&\377\377u\251(\377\262u\251(\377\1Gg\30\377\224\0\0\0\377\1\0\0\0R\302" \ + "\0\0\0\0\2\0\0\0\30\0\0\0\366\225\0\0\0\377\1Qu\34\377\377u\251(\377" \ + "\277u\251(\377\2m\236%\377\17\26\5\377\225\0\0\0\377\2\0\0\0\347\0\0" \ + "\0\21\232\0\0\0\0\2\0\0\0;\0\0\0\375\226\0\0\0\377\2\2\3\1\377X\177\36" \ + "\377\377u\251(\377\277u\251(\377\2k\233%\377\10\13\3\377\223\0\0\0\377" \ + "\2\0\0\0\324\0\0\0\1\303\0\0\0\0\1\0\0\0\233\225\0\0\0\377\2\21\31\6" \ + "\377r\244'\377\377u\251(\377\277u\251(\377\2[\203\37\377\2\3\1\377\225" \ + "\0\0\0\377\1\0\0\0\220\231\0\0\0\0\2\0\0\0\2\0\0\0\314\227\0\0\0\377" \ + "\1:T\24\377\377u\251(\377\300u\251(\377\1""1G\21\377\224\0\0\0\377\1" \ + "\0\0\0b\304\0\0\0\0\1\0\0\0D\226\0\0\0\377\1C`\27\377\377u\251(\377\300" \ + "u\251(\377\1Dc\27\377\225\0\0\0\377\2\0\0\0\372\0\0\0(\230\0\0\0\0\1" \ + "\0\0\0b\227\0\0\0\377\2%5\15\377u\250(\377\377u\251(\377\277u\251(\377" \ + "\2c\217\"\377\1\2\0\377\223\0\0\0\377\2\0\0\0\373\0\0\0\17\303\0\0\0" \ + "\0\2\0\0\0\3\0\0\0\311\226\0\0\0\377\2\13\20\4\377p\242&\377\377u\251" \ + "(\377\300u\251(\377\1+>\17\377\225\0\0\0\377\1\0\0\0\275\227\0\0\0\0" \ + "\2\0\0\0\20\0\0\0\352\226\0\0\0\377\2\17\26\5\377m\236%\377\377u\251" \ + "(\377\300u\251(\377\1+>\17\377\225\0\0\0\377\1\0\0\0\220\303\0\0\0\0" \ + "\1\0\0\0o\230\0\0\0\377\1Ca\27\377\377u\251(\377\300u\251(\377\2n\237" \ + "&\377\16\24\5\377\225\0\0\0\377\1\0\0\0L\226\0\0\0\0\1\0\0\0\215\226" \ + "\0\0\0\377\2\1\1\0\377X\177\36\377\377u\251(\377\300u\251(\377\2d\220" \ + "\"\377\2\3\1\377\225\0\0\0\377\2\0\0\0\375\0\0\0:\301\0\0\0\0\2\0\0\0" \ + "\27\0\0\0\361\230\0\0\0\377\2\14\21\4\377r\245'\377\377u\251(\377\300" \ + "u\251(\377\2Z\202\37\377\1\1\0\377\224\0\0\0\377\2\0\0\0\324\0\0\0\3" \ + "\224\0\0\0\0\2\0\0\0!\0\0\0\370\226\0\0\0\377\1""6N\22\377\377u\251(" \ + "\377\301u\251(\377\1-A\17\377\227\0\0\0\377\2\0\0\0\313\0\0\0\1\300\0" \ + "\0\0\0\1\0\0\0\233\232\0\0\0\377\1Km\32\377\377u\251(\377\301u\251(\377" \ + "\1""2I\21\377\225\0\0\0\377\1\0\0\0b\224\0\0\0\0\1\0\0\0\244\226\0\0" \ + "\0\377\2\24\34\7\377r\244'\377\377u\251(\377\300u\251(\377\2j\231$\377" \ + "\3\5\1\377\230\0\0\0\377\1\0\0\0`\277\0\0\0\0\2\0\0\0-\0\0\0\374\232" \ + "\0\0\0\377\1\27!\10\377\377u\251(\377\301u\251(\377\2p\242&\377\21\31" \ + "\6\377\224\0\0\0\377\2\0\0\0\340\0\0\0\7\222\0\0\0\0\2\0\0\0.\0\0\0\375" \ + "\225\0\0\0\377\2\2\3\1\377^\210\40\377\377u\251(\377\301u\251(\377\1" \ + ";U\24\377\231\0\0\0\377\2\0\0\0\344\0\0\0\12\276\0\0\0\0\1\0\0\0\246" \ + "\234\0\0\0\377\1\\\205\40\377\377u\251(\377\301u\251(\377\2X\177\36\377" \ + "\1\1\0\377\224\0\0\0\377\1\0\0\0f\222\0\0\0\0\1\0\0\0\250\226\0\0\0\377" \ + "\1""5L\22\377\377u\251(\377\301u\251(\377\2t\247(\377\14\22\4\377\232" \ + "\0\0\0\377\1\0\0\0k\275\0\0\0\0\2\0\0\0\26\0\0\0\371\234\0\0\0\377\1" \ + "1F\21\377\377u\251(\377\302u\251(\377\1""5L\22\377\224\0\0\0\377\2\0" \ + "\0\0\342\0\0\0\7\220\0\0\0\0\2\0\0\0/\0\0\0\375\225\0\0\0\377\2\25\36" \ + "\7\377r\245'\377\377u\251(\377\301u\251(\377\1Ty\35\377\233\0\0\0\377" \ + "\1\0\0\0\323\275\0\0\0\0\1\0\0\0|\235\0\0\0\377\2\12\17\3\377s\246'\377" \ + "\377u\251(\377\301u\251(\377\2p\242&\377\20\27\5\377\224\0\0\0\377\1" \ + "\0\0\0l\220\0\0\0\0\1\0\0\0\256\225\0\0\0\377\2\1\1\0\377[\204\37\377" \ + "\377u\251(\377\302u\251(\377\1,\77\17\377\234\0\0\0\377\1\0\0\0@\274" \ + "\0\0\0\0\1\0\0\0\327\236\0\0\0\377\1Rw\34\377\377u\251(\377\302u\251" \ + "(\377\1U{\35\377\224\0\0\0\377\2\0\0\0\335\0\0\0\4\216\0\0\0\0\2\0\0" \ + "\0(\0\0\0\375\225\0\0\0\377\1""1F\21\377\377u\251(\377\302u\251(\377" \ + "\2o\241&\377\5\7\2\377\234\0\0\0\377\1\0\0\0\233\273\0\0\0\0\1\0\0\0" \ + "\35\237\0\0\0\377\1-@\17\377\377u\251(\377\303u\251(\377\1\"2\14\377" \ + "\224\0\0\0\377\1\0\0\0\\\216\0\0\0\0\1\0\0\0\237\225\0\0\0\377\2\10\14" \ + "\3\377l\234%\377\377u\251(\377\302u\251(\377\1Qu\34\377\235\0\0\0\377" \ + "\1\0\0\0\340\273\0\0\0\0\1\0\0\0Q\237\0\0\0\377\2\13\20\4\377u\250(\377" \ + "\377u\251(\377\302u\251(\377\2g\225#\377\5\7\2\377\223\0\0\0\377\2\0" \ + "\0\0\330\0\0\0\2\214\0\0\0\0\2\0\0\0$\0\0\0\374\225\0\0\0\377\1Gg\30" \ + "\377\377u\251(\377\303u\251(\377\1/D\20\377\236\0\0\0\377\1\0\0\0\25" \ + "\272\0\0\0\0\1\0\0\0t\240\0\0\0\377\1`\213!\377\252u\251(\377\4q\244" \ + "'\377_\211\40\377\\\205\40\377u\250(\377\377u\251(\377\225u\251(\377" \ + "\1""8R\23\377\224\0\0\0\377\1\0\0\0L\214\0\0\0\0\1\0\0\0\217\225\0\0" \ + "\0\377\2\26\40\10\377t\247(\377\377u\251(\377\225u\251(\377\3g\225#\377" \ + "X\177\36\377l\234%\377\253u\251(\377\1\17\26\5\377\236\0\0\0\377\1\0" \ + "\0\0:\272\0\0\0\0\1\0\0\0\202\240\0\0\0\377\1>Y\25\377\254u\251(\377" \ + "\5g\225#\377;U\24\3774L\22\377Z\202\37\377u\250(\377\377u\251(\377\222" \ + "u\251(\377\2q\244'\377\20\27\5\377\223\0\0\0\377\1\0\0\0\277\213\0\0" \ + "\0\0\2\0\0\0\20\0\0\0\363\224\0\0\0\377\2\1\1\0\377^\207\40\377\377u" \ + "\251(\377\223u\251(\377\4f\224#\377;U\24\377,\77\17\377V|\35\377\254" \ + "u\251(\377\1c\216\"\377\237\0\0\0\377\1\0\0\0H\272\0\0\0\0\1\0\0\0\206" \ + "\222\0\0\0\377\7\31$\11\3778R\23\377-A\17\377$4\14\377\32&\11\377\21" \ + "\30\6\377\6\11\2\377\206\0\0\0\377\2\12\16\3\377Ca\27\377\256u\251(\377" \ + "\5]\207\40\377\40.\13\377\26\37\7\377\77[\25\377h\226#\377\377u\251(" \ + "\377\221u\251(\377\1Nq\33\377\223\0\0\0\377\2\0\0\0\376\0\0\0-\212\0" \ + "\0\0\0\1\0\0\0o\225\0\0\0\377\1,\77\17\377\377u\251(\377\221u\251(\377" \ + "\6p\242&\377Km\32\377\"2\14\377\22\32\6\377Kl\32\377t\250(\377\255u\251" \ + "(\377\3^\210\40\377\22\33\6\377\1\1\0\377\205\0\0\0\377\7\4\6\1\377\15" \ + "\23\5\377\26\40\10\377!0\13\377+>\17\3774L\22\377,@\17\377\221\0\0\0" \ + "\377\1\0\0\0K\272\0\0\0\0\1\0\0\0s\222\0\0\0\377\2\10\13\3\377n\236%" \ + "\377\205u\251(\377\2s\246'\377j\231$\377\202e\222#\377\2l\234%\377o\240" \ + "&\377\262u\251(\377\6X\177\36\377\32&\11\377\1\1\0\377\34)\12\377Fe\30" \ + "\377n\236%\377\377u\251(\377\217u\251(\377\1\34(\11\377\223\0\0\0\377" \ + "\1\0\0\0\240\211\0\0\0\0\2\0\0\0\4\0\0\0\340\224\0\0\0\377\2\4\6\1\377" \ + "j\230$\377\377u\251(\377\216u\251(\377\7t\247(\377Sx\34\377);\16\377" \ + "\5\7\2\377\13\21\4\377Dc\27\377s\246'\377\261u\251(\377\6q\244'\377m" \ + "\236%\377g\224#\377e\222#\377h\226#\377p\242&\377\206u\251(\377\1%5\15" \ + "\377\221\0\0\0\377\1\0\0\0""7\272\0\0\0\0\1\0\0\0U\223\0\0\0\377\1""8" \ + "Q\23\377\277u\251(\377\7Qu\34\377\25\36\7\377\0\0\0\377\4\5\1\377(:\16" \ + "\377Sx\34\377s\246'\377\377u\251(\377\214u\251(\377\1V}\35\377\223\0" \ + "\0\0\377\2\0\0\0\366\0\0\0\20\210\0\0\0\0\1\0\0\0I\225\0\0\0\377\1""3" \ + "J\22\377\377u\251(\377\215u\251(\377\7`\213!\3775L\22\377\13\20\4\377" \ + "\0\0\0\377\10\14\3\377>Z\25\377p\242&\377\276u\251(\377\2[\204\37\377" \ + "\0\1\0\377\221\0\0\0\377\1\0\0\0\32\272\0\0\0\0\1\0\0\0#\223\0\0\0\377" \ + "\2\3\4\1\377d\220\"\377\300u\251(\377\2V|\35\377\25\36\7\377\202\0\0" \ + "\0\377\4\7\13\3\377/D\20\377Z\202\37\377u\250(\377\377u\251(\377\212" \ + "u\251(\377\1\36+\12\377\223\0\0\0\377\1\0\0\0m\210\0\0\0\0\1\0\0\0\256" \ + "\224\0\0\0\377\2\6\10\2\377l\234%\377\377u\251(\377\212u\251(\377\3f" \ + "\223#\377;U\24\377\22\32\6\377\202\0\0\0\377\3\7\13\3\377>Z\25\377p\242" \ + "&\377\277u\251(\377\2t\247(\377\27!\10\377\221\0\0\0\377\1\0\0\0\345" \ + "\273\0\0\0\0\2\0\0\0\2\0\0\0\347\223\0\0\0\377\1$4\14\377\301u\251(\377" \ + "\3s\246'\377Ec\30\377\13\20\4\377\203\0\0\0\377\3\26\40\10\377B_\26\377" \ + "k\232%\377\377u\251(\377\210u\251(\377\1V}\35\377\223\0\0\0\377\1\0\0" \ + "\0\313\207\0\0\0\0\2\0\0\0\24\0\0\0\371\224\0\0\0\377\1""3J\22\377\377" \ + "u\251(\377\210u\251(\377\4r\244'\377Nq\33\377#3\14\377\2\3\1\377\202" \ + "\0\0\0\377\3\3\4\1\3772H\21\377j\232$\377\301u\251(\377\1Hg\30\377\222" \ + "\0\0\0\377\1\0\0\0\253\274\0\0\0\0\1\0\0\0\225\224\0\0\0\377\1Or\33\377" \ + "\302u\251(\377\3p\242&\377Z\25\377\22\33\6\377\204\0\0\0\377\3\0\1\0\377'8\15\377" \ + "c\216\"\377\303u\251(\377\2u\250(\377\37,\13\377\222\0\0\0\377\2\0\0" \ + "\0\363\0\0\0\20\275\0\0\0\0\1\0\0\0\312\224\0\0\0\377\2\37-\13\377s\246" \ + "'\377\304u\251(\377\3f\223#\377*<\16\377\1\1\0\377\204\0\0\0\377\4\0" \ + "\1\0\377\36+\12\377Km\32\377q\244'\377\377u\251(\377\202u\251(\377\1" \ + "\34(\12\377\222\0\0\0\377\2\0\0\0\355\0\0\0\7\204\0\0\0\0\1\0\0\0""7" \ + "\224\0\0\0\377\2\5\7\2\377j\231$\377\377u\251(\377\5u\251(\377u\250(" \ + "\377Y\201\36\377+>\17\377\5\7\2\377\205\0\0\0\377\2\27\"\10\377V|\35" \ + "\377\305u\251(\377\1A]\26\377\223\0\0\0\377\1\0\0\0\220\276\0\0\0\0\1" \ + "\0\0\0[\225\0\0\0\377\1""3J\21\377\306u\251(\377\2_\211\40\377!0\13\377" \ + "\206\0\0\0\377\3\10\13\3\3772H\21\377_\212!\377\377u\251(\377\1U{\35" \ + "\377\223\0\0\0\377\1\0\0\0S\204\0\0\0\0\1\0\0\0\225\224\0\0\0\377\1""2" \ + "H\21\377\377u\251(\377\3j\232$\377\77[\25\377\22\32\6\377\206\0\0\0\377" \ + "\3\21\30\6\377Mo\32\377u\250(\377\305u\251(\377\2Tz\35\377\1\2\0\377" \ + "\222\0\0\0\377\2\0\0\0\372\0\0\0#\276\0\0\0\0\2\0\0\0\2\0\0\0\321\225" \ + "\0\0\0\377\1=X\25\377\307u\251(\377\2\\\205\37\377\35*\12\377\207\0\0" \ + "\0\377\3\23\33\6\377>Z\25\377m\236%\377\375u\251(\377\1\26\40\10\377" \ + "\222\0\0\0\377\1\0\0\0\263\203\0\0\0\0\2\0\0\0\10\0\0\0\356\223\0\0\0" \ + "\377\2\2\3\1\377g\224#\377\374u\251(\377\4t\247(\377Nq\33\377\37-\13" \ + "\377\1\1\0\377\206\0\0\0\377\3\17\26\5\377Nq\33\377t\250(\377\306u\251" \ + "(\377\2Y\201\37\377\5\7\2\377\223\0\0\0\377\1\0\0\0\227\300\0\0\0\0\1" \ + "\0\0\0J\225\0\0\0\377\2\0\1\0\377Ii\31\377\307u\251(\377\3u\250(\377" \ + "Nq\33\377\21\31\6\377\207\0\0\0\377\3\10\14\3\3774L\22\377d\220\"\377" \ + "\373u\251(\377\1Hg\30\377\222\0\0\0\377\2\0\0\0\371\0\0\0\17\202\0\0" \ + "\0\0\1\0\0\0L\224\0\0\0\377\1&6\15\377\373u\251(\377\3n\236%\377B_\27" \ + "\377\23\33\6\377\207\0\0\0\377\3\6\11\2\377;U\24\377o\241&\377\307u\251" \ + "(\377\2c\216\"\377\12\16\3\377\223\0\0\0\377\2\0\0\0\364\0\0\0\32\301" \ + "\0\0\0\0\1\0\0\0\246\225\0\0\0\377\2\2\3\1\377Pt\33\377\310u\251(\377" \ + "\3s\246'\377Ca\27\377\12\16\3\377\207\0\0\0\377\4\0\1\0\377\37,\13\377" \ + "Nq\33\377s\246'\377\370u\251(\377\2q\244'\377\12\17\3\377\222\0\0\0\377" \ + "\1\0\0\0]\202\0\0\0\0\1\0\0\0\237\224\0\0\0\377\1Y\201\37\377\371u\251" \ + "(\377\3]\206\40\377-A\17\377\5\7\2\377\207\0\0\0\377\3\2\3\1\3770E\20" \ + "\377j\232$\377\310u\251(\377\2g\225#\377\15\23\5\377\224\0\0\0\377\1" \ + "\0\0\0l\302\0\0\0\0\2\0\0\0\24\0\0\0\352\225\0\0\0\377\2\3\5\1\377Ps" \ + "\33\377\311u\251(\377\3n\237&\3777P\23\377\4\6\1\377\210\0\0\0\377\3" \ + "\13\21\4\3779R\23\377h\226$\377\367u\251(\377\1""5M\22\377\222\0\0\0" \ + "\377\4\0\0\0\256\0\0\0\0\0\0\0\4\0\0\0\354\223\0\0\0\377\1\24\34\7\377" \ + "\367u\251(\377\3p\242&\377Hg\30\377\27\"\10\377\211\0\0\0\377\2$4\14" \ + "\377c\216\"\377\311u\251(\377\2e\222#\377\21\30\6\377\224\0\0\0\377\2" \ + "\0\0\0\303\0\0\0\2\303\0\0\0\0\1\0\0\0Z\226\0\0\0\377\2\0\1\0\377;U\24" \ + "\377\312u\251(\377\3l\234%\3773J\21\377\2\3\1\377\210\0\0\0\377\4\1\1" \ + "\0\377\37-\13\377Rw\34\377u\250(\377\364u\251(\377\2d\220\"\377\0\1\0" \ + "\377\221\0\0\0\377\3\0\0\0\363\0\0\0\10\0\0\0>\224\0\0\0\377\1B_\27\377" \ + "\365u\251(\377\3b\215!\377/D\20\377\6\11\2\377\211\0\0\0\377\2\35*\12" \ + "\377]\206\40\377\312u\251(\377\2Y\201\36\377\10\14\3\377\224\0\0\0\377" \ + "\2\0\0\0\365\0\0\0*\305\0\0\0\0\1\0\0\0\224\227\0\0\0\377\2""6N\22\377" \ + "u\250(\377\312u\251(\377\2_\211\40\377\37-\13\377\212\0\0\0\377\3\26" \ + "\40\10\377Hi\31\377q\244'\377\363u\251(\377\1\33&\11\377\222\0\0\0\377" \ + "\2\0\0\0P\0\0\0\221\223\0\0\0\377\2\2\3\1\377k\232%\377\363u\251(\377" \ + "\3X\177\36\377&6\15\377\1\2\0\377\211\0\0\0\377\3\17\26\5\377Mo\32\377" \ + "u\250(\377\312u\251(\377\2Ty\35\377\6\10\2\377\225\0\0\0\377\1\0\0\0" \ + "V\306\0\0\0\0\2\0\0\0\11\0\0\0\331\227\0\0\0\377\2&7\15\377p\242&\377" \ + "\313u\251(\377\2Ty\35\377\24\35\7\377\212\0\0\0\377\3\12\16\3\3778Q\23" \ + "\377h\226$\377\361u\251(\377\1Gg\30\377\222\0\0\0\377\2\0\0\0\236\0\0" \ + "\0\337\223\0\0\0\377\1%5\15\377\361u\251(\377\3q\243'\377Gg\30\377\25" \ + "\36\7\377\212\0\0\0\377\3\10\13\3\377@]\26\377r\244'\377\313u\251(\377" \ + "\2Ca\27\377\2\3\1\377\225\0\0\0\377\1\0\0\0\251\307\0\0\0\0\2\0\0\0\7" \ + "\0\0\0\353\230\0\0\0\377\2\27\"\10\377i\227$\377\313u\251(\377\3t\247" \ + "(\377Hg\30\377\14\21\4\377\212\0\0\0\377\3\2\3\1\377'9\15\377Z\203\37" \ + "\377\357u\251(\377\2m\235%\377\2\3\1\377\221\0\0\0\377\1\0\0\0\370\224" \ + "\0\0\0\377\1Mo\32\377\357u\251(\377\3h\226$\3777O\23\377\11\15\3\377" \ + "\212\0\0\0\377\3\3\5\1\3774L\22\377m\235%\377\313u\251(\377\2s\246'\377" \ + "1F\21\377\227\0\0\0\377\1\0\0\0\270\307\0\0\0\0\1\0\0\0Z\232\0\0\0\377" \ + "\2\14\22\4\377^\207\40\377\314u\251(\377\3p\242&\3779R\23\377\4\6\1\377" \ + "\213\0\0\0\377\3\34(\11\377Rv\34\377u\250(\377\355u\251(\377\1!0\13\377" \ + "\245\0\0\0\377\2\5\7\2\377p\242&\377\355u\251(\377\3a\215!\377,\77\17" \ + "\377\3\4\1\377\213\0\0\0\377\2%6\15\377e\222#\377\314u\251(\377\2n\236" \ + "%\377\40.\13\377\230\0\0\0\377\2\0\0\0\376\0\0\0#\306\0\0\0\0\1\0\0\0" \ + "\273\233\0\0\0\377\2\3\5\1\377Jk\31\377\315u\251(\377\3j\230$\377/D\20" \ + "\377\1\1\0\377\213\0\0\0\377\3\17\26\5\377C`\27\377p\242&\377\353u\251" \ + "(\377\1Kl\32\377\245\0\0\0\377\1(:\16\377\353u\251(\377\3u\250(\377R" \ + "w\34\377\34(\11\377\214\0\0\0\377\2\32&\11\377]\206\40\377\315u\251(" \ + "\377\2b\215!\377\20\27\5\377\232\0\0\0\377\1\0\0\0\177\305\0\0\0\0\2" \ + "\0\0\0\15\0\0\0\373\234\0\0\0\377\2\0\1\0\377A^\26\377\316u\251(\377" \ + "\2X\177\36\377\26\40\10\377\214\0\0\0\377\3\15\23\5\377A^\26\377o\241" \ + "&\377\351u\251(\377\2m\235%\377\2\3\1\377\244\0\0\0\377\1Ln\32\377\351" \ + "u\251(\377\3u\250(\377Rv\34\377\33'\11\377\214\0\0\0\377\3\11\15\3\377" \ + "Dc\27\377s\246'\377\315u\251(\377\2]\206\40\377\10\14\3\377\233\0\0\0" \ + "\377\1\0\0\0\314\305\0\0\0\0\1\0\0\0\77\236\0\0\0\377\2\0\1\0\377Ca\27" \ + "\377\316u\251(\377\3t\247(\377Fe\30\377\12\16\3\377\214\0\0\0\377\3\10" \ + "\13\3\3779R\23\377k\232%\377\350u\251(\377\1\34(\11\377\243\0\0\0\377" \ + "\2\1\2\0\377l\234%\377\347u\251(\377\3r\245'\377Ii\31\377\23\34\7\377" \ + "\214\0\0\0\377\3\2\3\1\3772H\21\377m\235%\377\316u\251(\377\2_\211\40" \ + "\377\10\13\3\377\234\0\0\0\377\2\0\0\0\373\0\0\0\10\304\0\0\0\0\1\0\0" \ + "\0d\237\0\0\0\377\2\0\1\0\377Jk\31\377\317u\251(\377\3n\236%\3774L\22" \ + "\377\2\3\1\377\214\0\0\0\377\3\4\6\1\3772H\21\377h\226#\377\346u\251" \ + "(\377\1=X\25\377\243\0\0\0\377\1\32&\11\377\346u\251(\377\3q\243'\377" \ + "Ca\27\377\15\23\5\377\215\0\0\0\377\2\40.\13\377a\215!\377\317u\251(" \ + "\377\2e\222#\377\12\16\3\377\236\0\0\0\377\1\0\0\0*\304\0\0\0\0\1\0\0" \ + "\0y\240\0\0\0\377\2\4\6\1\377d\220\"\377\320u\251(\377\2c\217\"\377\"" \ + "1\14\377\215\0\0\0\377\3\3\4\1\377-B\20\377d\220\"\377\344u\251(\377" \ + "\1_\211\40\377\243\0\0\0\377\1;U\24\377\344u\251(\377\3o\240&\377>Y\25" \ + "\377\12\17\3\377\215\0\0\0\377\2\21\30\6\377Qu\34\377\320u\251(\377\2" \ + "t\250(\377\27\"\10\377\237\0\0\0\377\1\0\0\0>\304\0\0\0\0\1\0\0\0\200" \ + "\222\0\0\0\377\2\15\23\4\377\2\3\1\377\215\0\0\0\377\1@]\26\377\322u" \ + "\251(\377\2Sw\34\377\20\27\5\377\215\0\0\0\377\3\1\2\0\377(:\16\377`" \ + "\213!\377\342u\251(\377\2t\250(\377\10\14\3\377\242\0\0\0\377\1Y\200" \ + "\36\377\342u\251(\377\3l\234%\3779S\24\377\7\13\3\377\215\0\0\0\377\3" \ + "\5\7\2\377=Y\25\377r\244'\377\321u\251(\377\2`\213!\377\4\6\1\377\215" \ + "\0\0\0\377\1\17\26\5\377\221\0\0\0\377\1\0\0\0D\304\0\0\0\0\1\0\0\0s" \ + "\222\0\0\0\377\5\34(\11\377n\236%\377Nq\33\377,@\17\377\13\17\4\377\207" \ + "\0\0\0\377\3\0\1\0\377\35*\12\377Ty\35\377\324u\251(\377\3q\244'\377" \ + ";U\24\377\4\6\1\377\215\0\0\0\377\3\0\1\0\377$4\14\377\\\205\37\377\341" \ + "u\251(\377\1#2\14\377\241\0\0\0\377\2\3\5\1\377q\244'\377\340u\251(\377" \ + "\3i\230$\3774L\22\377\5\7\2\377\216\0\0\0\377\2&7\15\377g\225#\377\324" \ + "u\251(\377\3e\222#\377+>\17\377\4\6\1\377\207\0\0\0\377\5\4\6\1\377!" \ + "0\13\377Db\27\377e\222#\377@\\\26\377\221\0\0\0\377\1\0\0\0""7\304\0" \ + "\0\0\0\1\0\0\0U\223\0\0\0\377\1Ps\33\377\203u\251(\377\10f\224#\377P" \ + "s\33\377B_\26\3778P\23\3777O\23\3779S\24\377Mo\32\377e\222#\377\330u" \ + "\251(\377\2f\223#\377$4\14\377\217\0\0\0\377\2\37-\13\377Z\202\37\377" \ + "\337u\251(\377\1>Y\25\377\241\0\0\0\377\1\33'\11\377\337u\251(\377\3" \ + "h\226$\3770F\20\377\3\5\1\377\216\0\0\0\377\2\22\32\6\377U{\35\377\330" \ + "u\251(\377\3m\236%\377Sx\34\377>Y\25\377\2027O\23\377\4>Y\25\377Kl\32" \ + "\377_\212!\377s\246'\377\202u\251(\377\2l\234%\377\7\13\3\377\221\0\0" \ + "\0\377\1\0\0\0\32\304\0\0\0\0\1\0\0\0!\223\0\0\0\377\2\21\31\6\377s\246" \ + "'\377\344u\251(\377\2Sx\34\377\20\27\5\377\217\0\0\0\377\2!/\13\377\\" \ + "\205\40\377\335u\251(\377\1X\177\36\377\241\0\0\0\377\1""5M\22\377\335" \ + "u\251(\377\3j\230$\3772I\21\377\4\5\1\377\216\0\0\0\377\3\5\7\2\377>" \ + "Y\25\377r\245'\377\344u\251(\377\1""2I\21\377\221\0\0\0\377\1\0\0\0\345" \ + "\306\0\0\0\0\1\0\0\0\354\223\0\0\0\377\1=Y\25\377\345u\251(\377\3q\244" \ + "'\377\17\377\0\1\0\377\217\0\0\0\377\2\37-\13\377\\\205\40\377\332u\251" \ + "(\377\1\14\22\4\377\240\0\0\0\377\1_\211\40\377\331u\251(\377\3i\230" \ + "$\377/D\20\377\3\4\1\377\217\0\0\0\377\2\25\36\7\377Y\201\36\377\346" \ + "u\251(\377\2o\240&\377\20\27\5\377\222\0\0\0\377\1\0\0\0z\306\0\0\0\0" \ + "\1\0\0\0T\224\0\0\0\377\2\20\27\5\377o\240&\377\347u\251(\377\2Rw\34" \ + "\377\17\25\5\377\217\0\0\0\377\3\1\1\0\377'9\15\377b\215!\377\330u\251" \ + "(\377\1\40.\13\377\237\0\0\0\377\2\1\2\0\377q\243'\377\327u\251(\377" \ + "\3n\236%\3779S\24\377\6\11\2\377\217\0\0\0\377\3\4\6\1\377=X\25\377r" \ + "\245'\377\347u\251(\377\1-A\17\377\222\0\0\0\377\2\0\0\0\374\0\0\0\33" \ + "\306\0\0\0\0\2\0\0\0\6\0\0\0\353\224\0\0\0\377\2(:\16\377u\250(\377\347" \ + "u\251(\377\3p\242&\3777P\23\377\2\3\1\377\217\0\0\0\377\3\1\2\0\377-" \ + "B\20\377h\226$\377\326u\251(\377\1""0F\20\377\237\0\0\0\377\1\15\23\5" \ + "\377\326u\251(\377\3r\244'\377@]\26\377\10\14\3\377\220\0\0\0\377\2\"" \ + "1\14\377e\222#\377\350u\251(\377\1Km\32\377\223\0\0\0\377\1\0\0\0\267" \ + "\310\0\0\0\0\1\0\0\0\225\225\0\0\0\377\1""6N\23\377\351u\251(\377\2e" \ + "\222#\377!0\13\377\220\0\0\0\377\3\2\3\1\377/D\20\377j\232$\377\324u" \ + "\251(\377\1=X\25\377\237\0\0\0\377\1\33&\11\377\324u\251(\377\3s\246" \ + "'\377C`\27\377\12\16\3\377\220\0\0\0\377\2\17\26\5\377Sw\34\377\351u" \ + "\251(\377\2U{\35\377\2\3\1\377\223\0\0\0\377\1\0\0\0X\310\0\0\0\0\2\0" \ + "\0\0\33\0\0\0\365\225\0\0\0\377\1Db\27\377\352u\251(\377\2Rw\34\377\15" \ + "\23\5\377\220\0\0\0\377\3\6\10\2\3777O\23\377o\240&\377\322u\251(\377" \ + "\1Ij\31\377\237\0\0\0\377\1'8\15\377\322u\251(\377\3u\250(\377Nq\33\377" \ + "\22\32\6\377\220\0\0\0\377\3\3\5\1\377;U\24\377q\243'\377\351u\251(\377" \ + "\2`\213!\377\6\11\2\377\223\0\0\0\377\2\0\0\0\323\0\0\0\3\311\0\0\0\0" \ + "\1\0\0\0\206\225\0\0\0\377\2\2\3\1\377Tz\35\377\352u\251(\377\3m\235" \ + "%\377.B\20\377\0\1\0\377\220\0\0\0\377\3\16\25\5\377Kl\32\377t\250(\377" \ + "\320u\251(\377\1U{\35\377\237\0\0\0\377\1""3J\21\377\321u\251(\377\2" \ + "]\206\40\377\36+\12\377\221\0\0\0\377\2\31$\11\377_\211\40\377\352u\251" \ + "(\377\2j\231$\377\20\27\5\377\224\0\0\0\377\1\0\0\0K\312\0\0\0\0\2\0" \ + "\0\0\15\0\0\0\351\225\0\0\0\377\2\4\6\1\377V}\35\377\353u\251(\377\2" \ + "Z\202\37\377\25\36\7\377\221\0\0\0\377\2\26\40\10\377U{\35\377\317u\251" \ + "(\377\1[\204\37\377\237\0\0\0\377\1""9S\24\377\317u\251(\377\3e\222#" \ + "\377'9\15\377\0\1\0\377\220\0\0\0\377\3\7\13\3\377Ed\30\377t\250(\377" \ + "\352u\251(\377\2j\232$\377\23\34\7\377\224\0\0\0\377\1\0\0\0\274\314" \ + "\0\0\0\0\1\0\0\0l\226\0\0\0\377\2\3\4\1\377Sw\34\377\353u\251(\377\3" \ + "t\250(\377Fe\30\377\6\10\2\377\221\0\0\0\377\2\36,\12\377`\213!\377\315" \ + "u\251(\377\1`\213!\377\237\0\0\0\377\1=Y\25\377\315u\251(\377\3l\234" \ + "%\377/D\20\377\2\3\1\377\221\0\0\0\377\2/D\20\377m\236%\377\353u\251" \ + "(\377\2i\230$\377\21\31\6\377\224\0\0\0\377\2\0\0\0\373\0\0\0""4\315" \ + "\0\0\0\0\1\0\0\0\262\226\0\0\0\377\2\5\7\2\377W~\36\377\354u\251(\377" \ + "\2c\217\"\377\34(\12\377\221\0\0\0\377\3\3\4\1\3775M\22\377n\237&\377" \ + "\313u\251(\377\1d\221\"\377\237\0\0\0\377\1B_\27\377\313u\251(\377\3" \ + "t\250(\377Hi\31\377\13\21\4\377\221\0\0\0\377\2\14\21\4\377Pt\33\377" \ + "\354u\251(\377\2k\232%\377\25\36\7\377\225\0\0\0\377\1\0\0\0y\316\0\0" \ + "\0\0\2\0\0\0\25\0\0\0\347\226\0\0\0\377\2\4\5\1\377Rv\34\377\354u\251" \ + "(\377\3u\250(\377Ed\30\377\7\12\2\377\221\0\0\0\377\3\12\17\3\377Fe\30" \ + "\377t\247(\377\311u\251(\377\1g\224#\377\237\0\0\0\377\1Db\27\377\312" \ + "u\251(\377\2Z\202\37\377\30\"\10\377\221\0\0\0\377\3\0\1\0\377/D\20\377" \ + "n\237&\377\354u\251(\377\2g\225#\377\21\31\6\377\225\0\0\0\377\2\0\0" \ + "\0\277\0\0\0\2\317\0\0\0\0\2\0\0\0H\0\0\0\376\226\0\0\0\377\2\1\2\0\377" \ + "Gf\30\377\355u\251(\377\2k\232%\377+>\17\377\222\0\0\0\377\2\21\31\6" \ + "\377Rw\34\377\310u\251(\377\1b\216\"\377\237\0\0\0\377\1@\\\26\377\310" \ + "u\251(\377\2b\215!\377\37-\13\377\222\0\0\0\377\2\27!\10\377_\211\40" \ + "\377\355u\251(\377\2_\212!\377\13\20\4\377\225\0\0\0\377\2\0\0\0\356" \ + "\0\0\0\34\321\0\0\0\0\1\0\0\0\217\227\0\0\0\377\2\1\1\0\377Db\27\377" \ + "\356u\251(\377\2Nq\33\377\13\20\4\377\222\0\0\0\377\2&7\15\377g\224#" \ + "\377\306u\251(\377\1^\207\40\377\237\0\0\0\377\1Z\25\377s\246'\377\357u\251(\377" \ + "\2C`\27\377\0\1\0\377\227\0\0\0\377\1\0\0\0\234\327\0\0\0\0\2\0\0\0\11" \ + "\0\0\0\373\232\0\0\0\377\2\34(\12\377n\236%\377\357u\251(\377\2j\232" \ + "$\377%6\15\377\223\0\0\0\377\2\22\32\6\377V}\35\377\276u\251(\377\1\"" \ + "1\14\377\237\0\0\0\377\2\3\4\1\377r\244'\377\275u\251(\377\2g\224#\377" \ + "#3\14\377\223\0\0\0\377\2\21\31\6\377[\203\37\377\360u\251(\377\2Ca\27" \ + "\377\0\1\0\377\230\0\0\0\377\1\0\0\0\311\327\0\0\0\0\1\0\0\0+\234\0\0" \ + "\0\377\2\26\40\10\377l\234%\377\360u\251(\377\2Kl\32\377\10\13\3\377" \ + "\222\0\0\0\377\3\0\1\0\377,\77\17\377l\234%\377\274u\251(\377\1\12\16" \ + "\3\377\240\0\0\0\377\1\\\205\40\377\273u\251(\377\3t\247(\377B_\26\377" \ + "\6\10\2\377\222\0\0\0\377\3\0\1\0\3772I\21\377p\242&\377\360u\251(\377" \ + "\1>Y\25\377\232\0\0\0\377\1\0\0\0\356\327\0\0\0\0\1\0\0\0E\235\0\0\0" \ + "\377\2\22\32\6\377i\230$\377\360u\251(\377\2k\232%\377$4\14\377\223\0" \ + "\0\0\377\3\7\13\3\377C`\27\377t\250(\377\271u\251(\377\1e\222#\377\241" \ + "\0\0\0\377\1C`\27\377\272u\251(\377\2\\\205\37\377\25\36\7\377\223\0" \ + "\0\0\377\2\21\30\6\377[\204\37\377\360u\251(\377\2u\250(\3771G\21\377" \ + "\234\0\0\0\377\1\0\0\0\12\326\0\0\0\0\1\0\0\0V\236\0\0\0\377\2\25\36" \ + "\7\377k\233%\377\360u\251(\377\3u\250(\377B_\26\377\4\5\1\377\223\0\0" \ + "\0\377\2!0\13\377f\224#\377\270u\251(\377\1Mo\32\377\241\0\0\0\377\1" \ + "*=\16\377\270u\251(\377\3q\243'\3778P\23\377\2\3\1\377\223\0\0\0\377" \ + "\2(:\16\377m\236%\377\360u\251(\377\2u\250(\3772I\21\377\235\0\0\0\377" \ + "\1\0\0\0\32\326\0\0\0\0\1\0\0\0]\235\0\0\0\377\3\14\21\4\377Ca\27\377" \ + "r\245'\377\362u\251(\377\2a\215!\377\26\40\10\377\223\0\0\0\377\3\5\7" \ + "\2\377A^\26\377t\247(\377\266u\251(\377\1*=\16\377\241\0\0\0\377\2\11" \ + "\15\3\377t\247(\377\266u\251(\377\2W~\36\377\21\31\6\377\223\0\0\0\377" \ + "\2\7\13\3\377Ln\32\377\363u\251(\377\2V}\35\377\32%\11\377\234\0\0\0" \ + "\377\1\0\0\0\40\326\0\0\0\0\1\0\0\0V\222\0\0\0\377\5""2I\21\377Lm\32" \ + "\377Ca\27\377:T\24\3772H\21\377\202/D\20\377\5""6N\22\3777O\23\377Fe" \ + "\30\377^\207\40\377t\250(\377\365u\251(\377\3r\245'\3776N\23\377\1\1" \ + "\0\377\223\0\0\0\377\2\30\"\10\377_\212!\377\264u\251(\377\2s\246'\377" \ + "\10\13\3\377\242\0\0\0\377\1W~\36\377\264u\251(\377\3m\236%\377-A\17" \ + "\377\0\1\0\377\223\0\0\0\377\2\36,\12\377h\226#\377\366u\251(\377\5g" \ + "\224#\377Mo\32\3779S\24\3777O\23\3771F\21\377\202/D\20\377\5""8Q\23\377" \ + "A]\26\377Ij\31\377Fe\30\377\5\7\2\377\220\0\0\0\377\1\0\0\0\31\326\0" \ + "\0\0\0\1\0\0\0F\222\0\0\0\377\2\3\5\1\377Sw\34\377\377u\251(\377\202" \ + "u\251(\377\2Y\200\36\377\16\25\5\377\223\0\0\0\377\3\2\3\1\377;U\24\377" \ + "s\246'\377\262u\251(\377\1U{\35\377\243\0\0\0\377\1""2H\21\377\263u\251" \ + "(\377\2Sx\34\377\14\21\4\377\223\0\0\0\377\3\4\5\1\377A]\26\377t\250" \ + "(\377\377u\251(\377\3u\251(\377i\230$\377\21\31\6\377\221\0\0\0\377\1" \ + "\0\0\0\12\326\0\0\0\0\1\0\0\0%\223\0\0\0\377\2\3\5\1\377Sw\34\377\377" \ + "u\251(\377\202u\251(\377\2n\237&\377(:\16\377\224\0\0\0\377\2\27\"\10" \ + "\377a\214!\377\261u\251(\377\1);\16\377\243\0\0\0\377\2\11\15\3\377q" \ + "\244'\377\260u\251(\377\2n\237&\377-A\17\377\224\0\0\0\377\2\23\33\6" \ + "\377`\213!\377\377u\251(\377\202u\251(\377\2i\230$\377\21\31\6\377\221" \ + "\0\0\0\377\1\0\0\0\350\327\0\0\0\0\2\0\0\0\5\0\0\0\370\223\0\0\0\377" \ + "\2\1\2\0\377Mo\32\377\377u\251(\377\203u\251(\377\2Jk\31\377\6\10\2\377" \ + "\223\0\0\0\377\3\2\3\1\3777O\23\377r\245'\377\256u\251(\377\2h\226#\377" \ + "\2\3\1\377\244\0\0\0\377\1Gf\30\377\257u\251(\377\2Pt\33\377\13\17\4" \ + "\377\224\0\0\0\377\2""3J\21\377r\244'\377\377u\251(\377\202u\251(\377" \ + "\2f\223#\377\16\24\5\377\222\0\0\0\377\1\0\0\0\301\330\0\0\0\0\1\0\0" \ + "\0\302\224\0\0\0\377\2\1\2\0\377Mo\32\377\377u\251(\377\203u\251(\377" \ + "\2d\220\"\377\26\40\10\377\224\0\0\0\377\2\25\36\7\377_\211\40\377\255" \ + "u\251(\377\1""8P\23\377\245\0\0\0\377\2\24\34\7\377u\250(\377\254u\251" \ + "(\377\2m\235%\377'8\15\377\224\0\0\0\377\2\10\13\3\377Pt\33\377\377u" \ + "\251(\377\203u\251(\377\2f\223#\377\16\24\5\377\223\0\0\0\377\1\0\0\0" \ + "\206\330\0\0\0\0\1\0\0\0\200\225\0\0\0\377\2\3\5\1\377Sw\34\377\377u" \ + "\251(\377\203u\251(\377\2p\242&\377,@\17\377\224\0\0\0\377\3\4\6\1\377" \ + "A^\26\377t\250(\377\252u\251(\377\2n\237&\377\11\15\3\377\246\0\0\0\377" \ + "\1Tz\35\377\253u\251(\377\2X\177\36\377\17\26\5\377\224\0\0\0\377\2\26" \ + "\40\10\377c\217\"\377\377u\251(\377\203u\251(\377\2i\227$\377\21\31\6" \ + "\377\224\0\0\0\377\1\0\0\0D\330\0\0\0\0\1\0\0\0)\226\0\0\0\377\2\2\3" \ + "\1\377Hi\31\377\377u\251(\377\204u\251(\377\2Jk\31\377\6\10\2\377\224" \ + "\0\0\0\377\2\34)\12\377g\224#\377\251u\251(\377\1""7O\23\377\247\0\0" \ + "\0\377\2\26\37\7\377t\250(\377\250u\251(\377\3r\244'\3774K\22\377\1\1" \ + "\0\377\224\0\0\0\377\2""0F\20\377q\244'\377\377u\251(\377\203u\251(\377" \ + "\2a\214!\377\16\24\5\377\224\0\0\0\377\2\0\0\0\350\0\0\0\3\331\0\0\0" \ + "\0\1\0\0\0\275\227\0\0\0\377\2:T\24\377u\250(\377\377u\251(\377\203u" \ + "\251(\377\2c\217\"\377\25\36\7\377\224\0\0\0\377\2\7\13\3\377Mo\32\377" \ + "\247u\251(\377\2h\226#\377\4\6\1\377\250\0\0\0\377\1Ii\31\377\247u\251" \ + "(\377\2b\215!\377\26\37\7\377\224\0\0\0\377\2\6\11\2\377Nq\33\377\377" \ + "u\251(\377\204u\251(\377\2W}\36\377\7\13\3\377\225\0\0\0\377\1\0\0\0" \ + "\202\332\0\0\0\0\1\0\0\0L\230\0\0\0\377\2,\77\17\377s\246'\377\377u\251" \ + "(\377\203u\251(\377\2p\242&\377*<\16\377\225\0\0\0\377\2,\77\17\377o" \ + "\240&\377\245u\251(\377\1'8\15\377\251\0\0\0\377\2\14\21\4\377m\236%" \ + "\377\244u\251(\377\3u\250(\377Ec\30\377\4\6\1\377\224\0\0\0\377\2\24" \ + "\34\7\377c\217\"\377\377u\251(\377\204u\251(\377\2Jk\31\377\3\4\1\377" \ + "\225\0\0\0\377\2\0\0\0\366\0\0\0\34\333\0\0\0\0\1\0\0\0\264\230\0\0\0" \ + "\377\2\32&\11\377k\233%\377\377u\251(\377\204u\251(\377\2Jk\31\377\5" \ + "\7\2\377\224\0\0\0\377\2\15\23\5\377X\177\36\377\243u\251(\377\1Hh\31" \ + "\377\253\0\0\0\377\1$4\14\377\243u\251(\377\2i\227$\377\37,\13\377\225" \ + "\0\0\0\377\2.C\20\377q\244'\377\377u\251(\377\203u\251(\377\2t\250(\377" \ + "3J\21\377\227\0\0\0\377\1\0\0\0z\334\0\0\0\0\2\0\0\0#\0\0\0\370\230\0" \ + "\0\0\377\2\21\30\6\377d\220\"\377\377u\251(\377\204u\251(\377\2_\211" \ + "\40\377\20\27\5\377\224\0\0\0\377\3\0\1\0\3773J\21\377r\245'\377\240" \ + "u\251(\377\2d\220\"\377\5\7\2\377\254\0\0\0\377\1Ii\31\377\241u\251(" \ + "\377\2Qu\34\377\11\15\3\377\224\0\0\0\377\2\4\6\1\377Jk\31\377\377u\251" \ + "(\377\204u\251(\377\2q\244'\377'8\15\377\227\0\0\0\377\2\0\0\0\331\0" \ + "\0\0\6\335\0\0\0\0\1\0\0\0\203\231\0\0\0\377\2\14\21\4\377Y\201\36\377" \ + "\377u\251(\377\204u\251(\377\2k\232%\377\36,\12\377\225\0\0\0\377\2\34" \ + ")\12\377g\225#\377\236u\251(\377\2q\244'\377\33'\11\377\255\0\0\0\377" \ + "\2\7\13\3\377b\216\"\377\236u\251(\377\3r\244'\3774L\22\377\0\1\0\377" \ + "\224\0\0\0\377\2\14\21\4\377Z\202\37\377\377u\251(\377\204u\251(\377" \ + "\2k\232%\377\37,\13\377\227\0\0\0\377\2\0\0\0\375\0\0\0I\336\0\0\0\0" \ + "\2\0\0\0\1\0\0\0\253\231\0\0\0\377\3\2\3\1\377>Y\25\377u\250(\377\377" \ + "u\251(\377\203u\251(\377\3t\247(\3776N\23\377\0\1\0\377\224\0\0\0\377" \ + "\2\10\14\3\377Rv\34\377\234u\251(\377\2t\250(\377'8\15\377\257\0\0\0" \ + "\377\2\17\25\5\377j\230$\377\234u\251(\377\2e\222#\377\27\"\10\377\225" \ + "\0\0\0\377\2\34)\12\377j\232$\377\377u\251(\377\204u\251(\377\2X\177" \ + "\36\377\13\21\4\377\230\0\0\0\377\1\0\0\0w\340\0\0\0\0\2\0\0\0\15\0\0" \ + "\0\324\232\0\0\0\377\2\35*\12\377j\230$\377\377u\251(\377\204u\251(\377" \ + "\2Sw\34\377\6\11\2\377\225\0\0\0\377\2/D\20\377r\244'\377\232u\251(\377" \ + "\1/D\20\377\261\0\0\0\377\2\23\34\7\377m\236%\377\232u\251(\377\2Lm\32" \ + "\377\6\10\2\377\225\0\0\0\377\2""7O\23\377t\247(\377\377u\251(\377\203" \ + "u\251(\377\3s\246'\3773J\21\377\0\1\0\377\230\0\0\0\377\2\0\0\0\247\0" \ + "\0\0\1\341\0\0\0\0\2\0\0\0&\0\0\0\344\232\0\0\0\377\2\15\23\4\377Z\202" \ + "\37\377\377u\251(\377\204u\251(\377\2]\207\40\377\15\23\4\377\225\0\0" \ + "\0\377\2\33'\11\377h\226$\377\230u\251(\377\1:T\24\377\263\0\0\0\377" \ + "\2\34)\12\377o\240&\377\227u\251(\377\3s\246'\3774K\22\377\0\1\0\377" \ + "\224\0\0\0\377\2\2\3\1\377Dc\27\377\377u\251(\377\204u\251(\377\2k\232" \ + "%\377\40.\13\377\231\0\0\0\377\2\0\0\0\303\0\0\0\14\343\0\0\0\0\2\0\0" \ + "\0\35\0\0\0\332\232\0\0\0\377\3\0\1\0\3777O\23\377t\247(\377\377u\251" \ + "(\377\203u\251(\377\2l\234%\377\36,\12\377\225\0\0\0\377\2\6\11\2\377" \ + "Nq\33\377\225u\251(\377\2t\250(\377/D\20\377\265\0\0\0\377\2\26\40\10" \ + "\377k\233%\377\225u\251(\377\2d\221\"\377\26\40\10\377\225\0\0\0\377" \ + "\2\13\20\4\377[\203\37\377\377u\251(\377\204u\251(\377\2Ty\35\377\11" \ + "\15\3\377\231\0\0\0\377\2\0\0\0\257\0\0\0\7\345\0\0\0\0\2\0\0\0\35\0" \ + "\0\0\330\233\0\0\0\377\2!0\13\377h\226$\377\377u\251(\377\203u\251(\377" \ + "\2r\244'\377,@\17\377\225\0\0\0\377\3\1\1\0\3779R\23\377t\247(\377\222" \ + "u\251(\377\2t\247(\377/D\20\377\267\0\0\0\377\2\25\36\7\377j\231$\377" \ + "\223u\251(\377\2Sw\34\377\11\15\3\377\225\0\0\0\377\2\24\35\7\377e\222" \ + "#\377\377u\251(\377\203u\251(\377\3r\245'\3779S\24\377\1\2\0\377\231" \ + "\0\0\0\377\2\0\0\0\262\0\0\0\10\347\0\0\0\0\2\0\0\0\14\0\0\0\247\233" \ + "\0\0\0\377\3\7\12\2\377Hh\31\377u\250(\377\377u\251(\377\203u\251(\377" \ + "\2A^\26\377\1\2\0\377\225\0\0\0\377\2\36+\12\377j\231$\377\220u\251(" \ + "\377\2k\232%\377\37,\13\377\271\0\0\0\377\2\14\22\4\377Z\202\37\377\220" \ + "u\251(\377\3s\246'\3777P\23\377\0\1\0\377\225\0\0\0\377\2$4\14\377o\240" \ + "&\377\377u\251(\377\203u\251(\377\2^\210\40\377\25\36\7\377\231\0\0\0" \ + "\377\3\0\0\0\374\0\0\0w\0\0\0\1\352\0\0\0\0\2\0\0\0f\0\0\0\371\233\0" \ + "\0\0\377\2\33'\11\377d\220\"\377\377u\251(\377\203u\251(\377\2V|\35\377" \ + "\7\12\2\377\225\0\0\0\377\2\11\15\3\377W}\36\377\216u\251(\377\2U{\35" \ + "\377\12\16\3\377\273\0\0\0\377\3\1\2\0\377;U\24\377t\250(\377\215u\251" \ + "(\377\2j\230$\377\33'\11\377\226\0\0\0\377\2;U\24\377u\250(\377\377u" \ + "\251(\377\202u\251(\377\3p\242&\377/D\20\377\0\1\0\377\231\0\0\0\377" \ + "\2\0\0\0\347\0\0\0@\355\0\0\0\0\1\0\0\0\214\234\0\0\0\377\3\6\11\2\377" \ + "Gf\30\377u\250(\377\377u\251(\377\202u\251(\377\2]\206\40\377\13\20\4" \ + "\377\225\0\0\0\377\2\3\5\1\377Gg\30\377\213u\251(\377\3s\246'\377=X\25" \ + "\377\2\3\1\377\276\0\0\0\377\2%5\15\377j\230$\377\213u\251(\377\2_\211" \ + "\40\377\17\25\5\377\225\0\0\0\377\2\1\2\0\377C`\27\377\377u\251(\377" \ + "\203u\251(\377\2]\207\40\377\24\35\7\377\233\0\0\0\377\1\0\0\0S\356\0" \ + "\0\0\0\1\0\0\0\216\236\0\0\0\377\2\33&\11\377c\217\"\377\377u\251(\377" \ + "\202u\251(\377\2j\230$\377\27!\10\377\226\0\0\0\377\2*<\16\377p\242&" \ + "\377\210u\251(\377\2U{\35\377\20\27\5\377\301\0\0\0\377\3\5\7\2\377>" \ + "Z\25\377s\246'\377\210u\251(\377\2Gg\30\377\3\5\1\377\225\0\0\0\377\2" \ + "\7\12\2\377V|\35\377\377u\251(\377\202u\251(\377\3o\241&\377/D\20\377" \ + "\0\1\0\377\234\0\0\0\377\1\0\0\0T\356\0\0\0\0\1\0\0\0\230\236\0\0\0\377" \ + "\2\2\3\1\377Ca\27\377\377u\251(\377\203u\251(\377\2n\236%\377\36+\12" \ + "\377\226\0\0\0\377\2\33'\11\377j\230$\377\205u\251(\377\3l\234%\377/" \ + "D\20\377\1\1\0\377\304\0\0\0\377\2\32&\11\377_\211\40\377\205u\251(\377" \ + "\2t\247(\3775M\22\377\226\0\0\0\377\2\13\21\4\377]\207\40\377\377u\251" \ + "(\377\203u\251(\377\2_\211\40\377\13\17\4\377\235\0\0\0\377\1\0\0\0^" \ + "\356\0\0\0\0\1\0\0\0\222\232\0\0\0\377\5\1\1\0\377\17\25\5\377$4\14\377" \ + "Ca\27\377j\230$\377\377u\251(\377\205u\251(\377\2r\245'\377*=\16\377" \ + "\226\0\0\0\377\2\14\21\4\377[\204\37\377\202u\251(\377\3o\241&\377;U" \ + "\24\377\6\11\2\377\307\0\0\0\377\3\1\1\0\377);\16\377d\220\"\377\202" \ + "u\251(\377\2l\234%\377\37-\13\377\226\0\0\0\377\2\23\33\6\377g\224#\377" \ + "\377u\251(\377\205u\251(\377\5q\244'\377Nq\33\377-A\17\377\24\35\7\377" \ + "\3\5\1\377\231\0\0\0\377\1\0\0\0W\356\0\0\0\0\1\0\0\0z\222\0\0\0\377" \ + "\11+>\17\377Nq\33\377Ty\35\377V|\35\377Z\203\37\377_\212!\377e\222#\377" \ + "l\234%\377q\244'\377\377u\251(\377\212u\251(\377\2t\250(\3772H\21\377" \ + "\226\0\0\0\377\4\3\5\1\377Fe\30\377B_\27\377\12\17\3\377\313\0\0\0\377" \ + "\4\2\3\1\377/D\20\377Tz\35\377\17\26\5\377\226\0\0\0\377\2\27\"\10\377" \ + "l\234%\377\377u\251(\377\212u\251(\377\5t\247(\377m\236%\377g\224#\377" \ + "b\215!\377]\206\40\377\202V|\35\377\3Nq\33\377A]\26\377\3\4\1\377\220" \ + "\0\0\0\377\1\0\0\0>\356\0\0\0\0\1\0\0\0`\222\0\0\0\377\2\0\1\0\377@]" \ + "\26\377\377u\251(\377\223u\251(\377\2>Z\25\377\0\1\0\377\374\0\0\0\377" \ + "\2!0\13\377p\242&\377\377u\251(\377\222u\251(\377\2^\207\40\377\13\17" \ + "\4\377\221\0\0\0\377\1\0\0\0%\356\0\0\0\0\1\0\0\0,\224\0\0\0\377\2""3" \ + "J\21\377u\250(\377\377u\251(\377\222u\251(\377\2Fe\30\377\1\1\0\377\372" \ + "\0\0\0\377\2'9\15\377r\245'\377\377u\251(\377\222u\251(\377\2Ty\35\377" \ + "\5\7\2\377\221\0\0\0\377\2\0\0\0\355\0\0\0\1\356\0\0\0\0\2\0\0\0\1\0" \ + "\0\0\355\224\0\0\0\377\2/D\20\377r\245'\377\377u\251(\377\222u\251(\377" \ + "\2Ij\31\377\2\3\1\377\370\0\0\0\377\2*<\16\377s\246'\377\377u\251(\377" \ + "\222u\251(\377\2Mo\32\377\3\5\1\377\222\0\0\0\377\1\0\0\0\263\360\0\0" \ + "\0\0\1\0\0\0\253\225\0\0\0\377\2\32&\11\377i\227$\377\377u\251(\377\222" \ + "u\251(\377\2Os\33\377\2\3\1\377\366\0\0\0\377\2/D\20\377t\250(\377\377" \ + "u\251(\377\221u\251(\377\2s\246'\3773J\22\377\224\0\0\0\377\1\0\0\0n" \ + "\360\0\0\0\0\1\0\0\0M\226\0\0\0\377\2\10\14\3\377Ty\35\377\377u\251(" \ + "\377\222u\251(\377\2Tz\35\377\4\6\1\377\364\0\0\0\377\1""8P\23\377\377" \ + "u\251(\377\222u\251(\377\2f\223#\377\27!\10\377\224\0\0\0\377\2\0\0\0" \ + "\372\0\0\0\25\360\0\0\0\0\2\0\0\0\6\0\0\0\351\226\0\0\0\377\3\1\2\0\377" \ + "\17\377\2\3\1\377\240\0\0\0\377\2\0\0\0\270\0\0\0\22\377" \ + "\0\0\0\0\206\0\0\0\0\2\0\0\0\15\0\0\0\255\243\0\0\0\377\2\37-\13\377" \ + "\\\205\40\377\376u\251(\377\1A^\26\377\351\0\0\0\377\1\36,\12\377\376" \ + "u\251(\377\3j\230$\377/D\20\377\3\4\1\377\240\0\0\0\377\3\0\0\0\375\0" \ + "\0\0w\0\0\0\1\377\0\0\0\0\210\0\0\0\0\3\0\0\0\3\0\0\0{\0\0\0\371\242" \ + "\0\0\0\377\2\40.\13\377o\240&\377\375u\251(\377\1\27!\10\377\351\0\0" \ + "\0\377\2\1\1\0\377h\226#\377\375u\251(\377\2=W\25\377\2\3\1\377\240\0" \ + "\0\0\377\2\0\0\0\352\0\0\0S\377\0\0\0\0\214\0\0\0\0\2\0\0\0#\0\0\0\302" \ + "\237\0\0\0\377\2\24\34\7\377Km\32\377\376u\251(\377\1^\207\40\377\353" \ + "\0\0\0\377\1;U\24\377\376u\251(\377\3_\211\40\377\"2\14\377\1\1\0\377" \ + "\235\0\0\0\377\2\0\0\0\231\0\0\0\20\377\0\0\0\0\216\0\0\0\0\3\0\0\0\3" \ + "\0\0\0w\0\0\0\370\231\0\0\0\377\5\0\1\0\377\21\31\6\3772H\21\377X\177" \ + "\36\377u\250(\377\377u\251(\377\1(:\16\377\353\0\0\0\377\2\11\15\3\377" \ + "p\242&\377\377u\251(\377\4e\222#\377=X\25\377\33&\11\377\3\4\1\377\230" \ + "\0\0\0\377\2\0\0\0\345\0\0\0J\377\0\0\0\0\222\0\0\0\0\2\0\0\0""2\0\0" \ + "\0\340\221\0\0\0\377\2\6\11\2\377Hg\30\377\204^\207\40\377\2^\210\40" \ + "\377n\237&\377\377u\251(\377\203u\251(\377\2e\222#\377\1\2\0\377\354" \ + "\0\0\0\377\1Ca\27\377\377u\251(\377\203u\251(\377\2s\246'\377a\214!\377" \ + "\204^\207\40\377\2W}\36\377\25\36\7\377\220\0\0\0\377\2\0\0\0\300\0\0" \ + "\0\31\377\0\0\0\0\224\0\0\0\0\1\0\0\0\205\222\0\0\0\377\3\3\5\1\377@" \ + "]\26\377u\250(\377\377u\251(\377\207u\251(\377\1""0E\20\377\355\0\0\0" \ + "\377\2\17\25\5\377s\246'\377\377u\251(\377\207u\251(\377\2Y\200\36\377" \ + "\16\25\5\377\221\0\0\0\377\1\0\0\0L\377\0\0\0\0\225\0\0\0\0\1\0\0\0J" \ + "\224\0\0\0\377\2\37,\13\377c\217\"\377\377u\251(\377\205u\251(\377\2" \ + "d\221\"\377\3\4\1\377\356\0\0\0\377\1Ec\30\377\377u\251(\377\205u\251" \ + "(\377\3o\240&\3775M\22\377\1\2\0\377\221\0\0\0\377\2\0\0\0\375\0\0\0" \ + "\21\377\0\0\0\0\225\0\0\0\0\2\0\0\0\17\0\0\0\374\224\0\0\0\377\3\1\1" \ + "\0\377+>\17\377j\231$\377\377u\251(\377\203u\251(\377\1#2\14\377\357" \ + "\0\0\0\377\2\10\13\3\377l\234%\377\377u\251(\377\202u\251(\377\3r\245" \ + "'\377>Z\25\377\10\13\3\377\223\0\0\0\377\1\0\0\0\322\377\0\0\0\0\227" \ + "\0\0\0\0\1\0\0\0\304\226\0\0\0\377\3\10\14\3\377@]\26\377o\241&\377\377" \ + "u\251(\377\1W~\36\377\361\0\0\0\377\1""4K\22\377\377u\251(\377\3u\250" \ + "(\377Rv\34\377\26\37\7\377\225\0\0\0\377\1\0\0\0\211\377\0\0\0\0\227" \ + "\0\0\0\0\1\0\0\0h\230\0\0\0\377\3\10\14\3\377:T\24\377l\234%\377\374" \ + "u\251(\377\2r\245'\377\25\36\7\377\361\0\0\0\377\2\3\4\1\377`\213!\377" \ + "\374u\251(\377\3s\246'\377Jk\31\377\24\35\7\377\227\0\0\0\377\1\0\0\0" \ + "-\377\0\0\0\0\227\0\0\0\0\2\0\0\0\22\0\0\0\371\231\0\0\0\377\3\5\7\2" \ + "\3771F\21\377`\213!\377\372u\251(\377\1""8Q\23\377\363\0\0\0\377\2\27" \ + "!\10\377s\246'\377\371u\251(\377\3k\233%\377\77[\26\377\16\24\5\377\230" \ + "\0\0\0\377\1\0\0\0\323\377\0\0\0\0\231\0\0\0\0\1\0\0\0\253\234\0\0\0" \ + "\377\3\23\34\7\377C`\27\377o\240&\377\366u\251(\377\2Y\200\36\377\1\1" \ + "\0\377\364\0\0\0\377\1""8R\23\377\366u\251(\377\4t\247(\377Nq\33\377" \ + "\37-\13\377\1\1\0\377\232\0\0\0\377\1\0\0\0q\377\0\0\0\0\231\0\0\0\0" \ + "\2\0\0\0)\0\0\0\374\235\0\0\0\377\4\10\13\3\377,@\17\377Sw\34\377r\244" \ + "'\377\362u\251(\377\2o\240&\377\22\33\6\377\365\0\0\0\377\2\2\3\1\377" \ + "\\\205\40\377\363u\251(\377\3^\210\40\3778Q\23\377\21\31\6\377\234\0" \ + "\0\0\377\2\0\0\0\343\0\0\0\7\377\0\0\0\0\232\0\0\0\0\1\0\0\0\245\240" \ + "\0\0\0\377\4\4\6\1\377#3\14\377Jk\31\377o\240&\377\356u\251(\377\2t\247" \ + "(\377\40.\13\377\367\0\0\0\377\2\13\17\4\377h\226$\377\356u\251(\377" \ + "\4s\246'\377Rw\34\377+>\17\377\12\16\3\377\237\0\0\0\377\1\0\0\0j\377" \ + "\0\0\0\0\233\0\0\0\0\2\0\0\0'\0\0\0\367\242\0\0\0\377\4\4\5\1\377#3\14" \ + "\377Jk\31\377n\237&\377\353u\251(\377\1""8Q\23\377\371\0\0\0\377\2\26" \ + "\40\10\377p\242&\377\352u\251(\377\4s\246'\377Rw\34\377+>\17\377\11\15" \ + "\3\377\241\0\0\0\377\2\0\0\0\332\0\0\0\10\377\0\0\0\0\234\0\0\0\0\1\0" \ + "\0\0p\245\0\0\0\377\4\5\7\2\377&6\15\377Jk\31\377m\235%\377\347u\251" \ + "(\377\2Np\33\377\1\1\0\377\372\0\0\0\377\2,\77\17\377u\250(\377\346u" \ + "\251(\377\4s\246'\377U{\35\3771F\21\377\14\22\4\377\243\0\0\0\377\2\0" \ + "\0\0\373\0\0\0""8\377\0\0\0\0\236\0\0\0\0\1\0\0\0\235\247\0\0\0\377\4" \ + "\1\1\0\377\27\"\10\377;U\24\377b\215!\377\343u\251(\377\2Sx\34\377\2" \ + "\3\1\377\374\0\0\0\377\1""1F\21\377\343u\251(\377\4j\232$\377Fe\30\377" \ + "#3\14\377\4\6\1\377\246\0\0\0\377\1\0\0\0i\377\0\0\0\0\237\0\0\0\0\2" \ + "\0\0\0\13\0\0\0\305\252\0\0\0\377\4\20\27\5\3773J\21\377Z\202\37\377" \ + "t\250(\377\336u\251(\377\2Y\201\37\377\4\6\1\377\376\0\0\0\377\1=W\25" \ + "\377\337u\251(\377\4d\220\"\377>Z\25\377\34(\11\377\1\2\0\377\250\0\0" \ + "\0\377\1\0\0\0\225\377\0\0\0\0\241\0\0\0\0\2\0\0\0\16\0\0\0\307\253\0" \ + "\0\0\377\2\25\36\7\377q\244'\377\335u\251(\377\2\\\205\37\377\11\15\3" \ + "\377\377\0\0\0\377\2\0\1\0\377A^\26\377\336u\251(\377\1""6N\22\377\252" \ + "\0\0\0\377\2\0\0\0\230\0\0\0\1\377\0\0\0\0\242\0\0\0\0\2\0\0\0\7\0\0" \ + "\0\247\251\0\0\0\377\2\7\12\2\377b\215!\377\335u\251(\377\2V|\35\377" \ + "\6\10\2\377\377\0\0\0\377\203\0\0\0\377\1""8Q\23\377\335u\251(\377\2" \ + "r\244'\377\32&\11\377\247\0\0\0\377\2\0\0\0\375\0\0\0o\377\0\0\0\0\245" \ + "\0\0\0\0\3\0\0\0\3\0\0\0~\0\0\0\373\246\0\0\0\377\2\6\11\2\377W~\36\377" \ + "\335u\251(\377\2Mo\32\377\3\5\1\377\377\0\0\0\377\205\0\0\0\377\2.C\20" \ + "\377s\246'\377\334u\251(\377\2k\233%\377\26\40\10\377\245\0\0\0\377\2" \ + "\0\0\0\354\0\0\0S\377\0\0\0\0\250\0\0\0\0\2\0\0\0""5\0\0\0\313\244\0" \ + "\0\0\377\2\26\40\10\377a\215!\377\334u\251(\377\3u\250(\377:T\24\377" \ + "\0\1\0\377\377\0\0\0\377\207\0\0\0\377\2\37,\13\377m\235%\377\334u\251" \ + "(\377\2o\240&\377,\77\17\377\243\0\0\0\377\2\0\0\0\252\0\0\0\32\377\0" \ + "\0\0\0\252\0\0\0\0\3\0\0\0\2\0\0\0c\0\0\0\344\237\0\0\0\377\4\0\1\0\377" \ + "\33&\11\377Jk\31\377s\246'\377\334u\251(\377\2p\242&\377&7\15\377\377" \ + "\0\0\0\377\212\0\0\0\377\2\21\31\6\377c\216\"\377\335u\251(\377\3\\\205" \ + "\37\377'9\15\377\4\6\1\377\236\0\0\0\377\2\0\0\0\315\0\0\0A\377\0\0\0" \ + "\0\256\0\0\0\0\3\0\0\0\11\0\0\0r\0\0\0\347\232\0\0\0\377\4\15\23\4\377" \ + "2H\21\377Nq\33\377j\231$\377\336u\251(\377\2_\211\40\377\22\32\6\377" \ + "\377\0\0\0\377\214\0\0\0\377\2\6\10\2\377Hi\31\377\336u\251(\377\4p\242" \ + "&\377W~\36\377;U\24\377\32%\11\377\231\0\0\0\377\3\0\0\0\321\0\0\0S\0" \ + "\0\0\1\377\0\0\0\0\261\0\0\0\0\4\0\0\0\5\0\0\0V\0\0\0\276\0\0\0\375\227" \ + "\0\0\0\377\3\2\3\1\377,@\17\377e\222#\377\335u\251(\377\3u\250(\377A" \ + "^\26\377\3\5\1\377\377\0\0\0\377\217\0\0\0\377\2(:\16\377n\237&\377\335" \ + "u\251(\377\3o\241&\377>Y\25\377\11\15\3\377\226\0\0\0\377\3\0\0\0\367" \ + "\0\0\0\246\0\0\0=\377\0\0\0\0\267\0\0\0\0\4\0\0\0\35\0\0\0s\0\0\0\313" \ + "\0\0\0\376\226\0\0\0\377\4\2\3\1\377&7\15\377V|\35\377u\250(\377\331" \ + "u\251(\377\2b\216\"\377\34)\12\377\377\0\0\0\377\222\0\0\0\377\2\14\22" \ + "\4\377Pt\33\377\332u\251(\377\3d\220\"\3775L\22\377\11\15\3\377\225\0" \ + "\0\0\377\4\0\0\0\371\0\0\0\267\0\0\0_\0\0\0\17\377\0\0\0\0\274\0\0\0" \ + "\0\3\0\0\0\31\0\0\0c\0\0\0\264\227\0\0\0\377\4\20\27\5\3774K\22\377V" \ + "}\35\377s\246'\377\324u\251(\377\3r\244'\377:T\24\377\3\5\1\377\377\0" \ + "\0\0\377\225\0\0\0\377\2%5\15\377h\226$\377\325u\251(\377\4a\214!\377" \ + ">Z\25\377\33'\11\377\0\1\0\377\224\0\0\0\377\4\0\0\0\373\0\0\0\234\0" \ + "\0\0R\0\0\0\15\377\0\0\0\0\301\0\0\0\0\2\0\0\0\6\0\0\0\363\231\0\0\0" \ + "\377\5\5\7\2\377\37,\13\377;U\24\377Ty\35\377g\224#\377\317u\251(\377" \ + "\2Nq\33\377\17\26\5\377\377\0\0\0\377\230\0\0\0\377\3\5\7\2\377;U\24" \ + "\377p\242&\377\316u\251(\377\5m\236%\377Y\201\37\377Ca\27\377'9\15\377" \ + "\13\20\4\377\230\0\0\0\377\1\0\0\0\300\377\0\0\0\0\305\0\0\0\0\1\0\0" \ + "\0\263\236\0\0\0\377\10\6\11\2\377\31$\11\377-B\20\377@]\26\377Mo\32" \ + "\377Y\201\36\377d\220\"\377p\242&\377\305u\251(\377\2\\\205\40\377\34" \ + "(\12\377\377\0\0\0\377\234\0\0\0\377\3\15\23\4\377Ij\31\377t\247(\377" \ + "\304u\251(\377\10s\246'\377h\226$\377\\\205\37\377Qu\34\377Dc\27\377" \ + "3J\22\377\37-\13\377\14\21\4\377\235\0\0\0\377\1\0\0\0y\377\0\0\0\0\305" \ + "\0\0\0\0\1\0\0\0e\246\0\0\0\377\14\6\10\2\377\20\27\5\377\27\"\10\377" \ + "\37-\13\377'8\15\377/D\20\3778R\23\377C`\27\377Mo\32\377X\177\36\377" \ + "d\220\"\377t\247(\377\267u\251(\377\2Z\202\37\377!/\13\377\377\0\0\0" \ + "\377\240\0\0\0\377\3\21\31\6\377Ii\31\377s\246'\377\267u\251(\377\13" \ + "i\230$\377Z\203\37\377Qu\34\377Ed\30\377;U\24\3771G\21\377)<\16\377!" \ + "0\13\377\32%\11\377\22\33\6\377\13\17\4\377\245\0\0\0\377\1\0\0\0)\377" \ + "\0\0\0\0\305\0\0\0\0\2\0\0\0\13\0\0\0\362\260\0\0\0\377\5\5\7\2\377\30" \ + "#\10\377.C\20\377Kl\32\377n\236%\377\260u\251(\377\3t\250(\377Rw\34\377" \ + "\35*\12\377\377\0\0\0\377\244\0\0\0\377\3\17\26\5\377Ca\27\377o\240&" \ + "\377\260u\251(\377\5s\246'\377V}\35\3775M\22\377\37-\13\377\12\16\3\377" \ + "\257\0\0\0\377\1\0\0\0\303\377\0\0\0\0\307\0\0\0\0\1\0\0\0\230\264\0" \ + "\0\0\377\2\6\11\2\377Mo\32\377\255u\251(\377\3o\240&\377Db\27\377\21" \ + "\31\6\377\377\0\0\0\377\250\0\0\0\377\3\7\12\2\3775L\22\377e\222#\377" \ + "\255u\251(\377\2e\222#\377\22\33\6\377\263\0\0\0\377\1\0\0\0\\\377\0" \ + "\0\0\0\307\0\0\0\0\2\0\0\0\31\0\0\0\366\264\0\0\0\377\1Tz\35\377\253" \ + "u\251(\377\3Z\203\37\377-A\17\377\5\7\2\377\377\0\0\0\377\254\0\0\0\377" \ + "\4\1\1\0\377\37-\13\377Mo\32\377r\244'\377\252u\251(\377\2p\242&\377" \ + "\10\14\3\377\262\0\0\0\377\2\0\0\0\321\0\0\0\2\377\0\0\0\0\310\0\0\0" \ + "\0\1\0\0\0\210\263\0\0\0\377\1!/\13\377\251u\251(\377\3d\220\"\377;U" \ + "\24\377\22\33\6\377\377\0\0\0\377\262\0\0\0\377\4\11\15\3\377/D\20\377" \ + "X\177\36\377t\250(\377\250u\251(\377\1Dc\27\377\262\0\0\0\377\1\0\0\0" \ + "K\377\0\0\0\0\311\0\0\0\0\2\0\0\0\7\0\0\0\323\261\0\0\0\377\2\14\22\4" \ + "\377i\227$\377\245u\251(\377\4t\247(\377[\204\37\377;U\24\377\30\"\10" \ + "\377\377\0\0\0\377\270\0\0\0\377\4\14\22\4\3771F\21\377Qu\34\377o\241" \ + "&\377\245u\251(\377\2t\250(\377%5\15\377\260\0\0\0\377\1\0\0\0\236\377" \ + "\0\0\0\0\313\0\0\0\0\2\0\0\0\40\0\0\0\352\257\0\0\0\377\2\13\21\4\377" \ + "`\213!\377\243u\251(\377\4h\226#\377Hg\30\377'8\15\377\10\13\3\377\377" \ + "\0\0\0\377\276\0\0\0\377\5\2\3\1\377\35*\12\377=Y\25\377^\210\40\377" \ + "u\250(\377\242u\251(\377\2p\242&\377\37-\13\377\256\0\0\0\377\2\0\0\0" \ + "\310\0\0\0\10\377\0\0\0\0\314\0\0\0\0\2\0\0\0B\0\0\0\365\255\0\0\0\377" \ + "\2\33&\11\377g\224#\377\237u\251(\377\5s\246'\377_\212!\377Gf\30\377" \ + ".B\20\377\23\34\7\377\377\0\0\0\377\306\0\0\0\377\5\12\17\3\377'8\15" \ + "\377\77[\26\377X\177\36\377o\240&\377\237u\251(\377\3r\245'\3772I\21" \ + "\377\0\1\0\377\253\0\0\0\377\2\0\0\0\336\0\0\0\35\377\0\0\0\0\316\0\0" \ + "\0\0\2\0\0\0>\0\0\0\360\252\0\0\0\377\3\2\3\1\377=W\25\377t\247(\377" \ + "\233u\251(\377\6r\244'\377`\213!\377Mo\32\3774K\22\377\34(\11\377\5\7" \ + "\2\377\377\0\0\0\377\316\0\0\0\377\6\1\2\0\377\24\34\7\377-@\17\377E" \ + "d\30\377[\203\37\377m\236%\377\234u\251(\377\2U{\35\377\14\21\4\377\251" \ + "\0\0\0\377\2\0\0\0\326\0\0\0\34\377\0\0\0\0\320\0\0\0\0\2\0\0\0&\0\0" \ + "\0\325\250\0\0\0\377\2#3\14\377`\213!\377\226u\251(\377\10q\243'\377" \ + "e\222#\377Y\200\36\377Gf\30\3775L\22\377\"1\14\377\20\27\5\377\1\2\0" \ + "\377\377\0\0\0\377\331\0\0\0\377\7\12\17\3\377\35*\12\377/D\20\377A]" \ + "\26\377Ty\35\377a\215!\377m\236%\377\226u\251(\377\3m\235%\3776N\23\377" \ + "\5\7\2\377\246\0\0\0\377\2\0\0\0\262\0\0\0\16\377\0\0\0\0\322\0\0\0\0" \ + "\3\0\0\0\11\0\0\0\204\0\0\0\371\244\0\0\0\377\4\14\21\4\377Ec\30\377" \ + "e\222#\377j\232$\377\210m\236%\377\1k\233%\377\202e\222#\377\13c\216" \ + "\"\377[\204\37\377Ty\35\377Ln\32\377Dc\27\377=X\25\3776N\22\377+>\17" \ + "\377\37-\13\377\24\34\7\377\10\13\3\377\377\0\0\0\377\350\0\0\0\377\13" \ + "\4\6\1\377\20\27\5\377\34(\11\377(:\16\3773J\21\377;U\24\377B_\27\377" \ + "Jk\31\377Qu\34\377Y\200\36\377`\213!\377\202e\222#\377\1i\230$\377\210" \ + "m\236%\377\4m\235%\377e\222#\377V|\35\377\33&\11\377\243\0\0\0\377\3" \ + "\0\0\0\353\0\0\0_\0\0\0\1\377\0\0\0\0\325\0\0\0\0\3\0\0\0\25\0\0\0\210" \ + "\0\0\0\366\377\0\0\0\377\377\0\0\0\377\340\0\0\0\377\3\0\0\0\346\0\0" \ + "\0o\0\0\0\12\377\0\0\0\0\331\0\0\0\0\3\0\0\0\40\0\0\0\230\0\0\0\360\377" \ + "\0\0\0\377\245\0\0\0\377\6\1\0\0\377\22\2\6\377\31\2\11\377!\3\14\377" \ + "&\3\15\3771\4\21\377\2022\5\22\377\7.\4\20\377&\3\15\377\"\3\14\377\31" \ + "\2\11\377\27\2\10\377\15\1\4\377\14\1\4\377\377\0\0\0\377\250\0\0\0\377" \ + "\3\0\0\0\342\0\0\0}\0\0\0\17\377\0\0\0\0\335\0\0\0\0\4\0\0\0\11\0\0\0" \ + "V\0\0\0\262\0\0\0\372\377\0\0\0\377\233\0\0\0\377\10\15\1\4\3771\4\21" \ + "\377M\7\33\377f\11$\377\200\14-\377\227\16""5\377\251\17;\377\271\21" \ + "A\377\216\274\21B\377\10\265\20@\377\235\16""7\377\206\14/\377o\12'\377" \ + "X\10\37\377@\6\27\377&\3\15\377\5\0\2\377\377\0\0\0\377\235\0\0\0\377" \ + "\4\0\0\0\360\0\0\0\235\0\0\0@\0\0\0\2\377\0\0\0\0\342\0\0\0\0\4\0\0\0" \ + "\11\0\0\0D\0\0\0\221\0\0\0\341\377\0\0\0\377\222\0\0\0\377\6\1\0\0\377" \ + "\40\3\13\377E\6\30\377k\12&\377\221\15""3\377\257\20>\377\236\274\21" \ + "B\377\5\252\17<\377\204\14.\377^\11!\3779\5\24\377\17\1\5\377\377\0\0" \ + "\0\377\224\0\0\0\377\5\0\0\0\376\0\0\0\314\0\0\0\200\0\0\0""3\0\0\0\2" \ + "\377\0\0\0\0\350\0\0\0\0\5\0\0\0\2\0\0\0""5\0\0\0z\0\0\0\300\0\0\0\371" \ + "\377\0\0\0\377\213\0\0\0\377\4\4\0\2\3771\4\21\377h\11$\377\240\16""8" \ + "\377\247\274\21B\377\5\272\21A\377\223\15""4\377^\11!\377*\4\17\377\2" \ + "\0\1\377\377\0\0\0\377\215\0\0\0\377\4\0\0\0\361\0\0\0\260\0\0\0j\0\0" \ + "\0%\377\0\0\0\0\357\0\0\0\0\3\0\0\0\12\0\0\0\217\0\0\0\376\377\0\0\0" \ + "\377\207\0\0\0\377\4\22\2\6\377H\7\31\377\177\13-\377\262\20\77\377\256" \ + "\274\21B\377\4\257\20>\377}\13,\377I\7\32\377\22\2\6\377\377\0\0\0\377" \ + "\211\0\0\0\377\3\0\0\0\370\0\0\0e\0\0\0\1\377\0\0\0\0\357\0\0\0\0\3\0" \ + "\0\0\1\0\0\0^\0\0\0\346\377\0\0\0\377\206\0\0\0\377\3\17\1\5\377R\7\35" \ + "\377\226\16""5\377\266\274\21B\377\3\235\16""7\377X\10\37\377\22\2\6" \ + "\377\377\0\0\0\377\210\0\0\0\377\2\0\0\0\317\0\0\0""9\377\0\0\0\0\355" \ + "\0\0\0\0\2\0\0\0+\0\0\0\300\377\0\0\0\377\205\0\0\0\377\4\4\0\2\377\77" \ + "\6\26\377\204\14.\377\267\21@\377\272\274\21B\377\4\273\21A\377\221\15" \ + "3\377R\7\35\377\17\1\5\377\377\0\0\0\377\206\0\0\0\377\3\0\0\0\376\0" \ + "\0\0\242\0\0\0\25\377\0\0\0\0\351\0\0\0\0\3\0\0\0\15\0\0\0\221\0\0\0" \ + "\372\377\0\0\0\377\204\0\0\0\377\3\20\1\6\377^\11!\377\250\17;\377\300" \ + "\274\21B\377\3\264\20\77\377o\12'\377\36\3\13\377\377\0\0\0\377\206\0" \ + "\0\0\377\3\0\0\0\356\0\0\0o\0\0\0\3\377\0\0\0\0\346\0\0\0\0\2\0\0\0@" \ + "\0\0\0\333\377\0\0\0\377\204\0\0\0\377\3(\4\16\377}\13,\377\270\21A\377" \ + "\305\274\21B\377\3\226\16""5\377E\6\30\377\3\0\1\377\377\0\0\0\377\205" \ + "\0\0\0\377\2\0\0\0\276\0\0\0#\377\0\0\0\0\343\0\0\0\0\2\0\0\0\24\0\0" \ + "\0\252\377\0\0\0\377\204\0\0\0\377\3/\4\21\377\203\14.\377\273\21A\377" \ + "\311\274\21B\377\3\241\17""8\377P\7\34\377\7\1\3\377\377\0\0\0\377\204" \ + "\0\0\0\377\3\0\0\0\372\0\0\0\210\0\0\0\6\377\0\0\0\0\340\0\0\0\0\2\0" \ + "\0\0^\0\0\0\351\377\0\0\0\377\203\0\0\0\377\2.\4\20\377\221\15""3\377" \ + "\316\274\21B\377\3\252\17<\377R\7\35\377\6\1\2\377\377\0\0\0\377\204" \ + "\0\0\0\377\2\0\0\0\322\0\0\0""5\377\0\0\0\0\335\0\0\0\0\2\0\0\0\34\0" \ + "\0\0\264\377\0\0\0\377\203\0\0\0\377\2""0\4\21\377\222\15""3\377\322" \ + "\274\21B\377\3\255\20=\377^\11!\377\12\1\4\377\377\0\0\0\377\203\0\0" \ + "\0\377\3\0\0\0\373\0\0\0\221\0\0\0\13\377\0\0\0\0\332\0\0\0\0\2\0\0\0" \ + "O\0\0\0\352\377\0\0\0\377\202\0\0\0\377\3\40\3\13\377\200\14-\377\273" \ + "\21B\377\325\274\21B\377\3\247\17:\377L\7\33\377\3\0\1\377\377\0\0\0" \ + "\377\203\0\0\0\377\2\0\0\0\321\0\0\0-\377\0\0\0\0\327\0\0\0\0\2\0\0\0" \ + "\22\0\0\0\252\377\0\0\0\377\202\0\0\0\377\3\12\1\4\377k\12&\377\272\21" \ + "A\377\331\274\21B\377\2\232\16""6\377-\4\20\377\377\0\0\0\377\203\0\0" \ + "\0\377\3\0\0\0\373\0\0\0\200\0\0\0\3\377\0\0\0\0\324\0\0\0\0\2\0\0\0" \ + "@\0\0\0\341\276\0\0\0\377\3\6\1\2\377\15\1\4\377\25\2\7\377\205\31\2" \ + "\11\377\2\15\1\4\377\1\0\1\377\270\0\0\0\377\3\1\0\0\377K\7\32\377\257" \ + "\20=\377\335\274\21B\377\2\204\14.\377\30\2\10\377\377\0\0\0\377\203" \ + "\0\0\0\377\2\0\0\0\307\0\0\0$\377\0\0\0\0\321\0\0\0\0\3\0\0\0\7\0\0\0" \ + "\221\0\0\0\376\264\0\0\0\377\12\24\2\7\377.\4\20\377F\6\31\377Z\10\40" \ + "\377k\12&\377~\13,\377\221\15""3\377\243\17""9\377\257\20>\377\263\20" \ + "\77\377\213\274\21B\377\13\263\20\77\377\250\17;\377\236\16""7\377\223" \ + "\15""4\377\202\14.\377q\12(\377_\11!\377P\7\34\377<\5\25\377+\4\17\377" \ + "\17\1\5\377\254\0\0\0\377\2\35\3\12\377\216\15""2\377\340\274\21B\377" \ + "\3\265\20@\377^\11!\377\6\1\2\377\377\0\0\0\377\202\0\0\0\377\2\0\0\0" \ + "\362\0\0\0f\377\0\0\0\0\317\0\0\0\0\2\0\0\0\35\0\0\0\307\260\0\0\0\377" \ + "\6\23\2\7\377:\5\24\377a\11\"\377\202\14.\377\234\16""7\377\265\20@\377" \ + "\240\274\21B\377\6\260\20>\377\224\15""4\377y\13*\377\\\10\40\377<\5" \ + "\25\377\12\1\4\377\244\0\0\0\377\3\1\0\0\377O\7\34\377\264\20\77\377" \ + "\343\274\21B\377\2\232\16""6\377#\3\14\377\260\0\0\0\377\2\12\1\4\377" \ + "\25\2\7\377\204\31\2\11\377\3\30\2\11\377\15\1\4\377\12\1\3\377\311\0" \ + "\0\0\377\2\0\0\0\237\0\0\0\11\377\0\0\0\0\314\0\0\0\0\2\0\0\0P\0\0\0" \ + "\361\254\0\0\0\377\5\3\0\1\377*\4\17\377X\10\37\377\202\14.\377\251\17" \ + ";\377\253\274\21B\377\2\255\20=\377-\4\20\377\242\0\0\0\377\2\24\2\7" \ + "\377\213\15""1\377\346\274\21B\377\3\271\21A\377d\11#\377\5\0\2\377\242" \ + "\0\0\0\377\14\7\1\3\377#\3\14\3778\5\24\377H\7\31\377[\10\40\377k\12" \ + "&\377}\13,\377\217\15""2\377\231\16""6\377\244\17:\377\257\20>\377\273" \ + "\21B\377\212\274\21B\377\13\270\21@\377\257\20>\377\251\17;\377\226\16" \ + "5\377\204\14.\377r\12(\377^\11!\377M\7\33\3775\5\23\377\33\2\12\377\4" \ + "\0\2\377\276\0\0\0\377\2\0\0\0\330\0\0\0*\377\0\0\0\0\311\0\0\0\0\3\0" \ + "\0\0\2\0\0\0\210\0\0\0\376\251\0\0\0\377\5\1\0\0\377&\3\15\377X\10\37" \ + "\377\210\14""0\377\263\20\77\377\260\274\21B\377\1\236\16""7\377\241" \ + "\0\0\0\377\2:\5\24\377\255\20=\377\351\274\21B\377\2\234\16""7\377%\3" \ + "\15\377\233\0\0\0\377\6\1\0\1\377-\4\20\377T\10\36\377o\12'\377\213\15" \ + "1\377\247\17:\377\240\274\21B\377\7\272\21A\377\244\17""9\377\212\14" \ + "0\377l\12&\377F\6\31\377\40\3\13\377\2\0\1\377\271\0\0\0\377\2\0\0\0" \ + "\362\0\0\0T\377\0\0\0\0\307\0\0\0\0\2\0\0\0\21\0\0\0\265\250\0\0\0\377" \ + "\4\4\0\2\3773\5\22\377n\12'\377\247\17;\377\264\274\21B\377\2\273\21" \ + "B\377\1\0\1\377\236\0\0\0\377\3\4\0\2\377f\11$\377\273\21B\377\353\274" \ + "\21B\377\2\265\20@\377Q\7\34\377\231\0\0\0\377\2\15\1\5\377\221\15""3" \ + "\377\253\274\21B\377\5\263\20\77\377\216\15""2\377f\11$\3778\5\24\377" \ + "\13\1\4\377\266\0\0\0\377\3\0\0\0\376\0\0\0\210\0\0\0\3\377\0\0\0\0\304" \ + "\0\0\0\0\2\0\0\0'\0\0\0\325\246\0\0\0\377\4\1\0\0\377/\4\21\377v\13)" \ + "\377\261\20>\377\267\274\21B\377\1\255\20=\377\236\0\0\0\377\2\25\2\10" \ + "\377\230\16""5\377\357\274\21B\377\2}\13,\377\10\1\3\377\227\0\0\0\377" \ + "\1b\11\"\377\260\274\21B\377\5\272\21A\377\226\16""5\377g\11$\3777\5" \ + "\23\377\7\1\2\377\264\0\0\0\377\2\0\0\0\262\0\0\0\20\377\0\0\0\0\302" \ + "\0\0\0\0\2\0\0\0L\0\0\0\363\245\0\0\0\377\3#\3\14\377k\12&\377\252\17" \ + "<\377\272\274\21B\377\1w\13*\377\235\0\0\0\377\2'\4\16\377\251\17;\377" \ + "\361\274\21B\377\2\232\16""6\377\30\2\10\377\226\0\0\0\377\1\202\14." \ + "\377\264\274\21B\377\4\264\20\77\377\200\14-\377E\6\30\377\16\1\5\377" \ + "\262\0\0\0\377\2\0\0\0\335\0\0\0'\377\0\0\0\0\300\0\0\0\0\2\0\0\0j\0" \ + "\0\0\374\243\0\0\0\377\4\1\0\1\3777\5\23\377\210\14""0\377\273\21B\377" \ + "\274\274\21B\377\1A\6\27\377\234\0\0\0\377\2C\6\30\377\266\20@\377\363" \ + "\274\21B\377\2\256\20=\3770\4\21\377\225\0\0\0\377\1s\12(\377\267\274" \ + "\21B\377\4\272\21A\377\213\15""1\377E\6\30\377\10\1\3\377\260\0\0\0\377" \ + "\2\0\0\0\355\0\0\0>\377\0\0\0\0\275\0\0\0\0\2\0\0\0\2\0\0\0\221\243\0" \ + "\0\0\377\3\17\1\5\377^\11!\377\252\17<\377\276\274\21B\377\2\244\17:" \ + "\377\4\0\1\377\233\0\0\0\377\2T\10\36\377\273\21A\377\365\274\21B\377" \ + "\2\266\20@\377A\6\27\377\224\0\0\0\377\1=\6\25\377\272\274\21B\377\4" \ + "\267\21@\377}\13,\3779\5\24\377\3\0\1\377\256\0\0\0\377\2\0\0\0\370\0" \ + "\0\0Y\377\0\0\0\0\273\0\0\0\0\2\0\0\0\11\0\0\0\254\242\0\0\0\377\3\13" \ + "\1\4\377^\11!\377\261\20>\377\300\274\21B\377\1O\7\34\377\233\0\0\0\377" \ + "\1f\11$\377\370\274\21B\377\2\273\21B\377S\7\35\377\223\0\0\0\377\2\12" \ + "\1\4\377\267\21@\377\274\274\21B\377\3\237\16""8\377P\7\34\377\12\1\3" \ + "\377\255\0\0\0\377\2\0\0\0\376\0\0\0\200\377\0\0\0\0\271\0\0\0\0\2\0" \ + "\0\0\16\0\0\0\274\241\0\0\0\377\3\12\1\4\377\\\10\40\377\257\20>\377" \ + "\301\274\21B\377\2\247\17:\377\5\0\2\377\232\0\0\0\377\1g\11$\377\373" \ + "\274\21B\377\1^\10!\377\223\0\0\0\377\1o\12'\377\276\274\21B\377\3\267" \ + "\21@\377w\13*\377!\3\14\377\255\0\0\0\377\2\0\0\0\214\0\0\0\1\377\0\0" \ + "\0\0\266\0\0\0\0\2\0\0\0\23\0\0\0\317\240\0\0\0\377\3\4\0\1\377T\10\36" \ + "\377\257\20=\377\303\274\21B\377\1=\6\25\377\231\0\0\0\377\2\1\0\0\377" \ + "o\12'\377\375\274\21B\377\1d\11#\377\222\0\0\0\377\2\30\2\11\377\270" \ + "\21A\377\277\274\21B\377\3\273\21A\377|\13+\377\37\3\13\377\254\0\0\0" \ + "\377\2\0\0\0\240\0\0\0\2\377\0\0\0\0\264\0\0\0\0\2\0\0\0\22\0\0\0\317" \ + "\240\0\0\0\377\2E\6\30\377\247\17:\377\304\274\21B\377\1\177\13-\377" \ + "\232\0\0\0\377\1c\11#\377\377\274\21B\377\1_\11!\377\222\0\0\0\377\1" \ + "r\12(\377\301\274\21B\377\3\273\21A\377z\13+\377\35\3\12\377\253\0\0" \ + "\0\377\2\0\0\0\237\0\0\0\2\377\0\0\0\0\262\0\0\0\0\2\0\0\0\22\0\0\0\316" \ + "\237\0\0\0\377\2\30\2\11\377\202\14.\377\305\274\21B\377\2\263\20\77" \ + "\377\26\2\10\377\231\0\0\0\377\1Q\7\34\377\377\274\21B\377\202\274\21" \ + "B\377\1M\7\33\377\221\0\0\0\377\2\20\1\6\377\257\20=\377\302\274\21B" \ + "\377\3\272\21A\377u\13)\377\22\2\6\377\252\0\0\0\377\2\0\0\0\236\0\0" \ + "\0\2\377\0\0\0\0\260\0\0\0\0\2\0\0\0\22\0\0\0\315\236\0\0\0\377\3\1\0" \ + "\1\377S\7\35\377\265\20\77\377\306\274\21B\377\1K\7\32\377\231\0\0\0" \ + "\377\2;\5\25\377\273\21A\377\377\274\21B\377\202\274\21B\377\2\270\21" \ + "A\3771\4\21\377\221\0\0\0\377\1E\6\30\377\304\274\21B\377\3\265\20@\377" \ + "^\11!\377\7\1\2\377\251\0\0\0\377\2\0\0\0\235\0\0\0\2\377\0\0\0\0\256" \ + "\0\0\0\0\2\0\0\0\21\0\0\0\315\236\0\0\0\377\2%\3\15\377\231\16""6\377" \ + "\307\274\21B\377\1w\13*\377\231\0\0\0\377\2)\4\16\377\265\20@\377\377" \ + "\274\21B\377\204\274\21B\377\2\257\20>\377\35\3\12\377\220\0\0\0\377" \ + "\2\1\0\0\377\216\15""2\377\305\274\21B\377\2\237\16""8\3775\5\23\377" \ + "\251\0\0\0\377\2\0\0\0\235\0\0\0\2\377\0\0\0\0\254\0\0\0\0\2\0\0\0\5" \ + "\0\0\0\274\235\0\0\0\377\3\1\0\0\377V\10\36\377\266\20@\377\307\274\21" \ + "B\377\2\243\17""9\377\13\1\4\377\230\0\0\0\377\2\14\1\4\377\245\17:\377" \ + "\377\274\21B\377\206\274\21B\377\2\236\16""7\377\12\1\4\377\220\0\0\0" \ + "\377\2\33\2\11\377\262\20>\377\306\274\21B\377\2x\13*\377\16\1\5\377" \ + "\250\0\0\0\377\1\0\0\0\204\377\0\0\0\0\253\0\0\0\0\2\0\0\0\1\0\0\0\251" \ + "\235\0\0\0\377\2\16\1\5\377\205\14/\377\310\274\21B\377\2\270\21@\377" \ + "(\4\16\377\231\0\0\0\377\1\200\14-\377\377\274\21B\377\210\274\21B\377" \ + "\1\200\14-\377\221\0\0\0\377\1=\6\25\377\307\274\21B\377\2\260\20>\377" \ + "K\7\32\377\250\0\0\0\377\1\0\0\0l\377\0\0\0\0\252\0\0\0\0\1\0\0\0\204" \ + "\235\0\0\0\377\2""2\5\22\377\254\20<\377\311\274\21B\377\1E\6\30\377" \ + "\231\0\0\0\377\1E\6\30\377\377\274\21B\377\212\274\21B\377\1E\6\30\377" \ + "\221\0\0\0\377\1t\12)\377\310\274\21B\377\2}\13,\377\15\1\4\377\246\0" \ + "\0\0\377\2\0\0\0\374\0\0\0O\377\0\0\0\0\250\0\0\0\0\1\0\0\0h\235\0\0" \ + "\0\377\2P\7\34\377\270\21@\377\311\274\21B\377\1o\12'\377\231\0\0\0\377" \ + "\2\30\2\11\377\262\20>\377\377\274\21B\377\212\274\21B\377\2\260\20>" \ + "\377\23\2\7\377\220\0\0\0\377\2\10\1\3\377\236\16""7\377\310\274\21B" \ + "\377\2\244\17:\377(\4\16\377\246\0\0\0\377\2\0\0\0\363\0\0\0""1\377\0" \ + "\0\0\0\246\0\0\0\0\2\0\0\0E\0\0\0\372\233\0\0\0\377\2\6\1\2\377{\13+" \ + "\377\312\274\21B\377\2\207\14/\377\2\0\1\377\231\0\0\0\377\1\200\14-" \ + "\377\377\274\21B\377\214\274\21B\377\1\200\14-\377\221\0\0\0\377\2\30" \ + "\2\10\377\255\20=\377\310\274\21B\377\3\271\21A\377^\11!\377\1\0\1\377" \ + "\245\0\0\0\377\2\0\0\0\346\0\0\0\36\377\0\0\0\0\244\0\0\0\0\2\0\0\0'" \ + "\0\0\0\355\233\0\0\0\377\2\14\1\4\377\211\14""0\377\312\274\21B\377\2" \ + "\246\17:\377\20\1\6\377\231\0\0\0\377\1/\4\21\377\377\274\21B\377\216" \ + "\274\21B\377\1""6\5\23\377\221\0\0\0\377\2""6\5\23\377\272\21A\377\311" \ + "\274\21B\377\2\177\13-\377\11\1\3\377\245\0\0\0\377\2\0\0\0\314\0\0\0" \ + "\13\377\0\0\0\0\242\0\0\0\0\2\0\0\0\20\0\0\0\333\233\0\0\0\377\2\31\2" \ + "\11\377\236\16""7\377\312\274\21B\377\2\261\20>\377\40\3\13\377\232\0" \ + "\0\0\377\1\221\15""3\377\377\274\21B\377\216\274\21B\377\2\233\16""6" \ + "\377\1\0\1\377\221\0\0\0\377\1R\7\35\377\312\274\21B\377\2\241\17""8" \ + "\377\33\2\12\377\245\0\0\0\377\2\0\0\0\261\0\0\0\1\377\0\0\0\0\240\0" \ + "\0\0\0\2\0\0\0\2\0\0\0\263\233\0\0\0\377\2#\3\14\377\254\20<\377\312" \ + "\274\21B\377\2\267\21@\377-\4\20\377\232\0\0\0\377\1""3\5\22\377\377" \ + "\274\21B\377\220\274\21B\377\1:\5\24\377\222\0\0\0\377\1y\13*\377\312" \ + "\274\21B\377\2\251\17;\377&\3\15\377\245\0\0\0\377\1\0\0\0v\377\0\0\0" \ + "\0\240\0\0\0\0\1\0\0\0u\233\0\0\0\377\2*\4\17\377\260\20>\377\312\274" \ + "\21B\377\2\273\21B\377@\6\27\377\233\0\0\0\377\1\206\14/\377\377\274" \ + "\21B\377\220\274\21B\377\1\216\15""2\377\222\0\0\0\377\2\6\1\2\377\221" \ + "\15""3\377\312\274\21B\377\2\265\20\77\377<\5\25\377\244\0\0\0\377\2" \ + "\0\0\0\372\0\0\0<\377\0\0\0\0\236\0\0\0\0\2\0\0\0>\0\0\0\375\232\0\0" \ + "\0\377\2""2\5\22\377\264\20\77\377\313\274\21B\377\1]\10!\377\233\0\0" \ + "\0\377\2\22\2\6\377\272\21A\377\377\274\21B\377\221\274\21B\377\1\40" \ + "\3\13\377\222\0\0\0\377\2\12\1\4\377\233\16""6\377\312\274\21B\377\2" \ + "\273\21B\377R\7\35\377\244\0\0\0\377\2\0\0\0\346\0\0\0\24\377\0\0\0\0" \ + "\234\0\0\0\0\2\0\0\0\15\0\0\0\336\232\0\0\0\377\2)\4\16\377\263\20\77" \ + "\377\313\274\21B\377\2v\13)\377\1\0\0\377\233\0\0\0\377\1J\7\32\377\377" \ + "\274\21B\377\222\274\21B\377\1e\11#\377\223\0\0\0\377\2\30\2\10\377\253" \ + "\17<\377\312\274\21B\377\2\273\21B\377V\10\36\377\244\0\0\0\377\1\0\0" \ + "\0\257\377\0\0\0\0\234\0\0\0\0\1\0\0\0\234\232\0\0\0\377\2%\3\15\377" \ + "\262\20>\377\313\274\21B\377\2|\13+\377\1\0\1\377\234\0\0\0\377\1w\13" \ + "*\377\377\274\21B\377\222\274\21B\377\1\244\17""9\377\224\0\0\0\377\2" \ + "&\3\15\377\264\20\77\377\313\274\21B\377\1d\11#\377\244\0\0\0\377\1\0" \ + "\0\0b\377\0\0\0\0\232\0\0\0\0\2\0\0\0F\0\0\0\376\231\0\0\0\377\2\35\3" \ + "\12\377\255\20=\377\313\274\21B\377\2\207\14/\377\4\0\1\377\235\0\0\0" \ + "\377\1\231\16""6\377\377\274\21B\377\223\274\21B\377\1\33\2\12\377\224" \ + "\0\0\0\377\2>\6\26\377\272\21A\377\313\274\21B\377\1Z\10\40\377\243\0" \ + "\0\0\377\2\0\0\0\357\0\0\0\32\377\0\0\0\0\230\0\0\0\0\2\0\0\0\21\0\0" \ + "\0\346\231\0\0\0\377\2\17\1\5\377\240\16""8\377\313\274\21B\377\2\227" \ + "\16""5\377\12\1\4\377\236\0\0\0\377\1\253\17<\377\377\274\21B\377\223" \ + "\274\21B\377\1K\7\32\377\225\0\0\0\377\2D\6\30\377\273\21A\377\313\274" \ + "\21B\377\1T\10\36\377\243\0\0\0\377\1\0\0\0\266\377\0\0\0\0\230\0\0\0" \ + "\0\1\0\0\0\233\231\0\0\0\377\2\4\0\1\377\217\15""2\377\313\274\21B\377" \ + "\2\237\16""8\377\20\1\6\377\237\0\0\0\377\1\262\20\77\377\377\274\21" \ + "B\377\223\274\21B\377\1n\12'\377\226\0\0\0\377\1O\7\34\377\313\274\21" \ + "B\377\2\273\21B\377G\6\31\377\243\0\0\0\377\1\0\0\0_\377\0\0\0\0\226" \ + "\0\0\0\0\2\0\0\0=\0\0\0\376\231\0\0\0\377\1w\13*\377\313\274\21B\377" \ + "\2\234\16""7\377\17\1\5\377\240\0\0\0\377\1\254\20<\377\377\274\21B\377" \ + "\223\274\21B\377\1\213\15""1\377\227\0\0\0\377\1g\11$\377\313\274\21" \ + "B\377\2\267\21@\3771\4\21\377\242\0\0\0\377\2\0\0\0\353\0\0\0\22\377" \ + "\0\0\0\0\224\0\0\0\0\2\0\0\0\5\0\0\0\325\231\0\0\0\377\1M\7\33\377\313" \ + "\274\21B\377\2\234\16""7\377\20\1\6\377\241\0\0\0\377\1\237\16""8\377" \ + "\377\274\21B\377\223\274\21B\377\1\237\16""8\377\227\0\0\0\377\2\1\0" \ + "\0\377t\12)\377\313\274\21B\377\2\260\20>\377\33\2\12\377\242\0\0\0\377" \ + "\1\0\0\0\231\377\0\0\0\0\224\0\0\0\0\1\0\0\0n\231\0\0\0\377\2(\4\16\377" \ + "\267\21@\377\312\274\21B\377\2\242\17""9\377\25\2\10\377\242\0\0\0\377" \ + "\1\206\14/\377\377\274\21B\377\223\274\21B\377\1\251\17;\377\230\0\0" \ + "\0\377\2\1\0\0\377o\12'\377\313\274\21B\377\2\241\17""8\377\14\1\4\377" \ + "\241\0\0\0\377\2\0\0\0\375\0\0\0""6\377\0\0\0\0\222\0\0\0\0\2\0\0\0\22" \ + "\0\0\0\354\230\0\0\0\377\2\16\1\5\377\247\17;\377\312\274\21B\377\2\235" \ + "\16""7\377\21\2\6\377\243\0\0\0\377\1h\11$\377\377\274\21B\377\223\274" \ + "\21B\377\1\255\20=\377\231\0\0\0\377\2\1\0\0\377o\12'\377\313\274\21" \ + "B\377\2\210\14""0\377\2\0\1\377\241\0\0\0\377\1\0\0\0\301\377\0\0\0\0" \ + "\222\0\0\0\0\1\0\0\0\222\231\0\0\0\377\1\200\14-\377\312\274\21B\377" \ + "\2\236\16""7\377\21\2\6\377\244\0\0\0\377\1>\6\26\377\377\274\21B\377" \ + "\223\274\21B\377\1\244\17:\377\232\0\0\0\377\2\2\0\1\377z\13+\377\313" \ + "\274\21B\377\1]\10!\377\242\0\0\0\377\1\0\0\0V\377\0\0\0\0\220\0\0\0" \ + "\0\2\0\0\0%\0\0\0\372\230\0\0\0\377\1K\7\32\377\312\274\21B\377\2\242" \ + "\17""9\377\25\2\7\377\245\0\0\0\377\2\16\1\5\377\272\21A\377\377\274" \ + "\21B\377\222\274\21B\377\1\226\16""5\377\233\0\0\0\377\2\1\0\1\377v\13" \ + ")\377\312\274\21B\377\2\273\21A\3773\5\22\377\241\0\0\0\377\2\0\0\0\336" \ + "\0\0\0\6\377\0\0\0\0\217\0\0\0\0\1\0\0\0\252\230\0\0\0\377\2\33\2\12" \ + "\377\263\20\77\377\311\274\21B\377\2\247\17:\377\31\2\11\377\247\0\0" \ + "\0\377\1\217\15""2\377\377\274\21B\377\222\274\21B\377\1~\13,\377\234" \ + "\0\0\0\377\2\1\0\1\377w\13*\377\312\274\21B\377\2\253\17<\377\21\2\6" \ + "\377\241\0\0\0\377\1\0\0\0l\377\0\0\0\0\216\0\0\0\0\2\0\0\0""0\0\0\0" \ + "\376\227\0\0\0\377\2\1\0\1\377\223\15""4\377\311\274\21B\377\2\243\17" \ + "9\377\25\2\10\377\250\0\0\0\377\1K\7\32\377\377\274\21B\377\222\274\21" \ + "B\377\1`\11\"\377\235\0\0\0\377\2\2\0\1\377x\13*\377\312\274\21B\377" \ + "\2\206\14/\377\1\0\0\377\240\0\0\0\377\2\0\0\0\346\0\0\0\11\377\0\0\0" \ + "\0\215\0\0\0\0\1\0\0\0\257\230\0\0\0\377\1K\7\32\377\311\274\21B\377" \ + "\2\244\17""9\377\26\2\10\377\251\0\0\0\377\2\12\1\3\377\262\20\77\377" \ + "\377\274\21B\377\221\274\21B\377\1""5\5\23\377\236\0\0\0\377\2\4\0\1" \ + "\377\200\14-\377\312\274\21B\377\1K\7\32\377\241\0\0\0\377\1\0\0\0q\377" \ + "\0\0\0\0\214\0\0\0\0\2\0\0\0-\0\0\0\376\227\0\0\0\377\2\17\1\5\377\255" \ + "\20=\377\310\274\21B\377\2\246\17:\377\33\2\12\377\253\0\0\0\377\1e\11" \ + "#\377\377\274\21B\377\220\274\21B\377\2\266\20@\377\11\1\3\377\237\0" \ + "\0\0\377\2\2\0\1\377z\13+\377\311\274\21B\377\2\265\20\77\377\30\2\11" \ + "\377\240\0\0\0\377\2\0\0\0\347\0\0\0\11\377\0\0\0\0\213\0\0\0\0\1\0\0" \ + "\0\246\230\0\0\0\377\1z\13+\377\310\274\21B\377\2\233\16""6\377\22\2" \ + "\6\377\254\0\0\0\377\2\20\1\6\377\263\20\77\377\377\274\21B\377\217\274" \ + "\21B\377\1\204\14.\377\241\0\0\0\377\2\2\0\1\377z\13+\377\311\274\21" \ + "B\377\1\206\14/\377\241\0\0\0\377\1\0\0\0j\377\0\0\0\0\212\0\0\0\0\2" \ + "\0\0\0\36\0\0\0\373\227\0\0\0\377\2*\4\17\377\273\21B\377\307\274\21" \ + "B\377\2\233\16""6\377\22\2\6\377\256\0\0\0\377\1O\7\34\377\377\274\21" \ + "B\377\217\274\21B\377\1>\6\26\377\242\0\0\0\377\2\5\0\2\377\201\14-\377" \ + "\311\274\21B\377\1:\5\24\377\240\0\0\0\377\2\0\0\0\332\0\0\0\2\377\0" \ + "\0\0\0\211\0\0\0\0\1\0\0\0\215\227\0\0\0\377\2\1\0\0\377\224\15""4\377" \ + "\307\274\21B\377\2\213\15""1\377\11\1\3\377\257\0\0\0\377\2\2\0\1\377" \ + "\227\16""5\377\377\274\21B\377\215\274\21B\377\2\254\20<\377\4\0\2\377" \ + "\243\0\0\0\377\2\2\0\1\377r\12(\377\310\274\21B\377\2\252\17<\377\14" \ + "\1\4\377\240\0\0\0\377\1\0\0\0Q\377\0\0\0\0\210\0\0\0\0\2\0\0\0\16\0" \ + "\0\0\362\227\0\0\0\377\1>\6\26\377\307\274\21B\377\2\207\14/\377\7\1" \ + "\3\377\261\0\0\0\377\2!\3\14\377\270\21A\377\377\274\21B\377\214\274" \ + "\21B\377\1V\10\36\377\245\0\0\0\377\2\1\0\1\377o\12'\377\310\274\21B" \ + "\377\1d\11#\377\240\0\0\0\377\1\0\0\0\300\377\0\0\0\0\210\0\0\0\0\1\0" \ + "\0\0j\227\0\0\0\377\2\4\0\2\377\243\17""9\377\306\274\21B\377\2~\13," \ + "\377\4\0\2\377\263\0\0\0\377\1a\11\"\377\377\274\21B\377\213\274\21B" \ + "\377\2\254\20<\377\11\1\3\377\247\0\0\0\377\1X\10\37\377\307\274\21B" \ + "\377\2\270\21@\377\31\2\11\377\237\0\0\0\377\2\0\0\0\376\0\0\0-\377\0" \ + "\0\0\0\206\0\0\0\0\2\0\0\0\1\0\0\0\330\227\0\0\0\377\1J\7\32\377\306" \ + "\274\21B\377\2}\13,\377\4\0\1\377\264\0\0\0\377\2\1\0\0\377|\13+\377" \ + "\377\274\21B\377\212\274\21B\377\1C\6\30\377\251\0\0\0\377\2P\7\34\377" \ + "\273\21B\377\306\274\21B\377\1w\13*\377\240\0\0\0\377\1\0\0\0\230\377" \ + "\0\0\0\0\206\0\0\0\0\1\0\0\0""9\227\0\0\0\377\2\4\0\2\377\247\17:\377" \ + "\305\274\21B\377\2i\12%\377\1\0\0\377\266\0\0\0\377\2\12\1\4\377\235" \ + "\16""7\377\377\274\21B\377\210\274\21B\377\2\214\15""1\377\1\0\0\377" \ + "\252\0\0\0\377\2K\7\32\377\273\21A\377\305\274\21B\377\2\273\21A\377" \ + "%\3\15\377\237\0\0\0\377\2\0\0\0\361\0\0\0\12\377\0\0\0\0\205\0\0\0\0" \ + "\1\0\0\0\233\227\0\0\0\377\1E\6\30\377\305\274\21B\377\1^\11!\377\271" \ + "\0\0\0\377\2\32\2\11\377\256\20=\377\377\274\21B\377\206\274\21B\377" \ + "\2\261\20>\377\26\2\10\377\254\0\0\0\377\2H\7\31\377\272\21A\377\305" \ + "\274\21B\377\1\204\14.\377\240\0\0\0\377\1\0\0\0]\377\0\0\0\0\204\0\0" \ + "\0\0\2\0\0\0\14\0\0\0\363\226\0\0\0\377\2\1\0\1\377\236\16""7\377\304" \ + "\274\21B\377\1X\10\37\377\273\0\0\0\377\2#\3\14\377\255\20=\377\377\274" \ + "\21B\377\204\274\21B\377\2\272\21A\3779\5\24\377\256\0\0\0\377\2""8\5" \ + "\24\377\266\20@\377\305\274\21B\377\1)\4\16\377\237\0\0\0\377\1\0\0\0" \ + "\300\377\0\0\0\0\204\0\0\0\0\1\0\0\0X\227\0\0\0\377\1""7\5\23\377\303" \ + "\274\21B\377\2\273\21A\377S\10\35\377\275\0\0\0\377\2\34\3\12\377\250" \ + "\17;\377\377\274\21B\377\203\274\21B\377\1H\7\31\377\260\0\0\0\377\2" \ + "/\4\21\377\262\20\77\377\304\274\21B\377\1\177\13-\377\237\0\0\0\377" \ + "\2\0\0\0\375\0\0\0\34\377\0\0\0\0\203\0\0\0\0\1\0\0\0\262\227\0\0\0\377" \ + "\1\214\15""1\377\302\274\21B\377\2\266\20@\377\77\6\26\377\277\0\0\0" \ + "\377\2\30\2\10\377\244\17""9\377\377\274\21B\377\2\274\21B\377_\11!\377" \ + "\262\0\0\0\377\2'\4\16\377\256\20=\377\303\274\21B\377\2\273\21A\377" \ + "\37\3\13\377\237\0\0\0\377\1\0\0\0u\377\0\0\0\0\202\0\0\0\0\2\0\0\0\22" \ + "\0\0\0\372\226\0\0\0\377\1\40\3\13\377\302\274\21B\377\2\253\17<\377" \ + "'\4\16\377\301\0\0\0\377\2\32\2\11\377\234\16""7\377\376\274\21B\377" \ + "\2r\12(\377\1\0\0\377\263\0\0\0\377\2'\4\16\377\254\20<\377\303\274\21" \ + "B\377\1q\12(\377\237\0\0\0\377\1\0\0\0\314\377\0\0\0\0\202\0\0\0\0\1" \ + "\0\0\0b\227\0\0\0\377\1i\12%\377\301\274\21B\377\2\237\16""8\377\30\2" \ + "\11\377\303\0\0\0\377\2\6\1\2\377w\13*\377\374\274\21B\377\1X\10\37\377" \ + "\266\0\0\0\377\2\32\2\11\377\240\16""8\377\302\274\21B\377\2\267\21@" \ + "\377\21\2\6\377\237\0\0\0\377\1\0\0\0%\377\0\0\0\0\2\0\0\0\0\0\0\0\263" \ + "\226\0\0\0\377\2\7\1\3\377\260\20>\377\300\274\21B\377\2\220\15""2\377" \ + "\15\1\5\377\306\0\0\0\377\2R\7\35\377\272\21A\377\370\274\21B\377\2\271" \ + "\21A\377G\6\31\377\270\0\0\0\377\2\14\1\4\377\215\15""1\377\302\274\21" \ + "B\377\1Z\10\40\377\237\0\0\0\377\1\0\0\0u\377\0\0\0\0\2\0\0\0\12\0\0" \ + "\0\367\226\0\0\0\377\1D\6\30\377\300\274\21B\377\2}\13,\377\5\0\2\377" \ + "\310\0\0\0\377\2:\5\24\377\254\20<\377\366\274\21B\377\2\263\20\77\377" \ + "@\6\27\377\272\0\0\0\377\2\4\0\2\377y\13*\377\301\274\21B\377\2\244\17" \ + "9\377\1\0\1\377\236\0\0\0\377\1\0\0\0\303\377\0\0\0\0\1\0\0\0M\227\0" \ + "\0\0\377\1\212\14""0\377\277\274\21B\377\2r\12(\377\3\0\1\377\312\0\0" \ + "\0\377\3\13\1\4\377q\12(\377\273\21B\377\363\274\21B\377\2\221\15""3" \ + "\377\27\2\10\377\274\0\0\0\377\2\1\0\0\377^\11!\377\301\274\21B\377\1" \ + "4\5\22\377\236\0\0\0\377\2\0\0\0\374\0\0\0\24\376\0\0\0\0\1\0\0\0\230" \ + "\226\0\0\0\377\2\20\1\6\377\272\21A\377\275\274\21B\377\2\273\21A\377" \ + "R\7\35\377\316\0\0\0\377\2.\4\20\377\241\17""8\377\360\274\21B\377\3" \ + "\273\21A\377^\11!\377\3\0\1\377\277\0\0\0\377\2I\7\32\377\271\21A\377" \ + "\277\274\21B\377\1~\13,\377\237\0\0\0\377\1\0\0\0\\\376\0\0\0\0\1\0\0" \ + "\0\340\226\0\0\0\377\1L\7\33\377\275\274\21B\377\2\265\20@\377<\5\25" \ + "\377\320\0\0\0\377\3\13\1\4\377m\12&\377\271\21A\377\355\274\21B\377" \ + "\2\245\17:\3778\5\24\377\302\0\0\0\377\2\77\6\26\377\266\20@\377\276" \ + "\274\21B\377\2\267\21@\377\15\1\4\377\236\0\0\0\377\1\0\0\0\244\375\0" \ + "\0\0\0\1\0\0\0'\227\0\0\0\377\1\211\14""0\377\274\274\21B\377\2\255\20" \ + "=\377*\4\17\377\323\0\0\0\377\3\25\2\10\377q\12(\377\273\21A\377\351" \ + "\274\21B\377\3\262\20>\377R\7\35\377\4\0\1\377\304\0\0\0\377\2'\4\16" \ + "\377\253\17<\377\276\274\21B\377\1I\7\32\377\236\0\0\0\377\2\0\0\0\351" \ + "\0\0\0\1\374\0\0\0\0\1\0\0\0i\226\0\0\0\377\2\15\1\4\377\270\21A\377" \ + "\273\274\21B\377\2\245\17:\377\"\3\14\377\326\0\0\0\377\2&\3\15\377\214" \ + "\15""1\377\346\274\21B\377\3\273\21A\377q\12(\377\22\2\6\377\307\0\0" \ + "\0\377\2\30\2\11\377\237\16""8\377\275\274\21B\377\1\206\14/\377\237" \ + "\0\0\0\377\1\0\0\0,\374\0\0\0\0\1\0\0\0\252\226\0\0\0\377\1E\6\30\377" \ + "\273\274\21B\377\2\222\15""3\377\21\2\6\377\330\0\0\0\377\3\1\0\0\377" \ + "<\5\25\377\224\15""4\377\342\274\21B\377\3\273\21B\377\203\14.\377*\4" \ + "\17\377\312\0\0\0\377\2\15\1\5\377\217\15""2\377\274\274\21B\377\2\270" \ + "\21A\377\15\1\5\377\236\0\0\0\377\1\0\0\0m\373\0\0\0\0\2\0\0\0\2\0\0" \ + "\0\354\226\0\0\0\377\1|\13+\377\272\274\21B\377\2m\12&\377\3\0\1\377" \ + "\334\0\0\0\377\3$\3\15\377w\13*\377\272\21A\377\335\274\21B\377\3\266" \ + "\20@\377k\12&\377\31\2\11\377\315\0\0\0\377\2\11\1\3\377\202\14.\377" \ + "\274\274\21B\377\1C\6\30\377\236\0\0\0\377\1\0\0\0\256\373\0\0\0\0\1" \ + "\0\0\0)\226\0\0\0\377\2\1\0\1\377\256\20=\377\270\274\21B\377\2\271\21" \ + "A\377K\7\32\377\340\0\0\0\377\3\"\3\14\377y\13*\377\270\21A\377\331\274" \ + "\21B\377\3\257\20>\377k\12&\377\30\2\11\377\320\0\0\0\377\2\1\0\1\377" \ + "e\11#\377\273\274\21B\377\1\200\14-\377\236\0\0\0\377\1\0\0\0\352\373" \ + "\0\0\0\0\1\0\0\0a\226\0\0\0\377\1%\3\15\377\270\274\21B\377\2\260\20" \ + ">\3774\5\22\377\343\0\0\0\377\4\13\1\4\377E\6\30\377\204\14.\377\272" \ + "\21A\377\323\274\21B\377\4\271\21A\377}\13,\3772\5\22\377\2\0\1\377\324" \ + "\0\0\0\377\2\77\6\26\377\265\20\77\377\271\274\21B\377\2\262\20\77\377" \ + "\4\0\1\377\236\0\0\0\377\1\0\0\0$\372\0\0\0\0\1\0\0\0\230\226\0\0\0\377" \ + "\1X\10\37\377\267\274\21B\377\2\237\16""8\377\33\2\12\377\347\0\0\0\377" \ + "\3\34\3\12\377_\11!\377\243\17""9\377\317\274\21B\377\3\245\17:\377f" \ + "\11$\377\34\3\12\377\330\0\0\0\377\2#\3\14\377\247\17:\377\271\274\21" \ + "B\377\1,\4\20\377\236\0\0\0\377\1\0\0\0[\372\0\0\0\0\1\0\0\0\320\226" \ + "\0\0\0\377\1\210\14""0\377\266\274\21B\377\2\223\15""4\377\22\2\6\377" \ + "\352\0\0\0\377\5\1\0\0\377'\4\16\377^\11!\377\226\16""5\377\273\21B\377" \ + "\307\274\21B\377\4\273\21B\377\227\16""5\377]\10!\377#\3\14\377\334\0" \ + "\0\0\377\2\23\2\7\377\225\15""4\377\270\274\21B\377\1_\11!\377\236\0" \ + "\0\0\377\1\0\0\0\222\371\0\0\0\0\2\0\0\0\12\0\0\0\373\225\0\0\0\377\2" \ + "\3\0\1\377\265\20\77\377\265\274\21B\377\2m\12&\377\3\0\1\377\357\0\0" \ + "\0\377\4\22\2\6\377J\7\32\377\201\14-\377\264\20\77\377\301\274\21B\377" \ + "\4\255\20=\377\202\14.\377N\7\33\377\25\2\10\377\340\0\0\0\377\2\6\1" \ + "\2\377z\13+\377\267\274\21B\377\1\222\15""3\377\236\0\0\0\377\1\0\0\0" \ + "\310\371\0\0\0\0\1\0\0\0""8\226\0\0\0\377\1\40\3\13\377\264\274\21B\377" \ + "\2\271\21A\377K\7\32\377\364\0\0\0\377\5\4\0\2\377*\4\17\377U\10\36\377" \ + "\201\14-\377\253\17<\377\271\274\21B\377\4\241\17""8\377u\13)\377I\7" \ + "\32\377\35\3\12\377\345\0\0\0\377\2\2\0\1\377g\11$\377\266\274\21B\377" \ + "\2\270\21A\377\12\1\4\377\235\0\0\0\377\2\0\0\0\367\0\0\0\4\370\0\0\0" \ + "\0\1\0\0\0e\226\0\0\0\377\1H\7\31\377\263\274\21B\377\2\261\20>\3774" \ + "\5\22\377\372\0\0\0\377\5\33\2\12\377F\6\31\377p\12'\377\222\15""3\377" \ + "\260\20>\377\256\274\21B\377\6\270\21@\377\231\16""6\377w\13*\377V\10" \ + "\36\3773\5\22\377\20\1\6\377\353\0\0\0\377\2\77\6\26\377\265\20@\377" \ + "\265\274\21B\377\1""4\5\22\377\236\0\0\0\377\1\0\0\0(\370\0\0\0\0\1\0" \ + "\0\0\222\226\0\0\0\377\1n\12'\377\262\274\21B\377\2\241\17""8\377\"\3" \ + "\14\377\377\0\0\0\377\10\0\0\0\377\22\2\6\3771\4\21\377P\7\34\377o\12" \ + "'\377\215\15""1\377\247\17:\377\267\21@\377\240\274\21B\377\10\262\20" \ + ">\377\234\16""7\377\205\14/\377o\12'\377Z\10\40\377B\6\27\377!\3\14\377" \ + "\4\0\1\377\361\0\0\0\377\2)\4\16\377\252\17<\377\264\274\21B\377\1[\10" \ + "\40\377\236\0\0\0\377\1\0\0\0U\370\0\0\0\0\1\0\0\0\300\226\0\0\0\377" \ + "\1\226\16""5\377\261\274\21B\377\2{\13+\377\11\1\3\377\377\0\0\0\377" \ + "\211\0\0\0\377\15\15\1\5\377\37\3\13\3770\4\21\377C\6\30\377S\10\35\377" \ + "f\11$\377q\12(\377y\13*\377}\13,\377\212\14""0\377\216\15""2\377\226" \ + "\16""5\377\240\16""8\377\205\243\17""9\377\204\226\16""5\377\12\213\15" \ + "1\377\177\13-\377r\12(\377e\11#\377X\10\37\377L\7\33\377\77\6\26\377" \ + "2\5\22\377\40\3\13\377\13\1\4\377\372\0\0\0\377\2\24\2\7\377\226\16""5" \ + "\377\263\274\21B\377\1\202\14.\377\236\0\0\0\377\1\0\0\0\202\370\0\0" \ + "\0\0\1\0\0\0\353\225\0\0\0\377\2\3\0\1\377\267\21@\377\257\274\21B\377" \ + "\3\271\21A\377W\10\37\377\1\0\0\377\377\0\0\0\377\377\0\0\0\377\246\0" \ + "\0\0\377\2\12\1\3\377~\13,\377\262\274\21B\377\1\251\17;\377\236\0\0" \ + "\0\377\1\0\0\0\255\367\0\0\0\0\1\0\0\0\25\226\0\0\0\377\1\35\3\12\377" \ + "\257\274\21B\377\2\245\17:\377&\3\15\377\377\0\0\0\377\377\0\0\0\377" \ + "\252\0\0\0\377\2K\7\32\377\267\21@\377\261\274\21B\377\1\25\2\10\377" \ + "\235\0\0\0\377\1\0\0\0\326\367\0\0\0\0\1\0\0\0""8\226\0\0\0\377\1:\5" \ + "\24\377\256\274\21B\377\2\211\14""0\377\17\1\5\377\377\0\0\0\377\344" \ + "\0\0\0\377\6\4\0\1\377\23\2\7\377%\3\15\3777\5\23\377\77\6\26\377E\6" \ + "\30\377\205K\7\32\377\5\77\6\26\3775\5\23\377+\4\17\377\"\3\14\377\15" \ + "\1\5\377\267\0\0\0\377\2-\4\20\377\252\17<\377\260\274\21B\377\1:\5\24" \ + "\377\235\0\0\0\377\2\0\0\0\370\0\0\0\3\366\0\0\0\0\1\0\0\0\\\226\0\0" \ + "\0\377\1V\10\36\377\254\274\21B\377\3\273\21A\377^\11!\377\2\0\1\377" \ + "\377\0\0\0\377\337\0\0\0\377\6\13\1\4\3771\4\21\377V\10\36\377r\12(\377" \ + "\215\15""1\377\250\17;\377\220\274\21B\377\7\262\20>\377\232\16""6\377" \ + "\201\14-\377d\11#\377E\6\30\377&\3\15\377\10\1\3\377\261\0\0\0\377\2" \ + "\16\1\5\377\210\14""0\377\257\274\21B\377\1X\10\37\377\236\0\0\0\377" \ + "\1\0\0\0\37\366\0\0\0\0\1\0\0\0\200\226\0\0\0\377\1r\12(\377\253\274" \ + "\21B\377\2\257\20>\3778\5\24\377\377\0\0\0\377\335\0\0\0\377\5\23\2\7" \ + "\377E\6\30\377w\13*\377\240\16""8\377\273\21B\377\233\274\21B\377\5\271" \ + "\21A\377\231\16""6\377p\12'\377H\6\31\377\30\2\11\377\256\0\0\0\377\3" \ + "\1\0\0\377X\10\37\377\273\21A\377\255\274\21B\377\1t\13)\377\236\0\0" \ + "\0\377\1\0\0\0C\366\0\0\0\0\1\0\0\0\242\226\0\0\0\377\1\217\15""2\377" \ + "\252\274\21B\377\2\231\16""6\377\33\2\11\377\377\0\0\0\377\333\0\0\0" \ + "\377\3&\3\15\377d\11#\377\235\16""7\377\245\274\21B\377\4\241\17""9\377" \ + "o\12'\377;\5\25\377\7\1\2\377\254\0\0\0\377\2""7\5\23\377\257\20=\377" \ + "\254\274\21B\377\1\221\15""3\377\236\0\0\0\377\1\0\0\0f\366\0\0\0\0\1" \ + "\0\0\0\302\226\0\0\0\377\1\247\17;\377\251\274\21B\377\2}\13,\377\11" \ + "\1\3\377\306\0\0\0\377\5\17\1\5\377#\3\14\377-\4\20\3777\5\23\377@\6" \ + "\27\377\205K\7\32\377\6E\6\30\377\77\6\26\3776\5\23\377#\3\14\377\22" \ + "\2\6\377\3\0\1\377\377\0\0\0\377\203\0\0\0\377\3\35\3\12\377d\11#\377" \ + "\244\17:\377\253\274\21B\377\4\264\20\77\377}\13,\377@\6\27\377\10\1" \ + "\3\377\252\0\0\0\377\2\25\2\10\377\224\15""4\377\253\274\21B\377\1\256" \ + "\20=\377\236\0\0\0\377\1\0\0\0\206\366\0\0\0\0\1\0\0\0\336\225\0\0\0" \ + "\377\2\1\0\1\377\271\21A\377\247\274\21B\377\2\264\20\77\377E\6\30\377" \ + "\301\0\0\0\377\7\12\1\3\377)\4\16\377H\7\31\377f\11$\377\203\14.\377" \ + "\234\16""7\377\264\20\77\377\217\274\21B\377\7\273\21B\377\246\17:\377" \ + "\213\15""1\377o\12'\377S\7\35\377.\4\20\377\11\1\3\377\371\0\0\0\377" \ + "\4\5\0\2\377E\6\30\377\217\15""2\377\273\21B\377\260\274\21B\377\4\264" \ + "\20\77\377w\13*\3773\5\22\377\1\0\1\377\250\0\0\0\377\2\5\0\2\377k\12" \ + "&\377\253\274\21B\377\1\16\1\5\377\235\0\0\0\377\1\0\0\0\241\365\0\0" \ + "\0\0\2\0\0\0\1\0\0\0\370\225\0\0\0\377\1\17\1\5\377\247\274\21B\377\2" \ + "\231\16""6\377\35\3\12\377\276\0\0\0\377\5\34\3\12\377J\7\32\377t\12" \ + ")\377\234\16""7\377\273\21A\377\233\274\21B\377\5\272\21A\377\234\16" \ + "7\377r\12(\377A\6\27\377\20\1\6\377\363\0\0\0\377\3\14\1\4\377X\10\37" \ + "\377\252\17<\377\266\274\21B\377\3\250\17;\377^\11!\377\22\2\6\377\250" \ + "\0\0\0\377\2O\7\34\377\270\21@\377\251\274\21B\377\1&\3\15\377\235\0" \ + "\0\0\377\1\0\0\0\274\365\0\0\0\0\1\0\0\0\25\226\0\0\0\377\1\"\3\14\377" \ + "\246\274\21B\377\2k\12&\377\6\1\2\377\273\0\0\0\377\4\12\1\3\377\77\6" \ + "\26\377r\12(\377\245\17:\377\244\274\21B\377\4\273\21B\377\231\16""6" \ + "\377^\11!\377!\3\14\377\356\0\0\0\377\3\14\1\4\377b\11\"\377\262\20\77" \ + "\377\272\274\21B\377\3\270\21@\377z\13+\377)\4\16\377\247\0\0\0\377\2" \ + "\37\3\13\377\234\16""7\377\250\274\21B\377\1""9\5\24\377\235\0\0\0\377" \ + "\1\0\0\0\327\365\0\0\0\0\1\0\0\0""0\226\0\0\0\377\1""4\5\22\377\244\274" \ + "\21B\377\2\257\20>\377<\5\25\377\272\0\0\0\377\4\14\1\4\377E\6\30\377" \ + "\202\14.\377\266\20@\377\253\274\21B\377\3\240\16""8\377_\11!\377\30" \ + "\2\10\377\351\0\0\0\377\3\7\1\3\377X\10\37\377\257\20=\377\277\274\21" \ + "B\377\3\216\15""2\3777\5\23\377\1\0\0\377\245\0\0\0\377\2\7\1\2\377q" \ + "\12(\377\247\274\21B\377\1K\7\32\377\235\0\0\0\377\1\0\0\0\362\365\0" \ + "\0\0\0\1\0\0\0I\226\0\0\0\377\1E\6\30\377\243\274\21B\377\2\224\15""4" \ + "\377\35\3\12\377\270\0\0\0\377\4\4\0\1\3778\5\24\377}\13,\377\266\20" \ + "@\377\260\274\21B\377\4\273\21A\377\210\14""0\377\77\6\26\377\3\0\1\377" \ + "\345\0\0\0\377\2""7\5\23\377\245\17:\377\303\274\21B\377\3\232\16""6" \ + "\377=\6\25\377\1\0\0\377\245\0\0\0\377\2E\6\30\377\263\20\77\377\245" \ + "\274\21B\377\1^\10!\377\236\0\0\0\377\1\0\0\0\13\364\0\0\0\0\1\0\0\0" \ + "\\\226\0\0\0\377\1S\10\35\377\241\274\21B\377\3\271\21A\377^\10!\377" \ + "\3\0\1\377\267\0\0\0\377\3\27\2\10\377d\11#\377\254\20<\377\266\274\21" \ + "B\377\3\244\17:\377Q\7\34\377\10\1\3\377\341\0\0\0\377\2\23\2\7\377~" \ + "\13,\377\307\274\21B\377\2\224\15""4\3771\4\21\377\245\0\0\0\377\2\35" \ + "\3\12\377\231\16""6\377\244\274\21B\377\1o\12'\377\236\0\0\0\377\1\0" \ + "\0\0\36\364\0\0\0\0\1\0\0\0n\226\0\0\0\377\1\\\10\40\377\240\274\21B" \ + "\377\2\230\16""5\377\40\3\13\377\267\0\0\0\377\3""0\4\21\377\200\14-" \ + "\377\272\21A\377\272\274\21B\377\3\257\20=\377Z\10\40\377\10\1\3\377" \ + "\336\0\0\0\377\2B\6\27\377\260\20>\377\312\274\21B\377\2\210\14""0\377" \ + "\35\3\12\377\244\0\0\0\377\3\10\1\3\377o\12'\377\273\21B\377\242\274" \ + "\21B\377\1\201\14-\377\236\0\0\0\377\1\0\0\0""1\364\0\0\0\0\1\0\0\0\200" \ + "\226\0\0\0\377\1d\11#\377\236\274\21B\377\3\273\21B\377l\12&\377\7\1" \ + "\2\377\265\0\0\0\377\3\1\0\1\377=\6\25\377\225\15""4\377\277\274\21B" \ + "\377\3\253\17<\377P\7\34\377\4\0\2\377\332\0\0\0\377\2\23\2\7\377\207" \ + "\14/\377\315\274\21B\377\3\273\21A\377w\13*\377\16\1\5\377\244\0\0\0" \ + "\377\2""6\5\23\377\252\17<\377\241\274\21B\377\1\217\15""2\377\236\0" \ + "\0\0\377\1\0\0\0D\364\0\0\0\0\1\0\0\0\223\226\0\0\0\377\1l\12&\377\235" \ + "\274\21B\377\2\236\16""7\377)\4\16\377\265\0\0\0\377\3\1\0\1\377E\6\30" \ + "\377\240\16""8\377\303\274\21B\377\2\237\16""8\377/\4\21\377\330\0\0" \ + "\0\377\2(\4\16\377\247\17;\377\320\274\21B\377\2\250\17;\377<\5\25\377" \ + "\244\0\0\0\377\2\12\1\4\377q\12(\377\240\274\21B\377\1\230\16""5\377" \ + "\236\0\0\0\377\1\0\0\0W\364\0\0\0\0\1\0\0\0\245\226\0\0\0\377\1u\13)" \ + "\377\233\274\21B\377\3\270\21A\377^\11!\377\6\1\2\377\265\0\0\0\377\2" \ + ":\5\24\377\234\16""7\377\306\274\21B\377\3\273\21B\377v\13)\377\17\1" \ + "\5\377\325\0\0\0\377\2X\10\37\377\271\21A\377\323\274\21B\377\2\206\14" \ + "/\377\26\2\10\377\244\0\0\0\377\2C\6\30\377\260\20>\377\236\274\21B\377" \ + "\1\240\16""8\377\236\0\0\0\377\1\0\0\0i\364\0\0\0\0\1\0\0\0\262\226\0" \ + "\0\0\377\1}\13,\377\232\274\21B\377\2\230\16""5\377#\3\14\377\265\0\0" \ + "\0\377\2%\3\15\377\221\15""3\377\312\274\21B\377\2\254\20<\377:\5\24" \ + "\377\322\0\0\0\377\2\2\0\1\377l\12&\377\326\274\21B\377\2\257\20=\377" \ + "D\6\30\377\244\0\0\0\377\2\20\1\6\377w\13*\377\235\274\21B\377\1\251" \ + "\17;\377\236\0\0\0\377\1\0\0\0w\364\0\0\0\0\1\0\0\0\275\226\0\0\0\377" \ + "\1\202\14.\377\230\274\21B\377\3\270\21A\377c\11#\377\7\1\2\377\264\0" \ + "\0\0\377\3\21\2\6\377w\13*\377\273\21B\377\315\274\21B\377\2}\13,\377" \ + "\15\1\5\377\317\0\0\0\377\2\12\1\3\377\211\14""0\377\331\274\21B\377" \ + "\2\201\14-\377\16\1\5\377\244\0\0\0\377\2""8\5\24\377\251\17;\377\233" \ + "\274\21B\377\1\261\20>\377\236\0\0\0\377\1\0\0\0\201\364\0\0\0\0\1\0" \ + "\0\0\310\226\0\0\0\377\1\201\14-\377\227\274\21B\377\2\210\14""0\377" \ + "\32\2\11\377\265\0\0\0\377\2F\6\31\377\255\20=\377\320\274\21B\377\2" \ + "\241\17""8\377\40\3\13\377\315\0\0\0\377\2\15\1\4\377\217\15""2\377\333" \ + "\274\21B\377\2\244\17""9\377*\4\17\377\244\0\0\0\377\2\14\1\4\377q\12" \ + "(\377\232\274\21B\377\1\271\21A\377\236\0\0\0\377\1\0\0\0\214\364\0\0" \ + "\0\0\1\0\0\0\322\226\0\0\0\377\1\200\14-\377\225\274\21B\377\2\247\17" \ + ";\3779\5\24\377\265\0\0\0\377\2\35\3\12\377\221\15""3\377\323\274\21" \ + "B\377\2\266\20@\377G\6\31\377\313\0\0\0\377\2\22\2\6\377\237\16""8\377" \ + "\335\274\21B\377\3\272\21A\377^\11!\377\1\0\1\377\244\0\0\0\377\2>\6" \ + "\26\377\251\17;\377\231\274\21B\377\1\2\0\1\377\235\0\0\0\377\1\0\0\0" \ + "\226\364\0\0\0\0\1\0\0\0\335\226\0\0\0\377\1\177\13-\377\223\274\21B" \ + "\377\3\271\21A\377o\12'\377\17\1\5\377\264\0\0\0\377\3\1\0\0\377P\7\34" \ + "\377\263\20\77\377\325\274\21B\377\3\273\21B\377_\11!\377\1\0\0\377\310" \ + "\0\0\0\377\2\17\1\5\377\232\16""6\377\340\274\21B\377\2\204\14.\377\14" \ + "\1\4\377\244\0\0\0\377\3\7\1\2\377^\11!\377\270\21@\377\227\274\21B\377" \ + "\1\1\0\0\377\235\0\0\0\377\1\0\0\0\241\364\0\0\0\0\1\0\0\0\346\226\0" \ + "\0\0\377\1}\13,\377\221\274\21B\377\3\273\21B\377w\13*\377\26\2\10\377" \ + "\265\0\0\0\377\2\24\2\7\377\214\15""1\377\331\274\21B\377\2\177\13-\377" \ + "\6\1\2\377\306\0\0\0\377\2\12\1\4\377\226\16""5\377\342\274\21B\377\2" \ + "\235\16""7\377\32\2\11\377\245\0\0\0\377\2\34\3\12\377\213\15""1\377" \ + "\226\274\21B\377\236\0\0\0\377\1\0\0\0\253\364\0\0\0\0\1\0\0\0\352\226" \ + "\0\0\0\377\1}\13,\377\220\274\21B\377\2\231\16""6\3773\5\22\377\266\0" \ + "\0\0\377\2""3\5\22\377\252\17<\377\333\274\21B\377\2\205\14/\377\10\1" \ + "\3\377\304\0\0\0\377\2\6\1\2\377\216\15""2\377\344\274\21B\377\2\257" \ + "\20>\3770\4\21\377\245\0\0\0\377\3\2\0\1\377L\7\33\377\254\20<\377\223" \ + "\274\21B\377\1\273\21B\377\236\0\0\0\377\1\0\0\0\257\364\0\0\0\0\1\0" \ + "\0\0\355\226\0\0\0\377\1w\13*\377\216\274\21B\377\3\226\16""5\377;\5" \ + "\25\377\1\0\0\377\265\0\0\0\377\3\4\0\1\377k\12&\377\273\21B\377\335" \ + "\274\21B\377\2\222\15""3\377\12\1\4\377\302\0\0\0\377\2\1\0\1\377}\13" \ + ",\377\346\274\21B\377\2\270\21@\377E\6\30\377\246\0\0\0\377\3\7\1\3\377" \ + "X\10\37\377\262\20\77\377\221\274\21B\377\1\273\21A\377\236\0\0\0\377" \ + "\1\0\0\0\262\364\0\0\0\0\1\0\0\0\360\226\0\0\0\377\1Y\10\37\377\214\274" \ + "\21B\377\2\220\15""2\3777\5\23\377\267\0\0\0\377\2\22\2\6\377\216\15" \ + "2\377\340\274\21B\377\2\222\15""3\377\12\1\4\377\301\0\0\0\377\1^\10" \ + "!\377\350\274\21B\377\2\273\21B\377S\10\35\377\247\0\0\0\377\3\30\2\10" \ + "\377{\13+\377\273\21A\377\217\274\21B\377\1\272\21A\377\236\0\0\0\377" \ + "\1\0\0\0\265\364\0\0\0\0\1\0\0\0\362\226\0\0\0\377\2\26\2\10\377\264" \ + "\20\77\377\210\274\21B\377\3\261\20>\377m\12&\377!\3\14\377\270\0\0\0" \ + "\377\2#\3\14\377\244\17:\377\342\274\21B\377\2\214\15""1\377\6\1\2\377" \ + "\277\0\0\0\377\2>\6\26\377\273\21B\377\352\274\21B\377\2l\12&\377\1\0" \ + "\0\377\247\0\0\0\377\3\37\3\13\377z\13+\377\272\21A\377\215\274\21B\377" \ + "\1\265\20\77\377\236\0\0\0\377\1\0\0\0\270\364\0\0\0\0\1\0\0\0\365\227" \ + "\0\0\0\377\2.\4\20\377\242\17""9\377\204\274\21B\377\4\247\17;\377s\12" \ + "(\377\77\6\26\377\7\1\3\377\271\0\0\0\377\2:\5\24\377\265\20\77\377\344" \ + "\274\21B\377\2\204\14.\377\3\0\1\377\275\0\0\0\377\2\37\3\13\377\263" \ + "\20\77\377\354\274\21B\377\2w\13*\377\3\0\1\377\250\0\0\0\377\3\33\2" \ + "\12\377t\13)\377\267\21@\377\213\274\21B\377\1\225\15""4\377\236\0\0" \ + "\0\377\1\0\0\0\274\363\0\0\0\0\2\0\0\0\12\0\0\0\372\230\0\0\0\377\5\1" \ + "\0\0\377!\3\14\3772\5\22\377*\4\17\377\26\2\10\377\274\0\0\0\377\2^\11" \ + "!\377\273\21B\377\346\274\21B\377\1q\12(\377\274\0\0\0\377\2\4\0\2\377" \ + "\227\16""5\377\356\274\21B\377\2s\12(\377\1\0\0\377\251\0\0\0\377\3\17" \ + "\1\5\377V\10\36\377\240\16""8\377\211\274\21B\377\1I\7\32\377\236\0\0" \ + "\0\377\1\0\0\0\314\363\0\0\0\0\1\0\0\0\203\331\0\0\0\377\1a\11\"\377" \ + "\351\274\21B\377\1M\7\33\377\273\0\0\0\377\1f\11$\377\360\274\21B\377" \ + "\2v\13)\377\1\0\1\377\252\0\0\0\377\5\1\0\0\377-\4\20\377c\11#\377\227" \ + "\16""5\377\273\21A\377\203\274\21B\377\2\262\20\77\377Y\10\37\377\240" \ + "\0\0\0\377\1\0\0\0K\361\0\0\0\0\2\0\0\0\37\0\0\0\366\327\0\0\0\377\2" \ + "\3\0\1\377x\13*\377\352\274\21B\377\2\271\21A\377/\4\21\377\271\0\0\0" \ + "\377\2""1\4\21\377\273\21A\377\361\274\21B\377\2t\12)\377\1\0\0\377\255" \ + "\0\0\0\377\5\15\1\5\377#\3\14\3772\5\22\377*\4\17\377\7\1\3\377\241\0" \ + "\0\0\377\2\0\0\0\327\0\0\0\5\360\0\0\0\0\1\0\0\0\243\327\0\0\0\377\2" \ + "\6\1\2\377\202\14.\377\354\274\21B\377\2\254\20<\377\25\2\7\377\267\0" \ + "\0\0\377\2\6\1\2\377\241\17""8\377\363\274\21B\377\1a\11\"\377\324\0" \ + "\0\0\377\1\0\0\0k\357\0\0\0\0\2\0\0\0""6\0\0\0\376\326\0\0\0\377\2\4" \ + "\0\1\377\200\14-\377\356\274\21B\377\2\213\15""1\377\1\0\1\377\266\0" \ + "\0\0\377\1d\11#\377\365\274\21B\377\1X\10\37\377\323\0\0\0\377\2\0\0" \ + "\0\353\0\0\0\20\355\0\0\0\0\2\0\0\0\1\0\0\0\306\326\0\0\0\377\2\4\0\1" \ + "\377\201\14-\377\360\274\21B\377\1X\10\37\377\265\0\0\0\377\2#\3\14\377" \ + "\271\21A\377\365\274\21B\377\2\273\21B\377J\7\32\377\323\0\0\0\377\1" \ + "\0\0\0\212\355\0\0\0\0\1\0\0\0T\326\0\0\0\377\2\3\0\1\377\200\14-\377" \ + "\361\274\21B\377\2\270\21@\377#\3\14\377\264\0\0\0\377\1\213\15""1\377" \ + "\367\274\21B\377\2\270\21A\3772\5\22\377\322\0\0\0\377\2\0\0\0\371\0" \ + "\0\0$\353\0\0\0\0\2\0\0\0\7\0\0\0\336\326\0\0\0\377\1p\12'\377\363\274" \ + "\21B\377\2\226\16""5\377\2\0\1\377\262\0\0\0\377\1:\5\24\377\371\274" \ + "\21B\377\2\262\20\77\377\37\3\13\377\322\0\0\0\377\1\0\0\0\252\353\0" \ + "\0\0\0\1\0\0\0t\326\0\0\0\377\1l\12&\377\365\274\21B\377\1V\10\36\377" \ + "\261\0\0\0\377\2\4\0\1\377\237\16""8\377\372\274\21B\377\2\237\16""8" \ + "\377\14\1\4\377\322\0\0\0\377\1\0\0\0=\351\0\0\0\0\2\0\0\0(\0\0\0\355" \ + "\325\0\0\0\377\1X\10\37\377\366\274\21B\377\2\265\20\77\377\31\2\11\377" \ + "\260\0\0\0\377\1F\6\31\377\374\274\21B\377\2\201\14-\377\1\0\0\377\321" \ + "\0\0\0\377\2\0\0\0\312\0\0\0\22\346\0\0\0\0\3\0\0\0\6\0\0\0\210\0\0\0" \ + "\372\325\0\0\0\377\2\77\6\26\377\273\21A\377\367\274\21B\377\1}\13,\377" \ + "\257\0\0\0\377\2\3\0\1\377\242\17""9\377\375\274\21B\377\1\\\10\40\377" \ + "\322\0\0\0\377\2\0\0\0\356\0\0\0f\344\0\0\0\0\2\0\0\0""2\0\0\0\322\326" \ + "\0\0\0\377\2(\4\16\377\266\20@\377\371\274\21B\377\1,\4\20\377\256\0" \ + "\0\0\377\1@\6\27\377\376\274\21B\377\2\273\21A\3774\5\22\377\323\0\0" \ + "\0\377\2\0\0\0\263\0\0\0\32\341\0\0\0\0\2\0\0\0j\0\0\0\367\326\0\0\0" \ + "\377\2\24\2\7\377\252\17<\377\372\274\21B\377\2\223\15""4\377\1\0\0\377" \ + "\255\0\0\0\377\1\226\16""5\377\377\274\21B\377\2\252\17<\377\21\2\6\377" \ + "\323\0\0\0\377\2\0\0\0\344\0\0\0A\336\0\0\0\0\2\0\0\0\31\0\0\0\273\327" \ + "\0\0\0\377\2\3\0\1\377\215\15""1\377\374\274\21B\377\1""7\5\23\377\254" \ + "\0\0\0\377\1+\4\17\377\377\274\21B\377\202\274\21B\377\2\210\14""0\377" \ + "\1\0\0\377\323\0\0\0\377\3\0\0\0\376\0\0\0\221\0\0\0\6\333\0\0\0\0\2" \ + "\0\0\0<\0\0\0\342\330\0\0\0\377\1k\12&\377\375\274\21B\377\1\225\15""4" \ + "\377\254\0\0\0\377\1}\13,\377\377\274\21B\377\203\274\21B\377\1S\10\35" \ + "\377\325\0\0\0\377\2\0\0\0\305\0\0\0\35\331\0\0\0\0\2\0\0\0w\0\0\0\374" \ + "\330\0\0\0\377\1C\6\30\377\377\274\21B\377\1""1\4\21\377\252\0\0\0\377" \ + "\2\24\2\7\377\271\21A\377\377\274\21B\377\203\274\21B\377\2\267\21@\377" \ + "!\3\14\377\325\0\0\0\377\2\0\0\0\355\0\0\0B\326\0\0\0\0\2\0\0\0\5\0\0" \ + "\0\232\331\0\0\0\377\2\31\2\11\377\260\20>\377\377\274\21B\377\1\210" \ + "\14""0\377\252\0\0\0\377\1V\10\36\377\377\274\21B\377\205\274\21B\377" \ + "\2\223\15""4\377\3\0\1\377\325\0\0\0\377\2\0\0\0\373\0\0\0k\324\0\0\0" \ + "\0\2\0\0\0\15\0\0\0\266\331\0\0\0\377\2\3\0\1\377\225\15""4\377\377\274" \ + "\21B\377\3\274\21B\377\273\21B\377\35\3\12\377\251\0\0\0\377\1\235\16" \ + "7\377\377\274\21B\377\206\274\21B\377\1X\10\37\377\327\0\0\0\377\2\0" \ + "\0\0\206\0\0\0\1\321\0\0\0\0\2\0\0\0\33\0\0\0\325\332\0\0\0\377\1a\11" \ + "\"\377\377\274\21B\377\203\274\21B\377\1l\12&\377\250\0\0\0\377\1#\3" \ + "\14\377\377\274\21B\377\207\274\21B\377\2\265\20@\377\33\2\11\377\327" \ + "\0\0\0\377\2\0\0\0\256\0\0\0\7\317\0\0\0\0\2\0\0\0$\0\0\0\336\332\0\0" \ + "\0\377\2)\4\16\377\271\21A\377\377\274\21B\377\203\274\21B\377\2\262" \ + "\20\77\377\12\1\4\377\247\0\0\0\377\1b\11\"\377\377\274\21B\377\210\274" \ + "\21B\377\1\205\14/\377\330\0\0\0\377\2\0\0\0\275\0\0\0\15\315\0\0\0\0" \ + "\2\0\0\0(\0\0\0\342\332\0\0\0\377\2\6\1\2\377\235\16""7\377\377\274\21" \ + "B\377\205\274\21B\377\1F\6\31\377\247\0\0\0\377\1\234\16""7\377\377\274" \ + "\21B\377\211\274\21B\377\1\77\6\26\377\330\0\0\0\377\2\0\0\0\277\0\0" \ + "\0\16\313\0\0\0\0\2\0\0\0-\0\0\0\353\333\0\0\0\377\1e\11#\377\377\274" \ + "\21B\377\206\274\21B\377\1\214\15""1\377\246\0\0\0\377\1\33\2\11\377" \ + "\377\274\21B\377\212\274\21B\377\2\250\17;\377\11\1\3\377\330\0\0\0\377" \ + "\2\0\0\0\317\0\0\0\22\311\0\0\0\0\2\0\0\0+\0\0\0\352\333\0\0\0\377\2" \ + "%\3\15\377\271\21A\377\377\274\21B\377\206\274\21B\377\2\273\21A\377" \ + "\25\2\10\377\245\0\0\0\377\1R\7\35\377\377\274\21B\377\213\274\21B\377" \ + "\1a\11\"\377\253\0\0\0\377\5\25\2\7\3776\5\23\377\77\6\26\3775\5\23\377" \ + "\31\2\11\377\251\0\0\0\377\2\0\0\0\310\0\0\0\16\307\0\0\0\0\2\0\0\0)" \ + "\0\0\0\351\333\0\0\0\377\2\1\0\1\377\222\15""3\377\377\274\21B\377\210" \ + "\274\21B\377\1T\10\36\377\245\0\0\0\377\1\204\14.\377\377\274\21B\377" \ + "\213\274\21B\377\2\264\20\77\377\25\2\7\377\247\0\0\0\377\3\1\0\1\377" \ + "C\6\30\377\226\16""5\377\205\274\21B\377\3\254\20<\377J\7\32\377\1\0" \ + "\1\377\247\0\0\0\377\2\0\0\0\306\0\0\0\15\305\0\0\0\0\2\0\0\0\33\0\0" \ + "\0\337\243\0\0\0\377\6\7\1\2\377(\4\16\377:\5\24\377=\6\25\377+\4\17" \ + "\377\5\0\2\377\263\0\0\0\377\1N\7\33\377\377\274\21B\377\211\274\21B" \ + "\377\1\216\15""2\377\244\0\0\0\377\2\2\0\1\377\260\20>\377\377\274\21" \ + "B\377\214\274\21B\377\1v\13)\377\246\0\0\0\377\2\30\2\10\377\220\15""2" \ + "\377\211\274\21B\377\2\223\15""4\377#\3\14\377\247\0\0\0\377\2\0\0\0" \ + "\270\0\0\0\5\303\0\0\0\0\2\0\0\0\22\0\0\0\326\242\0\0\0\377\3\22\2\6" \ + "\377z\13+\377\271\21A\377\204\274\21B\377\3\264\20\77\377u\13)\377\35" \ + "\3\12\377\260\0\0\0\377\2\17\1\5\377\260\20>\377\377\274\21B\377\211" \ + "\274\21B\377\2\272\21A\377\17\1\5\377\243\0\0\0\377\1&\3\15\377\377\274" \ + "\21B\377\215\274\21B\377\2\273\21A\377\"\3\14\377\244\0\0\0\377\2(\4" \ + "\16\377\255\20=\377\213\274\21B\377\3\271\21A\377j\12%\377\12\1\4\377" \ + "\246\0\0\0\377\2\0\0\0\251\0\0\0\2\301\0\0\0\0\2\0\0\0\10\0\0\0\302\241" \ + "\0\0\0\377\3\2\0\1\377Q\7\34\377\261\20>\377\210\274\21B\377\3\267\21" \ + "@\377Z\10\40\377\1\0\1\377\256\0\0\0\377\1o\12'\377\377\274\21B\377\213" \ + "\274\21B\377\1C\6\30\377\243\0\0\0\377\1S\7\35\377\377\274\21B\377\216" \ + "\274\21B\377\1|\13+\377\243\0\0\0\377\2\33\2\11\377\255\20=\377\216\274" \ + "\21B\377\2\251\17;\377:\5\24\377\246\0\0\0\377\1\0\0\0\212\300\0\0\0" \ + "\0\2\0\0\0\2\0\0\0\251\241\0\0\0\377\2)\4\16\377\230\16""5\377\214\274" \ + "\21B\377\2\201\14-\377\4\0\2\377\254\0\0\0\377\2\37\3\13\377\271\21A" \ + "\377\377\274\21B\377\213\274\21B\377\1v\13)\377\243\0\0\0\377\1|\13+" \ + "\377\377\274\21B\377\216\274\21B\377\2\273\21B\377'\4\16\377\241\0\0" \ + "\0\377\2\7\1\2\377\234\16""7\377\221\274\21B\377\2}\13,\377\14\1\4\377" \ + "\245\0\0\0\377\1\0\0\0n\277\0\0\0\0\1\0\0\0~\240\0\0\0\377\3\10\1\3\377" \ + "o\12'\377\273\21A\377\216\274\21B\377\1x\13*\377\254\0\0\0\377\1\205" \ + "\14/\377\377\274\21B\377\214\274\21B\377\1\244\17""9\377\243\0\0\0\377" \ + "\1\240\16""8\377\377\274\21B\377\217\274\21B\377\1~\13,\377\241\0\0\0" \ + "\377\1\\\10\40\377\223\274\21B\377\2\236\16""7\377$\3\15\377\244\0\0" \ + "\0\377\2\0\0\0\373\0\0\0E\275\0\0\0\0\2\0\0\0U\0\0\0\376\237\0\0\0\377" \ + "\2-\4\20\377\245\17:\377\221\274\21B\377\1O\7\34\377\252\0\0\0\377\1" \ + "/\4\21\377\377\274\21B\377\216\274\21B\377\1\30\2\10\377\241\0\0\0\377" \ + "\2\14\1\4\377\273\21B\377\377\274\21B\377\217\274\21B\377\2\273\21B\377" \ + "\40\3\13\377\237\0\0\0\377\2\26\2\10\377\265\20@\377\224\274\21B\377" \ + "\3\267\21@\377V\10\36\377\1\0\1\377\243\0\0\0\377\2\0\0\0\357\0\0\0$" \ + "\273\0\0\0\0\2\0\0\0+\0\0\0\363\236\0\0\0\377\3\1\0\1\377X\10\37\377" \ + "\270\21A\377\222\274\21B\377\2\263\20\77\377\25\2\7\377\251\0\0\0\377" \ + "\1\213\15""1\377\377\274\21B\377\216\274\21B\377\1D\6\30\377\241\0\0" \ + "\0\377\1,\4\20\377\377\274\21B\377\221\274\21B\377\1r\12(\377\237\0\0" \ + "\0\377\1i\11%\377\227\274\21B\377\2\203\14.\377\12\1\4\377\243\0\0\0" \ + "\377\2\0\0\0\327\0\0\0\16\271\0\0\0\0\2\0\0\0\17\0\0\0\331\236\0\0\0" \ + "\377\2\25\2\10\377\214\15""1\377\225\274\21B\377\1{\13+\377\250\0\0\0" \ + "\377\1""4\5\22\377\377\274\21B\377\217\274\21B\377\1m\12&\377\241\0\0" \ + "\0\377\1J\7\32\377\377\274\21B\377\221\274\21B\377\2\270\21A\377\26\2" \ + "\10\377\235\0\0\0\377\2\14\1\4\377\263\20\77\377\230\274\21B\377\2\242" \ + "\17""9\377\40\3\13\377\243\0\0\0\377\2\0\0\0\256\0\0\0\1\270\0\0\0\0" \ + "\1\0\0\0\247\236\0\0\0\377\2""0\4\21\377\255\20=\377\226\274\21B\377" \ + "\2\272\21A\377\32\2\11\377\247\0\0\0\377\1\216\15""2\377\377\274\21B" \ + "\377\217\274\21B\377\1\221\15""3\377\241\0\0\0\377\1d\11#\377\377\274" \ + "\21B\377\222\274\21B\377\1a\11\"\377\235\0\0\0\377\1U\10\36\377\232\274" \ + "\21B\377\2\262\20\77\377;\5\25\377\243\0\0\0\377\1\0\0\0k\267\0\0\0\0" \ + "\1\0\0\0h\236\0\0\0\377\2X\10\37\377\272\21A\377\230\274\21B\377\1m\12" \ + "&\377\246\0\0\0\377\1-\4\20\377\377\274\21B\377\220\274\21B\377\2\265" \ + "\20@\377\3\0\1\377\240\0\0\0\377\1\200\14-\377\377\274\21B\377\222\274" \ + "\21B\377\2\255\20=\377\6\1\2\377\234\0\0\0\377\1\237\16""8\377\233\274" \ + "\21B\377\2\271\21A\377S\7\35\377\242\0\0\0\377\2\0\0\0\372\0\0\0""7\265" \ + "\0\0\0\0\2\0\0\0.\0\0\0\367\234\0\0\0\377\2\7\1\3\377{\13+\377\232\274" \ + "\21B\377\2\265\20\77\377\16\1\5\377\245\0\0\0\377\1\201\14-\377\377\274" \ + "\21B\377\221\274\21B\377\1\36\3\13\377\240\0\0\0\377\1\227\16""5\377" \ + "\377\274\21B\377\223\274\21B\377\1@\6\27\377\233\0\0\0\377\1\"\3\14\377" \ + "\236\274\21B\377\2o\12'\377\1\0\1\377\241\0\0\0\377\2\0\0\0\333\0\0\0" \ + "\15\263\0\0\0\0\2\0\0\0\11\0\0\0\324\234\0\0\0\377\2\20\1\6\377\220\15" \ + "2\377\234\274\21B\377\1O\7\34\377\244\0\0\0\377\2\40\3\13\377\273\21" \ + "B\377\377\274\21B\377\221\274\21B\377\1<\5\25\377\240\0\0\0\377\1\253" \ + "\17<\377\377\274\21B\377\223\274\21B\377\1\220\15""2\377\233\0\0\0\377" \ + "\1]\10!\377\237\274\21B\377\2z\13+\377\4\0\1\377\241\0\0\0\377\1\0\0" \ + "\0\237\263\0\0\0\0\1\0\0\0\214\234\0\0\0\377\2\33\2\12\377\245\17:\377" \ + "\235\274\21B\377\1\215\15""1\377\244\0\0\0\377\1p\12'\377\377\274\21" \ + "B\377\222\274\21B\377\1V\10\36\377\237\0\0\0\377\2\3\0\1\377\273\21A" \ + "\377\377\274\21B\377\223\274\21B\377\2\273\21B\377\33\2\11\377\232\0" \ + "\0\0\377\1\231\16""6\377\240\274\21B\377\2\203\14.\377\6\1\2\377\241" \ + "\0\0\0\377\1\0\0\0R\261\0\0\0\0\2\0\0\0D\0\0\0\376\233\0\0\0\377\2#\3" \ + "\14\377\253\17<\377\236\274\21B\377\2\272\21A\377\17\1\5\377\242\0\0" \ + "\0\377\2\15\1\4\377\265\20@\377\377\274\21B\377\222\274\21B\377\1r\12" \ + "(\377\237\0\0\0\377\1\25\2\7\377\377\274\21B\377\225\274\21B\377\1a\11" \ + "\"\377\231\0\0\0\377\2\24\2\7\377\273\21B\377\241\274\21B\377\2\205\14" \ + "/\377\7\1\2\377\240\0\0\0\377\2\0\0\0\354\0\0\0\27\257\0\0\0\0\2\0\0" \ + "\0\14\0\0\0\336\233\0\0\0\377\2*\4\17\377\257\20>\377\240\274\21B\377" \ + "\1G\6\31\377\242\0\0\0\377\1O\7\34\377\377\274\21B\377\223\274\21B\377" \ + "\1\213\15""1\377\237\0\0\0\377\1#\3\14\377\377\274\21B\377\225\274\21" \ + "B\377\2\241\17""9\377\1\0\0\377\230\0\0\0\377\1\77\6\26\377\243\274\21" \ + "B\377\2\213\15""1\377\6\1\2\377\240\0\0\0\377\1\0\0\0\252\257\0\0\0\0" \ + "\1\0\0\0\217\233\0\0\0\377\2+\4\17\377\260\20>\377\241\274\21B\377\1" \ + "~\13,\377\241\0\0\0\377\2\1\0\0\377\237\16""8\377\377\274\21B\377\223" \ + "\274\21B\377\1\236\16""7\377\237\0\0\0\377\1,\4\20\377\377\274\21B\377" \ + "\226\274\21B\377\1+\4\17\377\230\0\0\0\377\1h\11$\377\244\274\21B\377" \ + "\2\202\14.\377\3\0\1\377\240\0\0\0\377\1\0\0\0S\255\0\0\0\0\2\0\0\0<" \ + "\0\0\0\375\232\0\0\0\377\2-\4\20\377\265\20\77\377\242\274\21B\377\1" \ + "\254\20<\377\241\0\0\0\377\1)\4\16\377\377\274\21B\377\224\274\21B\377" \ + "\1\257\20>\377\237\0\0\0\377\1""6\5\23\377\377\274\21B\377\226\274\21" \ + "B\377\1l\12&\377\230\0\0\0\377\1\221\15""3\377\245\274\21B\377\2x\13" \ + "*\377\1\0\1\377\237\0\0\0\377\2\0\0\0\347\0\0\0\22\253\0\0\0\0\2\0\0" \ + "\0\3\0\0\0\320\232\0\0\0\377\2&\3\15\377\261\20>\377\244\274\21B\377" \ + "\1\27\2\10\377\240\0\0\0\377\1p\12'\377\377\274\21B\377\225\274\21B\377" \ + "\1\7\1\2\377\236\0\0\0\377\1\77\6\26\377\377\274\21B\377\226\274\21B" \ + "\377\1\244\17:\377\227\0\0\0\377\2\3\0\1\377\264\20\77\377\246\274\21" \ + "B\377\1f\11$\377\240\0\0\0\377\1\0\0\0\226\253\0\0\0\0\1\0\0\0q\232\0" \ + "\0\0\377\2\36\3\13\377\255\20=\377\245\274\21B\377\1@\6\27\377\237\0" \ + "\0\0\377\2\4\0\2\377\255\20=\377\377\274\21B\377\225\274\21B\377\1\25" \ + "\2\7\377\236\0\0\0\377\1E\6\30\377\377\274\21B\377\227\274\21B\377\1" \ + "%\3\15\377\226\0\0\0\377\1\40\3\13\377\250\274\21B\377\1M\7\33\377\237" \ + "\0\0\0\377\2\0\0\0\375\0\0\0""7\251\0\0\0\0\2\0\0\0\31\0\0\0\362\231" \ + "\0\0\0\377\2\24\2\7\377\244\17""9\377\246\274\21B\377\1g\11$\377\237" \ + "\0\0\0\377\1:\5\24\377\377\274\21B\377\226\274\21B\377\1\35\3\12\377" \ + "\236\0\0\0\377\1E\6\30\377\377\274\21B\377\227\274\21B\377\1^\10!\377" \ + "\226\0\0\0\377\1=\6\25\377\250\274\21B\377\2\272\21A\3776\5\23\377\237" \ + "\0\0\0\377\2\0\0\0\314\0\0\0\2\250\0\0\0\0\1\0\0\0\240\231\0\0\0\377" \ + "\2\7\1\3\377\230\16""5\377\247\274\21B\377\1\215\15""1\377\237\0\0\0" \ + "\377\1{\13+\377\377\274\21B\377\226\274\21B\377\1(\4\16\377\236\0\0\0" \ + "\377\1G\6\31\377\377\274\21B\377\227\274\21B\377\1\226\16""5\377\226" \ + "\0\0\0\377\1Y\10\37\377\251\274\21B\377\2\257\20=\377\33\2\11\377\237" \ + "\0\0\0\377\1\0\0\0d\247\0\0\0\0\2\0\0\0""5\0\0\0\375\230\0\0\0\377\2" \ + "\1\0\1\377\202\14.\377\250\274\21B\377\1\252\17<\377\236\0\0\0\377\2" \ + "\4\0\1\377\260\20>\377\377\274\21B\377\226\274\21B\377\1""1\4\21\377" \ + "\236\0\0\0\377\1H\6\31\377\377\274\21B\377\227\274\21B\377\2\272\21A" \ + "\377\15\1\5\377\225\0\0\0\377\1t\13)\377\252\274\21B\377\2\236\16""7" \ + "\377\12\1\4\377\236\0\0\0\377\2\0\0\0\347\0\0\0\16\245\0\0\0\0\2\0\0" \ + "\0\1\0\0\0\310\231\0\0\0\377\1^\10!\377\252\274\21B\377\1\12\1\3\377" \ + "\235\0\0\0\377\1""5\5\23\377\377\274\21B\377\227\274\21B\377\1""6\5\23" \ + "\377\236\0\0\0\377\1C\6\30\377\377\274\21B\377\230\274\21B\377\1\77\6" \ + "\26\377\225\0\0\0\377\1\217\15""2\377\253\274\21B\377\1w\13*\377\237" \ + "\0\0\0\377\1\0\0\0\210\245\0\0\0\0\1\0\0\0P\231\0\0\0\377\2\77\6\26\377" \ + "\273\21B\377\252\274\21B\377\1#\3\14\377\235\0\0\0\377\1m\12&\377\377" \ + "\274\21B\377\227\274\21B\377\1""7\5\23\377\236\0\0\0\377\1<\5\25\377" \ + "\377\274\21B\377\230\274\21B\377\1q\12(\377\225\0\0\0\377\1\252\17<\377" \ + "\254\274\21B\377\1\77\6\26\377\236\0\0\0\377\2\0\0\0\367\0\0\0\35\243" \ + "\0\0\0\0\2\0\0\0\4\0\0\0\330\230\0\0\0\377\2\30\2\10\377\261\20>\377" \ + "\253\274\21B\377\1>\6\26\377\235\0\0\0\377\1\246\17:\377\377\274\21B" \ + "\377\227\274\21B\377\1""7\5\23\377\236\0\0\0\377\1""4\5\22\377\377\274" \ + "\21B\377\230\274\21B\377\1\237\16""8\377\224\0\0\0\377\2\2\0\1\377\272" \ + "\21A\377\254\274\21B\377\2\261\20>\377\26\2\10\377\236\0\0\0\377\1\0" \ + "\0\0\234\243\0\0\0\0\1\0\0\0e\230\0\0\0\377\2\1\0\1\377\216\15""2\377" \ + "\254\274\21B\377\1X\10\37\377\234\0\0\0\377\1\33\2\11\377\377\274\21" \ + "B\377\230\274\21B\377\1""9\5\24\377\236\0\0\0\377\1,\4\20\377\377\274" \ + "\21B\377\230\274\21B\377\2\273\21B\377\15\1\4\377\223\0\0\0\377\1\20" \ + "\1\6\377\256\274\21B\377\2\217\15""2\377\1\0\1\377\235\0\0\0\377\2\0" \ + "\0\0\374\0\0\0+\241\0\0\0\0\2\0\0\0\7\0\0\0\341\230\0\0\0\377\1[\10\40" \ + "\377\255\274\21B\377\1j\12%\377\234\0\0\0\377\1N\7\33\377\377\274\21" \ + "B\377\230\274\21B\377\1""4\5\22\377\236\0\0\0\377\1\36\3\13\377\377\274" \ + "\21B\377\231\274\21B\377\1""7\5\23\377\223\0\0\0\377\1\40\3\13\377\257" \ + "\274\21B\377\1O\7\34\377\236\0\0\0\377\1\0\0\0\252\241\0\0\0\0\1\0\0" \ + "\0h\230\0\0\0\377\2(\4\16\377\271\21A\377\255\274\21B\377\1{\13+\377" \ + "\234\0\0\0\377\1\177\13-\377\377\274\21B\377\230\274\21B\377\1-\4\20" \ + "\377\236\0\0\0\377\1\17\1\5\377\377\274\21B\377\231\274\21B\377\1^\11" \ + "!\377\223\0\0\0\377\1""1\4\21\377\257\274\21B\377\2\265\20\77\377\30" \ + "\2\11\377\235\0\0\0\377\2\0\0\0\376\0\0\0,\237\0\0\0\0\2\0\0\0\4\0\0" \ + "\0\335\227\0\0\0\377\2\5\0\2\377\233\16""6\377\256\274\21B\377\1\213" \ + "\15""1\377\233\0\0\0\377\2\1\0\0\377\256\20=\377\377\274\21B\377\230" \ + "\274\21B\377\1&\3\15\377\236\0\0\0\377\2\1\0\1\377\271\21A\377\377\274" \ + "\21B\377\230\274\21B\377\1\203\14.\377\223\0\0\0\377\1A\6\27\377\260" \ + "\274\21B\377\1\201\14-\377\236\0\0\0\377\1\0\0\0\242\237\0\0\0\0\1\0" \ + "\0\0Y\230\0\0\0\377\1`\11\"\377\257\274\21B\377\1\234\16""7\377\233\0" \ + "\0\0\377\1\32\2\11\377\377\274\21B\377\231\274\21B\377\1\36\3\13\377" \ + "\237\0\0\0\377\1\253\17<\377\377\274\21B\377\230\274\21B\377\1\243\17" \ + "9\377\223\0\0\0\377\1O\7\34\377\261\274\21B\377\1""4\5\22\377\235\0\0" \ + "\0\377\2\0\0\0\373\0\0\0\40\235\0\0\0\0\2\0\0\0\1\0\0\0\321\227\0\0\0" \ + "\377\2\35\3\12\377\270\21@\377\257\274\21B\377\1\255\20=\377\233\0\0" \ + "\0\377\1E\6\30\377\377\274\21B\377\231\274\21B\377\1\20\1\6\377\237\0" \ + "\0\0\377\1\224\15""4\377\377\274\21B\377\230\274\21B\377\2\273\21B\377" \ + "\12\1\4\377\222\0\0\0\377\1W\10\37\377\261\274\21B\377\2\245\17:\377" \ + "\10\1\3\377\235\0\0\0\377\1\0\0\0\224\235\0\0\0\0\1\0\0\0E\230\0\0\0" \ + "\377\1\204\14.\377\260\274\21B\377\1\272\21A\377\233\0\0\0\377\1m\12" \ + "&\377\377\274\21B\377\230\274\21B\377\2\272\21A\377\2\0\1\377\237\0\0" \ + "\0\377\1}\13,\377\377\274\21B\377\231\274\21B\377\1)\4\16\377\222\0\0" \ + "\0\377\1^\11!\377\262\274\21B\377\1Z\10\40\377\235\0\0\0\377\2\0\0\0" \ + "\364\0\0\0\23\234\0\0\0\0\1\0\0\0\266\227\0\0\0\377\1>\6\26\377\262\274" \ + "\21B\377\1\6\1\2\377\232\0\0\0\377\1\223\15""4\377\377\274\21B\377\230" \ + "\274\21B\377\1\253\17<\377\240\0\0\0\377\1c\11#\377\377\274\21B\377\231" \ + "\274\21B\377\1F\6\31\377\222\0\0\0\377\1f\11$\377\262\274\21B\377\2\263" \ + "\20\77\377\17\1\5\377\235\0\0\0\377\1\0\0\0y\233\0\0\0\0\2\0\0\0&\0\0" \ + "\0\376\226\0\0\0\377\2\5\0\2\377\244\17:\377\262\274\21B\377\1\15\1\5" \ + "\377\231\0\0\0\377\2\1\0\0\377\262\20>\377\377\274\21B\377\230\274\21" \ + "B\377\1\233\16""6\377\240\0\0\0\377\1K\7\32\377\377\274\21B\377\231\274" \ + "\21B\377\1^\10!\377\222\0\0\0\377\1n\12'\377\263\274\21B\377\1e\11#\377" \ + "\235\0\0\0\377\2\0\0\0\341\0\0\0\3\232\0\0\0\0\1\0\0\0\215\227\0\0\0" \ + "\377\1T\10\36\377\263\274\21B\377\1\25\2\7\377\231\0\0\0\377\1\30\2\10" \ + "\377\377\274\21B\377\231\274\21B\377\1\205\14/\377\240\0\0\0\377\1+\4" \ + "\17\377\377\274\21B\377\231\274\21B\377\1w\13*\377\222\0\0\0\377\1u\13" \ + ")\377\263\274\21B\377\2\265\20@\377\24\2\7\377\235\0\0\0\377\1\0\0\0" \ + "O\231\0\0\0\0\2\0\0\0\13\0\0\0\357\226\0\0\0\377\2\12\1\4\377\255\20" \ + "=\377\263\274\21B\377\1\35\3\12\377\231\0\0\0\377\1""8\5\24\377\377\274" \ + "\21B\377\231\274\21B\377\1m\12&\377\240\0\0\0\377\2\14\1\4\377\273\21" \ + "B\377\377\274\21B\377\230\274\21B\377\1\216\15""2\377\222\0\0\0\377\1" \ + "{\13+\377\264\274\21B\377\1i\11%\377\235\0\0\0\377\1\0\0\0\272\231\0" \ + "\0\0\0\1\0\0\0_\227\0\0\0\377\1\\\10\40\377\264\274\21B\377\1$\3\15\377" \ + "\231\0\0\0\377\1U\10\36\377\377\274\21B\377\231\274\21B\377\1T\10\36" \ + "\377\241\0\0\0\377\1\245\17:\377\377\274\21B\377\230\274\21B\377\1\242" \ + "\17""9\377\222\0\0\0\377\1{\13+\377\264\274\21B\377\2\265\20@\377\17" \ + "\1\5\377\234\0\0\0\377\2\0\0\0\375\0\0\0#\230\0\0\0\0\1\0\0\0\304\226" \ + "\0\0\0\377\2\13\1\4\377\257\20=\377\264\274\21B\377\1*\4\17\377\231\0" \ + "\0\0\377\1l\12&\377\377\274\21B\377\231\274\21B\377\1<\5\25\377\241\0" \ + "\0\0\377\1\205\14/\377\377\274\21B\377\230\274\21B\377\1\262\20>\377" \ + "\222\0\0\0\377\1{\13+\377\265\274\21B\377\1_\11!\377\235\0\0\0\377\1" \ + "\0\0\0\206\227\0\0\0\0\2\0\0\0#\0\0\0\376\226\0\0\0\377\1[\10\40\377" \ + "\265\274\21B\377\1+\4\17\377\231\0\0\0\377\1\206\14/\377\377\274\21B" \ + "\377\231\274\21B\377\1\34\3\12\377\241\0\0\0\377\1[\10\40\377\377\274" \ + "\21B\377\231\274\21B\377\1\7\1\2\377\221\0\0\0\377\1{\13+\377\265\274" \ + "\21B\377\2\255\20=\377\7\1\2\377\234\0\0\0\377\2\0\0\0\344\0\0\0\3\226" \ + "\0\0\0\0\1\0\0\0\177\226\0\0\0\377\2\6\1\2\377\255\20=\377\265\274\21" \ + "B\377\1+\4\17\377\231\0\0\0\377\1\237\16""8\377\377\274\21B\377\230\274" \ + "\21B\377\2\265\20@\377\2\0\1\377\241\0\0\0\377\1""3\5\22\377\377\274" \ + "\21B\377\231\274\21B\377\1\26\2\10\377\221\0\0\0\377\1{\13+\377\266\274" \ + "\21B\377\1I\7\32\377\235\0\0\0\377\1\0\0\0A\225\0\0\0\0\2\0\0\0\1\0\0" \ + "\0\334\226\0\0\0\377\1H\7\31\377\266\274\21B\377\1+\4\17\377\231\0\0" \ + "\0\377\1\262\20\77\377\377\274\21B\377\230\274\21B\377\1\226\16""5\377" \ + "\242\0\0\0\377\2\12\1\3\377\272\21A\377\377\274\21B\377\230\274\21B\377" \ + "\1!\3\14\377\221\0\0\0\377\1{\13+\377\266\274\21B\377\1\231\16""6\377" \ + "\235\0\0\0\377\1\0\0\0\236\225\0\0\0\0\1\0\0\0""9\226\0\0\0\377\2\1\0" \ + "\0\377\234\16""7\377\266\274\21B\377\1+\4\17\377\230\0\0\0\377\1\5\0" \ + "\2\377\377\274\21B\377\231\274\21B\377\1u\13)\377\243\0\0\0\377\1\233" \ + "\16""6\377\377\274\21B\377\230\274\21B\377\1(\4\16\377\221\0\0\0\377" \ + "\1{\13+\377\267\274\21B\377\1)\4\16\377\234\0\0\0\377\2\0\0\0\361\0\0" \ + "\0\12\224\0\0\0\0\1\0\0\0\216\226\0\0\0\377\1/\4\21\377\267\274\21B\377" \ + "\1+\4\17\377\230\0\0\0\377\1\25\2\7\377\377\274\21B\377\231\274\21B\377" \ + "\1M\7\33\377\243\0\0\0\377\1i\12%\377\377\274\21B\377\230\274\21B\377" \ + "\1""0\4\21\377\221\0\0\0\377\1w\13*\377\267\274\21B\377\1o\12'\377\235" \ + "\0\0\0\377\1\0\0\0P\223\0\0\0\0\2\0\0\0\1\0\0\0\340\226\0\0\0\377\1{" \ + "\13+\377\267\274\21B\377\1+\4\17\377\230\0\0\0\377\1$\3\15\377\377\274" \ + "\21B\377\231\274\21B\377\1$\3\15\377\243\0\0\0\377\1:\5\24\377\377\274" \ + "\21B\377\230\274\21B\377\1""7\5\23\377\221\0\0\0\377\1p\12'\377\267\274" \ + "\21B\377\2\257\20>\377\5\0\2\377\234\0\0\0\377\1\0\0\0\242\223\0\0\0" \ + "\0\1\0\0\0""0\226\0\0\0\377\2\14\1\4\377\266\20@\377\267\274\21B\377" \ + "\1&\3\15\377\230\0\0\0\377\1/\4\21\377\377\274\21B\377\230\274\21B\377" \ + "\2\263\20\77\377\2\0\1\377\243\0\0\0\377\2\12\1\3\377\270\21A\377\377" \ + "\274\21B\377\227\274\21B\377\1""8\5\24\377\221\0\0\0\377\1i\12%\377\270" \ + "\274\21B\377\1<\5\25\377\234\0\0\0\377\2\0\0\0\355\0\0\0\4\222\0\0\0" \ + "\0\1\0\0\0\177\226\0\0\0\377\1J\7\32\377\270\274\21B\377\1\37\3\13\377" \ + "\230\0\0\0\377\1""7\5\23\377\377\274\21B\377\230\274\21B\377\1\216\15" \ + "2\377\245\0\0\0\377\1\222\15""3\377\377\274\21B\377\227\274\21B\377\1" \ + "7\5\23\377\221\0\0\0\377\1d\11#\377\270\274\21B\377\1~\13,\377\235\0" \ + "\0\0\377\1\0\0\0A\222\0\0\0\0\1\0\0\0\316\226\0\0\0\377\1\216\15""2\377" \ + "\270\274\21B\377\1\30\2\11\377\230\0\0\0\377\1\77\6\26\377\377\274\21" \ + "B\377\230\274\21B\377\1\\\10\40\377\245\0\0\0\377\1W\10\37\377\377\274" \ + "\21B\377\227\274\21B\377\1""7\5\23\377\221\0\0\0\377\1\\\10\40\377\270" \ + "\274\21B\377\2\265\20@\377\10\1\3\377\234\0\0\0\377\1\0\0\0\220\221\0" \ + "\0\0\0\2\0\0\0\33\0\0\0\376\225\0\0\0\377\2\26\2\10\377\273\21A\377\270" \ + "\274\21B\377\1\22\2\6\377\230\0\0\0\377\1F\6\31\377\377\274\21B\377\230" \ + "\274\21B\377\1+\4\17\377\245\0\0\0\377\1\35\3\12\377\377\274\21B\377" \ + "\227\274\21B\377\1""5\5\23\377\221\0\0\0\377\1V\10\36\377\271\274\21" \ + "B\377\1:\5\24\377\234\0\0\0\377\1\0\0\0\333\221\0\0\0\0\1\0\0\0_\226" \ + "\0\0\0\377\1T\10\36\377\271\274\21B\377\1\13\1\4\377\230\0\0\0\377\1" \ + "H\6\31\377\377\274\21B\377\227\274\21B\377\2\257\20>\377\2\0\1\377\246" \ + "\0\0\0\377\1\234\16""7\377\377\274\21B\377\226\274\21B\377\1,\4\20\377" \ + "\221\0\0\0\377\1N\7\33\377\271\274\21B\377\1p\12'\377\235\0\0\0\377\1" \ + "\0\0\0!\220\0\0\0\0\1\0\0\0\237\226\0\0\0\377\1\214\15""1\377\271\274" \ + "\21B\377\1\4\0\2\377\230\0\0\0\377\1F\6\31\377\377\274\21B\377\227\274" \ + "\21B\377\1\202\14.\377\247\0\0\0\377\1a\11\"\377\377\274\21B\377\226" \ + "\274\21B\377\1#\3\14\377\221\0\0\0\377\1B\6\27\377\271\274\21B\377\2" \ + "\252\17<\377\1\0\0\377\234\0\0\0\377\1\0\0\0b\220\0\0\0\0\1\0\0\0\337" \ + "\225\0\0\0\377\2\12\1\4\377\270\21@\377\270\274\21B\377\1\270\21A\377" \ + "\231\0\0\0\377\1E\6\30\377\377\274\21B\377\227\274\21B\377\1G\6\31\377" \ + "\247\0\0\0\377\2\33\2\12\377\273\21B\377\377\274\21B\377\225\274\21B" \ + "\377\1\32\2\11\377\221\0\0\0\377\1""6\5\23\377\272\274\21B\377\1$\3\15" \ + "\377\234\0\0\0\377\1\0\0\0\243\217\0\0\0\0\1\0\0\0\40\226\0\0\0\377\1" \ + "@\6\27\377\271\274\21B\377\1\255\20=\377\231\0\0\0\377\1D\6\30\377\377" \ + "\274\21B\377\226\274\21B\377\2\272\21A\377\17\1\5\377\250\0\0\0\377\1" \ + "\226\16""5\377\377\274\21B\377\225\274\21B\377\1\17\1\5\377\221\0\0\0" \ + "\377\1)\4\16\377\272\274\21B\377\1V\10\36\377\234\0\0\0\377\1\0\0\0\345" \ + "\217\0\0\0\0\1\0\0\0a\226\0\0\0\377\1v\13)\377\271\274\21B\377\1\240" \ + "\16""8\377\231\0\0\0\377\1;\5\25\377\377\274\21B\377\226\274\21B\377" \ + "\1\214\15""1\377\251\0\0\0\377\1P\7\34\377\377\274\21B\377\224\274\21" \ + "B\377\2\271\21A\377\1\0\1\377\221\0\0\0\377\1\33\2\12\377\272\274\21" \ + "B\377\1\202\14.\377\235\0\0\0\377\1\0\0\0%\216\0\0\0\0\1\0\0\0\234\226" \ + "\0\0\0\377\1\250\17;\377\271\274\21B\377\1\223\15""4\377\231\0\0\0\377" \ + "\1""2\5\22\377\377\274\21B\377\226\274\21B\377\1R\7\35\377\251\0\0\0" \ + "\377\2\21\2\6\377\270\21A\377\377\274\21B\377\223\274\21B\377\1\251\17" \ + ";\377\222\0\0\0\377\1\17\1\5\377\272\274\21B\377\2\255\20=\377\1\0\0" \ + "\377\234\0\0\0\377\1\0\0\0a\216\0\0\0\0\1\0\0\0\321\225\0\0\0\377\1\30" \ + "\2\10\377\272\274\21B\377\1\206\14/\377\231\0\0\0\377\1)\4\16\377\377" \ + "\274\21B\377\225\274\21B\377\2\270\21A\377\17\1\5\377\252\0\0\0\377\1" \ + "z\13+\377\377\274\21B\377\223\274\21B\377\1\226\16""5\377\222\0\0\0\377" \ + "\2\3\0\1\377\273\21B\377\272\274\21B\377\1\36\3\13\377\234\0\0\0\377" \ + "\1\0\0\0\226\215\0\0\0\0\2\0\0\0\13\0\0\0\374\225\0\0\0\377\1D\6\30\377" \ + "\272\274\21B\377\1z\13+\377\231\0\0\0\377\1\36\3\13\377\377\274\21B\377" \ + "\225\274\21B\377\1\207\14/\377\253\0\0\0\377\1""0\4\21\377\377\274\21" \ + "B\377\223\274\21B\377\1\203\14.\377\223\0\0\0\377\1\260\20>\377\272\274" \ + "\21B\377\1H\7\31\377\234\0\0\0\377\1\0\0\0\311\215\0\0\0\0\1\0\0\0""9" \ + "\226\0\0\0\377\1o\12'\377\272\274\21B\377\1m\12&\377\231\0\0\0\377\1" \ + "\14\1\4\377\377\274\21B\377\225\274\21B\377\1@\6\27\377\254\0\0\0\377" \ + "\1\233\16""6\377\377\274\21B\377\222\274\21B\377\1f\11$\377\223\0\0\0" \ + "\377\1\236\16""7\377\272\274\21B\377\1n\12'\377\234\0\0\0\377\2\0\0\0" \ + "\367\0\0\0\5\214\0\0\0\0\1\0\0\0m\226\0\0\0\377\1\232\16""6\377\272\274" \ + "\21B\377\1_\11!\377\232\0\0\0\377\1\266\20@\377\377\274\21B\377\223\274" \ + "\21B\377\2\262\20>\377\7\1\3\377\254\0\0\0\377\1P\7\34\377\377\274\21" \ + "B\377\222\274\21B\377\1L\7\33\377\223\0\0\0\377\1\213\15""1\377\272\274" \ + "\21B\377\1\217\15""2\377\235\0\0\0\377\1\0\0\0/\214\0\0\0\0\1\0\0\0\240" \ + "\225\0\0\0\377\2\7\1\2\377\272\21A\377\272\274\21B\377\1L\7\33\377\232" \ + "\0\0\0\377\1\244\17""9\377\377\274\21B\377\223\274\21B\377\1l\12&\377" \ + "\255\0\0\0\377\2\7\1\3\377\255\20=\377\377\274\21B\377\221\274\21B\377" \ + "\1/\4\21\377\223\0\0\0\377\1z\13+\377\272\274\21B\377\1\257\20>\377\235" \ + "\0\0\0\377\1\0\0\0c\214\0\0\0\0\1\0\0\0\313\225\0\0\0\377\1%\3\15\377" \ + "\273\274\21B\377\1:\5\24\377\232\0\0\0\377\1\220\15""2\377\377\274\21" \ + "B\377\223\274\21B\377\1!\3\14\377\256\0\0\0\377\1a\11\"\377\377\274\21" \ + "B\377\221\274\21B\377\1\21\2\6\377\223\0\0\0\377\1g\11$\377\273\274\21" \ + "B\377\1\24\2\7\377\234\0\0\0\377\1\0\0\0\216\213\0\0\0\0\2\0\0\0\1\0" \ + "\0\0\362\225\0\0\0\377\1E\6\30\377\273\274\21B\377\1(\4\16\377\232\0" \ + "\0\0\377\1t\12)\377\377\274\21B\377\222\274\21B\377\1\216\15""2\377\257" \ + "\0\0\0\377\2\16\1\5\377\264\20\77\377\377\274\21B\377\217\274\21B\377" \ + "\1\247\17;\377\224\0\0\0\377\1V\10\36\377\273\274\21B\377\1""4\5\22\377" \ + "\234\0\0\0\377\1\0\0\0\264\213\0\0\0\0\1\0\0\0\31\226\0\0\0\377\1f\11" \ + "$\377\273\274\21B\377\1\25\2\10\377\232\0\0\0\377\1Z\10\40\377\377\274" \ + "\21B\377\222\274\21B\377\1B\6\27\377\260\0\0\0\377\1o\12'\377\377\274" \ + "\21B\377\217\274\21B\377\1\204\14.\377\224\0\0\0\377\1C\6\30\377\273" \ + "\274\21B\377\1N\7\33\377\234\0\0\0\377\1\0\0\0\332\213\0\0\0\0\1\0\0" \ + "\0\77\226\0\0\0\377\1\205\14/\377\272\274\21B\377\2\273\21B\377\5\0\2" \ + "\377\232\0\0\0\377\1=\6\25\377\377\274\21B\377\221\274\21B\377\2\241" \ + "\17""9\377\2\0\1\377\260\0\0\0\377\2\25\2\7\377\266\20@\377\377\274\21" \ + "B\377\216\274\21B\377\1_\11!\377\224\0\0\0\377\1/\4\21\377\273\274\21" \ + "B\377\1c\11#\377\234\0\0\0\377\2\0\0\0\373\0\0\0\5\212\0\0\0\0\1\0\0" \ + "\0d\226\0\0\0\377\1\237\16""8\377\272\274\21B\377\1\256\20=\377\233\0" \ + "\0\0\377\1\37\3\13\377\377\274\21B\377\221\274\21B\377\1R\7\35\377\262" \ + "\0\0\0\377\1d\11#\377\377\274\21B\377\216\274\21B\377\1""3\5\22\377\224" \ + "\0\0\0\377\1\27\2\10\377\273\274\21B\377\1y\13*\377\235\0\0\0\377\1\0" \ + "\0\0'\212\0\0\0\0\1\0\0\0\210\226\0\0\0\377\1\264\20\77\377\272\274\21" \ + "B\377\1\232\16""6\377\233\0\0\0\377\2\1\0\1\377\263\20\77\377\377\274" \ + "\21B\377\217\274\21B\377\2\255\20=\377\7\1\3\377\262\0\0\0\377\2\14\1" \ + "\4\377\257\20>\377\377\274\21B\377\214\274\21B\377\2\270\21@\377\7\1" \ + "\3\377\224\0\0\0\377\2\2\0\1\377\270\21A\377\272\274\21B\377\1\216\15" \ + "2\377\235\0\0\0\377\1\0\0\0K\212\0\0\0\0\1\0\0\0\245\225\0\0\0\377\1" \ + "\16\1\5\377\273\274\21B\377\1\202\14.\377\234\0\0\0\377\1\223\15""4\377" \ + "\377\274\21B\377\217\274\21B\377\1`\11\"\377\264\0\0\0\377\1\\\10\40" \ + "\377\377\274\21B\377\214\274\21B\377\1\222\15""3\377\226\0\0\0\377\1" \ + "\244\17:\377\272\274\21B\377\1\243\17""9\377\235\0\0\0\377\1\0\0\0i\212" \ + "\0\0\0\0\1\0\0\0\275\225\0\0\0\377\1#\3\14\377\273\274\21B\377\1j\12" \ + "%\377\234\0\0\0\377\1n\12'\377\377\274\21B\377\216\274\21B\377\2\257" \ + "\20=\377\14\1\4\377\264\0\0\0\377\2\7\1\3\377\247\17;\377\377\274\21" \ + "B\377\213\274\21B\377\1b\11\"\377\226\0\0\0\377\1\214\15""1\377\272\274" \ + "\21B\377\1\263\20\77\377\235\0\0\0\377\1\0\0\0\200\212\0\0\0\0\1\0\0" \ + "\0\324\225\0\0\0\377\1""9\5\24\377\273\274\21B\377\1T\10\36\377\234\0" \ + "\0\0\377\1B\6\27\377\377\274\21B\377\216\274\21B\377\1V\10\36\377\266" \ + "\0\0\0\377\1A\6\27\377\377\274\21B\377\213\274\21B\377\1)\4\16\377\226" \ + "\0\0\0\377\1t\13)\377\272\274\21B\377\2\273\21B\377\3\0\1\377\234\0\0" \ + "\0\377\1\0\0\0\227\212\0\0\0\0\1\0\0\0\354\225\0\0\0\377\1H\6\31\377" \ + "\273\274\21B\377\1<\5\25\377\234\0\0\0\377\1\22\2\6\377\377\274\21B\377" \ + "\215\274\21B\377\2\247\17;\377\6\1\2\377\266\0\0\0\377\2\1\0\0\377\221" \ + "\15""3\377\377\274\21B\377\211\274\21B\377\2\253\17<\377\1\0\1\377\226" \ + "\0\0\0\377\1^\10!\377\273\274\21B\377\1\15\1\5\377\234\0\0\0\377\1\0" \ + "\0\0\256\211\0\0\0\0\2\0\0\0\6\0\0\0\376\225\0\0\0\377\1S\7\35\377\273" \ + "\274\21B\377\1%\3\15\377\235\0\0\0\377\1\241\17""8\377\377\274\21B\377" \ + "\214\274\21B\377\1M\7\33\377\270\0\0\0\377\2)\4\16\377\273\21A\377\377" \ + "\274\21B\377\210\274\21B\377\1w\13*\377\227\0\0\0\377\1D\6\30\377\273" \ + "\274\21B\377\1\31\2\11\377\234\0\0\0\377\1\0\0\0\306\211\0\0\0\0\1\0" \ + "\0\0\33\226\0\0\0\377\1^\10!\377\273\274\21B\377\1\15\1\5\377\235\0\0" \ + "\0\377\1q\12(\377\377\274\21B\377\213\274\21B\377\2\235\16""7\377\3\0" \ + "\1\377\271\0\0\0\377\1l\12&\377\377\274\21B\377\210\274\21B\377\1:\5" \ + "\24\377\227\0\0\0\377\1'\4\16\377\273\274\21B\377\1$\3\15\377\234\0\0" \ + "\0\377\1\0\0\0\334\211\0\0\0\0\1\0\0\0(\226\0\0\0\377\1h\11$\377\272" \ + "\274\21B\377\1\261\20>\377\236\0\0\0\377\1""8\5\24\377\377\274\21B\377" \ + "\213\274\21B\377\1""1\4\21\377\272\0\0\0\377\2\7\1\3\377\243\17""9\377" \ + "\377\274\21B\377\206\274\21B\377\2\253\17<\377\3\0\1\377\227\0\0\0\377" \ + "\2\12\1\3\377\273\21B\377\272\274\21B\377\1)\4\16\377\234\0\0\0\377\1" \ + "\0\0\0\352\211\0\0\0\0\1\0\0\0""1\226\0\0\0\377\1s\12(\377\272\274\21" \ + "B\377\1\223\15""4\377\236\0\0\0\377\2\7\1\2\377\265\20\77\377\377\274" \ + "\21B\377\211\274\21B\377\1\204\14.\377\274\0\0\0\377\1:\5\24\377\377" \ + "\274\21B\377\206\274\21B\377\1o\12'\377\231\0\0\0\377\1\251\17;\377\272" \ + "\274\21B\377\1*\4\17\377\234\0\0\0\377\1\0\0\0\363\211\0\0\0\0\1\0\0" \ + "\0:\226\0\0\0\377\1y\13*\377\272\274\21B\377\1v\13)\377\237\0\0\0\377" \ + "\1\205\14/\377\377\274\21B\377\210\274\21B\377\2\267\21@\377\35\3\12" \ + "\377\275\0\0\0\377\1w\13*\377\377\274\21B\377\205\274\21B\377\1*\4\17" \ + "\377\231\0\0\0\377\1\214\15""1\377\272\274\21B\377\1+\4\17\377\234\0" \ + "\0\0\377\1\0\0\0\374\211\0\0\0\0\1\0\0\0C\226\0\0\0\377\1z\13+\377\272" \ + "\274\21B\377\1Y\10\37\377\237\0\0\0\377\1H\7\31\377\377\274\21B\377\210" \ + "\274\21B\377\1^\11!\377\276\0\0\0\377\2\10\1\3\377\240\16""8\377\377" \ + "\274\21B\377\203\274\21B\377\1\226\16""5\377\232\0\0\0\377\1o\12'\377" \ + "\272\274\21B\377\1+\4\17\377\235\0\0\0\377\1\0\0\0\6\210\0\0\0\0\1\0" \ + "\0\0L\226\0\0\0\377\1{\13+\377\272\274\21B\377\1<\5\25\377\237\0\0\0" \ + "\377\2\12\1\3\377\265\20\77\377\377\274\21B\377\206\274\21B\377\2\231" \ + "\16""6\377\3\0\1\377\277\0\0\0\377\2&\3\15\377\270\21A\377\377\274\21" \ + "B\377\202\274\21B\377\1I\7\32\377\232\0\0\0\377\1S\10\35\377\272\274" \ + "\21B\377\1,\4\20\377\235\0\0\0\377\1\0\0\0\20\210\0\0\0\0\1\0\0\0T\226" \ + "\0\0\0\377\1}\13,\377\272\274\21B\377\1\37\3\13\377\240\0\0\0\377\1~" \ + "\13,\377\377\274\21B\377\205\274\21B\377\2\273\21B\377.\4\20\377\301" \ + "\0\0\0\377\1c\11#\377\377\274\21B\377\3\274\21B\377\261\20>\377\10\1" \ + "\3\377\232\0\0\0\377\1""4\5\22\377\272\274\21B\377\1'\4\16\377\235\0" \ + "\0\0\377\1\0\0\0\31\210\0\0\0\0\1\0\0\0S\226\0\0\0\377\1}\13,\377\271" \ + "\274\21B\377\2\272\21A\377\5\0\2\377\240\0\0\0\377\1:\5\24\377\377\274" \ + "\21B\377\205\274\21B\377\1i\12%\377\302\0\0\0\377\2\1\0\1\377\211\14" \ + "0\377\377\274\21B\377\1a\11\"\377\233\0\0\0\377\1\21\2\6\377\272\274" \ + "\21B\377\1\35\3\12\377\235\0\0\0\377\1\0\0\0\27\210\0\0\0\0\1\0\0\0N" \ + "\226\0\0\0\377\1x\13*\377\271\274\21B\377\1\237\16""8\377\241\0\0\0\377" \ + "\2\1\0\1\377\244\17""9\377\377\274\21B\377\203\274\21B\377\2\231\16""6" \ + "\377\4\0\2\377\303\0\0\0\377\2\21\2\6\377\252\17<\377\375\274\21B\377" \ + "\2\263\20\77\377\16\1\5\377\234\0\0\0\377\1\253\17<\377\271\274\21B\377" \ + "\1\25\2\7\377\235\0\0\0\377\1\0\0\0\21\210\0\0\0\0\1\0\0\0H\226\0\0\0" \ + "\377\1o\12'\377\271\274\21B\377\1|\13+\377\242\0\0\0\377\1X\10\37\377" \ + "\377\274\21B\377\202\274\21B\377\2\265\20@\377\36\3\13\377\305\0\0\0" \ + "\377\2""6\5\23\377\273\21A\377\374\274\21B\377\1m\12&\377\235\0\0\0\377" \ + "\1\211\14""0\377\271\274\21B\377\1\14\1\4\377\235\0\0\0\377\1\0\0\0\14" \ + "\210\0\0\0\0\1\0\0\0C\226\0\0\0\377\1f\11$\377\271\274\21B\377\1[\10" \ + "\40\377\242\0\0\0\377\2\21\2\6\377\267\21@\377\377\274\21B\377\2\274" \ + "\21B\377T\10\36\377\307\0\0\0\377\1\\\10\40\377\373\274\21B\377\2\266" \ + "\20@\377\26\2\10\377\235\0\0\0\377\1i\11%\377\271\274\21B\377\1\3\0\1" \ + "\377\235\0\0\0\377\1\0\0\0\6\210\0\0\0\0\1\0\0\0>\226\0\0\0\377\1^\10" \ + "!\377\271\274\21B\377\1""9\5\24\377\243\0\0\0\377\1p\12'\377\377\274" \ + "\21B\377\1\177\13-\377\311\0\0\0\377\1r\12(\377\372\274\21B\377\1b\11" \ + "\"\377\236\0\0\0\377\1F\6\31\377\270\274\21B\377\1\257\20>\377\236\0" \ + "\0\0\377\1\0\0\0\1\210\0\0\0\0\1\0\0\0""8\226\0\0\0\377\1U\10\36\377" \ + "\271\274\21B\377\1\30\2\10\377\243\0\0\0\377\2\31\2\11\377\271\21A\377" \ + "\375\274\21B\377\2\243\17""9\377\13\1\4\377\311\0\0\0\377\2\4\0\2\377" \ + "\216\15""2\377\370\274\21B\377\2\253\17<\377\12\1\3\377\236\0\0\0\377" \ + "\1%\3\15\377\270\274\21B\377\1\235\16""7\377\235\0\0\0\377\1\0\0\0\372" \ + "\211\0\0\0\0\1\0\0\0(\226\0\0\0\377\1E\6\30\377\270\274\21B\377\2\260" \ + "\20>\377\1\0\0\377\244\0\0\0\377\1}\13,\377\374\274\21B\377\2\270\21" \ + "A\377*\4\17\377\313\0\0\0\377\2\24\2\7\377\246\17:\377\367\274\21B\377" \ + "\1S\7\35\377\237\0\0\0\377\2\4\0\1\377\265\20@\377\267\274\21B\377\1" \ + "\212\14""0\377\235\0\0\0\377\1\0\0\0\351\211\0\0\0\0\1\0\0\0\24\226\0" \ + "\0\0\377\1""3\5\22\377\270\274\21B\377\1\220\15""2\377\245\0\0\0\377" \ + "\2!\3\14\377\272\21A\377\373\274\21B\377\1M\7\33\377\315\0\0\0\377\2" \ + "\32\2\11\377\253\17<\377\365\274\21B\377\2\223\15""4\377\1\0\1\377\240" \ + "\0\0\0\377\1\223\15""4\377\267\274\21B\377\1w\13*\377\235\0\0\0\377\1" \ + "\0\0\0\325\211\0\0\0\0\2\0\0\0\2\0\0\0\374\225\0\0\0\377\1\40\3\13\377" \ + "\270\274\21B\377\1i\12%\377\246\0\0\0\377\1q\12(\377\372\274\21B\377" \ + "\1h\11$\377\317\0\0\0\377\2&\3\15\377\263\20\77\377\363\274\21B\377\2" \ + "\272\21A\377&\3\15\377\241\0\0\0\377\1l\12&\377\267\274\21B\377\1d\11" \ + "#\377\235\0\0\0\377\1\0\0\0\301\212\0\0\0\0\1\0\0\0\352\225\0\0\0\377" \ + "\1\15\1\4\377\270\274\21B\377\1B\6\27\377\246\0\0\0\377\2\20\1\6\377" \ + "\262\20\77\377\370\274\21B\377\2\204\14.\377\1\0\1\377\320\0\0\0\377" \ + "\2""9\5\24\377\270\21A\377\362\274\21B\377\1o\12'\377\242\0\0\0\377\1" \ + "D\6\30\377\267\274\21B\377\1J\7\32\377\235\0\0\0\377\1\0\0\0\254\212" \ + "\0\0\0\0\1\0\0\0\326\225\0\0\0\377\2\1\0\0\377\266\20@\377\267\274\21" \ + "B\377\1\33\2\12\377\247\0\0\0\377\1`\11\"\377\367\274\21B\377\2\236\16" \ + "7\377\15\1\4\377\322\0\0\0\377\2""4\5\22\377\266\20@\377\360\274\21B" \ + "\377\2\234\16""7\377\6\1\2\377\242\0\0\0\377\1\34\3\12\377\267\274\21" \ + "B\377\1.\4\20\377\235\0\0\0\377\1\0\0\0\230\212\0\0\0\0\1\0\0\0\303\226" \ + "\0\0\0\377\1\234\16""7\377\266\274\21B\377\2\255\20=\377\1\0\0\377\247" \ + "\0\0\0\377\2\4\0\2\377\237\16""8\377\365\274\21B\377\2\244\17:\377\23" \ + "\2\7\377\324\0\0\0\377\2""5\5\23\377\266\20@\377\356\274\21B\377\2\270" \ + "\21A\377%\3\15\377\243\0\0\0\377\2\1\0\0\377\257\20>\377\266\274\21B" \ + "\377\1\20\1\6\377\235\0\0\0\377\1\0\0\0\205\212\0\0\0\0\1\0\0\0\244\226" \ + "\0\0\0\377\1\200\14-\377\266\274\21B\377\1\206\14/\377\251\0\0\0\377" \ + "\1""3\5\22\377\364\274\21B\377\2\254\20<\377\33\2\11\377\326\0\0\0\377" \ + "\2=\6\25\377\270\21@\377\355\274\21B\377\1_\11!\377\245\0\0\0\377\1\211" \ + "\14""0\377\265\274\21B\377\1\261\20>\377\236\0\0\0\377\1\0\0\0g\212\0" \ + "\0\0\0\1\0\0\0\200\226\0\0\0\377\1b\11\"\377\266\274\21B\377\1^\11!\377" \ + "\252\0\0\0\377\1~\13,\377\362\274\21B\377\2\265\20\77\377.\4\20\377\330" \ + "\0\0\0\377\2.\4\20\377\262\20>\377\353\274\21B\377\2\200\14-\377\1\0" \ + "\0\377\245\0\0\0\377\1^\10!\377\265\274\21B\377\1\223\15""4\377\236\0" \ + "\0\0\377\1\0\0\0C\212\0\0\0\0\1\0\0\0]\226\0\0\0\377\1G\6\31\377\266" \ + "\274\21B\377\1""8\5\24\377\252\0\0\0\377\2\14\1\4\377\247\17:\377\360" \ + "\274\21B\377\2\262\20\77\377+\4\17\377\332\0\0\0\377\2&\3\15\377\255" \ + "\20=\377\351\274\21B\377\2\236\16""7\377\12\1\3\377\246\0\0\0\377\1." \ + "\4\20\377\265\274\21B\377\1m\12&\377\236\0\0\0\377\1\0\0\0\37\212\0\0" \ + "\0\0\1\0\0\0""9\226\0\0\0\377\1)\4\16\377\265\274\21B\377\2\273\21A\377" \ + "\15\1\5\377\253\0\0\0\377\2""2\5\22\377\273\21B\377\356\274\21B\377\2" \ + "\262\20\77\377+\4\17\377\334\0\0\0\377\2\"\3\14\377\250\17;\377\347\274" \ + "\21B\377\2\262\20\77\377#\3\14\377\247\0\0\0\377\2\6\1\2\377\266\20@" \ + "\377\264\274\21B\377\1F\6\31\377\235\0\0\0\377\2\0\0\0\367\0\0\0\2\212" \ + "\0\0\0\0\1\0\0\0\25\226\0\0\0\377\2\6\1\2\377\270\21A\377\264\274\21" \ + "B\377\1\231\16""6\377\255\0\0\0\377\1o\12'\377\355\274\21B\377\2\264" \ + "\20\77\3771\4\21\377\336\0\0\0\377\2\22\2\6\377\225\15""4\377\345\274" \ + "\21B\377\2\267\21@\377.\4\20\377\251\0\0\0\377\1\220\15""2\377\264\274" \ + "\21B\377\1\37\3\13\377\235\0\0\0\377\1\0\0\0\326\214\0\0\0\0\1\0\0\0" \ + "\360\226\0\0\0\377\1\231\16""6\377\264\274\21B\377\1l\12&\377\255\0\0" \ + "\0\377\2\4\0\1\377\216\15""2\377\353\274\21B\377\2\255\20=\377%\3\15" \ + "\377\340\0\0\0\377\2\6\1\2\377|\13+\377\343\274\21B\377\2\273\21A\377" \ + "@\6\27\377\252\0\0\0\377\1c\11#\377\263\274\21B\377\2\262\20>\377\1\0" \ + "\1\377\235\0\0\0\377\1\0\0\0\263\214\0\0\0\0\1\0\0\0\306\226\0\0\0\377" \ + "\1r\12(\377\264\274\21B\377\1\77\6\26\377\256\0\0\0\377\2\21\2\6\377" \ + "\250\17;\377\351\274\21B\377\2\247\17:\377\35\3\12\377\342\0\0\0\377" \ + "\3\3\0\1\377f\11$\377\273\21B\377\341\274\21B\377\1V\10\36\377\253\0" \ + "\0\0\377\1""7\5\23\377\263\274\21B\377\1\215\15""1\377\236\0\0\0\377" \ + "\1\0\0\0\211\214\0\0\0\0\1\0\0\0\220\226\0\0\0\377\1K\7\32\377\264\274" \ + "\21B\377\1\22\2\6\377\257\0\0\0\377\2.\4\20\377\270\21@\377\347\274\21" \ + "B\377\2\241\17""8\377\32\2\11\377\345\0\0\0\377\2""7\5\23\377\257\20" \ + ">\377\336\274\21B\377\2\273\21B\377K\7\32\377\254\0\0\0\377\2\13\1\4" \ + "\377\271\21A\377\262\274\21B\377\1]\10!\377\236\0\0\0\377\1\0\0\0T\214" \ + "\0\0\0\0\1\0\0\0]\226\0\0\0\377\1$\3\15\377\263\274\21B\377\1\243\17" \ + "9\377\261\0\0\0\377\2""9\5\24\377\272\21A\377\345\274\21B\377\2\206\14" \ + "/\377\12\1\3\377\347\0\0\0\377\2\35\3\12\377\234\16""7\377\335\274\21" \ + "B\377\1W\10\37\377\256\0\0\0\377\1\217\15""2\377\262\274\21B\377\1+\4" \ + "\17\377\236\0\0\0\377\1\0\0\0\40\214\0\0\0\0\1\0\0\0)\226\0\0\0\377\2" \ + "\1\0\1\377\257\20=\377\262\274\21B\377\1t\12)\377\262\0\0\0\377\1M\7" \ + "\33\377\344\274\21B\377\2o\12'\377\3\0\1\377\351\0\0\0\377\3\4\0\1\377" \ + "^\11!\377\273\21A\377\331\274\21B\377\2\270\21@\377D\6\30\377\257\0\0" \ + "\0\377\1[\10\40\377\261\274\21B\377\2\262\20\77\377\3\0\1\377\235\0\0" \ + "\0\377\1\0\0\0\354\215\0\0\0\0\2\0\0\0\2\0\0\0\361\226\0\0\0\377\1}\13" \ + ",\377\262\274\21B\377\1>\6\26\377\263\0\0\0\377\1d\11#\377\341\274\21" \ + "B\377\3\272\21A\377Z\10\40\377\1\0\0\377\354\0\0\0\377\2""2\5\22\377" \ + "\251\17;\377\327\274\21B\377\2\262\20>\3771\4\21\377\260\0\0\0\377\1" \ + "&\3\15\377\261\274\21B\377\1\207\14/\377\236\0\0\0\377\1\0\0\0\270\216" \ + "\0\0\0\0\1\0\0\0\300\226\0\0\0\377\1M\7\33\377\261\274\21B\377\2\271" \ + "\21A\377\14\1\4\377\264\0\0\0\377\1^\11!\377\337\274\21B\377\2\252\17" \ + "<\377,\4\20\377\357\0\0\0\377\2\22\2\6\377\200\14-\377\325\274\21B\377" \ + "\2\247\17:\377(\4\16\377\261\0\0\0\377\2\2\0\1\377\256\20=\377\260\274" \ + "\21B\377\1S\7\35\377\236\0\0\0\377\1\0\0\0\205\216\0\0\0\0\1\0\0\0\211" \ + "\226\0\0\0\377\1\35\3\12\377\261\274\21B\377\1\222\15""3\377\266\0\0" \ + "\0\377\1e\11#\377\335\274\21B\377\2\223\15""4\377\26\2\10\377\362\0\0" \ + "\0\377\2""6\5\23\377\246\17:\377\322\274\21B\377\2\200\14-\377\12\1\4" \ + "\377\263\0\0\0\377\1z\13+\377\257\274\21B\377\2\273\21B\377\24\2\7\377" \ + "\236\0\0\0\377\1\0\0\0N\216\0\0\0\0\1\0\0\0C\227\0\0\0\377\1\244\17:" \ + "\377\260\274\21B\377\1_\11!\377\267\0\0\0\377\2P\7\34\377\273\21A\377" \ + "\331\274\21B\377\3\270\21A\377R\7\35\377\1\0\1\377\364\0\0\0\377\3\15" \ + "\1\4\377o\12'\377\273\21A\377\316\274\21B\377\3\272\21A\377`\11\"\377" \ + "\2\0\1\377\264\0\0\0\377\1H\6\31\377\257\274\21B\377\1\227\16""5\377" \ + "\236\0\0\0\377\2\0\0\0\372\0\0\0\15\216\0\0\0\0\2\0\0\0\10\0\0\0\366" \ + "\226\0\0\0\377\1g\11$\377\260\274\21B\377\1)\4\16\377\270\0\0\0\377\2" \ + ";\5\25\377\265\20@\377\327\274\21B\377\2\242\17""9\377(\4\16\377\370" \ + "\0\0\0\377\2\35\3\12\377\210\14""0\377\314\274\21B\377\2\241\17""8\377" \ + "'\4\16\377\266\0\0\0\377\2\16\1\5\377\271\21A\377\256\274\21B\377\1Y" \ + "\10\37\377\236\0\0\0\377\1\0\0\0\303\220\0\0\0\0\1\0\0\0\272\226\0\0" \ + "\0\377\1-\4\20\377\257\274\21B\377\2\257\20>\377\3\0\1\377\271\0\0\0" \ + "\377\2""1\4\21\377\255\20=\377\324\274\21B\377\3\273\21B\377u\13)\377" \ + "\15\1\4\377\260\0\0\0\377\12\1\0\1\377\23\2\7\377)\4\16\377<\5\25\377" \ + "H\7\31\377T\10\36\377`\11\"\377l\12&\377q\12(\377w\13*\377\203}\13,\377" \ + "\12y\13*\377q\12(\377n\12'\377a\11\"\377V\10\36\377I\7\32\377=\6\25\377" \ + "+\4\17\377\25\2\7\377\2\0\1\377\263\0\0\0\377\3\1\0\0\377E\6\30\377\245" \ + "\17:\377\311\274\21B\377\2{\13+\377\15\1\4\377\270\0\0\0\377\1\216\15" \ + "2\377\256\274\21B\377\1\36\3\13\377\236\0\0\0\377\1\0\0\0~\220\0\0\0" \ + "\0\1\0\0\0v\226\0\0\0\377\2\1\0\1\377\252\17<\377\256\274\21B\377\1v" \ + "\13)\377\273\0\0\0\377\2\17\1\5\377\212\14""0\377\322\274\21B\377\2\237" \ + "\16""8\377+\4\17\377\254\0\0\0\377\7\11\1\3\377*\4\17\377J\7\32\377i" \ + "\11%\377\210\14""0\377\244\17:\377\270\21A\377\225\274\21B\377\7\271" \ + "\21A\377\247\17:\377\213\15""1\377l\12&\377M\7\33\377.\4\20\377\13\1" \ + "\4\377\257\0\0\0\377\3\3\0\1\377K\7\32\377\250\17;\377\305\274\21B\377" \ + "\2\233\16""6\377-\4\20\377\272\0\0\0\377\1Q\7\34\377\255\274\21B\377" \ + "\1\223\15""4\377\237\0\0\0\377\1\0\0\0""9\220\0\0\0\0\1\0\0\0""2\227" \ + "\0\0\0\377\1p\12'\377\256\274\21B\377\1=\6\25\377\274\0\0\0\377\3\4\0" \ + "\2\377k\12&\377\273\21B\377\316\274\21B\377\3\270\21A\377f\11$\377\10" \ + "\1\3\377\251\0\0\0\377\5\40\3\13\377P\7\34\377w\13*\377\234\16""7\377" \ + "\272\21A\377\241\274\21B\377\6\273\21B\377\240\16""8\377z\13+\377S\10" \ + "\35\377%\3\15\377\1\0\1\377\254\0\0\0\377\3\12\1\3\377V\10\36\377\251" \ + "\17;\377\301\274\21B\377\3\262\20>\377Y\10\37\377\4\0\2\377\273\0\0\0" \ + "\377\2\26\2\10\377\273\21B\377\254\274\21B\377\1N\7\33\377\236\0\0\0" \ + "\377\2\0\0\0\360\0\0\0\4\220\0\0\0\0\2\0\0\0\2\0\0\0\352\226\0\0\0\377" \ + "\1)\4\16\377\255\274\21B\377\2\264\20\77\377\7\1\2\377\276\0\0\0\377" \ + "\2""0\4\21\377\247\17;\377\314\274\21B\377\2\204\14.\377\31\2\11\377" \ + "\247\0\0\0\377\4\15\1\4\377@\6\27\377t\13)\377\250\17;\377\253\274\21" \ + "B\377\4\254\20<\377z\13+\377E\6\30\377\17\1\5\377\253\0\0\0\377\3\5\0" \ + "\2\377J\7\32\377\240\16""8\377\275\274\21B\377\3\266\20@\377h\11$\377" \ + "\17\1\5\377\276\0\0\0\377\1\227\16""5\377\253\274\21B\377\2\267\21@\377" \ + "\15\1\5\377\236\0\0\0\377\1\0\0\0\257\222\0\0\0\0\1\0\0\0\225\227\0\0" \ + "\0\377\1\237\16""8\377\254\274\21B\377\1\201\14-\377\300\0\0\0\377\2" \ + "\21\2\6\377\203\14.\377\311\274\21B\377\2\237\16""8\377<\5\25\377\246" \ + "\0\0\0\377\4\32\2\11\377U\10\36\377\214\15""1\377\271\21A\377\261\274" \ + "\21B\377\4\273\21A\377\222\15""3\377Y\10\37\377\40\3\13\377\252\0\0\0" \ + "\377\4\1\0\1\3775\5\23\377\205\14/\377\273\21A\377\270\274\21B\377\3" \ + "\266\20@\377n\12'\377\25\2\7\377\300\0\0\0\377\1]\10!\377\253\274\21" \ + "B\377\1\202\14.\377\237\0\0\0\377\1\0\0\0X\222\0\0\0\0\1\0\0\0@\227\0" \ + "\0\0\377\1Y\10\37\377\254\274\21B\377\1F\6\31\377\302\0\0\0\377\2""1" \ + "\4\21\377\236\16""7\377\305\274\21B\377\3\241\17""9\377\77\6\26\377\1" \ + "\0\0\377\244\0\0\0\377\3\17\1\5\377X\10\37\377\235\16""7\377\271\274" \ + "\21B\377\3\237\16""8\377X\10\37\377\22\2\6\377\252\0\0\0\377\3\33\2\11" \ + "\377f\11$\377\252\17<\377\264\274\21B\377\3\262\20\77\377e\11#\377\22" \ + "\2\6\377\302\0\0\0\377\2\27\2\10\377\273\21B\377\252\274\21B\377\1""1" \ + "\4\21\377\236\0\0\0\377\2\0\0\0\364\0\0\0\12\222\0\0\0\0\2\0\0\0\2\0" \ + "\0\0\345\226\0\0\0\377\2\27\2\10\377\273\21A\377\252\274\21B\377\2\271" \ + "\21A\377\17\1\5\377\303\0\0\0\377\3\7\1\3\377b\11\"\377\265\20\77\377" \ + "\301\274\21B\377\3\244\17:\377O\7\34\377\7\1\2\377\244\0\0\0\377\3'\4" \ + "\16\377t\12)\377\264\20\77\377\275\274\21B\377\4\267\21@\377{\13+\377" \ + "/\4\21\377\1\0\0\377\251\0\0\0\377\4\4\0\1\377:\5\24\377\202\14.\377" \ + "\266\20@\377\257\274\21B\377\3\223\15""4\377J\7\32\377\12\1\3\377\305" \ + "\0\0\0\377\1\217\15""2\377\251\274\21B\377\1\231\16""6\377\237\0\0\0" \ + "\377\1\0\0\0\253\224\0\0\0\0\1\0\0\0\222\227\0\0\0\377\1\201\14-\377" \ + "\252\274\21B\377\1\202\14.\377\306\0\0\0\377\3\23\2\7\377o\12'\377\270" \ + "\21A\377\275\274\21B\377\3\231\16""6\377C\6\30\377\3\0\1\377\243\0\0" \ + "\0\377\3\6\1\2\377J\7\32\377\227\16""5\377\303\274\21B\377\3\236\16""7" \ + "\377R\7\35\377\12\1\3\377\252\0\0\0\377\4\11\1\3\377=\6\25\377w\13*\377" \ + "\256\20=\377\251\274\21B\377\3\237\16""8\377a\11\"\377\40\3\13\377\310" \ + "\0\0\0\377\1J\7\32\377\251\274\21B\377\1F\6\31\377\237\0\0\0\377\1\0" \ + "\0\0V\224\0\0\0\0\1\0\0\0=\227\0\0\0\377\1.\4\20\377\252\274\21B\377" \ + "\1>\6\26\377\310\0\0\0\377\3\33\2\11\377t\13)\377\270\21A\377\270\274" \ + "\21B\377\3\271\21A\377\177\13-\377/\4\21\377\244\0\0\0\377\3\16\1\5\377" \ + "d\11#\377\262\20>\377\307\274\21B\377\3\263\20\77\377k\12&\377\24\2\7" \ + "\377\253\0\0\0\377\5\2\0\1\377'\4\16\377Z\10\40\377\215\15""1\377\267" \ + "\21@\377\241\274\21B\377\4\267\21@\377\214\15""1\377Z\10\40\377\40\3" \ + "\13\377\313\0\0\0\377\2\13\1\4\377\265\20@\377\247\274\21B\377\2\252" \ + "\17<\377\4\0\2\377\236\0\0\0\377\2\0\0\0\364\0\0\0\12\224\0\0\0\0\2\0" \ + "\0\0\3\0\0\0\345\227\0\0\0\377\1\225\15""4\377\250\274\21B\377\2\260" \ + "\20>\377\6\1\2\377\312\0\0\0\377\3\26\2\10\377l\12&\377\265\20@\377\264" \ + "\274\21B\377\3\247\17:\377`\11\"\377\25\2\10\377\244\0\0\0\377\3\12\1" \ + "\3\377^\11!\377\260\20>\377\313\274\21B\377\3\264\20\77\377g\11$\377" \ + "\17\1\5\377\255\0\0\0\377\6\4\0\2\377)\4\16\377P\7\34\377y\13*\377\231" \ + "\16""6\377\267\21@\377\227\274\21B\377\6\273\21B\377\242\17""9\377~\13" \ + ",\377[\10\40\3774\5\22\377\7\1\3\377\317\0\0\0\377\1\200\14-\377\247" \ + "\274\21B\377\1X\10\37\377\237\0\0\0\377\1\0\0\0\253\226\0\0\0\0\1\0\0" \ + "\0\177\227\0\0\0\377\1D\6\30\377\250\274\21B\377\1q\12(\377\315\0\0\0" \ + "\377\3\15\1\4\377P\7\34\377\231\16""6\377\257\274\21B\377\4\265\20\77" \ + "\377}\13,\3774\5\22\377\1\0\1\377\244\0\0\0\377\3\12\1\4\377d\11#\377" \ + "\263\20\77\377\317\274\21B\377\3\265\20\77\377d\11#\377\15\1\4\377\260" \ + "\0\0\0\377\11\2\0\1\377\33\2\11\3778\5\24\377Q\7\34\377i\11%\377\200" \ + "\14-\377\224\15""4\377\241\17""9\377\257\20>\377\206\274\21B\377\12\265" \ + "\20@\377\257\20>\377\247\17:\377\223\15""4\377\203\14.\377s\12(\377[" \ + "\10\40\377\77\6\26\377$\3\15\377\11\1\3\377\324\0\0\0\377\1""7\5\23\377" \ + "\246\274\21B\377\2\256\20=\377\12\1\3\377\237\0\0\0\377\1\0\0\0B\226" \ + "\0\0\0\0\2\0\0\0\31\0\0\0\372\226\0\0\0\377\2\4\0\2\377\246\17:\377\247" \ + "\274\21B\377\1.\4\20\377\320\0\0\0\377\3&\3\15\377f\11$\377\244\17""9" \ + "\377\251\274\21B\377\4\253\17<\377r\12(\3779\5\24\377\7\1\2\377\246\0" \ + "\0\0\377\2@\6\27\377\247\17:\377\323\274\21B\377\3\254\20<\377J\7\32" \ + "\377\1\0\1\377\377\0\0\0\377\234\0\0\0\377\2\1\0\0\377\240\16""8\377" \ + "\245\274\21B\377\1V\10\36\377\237\0\0\0\377\1\0\0\0\324\230\0\0\0\0\1" \ + "\0\0\0\254\227\0\0\0\377\1M\7\33\377\246\274\21B\377\2\241\17""9\377" \ + "\1\0\0\377\323\0\0\0\377\4%\3\15\377^\11!\377\221\15""3\377\271\21A\377" \ + "\241\274\21B\377\5\265\20\77\377\211\14""0\377V\10\36\377#\3\14\377\1" \ + "\0\0\377\247\0\0\0\377\2*\4\17\377\226\16""5\377\327\274\21B\377\2\237" \ + "\16""8\3775\5\23\377\377\0\0\0\377\234\0\0\0\377\1T\10\36\377\244\274" \ + "\21B\377\2\254\20<\377\10\1\3\377\237\0\0\0\377\1\0\0\0o\230\0\0\0\0" \ + "\1\0\0\0C\227\0\0\0\377\2\4\0\1\377\244\17""9\377\245\274\21B\377\1R" \ + "\7\35\377\327\0\0\0\377\5\12\1\3\3778\5\24\377^\11!\377\202\14.\377\244" \ + "\17:\377\230\274\21B\377\6\265\20\77\377\227\16""5\377v\13)\377M\7\33" \ + "\377%\3\15\377\3\0\1\377\251\0\0\0\377\3\6\1\2\377e\11#\377\272\21A\377" \ + "\331\274\21B\377\3\273\21B\377q\12(\377\12\1\4\377\377\0\0\0\377\232" \ + "\0\0\0\377\2\16\1\5\377\266\20@\377\243\274\21B\377\1T\10\36\377\237" \ + "\0\0\0\377\2\0\0\0\364\0\0\0\20\230\0\0\0\0\2\0\0\0\1\0\0\0\330\227\0" \ + "\0\0\377\1J\7\32\377\244\274\21B\377\2\264\20\77\377\13\1\4\377\334\0" \ + "\0\0\377\12\12\1\4\377&\3\15\377B\6\27\377]\10!\377t\13)\377\204\14." \ + "\377\226\16""5\377\247\17;\377\257\20>\377\266\20@\377\205\274\21B\377" \ + "\12\273\21B\377\256\20=\377\241\17""8\377\223\15""4\377~\13,\377f\11" \ + "$\377O\7\34\3776\5\23\377\30\2\11\377\1\0\1\377\255\0\0\0\377\2""0\4" \ + "\21\377\244\17""9\377\335\274\21B\377\2\253\17<\377;\5\25\377\377\0\0" \ + "\0\377\232\0\0\0\377\1s\12(\377\242\274\21B\377\2\233\16""6\377\2\0\1" \ + "\377\237\0\0\0\377\1\0\0\0\234\232\0\0\0\0\1\0\0\0t\227\0\0\0\377\2\4" \ + "\0\2\377\241\17""8\377\243\274\21B\377\1t\12)\377\377\0\0\0\377\242\0" \ + "\0\0\377\3\3\0\1\377a\11\"\377\272\21A\377\337\274\21B\377\3\273\21B" \ + "\377m\12&\377\7\1\2\377\377\0\0\0\377\230\0\0\0\377\2$\3\15\377\273\21" \ + "B\377\241\274\21B\377\1""5\5\23\377\240\0\0\0\377\1\0\0\0""6\232\0\0" \ + "\0\0\2\0\0\0\13\0\0\0\353\227\0\0\0\377\1""2\5\22\377\243\274\21B\377" \ + "\1#\3\14\377\377\0\0\0\377\241\0\0\0\377\2!\3\14\377\234\16""7\377\343" \ + "\274\21B\377\2\244\17""9\377+\4\17\377\377\0\0\0\377\230\0\0\0\377\1" \ + "\205\14/\377\240\274\21B\377\1\204\14.\377\240\0\0\0\377\1\0\0\0\274" \ + "\234\0\0\0\0\1\0\0\0\177\230\0\0\0\377\1\207\14/\377\241\274\21B\377" \ + "\1\220\15""2\377\377\0\0\0\377\241\0\0\0\377\2B\6\27\377\262\20\77\377" \ + "\345\274\21B\377\2\266\20@\377O\7\34\377\377\0\0\0\377\227\0\0\0\377" \ + "\1'\4\16\377\237\274\21B\377\2\260\20>\377\23\2\7\377\240\0\0\0\377\1" \ + "\0\0\0A\234\0\0\0\0\2\0\0\0\17\0\0\0\360\227\0\0\0\377\2\35\3\12\377" \ + "\270\21A\377\240\274\21B\377\1""5\5\23\377\377\0\0\0\377\237\0\0\0\377" \ + "\2\4\0\2\377q\12(\377\351\274\21B\377\2\202\14.\377\13\1\4\377\377\0" \ + "\0\0\377\226\0\0\0\377\1\210\14""0\377\236\274\21B\377\1M\7\33\377\240" \ + "\0\0\0\377\1\0\0\0\304\236\0\0\0\0\1\0\0\0\210\230\0\0\0\377\1]\10!\377" \ + "\237\274\21B\377\1\221\15""3\377\377\0\0\0\377\237\0\0\0\377\2\17\1\5" \ + "\377\216\15""2\377\353\274\21B\377\2\230\16""5\377\27\2\10\377\377\0" \ + "\0\0\377\225\0\0\0\377\1""1\4\21\377\235\274\21B\377\2\222\15""3\377" \ + "\1\0\1\377\240\0\0\0\377\1\0\0\0L\236\0\0\0\0\2\0\0\0\26\0\0\0\365\227" \ + "\0\0\0\377\2\3\0\1\377\230\16""5\377\236\274\21B\377\1""9\5\24\377\377" \ + "\0\0\0\377\236\0\0\0\377\2\35\3\12\377\245\17:\377\355\274\21B\377\2" \ + "\257\20=\377+\4\17\377\377\0\0\0\377\225\0\0\0\377\1\206\14/\377\233" \ + "\274\21B\377\2\265\20\77\377\36\3\13\377\240\0\0\0\377\1\0\0\0\315\240" \ + "\0\0\0\0\1\0\0\0\226\230\0\0\0\377\2*\4\17\377\273\21A\377\234\274\21" \ + "B\377\2\234\16""7\377\1\0\0\377\377\0\0\0\377\235\0\0\0\377\2+\4\17\377" \ + "\257\20=\377\357\274\21B\377\2\264\20\77\3777\5\23\377\377\0\0\0\377" \ + "\224\0\0\0\377\2\31\2\11\377\266\20@\377\232\274\21B\377\1@\6\27\377" \ + "\241\0\0\0\377\1\0\0\0[\240\0\0\0\0\2\0\0\0\26\0\0\0\361\230\0\0\0\377" \ + "\1g\11$\377\234\274\21B\377\1""6\5\23\377\377\0\0\0\377\235\0\0\0\377" \ + "\2/\4\21\377\262\20\77\377\361\274\21B\377\2\270\21@\377>\6\26\377\377" \ + "\0\0\0\377\224\0\0\0\377\1a\11\"\377\231\274\21B\377\1n\12'\377\241\0" \ + "\0\0\377\2\0\0\0\313\0\0\0\2\241\0\0\0\0\1\0\0\0|\230\0\0\0\377\2\3\0" \ + "\1\377\217\15""2\377\232\274\21B\377\1\200\14-\377\377\0\0\0\377\235" \ + "\0\0\0\377\2<\5\25\377\270\21@\377\363\274\21B\377\2\273\21B\377O\7\34" \ + "\377\377\0\0\0\377\223\0\0\0\377\2\12\1\3\377\251\17;\377\227\274\21" \ + "B\377\2\231\16""6\377\7\1\2\377\241\0\0\0\377\1\0\0\0\77\242\0\0\0\0" \ + "\2\0\0\0\11\0\0\0\340\230\0\0\0\377\2\22\2\6\377\252\17<\377\230\274" \ + "\21B\377\2\265\20\77\377\25\2\10\377\377\0\0\0\377\234\0\0\0\377\2:\5" \ + "\24\377\267\21@\377\365\274\21B\377\2\273\21A\377I\7\32\377\377\0\0\0" \ + "\377\223\0\0\0\377\2.\4\20\377\272\21A\377\225\274\21B\377\2\247\17;" \ + "\377\23\2\7\377\241\0\0\0\377\1\0\0\0\257\244\0\0\0\0\1\0\0\0\\\231\0" \ + "\0\0\377\2""6\5\23\377\273\21A\377\227\274\21B\377\1b\11\"\377\377\0" \ + "\0\0\377\234\0\0\0\377\2>\6\26\377\272\21A\377\367\274\21B\377\2\273" \ + "\21B\377K\7\32\377\377\0\0\0\377\223\0\0\0\377\1e\11#\377\224\274\21" \ + "B\377\2\264\20\77\377%\3\15\377\241\0\0\0\377\2\0\0\0\370\0\0\0#\244" \ + "\0\0\0\0\2\0\0\0\1\0\0\0\311\231\0\0\0\377\1S\7\35\377\226\274\21B\377" \ + "\2\224\15""4\377\4\0\1\377\377\0\0\0\377\233\0\0\0\377\2""4\5\22\377" \ + "\270\21@\377\371\274\21B\377\2\273\21A\377@\6\27\377\377\0\0\0\377\222" \ + "\0\0\0\377\2\4\0\1\377\223\15""4\377\222\274\21B\377\2\273\21A\377<\5" \ + "\25\377\242\0\0\0\377\1\0\0\0\216\246\0\0\0\0\2\0\0\0""9\0\0\0\376\231" \ + "\0\0\0\377\1n\12'\377\224\274\21B\377\2\262\20\77\377\33\2\11\377\377" \ + "\0\0\0\377\233\0\0\0\377\2#\3\14\377\261\20>\377\373\274\21B\377\2\266" \ + "\20@\377/\4\21\377\377\0\0\0\377\222\0\0\0\377\2\35\3\12\377\255\20=" \ + "\377\221\274\21B\377\1T\10\36\377\242\0\0\0\377\2\0\0\0\354\0\0\0\21" \ + "\247\0\0\0\0\1\0\0\0\247\231\0\0\0\377\2\2\0\1\377\205\14/\377\223\274" \ + "\21B\377\1J\7\32\377\377\0\0\0\377\233\0\0\0\377\2\33\2\11\377\255\20" \ + "=\377\375\274\21B\377\2\262\20\77\377#\3\14\377\355\0\0\0\377\6\15\1" \ + "\4\3774\5\22\377P\7\34\377i\12%\377}\13,\377\207\14/\377\202\212\14""0" \ + "\377\6\210\14""0\377x\13*\377i\11%\377R\7\35\3771\4\21\377\16\1\5\377" \ + "\226\0\0\0\377\2!\3\14\377\257\20>\377\216\274\21B\377\2\273\21B\377" \ + "J\7\32\377\243\0\0\0\377\1\0\0\0k\250\0\0\0\0\2\0\0\0\22\0\0\0\350\231" \ + "\0\0\0\377\2\15\1\4\377\227\16""5\377\221\274\21B\377\2y\13*\377\1\0" \ + "\0\377\377\0\0\0\377\232\0\0\0\377\2\15\1\4\377\236\16""7\377\377\274" \ + "\21B\377\2\251\17;\377\25\2\7\377\350\0\0\0\377\5\15\1\5\377\77\6\26" \ + "\377q\12(\377\237\16""8\377\273\21B\377\214\274\21B\377\4\273\21A\377" \ + "\230\16""5\377e\11#\377#\3\14\377\224\0\0\0\377\2""1\4\21\377\267\21" \ + "@\377\215\274\21B\377\1V\10\36\377\243\0\0\0\377\2\0\0\0\272\0\0\0\1" \ + "\251\0\0\0\0\1\0\0\0V\232\0\0\0\377\2\12\1\4\377\223\15""4\377\217\274" \ + "\21B\377\2~\13,\377\2\0\1\377\377\0\0\0\377\232\0\0\0\377\2\1\0\1\377" \ + "\205\14/\377\377\274\21B\377\202\274\21B\377\2\223\15""4\377\5\0\2\377" \ + "\344\0\0\0\377\4\5\0\2\377<\5\25\377\202\14.\377\270\21@\377\224\274" \ + "\21B\377\3\233\16""6\377E\6\30\377\3\0\1\377\222\0\0\0\377\2.\4\20\377" \ + "\255\20=\377\212\274\21B\377\2\271\21A\377J\7\32\377\243\0\0\0\377\2" \ + "\0\0\0\363\0\0\0\40\253\0\0\0\0\1\0\0\0\255\232\0\0\0\377\2\16\1\5\377" \ + "\231\16""6\377\215\274\21B\377\2\221\15""3\377\7\1\3\377\377\0\0\0\377" \ + "\233\0\0\0\377\1b\11\"\377\377\274\21B\377\204\274\21B\377\1x\13*\377" \ + "\342\0\0\0\377\3(\4\16\377o\12'\377\257\20>\377\231\274\21B\377\2\241" \ + "\17""9\377\77\6\26\377\222\0\0\0\377\2\26\2\10\377\210\14""0\377\210" \ + "\274\21B\377\2\262\20\77\3775\5\23\377\244\0\0\0\377\1\0\0\0s\254\0\0" \ + "\0\0\2\0\0\0\30\0\0\0\356\232\0\0\0\377\2\14\1\4\377\213\15""1\377\213" \ + "\274\21B\377\2\203\14.\377\12\1\3\377\377\0\0\0\377\233\0\0\0\377\2<" \ + "\5\25\377\273\21B\377\377\274\21B\377\205\274\21B\377\1J\7\32\377\336" \ + "\0\0\0\377\3\1\0\0\3779\5\24\377\217\15""2\377\236\274\21B\377\2\217" \ + "\15""2\377\37\3\13\377\222\0\0\0\377\3""7\5\23\377\213\15""1\377\273" \ + "\21A\377\203\274\21B\377\3\272\21A\377\213\15""1\377#\3\14\377\244\0" \ + "\0\0\377\2\0\0\0\305\0\0\0\2\255\0\0\0\0\1\0\0\0c\233\0\0\0\377\2\4\0" \ + "\2\377w\13*\377\210\274\21B\377\3\265\20\77\377S\10\35\377\1\0\1\377" \ + "\377\0\0\0\377\233\0\0\0\377\2\23\2\7\377\255\20=\377\377\274\21B\377" \ + "\206\274\21B\377\2\265\20\77\377\37\3\13\377\333\0\0\0\377\3\7\1\3\377" \ + "R\7\35\377\244\17""9\377\241\274\21B\377\3\270\21A\377^\11!\377\1\0\1" \ + "\377\222\0\0\0\377\5\17\1\5\377-\4\20\3772\5\22\377,\4\20\377\13\1\4" \ + "\377\245\0\0\0\377\2\0\0\0\371\0\0\0-\256\0\0\0\0\2\0\0\0\1\0\0\0\270" \ + "\233\0\0\0\377\3\1\0\0\377U\10\36\377\245\17:\377\204\274\21B\377\3\256" \ + "\20=\377i\12%\377\24\2\7\377\377\0\0\0\377\234\0\0\0\377\2\1\0\1\377" \ + "\217\15""2\377\377\274\21B\377\210\274\21B\377\2\235\16""7\377\6\1\2" \ + "\377\330\0\0\0\377\3\1\0\0\377E\6\30\377\247\17:\377\245\274\21B\377" \ + "\1f\11$\377\274\0\0\0\377\1\0\0\0~\260\0\0\0\0\2\0\0\0\21\0\0\0\340\234" \ + "\0\0\0\377\2\1\0\0\377\32\2\11\377\2022\5\22\377\2#\3\14\377\4\0\1\377" \ + "\377\0\0\0\377\236\0\0\0\377\1S\7\35\377\377\274\21B\377\212\274\21B" \ + "\377\1d\11#\377\327\0\0\0\377\2,\4\20\377\225\15""4\377\250\274\21B\377" \ + "\1R\7\35\377\272\0\0\0\377\2\0\0\0\263\0\0\0\1\261\0\0\0\0\2\0\0\0=\0" \ + "\0\0\373\377\0\0\0\377\276\0\0\0\377\2\32\2\11\377\264\20\77\377\377" \ + "\274\21B\377\212\274\21B\377\2\271\21A\377&\3\15\377\324\0\0\0\377\2" \ + "\40\3\13\377\212\14""0\377\252\274\21B\377\2\273\21A\3774\5\22\377\270" \ + "\0\0\0\377\2\0\0\0\345\0\0\0\25\263\0\0\0\0\1\0\0\0{\377\0\0\0\377\275" \ + "\0\0\0\377\2\1\0\0\377\216\15""2\377\377\274\21B\377\214\274\21B\377" \ + "\2\234\16""7\377\4\0\1\377\321\0\0\0\377\3\3\0\1\377Y\10\37\377\266\20" \ + "@\377\254\274\21B\377\2\250\17;\377\12\1\4\377\266\0\0\0\377\2\0\0\0" \ + "\374\0\0\0\77\264\0\0\0\0\2\0\0\0\2\0\0\0\272\377\0\0\0\377\274\0\0\0" \ + "\377\1F\6\31\377\377\274\21B\377\216\274\21B\377\1X\10\37\377\320\0\0" \ + "\0\377\2%\3\15\377\234\16""7\377\257\274\21B\377\1n\12'\377\266\0\0\0" \ + "\377\1\0\0\0\201\266\0\0\0\0\2\0\0\0\26\0\0\0\346\302\0\0\0\377\3\22" \ + "\2\6\377%\3\15\377.\4\20\377\2032\5\22\377\3&\3\15\377\26\2\10\377\10" \ + "\1\3\377\356\0\0\0\377\2\13\1\4\377\253\17<\377\377\274\21B\377\216\274" \ + "\21B\377\2\263\20\77\377\25\2\10\377\315\0\0\0\377\3\4\0\2\377d\11#\377" \ + "\271\21A\377\260\274\21B\377\2\273\21A\377)\4\16\377\264\0\0\0\377\2" \ + "\0\0\0\275\0\0\0\2\267\0\0\0\0\2\0\0\0E\0\0\0\373\274\0\0\0\377\5\40" \ + "\3\13\377P\7\34\377t\13)\377\231\16""6\377\264\20\77\377\211\274\21B" \ + "\377\6\256\20=\377\226\16""5\377z\13+\377S\7\35\377+\4\17\377\7\1\2\377" \ + "\350\0\0\0\377\1g\11$\377\377\274\21B\377\220\274\21B\377\1z\13+\377" \ + "\314\0\0\0\377\2\33\2\12\377\222\15""3\377\263\274\21B\377\2\223\15""4" \ + "\377\1\0\1\377\262\0\0\0\377\2\0\0\0\347\0\0\0\35\271\0\0\0\0\1\0\0\0" \ + "`\270\0\0\0\377\4\1\0\0\377)\4\16\377l\12&\377\246\17:\377\223\274\21" \ + "B\377\5\270\21A\377\227\16""5\377m\12&\3775\5\23\377\4\0\2\377\343\0" \ + "\0\0\377\2\32\2\11\377\270\21@\377\377\274\21B\377\220\274\21B\377\2" \ + "\273\21B\377&\3\15\377\312\0\0\0\377\2B\6\27\377\262\20\77\377\265\274" \ + "\21B\377\1B\6\27\377\261\0\0\0\377\2\0\0\0\364\0\0\0""1\273\0\0\0\0\1" \ + "\0\0\0\214\265\0\0\0\377\3\7\1\2\377L\7\33\377\237\16""8\377\232\274" \ + "\21B\377\4\261\20>\377z\13+\377>\6\26\377\10\1\3\377\340\0\0\0\377\1" \ + "w\13*\377\377\274\21B\377\222\274\21B\377\1\210\14""0\377\310\0\0\0\377" \ + "\2\10\1\3\377w\13*\377\267\274\21B\377\2\237\16""8\377\1\0\1\377\257" \ + "\0\0\0\377\2\0\0\0\375\0\0\0R\274\0\0\0\0\2\0\0\0\2\0\0\0\261\262\0\0" \ + "\0\377\3\2\0\1\377L\7\33\377\253\17<\377\237\274\21B\377\3\265\20@\377" \ + "{\13+\377.\4\20\377\335\0\0\0\377\2\40\3\13\377\273\21A\377\377\274\21" \ + "B\377\223\274\21B\377\1/\4\21\377\306\0\0\0\377\2!\3\14\377\237\16""8" \ + "\377\271\274\21B\377\1:\5\24\377\257\0\0\0\377\1\0\0\0|\276\0\0\0\0\2" \ + "\0\0\0\15\0\0\0\321\260\0\0\0\377\2\34\3\12\377\232\16""6\377\244\274" \ + "\21B\377\3\235\16""7\377P\7\34\377\13\1\4\377\332\0\0\0\377\1y\13*\377" \ + "\377\274\21B\377\224\274\21B\377\1\213\15""1\377\305\0\0\0\377\2@\6\27" \ + "\377\262\20>\377\272\274\21B\377\1\220\15""2\377\256\0\0\0\377\2\0\0" \ + "\0\244\0\0\0\1\277\0\0\0\0\2\0\0\0\37\0\0\0\350\256\0\0\0\377\2,\4\20" \ + "\377\257\20>\377\247\274\21B\377\3\264\20\77\377q\12(\377\30\2\11\377" \ + "\327\0\0\0\377\2\34\3\12\377\272\21A\377\377\274\21B\377\225\274\21B" \ + "\377\1-\4\20\377\302\0\0\0\377\2\1\0\1\377e\11#\377\275\274\21B\377\1" \ + ",\4\20\377\254\0\0\0\377\2\0\0\0\307\0\0\0\10\301\0\0\0\0\1\0\0\0|\255" \ + "\0\0\0\377\2)\4\16\377\262\20\77\377\252\274\21B\377\3\270\21A\377s\12" \ + "(\377\30\2\11\377\325\0\0\0\377\1m\12&\377\377\274\21B\377\226\274\21" \ + "B\377\1\201\14-\377\301\0\0\0\377\2\17\1\5\377\216\15""2\377\276\274" \ + "\21B\377\1{\13+\377\254\0\0\0\377\1\0\0\0C\302\0\0\0\0\1\0\0\0E\254\0" \ + "\0\0\377\2\33\2\12\377\257\20=\377\255\274\21B\377\3\273\21A\377}\13" \ + ",\377\35\3\12\377\322\0\0\0\377\2\16\1\5\377\265\20\77\377\377\274\21" \ + "B\377\226\274\21B\377\2\273\21A\377\32\2\11\377\277\0\0\0\377\2\40\3" \ + "\13\377\242\17""9\377\277\274\21B\377\2\266\20@\377\14\1\4\377\252\0" \ + "\0\0\377\2\0\0\0\375\0\0\0\15\302\0\0\0\0\2\0\0\0\21\0\0\0\376\252\0" \ + "\0\0\377\2\5\0\2\377\231\16""6\377\260\274\21B\377\3\270\21A\377k\12" \ + "&\377\14\1\4\377\320\0\0\0\377\1V\10\36\377\377\274\21B\377\230\274\21" \ + "B\377\1i\11%\377\276\0\0\0\377\2:\5\24\377\262\20\77\377\301\274\21B" \ + "\377\1I\7\32\377\252\0\0\0\377\1\0\0\0\326\304\0\0\0\0\1\0\0\0\333\252" \ + "\0\0\0\377\1h\11$\377\263\274\21B\377\3\254\20<\377H\6\31\377\1\0\0\377" \ + "\315\0\0\0\377\2\1\0\0\377\242\17""9\377\377\274\21B\377\230\274\21B" \ + "\377\2\257\20=\377\7\1\2\377\274\0\0\0\377\2L\7\33\377\271\21A\377\302" \ + "\274\21B\377\1\213\15""1\377\252\0\0\0\377\1\0\0\0\241\304\0\0\0\0\1" \ + "\0\0\0\246\251\0\0\0\377\2&\3\15\377\273\21A\377\265\274\21B\377\2\231" \ + "\16""6\377,\4\20\377\314\0\0\0\377\1""1\4\21\377\377\274\21B\377\232" \ + "\274\21B\377\1C\6\30\377\272\0\0\0\377\2\1\0\1\377k\12&\377\304\274\21" \ + "B\377\2\273\21B\377\30\2\11\377\251\0\0\0\377\1\0\0\0l\304\0\0\0\0\1" \ + "\0\0\0r\251\0\0\0\377\1\213\15""1\377\267\274\21B\377\3\273\21A\377o" \ + "\12'\377\13\1\4\377\312\0\0\0\377\1u\13)\377\377\274\21B\377\232\274" \ + "\21B\377\1\210\14""0\377\271\0\0\0\377\2\2\0\1\377q\12(\377\306\274\21" \ + "B\377\1T\10\36\377\251\0\0\0\377\1\0\0\0""6\304\0\0\0\0\1\0\0\0=\250" \ + "\0\0\0\377\1=\6\25\377\272\274\21B\377\2\253\17<\377<\5\25\377\310\0" \ + "\0\0\377\2\11\1\3\377\264\20\77\377\377\274\21B\377\232\274\21B\377\2" \ + "\273\21A\377\25\2\10\377\267\0\0\0\377\2\12\1\3\377\212\14""0\377\307" \ + "\274\21B\377\1\213\15""1\377\250\0\0\0\377\2\0\0\0\370\0\0\0\7\304\0" \ + "\0\0\0\2\0\0\0\14\0\0\0\372\246\0\0\0\377\2\1\0\1\377\237\16""8\377\273" \ + "\274\21B\377\3\273\21B\377s\12(\377\13\1\4\377\306\0\0\0\377\1<\5\25" \ + "\377\377\274\21B\377\234\274\21B\377\1P\7\34\377\266\0\0\0\377\2\20\1" \ + "\6\377\225\15""4\377\310\274\21B\377\2\270\21@\377\11\1\3\377\247\0\0" \ + "\0\377\1\0\0\0\313\306\0\0\0\0\1\0\0\0\305\246\0\0\0\377\1""7\5\23\377" \ + "\276\274\21B\377\2\253\17<\377<\5\25\377\305\0\0\0\377\1y\13*\377\377" \ + "\274\21B\377\234\274\21B\377\1\214\15""1\377\265\0\0\0\377\2\21\2\6\377" \ + "\233\16""6\377\312\274\21B\377\1""5\5\23\377\247\0\0\0\377\1\0\0\0\211" \ + "\306\0\0\0\0\1\0\0\0\206\246\0\0\0\377\1\201\14-\377\277\274\21B\377" \ + "\3\273\21B\377o\12'\377\6\1\2\377\302\0\0\0\377\2\4\0\2\377\261\20>\377" \ + "\377\274\21B\377\234\274\21B\377\2\272\21A\377\16\1\5\377\263\0\0\0\377" \ + "\2\30\2\11\377\244\17:\377\313\274\21B\377\1k\12&\377\247\0\0\0\377\1" \ + "\0\0\0J\306\0\0\0\0\1\0\0\0G\245\0\0\0\377\2\30\2\10\377\273\21A\377" \ + "\301\274\21B\377\2\237\16""8\377\40\3\13\377\301\0\0\0\377\1/\4\21\377" \ + "\377\274\21B\377\236\274\21B\377\1B\6\27\377\262\0\0\0\377\2\32\2\11" \ + "\377\246\17:\377\314\274\21B\377\1\237\16""8\377\246\0\0\0\377\2\0\0" \ + "\0\374\0\0\0\16\306\0\0\0\0\2\0\0\0\14\0\0\0\372\244\0\0\0\377\1^\10" \ + "!\377\303\274\21B\377\2\261\20>\377>\6\26\377\300\0\0\0\377\1a\11\"\377" \ + "\377\274\21B\377\236\274\21B\377\1s\12(\377\261\0\0\0\377\2\27\2\10\377" \ + "\243\17""9\377\316\274\21B\377\1\22\2\6\377\245\0\0\0\377\1\0\0\0\313" \ + "\310\0\0\0\0\1\0\0\0\307\244\0\0\0\377\1\231\16""6\377\305\274\21B\377" \ + "\2w\13*\377\7\1\3\377\276\0\0\0\377\1\220\15""2\377\377\274\21B\377\236" \ + "\274\21B\377\1\242\17""9\377\260\0\0\0\377\2\40\3\13\377\252\17<\377" \ + "\317\274\21B\377\1:\5\24\377\245\0\0\0\377\1\0\0\0\214\310\0\0\0\0\1" \ + "\0\0\0\212\243\0\0\0\377\2\23\2\7\377\273\21B\377\306\274\21B\377\2\225" \ + "\15""4\377\25\2\7\377\274\0\0\0\377\2\7\1\3\377\270\21@\377\377\274\21" \ + "B\377\237\274\21B\377\1\26\2\10\377\256\0\0\0\377\2\33\2\11\377\247\17" \ + ";\377\320\274\21B\377\1_\11!\377\245\0\0\0\377\1\0\0\0O\310\0\0\0\0\1" \ + "\0\0\0C\243\0\0\0\377\1J\7\32\377\310\274\21B\377\2\256\20=\377.\4\20" \ + "\377\273\0\0\0\377\1,\4\20\377\377\274\21B\377\240\274\21B\377\1\77\6" \ + "\26\377\255\0\0\0\377\2\35\3\12\377\253\17<\377\321\274\21B\377\1\207" \ + "\14/\377\244\0\0\0\377\2\0\0\0\371\0\0\0\15\310\0\0\0\0\2\0\0\0\6\0\0" \ + "\0\362\242\0\0\0\377\1\201\14-\377\311\274\21B\377\2\267\21@\377F\6\31" \ + "\377\272\0\0\0\377\1S\10\35\377\377\274\21B\377\240\274\21B\377\1e\11" \ + "#\377\254\0\0\0\377\2\30\2\11\377\247\17:\377\322\274\21B\377\1\255\20" \ + "=\377\244\0\0\0\377\1\0\0\0\275\312\0\0\0\0\1\0\0\0\256\241\0\0\0\377" \ + "\2\1\0\0\377\257\20>\377\312\274\21B\377\3\273\21B\377]\10!\377\1\0\0" \ + "\377\270\0\0\0\377\1w\13*\377\377\274\21B\377\240\274\21B\377\1\212\14" \ + "0\377\253\0\0\0\377\2\23\2\7\377\242\17""9\377\324\274\21B\377\1\30\2" \ + "\11\377\243\0\0\0\377\1\0\0\0t\312\0\0\0\0\1\0\0\0e\241\0\0\0\377\1\32" \ + "\2\11\377\315\274\21B\377\2\200\14-\377\10\1\3\377\267\0\0\0\377\1\233" \ + "\16""6\377\377\274\21B\377\240\274\21B\377\1\255\20=\377\252\0\0\0\377" \ + "\2\15\1\5\377\232\16""6\377\325\274\21B\377\1=\6\25\377\243\0\0\0\377" \ + "\1\0\0\0*\312\0\0\0\0\2\0\0\0\34\0\0\0\376\240\0\0\0\377\1<\5\25\377" \ + "\316\274\21B\377\2\220\15""2\377\14\1\4\377\265\0\0\0\377\2\2\0\1\377" \ + "\270\21A\377\377\274\21B\377\241\274\21B\377\1\20\1\6\377\250\0\0\0\377" \ + "\2\16\1\5\377\233\16""6\377\326\274\21B\377\1[\10\40\377\242\0\0\0\377" \ + "\1\0\0\0\337\314\0\0\0\0\1\0\0\0\321\240\0\0\0\377\1a\11\"\377\317\274" \ + "\21B\377\2\236\16""7\377\25\2\10\377\264\0\0\0\377\1\30\2\10\377\377" \ + "\274\21B\377\242\274\21B\377\1*\4\17\377\247\0\0\0\377\2\7\1\2\377\220" \ + "\15""2\377\327\274\21B\377\1t\12)\377\242\0\0\0\377\1\0\0\0\225\314\0" \ + "\0\0\0\1\0\0\0\210\240\0\0\0\377\1\205\14/\377\320\274\21B\377\2\245" \ + "\17:\377\34\3\12\377\263\0\0\0\377\1""1\4\21\377\377\274\21B\377\242" \ + "\274\21B\377\1D\6\30\377\246\0\0\0\377\2\4\0\2\377\213\15""1\377\330" \ + "\274\21B\377\1\216\15""2\377\242\0\0\0\377\1\0\0\0M\314\0\0\0\0\1\0\0" \ + "\0""5\240\0\0\0\377\1\244\17:\377\321\274\21B\377\2\250\17;\377\37\3" \ + "\13\377\262\0\0\0\377\1J\7\32\377\377\274\21B\377\242\274\21B\377\1]" \ + "\10!\377\245\0\0\0\377\2\1\0\1\377z\13+\377\331\274\21B\377\1\250\17" \ + ";\377\241\0\0\0\377\2\0\0\0\361\0\0\0\7\314\0\0\0\0\2\0\0\0\1\0\0\0\341" \ + "\236\0\0\0\377\2\2\0\1\377\271\21A\377\322\274\21B\377\2\260\20>\377" \ + ",\4\20\377\261\0\0\0\377\1\\\10\40\377\377\274\21B\377\242\274\21B\377" \ + "\1o\12'\377\245\0\0\0\377\1f\11$\377\332\274\21B\377\2\273\21B\377\7" \ + "\1\2\377\240\0\0\0\377\1\0\0\0\250\316\0\0\0\0\1\0\0\0\221\236\0\0\0" \ + "\377\1\22\2\6\377\324\274\21B\377\2\262\20\77\377+\4\17\377\260\0\0\0" \ + "\377\1l\12&\377\377\274\21B\377\242\274\21B\377\1\177\13-\377\244\0\0" \ + "\0\377\1U\10\36\377\334\274\21B\377\1\37\3\13\377\240\0\0\0\377\1\0\0" \ + "\0W\316\0\0\0\0\1\0\0\0@\236\0\0\0\377\1&\3\15\377\325\274\21B\377\2" \ + "\265\20\77\377/\4\21\377\257\0\0\0\377\1{\13+\377\377\274\21B\377\242" \ + "\274\21B\377\1\216\15""2\377\243\0\0\0\377\2>\6\26\377\273\21A\377\334" \ + "\274\21B\377\1""7\5\23\377\237\0\0\0\377\2\0\0\0\367\0\0\0\14\316\0\0" \ + "\0\0\2\0\0\0\3\0\0\0\352\235\0\0\0\377\1:\5\24\377\326\274\21B\377\2" \ + "\264\20\77\377.\4\20\377\256\0\0\0\377\1\210\14""0\377\377\274\21B\377" \ + "\242\274\21B\377\1\234\16""7\377\242\0\0\0\377\2)\4\16\377\267\21@\377" \ + "\335\274\21B\377\1G\6\31\377\237\0\0\0\377\1\0\0\0\264\320\0\0\0\0\1" \ + "\0\0\0\236\235\0\0\0\377\1M\7\33\377\327\274\21B\377\2\257\20>\377%\3" \ + "\15\377\255\0\0\0\377\1\217\15""2\377\377\274\21B\377\242\274\21B\377" \ + "\1\242\17""9\377\241\0\0\0\377\2\25\2\7\377\253\17<\377\336\274\21B\377" \ + "\1V\10\36\377\237\0\0\0\377\1\0\0\0d\320\0\0\0\0\1\0\0\0B\235\0\0\0\377" \ + "\1V\10\36\377\330\274\21B\377\2\261\20>\377)\4\16\377\254\0\0\0\377\1" \ + "\224\15""4\377\377\274\21B\377\242\274\21B\377\1\250\17;\377\240\0\0" \ + "\0\377\2\5\0\2\377\223\15""4\377\337\274\21B\377\1c\11#\377\236\0\0\0" \ + "\377\2\0\0\0\366\0\0\0\16\320\0\0\0\0\2\0\0\0\2\0\0\0\344\234\0\0\0\377" \ + "\1[\10\40\377\331\274\21B\377\2\255\20=\377\37\3\13\377\253\0\0\0\377" \ + "\1\231\16""6\377\377\274\21B\377\242\274\21B\377\1\255\20=\377\240\0" \ + "\0\0\377\1o\12'\377\340\274\21B\377\1q\12(\377\236\0\0\0\377\1\0\0\0" \ + "\255\322\0\0\0\0\1\0\0\0\215\234\0\0\0\377\1a\11\"\377\332\274\21B\377" \ + "\2\252\17<\377\30\2\10\377\252\0\0\0\377\1\234\16""7\377\377\274\21B" \ + "\377\242\274\21B\377\1\260\20>\377\237\0\0\0\377\1J\7\32\377\341\274" \ + "\21B\377\1~\13,\377\236\0\0\0\377\1\0\0\0T\322\0\0\0\0\1\0\0\0""3\234" \ + "\0\0\0\377\1f\11$\377\333\274\21B\377\2\241\17""9\377\21\2\6\377\251" \ + "\0\0\0\377\1\227\16""5\377\377\274\21B\377\242\274\21B\377\1\253\17<" \ + "\377\236\0\0\0\377\2'\4\16\377\267\21@\377\341\274\21B\377\1\214\15""1" \ + "\377\235\0\0\0\377\2\0\0\0\357\0\0\0\10\323\0\0\0\0\1\0\0\0\330\233\0" \ + "\0\0\377\1l\12&\377\334\274\21B\377\2\225\15""4\377\11\1\3\377\250\0" \ + "\0\0\377\1\222\15""3\377\377\274\21B\377\242\274\21B\377\1\246\17:\377" \ + "\235\0\0\0\377\2\7\1\3\377\240\16""8\377\342\274\21B\377\1\231\16""6" \ + "\377\235\0\0\0\377\1\0\0\0\236\324\0\0\0\0\1\0\0\0\177\233\0\0\0\377" \ + "\1p\12'\377\335\274\21B\377\2\201\14-\377\2\0\1\377\247\0\0\0\377\1\216" \ + "\15""2\377\377\274\21B\377\242\274\21B\377\1\241\17""8\377\235\0\0\0" \ + "\377\1q\12(\377\343\274\21B\377\1\236\16""7\377\235\0\0\0\377\1\0\0\0" \ + "E\324\0\0\0\0\2\0\0\0#\0\0\0\376\232\0\0\0\377\1j\12%\377\336\274\21" \ + "B\377\2y\13*\377\1\0\0\377\246\0\0\0\377\1\205\14/\377\377\274\21B\377" \ + "\242\274\21B\377\1\231\16""6\377\234\0\0\0\377\1""7\5\23\377\344\274" \ + "\21B\377\1\237\16""8\377\234\0\0\0\377\2\0\0\0\347\0\0\0\3\325\0\0\0" \ + "\0\1\0\0\0\312\232\0\0\0\377\1c\11#\377\337\274\21B\377\1T\10\36\377" \ + "\246\0\0\0\377\1v\13)\377\377\274\21B\377\242\274\21B\377\1\211\14""0" \ + "\377\233\0\0\0\377\2\16\1\5\377\252\17<\377\344\274\21B\377\1\240\16" \ + "8\377\234\0\0\0\377\1\0\0\0\220\326\0\0\0\0\1\0\0\0p\232\0\0\0\377\1" \ + "[\10\40\377\337\274\21B\377\2\273\21A\3773\5\22\377\245\0\0\0\377\1f" \ + "\11$\377\377\274\21B\377\242\274\21B\377\1z\13+\377\233\0\0\0\377\1{" \ + "\13+\377\345\274\21B\377\1\241\17""8\377\234\0\0\0\377\1\0\0\0""6\326" \ + "\0\0\0\0\2\0\0\0\30\0\0\0\374\231\0\0\0\377\1S\7\35\377\340\274\21B\377" \ + "\2\254\20<\377\24\2\7\377\244\0\0\0\377\1W\10\37\377\377\274\21B\377" \ + "\242\274\21B\377\1j\12%\377\232\0\0\0\377\1@\6\27\377\346\274\21B\377" \ + "\1\241\17""9\377\233\0\0\0\377\1\0\0\0\331\330\0\0\0\0\1\0\0\0\273\231" \ + "\0\0\0\377\1K\7\32\377\341\274\21B\377\2\222\15""3\377\4\0\2\377\243" \ + "\0\0\0\377\1C\6\30\377\377\274\21B\377\242\274\21B\377\1V\10\36\377\231" \ + "\0\0\0\377\2\15\1\4\377\254\20<\377\346\274\21B\377\1\242\17""9\377\233" \ + "\0\0\0\377\1\0\0\0\201\330\0\0\0\0\1\0\0\0c\231\0\0\0\377\1B\6\27\377" \ + "\342\274\21B\377\1c\11#\377\243\0\0\0\377\1(\4\16\377\377\274\21B\377" \ + "\242\274\21B\377\1;\5\25\377\231\0\0\0\377\1q\12(\377\347\274\21B\377" \ + "\1\244\17""9\377\233\0\0\0\377\1\0\0\0*\330\0\0\0\0\2\0\0\0\15\0\0\0" \ + "\365\230\0\0\0\377\1""1\4\21\377\342\274\21B\377\2\273\21B\3777\5\23" \ + "\377\242\0\0\0\377\1\16\1\5\377\377\274\21B\377\242\274\21B\377\1\40" \ + "\3\13\377\230\0\0\0\377\2#\3\14\377\272\21A\377\347\274\21B\377\1\240" \ + "\16""8\377\232\0\0\0\377\1\0\0\0\311\332\0\0\0\0\1\0\0\0\247\230\0\0" \ + "\0\377\1\33\2\12\377\343\274\21B\377\2\255\20=\377\17\1\5\377\242\0\0" \ + "\0\377\1\261\20>\377\377\274\21B\377\240\274\21B\377\2\273\21B\377\10" \ + "\1\3\377\227\0\0\0\377\2\1\0\1\377\226\16""5\377\350\274\21B\377\1\224" \ + "\15""4\377\232\0\0\0\377\1\0\0\0n\332\0\0\0\0\1\0\0\0L\230\0\0\0\377" \ + "\1\7\1\2\377\344\274\21B\377\1w\13*\377\242\0\0\0\377\1\216\15""2\377" \ + "\377\274\21B\377\240\274\21B\377\1\241\17""8\377\230\0\0\0\377\1I\7\32" \ + "\377\351\274\21B\377\1\211\14""0\377\231\0\0\0\377\2\0\0\0\372\0\0\0" \ + "\25\332\0\0\0\0\2\0\0\0\4\0\0\0\350\230\0\0\0\377\1\256\20=\377\344\274" \ + "\21B\377\1:\5\24\377\241\0\0\0\377\1j\12%\377\377\274\21B\377\240\274" \ + "\21B\377\1}\13,\377\227\0\0\0\377\2\16\1\5\377\256\20=\377\351\274\21" \ + "B\377\1}\13,\377\231\0\0\0\377\1\0\0\0\265\334\0\0\0\0\1\0\0\0\222\230" \ + "\0\0\0\377\1\231\16""6\377\344\274\21B\377\2\251\17;\377\14\1\4\377\240" \ + "\0\0\0\377\1F\6\31\377\377\274\21B\377\240\274\21B\377\1X\10\37\377\227" \ + "\0\0\0\377\1i\12%\377\352\274\21B\377\1r\12(\377\231\0\0\0\377\1\0\0" \ + "\0Z\334\0\0\0\0\1\0\0\0""7\230\0\0\0\377\1\205\14/\377\345\274\21B\377" \ + "\1q\12(\377\240\0\0\0\377\1!\3\14\377\377\274\21B\377\240\274\21B\377" \ + "\1""4\5\22\377\226\0\0\0\377\2\35\3\12\377\272\21A\377\352\274\21B\377" \ + "\1f\11$\377\230\0\0\0\377\2\0\0\0\362\0\0\0\12\335\0\0\0\0\1\0\0\0\330" \ + "\227\0\0\0\377\1k\12&\377\345\274\21B\377\2\273\21A\377+\4\17\377\237" \ + "\0\0\0\377\2\1\0\0\377\255\20=\377\377\274\21B\377\236\274\21B\377\2" \ + "\270\21A\377\11\1\3\377\226\0\0\0\377\1z\13+\377\353\274\21B\377\1[\10" \ + "\40\377\230\0\0\0\377\1\0\0\0\240\336\0\0\0\0\1\0\0\0~\227\0\0\0\377" \ + "\1I\7\32\377\346\274\21B\377\2\231\16""6\377\1\0\1\377\237\0\0\0\377" \ + "\1\177\13-\377\377\274\21B\377\236\274\21B\377\1\221\15""3\377\226\0" \ + "\0\0\377\2\35\3\12\377\272\21A\377\353\274\21B\377\1O\7\34\377\230\0" \ + "\0\0\377\1\0\0\0E\336\0\0\0\0\2\0\0\0#\0\0\0\376\226\0\0\0\377\1(\4\16" \ + "\377\347\274\21B\377\1H\6\31\377\237\0\0\0\377\1P\7\34\377\377\274\21" \ + "B\377\236\274\21B\377\1a\11\"\377\226\0\0\0\377\1\200\14-\377\354\274" \ + "\21B\377\1""7\5\23\377\227\0\0\0\377\2\0\0\0\344\0\0\0\2\337\0\0\0\0" \ + "\1\0\0\0\305\226\0\0\0\377\2\10\1\3\377\273\21A\377\346\274\21B\377\2" \ + "\253\17<\377\12\1\4\377\236\0\0\0\377\1\35\3\12\377\377\274\21B\377\236" \ + "\274\21B\377\1/\4\21\377\225\0\0\0\377\2(\4\16\377\273\21B\377\354\274" \ + "\21B\377\1\36\3\13\377\227\0\0\0\377\1\0\0\0\214\340\0\0\0\0\1\0\0\0" \ + "p\227\0\0\0\377\1\243\17""9\377\347\274\21B\377\1a\11\"\377\237\0\0\0" \ + "\377\1\236\16""7\377\377\274\21B\377\234\274\21B\377\2\255\20=\377\2" \ + "\0\1\377\225\0\0\0\377\1\205\14/\377\354\274\21B\377\2\273\21A\377\6" \ + "\1\2\377\227\0\0\0\377\1\0\0\0""7\340\0\0\0\0\1\0\0\0=\227\0\0\0\377" \ + "\1\202\14.\377\347\274\21B\377\2\265\20@\377\27\2\10\377\236\0\0\0\377" \ + "\1d\11#\377\377\274\21B\377\234\274\21B\377\1w\13*\377\225\0\0\0\377" \ + "\2(\4\16\377\273\21B\377\354\274\21B\377\1\251\17;\377\227\0\0\0\377" \ + "\2\0\0\0\374\0\0\0\7\340\0\0\0\0\1\0\0\0\27\227\0\0\0\377\1a\11\"\377" \ + "\350\274\21B\377\1u\13)\377\236\0\0\0\377\1,\4\20\377\377\274\21B\377" \ + "\234\274\21B\377\1\77\6\26\377\225\0\0\0\377\1\205\14/\377\355\274\21" \ + "B\377\1\216\15""2\377\227\0\0\0\377\1\0\0\0\334\342\0\0\0\0\1\0\0\0\357" \ + "\226\0\0\0\377\1""6\5\23\377\350\274\21B\377\2\273\21A\377\40\3\13\377" \ + "\235\0\0\0\377\2\1\0\0\377\242\17""9\377\377\274\21B\377\232\274\21B" \ + "\377\2\260\20>\377\6\1\2\377\224\0\0\0\377\2\40\3\13\377\273\21B\377" \ + "\355\274\21B\377\1u\13)\377\227\0\0\0\377\1\0\0\0\265\342\0\0\0\0\1\0" \ + "\0\0\311\226\0\0\0\377\2\12\1\4\377\272\21A\377\350\274\21B\377\1y\13" \ + "*\377\236\0\0\0\377\1^\11!\377\377\274\21B\377\232\274\21B\377\1q\12" \ + "(\377\225\0\0\0\377\1s\12(\377\356\274\21B\377\1\\\10\40\377\227\0\0" \ + "\0\377\1\0\0\0\216\342\0\0\0\0\1\0\0\0\242\227\0\0\0\377\1\226\16""5" \ + "\377\350\274\21B\377\2\272\21A\377\35\3\12\377\235\0\0\0\377\2\30\2\10" \ + "\377\273\21B\377\377\274\21B\377\231\274\21B\377\1+\4\17\377\224\0\0" \ + "\0\377\2\20\1\6\377\266\20@\377\356\274\21B\377\1\77\6\26\377\227\0\0" \ + "\0\377\1\0\0\0g\342\0\0\0\0\1\0\0\0{\227\0\0\0\377\1i\11%\377\351\274" \ + "\21B\377\1u\13)\377\236\0\0\0\377\1\216\15""2\377\377\274\21B\377\230" \ + "\274\21B\377\2\240\16""8\377\1\0\0\377\224\0\0\0\377\1b\11\"\377\357" \ + "\274\21B\377\1\33\2\11\377\227\0\0\0\377\1\0\0\0@\342\0\0\0\0\1\0\0\0" \ + "H\227\0\0\0\377\1<\5\25\377\351\274\21B\377\2\270\21A\377\31\2\11\377" \ + "\235\0\0\0\377\1;\5\25\377\377\274\21B\377\230\274\21B\377\1N\7\33\377" \ + "\224\0\0\0\377\2\11\1\3\377\257\20>\377\356\274\21B\377\2\260\20>\377" \ + "\1\0\0\377\226\0\0\0\377\2\0\0\0\375\0\0\0\15\342\0\0\0\0\1\0\0\0\24" \ + "\227\0\0\0\377\2\17\1\5\377\273\21B\377\351\274\21B\377\1r\12(\377\235" \ + "\0\0\0\377\2\1\0\1\377\243\17""9\377\377\274\21B\377\226\274\21B\377" \ + "\2\261\20>\377\11\1\3\377\224\0\0\0\377\1M\7\33\377\357\274\21B\377\1" \ + "\217\15""2\377\227\0\0\0\377\1\0\0\0\327\344\0\0\0\0\1\0\0\0\336\227" \ + "\0\0\0\377\1\235\16""7\377\351\274\21B\377\2\267\21@\377\20\1\6\377\235" \ + "\0\0\0\377\1W\10\37\377\377\274\21B\377\226\274\21B\377\1k\12&\377\225" \ + "\0\0\0\377\1\235\16""7\377\357\274\21B\377\1f\11$\377\227\0\0\0\377\1" \ + "\0\0\0\243\344\0\0\0\0\1\0\0\0\252\227\0\0\0\377\1c\11#\377\352\274\21" \ + "B\377\1[\10\40\377\235\0\0\0\377\2\10\1\3\377\255\20=\377\377\274\21" \ + "B\377\224\274\21B\377\2\265\20@\377\22\2\6\377\224\0\0\0\377\1,\4\20" \ + "\377\360\274\21B\377\1""9\5\24\377\227\0\0\0\377\1\0\0\0p\344\0\0\0\0" \ + "\1\0\0\0w\227\0\0\0\377\1*\4\17\377\352\274\21B\377\2\247\17:\377\3\0" \ + "\1\377\235\0\0\0\377\1[\10\40\377\377\274\21B\377\224\274\21B\377\1l" \ + "\12&\377\225\0\0\0\377\1t\12)\377\357\274\21B\377\2\273\21B\377\16\1" \ + "\5\377\227\0\0\0\377\1\0\0\0<\344\0\0\0\0\1\0\0\0\77\227\0\0\0\377\2" \ + "\1\0\1\377\252\17<\377\352\274\21B\377\1;\5\25\377\235\0\0\0\377\2\15" \ + "\1\4\377\262\20>\377\377\274\21B\377\222\274\21B\377\2\270\21A\377\30" \ + "\2\10\377\224\0\0\0\377\2\10\1\3\377\262\20>\377\357\274\21B\377\1\237" \ + "\16""8\377\227\0\0\0\377\2\0\0\0\371\0\0\0\12\344\0\0\0\0\2\0\0\0\6\0" \ + "\0\0\364\227\0\0\0\377\1s\12(\377\352\274\21B\377\1\211\14""0\377\236" \ + "\0\0\0\377\1V\10\36\377\377\274\21B\377\222\274\21B\377\1h\11$\377\225" \ + "\0\0\0\377\1H\7\31\377\360\274\21B\377\1i\12%\377\227\0\0\0\377\1\0\0" \ + "\0\300\346\0\0\0\0\1\0\0\0\273\227\0\0\0\377\1:\5\24\377\352\274\21B" \ + "\377\2\273\21B\377\35\3\12\377\235\0\0\0\377\2\4\0\2\377\241\17""9\377" \ + "\377\274\21B\377\220\274\21B\377\2\256\20=\377\14\1\4\377\225\0\0\0\377" \ + "\1\220\15""2\377\360\274\21B\377\1""4\5\22\377\227\0\0\0\377\1\0\0\0" \ + "\177\346\0\0\0\0\1\0\0\0{\227\0\0\0\377\2\10\1\3\377\266\20@\377\352" \ + "\274\21B\377\1f\11$\377\236\0\0\0\377\1\77\6\26\377\377\274\21B\377\220" \ + "\274\21B\377\1R\7\35\377\225\0\0\0\377\1\35\3\12\377\360\274\21B\377" \ + "\2\265\20\77\377\6\1\2\377\227\0\0\0\377\1\0\0\0>\346\0\0\0\0\1\0\0\0" \ + ":\230\0\0\0\377\1\204\14.\377\352\274\21B\377\2\252\17<\377\2\0\1\377" \ + "\235\0\0\0\377\2\1\0\0\377\220\15""2\377\377\274\21B\377\216\274\21B" \ + "\377\2\236\16""7\377\4\0\2\377\225\0\0\0\377\1`\11\"\377\360\274\21B" \ + "\377\1\206\14/\377\227\0\0\0\377\2\0\0\0\365\0\0\0\6\346\0\0\0\0\2\0" \ + "\0\0\6\0\0\0\363\227\0\0\0\377\1<\5\25\377\353\274\21B\377\1""4\5\22" \ + "\377\236\0\0\0\377\2\33\2\12\377\266\20@\377\377\274\21B\377\214\274" \ + "\21B\377\2\273\21A\377(\4\16\377\226\0\0\0\377\1\241\17""8\377\360\274" \ + "\21B\377\1H\6\31\377\227\0\0\0\377\1\0\0\0\274\350\0\0\0\0\1\0\0\0\253" \ + "\227\0\0\0\377\2\4\0\2\377\255\20=\377\352\274\21B\377\1v\13)\377\237" \ + "\0\0\0\377\1^\10!\377\377\274\21B\377\214\274\21B\377\1o\12'\377\226" \ + "\0\0\0\377\1\40\3\13\377\360\274\21B\377\2\270\21@\377\14\1\4\377\227" \ + "\0\0\0\377\1\0\0\0n\350\0\0\0\0\1\0\0\0^\230\0\0\0\377\1k\12&\377\352" \ + "\274\21B\377\2\262\20\77\377\7\1\2\377\236\0\0\0\377\2\7\1\2\377\236" \ + "\16""7\377\377\274\21B\377\212\274\21B\377\2\251\17;\377\15\1\5\377\226" \ + "\0\0\0\377\1[\10\40\377\360\274\21B\377\1\213\15""1\377\230\0\0\0\377" \ + "\1\0\0\0!\350\0\0\0\0\2\0\0\0\22\0\0\0\373\227\0\0\0\377\1%\3\15\377" \ + "\353\274\21B\377\1=\6\25\377\237\0\0\0\377\2#\3\14\377\270\21@\377\377" \ + "\274\21B\377\210\274\21B\377\2\273\21B\3771\4\21\377\227\0\0\0\377\1" \ + "\231\16""6\377\360\274\21B\377\1E\6\30\377\227\0\0\0\377\1\0\0\0\324" \ + "\352\0\0\0\0\1\0\0\0\302\230\0\0\0\377\1\231\16""6\377\352\274\21B\377" \ + "\1\177\13-\377\240\0\0\0\377\1X\10\37\377\377\274\21B\377\210\274\21" \ + "B\377\1k\12&\377\227\0\0\0\377\1\32\2\11\377\360\274\21B\377\2\260\20" \ + ">\377\7\1\2\377\227\0\0\0\377\1\0\0\0\207\352\0\0\0\0\1\0\0\0w\230\0" \ + "\0\0\377\1V\10\36\377\352\274\21B\377\2\265\20@\377\11\1\3\377\237\0" \ + "\0\0\377\2\3\0\1\377\220\15""2\377\377\274\21B\377\206\274\21B\377\2" \ + "\236\16""7\377\10\1\3\377\227\0\0\0\377\1V\10\36\377\360\274\21B\377" \ + "\1p\12'\377\230\0\0\0\377\1\0\0\0<\352\0\0\0\0\2\0\0\0\36\0\0\0\376\227" \ + "\0\0\0\377\2\22\2\6\377\270\21A\377\352\274\21B\377\1""9\5\24\377\240" \ + "\0\0\0\377\2\20\1\6\377\250\17;\377\377\274\21B\377\204\274\21B\377\2" \ + "\260\20>\377\33\2\11\377\230\0\0\0\377\1\221\15""3\377\360\274\21B\377" \ + "\1)\4\16\377\227\0\0\0\377\2\0\0\0\337\0\0\0\1\353\0\0\0\0\1\0\0\0\303" \ + "\230\0\0\0\377\1u\13)\377\352\274\21B\377\1o\12'\377\241\0\0\0\377\2" \ + ")\4\16\377\270\21@\377\377\274\21B\377\202\274\21B\377\2\273\21B\377" \ + "9\5\24\377\230\0\0\0\377\2\15\1\4\377\272\21A\377\357\274\21B\377\1\222" \ + "\15""3\377\230\0\0\0\377\1\0\0\0\210\354\0\0\0\0\1\0\0\0i\230\0\0\0\377" \ + "\2\40\3\13\377\273\21B\377\351\274\21B\377\1\244\17:\377\242\0\0\0\377" \ + "\1T\10\36\377\377\274\21B\377\202\274\21B\377\1e\11#\377\231\0\0\0\377" \ + "\1:\5\24\377\360\274\21B\377\1A\6\27\377\230\0\0\0\377\1\0\0\0-\354\0" \ + "\0\0\0\2\0\0\0\24\0\0\0\372\230\0\0\0\377\1\212\14""0\377\352\274\21" \ + "B\377\1\33\2\12\377\242\0\0\0\377\1l\12&\377\377\274\21B\377\2z\13+\377" \ + "\1\0\0\377\231\0\0\0\377\1j\12%\377\357\274\21B\377\2\247\17;\377\3\0" \ + "\1\377\227\0\0\0\377\1\0\0\0\322\356\0\0\0\0\1\0\0\0\267\230\0\0\0\377" \ + "\1""6\5\23\377\352\274\21B\377\1P\7\34\377\242\0\0\0\377\2\2\0\1\377" \ + "\204\14.\377\375\274\21B\377\2\223\15""4\377\6\1\2\377\232\0\0\0\377" \ + "\1\231\16""6\377\357\274\21B\377\1W\10\37\377\230\0\0\0\377\1\0\0\0z" \ + "\356\0\0\0\0\1\0\0\0Q\230\0\0\0\377\2\1\0\0\377\235\16""7\377\351\274" \ + "\21B\377\1\205\14/\377\243\0\0\0\377\2\15\1\4\377\231\16""6\377\373\274" \ + "\21B\377\2\244\17""9\377\24\2\7\377\232\0\0\0\377\2\21\2\6\377\273\21" \ + "B\377\356\274\21B\377\2\251\17;\377\6\1\2\377\227\0\0\0\377\2\0\0\0\372" \ + "\0\0\0\30\356\0\0\0\0\2\0\0\0\4\0\0\0\344\230\0\0\0\377\1M\7\33\377\351" \ + "\274\21B\377\2\262\20\77\377\2\0\1\377\243\0\0\0\377\2\17\1\5\377\235" \ + "\16""7\377\371\274\21B\377\2\245\17:\377\25\2\7\377\233\0\0\0\377\1\77" \ + "\6\26\377\357\274\21B\377\1S\7\35\377\230\0\0\0\377\1\0\0\0\253\360\0" \ + "\0\0\0\1\0\0\0\200\230\0\0\0\377\2\7\1\3\377\255\20=\377\351\274\21B" \ + "\377\1#\3\14\377\244\0\0\0\377\2\27\2\10\377\247\17:\377\367\274\21B" \ + "\377\2\257\20=\377!\3\14\377\234\0\0\0\377\1n\12'\377\356\274\21B\377" \ + "\2\252\17<\377\10\1\3\377\230\0\0\0\377\1\0\0\0D\360\0\0\0\0\2\0\0\0" \ + "\34\0\0\0\373\230\0\0\0\377\1S\7\35\377\351\274\21B\377\1L\7\33\377\245" \ + "\0\0\0\377\2\25\2\10\377\241\17""8\377\365\274\21B\377\2\251\17;\377" \ + "\35\3\12\377\235\0\0\0\377\1\231\16""6\377\356\274\21B\377\1H\6\31\377" \ + "\230\0\0\0\377\2\0\0\0\331\0\0\0\1\361\0\0\0\0\1\0\0\0\263\230\0\0\0" \ + "\377\2\6\1\2\377\247\17:\377\350\274\21B\377\1t\13)\377\246\0\0\0\377" \ + "\2\21\2\6\377\233\16""6\377\363\274\21B\377\2\247\17:\377\34\3\12\377" \ + "\235\0\0\0\377\2\7\1\2\377\271\21A\377\355\274\21B\377\2\224\15""4\377" \ + "\1\0\0\377\230\0\0\0\377\1\0\0\0v\362\0\0\0\0\1\0\0\0=\231\0\0\0\377" \ + "\1K\7\32\377\350\274\21B\377\1\234\16""7\377\247\0\0\0\377\2\22\2\6\377" \ + "\231\16""6\377\361\274\21B\377\2\244\17""9\377\34\3\12\377\236\0\0\0" \ + "\377\1&\3\15\377\355\274\21B\377\2\273\21B\377.\4\20\377\230\0\0\0\377" \ + "\2\0\0\0\357\0\0\0\16\363\0\0\0\0\1\0\0\0\305\230\0\0\0\377\2\4\0\1\377" \ + "\242\17""9\377\347\274\21B\377\2\273\21A\377\12\1\4\377\247\0\0\0\377" \ + "\2\10\1\3\377\202\14.\377\357\274\21B\377\2\216\15""2\377\15\1\5\377" \ + "\237\0\0\0\377\1L\7\33\377\355\274\21B\377\1p\12'\377\231\0\0\0\377\1" \ + "\0\0\0\212\364\0\0\0\0\1\0\0\0Q\231\0\0\0\377\1E\6\30\377\350\274\21" \ + "B\377\1""1\4\21\377\250\0\0\0\377\2\4\0\1\377t\12)\377\355\274\21B\377" \ + "\2\202\14.\377\7\1\3\377\240\0\0\0\377\1p\12'\377\354\274\21B\377\2\247" \ + "\17:\377\12\1\4\377\230\0\0\0\377\2\0\0\0\371\0\0\0\33\364\0\0\0\0\2" \ + "\0\0\0\2\0\0\0\326\230\0\0\0\377\2\3\0\1\377\237\16""8\377\347\274\21" \ + "B\377\1R\7\35\377\252\0\0\0\377\2K\7\32\377\270\21@\377\351\274\21B\377" \ + "\3\273\21A\377X\10\37\377\1\0\0\377\241\0\0\0\377\1\223\15""4\377\354" \ + "\274\21B\377\1<\5\25\377\231\0\0\0\377\1\0\0\0\236\366\0\0\0\0\1\0\0" \ + "\0f\231\0\0\0\377\1@\6\27\377\347\274\21B\377\1l\12&\377\253\0\0\0\377" \ + "\2,\4\20\377\253\17<\377\347\274\21B\377\2\261\20>\3777\5\23\377\242" \ + "\0\0\0\377\2\4\0\1\377\266\20@\377\353\274\21B\377\1r\12(\377\231\0\0" \ + "\0\377\2\0\0\0\375\0\0\0,\366\0\0\0\0\2\0\0\0\3\0\0\0\330\231\0\0\0\377" \ + "\1{\13+\377\346\274\21B\377\1\210\14""0\377\254\0\0\0\377\2\33\2\11\377" \ + "\226\16""5\377\345\274\21B\377\2\237\16""8\377#\3\14\377\243\0\0\0\377" \ + "\1\34\3\12\377\353\274\21B\377\2\241\17""8\377\11\1\3\377\231\0\0\0\377" \ + "\1\0\0\0\242\370\0\0\0\0\1\0\0\0[\231\0\0\0\377\2\14\1\4\377\244\17:" \ + "\377\345\274\21B\377\1\242\17""9\377\255\0\0\0\377\3\2\0\1\377X\10\37" \ + "\377\270\21A\377\341\274\21B\377\3\273\21A\377d\11#\377\5\0\2\377\244" \ + "\0\0\0\377\1""4\5\22\377\352\274\21B\377\2\265\20@\377\40\3\13\377\231" \ + "\0\0\0\377\2\0\0\0\372\0\0\0#\370\0\0\0\0\2\0\0\0\2\0\0\0\320\231\0\0" \ + "\0\377\2,\4\20\377\271\21A\377\344\274\21B\377\2\271\21A\377\4\0\1\377" \ + "\256\0\0\0\377\2""1\4\21\377\244\17:\377\337\274\21B\377\2\253\17<\377" \ + ";\5\25\377\246\0\0\0\377\1J\7\32\377\352\274\21B\377\1T\10\36\377\232" \ + "\0\0\0\377\1\0\0\0\232\372\0\0\0\0\1\0\0\0V\232\0\0\0\377\1]\10!\377" \ + "\345\274\21B\377\1\33\2\11\377\257\0\0\0\377\3\6\1\2\377^\11!\377\270" \ + "\21A\377\333\274\21B\377\3\273\21A\377k\12&\377\12\1\4\377\247\0\0\0" \ + "\377\1a\11\"\377\351\274\21B\377\1z\13+\377\232\0\0\0\377\2\0\0\0\371" \ + "\0\0\0!\373\0\0\0\0\1\0\0\0\301\231\0\0\0\377\2\3\0\1\377\215\15""1\377" \ + "\344\274\21B\377\1""3\5\22\377\261\0\0\0\377\2+\4\17\377\234\16""7\377" \ + "\331\274\21B\377\2\243\17""9\3774\5\22\377\251\0\0\0\377\1w\13*\377\350" \ + "\274\21B\377\2\237\16""8\377\12\1\3\377\232\0\0\0\377\1\0\0\0\210\374" \ + "\0\0\0\0\2\0\0\0""1\0\0\0\375\231\0\0\0\377\2\15\1\5\377\244\17""9\377" \ + "\343\274\21B\377\1B\6\27\377\262\0\0\0\377\3\1\0\1\377E\6\30\377\256" \ + "\20=\377\325\274\21B\377\3\262\20\77\377R\7\35\377\4\0\1\377\252\0\0" \ + "\0\377\1\216\15""2\377\347\274\21B\377\2\265\20@\377\"\3\14\377\232\0" \ + "\0\0\377\2\0\0\0\346\0\0\0\15\375\0\0\0\0\1\0\0\0\237\232\0\0\0\377\2" \ + "#\3\14\377\265\20@\377\342\274\21B\377\1N\7\33\377\264\0\0\0\377\3\24" \ + "\2\7\377z\13+\377\273\21A\377\322\274\21B\377\2\202\14.\377\33\2\11\377" \ + "\254\0\0\0\377\1\243\17""9\377\347\274\21B\377\1R\7\35\377\233\0\0\0" \ + "\377\1\0\0\0b\376\0\0\0\0\2\0\0\0\27\0\0\0\361\232\0\0\0\377\1N\7\33" \ + "\377\342\274\21B\377\1Z\10\40\377\266\0\0\0\377\3\35\3\12\377}\13,\377" \ + "\273\21B\377\316\274\21B\377\2}\13,\377\40\3\13\377\256\0\0\0\377\1\265" \ + "\20\77\377\346\274\21B\377\1v\13)\377\233\0\0\0\377\2\0\0\0\312\0\0\0" \ + "\2\377\0\0\0\0\1\0\0\0z\233\0\0\0\377\1j\12%\377\341\274\21B\377\1f\11" \ + "$\377\270\0\0\0\377\2,\4\20\377\210\14""0\377\313\274\21B\377\2\221\15" \ + "3\3775\5\23\377\257\0\0\0\377\2\1\0\0\377\273\21B\377\345\274\21B\377" \ + "\2\216\15""2\377\4\0\1\377\232\0\0\0\377\2\0\0\0\376\0\0\0>\377\0\0\0" \ + "\0\3\0\0\0\0\0\0\0\4\0\0\0\317\232\0\0\0\377\2\1\0\1\377\202\14.\377" \ + "\340\274\21B\377\1r\12(\377\272\0\0\0\377\3\40\3\13\377w\13*\377\271" \ + "\21A\377\305\274\21B\377\3\272\21A\377w\13*\377#\3\14\377\261\0\0\0\377" \ + "\1\7\1\3\377\345\274\21B\377\2\244\17""9\377\16\1\5\377\233\0\0\0\377" \ + "\1\0\0\0\230\377\0\0\0\0\203\0\0\0\0\2\0\0\0""6\0\0\0\375\232\0\0\0\377" \ + "\2\12\1\4\377\234\16""7\377\337\274\21B\377\1}\13,\377\274\0\0\0\377" \ + "\3\32\2\11\377e\11#\377\255\20=\377\301\274\21B\377\3\261\20>\377l\12" \ + "&\377\40\3\13\377\263\0\0\0\377\1\17\1\5\377\344\274\21B\377\2\265\20" \ + "@\377)\4\16\377\233\0\0\0\377\2\0\0\0\345\0\0\0\17\377\0\0\0\0\204\0" \ + "\0\0\0\1\0\0\0\227\233\0\0\0\377\2\27\2\10\377\252\17<\377\336\274\21" \ + "B\377\1\200\14-\377\276\0\0\0\377\4\5\0\2\377B\6\27\377\210\14""0\377" \ + "\272\21A\377\273\274\21B\377\4\273\21B\377\220\15""2\377I\7\32\377\10" \ + "\1\3\377\265\0\0\0\377\1\27\2\10\377\343\274\21B\377\2\271\21A\3777\5" \ + "\23\377\234\0\0\0\377\1\0\0\0Z\377\0\0\0\0\205\0\0\0\0\2\0\0\0\22\0\0" \ + "\0\346\233\0\0\0\377\2\33\2\12\377\253\17<\377\335\274\21B\377\1z\13" \ + "+\377\301\0\0\0\377\3\23\2\7\377T\10\36\377\230\16""5\377\267\274\21" \ + "B\377\3\236\16""7\377[\10\40\377\30\2\10\377\270\0\0\0\377\1\36\3\13" \ + "\377\343\274\21B\377\1I\7\32\377\234\0\0\0\377\2\0\0\0\273\0\0\0\1\377" \ + "\0\0\0\0\206\0\0\0\0\2\0\0\0D\0\0\0\376\233\0\0\0\377\2'\4\16\377\262" \ + "\20\77\377\334\274\21B\377\1u\13)\377\304\0\0\0\377\4\17\1\5\377E\6\30" \ + "\377\204\14.\377\270\21@\377\257\274\21B\377\4\271\21A\377\212\14""0" \ + "\377R\7\35\377\27\2\10\377\273\0\0\0\377\1%\3\15\377\342\274\21B\377" \ + "\1e\11#\377\234\0\0\0\377\2\0\0\0\355\0\0\0\32\377\0\0\0\0\210\0\0\0" \ + "\0\1\0\0\0\227\234\0\0\0\377\2""0\4\21\377\266\20@\377\333\274\21B\377" \ + "\1p\12'\377\307\0\0\0\377\4\17\1\5\377\77\6\26\377o\12'\377\240\16""8" \ + "\377\251\274\21B\377\4\244\17:\377t\12)\377C\6\30\377\22\2\6\377\276" \ + "\0\0\0\377\1#\3\14\377\341\274\21B\377\2w\13*\377\1\0\0\377\234\0\0\0" \ + "\377\1\0\0\0Z\377\0\0\0\0\211\0\0\0\0\2\0\0\0\13\0\0\0\332\234\0\0\0" \ + "\377\2\77\6\26\377\271\21A\377\332\274\21B\377\1l\12&\377\313\0\0\0\377" \ + "\5\22\2\6\377<\5\25\377f\11$\377\217\15""2\377\263\20\77\377\237\274" \ + "\21B\377\5\266\20@\377\222\15""3\377i\12%\377@\6\27\377\26\2\10\377\302" \ + "\0\0\0\377\1\35\3\12\377\340\274\21B\377\2x\13*\377\1\0\1\377\234\0\0" \ + "\0\377\1\0\0\0\252\377\0\0\0\0\213\0\0\0\0\2\0\0\0>\0\0\0\374\234\0\0" \ + "\0\377\2A\6\27\377\272\21A\377\331\274\21B\377\1f\11$\377\317\0\0\0\377" \ + "\10\1\0\0\377\30\2\10\3777\5\23\377V\10\36\377r\12(\377\207\14/\377\235" \ + "\16""7\377\263\20\77\377\221\274\21B\377\10\265\20@\377\237\16""8\377" \ + "\212\14""0\377t\13)\377Y\10\37\377:\5\24\377\33\2\11\377\2\0\1\377\306" \ + "\0\0\0\377\1\30\2\10\377\337\274\21B\377\2\204\14.\377\4\0\2\377\234" \ + "\0\0\0\377\2\0\0\0\347\0\0\0\27\377\0\0\0\0\214\0\0\0\0\1\0\0\0v\235" \ + "\0\0\0\377\2<\5\25\377\270\21A\377\330\274\21B\377\1X\10\37\377\327\0" \ + "\0\0\377\7\12\1\3\377\26\2\10\377\"\3\14\377.\4\20\377:\5\24\377\77\6" \ + "\26\377E\6\30\377\203K\7\32\377\7G\6\31\377\77\6\26\377<\5\25\377/\4" \ + "\21\377#\3\14\377\27\2\10\377\13\1\4\377\316\0\0\0\377\1\14\1\4\377\336" \ + "\274\21B\377\2\203\14.\377\4\0\1\377\234\0\0\0\377\2\0\0\0\373\0\0\0" \ + "=\377\0\0\0\0\215\0\0\0\0\2\0\0\0\1\0\0\0\261\235\0\0\0\377\2B\6\27\377" \ + "\270\21A\377\327\274\21B\377\1E\6\30\377\377\0\0\0\377\267\0\0\0\377" \ + "\2\1\0\0\377\270\21A\377\334\274\21B\377\2\210\14""0\377\7\1\3\377\235" \ + "\0\0\0\377\1\0\0\0|\377\0\0\0\0\217\0\0\0\0\2\0\0\0\27\0\0\0\347\235" \ + "\0\0\0\377\2""5\5\23\377\264\20\77\377\326\274\21B\377\1""1\4\21\377" \ + "\377\0\0\0\377\270\0\0\0\377\1\251\17;\377\333\274\21B\377\2\200\14-" \ + "\377\5\0\2\377\235\0\0\0\377\2\0\0\0\300\0\0\0\3\377\0\0\0\0\220\0\0" \ + "\0\0\2\0\0\0""8\0\0\0\370\235\0\0\0\377\2%\3\15\377\254\20<\377\325\274" \ + "\21B\377\1\25\2\7\377\377\0\0\0\377\270\0\0\0\377\1\223\15""4\377\332" \ + "\274\21B\377\2r\12(\377\1\0\1\377\235\0\0\0\377\2\0\0\0\336\0\0\0\23" \ + "\377\0\0\0\0\222\0\0\0\0\1\0\0\0h\236\0\0\0\377\2\36\3\13\377\244\17" \ + "9\377\323\274\21B\377\2\263\20\77\377\1\0\0\377\377\0\0\0\377\270\0\0" \ + "\0\377\1z\13+\377\331\274\21B\377\2l\12&\377\1\0\1\377\235\0\0\0\377" \ + "\2\0\0\0\366\0\0\0""0\377\0\0\0\0\224\0\0\0\0\1\0\0\0\234\236\0\0\0\377" \ + "\2\20\1\6\377\221\15""3\377\322\274\21B\377\1\223\15""4\377\377\0\0\0" \ + "\377\271\0\0\0\377\1a\11\"\377\327\274\21B\377\2\273\21B\377W\10\37\377" \ + "\237\0\0\0\377\1\0\0\0]\377\0\0\0\0\225\0\0\0\0\2\0\0\0\12\0\0\0\315" \ + "\236\0\0\0\377\2\3\0\1\377n\12'\377\321\274\21B\377\1h\11$\377\377\0" \ + "\0\0\377\271\0\0\0\377\1=\6\25\377\326\274\21B\377\2\265\20@\377;\5\25" \ + "\377\237\0\0\0\377\1\0\0\0\232\377\0\0\0\0\227\0\0\0\0\2\0\0\0\24\0\0" \ + "\0\332\236\0\0\0\377\3\1\0\0\377X\10\37\377\272\21A\377\317\274\21B\377" \ + "\1\77\6\26\377\377\0\0\0\377\271\0\0\0\377\1\27\2\10\377\325\274\21B" \ + "\377\2\257\20>\3771\4\21\377\237\0\0\0\377\2\0\0\0\257\0\0\0\3\377\0" \ + "\0\0\0\230\0\0\0\0\2\0\0\0#\0\0\0\351\237\0\0\0\377\2""0\4\21\377\254" \ + "\20<\377\315\274\21B\377\2\272\21A\377\17\1\5\377\377\0\0\0\377\272\0" \ + "\0\0\377\1\252\17<\377\323\274\21B\377\2\236\16""7\377\33\2\12\377\237" \ + "\0\0\0\377\2\0\0\0\307\0\0\0\11\377\0\0\0\0\232\0\0\0\0\2\0\0\0@\0\0" \ + "\0\370\237\0\0\0\377\2\24\2\7\377\221\15""3\377\314\274\21B\377\1\221" \ + "\15""3\377\377\0\0\0\377\273\0\0\0\377\1w\13*\377\322\274\21B\377\2\177" \ + "\13-\377\10\1\3\377\237\0\0\0\377\2\0\0\0\342\0\0\0\33\377\0\0\0\0\234" \ + "\0\0\0\0\2\0\0\0M\0\0\0\373\237\0\0\0\377\3\3\0\1\377a\11\"\377\272\21" \ + "A\377\312\274\21B\377\1V\10\36\377\377\0\0\0\377\273\0\0\0\377\1E\6\30" \ + "\377\320\274\21B\377\3\273\21A\377c\11#\377\2\0\1\377\237\0\0\0\377\2" \ + "\0\0\0\350\0\0\0#\377\0\0\0\0\236\0\0\0\0\1\0\0\0e\241\0\0\0\377\2'\4" \ + "\16\377\241\17""8\377\310\274\21B\377\2\267\21@\377\16\1\5\377\377\0" \ + "\0\0\377\273\0\0\0\377\2\20\1\6\377\271\21A\377\316\274\21B\377\2\252" \ + "\17<\3772\5\22\377\240\0\0\0\377\2\0\0\0\362\0\0\0""4\377\0\0\0\0\240" \ + "\0\0\0\0\1\0\0\0}\241\0\0\0\377\3\14\1\4\377t\12)\377\273\21B\377\306" \ + "\274\21B\377\1}\13,\377\377\0\0\0\377\275\0\0\0\377\1\202\14.\377\315" \ + "\274\21B\377\2{\13+\377\13\1\4\377\240\0\0\0\377\2\0\0\0\370\0\0\0B\377" \ + "\0\0\0\0\241\0\0\0\0\2\0\0\0\1\0\0\0\222\242\0\0\0\377\2+\4\17\377\237" \ + "\16""8\377\304\274\21B\377\2\273\21B\377#\3\14\377\377\0\0\0\377\275" \ + "\0\0\0\377\1\77\6\26\377\313\274\21B\377\3\264\20\77\377N\7\33\377\1" \ + "\0\0\377\240\0\0\0\377\2\0\0\0\374\0\0\0Y\377\0\0\0\0\244\0\0\0\0\1\0" \ + "\0\0\204\242\0\0\0\377\3\11\1\3\377h\11$\377\270\21A\377\302\274\21B" \ + "\377\1\211\14""0\377\377\0\0\0\377\276\0\0\0\377\2\2\0\1\377\241\17""8" \ + "\377\311\274\21B\377\2\213\15""1\377\26\2\10\377\241\0\0\0\377\2\0\0" \ + "\0\372\0\0\0R\377\0\0\0\0\246\0\0\0\0\1\0\0\0\204\243\0\0\0\377\2\32" \ + "\2\11\377\204\14.\377\300\274\21B\377\2\270\21A\377\40\3\13\377\377\0" \ + "\0\0\377\277\0\0\0\377\1M\7\33\377\307\274\21B\377\3\265\20\77\377W\10" \ + "\37\377\2\0\1\377\241\0\0\0\377\2\0\0\0\372\0\0\0R\377\0\0\0\0\247\0" \ + "\0\0\0\2\0\0\0\1\0\0\0\210\244\0\0\0\377\2>\6\26\377\241\17""8\377\276" \ + "\274\21B\377\1j\12%\377\377\0\0\0\377\300\0\0\0\377\2\5\0\2\377\241\17" \ + "8\377\305\274\21B\377\2\204\14.\377\30\2\11\377\242\0\0\0\377\2\0\0\0" \ + "\370\0\0\0U\377\0\0\0\0\252\0\0\0\0\2\0\0\0i\0\0\0\375\243\0\0\0\377" \ + "\3\1\0\1\377\77\6\26\377\242\17""9\377\273\274\21B\377\2\231\16""6\377" \ + "\6\1\2\377\377\0\0\0\377\301\0\0\0\377\1""6\5\23\377\303\274\21B\377" \ + "\2\244\17:\377:\5\24\377\243\0\0\0\377\2\0\0\0\360\0\0\0>\377\0\0\0\0" \ + "\254\0\0\0\0\2\0\0\0Q\0\0\0\367\244\0\0\0\377\3\7\1\3\377U\10\36\377" \ + "\253\17<\377\270\274\21B\377\2\265\20\77\377\40\3\13\377\377\0\0\0\377" \ + "\303\0\0\0\377\1y\13*\377\300\274\21B\377\3\260\20>\377W\10\37\377\6" \ + "\1\2\377\243\0\0\0\377\2\0\0\0\344\0\0\0+\377\0\0\0\0\256\0\0\0\0\2\0" \ + "\0\0B\0\0\0\362\245\0\0\0\377\3\7\1\3\377S\10\35\377\252\17<\377\265" \ + "\274\21B\377\2\270\21@\3776\5\23\377\377\0\0\0\377\304\0\0\0\377\2\11" \ + "\1\3\377\240\16""8\377\275\274\21B\377\3\267\21@\377l\12&\377\17\1\5" \ + "\377\244\0\0\0\377\2\0\0\0\332\0\0\0!\377\0\0\0\0\260\0\0\0\0\2\0\0\0" \ + "5\0\0\0\353\246\0\0\0\377\3\4\0\2\377E\6\30\377\227\16""5\377\262\274" \ + "\21B\377\2\267\21@\377=\6\25\377\377\0\0\0\377\306\0\0\0\377\2\35\3\12" \ + "\377\255\20=\377\272\274\21B\377\3\265\20\77\377j\12%\377\24\2\7\377" \ + "\245\0\0\0\377\2\0\0\0\317\0\0\0\27\377\0\0\0\0\262\0\0\0\0\2\0\0\0/" \ + "\0\0\0\345\250\0\0\0\377\3-\4\20\377w\13*\377\265\20\77\377\256\274\21" \ + "B\377\2\255\20=\377+\4\17\377\377\0\0\0\377\310\0\0\0\377\2$\3\15\377" \ + "\257\20>\377\267\274\21B\377\3\257\20>\377c\11#\377\20\1\6\377\246\0" \ + "\0\0\377\2\0\0\0\306\0\0\0\23\377\0\0\0\0\264\0\0\0\0\2\0\0\0\23\0\0" \ + "\0\275\251\0\0\0\377\4\12\1\4\377J\7\32\377\214\15""1\377\272\21A\377" \ + "\251\274\21B\377\3\264\20\77\377d\11#\377\16\1\5\377\377\0\0\0\377\312" \ + "\0\0\0\377\2\21\2\6\377\203\14.\377\264\274\21B\377\3\234\16""7\377E" \ + "\6\30\377\4\0\2\377\247\0\0\0\377\2\0\0\0\210\0\0\0\4\377\0\0\0\0\266" \ + "\0\0\0\0\2\0\0\0\4\0\0\0\221\253\0\0\0\377\4\17\1\5\377J\7\32\377\204" \ + "\14.\377\263\20\77\377\244\274\21B\377\3\257\20=\377a\11\"\377\17\1\5" \ + "\377\377\0\0\0\377\315\0\0\0\377\3\1\0\1\377I\7\32\377\255\20=\377\257" \ + "\274\21B\377\4\266\20@\377}\13,\3776\5\23\377\1\0\1\377\247\0\0\0\377" \ + "\2\0\0\0\371\0\0\0f\377\0\0\0\0\272\0\0\0\0\2\0\0\0f\0\0\0\371\254\0" \ + "\0\0\377\5\1\0\1\377&\3\15\377X\10\37\377\212\14""0\377\267\21@\377\235" \ + "\274\21B\377\4\253\17<\377k\12&\377,\4\20\377\1\0\1\377\333\0\0\0\377" \ + "\15\3\0\1\377\22\2\6\377#\3\14\3775\5\23\377E\6\30\377T\10\36\377d\11" \ + "#\377o\12'\377z\13+\377\205\14/\377\221\15""3\377\234\16""7\377\247\17" \ + ";\377\217\257\20>\377\1\247\17;\377\202\243\17""9\377\12\236\16""7\377" \ + "\221\15""3\377\203\14.\377u\13)\377h\11$\377[\10\40\377M\7\33\377<\5" \ + "\25\377%\3\15\377\16\1\5\377\314\0\0\0\377\3\15\1\4\377c\11#\377\264" \ + "\20\77\377\252\274\21B\377\4\273\21A\377\217\15""2\377M\7\33\377\15\1" \ + "\4\377\251\0\0\0\377\2\0\0\0\347\0\0\0;\377\0\0\0\0\274\0\0\0\0\2\0\0" \ + "\0;\0\0\0\350\257\0\0\0\377\5\14\1\4\377;\5\25\377a\11\"\377\203\14." \ + "\377\245\17:\377\225\274\21B\377\5\265\20\77\377\216\15""2\377d\11#\377" \ + "8\5\24\377\6\1\2\377\327\0\0\0\377\7\15\1\4\377(\4\16\377C\6\30\377^" \ + "\11!\377z\13+\377\225\15""4\377\255\20=\377\251\274\21B\377\10\263\20" \ + "\77\377\234\16""7\377\205\14/\377n\12'\377S\7\35\3775\5\23\377\30\2\11" \ + "\377\1\0\1\377\306\0\0\0\377\3\20\1\6\377[\10\40\377\244\17""9\377\245" \ + "\274\21B\377\4\271\21A\377\217\15""2\377S\10\35\377\25\2\7\377\253\0" \ + "\0\0\377\2\0\0\0\312\0\0\0\33\377\0\0\0\0\276\0\0\0\0\2\0\0\0#\0\0\0" \ + "\317\263\0\0\0\377\10\14\1\4\377.\4\20\377P\7\34\377g\11$\377v\13)\377" \ + "\204\14.\377\223\15""4\377\241\17""8\377\206\257\20>\377\10\252\17<\377" \ + "\226\16""5\377\203\14.\377o\12'\377]\10!\377I\7\32\377%\3\15\377\3\0" \ + "\1\377\325\0\0\0\377\6\14\1\4\377,\4\20\377L\7\33\377n\12'\377\216\15" \ + "2\377\256\20=\377\267\274\21B\377\6\266\20@\377\232\16""6\377}\13,\377" \ + "^\11!\377;\5\25\377\30\2\10\377\303\0\0\0\377\4\1\0\1\377.\4\20\377o" \ + "\12'\377\254\20<\377\237\274\21B\377\4\242\17""9\377u\13)\377@\6\27\377" \ + "\15\1\4\377\255\0\0\0\377\2\0\0\0\253\0\0\0\15\377\0\0\0\0\300\0\0\0" \ + "\0\3\0\0\0\4\0\0\0\200\0\0\0\375\377\0\0\0\377\230\0\0\0\377\5\12\1\3" \ + "\3772\5\22\377]\10!\377\205\14/\377\247\17:\377\303\274\21B\377\5\257" \ + "\20>\377\214\15""1\377i\11%\377D\6\30\377\30\2\10\377\301\0\0\0\377\6" \ + "\1\0\1\377$\3\15\377V\10\36\377\200\14-\377\243\17""9\377\273\21B\377" \ + "\225\274\21B\377\5\261\20>\377\214\15""1\377f\11$\377\77\6\26\377\22" \ + "\2\6\377\257\0\0\0\377\2\0\0\0\357\0\0\0U\377\0\0\0\0\304\0\0\0\0\2\0" \ + "\0\0A\0\0\0\344\377\0\0\0\377\223\0\0\0\377\5\32\2\11\377E\6\30\377o" \ + "\12'\377\232\16""6\377\272\21A\377\314\274\21B\377\5\247\17;\377z\13" \ + "+\377M\7\33\377\40\3\13\377\1\0\0\377\301\0\0\0\377\11\13\1\4\377-\4" \ + "\20\377P\7\34\377n\12'\377~\13,\377\216\15""2\377\234\16""7\377\253\17" \ + "<\377\271\21A\377\204\274\21B\377\12\270\21@\377\257\20>\377\244\17""9" \ + "\377\220\15""2\377}\13,\377h\11$\377M\7\33\3773\5\22\377\30\2\11\377" \ + "\1\0\0\377\262\0\0\0\377\2\0\0\0\305\0\0\0\40\377\0\0\0\0\306\0\0\0\0" \ + "\2\0\0\0\24\0\0\0\262\377\0\0\0\377\216\0\0\0\377\4\22\2\6\377C\6\30" \ + "\377t\12)\377\245\17:\377\325\274\21B\377\4\255\20=\377y\13*\377@\6\27" \ + "\377\14\1\4\377\377\0\0\0\377\206\0\0\0\377\3\0\0\0\375\0\0\0\200\0\0" \ + "\0\4\377\0\0\0\0\310\0\0\0\0\3\0\0\0\2\0\0\0w\0\0\0\370\377\0\0\0\377" \ + "\210\0\0\0\377\4\4\0\2\3775\5\23\377k\12&\377\234\16""7\377\334\274\21" \ + "B\377\4\271\21A\377\215\15""1\377V\10\36\377\34\3\12\377\377\0\0\0\377" \ + "\202\0\0\0\377\2\0\0\0\350\0\0\0L\377\0\0\0\0\314\0\0\0\0\2\0\0\0\"\0" \ + "\0\0\272\377\0\0\0\377\204\0\0\0\377\4\21\2\6\377K\7\32\377\204\14.\377" \ + "\266\20@\377\343\274\21B\377\3\244\17:\377d\11#\377\36\3\13\377\374\0" \ + "\0\0\377\3\0\0\0\375\0\0\0\221\0\0\0\16\377\0\0\0\0\317\0\0\0\0\2\0\0" \ + "\0U\0\0\0\354\376\0\0\0\377\4\13\1\4\377H\6\31\377\205\14/\377\267\21" \ + "@\377\350\274\21B\377\4\273\21B\377\223\15""4\377S\7\35\377\17\1\5\377" \ + "\370\0\0\0\377\2\0\0\0\326\0\0\0;\377\0\0\0\0\322\0\0\0\0\2\0\0\0\27" \ + "\0\0\0\242\372\0\0\0\377\4\11\1\3\377E\6\30\377\212\14""0\377\272\21" \ + "A\377\356\274\21B\377\3\270\21A\377}\13,\3772\5\22\377\364\0\0\0\377" \ + "\3\0\0\0\371\0\0\0\200\0\0\0\10\377\0\0\0\0\325\0\0\0\0\2\0\0\0T\0\0" \ + "\0\336\366\0\0\0\377\3)\4\16\377p\12'\377\257\20=\377\364\274\21B\377" \ + "\3\217\15""2\377\77\6\26\377\2\0\1\377\360\0\0\0\377\2\0\0\0\303\0\0" \ + "\0""4\377\0\0\0\0\330\0\0\0\0\3\0\0\0\5\0\0\0f\0\0\0\352\361\0\0\0\377" \ + "\3\7\1\2\377K\7\32\377\231\16""6\377\371\274\21B\377\3\246\17:\377R\7" \ + "\35\377\6\1\2\377\354\0\0\0\377\2\0\0\0\323\0\0\0D\377\0\0\0\0\334\0" \ + "\0\0\0\3\0\0\0\21\0\0\0\210\0\0\0\370\355\0\0\0\377\3\24\2\7\377d\11" \ + "#\377\254\20<\377\375\274\21B\377\3\247\17:\377R\7\35\377\6\1\2\377\350" \ + "\0\0\0\377\3\0\0\0\351\0\0\0f\0\0\0\4\377\0\0\0\0\337\0\0\0\0\3\0\0\0" \ + ")\0\0\0\243\0\0\0\373\351\0\0\0\377\3\14\1\4\377b\11\"\377\264\20\77" \ + "\377\377\274\21B\377\202\274\21B\377\2\234\16""7\377)\4\16\377\345\0" \ + "\0\0\377\3\0\0\0\361\0\0\0\206\0\0\0\24\377\0\0\0\0\343\0\0\0\0\3\0\0" \ + "\0\35\0\0\0\221\0\0\0\366\345\0\0\0\377\3\12\1\4\377d\11#\377\263\20" \ + "\77\377\377\274\21B\377\205\274\21B\377\3\273\21B\377w\13*\377\15\1\5" \ + "\377\341\0\0\0\377\3\0\0\0\345\0\0\0o\0\0\0\14\377\0\0\0\0\347\0\0\0" \ + "\0\3\0\0\0\36\0\0\0\212\0\0\0\354\341\0\0\0\377\3\1\0\0\377H\7\31\377" \ + "\247\17;\377\377\274\21B\377\211\274\21B\377\2\244\17:\377,\4\20\377" \ + "\336\0\0\0\377\3\0\0\0\332\0\0\0q\0\0\0\15\377\0\0\0\0\353\0\0\0\0\3" \ + "\0\0\0\10\0\0\0_\0\0\0\307\336\0\0\0\377\2$\3\15\377\230\16""5\377\377" \ + "\274\21B\377\214\274\21B\377\2\272\21A\377X\10\37\377\332\0\0\0\377\4" \ + "\0\0\0\373\0\0\0\260\0\0\0F\0\0\0\1\377\0\0\0\0\360\0\0\0\0\3\0\0\0\37" \ + "\0\0\0l\0\0\0\273\331\0\0\0\377\3\4\0\2\377d\11#\377\270\21A\377\377" \ + "\274\21B\377\217\274\21B\377\2y\13*\377\7\1\2\377\325\0\0\0\377\4\0\0" \ + "\0\367\0\0\0\251\0\0\0[\0\0\0\21\377\0\0\0\0\366\0\0\0\0\2\0\0\0D\0\0" \ + "\0\350\326\0\0\0\377\2\30\2\11\377\225\15""4\377\377\274\21B\377\222" \ + "\274\21B\377\2\200\14-\377\3\0\1\377\323\0\0\0\377\2\0\0\0\321\0\0\0" \ + "(\377\0\0\0\0\372\0\0\0\0\2\0\0\0\34\0\0\0\303\324\0\0\0\377\2""1\4\21" \ + "\377\256\20=\377\377\274\21B\377\224\274\21B\377\1r\12(\377\322\0\0\0" \ + "\377\2\0\0\0\221\0\0\0\10\377\0\0\0\0\374\0\0\0\0\3\0\0\0\4\0\0\0\200" \ + "\0\0\0\375\321\0\0\0\377\2C\6\30\377\270\21A\377\377\274\21B\377\226" \ + "\274\21B\377\1G\6\31\377\317\0\0\0\377\2\0\0\0\363\0\0\0\\\377\0\0\0" \ + "\0\377\0\0\0\0\3\0\0\0\0\0\0\0C\0\0\0\347\317\0\0\0\377\2J\7\32\377\273" \ + "\21A\377\377\274\21B\377\227\274\21B\377\2\260\20>\377\20\1\6\377\315" \ + "\0\0\0\377\2\0\0\0\320\0\0\0'\377\0\0\0\0\377\0\0\0\0\203\0\0\0\0\2\0" \ + "\0\0\27\0\0\0\273\315\0\0\0\377\2<\5\25\377\272\21A\377\377\274\21B\377" \ + "\231\274\21B\377\1k\12&\377\314\0\0\0\377\2\0\0\0\221\0\0\0\10\377\0" \ + "\0\0\0\377\0\0\0\0\205\0\0\0\0\3\0\0\0\5\0\0\0\215\0\0\0\376\312\0\0" \ + "\0\377\2\36\3\13\377\264\20\77\377\377\274\21B\377\232\274\21B\377\2" \ + "\263\20\77\377\11\1\3\377\311\0\0\0\377\2\0\0\0\364\0\0\0a\377\0\0\0" \ + "\0\377\0\0\0\0\211\0\0\0\0\2\0\0\0@\0\0\0\343\310\0\0\0\377\2\4\0\1\377" \ + "\232\16""6\377\377\274\21B\377\234\274\21B\377\1""6\5\23\377\310\0\0" \ + "\0\377\2\0\0\0\303\0\0\0\37\377\0\0\0\0\377\0\0\0\0\213\0\0\0\0\2\0\0" \ + "\0\17\0\0\0\247\307\0\0\0\377\1S\7\35\377\377\274\21B\377\235\274\21" \ + "B\377\1X\10\37\377\306\0\0\0\377\3\0\0\0\374\0\0\0\200\0\0\0\4\377\0" \ + "\0\0\0\377\0\0\0\0\216\0\0\0\0\2\0\0\0^\0\0\0\364\304\0\0\0\377\2\4\0" \ + "\1\377\252\17<\377\377\274\21B\377\235\274\21B\377\1f\11$\377\305\0\0" \ + "\0\377\2\0\0\0\336\0\0\0""8\377\0\0\0\0\377\0\0\0\0\221\0\0\0\0\2\0\0" \ + "\0(\0\0\0\316\303\0\0\0\377\1:\5\24\377\377\274\21B\377\236\274\21B\377" \ + "\1a\11\"\377\304\0\0\0\377\2\0\0\0\246\0\0\0\17\377\0\0\0\0\377\0\0\0" \ + "\0\223\0\0\0\0\3\0\0\0\5\0\0\0\200\0\0\0\375\301\0\0\0\377\1k\12&\377" \ + "\377\274\21B\377\236\274\21B\377\1L\7\33\377\302\0\0\0\377\2\0\0\0\363" \ + "\0\0\0^\377\0\0\0\0\377\0\0\0\0\227\0\0\0\0\2\0\0\0O\0\0\0\350\300\0" \ + "\0\0\377\1\213\15""1\377\377\274\21B\377\236\274\21B\377\1'\4\16\377" \ + "\301\0\0\0\377\2\0\0\0\317\0\0\0-\377\0\0\0\0\377\0\0\0\0\231\0\0\0\0" \ + "\2\0\0\0\17\0\0\0\231\277\0\0\0\377\1\225\15""4\377\377\274\21B\377\235" \ + "\274\21B\377\2\253\17<\377\1\0\1\377\277\0\0\0\377\3\0\0\0\370\0\0\0" \ + "w\0\0\0\3\377\0\0\0\0\377\0\0\0\0\234\0\0\0\0\2\0\0\0H\0\0\0\343\275" \ + "\0\0\0\377\1\222\15""3\377\377\274\21B\377\235\274\21B\377\1m\12&\377" \ + "\277\0\0\0\377\2\0\0\0\312\0\0\0*\377\0\0\0\0\377\0\0\0\0\237\0\0\0\0" \ + "\2\0\0\0\17\0\0\0\231\274\0\0\0\377\1z\13+\377\377\274\21B\377\235\274" \ + "\21B\377\1!\3\14\377\275\0\0\0\377\3\0\0\0\370\0\0\0w\0\0\0\4\377\0\0" \ + "\0\0\377\0\0\0\0\242\0\0\0\0\2\0\0\0J\0\0\0\344\272\0\0\0\377\1J\7\32" \ + "\377\377\274\21B\377\234\274\21B\377\1\204\14.\377\275\0\0\0\377\2\0" \ + "\0\0\313\0\0\0+\377\0\0\0\0\377\0\0\0\0\245\0\0\0\0\2\0\0\0\30\0\0\0" \ + "\257\271\0\0\0\377\2\15\1\4\377\266\20@\377\377\274\21B\377\232\274\21" \ + "B\377\2\270\21A\377\35\3\12\377\273\0\0\0\377\3\0\0\0\374\0\0\0\210\0" \ + "\0\0\7\377\0\0\0\0\377\0\0\0\0\250\0\0\0\0\2\0\0\0J\0\0\0\336\270\0\0" \ + "\0\377\1l\12&\377\377\274\21B\377\232\274\21B\377\1i\11%\377\273\0\0" \ + "\0\377\2\0\0\0\274\0\0\0&\377\0\0\0\0\377\0\0\0\0\253\0\0\0\0\3\0\0\0" \ + "\11\0\0\0\200\0\0\0\371\266\0\0\0\377\2\26\2\10\377\264\20\77\377\377" \ + "\274\21B\377\230\274\21B\377\2\257\20>\377\17\1\5\377\271\0\0\0\377\3" \ + "\0\0\0\352\0\0\0^\0\0\0\1\377\0\0\0\0\377\0\0\0\0\256\0\0\0\0\2\0\0\0" \ + "&\0\0\0\275\266\0\0\0\377\1S\7\35\377\377\274\21B\377\230\274\21B\377" \ + "\1<\5\25\377\270\0\0\0\377\3\0\0\0\376\0\0\0\231\0\0\0\22\377\0\0\0\0" \ + "\377\0\0\0\0\261\0\0\0\0\3\0\0\0\1\0\0\0^\0\0\0\353\264\0\0\0\377\2\2" \ + "\0\1\377\227\16""5\377\377\274\21B\377\226\274\21B\377\1r\12(\377\270" \ + "\0\0\0\377\2\0\0\0\325\0\0\0>\377\0\0\0\0\377\0\0\0\0\265\0\0\0\0\3\0" \ + "\0\0\22\0\0\0\231\0\0\0\376\263\0\0\0\377\2)\4\16\377\271\21A\377\377" \ + "\274\21B\377\224\274\21B\377\2\242\17""9\377\12\1\3\377\266\0\0\0\377" \ + "\3\0\0\0\367\0\0\0w\0\0\0\5\377\0\0\0\0\377\0\0\0\0\270\0\0\0\0\2\0\0" \ + "\0G\0\0\0\324\263\0\0\0\377\1U\10\36\377\377\274\21B\377\223\274\21B" \ + "\377\2\270\21A\377)\4\16\377\266\0\0\0\377\2\0\0\0\267\0\0\0*\377\0\0" \ + "\0\0\377\0\0\0\0\273\0\0\0\0\3\0\0\0\1\0\0\0U\0\0\0\340\262\0\0\0\377" \ + "\1t\13)\377\377\274\21B\377\221\274\21B\377\2\273\21B\377@\6\27\377\265" \ + "\0\0\0\377\2\0\0\0\306\0\0\0""8\377\0\0\0\0\377\0\0\0\0\277\0\0\0\0\3" \ + "\0\0\0\12\0\0\0w\0\0\0\362\260\0\0\0\377\2\6\1\2\377\226\16""5\377\377" \ + "\274\21B\377\220\274\21B\377\1[\10\40\377\264\0\0\0\377\3\0\0\0\337\0" \ + "\0\0U\0\0\0\1\377\0\0\0\0\377\0\0\0\0\302\0\0\0\0\3\0\0\0\32\0\0\0\231" \ + "\0\0\0\374\257\0\0\0\377\2\31\2\11\377\252\17<\377\377\274\21B\377\216" \ + "\274\21B\377\2y\13*\377\1\0\0\377\262\0\0\0\377\3\0\0\0\361\0\0\0w\0" \ + "\0\0\12\377\0\0\0\0\377\0\0\0\0\306\0\0\0\0\2\0\0\0*\0\0\0\266\257\0" \ + "\0\0\377\2!\3\14\377\257\20=\377\377\274\21B\377\214\274\21B\377\2\216" \ + "\15""2\377\5\0\2\377\261\0\0\0\377\3\0\0\0\374\0\0\0\231\0\0\0\31\377" \ + "\0\0\0\0\377\0\0\0\0\311\0\0\0\0\3\0\0\0\1\0\0\0T\0\0\0\324\256\0\0\0" \ + "\377\2#\3\14\377\257\20>\377\377\274\21B\377\212\274\21B\377\2\213\15" \ + "1\377\7\1\3\377\261\0\0\0\377\2\0\0\0\270\0\0\0""6\377\0\0\0\0\377\0" \ + "\0\0\0\316\0\0\0\0\2\0\0\0D\0\0\0\313\255\0\0\0\377\2*\4\17\377\264\20" \ + "\77\377\377\274\21B\377\210\274\21B\377\2\211\14""0\377\7\1\3\377\257" \ + "\0\0\0\377\3\0\0\0\376\0\0\0\252\0\0\0-\377\0\0\0\0\377\0\0\0\0\321\0" \ + "\0\0\0\3\0\0\0\1\0\0\0M\0\0\0\315\254\0\0\0\377\2""4\5\22\377\264\20" \ + "\77\377\377\274\21B\377\206\274\21B\377\2\213\15""1\377\10\1\3\377\256" \ + "\0\0\0\377\3\0\0\0\376\0\0\0\252\0\0\0.\377\0\0\0\0\377\0\0\0\0\325\0" \ + "\0\0\0\3\0\0\0\1\0\0\0M\0\0\0\315\253\0\0\0\377\2\40\3\13\377\251\17" \ + ";\377\377\274\21B\377\204\274\21B\377\2\201\14-\377\4\0\2\377\256\0\0" \ + "\0\377\2\0\0\0\252\0\0\0/\377\0\0\0\0\377\0\0\0\0\331\0\0\0\0\3\0\0\0" \ + "\1\0\0\0M\0\0\0\316\252\0\0\0\377\2\37\3\13\377\247\17;\377\377\274\21" \ + "B\377\202\274\21B\377\2|\13+\377\5\0\2\377\255\0\0\0\377\2\0\0\0\263" \ + "\0\0\0""8\377\0\0\0\0\377\0\0\0\0\335\0\0\0\0\3\0\0\0\4\0\0\0X\0\0\0" \ + "\311\251\0\0\0\377\2\27\2\10\377\237\16""8\377\377\274\21B\377\2e\11" \ + "#\377\1\0\0\377\253\0\0\0\377\3\0\0\0\375\0\0\0\257\0\0\0>\377\0\0\0" \ + "\0\377\0\0\0\0\342\0\0\0\0\3\0\0\0""0\0\0\0\231\0\0\0\367\247\0\0\0\377" \ + "\2\12\1\3\377\202\14.\377\374\274\21B\377\2\270\21@\377F\6\31\377\253" \ + "\0\0\0\377\3\0\0\0\355\0\0\0\200\0\0\0\30\377\0\0\0\0\377\0\0\0\0\346" \ + "\0\0\0\0\3\0\0\0\27\0\0\0\200\0\0\0\354\246\0\0\0\377\3\1\0\0\377^\11" \ + "!\377\273\21B\377\371\274\21B\377\2\261\20>\3771\4\21\377\252\0\0\0\377" \ + "\3\0\0\0\326\0\0\0f\0\0\0\14\377\0\0\0\0\377\0\0\0\0\352\0\0\0\0\3\0" \ + "\0\0\7\0\0\0^\0\0\0\325\246\0\0\0\377\2I\7\32\377\270\21@\377\367\274" \ + "\21B\377\2\242\17""9\377$\3\15\377\250\0\0\0\377\4\0\0\0\376\0\0\0\263" \ + "\0\0\0D\0\0\0\2\377\0\0\0\0\377\0\0\0\0\356\0\0\0\0\3\0\0\0\3\0\0\0T" \ + "\0\0\0\300\245\0\0\0\377\2+\4\17\377\252\17<\377\365\274\21B\377\2~\13" \ + ",\377\13\1\4\377\247\0\0\0\377\3\0\0\0\371\0\0\0\250\0\0\0:\377\0\0\0" \ + "\0\377\0\0\0\0\364\0\0\0\0\3\0\0\0\34\0\0\0w\0\0\0\343\243\0\0\0\377" \ + "\2\13\1\4\377z\13+\377\362\274\21B\377\2\264\20\77\377E\6\30\377\247" \ + "\0\0\0\377\3\0\0\0\321\0\0\0f\0\0\0\17\377\0\0\0\0\377\0\0\0\0\370\0" \ + "\0\0\0\4\0\0\0\11\0\0\0^\0\0\0\303\0\0\0\376\242\0\0\0\377\2E\6\30\377" \ + "\263\20\77\377\357\274\21B\377\2\234\16""7\377\35\3\12\377\245\0\0\0" \ + "\377\4\0\0\0\371\0\0\0\254\0\0\0F\0\0\0\2\377\0\0\0\0\377\0\0\0\0\375" \ + "\0\0\0\0\3\0\0\0\32\0\0\0o\0\0\0\316\241\0\0\0\377\2\40\3\13\377\231" \ + "\16""6\377\355\274\21B\377\2v\13)\377\12\1\4\377\243\0\0\0\377\4\0\0" \ + "\0\374\0\0\0\263\0\0\0U\0\0\0\11\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0" \ + "\203\0\0\0\0\4\0\0\0\1\0\0\0;\0\0\0\234\0\0\0\376\237\0\0\0\377\3\5\0" \ + "\2\377g\11$\377\272\21A\377\351\274\21B\377\2\250\17;\3777\5\23\377\243" \ + "\0\0\0\377\3\0\0\0\363\0\0\0\203\0\0\0&\377\0\0\0\0\377\0\0\0\0\377\0" \ + "\0\0\0\211\0\0\0\0\2\0\0\0b\0\0\0\375\240\0\0\0\377\2!\3\14\377\223\15" \ + "4\377\346\274\21B\377\3\273\21A\377d\11#\377\7\1\3\377\243\0\0\0\377" \ + "\2\0\0\0\355\0\0\0""3\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\214\0\0\0\0" \ + "\2\0\0\0Y\0\0\0\374\240\0\0\0\377\3\1\0\0\377K\7\32\377\262\20>\377\343" \ + "\274\21B\377\2\241\17""8\377,\4\20\377\244\0\0\0\377\2\0\0\0\355\0\0" \ + "\0""2\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\216\0\0\0\0\2\0\0\0X\0\0\0" \ + "\373\241\0\0\0\377\2\30\2\11\377\207\14/\377\340\274\21B\377\3\270\21" \ + "@\377h\11$\377\13\1\4\377\244\0\0\0\377\2\0\0\0\354\0\0\0""1\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\220\0\0\0\0\2\0\0\0W\0\0\0\373\242\0\0\0" \ + "\377\2\77\6\26\377\243\17""9\377\335\274\21B\377\2\202\14.\377\33\2\12" \ + "\377\245\0\0\0\377\2\0\0\0\353\0\0\0""0\377\0\0\0\0\377\0\0\0\0\377\0" \ + "\0\0\0\222\0\0\0\0\2\0\0\0b\0\0\0\375\242\0\0\0\377\3\1\0\1\377E\6\30" \ + "\377\251\17;\377\331\274\21B\377\2\221\15""3\377'\4\16\377\246\0\0\0" \ + "\377\2\0\0\0\357\0\0\0""5\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\224\0\0" \ + "\0\0\2\0\0\0F\0\0\0\362\243\0\0\0\377\3\13\1\4\377c\11#\377\265\20\77" \ + "\377\325\274\21B\377\3\252\17<\377J\7\32\377\2\0\1\377\246\0\0\0\377" \ + "\2\0\0\0\333\0\0\0#\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\226\0\0\0\0\2" \ + "\0\0\0""5\0\0\0\351\244\0\0\0\377\3\24\2\7\377r\12(\377\270\21A\377\321" \ + "\274\21B\377\3\251\17;\377Q\7\34\377\6\1\2\377\247\0\0\0\377\2\0\0\0" \ + "\315\0\0\0\30\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\230\0\0\0\0\2\0\0\0" \ + "\"\0\0\0\332\245\0\0\0\377\3\17\1\5\377^\11!\377\257\20=\377\315\274" \ + "\21B\377\3\241\17""9\377E\6\30\377\4\0\1\377\250\0\0\0\377\2\0\0\0\267" \ + "\0\0\0\14\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\232\0\0\0\0\2\0\0\0\30" \ + "\0\0\0\314\246\0\0\0\377\3\15\1\4\377[\10\40\377\254\20<\377\311\274" \ + "\21B\377\3\250\17;\377P\7\34\377\6\1\2\377\251\0\0\0\377\2\0\0\0\244" \ + "\0\0\0\6\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\234\0\0\0\0\2\0\0\0\20\0" \ + "\0\0\276\247\0\0\0\377\3\7\1\2\377M\7\33\377\241\17""8\377\305\274\21" \ + "B\377\3\216\15""2\377@\6\27\377\4\0\2\377\252\0\0\0\377\2\0\0\0\221\0" \ + "\0\0\2\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\236\0\0\0\0\2\0\0\0\3\0\0" \ + "\0\210\251\0\0\0\377\3&\3\15\377k\12&\377\257\20=\377\277\274\21B\377" \ + "\3\255\20=\377d\11#\377\32\2\11\377\253\0\0\0\377\2\0\0\0\366\0\0\0Y" \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\242\0\0\0\0\2\0\0\0Z\0\0\0\367\251" \ + "\0\0\0\377\3\12\1\4\377L\7\33\377\224\15""4\377\273\274\21B\377\3\224" \ + "\15""4\377J\7\32\377\10\1\3\377\254\0\0\0\377\2\0\0\0\346\0\0\0""8\377" \ + "\0\0\0\0\377\0\0\0\0\377\0\0\0\0\244\0\0\0\0\2\0\0\0""9\0\0\0\347\253" \ + "\0\0\0\377\3\40\3\13\377e\11#\377\241\17""9\377\264\274\21B\377\4\273" \ + "\21A\377\217\15""2\377S\7\35\377\27\2\10\377\256\0\0\0\377\2\0\0\0\311" \ + "\0\0\0\32\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\246\0\0\0\0\2\0\0\0\33" \ + "\0\0\0\313\255\0\0\0\377\4!\3\14\377]\10!\377\223\15""4\377\272\21A\377" \ + "\255\274\21B\377\4\270\21A\377\210\14""0\377L\7\33\377\22\2\6\377\260" \ + "\0\0\0\377\2\0\0\0\241\0\0\0\10\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\250" \ + "\0\0\0\0\2\0\0\0\14\0\0\0\243\257\0\0\0\377\4\15\1\5\377\77\6\26\377" \ + "r\12(\377\237\16""8\377\246\274\21B\377\5\273\21B\377\234\16""7\377j" \ + "\12%\377:\5\24\377\13\1\4\377\261\0\0\0\377\3\0\0\0\372\0\0\0v\0\0\0" \ + "\1\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\253\0\0\0\0\2\0\0\0R\0\0\0\357" \ + "\261\0\0\0\377\5\17\1\5\377;\5\25\377d\11#\377\205\14/\377\247\17:\377" \ + "\235\274\21B\377\5\253\17<\377\211\14""0\377`\11\"\3777\5\23\377\15\1" \ + "\5\377\264\0\0\0\377\2\0\0\0\332\0\0\0""2\377\0\0\0\0\377\0\0\0\0\377" \ + "\0\0\0\0\256\0\0\0\0\2\0\0\0\37\0\0\0\307\265\0\0\0\377\11\15\1\4\377" \ + ")\4\16\377C\6\30\377^\11!\377x\13*\377\211\14""0\377\233\16""6\377\252" \ + "\17<\377\272\21A\377\213\274\21B\377\11\263\20\77\377\246\17:\377\230" \ + "\16""5\377\206\14/\377s\12(\377^\10!\377I\7\32\377,\4\20\377\15\1\5\377" \ + "\270\0\0\0\377\2\0\0\0\245\0\0\0\15\377\0\0\0\0\377\0\0\0\0\377\0\0\0" \ + "\0\260\0\0\0\0\3\0\0\0\5\0\0\0\210\0\0\0\376\275\0\0\0\377\1\14\1\4\377" \ + "\204\15\1\4\377\1\12\1\3\377\303\0\0\0\377\2\0\0\0\364\0\0\0^\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\264\0\0\0\0\2\0\0\0O\0\0\0\346\377\0\0\0" \ + "\377\205\0\0\0\377\2\0\0\0\314\0\0\0.\377\0\0\0\0\377\0\0\0\0\377\0\0" \ + "\0\0\266\0\0\0\0\3\0\0\0\16\0\0\0\221\0\0\0\375\377\0\0\0\377\4\0\0\0" \ + "\377\0\0\0\364\0\0\0f\0\0\0\1\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\271" \ + "\0\0\0\0\2\0\0\0=\0\0\0\332\376\0\0\0\377\2\0\0\0\276\0\0\0\"\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\274\0\0\0\0\3\0\0\0\20\0\0\0\234\0\0\0\376" \ + "\372\0\0\0\377\3\0\0\0\365\0\0\0v\0\0\0\3\377\0\0\0\0\377\0\0\0\0\377" \ + "\0\0\0\0\277\0\0\0\0\2\0\0\0""0\0\0\0\304\367\0\0\0\377\3\0\0\0\376\0" \ + "\0\0\242\0\0\0\30\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\302\0\0\0\0\3\0" \ + "\0\0\1\0\0\0^\0\0\0\350\364\0\0\0\377\2\0\0\0\321\0\0\0=\377\0\0\0\0" \ + "\377\0\0\0\0\377\0\0\0\0\306\0\0\0\0\3\0\0\0\23\0\0\0\231\0\0\0\375\360" \ + "\0\0\0\377\3\0\0\0\363\0\0\0v\0\0\0\6\377\0\0\0\0\377\0\0\0\0\377\0\0" \ + "\0\0\311\0\0\0\0\3\0\0\0\40\0\0\0\231\0\0\0\374\354\0\0\0\377\3\0\0\0" \ + "\361\0\0\0w\0\0\0\15\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\315\0\0\0\0" \ + "\3\0\0\0*\0\0\0\252\0\0\0\376\350\0\0\0\377\3\0\0\0\366\0\0\0\210\0\0" \ + "\0\24\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\321\0\0\0\0\2\0\0\0=\0\0\0" \ + "\300\345\0\0\0\377\3\0\0\0\373\0\0\0\242\0\0\0#\377\0\0\0\0\377\0\0\0" \ + "\0\377\0\0\0\0\325\0\0\0\0\3\0\0\0.\0\0\0\242\0\0\0\372\340\0\0\0\377" \ + "\3\0\0\0\355\0\0\0\200\0\0\0\27\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\331" \ + "\0\0\0\0\3\0\0\0\30\0\0\0\200\0\0\0\357\334\0\0\0\377\3\0\0\0\341\0\0" \ + "\0o\0\0\0\14\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\335\0\0\0\0\3\0\0\0" \ + "\25\0\0\0y\0\0\0\334\330\0\0\0\377\3\0\0\0\306\0\0\0a\0\0\0\10\377\0" \ + "\0\0\0\377\0\0\0\0\377\0\0\0\0\342\0\0\0\0\3\0\0\0""3\0\0\0\231\0\0\0" \ + "\364\322\0\0\0\377\3\0\0\0\342\0\0\0\200\0\0\0$\377\0\0\0\0\377\0\0\0" \ + "\0\377\0\0\0\0\347\0\0\0\0\4\0\0\0\24\0\0\0q\0\0\0\311\0\0\0\376\314" \ + "\0\0\0\377\4\0\0\0\371\0\0\0\265\0\0\0[\0\0\0\10\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\354\0\0\0\0\4\0\0\0\24\0\0\0^\0\0\0\263\0\0\0\373\306" \ + "\0\0\0\377\4\0\0\0\363\0\0\0\242\0\0\0M\0\0\0\11\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\362\0\0\0\0\4\0\0\0\40\0\0\0q\0\0\0\272\0\0\0\367\300" \ + "\0\0\0\377\4\0\0\0\356\0\0\0\251\0\0\0_\0\0\0\21\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\370\0\0\0\0\4\0\0\0\12\0\0\0L\0\0\0\224\0\0\0\335\271" \ + "\0\0\0\377\5\0\0\0\375\0\0\0\314\0\0\0\203\0\0\0;\0\0\0\3\377\0\0\0\0" \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\5\0\0\0\16\0\0\0D\0\0\0\200\0\0" \ + "\0\263\0\0\0\357\260\0\0\0\377\5\0\0\0\351\0\0\0\252\0\0\0o\0\0\0<\0" \ + "\0\0\12\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\210\0\0\0\0\6" \ + "\0\0\0\10\0\0\0:\0\0\0f\0\0\0\217\0\0\0\272\0\0\0\343\245\0\0\0\377\7" \ + "\0\0\0\374\0\0\0\332\0\0\0\257\0\0\0\206\0\0\0[\0\0\0.\0\0\0\3\377\0" \ + "\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\222\0\0\0\0\11\0\0\0\17\0" \ + "\0\0""5\0\0\0R\0\0\0p\0\0\0\217\0\0\0\255\0\0\0\312\0\0\0\341\0\0\0\363" \ + "\224\0\0\0\377\11\0\0\0\356\0\0\0\334\0\0\0\304\0\0\0\245\0\0\0\207\0" \ + "\0\0j\0\0\0L\0\0\0-\0\0\0\7\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0" \ + "\0\0\0\241\0\0\0\0\4\0\0\0\5\0\0\0\27\0\0\0)\0\0\0;\202\0\0\0D\1\0\0" \ + "\0O\206\0\0\0U\1\0\0\0K\202\0\0\0D\4\0\0\0""7\0\0\0%\0\0\0\23\0\0\0\2" \ + "\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0" \ + "\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\377\0\0\0\0\220" \ + "\0\0\0\0") + + diff --git a/import-layers/meta-raspberrypi/recipes-core/psplash/psplash_git.bbappend b/import-layers/meta-raspberrypi/recipes-core/psplash/psplash_git.bbappend new file mode 100644 index 000000000..65dc30fda --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-core/psplash/psplash_git.bbappend @@ -0,0 +1,2 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +SPLASH_IMAGES += "file://psplash-raspberrypi-img.h;outsuffix=raspberrypi" diff --git a/import-layers/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.46.bb b/import-layers/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.46.bb new file mode 100644 index 000000000..dd37b8f36 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/bcm2835/bcm2835_1.46.bb @@ -0,0 +1,40 @@ +DESCRIPTION = "Package that provides access to GPIO and other IO\ +functions on the Broadcom BCM 2835 chip, allowing access to the\ +GPIO pins on the 26 pin IDE plug on the RPi board" +SECTION = "base" +HOMEPAGE = "http://www.open.com.au/mikem/bcm2835" +AUTHOR = "Mike McCauley (mikem@open.com.au)" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" + +COMPATIBLE_MACHINE = "raspberrypi" + +SRC_URI = "http://www.airspayce.com/mikem/bcm2835/bcm2835-${PV}.tar.gz" + +SRC_URI[md5sum] = "3a40c01ee7d81fbff80c54fbe1a351b5" +SRC_URI[sha256sum] = "fc6b0412525e6b7e85aeffec67e2d01a99fb906346620041e6684d59ea5517a7" + +inherit autotools + +do_compile_append() { + # Now compiling the examples provided by the package + mkdir -p ${B}/examples + for file in `ls ${S}/examples`; do + ${CC} ${S}/examples/${file}/${file}.c -o ${B}/examples/${file} -Bstatic -L${B}/src -lbcm2835 -I${S}/src + done +} + +do_install_append() { + install -d ${D}/${libdir}/${BPN} + for file in ${B}/examples/* + do + install -m 0755 ${file} ${D}/${libdir}/${BPN} + done +} + +PACKAGES += "${PN}-tests" + +FILES_${PN} = "" +FILES_${PN}-tests = "${libdir}/${BPN}" +FILES_${PN}-dbg += "${libdir}/${BPN}/.debug" diff --git a/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch b/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch new file mode 100644 index 000000000..7ea9a3bde --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/files/remove-initscript-lsb-dependency.patch @@ -0,0 +1,77 @@ +Remove dependencies on LSB functions + +Upstream-Status: Inappropriate [configuration] + +Signed-off-by: Alex Lennon + +diff -ur git.org/pi-blaster.boot.sh git/pi-blaster.boot.sh +--- git.org/pi-blaster.boot.sh 2014-05-20 14:49:44.378582168 +0100 ++++ git/pi-blaster.boot.sh 2014-05-20 14:51:08.330582386 +0100 +@@ -28,12 +28,12 @@ + [ -r /etc/default/$NAME ] && . /etc/default/$NAME + + # Load the VERBOSE setting and other rcS variables +-. /lib/init/vars.sh ++#. /lib/init/vars.sh + + # Define LSB log_* functions. + # Depend on lsb-base (>= 3.2-14) to ensure that this file is present + # and status_of_proc is working. +-. /lib/lsb/init-functions ++#. /lib/lsb/init-functions + + # + # Function that starts the daemon/service +@@ -77,48 +77,23 @@ + + case "$1" in + start) +- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" ++ [ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME" + do_start +- case "$?" in +- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; +- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; +- esac + ;; + stop) +- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" ++ [ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME" + do_stop +- case "$?" in +- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; +- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; +- esac +- ;; +- status) +- status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # +- log_daemon_msg "Restarting $DESC" "$NAME" + do_stop +- case "$?" in +- 0|1) +- do_start +- case "$?" in +- 0) log_end_msg 0 ;; +- 1) log_end_msg 1 ;; # Old process is still running +- *) log_end_msg 1 ;; # Failed to start +- esac +- ;; +- *) +- # Failed to stop +- log_end_msg 1 +- ;; +- esac ++ do_start + ;; + *) +- echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 ++ echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 + exit 3 + ;; + esac diff --git a/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster.inc b/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster.inc new file mode 100644 index 000000000..a3beccc02 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster.inc @@ -0,0 +1,21 @@ +DESCRIPTION = "This project enables PWM on the GPIO pins you request of a Raspberry Pi." +HOMEPAGE = "https://github.com/sarfata/pi-blaster/" +SECTION = "devel/libs" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://README.md;beginline=157;endline=170;md5=f20832f31126609af5a7bf2340014540" + +SRC_URI = "git://github.com/sarfata/pi-blaster \ + file://remove-initscript-lsb-dependency.patch \ +" + +S = "${WORKDIR}/git" + +inherit update-rc.d autotools + +INITSCRIPT_PACKAGES = "${PN}" +INITSCRIPT_NAME_${PN} = "${PN}.boot.sh" +INITSCRIPT_PARAMS_${PN} = "defaults 15 85" + +COMPATIBLE_MACHINE = "raspberrypi" + +PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb b/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb new file mode 100644 index 000000000..263852b4f --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/pi-blaster/pi-blaster_git.bb @@ -0,0 +1,3 @@ +require pi-blaster.inc + +SRCREV = "ec5e1b4c6191d8f9a538497dbbb86f9cf0de7016" diff --git a/import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch b/import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch new file mode 100644 index 000000000..4a93a1ce9 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu/0001-include-asm-ioctl.h-for-ioctl-define.patch @@ -0,0 +1,33 @@ +From c3aa4af56652b403e304ea5f321acfe289e42922 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 30 Jan 2016 16:07:14 -0800 +Subject: [PATCH] include asm/ioctl.h for ioctl() define + +also fixes errors e.g. + +../../RTIMULib/RTIMUHal.cpp:208:29: error: '_IOC_SIZEBITS' was not +declared in this scope + return ioctl(m_SPI, SPI_IOC_MESSAGE(1), &wrIOC); + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted + + RTIMULib/RTIMUHal.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/RTIMULib/RTIMUHal.cpp b/RTIMULib/RTIMUHal.cpp +index f9c3d15..d968326 100644 +--- a/RTIMULib/RTIMUHal.cpp ++++ b/RTIMULib/RTIMUHal.cpp +@@ -29,6 +29,7 @@ + #if !defined(WIN32) && !defined(__APPLE__) + + #include ++#include + + RTIMUHal::RTIMUHal() + { +-- +2.7.0 + diff --git a/import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu_git.bb b/import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu_git.bb new file mode 100644 index 000000000..63c92b381 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/python/python-rtimu_git.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "RTIMULib is a C++ and Python library that makes it easy to use 9-dof and \ +10-dof IMUs with embedded Linux systems" +HOMEPAGE = "https://github.com/RPi-Distro/RTIMULib/" +SECTION = "devel/python" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://../../LICENSE;md5=96cdecb41125f498958e09b72faf318e" + +SRC_URI = "git://github.com/RPi-Distro/RTIMULib.git;protocol=http;branch=master \ + file://0001-include-asm-ioctl.h-for-ioctl-define.patch;patchdir=../.. \ + " +SRCREV = "b949681af69b45f0f7f4bb53b6770037b5b02178" + +S = "${WORKDIR}/git/Linux/python/" + +inherit setuptools diff --git a/import-layers/meta-raspberrypi/recipes-devtools/python/python-sense-hat_2.1.0.bb b/import-layers/meta-raspberrypi/recipes-devtools/python/python-sense-hat_2.1.0.bb new file mode 100644 index 000000000..e990a2872 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/python/python-sense-hat_2.1.0.bb @@ -0,0 +1,28 @@ +SUMMARY = "Python module to control the Raspberry Pi Sense HAT used in the Astro Pi mission" +HOMEPAGE = "https://github.com/RPi-Distro/python-sense-hat" +SECTION = "devel/python" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://LICENCE.txt;md5=d80fe312e1ff5fbd97369b093bf21cda" + +SRCNAME = "sense-hat" + +SRC_URI = "https://pypi.python.org/packages/source/s/${SRCNAME}/${SRCNAME}-${PV}.tar.gz" + +SRC_URI[md5sum] = "71217f15ea963040f06e2f50722186ca" +SRC_URI[sha256sum] = "c6c76707c0ea514e4b0f1f96f1b5b79755875891aae037df7434b6aad7b9dbca" + +S = "${WORKDIR}/${SRCNAME}-${PV}" + +inherit setuptools + +DEPENDS += " \ + jpeg \ + zlib \ + freetype \ + " + +RDEPENDS_${PN} += " \ + python-numpy \ + python-rtimu \ + python-imaging \ + " diff --git a/import-layers/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch b/import-layers/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch new file mode 100644 index 000000000..bd971793a --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/python/rpi-gpio/0001-Remove-nested-functions.patch @@ -0,0 +1,294 @@ +From 23d7ab77865f8b17042f5cd4c6720cca475e0eb5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 13 Jan 2016 14:27:10 -0800 +Subject: [PATCH] Remove nested functions + +nested functions are not supported on llvm/clang compiler, replacing +them helps make code portable and be compilable with non-gcc compilers +additionally fix the diagnostic messages clang reported + +source/c_gpio.c:130:18: warning: comparison of distinct pointer types +('volatile uint32_t *' (aka 'volatile unsigned int *') an +d 'void *') [-Wcompare-distinct-pointer-types] + if (gpio_map < MAP_FAILED) + ~~~~~~~~ ^ ~~~~~~~~~~ + + source/c_gpio.c:89:13: warning: variable 'peri_base' is used +uninitialized whenever 'if' condition is false [-Wsometimes-uninit +ialized] + if (fread(buf, 1, sizeof buf, fp) == sizeof buf) { + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +source/c_gpio.c:116:17: note: uninitialized use occurs here + gpio_base = peri_base + GPIO_BASE_OFFSET; + ^~~~~~~~~ +source/c_gpio.c:89:9: note: remove the 'if' if its condition is always +true + if (fread(buf, 1, sizeof buf, fp) == sizeof buf) { + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +source/c_gpio.c:64:23: note: initialize the variable 'peri_base' to +silence this warning + uint32_t peri_base; + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted + + source/c_gpio.c | 6 +-- + source/py_gpio.c | 135 ++++++++++++++++++++++++++++--------------------------- + 2 files changed, 71 insertions(+), 70 deletions(-) + +diff --git a/source/c_gpio.c b/source/c_gpio.c +index c96a2b0..b69880f 100644 +--- a/source/c_gpio.c ++++ b/source/c_gpio.c +@@ -61,7 +61,7 @@ int setup(void) + { + int mem_fd; + uint8_t *gpio_mem; +- uint32_t peri_base; ++ uint32_t peri_base = 0; + uint32_t gpio_base; + unsigned char buf[4]; + FILE *fp; +@@ -73,7 +73,7 @@ int setup(void) + if ((mem_fd = open("/dev/gpiomem", O_RDWR|O_SYNC)) > 0) + { + gpio_map = (uint32_t *)mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0); +- if ((uint32_t)gpio_map < 0) { ++ if (gpio_map == MAP_FAILED) { + return SETUP_MMAP_FAIL; + } else { + return SETUP_OK; +@@ -127,7 +127,7 @@ int setup(void) + + gpio_map = (uint32_t *)mmap( (void *)gpio_mem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd, gpio_base); + +- if ((uint32_t)gpio_map < 0) ++ if (gpio_map == MAP_FAILED) + return SETUP_MMAP_FAIL; + + return SETUP_OK; +diff --git a/source/py_gpio.c b/source/py_gpio.c +index d54cc7f..007bad5 100644 +--- a/source/py_gpio.c ++++ b/source/py_gpio.c +@@ -69,6 +69,20 @@ static int mmap_gpio_mem(void) + return 0; + } + } ++static inline int cleanup_one(unsigned int gpio) ++{ ++ // clean up any /sys/class exports ++ event_cleanup(gpio); ++ ++ // set everything back to input ++ if (gpio_direction[gpio] != -1) { ++ setup_gpio(gpio, INPUT, PUD_OFF); ++ gpio_direction[gpio] = -1; ++ return 1; ++ } ++ return 0; ++} ++ + + // python function cleanup(channel=None) + static PyObject *py_cleanup(PyObject *self, PyObject *args, PyObject *kwargs) +@@ -83,19 +97,6 @@ static PyObject *py_cleanup(PyObject *self, PyObject *args, PyObject *kwargs) + PyObject *tempobj; + static char *kwlist[] = {"channel", NULL}; + +- void cleanup_one(void) +- { +- // clean up any /sys/class exports +- event_cleanup(gpio); +- +- // set everything back to input +- if (gpio_direction[gpio] != -1) { +- setup_gpio(gpio, INPUT, PUD_OFF); +- gpio_direction[gpio] = -1; +- found = 1; +- } +- } +- + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", kwlist, &chanlist)) + return NULL; + +@@ -140,7 +141,7 @@ static PyObject *py_cleanup(PyObject *self, PyObject *args, PyObject *kwargs) + } else if (channel != -666) { // channel was an int indicating single channel + if (get_gpio_number(channel, &gpio)) + return NULL; +- cleanup_one(); ++ found = cleanup_one(gpio); + } else { // channel was a list/tuple + for (i=0; i +Date: Sat, 30 Jan 2016 17:12:37 -0800 +Subject: [PATCH] include sys/types.h explicitly for getting caddr_t definition + +Helps fixing build on musl where sys/types.h is not included indirectly +as happening on glibc + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted + + source/c_gpio/c_gpio.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/source/c_gpio/c_gpio.c b/source/c_gpio/c_gpio.c +index 25a04ca..70df632 100644 +--- a/source/c_gpio/c_gpio.c ++++ b/source/c_gpio/c_gpio.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include "c_gpio.h" + +-- +2.7.0 + diff --git a/import-layers/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb b/import-layers/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb new file mode 100644 index 000000000..69ecb6f9b --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb @@ -0,0 +1,20 @@ +DESCRIPTION = "Advanced GPIO for the Raspberry Pi. Extends RPi.GPIO with PWM, \ +GPIO interrups, TCP socket interrupts, command line tools and more" +HOMEPAGE = "https://github.com/metachris/RPIO" +SECTION = "devel/python" +LICENSE = "LGPLv3+" +LIC_FILES_CHKSUM = "file://README.rst;beginline=41;endline=53;md5=d5d95d7486a4d98c999675c23196b25a" + +SRCNAME = "RPIO" + +SRC_URI = "http://pypi.python.org/packages/source/R/RPIO/${SRCNAME}-${PV}.tar.gz \ + file://0001-include-sys-types.h-explicitly-for-getting-caddr_t-d.patch \ + " +S = "${WORKDIR}/${SRCNAME}-${PV}" + +inherit setuptools + +COMPATIBLE_MACHINE = "raspberrypi" + +SRC_URI[md5sum] = "cefc45422833dcafcd59b78dffc540f4" +SRC_URI[sha256sum] = "b89f75dec9de354681209ebfaedfe22b7c178aacd91a604a7bd6d92024e4cf7e" diff --git a/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/files/0001-Add-initial-cross-compile-support.patch b/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/files/0001-Add-initial-cross-compile-support.patch new file mode 100644 index 000000000..ed47fab81 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/files/0001-Add-initial-cross-compile-support.patch @@ -0,0 +1,410 @@ +From 6d85e6cc3ab97c3f060e5e0a8e3f1945a14c86ba Mon Sep 17 00:00:00 2001 +From: Gianfranco Costamagna +Date: Mon, 12 Oct 2015 12:15:51 +0200 +Subject: [PATCH] Add initial cross compile support (rebase from Petter Mabäcker version) + +--- + devLib/Makefile | 54 ++++++++++++++++++++++++------------------- + examples/Gertboard/Makefile | 22 +++++++++++------- + examples/Makefile | 22 +++++++++++------- + examples/PiFace/Makefile | 22 +++++++++++------- + examples/PiGlow/Makefile | 4 ++-- + examples/q2w/Makefile | 4 ++-- + gpio/Makefile | 29 ++++++++++++----------- + wiringPi/Makefile | 50 +++++++++++++++++++++------------------ + 8 files changed, 119 insertions(+), 88 deletions(-) + +diff --git a/devLib/Makefile b/devLib/Makefile +index 0fb0033..cbea759 100644 +--- a/devLib/Makefile ++++ b/devLib/Makefile +@@ -31,15 +31,19 @@ ifneq ($V,1) + Q ?= @ + endif + +-STATIC=libwiringPiDev.a +-DYNAMIC=libwiringPiDev.so.$(VERSION) ++INCLUDE_DIR?=$(DESTDIR)$(PREFIX)/include ++LIB_DIR?=$(DESTDIR)$(PREFIX)/lib + +-#DEBUG = -g -O0 +-DEBUG = -O2 +-CC = gcc +-INCLUDE = -I. +-DEFS = -D_GNU_SOURCE +-CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC ++BASE_NAME=libwiringPiDev ++STATIC=$(BASE_NAME).a ++DYNAMIC=$(BASE_NAME).so.$(VERSION) ++ ++#DEBUG ?= -g -O0 ++DEBUG ?= -O2 ++CC ?= gcc ++INCLUDE ?= -I. ++DEFS ?= -D_GNU_SOURCE ++CFLAGS ?= $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC + + LIBS = + +@@ -66,16 +70,16 @@ $(STATIC): $(OBJ) + + $(DYNAMIC): $(OBJ) + $Q echo "[Link (Dynamic)]" +- $Q $(CC) -shared -Wl,-soname,libwiringPiDev.so$(WIRINGPI_SONAME_SUFFIX) -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ) ++ $Q $(CC) -shared -Wl,-soname,$(BASE_NAME).so.$(DYN_VERS_MAJ) -o $(BASE_NAME).so -lpthread $(OBJ) + + .c.o: + $Q echo [Compile] $< +- $Q $(CC) -c $(CFLAGS) $< -o $@ ++ $Q $(CC) -c $(CFLAGS) -fPIC $< -o $@ + + .PHONY: clean + clean: + $Q echo "[Clean]" +- $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.* ++ $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak $(BASE_NAME).so* $(BASE_NAME).a + + .PHONY: tags + tags: $(SRC) +@@ -86,22 +90,22 @@ tags: $(SRC) + .PHONY: install + install: $(DYNAMIC) + $Q echo "[Install Headers]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include +- $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include ++ $Q install -m 0755 -d $(INCLUDE_DIR) ++ $Q install -m 0644 $(HEADERS) $(INCLUDE_DIR) + $Q echo "[Install Dynamic Lib]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib +- $Q install -m 0755 libwiringPiDev.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) +- $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) $(DESTDIR)/lib/libwiringPiDev.so +- $Q $(LDCONFIG) ++ $Q install -m 0755 -d $(LIB_DIR) ++ $Q install -m 0755 $(BASE_NAME).so $(LIB_DIR)/$(DYNAMIC) ++ $Q ln -sf $(DYNAMIC) $(LIB_DIR)/$(BASE_NAME).so ++ $Q ln -sf $(DYNAMIC) $(LIB_DIR)/$(BASE_NAME).so.$(DYN_VERS_MAJ) + + .PHONY: install-static + install-static: $(STATIC) + $Q echo "[Install Headers]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include +- $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include ++ $Q install -m 0755 -d $(INCLUDE_DIR) ++ $Q install -m 0644 $(HEADERS) $(INCLUDE_DIR) + $Q echo "[Install Static Lib]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib +- $Q install -m 0755 libwiringPiDev.a $(DESTDIR)$(PREFIX)/lib ++ $Q install -m 0755 -d $(LIB_DIR) ++ $Q install -m 0755 $(STATIC) $(LIB_DIR) + + .PHONY: install-deb + install-deb: $(DYNAMIC) +@@ -116,9 +120,11 @@ install-deb: $(DYNAMIC) + .PHONY: uninstall + uninstall: + $Q echo "[UnInstall]" +- $Q cd $(DESTDIR)$(PREFIX)/include/ && rm -f $(HEADERS) +- $Q cd $(DESTDIR)$(PREFIX)/lib/ && rm -f libwiringPiDev.* +- $Q $(LDCONFIG) ++ $Q cd $(INCLUDE_DIR) && rm -f $(HEADERS) ++ $Q rm -f $(LIB_DIR)/$(STATIC) ++ $Q rm -f $(LIB_DIR)/$(DYNAMIC) ++ $Q rm -f $(LIB_DIR)/$(BASE_NAME).so ++ $Q rm -f $(LIB_DIR)/$(BASE_NAME).so.$(DYN_VERS_MAJ) + + + .PHONY: depend +diff --git a/examples/Gertboard/Makefile b/examples/Gertboard/Makefile +index 1939ad6..98d1415 100644 +--- a/examples/Gertboard/Makefile ++++ b/examples/Gertboard/Makefile +@@ -9,14 +9,20 @@ ifneq ($V,1) + Q ?= @ + endif + +-#DEBUG = -g -O0 +-DEBUG = -O3 +-CC = gcc +-INCLUDE = -I/usr/local/include +-CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe +- +-LDFLAGS = -L/usr/local/lib +-LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm ++DESTDIR?=/usr ++PREFIX?=/local ++ ++INCLUDE_DIR?=$(DESTDIR)$(PREFIX)/include ++LIB_DIR?=$(DESTDIR)$(PREFIX)/lib ++ ++#DEBUG ?= -g -O0 ++DEBUG ?= -O3 ++CC ?= gcc ++INCLUDE ?= -I$(INCLUDE_DIR) ++CFLAGS ?= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe ++ ++LDFLAGS ?= -L$(LIB_DIR) ++LDLIBS ?= -lwiringPi -lwiringPiDev -lpthread -lm + + # Should not alter anything below this line + ############################################################################### +diff --git a/examples/Makefile b/examples/Makefile +index e6b9b71..931b167 100644 +--- a/examples/Makefile ++++ b/examples/Makefile +@@ -26,14 +26,20 @@ ifneq ($V,1) + Q ?= @ + endif + +-#DEBUG = -g -O0 +-DEBUG = -O3 +-CC = gcc +-INCLUDE = -I/usr/local/include +-CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe +- +-LDFLAGS = -L/usr/local/lib +-LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm ++DESTDIR?=/usr ++PREFIX?=/local ++ ++INCLUDE_DIR?=$(DESTDIR)$(PREFIX)/include ++LIB_DIR?=$(DESTDIR)$(PREFIX)/lib ++ ++#DEBUG ?= -g -O0 ++DEBUG ?= -O3 ++CC ?= gcc ++INCLUDE ?= -I$(INCLUDE_DIR) ++CFLAGS ?= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe ++ ++LDFLAGS ?= -L$(LIB_DIR) ++LDLIBS ?= -lwiringPi -lwiringPiDev -lpthread -lm + + # Should not alter anything below this line + ############################################################################### +diff --git a/examples/PiFace/Makefile b/examples/PiFace/Makefile +index 4685adc..cfaf902 100644 +--- a/examples/PiFace/Makefile ++++ b/examples/PiFace/Makefile +@@ -26,14 +26,20 @@ ifneq ($V,1) + Q ?= @ + endif + +-#DEBUG = -g -O0 +-DEBUG = -O3 +-CC = gcc +-INCLUDE = -I/usr/local/include +-CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe +- +-LDFLAGS = -L/usr/local/lib +-LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm ++DESTDIR?=/usr ++PREFIX?=/local ++ ++INCLUDE_DIR?=$(DESTDIR)$(PREFIX)/include ++LIB_DIR?=$(DESTDIR)$(PREFIX)/lib ++ ++#DEBUG ?= -g -O0 ++DEBUG ?= -O3 ++CC ?= gcc ++INCLUDE ?= -I$(INCLUDE_DIR) ++CFLAGS ?= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe ++ ++LDFLAGS ?= -L$(LIB_DIR) ++LDLIBS ?= -lwiringPi -lwiringPiDev -lpthread -lm + + # Should not alter anything below this line + ############################################################################### +diff --git a/examples/PiGlow/Makefile b/examples/PiGlow/Makefile +index acd4818..dabd64e 100644 +--- a/examples/PiGlow/Makefile ++++ b/examples/PiGlow/Makefile +@@ -29,10 +29,10 @@ endif + #DEBUG = -g -O0 + DEBUG = -O3 + CC = gcc +-INCLUDE = -I/usr/local/include ++INCLUDE = -I../wiringPi -I../wiringPiDev + CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +-LDFLAGS = -L/usr/local/lib ++LDFLAGS = -L../wiringPi -L../wiringPiDev + LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + + # Should not alter anything below this line +diff --git a/examples/q2w/Makefile b/examples/q2w/Makefile +index 6f50fa0..c5e9f6e 100644 +--- a/examples/q2w/Makefile ++++ b/examples/q2w/Makefile +@@ -29,10 +29,10 @@ endif + #DEBUG = -g -O0 + DEBUG = -O3 + CC = gcc +-INCLUDE = -I/usr/local/include ++INCLUDE = -I../wiringPi -I../devLib + CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +-LDFLAGS = -L/usr/local/lib ++LDFLAGS = -L../wiringPi -L../devLib + LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + + ############################################################################### +diff --git a/gpio/Makefile b/gpio/Makefile +index 7dcd090..83ec454 100644 +--- a/gpio/Makefile ++++ b/gpio/Makefile +@@ -30,13 +30,17 @@ ifneq ($V,1) + Q ?= @ + endif + +-#DEBUG = -g -O0 +-DEBUG = -O2 +-CC = gcc +-INCLUDE = -I$(DESTDIR)$(PREFIX)/include +-CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe ++INCLUDE_DIR?=$(DESTDIR)$(PREFIX)/include ++LIB_DIR?=$(DESTDIR)$(PREFIX)/lib ++BIN_DIR?=$(DESTDIR)$(PREFIX)/bin + +-LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib ++#DEBUG ?= -g -O0 ++DEBUG ?= -O2 ++CC ?= gcc ++INCLUDE ?= -I$(INCLUDE_DIR) ++CFLAGS ?= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe ++ ++LDFLAGS ?= -L$(LIB_DIR) + LIBS = -lwiringPi -lwiringPiDev -lpthread + + # May not need to alter anything below this line +@@ -72,13 +76,10 @@ tags: $(SRC) + .PHONY: install + install: gpio + $Q echo "[Install]" +- $Q cp gpio $(DESTDIR)$(PREFIX)/bin +-ifneq ($(WIRINGPI_SUID),0) +- $Q chown root.root $(DESTDIR)$(PREFIX)/bin/gpio +- $Q chmod 4755 $(DESTDIR)$(PREFIX)/bin/gpio +-endif +- $Q mkdir -p $(DESTDIR)$(PREFIX)/man/man1 +- $Q cp gpio.1 $(DESTDIR)$(PREFIX)/man/man1 ++ $Q install -d $(BIN_DIR) ++ $Q install -m 4755 -o root -g root gpio $(BIN_DIR) ++ $Q install -d $(DESTDIR)$(PREFIX)/share/man/man1 ++ $Q install -m 644 -o root -g root gpio.1 $(DESTDIR)$(PREFIX)/share/man/man1 + + .PHONY: install-deb + install-deb: gpio +@@ -89,7 +90,7 @@ install-deb: gpio + .PHONY: uninstall + uninstall: + $Q echo "[UnInstall]" +- $Q rm -f $(DESTDIR)$(PREFIX)/bin/gpio ++ $Q rm -f $(BIN_DIR)/gpio + $Q rm -f $(DESTDIR)$(PREFIX)/man/man1/gpio.1 + + .PHONY: depend +diff --git a/wiringPi/Makefile b/wiringPi/Makefile +index 6bbcc5d..5355b74 100644 +--- a/wiringPi/Makefile ++++ b/wiringPi/Makefile +@@ -25,19 +25,23 @@ VERSION=$(shell cat ../VERSION) + DESTDIR?=/usr + PREFIX?=/local + ++INCLUDE_DIR?=$(DESTDIR)$(PREFIX)/include ++LIB_DIR?=$(DESTDIR)$(PREFIX)/lib ++ + LDCONFIG?=ldconfig + + ifneq ($V,1) + Q ?= @ + endif + +-STATIC=libwiringPi.a +-DYNAMIC=libwiringPi.so.$(VERSION) ++BASE_NAME=libwiringPi ++STATIC=$(BASE_NAME).a ++DYNAMIC=$(BASE_NAME).so.$(VERSION) + +-#DEBUG = -g -O0 +-DEBUG = -O2 +-CC = gcc +-INCLUDE = -I. ++#DEBUG ?= -g -O0 ++DEBUG ?= -O2 ++CC ?= gcc ++INCLUDE ?= -I. + DEFS = -D_GNU_SOURCE + CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC + +@@ -89,17 +93,17 @@ $(STATIC): $(OBJ) + + $(DYNAMIC): $(OBJ) + $Q echo "[Link (Dynamic)]" +- $Q $(CC) -shared -Wl,-soname,libwiringPi.so$(WIRINGPI_SONAME_SUFFIX) -o libwiringPi.so.$(VERSION) -lpthread $(OBJ) ++ $Q $(CC) -shared -Wl,-soname,$(BASE_NAME).so.$(DYN_VERS_MAJ) -o $(BASE_NAME).so -lpthread $(OBJ) + + .c.o: + $Q echo [Compile] $< +- $Q $(CC) -c $(CFLAGS) $< -o $@ ++ $Q $(CC) -c $(CFLAGS) -fPIC $< -o $@ + + + .PHONY: clean + clean: + $Q echo "[Clean]" +- $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* ++ $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak $(BASE_NAME).so* $(BASE_NAME).a + + .PHONY: tags + tags: $(SRC) +@@ -110,22 +114,22 @@ tags: $(SRC) + .PHONY: install + install: $(DYNAMIC) + $Q echo "[Install Headers]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include +- $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include ++ $Q install -m 0755 -d $(INCLUDE_DIR) ++ $Q install -m 0644 $(HEADERS) $(INCLUDE_DIR) + $Q echo "[Install Dynamic Lib]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib +- $Q install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) +- $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so +- $Q $(LDCONFIG) ++ $Q install -m 0755 -d $(LIB_DIR) ++ $Q install -m 0755 $(BASE_NAME).so $(LIB_DIR)/$(DYNAMIC) ++ $Q ln -sf $(DYNAMIC) $(LIB_DIR)/$(BASE_NAME).so ++ $Q ln -sf $(DYNAMIC) $(LIB_DIR)/$(BASE_NAME).so.$(DYN_VERS_MAJ) + + .PHONY: install-static + install-static: $(STATIC) + $Q echo "[Install Headers]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include +- $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include ++ $Q install -m 0755 -d $(INCLUDE_DIR) ++ $Q install -m 0644 $(HEADERS) $(INCLUDE_DIR) + $Q echo "[Install Static Lib]" +- $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib +- $Q install -m 0755 libwiringPi.a $(DESTDIR)$(PREFIX)/lib ++ $Q install -m 0755 -d $(LIB_DIR) ++ $Q install -m 0755 $(STATIC) $(LIB_DIR) + + .PHONY: install-deb + install-deb: $(DYNAMIC) +@@ -140,9 +144,11 @@ install-deb: $(DYNAMIC) + .PHONY: uninstall + uninstall: + $Q echo "[UnInstall]" +- $Q cd $(DESTDIR)$(PREFIX)/include/ && rm -f $(HEADERS) +- $Q cd $(DESTDIR)$(PREFIX)/lib/ && rm -f libwiringPi.* +- $Q $(LDCONFIG) ++ $Q cd $(INCLUDE_DIR) && rm -f $(HEADERS) ++ $Q rm -f $(LIB_DIR)/$(STATIC) ++ $Q rm -f $(LIB_DIR)/$(DYNAMIC) ++ $Q rm -f $(LIB_DIR)/$(BASE_NAME).so ++ $Q rm -f $(LIB_DIR)/$(BASE_NAME).so.$(DYN_VERS_MAJ) + + + .PHONY: depend +-- +2.1.4 + diff --git a/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi/0001-include-asm-ioctl.h-directly-for-_IOC_SIZEBITS.patch b/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi/0001-include-asm-ioctl.h-directly-for-_IOC_SIZEBITS.patch new file mode 100644 index 000000000..5de5853b1 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi/0001-include-asm-ioctl.h-directly-for-_IOC_SIZEBITS.patch @@ -0,0 +1,58 @@ +From 7f65eb37a82a6d9b095d9c8f262ad9dd205acd03 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 30 Jan 2016 16:57:38 -0800 +Subject: [PATCH] include directly for _IOC_SIZEBITS + +Fixes errors like +| wiringPiSPI.c: In function 'wiringPiSPIDataRW': +| wiringPiSPI.c:89:35: error: '_IOC_SIZEBITS' undeclared (first use in +this function) + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted + + wiringPi/wiringPi.c | 1 + + wiringPi/wiringPiI2C.c | 1 + + wiringPi/wiringPiSPI.c | 1 + + 3 files changed, 3 insertions(+) + +diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c +index 32e5100..cb5db9d 100644 +--- a/wiringPi/wiringPi.c ++++ b/wiringPi/wiringPi.c +@@ -64,6 +64,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/wiringPi/wiringPiI2C.c b/wiringPi/wiringPiI2C.c +index c787bce..efdf53c 100644 +--- a/wiringPi/wiringPiI2C.c ++++ b/wiringPi/wiringPiI2C.c +@@ -52,6 +52,7 @@ + #include + #include + #include ++#include + + #include "wiringPi.h" + #include "wiringPiI2C.h" +diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c +index 453df31..ae3c7d9 100644 +--- a/wiringPi/wiringPiSPI.c ++++ b/wiringPi/wiringPiSPI.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + +-- +2.7.0 + diff --git a/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi_git.bb b/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi_git.bb new file mode 100644 index 000000000..9d2206bc1 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-devtools/wiringPi/wiringpi_git.bb @@ -0,0 +1,34 @@ +DESCRIPTION = "A library to control Raspberry Pi GPIO channels" +HOMEPAGE = "https://projects.drogon.net/raspberry-pi/wiringpi/" +SECTION = "devel/libs" +LICENSE = "LGPLv3+" +LIC_FILES_CHKSUM = "file://COPYING.LESSER;md5=e6a600fd5e1d9cbde2d983680233ad02" + +# tag 2.29 +SRCREV = "d79506694d7ba1c3da865d095238289d6175057d" + +S = "${WORKDIR}/git" + +SRC_URI = "git://git.drogon.net/wiringPi \ + file://0001-Add-initial-cross-compile-support.patch \ + file://0001-include-asm-ioctl.h-directly-for-_IOC_SIZEBITS.patch \ + " + +COMPATIBLE_MACHINE = "raspberrypi" + +CFLAGS_prepend = "-I${S}/wiringPi -I${S}/devLib" + +EXTRA_OEMAKE += "'INCLUDE_DIR=${D}${includedir}' 'LIB_DIR=${D}${libdir}'" +EXTRA_OEMAKE += "'DESTDIR=${D}/usr' 'PREFIX=""'" + +do_compile() { + oe_runmake -C devLib + oe_runmake -C wiringPi + oe_runmake -C gpio 'LDFLAGS=${LDFLAGS} -L${S}/wiringPi -L${S}/devLib' +} + +do_install() { + oe_runmake -C devLib install + oe_runmake -C wiringPi install + oe_runmake -C gpio install +} diff --git a/import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-fb_%.bbappend b/import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-fb_%.bbappend new file mode 100644 index 000000000..7f8b6009d --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-fb_%.bbappend @@ -0,0 +1 @@ +EGLINFO_DEVICE_rpi = "raspberrypi" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-x11_%.bbappend b/import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-x11_%.bbappend new file mode 100644 index 000000000..fd32abc45 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/eglinfo/eglinfo-x11_%.bbappend @@ -0,0 +1,2 @@ +EGLINFO_DEVICE_rpi = "raspberrypi" +ASNEEDED = "" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0001-Allow-applications-to-set-next-resource-handle.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0001-Allow-applications-to-set-next-resource-handle.patch new file mode 100644 index 000000000..4d026bda8 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0001-Allow-applications-to-set-next-resource-handle.patch @@ -0,0 +1,208 @@ +From 83c5ac5892d0cd29caa8922ff8b639b9a373c3cb Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Tue, 9 Jul 2013 09:26:26 -0400 +Subject: [PATCH 01/13] Allow applications to set next resource handle + +This patch adds provisions in userland to +let apps callers set the next rendereing dispmanx resource. +It's useful for implementing, say, a buffer carousel. +--- + interface/khronos/common/khrn_client_rpc.h | 2 ++ + interface/khronos/common/khrn_int_ids.h | 2 ++ + interface/khronos/egl/egl_client.c | 30 +++++++++++++++++++++++++++--- + interface/khronos/egl/egl_client_surface.c | 24 +++++++++++++++++++++++- + interface/khronos/egl/egl_client_surface.h | 3 ++- + interface/khronos/egl/egl_int_impl.h | 5 +++-- + 6 files changed, 59 insertions(+), 7 deletions(-) + +diff --git a/interface/khronos/common/khrn_client_rpc.h b/interface/khronos/common/khrn_client_rpc.h +index 418aa67..a7557a8 100644 +--- a/interface/khronos/common/khrn_client_rpc.h ++++ b/interface/khronos/common/khrn_client_rpc.h +@@ -683,6 +683,7 @@ static INLINE void rpc_call12_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id + static INLINE void rpc_call13_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } + static INLINE void rpc_call14_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } + static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } ++static INLINE void rpc_call16_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4, uint32_t p5, uint32_t p6, uint32_t p7, uint32_t p8, uint32_t p9, uint32_t p10, uint32_t p11, uint32_t p12, uint32_t p13, uint32_t p14, void *out) { rpc_begin(thread); RPC_CALL(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); } + #endif + + #define RPC_CALL1_OUT_CTRL(fn, thread, id, out) rpc_call1_out_ctrl(thread, id, out) +@@ -700,6 +701,7 @@ static INLINE void rpc_call15_out_ctrl(CLIENT_THREAD_STATE_T *thread,uint32_t id + #define RPC_CALL13_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) rpc_call13_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, out) + #define RPC_CALL14_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) rpc_call14_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, out) + #define RPC_CALL15_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) rpc_call15_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, out) ++#define RPC_CALL16_OUT_CTRL(fn, thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) rpc_call16_out_ctrl(thread, id, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, out) + + # if !defined(__SYMBIAN32__) //use functions defined in khrpc.cpp + static INLINE uint32_t rpc_call1_out_ctrl_res(CLIENT_THREAD_STATE_T *thread,uint32_t id, void *out) { uint32_t res; rpc_begin(thread); RPC_CALL(thread, id); res = rpc_recv(thread, out, NULL, (RPC_RECV_FLAG_T)(RPC_RECV_FLAG_RES | RPC_RECV_FLAG_CTRL | RPC_RECV_FLAG_LEN)); rpc_end(thread); return res; } +diff --git a/interface/khronos/common/khrn_int_ids.h b/interface/khronos/common/khrn_int_ids.h +index 8378f4a..ec961e0 100644 +--- a/interface/khronos/common/khrn_int_ids.h ++++ b/interface/khronos/common/khrn_int_ids.h +@@ -367,6 +367,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + #define EGLINTCREATESURFACE_ID 0x4000 ++#define EGLINTCREATESURFACE_ID_V2 0x4100 + #define EGLINTCREATEGLES11_ID 0x4001 + #define EGLINTCREATEGLES20_ID 0x4002 + #define EGLINTCREATEVG_ID 0x4003 +@@ -377,6 +378,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #define EGLINTMAKECURRENT_ID 0x4008 + #define EGLINTFLUSHANDWAIT_ID 0x4009 + #define EGLINTSWAPBUFFERS_ID 0x400a ++#define EGLINTSWAPBUFFERS_ID_V2 0x410a + #define EGLINTSELECTMIPMAP_ID 0x400b + #define EGLINTFLUSH_ID 0x400c + #define EGLINTGETCOLORDATA_ID 0x400d +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index 472ef0c..234da65 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -162,6 +162,17 @@ static void egl_current_release(CLIENT_PROCESS_STATE_T *process, EGL_CURRENT_T * + void egl_gl_flush_callback(bool wait); + void egl_vg_flush_callback(bool wait); + ++#include "interface/vmcs_host/vc_dispmanx_types.h" ++/**HACKHACK - give us the ability to inject a DispmanX ++ * resource handle into the CreateWindowSurface and ++ * SwapBuffers calls */ ++static DISPMANX_RESOURCE_HANDLE_T next_resource_handle; ++ ++EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle) ++{ ++ next_resource_handle = handle; ++} ++ + /* + TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate) + Also affects global image (and possibly others?) +@@ -644,7 +655,8 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- 0, 0); ++ 0, 0, ++ next_resource_handle); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -889,7 +901,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig + mipmap_texture, + texture_format, + texture_target, +- 0, 0); ++ 0, 0, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -1031,7 +1043,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle); ++ pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -2303,6 +2315,18 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + + vcos_log_trace("eglSwapBuffers server call"); + ++ if (next_resource_handle) ++ RPC_CALL7(eglIntSwapBuffers_impl, ++ thread, ++ EGLINTSWAPBUFFERS_ID_V2, ++ RPC_UINT(surface->serverbuffer), ++ RPC_UINT(surface->width), ++ RPC_UINT(surface->height), ++ RPC_UINT(surface->internal_handle), ++ RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), ++ RPC_UINT(khrn_platform_get_window_position(surface->win)), ++ RPC_INT(next_resource_handle)); ++ else + RPC_CALL6(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID, +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 0fa1fd1..0dc10e2 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -314,7 +314,8 @@ EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle) ++ const uint32_t *pixmap_server_handle, ++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle) + { + KHRN_IMAGE_FORMAT_T color; + KHRN_IMAGE_FORMAT_T depth; +@@ -473,6 +474,27 @@ EGL_SURFACE_T *egl_surface_create( + #endif + uint32_t results[3]; + ++ if (next_resource_handle) ++ RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl, ++ thread, ++ EGLINTCREATESURFACE_ID_V2, ++ RPC_UINT(serverwin), ++ RPC_UINT(buffers), ++ RPC_UINT(width), ++ RPC_UINT(height), ++ RPC_UINT(color), ++ RPC_UINT(depth), ++ RPC_UINT(mask), ++ RPC_UINT(multi), ++ RPC_UINT(largest_pbuffer), ++ RPC_UINT(mipmap_texture), ++ RPC_UINT(config_depth_bits), ++ RPC_UINT(config_stencil_bits), ++ RPC_UINT(sem_name), ++ RPC_UINT(type), ++ RPC_INT(next_resource_handle), ++ results); ++ else + RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl, + thread, + EGLINTCREATESURFACE_ID, +diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h +index c99d44c..b5bf70a 100644 +--- a/interface/khronos/egl/egl_client_surface.h ++++ b/interface/khronos/egl/egl_client_surface.h +@@ -322,7 +322,8 @@ extern EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle); ++ const uint32_t *pixmap_server_handle, ++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle); + extern EGL_SURFACE_T *egl_surface_from_vg_image( + VGImage vg_handle, + EGLSurface name, +diff --git a/interface/khronos/egl/egl_int_impl.h b/interface/khronos/egl/egl_int_impl.h +index 8a5734c..51b3580 100644 +--- a/interface/khronos/egl/egl_int_impl.h ++++ b/interface/khronos/egl/egl_int_impl.h +@@ -56,7 +56,8 @@ FN(int, eglIntCreateSurface_impl, ( + uint32_t config_stencil_bits, + uint32_t sem, + uint32_t type, +- uint32_t *results)) ++ uint32_t *results, ++ DISPMANX_RESOURCE_HANDLE_T next_resource_handle)) + + FN(int, eglIntCreatePbufferFromVGImage_impl, ( + VGImage vg_handle, +@@ -110,7 +111,7 @@ FN(void, eglIntMakeCurrent_impl, (uint32_t pid_0, uint32_t pid_1, uint32_t glver + FN(int, eglIntFlushAndWait_impl, (uint32_t flushgl, uint32_t flushvg)) + FN(void, eglIntFlush_impl, (uint32_t flushgl, uint32_t flushvg)) + +-FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position)) ++FN(void, eglIntSwapBuffers_impl, (EGL_SURFACE_ID_T s, uint32_t width, uint32_t height, uint32_t handle, uint32_t preserve, uint32_t position, DISPMANX_RESOURCE_HANDLE_T new_back_buffer)) + FN(void, eglIntSelectMipmap_impl, (EGL_SURFACE_ID_T s, int level)) + + FN(void, eglIntGetColorData_impl, (EGL_SURFACE_ID_T s, KHRN_IMAGE_FORMAT_T format, uint32_t width, uint32_t height, int32_t stride, uint32_t y_offset, void *data)) +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch new file mode 100644 index 000000000..aa09ddac9 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch @@ -0,0 +1,1880 @@ +From 79ce2b4125359593f37c5b9744a37203e24249de Mon Sep 17 00:00:00 2001 +From: Tomeu Vizoso +Date: Tue, 1 Oct 2013 13:19:20 +0200 +Subject: [PATCH 02/13] wayland: Add support for the Wayland winsys + +* Adds EGL_WL_bind_wayland_display extension +* Adds wayland-egl library +* Adds wl_dispmanx_buffer protocol extension + +TODO: Check that platform_get_dimensions() returning swapchain_count == 1 is correct + +TODO: Remove the requirement of passing a valid DispmanX element handle to +the SwapBuffers and CreateSurface RPC calls. This will remove the need to open +a DispmanX display from the clients. + +TODO: wl_dispmanx_server_buffer should probably be defined in a +private header that can be included from EGL and vc_* instead of in +vc_vchi_dispmanx.h +--- + .gitignore | 2 + + CMakeLists.txt | 11 + + README.md | 4 + + buildme | 14 +- + interface/khronos/CMakeLists.txt | 52 ++++- + interface/khronos/common/khrn_client.c | 15 ++ + interface/khronos/common/khrn_client.h | 10 + + interface/khronos/common/khrn_client_mangle.h | 3 + + interface/khronos/common/khrn_client_platform.h | 8 + + interface/khronos/common/khrn_client_unmangle.h | 3 + + .../common/linux/khrn_client_platform_linux.c | 115 ++++++++-- + interface/khronos/common/linux/khrn_wayland.c | 215 ++++++++++++++++++ + .../common/linux/khrn_wayland.h} | 46 +--- + interface/khronos/egl/egl_client.c | 92 +++++--- + interface/khronos/egl/egl_client_get_proc.c | 11 + + interface/khronos/egl/egl_client_surface.c | 42 +++- + interface/khronos/egl/egl_client_surface.h | 38 +++- + interface/khronos/egl/egl_int_impl.h | 2 +- + interface/khronos/ext/egl_wayland.c | 246 +++++++++++++++++++++ + interface/khronos/include/EGL/eglext.h | 23 ++ + interface/khronos/wayland-egl/wayland-egl-priv.h | 53 +++++ + interface/khronos/wayland-egl/wayland-egl.c | 59 +++++ + interface/khronos/wayland-egl/wayland-egl.pc.in | 10 + + interface/vmcs_host/CMakeLists.txt | 21 +- + interface/vmcs_host/vc_dispmanx.h | 10 + + interface/vmcs_host/vc_vchi_dispmanx.c | 42 ++++ + interface/vmcs_host/vc_vchi_dispmanx.h | 15 ++ + interface/wayland/dispmanx.xml | 123 +++++++++++ + makefiles/cmake/Wayland.cmake | 72 ++++++ + 29 files changed, 1260 insertions(+), 97 deletions(-) + create mode 100644 interface/khronos/common/linux/khrn_wayland.c + copy interface/{vmcs_host/vc_vchi_dispmanx.h => khronos/common/linux/khrn_wayland.h} (56%) + create mode 100644 interface/khronos/ext/egl_wayland.c + create mode 100644 interface/khronos/wayland-egl/wayland-egl-priv.h + create mode 100644 interface/khronos/wayland-egl/wayland-egl.c + create mode 100644 interface/khronos/wayland-egl/wayland-egl.pc.in + create mode 100644 interface/wayland/dispmanx.xml + create mode 100644 makefiles/cmake/Wayland.cmake + +diff --git a/.gitignore b/.gitignore +index 8df9393..d0d1387 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -10,3 +10,5 @@ + *.lai + *.la + *.a ++ ++*~ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 3113618..56b7fb8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -19,6 +19,17 @@ include(makefiles/cmake/global_settings.cmake) + include(makefiles/cmake/arm-linux.cmake) + include(makefiles/cmake/vmcs.cmake) + ++if (BUILD_WAYLAND) ++ include(makefiles/cmake/Wayland.cmake) ++ ++ # Find Wayland libraries ++ find_package(PkgConfig) ++ pkg_check_modules(WAYLAND_CLIENT wayland-client REQUIRED) ++ pkg_check_modules(WAYLAND_SERVER wayland-server REQUIRED) ++ ++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_WAYLAND") ++endif() ++ + enable_language(ASM) + + # Global include paths +diff --git a/README.md b/README.md +index 358d2b4..4da4448 100644 +--- a/README.md ++++ b/README.md +@@ -4,3 +4,7 @@ EGL, mmal, GLESv2, vcos, openmaxil, vchiq_arm, bcm_host, WFC, OpenVG. + + Use buildme to build. It requires cmake to be installed and an arm cross compiler. It is set up to use this one: + https://github.com/raspberrypi/tools/tree/master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian ++ ++To build support for the Wayland winsys in EGL, execute the buildme script like this: ++ ++$ BUILD_WAYLAND=1 ./buildme. +diff --git a/buildme b/buildme +index d5d3de9..c46f214 100755 +--- a/buildme ++++ b/buildme +@@ -1,10 +1,14 @@ + #!/bin/bash + ++if [ -n "$BUILD_WAYLAND" ]; then ++ WAYLAND_VARS="-DBUILD_WAYLAND=TRUE" ++fi ++ + if [ "armv6l" = `arch` ] || [ "armv7l" = `arch` ]; then + # Native compile on the Raspberry Pi + mkdir -p build/raspberry/release + pushd build/raspberry/release +- cmake -DCMAKE_BUILD_TYPE=Release ../../.. ++ cmake -DCMAKE_BUILD_TYPE=Release $WAYLAND_VARS ../../.. + if [ "armv6l" = `arch` ]; then + make + else +@@ -17,9 +21,15 @@ if [ "armv6l" = `arch` ] || [ "armv7l" = `arch` ]; then + fi + else + # Cross compile on a more capable machine ++ ++ if [ -n "$BUILD_WAYLAND" ]; then ++ # Use wayland-scanner from the build platform ++ WAYLAND_VARS+=" -DWAYLAND_SCANNER_EXECUTABLE:FILEPATH=/usr/bin/wayland-scanner" ++ fi ++ + mkdir -p build/arm-linux/release/ + pushd build/arm-linux/release/ +- cmake -DCMAKE_TOOLCHAIN_FILE=../../../makefiles/cmake/toolchains/arm-linux-gnueabihf.cmake -DCMAKE_BUILD_TYPE=Release ../../.. ++ cmake -DCMAKE_TOOLCHAIN_FILE=../../../makefiles/cmake/toolchains/arm-linux-gnueabihf.cmake -DCMAKE_BUILD_TYPE=Release $WAYLAND_VARS ../../.. + make -j 6 + + if [ "$1" != "" ]; then +diff --git a/interface/khronos/CMakeLists.txt b/interface/khronos/CMakeLists.txt +index c437291..6778e10 100644 +--- a/interface/khronos/CMakeLists.txt ++++ b/interface/khronos/CMakeLists.txt +@@ -6,6 +6,12 @@ + # have quite a few circular dependencies, and so the only way + # to make it work seems to be to have everything static. + ++if (BUILD_WAYLAND) ++include_directories( ++ ${WAYLAND_SERVER_INCLUDE_DIRS} ++) ++endif () ++ + set(EGL_SOURCE + egl/egl_client_config.c + egl/egl_client_context.c +@@ -55,19 +61,63 @@ set(CLIENT_SOURCE + common/khrn_int_hash_asm.s + common/khrn_client_cache.c) + ++set(EGL_LIBS ++ khrn_client ++ vchiq_arm ++ vcos ++ bcm_host ++ -lm) ++ ++if (BUILD_WAYLAND) ++ set(EGL_SOURCE ++ ${EGL_SOURCE} ++ ext/egl_wayland.c ++ common/linux/khrn_wayland.c) ++ ++ set(EGL_LIBS ++ ${EGL_LIBS} ++ wayland-client ++ wayland-server) ++ ++ set(WAYLAND_EGL_SOURCE ++ wayland-egl/wayland-egl.c) ++ ++ wayland_add_protocol_server( ++ EGL_SOURCE ++ ../../interface/wayland/dispmanx.xml ++ dispmanx ++ ) ++ ++ wayland_add_protocol_client( ++ EGL_SOURCE ++ ../../interface/wayland/dispmanx.xml ++ dispmanx ++ ) ++ ++ add_library(wayland-egl ${SHARED} ${WAYLAND_EGL_SOURCE}) ++ install(TARGETS wayland-egl DESTINATION lib) ++ ++ configure_file ("wayland-egl/wayland-egl.pc.in" "wayland-egl/wayland-egl.pc" @ONLY) ++ install (FILES "${CMAKE_CURRENT_BINARY_DIR}/wayland-egl/wayland-egl.pc" ++ DESTINATION lib/pkgconfig) ++endif () ++ + add_library(EGL ${SHARED} ${EGL_SOURCE}) + add_library(GLESv2 ${SHARED} ${GLES_SOURCE}) + add_library(OpenVG ${SHARED} ${VG_SOURCE}) + add_library(WFC ${SHARED} ${WFC_SOURCE}) + add_library(khrn_client ${CLIENT_SOURCE}) + ++set_target_properties(EGL PROPERTIES SOVERSION 1 VERSION 1.0.0) ++set_target_properties(GLESv2 PROPERTIES SOVERSION 2 VERSION 2.0.0) ++ + # TODO do we need EGL_static and GLESv2_static now that khrn_static exists? + add_library(EGL_static STATIC ${EGL_SOURCE}) + add_library(GLESv2_static STATIC ${GLES_SOURCE}) + add_library(khrn_static STATIC + ${EGL_SOURCE} ${GLES_SOURCE} ${VG_SOURCE} ${WFC_SOURCE} ${CLIENT_SOURCE}) + +-target_link_libraries(EGL khrn_client vchiq_arm vcos bcm_host -lm) ++target_link_libraries(EGL ${EGL_LIBS}) + target_link_libraries(GLESv2 EGL khrn_client vcos) + target_link_libraries(WFC EGL) + target_link_libraries(OpenVG EGL) +diff --git a/interface/khronos/common/khrn_client.c b/interface/khronos/common/khrn_client.c +index e38a85f..783a68e 100644 +--- a/interface/khronos/common/khrn_client.c ++++ b/interface/khronos/common/khrn_client.c +@@ -54,6 +54,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "applications/vmcs/khronos/khronos_server.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#endif ++ + VCOS_LOG_CAT_T khrn_client_log = VCOS_LOG_INIT("khrn_client", VCOS_LOG_WARN); + + /* +@@ -142,6 +146,10 @@ void client_try_unload_server(CLIENT_PROCESS_STATE_T *process) + bool client_process_state_init(CLIENT_PROCESS_STATE_T *process) + { + if (!process->inited) { ++#ifdef BUILD_WAYLAND ++ process->wl_global = NULL; ++#endif ++ + if (!khrn_pointer_map_init(&process->contexts, 64)) + return false; + +@@ -194,6 +202,13 @@ bool client_process_state_init(CLIENT_PROCESS_STATE_T *process) + } + #endif + ++#ifdef BUILD_WAYLAND ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ if (wl_display) ++ if (!init_process_wayland(process)) ++ return false; ++#endif ++ + process->inited = true; + } + +diff --git a/interface/khronos/common/khrn_client.h b/interface/khronos/common/khrn_client.h +index 804039b..615f7b4 100644 +--- a/interface/khronos/common/khrn_client.h ++++ b/interface/khronos/common/khrn_client.h +@@ -310,6 +310,16 @@ struct CLIENT_PROCESS_STATE { + #ifdef RPC_LIBRARY + KHRONOS_SERVER_CONNECTION_T khrn_connection; + #endif ++ ++#ifdef BUILD_WAYLAND ++ /* Client-side Wayland state */ ++ struct wl_registry *wl_registry; ++ struct wl_dispmanx *wl_dispmanx; ++ struct wl_event_queue *wl_queue; ++ ++ /* Compositor-side Wayland state */ ++ struct wl_global *wl_global; ++#endif + }; + + extern bool client_process_state_init(CLIENT_PROCESS_STATE_T *process); +diff --git a/interface/khronos/common/khrn_client_mangle.h b/interface/khronos/common/khrn_client_mangle.h +index b3c04f4..b7b21c5 100644 +--- a/interface/khronos/common/khrn_client_mangle.h ++++ b/interface/khronos/common/khrn_client_mangle.h +@@ -83,6 +83,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #define eglReleaseGlobalImageBRCM mangled_eglReleaseGlobalImageBRCM + #define eglInitGlobalImageBRCM mangled_eglInitGlobalImageBRCM + #define eglTermGlobalImageBRCM mangled_eglTermGlobalImageBRCM ++#define eglBindWaylandDisplayWL mangled_eglBindWaylandDisplayWL ++#define eglUnbindWaylandDisplayWL mangled_eglUnbindWaylandDisplayWL ++#define eglQueryWaylandBufferWL mangled_eglQueryWaylandBufferWL + + /* OpenGL ES 1.1 and 2.0 functions */ + +diff --git a/interface/khronos/common/khrn_client_platform.h b/interface/khronos/common/khrn_client_platform.h +index 1c9da3a..715c67e 100644 +--- a/interface/khronos/common/khrn_client_platform.h ++++ b/interface/khronos/common/khrn_client_platform.h +@@ -48,6 +48,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "interface/khronos/common/vcos/khrn_client_platform_filler_vcos.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include ++#endif ++ + #ifdef __cplusplus + extern "C" { + #endif +@@ -328,4 +332,8 @@ typedef struct + + void *platform_wfc_bounce_thread(void *param); + ++#ifdef BUILD_WAYLAND ++struct wl_display *khrn_platform_get_wl_display(); ++#endif ++ + #endif // KHRN_CLIENT_PLATFORM_H +diff --git a/interface/khronos/common/khrn_client_unmangle.h b/interface/khronos/common/khrn_client_unmangle.h +index 4f3ce49..84f6ec0 100644 +--- a/interface/khronos/common/khrn_client_unmangle.h ++++ b/interface/khronos/common/khrn_client_unmangle.h +@@ -83,6 +83,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #undef eglReleaseGlobalImageBRCM + #undef eglInitGlobalImageBRCM + #undef eglTermGlobalImageBRCM ++#undef eglBindWaylandDisplayWL ++#undef eglUnbindWaylandDisplayWL ++#undef eglQueryWaylandBufferWL + + /* OpenGL ES 1.1 and 2.0 functions */ + +diff --git a/interface/khronos/common/linux/khrn_client_platform_linux.c b/interface/khronos/common/linux/khrn_client_platform_linux.c +index 9d43d15..00821d3 100644 +--- a/interface/khronos/common/linux/khrn_client_platform_linux.c ++++ b/interface/khronos/common/linux/khrn_client_platform_linux.c +@@ -37,6 +37,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "X11/Xlib.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++#endif ++ + extern VCOS_LOG_CAT_T khrn_client_log; + + extern void vc_vchi_khronos_init(); +@@ -460,13 +465,36 @@ EGLDisplay khrn_platform_set_display_id(EGLNativeDisplayType display_id) + return EGL_NO_DISPLAY; + } + #else ++ ++#ifdef BUILD_WAYLAND ++static struct wl_display *hacky_display = NULL; ++#endif ++ + EGLDisplay khrn_platform_set_display_id(EGLNativeDisplayType display_id) + { + if (display_id == EGL_DEFAULT_DISPLAY) + return (EGLDisplay)1; +- else +- return EGL_NO_DISPLAY; ++ else { ++#ifdef BUILD_WAYLAND ++ void *first_pointer = *(void **) display_id; ++ ++ /* wl_display is a wl_proxy, which is a wl_object. ++ * wl_object's first element points to the interfacetype. */ ++ if (first_pointer == &wl_display_interface) { ++ hacky_display = (struct wl_display*)display_id; ++ return (EGLDisplay)1; ++ } else ++#endif ++ return EGL_NO_DISPLAY; ++ } + } ++ ++#ifdef BUILD_WAYLAND ++struct wl_display *khrn_platform_get_wl_display() ++{ ++ return hacky_display; ++} ++#endif + #endif + + #ifdef WANT_X +@@ -801,22 +829,81 @@ static EGL_DISPMANX_WINDOW_T *check_default(EGLNativeWindowType win) + void platform_get_dimensions(EGLDisplay dpy, EGLNativeWindowType win, + uint32_t *width, uint32_t *height, uint32_t *swapchain_count) + { +- EGL_DISPMANX_WINDOW_T *dwin = check_default(win); +- vcos_assert(dwin); +- vcos_assert(dwin->width < 1<<16); // sanity check +- vcos_assert(dwin->height < 1<<16); // sanity check +- *width = dwin->width; +- *height = dwin->height; +- *swapchain_count = 0; ++#ifdef BUILD_WAYLAND ++ if(khrn_platform_get_wl_display()) { ++ struct wl_egl_window *wl_egl_window = (struct wl_egl_window*)win; ++ *width = wl_egl_window->width; ++ *height = wl_egl_window->height; ++ /* This seems to be used for sync'ing with the VC on buffer creation, but ++ we are managing them on the CPU side */ ++ *swapchain_count = 1; ++ } else { ++#endif ++ EGL_DISPMANX_WINDOW_T *dwin = check_default(win); ++ vcos_assert(dwin); ++ vcos_assert(dwin->width < 1<<16); // sanity check ++ vcos_assert(dwin->height < 1<<16); // sanity check ++ *width = dwin->width; ++ *height = dwin->height; ++ *swapchain_count = 0; ++#ifdef BUILD_WAYLAND ++ } ++#endif + } + ++#ifdef BUILD_WAYLAND ++static DISPMANX_ELEMENT_HANDLE_T create_dummy_element() ++{ ++ DISPMANX_DISPLAY_HANDLE_T display = vc_dispmanx_display_open(0); ++ DISPMANX_UPDATE_HANDLE_T update = vc_dispmanx_update_start(0); ++ DISPMANX_ELEMENT_HANDLE_T element; ++ VC_DISPMANX_ALPHA_T alpha = {DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, 255, 0}; ++ VC_RECT_T src_rect; ++ VC_RECT_T dst_rect; ++ ++ src_rect.x = 0; ++ src_rect.y = 0; ++ src_rect.width = 1 << 16; ++ src_rect.height = 1 << 16; ++ ++ dst_rect.x = 0; ++ dst_rect.y = 0; ++ dst_rect.width = 1; ++ dst_rect.height = 1; ++ ++ element = vc_dispmanx_element_add(update, display, 0/*layer*/, &dst_rect, ++ 0/*src*/, &src_rect, ++ DISPMANX_PROTECTION_NONE, &alpha, ++ 0/*clamp*/, 0/*transform*/); ++ ++ vc_dispmanx_update_submit_sync(update); ++ ++ vc_dispmanx_display_close(display); ++ ++ return element; ++} ++#endif ++ + uint32_t platform_get_handle(EGLDisplay dpy, EGLNativeWindowType win) + { +- EGL_DISPMANX_WINDOW_T *dwin = check_default(win); +- vcos_assert(dwin); +- vcos_assert(dwin->width < 1<<16); // sanity check +- vcos_assert(dwin->height < 1<<16); // sanity check +- return dwin->element; ++#ifdef BUILD_WAYLAND ++ if(khrn_platform_get_wl_display()) { ++ struct wl_egl_window *wl_egl_window = (struct wl_egl_window*)win; ++ ++ if (wl_egl_window->dummy_element == PLATFORM_WIN_NONE) ++ wl_egl_window->dummy_element = create_dummy_element(); ++ ++ return wl_egl_window->dummy_element; ++ } else { ++#endif ++ EGL_DISPMANX_WINDOW_T *dwin = check_default(win); ++ vcos_assert(dwin); ++ vcos_assert(dwin->width < 1<<16); // sanity check ++ vcos_assert(dwin->height < 1<<16); // sanity check ++ return dwin->element; ++#ifdef BUILD_WAYLAND ++ } ++#endif + } + + #endif +diff --git a/interface/khronos/common/linux/khrn_wayland.c b/interface/khronos/common/linux/khrn_wayland.c +new file mode 100644 +index 0000000..0e1b9e7 +--- /dev/null ++++ b/interface/khronos/common/linux/khrn_wayland.c +@@ -0,0 +1,215 @@ ++/* ++Copyright (c) 2013, Raspberry Pi Foundation ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. ++*/ ++ ++#define VCOS_LOG_CATEGORY (&khrn_client_log) ++ ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#include "interface/khronos/wayland-dispmanx-client-protocol.h" ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++ ++extern VCOS_LOG_CAT_T khrn_client_log; ++ ++static void handle_dispmanx_format(void *data, struct wl_dispmanx *dispmanx, ++ uint32_t format) ++{ ++} ++ ++static void handle_dispmanx_allocated(void *data, struct wl_dispmanx *dispmanx, ++ struct wl_buffer *wl_buffer, ++ uint32_t resource_handle) ++{ ++ struct wl_dispmanx_client_buffer *buffer = wl_buffer_get_user_data(wl_buffer); ++ ++ buffer->pending_allocation = 0; ++ buffer->resource = resource_handle; ++} ++ ++static const struct wl_dispmanx_listener dispmanx_listener = { ++ handle_dispmanx_format, ++ handle_dispmanx_allocated, ++}; ++ ++static void ++sync_callback(void *data, struct wl_callback *callback, uint32_t serial) ++{ ++ int *done = data; ++ ++ *done = 1; ++ ++ wl_callback_destroy(callback); ++} ++ ++static const struct wl_callback_listener sync_listener = { ++ sync_callback ++}; ++ ++static int ++roundtrip(CLIENT_PROCESS_STATE_T *process) ++{ ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ struct wl_callback *callback; ++ int done = 0, ret = 0; ++ ++ callback = wl_display_sync(wl_display); ++ wl_callback_add_listener(callback, &sync_listener, &done); ++ wl_proxy_set_queue((struct wl_proxy *) callback, process->wl_queue); ++ while (ret != -1 && !done) ++ ret = wl_display_dispatch_queue(wl_display, process->wl_queue); ++ ++ if (!done) ++ wl_callback_destroy(callback); ++ ++ return ret; ++} ++ ++int do_wl_roundtrip() ++{ ++ CLIENT_PROCESS_STATE_T *process = CLIENT_GET_PROCESS_STATE(); ++ return roundtrip(process); ++} ++ ++static void ++registry_handle_global(void *data, struct wl_registry *registry, ++ uint32_t name, const char *interface, uint32_t version) ++{ ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ CLIENT_PROCESS_STATE_T *process = (CLIENT_PROCESS_STATE_T *)data; ++ ++ if (strcmp(interface, "wl_dispmanx") == 0) { ++ process->wl_dispmanx = wl_registry_bind(registry, name, ++ &wl_dispmanx_interface, 1); ++ ++ wl_proxy_set_queue((struct wl_proxy *) process->wl_dispmanx, ++ process->wl_queue); ++ wl_dispmanx_add_listener(process->wl_dispmanx, &dispmanx_listener, wl_display); ++ roundtrip(process); ++ } ++} ++ ++static void ++registry_handle_global_remove(void *data, struct wl_registry *registry, ++ uint32_t name) ++{ ++} ++ ++static const struct wl_registry_listener registry_listener = { ++ registry_handle_global, ++ registry_handle_global_remove ++}; ++ ++int ++init_process_wayland(CLIENT_PROCESS_STATE_T *process) ++{ ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ ++ process->wl_queue = wl_display_create_queue(wl_display); ++ if (!process->wl_queue) { ++ vcos_log_error("wl_display_create_queue failed\n"); ++ return false; ++ } ++ wl_display_dispatch_pending(wl_display); ++ ++ process->wl_registry = wl_display_get_registry(wl_display); ++ if (!process->wl_registry) { ++ vcos_log_error("wl_display_get_registry failed\n"); ++ return false; ++ } ++ ++ wl_proxy_set_queue((struct wl_proxy *) process->wl_registry, ++ process->wl_queue); ++ ++ wl_registry_add_listener(process->wl_registry, ®istry_listener, process); ++ ++ if (roundtrip(process) < 0 || process->wl_dispmanx == NULL) { ++ vcos_log_error("failed to get wl_dispmanx\n"); ++ return false; ++ } ++ ++ return true; ++} ++ ++#ifndef ALIGN_UP ++#define ALIGN_UP(x,y) ((x + (y)-1) & ~((y)-1)) ++#endif ++ ++static void handle_buffer_release(void *data, struct wl_buffer *buffer_wl) ++{ ++ struct wl_dispmanx_client_buffer *wl_dispmanx_client_buffer = data; ++ wl_dispmanx_client_buffer->in_use = 0; ++} ++ ++static const struct wl_buffer_listener buffer_listener = { ++ handle_buffer_release ++}; ++ ++struct wl_dispmanx_client_buffer * ++allocate_wl_buffer(struct wl_egl_window *window, KHRN_IMAGE_FORMAT_T color) ++{ ++ CLIENT_PROCESS_STATE_T *process = CLIENT_GET_PROCESS_STATE(); ++ struct wl_dispmanx_client_buffer *wl_dispmanx_client_buffer; ++ struct wl_buffer *wl_buffer; ++ uint32_t stride = ALIGN_UP(window->width * 4, 16); ++ uint32_t buffer_height = ALIGN_UP(window->height, 16); ++ enum wl_dispmanx_format color_format; ++ int ret = 0; ++ ++ switch (color) { ++ case ABGR_8888: ++ color_format = WL_DISPMANX_FORMAT_ABGR8888; ++ break; ++ case XBGR_8888: ++ color_format = WL_DISPMANX_FORMAT_XBGR8888; ++ break; ++ case RGB_565: ++ color_format = WL_DISPMANX_FORMAT_RGB565; ++ break; ++ default: ++ vcos_log_error("unknown KHRN_IMAGE_FORMAT_T 0x%x\n", color); ++ return NULL; ++ } ++ ++ wl_buffer = wl_dispmanx_create_buffer(process->wl_dispmanx, window->width, ++ window->height, stride, buffer_height, ++ color_format); ++ if (wl_buffer == NULL) ++ return NULL; ++ ++ wl_dispmanx_client_buffer = calloc(1, sizeof(struct wl_dispmanx_client_buffer)); ++ wl_dispmanx_client_buffer->wl_buffer = wl_buffer; ++ wl_dispmanx_client_buffer->in_use = 0; ++ wl_dispmanx_client_buffer->pending_allocation = 1; ++ wl_dispmanx_client_buffer->width = window->width; ++ wl_dispmanx_client_buffer->height = window->height; ++ ++ wl_proxy_set_queue((struct wl_proxy *) wl_buffer, process->wl_queue); ++ wl_buffer_add_listener(wl_buffer, &buffer_listener, wl_dispmanx_client_buffer); ++ ++ while (ret != -1 && wl_dispmanx_client_buffer->pending_allocation) ++ ret = do_wl_roundtrip(); ++ ++ return wl_dispmanx_client_buffer; ++} +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.h b/interface/khronos/common/linux/khrn_wayland.h +similarity index 56% +copy from interface/vmcs_host/vc_vchi_dispmanx.h +copy to interface/khronos/common/linux/khrn_wayland.h +index b723b76..b9bf08c 100644 +--- a/interface/vmcs_host/vc_vchi_dispmanx.h ++++ b/interface/khronos/common/linux/khrn_wayland.h +@@ -1,5 +1,5 @@ + /* +-Copyright (c) 2012, Broadcom Europe Ltd ++Copyright (c) 2013, Raspberry Pi Foundation + All rights reserved. + + Redistribution and use in source and binary forms, with or without +@@ -25,45 +25,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-#ifndef VC_VCHI_DISPMANX_H +-#define VC_VCHI_DISPMANX_H ++#include "interface/khronos/common/khrn_client.h" + +-#include "interface/peer/vc_vchi_dispmanx_common.h" ++int init_process_wayland(CLIENT_PROCESS_STATE_T *process); ++int do_wl_roundtrip(); + +-#define VC_NUM_HOST_RESOURCES 64 +-#define DISPMANX_MSGFIFO_SIZE 1024 +-#define DISPMANX_CLIENT_NAME MAKE_FOURCC("DISP") +-#define DISPMANX_NOTIFY_NAME MAKE_FOURCC("UPDH") +- +-//Or with command to indicate we don't need a response +-#define DISPMANX_NO_REPLY_MASK (1<<31) +- +-typedef struct { +- char description[32]; +- uint32_t width; +- uint32_t height; +- uint32_t aspect_pixwidth; +- uint32_t aspect_pixheight; +- uint32_t fieldrate_num; +- uint32_t fieldrate_denom; +- uint32_t fields_per_frame; +- uint32_t transform; +-} GET_MODES_DATA_T; +- +-typedef struct { +- int32_t response; +- uint32_t width; +- uint32_t height; +- uint32_t transform; +- uint32_t input_format; +-} GET_INFO_DATA_T; +- +-//Attributes changes flag mask +-#define ELEMENT_CHANGE_LAYER (1<<0) +-#define ELEMENT_CHANGE_OPACITY (1<<1) +-#define ELEMENT_CHANGE_DEST_RECT (1<<2) +-#define ELEMENT_CHANGE_SRC_RECT (1<<3) +-#define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) +-#define ELEMENT_CHANGE_TRANSFORM (1<<5) +- +-#endif ++struct wl_dispmanx_client_buffer *allocate_wl_buffer(struct wl_egl_window *window, KHRN_IMAGE_FORMAT_T color); +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index 234da65..024f3ed 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -153,6 +153,10 @@ by an attribute value" + #include + #include + ++#ifdef BUILD_WAYLAND ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#endif + + #include "interface/khronos/egl/egl_client_cr.c" + +@@ -162,17 +166,6 @@ static void egl_current_release(CLIENT_PROCESS_STATE_T *process, EGL_CURRENT_T * + void egl_gl_flush_callback(bool wait); + void egl_vg_flush_callback(bool wait); + +-#include "interface/vmcs_host/vc_dispmanx_types.h" +-/**HACKHACK - give us the ability to inject a DispmanX +- * resource handle into the CreateWindowSurface and +- * SwapBuffers calls */ +-static DISPMANX_RESOURCE_HANDLE_T next_resource_handle; +- +-EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle) +-{ +- next_resource_handle = handle; +-} +- + /* + TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate) + Also affects global image (and possibly others?) +@@ -451,6 +444,9 @@ EGLAPI const char EGLAPIENTRY * eglQueryString(EGLDisplay dpy, EGLint name) + "EGL_KHR_fence_sync " + #endif + #endif ++#if EGL_WL_bind_wayland_display ++ "EGL_WL_bind_wayland_display " ++#endif + ; + break; + case EGL_VENDOR: +@@ -655,8 +651,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- 0, 0, +- next_resource_handle); ++ 0, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -901,7 +896,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig + mipmap_texture, + texture_format, + texture_target, +- 0, 0, 0); ++ 0, 0); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -1043,7 +1038,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig c + false, + EGL_NO_TEXTURE, + EGL_NO_TEXTURE, +- pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0); ++ pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle); + + if (surface) { + if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) { +@@ -2245,6 +2240,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + CLIENT_THREAD_STATE_T *thread; + CLIENT_PROCESS_STATE_T *process; + EGLBoolean result; ++#ifdef BUILD_WAYLAND ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++#endif + + vcos_log_trace("eglSwapBuffers start. dpy=%d. surf=%d.", (int)dpy, (int)surf); + +@@ -2315,18 +2313,58 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + + vcos_log_trace("eglSwapBuffers server call"); + +- if (next_resource_handle) +- RPC_CALL7(eglIntSwapBuffers_impl, +- thread, +- EGLINTSWAPBUFFERS_ID_V2, +- RPC_UINT(surface->serverbuffer), +- RPC_UINT(surface->width), +- RPC_UINT(surface->height), +- RPC_UINT(surface->internal_handle), +- RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), +- RPC_UINT(khrn_platform_get_window_position(surface->win)), +- RPC_INT(next_resource_handle)); +- else ++#ifdef BUILD_WAYLAND ++ if (wl_display) { ++ struct wl_egl_window *wl_egl_window = surface->wl_egl_window; ++ struct wl_dispmanx_client_buffer *buffer_temp; ++ uint32_t configid; ++ KHRN_IMAGE_FORMAT_T color; ++ int ret = 0; ++ ++ buffer_temp = surface->front_wl_buffer; ++ surface->front_wl_buffer = surface->back_wl_buffer; ++ surface->back_wl_buffer = buffer_temp; ++ ++ configid = egl_config_to_id(surface->config); ++ color = egl_config_get_color_format(configid); ++ ++ if (surface->back_wl_buffer == NULL) ++ surface->back_wl_buffer = allocate_wl_buffer(wl_egl_window, color); ++ else if (surface->back_wl_buffer->width != width || ++ surface->back_wl_buffer->height != height) { ++ ++ struct wl_dispmanx_client_buffer *buffer; ++ ++ wl_buffer_destroy(surface->back_wl_buffer->wl_buffer); ++ free(surface->back_wl_buffer); ++ ++ buffer = allocate_wl_buffer(wl_egl_window, color); ++ surface->back_wl_buffer = buffer; ++ } ++ ++ RPC_CALL7(eglIntSwapBuffers_impl, ++ thread, ++ EGLINTSWAPBUFFERS_ID_V2, ++ RPC_UINT(surface->serverbuffer), ++ RPC_UINT(surface->width), ++ RPC_UINT(surface->height), ++ RPC_UINT(surface->internal_handle), ++ RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0), ++ RPC_UINT(khrn_platform_get_window_position(surface->win)), ++ RPC_INT(surface->back_wl_buffer->resource)); ++ ++ surface->front_wl_buffer->in_use = 1; ++ wl_surface_attach(wl_egl_window->wl_surface, ++ surface->front_wl_buffer->wl_buffer, ++ 0, 0); ++ wl_surface_damage(wl_egl_window->wl_surface, 0, 0, ++ surface->width, surface->height); ++ wl_surface_commit(wl_egl_window->wl_surface); ++ ++ while(ret != -1 && surface->back_wl_buffer->in_use) ++ ret = wl_display_dispatch_queue(wl_display, process->wl_queue); ++ } else ++#endif + RPC_CALL6(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID, +diff --git a/interface/khronos/egl/egl_client_get_proc.c b/interface/khronos/egl/egl_client_get_proc.c +index 4cfa9ff..6a715af 100644 +--- a/interface/khronos/egl/egl_client_get_proc.c ++++ b/interface/khronos/egl/egl_client_get_proc.c +@@ -254,6 +254,17 @@ EGLAPI void EGLAPIENTRY (* eglGetProcAddress(const char *procname))(void) + return (void(*)(void))eglQueryGlobalImageBRCM; + #endif + ++#ifdef BUILD_WAYLAND ++#if EGL_WL_bind_wayland_display ++ if (!strcmp(procname, "eglBindWaylandDisplayWL")) ++ return (void(*)(void))eglBindWaylandDisplayWL; ++ if (!strcmp(procname, "eglUnbindWaylandDisplayWL")) ++ return (void(*)(void))eglUnbindWaylandDisplayWL; ++ if (!strcmp(procname, "eglQueryWaylandBufferWL")) ++ return (void(*)(void))eglQueryWaylandBufferWL; ++#endif ++#endif ++ + return (void(*)(void)) NULL; + } + +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 0dc10e2..49cf7e5 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -46,6 +46,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "interface/khronos/egl/egl_int_impl.h" + #endif + ++#ifdef BUILD_WAYLAND ++#include "interface/khronos/wayland-egl/wayland-egl-priv.h" ++#include "interface/khronos/common/linux/khrn_wayland.h" ++#endif ++ + #include + + +@@ -314,8 +319,7 @@ EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle, +- DISPMANX_RESOURCE_HANDLE_T next_resource_handle) ++ const uint32_t *pixmap_server_handle) + { + KHRN_IMAGE_FORMAT_T color; + KHRN_IMAGE_FORMAT_T depth; +@@ -326,6 +330,10 @@ EGL_SURFACE_T *egl_surface_create( + EGLint config_depth_bits; + EGLint config_stencil_bits; + CLIENT_THREAD_STATE_T *thread = CLIENT_GET_THREAD_STATE(); ++#ifdef BUILD_WAYLAND ++ struct wl_display *wl_display = khrn_platform_get_wl_display(); ++ DISPMANX_RESOURCE_HANDLE_T resource; ++#endif + + EGL_SURFACE_T *surface = egl_surface_pool_alloc(); + +@@ -390,6 +398,18 @@ EGL_SURFACE_T *egl_surface_create( + + vcos_assert(color != IMAGE_FORMAT_INVALID); + ++#ifdef BUILD_WAYLAND ++ if (type == WINDOW && wl_display) { ++ surface->wl_egl_window = (struct wl_egl_window*)win; ++ surface->back_wl_buffer = allocate_wl_buffer( ++ surface->wl_egl_window, color); ++ resource = surface->back_wl_buffer->resource; ++ } else { ++ surface->wl_egl_window = NULL; ++ resource = DISPMANX_NO_HANDLE; ++ } ++#endif ++ + #ifdef KHRONOS_EGL_PLATFORM_OPENWFC + // Create stream for this window + if(type != PBUFFER) +@@ -474,7 +494,8 @@ EGL_SURFACE_T *egl_surface_create( + #endif + uint32_t results[3]; + +- if (next_resource_handle) ++#ifdef BUILD_WAYLAND ++ if (resource != DISPMANX_NO_HANDLE) + RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl, + thread, + EGLINTCREATESURFACE_ID_V2, +@@ -492,9 +513,10 @@ EGL_SURFACE_T *egl_surface_create( + RPC_UINT(config_stencil_bits), + RPC_UINT(sem_name), + RPC_UINT(type), +- RPC_INT(next_resource_handle), ++ RPC_INT(resource), + results); + else ++#endif + RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl, + thread, + EGLINTCREATESURFACE_ID, +@@ -663,6 +685,18 @@ void egl_surface_free(EGL_SURFACE_T *surface) + if( surface->type == WINDOW ) { + vcos_log_trace("egl_surface_free: calling platform_destroy_winhandle..."); + platform_destroy_winhandle( surface->win, surface->internal_handle ); ++ ++#ifdef BUILD_WAYLAND ++ if (surface->back_wl_buffer) { ++ wl_buffer_destroy(surface->back_wl_buffer->wl_buffer); ++ free(surface->back_wl_buffer); ++ } ++ ++ if (surface->front_wl_buffer) { ++ wl_buffer_destroy(surface->front_wl_buffer->wl_buffer); ++ free(surface->front_wl_buffer); ++ } ++#endif + } + /* return value ignored -- read performed to ensure blocking. we want this to + * block so clients can safely destroy the surface's window as soon as the +diff --git a/interface/khronos/egl/egl_client_surface.h b/interface/khronos/egl/egl_client_surface.h +index b5bf70a..e328b77 100644 +--- a/interface/khronos/egl/egl_client_surface.h ++++ b/interface/khronos/egl/egl_client_surface.h +@@ -288,6 +288,41 @@ typedef struct { + type == PIXMAP + */ + bool server_owned; ++ ++#ifdef BUILD_WAYLAND ++ /* ++ wl_egl_window ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ wayland EGL window ++ */ ++ struct wl_egl_window *wl_egl_window; ++ ++ /* ++ front_wl_buffer ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ client-side information about the wl_buffer in the front ++ */ ++ struct wl_dispmanx_client_buffer *front_wl_buffer; ++ ++ /* ++ back_wl_buffer ++ ++ Validity: ++ type == WINDOW ++ ++ Invariant: ++ client-side information about the wl_buffer in the back ++ */ ++ struct wl_dispmanx_client_buffer *back_wl_buffer; ++#endif + } EGL_SURFACE_T; + + extern bool egl_surface_check_attribs( +@@ -322,8 +357,7 @@ extern EGL_SURFACE_T *egl_surface_create( + EGLenum texture_format, + EGLenum texture_target, + EGLNativePixmapType pixmap, +- const uint32_t *pixmap_server_handle, +- DISPMANX_RESOURCE_HANDLE_T next_resource_handle); ++ const uint32_t *pixmap_server_handle); + extern EGL_SURFACE_T *egl_surface_from_vg_image( + VGImage vg_handle, + EGLSurface name, +diff --git a/interface/khronos/egl/egl_int_impl.h b/interface/khronos/egl/egl_int_impl.h +index 51b3580..6863a3b 100644 +--- a/interface/khronos/egl/egl_int_impl.h ++++ b/interface/khronos/egl/egl_int_impl.h +@@ -57,7 +57,7 @@ FN(int, eglIntCreateSurface_impl, ( + uint32_t sem, + uint32_t type, + uint32_t *results, +- DISPMANX_RESOURCE_HANDLE_T next_resource_handle)) ++ DISPMANX_RESOURCE_HANDLE_T resource_handle)) + + FN(int, eglIntCreatePbufferFromVGImage_impl, ( + VGImage vg_handle, +diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c +new file mode 100644 +index 0000000..5730743 +--- /dev/null ++++ b/interface/khronos/ext/egl_wayland.c +@@ -0,0 +1,246 @@ ++/* ++Copyright (c) 2013, Raspberry Pi Foundation ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. ++*/ ++ ++#include "interface/khronos/common/khrn_client_mangle.h" ++#include "interface/khronos/common/khrn_client_rpc.h" ++ ++#include "interface/khronos/ext/egl_khr_sync_client.h" ++#include "interface/khronos/include/EGL/egl.h" ++#include "interface/khronos/include/EGL/eglext.h" ++ ++#include "interface/vmcs_host/vc_vchi_dispmanx.h" ++ ++#include ++#include "interface/khronos/wayland-dispmanx-server-protocol.h" ++ ++static void ++destroy_buffer(struct wl_resource *resource) ++{ ++ struct wl_dispmanx_server_buffer *buffer = wl_resource_get_user_data(resource); ++ ++ if(!buffer->in_use) ++ vc_dispmanx_resource_delete(buffer->handle); ++ ++ free(buffer); ++} ++ ++static void ++buffer_destroy(struct wl_client *client, struct wl_resource *resource) ++{ ++ wl_resource_destroy(resource); ++} ++ ++static const struct wl_buffer_interface dispmanx_buffer_interface = { ++ buffer_destroy ++}; ++ ++static VC_IMAGE_TYPE_T ++get_vc_format(enum wl_dispmanx_format format) ++{ ++ /* XXX: The app is likely to have been premultiplying in its shaders, ++ * but the VC scanout hardware on the RPi cannot mix premultiplied alpha ++ * channel with the element's alpha. ++ */ ++ switch (format) { ++ case WL_DISPMANX_FORMAT_ABGR8888: ++ return VC_IMAGE_RGBA32; ++ case WL_DISPMANX_FORMAT_XBGR8888: ++ return VC_IMAGE_BGRX8888; ++ case WL_DISPMANX_FORMAT_RGB565: ++ return VC_IMAGE_RGB565; ++ default: ++ /* invalid format */ ++ return VC_IMAGE_MIN; ++ } ++} ++ ++static void ++dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource, ++ uint32_t id, int32_t width, int32_t height, ++ uint32_t stride, uint32_t buffer_height, uint32_t format) ++{ ++ struct wl_dispmanx_server_buffer *buffer; ++ VC_IMAGE_TYPE_T vc_format = get_vc_format(format); ++ uint32_t dummy; ++ ++ if(vc_format == VC_IMAGE_MIN) { ++ wl_resource_post_error(resource, ++ WL_DISPMANX_ERROR_INVALID_FORMAT, ++ "invalid format"); ++ return; ++ } ++ ++ buffer = calloc(1, sizeof *buffer); ++ if (buffer == NULL) { ++ wl_resource_post_no_memory(resource); ++ return; ++ } ++ ++ buffer->handle = vc_dispmanx_resource_create(vc_format, ++ width | (stride << 16), ++ height | (buffer_height << 16), ++ &dummy); ++ if(buffer->handle == DISPMANX_NO_HANDLE) { ++ wl_resource_post_error(resource, ++ WL_DISPMANX_ERROR_ALLOC_FAILED, ++ "allocation failed"); ++ free(buffer); ++ return; ++ } ++ ++ buffer->width = width; ++ buffer->height = height; ++ buffer->format = format; ++ ++ buffer->resource = wl_resource_create(resource->client, &wl_buffer_interface, ++ 1, id); ++ if (!buffer->resource) { ++ wl_resource_post_no_memory(resource); ++ vc_dispmanx_resource_delete(buffer->handle); ++ free(buffer); ++ return; ++ } ++ ++ wl_resource_set_implementation(buffer->resource, ++ (void (**)(void)) &dispmanx_buffer_interface, ++ buffer, destroy_buffer); ++ ++ wl_dispmanx_send_buffer_allocated(resource, buffer->resource, ++ buffer->handle); ++} ++ ++static const struct wl_dispmanx_interface dispmanx_interface = { ++ dispmanx_create_buffer, ++}; ++ ++static void ++bind_dispmanx(struct wl_client *client, void *data, uint32_t version, uint32_t id) ++{ ++ struct wl_resource *resource; ++ ++ resource = wl_resource_create(client, &wl_dispmanx_interface, 1, id); ++ wl_resource_set_implementation(resource, &dispmanx_interface, NULL, NULL); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_ARGB8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_XRGB8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_ABGR8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_XBGR8888); ++ ++ wl_resource_post_event(resource, WL_DISPMANX_FORMAT, ++ WL_DISPMANX_FORMAT_RGB565); ++} ++ ++EGLBoolean EGLAPIENTRY ++eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) ++{ ++ CLIENT_THREAD_STATE_T *thread; ++ CLIENT_PROCESS_STATE_T *process; ++ ++ if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) ++ return EGL_FALSE; ++ ++ if (process->wl_global != NULL) ++ goto error; ++ ++ process->wl_global = wl_global_create(display, &wl_dispmanx_interface, 1, ++ NULL, bind_dispmanx); ++ if (process->wl_global == NULL) ++ goto error; ++ ++ return EGL_TRUE; ++ ++error: ++ CLIENT_UNLOCK(); ++ return EGL_FALSE; ++} ++ ++EGLBoolean EGLAPIENTRY ++eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) ++{ ++ CLIENT_THREAD_STATE_T *thread; ++ CLIENT_PROCESS_STATE_T *process; ++ ++ if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) ++ return EGL_FALSE; ++ ++ wl_global_destroy(process->wl_global); ++ process->wl_global = NULL; ++ ++ CLIENT_UNLOCK(); ++ ++ return EGL_TRUE; ++} ++ ++static int ++get_egl_format(enum wl_dispmanx_format format) ++{ ++ switch (format) { ++ case WL_DISPMANX_FORMAT_ABGR8888: ++ return EGL_TEXTURE_RGBA; ++ case WL_DISPMANX_FORMAT_XBGR8888: ++ return EGL_TEXTURE_RGB; ++ case WL_DISPMANX_FORMAT_RGB565: ++ return EGL_TEXTURE_RGB; ++ default: ++ /* invalid format */ ++ return EGL_NO_TEXTURE; ++ } ++} ++ ++EGLBoolean EGLAPIENTRY ++eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *_buffer, ++ EGLint attribute, EGLint *value) ++{ ++ struct wl_dispmanx_server_buffer *buffer = wl_resource_get_user_data(_buffer); ++ ++ if (wl_resource_instance_of(_buffer, &wl_dispmanx_interface, ++ &dispmanx_buffer_interface)) ++ return EGL_FALSE; ++ ++ switch (attribute) { ++ case EGL_TEXTURE_FORMAT: ++ *value = get_egl_format(buffer->format); ++ if (*value == EGL_NO_TEXTURE) ++ return EGL_FALSE; ++ return EGL_TRUE; ++ case EGL_WIDTH: ++ *value = buffer->width; ++ return EGL_TRUE; ++ case EGL_HEIGHT: ++ *value = buffer->height; ++ return EGL_TRUE; ++ } ++ ++ return EGL_FALSE; ++} +diff --git a/interface/khronos/include/EGL/eglext.h b/interface/khronos/include/EGL/eglext.h +index 89a3369..d7e5ba7 100755 +--- a/interface/khronos/include/EGL/eglext.h ++++ b/interface/khronos/include/EGL/eglext.h +@@ -191,6 +191,29 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EG + #endif + + ++#ifndef EGL_WL_bind_wayland_display ++#define EGL_WL_bind_wayland_display 1 ++ ++#define EGL_WAYLAND_BUFFER_WL 0x31D5 /* eglCreateImageKHR target */ ++#define EGL_WAYLAND_PLANE_WL 0x31D6 /* eglCreateImageKHR target */ ++#define EGL_TEXTURE_Y_U_V_WL 0x31D7 ++#define EGL_TEXTURE_Y_UV_WL 0x31D8 ++#define EGL_TEXTURE_Y_XUXV_WL 0x31D9 ++ ++struct wl_display; ++struct wl_resource; ++#ifdef EGL_EGLEXT_PROTOTYPES ++EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); ++EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); ++EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); ++#endif ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display); ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display); ++typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); ++ ++#endif ++ ++ + #ifdef __cplusplus + } + #endif +diff --git a/interface/khronos/wayland-egl/wayland-egl-priv.h b/interface/khronos/wayland-egl/wayland-egl-priv.h +new file mode 100644 +index 0000000..8e38d36 +--- /dev/null ++++ b/interface/khronos/wayland-egl/wayland-egl-priv.h +@@ -0,0 +1,53 @@ ++/* Copied from Mesa */ ++ ++#ifndef _WAYLAND_EGL_PRIV_H ++#define _WAYLAND_EGL_PRIV_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* GCC visibility */ ++#if defined(__GNUC__) && __GNUC__ >= 4 ++#define WL_EGL_EXPORT __attribute__ ((visibility("default"))) ++#else ++#define WL_EGL_EXPORT ++#endif ++ ++#include "interface/vmcs_host/vc_dispmanx.h" ++#include "interface/khronos/egl/egl_client_surface.h" ++ ++#include ++ ++struct wl_dispmanx_client_buffer { ++ struct wl_buffer *wl_buffer; ++ DISPMANX_RESOURCE_HANDLE_T resource; ++ ++ int pending_allocation; ++ int in_use; ++ int width; ++ int height; ++}; ++ ++struct wl_egl_window { ++ struct wl_surface *wl_surface; ++ ++ int width; ++ int height; ++ int dx; ++ int dy; ++ ++ int attached_width; ++ int attached_height; ++ ++ /* XXX: The VC side seems to expect a valid element handle to be ++ passed to eglIntCreateSurface_impl and/or eglIntSwapBuffers_impl, ++ even for host-managed surfaces. */ ++ DISPMANX_ELEMENT_HANDLE_T dummy_element; ++}; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/interface/khronos/wayland-egl/wayland-egl.c b/interface/khronos/wayland-egl/wayland-egl.c +new file mode 100644 +index 0000000..b8f050b +--- /dev/null ++++ b/interface/khronos/wayland-egl/wayland-egl.c +@@ -0,0 +1,59 @@ ++/* Copied from Mesa */ ++ ++#include ++ ++#include ++#include ++#include "wayland-egl-priv.h" ++ ++WL_EGL_EXPORT void ++wl_egl_window_resize(struct wl_egl_window *egl_window, ++ int width, int height, ++ int dx, int dy) ++{ ++ if (egl_window->width == width && ++ egl_window->height == height && ++ egl_window->dx == dx && ++ egl_window->dy == dy) ++ return; ++ ++ egl_window->width = width; ++ egl_window->height = height; ++ egl_window->dx = dx; ++ egl_window->dy = dy; ++} ++ ++WL_EGL_EXPORT struct wl_egl_window * ++wl_egl_window_create(struct wl_surface *surface, ++ int width, int height) ++{ ++ struct wl_egl_window *egl_window; ++ ++ egl_window = calloc(1, sizeof *egl_window); ++ if (!egl_window) ++ return NULL; ++ ++ egl_window->wl_surface = surface; ++ wl_egl_window_resize(egl_window, width, height, 0, 0); ++ egl_window->attached_width = 0; ++ egl_window->attached_height = 0; ++ egl_window->dummy_element = PLATFORM_WIN_NONE; ++ ++ return egl_window; ++} ++ ++WL_EGL_EXPORT void ++wl_egl_window_destroy(struct wl_egl_window *egl_window) ++{ ++ free(egl_window); ++} ++ ++WL_EGL_EXPORT void ++wl_egl_window_get_attached_size(struct wl_egl_window *egl_window, ++ int *width, int *height) ++{ ++ if (width) ++ *width = egl_window->attached_width; ++ if (height) ++ *height = egl_window->attached_height; ++} +diff --git a/interface/khronos/wayland-egl/wayland-egl.pc.in b/interface/khronos/wayland-egl/wayland-egl.pc.in +new file mode 100644 +index 0000000..8bafc15 +--- /dev/null ++++ b/interface/khronos/wayland-egl/wayland-egl.pc.in +@@ -0,0 +1,10 @@ ++prefix=@CMAKE_INSTALL_PREFIX@ ++exec_prefix=${prefix} ++libdir=${exec_prefix}/lib ++includedir=${prefix}/include ++ ++Name: wayland-egl ++Description: VideoCore wayland-egl library ++Version: @PROJECT_APIVER@ ++Libs: -L${libdir} -lwayland-egl ++Cflags: -I${includedir} +diff --git a/interface/vmcs_host/CMakeLists.txt b/interface/vmcs_host/CMakeLists.txt +index e0c6e13..35150ed 100755 +--- a/interface/vmcs_host/CMakeLists.txt ++++ b/interface/vmcs_host/CMakeLists.txt +@@ -9,13 +9,24 @@ add_definitions(-fno-strict-aliasing) + + include_directories(${VMCS_TARGET}/vcfiled) + +-add_library(vchostif +- ${VMCS_TARGET}/vcfilesys.c ${VMCS_TARGET}/vcmisc.c +- vc_vchi_gencmd.c vc_vchi_filesys.c +- vc_vchi_tvservice.c vc_vchi_cecservice.c +- vc_vchi_dispmanx.c vc_service_common.c) ++set(VCHOSTIF_SOURCE ++ ${VMCS_TARGET}/vcfilesys.c ${VMCS_TARGET}/vcmisc.c ++ vc_vchi_gencmd.c vc_vchi_filesys.c ++ vc_vchi_tvservice.c vc_vchi_cecservice.c ++ vc_vchi_dispmanx.c vc_service_common.c) + # ${VMCS_TARGET}/vmcs_main.c + # vc_vchi_haud.c ++ ++if (BUILD_WAYLAND) ++wayland_add_protocol_server( ++ VCHOSTIF_SOURCE ++ ../../interface/wayland/dispmanx.xml ++ dispmanx ++) ++endif () ++ ++add_library(vchostif ${VCHOSTIF_SOURCE}) ++ + #add_library(bufman vc_vchi_bufman.c ) + + # OpenMAX/IL component service +diff --git a/interface/vmcs_host/vc_dispmanx.h b/interface/vmcs_host/vc_dispmanx.h +index 37fdae1..fe3619a 100755 +--- a/interface/vmcs_host/vc_dispmanx.h ++++ b/interface/vmcs_host/vc_dispmanx.h +@@ -39,6 +39,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #ifdef __cplusplus + extern "C" { + #endif ++ ++#ifdef BUILD_WAYLAND ++struct wl_resource; ++#endif ++ + // Same function as above, to aid migration of code. + VCHPRE_ int VCHPOST_ vc_dispman_init( void ); + // Stop the service from being used +@@ -135,6 +140,11 @@ VCHPRE_ int VCHPOST_ vc_dispmanx_resource_set_palette( DISPMANX_RESOURCE_HANDLE_ + // Start triggering callbacks synced to vsync + VCHPRE_ int VCHPOST_ vc_dispmanx_vsync_callback( DISPMANX_DISPLAY_HANDLE_T display, DISPMANX_CALLBACK_FUNC_T cb_func, void *cb_arg ); + ++#ifdef BUILD_WAYLAND ++VCHPRE_ DISPMANX_RESOURCE_HANDLE_T VCHPOST_ vc_dispmanx_get_handle_from_wl_buffer( struct wl_resource *_buffer ); ++ ++VCHPRE_ void VCHPOST_ vc_dispmanx_set_wl_buffer_in_use( struct wl_resource *_buffer, int in_use ); ++#endif + #ifdef __cplusplus + } + #endif +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.c b/interface/vmcs_host/vc_vchi_dispmanx.c +index d188068..3e668f5 100755 +--- a/interface/vmcs_host/vc_vchi_dispmanx.c ++++ b/interface/vmcs_host/vc_vchi_dispmanx.c +@@ -1316,3 +1316,45 @@ static void *dispmanx_notify_func( void *arg ) { + } + return 0; + } ++ ++ ++#ifdef BUILD_WAYLAND ++/*********************************************************** ++ * Name: vc_dispmanx_get_handle_from_wl_buffer ++ * ++ * Arguments: ++ * struct wl_resource *_buffer ++ * ++ * Description: Return the handle of the resource associated to this Wayland buffer ++ * ++ * Returns: A resource handle ++ * ++ ***********************************************************/ ++VCHPRE_ DISPMANX_RESOURCE_HANDLE_T VCHPOST_ vc_dispmanx_get_handle_from_wl_buffer( struct wl_resource *_buffer ) ++{ ++ struct wl_dispmanx_server_buffer *buffer = (struct wl_dispmanx_server_buffer*)_buffer->data; ++ if (!buffer) ++ return DISPMANX_NO_HANDLE; ++ ++ return buffer->handle; ++} ++ ++/*********************************************************** ++ * Name: vc_dispmanx_set_wl_buffer_in_use ++ * ++ * Arguments: ++ * struct wl_resource *_buffer ++ * int in_use ++ * ++ * Description: Mark this Wayland buffer as being in use by the compositor ++ * ++ ***********************************************************/ ++VCHPRE_ void VCHPOST_ vc_dispmanx_set_wl_buffer_in_use( struct wl_resource *_buffer, int in_use ) ++{ ++ struct wl_dispmanx_server_buffer *buffer = (struct wl_dispmanx_server_buffer*)_buffer->data; ++ if (!buffer) ++ return; ++ ++ buffer->in_use = in_use; ++} ++#endif +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.h b/interface/vmcs_host/vc_vchi_dispmanx.h +index b723b76..f0bae30 100644 +--- a/interface/vmcs_host/vc_vchi_dispmanx.h ++++ b/interface/vmcs_host/vc_vchi_dispmanx.h +@@ -66,4 +66,19 @@ typedef struct { + #define ELEMENT_CHANGE_MASK_RESOURCE (1<<4) + #define ELEMENT_CHANGE_TRANSFORM (1<<5) + ++#ifdef BUILD_WAYLAND ++/* XXX: This should be in a private header that can be included from EGL and vc_* */ ++#include ++#include "interface/vmcs_host/wayland-dispmanx-server-protocol.h" ++struct wl_dispmanx_server_buffer { ++ struct wl_resource *resource; ++ struct wl_dispmanx *dispmanx; ++ enum wl_dispmanx_format format; ++ DISPMANX_RESOURCE_HANDLE_T handle; ++ int32_t width; ++ int32_t height; ++ int in_use; ++}; ++#endif ++ + #endif +diff --git a/interface/wayland/dispmanx.xml b/interface/wayland/dispmanx.xml +new file mode 100644 +index 0000000..c18626d +--- /dev/null ++++ b/interface/wayland/dispmanx.xml +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ Copyright © 2008-2011 Kristian Høgsberg ++ Copyright © 2010-2011 Intel Corporation ++ Copyright © 2013 Raspberry Pi Foundation ++ ++ Permission to use, copy, modify, distribute, and sell this ++ software and its documentation for any purpose is hereby granted ++ without fee, provided that\n the above copyright notice appear in ++ all copies and that both that copyright notice and this permission ++ notice appear in supporting documentation, and that the name of ++ the copyright holders not be used in advertising or publicity ++ pertaining to distribution of the software without specific, ++ written prior permission. The copyright holders make no ++ representations about the suitability of this software for any ++ purpose. It is provided "as is" without express or implied ++ warranty. ++ ++ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS ++ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND ++ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ++ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ++ THIS SOFTWARE. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/makefiles/cmake/Wayland.cmake b/makefiles/cmake/Wayland.cmake +new file mode 100644 +index 0000000..ad90d30 +--- /dev/null ++++ b/makefiles/cmake/Wayland.cmake +@@ -0,0 +1,72 @@ ++#============================================================================= ++# Copyright (C) 2012-2013 Pier Luigi Fiorini ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions ++# are met: ++# ++# * Redistributions of source code must retain the above copyright ++# notice, this list of conditions and the following disclaimer. ++# ++# * Redistributions in binary form must reproduce the above copyright ++# notice, this list of conditions and the following disclaimer in the ++# documentation and/or other materials provided with the distribution. ++# ++# * Neither the name of Pier Luigi Fiorini nor the names of his ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++# HOLDER 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. ++#============================================================================= ++ ++find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner) ++ ++# wayland_add_protocol_client(outfiles inputfile basename) ++function(WAYLAND_ADD_PROTOCOL_CLIENT _sources _protocol _basename) ++ if(NOT WAYLAND_SCANNER_EXECUTABLE) ++ message(FATAL "The wayland-scanner executable has nto been found on your system. You must install it.") ++ endif() ++ ++ get_filename_component(_infile ${_protocol} ABSOLUTE) ++ set(_client_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-client-protocol.h") ++ set(_code "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-protocol.c") ++ ++ add_custom_command(OUTPUT "${_client_header}" ++ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header < ${_infile} > ${_client_header} ++ DEPENDS ${_infile} VERBATIM) ++ ++ add_custom_command(OUTPUT "${_code}" ++ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} code < ${_infile} > ${_code} ++ DEPENDS ${_infile} VERBATIM) ++ ++ list(APPEND ${_sources} "${_client_header}" "${_code}") ++ set(${_sources} ${${_sources}} PARENT_SCOPE) ++endfunction() ++ ++# wayland_add_protocol_server(outfiles inputfile basename) ++function(WAYLAND_ADD_PROTOCOL_SERVER _sources _protocol _basename) ++ if(NOT WAYLAND_SCANNER_EXECUTABLE) ++ message(FATAL "The wayland-scanner executable has nto been found on your system. You must install it.") ++ endif() ++ ++ get_filename_component(_infile ${_protocol} ABSOLUTE) ++ set(_server_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-server-protocol.h") ++ ++ add_custom_command(OUTPUT "${_server_header}" ++ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} server-header < ${_infile} > ${_server_header} ++ DEPENDS ${_infile} VERBATIM) ++ ++ list(APPEND ${_sources} "${_server_header}") ++ set(${_sources} ${${_sources}} PARENT_SCOPE) ++endfunction() +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0003-wayland-Add-Wayland-example.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0003-wayland-Add-Wayland-example.patch new file mode 100644 index 000000000..11befc371 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0003-wayland-Add-Wayland-example.patch @@ -0,0 +1,866 @@ +From b6ee187184456d66095146e3dc06b6baa29c17d7 Mon Sep 17 00:00:00 2001 +From: Tomeu Vizoso +Date: Tue, 1 Oct 2013 13:19:20 +0200 +Subject: [PATCH 03/13] wayland: Add Wayland example + +--- + .../linux/apps/hello_pi/CMakeLists.txt | 1 + + .../apps/hello_pi/hello_wayland/CMakeLists.txt | 8 + + .../apps/hello_pi/hello_wayland/Djenne_128_128.raw | 3 + + .../linux/apps/hello_pi/hello_wayland/Makefile | 5 + + .../hello_wayland/cube_texture_and_coords.h | 100 ++++ + .../linux/apps/hello_pi/hello_wayland/triangle.c | 666 +++++++++++++++++++++ + host_applications/linux/apps/hello_pi/rebuild.sh | 3 +- + 7 files changed, 785 insertions(+), 1 deletion(-) + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Makefile + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h + create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/triangle.c + +diff --git a/host_applications/linux/apps/hello_pi/CMakeLists.txt b/host_applications/linux/apps/hello_pi/CMakeLists.txt +index f2c6aef..0df78f7 100644 +--- a/host_applications/linux/apps/hello_pi/CMakeLists.txt ++++ b/host_applications/linux/apps/hello_pi/CMakeLists.txt +@@ -21,6 +21,7 @@ add_subdirectory(hello_encode) + add_subdirectory(hello_jpeg) + add_subdirectory(hello_videocube) + add_subdirectory(hello_teapot) ++add_subdirectory(hello_wayland) + + if(BUILD_FONT) + set(VGFONT_SRCS libs/vgfont/font.c libs/vgfont/vgft.c libs/vgfont/graphics.c) +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt +new file mode 100644 +index 0000000..9a2f75c +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt +@@ -0,0 +1,8 @@ ++set(EXEC hello_wayland.bin) ++set(SRCS triangle.c) ++ ++add_executable(${EXEC} ${SRCS}) ++target_link_libraries(${EXEC} ${HELLO_PI_LIBS} -lwayland-client -lwayland-egl) ++ ++install(TARGETS ${EXEC} ++ RUNTIME DESTINATION bin) +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw +new file mode 100644 +index 0000000..de9173c +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw +@@ -0,0 +1,3 @@ ++öÖ¿÷×À÷×ÀøØÁúÚÃúÚÃúÚÃúÚÃùÙÂùÙÂùÙÂùÙÂùÙÂùÙÂùÙÂùÙÂûÙÂûÙÂûÙÂûÙÂúØÁúØÁúØÁúØÁøÖ¿ù×Àù×ÀúØÁúØÁúØÁúØÁúØÁù×Àù×Àù×Àù×À÷Õ¾øÖ¿ù×Àù×À÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾öÔ½öÔ½÷Õ¾÷Õ¾÷Õ¾÷Õ¾õÓ¼öÔ½öÔ½õÓ¼ôÒ»ôÒ»ôÒ»ôÒ»õкõкõкõкõкõкõкõкôиõѹôиôиòζóÏ·óÏ·õѹñ͵óÏ·óÏ·ñ͵òζñ͵ñ͵ñ͵ñ͵ñ͵ðÌ´ðÌ´ðÌ´ï˳ï˳ï˳î˱î˱î˱î˱î˱î˱î˱íÊ°ïÊ°ïÊ°îɯîɯíÈ®ìÇ­ìÇ­ìÇ­ëƬëƬëƬêÅ«êÅ«êÅ«ëƬëƬèééĪéĪèéèéèéèéç¨ùÙÂúÚÃúÚÃûÛÄüÜÅüÜÅüÜÅüÜÅûÛÄûÛÄûÛÄûÛÄûÛÄûÛÄûÛÄûÛÄýÛÄýÛÄýÛÄýÛÄýÛÄýÛÄýÛÄýÛÄüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃûÙÂûÙÂûÙÂûÙÂúØÁúØÁúØÁúØÁù×Àù×Àù×Àù×ÀúØÁù×Àù×Àù×ÀøÖ¿øÖ¿øÖ¿øÖ¿øÖ¿øÖ¿øÖ¿÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾øÓ½øÓ½øÓ½øÓ½÷Ò¼÷Ò¼÷Ò¼÷Ò¼öÓº÷Ó»÷Ó»÷Ó»õѹöÒºöÒºöÒºôиõѹõѹôиôиôиôиóÏ·ôиóÏ·óÏ·óÏ·óÏ·òζòζòζñδñδñδñδñδñδðͳðͳòͳñ̲ñ̲ñ̲ð˱ïÊ°ïÊ°ïÊ°îɯîɯîɯíÈ®îɯíÈ®íÈ®ìÇ­ìÇ­íÈ®íÈ®ìÇ­ëƬëƬêÅ«êÅ«ûÛÄûÛÄûÛÄûÛÄüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅûÛÄûÛÄûÛÄûÛÄýÛÄýÛÄüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃûÙÂúØÁûÙÂûÙÂûÙÂûÙÂúØÁúØÁúØÁúØÁúØÁúØÁù×Àù×ÀøÖ¿øÖ¿øÖ¿øÖ¿øÖ¿ù×ÀøÖ¿÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾øÓ½øÓ½øÓ½øÓ½÷Ò¼÷Ò¼÷Ò¼÷Ò¼öÓº÷Ó»÷Ó»öÒºöÒºöÒºöÒºöÒºõѹõѹõѹõѹõѹõѹôиôиôиôиôиóÏ·óÏ·óÏ·òζòζñδñδñδñδñδñδðͳðͳòͳñ̲ñ̲ñ̲ð˱ð˱ïÊ°ïÊ°ïÊ°îɯîɯîɯïÊ°îɯíÈ®ìÇ­ìÇ­ìÇ­ìÇ­ëƬìÇ­ëƬëƬëƬüÜÅüÜÅüÜÅüÜÅýÝÆýÝÆýÝÆýÝÆüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅûÛÄûÛÄûÛÄûÛÄüÚÃýÛÄýÛÄýÛÄüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃüÚÃûÙÂûÙÂûÙÂûÙÂûÙÂûÙÂûÙÂûÙÂúØÁúØÁúØÁúØÁúØÁúØÁù×Àù×Àù×Àù×Àù×Àù×ÀøÖ¿ù×ÀøÖ¿÷Õ¾÷Õ¾÷Õ¾÷Õ¾÷Õ¾øÓ½øÓ½øÓ½øÓ½÷Ò¼÷Ò¼÷Ò¼÷Ò¼öÓº÷Ó»÷Ó»öÒº÷Ó»÷Ó»öÒºöÒºõѹôиõѹöÒºõѹõѹôиôиõѹôиôиôиóÏ·óÏ·óÏ·òζòϵòϵòϵòϵñδñδðͳðͳòͳñ̲ñ̲ñ̲ð˱ð˱ð˱ïÊ°ïÊ°ïÊ°îɯîɯîɯîɯîɯîɯíÈ®îɯîɯíÈ®ìÇ­ìÇ­ëƬëƬûÜÅüÝÆýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÛÄûÛÄûÛÄûÛÄüÜÅüÜÅüÜÅüÜÅûÛÄûÛÄûÛÄûÛÄúÚÃûÛÄûÛÄûÛÄýÛÃýÛÃýÛÃýÛÃüÚÂüÚÂüÚÂüÚÂüÚÃüÚÃüÚÃüÚÃûÙÂûÙÂûÙÂûÙÂúØÀúØÀúØÀù׿÷Õ½úØÀúØÀù׿øÖ¿øÖ¿øÖ¿÷Õ¾÷Õ¾ù×Àù×ÀöÔ¾øÔ¼øÔ¼ùÕ½úÖ¾õѹøÔ¼ùÕ½ùÕ½÷Ó»÷Ó»÷Ó»÷Ó»öÒºöÒºöÒºöÒºõѹõѹõѹõѹõѹõѹõѹõѹõѹõѹõѹõѹôиôиóÏ·óÏ·óжòϵòϵòϵñδñδðͳðͳñ̲ñ̲ñ̲ñ̲ñ̲ñ̲ð˱ð˱ð˱ð˱ð˱ïÊ°ïÊ°îɯîɯîɯïÊ°îɯîɯîɯìÇ­ìÇ­ìÇ­ëƬûÜÅüÝÆýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅûÛÄûÛÄüÜÅûÛÄýÛÃýÛÃýÛÃýÛÃýÛÃýÛÃýÛÃýÛÃýÛÄýÛÄýÛÄýÛÄüÚÃüÚÃüÚÃüÚÃüÚÂüÚÂüÚÂûÙÁúØÀúØÀúØÀù׿ù×Àù×Àù×ÀøÖ¿ù×Àù×Àù×À÷Õ¿úÖ¾úÖ¾û׿û׿øÔ¼ùÕ½ùÕ½øÔ¼ùÕ½ùÕ½ùÕ½ùÕ½øÔ¼øÔ¼øÔ¼øÔ¼÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»õѹõѹõѹõѹõѹôиôиôиóжóжóжòϵóжóжòϵòϵóδóδóδóδòͳñ̲ñ̲ñ̲ñ̲ñ̲ð˱ð˱ð˱ïÊ°ïÊ°ïÊ°ïÊ°ïÊ°îɯîɯîɯîɯîɯíÈ®üÝÆýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅýÝÆýÝÆýÝÆýÝÆûÛÄüÜÅüÜÅüÜÅþÜÄþÜÄþÜÄþÜÄýÛÃýÛÃýÛÃýÛÃýÛÄýÛÄýÛÄýÛÄýÛÄýÛÄýÛÄýÛÄüÚÂüÚÂüÚÂûÙÁüÚÂûÙÁûÙÁúØÀûÙÂûÙÂúØÁúØÁúØÁúØÁù×Àù×Àû׿û׿û׿û׿û׿úÖ¾ùÕ½ùÕ½ùÕ½ùÕ½ùÕ½ùÕ½øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»÷Ó»öÒºöÒºõѹõѹõÒ¸ôÑ·ôÑ·ôÑ·óжóжòϵòϵõжôϵôϵôϵóδóδòͳòͳòͳòͳòͳñ̲ñ̲ñ̲ð˱ð˱ð˱ð˱ð˱ïÊ°ïÊ°ïÊ°îɯíÈ®üÝÆýÞÇþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆýÝÆýÝÆýÝÆýÝÆüÜÅýÝÆýÝÆüÜÅÿÝÅÿÝÅÿÝÅÿÝÅþÜÄþÜÄþÜÄþÜÄþÜÅþÜÅþÜÅþÜÅýÛÄýÛÄýÛÄýÛÄþÜÄýÛÃýÛÃýÛÃüÚÂûÙÁûÙÁýÛÃüÚÃüÚÃüÚÃûÙÂüÚÃûÙÂúØÁûÙÂýÙÀüØÀüØÀû׿üØÀúÖ¾úÖ¾û׿úÖ¾úÖ¾úÖ¾úÖ¾ùÕ½ùÕ½ùÕ½ùÕ½ùÕ½ùÕ½ùÕ½ùÕ½øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼øÔ¼÷Ó»÷Ó»öÒºöÒºöÓ¹õÒ¸õÒ¸õÒ¸ôÑ·ôÑ·ôÑ·óжõжõжôϵóδôϵôϵóδóδóδóδóδòͳòͳòͳòͳñ̲ñ̲ñ̲ñ̲ð˱ð˱ñ̲ð˱ïÊ°ýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆýÞÇýÞÇýÞÇýÞÇüÝÆýÞÇýÞÇýÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆýÝÆýÝÆýÝÆýÝÆüÜÅüÜÅüÜÅüÜÅûÜÂüÝÄüÝÄûÜÃûÜÃûÜÃûÜÃûÜÃýÜÂýÜÂýÜÂýÜÂýÜÂýÜÂýÜÂýÜÂüÚÂüÚÂüÚÂüÚÂüÚÂüÚÂüÚÂüÚÂúÙ¿úÙ¿úÙ¿úÙ¿úÙ¿úÙ¿úÙ¿ùؾúØÁúØÁúØÁúØÁøÖ¿øÖ¿øÖ¿øÖ¿øÖ¾÷Õ½÷Õ½÷Õ½÷Õ½÷Õ½÷Õ½÷Õ½öÔ¼÷Õ½öÔ¼õÓ»õÓ»õÓ»õÓ»ôÒºóѹôÒºóѹòиóѹòиòиòиôиóÏ·óÏ·óÏ·ôиôиôиôиñÏ·ñÏ·ñÏ·ðζðζðζï͵ï͵ðͳðͳðͳï̲ï̲ï̲î˱î˱þßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇýÞÇþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÝÆýÝÆýÝÆýÝÆüÜÅüÜÅüÜÅüÜÅûÜÃüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄþÝÃþÝÃþÝÃþÝÃýÜÂýÜÂýÜÂýÜÂýÛÃýÛÃýÛÃýÛÃýÛÃýÛÃýÛÃýÛÃüÛÁüÛÁüÛÁüÛÁýÜÂýÜÂüÛÁüÜÁúØÁúØÁúØÁúØÁúØÁúØÁúØÁúØÁúØÀúØÀù׿ù׿øÖ¾øÖ¾øÖ¾øÖ¾÷Õ½øÖ¾÷Õ½öÔ¼øÖ¾÷Õ½÷Õ½öÔ¼öÔ¼öÔ¼õÓ»ôÒºõÓ»õÓ»ôÒºôÒºöÒºõѹõѹõѹóÏ·óÏ·óÏ·óÏ·ñÏ·ñÏ·ðζðζñÏ·ðζðζðζòϵòϵòϵñδñδñδðͳðͳþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈÿàÉþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆþÞÇþÞÇþÞÇþÞÇýÝÆýÝÆýÝÆýÝÆüÝÄýÞÅýÞÅüÝÄýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅüÝÄüÝÄüÝÄüÝÄûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃûÜÃúÚÃúÚÃúÚÃúÚÃùÙÂùÙÂùÙÂùÙÂøÚÀøÙÀøÙÀøÙÀ÷Ø¿÷Ø¿÷Ø¿÷Ø¿ù׿ù׿øÖ¾øÖ¾øÖ¾øÖ¾÷Õ½÷Õ½÷Õ½÷Õ½öÔ¼õÓ»õÓ»õÓ»õÓ»õÓ»öÒºöÒºõѹõѹôиôиôиôиòиòиñÏ·ñÏ·òиòиñÏ·ñÏ·òϵòϵòϵñδñδñδðͳðͳüàÈüàÈüàÈüàÈýáÉýáÉýáÉýáÉüàÈüàÈüàÈüàÈüàÈýáÉýáÉýáÉþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇÿßÈÿßÈÿßÈÿßÈþÞÇþÞÇþÞÇþÞÇýÞÅýÞÅþßÆýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄûÜÃûÜÃüÝÄüÝÄûÛÄûÛÄûÛÄûÛÄúÚÃúÚÃúÚÃúÚÃúÛÂúÛÂúÛÂùÚÁùÚÁùÚÁùÚÁùÚÁúØÀúØÀúØÀù׿úØÀù׿ù׿ù׿ù׿ù׿øÖ¾÷Õ½÷Õ½÷Õ½öÔ¼öÔ¼öÔ¼õÓ»õÓ»õÓ»ôÒºôÒºôÒºôÒºôÒºôÒºóѹóѹóѹóѹòиòиòÑ·ñжñжñжðϵðϵðϵïδüàÈüàÈýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄüÝÄýÞÅýÞÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅýÜÆùÚÁùÚÁùÚÁùÚÁùÚÁùÚÁùÚÁùÚÁùÙÂùÙÂùÙÂùÙÂùÙÂùÙÂùÙÂùÙÂ÷Ø¿÷Ø¿÷Ø¿÷Ø¿ö×¾ö×¾ö×¾õÖ½øÖ¾÷Õ½÷Õ½÷Õ½öÔ¼öÔ¼öÔ¼÷Ô¼òÓºòÓºòÓºòÓºòÓºòÓºñÒ¹ñÒ¹òиòиñÏ·ñÏ·ñÏ·ñÏ·ñÏ·ðζüàÈýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇþßÈþßÈýÞÇþßÈþßÈþßÈþßÈÿàÉÿàÉÿàÉÿàÉýÞÇýÞÇýÞÇýÞÇýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅýÞÅüÝÄýÞÅýÞÅýÞÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÝÄüÝÄüÝÄüÝÄûÜÃûÜÃûÜÃûÜÃûÛÄûÛÄûÛÄûÛÄúÚÃúÚÃúÚÃúÚÃùÚÁùÚÁøÙÀøÙÀùÚÁøÙÀøÙÀøÙÀù׿øÖ¾øÖ¾øÖ¾÷Õ½÷Õ½÷Õ½öÔ¼ôÕ¼ôÕ¼ôÕ¼ôÕ¼óÔ»óÔ»óÔ»òÓºôÒºóѹóѹóѹòиòиñÏ·ñÏ·ûáÉûáÉûáÉüâÊûáÉûáÉûáÉûáÉûáÉûáÉûáÉûáÉûáÉûáÉûáÉûáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉýÞÇþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýßÆýßÆýßÆýßÆüÞÅüÞÅüÞÅüÞÅüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÝÄûÝÄûÝÄûÝÄûÝÄûÝÄûÝÄûÝÄüÜÅüÜÅüÜÅüÜÅûÛÄûÛÄûÛÄûÛÄûÜÃúÛÂúÛÂúÛÂùÚÁùÚÁøÙÀøÙÀúØÀúØÀù׿ù׿ù׿ù׿øÖ¾øÖ¾ö×¾ö×¾ö×¾õÖ½õÖ½õÖ½ôÕ¼ôÕ¼õÓ»õÓ»ôÒºôÒºóѹóѹóѹòиûáÉûáÉüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉþßÈÿàÉÿàÉþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýßÆýßÆýßÆýßÆüÞÅüÞÅüÞÅüÞÅüÝÆüÝÆüÝÆüÝÆýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆûÝÄûÝÄûÝÄûÝÄûÝÄûÝÄûÝÄûÝÄüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅüÜÅûÜÃúÛÂúÛÂúÛÂûÜÃúÛÂúÛÂúÛÂúÛÂùÚÁùÚÁùÚÁøÙÀøÙÀøÙÀ÷Ø¿÷Ø¿÷Ø¿ö×¾õÖ½õÖ½õÖ½ôÕ¼ôÕ¼óÔ»óÔ»óÔ»òÓºòÓºòÓºòÓºñÒ¹ùâÈùâÈùáÉùáÉüáÌüáÌüáÍüáÍûáÉûáÉûáÉûáÉüâÊüâÊüâÊüâÊüâÊüâÊüâÊþâÊýáÉýáÉýáÉÿàÉýãÈýâÈýâÈýâÈýâÈýâÈýâÈýâÈÿáÈÿáÈÿáÈÿáÈÿáÈÿáÈÿáÈÿáÈþáÀúàÆøÞÊþÞÇÿãÄÿâÃûÝÃöÚÆúÞÅÿãÈúÝÂ÷äÊùÝÎÿÛÎÿÞÈñåÃÿÞÉÿßÈÿßÈÿßÈþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇþÞÇýÝÆýÝÆýÝÆýÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÅøÙÂ÷ØÁ÷ØÁ÷ØÁ÷Ø¿÷Ø¿÷Ø¿ö×¾õÖ½ö×¾õÖ½ôÕ¼ôÕ¼ôÕ¼ôÕ¼óÔ»óÔ»óÔ»òÓºòÓºùãÊúâÊúâÊúâÌüáÌüáÌüáÍüáÍüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿâÄýâÈûàÌÿàÉÿÞÅÿæÈúÜÃöàÍþéÖÿãÉûÝÁùæÊúßËÿÛÎÿÞÈõäÃÿÞÉþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄøÙÂøÙÂ÷ØÁ÷ØÁøÙÀøÙÀ÷Ø¿÷Ø¿ö×¾ö×¾õÖ½õÖ½õÖ½ôÕ¼ôÕ¼ôÕ¼óÔ»óÔ»óÔ»óÔ»úäËúäËûãÍûãÍûãÍýâÍýâÎýâÎýãËýãËýãËýãËüâÊüâÊüâÊüâÊüâÊüâÊüâÊüâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉþâÃùàÈúßÊþßÈþàÆÿãÇ÷ßÌìÜÑóãÒÿãÏÿáÅøâÈûàÍÿÞÌÿàÉöäÇÿàÉÿàÉÿàÉÿàÉþßÈþßÈþßÈþßÈÿàÉÿàÉÿàÉÿàÉýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄúÛÄùÚÃùÚÃøÙÂøÙÂùÚÁøÙÀøÙÀøÙÀ÷Ø¿ö×¾ö×¾ö×¾ö×¾õÖ½õÖ½õÖ½ôÕ¼ôÕ¼ôÕ¼óÔ»úãÍúãÍúãÍûãÍüäÎüäÎþãÏþãÏûãÍûãÍûãÍûãÍûãÍûãÍûãÍûãÍûãÍûãÍýâÍýâÍüáÌþáÌþáÌþáÌþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊýâÇûáÉûàÌÿàÉÿåÉøÝÅúíÞnhcòëÞøÜËÿäÊøàÅúßËÿÞÌÿßËøäÆÿàÉÿàÉÿàÉÿàÉþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅúÛÄùÚÃùÚÃùÚÃùÚÁùÚÁùÚÁøÙÀøÙÀö×¾ö×¾÷Ø¿ö×¾ö×¾õÖ½õÖ½õÖ½õÖ½ôÕ¼ôÕ¼úâÎúâÎúâÎúâÎúáÍüãÏüäÎûãÍüäÎüäÎüäÎüäÎûãÍûãÍûãÍûãÍûãÍûãÍûãÍýâÍýâÍýâÍýâÍÿâÍüâÊüâÊüâÊüâÊûáÉüâÊýãËûâÊýáÉýáÉþâÊÿãËþâÊþâÊþâÊþâÊþâÊüáÍüáÌÿãÉýàÄñÝÇÚÖÌ]eg•˜ŽòÛÌÿÜÄÿæÊøáÉÿàËÿßËúâÈÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉÿàÉþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇþßÈþßÈýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄùÚÃùÚÃùÚÁùÚÁøÙÀøÙÀøÙÀøÙÀ÷Ø¿÷Ø¿ö×¾ö×¾õÖ½õÖ½ôÕ¼ôÕ¼ôÕ¼ôÕ¼üæÔûåÓüäÐúâÎûãÏüãÏýåÏüäÎüäÎüäÎüäÎüäÎûãÍûãÍûãÍûãÍûãÍûãÍûãÍûãÍýâÍýâÍýâÍýâÍýâÍýâÍýâÍýâÍýâÍþãÎþãÎýâÍþáÌþáÌþáÌþáÌþáÌþáÌþáÌþáÌûáÌüáÌüáÌÿâÉùàÅôæÓ¬­«UdlYheÿìáÿäÐþáÅùäÉþáÍÿàÌþâÊýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉþâÊþâÊþâÊþâÊýáÉýáÉýáÉýáÉüàÈüàÈüàÈüàÈüàÈüàÈüàÈûàÈþßÈþßÈþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄúÛÄùÚÃúÛÂúÛÂúÛÂùÚÁøÙÀøÙÀøÙÀøÙÀ÷Ø¿ö×¾ö×¾ö×¾ö×¾õÖ½õÖ½ôÕ¼ùãÑùãÑùãÑûãÏûãÏûãÏûãÍûãÍüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏûãÏûãÏüãÏüãÏüãÏþãÏþãÏþãÏýâÍýâÍýâÍýâÍýâÍýâÍýâÍýâÍýâÍýâÍüáÌüáÌüáÌüáÌüáÌüáÌüáÌüáÌüâÊþãÉÿèÍîâЊŠ@Vg:PMÿõîÿÞÉÿäÆùåÈüáÍÿáÌÿáÍýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉüàÈüàÈüàÈüàÈýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉÿàÉÿàÉÿàÉÿàÉÿàÉþßÈýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄûÜÃûÜÃúÛÂúÛÂùÚÁùÚÁùÚÁøÙÀ÷Ø¿÷Ø¿÷Ø¿ö×¾øÙÀ÷Ø¿ö×¾õÖ½þç×þç×þèÖÿçÖÿçÓýåÑûäÎýåÏüäÐüäÐüäÐüäÐûãÏûãÏûãÏûãÏûãÏûãÏüãÏüãÏüãÏþãÏþãÏþãÏýâÍýâÍýâÍýâÍþãÎýâÍýâÍþãÎüáÌýâÍýâÍýâÍýâÍýâÍýâÍýâÍýâÎýâÎýãËÿäÉøàÆäÚÉlyzB[n>VWIJ¬ÿÞÉÿåÆøäÈùâÊÿßÎÿáÌþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉýáÉþáÉýáÉýáÉýáÉþßÈþßÈþßÈþßÈþßÈþßÈÿàÉÿàÉþßÈþßÈþßÈþßÈýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÂúÛÂúÛÂúÛÂúÛÂúÛÂùÚÁùÚÁøÙÀøÙÀ÷Ø¿÷Ø¿ö×¾ö×¾ö×¾ö×¾úêÒýëÚþëÜùçÖõåÎøçÏûåÓüá×øãÎùäÏùåÐùåÏüäÐüäÐüäÐüäÐüäÎüäÎýåÏýåÏüäÎüäÎüäÎüäÎüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏüåÎüäÎüäÎüäÎûãÍûãÍûãÍúãÍÿáÈõâÎöâÍÿåÃÿèÏA;=?LWI]`AU[Ž’“ôãÛúÝÍÿãÈüãÉûâÉþßÎýãÇýâÈýâÈýâÈýãÈþãÉÿäÊÿäÊþãÉþãÉþãÉþãÉýâÈýâÈýâÈýâÇøßËïæÉÿàÂÿäËÙáÈøãÒÿØÉðèÈýàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈûßÇûßÇûßÇûßÇûßÇûßÇûßÇúßÇýÞÇýÞÇýÞÇýÞÇûÜÅüÝÆýÞÇýÞÇüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄùÚÃùÚÃùÚÃùÚÃùÚÃøÙÂùÙÂøØÁøØÁøØÁ÷×À÷×À÷×ÀöÖ¿ùéÙ÷ç×öåØøè×øêÔûêÕýéØýçÛÿñÛÿîÙÿëÖýèÓûãÏûãÏûãÏûãÏüäÎüäÎüäÎüäÎüäÎüäÎüäÎüäÎýäÐýäÐýäÐýäÐüãÏüãÏüãÏüãÏüäÎüäÎüäÎüäÎûãÍûãÍûãÍûãÍÿäÈ÷ãÏ÷ãÍÿæÆüåÏÉÇÅGV`=QV@TY.23D2+óØÆÿãËüãÉüâÊþßÎÿãËÿãËÿãËÿãËÿãËÿãËþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊþßÈõçËþÛÄüâÑÝç×îÚÏÿßÌõåÄüßÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈûßÇûßÇûßÇûßÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄùÚÃúÛÄùÚÃùÚÃùÚÃøÙÂøÙÂ÷ØÁ÷ØÁ÷ØÁ÷ØÁö×Àö×Àúîâùîâùíß÷ëÙøêØúêÙùéÚøèÛúåÏùäÏùäÏúåÐüäÐüäÐüäÐüäÐýåÏýåÏüäÎüäÎüäÎüäÎüäÎüäÎüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏüäÎüäÎüäÎüäÎüäÎüäÎüäÎüäÎÿäÈúâÑúâÎÿäÈ𚶸»_pzGV]@T\MRS¡“Š÷ÞËýâÊüäÉüáÍüáÎüâÉüâÊüâÊûâÊýãËýãËüâÊûáÉþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâÊÿáÅùáÈýâÒêÝÙhwvñäàÿÝÌùãÁýáÊýáÉýáÉýáÉýáÉýáÉýáÉýáÉüàÈüàÈüàÈüàÈûßÇûßÇûßÇûßÇýÞÇýÞÇýÞÇýÞÇýÞÇýÞÇüÝÆüÝÆýÞÇüÝÆüÝÆüÝÆûÜÅûÜÅûÜÅûÜÅûÜÅúÛÄúÛÄúÛÄúÛÄúÛÄùÚÃùÚÃùÚÃùÚÃøÙÂøÙÂøÙÂ÷ØÁ÷ØÁ÷ØÁõíéùðæúòáýñßÿðàþîáûëßùêÚüçÒúåÐùäÏûæÑÿèÔÿèÔÿèÔÿèÔÿçÑÿçÑþæÐýåÏýåÏýåÏýåÏýåÏüãÏüãÏüãÏüãÏýäÐýäÐýäÐýäÐüäÎüäÎüäÎüäÎüäÎüäÎüäÎüäÎÿåÈùâÑûáÑÿåÉìßÍ›\m|M[d:T\LSVÿñëöÝÍüäÊûãËûãÍýâÎýãËýãËýãËýãËüâÊüâÊýãËýãËþâÊþâÊþâÊþâÊþâÊþâÊþâÊþâËÿãÅÿàÊöâÚ¦¯³Viu¯©¯ýÞÐþå¿ýáÊýáÉýáÉýáÉýáÉýáÉýáÉýáÉüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈüàÈúßÇûßÇûßÇûßÇûßÇûßÇúÞÆúÞÆúÞÆúÞÆúÞÆúÞÆùÝÅùÝÅøÜÄøÜÄøÜÄøÜÄøÜÄ÷ÛÃúÛÄùÚÃùÚÃùÚÃøÙÂøÙÂøÙÂ÷ØÁõìïôìåøñÞùîÚøéÙúèÞùêÝøê×þèÓÿëÖÿì×þéÔýäÐýåÑýåÑýåÑûãÐüäÐüäÐüäÐüäÐüäÐüäÐüäÐýäÐýäÐýäÐýäÐüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÏüãÐõâÄûäÓþãÕþáË¢šŒ /5G\nJS_M_BSg=L`KXhFO]OU]»ÁÉþåÌúåÏùåÏüåÏüäÐüäÐýäÐýäÐûäÎûäÎýãÏüãÏþãÏþãÎÿäÌÿåËþéÄΰŸª½Ãs‘§KRhL]h#>:ÿôôûçÌûåÌüäËÿãÏüáÌýáÌúâÌùáÎùãÊùãÊúâÊúâÊùâÊüâÊüâÊüâÊùáËùáËùáËùáËùáËùáËùáËùáÌøàÈøàÈøàÈøàÈøàÈøàÈ÷ßÇöÞÆöÞÆöÞÆöÞÆöÞÆ÷ßÇ÷ßÇ÷ßÇ÷ßÇ÷ÝÅ÷ÝÅ÷ÝÅ÷ÝÅ÷ÝÅöÜÄöÜÄ÷ÜÄJM[çÙÓÿñÝøäÓøæÕþçÑþèÏöæÖýæÔýæÔüæÔüæÔþæÔþæÔþæÔÿçÖüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒüçÒþèÓôäÝÿæÑÿèÎÿæÒþêÕøêÓ ¨¥v–«}™µy•¯x“®|˜°s¥ƒ¡²…£­^‡^gv@Q]>N^N\BPEJ]ÿÿÿóßÍýéØùåÒüæÔüçÒüçÒüçÒûçÒûæÏýæÐÿèÑôåÑöéÚðëঠ“‰¨¼Œ¤¹y¢ºSu…qm|]pt:dfNU`^mvZcdÅûæÙÉúåÎþåËýäÌúäÎüãÏüãÏüãÏûâÏûçÒñÜÇüèÒéÕ¿ýäÍûãÍúãÍúãÍùâÌùâÌùâÌùâÌùâÌùâÌùâÌúâÌøáËøáËøáËøàËøáËøáËøáËøáËøáËøàÊ÷àÊ÷àÊ÷àÊ÷àÊößÉößÉößÉößÉõÞÈôÝÇ?TXÃÎÍçåÝùë×ÿèÑüèÓõç×ñè×çÞ˽ÇÄZp~XdrîßÞþàÑÿßËÿíÝúë¼êãâäâí÷èÔÿæÇüàÒúäÚýìËîêÍêè×ïêÖÿíÏýçÈùèÓùêÑûéÁûæÉÿéØèçänŽ•{¢µˆœ¶œ¶—ªuŒ¡sŠŸxŒ¡n„•e|Œ7N]>R^=Q_8MR@U\@V]@S[9MU/6;MVU`@Vc:P\AT[@SZ@RZEX`?OYGXaBS\DT^9WRHX[”‘’ÿñéýçÑÿèÎùçÒõæ×òæÖûçÑýçÑøæÖùãÍÿéËâàÔ“§¸…©½oŒ¢—°Åh|DTdfv‚DU^9ITIa[HQb¢¨£ÚàÑF>HôéèöêÊÿäÔøäÒøäÒ÷åÐüæÍüèËõåÐƼfpz¼À·ïéÛìÚÅþäËûâÎøâÐõãÎøäËöäÍöäÍöäÍöäÍõãÌõãÌõãÌõãÌ÷âÌ÷âÌöáËöáËöáËöáËöáËöáËõàÊõàÊõàÊõàÊõàÊõáËöáËõàÊ9JXT\@S[ƒˆ†åßÒïêÖèæÍæéÔ}ƒ‡U\i‰‰‚òçÑøäÓöåÙíçÓƒŒZ]höïñüåÕüæ×îé鲶¹ÓÕÖñäÍöêßÍÎІ¤«ˆ¦¹}‘¦o”uŽŸx£uŒ| au„e|‡8KV@S_F[bFV_>OXIZcFW`GU^GV_ET]ES\7Y^G[c@FJÿüõõçÕõêÎõèÒïèÖøæÐÿçÌþçÍôäÔöéÖõåÑÐÎÇ•¨¸~ž´{š­ž¸ÉLdt=P]_q|?RY;NWCZYWarœšÒÝÏ_^lÏËÍõêÐýäÕ÷äÒøäÒ÷åÐüæÌþéÏîáͧ¨¦Ubl•š–ûöêýíØüèÒúáÍöâÐöãÎøäÊöãÎöãÎöãÎöãÎöãÎöãÎõâÍõâÍøãÍ÷âÌ÷áËöáËöáËöáËöáËöáËöáËöáËöáËöáËõàÊôßÉôßÉõàÊ4DTGQ[IHMòçä÷æÙûçÕûèÓúéÒÂÌÎ`ruBZbAT\]adîåÝðâÑöëÔÀÔËdpxKXeZcgöñæùåÓñå×ÑÒÄlz‹O[k§¥©ùèÙóâѧ¬®XjvAS\ìèÛêãߟ¥©Š§µž¯^o… 1C!SZ1FN-:)5=JW!.;1?LJUaFR^NXd:XbBUaBDMðèæôçÖöëÒöêÑóè×õçÕÿêÍûèÐêæÜëèåÙÚÓÅÎЕ¯Æ¼ÌŒ¨¹™©Lcr9P[OdoI\cKZCU^çëåöäÒóéÛ˜Tjx>R__egÿøæãßÏ~ŽD`lA^eglfäåç—¡“¯¾ ²’¥·kz‹x”¡Tj|y‘ ‚•¦BWfG^i?R]@U\9NV0?L7GS0>J#1=6DP#/%1"-9"6F2PWDWX;F\)8;¨½·GRgŒ—íèÒüäÖùäÏ÷ãÒôäÏøæÏöåÌÿöè©­°Ug{T]]ÛÚÔíßËþèÒ÷äÏõäÑõäÑøäÏóãÎôäÏôãÎôãÎóâÍóâÍóâÍóâÍõâÍõâÍõâÍõâÍôáÌõâÍõâÍóàËöáÌöáÌöáÌöáÌõàËõàËõàËõàË,9G!,:7=H #,/.3›šš¹»²ÀÁ¸a|ˆJbh?UZ>MTEDS¬ ªýæäüáÒj™HV^;IU:P`mtsúçÔïâ×r‡ŒUnt4OYGVXááÕÓØÌgz~>[e9TZ7EIÝäîxƒ’8I8IŽ¢}Œv“¡ˆ µz’¤cz‰qˆ—QitLPCRP8KY:NR>RR=PW?M\BIVôôöøóèe™IRULU_/J]WaeÿîÚìàÓx“£I_c@[h8LXqxw¦®®q„‘LdtIZ`2LTHQ`’¡²‘¯ÀNj{.?Pet„^|†rŠ n‡œx¢oˆ˜`{‰8P\=Ua'%,;1;J6FN2DN3FR2ES1DP8IS7HR1?L?P];P_5KX@P\>P^J`rq…•ft€BX`9MW=P]7K[Ž¢²Zr|Kbk4MT7PZ.KV…¡²w¤n‰Ÿkˆžh…™f‚”ua}ŠB]jXs€d{Š@Tc?P`=P_8CQ*7+’“îçäøîà÷èÐÿëÌêëÙõäÕòäÜ£«©yŒ›v†¢s†¥s”¯i}^s…asƒ;N\I[f@QZ;NU6JP;M\@RV>HQ,3@-7@CEJ¶±¬ùéÔÞáÖüêØöß×ÎÑÝ¥ÄÕ¡ÄÏ’®½“«Í†¢´lŒ·¿ÄçâÛòâÔóåÎóåÎñåÎóäÑóäÑóäÑóäÑñâÏñâÏòãÐòãÐñâÐñâÐñâÐñâÐðâÏñâÏñâÏïáÎóâÍóâÍóâÍóâÍòáÌòáÌòáÌòáÌ4DK)9BEOY2;D4=G"0)2?1=I6EN:IQ5EQ7GT8IV9IU5CL(.?L5ER6GTQa:M\H[h6JU6KR2IQ2JV`wˆd}d|z“§a|ŒqŒhŽE6CK8BL6BN4AP5AO5BP:GUDP\8BK1BO5ER8ES8ES2?M8BP)7.8F0EP6HR;KYCS`%6C$5B2BM5EQ7JR=MV&6C+;F/<]lyM^k9IV-8CMn‚”Thy0?9LYEWb$4=)0&8?*9B2=C*.sƒJW^CKPòñéõçÙþëÎúæÌçàÙ|¦Kh‰j‚•\mw`t†[n{@R\OY^_^[îèÞïæÔóåÑôåÒóåÓóåÓóåÓóåÓòäÒóåÓóåÓóåÓñãÐñãÐñãÐòäÐñãÐñãÐñãÐðâÏñâÏñâÏñâÏñâÏñâÏñâÏñâÏñâÏ3BS3@P5?M.7D/8F7AJ6BL(9?-6D)5A3@N1=N2>O#0>'/7E7HU8HU6BQ7DRAN\5?M9DR>HV.?L2BP3FP:LW0?L)9E-:H/G #$-(1(1-=F9AGO\`?KSAPY7ITBUbXp€Tk|1N^@MZ²ºÄq‹•g†•j{7DP\qsK_q,@R`r9LYEWb:KT8JPCV\BP]?JR4?C +.1@G2O7FV)6C0:H?LW;KX:JW3DQ1AN0MU1?L1;I,6H4GS;IU5?H'0:#'3 )3#0<,:&31>J:ERDQ^DS`@R^?S^9MY1DK6GP+9B +5&2<&1;0@H)207=$(.$17'-:MT?R_J_n,L[CS_z„~™¨g‡˜{£‰—¨by|[n“§¸M`o7KX?Q\>OXL%2@%3?.:I1AQ/?O1AQ/>N00=I8FS$0&.=.6C;GQ:KQ;MT3FMM.>N,O2DP3CO2@H)4=8DO5=K4;M(O&7C->K8HU8IV>O\GWe;LY6FT3CQ8HU+4C#18@O?FUCQ_%3'0G6DX6GS1ANQa3P^@JUEKX6Qb'J_‰ž¼dt‰ &2Pcu/A1@AUbEWb>OX'9@L^c?NdGXf@PWDX^8P]H]fS\`ÕÔΖš­^fm…œž]{fw“}€šªeŽ©U^jNYdAPVWehU]XöõìîäÖúéØñãÕñäÓòåÓóäÓòãÓòäÓñäÔñäÕðäÒðäÒðäÒðäÒðäÒðäÒðäÒñäÒðãÒðãÒðãÒðãÒïãÑïãÑïãÑïãÑ0=I0>J(13J0=K1>M*8D,=I'8E+>M.BN2DN3EM3CI1@M/?K1AN4DQ6EV,;K+9L/P/?Q)9I*7E-*8D+KW4?K4?KCP\Š‚ìä×íæ×ïëÆòèÝìçìÝãÛàçØæäÚîä×öæÍìåÔíåÔíåÔíåÔëãÒëãÒëãÒëãÒìãÒìãÒìãÒíãÒìâÑìâÑìâÑìâÑ,N0AN5EQ3BK1BH3CP4DP->I7GT6FS2AR1@P0@P0@L0@L1BO7FW6EV+:K+8F*6B,>K/?L'4B#.<)1>#/;'3?)7C/;J0@M1AN4ER6JW;N[.EQ/EQ/EP-@K+@K8JUHP)15BJ,4Q4@K7BP0G->J3CP:JW2?K-8B09C0AN2>L)4B(0?)1>%-;)1?*6B/9H0=K2?M3CP:JW=N[8HV7JX7KV5JU7HS7IT:JV1AM6DP;IU5GR4DQ3AM=IU8DP.:FFT`6GR3BS3@N@LX"+5.8B'09*6B0;F2?M0=L2AL8EQES`7FOCR[APYBFŠçèçÞÜ×âò妪°XW]êéÛêçÒìåÖìãÚìåÖíåÔíåÔíåÔíåÔíåÔíåÔíåÔíåÔìäÓìäÓìäÓìäÓëäÓëäÓëäÓëäÓ5GX-=M9IV)6E*7E*9I)9J(;-"0.;K2?N3@P-:H!.$-7".8%0:$09*6@=IR.9F%1=5AM8EL0N/?L&3A,9G2BR-=N!3F08F0:K9GV5@S.;J/7?L)1>',9#)6 &0)2<+3=-6E.7E'2@*4BMV>IT@IS1>H7BL6EN2CL=IX8ES&5@&1>2=D$+2"'4;<(/?$409F7@M?LX7CM&1<&6?1BI8IOMYaGT\VckN[cMZb;IQFQW;JOHU]CS[DR^4DRgx„6GYJT\R^dCOU>JPEOWIS[bltˆ‘˜N;KXL7DT+9K)8K,7E.7I/:M0?Q/=P6CS/;F/;G+8F&3A,:F)7C/=I,:F+;C$3< ,6(4@&5A-:F*6$+$$(+8)5A)'5*#"-)3%+9)7"08DR;LY:KX6GT!1=&2/;(4)7C*9E.&6>/;E.8B5?I+4>9EO.=F3DM:HT3@N0=L.J.=N)9I+:J%6B*;H0@L&6C*:G.8G&3A*6D'8E/=I'2=(-"-0&4A+7C/7D(1%.#-".5$.6"-<%0>$2@,8F1BN9JW:KX:KX*7C1>J0=I,9E1?K-;G9JV%6B/:E(2<+5@(2<(1;9EO.@I6HQ5AJ04@LAO\AR[N,9J)8H*:K*=N-?P2BR,=J0?K-;O+8K(7G)8I5EQ2CP%5A*:F&3A.;K&6F0?O1AN(7?!.6%16+K6DP4BN3AM3@L2BN3CP7BI7@H;EMELU6AH3@G+?E3GM19C1>J5AP,OX7KSKSJTV^h?IM9EGQZY6>APY]KSYR`VJR]EJ[^fdÖÝÍÞÝÔòèàñåÑéãÖéãÖéãÖéãÖçáÔçâÔçâÔçâÔéâÑéâÑéâÑèáÐéâÑéâÑéâÑéâÑ$@Q$J7?L/;D,=H/@M3CT0=T-J7AI+:B/=H,8F,9I1>O3?M.29B'-63;E2>J-;G@P\IQ>KP>IO:EL3O-:Q0?R5DT3AM/J-N3DP(6B(1;!-4*:L.?K'5A!,3)1!,4%08'3=%0;,8B%4=1>K5ER6HS5ES8KX3EP8JU+=H0CM9IU.>J7GS3CO2IP5HP6IQAR\0@H,8B*4>6?I.=I'3?2>J(2<%/9 )"..6>#,!++7C3@LDI.49?BGJ>LX1?K@NZ5CL;JS=MUEPZ?KU/;E1:D9BL/>J,7C6BO+5>%/9"+5(-9+2;*1:(1;(4@0>J:JV:KW>MV5EL:FR8DP8FS,8@&07)3:,4;"*2-380386:?DLSHRYAMT6BF.:>+7;5BC=FIANNX``LQQPQMÏÑÇààÖèåÛáßÑÝâÖÝâÖÝâÖÝâÖàâÖàâÖßâÖàâÖÜà×ÞàØßàØßà×ÝßÕÝßÕàßÕáà×5DM6AM=FS,5C/7E-7I/:L"0C&2@,F(7@-9-9H'3D.;K&2@"/;%.&-!+5&2>3?J ,!+"+$*(9J*;G%1 *2$, '/$0;"'5&/<'3%2A:FT7GT'7C!-%5A#/-9#1=$0*6B!- +5 * *#-+5.:D,9C5AK4CO)5A6BN4=G&0:$-7(.9*1:.4=*3=(4@0>J5EQ@P\@OX=NT:GV@NZ;KW9IU9IV>NWFR\8CM:CL;EL4?F8@G-2:3:?8KMBKN@GJ?DEHMLTXWããÝáÞÖæäÛääØàâÖàâÖàâÖàâÖàâÖßâÖàâÖßâÕÜßÚßàØÞà×ßà×ááÕÞßÓáàÒâáÓ2>H'2>&/<+4B2;I6@Q.'0<)3B%3@7DRJ0@L2?K-;G0?K2>J1=I6BN4@J.:D7BM8DN6BL($.1=G&5A)4@6BN7@J%/9#,6-3>+2;-4=/7A(4@/=I7HT?O\IXaCTZ?KZAR^HS;CMEL=FM06>O.>N3N.>M-=M+;K2CO+;H.>K4EM.>K3CP,;L2AQ9IV*:F,=F4=G*7C&4@4AO7EQ-8B#+4",3+%0?+8F,8F5FR!-$0+7C"+ *4&0)/:+2;.5>.7@(4@-;G:KWDTa(7@"28)5+77GTEV_+=F+:C:GO)4<'0:)18.6=.4;#*126:,/41389AHCMT:FL0<@-9=.:>3@B*46;>B:?@=ACIRQØßÜØÞÙÛßÙÜßÖæâÚßÜÔàÝÕãàØÖÒÊåæÝÝÞÕãäÛäâÖßÜÑâßÔáÞÓÛÚËææק¥—¹¼¬3CS+;K/?O&3A/J->F/:G.;J'8E0?P8IU+9E%.8)1+NZ1GN;MU8LS=NX;JS0;F&/9;EN)7D&2>:GS0:C%/(!&2(/8(.71:D/;G*8D>NZBR_?MVJP7BH8?H:BI:BI8>E(+326;/271386>EHRYKW]JVZ@LPAMRJVX>HKIKOHLM?IINYW»ÆþÈÂÐ×ÒÕÝÖ×ÛÕâæàÓÚÓÞåÞ×Þ׻¼×ßØÕÝÖÛÜÓßßÙÝßÙÕÙÓäëäÚáܬ¶°€Šƒ2EW4EW8GX&6C)5D.=H0AM,>F37M4=P1@P/AM0AM8IV,=J.=N,>F.>K.>K(7H6FV5FS-=J&8@+8G):G$3D/@Q6EV+8F'4@'2*#1A$1@$6C'8E):K1AR3GV5GW9NY:OZ6KV:MX5HS5HS1AM:JW5OV3LT4JR7KS;JT1=G%0:4=G6ER*5B6BN2NTBPVKV\?IO;AK;CJ74L-F4BN)6D0G+6=&06,9F7DQ:DK$.4#*1%,3*3<)2<06>/8@-7@*6?.LU=GRH5BL%2;5AK5?I&/8"+4&-5%,5$-6,5?,4A-9E@MYBR^EV_9MTBRYGW^=MTAQX>NU>OVEV]:LS5?F=GN3=@E9@B;CGFQRizwaupn‡~b{rl^ui‡d}|[rp[ljcqk}Š}m|cvw^uv”«°t‹‘Š¡§wŽ’|•.JT1JT2FQ/?K1@K4@L -8*"+,9/?L,-6"-&0%4@5CN'5A)"*!(#4B0>J#,6'0%+$.%.7#,6'2(0:*3&3$2>6FR3DQ)=K,4!* /8$-!,6*5)3'1%/",&0$/+7B%/#03> )&02>H*3>'/$-6%+4&,5"+4(1;*3@/;G3AM@Q]CT]6JQ&6=-4,IMIVXCQSbwt\sp_tsUthpŠ`|rczucvt[libpn}Š‡y…Ž‹›¡˜«¶„—¤Šªzš{˜n€‹4JV8KXL+6D5?M(4C!-<,N-L,;F(5$3<(3=-;H"0<.?L1>J*5?(/ &&7E-;G%/"+ $(1&0)*4=&.<"-,9E:JV2CP(8F$5==NW$5>3AJ/>G.>G2=G'2<3CL-'3?1?K=MZ8HQ(;B7FM?OVGW^BRYBRY=MT/?F0AH4=F@IR5=D@HO(-5.59,/41498=DFNUFPX?KN>NPAMQBNRK.>K5BP/9G/:H0=K.?L(9E.;H1AM3DP,@O+>M7GW/?L+9D1@H)7C+7F"/=1=K7DR2@L-2@LAQ^EV_BU\BRY@PW?OVAQX@PWAQXCSZCT[2>EAJS+5>DLS05<+1947<48<1:@@JQEQWESZFVXBRUAMQF>MVv†’w‡•l€r…–cvz^qnXkbRdV\nay‡„cqxw“cp~z†—v„—{‰}‹Ÿfwˆhwˆdq‚(7D*71>K1M(;J7GT8HT)9F.>J-=I.>K&5E4CS7GT3DO,K/=I(8E4DP8HU8FR(4>(0(:G3DQ7CL&18"+ )1%0:'0>'2@+6D*8F0P[8KS8KS9LT9LT6GP5FO:KT>LU5IQ9LT8NU9NV7KR5FO+53RYJY`GW^=MTAQX?OVHX_AQXGW^/:BDOW6>H@IR-6<16=/6=45>/6??HQIU[GU[DRXBRTEQU=IM=JP=IN6BJJ3@L->K$4A-=MK0@M9IVGPLV_ESXCTZCQWCQX?JN=JP9EK6CK;FP;IVUfs[kxSbtcv}kz}bnn†ŽŒ‹“‘{‚…qwƒ‹–_otv‰arzp„‹bs|ex~lz€brt2IX0ET6IX-M.>K8HX2ET+>M)'4?)9I+:J,;K/?K,1:C=FOHU]BSZFV\CSYESY@LR>GOBKS3?ELW_ERZ>ITM]fZirŒ ¥aqw¥°·†‰‘xz‚{~ƒ‚‰Œ{„‡^mv€‘™FVbƒ• n~Šx‡{ŠDPV0M[0LZ7M]1EU0AQ2BR4DT.AO0?L4CT2ET*>P+AP4HT;OU,=E3CO3CP5CT+:J2AQ:IY2CO/?K8FR3CP(8I1AQ9IY7HT2>J)3/@Q1AN:HT(4>$.%.8(0>(5@(5J+9L-(7C?O\HYb:NUBRYEU\CRY;KRFV]IX_:JQGW^1=H>HR.8CAIS09C.5>04>49@/8A>IQER[FW^DTZBRXDRX?JQ@KN=HKK2AQ/?P.?S/CO.AN3FU.>O*:K5EU9JX0@M2BO4DQ4DQ-=J2BO8IU5ER0@N4BN0@M"2?1AR8HT6DP.:C",6+N.=N:JW8KV9MT7JR;NVQYBU]=LUDU^>RZ>PWDV]CV]@RYEX_FX_ASZEY`9EKO8IVJ8ES4CS/?P.?R3FR2ER6IX0@Q,K/=I2BO 0=1AR?O\7DP0N9IU;MX>RY:MU9LT8KS7JR@S[@S[>QYCV^=PX>QY=PX:MU:MU2AJ ,61;D;JV*8D6BN8DN*4>",6%.8&/8%1;)2<+5?,6@7@JAPYGXa-@H7GM2AH+;B1AHCSZ#3:$4;%5<)/4AG09@@KQ08?.7>27>39@9>G:BIIU[ESYCSZCSVBSV9JMO.>O7GW9KW.>K4DQ6FS7GT0@M/?L9IV6FS-=J1?K-=J#3@/?P7GT8FR0;E!+50AN9IU5FO0?H&0!.7&/<,5C+;C,:F):G-;L,;K3CP7IT:MU8KS9LT=PX?RZ9LT=PX@S[CV^AT\?RZ=PX8KS,6@3NW>OX!5=)9@%5<-=DAQXAQX4DK>NU?OV9DJBNT2?DBLS29@/8?27>5;B3:D6=DHTZESY@QW@QTCQT6EHETZJ3CS3EV3FS6IV3FU.>O,K4DQ8HU4DQ/?L2@L3CQ%5B1ARIYf/=I3>H!*42CP6FR0AJ-QYBU]=PX?RZ:NU4CL&2<1;D4BO/=I2=J7DM/8B$.8)2<$-6*6@+5?-7A-7A5>HDBKR+5<19@*3:4:A29B0:AFRX@NTFSZDTVBRT8CGFVXBMR2?A=FEMQRBGG:AD9>CCOSP\^forIUWKV\‡–£§»Ì³Ìá®ÀËy…fm|t|Štƒ{šlz…\er4K[1FT:NZ.?L.>K3CO1AQ4CU/BO3FS6IX/?P*:K4DT6HT1AN1AN3CP7GT0@M0@M8HU7GT/?L2@L4ER3CP+;L3CP4BN3?I)3=->KQY4CL*6@09C6EQ3BN+7CDFRX-8?,3:.6=-6<3:C.8?EQV@OU>MSCNRFRV6@E@PSIVX0<>>FECLKGMP',1/7>?JNEQRNWZ?KM>KR\mx]t„[t‰_tƒ@O_LVgw„”x‹šr‡–‚’¢Ž—¨2J]4L\>P`/@M5EQ5ER2BS5EU2ER3FS1DS-=N)9J5EU7IU2AN3CP2BO4DQ.>K3CP9IV7GT.>K=KW.?L"2?3CS1AN1?K3?H,5?,=K9IU6GP-QY?RZ=PX=PXQY:MU?RZ:MU6EN-9C,6?4CO2@L*6B?KU7AK!+5*3=)1:)5@.8B-7A.8B3F>KS(0 )&4:0>D7EK:FL/9@&18+3:/7>18A.8?COU>JP>MS@LP>JN4<@AMQIUY1>?:BFILhtzx‚Š>IPDPTN[\?KM8GJ4GNp‡–n‰šh€”ƒ“¦Ž ”£´“ªºŽ§¶“§¹‰–¬0HZ4JZH1;E.7B$5>,5>43B12A0RW>PWAS\*:C(6<>HMJWT>RW9MR6FL5FL8GM:GL?IP=GN9HK7FI;GK>IM@HLINS:@E=?D4AG?KQANTFPXCMT=GNBIP@FM7BH?JPGV\FTZJV_HX_JZ`P`fN]hO^jM\hO^jM\hL[gM\hN^j*K.>J3CS6JX=Ra*BNG]i5HUQ8IZ2AS/CUtŒœ€›¦;V`9R\4EP6BN07F0?K8JV7JR2@I.4B2;IBRc‰¤´OfkEYaEWb1AN5AO;GVQY:MU>QY>QY>PX3SW9NVAMYAP^‰Ÿ«TnwEYd!3;5AH;HP4AI7GP7CM4AK8BL8AK-AH1RW:OSASZ?PY?MW@PV:LOERT@TYHO=FN;@E@LP=IMDOS>IMBMQ>JMP§¾Í{–¤8S]?U`7IT4?K27G5CO6JQ7JR4BK09F5=KScsqŒœLglH_fCT_+;I1=L8FQ;LU:KTQY;NV>QY=PX=PX7RXMZ*:G¨ÁÌl‡“I`j>MZ1?H:IR8GP5@J8DN7CM;GRAIT0FJ:HN>GPMS@LR=JPBJR=LN8HJ8CG4AD0;>+7:6?B=FJ6JNAMQGVYFUWIW]JZ`HX^HX^P[cR]eS^fVahU`hWbjYdkYdl:T`5K[4JY1CT5GXQ^/@M%6D3DQ6IV2ER1=K3@N1AN-=J.>K9IV7GW/?P,AW¦¾Ðˆ¢°TlxMY(8D4CP;LU;LU;NVPX2AMFXh±ÌÚy•¢CXgL[h6JP5FO9HQ;GQ8EO=GO>KS?KT6ML:LNBLTAOWJcn°ÊÚi–DWnDU[ASZ?QW>QX@SZ@TY?TY@UZHX^EU[?PUGU[APU@LQ7CI7CI?MS=KQ?NS@KQ:FL.:@8AI#.58<@>BF9>CAJMDOS;GJ@OR@OQFRVEPUJY[JY\HV\BRXIY^Ufl_hq`ir^gp`hqajsbjt`hr^gp0KWKdp1GV-AO1CT0AT1DZGZosŒ•Rgr7KV6HS+=H1CN5IT/CN.:I5BP4DQ2BO1AO8HU3DQ3DQ1I`›³Ç†Ÿ¯Nfq=S^:LW.;H9DP,=F6HQ2IN7HQ?JV,8I¯ÇÖUt…F]hG]hDXc9KW*;C3DM=NW6IQ8KSQY8QW>PX>N\Ym|˜¶Ät‘ H_oETdH\g1CO:HQ:EP>IQ>IQKQ9PP;MOBMU=NYi‚‘°Áq‰@UnCV]BU]BS\FX^BT[CV]>PWI]cEV]HY`IV^IV^ANVCPXGT]KX`NZcVckUbjTbjWdlCPXLW_S_g\]fX^dPX_XbiS_eP^dP]cL\cQ]aUadTchYgmWejXhoXio\mt_jq`ksbmtcnualtbmt`ks^iqŸµÁ3GS4ER1AQ4DU7H[3I[|‘¦ƒœ¥Lbm>R]L1AN2BO6FR>NZ6HS3EPOh‚˜°Æq‰›Net?S]BT_7GS8FR5HN4KQ2HN4GO7DQO^n’«½o‘¤IaqAXgEXcDW_(9B5EN:MU;NVN[ˆŸ¯¯ÀmŸOgyt€•_z‚:NY:JW@KUALT?IR=LQ?OU?SUAQWOY@R^EV_BT\FW]CPY-4IV`=JRCPXERZFS[KX`MZbR_gUbjScjRbiPagT`hUbjZgnZgoWdl\enYaj]enWaiZgoZfnWgnVfm\go\goXemYgn\gq\ks\ks]mubmw`lv]irZeo]isalv]hrVak_qx0?HDR_8IV0@P.BS6L^³Ë݆Ÿ©Ndo=P[8JU5GR6HS7KV2FQ0J:LR2IN.GM5GO)9Feu…‘­¾eˆ›]u…D[jGZeGZb/BH:MT6IQ9LT;NV=PXQY;PX=NZ(;G¾×ç~ ¯mŽ¡Hav¯¾Ñp‹—>T_5ER>GQDMVBNSCQWFV\ARWERZCMW6JU£ÀΑ³Ár¢BWm:MZ?Q\8IRARXHUZXaj ++bepSaiYfnYfn[hpWdlZgo\iq]iqYhrWfoYhq[ktUdm[jsZir[js[jr]ktZjrZirZir[js[js]lu\fo^hr]ir_kw^jv\kv\iwYftWgsQamO_kRbnM]iM]iM]iN^jgsy=IQDOY:HT6FS4IX/HX¡ºÌ…ž¨BWc6JU8JU:LW7IT6KV4IS0&;B(9A)KR9LM@MVAITHQ^1CO²ÐÝ‘´Â`}ŽBWj@QaNbmYjsYhm]gmbjr€‹41@gu|gt|cpxanvcpxamvZkqSdkZhpWfn[irZhq]ktXiqWhq[ltZlxYlvaq}`p|^o{ao{_ny^lxem{fm{amxbl{_hv\huZeuR]nL_lL_lL_lL_lJ^kI\iG[hFYgOjp2IN;LU8FR6FS3HW/JZŒ¬»v’>V\8MU3HP7IT4ER1AN1AN18;MX]ozey„k€Šj}‹h~ŠPfsE]iG\gJ[eO_l^n~ƒš¬‚ž³¤¹Œª»¯…¤µŸ½Ñ–µÉ“®Ãƒž³rŒ¢wŒ–OfvI`pG^n{’¢˜©Ž¨¶”®º•²»¨µ†›ª ²ˆœ®Ž¥µ€š«ƒ¦²‡¡°¦ÄÒ°ÎßšºÐ€Ÿ´ž³Ur‡¸Óçv›¨Gam>LT?HPESXAQWHV[HSY[ggO^cZp{d~¬ËÞ˜²Çd@Yi7R^FakXkr`pyvŠ,1>kp~3YhpWgo\gr_ls]jqanu_ltbntWkyWkx[o{Xmx[ny^p{]oz\nz[nx^nz`p|aq}dqdqer€er€crz^nz[jvVgsPcrL`rKcsNfvOeqNepRerWguVfrUeqZgtWfoPjp;PV5HO;KW@P]2ET˜±ÁœºÉYqw:PU6KS4IQ:LW5FSN^kbr~t‡’\nyRdoL`kM`mK^k>T`>T`4LX=S_\lyZkx>Raaxˆ‚ž³t“©ƒ¡±Ž¬Àˆ¦¹®Áˆ§º…Ÿ´w’¦w’§h~Œ\s‚Yqƒ~–§ƒ›­‚­’«»«¹\t€€˜¤Œ¢²¨º™°Á“­½“¬½•³Âš¸Æ¦ÁÒ–´Æ®Â†¥¼t”«y–ª§Áצ²SZFXcQ]jK\aN`jXq€¼×뜺ό¨¼i“CZi=Vb9P[Ymt`kuYclX`mt{Š06Ebs€_o|_o{_o{`nz^lxao{_lx[kxUfsTenTenSdmTfoTfoZirZjv]mxYiuScpScpYiuZhxVduTfpXhtUhuSfuSftRgxThyThzRhtPcpPdqSepXhuZjv\ktXgp\v|=T[3EP5DQ8HUL`l—®¾p‹™G]b7LT5JR6GS9KV8IV8HU:IY7JT9KV>P[MZ\myyš›¨‹¤³ž°Â¸ÅªÅÖ¥ÃÖ°Ð虵΃œ°^t†DYh=T`9MXWhqbnxCLWHS\DMZ%,;as€^o|]n{Zkx_p}YjwQboYjx]jq]jr^ksbowiv~dqybowhu|ev‚jz‡jz‡fwƒ`o€[m|TixPetPfuOfuQetNbsOctRduPbsM_qOcnPdoUfr_q}XiqRclRakQ`i^wCYd/DN6HR8IV6GTlH^j>QY9LT5IP6IT5FS8IU8HY:JZ7JT;MW8JU9LY6IV7JV7L[7L[4N]:Q`®ÂÒ@S`BUb=Ra7Qasžx¦|˜­oŠŸ… ´x“§‚ž®}œ­k‰šy’£d}‘h„™[v‹|–«t’§Š¨»Œ«¼DP`AUf‚Ÿ°„¦º¤»|³†Ÿ·”ªÀ˜¶Ê”´Ë­Æ†¤À{™µz˜±Š§¾‹¤½u–£B\l?Q`Pdu–°Á’±Ã–²Ë—¬Ç‰¬¿ž¾Ö«Ìã¦ÆÝš¸Ít¡]q‚GVgP[9KV7HQ6GP7GS2BN7HU7GW9IX5EU8JT:KX8IV3FS6IV;M]5JY4IX3K]E^n•«ºRhs7MY6K[VfCYhBTbFWaBWg>Q^>OXiv~v‚‡}‰$/7S_h…‰‹„‡Šz€‚{€„v}ƒw‡x€‰xˆn}…mz†iy„]lxWgsN`oObpM^oNasJ_rI_qG_pG_sHbuJcwFbvPfxNdwShy[o~`q~euYiu]luK\eJ]dHZaEX_FV\AQWAPWBRXI`pNeu9N^=P]T`?QbQ^u‚”«…µ~Ÿ¶‡­Â„£º¡¹}Ÿ·x›³x—°}´®Èݦ»c{‹IXgETd8KZUp~ƒ¡¯e}’L^tCXjEYl=OaG[h@R]DUa=RZAV]8O`8N[=QY[gox„Šjt|":CMclsgsxis{lw€iw‚`o{[kwZjvUhwQcrQftLcrG^pG_sG`sG^uF`pFaqHauIbvIcvKcyMe|Nf}Xi}[n~aq‚ZkxXhu[luN`gK[bL\cFV]M\dGV\CSYDTZ=PS;NQLctAXh=Ra9KXCT^DQYEQXIRZDO[6CO-:F,9G$+;-M^BM\ANZNTCTYCSYASU;OR@SVf‹D_h6P\6P\5O[>YgB]kHcqTjtATaq‚‘¡o~ŽyŒš•¤t‹šr‡‘—¢Š›¦œ‘žx†¡®‘¬º£ÅÚ¥ÃÖ™©Vm|BXdATa?Rb8KZ>TXBZcF\i?ZjF`tk‡œp¦m‰£w’žsŸj†–g‚–}—­­Â—µÈ‰¨¼ƒ—¡7MY=P_.BSx£¬Á„¤»¤»ƒ£Â‚£½y—³{š³‚ž·”±Çƒž²d€–FX^>QY@R]=OZ7HU=NZ9IY;K[;J[ZoA]rB^q9Xr>Yt>XqBZsF^tBZqC[qF`sM_tK_tG_rB_tFcwFbzMgSiƒNk„Yt‰Lg}^yŠWqWo~WlxLanHfkQjoEX_IY`IU]GW^ASZBT[=VV?TV>NTDOWEPXDOUCQT>OR_x„Piu7Q]4N\5O]:TbE^nOhx˜¦¤²…˜©Šž®€“¥“©º„œ®œ¶Æ€š§‡ ®‡¬“¡‹ž¯”«º ¹É™³ÃŸÁÕ•²Å…ž®Vm|F\gI[h@Rb;N]DXXCV[K^fNaoVi|F`pvŽ¡}—¨|™§z—¥o‰žqŒ¡v“¨´Ñæ»Î•³ÇXpxC[g@Ud9M^tŠ›’ªÁx•®„¤»‹©Ã…¥¼€¶{–¬d€•Up€F]q?YjBT[BU]>P\:LW;LZ8JV:JZ9IZ4EQ6GT8IVNUBMUFPXAMS?NQ=OPl†”Sm{6P^2K[5O^:ScC[mLdul…˜š®™­vŽ¢ƒš°~–«~™®m‹Ÿq¥lŠ}—«{“§‡ ´‹¥µŒ¨¹©¹˜¹Î–¶Év‘¢k…’?Sb@Ud@Ud=PbKZ^N]dTemZlvK^kYo{Umyw˜~œ«z–¦{–ªš¯¡¿ÓŸ¼Ñ™·É„¢¶_{…?Ye>Tc.EUwŸ…š°‡Ÿµ™°`yŽk†–;Sf@Wg>Vf0EUNT9KUThwLcuGbuKfzMgzLezHeyEauLh{Kf~Hg}Gf|IfKl†NoˆSuKk‚Po‡Sp…Ok€jƒ—Œ ¶y¡}‘£p†–atI]hN_kCV^CT^BQZ@OX?NW?NW>OX:MU9MS@QZ>NV@LVAMW=KQ?MP=OPz’£Xq5N^6N`1I[;SeAYmH`ti†žz–®„µXsˆuŽ§g‚œWuŽqª‚¡º{š³|›²r‘¨}˜±Œ©¾‹¨½‘®Â¥ÆÚ›»Î‘¬½n‡—Xf5Q^9Rb>Uem€’?TfBUl:P^>Td?R_BVc9KU>P[5GR:IVQY8LT?MN@OU;MS7JUE^mJg{Mj„JhˆPm…PrˆXz“Vz“Tx”JoŠVz˜l«zž¼£Â‡©ÇŽ±ÉŽ¯Æ–¶Ì•°Äˆ¥¹{Ž¡]q‚UgyPdsL]jHYf=OZBU`AR[DU^>LV?MVAPY?PZ;KUMVAQY;IU>IVBNXAOUBSV@RSr‹›_wŠ5M_/GY1I[7OcC[oNfzr«v”­w“«b”Ie~=\u6Tp=^{Xwc‚›l‹¥kŠ£}ž´ˆ§¾žµ‰¤¼ž¿Öš¹Î|˜¨pŠšC]k;Uc:ScWkE]qC^r‡¡¹„ ¸}š® ²†¨¶€š¯€Ÿ±‹¨½§ÃÛ¨ÄÜ”³È‘±Ä}ž®VsB`oOX>OV>PX4GNASZ7JQ:LSASZ>QXCQY;GQ7FOBQZ@NX@PV?PS=OPšªd}>Wg0HZ2J\7OaBZoNfzn‰¤uªmˆXs‡9Ti5Qj$A]"@]">RJh}s’¨q‘©u–­w—®„¡»‡¥¾ŸÀÖ‰¨½‚ ³VpIcsPY>PX:RW5MR5MQ6OS4JO;OT9LR;LRMT9KS=OVOS|–¤k„”D]m3L\4M]7OaBZlOgynˆ¢x”©s\u…Ict-H\,Gb4S4GX,CS™³Ä‹©½z˜®€ ·}›´…£¼ž¾Õˆ¦»ƒ ³c~Jdt;Ue6Sb3O`7Ug@_rIf|Lh‡¢¼ƒ¢»ƒ¢ºv–«‚Ÿ´…¡º“¯Ç­Ç¼Ó‰¨½‰ª½q”£Wn€>VhRYPX:OW8MU=SY9NTEdcDdc8WV+JI1MM2KK=OP:ILCQMDRP9KL@SV=QV>RV>NT=LO{•¢sš=We7O_6O_7P`B[kPhzqˆ z‘¥i‚‘Xn}=Wd0IZ,G_8T7EO/AN{–£Œ¨¸Š«¾z˜±„¡»…£¼Ÿ¿×¯Ä‰§ºu‘¡[y‡9Vd7Tc2Pa;V`A[iLeuTm‚š¯‹£¸z“¦uŽ pŒ¥€›³|–°‘¯È®Å‡¦»‹¬¿y¬h|PP:IK=KHBNO=MR6J[2Kd3Qq8Sx8Vw4Uu2Vo9\uMj[pƒ]l~QhtJ\gQ_kJV_T\fO\cDSZ=OU=PX:MU2IP;QX7NT7MT9MT#5>UuuCgfMqpRrsPmnF[].15>CMXPLYUburF[\DY^ATZ?NUN[bs‘¤eƒ–7Sd0JZ3L\6Pa@YmMh|x˜¯}š¯}–ª\wŒ7Wj3Sf.F\'5O;R[7M_r‹¦†¤¾„¥¹€¢±ƒ¢·Œ¦Á™¼ËŒ­½~œ¯k…š^yMV6EN8GP7KS5HO9LS5IM6JO9JLP[?Q\9KV4HO-;G7CO4@L2BIAWZ40SyqDyk?uf:oaH|jF{iPpPqN€mL…sU{p.A>{‚ƒENQ0BA9SO4OKu“¦b€“?Yj1JZ4M];SeB[pKg{}žµtŽ£n‡›h„•4Ue3Sf+CY%3N5LU,BTr‹¦€ž·†¨»†¨¸‚¡¶¨ÃŸÂщªºqŽ¢hƒ—Jcw?[o>Yn3Pe5Wf@]nHcwTk‚d|”i‚u«v“¯w–ªs’©¶’°É‡¥¿Œ«Âv•ªr“¦k„”Ics:Sc5L\8L]1CT6EV5DV3HR3GR3GR2ES2CP0AN2CP4DR3DM4EN8IR9KT>MV;JS:IR:HR6IP6HO9LS9IPPZXi5N^8Qa;SeB[oLeys•¨l‡œv£Uq‚<^m0Qd.DZ 0G/FP2H[Œ¥À ¹†¨»}Ÿ¯|›°†¡¼§ÈÚ­À{™¬rŠž_xŒD]r:Sh7Sd7Vi@^qGbwOf}Wo…t¦t¨t”«y˜­w–­†¤½‰§À‰§ÁŸµŠ©¾w—ªr‹›Rl|:Sc6M]7K\2CT3EV5DV4HR2FQ1FQ4FQ3EP5HS9IU8GT;MT4FM3FMMR>MSCNT;OS;NS7IP9KRL]fJZfO_k`p|]mzTdq[kwUdpOalHYeGZb>RXBS`=N[AR_;LY7HU9JW:KX4FS1AM6EP6>L!+2;EBNRFXWf|xTwJunN|rM}tExnG|rHqKƒv?€pG†wC€ui®¥qÀµuºr¹®†Ä»~œ¯f•B\m?Xh7P`?WiHauIbvt“¨r¢o‡›[u†8Zj5Sf)?V!.EE\f?Ugš´Î…£¼‚£·~ ¯q¥Š¥Àš¿Ð‰ª½v”§w‘¡¥·Zq€>Wh4M]:UkC^sHcxNh}Xsˆw”©}š¯v“¨†¥º~´‰§À‰§ÀŠ¨Á†¥¼ž³~ž±ržUn~KSKS>KSANV:GPALTHP2EK9KR:MSFW`N`hRbnP`lO_kP]kKWfJ[fGWcBT^?S^DYcR$1IAXb8Na£½×‰§Àt•©£²Ÿµ‘«ÆÁÔˆ¨»}›®§¸Wn~L`oKR;LUEV_^ow[ltO_kTdpQamO`lKXdIWbBR_@P]?O\>Q^:NZ;N[;KX7GT3DP1AN7GS9IV3CP5FR0=K.:F1;E")35;@JOR"'*"''46-/ $"!=:Xurs‚~rŒ†ZŠ‚:€u^¯¤o¸±M~zg„…y”¨oˆœNfx?VfAXhF\nf~’€˜¬t”©~—«q‰›f€=\k/M^(=R!.E1HRAWi©Â݉§À}ž²£³ž³”®ÉœÀÓ„¥¸­ÀŠ£²^s‚3FS7IT3FM9RhE^rIdyPm‚ZyŽkŠ¡{–®{—¯¡µ‡¦¾ƒ¡º®Ç‡¥¾Š©À{š¯~ž±|–«fƒ“?Yj2K[6M]3HW1FU4GS4ER6GT7IT6FR8IR1DK6FM;KR;KR=MT7HN?LT>KSCEJM&)- #(-/527:48;7>A!!"1-&FAc‡r™—sŽ‡•šsŽ¢uŽ¢^vˆRiyj‘p†˜y’¦ƒš®{™¬ˆ¡µŒ¢´x’¢:Zi0N_(=R!-C4>1GYœ¶Ðy˜±w™¬{¬†¥º©Ä›ÁÔˆ©½«ÉÜn‡–ZlyJ\g:KT/AG5K_C[mFavKjSr‰j‡¡r‘©u«v–ªƒ¢¹ƒ¡º”²Ë«Ä…¤»‰¨½ ²w•¨l†›NU9IN=MSMS>JP:FL6CL8DM7HO;;LR9GM9EJ/;A5AG7EJ=MT?OUAR[WgpZlwM_jXjuQaoM]kJ\gFXcAS^>P[:LW\o=Wf7Q_;Q]6JU7HS1FQ4HT6KS9KS7IP6FM;IO>IO:PR7LM:MU3EM1AN%7@=KU;KQ?QX:LSWip[msQbkRclVgpPajCV^J]e@S[N.;K$/='4#,!&!%/45#"#(' .,,&!"+"O93D($gRQqgj~„r£j…™rŒ¡nˆw’§mˆ~˜°v¨|›«€›¬i…–^xˆOhx@WgCWfMap‡¡²›µÆ‰¥¶›¯™¸Ê’²Ç•´É›½Ð•¶É‚¢µ~š«azŠEZi6FSARZ8GP/BM/CRJ_u\ty•¯s§u”©w•§~·‚£¹°Ç¦Æ݈§¾~²~²r‘¦†¥º{œ¯:Xk5N^9Tb:O[9MW3GR4FQ7IT9LT9MU6IO9IPF:FP1>J@LX?KULWbSfm\nuQcjQcjL]fHYbK\eFW`GZb>QY:MT>P[7IT:LW6GT7HT6FV9IY8HX6FV7GW8HX7GW7GW3CS3CS1AQ3BR/>N,G19FAJWZbp\fpfnyNahFX_GY_@QZHYbEV_;LTFUbDW_:MT;MX5GR:LV3CQ3DQ4FR3CT5EU4DT3CS6FV6FV5EU4DT1BR/?O/>N.=M-P[2DO6GT2CP6GT3EQ3CS3CS4DT7GW4DT5EU3CS->N2AQ.=M0?O.=M.;K+8H2?O#1A"0*& &6<=%%% ebdLNLAIB&!)"&¦È‹±Ñ€£Äv˜¶„¤ÁŒªÅ…£¼{–°m‰¡s§Ws‹s’©–µÌ¬Â¯Æ‚¡¸¤¿„§Á…©Âž¿Ù“°Ëž»Ö¬Äœ¶‹«Â ¿Ó©¹l†”OdoDVa;KW8ER7FO/@N*>QuŽ¤‰¤¿‰§À†¦½“´È‡¦À›»ÒŸ¿Ö¡Áخņ¥ºŽ­Â†¥º„¥·mŠRq„@[l=Vh9Rb:Qa6M]:MS9JS5DM:FP:DM4@L3AM:JV?U\-AL·Êו§´Ÿ¶ÂmƒRhsLdkCT]HYb?PY>PX:JWL3DQ4ER4ER3CS3CS2BR3CS1AQ4DT6FV4DT/?O1@P2AQ.=M1>N0=M-;K2(6"/#-$$)*  %!&XWY@ECCJE87.\RKgXRz¢Åj“´j°xœº€ ½t’­l‡¡t¨{—¯f…œo¦Œ«Ä‚¡º‹¬Æv—±yœ¶£Áa…£†§Ä}Ÿ¼‰©ÆŽ®ËªÅŒªÅ‘°É•´ÉŒ©·[t€Kak;MX9HT8ES4DJ2BO.CTBZq…¡»Œ«Ã’°ÊŒ®ÅŒ«Ä¤ÅÛ ÀׯƎ¬ÄŒ«Àt“¨n¢|¯v”§`~‘B]n=Wh:Te9Qa1K[4HO6IQ6DM2=J,8D0>JDVa9KX‘®¹”®¹›©LguwNfr=Va3/ub]B)%bŒ±h³q—¹vš¸q‘®v”­‚œ´v‘¦m‹¤pŽ§ ¹ƒ¥¿ˆ«Å}Ÿ¼~£¿{ ¼¤Åƒ¦Çv—¸†¨Æ„¦Ä}Ÿ¼Ž°Í€¢¿®ÇŽ­Â|˜§j…ŽE\d@RZ:JW6BS9FL/?L/AS0H^“®É†¥¾³Ë’´Ê®Ç¯Æ£ÃÚŸ¶‹ªÁ…¤¹z™®s’§{™«w•¨g†™NX:KT9JS7GS2BN:JU6FS9HV2EO.?L5FS1BO0AM1AQ1AQ1AQ2BR2BR2BR2BR1AQ3CS4DT3CS2AQ0=M0=M/K[9FM3CP*Ym=Yj:Te8Rc6Pb1KQ/FO9IR>KX…“Ÿœ­º}–¢^x†[vƒf}ŒOct:L]BQbAN\;GSDMW;MV5GO1AM5EQ5EQ5ER9IV3BO1BO/@M3DQ/@L3CS/?O0@P2BR0@P0@P2BR3CS0@P1AQ1AQ1AQ,9I0=M1>N'4D+5F1;L'1B'1C"-;!*7$.$*&+/&*+"'((,-".+%-,#"%$#!!,+'/+*=98%-& +\ No newline at end of file +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Makefile b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile +new file mode 100644 +index 0000000..c9ddf23 +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile +@@ -0,0 +1,5 @@ ++OBJS=triangle.o ++BIN=hello_wayland.bin ++LDFLAGS+=-lwayland-client -lwayland-egl ++ ++include ../Makefile.include +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h +new file mode 100644 +index 0000000..663e23b +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h +@@ -0,0 +1,100 @@ ++/* ++Copyright (c) 2012, Broadcom Europe Ltd ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. ++*/ ++ ++// Spatial coordinates for the cube ++ ++static const GLbyte quadx[6*4*3] = { ++ /* FRONT */ ++ -10, -10, 10, ++ 10, -10, 10, ++ -10, 10, 10, ++ 10, 10, 10, ++ ++ /* BACK */ ++ -10, -10, -10, ++ -10, 10, -10, ++ 10, -10, -10, ++ 10, 10, -10, ++ ++ /* LEFT */ ++ -10, -10, 10, ++ -10, 10, 10, ++ -10, -10, -10, ++ -10, 10, -10, ++ ++ /* RIGHT */ ++ 10, -10, -10, ++ 10, 10, -10, ++ 10, -10, 10, ++ 10, 10, 10, ++ ++ /* TOP */ ++ -10, 10, 10, ++ 10, 10, 10, ++ -10, 10, -10, ++ 10, 10, -10, ++ ++ /* BOTTOM */ ++ -10, -10, 10, ++ -10, -10, -10, ++ 10, -10, 10, ++ 10, -10, -10, ++}; ++ ++/** Texture coordinates for the quad. */ ++static const GLfloat texCoords[6 * 4 * 2] = { ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++ ++ 0.f, 0.f, ++ 1.f, 0.f, ++ 0.f, 1.f, ++ 1.f, 1.f, ++}; ++ +diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c +new file mode 100644 +index 0000000..1a7bfc4 +--- /dev/null ++++ b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c +@@ -0,0 +1,666 @@ ++/* ++Copyright (c) 2012, Broadcom Europe Ltd ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ * Neither the name of the copyright 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. ++*/ ++ ++// A rotating cube rendered with OpenGL|ES. Three images used as textures on the cube faces. ++ ++#define _GNU_SOURCE ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "GLES/gl.h" ++#include "EGL/egl.h" ++#include "EGL/eglext.h" ++ ++#include "cube_texture_and_coords.h" ++ ++#define PATH "./" ++ ++#define IMAGE_SIZE 128 ++ ++#ifndef M_PI ++ #define M_PI 3.141592654 ++#endif ++ ++ ++typedef struct ++{ ++ uint32_t screen_width; ++ uint32_t screen_height; ++// OpenGL|ES objects ++ EGLDisplay display; ++ EGLSurface surface; ++ EGLContext context; ++ GLuint tex[6]; ++// model rotation vector and direction ++ GLfloat rot_angle_x_inc; ++ GLfloat rot_angle_y_inc; ++ GLfloat rot_angle_z_inc; ++// current model rotation angles ++ GLfloat rot_angle_x; ++ GLfloat rot_angle_y; ++ GLfloat rot_angle_z; ++// current distance from camera ++ GLfloat distance; ++ GLfloat distance_inc; ++// pointers to texture buffers ++ char *tex_buf1; ++ char *tex_buf2; ++ char *tex_buf3; ++ struct wl_display *wl_display; ++ struct wl_registry *wl_registry; ++ struct wl_shell *wl_shell; ++ struct wl_shell_surface *wl_shell_surface; ++ struct wl_compositor *wl_compositor; ++ struct wl_surface *wl_surface; ++ struct wl_callback *wl_callback; ++ struct wl_egl_window *wl_egl_window; ++ int needs_update; ++ int ellapsed_frames; ++ int kill_compositor; ++ int single_frame; ++ int terminate_abruptly; ++} CUBE_STATE_T; ++ ++static void init_ogl(CUBE_STATE_T *state); ++static void init_model_proj(CUBE_STATE_T *state); ++static void reset_model(CUBE_STATE_T *state); ++static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc); ++static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc); ++static void redraw_scene(CUBE_STATE_T *state); ++static void update_model(CUBE_STATE_T *state); ++static void init_textures(CUBE_STATE_T *state); ++static void load_tex_images(CUBE_STATE_T *state); ++static void exit_func(CUBE_STATE_T *state); ++ ++static void ++registry_handle_global(void *data, struct wl_registry *registry, ++ uint32_t name, const char *interface, uint32_t version) ++{ ++ CUBE_STATE_T *state = data; ++ ++ if (strcmp(interface, "wl_compositor") == 0) { ++ state->wl_compositor = ++ wl_registry_bind(registry, name, ++ &wl_compositor_interface, 1); ++ } else if (strcmp(interface, "wl_shell") == 0) { ++ state->wl_shell = wl_registry_bind(registry, name, ++ &wl_shell_interface, 1); ++ } ++} ++ ++static void ++registry_handle_global_remove(void *data, struct wl_registry *registry, ++ uint32_t name) ++{ ++} ++ ++static const struct wl_registry_listener registry_listener = { ++ registry_handle_global, ++ registry_handle_global_remove ++}; ++ ++/*********************************************************** ++ * Name: init_ogl ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Sets the display, OpenGL|ES context and screen stuff ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void init_ogl(CUBE_STATE_T *state) ++{ ++ EGLBoolean result; ++ EGLint num_config; ++ ++ static const EGLint attribute_list[] = ++ { ++ EGL_RED_SIZE, 8, ++ EGL_GREEN_SIZE, 8, ++ EGL_BLUE_SIZE, 8, ++ EGL_ALPHA_SIZE, 8, ++ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, ++ EGL_NONE ++ }; ++ ++ EGLConfig config; ++ ++ state->wl_display = wl_display_connect(NULL); ++ ++ state->wl_registry = wl_display_get_registry(state->wl_display); ++ wl_registry_add_listener(state->wl_registry, ®istry_listener, state); ++ ++ wl_display_dispatch(state->wl_display); ++ ++ // get an EGL display connection ++ state->display = eglGetDisplay(state->wl_display); ++ assert(state->display!=EGL_NO_DISPLAY); ++ ++ // initialize the EGL display connection ++ result = eglInitialize(state->display, NULL, NULL); ++ assert(EGL_FALSE != result); ++ ++ // get an appropriate EGL frame buffer configuration ++ result = eglChooseConfig(state->display, attribute_list, &config, 1, &num_config); ++ assert(EGL_FALSE != result); ++ ++ // create an EGL rendering context ++ state->context = eglCreateContext(state->display, config, EGL_NO_CONTEXT, NULL); ++ assert(state->context!=EGL_NO_CONTEXT); ++ ++ // create an EGL window surface ++ state->screen_width = 1024; ++ state->screen_height = 860; ++ ++ state->wl_surface = wl_compositor_create_surface(state->wl_compositor); ++ state->wl_shell_surface = wl_shell_get_shell_surface(state->wl_shell, state->wl_surface); ++ ++ wl_shell_surface_set_toplevel(state->wl_shell_surface); ++ wl_shell_surface_set_title(state->wl_shell_surface, "triangle.c"); ++ ++ state->wl_egl_window = wl_egl_window_create(state->wl_surface, state->screen_width, state->screen_height); ++ ++ state->surface = eglCreateWindowSurface( state->display, config, state->wl_egl_window, NULL ); ++ assert(state->surface != EGL_NO_SURFACE); ++ ++ // connect the context to the surface ++ result = eglMakeCurrent(state->display, state->surface, state->surface, state->context); ++ assert(EGL_FALSE != result); ++ ++ // Set background color and clear buffers ++ glClearColor(0.15f, 0.25f, 0.35f, 1.0f); ++ ++ // Enable back face culling. ++ glEnable(GL_CULL_FACE); ++ ++ glMatrixMode(GL_MODELVIEW); ++} ++ ++/*********************************************************** ++ * Name: init_model_proj ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Sets the OpenGL|ES model to default values ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void init_model_proj(CUBE_STATE_T *state) ++{ ++ float nearp = 1.0f; ++ float farp = 500.0f; ++ float hht; ++ float hwd; ++ ++ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); ++ ++ glViewport(0, 0, (GLsizei)state->screen_width, (GLsizei)state->screen_height); ++ ++ glMatrixMode(GL_PROJECTION); ++ glLoadIdentity(); ++ ++ hht = nearp * (float)tan(45.0 / 2.0 / 180.0 * M_PI); ++ hwd = hht * (float)state->screen_width / (float)state->screen_height; ++ ++ glFrustumf(-hwd, hwd, -hht, hht, nearp, farp); ++ ++ glEnableClientState( GL_VERTEX_ARRAY ); ++ glVertexPointer( 3, GL_BYTE, 0, quadx ); ++ ++ reset_model(state); ++} ++ ++/*********************************************************** ++ * Name: reset_model ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Resets the Model projection and rotation direction ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void reset_model(CUBE_STATE_T *state) ++{ ++ // reset model position ++ glMatrixMode(GL_MODELVIEW); ++ glLoadIdentity(); ++ glTranslatef(0.f, 0.f, -50.f); ++ ++ // reset model rotation ++ state->rot_angle_x = 45.f; state->rot_angle_y = 30.f; state->rot_angle_z = 0.f; ++ state->rot_angle_x_inc = 0.5f; state->rot_angle_y_inc = 0.5f; state->rot_angle_z_inc = 0.f; ++ state->distance = 40.f; ++} ++ ++/*********************************************************** ++ * Name: update_model ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Updates model projection to current position/rotation ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void update_model(CUBE_STATE_T *state) ++{ ++ // update position ++ state->rot_angle_x = inc_and_wrap_angle(state->rot_angle_x, state->rot_angle_x_inc); ++ state->rot_angle_y = inc_and_wrap_angle(state->rot_angle_y, state->rot_angle_y_inc); ++ state->rot_angle_z = inc_and_wrap_angle(state->rot_angle_z, state->rot_angle_z_inc); ++ state->distance = inc_and_clip_distance(state->distance, state->distance_inc); ++ ++ glLoadIdentity(); ++ // move camera back to see the cube ++ glTranslatef(0.f, 0.f, -state->distance); ++ ++ // Rotate model to new position ++ glRotatef(state->rot_angle_x, 1.f, 0.f, 0.f); ++ glRotatef(state->rot_angle_y, 0.f, 1.f, 0.f); ++ glRotatef(state->rot_angle_z, 0.f, 0.f, 1.f); ++} ++ ++/*********************************************************** ++ * Name: inc_and_wrap_angle ++ * ++ * Arguments: ++ * GLfloat angle current angle ++ * GLfloat angle_inc angle increment ++ * ++ * Description: Increments or decrements angle by angle_inc degrees ++ * Wraps to 0 at 360 deg. ++ * ++ * Returns: new value of angle ++ * ++ ***********************************************************/ ++static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc) ++{ ++ angle += angle_inc; ++ ++ if (angle >= 360.0) ++ angle -= 360.f; ++ else if (angle <=0) ++ angle += 360.f; ++ ++ return angle; ++} ++ ++/*********************************************************** ++ * Name: inc_and_clip_distance ++ * ++ * Arguments: ++ * GLfloat distance current distance ++ * GLfloat distance_inc distance increment ++ * ++ * Description: Increments or decrements distance by distance_inc units ++ * Clips to range ++ * ++ * Returns: new value of angle ++ * ++ ***********************************************************/ ++static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc) ++{ ++ distance += distance_inc; ++ ++ if (distance >= 120.0f) ++ distance = 120.f; ++ else if (distance <= 40.0f) ++ distance = 40.0f; ++ ++ return distance; ++} ++ ++static pid_t get_server_pid(CUBE_STATE_T *state) ++{ ++ struct ucred ucred; ++ socklen_t len; ++ int fd; ++ ++ fd = wl_display_get_fd(state->wl_display); ++ len = sizeof ucred; ++ getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len); ++ ++ return ucred.pid; ++} ++ ++static void ++frame(void *data, struct wl_callback *callback, uint32_t time) ++{ ++ CUBE_STATE_T *state = (CUBE_STATE_T *) data; ++ ++ state->needs_update = 1; ++} ++ ++static const struct wl_callback_listener frame_listener = { ++ frame ++}; ++ ++static void ++update(CUBE_STATE_T *state) ++{ ++ if (!state->single_frame || state->ellapsed_frames == 0) { ++ update_model(state); ++ redraw_scene(state); ++ } ++ ++ state->wl_callback = wl_surface_frame(state->wl_surface); ++ wl_callback_add_listener(state->wl_callback, &frame_listener, state); ++ ++ if (state->ellapsed_frames == 100) { ++ if (state->kill_compositor) { ++ fprintf(stderr, "reached frame 100, killing compositor\n"); ++ pid_t pid = get_server_pid(state); ++ kill(pid, SIGTERM); ++ } else if (state->terminate_abruptly) { ++ fprintf(stderr, "reached frame 100, terminating right away\n"); ++ exit_func(state); ++ exit(0); ++ } ++ } ++ ++ if (!state->single_frame || state->ellapsed_frames == 0) ++ eglSwapBuffers(state->display, state->surface); ++ else { ++ wl_surface_damage(state->wl_surface, 0, 0, state->screen_width, ++ state->screen_height); ++ wl_surface_commit(state->wl_surface); ++ } ++ ++ state->ellapsed_frames++; ++} ++ ++/*********************************************************** ++ * Name: redraw_scene ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Draws the model and calls eglSwapBuffers ++ * to render to screen ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void redraw_scene(CUBE_STATE_T *state) ++{ ++ // Start with a clear screen ++ glClear( GL_COLOR_BUFFER_BIT ); ++ ++ // Draw first (front) face: ++ // Bind texture surface to current vertices ++ glBindTexture(GL_TEXTURE_2D, state->tex[0]); ++ ++ // Need to rotate textures - do this by rotating each cube face ++ glRotatef(270.f, 0.f, 0.f, 1.f ); // front face normal along z axis ++ ++ // draw first 4 vertices ++ glDrawArrays( GL_TRIANGLE_STRIP, 0, 4); ++ ++ // same pattern for other 5 faces - rotation chosen to make image orientation 'nice' ++ glBindTexture(GL_TEXTURE_2D, state->tex[1]); ++ glRotatef(90.f, 0.f, 0.f, 1.f ); // back face normal along z axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 4, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[2]); ++ glRotatef(90.f, 1.f, 0.f, 0.f ); // left face normal along x axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 8, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[3]); ++ glRotatef(90.f, 1.f, 0.f, 0.f ); // right face normal along x axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 12, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[4]); ++ glRotatef(270.f, 0.f, 1.f, 0.f ); // top face normal along y axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 16, 4); ++ ++ glBindTexture(GL_TEXTURE_2D, state->tex[5]); ++ glRotatef(90.f, 0.f, 1.f, 0.f ); // bottom face normal along y axis ++ glDrawArrays( GL_TRIANGLE_STRIP, 20, 4); ++} ++ ++/*********************************************************** ++ * Name: init_textures ++ * ++ * Arguments: ++ * CUBE_STATE_T *state - holds OGLES model info ++ * ++ * Description: Initialise OGL|ES texture surfaces to use image ++ * buffers ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void init_textures(CUBE_STATE_T *state) ++{ ++ // load three texture buffers but use them on six OGL|ES texture surfaces ++ load_tex_images(state); ++ glGenTextures(6, &state->tex[0]); ++ ++ // setup first texture ++ glBindTexture(GL_TEXTURE_2D, state->tex[0]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // setup second texture - reuse first image ++ glBindTexture(GL_TEXTURE_2D, state->tex[1]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // third texture ++ glBindTexture(GL_TEXTURE_2D, state->tex[2]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // fourth texture - reuse second image ++ glBindTexture(GL_TEXTURE_2D, state->tex[3]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ //fifth texture ++ glBindTexture(GL_TEXTURE_2D, state->tex[4]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // sixth texture - reuse third image ++ glBindTexture(GL_TEXTURE_2D, state->tex[5]); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, ++ GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); ++ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); ++ ++ // setup overall texture environment ++ glTexCoordPointer(2, GL_FLOAT, 0, texCoords); ++ glEnableClientState(GL_TEXTURE_COORD_ARRAY); ++ ++ glEnable(GL_TEXTURE_2D); ++} ++ ++/*********************************************************** ++ * Name: load_tex_images ++ * ++ * Arguments: ++ * void ++ * ++ * Description: Loads three raw images to use as textures on faces ++ * ++ * Returns: void ++ * ++ ***********************************************************/ ++static void load_tex_images(CUBE_STATE_T *state) ++{ ++ FILE *tex_file1 = NULL, *tex_file2=NULL, *tex_file3 = NULL; ++ int bytes_read, image_sz = IMAGE_SIZE*IMAGE_SIZE*3; ++ ++ state->tex_buf1 = malloc(image_sz); ++ state->tex_buf2 = malloc(image_sz); ++ state->tex_buf3 = malloc(image_sz); ++ ++ tex_file1 = fopen(PATH "Lucca_128_128.raw", "rb"); ++ if (tex_file1 && state->tex_buf1) ++ { ++ bytes_read=fread(state->tex_buf1, 1, image_sz, tex_file1); ++ assert(bytes_read == image_sz); // some problem with file? ++ fclose(tex_file1); ++ } ++ ++ tex_file2 = fopen(PATH "Djenne_128_128.raw", "rb"); ++ if (tex_file2 && state->tex_buf2) ++ { ++ bytes_read=fread(state->tex_buf2, 1, image_sz, tex_file2); ++ assert(bytes_read == image_sz); // some problem with file? ++ fclose(tex_file2); ++ } ++ ++ tex_file3 = fopen(PATH "Gaudi_128_128.raw", "rb"); ++ if (tex_file3 && state->tex_buf3) ++ { ++ bytes_read=fread(state->tex_buf3, 1, image_sz, tex_file3); ++ assert(bytes_read == image_sz); // some problem with file? ++ fclose(tex_file3); ++ } ++} ++ ++//------------------------------------------------------------------------------ ++ ++static void exit_func(CUBE_STATE_T *state) ++{ ++ // clear screen ++ glClear( GL_COLOR_BUFFER_BIT ); ++ eglSwapBuffers(state->display, state->surface); ++ ++ // Release OpenGL resources ++ eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); ++ ++ wl_egl_window_destroy(state->wl_egl_window); ++ wl_shell_surface_destroy(state->wl_shell_surface); ++ wl_surface_destroy(state->wl_surface); ++ ++ eglDestroySurface( state->display, state->surface ); ++ eglDestroyContext( state->display, state->context ); ++ eglTerminate( state->display ); ++ ++ wl_display_flush(state->wl_display); ++ ++ // release texture buffers ++ free(state->tex_buf1); ++ free(state->tex_buf2); ++ free(state->tex_buf3); ++ ++ printf("\ncube closed\n"); ++} // exit_func() ++ ++static int running = 1; ++ ++static void ++signal_int(int signum) ++{ ++ running = 0; ++} ++ ++//============================================================================== ++ ++int main (int argc, char *argv[]) ++{ ++ struct sigaction sigint; ++ CUBE_STATE_T state = {0,}; ++ int ret = 0; ++ int i; ++ ++ for (i = 0; i < argc; i++) { ++ if (strcmp(argv[i], "--kill-compositor") == 0) ++ state.kill_compositor = 1; ++ if (strcmp(argv[i], "--single-frame") == 0) ++ state.single_frame = 1; ++ if (strcmp(argv[i], "--terminate-abruptly") == 0) ++ state.terminate_abruptly = 1; ++ else if (strcmp(argv[i], "--help") == 0 || ++ strcmp(argv[i], "-h") == 0) { ++ printf("Usage: hello_wayland.bin [OPTION]\n\n"); ++ printf("\t--kill-compositor\tkill the Wayland compositor after 100 frames\n"); ++ printf("\t-h, --help\t\tshow this text\n"); ++ printf("\t--single-frame\t\tupdate the display only once\n"); ++ printf("\t--terminate-abruptly\texit right after rendering the 100th frame\n"); ++ return 0; ++ } ++ } ++ ++ // Start OGLES ++ init_ogl(&state); ++ ++ // Setup the model world ++ init_model_proj(&state); ++ ++ // initialise the OGLES texture(s) ++ init_textures(&state); ++ ++ sigint.sa_handler = signal_int; ++ sigemptyset(&sigint.sa_mask); ++ sigint.sa_flags = SA_RESETHAND; ++ sigaction(SIGINT, &sigint, NULL); ++ ++ state.needs_update = 1; ++ while (running && ret != -1) { ++ if (state.needs_update) { ++ update(&state); ++ state.needs_update = 0; ++ } ++ ++ ret = wl_display_dispatch(state.wl_display); ++ } ++ ++ exit_func(&state); ++ ++ return 0; ++} ++ +diff --git a/host_applications/linux/apps/hello_pi/rebuild.sh b/host_applications/linux/apps/hello_pi/rebuild.sh +index fa4539e..37120ac 100755 +--- a/host_applications/linux/apps/hello_pi/rebuild.sh ++++ b/host_applications/linux/apps/hello_pi/rebuild.sh +@@ -13,6 +13,7 @@ make -C hello_jpeg clean + make -C hello_videocube clean + make -C hello_teapot clean + make -C hello_fft clean ++make -C hello_wayland clean + + make -C libs/ilclient + make -C libs/vgfont +@@ -29,4 +30,4 @@ make -C hello_jpeg + make -C hello_videocube + make -C hello_teapot + make -C hello_fft +- ++make -C hello_wayland +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0004-wayland-egl-Add-bcm_host-to-dependencies.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0004-wayland-egl-Add-bcm_host-to-dependencies.patch new file mode 100644 index 000000000..2a44e2658 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0004-wayland-egl-Add-bcm_host-to-dependencies.patch @@ -0,0 +1,28 @@ +From e3df3fec01aefac3ec301f6f3d5ec3e91652b9c5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Mon, 10 Aug 2015 02:38:27 -0700 +Subject: [PATCH 04/13] wayland-egl: Add bcm_host to dependencies + +It uses headers like vcos_platform_types.h but does not +depend on module which should add the required include paths +lets add the dependency on bcm_host module which should do it + +Signed-off-by: Khem Raj +--- + interface/khronos/wayland-egl/wayland-egl.pc.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/interface/khronos/wayland-egl/wayland-egl.pc.in b/interface/khronos/wayland-egl/wayland-egl.pc.in +index 8bafc15..fd259c9 100644 +--- a/interface/khronos/wayland-egl/wayland-egl.pc.in ++++ b/interface/khronos/wayland-egl/wayland-egl.pc.in +@@ -6,5 +6,6 @@ includedir=${prefix}/include + Name: wayland-egl + Description: VideoCore wayland-egl library + Version: @PROJECT_APIVER@ ++Requires: bcm_host + Libs: -L${libdir} -lwayland-egl + Cflags: -I${includedir} +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch new file mode 100644 index 000000000..6f4193296 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0005-interface-remove-faulty-assert-to-make-weston-happy-.patch @@ -0,0 +1,29 @@ +From 6c9d407c9ec0859380e7bcf35cf915cef4b3687b Mon Sep 17 00:00:00 2001 +From: "Yann E. MORIN" +Date: Sat, 24 Jan 2015 22:07:19 +0100 +Subject: [PATCH 05/13] interface: remove faulty assert() to make weston happy + at runtime + +This was removed after a discussion on IRC with the weston guys +('daniels' on irc.freenode.net/#wayland). + +Signed-off-by: "Yann E. MORIN" +--- + interface/vmcs_host/vc_vchi_dispmanx.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.c b/interface/vmcs_host/vc_vchi_dispmanx.c +index 3e668f5..8e065dc 100755 +--- a/interface/vmcs_host/vc_vchi_dispmanx.c ++++ b/interface/vmcs_host/vc_vchi_dispmanx.c +@@ -1304,7 +1304,6 @@ static void *dispmanx_notify_func( void *arg ) { + // Decrement the use count - the corresponding "use" is in vc_dispmanx_update_submit. + vchi_service_release(dispmanx_client.notify_handle[0]); + if (dispmanx_client.update_callback ) { +- vcos_assert( dispmanx_client.pending_update_handle == handle); + dispmanx_client.update_callback(handle, dispmanx_client.update_callback_param); + } + } else { +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0006-zero-out-wl-buffers-in-egl_surface_free.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0006-zero-out-wl-buffers-in-egl_surface_free.patch new file mode 100644 index 000000000..2d522664a --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0006-zero-out-wl-buffers-in-egl_surface_free.patch @@ -0,0 +1,33 @@ +From e3ffe9438fe8417586d0045d00eb1368ca3a71b6 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 11:10:47 -0800 +Subject: [PATCH 06/13] zero-out wl buffers in egl_surface_free + +origins from buildroot + +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client_surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 49cf7e5..512c83b 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -690,11 +690,13 @@ void egl_surface_free(EGL_SURFACE_T *surface) + if (surface->back_wl_buffer) { + wl_buffer_destroy(surface->back_wl_buffer->wl_buffer); + free(surface->back_wl_buffer); ++ surface->back_wl_buffer = 0; + } + + if (surface->front_wl_buffer) { + wl_buffer_destroy(surface->front_wl_buffer->wl_buffer); + free(surface->front_wl_buffer); ++ surface->front_wl_buffer = 0; + } + #endif + } +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0007-initialize-front-back-wayland-buffers.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0007-initialize-front-back-wayland-buffers.patch new file mode 100644 index 000000000..f54f77d7e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0007-initialize-front-back-wayland-buffers.patch @@ -0,0 +1,34 @@ +From ed31a6a206c9e205bd5316e95788e5d7bb837e38 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 11:11:41 -0800 +Subject: [PATCH 07/13] initialize front back wayland buffers + +origins from metrological wayland support + +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client_surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/interface/khronos/egl/egl_client_surface.c b/interface/khronos/egl/egl_client_surface.c +index 512c83b..a429724 100644 +--- a/interface/khronos/egl/egl_client_surface.c ++++ b/interface/khronos/egl/egl_client_surface.c +@@ -401,11 +401,14 @@ EGL_SURFACE_T *egl_surface_create( + #ifdef BUILD_WAYLAND + if (type == WINDOW && wl_display) { + surface->wl_egl_window = (struct wl_egl_window*)win; ++ surface->front_wl_buffer = NULL; + surface->back_wl_buffer = allocate_wl_buffer( + surface->wl_egl_window, color); + resource = surface->back_wl_buffer->resource; + } else { + surface->wl_egl_window = NULL; ++ surface->front_wl_buffer = NULL; ++ surface->back_wl_buffer = NULL; + resource = DISPMANX_NO_HANDLE; + } + #endif +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0008-Remove-RPC_FLUSH.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0008-Remove-RPC_FLUSH.patch new file mode 100644 index 000000000..0206a08f6 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0008-Remove-RPC_FLUSH.patch @@ -0,0 +1,27 @@ +From 6e173040a825185013ccbbb33113442207f10eeb Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 11:09:18 -0800 +Subject: [PATCH 08/13] Remove RPC_FLUSH + +Origins from buildroot + +Signed-off-by: Khem Raj +--- + interface/khronos/ext/gl_oes_egl_image_client.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/interface/khronos/ext/gl_oes_egl_image_client.c b/interface/khronos/ext/gl_oes_egl_image_client.c +index f9b7287..b04ffef 100644 +--- a/interface/khronos/ext/gl_oes_egl_image_client.c ++++ b/interface/khronos/ext/gl_oes_egl_image_client.c +@@ -107,7 +107,6 @@ GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageO + GLEGLIMAGETARGETTEXTURE2DOES_ID, + RPC_ENUM(target), + RPC_EGLID(image)); +- RPC_FLUSH(thread); + #if EGL_BRCM_global_image + } + #endif +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0009-fix-cmake-dependency-race.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0009-fix-cmake-dependency-race.patch new file mode 100644 index 000000000..87cfce4c1 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0009-fix-cmake-dependency-race.patch @@ -0,0 +1,78 @@ +From c4217231fd78daee83b0c0f312c1d392aa6e0f47 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 6 Feb 2016 13:12:47 -0800 +Subject: [PATCH 09/13] fix cmake dependency race + +Fixes errors like + +/a/builder/mnt/build-oe/tmp-glibc/work/raspberrypi2-oe-linux-gnueabi/userland/git-r5/git/interface/vmcs_host/vc_vchi_dispmanx.h:72:66: +fatal error: interface/vmcs_host/wayland-dispmanx-server-protocol.h: No +such file or directory +compilation terminated. +interface/khronos/CMakeFiles/EGL_static.dir/build.make:773: recipe for +target 'interface/khronos/CMakeFiles/EGL_static.dir/ext/egl_wayland.c.o' +failed +make[2]: *** +[interface/khronos/CMakeFiles/EGL_static.dir/ext/egl_wayland.c.o] Error 1 + +Signed-off-by: Khem Raj +--- + interface/vcos/pthreads/CMakeLists.txt | 8 ++++++++ + interface/vmcs_host/CMakeLists.txt | 8 -------- + interface/vmcs_host/vc_vchi_dispmanx.h | 2 +- + 3 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/interface/vcos/pthreads/CMakeLists.txt b/interface/vcos/pthreads/CMakeLists.txt +index 1d81ca3..d6cd415 100644 +--- a/interface/vcos/pthreads/CMakeLists.txt ++++ b/interface/vcos/pthreads/CMakeLists.txt +@@ -33,6 +33,14 @@ set (SOURCES + ../generic/vcos_generic_blockpool.c + ) + ++if (BUILD_WAYLAND) ++wayland_add_protocol_server( ++ SOURCES ++ ../../../interface/wayland/dispmanx.xml ++ dispmanx ++) ++endif () ++ + if (VCOS_PTHREADS_BUILD_SHARED) + add_library (vcos SHARED ${SOURCES}) + target_link_libraries (vcos pthread dl rt) +diff --git a/interface/vmcs_host/CMakeLists.txt b/interface/vmcs_host/CMakeLists.txt +index 35150ed..22949a8 100755 +--- a/interface/vmcs_host/CMakeLists.txt ++++ b/interface/vmcs_host/CMakeLists.txt +@@ -17,14 +17,6 @@ set(VCHOSTIF_SOURCE + # ${VMCS_TARGET}/vmcs_main.c + # vc_vchi_haud.c + +-if (BUILD_WAYLAND) +-wayland_add_protocol_server( +- VCHOSTIF_SOURCE +- ../../interface/wayland/dispmanx.xml +- dispmanx +-) +-endif () +- + add_library(vchostif ${VCHOSTIF_SOURCE}) + + #add_library(bufman vc_vchi_bufman.c ) +diff --git a/interface/vmcs_host/vc_vchi_dispmanx.h b/interface/vmcs_host/vc_vchi_dispmanx.h +index f0bae30..8c44c58 100644 +--- a/interface/vmcs_host/vc_vchi_dispmanx.h ++++ b/interface/vmcs_host/vc_vchi_dispmanx.h +@@ -69,7 +69,7 @@ typedef struct { + #ifdef BUILD_WAYLAND + /* XXX: This should be in a private header that can be included from EGL and vc_* */ + #include +-#include "interface/vmcs_host/wayland-dispmanx-server-protocol.h" ++#include "interface/vcos/pthreads/wayland-dispmanx-server-protocol.h" + struct wl_dispmanx_server_buffer { + struct wl_resource *resource; + struct wl_dispmanx *dispmanx; +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0010-Fix-enum-conversion-warnings.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0010-Fix-enum-conversion-warnings.patch new file mode 100644 index 000000000..d4e88255f --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0010-Fix-enum-conversion-warnings.patch @@ -0,0 +1,99 @@ +From 377f6aada3b7569e3d662fc830e01b8c5ba8a15d Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 18 Feb 2016 09:04:46 +0000 +Subject: [PATCH 10/13] Fix enum conversion warnings + +Signed-off-by: Khem Raj +--- + interface/mmal/openmaxil/mmalomx_core.c | 4 ++-- + interface/mmal/openmaxil/mmalomx_parameters.c | 6 +++--- + interface/mmal/openmaxil/mmalomx_util_params_video.c | 8 ++++---- + 3 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/interface/mmal/openmaxil/mmalomx_core.c b/interface/mmal/openmaxil/mmalomx_core.c +index 9bc632b..20d4fc7 100644 +--- a/interface/mmal/openmaxil/mmalomx_core.c ++++ b/interface/mmal/openmaxil/mmalomx_core.c +@@ -281,7 +281,7 @@ static OMX_ERRORTYPE mmalomx_ComponentGetParameter( + { + OMX_PARAM_PORTDEFINITIONTYPE *param = (OMX_PARAM_PORTDEFINITIONTYPE *)pParam; + PARAM_GET_PORT(port, component, param->nPortIndex); +- return mmalil_error_to_mmal(mmalomx_get_port_settings(port, param)); ++ return mmalil_error_to_omx(mmalomx_get_port_settings(port, param)); + } + return OMX_ErrorNone; + break; +@@ -475,7 +475,7 @@ static OMX_ERRORTYPE mmalomx_ComponentSetParameter( + { + OMX_PARAM_PORTDEFINITIONTYPE *param = (OMX_PARAM_PORTDEFINITIONTYPE *)pParam; + PARAM_GET_PORT(port, component, param->nPortIndex); +- return mmalil_error_to_mmal(mmalomx_set_port_settings(port, param)); ++ return mmalil_error_to_omx(mmalomx_set_port_settings(port, param)); + } + return OMX_ErrorNone; + break; +diff --git a/interface/mmal/openmaxil/mmalomx_parameters.c b/interface/mmal/openmaxil/mmalomx_parameters.c +index a20a5bd..c4f97d4 100644 +--- a/interface/mmal/openmaxil/mmalomx_parameters.c ++++ b/interface/mmal/openmaxil/mmalomx_parameters.c +@@ -170,7 +170,7 @@ static OMX_ERRORTYPE mmalomx_parameter_get_xlat(MMALOMX_COMPONENT_T *component, + + if (xlat->fn.custom) + { +- return mmalil_error_to_mmal(xlat->fn.custom(MMALOMX_PARAM_MAPPING_TO_OMX, xlat, mmal_header, ++ return mmalil_error_to_omx(xlat->fn.custom(MMALOMX_PARAM_MAPPING_TO_OMX, xlat, mmal_header, + pParam, mmal_port)); + } + +@@ -554,14 +554,14 @@ OMX_ERRORTYPE mmalomx_parameter_set(MMALOMX_COMPONENT_T *component, + port->mmal->format->es->video.par.num = param->nX; + port->mmal->format->es->video.par.den = param->nY; + mmal_rational_simplify(&port->mmal->format->es->video.par); +- return mmalil_error_to_mmal(mmal_port_format_commit(port->mmal)); ++ return mmalil_error_to_omx(mmal_port_format_commit(port->mmal)); + } + case OMX_IndexParamColorSpace: + { + OMX_PARAM_COLORSPACETYPE *param = (OMX_PARAM_COLORSPACETYPE *)pParam; + PARAM_GET_PORT(port, component, param->nPortIndex); + port->mmal->format->es->video.color_space = mmalil_omx_color_space_to_mmal(param->eColorSpace); +- return mmalil_error_to_mmal(mmal_port_format_commit(port->mmal)); ++ return mmalil_error_to_omx(mmal_port_format_commit(port->mmal)); + } + case OMX_IndexParamBrcmVideoCroppingDisable: + { +diff --git a/interface/mmal/openmaxil/mmalomx_util_params_video.c b/interface/mmal/openmaxil/mmalomx_util_params_video.c +index f088296..83e3724 100644 +--- a/interface/mmal/openmaxil/mmalomx_util_params_video.c ++++ b/interface/mmal/openmaxil/mmalomx_util_params_video.c +@@ -56,11 +56,11 @@ static MMAL_STATUS_T mmalomx_param_mapping_displayregion(MMALOMX_PARAM_MAPPING_D + mmal->set = omx->set; + mmal->display_num = omx->num; + mmal->fullscreen = omx->fullscreen; +- mmal->transform = omx->transform; ++ mmal->transform = (MMAL_DISPLAYTRANSFORM_T)omx->transform; + rect_to_mmal(&mmal->dest_rect, &omx->dest_rect); + rect_to_mmal(&mmal->src_rect, &omx->src_rect); + mmal->noaspect = omx->noaspect; +- mmal->mode = omx->mode; ++ mmal->mode = (MMAL_DISPLAYMODE_T)omx->mode; + mmal->pixel_x = omx->pixel_x; + mmal->pixel_y = omx->pixel_y; + mmal->layer = omx->layer; +@@ -72,11 +72,11 @@ static MMAL_STATUS_T mmalomx_param_mapping_displayregion(MMALOMX_PARAM_MAPPING_D + omx->set = mmal->set; + omx->num = mmal->display_num; + omx->fullscreen = mmal->fullscreen; +- omx->transform = mmal->transform; ++ omx->transform = (OMX_DISPLAYTRANSFORMTYPE)mmal->transform; + rect_to_omx(&omx->dest_rect, &mmal->dest_rect); + rect_to_omx(&omx->src_rect, &mmal->src_rect); + omx->noaspect = mmal->noaspect; +- omx->mode = mmal->mode; ++ omx->mode = (OMX_DISPLAYMODETYPE)mmal->mode; + omx->pixel_x = mmal->pixel_x; + omx->pixel_y = mmal->pixel_y; + omx->layer = mmal->layer; +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0011-Fix-for-framerate-with-nested-composition.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0011-Fix-for-framerate-with-nested-composition.patch new file mode 100644 index 000000000..5e97571d9 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0011-Fix-for-framerate-with-nested-composition.patch @@ -0,0 +1,60 @@ +From 6e634184ee4b3d2c98c3213a3931845ec3014754 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Tue, 29 Mar 2016 20:38:30 -0700 +Subject: [PATCH 11/13] Fix for framerate with nested composition + +frame rate appears irregular and lower than expected when using nested composition. + +Signed-off-by: Khem Raj +--- + interface/khronos/egl/egl_client.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/interface/khronos/egl/egl_client.c b/interface/khronos/egl/egl_client.c +index 024f3ed..83970ec 100644 +--- a/interface/khronos/egl/egl_client.c ++++ b/interface/khronos/egl/egl_client.c +@@ -2342,6 +2342,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + surface->back_wl_buffer = buffer; + } + ++ glFlush(); ++ glFinish(); ++ + RPC_CALL7(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID_V2, +@@ -2353,6 +2356,8 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + RPC_UINT(khrn_platform_get_window_position(surface->win)), + RPC_INT(surface->back_wl_buffer->resource)); + ++ RPC_FLUSH(thread); ++ + surface->front_wl_buffer->in_use = 1; + wl_surface_attach(wl_egl_window->wl_surface, + surface->front_wl_buffer->wl_buffer, +@@ -2360,11 +2365,13 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + wl_surface_damage(wl_egl_window->wl_surface, 0, 0, + surface->width, surface->height); + wl_surface_commit(wl_egl_window->wl_surface); ++ wl_display_flush(wl_display); + + while(ret != -1 && surface->back_wl_buffer->in_use) + ret = wl_display_dispatch_queue(wl_display, process->wl_queue); + } else + #endif ++ { + RPC_CALL6(eglIntSwapBuffers_impl, + thread, + EGLINTSWAPBUFFERS_ID, +@@ -2376,6 +2383,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) + RPC_UINT(khrn_platform_get_window_position(surface->win))); + + RPC_FLUSH(thread); ++ } + + #ifdef ANDROID + CLIENT_UNLOCK(); +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0012-build-shared-library-for-vchostif.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0012-build-shared-library-for-vchostif.patch new file mode 100644 index 000000000..44815c571 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0012-build-shared-library-for-vchostif.patch @@ -0,0 +1,28 @@ +From 559209ce15027b3370466ccb56223a7a66d2a40c Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 2 Apr 2016 10:37:24 -0700 +Subject: [PATCH 12/13] build shared library for vchostif + +Fixes #149 + +Signed-off-by: Khem Raj +--- + interface/vmcs_host/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/interface/vmcs_host/CMakeLists.txt b/interface/vmcs_host/CMakeLists.txt +index 22949a8..f8c2f2f 100755 +--- a/interface/vmcs_host/CMakeLists.txt ++++ b/interface/vmcs_host/CMakeLists.txt +@@ -17,7 +17,7 @@ set(VCHOSTIF_SOURCE + # ${VMCS_TARGET}/vmcs_main.c + # vc_vchi_haud.c + +-add_library(vchostif ${VCHOSTIF_SOURCE}) ++add_library(vchostif SHARED ${VCHOSTIF_SOURCE}) + + #add_library(bufman vc_vchi_bufman.c ) + +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0013-implement-buffer-wrapping-interface-for-dispmanx.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0013-implement-buffer-wrapping-interface-for-dispmanx.patch new file mode 100644 index 000000000..8f36048f9 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0013-implement-buffer-wrapping-interface-for-dispmanx.patch @@ -0,0 +1,92 @@ +From 5b55a152651eece345d9ea1e0e40ecd9fc4ca2d5 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 2 Apr 2016 10:54:59 -0700 +Subject: [PATCH 13/13] implement buffer wrapping interface for dispmanx + +Courtesy: Zan Dobersek + +Signed-off-by: Khem Raj +--- + interface/khronos/ext/egl_wayland.c | 42 +++++++++++++++++++++++++++++++++++++ + interface/wayland/dispmanx.xml | 10 +++++++++ + 2 files changed, 52 insertions(+) + +diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c +index 5730743..9ef89cd 100644 +--- a/interface/khronos/ext/egl_wayland.c ++++ b/interface/khronos/ext/egl_wayland.c +@@ -133,8 +133,50 @@ dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource, + buffer->handle); + } + ++static void ++dispmanx_wrap_buffer(struct wl_client *client, struct wl_resource *resource, ++ uint32_t id, uint32_t handle, int32_t width, int32_t height, ++ uint32_t stride, uint32_t buffer_height, uint32_t format) ++{ ++ struct wl_dispmanx_server_buffer *buffer; ++ VC_IMAGE_TYPE_T vc_format = get_vc_format(format); ++ uint32_t dummy; ++ ++ if(vc_format == VC_IMAGE_MIN) { ++ wl_resource_post_error(resource, ++ WL_DISPMANX_ERROR_INVALID_FORMAT, ++ "invalid format"); ++ return; ++ } ++ ++ buffer = calloc(1, sizeof *buffer); ++ if (buffer == NULL) { ++ wl_resource_post_no_memory(resource); ++ return; ++ } ++ ++ buffer->handle = handle; ++ buffer->width = width; ++ buffer->height = height; ++ buffer->format = format; ++ ++ buffer->resource = wl_resource_create(resource->client, &wl_buffer_interface, ++ 1, id); ++ if (!buffer->resource) { ++ wl_resource_post_no_memory(resource); ++ vc_dispmanx_resource_delete(buffer->handle); ++ free(buffer); ++ return; ++ } ++ ++ wl_resource_set_implementation(buffer->resource, ++ (void (**)(void)) &dispmanx_buffer_interface, ++ buffer, destroy_buffer); ++} ++ + static const struct wl_dispmanx_interface dispmanx_interface = { + dispmanx_create_buffer, ++ dispmanx_wrap_buffer, + }; + + static void +diff --git a/interface/wayland/dispmanx.xml b/interface/wayland/dispmanx.xml +index c18626d..11ed1ef 100644 +--- a/interface/wayland/dispmanx.xml ++++ b/interface/wayland/dispmanx.xml +@@ -118,6 +118,16 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +-- +2.9.0 + diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland_git.bb b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland_git.bb new file mode 100644 index 000000000..6e73ca74b --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland_git.bb @@ -0,0 +1,73 @@ +DESCRIPTION = "This repository contains the source code for the ARM side \ +libraries used on Raspberry Pi. These typically are installed in /opt/vc/lib \ +and includes source for the ARM side code to interface to: EGL, mmal, GLESv2,\ +vcos, openmaxil, vchiq_arm, bcm_host, WFC, OpenVG." +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENCE;md5=0448d6488ef8cc380632b1569ee6d196" + +PR = "r5" + +PROVIDES = "virtual/libgles2 \ + virtual/egl" + +RPROVIDES_${PN} += "libgles2 libgl" + +COMPATIBLE_MACHINE = "raspberrypi" + +SRCBRANCH = "master" +SRCFORK = "raspberrypi" +SRCREV = "0147f98bdd4fdc822d25d8a70cf5adc5adb89096" + +SRC_URI = "\ + git://github.com/${SRCFORK}/userland.git;protocol=git;branch=${SRCBRANCH} \ + file://0001-Allow-applications-to-set-next-resource-handle.patch \ + file://0002-wayland-Add-support-for-the-Wayland-winsys.patch \ + file://0003-wayland-Add-Wayland-example.patch \ + file://0004-wayland-egl-Add-bcm_host-to-dependencies.patch \ + file://0005-interface-remove-faulty-assert-to-make-weston-happy-.patch \ + file://0006-zero-out-wl-buffers-in-egl_surface_free.patch \ + file://0007-initialize-front-back-wayland-buffers.patch \ + file://0008-Remove-RPC_FLUSH.patch \ + file://0009-fix-cmake-dependency-race.patch \ + file://0010-Fix-enum-conversion-warnings.patch \ + file://0011-Fix-for-framerate-with-nested-composition.patch \ + file://0012-build-shared-library-for-vchostif.patch \ + file://0013-implement-buffer-wrapping-interface-for-dispmanx.patch \ +" +S = "${WORKDIR}/git" + +inherit cmake pkgconfig + +EXTRA_OECMAKE = "-DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS='-Wl,--no-as-needed' \ + -DVMCS_INSTALL_PREFIX=${exec_prefix} \ +" + +PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)}" + +PACKAGECONFIG[wayland] = "-DBUILD_WAYLAND=TRUE -DWAYLAND_SCANNER_EXECUTABLE:FILEPATH=${STAGING_BINDIR_NATIVE}/wayland-scanner,,wayland-native wayland" + +CFLAGS_append = " -fPIC" + +do_install_append () { + for f in `find ${D}${includedir}/interface/vcos/ -name "*.h"`; do + sed -i 's/include "vcos_platform.h"/include "pthreads\/vcos_platform.h"/g' ${f} + sed -i 's/include "vcos_futex_mutex.h"/include "pthreads\/vcos_futex_mutex.h"/g' ${f} + sed -i 's/include "vcos_platform_types.h"/include "pthreads\/vcos_platform_types.h"/g' ${f} + done +} + +# Shared libs from userland package build aren't versioned, so we need +# to force the .so files into the runtime package (and keep them +# out of -dev package). +FILES_SOLIBSDEV = "" +INSANE_SKIP_${PN} += "dev-so" + +FILES_${PN} += " \ + ${libdir}/*.so \ + ${libdir}/plugins" +FILES_${PN}-dev += "${includedir} \ + ${prefix}/src" +FILES_${PN}-doc += "${datadir}/install" +FILES_${PN}-dbg += "${libdir}/plugins/.debug" + +PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc new file mode 100644 index 000000000..c3142022c --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/egl.pc @@ -0,0 +1,10 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: egl +Description: egl for RaspberryPI +Version: 0.0 +Libs: -L${libdir} -lEGL -lGLESv2 +Cflags: -I${includedir}/vc -I${includedir}/interface -I${includedir}/interface/vcos -I${includedir}/interface/vcos/pthreads diff --git a/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh new file mode 100644 index 000000000..c73e3a9c6 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/files/vchiq.sh @@ -0,0 +1,24 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: vchiq.sh +# Required-Start: $remote_fs rmnologin +# Required-Stop: +# Default-Start: S +# Default-Stop: +# Short-Description: Create /dev/vchiq. +# Description: Get the major number from /proc/devices and use it +# ti create /dev/vchiq +### END INIT INFO + +rm -f /dev/vchiq + +#Get the major number +major=$(awk "\$2==\"vchiq\" {print \$1}" /proc/devices) + +if [ -z "$major" ]; then + echo "Error: Cannot find vchiq in /proc/devices" + exit 2 +else + mknod /dev/vchiq c "$major" 0 + chmod a+w /dev/vchiq +fi diff --git a/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb new file mode 100644 index 000000000..0db71fdb0 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics-hardfp.bb @@ -0,0 +1,6 @@ +CONFLICTS = "vc-graphics" + +VCDIR = "hardfp/opt/vc" +require vc-graphics.inc + +PR = "${INCPR}.0" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb new file mode 100644 index 000000000..a1bce567b --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.bb @@ -0,0 +1,6 @@ +CONFLICTS = "vc-graphics-hardfp" + +VCDIR = "opt/vc" +require vc-graphics.inc + +PR = "${INCPR}.0" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc new file mode 100644 index 000000000..a1c8d2943 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/vc-graphics/vc-graphics.inc @@ -0,0 +1,56 @@ +DESCRIPTION = "Graphics libraries for BCM2835." +LICENSE = "Proprietary" + +LIC_FILES_CHKSUM = "file://LICENCE;md5=86e53f5f5909ee66900418028de11780" + +PROVIDES = "virtual/libgles2 virtual/egl" +COMPATIBLE_MACHINE = "raspberrypi" + +include recipes-bsp/common/firmware.inc + +SRC_URI += " \ + file://egl.pc \ + file://vchiq.sh \ +" + +S = "${RPIFW_S}/${VCDIR}" + +INCPR = "r1" + +inherit pkgconfig update-rc.d + +do_install () { + install -d ${D}${bindir} + cp -R bin/* ${D}${bindir} + + install -d ${D}${sbindir} + cp -R sbin/* ${D}${sbindir} + + install -d ${D}${libdir} + # note: -H option to deref symlinked .so + cp -R -H lib/* ${D}${libdir} + + install -d ${D}${includedir} + cp -R include/* ${D}${includedir} + + install -d ${D}${libdir}/pkgconfig + install -m 0644 ${WORKDIR}/egl.pc ${D}${libdir}/pkgconfig/ + + install -d ${D}/${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/vchiq.sh ${D}${sysconfdir}/init.d/ +} + +# These are proprietary binaries generated elsewhere so don't check ldflags +INSANE_SKIP_${PN} = "ldflags" + +INITSCRIPT_NAME = "vchiq.sh" +INITSCRIPT_PARAMS = "start 03 S ." + +FILES_${PN} = "${bindir}/* \ + ${sbindir}/* \ + ${libdir}/lib*.so \ + ${sysconfdir}/init.d \ + ${libdir}/plugins" +FILES_${PN}-dev = "${libdir}/pkgconfig \ + ${includedir}" +FILES_${PN}-dbg += "${libdir}/plugins/.debug" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend b/import-layers/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend new file mode 100644 index 000000000..c3a742148 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/wayland/weston_%.bbappend @@ -0,0 +1,4 @@ +EXTRA_OECONF_append_rpi = "\ + --enable-rpi-compositor \ + WESTON_NATIVE_BACKEND=rpi-backend.so \ + " diff --git a/import-layers/meta-raspberrypi/recipes-graphics/weston/weston_%.bbappend b/import-layers/meta-raspberrypi/recipes-graphics/weston/weston_%.bbappend new file mode 100644 index 000000000..3ec311d4e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/weston/weston_%.bbappend @@ -0,0 +1,7 @@ +EXTRA_OECONF += "--enable-rpi-compositor \ + --disable-resize-optimization \ + --disable-setuid-install \ + --disable-xwayland-test \ + --disable-simple-egl-clients \ + WESTON_NATIVE_BACKEND=rpi-backend.so \ +" diff --git a/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf new file mode 100644 index 000000000..6fd52985f --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf @@ -0,0 +1,6 @@ +# Initial xorg.conf for the RaspberryPi +# Most things are setup automatically by magic pixies in the system. +# +# It is suggested this file is not used any more and configuration +# snippets are placed in xorg.conf.d instead. +# diff --git a/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/10-evdev.conf b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/10-evdev.conf new file mode 100644 index 000000000..cc83ab232 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/10-evdev.conf @@ -0,0 +1,40 @@ +# +# Catch-all evdev loader for udev-based systems +# We don't simply match on any device since that also adds accelerometers +# and other devices that we don't really want to use. The list below +# matches everything but joysticks. + +Section "InputClass" + Identifier "evdev pointer catchall" + MatchIsPointer "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev keyboard catchall" + MatchIsKeyboard "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev touchpad catchall" + MatchIsTouchpad "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev tablet catchall" + MatchIsTablet "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev touchscreen catchall" + MatchIsTouchscreen "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection diff --git a/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf new file mode 100644 index 000000000..0d2b36b2e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/98-pitft.conf @@ -0,0 +1,5 @@ +Section "Device" + Identifier "Adafruit PiTFT" + Driver "fbdev" + Option "fbdev" "/dev/fb1" +EndSection diff --git a/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf new file mode 100644 index 000000000..f8b578c01 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config/rpi/xorg.conf.d/99-calibration.conf @@ -0,0 +1,6 @@ +Section "InputClass" + Identifier "calibration" + MatchProduct "stmpe-ts" + Option "Calibration" "3800 200 200 3800" + Option "SwapAxes" "1" +EndSection diff --git a/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend new file mode 100644 index 000000000..062de2d91 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend @@ -0,0 +1,19 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI_append_rpi = " file://xorg.conf.d/10-evdev.conf \ + file://xorg.conf.d/98-pitft.conf \ + file://xorg.conf.d/99-calibration.conf \ + " + +do_install_append_rpi () { + install -d ${D}/${sysconfdir}/X11/xorg.conf.d/ + install -m 0644 ${WORKDIR}/xorg.conf.d/10-evdev.conf ${D}/${sysconfdir}/X11/xorg.conf.d/ + + PITFT="${@bb.utils.contains("MACHINE_FEATURES", "pitft", "1", "0", d)}" + if [ "${PITFT}" = "1" ]; then + install -m 0644 ${WORKDIR}/xorg.conf.d/98-pitft.conf ${D}/${sysconfdir}/X11/xorg.conf.d/ + install -m 0644 ${WORKDIR}/xorg.conf.d/99-calibration.conf ${D}/${sysconfdir}/X11/xorg.conf.d/ + fi +} + +FILES_${PN}_rpi += "${sysconfdir}/X11/xorg.conf ${sysconfdir}/X11/xorg.conf.d/*" diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/LICENSE.broadcom_brcm80211 b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/LICENSE.broadcom_brcm80211 new file mode 100644 index 000000000..e2cf868f3 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/LICENSE.broadcom_brcm80211 @@ -0,0 +1,205 @@ +SOFTWARE LICENSE AGREEMENT + +Unless you and Broadcom Corporation (“Broadcomâ€) execute a separate written +software license agreement governing use of the accompanying software, this +software is licensed to you under the terms of this Software License Agreement +(“Agreementâ€). + +ANY USE, REPRODUCTION OR DISTRIBUTION OF THE SOFTWARE CONSTITUTES YOUR +ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS. + +1.1. “Broadcom Product†means any of the proprietary integrated circuit +product(s) sold by Broadcom with which the Software was designed to be used, or +their successors. + +1.2. “Licensee†means you or if you are accepting on behalf of an entity +then the entity and its affiliates exercising rights under, and complying with +all of the terms of this Agreement. + +1.3. “Software†shall mean that software made available by Broadcom to +Licensee in binary code form with this Agreement. + +2. LICENSE GRANT; OWNERSHIP + +2.1. License Grants. Subject to the terms and conditions of this Agreement, +Broadcom hereby grants to Licensee a non-exclusive, non-transferable, +royalty-free license (i) to use and integrate the Software in conjunction with +any other software; and (ii) to reproduce and distribute the Software complete, +unmodified and as provided by Broadcom, and only for use with a Broadcom +Product. + +2.2. Restriction on Modification. Licensee may not make any modifications +to the Software. + +2.3. Restriction on Distribution. Licensee shall only distribute the +Software under the terms of this Agreement and a copy of this Agreement +accompanies such distribution. + +2.4. Proprietary Notices. Licensee shall not remove, efface or obscure any +copyright or trademark notices from the Software. Licensee shall include +reproductions of the Broadcom copyright notice with each copy of the Software, +except where such Software is embedded in a manner not readily accessible to +the end user. Licensee acknowledges that any symbols, trademarks, tradenames, +and service marks adopted by Broadcom to identify the Software belong to +Broadcom and that Licensee shall have no rights therein. + +2.5. Ownership. Broadcom shall retain all right, title and interest, +including all intellectual property rights, in and to the Software. Licensee +hereby covenants that it will not assert any claim that the Software created by +or for Broadcom infringe any intellectual property right owned or controlled by +Licensee; provided however, the foregoing shall not apply in case the Agreement +is terminated. + +2.6. No Other Rights Granted; Restrictions. Apart from the license rights +expressly set forth in this Agreement, Broadcom does not grant and Licensee +does not receive any ownership right, title or interest nor any security +interest or other interest in any intellectual property rights relating to the +Software, nor in any copy of any part of the foregoing. No license is granted +to Licensee in any human readable code of the Software (source code). Licensee +shall not (i) use, license, sell or otherwise distribute the Software except as +provided in this Agreement, (ii) attempt to modify in any way, reverse +engineer, decompile or disassemble any portion of the Software; or (iii) use +the Software or other material in violation of any applicable law or +regulation, including but not limited to any regulatory agency, such as FCC, +rules. + +3. NO WARRANTY OR SUPPORT + +3.1. No Warranty. THE SOFTWARE IS OFFERED “AS IS,†AND BROADCOM GRANTS AND +LICENSEE RECEIVES NO WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, BY STATUTE, +COMMUNICATION OR CONDUCT WITH LICENSEE, OR OTHERWISE. BROADCOM SPECIFICALLY +DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A SPECIFIC +PURPOSE OR NONINFRINGEMENT CONCERNING THE SOFTWARE OR ANY UPGRADES TO OR +DOCUMENTATION FOR THE SOFTWARE. WITHOUT LIMITATION OF THE ABOVE, BROADCOM +GRANTS NO WARRANTY THAT THE SOFTWARE IS ERROR-FREE OR WILL OPERATE WITHOUT +INTERRUPTION, AND GRANTS NO WARRANTY REGARDING ITS USE OR THE RESULTS THEREFROM +INCLUDING, WITHOUT LIMITATION, ITS CORRECTNESS, ACCURACY OR RELIABILITY. + +3.2. No Support. Nothing in this agreement shall obligate Broadcom to +provide any support for the Software. Broadcom may, but shall be under no +obligation to, correct any defects in the Software and/or provide updates to +licensees of the Software. Licensee shall make reasonable efforts to promptly +report to Broadcom any defects it finds in the Software, as an aid to creating +improved revisions of the Software. + +3.3. Dangerous Applications. The Software is not designed, intended, or +certified for use in components of systems intended for the operation of +weapons, weapons systems, nuclear installations, means of mass transportation, +aviation, life-support computers or equipment (including resuscitation +equipment and surgical implants), pollution control, hazardous substances +management, or for any other dangerous application in which the failure of the +Software could create a situation where personal injury or death may occur.  +Licensee understands that use of the Software in such applications is fully at +the risk of Licensee. + +4. TERM AND TERMINATION + +4.1. Termination. This Agreement will automatically terminate if Licensee +fails to comply with any of the terms and conditions hereof. In such event, +Licensee must destroy all copies of the Software and all of its component +parts. + +4.2. Effect Of Termination. Upon any termination of this Agreement, the +rights and licenses granted to Licensee under this Agreement shall immediately +terminate. + +4.3. Survival. The rights and obligations under this Agreement which by +their nature should survive termination will remain in effect after expiration +or termination of this Agreement. + +5. CONFIDENTIALITY + +5.1. Obligations. Licensee acknowledges and agrees that any documentation +relating to the Software, and any other information (if such other information +is identified as confidential or should be recognized as confidential under the +circumstances) provided to Licensee by Broadcom hereunder (collectively, +“Confidential Informationâ€) constitute the confidential and proprietary +information of Broadcom, and that Licensee’s protection thereof is an essential +condition to Licensee’s use and possession of the Software. Licensee shall +retain all Confidential Information in strict confidence and not disclose it to +any third party or use it in any way except under a written agreement with +terms and conditions at least as protective as the terms of this Section. +Licensee will exercise at least the same amount of diligence in preserving the +secrecy of the Confidential Information as it uses in preserving the secrecy of +its own most valuable confidential information, but in no event less than +reasonable diligence. Information shall not be considered Confidential +Information if and to the extent that it: (i) was in the public domain at the +time it was disclosed or has entered the public domain through no fault of +Licensee; (ii) was known to Licensee, without restriction, at the time of +disclosure as proven by the files of Licensee in existence at the time of +disclosure; or (iii) becomes known to Licensee, without restriction, from a +source other than Broadcom without breach of this Agreement by Licensee and +otherwise not in violation of Broadcom’s rights. + +5.2. Return of Confidential Information. Notwithstanding the foregoing, all +documents and other tangible objects containing or representing Broadcom +Confidential Information and all copies thereof which are in the possession of +Licensee shall be and remain the property of Broadcom, and shall be promptly +returned to Broadcom upon written request by Broadcom or upon termination of +this Agreement. + +6. LIMITATION OF LIABILITY TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO +EVENT SHALL BROADCOM OR ANY OF BROADCOM’S LICENSORS HAVE ANY LIABILITY FOR ANY +INDIRECT, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER FOR BREACH OF CONTRACT, TORT (INCLUDING +NEGLIGENCE) OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, INCLUDING BUT NOT +LIMITED TO LOSS OF PROFITS, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. IN NO EVENT WILL BROADCOM’S LIABILITY WHETHER IN +CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, EXCEED THE AMOUNT PAID BY +LICENSEE FOR SOFTWARE UNDER THIS AGREEMENT. THESE LIMITATIONS SHALL APPLY +NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. + +7. MISCELLANEOUS + +7.1. Export Regulations. YOU UNDERSTAND AND AGREE THAT THE SOFTWARE IS +SUBJECT TO UNITED STATES AND OTHER APPLICABLE EXPORT-RELATED LAWS AND +REGULATIONS AND THAT YOU MAY NOT EXPORT, RE-EXPORT OR TRANSFER THE SOFTWARE OR +ANY DIRECT PRODUCT OF THE SOFTWARE EXCEPT AS PERMITTED UNDER THOSE LAWS. +WITHOUT LIMITING THE FOREGOING, EXPORT, RE-EXPORT OR TRANSFER OF THE SOFTWARE +TO CUBA, IRAN, NORTH KOREA, SUDAN AND SYRIA IS PROHIBITED. + +7.2 Assignment. This Agreement shall be binding upon and inure to the +benefit of the parties and their respective successors and assigns, provided, +however that Licensee may not assign this Agreement or any rights or obligation +hereunder, directly or indirectly, by operation of law or otherwise, without +the prior written consent of Broadcom, and any such attempted assignment shall +be void. Notwithstanding the foregoing, Licensee may assign this Agreement to +a successor to all or substantially all of its business or assets to which this +Agreement relates that is not a competitor of Broadcom. + +7.3. Governing Law; Venue. This Agreement shall be governed by the laws of +California without regard to any conflict-of-laws rules, and the United Nations +Convention on Contracts for the International Sale of Goods is hereby excluded. +The sole jurisdiction and venue for actions related to the subject matter +hereof shall be the state and federal courts located in the County of Orange, +California, and both parties hereby consent to such jurisdiction and venue. + +7.4. Severability. All terms and provisions of this Agreement shall, if +possible, be construed in a manner which makes them valid, but in the event any +term or provision of this Agreement is found by a court of competent +jurisdiction to be illegal or unenforceable, the validity or enforceability of +the remainder of this Agreement shall not be affected if the illegal or +unenforceable provision does not materially affect the intent of this +Agreement. If the illegal or unenforceable provision materially affects the +intent of the parties to this Agreement, this Agreement shall become +terminated. + +7.5. Equitable Relief. Licensee hereby acknowledges that its breach of this +Agreement would cause irreparable harm and significant injury to Broadcom that +may be difficult to ascertain and that a remedy at law would be inadequate. +Accordingly, Licensee agrees that Broadcom shall have the right to seek and +obtain immediate injunctive relief to enforce obligations under the Agreement +in addition to any other rights and remedies it may have. + +7.6. Waiver. The waiver of, or failure to enforce, any breach or default +hereunder shall not constitute the waiver of any other or subsequent breach or +default. + +7.7. Entire Agreement. This Agreement sets forth the entire Agreement +between the parties and supersedes any and all prior proposals, agreements and +representations between them, whether written or oral concerning the Software. +This Agreement may be changed only by mutual agreement of the parties in +writing. + diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.bin b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.bin new file mode 100644 index 000000000..84ab5b0de Binary files /dev/null and b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.bin differ diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.txt b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.txt new file mode 100644 index 000000000..ea4f648a1 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware/brcmfmac43430-sdio.txt @@ -0,0 +1,66 @@ +# NVRAM file for BCM943430WLPTH +# 2.4 GHz, 20 MHz BW mode + +# The following parameter values are just placeholders, need to be updated. +manfid=0x2d0 +prodid=0x0727 +vendid=0x14e4 +devid=0x43e2 +boardtype=0x0727 +boardrev=0x1101 +boardnum=22 +macaddr=00:90:4c:c5:12:38 +sromrev=11 +boardflags=0x00404201 +boardflags3=0x08000000 +xtalfreq=37400 +nocrc=1 +ag0=255 +aa2g=1 +ccode=ALL + +pa0itssit=0x20 +extpagain2g=0 +#PA parameters for 2.4GHz, measured at CHIP OUTPUT +pa2ga0=-168,7161,-820 +AvVmid_c0=0x0,0xc8 +cckpwroffset0=5 + +# PPR params +maxp2ga0=84 +txpwrbckof=6 +cckbw202gpo=0 +legofdmbw202gpo=0x66111111 +mcsbw202gpo=0x77711111 +propbw202gpo=0xdd + +# OFDM IIR : +ofdmdigfilttype=18 +ofdmdigfilttypebe=18 +# PAPD mode: +papdmode=1 +papdvalidtest=1 +pacalidx2g=42 +papdepsoffset=-22 +papdendidx=58 + +# LTECX flags +ltecxmux=0 +ltecxpadnum=0x0102 +ltecxfnsel=0x44 +ltecxgcigpio=0x01 + +il0macaddr=00:90:4c:c5:12:38 +wl0id=0x431b + +deadman_to=0xffffffff +# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG +muxenab=0x1 +# CLDO PWM voltage settings - 0x4 - 1.1 volt +#cldo_pwm=0x4 + +#VCO freq 326.4MHz +spurconfig=0x3 + +edonthd20l=-75 +edoffthd20ul=-80 diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware_git.bbappend b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware_git.bbappend new file mode 100644 index 000000000..20ef05f24 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux-firmware/linux-firmware_git.bbappend @@ -0,0 +1,33 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +LICENSE_append = " & Firmware-broadcom_brcm80211" + +LIC_FILES_CHKSUM_append = " file://${WORKDIR}/LICENSE.broadcom_brcm80211;md5=8cba1397cda6386db37210439a0da3eb" + +NO_GENERIC_LICENSE[Firmware-broadcom_brcm80211] = "LICENSE.broadcom_brcm80211" + +SRC_URI_append = " \ + file://brcmfmac43430-sdio.bin \ + file://brcmfmac43430-sdio.txt \ + file://LICENSE.broadcom_brcm80211 \ + " + +do_install_append() { + cp ${WORKDIR}/brcmfmac43430-sdio.* ${D}/lib/firmware/brcm/ + cp ${WORKDIR}/LICENSE.broadcom_brcm80211 ${D}/lib/firmware/ +} + +PACKAGES =+ "${PN}-brcm43430 ${PN}-brcm43430-license" + +LICENSE_${PN}-brcm43430 = "Firmware-broadcom_brcm80211" +FILES_${PN}-brcm43430-license = "/lib/firmware/LICENSE.broadcom_brcm80211" +FILES_${PN}-brcm43430 = " \ + /lib/firmware/brcm/brcmfmac43430-sdio.bin \ + /lib/firmware/brcm/brcmfmac43430-sdio.txt \ + " + +RDEPENDS_${PN}-brcm43430 += "${PN}-brcm43430-license" + +ALTERNATIVE_LINK_NAME[brcmfmac-sdio.bin] = "/lib/firmware/brcm/brcmfmac-sdio.bin" +ALTERNATIVE_TARGET_linux-firmware-brcm43430[brcmfmac-sdio.bin] = "/lib/firmware/brcm/brcmfmac43430-sdio.bin" +ALTERNATIVE_linux-firmware-brcm43430 = "brcmfmac-sdio.bin" diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-3.18/0001-dts-add-overlay-for-pitft22.patch b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-3.18/0001-dts-add-overlay-for-pitft22.patch new file mode 100644 index 000000000..fa73599b2 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-3.18/0001-dts-add-overlay-for-pitft22.patch @@ -0,0 +1,110 @@ +From 2f44861e2a2d651a9aa62a75343a032fee33e93b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petter=20Mab=C3=A4cker?= +Date: Fri, 8 Jan 2016 09:02:44 +0100 +Subject: [PATCH] dts: add overlay for pitft22 in linux 3.18 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Upstream-Status: Pending + +Add the pitft22 overlay from adafruit Adafruit-Pi-Kernel-o-Matic repo: +https://github.com/adafruit/Adafruit-Pi-Kernel-o-Matic + +Signed-off-by: Petter Mabäcker +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/pitft22-overlay.dts | 69 ++++++++++++++++++++++++++ + 2 files changed, 70 insertions(+) + create mode 100755 arch/arm/boot/dts/overlays/pitft22-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index c766616..1eaaf81 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -27,6 +27,7 @@ dtb-$(RPI_DT_OVERLAYS) += mcp2515-can0-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += mmc-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += mz61581-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += piscreen-overlay.dtb ++dtb-$(RPI_DT_OVERLAYS) += pitft22-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += pitft28-resistive-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += pps-gpio-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += rpi-dac-overlay.dtb +diff --git a/arch/arm/boot/dts/overlays/pitft22-overlay.dts b/arch/arm/boot/dts/overlays/pitft22-overlay.dts +new file mode 100755 +index 0000000..894ba22 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/pitft22-overlay.dts +@@ -0,0 +1,69 @@ ++/* ++ * Device Tree overlay for pitft by Adafruit ++ * ++ */ ++ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; ++ ++ fragment@0 { ++ target = <&spi0>; ++ __overlay__ { ++ status = "okay"; ++ ++ spidev@0{ ++ status = "disabled"; ++ }; ++ ++ spidev@1{ ++ status = "disabled"; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&gpio>; ++ __overlay__ { ++ pitft_pins: pitft_pins { ++ brcm,pins = <25>; ++ brcm,function = <1>; /* out */ ++ brcm,pull = <0>; /* none */ ++ }; ++ }; ++ }; ++ ++ fragment@2 { ++ target = <&spi0>; ++ __overlay__ { ++ /* needed to avoid dtc warning */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ pitft: pitft@0{ ++ compatible = "ilitek,ili9340"; ++ reg = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pitft_pins>; ++ ++ spi-max-frequency = <32000000>; ++ rotate = <90>; ++ fps = <25>; ++ bgr; ++ buswidth = <8>; ++ dc-gpios = <&gpio 25 0>; ++ debug = <0>; ++ }; ++ ++ }; ++ }; ++ ++ __overrides__ { ++ speed = <&pitft>,"spi-max-frequency:0"; ++ rotate = <&pitft>,"rotate:0"; ++ fps = <&pitft>,"fps:0"; ++ debug = <&pitft>,"debug:0"; ++ }; ++}; +-- +1.9.1 + diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0001-dts-add-overlay-for-pitft22.patch b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0001-dts-add-overlay-for-pitft22.patch new file mode 100644 index 000000000..e6e0a8486 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0001-dts-add-overlay-for-pitft22.patch @@ -0,0 +1,110 @@ +From a28bd410022b32a64e208f04b45add6326990332 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petter=20Mab=C3=A4cker?= +Date: Fri, 8 Jan 2016 09:02:44 +0100 +Subject: [PATCH] dts: add overlay for pitft22 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Upstream-Status: Pending + +Add the pitft22 overlay from adafruit Adafruit-Pi-Kernel-o-Matic repo: +https://github.com/adafruit/Adafruit-Pi-Kernel-o-Matic + +Signed-off-by: Petter Mabäcker +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/pitft22-overlay.dts | 69 ++++++++++++++++++++++++++ + 2 files changed, 70 insertions(+) + create mode 100755 arch/arm/boot/dts/overlays/pitft22-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index 1a60e9c..a2535a2 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -37,6 +37,7 @@ dtb-$(RPI_DT_OVERLAYS) += mmc-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += mz61581-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += piscreen-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += piscreen2r-overlay.dtb ++dtb-$(RPI_DT_OVERLAYS) += pitft22-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += pitft28-capacitive-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += pitft28-resistive-overlay.dtb + dtb-$(RPI_DT_OVERLAYS) += pps-gpio-overlay.dtb +diff --git a/arch/arm/boot/dts/overlays/pitft22-overlay.dts b/arch/arm/boot/dts/overlays/pitft22-overlay.dts +new file mode 100755 +index 0000000..894ba22 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/pitft22-overlay.dts +@@ -0,0 +1,69 @@ ++/* ++ * Device Tree overlay for pitft by Adafruit ++ * ++ */ ++ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; ++ ++ fragment@0 { ++ target = <&spi0>; ++ __overlay__ { ++ status = "okay"; ++ ++ spidev@0{ ++ status = "disabled"; ++ }; ++ ++ spidev@1{ ++ status = "disabled"; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&gpio>; ++ __overlay__ { ++ pitft_pins: pitft_pins { ++ brcm,pins = <25>; ++ brcm,function = <1>; /* out */ ++ brcm,pull = <0>; /* none */ ++ }; ++ }; ++ }; ++ ++ fragment@2 { ++ target = <&spi0>; ++ __overlay__ { ++ /* needed to avoid dtc warning */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ pitft: pitft@0{ ++ compatible = "ilitek,ili9340"; ++ reg = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pitft_pins>; ++ ++ spi-max-frequency = <32000000>; ++ rotate = <90>; ++ fps = <25>; ++ bgr; ++ buswidth = <8>; ++ dc-gpios = <&gpio 25 0>; ++ debug = <0>; ++ }; ++ ++ }; ++ }; ++ ++ __overrides__ { ++ speed = <&pitft>,"spi-max-frequency:0"; ++ rotate = <&pitft>,"rotate:0"; ++ fps = <&pitft>,"fps:0"; ++ debug = <&pitft>,"debug:0"; ++ }; ++}; +-- +1.9.1 + diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0002-vmcs-Remove-unused-sm_cache_map_vector-definition.patch b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0002-vmcs-Remove-unused-sm_cache_map_vector-definition.patch new file mode 100644 index 000000000..8d4a900c3 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0002-vmcs-Remove-unused-sm_cache_map_vector-definition.patch @@ -0,0 +1,31 @@ +The code using it also ifdef'ed with 0, anyyd gcc 6 +complains + +error: 'sm_cache_map_vector' defined but not used + +The code using it also ifdef'ed out + +Upstream-status: Denied [https://github.com/raspberrypi/linux/pull/1528] + +Signed-off-by: Khem Raj +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -197,12 +197,14 @@ struct SM_STATE_T { + static struct SM_STATE_T *sm_state; + static int sm_inited; + ++#if 0 + static const char *const sm_cache_map_vector[] = { + "(null)", + "host", + "videocore", + "host+videocore", + }; ++#endif + + /* ---- Private Function Prototypes -------------------------------------- */ + diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0003-fix-gcc6.patch b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0003-fix-gcc6.patch new file mode 100644 index 000000000..61ec2fbe5 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi-4.1/0003-fix-gcc6.patch @@ -0,0 +1,78 @@ +Fix compile with GCC6 + +Upstream-status: Denied [https://github.com/raspberrypi/linux/pull/1528] + +Signed-off-by: Andrei Gherzan + +Index: source/include/linux/compiler-gcc6.h +=================================================================== +--- /dev/null ++++ source/include/linux/compiler-gcc6.h +@@ -0,0 +1,67 @@ ++#ifndef __LINUX_COMPILER_H ++#error "Please don't include directly, include instead." ++#endif ++ ++#define __used __attribute__((__used__)) ++#define __must_check __attribute__((warn_unused_result)) ++#define __compiler_offsetof(a, b) __builtin_offsetof(a, b) ++ ++/* Mark functions as cold. gcc will assume any path leading to a call ++ to them will be unlikely. This means a lot of manual unlikely()s ++ are unnecessary now for any paths leading to the usual suspects ++ like BUG(), printk(), panic() etc. [but let's keep them for now for ++ older compilers] ++ ++ Early snapshots of gcc 4.3 don't support this and we can't detect this ++ in the preprocessor, but we can live with this because they're unreleased. ++ Maketime probing would be overkill here. ++ ++ gcc also has a __attribute__((__hot__)) to move hot functions into ++ a special section, but I don't see any sense in this right now in ++ the kernel context */ ++#define __cold __attribute__((__cold__)) ++ ++#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) ++ ++#ifndef __CHECKER__ ++# define __compiletime_warning(message) __attribute__((warning(message))) ++# define __compiletime_error(message) __attribute__((error(message))) ++#endif /* __CHECKER__ */ ++ ++/* ++ * Mark a position in code as unreachable. This can be used to ++ * suppress control flow warnings after asm blocks that transfer ++ * control elsewhere. ++ * ++ * Early snapshots of gcc 4.5 don't support this and we can't detect ++ * this in the preprocessor, but we can live with this because they're ++ * unreleased. Really, we need to have autoconf for the kernel. ++ */ ++#define unreachable() __builtin_unreachable() ++ ++/* Mark a function definition as prohibited from being cloned. */ ++#define __noclone __attribute__((__noclone__)) ++ ++/* ++ * Tell the optimizer that something else uses this function or variable. ++ */ ++#define __visible __attribute__((externally_visible)) ++ ++/* ++ * GCC 'asm goto' miscompiles certain code sequences: ++ * ++ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 ++ * ++ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. ++ * ++ * (asm goto is automatically volatile - the naming reflects this.) ++ */ ++#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) ++ ++#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP ++#define __HAVE_BUILTIN_BSWAP32__ ++#define __HAVE_BUILTIN_BSWAP64__ ++#define __HAVE_BUILTIN_BSWAP16__ ++#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ ++ ++#define KASAN_ABI_VERSION 4 diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc new file mode 100644 index 000000000..61844028b --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc @@ -0,0 +1,69 @@ +require linux-rpi.inc +inherit linux-raspberrypi-base + +DESCRIPTION = "Linux Kernel for Raspberry Pi" +SECTION = "kernel" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7" + +SRC_URI += " \ + file://defconfig \ + " + +COMPATIBLE_MACHINE = "raspberrypi" + +PE = "1" +PV = "${LINUX_VERSION}+git${SRCPV}" + +# NOTE: For now we pull in the default config from the RPi kernel GIT tree. +KERNEL_DEFCONFIG_raspberrypi ?= "bcmrpi_defconfig" +KERNEL_DEFCONFIG_raspberrypi2 ?= "bcm2709_defconfig" + +# CMDLINE for raspberrypi +CMDLINE = "dwc_otg.lpm_enable=0 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" + +# Add the kernel debugger over console kernel command line option if enabled +CMDLINE_append = ' ${@base_conditional("ENABLE_KGDB", "1", "kgdboc=serial0,115200", "", d)}' + +UDEV_GE_141 ?= "1" + +KERNEL_MODULE_AUTOLOAD += "${@bb.utils.contains("MACHINE_FEATURES", "pitft28r", "stmpe-ts", "", d)}" + +# Set programmatically some variables during recipe parsing +# See http://www.yoctoproject.org/docs/current/bitbake-user-manual/bitbake-user-manual.html#anonymous-python-functions +python __anonymous () { + kerneltype = d.getVar('KERNEL_IMAGETYPE', True) + kerneldt = get_dts(d, d.getVar('LINUX_VERSION', True)) + d.setVar("KERNEL_DEVICETREE", kerneldt) +} + +do_kernel_configme_prepend() { + install -m 0644 ${S}/arch/${ARCH}/configs/${KERNEL_DEFCONFIG} ${WORKDIR}/defconfig || die "No default configuration for ${MACHINE} / ${KERNEL_DEFCONFIG} available." +} + +do_install_prepend() { + install -d ${D}/lib/firmware +} + +do_deploy_append() { + # Deploy cmdline.txt + install -d ${DEPLOYDIR}/bcm2835-bootfiles + PITFT="${@bb.utils.contains("MACHINE_FEATURES", "pitft", "1", "0", d)}" + if [ ${PITFT} = "1" ]; then + PITFT_PARAMS="fbcon=map:10 fbcon=font:VGA8x8" + fi + echo "${CMDLINE}${PITFT_PARAMS}" > ${DEPLOYDIR}/bcm2835-bootfiles/cmdline.txt +} + +do_bundle_initramfs_append() { + if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then + if test "x${KERNEL_IMAGETYPE}" != "xuImage" ; then + if test -n "${KERNEL_DEVICETREE}"; then + # Add RPi bootloader trailer to kernel image to enable DeviceTree support + for type in ${KERNEL_IMAGETYPES} ; do + ${STAGING_BINDIR_NATIVE}/mkknlimg --dtok ${KERNEL_OUTPUT_DIR}/$type.initramfs ${KERNEL_OUTPUT_DIR}/$type.initramfs + done + fi + fi + fi +} diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/defconfig b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/defconfig new file mode 100644 index 000000000..ecbf32cfd --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/defconfig @@ -0,0 +1 @@ +# Dummy file to get through do_kernel_configme. diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_3.18.bb b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_3.18.bb new file mode 100644 index 000000000..1110b71b8 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_3.18.bb @@ -0,0 +1,14 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:" + +LINUX_VERSION ?= "3.18.16" + +SRCREV = "1bb18c8f721ef674a447f3622273f2e2de7a205c" +SRC_URI = "git://github.com/raspberrypi/linux.git;protocol=git;branch=rpi-3.18.y \ + file://0001-dts-add-overlay-for-pitft22.patch \ + " +require linux-raspberrypi.inc + +# Create missing out of tree 'overlays' directory prior to install step +do_compile_prepend() { + mkdir -p ${B}/arch/arm/boot/dts/overlays +} diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.1.bb b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.1.bb new file mode 100644 index 000000000..87c77b820 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.1.bb @@ -0,0 +1,12 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:" + +LINUX_VERSION ?= "4.1.21" + +SRCREV = "ff45bc0e8917c77461b2901e2743e6339bb70413" +SRC_URI = "git://github.com/raspberrypi/linux.git;protocol=git;branch=rpi-4.1.y \ + file://0001-dts-add-overlay-for-pitft22.patch \ + file://0002-vmcs-Remove-unused-sm_cache_map_vector-definition.patch \ + file://0003-fix-gcc6.patch \ + " + +require linux-raspberrypi.inc diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.4.bb b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.4.bb new file mode 100644 index 000000000..3291ffdf3 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.4.bb @@ -0,0 +1,8 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:" + +LINUX_VERSION ?= "4.4.13" + +SRCREV = "680be5e27a9593cf26079c6e5744a04cc2809d13" +SRC_URI = "git://github.com/raspberrypi/linux.git;protocol=git;branch=rpi-4.4.y \ +" +require linux-raspberrypi.inc diff --git a/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-rpi.inc b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-rpi.inc new file mode 100644 index 000000000..4b65fc250 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-kernel/linux/linux-rpi.inc @@ -0,0 +1,138 @@ +DESCRIPTION = "Linux Kernel" +SECTION = "kernel" +LICENSE = "GPLv2" + +LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7" + +inherit kernel siteinfo +require recipes-kernel/linux/linux-yocto.inc + +# Enable OABI compat for people stuck with obsolete userspace +ARM_KEEP_OABI ?= "1" + +# Quirk for udev greater or equal 141 +UDEV_GE_141 ?= "1" + +# Set the verbosity of kernel messages during runtime +# You can define CMDLINE_DEBUG in your local.conf or distro.conf to override this behaviour +CMDLINE_DEBUG ?= '${@base_conditional("DISTRO_TYPE", "release", "quiet", "debug", d)}' +CMDLINE_append = " ${CMDLINE_DEBUG}" + +KERNEL_INITRAMFS ?= '${@base_conditional("INITRAMFS_IMAGE_BUNDLE", "1", "1", "", d)}' + +# Set a variable in .configure +# $1 - Configure variable to be set +# $2 - value [n/y/value] +kernel_configure_variable() { + # Remove the config + CONF_SED_SCRIPT="$CONF_SED_SCRIPT /CONFIG_$1[ =]/d;" + if test "$2" = "n" + then + echo "# CONFIG_$1 is not set" >> ${B}/.config + else + echo "CONFIG_$1=$2" >> ${B}/.config + fi +} + +do_configure_prepend() { + # Clean .config + echo "" > ${B}/.config + CONF_SED_SCRIPT="" + + # oabi / eabi support + kernel_configure_variable AEABI y + if [ "${ARM_KEEP_OABI}" = "1" ] ; then + kernel_configure_variable OABI_COMPAT y + else + kernel_configure_variable OABI_COMPAT n + fi + + # Set cmdline + kernel_configure_variable CMDLINE "\"${CMDLINE}\"" + + # Localversion + kernel_configure_variable LOCALVERSION "\"\"" + kernel_configure_variable LOCALVERSION_AUTO n + + # Udev quirks + # Newer versions of udev mandate that sysfs doesn't have deprecated entries + if [ "${UDEV_GE_141}" = "1" ] ; then + kernel_configure_variable SYSFS_DEPRECATED n + kernel_configure_variable SYSFS_DEPRECATED_V2 n + kernel_configure_variable HOTPLUG y + kernel_configure_variable UEVENT_HELPER_PATH "\"\"" + kernel_configure_variable UNIX y + kernel_configure_variable SYSFS y + kernel_configure_variable PROC_FS y + kernel_configure_variable TMPFS y + kernel_configure_variable INOTIFY_USER y + kernel_configure_variable SIGNALFD y + kernel_configure_variable TMPFS_POSIX_ACL y + kernel_configure_variable BLK_DEV_BSG y + kernel_configure_variable DEVTMPFS y + kernel_configure_variable DEVTMPFS_MOUNT y + fi + + # Newer inits like systemd need cgroup support + if [ "${KERNEL_ENABLE_CGROUPS}" = "1" ] ; then + kernel_configure_variable CGROUP_SCHED y + kernel_configure_variable CGROUPS y + kernel_configure_variable CGROUP_NS y + kernel_configure_variable CGROUP_FREEZER y + kernel_configure_variable CGROUP_DEVICE y + kernel_configure_variable CPUSETS y + kernel_configure_variable PROC_PID_CPUSET y + kernel_configure_variable CGROUP_CPUACCT y + kernel_configure_variable RESOURCE_COUNTERS y + fi + + # root-over-nfs-over-usb-eth support. Limited, but should cover some cases + # Enable this by setting a proper CMDLINE_NFSROOT_USB. + if [ ! -z "${CMDLINE_NFSROOT_USB}" ]; then + oenote "Configuring the kernel for root-over-nfs-over-usb-eth with CMDLINE ${CMDLINE_NFSROOT_USB}" + kernel_configure_variable INET y + kernel_configure_variable IP_PNP y + kernel_configure_variable USB_GADGET y + kernel_configure_variable USB_GADGET_SELECTED y + kernel_configure_variable USB_ETH y + kernel_configure_variable NFS_FS y + kernel_configure_variable ROOT_NFS y + kernel_configure_variable ROOT_NFS y + kernel_configure_variable CMDLINE "\"${CMDLINE_NFSROOT_USB}\"" + fi + if [ ! -z "${KERNEL_INITRAMFS}" ]; then + kernel_configure_variable BLK_DEV_INITRD y + kernel_configure_variable INITRAMFS_SOURCE "" + kernel_configure_variable RD_GZIP y + kernel_configure_variable OVERLAY_FS y + kernel_configure_variable SQUASHFS y + kernel_configure_variable UBIFS_FS y + fi + # Activate CONFIG_LEGACY_PTYS + kernel_configure_variable LEGACY_PTYS y + + # Keep this the last line + # Remove all modified configs and add the rest to .config + sed -e "${CONF_SED_SCRIPT}" < '${WORKDIR}/defconfig' >> '${B}/.config' + + yes '' | oe_runmake oldconfig +} + +# Automatically depend on lzop-native if CONFIG_KERNEL_LZO is enabled +python () { + try: + defconfig = bb.fetch2.localpath('file://defconfig', d) + except bb.fetch2.FetchError: + return + + try: + configfile = open(defconfig) + except IOError: + return + + if 'CONFIG_KERNEL_LZO=y\n' in configfile.readlines(): + depends = d.getVar('DEPENDS', False) + d.setVar('DEPENDS', depends + ' lzop-native') + + configfile.close() +} diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch new file mode 100644 index 000000000..815a7c2b6 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch @@ -0,0 +1,48 @@ +From 2e111e52f96f0b942abda120c30a876629bd73fc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Mon, 25 May 2015 14:53:35 +0200 +Subject: [PATCH] Don't try to acquire buffer when src pad isn't active + +This solves a race condition when setting the pipeline from PAUSE to +NULL while the decoder loop is still running. Without this patch, the +thread which interacts with the decode sink pad gets blocked here: + + gst_element_change_state() + gst_element_change_state_func() + gst_element_pads_activate() --> Deactivating pads + activate_pads() + gst_pad_set_active() + gst_pad_activate_mode() + post_activate() + GST_PAD_STREAM_LOCK() + +while gst_omx_port_acquire_buffer() gets stalled forever in +gst_omx_component_wait_message() waiting for a message that will never +arrive: + + gst_omx_video_dec_loop() + gst_omx_port_acquire_buffer() + gst_omx_component_wait_message() +--- + omx/gstomxvideodec.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index cd24944..57a61dd 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1247,6 +1247,11 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) + GstClockTimeDiff deadline; + OMX_ERRORTYPE err; + ++ if (!gst_pad_is_active(GST_VIDEO_DECODER_SRC_PAD (self))) { ++ GST_DEBUG_OBJECT (self, "Src pad not active, not acquiring buffer and flushing instead"); ++ goto flushing; ++ } ++ + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) + port = self->eglimage ? self->egl_out_port : self->dec_out_port; + #else +-- +1.8.3.2 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-config-files-path.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-config-files-path.patch new file mode 100644 index 000000000..a7da9221c --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0001-config-files-path.patch @@ -0,0 +1,137 @@ +--- a/config/bellagio/gstomx.conf ++++ b/config/bellagio/gstomx.conf +@@ -1,6 +1,6 @@ + [omxmpeg4videodec] + type-name=GstOMXMPEG4VideoDec +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.video_decoder.mpeg4 + rank=256 + in-port-index=0 +@@ -9,7 +9,7 @@ + + [omxh264dec] + type-name=GstOMXH264Dec +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.video_decoder.avc + rank=256 + in-port-index=0 +@@ -18,7 +18,7 @@ + + [omxmpeg4videoenc] + type-name=GstOMXMPEG4VideoEnc +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.video_encoder.mpeg4 + rank=0 + in-port-index=0 +@@ -27,7 +27,7 @@ + + [omxaacenc] + type-name=GstOMXAACEnc +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.audio_encoder.aac + rank=0 + in-port-index=0 +--- a/config/rpi/gstomx.conf ++++ b/config/rpi/gstomx.conf +@@ -1,6 +1,6 @@ + [omxmpeg2videodec] + type-name=GstOMXMPEG2VideoDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -9,7 +9,7 @@ + + [omxmpeg4videodec] + type-name=GstOMXMPEG4VideoDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -18,7 +18,7 @@ + + [omxh263dec] + type-name=GstOMXH263Dec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -27,7 +27,7 @@ + + [omxh264dec] + type-name=GstOMXH264Dec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -36,7 +36,7 @@ + + [omxtheoradec] + type-name=GstOMXTheoraDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -45,7 +45,7 @@ + + [omxvp8dec] + type-name=GstOMXVP8Dec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -54,7 +54,7 @@ + + [omxmjpegdec] + type-name=GstOMXMJPEGDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -63,7 +63,7 @@ + + [omxvc1dec] + type-name=GstOMXWMVDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=256 + in-port-index=130 +@@ -73,7 +73,7 @@ + + [omxh264enc] + type-name=GstOMXH264Enc +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_encode + rank=257 + in-port-index=200 +@@ -82,7 +82,7 @@ + + [omxanalogaudiosink] + type-name=GstOMXAnalogAudioSink +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.audio_render + rank=256 + in-port-index=100 +@@ -92,7 +92,7 @@ + + [omxhdmiaudiosink] + type-name=GstOMXHdmiAudioSink +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.audio_render + rank=257 + in-port-index=100 diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0002-fix-decoder-flushing.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0002-fix-decoder-flushing.patch new file mode 100644 index 000000000..d4c7c81d2 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0002-fix-decoder-flushing.patch @@ -0,0 +1,16 @@ +diff --git a/omx/gstomx.c b/omx/gstomx.c +index 69696c4..c382019 100644 +--- a/omx/gstomx.c ++++ b/omx/gstomx.c +@@ -1508,8 +1508,8 @@ gst_omx_port_set_flushing (GstOMXPort * port, GstClockTime timeout, + last_error = OMX_ErrorNone; + gst_omx_component_handle_messages (comp); + while (signalled && last_error == OMX_ErrorNone && !port->flushed +- && port->buffers +- && port->buffers->len > g_queue_get_length (&port->pending_buffers)) { ++ /* && port->buffers ++ && port->buffers->len > g_queue_get_length (&port->pending_buffers) */) { + signalled = gst_omx_component_wait_message (comp, timeout); + if (signalled) + gst_omx_component_handle_messages (comp); + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0003-no-timeout-on-get-state.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0003-no-timeout-on-get-state.patch new file mode 100644 index 000000000..0a0050de7 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0003-no-timeout-on-get-state.patch @@ -0,0 +1,16 @@ +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index 0d4e7a1..a0d9c74 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1697,9 +1697,9 @@ gst_omx_video_dec_stop (GstVideoDecoder * decoder) + g_cond_broadcast (&self->drain_cond); + g_mutex_unlock (&self->drain_lock); + +- gst_omx_component_get_state (self->dec, 5 * GST_SECOND); ++ gst_omx_component_get_state (self->dec, 0); + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) +- gst_omx_component_get_state (self->egl_render, 1 * GST_SECOND); ++ gst_omx_component_get_state (self->egl_render, 0); + #endif + + gst_buffer_replace (&self->codec_data, NULL); diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0004-Properly-handle-drain-requests-while-flushing.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0004-Properly-handle-drain-requests-while-flushing.patch new file mode 100644 index 000000000..98689f3fb --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0004-Properly-handle-drain-requests-while-flushing.patch @@ -0,0 +1,69 @@ +From 80dddfd13aaf2fe7272765f8cf291215fe375e28 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Tue, 17 Nov 2015 16:51:27 +0000 +Subject: [PATCH] Properly handle drain requests while flushing + +Without this commit the decoder streaming thread stops without ever attending +the drain request, leaving the decoder input thread waiting forever. +--- + omx/gstomx.c | 7 +++++++ + omx/gstomxvideodec.c | 13 +++++++++++++ + 2 files changed, 20 insertions(+) + +diff --git a/omx/gstomx.c b/omx/gstomx.c +index 69696c4..f0cd890 100644 +--- a/omx/gstomx.c ++++ b/omx/gstomx.c +@@ -830,6 +830,13 @@ gst_omx_component_set_state (GstOMXComponent * comp, OMX_STATETYPE state) + done: + + gst_omx_component_handle_messages (comp); ++ ++ if (err != OMX_ErrorNone && comp->last_error == OMX_ErrorNone) { ++ GST_ERROR_OBJECT (comp->parent, ++ "Last operation returned an error. Setting last_error manually."); ++ comp->last_error = err; ++ } ++ + g_mutex_unlock (&comp->lock); + + if (err != OMX_ErrorNone) { +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index d531f75..a26c4a6 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1539,9 +1539,16 @@ component_error: + flushing: + { + GST_DEBUG_OBJECT (self, "Flushing -- stopping task"); ++ ++ g_mutex_lock (&self->drain_lock); ++ if (self->draining) { ++ self->draining = FALSE; ++ g_cond_broadcast (&self->drain_cond); ++ } + gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self)); + self->downstream_flow_ret = GST_FLOW_FLUSHING; + self->started = FALSE; ++ g_mutex_unlock (&self->drain_lock); + return; + } + +@@ -1599,8 +1606,14 @@ flow_error: + self->started = FALSE; + } else if (flow_ret == GST_FLOW_FLUSHING) { + GST_DEBUG_OBJECT (self, "Flushing -- stopping task"); ++ g_mutex_lock (&self->drain_lock); ++ if (self->draining) { ++ self->draining = FALSE; ++ g_cond_broadcast (&self->drain_cond); ++ } + gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self)); + self->started = FALSE; ++ g_mutex_unlock (&self->drain_lock); + } + GST_VIDEO_DECODER_STREAM_UNLOCK (self); + return; +-- +1.8.3.2 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch new file mode 100644 index 000000000..b7a875375 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch @@ -0,0 +1,30 @@ +From 12103842d5f347cf245e71071d0c44297bcdb1f9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Fri, 4 Dec 2015 18:39:59 +0100 +Subject: [PATCH] Don't abort gst_omx_video_dec_set_format() if there's a + timeout releasing the buffers taken by the egl_render out port + +--- + omx/gstomxvideodec.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index 2368f34..da35e0d 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1905,8 +1905,11 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder, + 5 * GST_SECOND) != OMX_ErrorNone) + return FALSE; + if (gst_omx_port_wait_buffers_released (out_port, +- 1 * GST_SECOND) != OMX_ErrorNone) ++ 1 * GST_SECOND) != OMX_ErrorNone) { ++#if !(defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL)) + return FALSE; ++#endif ++ } + if (gst_omx_port_deallocate_buffers (self->dec_in_port) != OMX_ErrorNone) + return FALSE; + if (gst_omx_video_dec_deallocate_output_buffers (self) != OMX_ErrorNone) +-- +2.1.4 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0006-omxvideodec-unref-allocator-after-getting-it-from-al.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0006-omxvideodec-unref-allocator-after-getting-it-from-al.patch new file mode 100644 index 000000000..ace60a617 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0006-omxvideodec-unref-allocator-after-getting-it-from-al.patch @@ -0,0 +1,48 @@ +From d2df0fb032c36b366a08a1355c4f4c816eb53447 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Aur=C3=A9lien=20Zanelli?= +Date: Fri, 3 Jul 2015 00:26:48 +0200 +Subject: [PATCH] omxvideodec: unref allocator after getting it from allocation + query + +Otherwise a reference will be leaked for each allocator. It only happens +when target platform is Raspberry Pi and when we have GL support. + +https://bugzilla.gnome.org/show_bug.cgi?id=751867 +--- + omx/gstomxvideodec.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index cd24944..b8c3756 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -2530,14 +2530,18 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query) + GstAllocationParams params; + + gst_query_parse_nth_allocation_param (query, i, &allocator, ¶ms); +- if (allocator +- && g_strcmp0 (allocator->mem_type, +- GST_EGL_IMAGE_MEMORY_TYPE) == 0) { +- found = TRUE; +- gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); +- while (gst_query_get_n_allocation_params (query) > 1) +- gst_query_remove_nth_allocation_param (query, 1); +- break; ++ if (allocator) { ++ if (g_strcmp0 (allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0) { ++ found = TRUE; ++ gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); ++ while (gst_query_get_n_allocation_params (query) > 1) ++ gst_query_remove_nth_allocation_param (query, 1); ++ } ++ ++ gst_object_unref (allocator); ++ ++ if (found) ++ break; + } + } + +-- +2.5.5 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0007-omxvideodec-Use-gstglmemoryegl-for-the-RPi.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0007-omxvideodec-Use-gstglmemoryegl-for-the-RPi.patch new file mode 100644 index 000000000..ed828c361 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx-1.2.0/0007-omxvideodec-Use-gstglmemoryegl-for-the-RPi.patch @@ -0,0 +1,115 @@ +From 1cb902edb51d8f5d95f910b79b9b4c208550a7b6 Mon Sep 17 00:00:00 2001 +From: Gwang Yoon Hwang +Date: Wed, 20 Jan 2016 03:10:38 +0900 +Subject: [PATCH] omxvideodec : Use gstglmemoryegl for the RPi + +Modified to use gstglmemoryegl to avoid texture creation/copy operations +at the glupload. +--- + omx/gstomxvideodec.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index ec97731..c9d60ff 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -38,7 +38,7 @@ + + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) + #include +-#include ++#include + #endif + + #if defined (USE_OMX_TARGET_RPI) && defined(__GNUC__) +@@ -125,7 +125,7 @@ gst_omx_video_dec_class_init (GstOMXVideoDecClass * klass) + klass->cdata.type = GST_OMX_COMPONENT_TYPE_FILTER; + klass->cdata.default_src_template_caps = + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) +- GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, ++ GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, + "RGBA") "; " + #endif + "video/x-raw, " +@@ -596,8 +596,8 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self) + gst_structure_free (config); + + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) +- eglimage = self->eglimage && (allocator +- && g_strcmp0 (allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0); ++ eglimage = self->eglimage ++ && (allocator && GST_IS_GL_MEMORY_EGL_ALLOCATOR (allocator)); + #else + /* TODO: Implement something that works for other targets too */ + eglimage = FALSE; +@@ -640,12 +640,12 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self) + for (i = 0; i < min; i++) { + GstBuffer *buffer; + GstMemory *mem; ++ GstGLMemoryEGL *gl_mem; + + if (gst_buffer_pool_acquire_buffer (pool, &buffer, ¶ms) != GST_FLOW_OK + || gst_buffer_n_memory (buffer) != 1 + || !(mem = gst_buffer_peek_memory (buffer, 0)) +- || g_strcmp0 (mem->allocator->mem_type, +- GST_EGL_IMAGE_MEMORY_TYPE) != 0) { ++ || !GST_IS_GL_MEMORY_EGL_ALLOCATOR (mem->allocator)) { + GST_INFO_OBJECT (self, "Failed to allocated %d-th EGLImage", i); + g_list_free_full (buffers, (GDestroyNotify) gst_buffer_unref); + g_list_free (images); +@@ -656,13 +656,13 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self) + err = OMX_ErrorUndefined; + goto done; + } +- ++ gl_mem = (GstGLMemoryEGL *)mem; + buffers = g_list_append (buffers, buffer); +- gst_egl_image_memory_set_orientation (mem, ++ gst_gl_memory_egl_set_orientation (gl_mem, + GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_FLIP); +- images = g_list_append (images, gst_egl_image_memory_get_image (mem)); ++ images = g_list_append (images, gst_gl_memory_egl_get_image (gl_mem)); + if (egl_display == EGL_NO_DISPLAY) +- egl_display = gst_egl_image_memory_get_display (mem); ++ egl_display = gst_gl_memory_egl_get_display (gl_mem); + } + + GST_DEBUG_OBJECT (self, "Allocated %d EGLImages successfully", min); +@@ -954,14 +954,14 @@ gst_omx_video_dec_reconfigure_output_port (GstOMXVideoDec * self) + gst_caps_unref (state->caps); + state->caps = gst_video_info_to_caps (&state->info); + gst_caps_set_features (state->caps, 0, +- gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, NULL)); ++ gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL)); + + /* try to negotiate with caps feature */ + if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { + + GST_DEBUG_OBJECT (self, + "Failed to negotiate with feature %s", +- GST_CAPS_FEATURE_MEMORY_EGL_IMAGE); ++ GST_CAPS_FEATURE_MEMORY_GL_MEMORY); + + if (state->caps) + gst_caps_replace (&state->caps, NULL); +@@ -2554,7 +2554,7 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query) + + gst_query_parse_nth_allocation_param (query, i, &allocator, ¶ms); + if (allocator) { +- if (g_strcmp0 (allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0) { ++ if (GST_IS_GL_MEMORY_EGL_ALLOCATOR (allocator)) { + found = TRUE; + gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); + while (gst_query_get_n_allocation_params (query) > 1) +@@ -2572,7 +2572,7 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query) + * and if allocator is not of type memory EGLImage then fails */ + if (feature + && gst_caps_features_contains (feature, +- GST_CAPS_FEATURE_MEMORY_EGL_IMAGE) && !found) { ++ GST_CAPS_FEATURE_MEMORY_GL_MEMORY) && !found) { + return FALSE; + } + } +-- +2.5.0 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-config-files-path.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-config-files-path.patch new file mode 100644 index 000000000..a7da9221c --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-config-files-path.patch @@ -0,0 +1,137 @@ +--- a/config/bellagio/gstomx.conf ++++ b/config/bellagio/gstomx.conf +@@ -1,6 +1,6 @@ + [omxmpeg4videodec] + type-name=GstOMXMPEG4VideoDec +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.video_decoder.mpeg4 + rank=256 + in-port-index=0 +@@ -9,7 +9,7 @@ + + [omxh264dec] + type-name=GstOMXH264Dec +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.video_decoder.avc + rank=256 + in-port-index=0 +@@ -18,7 +18,7 @@ + + [omxmpeg4videoenc] + type-name=GstOMXMPEG4VideoEnc +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.video_encoder.mpeg4 + rank=0 + in-port-index=0 +@@ -27,7 +27,7 @@ + + [omxaacenc] + type-name=GstOMXAACEnc +-core-name=/usr/local/lib/libomxil-bellagio.so.0 ++core-name=/usr/lib/libomxil-bellagio.so.0 + component-name=OMX.st.audio_encoder.aac + rank=0 + in-port-index=0 +--- a/config/rpi/gstomx.conf ++++ b/config/rpi/gstomx.conf +@@ -1,6 +1,6 @@ + [omxmpeg2videodec] + type-name=GstOMXMPEG2VideoDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -9,7 +9,7 @@ + + [omxmpeg4videodec] + type-name=GstOMXMPEG4VideoDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -18,7 +18,7 @@ + + [omxh263dec] + type-name=GstOMXH263Dec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -27,7 +27,7 @@ + + [omxh264dec] + type-name=GstOMXH264Dec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -36,7 +36,7 @@ + + [omxtheoradec] + type-name=GstOMXTheoraDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -45,7 +45,7 @@ + + [omxvp8dec] + type-name=GstOMXVP8Dec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -54,7 +54,7 @@ + + [omxmjpegdec] + type-name=GstOMXMJPEGDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=257 + in-port-index=130 +@@ -63,7 +63,7 @@ + + [omxvc1dec] + type-name=GstOMXWMVDec +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_decode + rank=256 + in-port-index=130 +@@ -73,7 +73,7 @@ + + [omxh264enc] + type-name=GstOMXH264Enc +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.video_encode + rank=257 + in-port-index=200 +@@ -82,7 +82,7 @@ + + [omxanalogaudiosink] + type-name=GstOMXAnalogAudioSink +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.audio_render + rank=256 + in-port-index=100 +@@ -92,7 +92,7 @@ + + [omxhdmiaudiosink] + type-name=GstOMXHdmiAudioSink +-core-name=/opt/vc/lib/libopenmaxil.so ++core-name=/usr/lib/libopenmaxil.so + component-name=OMX.broadcom.audio_render + rank=257 + in-port-index=100 diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0002-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0002-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch new file mode 100644 index 000000000..aef21a577 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0002-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch @@ -0,0 +1,47 @@ +From 2e111e52f96f0b942abda120c30a876629bd73fc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Mon, 25 May 2015 14:53:35 +0200 +Subject: [PATCH] Don't try to acquire buffer when src pad isn't active + +This solves a race condition when setting the pipeline from PAUSE to +NULL while the decoder loop is still running. Without this patch, the +thread which interacts with the decode sink pad gets blocked here: + + gst_element_change_state() + gst_element_change_state_func() + gst_element_pads_activate() --> Deactivating pads + activate_pads() + gst_pad_set_active() + gst_pad_activate_mode() + post_activate() + GST_PAD_STREAM_LOCK() + +while gst_omx_port_acquire_buffer() gets stalled forever in +gst_omx_component_wait_message() waiting for a message that will never +arrive: + + gst_omx_video_dec_loop() + gst_omx_port_acquire_buffer() + gst_omx_component_wait_message() +--- + omx/gstomxvideodec.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index cd24944..57a61dd 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1247,6 +1247,11 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) + GstClockTimeDiff deadline; + OMX_ERRORTYPE err; + ++ if (!gst_pad_is_active(GST_VIDEO_DECODER_SRC_PAD (self))) { ++ GST_DEBUG_OBJECT (self, "Src pad not active, not acquiring buffer and flushing instead"); ++ goto flushing; ++ } ++ + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) + port = self->eglimage ? self->egl_out_port : self->dec_out_port; + #else +-- +1.8.3.2 diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-fix-decoder-flushing.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-fix-decoder-flushing.patch new file mode 100644 index 000000000..a244b0981 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-fix-decoder-flushing.patch @@ -0,0 +1,15 @@ +diff --git a/omx/gstomx.c b/omx/gstomx.c +index 69696c4..c382019 100644 +--- a/omx/gstomx.c ++++ b/omx/gstomx.c +@@ -1508,8 +1508,8 @@ gst_omx_port_set_flushing (GstOMXPort * port, GstClockTime timeout, + last_error = OMX_ErrorNone; + gst_omx_component_handle_messages (comp); + while (signalled && last_error == OMX_ErrorNone && !port->flushed +- && port->buffers +- && port->buffers->len > g_queue_get_length (&port->pending_buffers)) { ++ /* && port->buffers ++ && port->buffers->len > g_queue_get_length (&port->pending_buffers) */) { + signalled = gst_omx_component_wait_message (comp, timeout); + if (signalled) + gst_omx_component_handle_messages (comp); diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch new file mode 100644 index 000000000..0a0050de7 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-no-timeout-on-get-state.patch @@ -0,0 +1,16 @@ +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index 0d4e7a1..a0d9c74 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1697,9 +1697,9 @@ gst_omx_video_dec_stop (GstVideoDecoder * decoder) + g_cond_broadcast (&self->drain_cond); + g_mutex_unlock (&self->drain_lock); + +- gst_omx_component_get_state (self->dec, 5 * GST_SECOND); ++ gst_omx_component_get_state (self->dec, 0); + #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) +- gst_omx_component_get_state (self->egl_render, 1 * GST_SECOND); ++ gst_omx_component_get_state (self->egl_render, 0); + #endif + + gst_buffer_replace (&self->codec_data, NULL); diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch new file mode 100644 index 000000000..98689f3fb --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0004-Properly-handle-drain-requests-while-flushing.patch @@ -0,0 +1,69 @@ +From 80dddfd13aaf2fe7272765f8cf291215fe375e28 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Tue, 17 Nov 2015 16:51:27 +0000 +Subject: [PATCH] Properly handle drain requests while flushing + +Without this commit the decoder streaming thread stops without ever attending +the drain request, leaving the decoder input thread waiting forever. +--- + omx/gstomx.c | 7 +++++++ + omx/gstomxvideodec.c | 13 +++++++++++++ + 2 files changed, 20 insertions(+) + +diff --git a/omx/gstomx.c b/omx/gstomx.c +index 69696c4..f0cd890 100644 +--- a/omx/gstomx.c ++++ b/omx/gstomx.c +@@ -830,6 +830,13 @@ gst_omx_component_set_state (GstOMXComponent * comp, OMX_STATETYPE state) + done: + + gst_omx_component_handle_messages (comp); ++ ++ if (err != OMX_ErrorNone && comp->last_error == OMX_ErrorNone) { ++ GST_ERROR_OBJECT (comp->parent, ++ "Last operation returned an error. Setting last_error manually."); ++ comp->last_error = err; ++ } ++ + g_mutex_unlock (&comp->lock); + + if (err != OMX_ErrorNone) { +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index d531f75..a26c4a6 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1539,9 +1539,16 @@ component_error: + flushing: + { + GST_DEBUG_OBJECT (self, "Flushing -- stopping task"); ++ ++ g_mutex_lock (&self->drain_lock); ++ if (self->draining) { ++ self->draining = FALSE; ++ g_cond_broadcast (&self->drain_cond); ++ } + gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self)); + self->downstream_flow_ret = GST_FLOW_FLUSHING; + self->started = FALSE; ++ g_mutex_unlock (&self->drain_lock); + return; + } + +@@ -1599,8 +1606,14 @@ flow_error: + self->started = FALSE; + } else if (flow_ret == GST_FLOW_FLUSHING) { + GST_DEBUG_OBJECT (self, "Flushing -- stopping task"); ++ g_mutex_lock (&self->drain_lock); ++ if (self->draining) { ++ self->draining = FALSE; ++ g_cond_broadcast (&self->drain_cond); ++ } + gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self)); + self->started = FALSE; ++ g_mutex_unlock (&self->drain_lock); + } + GST_VIDEO_DECODER_STREAM_UNLOCK (self); + return; +-- +1.8.3.2 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch new file mode 100644 index 000000000..b7a875375 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx/0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch @@ -0,0 +1,30 @@ +From 12103842d5f347cf245e71071d0c44297bcdb1f9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= +Date: Fri, 4 Dec 2015 18:39:59 +0100 +Subject: [PATCH] Don't abort gst_omx_video_dec_set_format() if there's a + timeout releasing the buffers taken by the egl_render out port + +--- + omx/gstomxvideodec.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c +index 2368f34..da35e0d 100644 +--- a/omx/gstomxvideodec.c ++++ b/omx/gstomxvideodec.c +@@ -1905,8 +1905,11 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder, + 5 * GST_SECOND) != OMX_ErrorNone) + return FALSE; + if (gst_omx_port_wait_buffers_released (out_port, +- 1 * GST_SECOND) != OMX_ErrorNone) ++ 1 * GST_SECOND) != OMX_ErrorNone) { ++#if !(defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL)) + return FALSE; ++#endif ++ } + if (gst_omx_port_deallocate_buffers (self->dec_in_port) != OMX_ErrorNone) + return FALSE; + if (gst_omx_video_dec_deallocate_output_buffers (self) != OMX_ErrorNone) +-- +2.1.4 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.2.0.bbappend b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.2.0.bbappend new file mode 100644 index 000000000..1e84abe6b --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.2.0.bbappend @@ -0,0 +1,24 @@ +# +# Need to make this conditional to gstreamer1 +# +SRC_URI_append_rpi = " \ + file://0001-config-files-path.patch \ + file://0001-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch \ + file://0002-fix-decoder-flushing.patch \ + file://0003-no-timeout-on-get-state.patch \ + file://0004-Properly-handle-drain-requests-while-flushing.patch \ + file://0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch \ + file://0006-omxvideodec-unref-allocator-after-getting-it-from-al.patch \ + file://0007-omxvideodec-Use-gstglmemoryegl-for-the-RPi.patch \ +" + +FILESEXTRAPATHS_prepend := "${THISDIR}/gstreamer1.0-omx-1.2.0:" + +GSTREAMER_1_0_OMX_TARGET_rpi = "rpi" +GSTREAMER_1_0_OMX_CORE_NAME_rpi = "${libdir}/libopenmaxil.so" + + +# How to make this RPI specific? +EXTRA_OECONF_append_rpi = " CFLAGS="$CFLAGS -I${STAGING_DIR_TARGET}/usr/include/IL -I${STAGING_DIR_TARGET}/usr/include/interface/vcos/pthreads -I${STAGING_DIR_TARGET}/usr/include/interface/vmcs_host/linux"" +#examples only build with GL but not GLES, so disable it for RPI +EXTRA_OECONF_append_rpi = " --disable-examples" diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bbappend b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bbappend new file mode 100644 index 000000000..a13aad778 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bbappend @@ -0,0 +1,22 @@ +# +# Need to make this conditional to gstreamer1 +# +SRC_URI_append_rpi = " \ + file://0001-config-files-path.patch \ + file://0002-Don-t-try-to-acquire-buffer-when-src-pad-isn-t-activ.patch \ + file://0003-fix-decoder-flushing.patch \ + file://0003-no-timeout-on-get-state.patch \ + file://0004-Properly-handle-drain-requests-while-flushing.patch \ + file://0005-Don-t-abort-gst_omx_video_dec_set_format-if-there-s-.patch \ +" + +FILESEXTRAPATHS_prepend := "${THISDIR}/gstreamer1.0-omx:" + +GSTREAMER_1_0_OMX_TARGET_rpi = "rpi" +GSTREAMER_1_0_OMX_CORE_NAME_rpi = "${libdir}/libopenmaxil.so" + + +# How to make this RPI specific? +EXTRA_OECONF_append_rpi = " CFLAGS="$CFLAGS -I${STAGING_DIR_TARGET}/usr/include/IL -I${STAGING_DIR_TARGET}/usr/include/interface/vcos/pthreads -I${STAGING_DIR_TARGET}/usr/include/interface/vmcs_host/linux"" +#examples only build with GL but not GLES, so disable it for RPI +EXTRA_OECONF_append_rpi = " --disable-examples" diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend new file mode 100644 index 000000000..ab0280ec5 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend @@ -0,0 +1,2 @@ +EXTRA_OECONF_append_rpi = " CPPFLAGS='-I${STAGING_DIR_TARGET}/usr/include/interface/vcos/pthreads \ + -I${STAGING_DIR_TARGET}/usr/include/interface/vmcs_host/linux'" diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch new file mode 100644 index 000000000..151c33cce --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0001-Remove-Makefile.include-which-includes-hardcoded.patch @@ -0,0 +1,77 @@ +From a2a28fb7c4e8354cc0f90454e9bd151c16a6bf8b Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Tue, 20 Aug 2013 16:10:51 +0300 +Subject: [PATCH] Remove Makefile.include which includes hardcoded + +Remove Makefile.include which includes hardcoded paths and rely on +variables provided by build system. + +Upstream-Status: Inappropriate [embedded specific] +Signed-off-by: Andrei Gherzan + +Updated patch to apply to c0dd9502ed2c43c487674939195c69680f3d98b0 revision + +diff --git a/Makefile b/Makefile +index f348465..65f7637 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,4 +1,3 @@ +-include Makefile.include + + CFLAGS+=-std=c++0x -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CMAKE_CONFIG -D__VIDEOCORE4__ -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_OPT_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DHAVE_LIBSWRESAMPLE_SWRESAMPLE_H -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DTARGET_RASPBERRY_PI -DUSE_EXTERNAL_LIBBCM_HOST + +diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg +index 083e214..3b31a82 100644 +--- a/Makefile.ffmpeg ++++ b/Makefile.ffmpeg +@@ -1,4 +1,3 @@ +-include Makefile.include + + CFLAGS=-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_HAVE_SBRK -D_LARGEFILE64_SOURCE -DHAVE_CMAKE_CONFIG -DHAVE_VMCS_CONFIG -D_REENTRANT -DUSE_VCHIQ_ARM -DVCHI_BULK_ALIGN=1 -DVCHI_BULK_GRANULARITY=1 -DEGL_SERVER_DISPMANX -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__VIDEOCORE4__ -DGRAPHICS_X_VG=1 -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DOMX -DOMX_SKIP64BIT + +diff --git a/Makefile.include b/Makefile.include +deleted file mode 100644 +index 58e9560..0000000 +--- a/Makefile.include ++++ /dev/null +@@ -1,40 +0,0 @@ +-USE_BUILDROOT=0 +-FLOAT=hard +- +-ifeq ($(USE_BUILDROOT), 1) +-BUILDROOT :=/opt/xbmc-bcm/buildroot +-SDKSTAGE :=$(BUILDROOT)/output/staging +-TARGETFS :=$(BUILDROOT)/output/target +-TOOLCHAIN :=$(BUILDROOT)/output/host/usr/ +-HOST :=arm-unknown-linux-gnueabi +-SYSROOT :=$(BUILDROOT)/output/host/usr/arm-unknown-linux-gnueabi/sysroot +-else +-BUILDROOT :=/opt/bcm-rootfs +-SDKSTAGE :=/opt/bcm-rootfs +-TARGETFS :=/opt/bcm-rootfs +-TOOLCHAIN :=/home/dc4/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/ +-HOST :=arm-linux-gnueabihf +-#SYSROOT :=$(TOOLCHAIN)/arm-bcm2708hardfp-linux-gnueabi/sysroot +-SYSROOT :=/opt/bcm-rootfs +-endif +- +-JOBS=7 +- +-CFLAGS := -isystem$(PREFIX)/include +-CXXFLAGS := $(CFLAGS) +-CPPFLAGS := $(CFLAGS) +-LDFLAGS := -L$(BUILDROOT)/lib +-LD := $(TOOLCHAIN)/bin/$(HOST)-ld --sysroot=$(SYSROOT) +-CC := $(TOOLCHAIN)/bin/$(HOST)-gcc --sysroot=$(SYSROOT) +-CXX := $(TOOLCHAIN)/bin/$(HOST)-g++ --sysroot=$(SYSROOT) +-OBJDUMP := $(TOOLCHAIN)/bin/$(HOST)-objdump +-RANLIB := $(TOOLCHAIN)/bin/$(HOST)-ranlib +-STRIP := $(TOOLCHAIN)/bin/$(HOST)-strip +-AR := $(TOOLCHAIN)/bin/$(HOST)-ar +-CXXCP := $(CXX) -E +-PATH := $(PREFIX)/bin:$(BUILDROOT)/output/host/usr/bin:$(PATH) +- +-CFLAGS += -pipe -mfloat-abi=$(FLOAT) -mcpu=arm1176jzf-s -fomit-frame-pointer -mabi=aapcs-linux -mtune=arm1176jzf-s -mfpu=vfp -Wno-psabi -mno-apcs-stack-check -g -mstructure-size-boundary=32 -mno-sched-prolog +-LDFLAGS += -L$(SDKSTAGE)/lib -L$(SDKSTAGE)/usr/lib -L$(SDKSTAGE)/opt/vc/lib/ -Lpcre/build +-#INCLUDES += -isystem$(SDKSTAGE)/usr/include -isystem$(SDKSTAGE)/opt/vc/include -isystem$(SYSROOT)/usr/include -isystem$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -isystem$(SDKSTAGE)/usr/include/freetype2 +-INCLUDES += -isystem$(SDKSTAGE)/opt/vc/include -isystem$(SYSROOT)/usr/include -isystem$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -Ipcre/build -Iboost-trunk -Ifreetype2/include diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch new file mode 100644 index 000000000..75f72548a --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch @@ -0,0 +1,53 @@ +From 1e92da659375eae1622984d4cc0ffd2a7b082fcf Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 24 Aug 2014 00:13:13 +0200 +Subject: [PATCH] Libraries and headers from ffmpeg are installed in /usr. + +Don't search for libraries and headers in /usr/local. + +Upstream-Status: Inappropriate [embedded specific] + +Signed-off-by: Andrei Gherzan +Signed-off-by: Jonathan Liu +--- + Makefile | 6 +++--- + Makefile.ffmpeg | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/Makefile b/Makefile +index be97c2b..2c120fc 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,9 +1,9 @@ + + CFLAGS+=-std=c++0x -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -DTARGET_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CMAKE_CONFIG -D__VIDEOCORE4__ -U_FORTIFY_SOURCE -Wall -DHAVE_OMXLIB -DUSE_EXTERNAL_FFMPEG -DHAVE_LIBAVCODEC_AVCODEC_H -DHAVE_LIBAVUTIL_OPT_H -DHAVE_LIBAVUTIL_MEM_H -DHAVE_LIBAVUTIL_AVUTIL_H -DHAVE_LIBAVFORMAT_AVFORMAT_H -DHAVE_LIBAVFILTER_AVFILTER_H -DHAVE_LIBSWRESAMPLE_SWRESAMPLE_H -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DTARGET_RASPBERRY_PI -DUSE_EXTERNAL_LIBBCM_HOST + +-LDFLAGS+=-L./ -Lffmpeg_compiled/usr/local/lib/ -lc -lWFC -lGLESv2 -lEGL -lbcm_host -lopenmaxil -lfreetype -lz ++LDFLAGS+=-L./ -Lffmpeg_compiled/usr/lib/ -lc -lWFC -lGLESv2 -lEGL -lbcm_host -lopenmaxil -lfreetype -lz + +-INCLUDES+=-I./ -Ilinux -Iffmpeg_compiled/usr/local/include/ -I /usr/include/dbus-1.0 -I /usr/lib/arm-linux-gnueabihf/dbus-1.0/include ++INCLUDES+=-I./ -Ilinux -Iffmpeg_compiled/usr/include/ -I=/usr/include/dbus-1.0 -I /usr/lib/arm-linux-gnueabihf/dbus-1.0/include + + DIST ?= omxplayer-dist + +@@ -87,5 +87,5 @@ dist: omxplayer.bin omxplayer.1 + cp COPYING $(DIST)/usr/share/doc/omxplayer + cp README.md $(DIST)/usr/share/doc/omxplayer/README + cp omxplayer.1 $(DIST)/usr/share/man/man1 +- cp -P ffmpeg_compiled/usr/local/lib/*.so* $(DIST)/usr/lib/omxplayer/ ++ cp -P ffmpeg_compiled/usr/lib/*.so* $(DIST)/usr/lib/omxplayer/ + cd $(DIST); tar -czf ../$(DIST).tgz * +diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg +index 5ccf96f..a7ddd5f 100644 +--- a/Makefile.ffmpeg ++++ b/Makefile.ffmpeg +@@ -254,5 +254,5 @@ checkout: + .PHONY : install + install: + cd ffmpeg; make -j9 DESTDIR="$(WORK)/ffmpeg_compiled" install +- $(HOST)-strip ffmpeg_compiled/usr/local/lib/*.so ++ $(HOST)-strip ffmpeg_compiled/usr/lib/*.so + +-- +1.9.3 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch new file mode 100644 index 000000000..7f313301e --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch @@ -0,0 +1,39 @@ +From b738724c6ca45ee5fecebed01c7ac91c92446123 Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 24 Aug 2014 00:18:05 +0200 +Subject: [PATCH] Remove strip step in Makefile + +Build system will strip binaries so remove strip step in Makefile. +Avoid warnings/errors like: +WARNING: File '/usr/lib/omxplayer/libavutil.so.51.56.100' from +omxplayer was already stripped, this will prevent future debugging! + +Upstream-Status: Inappropriate [embedded specific] +Signed-off-by: Andrei Gherzan +--- + Makefile.ffmpeg | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg +index 9d66a85..00df197 100644 +--- a/Makefile.ffmpeg ++++ b/Makefile.ffmpeg +@@ -243,7 +243,8 @@ configure: + --disable-decoder=xbin \ + --disable-decoder=idf \ + --enable-decoder=opus \ +- --cross-prefix=$(HOST)- ++ --cross-prefix=$(HOST)- \ ++ --disable-stripping + + .PHONY : clean + clean: +@@ -256,5 +257,3 @@ checkout: + .PHONY : install + install: + cd ffmpeg; make -j9 DESTDIR="$(WORK)/ffmpeg_compiled" install +- $(HOST)-strip ffmpeg_compiled/usr/lib/*.so +- +-- +1.9.3 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch new file mode 100644 index 000000000..edb388e4f --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch @@ -0,0 +1,31 @@ +From 100982ee1fc1cb571c7453d14f9acd60e67d4765 Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan +Date: Sun, 25 Jan 2015 11:13:51 +0200 +Subject: [PATCH] Add FFMPEG_EXTRA_CFLAGS and FFMPEG_EXTRA_LDFLAGS + +In this way we can inject flags to LD and CC using +--extra-cflags and --extra-ldflags. + +Upstream-Status: Inappropriate [embedded specific] +Signed-off-by: Andrei Gherzan +--- + Makefile.ffmpeg | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg +index abe4b26..c9d42d7 100644 +--- a/Makefile.ffmpeg ++++ b/Makefile.ffmpeg +@@ -22,7 +22,8 @@ configure: + CFLAGS="$(CFLAGS) ${INCLUDES}" \ + LDFLAGS="" \ + ./configure \ +- --extra-cflags="-mfpu=vfp -mfloat-abi=$(FLOAT) -mno-apcs-stack-check -mstructure-size-boundary=32 -mno-sched-prolog" \ ++ --extra-cflags="-mfpu=vfp -mfloat-abi=$(FLOAT) -mno-apcs-stack-check -mstructure-size-boundary=32 -mno-sched-prolog $(FFMPEG_EXTRA_CFLAGS)" \ ++ --extra-ldflags="$(FFMPEG_EXTRA_LDFLAGS)" \ + --enable-cross-compile \ + --enable-shared \ + --disable-static \ +-- +2.1.0 + diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch new file mode 100644 index 000000000..ab40e40a2 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/fix-tar-command-with-DIST.patch @@ -0,0 +1,21 @@ +Revert the tar command change introduced in: +https://github.com/popcornmix/omxplayer/commit/201c77973155861e60492e45d35467b19b69c1c4 + +This fails if DIST is an absolute path. The old command was working just fine. + +Upstream-Status: Pending + +Signed-off-by: Andrei Gherzan +Signed-off-by: Jonathan Liu + +Index: git/Makefile +=================================================================== +--- git.orig/Makefile ++++ git/Makefile +@@ -71,4 +71,4 @@ dist: omxplayer.bin + cp COPYING $(DIST)/usr/share/doc/ + cp README.md $(DIST)/usr/share/doc/README + cp -P ffmpeg_compiled/usr/lib/*.so* $(DIST)/usr/lib/omxplayer/ +- cd $(DIST); tar -czf ../$(DIST).tgz * ++ tar -czf omxplayer-dist.tar.gz $(DIST) +\ No newline at end of file diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch new file mode 100644 index 000000000..ed8199939 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/use-native-pkg-config.patch @@ -0,0 +1,19 @@ +Force the pkg-config native tool. Strangely ffmpeg prepends cross_prefix +to the default value which obviously is wrong. + +Signed-off-by: Andrei Gherzan + +Index: git/Makefile.ffmpeg +=================================================================== +--- git.orig/Makefile.ffmpeg ++++ git/Makefile.ffmpeg +@@ -245,7 +245,8 @@ configure: + --disable-decoder=idf \ + --enable-decoder=opus \ + --cross-prefix=$(HOST)- \ +- --disable-stripping ++ --disable-stripping \ ++ --pkg-config=pkg-config + + .PHONY : clean + clean: diff --git a/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb new file mode 100644 index 000000000..d9460de22 --- /dev/null +++ b/import-layers/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb @@ -0,0 +1,71 @@ +SUMMARY = "A commandline OMX player for the Raspberry Pi" +DESCRIPTION = "This player was developed as a testbed for the XBMC \ +Raspberry PI implementation and is quite handy to use standalone" +HOMEPAGE = "https://github.com/popcornmix/omxplayer" +SECTION = "console/utils" + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" + +DEPENDS = "libpcre libav virtual/egl boost freetype dbus openssl samba libssh" +PR = "r4" + +SRCREV = "8466acf65f5f444dfa22631fb83c07ac759c02a5" +SRC_URI = "git://github.com/popcornmix/omxplayer.git;protocol=git;branch=master \ + file://0001-Remove-Makefile.include-which-includes-hardcoded.patch \ + file://0002-Libraries-and-headers-from-ffmpeg-are-installed-in-u.patch \ + file://0003-Remove-strip-step-in-Makefile.patch \ + file://0004-Add-FFMPEG_EXTRA_CFLAGS-and-FFMPEG_EXTRA_LDFLAGS.patch \ + file://fix-tar-command-with-DIST.patch \ + file://use-native-pkg-config.patch \ + " +S = "${WORKDIR}/git" + +COMPATIBLE_MACHINE = "raspberrypi" + +inherit autotools-brokensep pkgconfig + +# Needed in ffmpeg configure +export TEMPDIR = "${S}/tmp" + +# Needed in Makefile.ffmpeg +export HOST = "${HOST_SYS}" +export WORK = "${S}" +export FLOAT = "${@bb.utils.contains("TUNE_FEATURES", "callconvention-hard", "hard", "softfp", d)}" +export FFMPEG_EXTRA_CFLAGS = "--sysroot=${STAGING_DIR_TARGET}" +export FFMPEG_EXTRA_LDFLAGS = "--sysroot=${STAGING_DIR_TARGET}" + +# Needed in top Makefile +export LDFLAGS = "-L${S}/ffmpeg_compiled/usr/lib \ + -L${STAGING_DIR_HOST}/lib \ + -L${STAGING_DIR_HOST}/usr/lib \ + " +export INCLUDES = "-isystem${STAGING_DIR_HOST}/usr/include/interface/vcos/pthreads \ + -isystem${STAGING_DIR_HOST}/usr/include/freetype2 \ + -isystem${STAGING_DIR_HOST}/usr/include/interface/vmcs_host/linux \ + -isystem${STAGING_DIR_HOST}/usr/include/dbus-1.0 \ + -isystem${STAGING_DIR_HOST}/usr/lib/dbus-1.0/include \ + " +export DIST = "${D}" + +do_compile() { + # Needed for compiler test in ffmpeg's configure + mkdir -p tmp + + oe_runmake ffmpeg + oe_runmake +} + +do_install() { + oe_runmake STRIP='echo skipping strip' dist + mkdir -p ${D}${datadir}/fonts/truetype/freefont/ + install ${S}/fonts/* ${D}${datadir}/fonts/truetype/freefont/ +} + +FILES_${PN} = "${bindir}/omxplayer* \ + ${libdir}/omxplayer/lib*${SOLIBS} \ + ${datadir}/fonts" + +FILES_${PN}-dev += "${libdir}/omxplayer/*.so" + +RDEPENDS_${PN} += "bash procps" diff --git a/import-layers/meta-raspberrypi/scripts/lib/image/canned-wks/sdimage-raspberrypi.wks b/import-layers/meta-raspberrypi/scripts/lib/image/canned-wks/sdimage-raspberrypi.wks new file mode 100644 index 000000000..353daac9a --- /dev/null +++ b/import-layers/meta-raspberrypi/scripts/lib/image/canned-wks/sdimage-raspberrypi.wks @@ -0,0 +1,6 @@ +# short-description: Create Raspberry Pi SD card image +# long-description: Creates a partitioned SD card image for use with +# Raspberry Pi. Boot files are located in the first vfat partition. + +part /boot --source bootimg-partition --ondisk mmcblk --fstype=vfat --label boot --active --align 4096 --size 20 +part / --source rootfs --ondisk mmcblk --fstype=ext4 --label root --align 4096 -- cgit v1.2.3