diff options
author | 2020-03-30 09:24:26 +0900 | |
---|---|---|
committer | 2020-03-30 09:24:26 +0900 | |
commit | 5b80bfd7bffd4c20d80b7c70a7130529e9a755dd (patch) | |
tree | b4bb18dcd1487dbf1ea8127e5671b7bb2eded033 /bsp/meta-boundary | |
parent | 706ad73eb02caf8532deaf5d38995bd258725cb8 (diff) |
agl-basesystem
Diffstat (limited to 'bsp/meta-boundary')
55 files changed, 9290 insertions, 0 deletions
diff --git a/bsp/meta-boundary/classes/image_types_boundary.bbclass b/bsp/meta-boundary/classes/image_types_boundary.bbclass new file mode 100644 index 00000000..57916bad --- /dev/null +++ b/bsp/meta-boundary/classes/image_types_boundary.bbclass @@ -0,0 +1,117 @@ +inherit image_types + +BOOT_START = "4" +BOOT_SIZE = "32" +BOOT_END = "36" +ROOTFS_START = "36" +ROOTFS_SIZE = "700" +ROOTFS_END = "736" +APPFS_START = "740" +APPFS_SIZE = "2856" +APPFS_END = "3596" +SDCARD_SIZE = "3600" +SDCARD = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.sdcard" +IMAGE_BOOTLOADER = "u-boot" + +IMAGE_DEPENDS_boundary = "parted-native:do_populate_sysroot \ + dosfstools-native:do_populate_sysroot \ + mtools-native:do_populate_sysroot \ + virtual/kernel:do_deploy \ + ${@d.getVar('IMAGE_BOOTLOADER', True) and d.getVar('IMAGE_BOOTLOADER', True) + ':do_deploy' or ''}" + +create_blank_sdcard_file () { + # Initialize a sparse file + dd if=/dev/zero of=${SDCARD} bs=1M count=0 seek=${SDCARD_SIZE} + # Create partition table + parted -s ${SDCARD} mklabel msdos +} + +create_and_burn_boot () { + # create boot partition + parted -s ${SDCARD} unit MiB mkpart primary fat32 ${BOOT_START} ${BOOT_END} + + # Create boot partition image + [ -e ${WORKDIR}/boot.img ] && rm ${WORKDIR}/boot.img + dd if=/dev/zero of=${WORKDIR}/boot.img bs=1M count=0 seek=${BOOT_SIZE} + mkfs.vfat -n "BOOT" -S 512 ${WORKDIR}/boot.img + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::/${KERNEL_IMAGETYPE} + + # Copy boot scripts + for item in ${BOOT_SCRIPTS}; do + src=`echo $item | awk -F':' '{ print $1 }'` + dst=`echo $item | awk -F':' '{ print $2 }'` + + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/$src ::/$dst + ## FIXME in the class code ---------^ + done + + # Copy device tree file + for DTS_FILE in ${KERNEL_DEVICETREE}; do + DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'` + if [ -e "${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb" ]; then + kernel_bin="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin`" + kernel_bin_for_dtb="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MACHINE},g;s,\.dtb$,.bin,g"`" + if [ $kernel_bin = $kernel_bin_for_dtb ]; then + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb + fi + fi + done + + # Burn Partition + dd if=${WORKDIR}/boot.img of=${SDCARD} conv=notrunc seek=${BOOT_START} bs=1M +} + +create_and_burn_rootfs () { + # Create Partition + parted -s ${SDCARD} unit MiB mkpart primary ${ROOTFS_START} ${ROOTFS_END} + + # Temporarily move the app&boot folders away and leave empty mount point for partition creation + + [ -d ${IMAGE_ROOTFS}/../app ] && rm -rf ${IMAGE_ROOTFS}/../app + mv ${IMAGE_ROOTFS}/app ${IMAGE_ROOTFS}/../ + mkdir ${IMAGE_ROOTFS}/app + [ -d ${IMAGE_ROOTFS}/../boot ] && rm -rf ${IMAGE_ROOTFS}/../boot + mv ${IMAGE_ROOTFS}/boot ${IMAGE_ROOTFS}/../ + mkdir ${IMAGE_ROOTFS}/boot + # Create rootfs image + rootfs=`mktemp` + dd if=/dev/zero of=$rootfs seek=${ROOTFS_SIZE} count=0 bs=1M + mkfs.ext4 -F -i 4096 -L "rootfs" ${rootfs} -d ${IMAGE_ROOTFS} + dd if=${rootfs} of=${SDCARD} conv=notrunc seek=${ROOTFS_START} bs=1M + rm $rootfs + rm -rf ${IMAGE_ROOTFS}/app + mv ${IMAGE_ROOTFS}/../app ${IMAGE_ROOTFS}/app + rm -rf ${IMAGE_ROOTFS}/boot + mv ${IMAGE_ROOTFS}/../boot ${IMAGE_ROOTFS}/boot +} + +create_and_burn_appfs () { + # Create Partition + parted -s ${SDCARD} unit MiB mkpart primary ${APPFS_START} ${APPFS_END} + + # write the application partition + appfs=`mktemp` + dd if=/dev/zero of=$appfs bs=1M count=0 seek=${APPFS_SIZE} + mkfs.ext4 -L "app" -F -i 4096 ${appfs} -d ${IMAGE_ROOTFS}/app + dd if=${appfs} of=${SDCARD} conv=notrunc seek=${APPFS_START} bs=1M + rm $appfs +} + +create_sdcard_symlink() { + SDCARD_LINK=`echo ${IMAGE_NAME} | awk -F "-${MACHINE}" '{ print $1 }'` + [ -e ${DEPLOY_DIR_IMAGE}/${SDCARD_LINK}.sdcard ] && rm ${DEPLOY_DIR_IMAGE}/${SDCARD_LINK}.sdcard + ln -s ${SDCARD} ${DEPLOY_DIR_IMAGE}/${SDCARD_LINK}.sdcard +} + +IMAGE_CMD_boundary () { + if [ -z "${SDCARD_ROOTFS}" ]; then + bberror "SDCARD_ROOTFS is undefined. To use sdcard image from Freescale's BSP it needs to be defined." + exit 1 + fi + + create_blank_sdcard_file + create_and_burn_boot + create_and_burn_rootfs + create_and_burn_appfs + create_sdcard_symlink +} diff --git a/bsp/meta-boundary/conf/distro/boundary-wayland.conf b/bsp/meta-boundary/conf/distro/boundary-wayland.conf new file mode 100644 index 00000000..0816b144 --- /dev/null +++ b/bsp/meta-boundary/conf/distro/boundary-wayland.conf @@ -0,0 +1,16 @@ +# Boundary Distro for Wayland. + +require conf/distro/fslc-wayland.conf + +DISTRO = "boundary-wayland" +DISTRO_NAME = "Boundary Wayland" + +# Use fsl version of GStreamer for now as there's no gstreamer-imx for imx8m yet +MACHINE_GSTREAMER_1_0_PLUGIN_mx8mq = "imx-gst1.0-plugin" +PREFERRED_VERSION_gstreamer1.0_mx8mq = "1.14.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-base_mx8mq = "1.14.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-good_mx8mq = "1.14.imx" +PREFERRED_VERSION_gstreamer1.0-plugins-bad_mx8mq = "1.14.imx" + +# Use i.MX libdrm Version +PREFERRED_VERSION_libdrm = "2.4.84.imx" diff --git a/bsp/meta-boundary/conf/layer.conf b/bsp/meta-boundary/conf/layer.conf new file mode 100644 index 00000000..bbedc134 --- /dev/null +++ b/bsp/meta-boundary/conf/layer.conf @@ -0,0 +1,22 @@ +# We have a conf and classes directory, append to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have a recipes directory, add to BBFILES +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" + +BBFILE_COLLECTIONS += "boundary-layer" +BBFILE_PATTERN_boundary-layer := "^${LAYERDIR}/" +BBFILE_PRIORITY_boundary-layer = "8" +LAYERSERIES_COMPAT_boundary-layer = "sumo thud" + +LICENSE_PATH += "${LAYERDIR}/licenses" + +# The dynamic-layers directory hosts the extensions and layer specific +# modifications related to Boundary Devices products. +# +# The .bbappend and .bb files are included (only) if the respective layer +# collection is available. +BBFILES += "${@' '.join('${LAYERDIR}/dynamic-layers/%s/recipes*/*/*.bbappend' % layer \ + for layer in BBFILE_COLLECTIONS.split())}" +BBFILES += "${@' '.join('${LAYERDIR}/dynamic-layers/%s/recipes*/*/*.bb' % layer \ + for layer in BBFILE_COLLECTIONS.split())}" diff --git a/bsp/meta-boundary/conf/machine/imx6-acl.conf b/bsp/meta-boundary/conf/machine/imx6-acl.conf new file mode 100644 index 00000000..a1a32a3d --- /dev/null +++ b/bsp/meta-boundary/conf/machine/imx6-acl.conf @@ -0,0 +1,52 @@ +#@TYPE: Machine +#@NAME: Boundary Devices ACL +#@SOC: i.MX6 Q/DL +#@DESCRIPTION: Machine configuration for Boundary Devices ACL +#@MAINTAINER: Gary Bisson <gary.bisson@boundarydevices.com> +# +# By default, this machine will build for the standard Solo, 512M +# option. To build U-Boot for other CPU or memory combinations, +# you can set the UBOOT_MACHINE variable in your local.conf +# according to the following table: +# +# Processor Memory Configuration +# -------------- ------ -------------------- +# i.MX6Quad 2GB acl_q2g_defconfig +# i.MX6Solo 512MB acl_s512m_defconfig +# + +MACHINEOVERRIDES =. "mx6:mx6dl:mx6q:" + +include conf/machine/include/imx-base.inc +include conf/machine/include/tune-cortexa9.inc + +KERNEL_DEVICETREE = "imx6dl-acl.dtb \ + imx6q-acl.dtb \ +" +KERNEL_IMAGETYPE = "zImage" + +PREFERRED_PROVIDER_u-boot = "u-boot-boundary" +PREFERRED_PROVIDER_virtual/kernel ?= "linux-boundary" + +# Use SPI NOR U-Boot by default +IMAGE_BOOTLOADER ?= "" + +IMAGE_FSTYPES = "sdcard.gz" + +# Shorten boot volume ID (FAT limitation) +BOOTDD_VOLUME_ID = "Boot" + +# Ensure boot scripts will be available at rootfs time +do_rootfs[depends] += "u-boot-script-boundary:do_deploy" + +# Boot scripts to install +BOOT_SCRIPTS = "6x_bootscript-${MACHINE}:6x_bootscript" + +UBOOT_MACHINE ?= "acl_512m_defconfig" + +SERIAL_CONSOLE = "115200 ttymxc1" + +MACHINE_EXTRA_RRECOMMENDS += " linux-firmware-gslx680 \ + libiio libiio-iiod libiio-tests \ + libmdi2300 libmdi2300-examples \ + printer-tools kernel-iio " diff --git a/bsp/meta-boundary/conf/machine/nitrogen8mm.conf b/bsp/meta-boundary/conf/machine/nitrogen8mm.conf new file mode 100644 index 00000000..446fe9db --- /dev/null +++ b/bsp/meta-boundary/conf/machine/nitrogen8mm.conf @@ -0,0 +1,43 @@ +#@TYPE: Machine +#@NAME: Boundary Devices Nitrogen8M +#@SOC: i.MX8 MQ +#@DESCRIPTION: Machine configuration for Boundary Devices Nitrogen8M +#@MAINTAINER: Chris Dimich <chris.dimich@boundarydevices.com> + +MACHINEOVERRIDES =. "mx8:mx8mm:mx8m:mx8mq:" + +require conf/machine/include/imx-base.inc +require conf/machine/include/arm/arch-arm64.inc + +# Kernel configuration +PREFERRED_PROVIDER_virtual/kernel ??= "linux-boundary" +KERNEL_DEVICETREE = "freescale/imx8mq-nitrogen8m.dtb \ + freescale/imx8mq-nitrogen8m-m4.dtb \ + freescale/imx8mm-nitrogen8mm.dtb \ +" +KERNEL_IMAGETYPE = "Image" +RDEPENDS_${KERNEL_PACKAGE_NAME}-base = "" + +# U-Boot configuration +PREFERRED_PROVIDER_u-boot ??= "u-boot-boundary" +PREFERRED_PROVIDER_virtual/bootloader ??= "u-boot-boundary" +SPL_BINARY = "spl/u-boot-spl.bin" +UBOOT_DTB_NAME ?= "imx8mm-nitrogen8mm.dtb" +UBOOT_MACHINE ?= "nitrogen8mm_2g_defconfig" +UBOOT_MAKE_TARGET = "" +UBOOT_SUFFIX = "bin" + +# wic support +WKS_FILE = "sdimage-bootpart.wks" +IMAGE_BOOT_FILES_append = " \ + boot.scr-${MACHINE};boot.scr \ +" +WKS_FILE_DEPENDS_mx8 += " \ + u-boot-script-boundary \ + e2fsprogs-native \ + bmap-tools-native \ +" + +SERIAL_CONSOLE ?= "115200 ttymxc0" + +MACHINE_FEATURES += " pci wifi bluetooth" diff --git a/bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb b/bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb new file mode 100644 index 00000000..902aa8e8 --- /dev/null +++ b/bsp/meta-boundary/dynamic-layers/qt5-layer/recipes-qtbrowser/qtbrowser-qt5/qtbrowser-qt5_git.bb @@ -0,0 +1,24 @@ +require recipes-qt/qt5/qt5.inc + +DESCRIPTION = "QT Browser" +PR = "r0" +LICENSE = "CLOSED" + +DEPENDS = "qtbase qtwebkit" + +SRCREV = "57ac373f948498810c3f276fe712e67f5ec0d4aa" +SRC_URI = "git://github.com/boundarydevices/qtbrowser;branch=qt5" + +S = "${WORKDIR}/git" + +PARALLEL_MAKE = "" + + +do_install() { + export INSTALL_ROOT=${D} + make install +} + +FILES_${PN} = " \ + /usr/bin/* \ +" diff --git a/bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb b/bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb new file mode 100644 index 00000000..af83840a --- /dev/null +++ b/bsp/meta-boundary/dynamic-layers/xfce-layer/recipes-xfce/images/boundary-eval-image-xfce.bb @@ -0,0 +1,47 @@ +DESCRIPTION = "A XFCE desktop demo image." + +IMAGE_FEATURES += "splash package-management ssh-server-dropbear hwcodecs dev-pkgs" + +LICENSE = "MIT" + +inherit core-image distro_features_check + +REQUIRED_DISTRO_FEATURES = "x11" + +CORE_IMAGE_BASE_INSTALL += "\ + packagegroup-core-boot \ + ${ROOTFS_PKGMANAGE_BOOTSTRAP} \ + packagegroup-core-x11 \ + packagegroup-xfce-base \ + kernel-modules \ + \ + nodejs \ + packagegroup-fsl-gstreamer1.0-full \ + \ + flex \ + gcc \ + git \ + m4 \ + make \ + iperf3 \ + libtool \ + nano \ + python-compiler \ + strace \ + screen \ + minicom \ + openssl \ + cryptodev-module \ +" + +# For silex module support uncomment the line below and register your ssh key on our webserver to get access. +# Silex requires some terms and conditions to be accepted before you can build +# Please fill out the form located here for access: https://boundarydevices.com/private-git-access/ +#CORE_IMAGE_BASE_INSTALL += "kernel-module-silex linux-firmware-silex" + +# Video input demos only on nitrogen6x/sx/7 platform +# Chromium not on nitrogen7 +CORE_IMAGE_BASE_INSTALL_append_nitrogen6x += "video-input-icon chromium firefox qt5everywheredemo cinematicexperience" +CORE_IMAGE_BASE_INSTALL_append_nitrogen6x-lite += "chromium firefox" +CORE_IMAGE_BASE_INSTALL_append_nitrogen6sx += "video-input-icon chromium firefox" +CORE_IMAGE_BASE_INSTALL_append_nitrogen7 += "video-input-icon" diff --git a/bsp/meta-boundary/licenses/boundary b/bsp/meta-boundary/licenses/boundary new file mode 100644 index 00000000..678c7be5 --- /dev/null +++ b/bsp/meta-boundary/licenses/boundary @@ -0,0 +1,2 @@ +This file is proprietary to Boundary Devices and should not +be shared, except by authorized customers. diff --git a/bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb b/bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb new file mode 100644 index 00000000..1e2e9c8e --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/app-startup/app-startup.bb @@ -0,0 +1,27 @@ +# Copyright (C) 2014 Boundary Devices + +SUMMARY = "app-startup" +SECTION = "base" +LICENSE = "LGPLv3" +LIC_FILES_CHKSUM = "file://app;beginline=11;endline=11;md5=1c2ccc7e2f30e48720e36f0c0e5d1b79" + +S = "${WORKDIR}" + +SRC_URI = " \ + file://app \ + file://root.profile \ +" + +do_install_append() { + install -d ${D}${sysconfdir}/init.d/ + install -d ${D}/home/root/ + install -m 755 ${S}/app ${D}${sysconfdir}/init.d/ + install ${S}/root.profile ${D}/home/root/.profile + update-rc.d -r ${D} app start 80 5 . +} + +FILES_${PN} += " \ + ${sysconfdir}/init.d/app \ + /home/root/.profile \ +" + diff --git a/bsp/meta-boundary/recipes-boundary/app-startup/files/app b/bsp/meta-boundary/recipes-boundary/app-startup/files/app new file mode 100755 index 00000000..32f7ae4a --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/app-startup/files/app @@ -0,0 +1,46 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: app +# Required-Start: wifi +# Required-Stop: wifi +# Default-Start: S +# Default-Stop: +# +# install with update-rc.d app start 80 5 . +# +# SPDX-License-Identifier: LGPL-3.0+ +# +### END INIT INFO + +case "$1" in + start) + echo -n "Starting application" + daemonize /app/run-app + echo "done" + ;; + stop) + echo -n "Stopping application" + /app/stop-app + echo "done" + ;; + restart) + $0 stop + $0 start + ;; + status) + pid=`pidof -x run-app` + if [ -n "$pid" ]; then + echo "run-app (pid $pid) is running ..." + exit 2 + else + echo "run-app is stopped" + fi + ;; + *) + echo "Usage: app { start | stop | restart | status }" >&2 + exit 1 + ;; +esac + +exit 0 + diff --git a/bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile b/bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile new file mode 100644 index 00000000..aaa98dd0 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/app-startup/files/root.profile @@ -0,0 +1,5 @@ +killem() { /etc/init.d/app stop ; } +startem() { /etc/init.d/app start ; } +if [ -e /app/app.profile ]; then + . /app/app.profile +fi diff --git a/bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb b/bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb new file mode 100644 index 00000000..525fc0e6 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/daemonize/daemonize.bb @@ -0,0 +1,16 @@ +# Copyright (C) 2014 Boundary Devices + +SUMMARY = "Daemonize" +SECTION = "base" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=5003fa041d799dd5dd5f646b74e36924" + +S = "${WORKDIR}/git" + +SRC_URI = "git://github.com/boundarydevices/daemonize.git;branch=${SRCBRANCH}" +SRCBRANCH = "master" +SRCREV = "9c08934f6cbf3cf4bfbdeb92d411072e5d2f7ad0" + +inherit autotools-brokensep + + diff --git a/bsp/meta-boundary/recipes-boundary/devregs/devregs.bb b/bsp/meta-boundary/recipes-boundary/devregs/devregs.bb new file mode 100644 index 00000000..f964f3c4 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/devregs/devregs.bb @@ -0,0 +1,22 @@ +# Copyright (C) 2014 Boundary Devices + +SUMMARY = "Devregs" +SECTION = "base" +LICENSE = "GPL" +LIC_FILES_CHKSUM = "file://COPYING;md5=5003fa041d799dd5dd5f646b74e36924" + +S = "${WORKDIR}/git" + +SRC_URI = "git://github.com/boundarydevices/devregs.git;branch=${SRCBRANCH}" +SRCBRANCH = "master" +SRCREV = "8e2537cec400a4cedd1e37a9cc823cea458732e9" + +inherit autotools-brokensep + +do_install_append() { + cp -fv ${S}/dat/devregs_imx* ${D}${sysconfdir}/ +} + +FILES_${PN} += " \ + ${sysconfdir}/devregs_imx*.dat \ +" diff --git a/bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb b/bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb new file mode 100644 index 00000000..42cfaa87 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/images/boundary-image-multimedia-full.bb @@ -0,0 +1,16 @@ +# This image extends fsl-image-multimedia-full with additional +# Boundary Devices packages + +require recipes-fsl/images/fsl-image-multimedia-full.bb + +CORE_IMAGE_EXTRA_INSTALL += " \ + i2c-tools \ + iperf3 \ + imx-gpu-viv-demos \ + kernel-module-qcacld \ + linux-firmware-bdsdmac \ + mmc-utils \ + openssh \ + spitools \ + connman \ +" diff --git a/bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb b/bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb new file mode 100644 index 00000000..31b08c04 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/libmdi2300/libmdi2300_git.bb @@ -0,0 +1,30 @@ +SUMMARY = "Library for Opticon MDI-2300 Barcode scanner." +HOMEPAGE = "https://github.com/boundarydevices/libmdi2300" +LICENSE = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://LICENSE;md5=e8d8feac5daeb0b39a13e1c1535e1f20" +SECTION = "libs" + +SRCREV = "dce5071fc8e1ac1e87cce0920b975a8cf33cdecc" +SRC_URI = "git://github.com/boundarydevices/libmdi2300.git;protocol=git;" + +S = "${WORKDIR}/git/" + +PACKAGES = "${PN} ${PN}-dbg ${PN}-examples" + +EXTRA_OEMAKE = " 'CC=${CC}' " + +do_compile () { + oe_runmake all + oe_runmake examples +} + +do_install () { + oe_runmake install DESTDIR=${D}/usr/ + oe_runmake install_examples DESTDIR=${D}/usr/ +} + +FILES_${PN} += "/usr/lib/ /usr/include" +FILES_${PN}-dbg += "/usr/src/" +FILES_${PN}-examples += "/usr/bin/" + +BBCLASSEXTEND = "native" diff --git a/bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb b/bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb new file mode 100644 index 00000000..661a3fe6 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/printer-tools/printer-tools_git.bb @@ -0,0 +1,30 @@ +SUMMARY = "Test/Debug tools for thermal printers." +HOMEPAGE = "https://github.com/boundarydevices/printer-tools" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=4bc53cea4911b2abe17c307d0f49a5d8" +SECTION = "base" + +SRCREV = "e219aea844d720e7b03da495862cc1586132e7dd" +SRCBRANCH = "ftp628" +SRC_URI = "git://github.com/boundarydevices/printer-tools.git;protocol=git;branch=${SRCBRANCH}" + +S = "${WORKDIR}/git/" + +DEPENDS += " libpng " + +EXTRA_OEMAKE = " 'CC=${CC}' 'CFLAGS=-I${STAGING_INCDIR}' \ + 'LDFLAGS=-L${STAGING_LIBDIR}' " + +do_compile () { + oe_runmake all +} + +do_install () { + oe_runmake install DESTDIR=${D}/usr/ +} + +FILES_${PN} += "/usr/bin" + +INSANE_SKIP_${PN} = "ldflags" + +BBCLASSEXTEND = "native" diff --git a/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING new file mode 100644 index 00000000..6f195d36 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/COPYING @@ -0,0 +1,282 @@ +======================================================================= + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd new file mode 100644 index 00000000..6fb0b987 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/files/syslogd @@ -0,0 +1,4 @@ +# +# For remote UDP logging use SYSLOGD="-r" +# +SYSLOGD="-r" diff --git a/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb new file mode 100644 index 00000000..67ea6c0e --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/sysklogd-config-remote/sysklogd-config-remote.bb @@ -0,0 +1,23 @@ +# Copyright (C) 2015 Boundary Devices + +SUMMARY = "sysklogd-config-remote" +SECTION = "base" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=5003fa041d799dd5dd5f646b74e36924" + +S = "${WORKDIR}" + +SRC_URI = " \ + file://syslogd \ + file://COPYING \ +" + +do_install_append() { + install -d ${D}${sysconfdir}/default + install ${S}/syslogd ${D}${sysconfdir}/default/ +} + +FILES_${PN} += " \ + ${sysconfdir}/default/syslogd \ +" + diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING new file mode 100644 index 00000000..90978d50 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/COPYING @@ -0,0 +1,12 @@ +Copyright (C) 2015 by Boundary Devices + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, 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/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop new file mode 100644 index 00000000..677e9bbc --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5640-MIPI-Test.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=OV5640 MIPI Test +Comment=Launches gst-launch to show ov5640-mipi input on screen. +Exec=/usr/bin/ov5640-mipi-test +Icon=video-player +Terminal=true +Type=Application +StartupNotify=true +Categories=GTK;AudioVideo;Audio;Player; diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop new file mode 100644 index 00000000..947f8b98 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/OV5642.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=OV5642 Test +Comment=Launches gst-launch to show ov5642 input on screen. +Exec=/usr/bin/ov5642-test +Icon=video-player +Terminal=true +Type=Application +StartupNotify=true +Categories=GTK;AudioVideo;Audio;Player; diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input new file mode 100755 index 00000000..f1fc27ea --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input @@ -0,0 +1 @@ +gst-launch-1.0 imxv4l2videosrc device=/dev/video3 ! autovideosink; diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop new file mode 100644 index 00000000..89ed7565 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/hdmi-input.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=HDMI Input Test +Comment=Launches gst-launch to show hdmi input on screen. +Exec=/usr/bin/hdmi-input +Icon=video-player +Terminal=true +Type=Application +StartupNotify=true +Categories=GTK;AudioVideo;Audio;Player; diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test new file mode 100755 index 00000000..d1358fed --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5640-mipi-test @@ -0,0 +1 @@ +gst-launch-1.0 imxv4l2videosrc device=/dev/video1 ! autovideosink; diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test new file mode 100755 index 00000000..f9ce12c1 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/files/ov5642-test @@ -0,0 +1 @@ +gst-launch-1.0 imxv4l2videosrc device=/dev/video0 ! autovideosink; diff --git a/bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb b/bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb new file mode 100644 index 00000000..98fdf136 --- /dev/null +++ b/bsp/meta-boundary/recipes-boundary/video-input-icon/video-input-icon.bb @@ -0,0 +1,60 @@ +# Simple recipe to add desktop icon and executable to run gstreamer +# command to display video input on screen in media player. + +DESCRIPTION = "Video Input Desktop Icon/Executable" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://COPYING;md5=b7a244440f5854ed05acee9962562ba4" + +PR = "r0" + +SRC_URI = " \ + file://hdmi-input \ + file://hdmi-input.desktop \ + file://OV5640-MIPI-Test.desktop \ + file://ov5640-mipi-test \ + file://OV5642.desktop \ + file://ov5642-test \ + file://COPYING \ +" + +S = "${WORKDIR}" + +do_install_nitrogen6x() { + mkdir -p ${D}/usr/bin/ + mkdir -p ${D}/usr/share/applications/ + cp ${S}/hdmi-input ${D}/usr/bin/ + cp ${S}/hdmi-input.desktop ${D}/usr/share/applications/ + cp ${S}/ov5640-mipi-test ${D}/usr/bin/ + cp ${S}/OV5640-MIPI-Test.desktop ${D}/usr/share/applications/ + cp ${S}/OV5642.desktop ${D}/usr/share/applications/ + cp ${S}/ov5642-test ${D}/usr/bin/ +} + +do_install_nitrogen6sx() { + mkdir -p ${D}/usr/bin/ + mkdir -p ${D}/usr/share/applications/ + cp ${S}/OV5642.desktop ${D}/usr/share/applications/ + cp ${S}/ov5642-test ${D}/usr/bin/ +} + +do_install_nitrogen7() { + mkdir -p ${D}/usr/bin/ + mkdir -p ${D}/usr/share/applications/ + cp ${S}/ov5640-mipi-test ${D}/usr/bin/ + cp ${S}/OV5640-MIPI-Test.desktop ${D}/usr/share/applications/ +} + +FILES_${PN}_nitrogen6x = " \ + /usr/bin/* \ + /usr/share/applications/* \ +" + +FILES_${PN}_nitrogen6sx = " \ + /usr/bin/ov5642-test \ + /usr/share/applications/OV5642.desktop \ +" + +FILES_${PN}_nitrogen7 = " \ + /usr/bin/ov5640-mipi-test \ + /usr/share/applications/OV5640-MIPI-Test.desktop \ +" diff --git a/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend new file mode 100644 index 00000000..39db7823 --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state.bbappend @@ -0,0 +1,6 @@ +# Append path for boundarydevices layer to include alsa-state +# Includes default 75% volume setting +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +PACKAGE_ARCH_mx7 = "${MACHINE_ARCH}" +PACKAGE_ARCH_mx6 = "${MACHINE_ARCH}" diff --git a/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state new file mode 100644 index 00000000..27c7165a --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx6/asound.state @@ -0,0 +1,1878 @@ +state.wm8962audio { + control.1 { + iface MIXER + name 'Input Mixer Switch' + value.0 true + value.1 true + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.2 { + iface MIXER + name 'MIXINL IN2L Volume' + value 5 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 0 + } + } + control.3 { + iface MIXER + name 'MIXINL PGA Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin 0 + dbmax 3000 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'MIXINL IN3L Volume' + value 5 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 0 + } + } + control.5 { + iface MIXER + name 'MIXINR IN2R Volume' + value 5 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 0 + } + } + control.6 { + iface MIXER + name 'MIXINR PGA Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin 0 + dbmax 3000 + dbvalue.0 0 + } + } + control.7 { + iface MIXER + name 'MIXINR IN3R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.8 { + iface MIXER + name 'Digital Capture Volume' + value.0 108 + value.1 108 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 2325 + dbvalue.0 900 + dbvalue.1 900 + } + } + control.9 { + iface MIXER + name 'Capture Volume' + value.0 63 + value.1 63 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 63' + dbmin -2325 + dbmax 2400 + dbvalue.0 2400 + dbvalue.1 2400 + } + } + control.10 { + iface MIXER + name 'Capture Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.11 { + iface MIXER + name 'Capture ZC Switch' + value.0 true + value.1 true + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.12 { + iface MIXER + name 'Capture HPF Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.13 { + iface MIXER + name 'Capture HPF Mode' + value Hi-fi + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 Hi-fi + item.1 Application + } + } + control.14 { + iface MIXER + name 'Capture HPF Cutoff' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + } + } + control.15 { + iface MIXER + name 'Capture LHPF Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.16 { + iface MIXER + name 'Capture LHPF Mode' + value LPF + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 LPF + item.1 HPF + } + } + control.17 { + iface MIXER + name 'Sidetone Volume' + value.0 0 + value.1 0 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 12' + dbmin -3600 + dbmax 0 + dbvalue.0 -3600 + dbvalue.1 -3600 + } + } + control.18 { + iface MIXER + name 'Digital Playback Volume' + value.0 96 + value.1 96 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 2325 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.19 { + iface MIXER + name 'DAC High Performance Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.20 { + iface MIXER + name 'DAC L/R Swap Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.21 { + iface MIXER + name 'ADC L/R Swap Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.22 { + iface MIXER + name 'ADC High Performance Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.23 { + iface MIXER + name 'Beep Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 15' + dbmin -9999999 + dbmax -600 + dbvalue.0 -9999999 + } + } + control.24 { + iface MIXER + name 'Headphone Volume' + value.0 93 + value.1 93 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 600 + dbvalue.0 -2800 + dbvalue.1 -2800 + } + } + control.25 { + iface MIXER + name 'Headphone Switch' + value.0 true + value.1 true + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.26 { + iface MIXER + name 'Headphone ZC Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.27 { + iface MIXER + name 'Headphone Aux Volume' + value.0 7 + value.1 7 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 7' + dbmin -700 + dbmax 0 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.28 { + iface MIXER + name 'Headphone Mixer Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.29 { + iface MIXER + name 'HPMIXL IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.30 { + iface MIXER + name 'HPMIXL IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.31 { + iface MIXER + name 'HPMIXL MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.32 { + iface MIXER + name 'HPMIXL MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.33 { + iface MIXER + name 'HPMIXR IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.34 { + iface MIXER + name 'HPMIXR IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.35 { + iface MIXER + name 'HPMIXR MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.36 { + iface MIXER + name 'HPMIXR MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.37 { + iface MIXER + name 'Speaker Boost Volume' + value 3 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin 0 + dbmax 1200 + dbvalue.0 450 + } + } + control.38 { + iface MIXER + name 'EQ Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.39 { + iface MIXER + name 'EQ1 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.40 { + iface MIXER + name 'EQ2 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.41 { + iface MIXER + name 'EQ3 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.42 { + iface MIXER + name 'EQ4 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.43 { + iface MIXER + name 'EQ5 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.44 { + iface MIXER + name '3D Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.45 { + iface MIXER + name '3D Coefficients' + value '0040000000000000' + comment { + access 'read write' + type BYTES + count 8 + } + } + control.46 { + iface MIXER + name 'DF1 Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.47 { + iface MIXER + name 'DF1 Coefficients' + value '0000000000000000000000000000' + comment { + access 'read write' + type BYTES + count 14 + } + } + control.48 { + iface MIXER + name 'DRC Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.49 { + iface MIXER + name 'DRC Coefficients' + value '000c0925000000000000' + comment { + access 'read write' + type BYTES + count 10 + } + } + control.50 { + iface MIXER + name 'VSS Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.51 { + iface MIXER + name 'VSS Coefficients' + value '008c020000350700003a4100008b7d00003a4100008cfee800780000003fb260002d18180020000000f1834000fb830000eeaec000fbac4000f17f8000f43b4000f5fb0000ea10c000fcc58000e275c00004b48000d4f9800004914000d8a48000023dc000cf7a8000dc060000f2dac000baf340000a7940001c068000fd2d00001ce840000ddc4000fc9d000009558000fe7e80000eab4000f99880000987c000fd2c400009480000035f400000870000fae4c000000b400004e18000011f4000f8b00000fbcbc00004f3800007df4000ff070000efd70000fbaf4000108a80001107c000e0080000d276000020cf400030234000fd69c0002835000006330000d9f6c000f33340000f420000040c8000fb3f8000f757c0000354000000c6c0000312c000fd8580' + comment { + access 'read write' + type BYTES + count 296 + } + } + control.52 { + iface MIXER + name 'HPF1 Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.53 { + iface MIXER + name 'HPF2 Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.54 { + iface MIXER + name 'HPF Coefficients' + value '0000' + comment { + access 'read write' + type BYTES + count 2 + } + } + control.55 { + iface MIXER + name 'HD Bass Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.56 { + iface MIXER + name 'HD Bass Coefficients' + value '0002bd12007c586c00538121003f8bd80032f52d0065ac8c006be08700721483007214830043352500066a4a0043607900080000000100000059999a' + comment { + access 'read write' + type BYTES + count 60 + } + } + control.57 { + iface MIXER + name 'Speaker Volume' + value.0 114 + value.1 114 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 600 + dbvalue.0 -700 + dbvalue.1 -700 + } + } + control.58 { + iface MIXER + name 'Speaker Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.59 { + iface MIXER + name 'Speaker ZC Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.60 { + iface MIXER + name 'Speaker Mixer Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.61 { + iface MIXER + name 'SPKOUTL Mixer IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.62 { + iface MIXER + name 'SPKOUTL Mixer IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.63 { + iface MIXER + name 'SPKOUTL Mixer MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.64 { + iface MIXER + name 'SPKOUTL Mixer MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.65 { + iface MIXER + name 'SPKOUTL Mixer DACL Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.66 { + iface MIXER + name 'SPKOUTL Mixer DACR Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.67 { + iface MIXER + name 'SPKOUTR Mixer IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.68 { + iface MIXER + name 'SPKOUTR Mixer IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.69 { + iface MIXER + name 'SPKOUTR Mixer MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.70 { + iface MIXER + name 'SPKOUTR Mixer MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.71 { + iface MIXER + name 'SPKOUTR Mixer DACL Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.72 { + iface MIXER + name 'SPKOUTR Mixer DACR Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.73 { + iface MIXER + name 'SPKOUTR PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.74 { + iface MIXER + name 'SPKOUTL PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.75 { + iface MIXER + name 'SPKOUTR Mixer DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.76 { + iface MIXER + name 'SPKOUTR Mixer DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.77 { + iface MIXER + name 'SPKOUTR Mixer MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.78 { + iface MIXER + name 'SPKOUTR Mixer MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.79 { + iface MIXER + name 'SPKOUTR Mixer IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.80 { + iface MIXER + name 'SPKOUTR Mixer IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.81 { + iface MIXER + name 'SPKOUTL Mixer DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.82 { + iface MIXER + name 'SPKOUTL Mixer DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.83 { + iface MIXER + name 'SPKOUTL Mixer MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.84 { + iface MIXER + name 'SPKOUTL Mixer MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.85 { + iface MIXER + name 'SPKOUTL Mixer IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.86 { + iface MIXER + name 'SPKOUTL Mixer IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.87 { + iface MIXER + name 'HPOUTR PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.88 { + iface MIXER + name 'HPOUTL PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.89 { + iface MIXER + name 'HPMIXR DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.90 { + iface MIXER + name 'HPMIXR DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.91 { + iface MIXER + name 'HPMIXR MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.92 { + iface MIXER + name 'HPMIXR MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.93 { + iface MIXER + name 'HPMIXR IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.94 { + iface MIXER + name 'HPMIXR IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.95 { + iface MIXER + name 'HPMIXL DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.96 { + iface MIXER + name 'HPMIXL DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.97 { + iface MIXER + name 'HPMIXL MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.98 { + iface MIXER + name 'HPMIXL MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.99 { + iface MIXER + name 'HPMIXL IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.100 { + iface MIXER + name 'HPMIXL IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.101 { + iface MIXER + name STR + value None + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 None + item.1 Left + item.2 Right + } + } + control.102 { + iface MIXER + name STL + value None + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 None + item.1 Left + item.2 Right + } + } + control.103 { + iface MIXER + name 'MIXINR IN2R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.104 { + iface MIXER + name 'MIXINR IN3R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.105 { + iface MIXER + name 'MIXINR PGA Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.106 { + iface MIXER + name 'MIXINL IN2L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.107 { + iface MIXER + name 'MIXINL IN3L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.108 { + iface MIXER + name 'MIXINL PGA Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.109 { + iface MIXER + name 'INPGAR IN1R Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.110 { + iface MIXER + name 'INPGAR IN2R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.111 { + iface MIXER + name 'INPGAR IN3R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.112 { + iface MIXER + name 'INPGAR IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.113 { + iface MIXER + name 'INPGAL IN1L Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.114 { + iface MIXER + name 'INPGAL IN2L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.115 { + iface MIXER + name 'INPGAL IN3L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.116 { + iface MIXER + name 'INPGAL IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } +} +state.imx6qnitrogen6x { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 127 + value.1 127 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 1200 + dbvalue.1 1200 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Lineout Playback Volume' + value.0 27 + value.1 27 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1250 + dbmax 300 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.8 { + iface MIXER + name 'Mic Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 0 + } + } + control.9 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.10 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} +state.imx6dlnit6xlite { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 127 + value.1 127 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 1200 + dbvalue.1 1200 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Lineout Playback Volume' + value.0 27 + value.1 27 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1250 + dbmax 300 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.8 { + iface MIXER + name 'Mic Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 0 + } + } + control.9 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.10 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} +state.imx6qnitrogen6m { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 127 + value.1 127 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 1200 + dbvalue.1 1200 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Lineout Playback Volume' + value.0 27 + value.1 27 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1250 + dbmax 300 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.8 { + iface MIXER + name 'Mic Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 0 + } + } + control.9 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.10 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} +state.imx6sxnitrogen6 { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 127 + value.1 127 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 1200 + dbvalue.1 1200 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Lineout Playback Volume' + value.0 27 + value.1 27 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1250 + dbmax 300 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.8 { + iface MIXER + name 'Mic Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 0 + } + } + control.9 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.10 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} diff --git a/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state new file mode 100644 index 00000000..552f763d --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/alsa-state/alsa-state/mx7/asound.state @@ -0,0 +1,1374 @@ +state.wm8962audio { + control.1 { + iface MIXER + name 'Input Mixer Switch' + value.0 true + value.1 true + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.2 { + iface MIXER + name 'MIXINL IN2L Volume' + value 5 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 0 + } + } + control.3 { + iface MIXER + name 'MIXINL PGA Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin 0 + dbmax 3000 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'MIXINL IN3L Volume' + value 5 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 0 + } + } + control.5 { + iface MIXER + name 'MIXINR IN2R Volume' + value 5 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 0 + } + } + control.6 { + iface MIXER + name 'MIXINR PGA Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin 0 + dbmax 3000 + dbvalue.0 0 + } + } + control.7 { + iface MIXER + name 'MIXINR IN3R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.8 { + iface MIXER + name 'Digital Capture Volume' + value.0 108 + value.1 108 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 2325 + dbvalue.0 900 + dbvalue.1 900 + } + } + control.9 { + iface MIXER + name 'Capture Volume' + value.0 63 + value.1 63 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 63' + dbmin -2325 + dbmax 2400 + dbvalue.0 2400 + dbvalue.1 2400 + } + } + control.10 { + iface MIXER + name 'Capture Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.11 { + iface MIXER + name 'Capture ZC Switch' + value.0 true + value.1 true + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.12 { + iface MIXER + name 'Capture HPF Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.13 { + iface MIXER + name 'Capture HPF Mode' + value Hi-fi + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 Hi-fi + item.1 Application + } + } + control.14 { + iface MIXER + name 'Capture HPF Cutoff' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + } + } + control.15 { + iface MIXER + name 'Capture LHPF Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.16 { + iface MIXER + name 'Capture LHPF Mode' + value LPF + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 LPF + item.1 HPF + } + } + control.17 { + iface MIXER + name 'Sidetone Volume' + value.0 0 + value.1 0 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 12' + dbmin -3600 + dbmax 0 + dbvalue.0 -3600 + dbvalue.1 -3600 + } + } + control.18 { + iface MIXER + name 'Digital Playback Volume' + value.0 96 + value.1 96 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 2325 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.19 { + iface MIXER + name 'DAC High Performance Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.20 { + iface MIXER + name 'DAC L/R Swap Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.21 { + iface MIXER + name 'ADC L/R Swap Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.22 { + iface MIXER + name 'ADC High Performance Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.23 { + iface MIXER + name 'Beep Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 15' + dbmin -9999999 + dbmax -600 + dbvalue.0 -9999999 + } + } + control.24 { + iface MIXER + name 'Headphone Volume' + value.0 93 + value.1 93 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 600 + dbvalue.0 -2800 + dbvalue.1 -2800 + } + } + control.25 { + iface MIXER + name 'Headphone Switch' + value.0 true + value.1 true + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.26 { + iface MIXER + name 'Headphone ZC Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.27 { + iface MIXER + name 'Headphone Aux Volume' + value.0 7 + value.1 7 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 7' + dbmin -700 + dbmax 0 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.28 { + iface MIXER + name 'Headphone Mixer Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.29 { + iface MIXER + name 'HPMIXL IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.30 { + iface MIXER + name 'HPMIXL IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.31 { + iface MIXER + name 'HPMIXL MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.32 { + iface MIXER + name 'HPMIXL MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.33 { + iface MIXER + name 'HPMIXR IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.34 { + iface MIXER + name 'HPMIXR IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.35 { + iface MIXER + name 'HPMIXR MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.36 { + iface MIXER + name 'HPMIXR MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.37 { + iface MIXER + name 'Speaker Boost Volume' + value 3 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin 0 + dbmax 1200 + dbvalue.0 450 + } + } + control.38 { + iface MIXER + name 'EQ Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.39 { + iface MIXER + name 'EQ1 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.40 { + iface MIXER + name 'EQ2 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.41 { + iface MIXER + name 'EQ3 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.42 { + iface MIXER + name 'EQ4 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.43 { + iface MIXER + name 'EQ5 Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 31' + dbmin -1200 + dbmax 1900 + dbvalue.0 0 + dbvalue.1 0 + } + } + control.44 { + iface MIXER + name '3D Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.45 { + iface MIXER + name '3D Coefficients' + value '0040000000000000' + comment { + access 'read write' + type BYTES + count 8 + } + } + control.46 { + iface MIXER + name 'DF1 Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.47 { + iface MIXER + name 'DF1 Coefficients' + value '0000000000000000000000000000' + comment { + access 'read write' + type BYTES + count 14 + } + } + control.48 { + iface MIXER + name 'DRC Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.49 { + iface MIXER + name 'DRC Coefficients' + value '000c0925000000000000' + comment { + access 'read write' + type BYTES + count 10 + } + } + control.50 { + iface MIXER + name 'VSS Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.51 { + iface MIXER + name 'VSS Coefficients' + value '008c020000350700003a4100008b7d00003a4100008cfee800780000003fb260002d18180020000000f1834000fb830000eeaec000fbac4000f17f8000f43b4000f5fb0000ea10c000fcc58000e275c00004b48000d4f9800004914000d8a48000023dc000cf7a8000dc060000f2dac000baf340000a7940001c068000fd2d00001ce840000ddc4000fc9d000009558000fe7e80000eab4000f99880000987c000fd2c400009480000035f400000870000fae4c000000b400004e18000011f4000f8b00000fbcbc00004f3800007df4000ff070000efd70000fbaf4000108a80001107c000e0080000d276000020cf400030234000fd69c0002835000006330000d9f6c000f33340000f420000040c8000fb3f8000f757c0000354000000c6c0000312c000fd8580' + comment { + access 'read write' + type BYTES + count 296 + } + } + control.52 { + iface MIXER + name 'HPF1 Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.53 { + iface MIXER + name 'HPF2 Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.54 { + iface MIXER + name 'HPF Coefficients' + value '0000' + comment { + access 'read write' + type BYTES + count 2 + } + } + control.55 { + iface MIXER + name 'HD Bass Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.56 { + iface MIXER + name 'HD Bass Coefficients' + value '0002bd12007c586c00538121003f8bd80032f52d0065ac8c006be08700721483007214830043352500066a4a0043607900080000000100000059999a' + comment { + access 'read write' + type BYTES + count 60 + } + } + control.57 { + iface MIXER + name 'Speaker Volume' + value.0 114 + value.1 114 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -9999999 + dbmax 600 + dbvalue.0 -700 + dbvalue.1 -700 + } + } + control.58 { + iface MIXER + name 'Speaker Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.59 { + iface MIXER + name 'Speaker ZC Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.60 { + iface MIXER + name 'Speaker Mixer Switch' + value.0 false + value.1 false + comment { + access 'read write' + type BOOLEAN + count 2 + } + } + control.61 { + iface MIXER + name 'SPKOUTL Mixer IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.62 { + iface MIXER + name 'SPKOUTL Mixer IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.63 { + iface MIXER + name 'SPKOUTL Mixer MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.64 { + iface MIXER + name 'SPKOUTL Mixer MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.65 { + iface MIXER + name 'SPKOUTL Mixer DACL Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.66 { + iface MIXER + name 'SPKOUTL Mixer DACR Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.67 { + iface MIXER + name 'SPKOUTR Mixer IN4L Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.68 { + iface MIXER + name 'SPKOUTR Mixer IN4R Volume' + value 7 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 7' + dbmin -1500 + dbmax 600 + dbvalue.0 600 + } + } + control.69 { + iface MIXER + name 'SPKOUTR Mixer MIXINL Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.70 { + iface MIXER + name 'SPKOUTR Mixer MIXINR Volume' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 0 + } + } + control.71 { + iface MIXER + name 'SPKOUTR Mixer DACL Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.72 { + iface MIXER + name 'SPKOUTR Mixer DACR Volume' + value 0 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 1' + dbmin -600 + dbmax 0 + dbvalue.0 -600 + } + } + control.73 { + iface MIXER + name 'SPKOUTR PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.74 { + iface MIXER + name 'SPKOUTL PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.75 { + iface MIXER + name 'SPKOUTR Mixer DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.76 { + iface MIXER + name 'SPKOUTR Mixer DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.77 { + iface MIXER + name 'SPKOUTR Mixer MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.78 { + iface MIXER + name 'SPKOUTR Mixer MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.79 { + iface MIXER + name 'SPKOUTR Mixer IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.80 { + iface MIXER + name 'SPKOUTR Mixer IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.81 { + iface MIXER + name 'SPKOUTL Mixer DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.82 { + iface MIXER + name 'SPKOUTL Mixer DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.83 { + iface MIXER + name 'SPKOUTL Mixer MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.84 { + iface MIXER + name 'SPKOUTL Mixer MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.85 { + iface MIXER + name 'SPKOUTL Mixer IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.86 { + iface MIXER + name 'SPKOUTL Mixer IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.87 { + iface MIXER + name 'HPOUTR PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.88 { + iface MIXER + name 'HPOUTL PGA' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 Mixer + } + } + control.89 { + iface MIXER + name 'HPMIXR DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.90 { + iface MIXER + name 'HPMIXR DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.91 { + iface MIXER + name 'HPMIXR MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.92 { + iface MIXER + name 'HPMIXR MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.93 { + iface MIXER + name 'HPMIXR IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.94 { + iface MIXER + name 'HPMIXR IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.95 { + iface MIXER + name 'HPMIXL DACL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.96 { + iface MIXER + name 'HPMIXL DACR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.97 { + iface MIXER + name 'HPMIXL MIXINL Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.98 { + iface MIXER + name 'HPMIXL MIXINR Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.99 { + iface MIXER + name 'HPMIXL IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.100 { + iface MIXER + name 'HPMIXL IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.101 { + iface MIXER + name STR + value None + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 None + item.1 Left + item.2 Right + } + } + control.102 { + iface MIXER + name STL + value None + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 None + item.1 Left + item.2 Right + } + } + control.103 { + iface MIXER + name 'MIXINR IN2R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.104 { + iface MIXER + name 'MIXINR IN3R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.105 { + iface MIXER + name 'MIXINR PGA Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.106 { + iface MIXER + name 'MIXINL IN2L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.107 { + iface MIXER + name 'MIXINL IN3L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.108 { + iface MIXER + name 'MIXINL PGA Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.109 { + iface MIXER + name 'INPGAR IN1R Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.110 { + iface MIXER + name 'INPGAR IN2R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.111 { + iface MIXER + name 'INPGAR IN3R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.112 { + iface MIXER + name 'INPGAR IN4R Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.113 { + iface MIXER + name 'INPGAL IN1L Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.114 { + iface MIXER + name 'INPGAL IN2L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.115 { + iface MIXER + name 'INPGAL IN3L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.116 { + iface MIXER + name 'INPGAL IN4L Switch' + value false + comment { + access 'read write' + type BOOLEAN + count 1 + } + } +} diff --git a/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend new file mode 100644 index 00000000..9d0f2fec --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-boot_%.bbappend @@ -0,0 +1,45 @@ +SRCBRANCH = "boundary-imx_4.9.123_imx8mm_ga" +SRC_URI = "git://github.com/boundarydevices/imx-mkimage.git;branch=${SRCBRANCH}" +SRCREV = "${AUTOREV}" +PV = "1.0+git${SRCPV}" + +IMXBOOT_TARGETS = "${@bb.utils.contains('MACHINE', 'nitrogen8mm', "u-boot-lpddr4-iMX8MM-2g.nohdmibin", "u-boot-lpddr4-iMX8M-2g.hdmibin", d)}" +UBOOT_NAME = "u-boot-${MACHINE}.bin" +BOOT_CONFIG_MACHINE = "${BOOT_NAME}-${MACHINE}.bin" + +compile_mx8m() { + bbnote 8MQ/8MM boot binary build + for ddr_firmware in ${DDR_FIRMWARE_NAME}; do + bbnote "Copy ddr_firmware: ${ddr_firmware} from ${DEPLOY_DIR_IMAGE} -> ${BOOT_STAGING} " + cp ${DEPLOY_DIR_IMAGE}/${ddr_firmware} ${BOOT_STAGING} + done + cp ${DEPLOY_DIR_IMAGE}/signed_*_imx8m.bin ${BOOT_STAGING} + cp ${DEPLOY_DIR_IMAGE}/u-boot-spl.bin-${MACHINE} ${BOOT_STAGING}/u-boot-spl.bin + cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/${UBOOT_DTB_NAME} ${BOOT_STAGING} + cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/u-boot-nodtb.bin ${BOOT_STAGING} + cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/mkimage_uboot ${BOOT_STAGING} + cp ${DEPLOY_DIR_IMAGE}/${UBOOT_NAME} ${BOOT_STAGING}/u-boot.bin +} + +do_compile() { + compile_${SOC_FAMILY} + # mkimage for i.MX8 + for target in ${IMXBOOT_TARGETS}; do + bbnote "building ${SOC_TARGET} - ${target}" + make SOC=${SOC_TARGET} DTBS=${UBOOT_DTB_NAME} ${target} + if [ -e "${BOOT_STAGING}/${target}" ]; then + cp ${BOOT_STAGING}/${target} ${S}/${BOOT_CONFIG_MACHINE}-${target} + fi + done +} + +deploy_mx8m() { + install -d ${DEPLOYDIR}/${BOOT_TOOLS} + install -m 0644 ${DEPLOY_DIR_IMAGE}/u-boot-spl.bin-${MACHINE} ${DEPLOYDIR}/${BOOT_TOOLS} + for ddr_firmware in ${DDR_FIRMWARE_NAME}; do + install -m 0644 ${DEPLOY_DIR_IMAGE}/${ddr_firmware} ${DEPLOYDIR}/${BOOT_TOOLS} + done + install -m 0644 ${DEPLOY_DIR_IMAGE}/signed_hdmi*.bin ${DEPLOYDIR}/${BOOT_TOOLS} + install -m 0755 ${BOOT_STAGING}/${TOOLS_NAME} ${DEPLOYDIR}/${BOOT_TOOLS} + install -m 0755 ${BOOT_STAGING}/mkimage_fit_atf.sh ${DEPLOYDIR}/${BOOT_TOOLS} +} diff --git a/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend new file mode 100644 index 00000000..ea406e5e --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/imx-mkimage/imx-mkimage%.bbappend @@ -0,0 +1,5 @@ +SRCBRANCH = "boundary-imx_4.9.123_imx8mm_ga" +SRC_URI = "git://github.com/boundarydevices/imx-mkimage.git;branch=${SRCBRANCH}" +SRCREV = "${AUTOREV}" +PV = "1.0+git${SRCPV}" + diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config b/bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config new file mode 100644 index 00000000..571e829c --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/u-boot/boundary/fw_env.config @@ -0,0 +1 @@ +/dev/mtd1 0x00000 0x2000 0x1000 2 diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend new file mode 100644 index 00000000..9e62e546 --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-boundary_%.bbappend @@ -0,0 +1,4 @@ +SRCREV = "62132ae8ca90f821ae23bad8a70dfe50e1eaa62c" +SRCBRANCH = "boundary-v2018.07" +PV = "v2018.07+git${SRCPV}" +COMPATIBLE_MACHINE = "(nitrogen6x|nitrogen6x-lite|nitrogen6sx|nitrogen7|nitrogen8m|nitrogen8mm|imx6-acl)" diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend new file mode 100644 index 00000000..9f78d65b --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend @@ -0,0 +1,11 @@ +FILESEXTRAPATHS_prepend_mx6 := "${THISDIR}/boundary:" +FILESEXTRAPATHS_prepend_mx7 := "${THISDIR}/boundary:" + +SRC_URI += "\ + file://fw_env.config \ +" + +do_install_append () { + rm ${D}${sysconfdir}/fw_env.config + install -m 0644 ${WORKDIR}/fw_env.config ${D}${sysconfdir}/fw_env.config +} diff --git a/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend new file mode 100644 index 00000000..62735957 --- /dev/null +++ b/bsp/meta-boundary/recipes-bsp/u-boot/u-boot-script-boundary_%.bbappend @@ -0,0 +1,6 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +LIC_FILES_CHKSUM = "file://Licenses/README;md5=30503fd321432fc713238f582193b78e" +SRCREV = "62132ae8ca90f821ae23bad8a70dfe50e1eaa62c" +SRCBRANCH = "boundary-v2018.07" +PV = "v2018.07+git${SRCPV}" +COMPATIBLE_MACHINE = "(nitrogen6x|nitrogen6x-lite|nitrogen6sx|nitrogen7|nitrogen8m|nitrogen8mm|imx6-acl)" diff --git a/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch new file mode 100644 index 00000000..92ed1f61 --- /dev/null +++ b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5/0001-hciattach-add-QCA9377-Tuffello-support.patch @@ -0,0 +1,2379 @@ +From 97c6fcba2a45533c4a00f85c235fcdccc5e87fb7 Mon Sep 17 00:00:00 2001 +From: Gary Bisson <gary.bisson@boundarydevices.com> +Date: Wed, 17 Aug 2016 11:36:28 +0200 +Subject: [PATCH] hciattach: add QCA9377 Tuffello support + +From CodeAurora repository: +https://source.codeaurora.org/quic/la/platform/external/bluetooth/bluez/ + +Modifications: +- code indentation +- remove verbose traces +- use H4 protocol instead of IBS + +Also squashed: +hciattach_rome: simplify baudrate setting +hciattach_rome: do not override module internal MAC address +hciattach_rome: force IBS to disabled in NVM +hciattach_rome: display ROM and TLV info by default + +Signed-off-by: Gary Bisson <gary.bisson@boundarydevices.com> +--- + Makefile.tools | 1 + + android/Android.mk | 1 + + tools/hciattach.c | 12 + + tools/hciattach.h | 1 + + tools/hciattach_rome.c | 1872 ++++++++++++++++++++++++++++++++++++++++++++++++ + tools/hciattach_rome.h | 388 ++++++++++ + 6 files changed, 2275 insertions(+) + create mode 100644 tools/hciattach_rome.c + create mode 100644 tools/hciattach_rome.h + +diff --git a/Makefile.tools b/Makefile.tools +index 0fd6dec87..984d6d212 100644 +--- a/Makefile.tools ++++ b/Makefile.tools +@@ -281,6 +281,7 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ + tools/hciattach_ti.c \ + tools/hciattach_tialt.c \ + tools/hciattach_ath3k.c \ ++ tools/hciattach_rome.c \ + tools/hciattach_qualcomm.c \ + tools/hciattach_intel.c \ + tools/hciattach_bcm43xx.c +diff --git a/android/Android.mk b/android/Android.mk +index 38ef4aa97..d5045dacd 100644 +--- a/android/Android.mk ++++ b/android/Android.mk +@@ -695,6 +695,7 @@ LOCAL_SRC_FILES := \ + bluez/tools/hciattach_ti.c \ + bluez/tools/hciattach_tialt.c \ + bluez/tools/hciattach_ath3k.c \ ++ bluez/tools/hciattach_rome.c \ + bluez/tools/hciattach_qualcomm.c \ + bluez/tools/hciattach_intel.c \ + bluez/tools/hciattach_bcm43xx.c \ +diff --git a/tools/hciattach.c b/tools/hciattach.c +index fad176c9b..02a65c692 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -263,6 +263,11 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) + return ath3k_post(fd, u->pm); + } + ++static int qca(int fd, struct uart_t *u, struct termios *ti) ++{ ++ return qca_soc_init(fd, u->speed, u->bdaddr); ++} ++ + static int qualcomm(int fd, struct uart_t *u, struct termios *ti) + { + return qualcomm_init(fd, u->speed, ti, u->bdaddr); +@@ -1093,6 +1098,10 @@ struct uart_t uart[] = { + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + ++ /* QCA ROME */ ++ { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, ++ FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, ++ + /* QUALCOMM BTS */ + { "qualcomm", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL }, +@@ -1145,6 +1154,9 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) + if (u->flags & AMP_DEV) + flags |= 1 << HCI_UART_CREATE_AMP; + ++ if (!strncmp(u->type, "qca", 3)) ++ flags |= 1 << HCI_UART_RESET_ON_INIT; ++ + fd = open(dev, O_RDWR | O_NOCTTY); + if (fd < 0) { + perror("Can't open serial port"); +diff --git a/tools/hciattach.h b/tools/hciattach.h +index 249aab49e..85c801ccf 100644 +--- a/tools/hciattach.h ++++ b/tools/hciattach.h +@@ -65,6 +65,7 @@ int bgb2xx_init(int dd, bdaddr_t *bdaddr); + int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, + struct termios *ti); + int ath3k_post(int fd, int pm); ++int qca_soc_init(int fd, int speed, char *bdaddr); + int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); + int intel_init(int fd, int init_speed, int *speed, struct termios *ti); + int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +new file mode 100644 +index 000000000..9a7f222c4 +--- /dev/null ++++ b/tools/hciattach_rome.c +@@ -0,0 +1,1872 @@ ++/* ++ * ++ * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. ++ * Not a Contribution. ++ * ++ * Copyright 2012 The Android Open Source Project ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); you ++ * may not use this file except in compliance with the License. You may ++ * obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * permissions and limitations under the License. ++ * ++ */ ++ ++/****************************************************************************** ++ * ++ * Filename: hciattach_rome.c ++ * ++ * Description: Contains controller-specific functions, like ++ * firmware patch download ++ * low power mode operations ++ * ++ ******************************************************************************/ ++ ++#define MODULE_HAS_MAC_ADDR ++#define LOG_TAG "bt_vendor" ++#include <stdio.h> ++#include <unistd.h> ++#include <sys/socket.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <sys/ioctl.h> ++#include <signal.h> ++#include <time.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <dirent.h> ++#include <ctype.h> ++#include <stdlib.h> ++#include <string.h> ++#include <termios.h> ++#include <bluetooth/bluetooth.h> ++#include "hciattach_rome.h" ++#include "hciattach.h" ++ ++/****************************************************************************** ++ ** Variables ++ ******************************************************************************/ ++FILE *file; ++unsigned char *phdr_buffer; ++unsigned char *pdata_buffer = NULL; ++patch_info rampatch_patch_info; ++int rome_ver = ROME_VER_UNKNOWN; ++unsigned char gTlv_type; ++unsigned char gtlv_dwndcfg; ++char *rampatch_file_path; ++char *nvm_file_path; ++vnd_userial_cb_t vnd_userial; ++unsigned char wait_vsc_evt = TRUE; ++ ++/***************************************************************************** ++ ** Functions ++ *****************************************************************************/ ++ ++/******************************************************************************* ++ ** ++ ** Function userial_to_tcio_baud ++ ** ++ ** Description helper function converts USERIAL baud rates into TCIO ++ ** conforming baud rates ++ ** ++ ** Returns TRUE/FALSE ++ ** ++ *******************************************************************************/ ++unsigned char userial_to_tcio_baud(unsigned char cfg_baud, unsigned int *baud) ++{ ++ if (cfg_baud == USERIAL_BAUD_115200) ++ *baud = B115200; ++ else if (cfg_baud == USERIAL_BAUD_4M) ++ *baud = B4000000; ++ else if (cfg_baud == USERIAL_BAUD_3M) ++ *baud = B3000000; ++ else if (cfg_baud == USERIAL_BAUD_2M) ++ *baud = B2000000; ++ else if (cfg_baud == USERIAL_BAUD_1M) ++ *baud = B1000000; ++ else if (cfg_baud == USERIAL_BAUD_921600) ++ *baud = B921600; ++ else if (cfg_baud == USERIAL_BAUD_460800) ++ *baud = B460800; ++ else if (cfg_baud == USERIAL_BAUD_230400) ++ *baud = B230400; ++ else if (cfg_baud == USERIAL_BAUD_57600) ++ *baud = B57600; ++ else if (cfg_baud == USERIAL_BAUD_19200) ++ *baud = B19200; ++ else if (cfg_baud == USERIAL_BAUD_9600) ++ *baud = B9600; ++ else if (cfg_baud == USERIAL_BAUD_1200) ++ *baud = B1200; ++ else if (cfg_baud == USERIAL_BAUD_600) ++ *baud = B600; ++ else { ++ fprintf(stderr, "userial vendor open: unsupported baud idx %i\n", cfg_baud); ++ *baud = B115200; ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++ ++/******************************************************************************* ++ ** ++ ** Function userial_vendor_set_baud ++ ** ++ ** Description Set new baud rate ++ ** ++ ** Returns None ++ ** ++ *******************************************************************************/ ++void userial_vendor_set_baud(unsigned char userial_baud) ++{ ++ unsigned int tcio_baud; ++ ++ if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) { ++ perror("Can't get port settings"); ++ return; ++ } ++ cfmakeraw(&vnd_userial.termios); ++ vnd_userial.termios.c_cflag |= CLOCAL; ++ vnd_userial.termios.c_cflag |= CREAD; ++ vnd_userial.termios.c_cflag |= CS8; ++ tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); ++ ++ userial_to_tcio_baud(userial_baud, &tcio_baud); ++ ++ cfsetospeed(&vnd_userial.termios, tcio_baud); ++ cfsetispeed(&vnd_userial.termios, tcio_baud); ++ tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */ ++ ++} ++ ++ ++/******************************************************************************* ++ ** ++ ** Function userial_vendor_ioctl ++ ** ++ ** Description ioctl inteface ++ ** ++ ** Returns None ++ ** ++ *******************************************************************************/ ++int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) ++{ ++ int err = -1; ++ struct termios ti; ++ ++ if (tcgetattr(fd, &ti) < 0) { ++ perror("Can't get port settings"); ++ return -1; ++ } ++ cfmakeraw(&ti); ++ ti.c_cflag |= CLOCAL; ++ ti.c_cflag |= CREAD; ++ ti.c_cflag |= CS8; ++ ++ switch(op) { ++#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) ++ case USERIAL_OP_ASSERT_BT_WAKE: ++ VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##"); ++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); ++ break; ++ ++ case USERIAL_OP_DEASSERT_BT_WAKE: ++ VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##"); ++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); ++ break; ++ ++ case USERIAL_OP_GET_BT_WAKE_STATE: ++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data); ++ break; ++#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) ++ case USERIAL_OP_FLOW_ON: ++ ti.c_cflag |= CRTSCTS; ++ if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { ++ perror("Can't set port settings"); ++ return -1; ++ } ++ ++ break; ++ ++ case USERIAL_OP_FLOW_OFF: ++ ti.c_cflag &= ~CRTSCTS; ++ if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { ++ fprintf(stderr, "Can't set port settings"); ++ return -1; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ return err; ++} ++ ++ ++int get_vs_hci_event(unsigned char *rsp) ++{ ++ int err = 0, soc_id =0; ++ unsigned char paramlen = 0; ++ ++ if ( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE)) ++ PR_DBG("%s: Received HCI-Vendor Specific event\n", __FUNCTION__); ++ else { ++ fprintf(stderr, "%s: Failed to receive HCI-Vendor Specific event\n", __FUNCTION__); ++ err = -EIO; ++ goto failed; ++ } ++ ++ /* Check the status of the operation */ ++ switch ( rsp[CMD_RSP_OFFSET] ) { ++ case EDL_CMD_REQ_RES_EVT: ++ switch(rsp[RSP_TYPE_OFFSET]) { ++ case EDL_PATCH_VER_RES_EVT: ++ case EDL_APP_VER_RES_EVT: ++ PR_INFO("Current Product ID\t\t: 0x%08x\n", ++ (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 | ++ rsp[PATCH_PROD_ID_OFFSET+2] << 16 | ++ rsp[PATCH_PROD_ID_OFFSET+1] << 8 | ++ rsp[PATCH_PROD_ID_OFFSET] )); ++ ++ /* Patch Version indicates FW patch version */ ++ PR_INFO("Current Patch Version\t\t: 0x%04x\n", ++ (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 | ++ rsp[PATCH_PATCH_VER_OFFSET] )); ++ ++ /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */ ++ rome_ver = (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 | ++ rsp[PATCH_ROM_BUILD_VER_OFFSET]); ++ PR_INFO("Current ROM Build Version\t: 0x%04x\n", rome_ver); ++ ++ /* In case rome 1.0/1.1, there is no SOC ID version available */ ++ if (paramlen - 10) { ++ soc_id = (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 | ++ rsp[PATCH_SOC_VER_OFFSET+2] << 16 | ++ rsp[PATCH_SOC_VER_OFFSET+1] << 8 | ++ rsp[PATCH_SOC_VER_OFFSET]); ++ PR_INFO("Current SOC Version\t\t: 0x%08x\n", soc_id); ++ } ++ ++ /* Rome Chipset Version can be decided by Patch version and SOC version, ++ Upper 2 bytes will be used for Patch version and Lower 2 bytes will be ++ used for SOC as combination for BT host driver */ ++ rome_ver = (rome_ver << 16) | (soc_id & 0x0000ffff); ++ break; ++ case EDL_TVL_DNLD_RES_EVT: ++ case EDL_CMD_EXE_STATUS_EVT: ++ switch (err = rsp[CMD_STATUS_OFFSET]) { ++ case HCI_CMD_SUCCESS: ++ PR_DBG("%s: Download Packet successfully!\n", __FUNCTION__); ++ break; ++ case PATCH_LEN_ERROR: ++ fprintf(stderr, "%s: Invalid patch length argument passed for EDL PATCH " ++ "SET REQ cmd\n", __FUNCTION__); ++ break; ++ case PATCH_VER_ERROR: ++ fprintf(stderr, "%s: Invalid patch version argument passed for EDL PATCH " ++ "SET REQ cmd\n", __FUNCTION__); ++ break; ++ case PATCH_CRC_ERROR: ++ fprintf(stderr, "%s: CRC check of patch failed!!!\n", __FUNCTION__); ++ break; ++ case PATCH_NOT_FOUND: ++ fprintf(stderr, "%s: Invalid patch data!!!\n", __FUNCTION__); ++ break; ++ case TLV_TYPE_ERROR: ++ fprintf(stderr, "%s: TLV Type Error !!!\n", __FUNCTION__); ++ break; ++ default: ++ fprintf(stderr, "%s: Undefined error (0x%x)", __FUNCTION__, err); ++ break; ++ } ++ break; ++ } ++ break; ++ ++ case NVM_ACCESS_CODE: ++ PR_DBG("%s: NVM Access Code!!!\n", __FUNCTION__); ++ err = HCI_CMD_SUCCESS; ++ break; ++ case EDL_SET_BAUDRATE_RSP_EVT: ++ /* Rome 1.1 has bug with the response, so it should ignore it. */ ++ if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS) { ++ fprintf(stderr, "%s: Set Baudrate request failed - 0x%x\n", __FUNCTION__, ++ rsp[CMD_STATUS_OFFSET]); ++ err = -1; ++ } ++ break; ++ default: ++ fprintf(stderr, "%s: Not a valid status!!!\n", __FUNCTION__); ++ err = -1; ++ break; ++ } ++ ++failed: ++ return err; ++} ++ ++ ++int wait_for_data(int fd, int maxTimeOut) ++{ ++ fd_set infids; ++ struct timeval timeout; ++ ++ if (maxTimeOut <= 0) { ++ fprintf(stderr, "%s: Invalid timeout value specified", __func__); ++ return -EINVAL; ++ } ++ ++ FD_ZERO (&infids); ++ FD_SET (fd, &infids); ++ timeout.tv_sec = maxTimeOut; ++ timeout.tv_usec = 0; ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { ++ fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut); ++ return -1; ++ } ++ ++ return 1; ++} ++ ++/* ++ * Read an VS HCI event from the given file descriptor. ++ */ ++int read_vs_hci_event(int fd, unsigned char* buf, int size) ++{ ++ int remain, r, retry = 0; ++ int count = 0; ++ ++ if (size <= 0) { ++ fprintf(stderr, "Invalid size arguement!\n"); ++ return -1; ++ } ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) ++ return -1; ++ ++ /* The first byte identifies the packet type. For HCI event packets, it ++ * should be 0x04, so we read until we get to the 0x04. */ ++ /* It will keep reading until find 0x04 byte */ ++ while (1) { ++ /* Read UART Buffer for HCI-DATA */ ++ r = read(fd, buf, 1); ++ if (r <= 0) { ++ fprintf(stderr, "%s: read() failed. error: %d\n", ++ __FUNCTION__, r); ++ return -1; ++ } ++ ++ /* Check if received data is HCI-DATA or not. ++ * If not HCI-DATA, then retry reading the UART Buffer once. ++ * Sometimes there could be corruption on the UART lines and to ++ * avoid that retry once reading the UART Buffer for HCI-DATA. ++ */ ++ if (buf[0] == 0x04) { /* Recvd. HCI DATA */ ++ retry = 0; ++ break; ++ } ++ else if (retry < MAX_RETRY_CNT) { /* Retry mechanism */ ++ retry++; ++ fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d", ++ __FUNCTION__, buf[0]); ++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) ++ return -1; ++ else /* Data available in UART Buffer: Continue to read */ ++ continue; ++ } ++ else { /* RETRY failed : Exiting with failure */ ++ fprintf(stderr, "%s: RETRY failed!", __FUNCTION__); ++ return -1; ++ } ++ } ++ count++; ++ ++ /* The next two bytes are the event code and parameter total length. */ ++ while (count < 3) { ++ r = read(fd, buf + count, 3 - count); ++ if ((r <= 0) || (buf[1] != 0xFF )) { ++ fprintf(stderr, "It is not VS event !!\n"); ++ return -1; ++ } ++ count += r; ++ } ++ ++ /* Now we read the parameters. */ ++ if (buf[2] < (size - 3)) ++ remain = buf[2]; ++ else ++ remain = size - 3; ++ ++ while ((count - 3) < remain) { ++ r = read(fd, buf + count, remain - (count - 3)); ++ if (r <= 0) ++ return -1; ++ count += r; ++ } ++ ++ /* Check if the set patch command is successful or not */ ++ if (get_vs_hci_event(buf) != HCI_CMD_SUCCESS) ++ return -1; ++ ++ return count; ++} ++ ++ ++int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) ++{ ++ int ret = 0; ++ ++ /* Send the HCI command packet to UART for transmission */ ++ ret = write(fd, cmd, size); ++ if (ret != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, ret); ++ goto failed; ++ } ++ ++ if (wait_vsc_evt) { ++ /* Check for response from the Controller */ ++ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { ++ ret = -ETIMEDOUT; ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto failed; ++ } ++ } ++ ++failed: ++ return ret; ++} ++ ++void frame_hci_cmd_pkt( ++ unsigned char *cmd, ++ int edl_cmd, unsigned int p_base_addr, ++ int segtNo, int size ++ ) ++{ ++ int offset = 0; ++ hci_command_hdr *cmd_hdr; ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ ++ cmd[0] = HCI_COMMAND_PKT; ++ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_PATCH_CMD_OCF); ++ cmd_hdr->plen = size; ++ cmd[4] = edl_cmd; ++ ++ switch (edl_cmd) { ++ case EDL_PATCH_SET_REQ_CMD: ++ /* Copy the patch header info as CMD params */ ++ memcpy(&cmd[5], phdr_buffer, PATCH_HDR_LEN); ++ PR_DBG("%s: Sending EDL_PATCH_SET_REQ_CMD\n", __FUNCTION__); ++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_DLD_REQ_CMD: ++ offset = ((segtNo - 1) * MAX_DATA_PER_SEGMENT); ++ p_base_addr += offset; ++ cmd_hdr->plen = (size + 6); ++ cmd[5] = (size + 4); ++ cmd[6] = EXTRACT_BYTE(p_base_addr, 0); ++ cmd[7] = EXTRACT_BYTE(p_base_addr, 1); ++ cmd[8] = EXTRACT_BYTE(p_base_addr, 2); ++ cmd[9] = EXTRACT_BYTE(p_base_addr, 3); ++ memcpy(&cmd[10], (pdata_buffer + offset), size); ++ ++ PR_DBG("%s: Sending EDL_PATCH_DLD_REQ_CMD: size: %d bytes\n", ++ __FUNCTION__, size); ++ PR_DBG("HCI-CMD %d:\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t" ++ "0x%x\t0x%x\t0x%x\t\n", segtNo, cmd[0], cmd[1], cmd[2], ++ cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]); ++ break; ++ case EDL_PATCH_ATCH_REQ_CMD: ++ PR_DBG("%s: Sending EDL_PATCH_ATTACH_REQ_CMD\n", __FUNCTION__); ++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_RST_REQ_CMD: ++ PR_DBG("%s: Sending EDL_PATCH_RESET_REQ_CMD\n", __FUNCTION__); ++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_VER_REQ_CMD: ++ PR_DBG("%s: Sending EDL_PATCH_VER_REQ_CMD\n", __FUNCTION__); ++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_TLV_REQ_CMD: ++ PR_DBG("%s: Sending EDL_PATCH_TLV_REQ_CMD\n", __FUNCTION__); ++ /* Parameter Total Length */ ++ cmd[3] = size +2; ++ ++ /* TLV Segment Length */ ++ cmd[5] = size; ++ PR_DBG("HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); ++ offset = (segtNo * MAX_SIZE_PER_TLV_SEGMENT); ++ memcpy(&cmd[6], (pdata_buffer + offset), size); ++ break; ++ default: ++ fprintf(stderr, "%s: Unknown EDL CMD !!!\n", __FUNCTION__); ++ } ++} ++ ++void rome_extract_patch_header_info(unsigned char *buf) ++{ ++ int index; ++ ++ /* Extract patch id */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_id |= ++ (LSH(buf[index + P_ID_OFFSET], (index * 8))); ++ ++ /* Extract (ROM and BUILD) version information */ ++ for (index = 0; index < 2; index++) ++ rampatch_patch_info.patch_ver.rom_version |= ++ (LSH(buf[index + P_ROME_VER_OFFSET], (index * 8))); ++ ++ for (index = 0; index < 2; index++) ++ rampatch_patch_info.patch_ver.build_version |= ++ (LSH(buf[index + P_BUILD_VER_OFFSET], (index * 8))); ++ ++ /* Extract patch base and entry addresses */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_base_addr |= ++ (LSH(buf[index + P_BASE_ADDR_OFFSET], (index * 8))); ++ ++ /* Patch BASE & ENTRY addresses are same */ ++ rampatch_patch_info.patch_entry_addr = rampatch_patch_info.patch_base_addr; ++ ++ /* Extract total length of the patch payload */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_length |= ++ (LSH(buf[index + P_LEN_OFFSET], (index * 8))); ++ ++ /* Extract the CRC checksum of the patch payload */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_crc |= ++ (LSH(buf[index + P_CRC_OFFSET], (index * 8))); ++ ++ /* Extract patch control value */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_ctrl |= ++ (LSH(buf[index + P_CONTROL_OFFSET], (index * 8))); ++ ++ fprintf(stderr, "PATCH_ID\t : 0x%x\n", rampatch_patch_info.patch_id); ++ fprintf(stderr, "ROM_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.rom_version); ++ fprintf(stderr, "BUILD_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.build_version); ++ fprintf(stderr, "PATCH_LENGTH\t : 0x%x\n", rampatch_patch_info.patch_length); ++ fprintf(stderr, "PATCH_CRC\t : 0x%x\n", rampatch_patch_info.patch_crc); ++ fprintf(stderr, "PATCH_CONTROL\t : 0x%x\n", rampatch_patch_info.patch_ctrl); ++ fprintf(stderr, "PATCH_BASE_ADDR\t : 0x%x\n", rampatch_patch_info.patch_base_addr); ++ ++} ++ ++int rome_edl_set_patch_request(int fd) ++{ ++ int size, err; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_SET_REQ_CMD, 0, ++ -1, PATCH_HDR_LEN + 1); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to set the patch info to the Controller!\n"); ++ goto error; ++ } ++ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++error: ++ return err; ++} ++ ++int rome_edl_patch_download_request(int fd) ++{ ++ int no_of_patch_segment; ++ int index = 1, err = 0, size = 0; ++ unsigned int p_base_addr; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ no_of_patch_segment = (rampatch_patch_info.patch_length / ++ MAX_DATA_PER_SEGMENT); ++ ++ /* Initialize the patch base address from the one read from bin file */ ++ p_base_addr = rampatch_patch_info.patch_base_addr; ++ ++ /* ++ * Depending upon size of the patch payload, download the patches in ++ * segments with a max. size of 239 bytes ++ */ ++ for (index = 1; index <= no_of_patch_segment; index++) { ++ /* Frame the HCI CMD PKT to be sent to Controller*/ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, ++ index, MAX_DATA_PER_SEGMENT); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Initialize the RSP packet everytime to 0 */ ++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", ++ __FUNCTION__, index); ++ goto error; ++ } ++ } ++ ++ /* Check if any pending patch data to be sent */ ++ size = (rampatch_patch_info.patch_length < MAX_DATA_PER_SEGMENT) ? ++ rampatch_patch_info.patch_length : ++ (rampatch_patch_info.patch_length % MAX_DATA_PER_SEGMENT); ++ ++ if (size) { ++ /* Frame the HCI CMD PKT to be sent to Controller*/ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, index, size); ++ ++ /* Initialize the RSP packet everytime to 0 */ ++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", ++ __FUNCTION__, index); ++ goto error; ++ } ++ } ++ ++error: ++ return err; ++} ++ ++static int rome_download_rampatch(int fd) ++{ ++ int c, size, index, ret = -1; ++ ++ /* Get handle to the RAMPATCH binary file */ ++ fprintf(stderr, "%s: Getting handle to the RAMPATCH binary file from %s\n", __FUNCTION__, ROME_FW_PATH); ++ file = fopen(ROME_FW_PATH, "r"); ++ if (file == NULL) { ++ fprintf(stderr, "%s: Failed to get handle to the RAMPATCH bin file!\n", ++ __FUNCTION__); ++ return -ENFILE; ++ } ++ ++ /* Allocate memory for the patch headder info */ ++ fprintf(stderr, "%s: Allocating memory for the patch header\n", __FUNCTION__); ++ phdr_buffer = (unsigned char *) malloc(PATCH_HDR_LEN + 1); ++ if (phdr_buffer == NULL) { ++ fprintf(stderr, "%s: Failed to allocate memory for patch header\n", ++ __FUNCTION__); ++ goto phdr_alloc_failed; ++ } ++ for (index = 0; index < PATCH_HDR_LEN + 1; index++) ++ phdr_buffer[index] = 0x0; ++ ++ /* Read 28 bytes of patch header information */ ++ fprintf(stderr, "%s: Reading patch header info\n", __FUNCTION__); ++ index = 0; ++ do { ++ c = fgetc (file); ++ phdr_buffer[index++] = (unsigned char)c; ++ } while (index != PATCH_HDR_LEN); ++ ++ /* Save the patch header info into local structure */ ++ fprintf(stderr, "%s: Saving patch hdr. info\n", __FUNCTION__); ++ rome_extract_patch_header_info((unsigned char *)phdr_buffer); ++ ++ /* Set the patch header info onto the Controller */ ++ ret = rome_edl_set_patch_request(fd); ++ if (ret < 0) { ++ fprintf(stderr, "%s: Error setting the patchheader info!\n", __FUNCTION__); ++ goto pdata_alloc_failed; ++ } ++ ++ /* Allocate memory for the patch payload */ ++ fprintf(stderr, "%s: Allocating memory for patch payload\n", __FUNCTION__); ++ size = rampatch_patch_info.patch_length; ++ pdata_buffer = (unsigned char *) malloc(size+1); ++ if (pdata_buffer == NULL) { ++ fprintf(stderr, "%s: Failed to allocate memory for patch payload\n", ++ __FUNCTION__); ++ goto pdata_alloc_failed; ++ } ++ for (index = 0; index < size+1; index++) ++ pdata_buffer[index] = 0x0; ++ ++ /* Read the patch data from Rampatch binary image */ ++ fprintf(stderr, "%s: Reading patch payload from RAMPATCH file\n", __FUNCTION__); ++ index = 0; ++ do { ++ c = fgetc (file); ++ pdata_buffer[index++] = (unsigned char)c; ++ } while (c != EOF); ++ ++ /* Downloading patches in segments to controller */ ++ ret = rome_edl_patch_download_request(fd); ++ if (ret < 0) { ++ fprintf(stderr, "%s: Error downloading patch segments!\n", __FUNCTION__); ++ goto cleanup; ++ } ++cleanup: ++ free(pdata_buffer); ++pdata_alloc_failed: ++ free(phdr_buffer); ++phdr_alloc_failed: ++ fclose(file); ++ ++ return ret; ++} ++ ++int rome_attach_rampatch(int fd) ++{ ++ int size, err; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_ATCH_REQ_CMD, 0, ++ -1, EDL_PATCH_CMD_LEN); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to attach the patch segment(s)\n", __FUNCTION__); ++ goto error; ++ } ++error: ++ return err; ++} ++ ++int rome_rampatch_reset(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ struct timespec tm = { 0, 100*1000*1000 }; /* 100 ms */ ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_RST_REQ_CMD, 0, ++ -1, EDL_PATCH_CMD_LEN); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ ++ /* Send HCI Command packet to Controller */ ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ /* ++ * Controller doesn't sends any response for the patch reset ++ * command. HOST has to wait for 100ms before proceeding. ++ */ ++ nanosleep(&tm, NULL); ++ ++error: ++ return err; ++} ++ ++int get_value_from_config(char *file_path,char *param) ++{ ++ FILE *pfile = NULL; ++ char *line = NULL; ++ char *pch = NULL; ++ char param_str[20]; ++ int bytes_read = 0, position; ++ int ret = -1; ++ ++ if (!file_path || !param) { ++ fprintf(stderr,"Invalid arguments\n"); ++ return -EINVAL; ++ } ++ ++ pfile = fopen(file_path, "r" ); ++ if (!pfile) { ++ fprintf(stderr, "Failed to open %s\n", file_path); ++ return ret; ++ } ++ ++ while (getline(&line, &bytes_read, pfile) > 0 ) { ++ if (line[0] != '#' && line[0] != '\n') { ++ pch = memchr(line, '=', strlen(line)); ++ if (pch != NULL) { ++ position = pch - line; ++ strncpy(param_str, line, position); ++ if (strncmp(param_str, param, position) == 0) { ++ ret = atoi(pch + 1); ++ break; ++ } ++ } ++ } ++ } ++ free(line); ++ fclose(pfile); ++ return ret; ++} ++ ++int read_bd_address(unsigned char *bdaddr) ++{ ++ int fd = -1; ++ int readPtr = 0; ++ unsigned char data[BD_ADDR_LEN]; ++ ++ /* Open the persist file for reading device address*/ ++ fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY); ++ if (fd < 0) { ++ fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__); ++ return -1; ++ } ++ ++ /* Read the NVM Header : fp will be advanced by readPtr number of bytes */ ++ readPtr = read(fd, data, PERSIST_HEADER_LEN); ++ if (readPtr > 0) ++ fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__, ++ data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]); ++ else { ++ fprintf(stderr, "%s: Read from persist memory failed : Programming default" ++ " BD ADDR\n"); ++ close(fd); ++ return -1; ++ } ++ ++ /* Check for BD ADDR length before programming */ ++ if (data[NVITEM_SIZE] != BD_ADDR_LEN) { ++ fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n"); ++ close(fd); ++ return -1; ++ } ++ ++ /* Read the BD ADDR info */ ++ readPtr = read(fd, data, BD_ADDR_LEN); ++ if (readPtr > 0) ++ fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0], ++ data[1], data[2], data[3], data[4], data[5]); ++ else { ++ fprintf(stderr, "%s: Read from persist memory failed : Programming default" ++ " BD ADDR\n"); ++ close(fd); ++ return -1; ++ } ++ memcpy(bdaddr, data, BD_ADDR_LEN); ++ close(fd); ++ return 0; ++} ++ ++int isSpeedValid(int speed, unsigned char *baud_rate) ++{ ++ switch(speed) { ++ case 9600: ++ *baud_rate = BAUDRATE_9600; ++ break; ++ case 19200: ++ *baud_rate = BAUDRATE_19200; ++ break; ++ case 57600: ++ *baud_rate = BAUDRATE_57600; ++ break; ++ case 115200: ++ *baud_rate = BAUDRATE_115200; ++ break; ++ case 230400: ++ *baud_rate = BAUDRATE_230400; ++ break; ++ case 460800: ++ *baud_rate = BAUDRATE_460800; ++ break; ++ case 921600: ++ *baud_rate = BAUDRATE_921600; ++ break; ++ case 1000000: ++ *baud_rate = BAUDRATE_1000000; ++ break; ++ case 2000000: ++ *baud_rate = BAUDRATE_2000000; ++ break; ++ case 3000000: ++ *baud_rate = BAUDRATE_3000000; ++ break; ++ case 4000000: ++ *baud_rate = BAUDRATE_4000000; ++ break; ++ case 300: ++ case 600: ++ case 1200: ++ case 2400: ++ default: ++ fprintf(stderr, "Invalid baudrate, default to 115200!\n"); ++ *baud_rate = BAUDRATE_115200; ++ break; ++ } ++ return -1; ++} ++ ++int rome_get_tlv_file(char *file_path, unsigned char baud_rate) ++{ ++ FILE * pFile; ++ long fileSize; ++ int readSize, nvm_length, nvm_index, i; ++ unsigned short nvm_tag_len; ++ tlv_patch_info *ptlv_header; ++ tlv_nvm_hdr *nvm_ptr; ++ unsigned char data_buf[PRINT_BUF_SIZE]={0,}; ++ unsigned char *nvm_byte_ptr; ++ unsigned char bdaddr[6]; ++ unsigned short pcm_value, ibs_value; ++ unsigned short deep_sleep_value; ++ ++ pFile = fopen ( file_path , "r" ); ++ if (pFile==NULL) { ++ fprintf(stderr, "%s File Open Fail\n", file_path); ++ return -1; ++ } ++ ++ /* Get File Size */ ++ fseek (pFile , 0 , SEEK_END); ++ ++ if ((fileSize = ftell(pFile)) < 0) { ++ fprintf(stderr, "%s: fail to get current file position\n", file_path); ++ fclose(pFile); ++ return -1; ++ } ++ ++ if (fileSize == 0) { ++ fprintf(stderr, "%s: no content in the file\n", file_path); ++ fclose(pFile); ++ return -1; ++ } ++ ++ rewind (pFile); ++ ++ pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); ++ if (pdata_buffer == NULL) { ++ fprintf(stderr, "Allocated Memory failed\n"); ++ fclose (pFile); ++ return -1; ++ } ++ ++ /* Copy file into allocated buffer */ ++ readSize = fread (pdata_buffer,1,fileSize,pFile); ++ ++ /* File Close */ ++ fclose (pFile); ++ ++ if (readSize != fileSize) { ++ fprintf(stderr, "Read file size(%d) not matched with actual file size (%ld bytes)\n",readSize,fileSize); ++ return -1; ++ } ++ ++ ptlv_header = (tlv_patch_info *) pdata_buffer; ++ ++ /* To handle different event between rampatch and NVM */ ++ gTlv_type = ptlv_header->tlv_type; ++ gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg; ++ ++ if (ptlv_header->tlv_type == TLV_TYPE_PATCH) { ++ PR_INFO("====================================================\n"); ++ PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type); ++ PR_INFO("Length : %d bytes\n", (ptlv_header->tlv_length1) | ++ (ptlv_header->tlv_length2 << 8) | ++ (ptlv_header->tlv_length3 << 16)); ++ PR_INFO("Total Length : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len); ++ PR_INFO("Patch Data Length : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); ++ PR_INFO("Signing Format Version : 0x%x\n", ptlv_header->tlv.patch.sign_ver); ++ PR_INFO("Signature Algorithm : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); ++ PR_INFO("Event Handling : 0x%x\n", ptlv_header->tlv.patch.dwnd_cfg); ++ PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved1); ++ PR_INFO("Product ID : 0x%04x\n", ptlv_header->tlv.patch.prod_id); ++ PR_INFO("Rom Build Version : 0x%04x\n", ptlv_header->tlv.patch.build_ver); ++ PR_INFO("Patch Version : 0x%04x\n", ptlv_header->tlv.patch.patch_ver); ++ PR_INFO("Reserved : 0x%x\n", ptlv_header->tlv.patch.reserved2); ++ PR_INFO("Patch Entry Address : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr)); ++ PR_INFO("====================================================\n"); ++ ++ } else if (ptlv_header->tlv_type == TLV_TYPE_NVM) { ++ PR_INFO("====================================================\n"); ++ PR_INFO("TLV Type : 0x%x\n", ptlv_header->tlv_type); ++ PR_INFO("Length : %d bytes\n", nvm_length = ++ (ptlv_header->tlv_length1) | ++ (ptlv_header->tlv_length2 << 8) | ++ (ptlv_header->tlv_length3 << 16)); ++ ++ if (nvm_length <= 0) ++ return readSize; ++ ++ for(nvm_byte_ptr=(unsigned char *)(nvm_ptr = &(ptlv_header->tlv.nvm)), nvm_index=0; ++ nvm_index < nvm_length ; nvm_ptr = (tlv_nvm_hdr *) nvm_byte_ptr) { ++ PR_DBG("TAG ID\t\t\t : %d\n", nvm_ptr->tag_id); ++ PR_DBG("TAG Length\t\t\t : %d\n", nvm_tag_len = nvm_ptr->tag_len); ++ PR_DBG("TAG Pointer\t\t\t : %d\n", nvm_ptr->tag_ptr); ++ PR_DBG("TAG Extended Flag\t\t : %d\n", nvm_ptr->tag_ex_flag); ++ ++ /* Increase nvm_index to NVM data */ ++ nvm_index+=sizeof(tlv_nvm_hdr); ++ nvm_byte_ptr+=sizeof(tlv_nvm_hdr); ++ ++#ifndef MODULE_HAS_MAC_ADDR ++ /* Write BD Address */ ++ if (nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(bdaddr) == 0) { ++ memcpy(nvm_byte_ptr, bdaddr, 6); ++ PR_INFO("Overriding default BD ADDR with user" ++ " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), ++ *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); ++ } ++#else ++ /* Remove it from NVM data */ ++ if (nvm_ptr->tag_id == TAG_NUM_2) { ++ int nvm_size = nvm_ptr->tag_len + sizeof(tlv_nvm_hdr); ++ PR_INFO("Skip BD Address from NVM\n"); ++ nvm_index += nvm_ptr->tag_len; ++ nvm_byte_ptr += nvm_ptr->tag_len; ++ memmove(nvm_ptr, nvm_byte_ptr, nvm_length - nvm_index); ++ nvm_length -= nvm_size; ++ nvm_byte_ptr -= nvm_size; ++ readSize -= nvm_size; ++ nvm_index -= nvm_size; ++ continue; ++ } ++#endif ++ ++ if (nvm_ptr->tag_id == TAG_NUM_17) { ++ PR_DBG("Forcing IBS to be disabled\n"); ++ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &= ++ (~(FWCONF_IBS_ENABLE << FWCONF_IBS_VAL_BIT)); ++ if (baud_rate != nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET]) { ++ PR_INFO("Change Vendor Baud from 0x%02x to 0x%02x\n", ++ nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET], baud_rate); ++ nvm_byte_ptr[FWCONF_BAUD_VAL_OFFSET] = baud_rate; ++ } ++ } ++ ++ if (nvm_ptr->tag_id == TAG_NUM_27) { ++ if ((deep_sleep_value = ++ get_value_from_config(FW_CONFIG_FILE_PATH, "DEEP_SLEEP")) >= 0) { ++ if (deep_sleep_value == FWCONF_DEEP_SLEEP_DISABLE) { ++ nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] &= ++ (~(1 << FWCONF_DEEP_SLEEP_BIT_OFFSET)); ++ } else if (deep_sleep_value == FWCONF_DEEP_SLEEP_ENABLE) { ++ nvm_byte_ptr[FWCONF_DEEP_SLEEP_BYTE_OFFSET] |= ++ (1 << FWCONF_DEEP_SLEEP_BIT_OFFSET); ++ } else { ++ fprintf(stderr, "Ignoring invalid deep sleep config value\n"); ++ } ++ } ++ } ++ ++ /* Read from file and check what PCM Configuration is required: ++ * Master = 0 /Slave = 1 */ ++ /* Override PCM configuration */ ++ if (nvm_ptr->tag_id == TAG_NUM_44) { ++ if ((pcm_value = ++ get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) { ++ ++ if (pcm_value == FWCONF_PCM_SLAVE) { ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |= ++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |= ++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); ++ } else if (pcm_value == FWCONF_PCM_MASTER) { ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &= ++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &= ++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); ++ } ++ } ++ } ++ ++ for(i =0;(i<nvm_ptr->tag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++) ++ snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", ++ (char *)data_buf, *(nvm_byte_ptr + i)); ++ ++ PR_DBG("TAG Data\t\t\t : %s\n", data_buf); ++ ++ /* Clear buffer */ ++ memset(data_buf, 0x0, PRINT_BUF_SIZE); ++ ++ /* increased by tag_len */ ++ nvm_index+=nvm_ptr->tag_len; ++ nvm_byte_ptr +=nvm_ptr->tag_len; ++ } ++ ++ PR_INFO("====================================================\n"); ++ ++ } else { ++ fprintf(stderr, "TLV Header type is unknown (%d) \n", ptlv_header->tlv_type); ++ } ++ ++ return readSize; ++} ++ ++int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc_evt) ++{ ++ int size=0, err = -1; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD PKT to be sent to Controller*/ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Initialize the RSP packet everytime to 0 */ ++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to send the patch payload to the Controller! 0x%x\n", err); ++ return err; ++ } ++ ++ if (wait_cc_evt) { ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", __FUNCTION__, index); ++ return err; ++ } ++ } ++ ++ return err; ++} ++ ++int rome_tlv_dnld_req(int fd, int tlv_size) ++{ ++ int total_segment, remain_size, i, err = -1; ++ unsigned char wait_cc_evt = FALSE; ++ unsigned int rom = rome_ver >> 16; ++ ++ total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; ++ remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ ++ tlv_size: (tlv_size%MAX_SIZE_PER_TLV_SEGMENT); ++ ++ if (gTlv_type == TLV_TYPE_PATCH) { ++ /* Prior to Rome version 3.2(including inital few rampatch release of ++ * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After ++ * few release of rampatch for Rome 3.2, the mechamism is changed to ++ * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now ++ */ ++ switch (gtlv_dwndcfg) ++ { ++ case ROME_SKIP_EVT_NONE: ++ wait_vsc_evt = TRUE; ++ wait_cc_evt = TRUE; ++ PR_DBG("%s: Event handling type: ROME_SKIP_EVT_NONE", __func__); ++ break; ++ case ROME_SKIP_EVT_VSE_CC: ++ wait_vsc_evt = FALSE; ++ wait_cc_evt = FALSE; ++ PR_DBG("%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__); ++ break; ++ /* Not handled for now */ ++ case ROME_SKIP_EVT_VSE: ++ case ROME_SKIP_EVT_CC: ++ default: ++ fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg); ++ break; ++ } ++ } else { ++ wait_vsc_evt = TRUE; ++ wait_cc_evt = TRUE; ++ } ++ ++ for(i = 0; i < total_segment; i++) { ++ if ((i+1) == total_segment) { ++ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && ++ (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is from 1.1 to 3.1 ++ * 1. No CCE for the last command segment but all other segment ++ * 2. All the command segments get VSE including the last one ++ */ ++ wait_cc_evt = !remain_size ? FALSE: TRUE; ++ } else if ((rom == ROME_PATCH_VER_0302) && ++ (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is 3.2 ++ * 1. None of the command segments receive CCE ++ * 2. No command segments receive VSE except the last one ++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is ++ * same as Rome 2.1, 2.2, 3.0 ++ */ ++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { ++ wait_cc_evt = !remain_size ? FALSE: TRUE; ++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { ++ wait_vsc_evt = !remain_size ? TRUE: FALSE; ++ } ++ } ++ } ++ ++ if ((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) ++ goto error; ++ } ++ ++ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && ++ (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is from 1.1 to 3.1 ++ * 1. No CCE for the last command segment but all other segment ++ * 2. All the command segments get VSE including the last one ++ */ ++ wait_cc_evt = remain_size ? FALSE: TRUE; ++ } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is 3.2 ++ * 1. None of the command segments receive CCE ++ * 2. No command segments receive VSE except the last one ++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is ++ * same as Rome 2.1, 2.2, 3.0 ++ */ ++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { ++ wait_cc_evt = remain_size ? FALSE: TRUE; ++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { ++ wait_vsc_evt = remain_size ? TRUE: FALSE; ++ } ++ } ++ ++ if (remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); ++ ++error: ++ return err; ++} ++ ++int rome_download_tlv_file(int fd, unsigned char baud_rate) ++{ ++ int tlv_size, err = -1; ++ ++ /* Rampatch TLV file Downloading */ ++ pdata_buffer = NULL; ++ ++ if ((tlv_size = rome_get_tlv_file(rampatch_file_path, baud_rate)) < 0) ++ goto error; ++ ++ if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0) ++ goto error; ++ ++ if (pdata_buffer != NULL) { ++ free (pdata_buffer); ++ pdata_buffer = NULL; ++ } ++ ++ /* NVM TLV file Downloading */ ++ if ((tlv_size = rome_get_tlv_file(nvm_file_path, baud_rate)) < 0) ++ goto error; ++ ++ if ((err = rome_tlv_dnld_req(fd, tlv_size)) < 0) ++ goto error; ++ ++error: ++ if (pdata_buffer != NULL) ++ free (pdata_buffer); ++ ++ return err; ++} ++ ++int rome_1_0_nvm_tag_dnld(int fd) ++{ ++ int i, size, err = 0; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++#if (NVM_VERSION >= ROME_1_0_100019) ++ unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = ++ { ++ /* Tag 2 */ /* BD Address */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 9, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 2, ++ /* Tag Len */ 6, ++ /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 ++ }, ++ /* Tag 6 */ /* Bluetooth Support Features */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 6, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B ++ }, ++ /* Tag 17 */ /* HCI Transport Layer Setting */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 17, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 ++ }, ++ /* Tag 35 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 58, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 35, ++ /* Tag Len */ 55, ++ /* Tag Value */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x58, 0x59, ++ 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, ++ 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, ++ 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, ++ 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, ++ 0x1B, 0x14, 0x01, 0x04, 0x48 ++ }, ++ /* Tag 36 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 15, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 36, ++ /* Tag Len */ 12, ++ /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 ++ }, ++ /* Tag 39 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 7, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 39, ++ /* Tag Len */ 4, ++ /* Tag Value */ 0x12,0x00,0x00,0x00 ++ }, ++ /* Tag 41 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 91, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 41, ++ /* Tag Len */ 88, ++ /* Tag Value */ 0x15, 0x00, 0x00, 0x00, 0xF6, 0x02, 0x00, 0x00, 0x76, 0x00, ++ 0x1E, 0x00, 0x29, 0x02, 0x1F, 0x00, 0x61, 0x00, 0x1A, 0x00, ++ 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x91, 0x00, ++ 0x06, 0x00, 0x92, 0x00, 0x03, 0x00, 0xA6, 0x01, 0x50, 0x00, ++ 0xAA, 0x01, 0x15, 0x00, 0xAB, 0x01, 0x0A, 0x00, 0xAC, 0x01, ++ 0x00, 0x00, 0xB0, 0x01, 0xC5, 0x00, 0xB3, 0x01, 0x03, 0x00, ++ 0xB4, 0x01, 0x13, 0x00, 0xB5, 0x01, 0x0C, 0x00, 0xC5, 0x01, ++ 0x0D, 0x00, 0xC6, 0x01, 0x10, 0x00, 0xCA, 0x01, 0x2B, 0x00, ++ 0xCB, 0x01, 0x5F, 0x00, 0xCC, 0x01, 0x48, 0x00 ++ }, ++ /* Tag 42 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 63, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 42, ++ /* Tag Len */ 60, ++ /* Tag Value */ 0xD7, 0xC0, 0x00, 0x00, 0x8F, 0x5C, 0x02, 0x00, 0x80, 0x47, ++ 0x60, 0x0C, 0x70, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, ++ 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xC7, 0x01, 0xFE, 0x01, ++ 0x3D, 0x02, 0x83, 0x02, 0xD1, 0x02, 0x29, 0x03, 0x00, 0x0A, ++ 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFD, 0x00, ++ 0xF9, 0x01, 0xF1, 0x03, 0xDE, 0x07, 0x00, 0x00, 0x9A, 0x01 ++ }, ++ /* Tag 84 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 153, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 84, ++ /* Tag Len */ 150, ++ /* Tag Value */ 0x7C, 0x6A, 0x59, 0x47, 0x19, 0x36, 0x35, 0x25, 0x25, 0x28, ++ 0x2C, 0x2B, 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x28, 0x29, 0x28, ++ 0x29, 0x29, 0x2C, 0x29, 0x2C, 0x29, 0x2C, 0x28, 0x29, 0x28, ++ 0x29, 0x28, 0x29, 0x2A, 0x00, 0x00, 0x2C, 0x2A, 0x2C, 0x18, ++ 0x98, 0x98, 0x98, 0x98, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, ++ 0x1E, 0x13, 0x1E, 0x1E, 0x1E, 0x1E, 0x13, 0x13, 0x11, 0x13, ++ 0x1E, 0x1E, 0x13, 0x12, 0x12, 0x12, 0x11, 0x12, 0x1F, 0x12, ++ 0x12, 0x12, 0x10, 0x0C, 0x18, 0x0D, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, ++ 0x0E, 0x0D, 0x01, 0x01, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0D, ++ 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x05, 0x10, 0x03, 0x00, ++ 0x7E, 0x7B, 0x7B, 0x72, 0x71, 0x50, 0x50, 0x50, 0x00, 0x40, ++ 0x60, 0x60, 0x30, 0x08, 0x02, 0x0F, 0x00, 0x01, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x16, 0x16, 0x08, 0x08, 0x00, ++ 0x00, 0x00, 0x1E, 0x34, 0x2B, 0x1B, 0x23, 0x2B, 0x15, 0x0D ++ }, ++ /* Tag 85 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 119, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 85, ++ /* Tag Len */ 116, ++ /* Tag Value */ 0x03, 0x00, 0x38, 0x00, 0x45, 0x77, 0x00, 0xE8, 0x00, 0x59, ++ 0x01, 0xCA, 0x01, 0x3B, 0x02, 0xAC, 0x02, 0x1D, 0x03, 0x8E, ++ 0x03, 0x00, 0x89, 0x01, 0x0E, 0x02, 0x5C, 0x02, 0xD7, 0x02, ++ 0xF8, 0x08, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x02, 0x55, 0x02, ++ 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0x00, 0x00, ++ 0x00, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0x14, 0x0F, 0x0A, 0x0F, ++ 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x0C, 0x0C, ++ 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, ++ 0x06, 0x0F, 0x14, 0x05, 0x47, 0xCF, 0x77, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0xAC, 0x7C, 0xFF, 0x40, 0x00, 0x00, 0x00, ++ 0x12, 0x04, 0x04, 0x01, 0x04, 0x03 ++ }, ++ {TAG_END} ++ }; ++#elif (NVM_VERSION == ROME_1_0_6002) ++ unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = ++ { ++ /* Tag 2 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 9, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 2, ++ /* Tag Len */ 6, ++ /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 /* BD Address */ ++ }, ++ /* Tag 6 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 6, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B ++ }, ++ /* Tag 17 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 17, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 ++ }, ++ /* Tag 36 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 15, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 36, ++ /* Tag Len */ 12, ++ /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 ++ }, ++ ++ /* Tag 39 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 7, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 39, ++ /* Tag Len */ 4, ++ /* Tag Value */ 0x12,0x00,0x00,0x00 ++ }, ++ ++ /* Tag 41 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 199, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 41, ++ /* Tag Len */ 196, ++ /* Tag Value */ 0x30,0x00,0x00,0x00,0xD5,0x00,0x0E,0x00,0xD6,0x00,0x0E,0x00, ++ 0xD7,0x00,0x16,0x00,0xD8,0x00,0x16,0x00,0xD9,0x00,0x16,0x00, ++ 0xDA,0x00,0x1E,0x00,0xDB,0x00,0x26,0x00,0xDC,0x00,0x5F,0x00, ++ 0xDD,0x00,0x2F,0x00,0xDE,0x00,0x5F,0x00,0xE0,0x00,0x0E,0x00, ++ 0xE1,0x00,0x0E,0x00,0xE2,0x00,0x16,0x00,0xE3,0x00,0x16,0x00, ++ 0xE4,0x00,0x16,0x00,0xE5,0x00,0x1E,0x00,0xE6,0x00,0x26,0x00, ++ 0xE7,0x00,0x5F,0x00,0xE8,0x00,0x2F,0x00,0xE9,0x00,0x5F,0x00, ++ 0xEC,0x00,0x0C,0x00,0xED,0x00,0x08,0x00,0xEE,0x00,0x14,0x00, ++ 0xEF,0x00,0x24,0x00,0xF0,0x00,0x40,0x00,0xF1,0x00,0x4C,0x00, ++ 0xF2,0x00,0x70,0x00,0xF3,0x00,0x80,0x00,0xF4,0x00,0x80,0x00, ++ 0xF5,0x00,0x80,0x00,0xF8,0x00,0x0C,0x00,0xF9,0x00,0x18,0x00, ++ 0xFA,0x00,0x14,0x00,0xFB,0x00,0x24,0x00,0xFC,0x00,0x40,0x00, ++ 0xFD,0x00,0x4C,0x00,0xFE,0x00,0x70,0x00,0xFF,0x00,0x80,0x00, ++ 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x00,0x04,0x01,0x1B,0x00, ++ 0x05,0x01,0x14,0x00,0x06,0x01,0x01,0x00,0x07,0x01,0x04,0x00, ++ 0x08,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x0A,0x01,0x03,0x00, ++ 0x0B,0x01,0x03,0x00 ++ }, ++ ++ /* Tag 44 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 44, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 44, ++ /* Tag Len */ 41, ++ /* Tag Value */ 0x6F,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x10,0x02,0x02, ++ 0x01,0x00,0x14,0x01,0x06,0x28,0xA0,0x62,0x03,0x64,0x01,0x01, ++ 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xFF,0x10,0x02,0x01, ++ 0x00,0x14,0x01,0x02,0x03 ++ }, ++ {TAG_END} ++ }; ++#endif ++ ++ for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++) { ++ /* Write BD Address */ ++ if (cmds[i][TAG_NUM_OFFSET] == TAG_NUM_2){ ++ memcpy(&cmds[i][TAG_BDADDR_OFFSET], vnd_local_bd_addr, 6); ++ fprintf(stderr, "BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", ++ cmds[i][TAG_BDADDR_OFFSET ], cmds[i][TAG_BDADDR_OFFSET + 1], ++ cmds[i][TAG_BDADDR_OFFSET + 2], cmds[i][TAG_BDADDR_OFFSET + 3], ++ cmds[i][TAG_BDADDR_OFFSET + 4], cmds[i][TAG_BDADDR_OFFSET + 5]); ++ } ++ size = cmds[i][3] + HCI_COMMAND_HDR_SIZE + 1; ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)&cmds[i][0], rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); ++ goto error; ++ } ++ } ++ ++error: ++ return err; ++} ++ ++ ++ ++int rome_patch_ver_req(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_VER_REQ_CMD, 0, ++ -1, EDL_PATCH_CMD_LEN); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if (err != size) { ++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); ++ goto error; ++ } ++error: ++ return err; ++ ++} ++ ++static void flow_control(int fd, int opt) ++{ ++ struct termios c_opt; ++ ++ ioctl(fd, TIOCMGET, &c_opt); ++ c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */ ++ c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ ++ c_opt.c_cflag &= ~CSIZE; ++ c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); ++ if (opt == MSM_ENABLE_FLOW_CTRL) ++ c_opt.c_cflag |= CRTSCTS; ++ else if (opt == MSM_DISABLE_FLOW_CTRL) ++ c_opt.c_cflag &= ~CRTSCTS; ++ else { ++ fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); ++ return; ++ } ++ c_opt.c_iflag = IGNPAR; ++ c_opt.c_oflag = 0; ++ c_opt.c_lflag = 0; ++ ioctl(fd, TIOCMSET, &c_opt); ++} ++ ++ ++int rome_set_baudrate_req(int fd, unsigned char baud_rate) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ hci_command_hdr *cmd_hdr; ++ int flags; ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ cmd[0] = HCI_COMMAND_PKT; ++ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); ++ cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; ++ cmd[4] = baud_rate; ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); ++ ++ /* Flow off during baudrate change */ ++ flow_control(fd, MSM_DISABLE_FLOW_CTRL); ++ ++ /* Send the HCI command packet to UART for transmission */ ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ /* Change Local UART baudrate to high speed UART */ ++ userial_vendor_set_baud(baud_rate); ++ ++ /* Flow on after changing local uart baudrate */ ++ flow_control(fd, MSM_ENABLE_FLOW_CTRL); ++ ++ /* Check for response from the Controller */ ++ if ((err = read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto error; ++ } ++ ++ /* Wait for command complete event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++error: ++ return err; ++ ++} ++ ++ ++int rome_hci_reset_req(int fd, char baud) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ hci_command_hdr *cmd_hdr; ++ int flags; ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ cmd[0] = HCI_COMMAND_PKT; ++ cmd_hdr->opcode = HCI_RESET; ++ cmd_hdr->plen = 0; ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); ++ ++ /* Flow off during baudrate change */ ++ flow_control(fd, MSM_DISABLE_FLOW_CTRL); ++ ++ /* Send the HCI command packet to UART for transmission */ ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ /* Change Local UART baudrate to high speed UART */ ++ userial_vendor_set_baud(baud); ++ ++ /* Flow on after changing local uart baudrate */ ++ flow_control(fd, MSM_ENABLE_FLOW_CTRL); ++ ++ /* Wait for command complete event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++ ++error: ++ return err; ++ ++} ++ ++int qca_soc_init(int fd, int speed, char *bdaddr) ++{ ++ int err = -1; ++ int ret = 0; ++ int size; ++ unsigned char baud_rate = 0; ++ ++ vnd_userial.fd = fd; ++ ++ /* Get Rome version information */ ++ if ((err = rome_patch_ver_req(fd)) < 0) { ++ fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); ++ ret = -1; ++ goto error; ++ } ++ ++ fprintf(stderr, "%s: Rome Version (0x%08x)\n", __FUNCTION__, rome_ver); ++ ++ switch (rome_ver){ ++ case ROME_VER_1_0: ++ /* Set and Download the RAMPATCH */ ++ fprintf(stderr, "%s: Setting Patch Header & Downloading Patches\n", __FUNCTION__); ++ err = rome_download_rampatch(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: DOWNLOAD RAMPATCH failed!\n", __FUNCTION__); ++ ret = -1; ++ goto error; ++ } ++ ++ /* Attach the RAMPATCH */ ++ fprintf(stderr, "%s: Attaching the patches\n", __FUNCTION__); ++ err = rome_attach_rampatch(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: ATTACH RAMPATCH failed!\n", __FUNCTION__); ++ ret = -1; ++ goto error; ++ } ++ ++ /* Send Reset */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ err = rome_rampatch_reset(fd); ++ if (err < 0) { ++ fprintf(stderr, "Failed to RESET after RAMPATCH upgrade!\n"); ++ ret = -1; ++ goto error; ++ } ++ ++ /* NVM download */ ++ fprintf(stderr, "%s: Downloading NVM\n", __FUNCTION__); ++ err = rome_1_0_nvm_tag_dnld(fd); ++ if (err < 0) { ++ fprintf(stderr, "Downloading NVM Failed !!\n"); ++ ret = -1; ++ goto error; ++ } ++ ++ /* Change baud rate 115.2 kbps to 3Mbps*/ ++ err = rome_hci_reset_req(fd, baud_rate); ++ if (err < 0) { ++ fprintf(stderr, "HCI Reset Failed !!\n"); ++ ret = -1; ++ goto error; ++ } ++ break; ++ case ROME_VER_1_1: ++ rampatch_file_path = ROME_RAMPATCH_TLV_PATH; ++ nvm_file_path = ROME_NVM_TLV_PATH; ++ goto download; ++ case ROME_VER_1_3: ++ rampatch_file_path = ROME_RAMPATCH_TLV_1_0_3_PATH; ++ nvm_file_path = ROME_NVM_TLV_1_0_3_PATH; ++ goto download; ++ case ROME_VER_2_1: ++ rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH; ++ nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; ++ goto download; ++ case ROME_VER_3_0: ++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; ++ nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; ++ goto download; ++ case ROME_VER_3_2: ++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; ++ nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; ++ goto download; ++ case TUFELLO_VER_1_0: ++ rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; ++ nvm_file_path = TF_NVM_TLV_1_0_0_PATH; ++ goto download; ++ case TUFELLO_VER_1_1: ++ rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH; ++ nvm_file_path = TF_NVM_TLV_1_0_1_PATH; ++download: ++ isSpeedValid(speed, &baud_rate); ++ if (baud_rate < 0) { ++ ret = -1; ++ goto error; ++ } ++ ++ /* Donwload TLV files (rampatch, NVM) */ ++ err = rome_download_tlv_file(fd, baud_rate); ++ if (err < 0) { ++ fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); ++ ret = -1; ++ goto error; ++ } ++ ++ /* ++ * Overriding the baud rate value in NVM file with the user ++ * requested baud rate, since default baud rate in NVM file is 3M. ++ */ ++ err = rome_set_baudrate_req(fd, baud_rate); ++ if (err < 0) { ++ fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); ++ ret = -1; ++ goto error; ++ } ++ ++ /* Perform HCI reset here*/ ++ err = rome_hci_reset_req(fd, baud_rate); ++ if (err < 0) { ++ fprintf(stderr, "HCI Reset Failed !!!\n"); ++ ret = -1; ++ goto error; ++ } ++ ++ break; ++ case ROME_VER_UNKNOWN: ++ default: ++ fprintf(stderr, "%s: Detected unknown ROME version\n", __FUNCTION__); ++ ret = -1; ++ break; ++ } ++ ++error: ++ return ret; ++} +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +new file mode 100644 +index 000000000..597743e0b +--- /dev/null ++++ b/tools/hciattach_rome.h +@@ -0,0 +1,388 @@ ++/* ++ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. ++ * Not a Contribution. ++ * Copyright 2012 The Android Open Source Project ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++#ifndef HW_ROME_H ++#define HW_ROME_H ++ ++/****************************************************************************** ++** Constants & Macros ++******************************************************************************/ ++#define HCI_MAX_CMD_SIZE 260 ++#define HCI_MAX_EVENT_SIZE 260 ++#define PRINT_BUF_SIZE ((HCI_MAX_CMD_SIZE * 3) + 2) ++/* HCI Command/Event Opcode */ ++#define HCI_RESET 0x0C03 ++#define EVT_CMD_COMPLETE 0x0E ++/* HCI Packet types */ ++#define HCI_COMMAND_PKT 0x01 ++#define HCI_ACLDATA_PKT 0x02 ++#define HCI_SCODATA_PKT 0x03 ++#define HCI_EVENT_PKT 0x04 ++#define HCI_VENDOR_PKT 0xff ++#define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) ++ ++#define NVITEM 0 ++#define RDWR_PROT 1 ++#define NVITEM_SIZE 2 ++#define PERSIST_HEADER_LEN 3 ++#define BD_ADDR_LEN 6 ++#define MSM_DISABLE_FLOW_CTRL 0 ++#define MSM_ENABLE_FLOW_CTRL 1 ++ ++#ifdef _PLATFORM_MDM_ ++#define USERIAL_OP_CLK_ON 0x5441 ++#define USERIAL_OP_CLK_OFF 0x5442 ++#endif ++ ++#define PR_INFO(fmt, arg...) printf(fmt, ## arg) ++#ifdef DEBUG ++ #define PR_DBG(fmt, arg...) printf(fmt, ## arg) ++#else ++ #define PR_DBG(fmt, arg...) ++#endif ++ ++unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; ++typedef enum { ++ USERIAL_OP_FLOW_ON, ++ USERIAL_OP_FLOW_OFF, ++ USERIAL_OP_NOP, ++} userial_vendor_ioctl_op_t; ++ ++ ++/* vendor serial control block */ ++typedef struct ++{ ++ int fd; /* fd to Bluetooth device */ ++ struct termios termios; /* serial terminal of BT port */ ++ char port_name[256]; ++} vnd_userial_cb_t; ++ ++/**** baud rates ****/ ++#define USERIAL_BAUD_300 0 ++#define USERIAL_BAUD_600 1 ++#define USERIAL_BAUD_1200 2 ++#define USERIAL_BAUD_2400 3 ++#define USERIAL_BAUD_9600 4 ++#define USERIAL_BAUD_19200 5 ++#define USERIAL_BAUD_57600 6 ++#define USERIAL_BAUD_115200 7 ++#define USERIAL_BAUD_230400 8 ++#define USERIAL_BAUD_460800 9 ++#define USERIAL_BAUD_921600 10 ++#define USERIAL_BAUD_1M 11 ++#define USERIAL_BAUD_1_5M 12 ++#define USERIAL_BAUD_2M 13 ++#define USERIAL_BAUD_3M 14 ++#define USERIAL_BAUD_4M 15 ++#define USERIAL_BAUD_AUTO 16 ++ ++#ifndef FALSE ++#define FALSE 0 ++#endif ++ ++#ifndef TRUE ++#define TRUE (!FALSE) ++#endif ++ ++#define HCI_CHG_BAUD_CMD_OCF 0x0C ++#define HCI_VENDOR_CMD_OGF 0x3F ++#define WRITE_BDADDR_CMD_LEN 14 ++#define WRITE_BAUD_CMD_LEN 6 ++#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN ++#define GET_VERSION_OCF 0x1E ++ ++#define PS_HDR_LEN 4 ++#define HCI_VENDOR_CMD_OGF 0x3F ++#define HCI_PS_CMD_OCF 0x0B ++ ++#define HCI_COMMAND_HDR_SIZE 3 ++#define EVT_CMD_COMPLETE_SIZE 3 ++#define EVT_CMD_STATUS 0x0F ++#define EVT_CMD_STATUS_SIZE 4 ++#define HCI_EVENT_HDR_SIZE 2 ++#define HCI_EV_SUCCESS 0x00 ++/* HCI Socket options */ ++#define HCI_DATA_DIR 1 ++#define HCI_FILTER 2 ++#define HCI_TIME_STAMP 3 ++ ++#define P_ID_OFFSET (0) ++#define HCI_CMD_IND (1) ++#define EVENTCODE_OFFSET (1) ++#define EVT_PLEN (2) ++#define PLEN (3) ++#define CMD_RSP_OFFSET (3) ++#define RSP_TYPE_OFFSET (4) ++#define BAUDRATE_RSP_STATUS_OFFSET (4) ++#define CMD_STATUS_OFFSET (5) ++#define P_ROME_VER_OFFSET (4) ++#define P_BUILD_VER_OFFSET (6) ++#define P_BASE_ADDR_OFFSET (8) ++#define P_ENTRY_ADDR_OFFSET (12) ++#define P_LEN_OFFSET (16) ++#define P_CRC_OFFSET (20) ++#define P_CONTROL_OFFSET (24) ++#define PATCH_HDR_LEN (28) ++#define MAX_DATA_PER_SEGMENT (239) ++#define VSEVENT_CODE (0xFF) ++#define HC_VS_MAX_CMD_EVENT (0xFF) ++#define PATCH_PROD_ID_OFFSET (5) ++#define PATCH_PATCH_VER_OFFSET (9) ++#define PATCH_ROM_BUILD_VER_OFFSET (11) ++#define PATCH_SOC_VER_OFFSET (13) ++#define MAX_SIZE_PER_TLV_SEGMENT (243) ++ ++/* VS Opcode */ ++#define HCI_PATCH_CMD_OCF (0) ++#define EDL_SET_BAUDRATE_CMD_OCF (0x48) ++ ++/* VS Commands */ ++#define VSC_SET_BAUDRATE_REQ_LEN (1) ++#define EDL_PATCH_CMD_LEN (1) ++#define EDL_PATCH_CMD_REQ_LEN (1) ++#define EDL_PATCH_DLD_REQ_CMD (0x01) ++#define EDL_PATCH_RST_REQ_CMD (0x05) ++#define EDL_PATCH_SET_REQ_CMD (0x16) ++#define EDL_PATCH_ATCH_REQ_CMD (0x17) ++#define EDL_PATCH_VER_REQ_CMD (0x19) ++#define EDL_PATCH_TLV_REQ_CMD (0x1E) ++#define VSC_DISABLE_IBS_LEN (0x04) ++ ++/* VS Event */ ++#define EDL_CMD_REQ_RES_EVT (0x00) ++#define EDL_CMD_EXE_STATUS_EVT (0x00) ++#define EDL_SET_BAUDRATE_RSP_EVT (0x92) ++#define EDL_PATCH_VER_RES_EVT (0x19) ++#define EDL_TVL_DNLD_RES_EVT (0x04) ++#define EDL_APP_VER_RES_EVT (0x02) ++ ++/* Status Codes of HCI CMD execution*/ ++#define HCI_CMD_SUCCESS (0x0) ++#define PATCH_LEN_ERROR (0x1) ++#define PATCH_VER_ERROR (0x2) ++#define PATCH_CRC_ERROR (0x3) ++#define PATCH_NOT_FOUND (0x4) ++#define TLV_TYPE_ERROR (0x10) ++#define NVM_ACCESS_CODE (0x0B) ++#define BAUDRATE_CHANGE_SUCCESS (1) ++ ++/* TLV_TYPE */ ++#define TLV_TYPE_PATCH (1) ++#define TLV_TYPE_NVM (2) ++ ++/* NVM */ ++#define MAX_TAG_CMD 30 ++#define TAG_END 0xFF ++#define NVM_ACCESS_SET 0x01 ++#define TAG_NUM_OFFSET 5 ++#define TAG_NUM_2 2 ++#define TAG_NUM_17 (17) ++#define TAG_NUM_27 27 ++#define TAG_NUM_44 44 ++#define TAG_BDADDR_OFFSET 7 ++ ++/* FW PCM Configuration */ ++#define FWCONF_PCM_MS_OFFSET_1 9 ++#define FWCONF_PCM_MS_OFFSET_2 33 ++#define FWCONF_PCM_SLAVE 1 ++#define FWCONF_PCM_MASTER 0 ++#define FWCONF_PCM_ROLE_BIT_OFFSET 4 ++ ++/* FW HCI Transport Layer Configuration */ ++#define FWCONF_IBS_DISABLE (0) ++#define FWCONF_IBS_ENABLE (1) ++#define FWCONF_IBS_VAL_BIT (7) ++#define FWCONF_IBS_VAL_OFFSET (0) ++#define FWCONF_BAUD_VAL_OFFSET (2) ++ ++/* FW DEEP SLEEP Configuration */ ++#define FWCONF_DEEP_SLEEP_DISABLE 0 ++#define FWCONF_DEEP_SLEEP_ENABLE 1 ++#define FWCONF_DEEP_SLEEP_BYTE_OFFSET 0 ++#define FWCONF_DEEP_SLEEP_BIT_OFFSET 0 ++ ++#define MAX_RETRY_CNT 1 ++#define SELECT_TIMEOUT 3 ++ ++/* NVM Tags specifically used for ROME 1.0 */ ++#define ROME_1_0_100022_1 0x101000221 ++#define ROME_1_0_100019 0x101000190 ++#define ROME_1_0_6002 0x100600200 ++ ++/* Default NVM Version setting for ROME 1.0 */ ++#define NVM_VERSION ROME_1_0_100022_1 ++ ++ ++#define LSH(val, n) ((unsigned int)(val) << (n)) ++#define EXTRACT_BYTE(val, pos) (char) (((val) >> (8 * (pos))) & 0xFF) ++#define CALC_SEG_SIZE(len, max) ((plen) % (max))?((plen/max)+1) : ((plen) / (max)) ++ ++#define ROME_FW_PATH "/lib/firmware/rampatch.img" ++#define ROME_RAMPATCH_TLV_PATH "/lib/firmware/rampatch_tlv.img" ++#define ROME_NVM_TLV_PATH "/lib/firmware/nvm_tlv.bin" ++#define ROME_RAMPATCH_TLV_1_0_3_PATH "/lib/firmware/rampatch_tlv_1.3.tlv" ++#define ROME_NVM_TLV_1_0_3_PATH "/lib/firmware/nvm_tlv_1.3.bin" ++#define ROME_RAMPATCH_TLV_2_0_1_PATH "/lib/firmware/rampatch_tlv_2.1.tlv" ++#define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" ++#define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/rampatch_tlv_3.0.tlv" ++#define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/nvm_tlv_3.0.bin" ++#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/btfw32.tlv" ++#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/btnv32.bin" ++#ifdef _PLATFORM_MDM_ ++#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv" ++#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin" ++#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/tfbtfw11.tlv" ++#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/tfbtnv11.bin" ++#else ++#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv" ++#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/qca/nvm_tlv_tf_1.0.bin" ++#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtfw11.tlv" ++#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/tfbtnv11.bin" ++#endif ++ ++/* This header value in rampatch file decides event handling mechanism in the HOST */ ++#define ROME_SKIP_EVT_NONE 0x00 ++#define ROME_SKIP_EVT_VSE 0x01 ++#define ROME_SKIP_EVT_CC 0x02 ++#define ROME_SKIP_EVT_VSE_CC 0x03 ++ ++#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf" ++/****************************************************************************** ++** Local type definitions ++******************************************************************************/ ++ ++typedef struct { ++ unsigned char ncmd; ++ unsigned short opcode; ++} __attribute__ ((packed)) evt_cmd_complete; ++ ++typedef struct { ++ unsigned char status; ++ unsigned char ncmd; ++ unsigned short opcode; ++} __attribute__ ((packed)) evt_cmd_status; ++ ++typedef struct { ++ unsigned short opcode; ++ unsigned char plen; ++} __attribute__ ((packed)) hci_command_hdr; ++ ++typedef struct { ++ unsigned char evt; ++ unsigned char plen; ++} __attribute__ ((packed)) hci_event_hdr; ++typedef struct { ++ unsigned short rom_version; ++ unsigned short build_version; ++} __attribute__ ((packed)) patch_version; ++ ++typedef struct { ++ unsigned int patch_id; ++ patch_version patch_ver; ++ unsigned int patch_base_addr; ++ unsigned int patch_entry_addr; ++ unsigned short patch_length; ++ int patch_crc; ++ unsigned short patch_ctrl; ++} __attribute__ ((packed)) patch_info; ++ ++typedef struct { ++ unsigned int tlv_data_len; ++ unsigned int tlv_patch_data_len; ++ unsigned char sign_ver; ++ unsigned char sign_algorithm; ++ unsigned char dwnd_cfg; ++ unsigned char reserved1; ++ unsigned short prod_id; ++ unsigned short build_ver; ++ unsigned short patch_ver; ++ unsigned short reserved2; ++ unsigned int patch_entry_addr; ++} __attribute__ ((packed)) tlv_patch_hdr; ++ ++typedef struct { ++ unsigned short tag_id; ++ unsigned short tag_len; ++ unsigned int tag_ptr; ++ unsigned int tag_ex_flag; ++} __attribute__ ((packed)) tlv_nvm_hdr; ++ ++typedef struct { ++ unsigned char tlv_type; ++ unsigned char tlv_length1; ++ unsigned char tlv_length2; ++ unsigned char tlv_length3; ++ ++ union{ ++ tlv_patch_hdr patch; ++ tlv_nvm_hdr nvm; ++ }tlv; ++} __attribute__ ((packed)) tlv_patch_info; ++ ++enum{ ++ BAUDRATE_115200 = 0x00, ++ BAUDRATE_57600 = 0x01, ++ BAUDRATE_38400 = 0x02, ++ BAUDRATE_19200 = 0x03, ++ BAUDRATE_9600 = 0x04, ++ BAUDRATE_230400 = 0x05, ++ BAUDRATE_250000 = 0x06, ++ BAUDRATE_460800 = 0x07, ++ BAUDRATE_500000 = 0x08, ++ BAUDRATE_720000 = 0x09, ++ BAUDRATE_921600 = 0x0A, ++ BAUDRATE_1000000 = 0x0B, ++ BAUDRATE_1250000 = 0x0C, ++ BAUDRATE_2000000 = 0x0D, ++ BAUDRATE_3000000 = 0x0E, ++ BAUDRATE_4000000 = 0x0F, ++ BAUDRATE_1600000 = 0x10, ++ BAUDRATE_3200000 = 0x11, ++ BAUDRATE_3500000 = 0x12, ++ BAUDRATE_AUTO = 0xFE, ++ BAUDRATE_Reserved = 0xFF ++}; ++ ++enum{ ++ ROME_PATCH_VER_0100 = 0x0100, ++ ROME_PATCH_VER_0101 = 0x0101, ++ ROME_PATCH_VER_0200 = 0x0200, ++ ROME_PATCH_VER_0300 = 0x0300, ++ ROME_PATCH_VER_0302 = 0x0302 ++ }; ++ ++enum{ ++ ROME_SOC_ID_00 = 0x00000000, ++ ROME_SOC_ID_11 = 0x00000011, ++ ROME_SOC_ID_13 = 0x00000013, ++ ROME_SOC_ID_22 = 0x00000022, ++ ROME_SOC_ID_23 = 0x00000023, ++ ROME_SOC_ID_44 = 0x00000044 ++}; ++ ++enum{ ++ ROME_VER_UNKNOWN = 0, ++ ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ), ++ ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ), ++ ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), ++ ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), ++ ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), ++ ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ), ++ TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ), ++ TUFELLO_VER_1_1 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_23 ) ++}; ++#endif /* HW_ROME_H */ +-- +2.15.0 + diff --git a/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend new file mode 100644 index 00000000..9eff7c03 --- /dev/null +++ b/bsp/meta-boundary/recipes-connectivity/bluez5/bluez5_%.bbappend @@ -0,0 +1,12 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +PATCHES = " file://0001-hciattach-add-QCA9377-Tuffello-support.patch \ +" + +SRC_URI_append_mx6 = "${PATCHES}" +SRC_URI_append_mx7 = "${PATCHES}" +SRC_URI_append_mx8 = "${PATCHES}" + +PACKAGE_ARCH_mx6 = "${MACHINE_SOCARCH}" +PACKAGE_ARCH_mx7 = "${MACHINE_SOCARCH}" +PACKAGE_ARCH_mx8 = "${MACHINE_SOCARCH}" diff --git a/bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg b/bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg new file mode 100644 index 00000000..8cb6d799 --- /dev/null +++ b/bsp/meta-boundary/recipes-core/busybox/busybox/custom-ash.cfg @@ -0,0 +1,3 @@ +CONFIG_FEATURE_EDITING_HISTORY=999 +CONFIG_FEATURE_EDITING_VI=y +CONFIG_FEATURE_REVERSE_SEARCH=y diff --git a/bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend b/bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend new file mode 100644 index 00000000..984c5a48 --- /dev/null +++ b/bsp/meta-boundary/recipes-core/busybox/busybox_%.bbappend @@ -0,0 +1,8 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI += " \ + file://custom-ash.cfg \ +" + +SRC_URI[custom-ash.cfg.md5sum] = "13d2bc68c91b5c2679ecc652f66832b3" +SRC_URI[custom-ash.cfg.sha256sum] = "7001872f5021b48d010597ce1a614dd35982bdd0045387170408d5946a5c0c7e" diff --git a/bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces b/bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces new file mode 100644 index 00000000..ac9a7da8 --- /dev/null +++ b/bsp/meta-boundary/recipes-core/init-ifupdown/boundary/interfaces @@ -0,0 +1,27 @@ +# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) + +# The loopback interface +auto lo +iface lo inet loopback + +# Wired or wireless interfaces +auto eth0 +iface eth0 inet dhcp + hostname `/bin/hostname` + +# Ethernet/RNDIS gadget (g_ether) +# ... or on host side, usbnet and random hwaddr +auto usb0 +iface usb0 inet static + pre-up modprobe g_ether + address 10.0.0.2 + netmask 255.255.255.0 + network 10.0.0.0 + +# Wireless interfaces +auto wlan0 +iface wlan0 inet dhcp + wireless_mode managed + wireless_essid any + wpa-driver nl80211 + wpa-conf /etc/wpa_supplicant.conf diff --git a/bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend b/bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend new file mode 100644 index 00000000..41e996f5 --- /dev/null +++ b/bsp/meta-boundary/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS_prepend_mx6 := "${THISDIR}/boundary:" +FILESEXTRAPATHS_prepend_mx7 := "${THISDIR}/boundary:" +FILESEXTRAPATHS_prepend_mx8 := "${THISDIR}/boundary:" diff --git a/bsp/meta-boundary/recipes-core/microcom/microcom_git.bb b/bsp/meta-boundary/recipes-core/microcom/microcom_git.bb new file mode 100644 index 00000000..68dfa5e1 --- /dev/null +++ b/bsp/meta-boundary/recipes-core/microcom/microcom_git.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "microcom is a small minicom-like serial terminal emulator with scripting support." +LICENSE = "GPLv3" +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" + +SRCREV = "5ea09fd573a56efeba3c2cc07e41537d52d3de48" +SRC_URI = "git://github.com/Oliviers-OSS/microcom;branch=master" + +S = "${WORKDIR}/git" + +do_install () { + install -d ${D}${bindir} + install -m 0755 microcom ${D}${bindir} +} + +inherit autotools diff --git a/bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h b/bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h new file mode 100644 index 00000000..02d278a7 --- /dev/null +++ b/bsp/meta-boundary/recipes-core/psplash/files/boundary-logo-img.h @@ -0,0 +1,1776 @@ +/* Generated with make-image-header script from psplash project */ +/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ + +#define POKY_IMG_ROWSTRIDE (1176) +#define POKY_IMG_WIDTH (294) +#define POKY_IMG_HEIGHT (380) +#define POKY_IMG_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */ +#define POKY_IMG_RLE_PIXEL_DATA ((uint8*) \ + "\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377" \ + "\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377" \ + "\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\372\377" \ + "\377\377\0\5\375\375\375\210\334\337\345\377\324\330\337\377\316\322" \ + "\333\377\302\310\322\377\377\303\310\322\377\336\303\310\322\377\1\276" \ + "\304\317\377\213\271\277\314\377\1\272\300\314\377\262\377\377\377\0" \ + "\4\323\327\337\377\224\236\261\377Sb\200\377!4[\377\377\26*S\377\360" \ + "\26*S\377\1\31,U\377\255\377\377\377\0\10\347\351\355\377\234\245\266" \ + "\377_m\211\3779Jm\377\30,T\377\15\"L\377\20%O\377\23'Q\377\377\26*S\377" \ + "\361\26*S\377\1\31,U\377\252\377\377\377\0\5\344\347\353\377\242\251" \ + "\272\3773Eh\377\11\36I\377\21&P\377\377\26*S\377\367\26*S\377\1\31,U" \ + "\377\250\377\377\377\0\5\237\247\270\3771Cg\377\34""0W\377\24(R\377\25" \ + ")S\377\377\26*S\377\371\26*S\377\1\31,U\377\245\377\377\377\0\4\343\345" \ + "\352\377\204\217\244\377!3[\377\16#M\377\377\26*S\377\375\26*S\377\1" \ + "\31,U\377\244\377\377\377\0\2ly\223\377\16\"M\377\377\26*S\377\377\26" \ + "*S\377\2\26*S\377\31,U\377\242\377\377\377\0\3o|\225\377\37""2Y\377\22" \ + "&P\377\227\26*S\377\10\23'P\377\17#N\377\13\40K\377\7\34H\377\21&O\377" \ + "$6]\3776Hk\377FVw\377\377IXx\377\260IXx\377\1@Pq\377\2126Hk\377\2""5" \ + "Fj\377\37""2Z\377\211\35""0Y\377\2\36""1Y\377\14!L\377\212\5\32F\377" \ + "\1\6\33G\377\206\7\34H\377\1\17#N\377\210\26*S\377\1\31,U\377\240\377" \ + "\377\377\0\3\264\273\310\377\26*S\377\23'Q\377\223\26*S\377\12\25)S\377" \ + "\23'Q\377\20$O\377\35""0X\3778Il\377L[{\377w\203\233\377\240\250\271" \ + "\377\317\323\333\377\367\370\371\377\377\377\377\377\377\327\377\377" \ + "\377\377\1\366\367\371\377\205\367\370\371\377\1\203\216\244\377\210" \ + "\26*S\377\1\31,U\377\237\377\377\377\0\1;Ln\377\225\26*S\377\6\21&P\377" \ + "\40""3[\377r~\226\377\310\314\326\377\367\370\371\377\373\373\374\377" \ + "\377\377\377\377\377\342\377\377\377\377\1\210\222\247\377\210\26*S\377" \ + "\1\31,U\377\235\377\377\377\0\3\242\252\272\377\27+T\377\24(Q\377\221" \ + "\26*S\377\5\23'Q\377\13\40K\377<Mo\377\207\221\247\377\320\325\335\377" \ + "\377\377\377\377\377\347\377\377\377\377\1\210\222\247\377\210\26*S\377" \ + "\1\31,U\377\234\377\377\377\0\2[j\206\377\17$N\377\221\26*S\377\4\25" \ + ")R\377\37""2Y\377[h\205\377\340\343\350\377\377\377\377\377\377\352\377" \ + "\377\377\377\1\210\222\247\377\210\26*S\377\1\31,U\377\232\377\377\377" \ + "\0\3\346\350\354\377/Af\377\24(R\377\220\26*S\377\4\22&P\377\22'P\377" \ + "\227\237\262\377\350\351\356\377\377\377\377\377\377\354\377\377\377" \ + "\377\1\210\222\247\377\210\26*S\377\1\31,U\377\231\377\377\377\0\2\316" \ + "\322\333\377$7^\377\220\26*S\377\3\22'P\377%7^\377\212\224\251\377\377" \ + "\377\377\377\377\357\377\377\377\377\1\210\222\247\377\210\26*S\377\1" \ + "\31,U\377\230\377\377\377\0\2\306\313\325\377\30,U\377\220\26*S\377\3" \ + "\22&P\377iu\220\377\372\373\374\377\377\377\377\377\377\360\377\377\377" \ + "\377\1\210\222\247\377\210\26*S\377\1\31,U\377\227\377\377\377\0\2\242" \ + "\252\273\377\27+T\377\217\26*S\377\3\21%O\377Tb\201\377\325\330\340\377" \ + "\377\377\377\377\377\362\377\377\377\377\1\207\221\246\377\210\26*S\377" \ + "\1\31,U\377\226\377\377\377\0\2\314\321\331\377\30,T\377\217\26*S\377" \ + "\2\32.V\377~\211\240\377\224\377\377\377\377\7\371\372\373\377\356\360" \ + "\363\377\345\347\354\377\335\337\346\377\301\306\321\377\250\257\277" \ + "\377\227\240\263\377\377\213\226\252\377\256\213\226\252\377\2\214\226" \ + "\252\377\244\254\274\377\212\250\257\277\377\2\255\264\303\377\276\304" \ + "\317\377\211\275\303\316\377\2\276\304\317\377\327\333\342\377\212\331" \ + "\334\343\377\210\377\377\377\377\2\222\234\257\377\25)R\377\207\26*S" \ + "\377\1\31,U\377\225\377\377\377\0\2\303\310\322\377\27+T\377\216\26*" \ + "S\377\3\24(Q\377\"5\\\377\337\342\347\377\222\377\377\377\377\11\352" \ + "\354\357\377\221\232\256\377EUv\377,>c\377$7]\377\35""0X\377\25)R\377" \ + "\23(Q\377\24(Q\377\377\24(R\377\260\24(R\377\214\24(Q\377\213\23(Q\377" \ + "\213\23'Q\377\210\377\377\377\377\2\232\242\264\377\25)R\377\207\26*" \ + "S\377\1\31,U\377\224\377\377\377\0\2\340\343\350\377\"5\\\377\216\26" \ + "*S\377\2\14!L\377gt\217\377\220\377\377\377\377\7\365\366\370\377\270" \ + "\276\312\377n{\224\377%7^\377\10\35H\377\17$N\377\25)R\377\377\26*S\377" \ + "\330\26*S\377\210\377\377\377\377\2\231\242\264\377\25)R\377\207\26*" \ + "S\377\1\31,U\377\224\377\377\377\0\1$7]\377\216\26*S\377\2\27+T\377\222" \ + "\233\257\377\216\377\377\377\377\5\376\376\376\377\352\354\360\377fs" \ + "\216\377\24(R\377\25)R\377\377\26*S\377\335\26*S\377\210\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\223\377\377\377" \ + "\0\2Sb\177\377\25)R\377\215\26*S\377\2\23'P\377\267\275\312\377\216\377" \ + "\377\377\377\4\275\302\316\377L\\{\377\27+T\377\23'Q\377\377\26*S\377" \ + "\337\26*S\377\210\377\377\377\377\2\231\242\264\377\25)R\377\207\26*" \ + "S\377\1\31,U\377\222\377\377\377\0\2\216\230\254\377\16#N\377\215\26" \ + "*S\377\2\27+T\377\277\304\320\377\215\377\377\377\377\3\324\330\340\377" \ + "AQs\377\13\40K\377\377\26*S\377\342\26*S\377\210\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\222\377\377\377\0\1\30" \ + ",U\377\215\26*S\377\2\30,U\377\324\327\337\377\214\377\377\377\377\4" \ + "\374\374\374\377Ve\202\377\31,U\377\25*S\377\377\26*S\377\343\26*S\377" \ + "\210\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\221\377\377\377\0\2""5Fj\377\24(R\377\214\26*S\377\2\20%O\377\271\277" \ + "\313\377\214\377\377\377\377\3\241\251\271\377\32.V\377\22'P\377\377" \ + "\26*S\377\345\26*S\377\210\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\220\377\377\377\0\1\236\247\270\377\216\26*" \ + "S\377\1\267\275\312\377\213\377\377\377\377\3\366\367\371\377Zh\205\377" \ + "\22&P\377\377\26*S\377\347\26*S\377\210\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\220\377\377\377\0\1\36""2Y\377" \ + "\214\26*S\377\2\15!L\377\230\241\263\377\213\377\377\377\377\3\331\334" \ + "\343\377+=c\377\23'Q\377\377\26*S\377\350\26*S\377\1\375\375\375\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\217\377\377\377\0\2fs\215\377\22&P\377\213\26*S\377\2\24(Q\377Yg\204" \ + "\377\213\377\377\377\377\2\277\305\320\377\22&P\377\377\26*S\377\352" \ + "\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25" \ + ")R\377\207\26*S\377\1\31,U\377\216\377\377\377\0\2\375\375\375\314\40" \ + "3Z\377\214\26*S\377\1\40""3[\377\213\377\377\377\377\2\245\255\274\377" \ + "\25)R\377\377\26*S\377\353\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\216\377\377\377" \ + "\0\2\207\221\247\377\24(Q\377\213\26*S\377\2\32-V\377\336\341\346\377" \ + "\212\377\377\377\377\2\226\237\261\377\15\"M\377\377\26*S\377\354\26" \ + "*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\216\377\377\377\0\1\12\37J\377\213\26*S\377" \ + "\2\21%O\377t\200\230\377\212\377\377\377\377\2\261\267\305\377\12\37" \ + "J\377\377\26*S\377\355\26*S\377\1\375\375\376\377\207\377\377\377\377" \ + "\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\215\377\377\377\0" \ + "\2\220\232\255\377\23'Q\377\213\26*S\377\1=Mo\377\212\377\377\377\377" \ + "\2\277\305\320\377\27+T\377\377\26*S\377\356\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\215\377\377\377\0\1EUv\377\213\26*S\377\2\20$N\377\311\316\327\377\211" \ + "\377\377\377\377\2\332\335\343\377\22&P\377\377\26*S\377\357\26*S\377" \ + "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \ + "\26*S\377\1\31,U\377\215\377\377\377\0\1\20$N\377\212\26*S\377\2\23'" \ + "Q\377]j\207\377\211\377\377\377\377\2\372\372\373\3772Dh\377\377\26*" \ + "S\377\360\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\214\377\377\377\0\2\203\215\243" \ + "\377\21%O\377\212\26*S\377\2\33/W\377\360\361\364\377\211\377\377\377" \ + "\377\2Q`\177\377\23'P\377\377\26*S\377\360\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\214\377\377\377\0\1\37""3Z\377\212\26*S\377\2\24)R\377cq\214\377\211" \ + "\377\377\377\377\2\261\267\305\377\23'Q\377\377\26*S\377\361\26*S\377" \ + "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \ + "\26*S\377\1\31,U\377\213\377\377\377\0\2\337\342\350\377\27+T\377\212" \ + "\26*S\377\2\10\36I\377\361\361\364\377\211\377\377\377\377\1!4[\377\377" \ + "\26*S\377\362\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242" \ + "\264\377\25)R\377\207\26*S\377\1\31,U\377\213\377\377\377\0\1\273\301" \ + "\315\377\212\26*S\377\2\25)R\377q~\227\377\211\377\377\377\377\2]k\207" \ + "\377\22&P\377\377\26*S\377\362\26*S\377\1\375\375\376\377\207\377\377" \ + "\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\213\377\377" \ + "\377\0\1\207\222\246\377\212\26*S\377\2\30,U\377\325\331\340\377\210" \ + "\377\377\377\377\2\344\346\353\377\35""1X\377\377\26*S\377\363\26*S\377" \ + "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \ + "\26*S\377\1\31,U\377\213\377\377\377\0\1P_~\377\212\26*S\377\2!4[\377" \ + "\373\373\374\377\210\377\377\377\377\2q|\226\377\24)R\377\377\26*S\377" \ + "\363\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \ + "\25)R\377\207\26*S\377\1\31,U\377\213\377\377\377\0\1\36""1Y\377\211" \ + "\26*S\377\2\17$N\377\210\222\247\377\210\377\377\377\377\2\342\344\352" \ + "\377\10\35H\377\377\26*S\377\364\26*S\377\1\375\375\376\377\207\377\377" \ + "\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\213\377\377" \ + "\377\0\1\6\34G\377\211\26*S\377\1\22&P\377\211\377\377\377\377\2my\223" \ + "\377\25)R\377\377\26*S\377\364\26*S\377\1\375\375\376\377\207\377\377" \ + "\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\325\330\340\377\12\37J\377\211\26*S\377\1HXx\377\211\377\377" \ + "\377\377\1-\77d\377\377\26*S\377\365\26*S\377\1\375\375\376\377\207\377" \ + "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\275\303\317\377\14!K\377\211\26*S\377\1\177\212\241\377" \ + "\210\377\377\377\377\2\312\316\327\377\15!L\377\377\26*S\377\365\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\234\244\266\377\17#N\377" \ + "\210\26*S\377\2\22&P\377\273\300\315\377\210\377\377\377\377\2@Pr\377" \ + "\24(R\377\377\26*S\377\365\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\216\227\253\377\20$N\377\210\26*S\377\2\15\"L\377\365\366\367\377" \ + "\207\377\377\377\377\2\361\362\364\377\24(Q\377\377\26*S\377\366\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2\25)R\3771Cg\377\210\377\377\377\377\1\307\313\325\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2\24(Q\377ht\217\377\210\377\377\377" \ + "\377\1\220\232\255\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207" \ + "\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2\22&P\377\251" \ + "\261\300\377\210\377\377\377\377\1_l\210\377\377\26*S\377\367\26*S\377" \ + "\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2\20%O\377\335\340\346\377\210\377\377\377\377\1""2Ch\377\377" \ + "\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242" \ + "\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2\34/W\377\361\362\365\377\210\377\377" \ + "\377\377\1\13\40K\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207" \ + "\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2\"5\\\377\363" \ + "\364\366\377\207\377\377\377\377\2\337\342\347\377\11\36I\377\377\26" \ + "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2*<b\377\365\366\370\377\207\377\377\377\377" \ + "\2\301\307\322\377\13\40K\377\377\26*S\377\367\26*S\377\1\375\375\376" \ + "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""0" \ + "Af\377\367\370\371\377\207\377\377\377\377\2\243\253\273\377\16#M\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\226\252\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \ + "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \ + "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \ + "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \ + "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \ + "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \ + "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \ + "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \ + "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \ + "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \ + "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \ + "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \ + "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \ + "\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377\25)R\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \ + "\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264\377" \ + "\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231\242\264" \ + "\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \ + "\377\207\377\377\377\377\2\231\242\264\377\25)R\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\231" \ + "\242\264\377\25)R\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375" \ + "\375\376\377\207\377\377\377\377\2\232\242\264\377\25)R\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377" \ + "\377\2\251\261\300\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\375\375\376\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377" \ + "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\253\263\301\377" \ + "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376\377" \ + "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\375\375\376" \ + "\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\375\375\376\377\207\377\377\377\377\2\253" \ + "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\363" \ + "\364\366\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367\377\207\377\377\377" \ + "\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367\377\207\377" \ + "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377" \ + "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367\377" \ + "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\364\364\367" \ + "\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\277\26*S\377\3\25)R\3773Dh\377\223\235\260\377\241\217" \ + "\230\254\377\3\220\232\255\377cq\214\377\22'P\377\221\26*S\377\1\364" \ + "\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\277\26*S\377\2\24(Q\377M]|\377\243\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \ + "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\277\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263" \ + "\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\377\26*S\377\277\26*S\377\2\24(Q" \ + "\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\377\26*S\377\277\26*S\377\2\24(Q\377M]|\377\243\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \ + "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \ + "\377\277\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \ + "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\277\26*S\377\2\24" \ + "(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*" \ + "S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\277\26*S\377\2\24(Q\377M]|\377\243\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \ + "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\222\26" \ + "*S\377\262'9_\377\3\34""0X\377\30,U\377\31,U\377\202\12\37J\377\7\13" \ + "\40K\377\14!L\377\16#M\377\17$N\377\21%O\377\23'Q\377\25)R\377\356\26" \ + "*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377" \ + "\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377" \ + "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\266\377\377\377\377" \ + "\14\372\373\373\377\345\350\354\377\321\324\335\377\260\267\305\377\233" \ + "\244\265\377y\205\235\377Zh\205\3771Cg\377\33/W\377\32.V\377\31-U\377" \ + "\30+T\377\352\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\277" \ + "\377\377\377\377\12\362\363\366\377\342\344\352\377\321\324\335\377\272" \ + "\300\314\377\226\237\262\377ao\213\377.@e\377\7\35H\377\14!L\377\22'" \ + "P\377\343\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \ + "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\306\377" \ + "\377\377\377\7\375\375\375\377\271\277\314\377t\200\231\377@Qr\377&9" \ + "_\377\22&P\377\23'Q\377\337\26*S\377\2\24(Q\377M]|\377\243\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \ + "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\311\377\377\377\377\6\375\375\375\377\366\366\370\377\336" \ + "\340\347\377y\204\234\377\25*R\377\21&P\377\335\26*S\377\2\24(Q\377M" \ + "]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1" \ + "\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26" \ + "*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \ + "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\316\377\377\377\377\4\303\307\322\377" \ + "|\207\236\377*=b\377\13\40K\377\332\26*S\377\2\24(Q\377M]|\377\243\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \ + "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \ + "*S\377\1\30,U\377\321\377\377\377\377\4\265\273\310\377,>c\377\30,U\377" \ + "\25)R\377\327\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\322" \ + "\377\377\377\377\4\376\376\377\377\330\333\342\377JYy\377\15\"L\377\326" \ + "\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\325\377\377\377" \ + "\377\3\273\301\314\377=Np\377\16#M\377\324\26*S\377\2\24(Q\377M]|\377" \ + "\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \ + "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\327\377\377\377\377\2\241\251\272\377" \ + "\25)S\377\323\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\330" \ + "\377\377\377\377\3\330\333\342\3779Jm\377\24(Q\377\321\26*S\377\2\24" \ + "(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*" \ + "S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\332\377\377\377\377\2IYy\377" \ + "\25)R\377\320\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\333" \ + "\377\377\377\377\2r\177\227\377\16#M\377\317\26*S\377\2\24(Q\377M]|\377" \ + "\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \ + "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\334\377\377\377\377\2y\205\234\377\24" \ + "(Q\377\316\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \ + "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\335\377" \ + "\377\377\377\2Ud\201\377\23'Q\377\315\26*S\377\2\24(Q\377M]|\377\243" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367" \ + "\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\336\377\377\377\377\1JYy\377\315\26*S\377\2" \ + "\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\336\377\377\377\377\1\346\350" \ + "\354\377\315\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\337" \ + "\377\377\377\377\2\274\302\316\377\24(R\377\313\26*S\377\2\24(Q\377M" \ + "]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1" \ + "\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26" \ + "*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \ + "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\337\377\377\377\377\3\375\375\376\377" \ + ";Lo\377\25)R\377\312\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2" \ + "\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377" \ + "\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\340\377\377\377\377\2\324\330\337\377\14\40K\377\312\26*S\377" \ + "\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221" \ + "\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23" \ + "'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377" \ + "\1\\j\206\377\312\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253" \ + "\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377" \ + "\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \ + "\341\377\377\377\377\2\275\303\317\377\25*S\377\311\26*S\377\2\24(Q\377" \ + "M]|\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1" \ + "\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26" \ + "*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \ + "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377\2\375\375\376\377" \ + "\23'Q\377\311\26*S\377\2\24(Q\377M]|\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\342" \ + "\377\377\377\377\2u\200\231\377\22&P\377\310\26*S\377\2\24(Q\377N]}\377" \ + "\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \ + "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\342\377\377\377\377\2\346\350\354\377" \ + "\16#M\377\310\26*S\377\2\24(R\377>Oq\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\342" \ + "\377\377\377\377\2\376\376\376\377(:`\377\310\26*S\377\2\25)R\377.@e" \ + "\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364" \ + "\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\342\377\377\377\377\2\376\376\376\377" \ + "JYy\377\310\26*S\377\2\25)R\377);a\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \ + "\377\377\377\377\214\376\376\377\377\263\377\377\377\377\2iv\221\377" \ + "\25)S\377\310\26*S\377\1\20$N\377\243\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263" \ + "\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \ + "\377\377\1KZz\377\213O^}\377\6Tc\201\377_m\211\377s\177\227\377\227\240" \ + "\263\377\301\307\321\377\370\371\372\377\255\377\377\377\377\2\224\234" \ + "\260\377\22&P\377\250\26*S\377\5\23'Q\377\20$N\377\14!K\377\11\36J\377" \ + "\7\35H\377\203\7\34H\377\5\7\35H\377\11\36I\377\13\40K\377\16#M\377\22" \ + "&P\377\223\26*S\377\1\20%O\377\243\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263" \ + "\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \ + "\377\377\1\20$N\377\215\26*S\377\7\25)R\377\21&O\377\15\"L\377\7\34H" \ + "\3778Jm\377\235\246\267\377\342\345\352\377\252\377\377\377\377\2\270" \ + "\276\312\377\16#M\377\243\26*S\377\12\25)R\377\22&P\377\31-U\377/Ae\377" \ + ">Np\377gt\217\377\221\233\256\377\275\303\316\377\334\336\345\377\361" \ + "\363\365\377\203\364\366\367\377\12\363\364\366\377\342\344\352\377\306" \ + "\313\325\377\236\246\267\377u\201\231\377EUv\3772Ch\377\35""1X\377\21" \ + "&O\377\24(R\377\216\26*S\377\2\21%O\377\372\373\374\377\242\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \ + "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\244\377\377\377\377\1\20$N\377\222\26*S\377\4\24(R\377\33" \ + ".V\377;Lo\377\353\355\360\377\250\377\377\377\377\2\322\326\336\377\14" \ + "!K\377\241\26*S\377\7\25)R\377\13\40K\377>Op\377\262\272\306\377\356" \ + "\357\362\377\367\370\371\377\376\376\376\377\216\377\377\377\377\6\370" \ + "\371\372\377\361\362\365\377\304\311\323\377O^}\377\11\36I\377\24)R\377" \ + "\214\26*S\377\2\21&O\377\362\362\365\377\242\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \ + "\377\377\377\377\1\20$N\377\224\26*S\377\3\25)R\377\22'P\377\230\241" \ + "\263\377\247\377\377\377\377\2\355\356\362\377\11\36I\377\236\26*S\377" \ + "\5\25)S\377\13\40K\377;Lo\377\223\234\257\377\351\353\357\377\227\377" \ + "\377\377\377\4\357\360\363\377\230\240\263\377<Mo\377\13\40K\377\212" \ + "\26*S\377\2\22&P\377\346\350\354\377\242\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253" \ + "\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377" \ + "\377\377\377\1\20$N\377\226\26*S\377\2\25)R\377\210\222\247\377\246\377" \ + "\377\377\377\2\372\372\373\377\10\35I\377\236\26*S\377\2+=b\377\300\306" \ + "\320\377\235\377\377\377\377\2\273\301\314\377&9_\377\211\26*S\377\2" \ + "\22'P\377\331\335\343\377\242\377\377\377\377\2\253\263\302\377\17#N" \ + "\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \ + "\377\1\20$N\377\227\26*S\377\2\17$N\377\236\247\270\377\245\377\377\377" \ + "\377\2\371\372\373\377\10\35I\377\233\26*S\377\4\23(Q\377\26+S\377\264" \ + "\272\307\377\373\373\374\377\237\377\377\377\377\3\367\367\371\377\230" \ + "\241\263\377\11\36I\377\207\26*S\377\2\23(Q\377\307\314\326\377\242\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \ + "\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \ + "*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2,>c\377" \ + "\376\376\376\377\244\377\377\377\377\2\371\372\373\377\10\35I\377\232" \ + "\26*S\377\2\21%O\377`m\211\377\244\377\377\377\377\3\331\333\342\377" \ + "3Dh\377\22'P\377\205\26*S\377\2\24(R\377\270\276\313\377\242\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \ + "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\17$N\377" \ + "\263\272\310\377\244\377\377\377\377\2\371\372\373\377\10\35I\377\231" \ + "\26*S\377\2\27+T\377\300\305\321\377\247\377\377\377\377\2Uc\201\377" \ + "\25)R\377\204\26*S\377\2\25)R\377\251\261\300\377\242\377\377\377\377" \ + "\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377" \ + "\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\24(R\377;Ln\377" \ + "\244\377\377\377\377\2\356\357\362\377\11\36I\377\230\26*S\377\2-@d\377" \ + "\325\331\340\377\251\377\377\377\377\2p}\226\377\14!L\377\204\26*S\377" \ + "\1\225\236\261\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221" \ + "\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23" \ + "'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \ + "\1\20$N\377\231\26*S\377\2\23'Q\377\376\376\377\377\243\377\377\377\377" \ + "\2\332\335\343\377\13\40K\377\226\26*S\377\3\25)R\377':`\377\361\362" \ + "\365\377\253\377\377\377\377\2v\202\232\377\24(Q\377\203\26*S\377\1\201" \ + "\214\242\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S" \ + "\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\231\26*S\377\2\24)R\377\351\353\357\377\243\377\377\377\377\2\277" \ + "\304\317\377\15\"M\377\226\26*S\377\2""8Il\377\362\363\366\377\255\377" \ + "\377\377\377\2my\224\377\21%O\377\202\26*S\377\1iv\221\377\242\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \ + "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\244\377\377\377\377\1\20$N\377\231\26*S\377\2\25)R\377" \ + "\345\347\354\377\243\377\377\377\377\2\233\243\265\377\21%O\377\224\26" \ + "*S\377\3\25)S\3774Ei\377\357\361\363\377\257\377\377\377\377\4L\\{\377" \ + "\23'Q\377\26*S\377M\\|\377\242\377\377\377\377\2\253\263\302\377\17#" \ + "N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \ + "\377\1\20$N\377\231\26*S\377\2\24)R\377\354\356\361\377\243\377\377\377" \ + "\377\2o|\225\377\25)R\377\224\26*S\377\2\35""1Y\377\347\351\355\377\261" \ + "\377\377\377\377\3(:`\377\26*S\3772Dh\377\242\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377" \ + "\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \ + "\377\377\377\377\1\20$N\377\231\26*S\377\2\23'Q\377\375\375\376\377\243" \ + "\377\377\377\377\1R`\177\377\224\26*S\377\2\23(Q\377\322\327\336\377" \ + "\262\377\377\377\377\3\332\336\344\377\22'P\377\24)R\377\242\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \ + "\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\25)R\377" \ + ".@d\377\243\377\377\377\377\2\376\376\376\3773Dh\377\223\26*S\377\2\22" \ + "'P\377\227\241\262\377\264\377\377\377\377\3\241\251\272\377\1\27D\377" \ + "\371\371\373\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\230\26*S\377\2\21%O\377\222\233\256\377\243\377\377\377\377\2\371" \ + "\371\372\377\21%O\377\222\26*S\377\2\24(Q\377R`~\377\266\377\377\377" \ + "\377\2O_}\377\310\314\326\377\241\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \ + "\377\1\20$N\377\230\26*S\377\2\30,T\377\370\370\372\377\243\377\377\377" \ + "\377\2\235\245\266\377\20$O\377\222\26*S\377\2!4[\377\364\365\367\377" \ + "\266\377\377\377\377\2\363\364\366\377\361\362\365\377\241\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377" \ + "\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\244\377\377\377\377\1\20$N\377\227\26*S\377\2\25)S\377]k" \ + "\207\377\244\377\377\377\377\2+=c\377\25)R\377\221\26*S\377\2\20$N\377" \ + "\226\237\262\377\332\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\227\26*S\377\2\22&P\377\361\362\364\377\243\377\377\377\377\2\330" \ + "\333\342\377\24(R\377\222\26*S\377\1FVw\377\333\377\377\377\377\2\253" \ + "\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377" \ + "\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \ + "\244\377\377\377\377\1\20$N\377\226\26*S\377\2\30,T\377\322\326\336\377" \ + "\244\377\377\377\377\1\214\225\252\377\223\26*S\377\1\321\325\335\377" \ + "\333\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364" \ + "\367\377\207\377\377\377\377\2\253\263\301\377\23'Q\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\225\26" \ + "*S\377\2\27*S\377\333\336\345\377\245\377\377\377\377\1\34/W\377\221" \ + "\26*S\377\2\24(R\377@Pr\377\334\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\253\263\301" \ + "\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \ + "\377\1\20$N\377\222\26*S\377\4\23'P\377\20$N\377lx\222\377\352\354\360" \ + "\377\245\377\377\377\377\2\204\217\245\377\17$N\377\221\26*S\377\2\23" \ + "'P\377\350\353\356\377\334\377\377\377\377\2\253\263\302\377\17#N\377" \ + "\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\257\265\304\377" \ + "\23'Q\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \ + "\1\20$N\377\215\26*S\377\202\25)R\377\5\24(R\377\30,T\377%8^\377`n\211" \ + "\377\344\346\353\377\246\377\377\377\377\2\360\361\364\377$7]\377\222" \ + "\26*S\377\1Ve\203\377\335\377\377\377\377\2\253\263\302\377\17#N\377" \ + "\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\271\277\313\377" \ + "\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \ + "\1\0\25B\377\213\6\33G\377\7\12\40J\377\"5\\\377CRt\377r~\227\377\251" \ + "\260\300\377\336\341\347\377\363\364\366\377\250\377\377\377\377\2y\204" \ + "\234\377\24(R\377\221\26*S\377\2\17$N\377\273\301\315\377\335\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377\207" \ + "\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\243\377\377\377\377\1\376\376\376\377\272\377\377\377" \ + "\377\2\307\314\326\377\10\35I\377\221\26*S\377\2\25*S\377'9`\377\336" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\336\377\377\377\377\1""1Cg\377\222\26*S\377" \ + "\2\23'Q\377\254\264\302\377\336\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\364\364\367\377\207\377\377\377\377\2\271\277\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\335\377\377\377" \ + "\377\2JZy\377\22&P\377\222\26*S\377\2!4[\377\356\360\363\377\336\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367\377" \ + "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \ + "*S\377\1\30,U\377\334\377\377\377\377\1\206\220\245\377\223\26*S\377" \ + "\2\25*S\377>Oq\377\337\377\377\377\377\2\253\263\302\377\17#N\377\221" \ + "\26*S\377\1\364\364\367\377\207\377\377\377\377\2\271\277\313\377\22" \ + "&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\333\377\377\377\377" \ + "\2v\202\232\377\22'P\377\223\26*S\377\2\16#M\377\235\245\267\377\337" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\364\364\367" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\332\377\377\377\377\2\200\212\241\377\23'Q\377" \ + "\224\26*S\377\1\20$N\377\255\377\377\377\377\6\350\352\356\377\317\323" \ + "\333\377\303\310\322\377\315\322\332\377\330\334\343\377\364\365\367" \ + "\377\255\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\357" \ + "\360\363\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\330\377\377\377\377\3\375\375\376\377" \ + "^l\210\377\25)R\377\225\26*S\377\1P_~\377\251\377\377\377\377\16\376" \ + "\376\377\377\362\363\365\377{\206\235\377\23'Q\377\21%O\377\23'Q\377" \ + "\23(Q\377\23'Q\377\22&P\377\20%O\377\37""2Z\377u\201\232\377\341\344" \ + "\351\377\374\374\374\377\251\377\377\377\377\2\253\263\302\377\17#N\377" \ + "\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377" \ + "\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\327\377\377\377\377" \ + "\3\324\327\337\3772Cg\377\21&P\377\226\26*S\377\1\226\237\262\377\250" \ + "\377\377\377\377\4\371\372\373\377We\203\377\27+T\377\22&P\377\207\26" \ + "*S\377\5\25)S\377\22'P\377\23'Q\3778Hl\377\250\257\277\377\250\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207" \ + "\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\325\377\377\377\377\3\354\355\361\377}\210\236\377\7" \ + "\35H\377\227\26*S\377\2\25)R\377\311\315\327\377\247\377\377\377\377" \ + "\3\332\335\344\377\37""3Z\377\25)R\377\215\26*S\377\3\15\"M\377Uc\201" \ + "\377\356\360\363\377\246\377\377\377\377\2\253\263\302\377\17#N\377\221" \ + "\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22" \ + "&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\324\377\377\377\377" \ + "\2\200\213\241\377\34""0X\377\231\26*S\377\2\24(R\377\357\361\363\377" \ + "\246\377\377\377\377\2\310\314\326\377\30,T\377\220\26*S\377\3\25)R\377" \ + "$7^\377\354\356\361\377\245\377\377\377\377\2\253\263\302\377\17#N\377" \ + "\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377" \ + "\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\320\377\377\377\377" \ + "\5\376\376\376\377\272\300\314\377gt\217\377\34""0W\377\17$N\377\231" \ + "\26*S\377\2\25)R\377-@d\377\246\377\377\377\377\2\360\361\364\377&9_" \ + "\377\222\26*S\377\3\25)R\377+=c\377\364\365\367\377\244\377\377\377\377" \ + "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \ + "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\317\377\377\377\377\3t\177\230\377\12\37J\377\21&O\377\234\26" \ + "*S\377\2\22&P\377{\207\236\377\245\377\377\377\377\3\375\375\376\377" \ + "3Eh\377\25)R\377\224\26*S\377\2N]}\377\376\376\377\377\243\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \ + "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\317\377\377\377\377\4\321\325\335\377r~\227\377\24)R\377" \ + "\16\"M\377\233\26*S\377\2\16#M\377\307\314\326\377\245\377\377\377\377" \ + "\2\262\271\306\377\25)R\377\225\26*S\377\2\22&P\377\310\314\326\377\243" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\322\377\377\377\377\4\276\303\317\377_m\211" \ + "\377(:`\377\17$N\377\230\26*S\377\2\22'P\377\375\375\375\377\245\377" \ + "\377\377\377\1!4[\377\226\26*S\377\2\25)S\377$6\\\377\243\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \ + "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\325\377\377\377\377\2\255\265\302\377\37""2Z\377\227\26*" \ + "S\377\2(:`\377\375\375\376\377\244\377\377\377\377\2\231\242\263\377" \ + "\21%O\377\227\26*S\377\2\24(R\377\275\302\316\377\242\377\377\377\377" \ + "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \ + "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\326\377\377\377\377\4\376\376\376\377\266\274\311\3775Fj\377\15" \ + "\"L\377\224\26*S\377\2@Qr\377\376\376\376\377\243\377\377\377\377\2\376" \ + "\376\376\377BRs\377\231\26*S\377\1lx\222\377\242\377\377\377\377\2\253" \ + "\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377" \ + "\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \ + "\331\377\377\377\377\3\221\233\256\377!4[\377\24)R\377\222\26*S\377\1" \ + "Tb\201\377\244\377\377\377\377\2\366\367\370\377\23'Q\377\231\26*S\377" \ + "\1\37""3Z\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221\26*" \ + "S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\332\377\377\377\377\3\353\355" \ + "\361\377HXx\377\21%O\377\220\26*S\377\2\25)S\377jw\221\377\244\377\377" \ + "\377\377\2\220\232\255\377\21%O\377\231\26*S\377\2\12\37J\377\324\327" \ + "\337\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\334\377\377\377\377\2\215\227\253" \ + "\377\20%O\377\217\26*S\377\2\22'P\377\214\226\252\377\244\377\377\377" \ + "\377\2)<a\377\25)R\377\231\26*S\377\2\21%O\377x\204\234\377\241\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207" \ + "\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\335\377\377\377\377\2\310\314\326\377\25)S\377\216\26" \ + "*S\377\2\20$O\377\245\254\274\377\243\377\377\377\377\2\353\354\360\377" \ + "\24)R\377\233\26*S\377\1""3Eh\377\241\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \ + "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\336\377\377" \ + "\377\377\2\304\312\324\377\13\40K\377\215\26*S\377\2\15\"L\377\306\313" \ + "\325\377\243\377\377\377\377\2\304\311\324\377\25)R\377\233\26*S\377" \ + "\2);a\377\367\367\371\377\240\377\377\377\377\2\253\263\302\377\17#N" \ + "\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\337\377\377\377" \ + "\377\2\313\317\331\377\27+T\377\214\26*S\377\2\12\40K\377\336\340\346" \ + "\377\243\377\377\377\377\1\247\257\276\377\234\26*S\377\2\40""3Z\377" \ + "\351\353\357\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\340\377\377\377\377\2\234\245" \ + "\266\377\15!L\377\213\26*S\377\2\11\36I\377\360\361\364\377\243\377\377" \ + "\377\377\1}\210\237\377\234\26*S\377\2\33.V\377\341\343\351\377\240\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377" \ + "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \ + "*S\377\1\30,U\377\341\377\377\377\377\1dq\215\377\213\26*S\377\1\7\34" \ + "H\377\244\377\377\377\377\1[j\206\377\234\26*S\377\2\25)R\377\332\335" \ + "\344\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377\2\351\353\357" \ + "\377\30,U\377\212\26*S\377\1\7\34H\377\244\377\377\377\377\1;Ln\377\234" \ + "\26*S\377\2\24(Q\377\270\276\313\377\240\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271" \ + "\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\342\377" \ + "\377\377\377\2\251\261\300\377\16\"M\377\211\26*S\377\1\36""1Y\377\244" \ + "\377\377\377\377\1\37""2Z\377\234\26*S\377\2\24(Q\377\251\260\277\377" \ + "\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1Xf\203\377\213\\" \ + "j\207\377\7dq\214\377s\177\230\377\203\215\244\377\226\237\262\377\266" \ + "\274\311\377\314\320\331\377\350\352\356\377\254\377\377\377\377\1""7" \ + "Hk\377\211\26*S\377\1#6]\377\244\377\377\377\377\1\22&P\377\234\26*S" \ + "\377\2\24(R\377\222\234\257\377\240\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \ + "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \ + "\377\377\1\20$N\377\220\26*S\377\5\27+T\377\30,T\377\"5\\\377\213\226" \ + "\252\377\373\373\374\377\251\377\377\377\377\2\234\244\266\377\21%O\377" \ + "\207\26*S\377\2\25*S\377<Mo\377\244\377\377\377\377\1\6\33G\377\234\26" \ + "*S\377\2\24)R\377\200\212\241\377\240\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \ + "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \ + "\377\377\1\20$N\377\223\26*S\377\4\20$N\377\26*S\377\\j\207\377\326\331" \ + "\340\377\250\377\377\377\377\1\26)S\377\207\26*S\377\2\25*S\377<Mo\377" \ + "\243\377\377\377\377\2\361\362\364\377\10\35H\377\234\26*S\377\2\25)" \ + "R\377nz\223\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\226\26*S\377\3\17$N\377\227\240\262\377\374\374\375\377\246\377" \ + "\377\377\377\2\214\225\252\377\25)R\377\206\26*S\377\2\25*S\377<Mo\377" \ + "\243\377\377\377\377\2\357\361\363\377\10\35H\377\234\26*S\377\2\25)" \ + "R\377o{\224\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\227\26*S\377\2\23(Q\377Ra\177\377\246\377\377\377\377\2\333\336" \ + "\344\377\31-U\377\206\26*S\377\2\25*S\377<Mo\377\243\377\377\377\377" \ + "\2\335\340\346\377\11\36J\377\234\26*S\377\2\25)R\377o{\224\377\240\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377" \ + "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \ + "*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377\2\20$N" \ + "\377\\j\206\377\245\377\377\377\377\2\366\367\370\377$7]\377\206\26*" \ + "S\377\2\25*S\377<Mo\377\243\377\377\377\377\2\334\337\345\377\11\36J" \ + "\377\234\26*S\377\2\25)R\377o{\224\377\240\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377" \ + "\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \ + "\377\377\377\377\1\20$N\377\232\26*S\377\1\236\246\267\377\245\377\377" \ + "\377\377\2Tb\200\377\23(Q\377\205\26*S\377\2\25*S\377<Mo\377\243\377" \ + "\377\377\377\2\353\355\360\377\10\35I\377\234\26*S\377\2\25)R\377o{\224" \ + "\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347" \ + "\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\232" \ + "\26*S\377\1\27+T\377\245\377\377\377\377\2\247\257\276\377\16\"M\377" \ + "\205\26*S\377\2\25)S\377>Oq\377\243\377\377\377\377\2\361\363\365\377" \ + "\10\35H\377\234\26*S\377\2\25)R\377o{\224\377\240\377\377\377\377\2\253" \ + "\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377" \ + "\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377" \ + "\244\377\377\377\377\1\20$N\377\232\26*S\377\2\21&O\377t\200\231\377" \ + "\244\377\377\377\377\2\365\366\367\377\11\36J\377\206\26*S\377\1\37""2" \ + "Z\377\244\377\377\377\377\1\6\33G\377\234\26*S\377\2\25)R\377nz\224\377" \ + "\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26" \ + "*S\377\2/Ae\377\370\370\371\377\244\377\377\377\377\1\"5\\\377\206\26" \ + "*S\377\1\33/W\377\244\377\377\377\377\1\16#M\377\234\26*S\377\2\24)R" \ + "\377\204\217\244\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221" \ + "\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22" \ + "&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377" \ + "\1\20$N\377\233\26*S\377\2\36""1Y\377\351\353\357\377\244\377\377\377" \ + "\377\1EUv\377\206\26*S\377\1\4\32F\377\244\377\377\377\377\1!4[\377\234" \ + "\26*S\377\2\24(R\377\224\235\260\377\240\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271" \ + "\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377" \ + "\377\377\377\1\20$N\377\233\26*S\377\2\22&P\377\331\334\343\377\244\377" \ + "\377\377\377\1dq\215\377\206\26*S\377\2\10\35H\377\373\373\374\377\243" \ + "\377\377\377\377\1:Kn\377\234\26*S\377\2\24(Q\377\253\262\301\377\240" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26*S\377" \ + "\2\23'Q\377\261\267\305\377\244\377\377\377\377\1y\205\234\377\206\26" \ + "*S\377\2\11\36I\377\357\360\363\377\243\377\377\377\377\1[i\205\377\234" \ + "\26*S\377\2\23(Q\377\315\321\332\377\240\377\377\377\377\2\253\263\302" \ + "\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271" \ + "\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377" \ + "\377\377\377\1\20$N\377\233\26*S\377\2\23(Q\377\231\242\263\377\244\377" \ + "\377\377\377\1\216\227\253\377\206\26*S\377\2\13\40K\377\333\336\344" \ + "\377\243\377\377\377\377\1~\211\240\377\234\26*S\377\2\27+T\377\334\337" \ + "\345\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377" \ + "\233\26*S\377\2\24(Q\377\223\234\260\377\244\377\377\377\377\2\237\247" \ + "\270\377\25)R\377\205\26*S\377\2\16\"M\377\273\301\315\377\243\377\377" \ + "\377\377\1\251\261\300\377\234\26*S\377\2\36""1Y\377\346\350\354\377" \ + "\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26" \ + "*S\377\2\23'Q\377\257\266\304\377\244\377\377\377\377\2\244\253\274\377" \ + "\25)R\377\205\26*S\377\2\20%O\377\241\251\272\377\243\377\377\377\377" \ + "\2\310\314\326\377\25)R\377\233\26*S\377\2&9_\377\362\363\366\377\240" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\233\26*S\377" \ + "\2\23'P\377\317\323\333\377\244\377\377\377\377\2\244\253\274\377\25" \ + ")R\377\205\26*S\377\2\23'Q\377\210\222\247\377\243\377\377\377\377\2" \ + "\361\362\365\377\24(Q\377\233\26*S\377\1""0Bf\377\241\377\377\377\377" \ + "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \ + "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\244\377\377\377\377\1\20$N\377\233\26*S\377\2\31-U\377\346\350" \ + "\354\377\244\377\377\377\377\2\244\253\274\377\25)R\377\206\26*S\377" \ + "\1cp\214\377\244\377\377\377\377\2""7Hk\377\25)R\377\231\26*S\377\2\22" \ + "'P\377er\214\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\233\26*S\377\2&9_\377\361\363\365\377\244\377\377\377\377\2\244" \ + "\254\274\377\25)R\377\206\26*S\377\2O^}\377\376\376\377\377\243\377\377" \ + "\377\377\2\245\255\275\377\17$N\377\231\26*S\377\2\12\37J\377\306\313" \ + "\325\377\241\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377" \ + "\232\26*S\377\2\25)S\377AQs\377\245\377\377\377\377\1\233\244\265\377" \ + "\207\26*S\377\2<Mo\377\376\376\376\377\243\377\377\377\377\2\376\376" \ + "\376\377\32.V\377\231\26*S\377\1\30,U\377\242\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377" \ + "\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \ + "\377\377\377\377\1\20$N\377\232\26*S\377\2\11\36I\377\277\304\320\377" \ + "\245\377\377\377\377\1\212\224\251\377\207\26*S\377\2$7^\377\375\375" \ + "\376\377\244\377\377\377\377\1Tb\201\377\231\26*S\377\1iv\220\377\242" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\232\26*S\377" \ + "\1BSt\377\246\377\377\377\377\1y\204\234\377\207\26*S\377\2\16\"M\377" \ + "\364\365\367\377\244\377\377\377\377\2\277\304\320\377\14!L\377\227\26" \ + "*S\377\2\24(Q\377\272\300\314\377\242\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \ + "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377" \ + "\377\377\1\20$N\377\231\26*S\377\2\22&P\377\315\321\332\377\246\377\377" \ + "\377\377\1]k\210\377\207\26*S\377\2\17$N\377\267\275\312\377\245\377" \ + "\377\377\377\2O^}\377\25)R\377\225\26*S\377\2\25)S\377\40""3Z\377\243" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355" \ + "\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N\377\230\26*S\377" \ + "\2\23(Q\377\245\255\275\377\247\377\377\377\377\1>Nq\377\207\26*S\377" \ + "\2\22'P\377gt\217\377\245\377\377\377\377\2\340\342\350\377\27+T\377" \ + "\225\26*S\377\2\22&P\377\313\317\330\377\243\377\377\377\377\2\253\263" \ + "\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377" \ + "\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244" \ + "\377\377\377\377\1\20$N\377\227\26*S\377\2\27+T\377\230\240\263\377\250" \ + "\377\377\377\377\1\33/W\377\210\26*S\377\1\35""0X\377\246\377\377\377" \ + "\377\2\207\221\247\377\21&O\377\223\26*S\377\3\25)R\377Tc\201\377\376" \ + "\376\376\377\243\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S" \ + "\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\20$N" \ + "\377\225\26*S\377\3\14!L\3778Jl\377\327\332\341\377\250\377\377\377\377" \ + "\2\347\352\355\377\10\36I\377\210\26*S\377\2\24(R\377\345\350\354\377" \ + "\246\377\377\377\377\2t\200\230\377\23'Q\377\221\26*S\377\3\25)R\377" \ + "\77Oq\377\373\373\374\377\244\377\377\377\377\2\253\263\302\377\17#N" \ + "\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377" \ + "\377\1\20$N\377\220\26*S\377\6\25)R\377\23'Q\377\17#N\377\35""0X\377" \ + "GWx\377\254\264\302\377\252\377\377\377\377\2\221\232\256\377\17$N\377" \ + "\210\26*S\377\2\25*S\377\276\304\317\377\247\377\377\377\377\2iv\220" \ + "\377\22'P\377\217\26*S\377\4\21%O\377DTu\377\366\367\371\377\376\376" \ + "\376\377\244\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\15\"L\377" \ + "\214\23(Q\377\202\23'Q\377\7\22&P\377\21%O\377+=c\377fs\216\377\277\305" \ + "\320\377\375\375\375\377\376\376\376\377\253\377\377\377\377\2=Np\377" \ + "\25)R\377\211\26*S\377\1\207\221\246\377\250\377\377\377\377\2\263\272" \ + "\307\377\17#N\377\215\26*S\377\3\20$N\377\220\231\255\377\376\376\376" \ + "\377\246\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347" \ + "\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\221\26*S\377\1\30,U\377\244\377\377\377\377\1\323\327\337\377" \ + "\214\324\330\337\377\4\330\334\342\377\342\345\352\377\360\361\364\377" \ + "\375\375\376\377\257\377\377\377\377\2\357\360\363\377\"5\\\377\212\26" \ + "*S\377\1=Np\377\251\377\377\377\377\17\360\361\364\377\220\231\255\377" \ + "5Fj\377\7\34H\377\15\"M\377\21&O\377\23'Q\377\22'P\377\22&P\377\17#N" \ + "\377\13\40K\377\14!L\377DTu\377\226\237\262\377\353\355\360\377\250\377" \ + "\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377" \ + "\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26" \ + "*S\377\1\30,U\377\344\377\377\377\377\2\322\326\336\377\27+T\377\212" \ + "\26*S\377\2\7\35H\377\374\374\375\377\253\377\377\377\377\10\350\352" \ + "\356\377\247\257\276\377v\202\232\377\\j\207\377dr\215\377q}\226\377" \ + "\225\235\260\377\307\314\326\377\254\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277" \ + "\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\344\377\377" \ + "\377\377\2jw\221\377\25)R\377\212\26*S\377\2\17$N\377\223\234\257\377" \ + "\337\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\343\377\377\377\377\2\370\371\372\377" \ + "\15\"M\377\214\26*S\377\2""7Il\377\376\376\376\377\336\377\377\377\377" \ + "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \ + "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\343\377\377\377\377\2\203\215\243\377\23'Q\377\214\26*S\377\2" \ + "\37""2Z\377\353\354\360\377\336\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\343\377\377\377" \ + "\377\1""0Bf\377\215\26*S\377\2\23'Q\377\247\256\276\377\336\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \ + "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\342\377\377\377\377\2\245\255\275\377\16#M\377\216\26*S\377" \ + "\1\"4[\377\336\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\341\377\377\377\377\2\352\354\360" \ + "\377\30,T\377\217\26*S\377\2\20$N\377\267\275\312\377\335\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \ + "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\341\377\377\377\377\1v\202\231\377\221\26*S\377\1Ud\202\377" \ + "\335\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\340\377\377\377\377\2\305\312\324\377" \ + "\11\36I\377\221\26*S\377\2\20$N\377\356\357\363\377\334\377\377\377\377" \ + "\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377" \ + "\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30" \ + ",U\377\336\377\377\377\377\3\376\376\377\377\367\370\371\377':`\377\222" \ + "\26*S\377\2\23(Q\377IYy\377\334\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\337\377\377\377" \ + "\377\2N]}\377\24(Q\377\224\26*S\377\1\320\324\335\377\333\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \ + "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\336\377\377\377\377\2mz\223\377\25)R\377\225\26*S\377\1T" \ + "c\201\377\333\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\335\377\377\377\377\2\200\213\241" \ + "\377\21%O\377\226\26*S\377\2\12\37J\377\264\272\307\377\332\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207\377" \ + "\377\377\377\2\271\277\313\377\22&P\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\334\377\377\377\377\2\233\244\265\377\25)R\377\230\26*S\377" \ + "\2+=c\377\366\367\370\377\265\377\377\377\377\2\373\373\374\377\355\356" \ + "\361\377\242\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377" \ + "\1\347\351\355\377\207\377\377\377\377\2\271\277\313\377\22&P\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\221\26*S\377\1\30,U\377\333\377\377\377\377\2o|\225\377" \ + "\23'Q\377\231\26*S\377\2\23(Q\377p}\226\377\265\377\377\377\377\3We\203" \ + "\377\30,T\377\245\255\275\377\241\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\277\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\331\377\377\377" \ + "\377\3\370\370\372\377ly\222\377\21%O\377\233\26*S\377\2\15!L\377\264" \ + "\272\310\377\263\377\377\377\377\5\300\305\320\377\25*S\377\26*S\377" \ + "\"5\\\377\366\366\370\377\240\377\377\377\377\2\253\263\302\377\17#N" \ + "\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\271\276\313" \ + "\377\22&P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\330\377\377\377" \ + "\377\2\371\371\372\3774Ei\377\236\26*S\377\2\35""1Y\377\373\373\374\377" \ + "\261\377\377\377\377\2\367\370\371\377\25*R\377\202\26*S\377\2\24(R\377" \ + "\214\226\252\377\240\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\347\351\355\377\207\377\377\377\377\2\304\311\323\377\21%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\1\30,U\377\327\377\377\377\377\3\241\252" \ + "\272\377\34""0X\377\24(Q\377\236\26*S\377\4\24(Q\3776Gk\377\370\371\372" \ + "\377\376\377\377\377\257\377\377\377\377\2DTu\377\24(R\377\203\26*S\377" \ + "\2\20%O\377\333\337\345\377\237\377\377\377\377\2\253\263\302\377\17" \ + "#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\313\320\331" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\325\377\377\377" \ + "\377\3\347\351\355\377Q`~\377\15\"M\377\241\26*S\377\2\25)R\377Zh\205" \ + "\377\257\377\377\377\377\2r~\227\377\21%O\377\205\26*S\377\1Tb\201\377" \ + "\237\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\324\377\377\377\377\3\202\215\243\377" \ + "\37""2Y\377\25)R\377\243\26*S\377\2\24(Q\377Tc\201\377\255\377\377\377" \ + "\377\2\205\217\245\377\24(R\377\206\26*S\377\2\20%O\377\317\322\333\377" \ + "\236\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351" \ + "\355\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\221\26*S\377\1\30,U\377\321\377\377\377\377\4\375\375\375\377" \ + "\244\254\274\377.Ae\377\16#M\377\246\26*S\377\3\20%O\377`n\212\377\375" \ + "\375\375\377\252\377\377\377\377\2\207\221\246\377\15!L\377\210\26*S" \ + "\377\2\40""3Z\377\370\371\372\377\235\377\377\377\377\2\253\263\302\377" \ + "\17#N\377\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\313\317" \ + "\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\317\377\377" \ + "\377\377\4\374\374\375\377\252\262\300\377\37""2Z\377\25)R\377\252\26" \ + "*S\377\1GWw\377\251\377\377\377\377\2z\206\235\377\25)R\377\212\26*S" \ + "\377\1\232\243\264\377\235\377\377\377\377\2\253\263\302\377\17#N\377" \ + "\221\26*S\377\1\347\351\355\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\221\26*S\377\1\30,U\377\315\377\377\377\377" \ + "\5\335\340\346\377fs\216\377*<b\377\21%O\377\25*S\377\253\26*S\377\3" \ + "\23'P\377/@e\377\331\334\343\377\245\377\377\377\377\3\374\374\375\377" \ + "HXx\377\20%O\377\213\26*S\377\2\25)R\377\365\366\370\377\234\377\377" \ + "\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\355\377\207" \ + "\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S" \ + "\377\1\30,U\377\311\377\377\377\377\6\373\374\375\377\334\337\345\377" \ + "\247\257\276\377:Km\377\10\35I\377\24(R\377\260\26*S\377\3\11\36I\377" \ + "\224\235\260\377\374\374\375\377\242\377\377\377\377\3\300\305\320\377" \ + "\32.V\377\24(R\377\214\26*S\377\2\24(R\377Sb\200\377\234\377\377\377" \ + "\377\2\253\263\302\377\17#N\377\221\26*S\377\1\347\351\356\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\221\26*S\377" \ + "\1\30,U\377\307\377\377\377\377\4\316\322\333\377gt\216\377\"5\\\377" \ + "\32-V\377\266\26*S\377\2#6\\\377\321\325\335\377\237\377\377\377\377" \ + "\2\372\373\373\377HXx\377\220\26*S\377\2\27+T\377\335\340\346\377\233" \ + "\377\377\377\377\2\253\263\302\377\17#N\377\221\26*S\377\1\333\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\221\26*S\377\1\30,U\377\301\377\377\377\377\10\351\353\357\377\276\304" \ + "\317\377\230\241\263\377mz\223\377DTu\377\33.W\377\13\40K\377\22&P\377" \ + "\271\26*S\377\3\15\"M\377\\j\207\377\305\312\324\377\233\377\377\377" \ + "\377\4\342\345\351\377{\206\236\377\33.V\377\23(Q\377\220\26*S\377\2" \ + "\25)R\3770Bf\377\233\377\377\377\377\2\253\263\302\377\17#N\377\221\26" \ + "*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\221\26*S\377\2\30,T\377\362\363\365\377\264\360\361" \ + "\364\377\17\356\357\362\377\355\357\362\377\355\356\362\377\351\353\357" \ + "\377\350\352\356\377\334\337\345\377\306\313\324\377\253\261\300\377" \ + "\203\217\244\377[h\205\3770Bf\377\10\35I\377\14!L\377\20%O\377\24(Q\377" \ + "\300\26*S\377\4\17$N\3779Jl\377\304\311\324\377\364\365\367\377\225\377" \ + "\377\377\377\5\365\366\370\377\336\341\347\377^l\211\377\15\"M\377\25" \ + ")R\377\223\26*S\377\2\23'Q\377\222\234\257\377\231\360\361\364\377\3" \ + "\363\364\366\377\242\252\272\377\17$N\377\221\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\222\26*S\377\265#6\\\377\1\37""2Z\377\202\36""1Y\377\10\27+T\377\26" \ + "*S\377\21&O\377\22&P\377\22'P\377\23(Q\377\24(R\377\25)R\377\305\26*" \ + "S\377\6\25)R\377\22'P\377'9_\377EUv\377\233\243\265\377\362\363\365\377" \ + "\217\377\377\377\377\4\373\373\374\377\250\260\277\377Sb\200\377,>c\377" \ + "\202\24(R\377\226\26*S\377\1\32-V\377\232#6\\\377\1\36""2Y\377\222\26" \ + "*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\233\26*S\377\11\25)S\377\17#N\377\6\33" \ + "G\377&9_\377Xf\204\377\201\214\242\377\236\246\267\377\265\274\311\377" \ + "\274\301\315\377\203\305\312\324\377\11\274\302\316\377\262\271\306\377" \ + "\236\246\267\377\200\213\242\377Yg\205\377,>c\377\4\32F\377\15\"M\377" \ + "\24)R\377\307\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317" \ + "\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336" \ + "\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377" \ + "\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377" \ + "\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377" \ + "\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207" \ + "\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377" \ + "\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367" \ + "\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20" \ + "%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \ + "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \ + "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \ + "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \ + "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \ + "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330" \ + "\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313" \ + "\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377\20%O\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377" \ + "\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\313\317\330\377" \ + "\20%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377" \ + "\207\377\377\377\377\2\313\317\330\377\20%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\312\317\330" \ + "\377\21%O\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344" \ + "\377\207\377\377\377\377\2\333\336\344\377\17$N\377\207\26*S\377\1\31" \ + ",U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377\377\2\334" \ + "\340\346\377\17$N\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377" \ + "\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\332" \ + "\336\344\377\207\377\377\377\377\2\334\340\346\377\17$N\377\207\26*S" \ + "\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\367\26*S\377\1\332\336\344\377\207\377\377\377" \ + "\377\2\334\340\346\377\17$N\377\207\26*S\377\1\31,U\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*" \ + "S\377\1\333\336\344\377\207\377\377\377\377\2\334\340\346\377\17$N\377" \ + "\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\367\26*S\377\1\321\325\335\377\207\377" \ + "\377\377\377\2\334\340\346\377\17$N\377\207\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\367\26*S\377\1\333\336\344\377\207\377\377\377\377\2\330\334\342\377" \ + "\17$N\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\1\345\347\354\377" \ + "\207\377\377\377\377\2\306\313\324\377\21%O\377\207\26*S\377\1\31,U\377" \ + "\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\367\26*S\377\1\356\360\363\377\207\377\377\377\377\2\265\273\310" \ + "\377\22'P\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\367\26*S\377\210\377\377" \ + "\377\377\2\253\263\301\377\23'Q\377\207\26*S\377\1\31,U\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\365" \ + "\26*S\377\2\24)R\3779Jm\377\210\377\377\377\377\2\220\231\255\377\25" \ + ")S\377\207\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\377\26*S\377\365\26*S\377\2\22&P\377u\201\231" \ + "\377\210\377\377\377\377\1ly\223\377\210\26*S\377\1\31,U\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\365\26*S\377\2\17#N\377\263\272\307\377\210\377\377\377\377\1O_}\377" \ + "\210\26*S\377\1\31,U\377\212\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225" \ + "\251\377\20$N\377\377\26*S\377\365\26*S\377\2\23'Q\377\366\367\370\377" \ + "\210\377\377\377\377\1*<a\377\210\26*S\377\1\27+T\377\212\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\365\26*" \ + "S\377\1:Jm\377\211\377\377\377\377\1\15\"M\377\207\26*S\377\2\25)R\377" \ + "-\77d\377\212\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2" \ + "4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\365\26*S\377\1cp\214\377\210\377\377\377\377\2\262\271" \ + "\307\377\15\"L\377\207\26*S\377\2\25)R\3777Hk\377\212\377\377\377\0\2" \ + "\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207" \ + "\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\364\26*S\377" \ + "\2\17$N\377\253\262\301\377\210\377\377\377\377\2O^}\377\23(Q\377\207" \ + "\26*S\377\2\24(Q\377JYy\377\212\377\377\377\0\2\217\230\254\377\20$N" \ + "\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214" \ + "\225\251\377\20$N\377\377\26*S\377\364\26*S\377\1\22&P\377\210\377\377" \ + "\377\377\2\366\367\370\377!4[\377\210\26*S\377\2\22&P\377my\222\377\212" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \ + "\377\363\26*S\377\2\24(R\377\207\222\247\377\210\377\377\377\377\2\334" \ + "\337\345\377\32.V\377\210\26*S\377\2\20%O\377\217\231\254\377\212\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\363\26*S\377\2\32.V\377\343\345\352\377\210\377\377\377\377\2\244\253" \ + "\273\377\25)R\377\210\26*S\377\2\16\"M\377\300\306\320\377\212\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\362" \ + "\26*S\377\2\25)R\377BRt\377\211\377\377\377\377\1);a\377\211\26*S\377" \ + "\1\13\40K\377\213\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\377\26*S\377\362\26*S\377\2\16#M\377\336\341\347\377\210\377\377" \ + "\377\377\2\303\310\322\377\13\40K\377\211\26*S\377\1#6]\377\213\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\362" \ + "\26*S\377\1cq\214\377\211\377\377\377\377\2Yg\205\377\25)S\377\211\26" \ + "*S\377\1DTu\377\213\377\377\377\0\2\217\230\254\377\20$N\377\207\26*" \ + "S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\361\26*S\377\2\14!L\377\327\333\342\377\210\377" \ + "\377\377\377\2\375\374\375\377#6]\377\212\26*S\377\1jw\221\377\213\377" \ + "\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372" \ + "\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377" \ + "\360\26*S\377\2\22'P\377\205\217\244\377\211\377\377\377\377\2\210\223" \ + "\250\377\21%O\377\211\26*S\377\2\21%O\377\246\255\275\377\213\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\360" \ + "\26*S\377\2""7Hk\377\373\374\374\377\210\377\377\377\377\2\351\354\357" \ + "\377\24(R\377\212\26*S\377\1\10\35I\377\214\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\214\225\251\377\20$N\377\377\26*S\377\357\26*S\377\2\17$N\377" \ + "\312\317\330\377\211\377\377\377\377\1\202\215\243\377\212\26*S\377\2" \ + "\25)R\377DTu\377\214\377\377\377\0\2\217\230\254\377\20$N\377\207\26" \ + "*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377" \ + "\20$N\377\377\26*S\377\357\26*S\377\1\255\265\303\377\212\377\377\377" \ + "\377\1\23'Q\377\212\26*S\377\2\24(Q\377\264\272\307\377\214\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\355\26*" \ + "S\377\2\20$N\377fs\215\377\212\377\377\377\377\2JZy\377\24(Q\377\212" \ + "\26*S\377\2!4[\377\377\377\377f\214\377\377\377\0\2\217\230\254\377\20" \ + "$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2" \ + "\214\225\251\377\20$N\377\377\26*S\377\354\26*S\377\2\24(Q\377FVv\377" \ + "\212\377\377\377\377\1\303\310\322\377\213\26*S\377\2\25)R\377GWw\377" \ + "\215\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377" \ + "\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26" \ + "*S\377\353\26*S\377\2\25)R\3778Jl\377\213\377\377\377\377\1\24(R\377" \ + "\213\26*S\377\2\11\36I\377\330\334\343\377\215\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377" \ + "\377\377\2\214\225\251\377\20$N\377\377\26*S\377\352\26*S\377\3\23'Q" \ + "\3776Gk\377\370\370\372\377\212\377\377\377\377\2cq\214\377\24)R\377" \ + "\213\26*S\377\1IYy\377\216\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251" \ + "\377\20$N\377\377\26*S\377\351\26*S\377\2\25)R\377@Qr\377\213\377\377" \ + "\377\377\2\257\265\303\377\16#M\377\213\26*S\377\2\25)R\377\274\302\315" \ + "\377\216\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4F" \ + "i\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\350\26*S\377\3\15\"L\377ly\223\377\375\375\375\377\212" \ + "\377\377\377\377\1\316\322\332\377\214\26*S\377\2\25)R\377.Ae\377\217" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \ + "\377\346\26*S\377\202\25)R\377\1\213\225\251\377\213\377\377\377\377" \ + "\2\362\363\366\377(:a\377\214\26*S\377\2\25)R\377\336\340\346\377\217" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371" \ + "\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S" \ + "\377\346\26*S\377\2#6\\\377\342\344\351\377\213\377\377\377\377\2\370" \ + "\371\372\3774Fi\377\214\26*S\377\2\25*S\377Yg\205\377\220\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\343\26*" \ + "S\377\4\25)R\377\11\36I\377y\204\234\377\365\366\370\377\213\377\377" \ + "\377\377\3\374\374\374\377\77Pq\377\24(Q\377\215\26*S\377\221\377\377" \ + "\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373" \ + "\377\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\342" \ + "\26*S\377\3\24(R\377=Np\377\333\337\345\377\214\377\377\377\377\2\373" \ + "\374\374\377Q`\177\377\216\26*S\377\1\270\276\312\377\221\377\377\377" \ + "\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377" \ + "\207\377\377\377\377\2\214\225\251\377\20$N\377\377\26*S\377\340\26*" \ + "S\377\4\20%O\377\40""3Z\377\306\313\325\377\374\374\375\377\214\377\377" \ + "\377\377\3\374\374\375\377=Np\377\24(Q\377\214\26*S\377\2\23'Q\377M]" \ + "|\377\222\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377\2""4" \ + "Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20$N\377" \ + "\377\26*S\377\335\26*S\377\4\22&P\377\17#M\377P_~\377\260\266\304\377" \ + "\216\377\377\377\377\3\347\351\355\377\77Oq\377\25)R\377\215\26*S\377" \ + "\1""2Dh\377\223\377\377\377\0\2\217\230\254\377\20$N\377\207\26*S\377" \ + "\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\214\225\251\377\20" \ + "$N\377\377\26*S\377\333\26*S\377\4\27+T\377\35""0X\377dr\215\377\346" \ + "\351\355\377\217\377\377\377\377\2\343\345\352\377\40""4[\377\216\26" \ + "*S\377\2\23(Q\377\322\326\336\377\223\377\377\377\0\2\217\230\254\377" \ + "\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377" \ + "\2\214\225\251\377\20$N\377\377\26*S\377\326\26*S\377\7\23'Q\377\15\"" \ + "M\377\6\33G\3777Hk\377\201\214\242\377\312\317\330\377\365\366\370\377" \ + "\220\377\377\377\377\3\246\256\276\377\33.V\377\25)R\377\215\26*S\377" \ + "\2\25)R\377\277\305\320\377\224\377\377\377\0\2\217\230\254\377\20$N" \ + "\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377\377\2\210" \ + "\222\247\377\11\36I\377\377\17$N\377\320\17$N\377\11\24(Q\377\32-V\377" \ + "\40""3Z\377-\77d\377<Mo\377IYy\377n{\224\377\260\267\305\377\375\375" \ + "\375\377\222\377\377\377\377\3\362\363\365\377iu\220\377\11\36J\377\216" \ + "\26*S\377\2\21%O\377\212\223\250\377\225\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\207\377\377\377" \ + "\377\2\370\370\372\377\360\362\364\377\377\361\362\364\377\320\361\362" \ + "\364\377\5\362\363\365\377\363\364\366\377\365\366\367\377\370\370\372" \ + "\377\374\374\374\377\225\377\377\377\377\2\315\322\332\377\35""0X\377" \ + "\217\26*S\377\2\25)S\377\234\244\266\377\226\377\377\377\0\2\217\230" \ + "\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377" \ + "\377\377\361\377\377\377\377\3\353\355\361\377p|\225\377\22'P\377\217" \ + "\26*S\377\2\17$N\377\216\230\254\377\227\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377" \ + "\377\357\377\377\377\377\3\371\371\372\377\240\250\271\377\16#M\377\221" \ + "\26*S\377\1\212\224\250\377\230\377\377\377\0\2\217\230\254\377\20$N" \ + "\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377\377\356" \ + "\377\377\377\377\3\234\244\266\377.@e\377\23'Q\377\220\26*S\377\2\24" \ + "(Q\377\272\300\314\377\231\377\377\377\0\2\217\230\254\377\20$N\377\207" \ + "\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377\377\353\377\377" \ + "\377\377\4\351\353\357\377\236\246\267\377#5]\377\15\"M\377\220\26*S" \ + "\377\3\25)R\377);a\377\300\305\321\377\232\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377" \ + "\377\351\377\377\377\377\3\344\346\353\377_l\210\377\30,T\377\222\26" \ + "*S\377\2\24)R\377.Ae\377\234\377\377\377\0\2\217\230\254\377\20$N\377" \ + "\207\26*S\377\2""4Fi\377\371\372\373\377\377\377\377\377\377\346\377" \ + "\377\377\377\5\305\312\324\377u\201\231\3774Fi\377\16#M\377\23'P\377" \ + "\221\26*S\377\3\25)S\377\12\37J\377\220\232\255\377\235\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\207\26*S\377\2""4Fi\377\371\372\373\377\377" \ + "\377\377\377\377\340\377\377\377\377\10\372\372\373\377\360\361\364\377" \ + "\340\343\350\377\251\260\277\377Wf\203\377\15!L\377\16\"M\377\25)R\377" \ + "\223\26*S\377\3\24(Q\3775Fj\377\334\340\345\377\236\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\207\26*S\377\1""6Gk\377\377\377\377\377\377\333" \ + "\377\377\377\377\13\362\363\365\377\334\336\345\377\313\320\331\377\236" \ + "\247\270\377my\223\377:Kn\377.@d\377%8^\377\30,U\377\24(Q\377\25)R\377" \ + "\224\26*S\377\3\25)R\377\14!L\377\243\253\273\377\240\377\377\377\0\2" \ + "\217\230\254\377\20$N\377\207\26*S\377\2\24(Q\377\6\34G\377\377\6\33" \ + "G\377\332\6\33G\377\5\10\35I\377\12\37J\377\13\40K\377\16#M\377\22&P" \ + "\377\230\26*S\377\3\23'Q\377\25)R\377o{\224\377\242\377\377\377\0\2\217" \ + "\230\254\377\20$N\377\377\26*S\377\377\26*S\377\2\26*S\377P_}\377\244" \ + "\377\377\377\0\2\217\230\254\377\20$N\377\377\26*S\377\374\26*S\377\4" \ + "\16#M\377\27+T\377\214\226\252\377\341\343\351\377\245\377\377\377\0" \ + "\2\217\230\254\377\20$N\377\377\26*S\377\370\26*S\377\5\25)R\377\21%" \ + "O\377\36""1Y\377BSt\377\237\247\270\377\250\377\377\377\0\2\217\230\254" \ + "\377\20$N\377\377\26*S\377\366\26*S\377\4\23'Q\377\14\40K\377>Np\377" \ + "\261\271\306\377\253\377\377\377\0\2\217\230\254\377\20$N\377\377\26" \ + "*S\377\356\26*S\377\11\25)R\377\23'Q\377\20$N\377\14!L\377\11\36J\377" \ + "&8^\377We\203\377\202\215\243\377\267\275\311\377\256\377\377\377\0\2" \ + "\224\235\260\377\33/W\377\377!4[\377\353!4[\377\7\"5\\\377$7]\377&9_" \ + "\3776Gk\377Zh\205\377\212\224\251\377\304\311\323\377\377\377\377\377" \ + "\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377" \ + "\377\0\377\377\377\377\0\377\377\377\377\0\377\377\377\377\0\377\377" \ + "\377\377\0\377\377\377\377\0\377\377\377\377\0\370\377\377\377\0") + + diff --git a/bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend b/bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend new file mode 100644 index 00000000..80f4f74a --- /dev/null +++ b/bsp/meta-boundary/recipes-core/psplash/psplash_git.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SPLASH_IMAGES = "file://boundary-logo-img.h;outsuffix=default" diff --git a/bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend b/bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend new file mode 100644 index 00000000..46fbab94 --- /dev/null +++ b/bsp/meta-boundary/recipes-graphics/xinput-calibrator/xinput-calibrator_git.bbappend @@ -0,0 +1,8 @@ +# Remove xinput_calibrator autostart. Our displays are already calibrated. +# Leaves binary in place in case they want to run it anyway manually + +do_install_append(){ + rm -rf ${D}${sysconfdir}/ +} + +FILES_${PN}_remove += "${sysconfdir}/xdg/autostart" diff --git a/bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb b/bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb new file mode 100644 index 00000000..9124f1cb --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/kernel-iio/kernel-iio.bb @@ -0,0 +1,51 @@ +SUMMARY = "IIO tools for Linux" +DESCRIPTION = "Tools to monitor and list Industrial I/O (IIO) devices." + +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7" + +inherit linux-kernel-base kernel-arch kernelsrc + +do_configure[depends] += "virtual/kernel:do_shared_workdir" +do_populate_lic[depends] += "virtual/kernel:do_patch" + +B = "${WORKDIR}/${BPN}-${PV}" +SPDX_S = "${S}/tools/iio" + +EXTRA_OEMAKE = '\ + -C ${S}/tools/iio \ + O=${B} \ + CROSS_COMPILE=${TARGET_PREFIX} \ + ARCH=${ARCH} \ + CC="${CC}" \ + AR="${AR}" \ + LD="${LD}" \ + EXTRA_CFLAGS="-idirafter ${S}/include" \ +' + +EXTRA_OEMAKE += "\ + 'INSTALL_ROOT=${D}' \ + 'BINDIR=${bindir}' \ +" + +do_compile() { + # Linux kernel build system is expected to do the right thing + unset CFLAGS + oe_runmake all +} + +do_install() { + # Linux kernel build system is expected to do the right thing + unset CFLAGS + oe_runmake install +} + +do_configure_prepend () { + # Fix for rebuilding + rm -rf ${B}/ + mkdir -p ${B}/ +} + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +FILES_${PN} += "${bindir}" diff --git a/bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb b/bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb new file mode 100644 index 00000000..add8e8a0 --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/kernel-modules/kernel-module-qcacld_git.bb @@ -0,0 +1,18 @@ +# Copyright (C) 2016 Boundary Devices +SUMMARY = "QCACLD driver for QCA9377-based BD-SDMAC module" +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://${S}/CORE/HDD/src/wlan_hdd_main.c;beginline=1;endline=20;md5=c191a07d6df8a17ee5b865137f729304" + +inherit module + +SRCREV = "${AUTOREV}" + +SRC_URI = "git://github.com/boundarydevices/qcacld-2.0.git;branch=${SRCBRANCH} \ +" +SRCBRANCH = "boundary-LNX.LEH.4.2.2.2" + +S = "${WORKDIR}/git" + +EXTRA_OEMAKE_append = " CONFIG_CLD_HL_SDIO_CORE=y" + +COMPATIBLE_MACHINE = "mx6|mx7|mx8" diff --git a/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb new file mode 100644 index 00000000..07956080 --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-bdsdmac_git.bb @@ -0,0 +1,35 @@ +SUMMARY = "WiFi and BT firmware files for BD-SDMAC module" +SECTION = "kernel" + +LICENSE = "Firmware-qca" + +LIC_FILES_CHKSUM = "\ + file://LICENSE.qca_firmware;md5=e8b1e9e8ce377ca5b2c1098e5690f470 \ +" + +SRCREV = "5e4b71211ecbb79e7693d2ee07361847f5a0cb40" + +SRC_URI = "git://github.com/boundarydevices/qca-firmware.git;branch=${SRCBRANCH}" +SRCBRANCH = "bd-sdmac-qcacld" + +S = "${WORKDIR}/git" + +# These are not common licenses, set NO_GENERIC_LICENSE for them +# so that the license files will be copied from fetched source +NO_GENERIC_LICENSE[Firmware-qca] = "LICENSE.qca_firmware" + +inherit allarch + +CLEANBROKEN = "1" + +do_compile() { + : +} + +do_install() { + DESTDIR=${D} make install +} + +FILES_${PN} += "/lib/firmware/* /lib/firmware/*/*" + +RDEPENDS_${PN} += "crda" diff --git a/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb new file mode 100644 index 00000000..219ac32d --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware-gslx680_1.0.bb @@ -0,0 +1,29 @@ +SUMMARY = "Firmware files for GSLx680 touch controllers" +SECTION = "kernel" + +LICENSE = "\ + GPLv2+ \ +" + +LIC_FILES_CHKSUM = "\ + file://${WORKDIR}/LICENSE.GPLv2+.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ +" + +SRC_URI_append = "\ + http://linode.boundarydevices.com/gsl1680.fw;name=gsl1680 \ + http://linode.boundarydevices.com/LICENSE.GPLv2+.txt;name=license \ +" + +SRC_URI[gsl1680.sha256sum] = "d0e85f5b601e58ef04dd016f99de89aebdc5e16c7b0173f45196f9593d43e854" +SRC_URI[license.sha256sum] = "8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643" + +inherit allarch update-alternatives + +CLEANBROKEN = "1" + +do_install() { + mkdir -p ${D}/lib/firmware/ + install -m 0644 ${WORKDIR}/gsl1680.fw ${D}/lib/firmware/ +} + +FILES_${PN} += "/lib/firmware/*" diff --git a/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend new file mode 100644 index 00000000..fdb63989 --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/linux-firmware/linux-firmware_git.bbappend @@ -0,0 +1,16 @@ +# Support additional firmware for TiWi-BLE module +# TIInit_7.6.15.bts is required for bluetooth support but this particular +# version is not available in the linux-firmware repository. +# +SRC_URI_append = "\ + https://git.ti.com/ti-bt/service-packs/blobs/raw/54f5c151dacc608b19ab2ce4c30e27a3983048b2/initscripts/TIInit_7.6.15.bts;name=TIInit_7.6.15 \ +" +SRC_URI[TIInit_7.6.15.md5sum] = "3f84f0d782376363d0028fc4b2402ccb" +SRC_URI[TIInit_7.6.15.sha256sum] = "e78156ad81446fdeb46da661290f763f3fe97d111526b2d19cd764a634268888" + +do_install_append() { + cp ${WORKDIR}/TIInit_7.6.15.bts ${D}/lib/firmware/ti-connectivity/ +} + +PACKAGE_ARCH_mx7 = "${MACHINE_ARCH}" +PACKAGE_ARCH_mx6 = "${MACHINE_ARCH}" diff --git a/bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig b/bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig new file mode 100644 index 00000000..261e0cb1 --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/linux/files/arm64/defconfig @@ -0,0 +1,591 @@ +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_NO_HZ_IDLE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=16 +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_USER_NS=y +CONFIG_SCHED_AUTOGROUP=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_KALLSYMS_ALL=y +# CONFIG_COMPAT_BRK is not set +CONFIG_PROFILING=y +CONFIG_JUMP_LABEL=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_IOSCHED_DEADLINE is not set +CONFIG_ARCH_FSL_IMX8QM=y +CONFIG_ARCH_FSL_IMX8QP=y +CONFIG_ARCH_FSL_IMX8QXP=y +CONFIG_ARCH_FSL_IMX8MQ=y +CONFIG_ARCH_FSL_IMX8MM=y +CONFIG_PCI=y +CONFIG_PCI_IOV=y +CONFIG_PCI_IMX6=y +CONFIG_PCI_HOST_GENERIC=y +CONFIG_PCI_HISI=y +CONFIG_ARM64_VA_BITS_48=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 +CONFIG_TRANSPARENT_HUGEPAGE=y +CONFIG_CMA=y +CONFIG_SECCOMP=y +CONFIG_KEXEC=y +CONFIG_XEN=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_DEBUG=y +CONFIG_PM_TEST_SUSPEND=y +CONFIG_ARM_CPUIDLE=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPUFREQ_DT=y +CONFIG_ARM_BIG_LITTLE_CPUFREQ=y +CONFIG_ARM_IMX8_CPUFREQ=y +CONFIG_ARM_IMX8MQ_CPUFREQ=y +CONFIG_ARM_SCPI_CPUFREQ=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_SYN_COOKIES=y +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_INET6_XFRM_MODE_BEET=m +CONFIG_IPV6_SIT=m +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_IP_VS=m +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_MANGLE=m +CONFIG_NF_CONNTRACK_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_VLAN_8021Q=m +CONFIG_VLAN_8021Q_GVRP=y +CONFIG_VLAN_8021Q_MVRP=y +CONFIG_LLC2=y +CONFIG_NET_SWITCHDEV=y +CONFIG_BPF_JIT=y +CONFIG_CAN=y +CONFIG_CAN_FLEXCAN=y +CONFIG_CAN_MCP251X=m +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_BT_LEDS=y +CONFIG_BT_HCIUART=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_BCM=y +CONFIG_BT_HCIUART_QCA=y +CONFIG_BT_HCIVHCI=y +CONFIG_CFG80211=y +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=y +CONFIG_MAC80211_LEDS=y +CONFIG_RFKILL=y +CONFIG_RFKILL_GPIO=y +CONFIG_NET_9P=y +CONFIG_NET_9P_VIRTIO=y +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set +CONFIG_DMA_CMA=y +CONFIG_CMA_SIZE_MBYTES=320 +CONFIG_VEXPRESS_CONFIG=y +CONFIG_MTD=y +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_RAM=y +CONFIG_MTD_DATAFLASH=y +CONFIG_MTD_M25P80=y +CONFIG_MTD_SLRAM=y +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_GPMI_NAND=y +CONFIG_MTD_SPI_NOR=y +# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set +CONFIG_SPI_FSL_FLEXSPI=y +CONFIG_MTD_UBI=y +CONFIG_OF_OVERLAY=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_VIRTIO_BLK=y +CONFIG_BLK_DEV_NVME=m +CONFIG_SENSORS_FXOS8700=y +CONFIG_SENSORS_FXAS2100X=y +CONFIG_SRAM=y +CONFIG_EEPROM_AT24=m +# CONFIG_SCSI_PROC_FS is not set +CONFIG_BLK_DEV_SD=y +CONFIG_SCSI_SAS_ATA=y +CONFIG_SCSI_HISI_SAS=y +CONFIG_ATA=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_AHCI_PLATFORM=y +CONFIG_AHCI_IMX=y +CONFIG_AHCI_CEVA=y +CONFIG_AHCI_XGENE=y +CONFIG_AHCI_QORIQ=y +CONFIG_SATA_SIL24=y +CONFIG_PATA_PLATFORM=y +CONFIG_PATA_OF_PLATFORM=y +CONFIG_NETDEVICES=y +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_TUN=y +CONFIG_VETH=m +CONFIG_VIRTIO_NET=y +CONFIG_AMD_XGBE=y +CONFIG_MACB=y +CONFIG_HNS_DSAF=y +CONFIG_HNS_ENET=y +CONFIG_E1000E=y +CONFIG_IGB=y +CONFIG_IGBVF=y +CONFIG_SKY2=y +CONFIG_SMC91X=y +CONFIG_SMSC911X=y +CONFIG_STMMAC_ETH=m +CONFIG_MDIO_BITBANG=y +CONFIG_AT803X_PHY=y +CONFIG_MICREL_PHY=y +CONFIG_REALTEK_PHY=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_SR9800=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_MCS7830=m +CONFIG_ATH10K=y +CONFIG_ATH10K_PCI=y +CONFIG_ATH10K_AHB=y +CONFIG_ATH10K_DEBUGFS=y +CONFIG_BCMDHD_1363=y +CONFIG_BCMDHD_PCIE=y +CONFIG_RTL_CARDS=m +# CONFIG_WLAN_VENDOR_TI is not set +CONFIG_INPUT_POLLDEV=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_IMX_SC_PWRKEY=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_FT5X06=m +CONFIG_TOUCHSCREEN_GOODIX=m +CONFIG_TOUCHSCREEN_SITRONIX_I2C_TOUCH=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_MPL3115=y +CONFIG_INPUT_ISL29023=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIO_AMBAKMI=y +CONFIG_LEGACY_PTY_COUNT=16 +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_IMX_CONSOLE=y +CONFIG_SERIAL_XILINX_PS_UART=y +CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y +CONFIG_SERIAL_FSL_LPUART=y +CONFIG_SERIAL_FSL_LPUART_CONSOLE=y +CONFIG_FSL_OTP=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MUX_PCA954x=y +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_IMX=y +CONFIG_I2C_IMX_LPI2C=y +CONFIG_I2C_CROS_EC_TUNNEL=y +CONFIG_I2C_SLAVE=y +CONFIG_SPI=y +CONFIG_SPI_IMX=y +CONFIG_SPI_FSL_LPSPI=y +CONFIG_SPI_PL022=y +CONFIG_SPI_SPIDEV=m +CONFIG_SPMI=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_PINCTRL_MAX77620=y +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_DWAPB=y +CONFIG_GPIO_PL061=y +CONFIG_GPIO_XGENE=y +CONFIG_GPIO_MAX732X=y +CONFIG_GPIO_PCA953X=y +CONFIG_GPIO_PCA953X_IRQ=y +CONFIG_GPIO_MAX77620=y +CONFIG_POWER_RESET_SNVS=y +CONFIG_POWER_RESET_VEXPRESS=y +CONFIG_POWER_RESET_XGENE=y +CONFIG_POWER_RESET_SYSCON=y +CONFIG_BATTERY_BQ27XXX=y +CONFIG_SENSORS_ARM_SCPI=y +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_INA2XX=m +# CONFIG_MXC_MMA8451 is not set +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y +CONFIG_THERMAL_EMULATION=y +CONFIG_IMX8M_THERMAL=y +CONFIG_IMX_SC_THERMAL=y +CONFIG_DEVICE_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_IMX2_WDT=y +CONFIG_IMX8_WDT=y +CONFIG_MFD_CROS_EC=y +CONFIG_MFD_CROS_EC_I2C=y +CONFIG_MFD_MAX77620=y +CONFIG_MFD_SEC_CORE=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_MAX77620=y +CONFIG_REGULATOR_PF8X00=y +CONFIG_REGULATOR_PFUZE100=y +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_QCOM_SPMI=y +CONFIG_REGULATOR_S2MPS11=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_MEDIA_USB_SUPPORT=y +CONFIG_USB_VIDEO_CLASS=m +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VIDEO_MXC_CAPTURE=y +CONFIG_VIDEO_MX8_CAPTURE=y +CONFIG_GMSL_MAX9286=y +CONFIG_VIDEO_MXC_CSI_CAMERA=y +CONFIG_MXC_MIPI_CSI=y +CONFIG_MXC_CAMERA_OV5640_MIPI_V2=m +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_IMX_DPU_CORE=y +CONFIG_IMX_DCSS_CORE=y +CONFIG_IMX_LCDIF_CORE=y +CONFIG_DRM=y +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_I2C_CH7006=m +CONFIG_DRM_I2C_SIL164=m +CONFIG_DRM_VIVANTE=m +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_PANEL_RAYDIUM_RM67191=y +CONFIG_DRM_SEC_MIPI_DSIM=y +CONFIG_DRM_I2C_ADV7511=y +CONFIG_DRM_ITE_IT6263=y +CONFIG_DRM_IMX_PARALLEL_DISPLAY=y +CONFIG_DRM_IMX_TVE=y +CONFIG_DRM_IMX_LDB=y +CONFIG_DRM_IMX_HDMI=y +CONFIG_DRM_IMX_NWL_DSI=y +CONFIG_DRM_IMX_SEC_DSIM=m +CONFIG_DRM_IMX_HDP=y +CONFIG_IMX_HDP_CEC=y +CONFIG_DRM_MXSFB=y +CONFIG_FB_IMX64=y +CONFIG_FB_IMX64_DEBUG=y +CONFIG_FB_ARMCLCD=y +CONFIG_FB_MXC_DISP_FRAMEWORK=y +CONFIG_BACKLIGHT_GENERIC=m +CONFIG_BACKLIGHT_PWM=y +CONFIG_BACKLIGHT_LP855X=m +CONFIG_SN65DSI83=y +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_SOC=y +CONFIG_SND_SOC_FSL_ACM=y +CONFIG_SND_IMX_SOC=y +CONFIG_SND_SOC_IMX_AK4458=y +CONFIG_SND_SOC_IMX_AK5558=y +CONFIG_SND_SOC_IMX_AK4497=y +CONFIG_SND_SOC_IMX_WM8960=y +CONFIG_SND_SOC_IMX_WM8524=y +CONFIG_SND_SOC_IMX_CS42888=y +CONFIG_SND_SOC_IMX_WM8962=y +CONFIG_SND_SOC_IMX_MQS=y +CONFIG_SND_SOC_IMX_SPDIF=y +CONFIG_SND_SOC_IMX_AMIX=y +CONFIG_SND_SOC_IMX_CDNHDMI=y +CONFIG_SND_SOC_AK4613=y +CONFIG_SND_SIMPLE_CARD=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB=y +CONFIG_USB_OTG=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_ACM=m +CONFIG_USB_STORAGE=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC2=y +CONFIG_USB_CHIPIDEA=y +CONFIG_USB_CHIPIDEA_UDC=y +CONFIG_USB_CHIPIDEA_HOST=y +CONFIG_USB_ISP1760=y +CONFIG_USB_ISP1760_HOST_ROLE=y +CONFIG_USB_CDNS3=y +CONFIG_USB_CDNS3_GADGET=y +CONFIG_USB_CDNS3_HOST=y +CONFIG_USB_TEST=m +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_USB_HSIC_USB3503=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_GPIO_VBUS=y +CONFIG_USB_MXS_PHY=y +CONFIG_USB_ULPI=y +CONFIG_USB_GADGET=y +CONFIG_USB_CONFIGFS=y +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_OBEX=y +CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_ECM_SUBSET=y +CONFIG_USB_CONFIGFS_RNDIS=y +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_FSL_UTP=y +CONFIG_USB_CONFIGFS_F_LB_SS=y +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_UAC1=y +CONFIG_USB_CONFIGFS_F_UAC2=y +CONFIG_USB_CONFIGFS_F_MIDI=y +CONFIG_USB_CONFIGFS_F_HID=y +CONFIG_USB_ZERO=m +CONFIG_USB_AUDIO=m +CONFIG_GADGET_UAC1=y +CONFIG_USB_ETH=m +CONFIG_USB_ETH_EEM=y +CONFIG_USB_G_NCM=m +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_G_SERIAL=m +CONFIG_USB_CDC_COMPOSITE=m +CONFIG_MMC=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_ARMMMCI=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_ACPI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_ESDHC_IMX=y +CONFIG_MMC_SPI=y +# CONFIG_MXC_GPU_VIV is not set +CONFIG_MXC_SIM=y +CONFIG_MXC_EMVSIM=y +CONFIG_MXC_MLB150=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_SYSCON=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_MAX77686=y +CONFIG_RTC_DRV_M41T80=y +CONFIG_RTC_DRV_M41T80_WDT=y +CONFIG_RTC_DRV_S5M=y +CONFIG_RTC_DRV_DS3232=y +CONFIG_RTC_DRV_EFI=y +CONFIG_RTC_DRV_PL031=y +CONFIG_RTC_DRV_SNVS=y +CONFIG_RTC_DRV_IMX_SC=y +CONFIG_DMADEVICES=y +CONFIG_FSL_EDMA_V3=y +CONFIG_IMX_SDMA=y +CONFIG_MXS_DMA=y +CONFIG_PL330_DMA=y +CONFIG_QCOM_HIDMA_MGMT=y +CONFIG_QCOM_HIDMA=y +CONFIG_SYNC_FILE=y +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_MMIO=y +CONFIG_XEN_GNTDEV=y +CONFIG_XEN_GRANT_DEV_ALLOC=y +CONFIG_STAGING=y +CONFIG_STAGING_MEDIA=y +CONFIG_MEDIA_CEC=y +CONFIG_ION=y +CONFIG_ION_MXC=y +CONFIG_TYPEC_TCPM=y +CONFIG_TYPEC_TCPCI=y +CONFIG_COMMON_CLK_VERSATILE=y +CONFIG_CLK_SP810=y +CONFIG_COMMON_CLK_SCPI=y +CONFIG_CLK_QORIQ=y +# CONFIG_COMMON_CLK_XGENE is not set +CONFIG_COMMON_CLK_PWM=y +CONFIG_ARM_TIMER_SP804=y +CONFIG_CLKSRC_IMX_SYS_CNT=y +CONFIG_MAILBOX=y +CONFIG_ARM_MHU=y +CONFIG_BCM_PDC_MBOX=y +CONFIG_ARM_SMMU=y +CONFIG_ARCH_MXC_ARM64=y +CONFIG_EXTCON_PTN5150=y +CONFIG_IIO=y +CONFIG_PWM=y +CONFIG_PWM_IMX=y +CONFIG_PHY_SAMSUNG_USB2=y +CONFIG_PHY_XGENE=y +CONFIG_IMX8_DDR_PERF=y +CONFIG_NVMEM=y +CONFIG_NVMEM_IMX_OCOTP=y +CONFIG_NVMEM_IMX_SCU_OCOTP=y +CONFIG_TEE=y +CONFIG_OPTEE=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ACPI=y +CONFIG_EXT2_FS=y +CONFIG_EXT3_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_FANOTIFY=y +CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y +CONFIG_QUOTA=y +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=y +CONFIG_CUSE=m +CONFIG_OVERLAY_FS=m +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HUGETLBFS=y +CONFIG_EFIVAR_FS=y +CONFIG_ECRYPT_FS=y +CONFIG_ECRYPT_FS_MESSAGING=y +CONFIG_JFFS2_FS=y +CONFIG_UBIFS_FS=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_XZ=y +CONFIG_NFS_FS=y +CONFIG_NFS_V4=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_ROOT_NFS=y +CONFIG_9P_FS=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ISO8859_1=y +CONFIG_KVM=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_FS=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_KERNEL=y +CONFIG_LOCKUP_DETECTOR=y +# CONFIG_SCHED_DEBUG is not set +# CONFIG_DEBUG_PREEMPT is not set +# CONFIG_FTRACE is not set +CONFIG_MEMTEST=y +CONFIG_STRICT_DEVMEM=y +CONFIG_SECURITY=y +CONFIG_LSM_MMAP_MIN_ADDR=0 +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SMACK=y +CONFIG_SECURITY_APPARMOR=y +CONFIG_DEFAULT_SECURITY_APPARMOR=y +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_AUTHENC=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_CHACHA20POLY1305=y +CONFIG_CRYPTO_ECHAINIV=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_LRW=y +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_RMD128=y +CONFIG_CRYPTO_RMD160=y +CONFIG_CRYPTO_RMD256=y +CONFIG_CRYPTO_RMD320=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=y +CONFIG_CRYPTO_TGR192=y +CONFIG_CRYPTO_WP512=y +CONFIG_CRYPTO_BLOWFISH=y +CONFIG_CRYPTO_CAMELLIA=y +CONFIG_CRYPTO_CAST5=y +CONFIG_CRYPTO_CAST6=y +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_SERPENT=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_CRC32_ARM64=y + diff --git a/bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend b/bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend new file mode 100644 index 00000000..b92300e6 --- /dev/null +++ b/bsp/meta-boundary/recipes-kernel/linux/linux-boundary_%.bbappend @@ -0,0 +1,10 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files/arm64:" + +SRC_URI = "git://github.com/boundarydevices/linux-imx6.git;branch=${SRCBRANCH} \ + file://defconfig \ +" + +LOCALVERSION = "-1.0.0-ga+yocto" +SRCBRANCH = "boundary-imx_4.14.x_1.0.0_ga" +SRCREV = "${AUTOREV}" +COMPATIBLE_MACHINE = "(nitrogen6x|nitrogen6x-lite|nitrogen6sx|nitrogen7|nitrogen8m|nitrogen8mm)" diff --git a/bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb b/bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb new file mode 100644 index 00000000..1e7ec2f4 --- /dev/null +++ b/bsp/meta-boundary/recipes-sato/images/boundary-eval-image.bb @@ -0,0 +1,48 @@ +# Basically core-image-sato-dev + extra packages in IMAGE_INSTALL below + +DESCRIPTION = "Image with Sato for development work. It includes everything \ +within core-image-sato plus a native toolchain, application development and \ +testing libraries, profiling and debug symbols. \ +Also includes many other packages for a generic Boundary Devices Evaluation Image" + +IMAGE_FEATURES += "splash package-management x11-base x11-sato ssh-server-dropbear hwcodecs dev-pkgs" + +LICENSE = "MIT" + +inherit core-image distro_features_check + +REQUIRED_DISTRO_FEATURES = "x11" +CONFLICT_DISTRO_FEATURES = "wayland" + +CORE_IMAGE_BASE_INSTALL += "\ + packagegroup-core-x11-sato-games \ + nodejs \ + packagegroup-fsl-gstreamer1.0-full \ + \ + flex \ + gcc \ + git \ + m4 \ + make \ + iperf3 \ + libtool \ + nano \ + python-compiler \ + strace \ + screen \ + minicom \ + openssl \ + cryptodev-module \ +" + +# For silex module support uncomment the line below and register your ssh key on our webserver to get access. +# Silex requires some terms and conditions to be accepted before you can build +# Please fill out the form located here for access: https://boundarydevices.com/private-git-access/ +#CORE_IMAGE_BASE_INSTALL += "kernel-module-silex linux-firmware-silex" + +# Video input demos only on nitrogen6x/sx/7 platform +# Chromium not on nitrogen7 +CORE_IMAGE_BASE_INSTALL_append_nitrogen6x += "video-input-icon chromium firefox qt5everywheredemo cinematicexperience" +CORE_IMAGE_BASE_INSTALL_append_nitrogen6x-lite += "chromium firefox" +CORE_IMAGE_BASE_INSTALL_append_nitrogen6sx += "video-input-icon chromium firefox" +CORE_IMAGE_BASE_INSTALL_append_nitrogen7 += "video-input-icon" diff --git a/bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend b/bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend new file mode 100644 index 00000000..98970335 --- /dev/null +++ b/bsp/meta-boundary/recipes-sato/packagegroups/packagegroup-core-x11-sato.bbappend @@ -0,0 +1,2 @@ +# Get rid of connman +NETWORK_MANAGER = "networkmanager" |