From f7259c3490ec4a65909890426c23a94e43c85e0e Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Wed, 31 Oct 2018 08:55:07 +0100
Subject: [PATCH 01/55] Buildroot: Initial start of ReSpeaker kernel driver
buildroot package
---
buildroot-external/Config.in | 1 +
1 file changed, 1 insertion(+)
diff --git a/buildroot-external/Config.in b/buildroot-external/Config.in
index 0b220340..03d37ff6 100644
--- a/buildroot-external/Config.in
+++ b/buildroot-external/Config.in
@@ -1,5 +1,6 @@
menu "Additional libraries and applications"
source "$BR2_EXTERNAL_MYCROFTOS_PATH/package/fann/Config.in"
+ source "$BR2_EXTERNAL_MYCROFTOS_PATH/package/respeaker/Config.in"
endmenu
menu "Additional external python modules"
source "$BR2_EXTERNAL_MYCROFTOS_PATH/package/python-adapt-parser/Config.in"
From 2f7e82f28941fe3ff57a0e6b534ba6e2d2acd69a Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Wed, 31 Oct 2018 19:26:44 +0100
Subject: [PATCH 02/55] Buildroot: Try-out internal toolchain + uGlibc-ng
---
.../configs/mycroftos_rpi3_defconfig | 15 ++++-----------
scripts/build.sh | 9 ++++++---
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 3b18c1b9..96e73862 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -6,7 +6,9 @@ BR2_CCACHE=y
BR2_CCACHE_DIR="../ccache"
BR2_OPTIMIZE_FAST=y
BR2_GLOBAL_PATCH_DIR="../buildroot-patches"
-BR2_TOOLCHAIN_EXTERNAL=y
+BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_14=y
+BR2_TOOLCHAIN_BUILDROOT_LOCALE=y
+BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_TARGET_GENERIC_HOSTNAME="MycroftOS"
BR2_TARGET_GENERIC_ISSUE="Welcome to MycroftOS"
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y
@@ -47,8 +49,6 @@ BR2_PACKAGE_ALSA_UTILS_BAT=y
BR2_PACKAGE_ALSA_UTILS_IECSET=y
BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y
BR2_PACKAGE_BLUEZ_ALSA=y
-BR2_PACKAGE_ESPEAK=y
-BR2_PACKAGE_ESPEAK_AUDIO_BACKEND_ALSA=y
BR2_PACKAGE_FFMPEG_GPL=y
BR2_PACKAGE_FFMPEG_NONFREE=y
BR2_PACKAGE_FLAC=y
@@ -58,11 +58,8 @@ BR2_PACKAGE_MPG123=y
BR2_PACKAGE_MPV=y
BR2_PACKAGE_PULSEAUDIO=y
BR2_PACKAGE_PULSEAUDIO_DAEMON=y
-BR2_PACKAGE_VLC=y
BR2_PACKAGE_GZIP=y
BR2_PACKAGE_LZ4=y
-BR2_PACKAGE_P7ZIP=y
-BR2_PACKAGE_UNRAR=y
BR2_PACKAGE_UNZIP=y
BR2_PACKAGE_ZIP=y
BR2_PACKAGE_BINUTILS=y
@@ -85,7 +82,6 @@ BR2_PACKAGE_RPI_WIFI_FIRMWARE=y
BR2_PACKAGE_DBUS_PYTHON=y
BR2_PACKAGE_KBD=y
BR2_PACKAGE_PARTED=y
-BR2_PACKAGE_RPI_USERLAND=y
BR2_PACKAGE_PYTHON3=y
BR2_PACKAGE_PYTHON3_PY_ONLY=y
BR2_PACKAGE_PYTHON3_BZIP2=y
@@ -115,17 +111,15 @@ BR2_PACKAGE_PYTHON_SERIAL=y
BR2_PACKAGE_PYTHON_TEXTTABLE=y
BR2_PACKAGE_PYTHON_TORNADO=y
BR2_PACKAGE_PYTHON_WEBSOCKET_CLIENT=y
-BR2_PACKAGE_AUDIOFILE=y
+BR2_PACKAGE_PORTAUDIO=y
BR2_PACKAGE_PORTAUDIO_OSS=y
BR2_PACKAGE_SPEEXDSP=y
-BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING=y
BR2_PACKAGE_LIBARCHIVE=y
BR2_PACKAGE_LIBARCHIVE_BSDTAR=y
BR2_PACKAGE_LIBARCHIVE_BSDCPIO=y
BR2_PACKAGE_LIBARCHIVE_BSDCAT=y
BR2_PACKAGE_LIBZIP=y
BR2_PACKAGE_LZO=y
-BR2_PACKAGE_SNAPPY=y
BR2_PACKAGE_CA_CERTIFICATES=y
BR2_PACKAGE_LIBOPENSSL_BIN=y
BR2_PACKAGE_LIBOPENSSL_ENGINES=y
@@ -137,7 +131,6 @@ BR2_PACKAGE_BCM2835=y
BR2_PACKAGE_WIRINGPI=y
BR2_PACKAGE_LIBMPEG2=y
BR2_PACKAGE_LIBMPEG2_BINS=y
-BR2_PACKAGE_LIBOPENH264=y
BR2_PACKAGE_LIBTHEORA=y
BR2_PACKAGE_LIBCURL=y
BR2_PACKAGE_CURL=y
diff --git a/scripts/build.sh b/scripts/build.sh
index 11493b25..6d0c43b0 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -1,13 +1,16 @@
#!/bin/bash
set -e
+mkdir -p release
+mkdir -p logs
+
all_platforms=(rpi3)
for platform in "${all_platforms[@]}"; do
-# make -C buildroot BR2_EXTERNAL=../buildroot-external distclean
-# make -C buildroot BR2_EXTERNAL=../buildroot-external mycroftos_${platform}_defconfig
+ make -C buildroot BR2_EXTERNAL=../buildroot-external distclean
+ make -C buildroot BR2_EXTERNAL=../buildroot-external mycroftos_${platform}_defconfig
# Optional if you need to change stuff, uncomment the next line.
- # make -C buildroot BR2_EXTERNAL=../buildroot-external makemenuconfig
+# make -C buildroot BR2_EXTERNAL=../buildroot-external menuconfig
make -C buildroot BR2_EXTERNAL=../buildroot-external 2>&1 | tee logs/buildroot_output.txt
cp -f buildroot/output/images/sdcard.img release/MycroftOS_${platform}.img
From c6f8f7af207750a5f249d5ead17696b17f033c9e Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Wed, 31 Oct 2018 19:39:32 +0100
Subject: [PATCH 03/55] MycroftOS: Initial start of auto expand filesystem at
first boot
---
buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once | 0
buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh | 0
2 files changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once
mode change 100644 => 100755 buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once b/buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once
old mode 100644
new mode 100755
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh b/buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh
old mode 100644
new mode 100755
From 1c01cb2b9d17cd4847e033955dacea616e098219 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Thu, 1 Nov 2018 09:52:50 +0100
Subject: [PATCH 04/55] Buildroot: Try-out internal toolchain + glibc
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 96e73862..6904eefa 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -6,8 +6,8 @@ BR2_CCACHE=y
BR2_CCACHE_DIR="../ccache"
BR2_OPTIMIZE_FAST=y
BR2_GLOBAL_PATCH_DIR="../buildroot-patches"
+BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_14=y
-BR2_TOOLCHAIN_BUILDROOT_LOCALE=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_TARGET_GENERIC_HOSTNAME="MycroftOS"
BR2_TARGET_GENERIC_ISSUE="Welcome to MycroftOS"
@@ -134,6 +134,7 @@ BR2_PACKAGE_LIBMPEG2_BINS=y
BR2_PACKAGE_LIBTHEORA=y
BR2_PACKAGE_LIBCURL=y
BR2_PACKAGE_CURL=y
+BR2_PACKAGE_LIBTIRPC=y
BR2_PACKAGE_LIBFRIBIDI=y
BR2_PACKAGE_LIBUNISTRING=y
BR2_PACKAGE_NCURSES_WCHAR=y
From 2998441e43a9a86b683ef4e08f608bf17ff88ba5 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Thu, 1 Nov 2018 15:42:02 +0100
Subject: [PATCH 05/55] Buildroot: Bump Mycroft to 18.08.4 - Removed config
path patch - Removed /.mycroft symlink - Added /root/.mycroft folder in
rootfs overlay
---
.../0002-Force-USER-config-path-to-root.patch | 23 -------------------
.../python-mycroft/python-mycroft.hash | 1 +
.../package/python-mycroft/python-mycroft.mk | 2 +-
.../rootfs-overlay/root/.mycroft | 1 -
.../rootfs-overlay/root/.mycroft/.empty | 0
5 files changed, 2 insertions(+), 25 deletions(-)
delete mode 100644 buildroot-external/package/python-mycroft/0002-Force-USER-config-path-to-root.patch
delete mode 120000 buildroot-external/rootfs-overlay/root/.mycroft
create mode 100644 buildroot-external/rootfs-overlay/root/.mycroft/.empty
diff --git a/buildroot-external/package/python-mycroft/0002-Force-USER-config-path-to-root.patch b/buildroot-external/package/python-mycroft/0002-Force-USER-config-path-to-root.patch
deleted file mode 100644
index bdead728..00000000
--- a/buildroot-external/package/python-mycroft/0002-Force-USER-config-path-to-root.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 93b3e606dddd93e8346da265a1751ecb546c882b Mon Sep 17 00:00:00 2001
-From: Peter Steenbergen
-Date: Sat, 13 Oct 2018 10:50:06 +0200
-Subject: [PATCH 1/1] Force USER config path.
-
----
- mycroft/configuration/locations.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/mycroft/configuration/locations.py b/mycroft/configuration/locations.py
-index 0759152f99..3666ac5dfa 100644
---- a/mycroft/configuration/locations.py
-+++ b/mycroft/configuration/locations.py
-@@ -15,5 +15,5 @@ from os.path import join, dirname, expanduser
-
- DEFAULT_CONFIG = join(dirname(__file__), 'mycroft.conf')
- SYSTEM_CONFIG = '/etc/mycroft/mycroft.conf'
--USER_CONFIG = join(expanduser('~'), '.mycroft/mycroft.conf')
-+USER_CONFIG = '/.mycroft/mycroft.conf'
- REMOTE_CONFIG = "mycroft.ai"
---
-2.11.0
-
diff --git a/buildroot-external/package/python-mycroft/python-mycroft.hash b/buildroot-external/package/python-mycroft/python-mycroft.hash
index 2115b79b..38794033 100644
--- a/buildroot-external/package/python-mycroft/python-mycroft.hash
+++ b/buildroot-external/package/python-mycroft/python-mycroft.hash
@@ -1,3 +1,4 @@
sha256 90255931a864a4abe30f28c470009cf798dc72221cab16ba41712d80b19e28e4 python-mycroft-v18.8.1.tar.gz
sha256 af18bd9ee1c6e3bbc6b424af39b352179d05fc337d04573eadba37b01f7105f6 python-mycroft-v18.8.2.tar.gz
sha256 25c583e40e888a99ea6fb0817960952bc26dcf8facf87f77f3363ac0c3c3b9d9 python-mycroft-v18.8.3.tar.gz
+sha256 42950284980d415d5cf75c91ad1e59080770cf82a12dc294f106b97fdf8c65c0 python-mycroft-v18.8.4.tar.gz
diff --git a/buildroot-external/package/python-mycroft/python-mycroft.mk b/buildroot-external/package/python-mycroft/python-mycroft.mk
index e7d7323e..f950f7c5 100644
--- a/buildroot-external/package/python-mycroft/python-mycroft.mk
+++ b/buildroot-external/package/python-mycroft/python-mycroft.mk
@@ -4,7 +4,7 @@
#
################################################################################
-PYTHON_MYCROFT_VERSION = v18.8.3
+PYTHON_MYCROFT_VERSION = v18.8.4
PYTHON_MYCROFT_SITE = $(call github,MycroftAI,mycroft-core,release/$(PYTHON_MYCROFT_VERSION))
PYTHON_MYCROFT_SETUP_TYPE = setuptools
PYTHON_MYCROFT_LICENSE_FILES =
diff --git a/buildroot-external/rootfs-overlay/root/.mycroft b/buildroot-external/rootfs-overlay/root/.mycroft
deleted file mode 120000
index 1d8c98c4..00000000
--- a/buildroot-external/rootfs-overlay/root/.mycroft
+++ /dev/null
@@ -1 +0,0 @@
-../.mycroft
\ No newline at end of file
diff --git a/buildroot-external/rootfs-overlay/root/.mycroft/.empty b/buildroot-external/rootfs-overlay/root/.mycroft/.empty
new file mode 100644
index 00000000..e69de29b
From 5a0f875f47ae52206a2a6af0bb059d3127006e3d Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Thu, 1 Nov 2018 20:15:14 +0100
Subject: [PATCH 06/55] Revert "Buildroot: Try-out internal toolchain + glibc"
- OK tested both glibc and uglibc-ng, the latter does NOT work properly
with python. This reverts commit 1c01cb2b9d17cd4847e033955dacea616e098219.
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 6904eefa..96e73862 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -6,8 +6,8 @@ BR2_CCACHE=y
BR2_CCACHE_DIR="../ccache"
BR2_OPTIMIZE_FAST=y
BR2_GLOBAL_PATCH_DIR="../buildroot-patches"
-BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_14=y
+BR2_TOOLCHAIN_BUILDROOT_LOCALE=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_TARGET_GENERIC_HOSTNAME="MycroftOS"
BR2_TARGET_GENERIC_ISSUE="Welcome to MycroftOS"
@@ -134,7 +134,6 @@ BR2_PACKAGE_LIBMPEG2_BINS=y
BR2_PACKAGE_LIBTHEORA=y
BR2_PACKAGE_LIBCURL=y
BR2_PACKAGE_CURL=y
-BR2_PACKAGE_LIBTIRPC=y
BR2_PACKAGE_LIBFRIBIDI=y
BR2_PACKAGE_LIBUNISTRING=y
BR2_PACKAGE_NCURSES_WCHAR=y
From 3c6208c6113c675598c22fe4eb1a278363a750ea Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Thu, 1 Nov 2018 20:18:11 +0100
Subject: [PATCH 07/55] Small changes in build script - make clean instead of
distclean - make menuconfig default for now as we only build one image anyway
---
scripts/build.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/build.sh b/scripts/build.sh
index 6d0c43b0..11175013 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -6,11 +6,11 @@ mkdir -p logs
all_platforms=(rpi3)
for platform in "${all_platforms[@]}"; do
- make -C buildroot BR2_EXTERNAL=../buildroot-external distclean
+ make -C buildroot BR2_EXTERNAL=../buildroot-external clean
make -C buildroot BR2_EXTERNAL=../buildroot-external mycroftos_${platform}_defconfig
# Optional if you need to change stuff, uncomment the next line.
-# make -C buildroot BR2_EXTERNAL=../buildroot-external menuconfig
+ make -C buildroot BR2_EXTERNAL=../buildroot-external menuconfig
make -C buildroot BR2_EXTERNAL=../buildroot-external 2>&1 | tee logs/buildroot_output.txt
cp -f buildroot/output/images/sdcard.img release/MycroftOS_${platform}.img
From 69521b374fd0e427dde6933c668b89c4f6598503 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 17:07:53 +0100
Subject: [PATCH 08/55] Buildroot: Initial start of the respeaker package -
Download latest code from github - Compile and install kernel modules - Init
script to load the modules - Copy over all overlays and configuration files -
Init script to start seeed-voicecard bash script
< ... This now needs testing ... >
---
buildroot-external/Config.in | 2 +-
.../board/raspberrypi/config.txt | 5 +++
.../package/respeaker/Config.in | 14 +++++++
.../package/respeaker/S16respeaker_modules | 3 ++
.../package/respeaker/S60seeed_voicecard | 41 +++++++++++++++++++
.../package/respeaker/respeaker.hash | 2 +
.../package/respeaker/respeaker.mk | 31 ++++++++++++++
7 files changed, 97 insertions(+), 1 deletion(-)
create mode 100644 buildroot-external/package/respeaker/Config.in
create mode 100755 buildroot-external/package/respeaker/S16respeaker_modules
create mode 100755 buildroot-external/package/respeaker/S60seeed_voicecard
create mode 100644 buildroot-external/package/respeaker/respeaker.hash
create mode 100644 buildroot-external/package/respeaker/respeaker.mk
diff --git a/buildroot-external/Config.in b/buildroot-external/Config.in
index 03d37ff6..9b3252a1 100644
--- a/buildroot-external/Config.in
+++ b/buildroot-external/Config.in
@@ -1,4 +1,4 @@
-menu "Additional libraries and applications"
+menu "Additional drivers, libraries and/or applications"
source "$BR2_EXTERNAL_MYCROFTOS_PATH/package/fann/Config.in"
source "$BR2_EXTERNAL_MYCROFTOS_PATH/package/respeaker/Config.in"
endmenu
diff --git a/buildroot-external/board/raspberrypi/config.txt b/buildroot-external/board/raspberrypi/config.txt
index a14eb61f..38cbf8db 100644
--- a/buildroot-external/board/raspberrypi/config.txt
+++ b/buildroot-external/board/raspberrypi/config.txt
@@ -24,3 +24,8 @@ dtparam=audio=on
# Disable rainbow color splash
disable_splash=1
+
+# Enable some optional hardware interfaces
+dtparam=i2c_arm=on
+dtoverlay=i2s-mmap
+dtparam=i2s=on
diff --git a/buildroot-external/package/respeaker/Config.in b/buildroot-external/package/respeaker/Config.in
new file mode 100644
index 00000000..7f714b38
--- /dev/null
+++ b/buildroot-external/package/respeaker/Config.in
@@ -0,0 +1,14 @@
+config BR2_PACKAGE_RESPEAKER
+ bool "respeaker"
+ help
+ The ReSpeaker series is a family of
+ development boards designed to enable
+ a future where voice interface is part
+ of everyday human-device interaction.
+ Designed to be easily integrated (and
+ customized) into products, but also to
+ allow other services and products to be
+ easily integrated into it.
+
+ https://respeaker.io/
+
diff --git a/buildroot-external/package/respeaker/S16respeaker_modules b/buildroot-external/package/respeaker/S16respeaker_modules
new file mode 100755
index 00000000..3096f833
--- /dev/null
+++ b/buildroot-external/package/respeaker/S16respeaker_modules
@@ -0,0 +1,3 @@
+snd-soc-seeed-voicecard
+snd-soc-ac108
+snd-soc-wm8960
diff --git a/buildroot-external/package/respeaker/S60seeed_voicecard b/buildroot-external/package/respeaker/S60seeed_voicecard
new file mode 100755
index 00000000..6d0492ae
--- /dev/null
+++ b/buildroot-external/package/respeaker/S60seeed_voicecard
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# seeed-voicecard Starts seeed-voicecard.
+#
+
+umask 077
+
+start() {
+ printf "Starting seeed-voicecard: "
+ /usr/bin/seeed-voicecard
+ touch /var/lock/seeed-voicecard
+ echo "OK"
+}
+stop() {
+ printf "Stopping seeed-voicecard: "
+ killall seeed-voicecard
+ rm -f /var/lock/seeed-voicecard
+ echo "OK"
+}
+restart() {
+ stop
+ start
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart|reload)
+ restart
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart}"
+ exit 1
+esac
+
+exit $?
+
diff --git a/buildroot-external/package/respeaker/respeaker.hash b/buildroot-external/package/respeaker/respeaker.hash
new file mode 100644
index 00000000..c5e6ee43
--- /dev/null
+++ b/buildroot-external/package/respeaker/respeaker.hash
@@ -0,0 +1,2 @@
+# Locally computed
+sha256 9f38d832acbfc7f07a58f15222d2fdcc0a9215ede488ccafb5c89a3e8223883d respeaker-be0812c70be29b0666a89f22a9d403cfb4c48fca.tar.gz
diff --git a/buildroot-external/package/respeaker/respeaker.mk b/buildroot-external/package/respeaker/respeaker.mk
new file mode 100644
index 00000000..e82b3577
--- /dev/null
+++ b/buildroot-external/package/respeaker/respeaker.mk
@@ -0,0 +1,31 @@
+################################################################################
+#
+# respeaker
+#
+################################################################################
+
+RESPEAKER_VERSION = be0812c70be29b0666a89f22a9d403cfb4c48fca
+RESPEAKER_SITE = $(call github,respeaker,seeed-voicecard,$(RESPEAKER_VERSION))
+RESPEAKER_LICENSE = GNU General Public License v3.0
+RESPEAKER_DEPENDENCIES = rpi-firmware
+
+$(eval $(kernel-module))
+
+define RESPEAKER_INSTALL_TARGET_CMDS
+ $(INSTALL) -D -m 0755 $(BR2_EXTERNAL_MYCROFTOS_PATH)/package/respeaker/S16respeaker_modules \
+ $(TARGET_DIR)/etc/init.d/S16respeaker_modules
+ $(INSTALL) -D -m 0755 $(BR2_EXTERNAL_MYCROFTOS_PATH)/package/respeaker/S60seeed_voicecard \
+ $(TARGET_DIR)/etc/init.d/S60seeed_voicecard
+
+ mkdir -p $(TARGET_DIR)/etc/voicecard
+ rm $(@D)/dkms.conf
+ $(INSTALL) -D -m 0644 $(@D)/*.conf $(TARGET_DIR)/etc/voicecard
+ $(INSTALL) -D -m 0644 $(@D)/*.state $(TARGET_DIR)/etc/voicecard
+ $(INSTALL) -D -m 0755 $(@D)/seeed-voicecard $(TARGET_DIR)/usr/bin
+
+ $(INSTALL) -D -m 0644 $(@D)/seeed-2mic-voicecard.dtbo $(BINARIES_DIR)/rpi-firmware/overlays/
+ $(INSTALL) -D -m 0644 $(@D)/seeed-4mic-voicecard.dtbo $(BINARIES_DIR)/rpi-firmware/overlays/
+ $(INSTALL) -D -m 0644 $(@D)/seeed-8mic-voicecard.dtbo $(BINARIES_DIR)/rpi-firmware/overlays/
+endef
+
+$(eval $(generic-package))
From 949e20f576382bb6d90f9d70c3240a2c94a7f704 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 19:42:32 +0100
Subject: [PATCH 09/55] Buildroot: repeaker: Fix mistake in modules init script
---
buildroot-external/package/respeaker/S16respeaker_modules | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/buildroot-external/package/respeaker/S16respeaker_modules b/buildroot-external/package/respeaker/S16respeaker_modules
index 3096f833..ad89238f 100755
--- a/buildroot-external/package/respeaker/S16respeaker_modules
+++ b/buildroot-external/package/respeaker/S16respeaker_modules
@@ -1,3 +1,3 @@
-snd-soc-seeed-voicecard
-snd-soc-ac108
-snd-soc-wm8960
+modprobe snd-soc-seeed-voicecard
+modprobe snd-soc-ac108
+modprobe snd-soc-wm8960
From 312a86d9f6d7afa20ea6654f01731a27deb4662f Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 21:01:07 +0100
Subject: [PATCH 10/55] Buildroot: Respeaker: Make rpi-userland a dependency of
respeaker Wasn't aware dtoverlay was a binary derived from rpi userland
firmware
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 2 ++
buildroot-external/package/respeaker/Config.in | 1 +
2 files changed, 3 insertions(+)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 96e73862..dd4806db 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -82,6 +82,7 @@ BR2_PACKAGE_RPI_WIFI_FIRMWARE=y
BR2_PACKAGE_DBUS_PYTHON=y
BR2_PACKAGE_KBD=y
BR2_PACKAGE_PARTED=y
+BR2_PACKAGE_RPI_USERLAND=y
BR2_PACKAGE_PYTHON3=y
BR2_PACKAGE_PYTHON3_PY_ONLY=y
BR2_PACKAGE_PYTHON3_BZIP2=y
@@ -177,6 +178,7 @@ BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_FANN=y
+BR2_PACKAGE_RESPEAKER=y
BR2_PACKAGE_PYTHON_ADAPT_PARSER=y
BR2_PACKAGE_PYTHON_COVERALLS=y
BR2_PACKAGE_PYTHON_DEPRECATED=y
diff --git a/buildroot-external/package/respeaker/Config.in b/buildroot-external/package/respeaker/Config.in
index 7f714b38..090d3b94 100644
--- a/buildroot-external/package/respeaker/Config.in
+++ b/buildroot-external/package/respeaker/Config.in
@@ -1,5 +1,6 @@
config BR2_PACKAGE_RESPEAKER
bool "respeaker"
+ select BR2_PACKAGE_RPI_USERLAND
help
The ReSpeaker series is a family of
development boards designed to enable
From 0c72515fa8b9ad97ae4e39ee24ff4010fb4baa6b Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 22:32:01 +0100
Subject: [PATCH 11/55] Buildroot: Respeaker: Make dtc a dependency of
respeaker - Fixes /usr/bin/dtoverlay: can't load library 'libfdt.so'
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 1 -
buildroot-external/package/respeaker/Config.in | 1 +
buildroot-external/package/respeaker/respeaker.mk | 2 +-
3 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index dd4806db..f00aa14b 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -82,7 +82,6 @@ BR2_PACKAGE_RPI_WIFI_FIRMWARE=y
BR2_PACKAGE_DBUS_PYTHON=y
BR2_PACKAGE_KBD=y
BR2_PACKAGE_PARTED=y
-BR2_PACKAGE_RPI_USERLAND=y
BR2_PACKAGE_PYTHON3=y
BR2_PACKAGE_PYTHON3_PY_ONLY=y
BR2_PACKAGE_PYTHON3_BZIP2=y
diff --git a/buildroot-external/package/respeaker/Config.in b/buildroot-external/package/respeaker/Config.in
index 090d3b94..69fe5821 100644
--- a/buildroot-external/package/respeaker/Config.in
+++ b/buildroot-external/package/respeaker/Config.in
@@ -1,6 +1,7 @@
config BR2_PACKAGE_RESPEAKER
bool "respeaker"
select BR2_PACKAGE_RPI_USERLAND
+ select BR2_PACKAGE_DTC
help
The ReSpeaker series is a family of
development boards designed to enable
diff --git a/buildroot-external/package/respeaker/respeaker.mk b/buildroot-external/package/respeaker/respeaker.mk
index e82b3577..2bc936e7 100644
--- a/buildroot-external/package/respeaker/respeaker.mk
+++ b/buildroot-external/package/respeaker/respeaker.mk
@@ -7,7 +7,7 @@
RESPEAKER_VERSION = be0812c70be29b0666a89f22a9d403cfb4c48fca
RESPEAKER_SITE = $(call github,respeaker,seeed-voicecard,$(RESPEAKER_VERSION))
RESPEAKER_LICENSE = GNU General Public License v3.0
-RESPEAKER_DEPENDENCIES = rpi-firmware
+RESPEAKER_DEPENDENCIES = rpi-firmware rpi-userland dtc
$(eval $(kernel-module))
From 5a0097334a57fd0d209c4801fc2ce777864f0cce Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 22:53:00 +0100
Subject: [PATCH 12/55] Buildroot: Respeaker: We need dtc programs as well
---
buildroot-external/package/respeaker/Config.in | 1 +
1 file changed, 1 insertion(+)
diff --git a/buildroot-external/package/respeaker/Config.in b/buildroot-external/package/respeaker/Config.in
index 69fe5821..8a01b876 100644
--- a/buildroot-external/package/respeaker/Config.in
+++ b/buildroot-external/package/respeaker/Config.in
@@ -2,6 +2,7 @@ config BR2_PACKAGE_RESPEAKER
bool "respeaker"
select BR2_PACKAGE_RPI_USERLAND
select BR2_PACKAGE_DTC
+ select BR2_PACKAGE_DTC_PROGRAMS
help
The ReSpeaker series is a family of
development boards designed to enable
From 2d77d26a62bd76b1d264a7a5982c91d4f5dfe02e Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 23:01:47 +0100
Subject: [PATCH 13/55] Buildroot: Respeaker: We need /dev/mmcblk0p1 to be
mounted at /boot - Otherwise we cannot access the overlays
---
buildroot-external/rootfs-overlay/etc/fstab | 1 +
1 file changed, 1 insertion(+)
diff --git a/buildroot-external/rootfs-overlay/etc/fstab b/buildroot-external/rootfs-overlay/etc/fstab
index 0a983ae3..0ff1bfdd 100644
--- a/buildroot-external/rootfs-overlay/etc/fstab
+++ b/buildroot-external/rootfs-overlay/etc/fstab
@@ -1,5 +1,6 @@
#
/dev/root / ext2 rw,noauto 0 1
+/dev/mmcblk0p1 /boot vfat defaults 0 2
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620,ptmxmode=0666 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
From d6f6c07c123531b66ef88b4fc38cd380f389bcf6 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Fri, 2 Nov 2018 23:09:18 +0100
Subject: [PATCH 14/55] Buildroot: Respeaker: Mount configfs before starting
seeed-voicecard
---
buildroot-external/package/respeaker/S60seeed_voicecard | 1 +
1 file changed, 1 insertion(+)
diff --git a/buildroot-external/package/respeaker/S60seeed_voicecard b/buildroot-external/package/respeaker/S60seeed_voicecard
index 6d0492ae..f385a3cc 100755
--- a/buildroot-external/package/respeaker/S60seeed_voicecard
+++ b/buildroot-external/package/respeaker/S60seeed_voicecard
@@ -7,6 +7,7 @@ umask 077
start() {
printf "Starting seeed-voicecard: "
+ mount -t configfs none /sys/kernel/config
/usr/bin/seeed-voicecard
touch /var/lock/seeed-voicecard
echo "OK"
From 843fef5d8ca2712887dec640fa3b092bc872145b Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sat, 3 Nov 2018 10:37:49 +0100
Subject: [PATCH 15/55] Buildroot: Remove pulseaudio completely
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 96e73862..f972ff27 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -56,8 +56,6 @@ BR2_PACKAGE_MIMIC=y
BR2_PACKAGE_MIMIC_AUDIO_BACKEND_ALSA=y
BR2_PACKAGE_MPG123=y
BR2_PACKAGE_MPV=y
-BR2_PACKAGE_PULSEAUDIO=y
-BR2_PACKAGE_PULSEAUDIO_DAEMON=y
BR2_PACKAGE_GZIP=y
BR2_PACKAGE_LZ4=y
BR2_PACKAGE_UNZIP=y
@@ -70,6 +68,7 @@ BR2_PACKAGE_FINDUTILS=y
BR2_PACKAGE_GIT=y
BR2_PACKAGE_GREP=y
BR2_PACKAGE_JQ=y
+BR2_PACKAGE_LIBTOOL=y
BR2_PACKAGE_MAKE=y
BR2_PACKAGE_PKGCONF=y
BR2_PACKAGE_E2FSPROGS=y
@@ -113,6 +112,7 @@ BR2_PACKAGE_PYTHON_TORNADO=y
BR2_PACKAGE_PYTHON_WEBSOCKET_CLIENT=y
BR2_PACKAGE_PORTAUDIO=y
BR2_PACKAGE_PORTAUDIO_OSS=y
+BR2_PACKAGE_SPEEX=y
BR2_PACKAGE_SPEEXDSP=y
BR2_PACKAGE_LIBARCHIVE=y
BR2_PACKAGE_LIBARCHIVE_BSDTAR=y
From ceecabfe3c37c8af6147be2ed34fe0446b19c924 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sat, 3 Nov 2018 10:59:50 +0100
Subject: [PATCH 16/55] Buildroot: Respeaker: Change the way of loading
seeed-voicecard - Only mount things if seeed-voicecard is ran - We can only
start things so no need for start-stop-restart init
---
.../package/respeaker/S16respeaker_modules | 5 +++
.../package/respeaker/S60seeed_voicecard | 45 +++----------------
buildroot-external/rootfs-overlay/etc/fstab | 1 -
3 files changed, 12 insertions(+), 39 deletions(-)
diff --git a/buildroot-external/package/respeaker/S16respeaker_modules b/buildroot-external/package/respeaker/S16respeaker_modules
index ad89238f..d659cfcd 100755
--- a/buildroot-external/package/respeaker/S16respeaker_modules
+++ b/buildroot-external/package/respeaker/S16respeaker_modules
@@ -1,3 +1,8 @@
+#!/bin/sh
+#
+# Load seeed-voicecard modules....
+#
+
modprobe snd-soc-seeed-voicecard
modprobe snd-soc-ac108
modprobe snd-soc-wm8960
diff --git a/buildroot-external/package/respeaker/S60seeed_voicecard b/buildroot-external/package/respeaker/S60seeed_voicecard
index f385a3cc..960228e4 100755
--- a/buildroot-external/package/respeaker/S60seeed_voicecard
+++ b/buildroot-external/package/respeaker/S60seeed_voicecard
@@ -1,42 +1,11 @@
#!/bin/sh
#
-# seeed-voicecard Starts seeed-voicecard.
+# Configure seeed-voicecard....
#
-umask 077
-
-start() {
- printf "Starting seeed-voicecard: "
- mount -t configfs none /sys/kernel/config
- /usr/bin/seeed-voicecard
- touch /var/lock/seeed-voicecard
- echo "OK"
-}
-stop() {
- printf "Stopping seeed-voicecard: "
- killall seeed-voicecard
- rm -f /var/lock/seeed-voicecard
- echo "OK"
-}
-restart() {
- stop
- start
-}
-
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart|reload)
- restart
- ;;
- *)
- echo "Usage: $0 {start|stop|restart}"
- exit 1
-esac
-
-exit $?
-
+echo "Starting seeed-voicecard..."
+mount -t configfs none /sys/kernel/config
+mkdir -p /boot
+mount -t vfat /dev/mmcblk0p1 /boot
+/usr/bin/seeed-voicecard
+touch /var/lock/seeed-voicecard
diff --git a/buildroot-external/rootfs-overlay/etc/fstab b/buildroot-external/rootfs-overlay/etc/fstab
index 0ff1bfdd..0a983ae3 100644
--- a/buildroot-external/rootfs-overlay/etc/fstab
+++ b/buildroot-external/rootfs-overlay/etc/fstab
@@ -1,6 +1,5 @@
#
/dev/root / ext2 rw,noauto 0 1
-/dev/mmcblk0p1 /boot vfat defaults 0 2
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620,ptmxmode=0666 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
From 2efec729d0444bd59c63c38594fbc76b901262a6 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sat, 3 Nov 2018 11:04:15 +0100
Subject: [PATCH 17/55] Buildroot: Bump initial image filesystem size. We are
quickly running out of space, bumping filesystem size a bit till we have
auto-expand implemented.
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index f00aa14b..f47582fa 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -171,7 +171,7 @@ BR2_PACKAGE_NANO=y
BR2_PACKAGE_VIM=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
-BR2_TARGET_ROOTFS_EXT2_SIZE="768M"
+BR2_TARGET_ROOTFS_EXT2_SIZE="1024M"
# BR2_TARGET_ROOTFS_TAR is not set
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
From 8b33ad532c7e274dc7ea2036757f545289d8fa1b Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sun, 4 Nov 2018 14:10:19 +0100
Subject: [PATCH 18/55] Buildroot: Busybox: Some adjustments and tweaks. -
Adding VLC for skill that needs that. (Not including mplayer as buildroot
removed that package because of lack of development since 2 years, MPV is
the new mplayer) - Busybox tweaks and adjustments. (Adding pgrep because
start/stop-mycroft.sh uses it. Adding other small binaries and tweak more
for speed instead of size.)
---
buildroot-external/busybox.config | 102 +++++++++++-------
.../configs/mycroftos_rpi3_defconfig | 6 +-
2 files changed, 66 insertions(+), 42 deletions(-)
diff --git a/buildroot-external/busybox.config b/buildroot-external/busybox.config
index 38de13d4..ed4f5a09 100644
--- a/buildroot-external/busybox.config
+++ b/buildroot-external/busybox.config
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
-# Busybox version: 1.28.0
-# Wed Feb 7 09:44:57 2018
+# Busybox version: 1.29.2
+# Sun Nov 4 13:10:23 2018
#
CONFIG_HAVE_DOT_CONFIG=y
@@ -21,8 +21,8 @@ CONFIG_LFS=y
CONFIG_FEATURE_DEVPTS=y
CONFIG_FEATURE_UTMP=y
CONFIG_FEATURE_WTMP=y
-# CONFIG_FEATURE_PIDFILE is not set
-CONFIG_PID_FILE_PATH=""
+CONFIG_FEATURE_PIDFILE=y
+CONFIG_PID_FILE_PATH="/var/run"
CONFIG_BUSYBOX=y
CONFIG_FEATURE_INSTALLER=y
# CONFIG_INSTALL_NO_USR is not set
@@ -42,9 +42,9 @@ CONFIG_PLATFORM_LINUX=y
# CONFIG_STATIC is not set
# CONFIG_PIE is not set
# CONFIG_NOMMU is not set
-# CONFIG_BUILD_LIBBUSYBOX is not set
+CONFIG_BUILD_LIBBUSYBOX=y
# CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set
-# CONFIG_FEATURE_INDIVIDUAL is not set
+CONFIG_FEATURE_INDIVIDUAL=y
# CONFIG_FEATURE_SHARED_BUSYBOX is not set
CONFIG_CROSS_COMPILER_PREFIX=""
CONFIG_SYSROOT=""
@@ -52,6 +52,7 @@ CONFIG_EXTRA_CFLAGS=""
CONFIG_EXTRA_LDFLAGS=""
CONFIG_EXTRA_LDLIBS=""
# CONFIG_USE_PORTABLE_CODE is not set
+CONFIG_STACK_OPTIMIZATION_386=y
#
# Installation Options ("make install" behavior)
@@ -90,6 +91,7 @@ CONFIG_MD5_SMALL=1
CONFIG_SHA3_SMALL=1
# CONFIG_FEATURE_FAST_TOP is not set
# CONFIG_FEATURE_ETC_NETWORKS is not set
+# CONFIG_FEATURE_ETC_SERVICES is not set
CONFIG_FEATURE_EDITING=y
CONFIG_FEATURE_EDITING_MAX_LEN=1024
CONFIG_FEATURE_EDITING_VI=y
@@ -100,15 +102,16 @@ CONFIG_FEATURE_REVERSE_SEARCH=y
CONFIG_FEATURE_TAB_COMPLETION=y
# CONFIG_FEATURE_USERNAME_COMPLETION is not set
CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
+CONFIG_FEATURE_EDITING_WINCH=y
# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set
-# CONFIG_LOCALE_SUPPORT is not set
-# CONFIG_UNICODE_SUPPORT is not set
+CONFIG_LOCALE_SUPPORT=y
+CONFIG_UNICODE_SUPPORT=y
# CONFIG_UNICODE_USING_LOCALE is not set
-# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set
-CONFIG_SUBST_WCHAR=0
-CONFIG_LAST_SUPPORTED_WCHAR=0
-# CONFIG_UNICODE_COMBINING_WCHARS is not set
-# CONFIG_UNICODE_WIDE_WCHARS is not set
+CONFIG_FEATURE_CHECK_UNICODE_IN_ENV=y
+CONFIG_SUBST_WCHAR=63
+CONFIG_LAST_SUPPORTED_WCHAR=767
+CONFIG_UNICODE_COMBINING_WCHARS=y
+CONFIG_UNICODE_WIDE_WCHARS=y
# CONFIG_UNICODE_BIDI_SUPPORT is not set
# CONFIG_UNICODE_NEUTRAL_TABLE is not set
# CONFIG_UNICODE_PRESERVE_BROKEN is not set
@@ -128,11 +131,11 @@ CONFIG_FEATURE_HWIB=y
#
# Archival Utilities
#
-# CONFIG_FEATURE_SEAMLESS_XZ is not set
-# CONFIG_FEATURE_SEAMLESS_LZMA is not set
-# CONFIG_FEATURE_SEAMLESS_BZ2 is not set
-# CONFIG_FEATURE_SEAMLESS_GZ is not set
-# CONFIG_FEATURE_SEAMLESS_Z is not set
+CONFIG_FEATURE_SEAMLESS_XZ=y
+CONFIG_FEATURE_SEAMLESS_LZMA=y
+CONFIG_FEATURE_SEAMLESS_BZ2=y
+CONFIG_FEATURE_SEAMLESS_GZ=y
+CONFIG_FEATURE_SEAMLESS_Z=y
CONFIG_AR=y
# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
CONFIG_FEATURE_AR_CREATE=y
@@ -149,6 +152,7 @@ CONFIG_UNXZ=y
CONFIG_XZCAT=y
CONFIG_XZ=y
# CONFIG_BZIP2 is not set
+CONFIG_BZIP2_SMALL=0
CONFIG_FEATURE_BZIP2_DECOMPRESS=y
CONFIG_CPIO=y
# CONFIG_FEATURE_CPIO_O is not set
@@ -160,7 +164,7 @@ CONFIG_GZIP=y
CONFIG_GZIP_FAST=0
# CONFIG_FEATURE_GZIP_LEVELS is not set
CONFIG_FEATURE_GZIP_DECOMPRESS=y
-# CONFIG_LZOP is not set
+CONFIG_LZOP=y
CONFIG_UNLZOP=y
CONFIG_LZOPCAT=y
# CONFIG_LZOP_COMPR_HIGH is not set
@@ -169,7 +173,7 @@ CONFIG_LZOPCAT=y
CONFIG_TAR=y
CONFIG_FEATURE_TAR_LONG_OPTIONS=y
CONFIG_FEATURE_TAR_CREATE=y
-# CONFIG_FEATURE_TAR_AUTODETECT is not set
+CONFIG_FEATURE_TAR_AUTODETECT=y
CONFIG_FEATURE_TAR_FROM=y
# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set
# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
@@ -183,7 +187,7 @@ CONFIG_FEATURE_UNZIP_CDF=y
CONFIG_FEATURE_UNZIP_BZIP2=y
CONFIG_FEATURE_UNZIP_LZMA=y
CONFIG_FEATURE_UNZIP_XZ=y
-# CONFIG_FEATURE_LZMA_FAST is not set
+CONFIG_FEATURE_LZMA_FAST=y
#
# Coreutils
@@ -228,7 +232,7 @@ CONFIG_EXPR_MATH_SUPPORT_64=y
CONFIG_FACTOR=y
CONFIG_FALSE=y
CONFIG_FOLD=y
-# CONFIG_FSYNC is not set
+CONFIG_FSYNC=y
CONFIG_HEAD=y
CONFIG_FEATURE_FANCY_HEAD=y
CONFIG_HOSTID=y
@@ -286,6 +290,7 @@ CONFIG_FEATURE_FANCY_SLEEP=y
CONFIG_FEATURE_FLOAT_SLEEP=y
CONFIG_SORT=y
CONFIG_FEATURE_SORT_BIG=y
+# CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set
# CONFIG_SPLIT is not set
# CONFIG_FEATURE_SPLIT_FANCY is not set
# CONFIG_STAT is not set
@@ -477,6 +482,7 @@ CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y
CONFIG_HALT=y
CONFIG_POWEROFF=y
CONFIG_REBOOT=y
+CONFIG_FEATURE_WAIT_FOR_INIT=y
# CONFIG_FEATURE_CALL_TELINIT is not set
CONFIG_TELINIT_PATH=""
CONFIG_INIT=y
@@ -536,19 +542,19 @@ CONFIG_VLOCK=y
CONFIG_CHATTR=y
CONFIG_FSCK=y
CONFIG_LSATTR=y
-# CONFIG_TUNE2FS is not set
+CONFIG_TUNE2FS=y
#
# Linux Module Utilities
#
# CONFIG_MODPROBE_SMALL is not set
-# CONFIG_DEPMOD is not set
+CONFIG_DEPMOD=y
CONFIG_INSMOD=y
CONFIG_LSMOD=y
CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT=y
-# CONFIG_MODINFO is not set
+CONFIG_MODINFO=y
CONFIG_MODPROBE=y
-# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set
+CONFIG_FEATURE_MODPROBE_BLACKLIST=y
CONFIG_RMMOD=y
#
@@ -627,16 +633,16 @@ CONFIG_FEATURE_MDEV_CONF=y
CONFIG_FEATURE_MDEV_RENAME=y
# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
CONFIG_FEATURE_MDEV_EXEC=y
-# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
+CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y
CONFIG_MESG=y
CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y
CONFIG_MKE2FS=y
-# CONFIG_MKFS_EXT2 is not set
+CONFIG_MKFS_EXT2=y
# CONFIG_MKFS_MINIX is not set
# CONFIG_FEATURE_MINIX2 is not set
# CONFIG_MKFS_REISER is not set
CONFIG_MKDOSFS=y
-# CONFIG_MKFS_VFAT is not set
+CONFIG_MKFS_VFAT=y
CONFIG_MKSWAP=y
# CONFIG_FEATURE_MKSWAP_UUID is not set
CONFIG_MORE=y
@@ -704,12 +710,13 @@ CONFIG_FEATURE_VOLUMEID_FAT=y
# CONFIG_FEATURE_VOLUMEID_HFS is not set
# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set
# CONFIG_FEATURE_VOLUMEID_JFS is not set
+# CONFIG_FEATURE_VOLUMEID_LFS is not set
# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set
# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
# CONFIG_FEATURE_VOLUMEID_LUKS is not set
CONFIG_FEATURE_VOLUMEID_MINIX=y
# CONFIG_FEATURE_VOLUMEID_NILFS is not set
-# CONFIG_FEATURE_VOLUMEID_NTFS is not set
+CONFIG_FEATURE_VOLUMEID_NTFS=y
# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
@@ -725,9 +732,9 @@ CONFIG_FEATURE_VOLUMEID_UBIFS=y
# CONFIG_ADJTIMEX is not set
# CONFIG_BBCONFIG is not set
# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
-# CONFIG_BEEP is not set
-CONFIG_FEATURE_BEEP_FREQ=0
-CONFIG_FEATURE_BEEP_LENGTH_MS=0
+CONFIG_BEEP=y
+CONFIG_FEATURE_BEEP_FREQ=4000
+CONFIG_FEATURE_BEEP_LENGTH_MS=30
# CONFIG_CHAT is not set
# CONFIG_FEATURE_CHAT_NOFAIL is not set
# CONFIG_FEATURE_CHAT_TTY_HIFI is not set
@@ -751,7 +758,7 @@ CONFIG_DC=y
# CONFIG_DEVFSD_VERBOSE is not set
# CONFIG_FEATURE_DEVFS is not set
CONFIG_DEVMEM=y
-# CONFIG_FBSPLASH is not set
+CONFIG_FBSPLASH=y
# CONFIG_FLASHCP is not set
# CONFIG_FLASH_ERASEALL is not set
# CONFIG_FLASH_LOCK is not set
@@ -780,6 +787,8 @@ CONFIG_FEATURE_LESS_REGEXP=y
# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set
# CONFIG_FEATURE_LESS_DASHCMD is not set
# CONFIG_FEATURE_LESS_LINENUMS is not set
+# CONFIG_FEATURE_LESS_RAW is not set
+# CONFIG_FEATURE_LESS_ENV is not set
CONFIG_LSSCSI=y
CONFIG_MAKEDEVS=y
# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
@@ -792,7 +801,7 @@ CONFIG_MT=y
CONFIG_PARTPROBE=y
# CONFIG_RAIDAUTORUN is not set
# CONFIG_READAHEAD is not set
-# CONFIG_RFKILL is not set
+CONFIG_RFKILL=y
CONFIG_RUNLEVEL=y
# CONFIG_RX is not set
CONFIG_SETFATTR=y
@@ -828,9 +837,9 @@ CONFIG_ETHER_WAKE=y
# CONFIG_FEATURE_FTPD_WRITE is not set
# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set
# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set
-# CONFIG_FTPGET is not set
-# CONFIG_FTPPUT is not set
-# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set
+CONFIG_FTPGET=y
+CONFIG_FTPPUT=y
+CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y
CONFIG_HOSTNAME=y
CONFIG_DNSDOMAINNAME=y
# CONFIG_HTTPD is not set
@@ -899,6 +908,8 @@ CONFIG_NETSTAT=y
# CONFIG_FEATURE_NETSTAT_WIDE is not set
# CONFIG_FEATURE_NETSTAT_PRG is not set
CONFIG_NSLOOKUP=y
+CONFIG_FEATURE_NSLOOKUP_BIG=y
+CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS=y
# CONFIG_NTPD is not set
# CONFIG_FEATURE_NTPD_SERVER is not set
# CONFIG_FEATURE_NTPD_CONF is not set
@@ -909,6 +920,8 @@ CONFIG_FEATURE_FANCY_PING=y
CONFIG_ROUTE=y
# CONFIG_SLATTACH is not set
# CONFIG_SSL_CLIENT is not set
+CONFIG_TC=y
+CONFIG_FEATURE_TC_INGRESS=y
# CONFIG_TCPSVD is not set
# CONFIG_UDPSVD is not set
CONFIG_TELNET=y
@@ -960,6 +973,7 @@ CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set
# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set
# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set
+# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set
#
# Common options for DHCP applets
@@ -1001,8 +1015,8 @@ CONFIG_KILLALL5=y
CONFIG_LSOF=y
# CONFIG_MPSTAT is not set
# CONFIG_NMETER is not set
-# CONFIG_PGREP is not set
-# CONFIG_PKILL is not set
+CONFIG_PGREP=y
+CONFIG_PKILL=y
CONFIG_PIDOF=y
CONFIG_FEATURE_PIDOF_SINGLE=y
CONFIG_FEATURE_PIDOF_OMIT=y
@@ -1046,6 +1060,7 @@ CONFIG_WATCH=y
# CONFIG_SV is not set
CONFIG_SV_DEFAULT_SERVICE_DIR=""
CONFIG_SVC=y
+CONFIG_SVOK=y
# CONFIG_SVLOGD is not set
# CONFIG_CHCON is not set
# CONFIG_GETENFORCE is not set
@@ -1071,9 +1086,11 @@ CONFIG_SH_IS_ASH=y
# CONFIG_BASH_IS_HUSH is not set
CONFIG_BASH_IS_NONE=y
CONFIG_ASH=y
-CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
+# CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set
CONFIG_ASH_INTERNAL_GLOB=y
CONFIG_ASH_BASH_COMPAT=y
+# CONFIG_ASH_BASH_SOURCE_CURDIR is not set
+CONFIG_ASH_BASH_NOT_FOUND_HOOK=y
CONFIG_ASH_JOB_CONTROL=y
CONFIG_ASH_ALIAS=y
CONFIG_ASH_RANDOM_SUPPORT=y
@@ -1090,6 +1107,8 @@ CONFIG_ASH_CMDCMD=y
# CONFIG_HUSH is not set
# CONFIG_HUSH_BASH_COMPAT is not set
# CONFIG_HUSH_BRACE_EXPANSION is not set
+# CONFIG_HUSH_LINENO_VAR is not set
+# CONFIG_HUSH_BASH_SOURCE_CURDIR is not set
# CONFIG_HUSH_INTERACTIVE is not set
# CONFIG_HUSH_SAVEHISTORY is not set
# CONFIG_HUSH_JOB is not set
@@ -1110,6 +1129,7 @@ CONFIG_ASH_CMDCMD=y
# CONFIG_HUSH_READONLY is not set
# CONFIG_HUSH_KILL is not set
# CONFIG_HUSH_WAIT is not set
+# CONFIG_HUSH_COMMAND is not set
# CONFIG_HUSH_TRAP is not set
# CONFIG_HUSH_TYPE is not set
# CONFIG_HUSH_TIMES is not set
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index be36d5e5..d02ad23d 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -56,8 +56,12 @@ BR2_PACKAGE_MIMIC=y
BR2_PACKAGE_MIMIC_AUDIO_BACKEND_ALSA=y
BR2_PACKAGE_MPG123=y
BR2_PACKAGE_MPV=y
+BR2_PACKAGE_VLC=y
BR2_PACKAGE_GZIP=y
BR2_PACKAGE_LZ4=y
+BR2_PACKAGE_LZOP=y
+BR2_PACKAGE_P7ZIP=y
+BR2_PACKAGE_UNRAR=y
BR2_PACKAGE_UNZIP=y
BR2_PACKAGE_ZIP=y
BR2_PACKAGE_BINUTILS=y
@@ -119,7 +123,6 @@ BR2_PACKAGE_LIBARCHIVE_BSDTAR=y
BR2_PACKAGE_LIBARCHIVE_BSDCPIO=y
BR2_PACKAGE_LIBARCHIVE_BSDCAT=y
BR2_PACKAGE_LIBZIP=y
-BR2_PACKAGE_LZO=y
BR2_PACKAGE_CA_CERTIFICATES=y
BR2_PACKAGE_LIBOPENSSL_BIN=y
BR2_PACKAGE_LIBOPENSSL_ENGINES=y
@@ -169,6 +172,7 @@ BR2_PACKAGE_UTIL_LINUX_MORE=y
BR2_PACKAGE_UTIL_LINUX_MOUNT=y
BR2_PACKAGE_NANO=y
BR2_PACKAGE_VIM=y
+# BR2_PACKAGE_VIM_RUNTIME is not set
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="1024M"
From 0b8fd4e50321b55379994541babfaf8a615bc0c3 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sun, 4 Nov 2018 14:25:02 +0100
Subject: [PATCH 19/55] Buildroot: Disable python-pulsectl as we do not have
pulseaudio anymore. + mycroft audio trows an error because it find the python
package therefor uses it, however pulseaudio is not there anymore.
(Leaving the buildroot-external package there is case people want
to use it, building firmwares themself)
---
buildroot-external/configs/mycroftos_rpi3_defconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index d02ad23d..9d9bdce4 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -201,7 +201,6 @@ BR2_PACKAGE_PYTHON_PETACT=y
BR2_PACKAGE_PYTHON_PIP=y
BR2_PACKAGE_PYTHON_POCKETSPHINX=y
BR2_PACKAGE_PYTHON_PRECISE_RUNNER=y
-BR2_PACKAGE_PYTHON_PULSECTL=y
BR2_PACKAGE_PYTHON_PYCHROMECAST=y
BR2_PACKAGE_PYTHON_PYJWT=y
BR2_PACKAGE_PYTHON_REQUESTS_FUTURES=y
From 820e7d502f15d1c84d7e757fc55984bea4c31e05 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sun, 4 Nov 2018 17:17:56 +0100
Subject: [PATCH 20/55] MycroftOS: Buildroot: Check for /.mycroft and if not
exist create it - This is a work around for #9 untill I figure out what
exactly is causing it.
---
.../rootfs-overlay/etc/init.d/S90mycroft_prepare | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S90mycroft_prepare b/buildroot-external/rootfs-overlay/etc/init.d/S90mycroft_prepare
index 7fe316ac..0553ae9a 100755
--- a/buildroot-external/rootfs-overlay/etc/init.d/S90mycroft_prepare
+++ b/buildroot-external/rootfs-overlay/etc/init.d/S90mycroft_prepare
@@ -18,6 +18,16 @@ start() {
mkdir /var/log/mycroft/
fi
fi
+
+ # Check if /.mycroft exist already and if not
+ # create a symbolic link to /root/.mycroft
+ if [[ ! -w /.mycroft/ ]] ; then
+ # Creating .mycroft symlink
+ printf "Creating /.mycroft/ symlink"
+ if [[ ! -d /.mycroft/ ]] ; then
+ ln -s /root/.mycroft /.mycroft
+ fi
+ fi
}
case "$1" in
start)
From 0a81b17fe85402bdd3cb56fa76c2878fca42eef6 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sun, 4 Nov 2018 17:20:48 +0100
Subject: [PATCH 21/55] Buildroot: Remove pulseaudio configuration file.
---
.../rootfs-overlay/etc/pulse/system.pa | 57 -------------------
1 file changed, 57 deletions(-)
delete mode 100644 buildroot-external/rootfs-overlay/etc/pulse/system.pa
diff --git a/buildroot-external/rootfs-overlay/etc/pulse/system.pa b/buildroot-external/rootfs-overlay/etc/pulse/system.pa
deleted file mode 100644
index 5d1746b8..00000000
--- a/buildroot-external/rootfs-overlay/etc/pulse/system.pa
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/pulseaudio -nF
-#
-# This file is part of PulseAudio.
-#
-# PulseAudio is free software; you can redistribute it and/or modify it
-# under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# PulseAudio is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with PulseAudio; if not, see .
-
-# This startup script is used only if PulseAudio is started in system
-# mode.
-
-### Automatically load driver modules depending on the hardware available
-.ifexists module-detect.so
-### Use the static hardware detection module (for systems that lack udev/hal support)
-load-module module-detect
-.endif
-
-### Load several protocols
-.ifexists module-esound-protocol-unix.so
-load-module module-esound-protocol-unix
-.endif
-load-module module-native-protocol-unix
-
-### Automatically restore the volume of streams and devices
-load-module module-stream-restore
-load-module module-device-restore
-
-### Automatically restore the default sink/source when changed by the user
-### during runtime
-### NOTE: This should be loaded as early as possible so that subsequent modules
-### that look up the default sink/source get the right value
-load-module module-default-device-restore
-
-### Automatically move streams to the default sink if the sink they are
-### connected to dies, similar for sources
-load-module module-rescue-streams
-
-### Make sure we always have a sink around, even if it is a null sink.
-load-module module-always-sink
-
-### Automatically suspend sinks/sources that become idle for too long
-#load-module module-suspend-on-idle
-
-### Enable positioned event sounds
-load-module module-position-event-sounds
-
-#allow localhost connections
-load-module module-native-protocol-tcp auth-anonymous=true
From 21d0ae11d351c433d12324bd4ef71896982df316 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sun, 4 Nov 2018 20:20:34 +0100
Subject: [PATCH 22/55] MycroftOS: Buildroot: Add empty /root/.mycroft_cli.conf
---
buildroot-external/rootfs-overlay/root/.mycroft_cli.conf | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 buildroot-external/rootfs-overlay/root/.mycroft_cli.conf
diff --git a/buildroot-external/rootfs-overlay/root/.mycroft_cli.conf b/buildroot-external/rootfs-overlay/root/.mycroft_cli.conf
new file mode 100644
index 00000000..e69de29b
From 9f30517a4b7d768d754113f9e96428802cd7d817 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Sun, 4 Nov 2018 22:37:29 +0100
Subject: [PATCH 23/55] MycroftOS: Buildroot: At first boot expand data
partition over the whole SD card.
---
.../etc/init.d/S00resize_sdcard | 16 ++++++++++
.../etc/init.d/S00resizefs_once | 23 --------------
.../rootfs-overlay/etc/init.d/init_resize.sh | 31 -------------------
3 files changed, 16 insertions(+), 54 deletions(-)
create mode 100755 buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard
delete mode 100755 buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once
delete mode 100755 buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard b/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard
new file mode 100755
index 00000000..1079c75f
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard
@@ -0,0 +1,16 @@
+#!/bin/bash
+set -e
+
+echo "Resize data partition ..."
+parted /dev/mmcblk0 unit % resizepart 2 yes 100%
+echo "Resize partition done"
+
+partprobe /dev/mmcblk0
+sync
+
+echo "Resize data filesystem ..."
+resize2fs /dev/mmcblk0p2
+echo "Resize filesystem done"
+
+chmod -x /etc/init.d/S00resize_sdcard
+
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once b/buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once
deleted file mode 100755
index 39cc5fb4..00000000
--- a/buildroot-external/rootfs-overlay/etc/init.d/S00resizefs_once
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-#
-# Auto resize root partition at first boot after init_resize
-#
-
-start() {
- printf "Starting resize2fs_once: "
- ROOT_DEV=$(findmnt / -o source -n) &&
- resize2fs $ROOT_DEV &&
- rm /etc/init.d/S00resizefs_once &&
- echo "OK"
-}
-
-case "$1" in
- start)
- start
- ;;
- *)
- echo "Usage: $0 {start}"
- exit 1
-esac
-
-exit $?
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh b/buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh
deleted file mode 100755
index e792e123..00000000
--- a/buildroot-external/rootfs-overlay/etc/init.d/init_resize.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-set -e
-
-mount -t proc proc /proc
-mount -t sysfs sys /sys
-mount -t tmpfs tmp /run
-
-mount /boot
-mount / -o remount,rw
-
-sed -i 's| init=/etc/init.d/init_resize.sh||' /boot/cmdline.txt
-sync
-
-DEVICE="/dev/mmcblk0"
-PARTNR="p2"
-
-CURRENTSIZEB=`fdisk -l $DEVICE$PARTNR | grep "Disk $DEVICE$PARTNR" | cut -d' ' -f5`
-CURRENTSIZE=`expr $CURRENTSIZEB / 1024 / 1024`
-MAXSIZEMB=`printf %s\\n 'unit MB print list' | parted | grep "Disk ${DEVICE}" | cut -d' ' -f3 | tr -d MB`
-
-echo "[ok] applying resize operation.."
-parted ${DEVICE} resizepart ${PARTNR} ${MAXSIZEMB}
-echo "[done]"
-
-partprobe $DEVICE
-
-umount /boot
-mount / -o remount,ro
-sync
-
-reboot
From aaf99dfc36c753429ef1e4b629a141659d5dd2fa Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Tue, 6 Nov 2018 09:02:54 +0100
Subject: [PATCH 24/55] MycroftOS: Buildroot: Change script to startup script -
Script worked manually on the CLI so converting it to init.d script.
---
.../etc/init.d/S00resize_sdcard | 35 ++++++++++++-------
1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard b/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard
index 1079c75f..085e5be6 100755
--- a/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard
+++ b/buildroot-external/rootfs-overlay/etc/init.d/S00resize_sdcard
@@ -1,16 +1,25 @@
-#!/bin/bash
-set -e
+#!/bin/sh
+#
+# Resize SD card
+#
-echo "Resize data partition ..."
-parted /dev/mmcblk0 unit % resizepart 2 yes 100%
-echo "Resize partition done"
+start() {
+ printf "Resize data partition ..."
+ parted /dev/mmcblk0 unit % resizepart 2 yes 100% &&
+ partprobe /dev/mmcblk0 &&
+ sync &&
+ resize2fs /dev/mmcblk0p2 &&
+ chmod -x /etc/init.d/S00resize_sdcard &&
+ echo "[OK]"
+}
-partprobe /dev/mmcblk0
-sync
-
-echo "Resize data filesystem ..."
-resize2fs /dev/mmcblk0p2
-echo "Resize filesystem done"
-
-chmod -x /etc/init.d/S00resize_sdcard
+case "$1" in
+ start)
+ start
+ ;;
+ *)
+ echo "Usage: $0 {start}"
+ exit 1
+esac
+exit $?
From 42e80786a77c603dc8692ce6037638745acd10b9 Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Tue, 6 Nov 2018 09:29:53 +0100
Subject: [PATCH 25/55] MycroftOS: Buildroot: Pulseaudio it is... - Enabling
pulseaudio and pulsectl - But not systemwide (more info:
https://community.mycroft.ai/t/pulseaudio-to-be-or-not-to-be/5009)
---
.../configs/mycroftos_rpi3_defconfig | 4 +-
.../rootfs-overlay/etc/init.d/S50pulseaudio | 39 -------------------
2 files changed, 2 insertions(+), 41 deletions(-)
delete mode 100755 buildroot-external/rootfs-overlay/etc/init.d/S50pulseaudio
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 9d9bdce4..67fca2f7 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -56,6 +56,7 @@ BR2_PACKAGE_MIMIC=y
BR2_PACKAGE_MIMIC_AUDIO_BACKEND_ALSA=y
BR2_PACKAGE_MPG123=y
BR2_PACKAGE_MPV=y
+BR2_PACKAGE_PULSEAUDIO=y
BR2_PACKAGE_VLC=y
BR2_PACKAGE_GZIP=y
BR2_PACKAGE_LZ4=y
@@ -72,7 +73,6 @@ BR2_PACKAGE_FINDUTILS=y
BR2_PACKAGE_GIT=y
BR2_PACKAGE_GREP=y
BR2_PACKAGE_JQ=y
-BR2_PACKAGE_LIBTOOL=y
BR2_PACKAGE_MAKE=y
BR2_PACKAGE_PKGCONF=y
BR2_PACKAGE_E2FSPROGS=y
@@ -116,7 +116,6 @@ BR2_PACKAGE_PYTHON_TORNADO=y
BR2_PACKAGE_PYTHON_WEBSOCKET_CLIENT=y
BR2_PACKAGE_PORTAUDIO=y
BR2_PACKAGE_PORTAUDIO_OSS=y
-BR2_PACKAGE_SPEEX=y
BR2_PACKAGE_SPEEXDSP=y
BR2_PACKAGE_LIBARCHIVE=y
BR2_PACKAGE_LIBARCHIVE_BSDTAR=y
@@ -201,6 +200,7 @@ BR2_PACKAGE_PYTHON_PETACT=y
BR2_PACKAGE_PYTHON_PIP=y
BR2_PACKAGE_PYTHON_POCKETSPHINX=y
BR2_PACKAGE_PYTHON_PRECISE_RUNNER=y
+BR2_PACKAGE_PYTHON_PULSECTL=y
BR2_PACKAGE_PYTHON_PYCHROMECAST=y
BR2_PACKAGE_PYTHON_PYJWT=y
BR2_PACKAGE_PYTHON_REQUESTS_FUTURES=y
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S50pulseaudio b/buildroot-external/rootfs-overlay/etc/init.d/S50pulseaudio
deleted file mode 100755
index e836ee4d..00000000
--- a/buildroot-external/rootfs-overlay/etc/init.d/S50pulseaudio
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-#
-# Starts pulseaudio.
-#
-
-
-start() {
- printf "Starting pulseaudio: "
- umask 007
- /usr/bin/pulseaudio --system --daemonize --disallow-exit
- echo "OK"
-}
-stop() {
- printf "Stopping pulseaudio: "
- pulseaudio --kill
- echo "OK"
-}
-restart() {
- stop
- start
-}
-
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart|reload)
- restart
- ;;
- *)
- echo "Usage: $0 {start|stop|restart}"
- exit 1
-esac
-
-exit $?
-
From 0d1ea12fc0be4a58ba4bfcced91dc59a2103d3cd Mon Sep 17 00:00:00 2001
From: Peter Steenbergen
Date: Tue, 6 Nov 2018 13:59:01 +0100
Subject: [PATCH 26/55] MycroftOS: Show a boot splash as early as possible in
the bootproces A clean "empty splash.png at boot however the same fbv code
can be used later on in the develoment and proces to show the user where in
the boot / configuration proces we are at. - "Connect to wifi SSID" user
information for the wifi configuration - But also possible other cofiguration
step later on in the wizard
---
.../board/raspberrypi/config.txt | 2 +-
.../configs/mycroftos_rpi3_defconfig | 3 +--
.../rootfs-overlay/etc/init.d/S00asplash | 22 ++++++++++++++++++
.../opt/mycroft/splash/boot.png | Bin 0 -> 120993 bytes
4 files changed, 24 insertions(+), 3 deletions(-)
create mode 100755 buildroot-external/rootfs-overlay/etc/init.d/S00asplash
create mode 100644 buildroot-external/rootfs-overlay/opt/mycroft/splash/boot.png
diff --git a/buildroot-external/board/raspberrypi/config.txt b/buildroot-external/board/raspberrypi/config.txt
index 38cbf8db..fc41e995 100644
--- a/buildroot-external/board/raspberrypi/config.txt
+++ b/buildroot-external/board/raspberrypi/config.txt
@@ -11,7 +11,7 @@ kernel=zImage
# Disable overscan assuming the display supports displaying the full resolution
# If the text shown on the screen disappears off the edge, comment this out
-# disable_overscan=1
+disable_overscan=1
# How much memory in MB to assign to the GPU on Pi models having
# 256, 512 or 1024 MB total memory
diff --git a/buildroot-external/configs/mycroftos_rpi3_defconfig b/buildroot-external/configs/mycroftos_rpi3_defconfig
index 67fca2f7..44ef1cf7 100644
--- a/buildroot-external/configs/mycroftos_rpi3_defconfig
+++ b/buildroot-external/configs/mycroftos_rpi3_defconfig
@@ -78,6 +78,7 @@ BR2_PACKAGE_PKGCONF=y
BR2_PACKAGE_E2FSPROGS=y
BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
BR2_PACKAGE_NTFS_3G=y
+BR2_PACKAGE_FBV=y
BR2_PACKAGE_RPI_BT_FIRMWARE=y
BR2_PACKAGE_RPI_FIRMWARE=y
BR2_PACKAGE_RPI_FIRMWARE_X=y
@@ -127,8 +128,6 @@ BR2_PACKAGE_LIBOPENSSL_BIN=y
BR2_PACKAGE_LIBOPENSSL_ENGINES=y
BR2_PACKAGE_LIBCONFIG=y
BR2_PACKAGE_LIBNFS=y
-BR2_PACKAGE_JPEG=y
-BR2_PACKAGE_LIBPNG=y
BR2_PACKAGE_BCM2835=y
BR2_PACKAGE_WIRINGPI=y
BR2_PACKAGE_LIBMPEG2=y
diff --git a/buildroot-external/rootfs-overlay/etc/init.d/S00asplash b/buildroot-external/rootfs-overlay/etc/init.d/S00asplash
new file mode 100755
index 00000000..2c52ed5f
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/init.d/S00asplash
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Loading boot splash
+#
+
+start() {
+ printf "Loading boot splash ..."
+ cat /dev/zero 1> /dev/fb0 2>/dev/null
+ fbv -f -d 1 /opt/mycroft/splash/boot.png > /dev/null 2>&1
+ echo "[OK]"
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ *)
+ echo "Usage: $0 {start}"
+ exit 1
+esac
+
+exit $?
diff --git a/buildroot-external/rootfs-overlay/opt/mycroft/splash/boot.png b/buildroot-external/rootfs-overlay/opt/mycroft/splash/boot.png
new file mode 100644
index 0000000000000000000000000000000000000000..eead9ed8d84ab81f79dcf973d4bf2c35f383c901
GIT binary patch
literal 120993
zcma(2Wmp`|^9BmfE{nUnJHg%EHMj-|9$bRULU0T28r%{H!68}P-Q6t^+#zuC{QmEI
zov-J^v{Y61-CcK2&(%{i(Qnli&{0TG002N&Qk2yK07NJNKm?KC{z*2_x!nF`5L+oV
zDFCSdjQVT=|E~`6&{B{FzK)X}{VQ+2Rn?Ju6Enu~d6Fx6iZ5f9FMXCXagsG|T>Q)O
z>+7pf?t)n1l5pOFVD>z3`iw}yqFB)qd%^^7+6-sXlyLqcPwKQl)*N@rv}nO1Tl@r1
z+6;f@tYFSOf7Tp(`~-jI+{EE+!PFn;)*a=F)$7N<&8ruO*H4jshk9Q(-v8KIIlZr5
zI2+l%^8dA;GV;4;`#P;}-@j>7Flo}fe0lHU;p+ZbyKug4=0rYgCaQC%bLD(&@49&O
zX#C)2@#uDR_d0vzci#B1^S8DA%ZHJjtBire{maMPvEzfQ$Bco4tB2>zp~LKvqxAlR
z@%@{SpSziZhjw)vqq|p2$G4+9S9P<0@+VKShL7y(H=LTc$M&y1o3|VqxAG=VDrZlX
z^XEfx?{j}Vnzp(&E^X@8b!*qV
zx2|%>kApjQ+!{9QzHj_oIj@*Lv8q}1>DaZbUNx>-)v8#XIJj|W+R`swI=Fs}@7)jU
z+BYa)mM>nG`?CCF>8y0(c;(N%cl)k<_N;B)`j5r4vHcsX+BL=8Ip>xg@vPa#rE|67
zCFO#J@~IPW}Df9Y`U#sW8)-G(mt$l3W7EPZK%bcy4`4jzXS21Ug7~#JZi}Szq|Fa5-=zr$_*9r;+
z{jc_a9sa+n6O4E8!~pQ0U|~=xRqEe@{|5$R<5pHg=K4Q*^D`-S0zv5i;j?SvL}MiX
zU-@*B<%OO%lJ(!6a6$<`PrQhnNwpCb6U;9XHD}R_27taH&@0tV!q^j0f7dohPrA0v
z*{+_XfT%Xn_kY<%fkZ;cU^smTvYf6BW467C0sz=lvm-8os1CPRdMWnlTN9BbmS-A(
zbx!hDQz%)h*a_lDF~)bME85uA(m;7BFN+R^F5qyuv``}ewu9p?0i?duV|{rU)MqHi
z|5W-o9JoK?p|!NX3Ig@6CP^(f)y46auK&YXN5OH2UzUfZCrw3KM85ZTJNT0*K=T2B
zbcFgmfd4f@m)Q?LxlMC-u+=h+=-5lK@Sq037~-ZsL-h%&Upsuh^=a3QViezv;8j
z0gwdGeOejrBv+6OxH4rkuA^p1C%c3q*TG*_-i%zGRW}=J8&gnguKui7E6|f5A0un9hBRcM#$(;>Zr+mxl?p-*;7W%zgmDRV(;cNZ(6=-|=uV^Q3AHjS5Lx#B
z(5|1F*iV$b9#Ql;#l6#LPtn4w%0qO`raqJ8CuHfmJ)S8+==H8dHL!#8(FNt+-*<}<
z+X_>jbvV)4HRlp-O%Bk=n90l)wU{ofs_iX)(`J2s83e(m|*mV{>Nbrtu^>`VX$DZ
z%5AiWu1Z|C>zmKn=@$PmjBoDyc55r952E{yU>s|9VWISxKy@aqJ)U*w76;?tN<}W3
zzG=jh$s6vEsy8+7EDKJQGb420GznE~1xKa#=10y2dl*A1!%}s(54M)L4s&ate5WSZ
z_>0<%Li$0te{PXZxsxe)t`8B5N1u;%d7+Wn$+_wT1R|K$jXKo67VzcROF;XoAatF^V-@%-t
z?N%GTN1R-Ik^K1?F1>f;zgA9|=7q!qhM*?%3(zcgArtSSjJAt#_qhFJsS+
zlBAKT^=}lhV}YYYP8%xc$(<@RBfdiLs2lY>MBu@`b100u^^E
zO25&7wyczF3$lV=;`?CmxoMv_cge6uKB^I~C!Hjqa~$nW5FTS*_&kp~ju(QMsJP+s
z%mUq%egfH;6~+F0KL6rgVzwIq^mYnNPAk?KSS%Y%8
zj)jdlE1e!PV1>M6%j}{A1@4}f=&yz{P6>L0+Xq60y?ukLGuM`R8v0O0J+6!kJ8_Nf
z;U%?!$quoK>%t=fTYZA&xuUU$73H|pyuX?It3|ABnYuII$MP_I7AEJ|T?y6}s_)v{
zQzD(c=S1?*KeB(I$D}>f%fV8?5&e;5zWW7IZgiWG!$nB&wV&E}snsF8109V`J(S7C
zyPI*|y5@gS_d@#Q^*E2(`SAWg2UCM-14TDm8kGhflLkeD6*TX^*j|
z#8@Pc_MJZoq8i~d^{16x^596RRnzMvp27}TB8c77N56=*A;$%x1@KtgnM=I=LtMr~
zR!*tsxMQ6_t8gC{-gRm~Z<#$@^j1W9l+j%UGbv(|8Yi~@iw){BN^YBB_0&mKXKoa^)lFs20+52&PciJI>IlNq*2a*^D=F#DC>UV}xxOw5@xO%2iXK
zqr6<1>QG4TpP?%ZeHZ1NscCd<&I?MuZ|XMoRMedr
zXC~d`IPk#yrO7Yqkt*v-tKM%_uct?^lwhO&vmGIYecFTX^R+(cslqDz67QZBRd+ls
ze34QTNt(B$Ig`0`5T5fA#Ergx@ZR%9ME23YQXn~A)unvK|D1t{^L^3D!2mITL_LX6
zoA*(YBsG#V4Vg^;Iy5QHBJFue?osc$nGam%Rnwtsm)S%u^81rUpLz7O_F%Ge6f`R@
zP?$N6-ep&hLN&9qlxBs_yvJjP6WPZs-@77E>rV`nZz>1{oKIBZM>5KVfkuAx0jUL*
zj(~r>D{PNim1oIw0FwK8AptCWHKyH31EU&xU*{=f?gvJgN$}~QOHAw&{r-#OB{03R
z+%RC~9s@NNs@9%NesJ7%k1oSbJX_aeDt4B*usTPS&A$9i3WocMK;lZ8Ao?x_c~PI$
zQ3|HC`TLN=471-QE(ZZM6?(Vl8yQ*>7+<8jtX6xCbm-KKM(56#kK8pc1G8pQwRKH?
z=L5-&Ncn~+2XjjF>gxaKqLA;+q`15UxJs5Q*T8>D)6{6VlIJ$S21yLf{(~U;soqVq
zIjRa{zZ-y;f$fxGbArwWuQ0N-3`8B&O8eoK1p!d4oaOd
zm|cNziZJFPXB``a39s~&4Yxpf9QLWMUv#~AG=Mzc>AC$_DEiV6^B+*eFVba-&Wl#^
z1?w<#B!f)(yl^{0CBZE%sMPeh*CrHdo0Qd@9TEa<@acn`#2%rknO?0Q1FHAxAQKcW
zvIAzFs&Rce82u6@sGQ22e+n)Hiij+Dv1=`lBp5q5jJz1BnsR~bFLQ-uc~^{QUI1aG
z%p>qC3YUjgASVkTT<$
zCI4`nNyJ9HY~c}6Vs0ad2NmyJJbm+dkoobbkxKD8Im5MY_Da2br($~RpNwccpm3wY
z=zHdpn)cm2?DQJ){2(>BRl?!
z7vx)?T}7Ww9)hv5i>^D;v3tOOC)yhYQB6C>f9>8qTntg3O8!Dv*p?CZcNFb*;0K#p
zNeqR28)bY*9O&*d+X%k5{L5(i`61*e!+XqUoXIzb3shb
z&tW-mCAwgG)wGb>{(gpew9pz{f6f%s?D;hjK_2#)-lzq&+XiuUy2hUxA>W;R<>(Id
zd}OqSM4qK^BM#rYcnk%)}=6Y96&W>f4W_5^v#y6US^SY0aBJ9puth+wZs7oY86U6FgN@KB$=%D~Ig->w3E_7PZy%!j$IC8lE~=JSV=$RF^#+fK3@sj)ZT2+
zwK8U8GMcx`wSX5)Td*+&XS(Z@;UqpS7o!f<+O-htIAPG56OP;mmLsCY
zDq6-G4SQ6N^L=*%jlBK$5MGHu5-k6P*3x%}%PEoia+B!jx6^9grR}?7Wsl19A^wBS
z{`MBcQ9KPgMIuFn@+$YvMXiXGh|R%H?NeC{1bbLg<>?`+qVG%)!27TvE
zd!Gou5=So_*O$1hF>FqWw{5Y|)|_n+V>mu*{Xtv9yD~`1S5ZzBDaQW|lM|fJCFh1g
zt~o}H;sH?$se(&b3}w378p(r*meqH`iH;se9j~+A)ZlWWdZT~+k9Tb_1)HR327%H#
zL)tCwWDbd#ZN)sFpcj^mcP^snFEmY3nMt^e^atd9G~~ri4Z^||o^0pksV~=PWv;CY
za4%yiHx+;M1w6LqhV9}tT2OL@MR*85-$3Wev0aHmDF8kvk4%x6@x4P_9e6Dw1I)
zNZ#z{J7_WF`ALZS&?0kr^J-xBTUb}`lnC@glyw!n(hbKR=wO0q9S!u_8vHaT2oZCw
z6f0fSB=)%pmH1NAKZQBb
zBi{w&M8IN;$9zY?VoeU#P~{bXls&HzB>%?Y(L%o18+r
z;jf(rk{|Zhe~=N!D{2PcuA-gg{7ZAISG#5=PR^cGv-UYg;BUc@=NobCUVkIMZX(dg
zLoCOg?`xd-Z2r0RV~F#Z4|xcpPwE1f?m!=$Am&R4m1{45<1Z}GtC4WdwHj;#^8EL~
z2=Z(ksP>X~xOJt*)x>x6XAbLq^3U@w4ZL4upn-qpXdso__+Pw#x&=VNxaZW|Dg|<|
z8JR*e)~9|IT-OuV{SoTkT4Ckect-jk!D^eCK3U(AFP$C+AIy|t!P*4IKatc#C)X6cL#8U<|AvQ-4jUGOdr$ZVSSDugz6h^IvmSy>L{mN<3rZ3w4W9ItjuU%O(LX&A1
z^P-y7VY8F^2-Hj=V(hiQ*Y*`bg32c r!a0BDv$i-tpJo8Rbf!Qxwf^m<*JMX1AQ!IP?_UhlY;W-WgSMU$
zRrWgJSBRJu?PsoenUCUyomXZW@}NiG#2_6nM?1KSUJ8OvSJ;PUhPOoE^$&(aR$uPK
zIHPdurv7bUjT11DYKTc1_DDRg>thyV)e}-kNw*m&d!+`uf^-y#U@~r!H*u*M-M(mM
z3dVoOBU6D1t34y{w98BuD8iCF3H*_LmTRkOvppx#A1aAeTM_1d#JIKf^f;I#YPHmK
z+#tHlT?CF`m(cGHDs--?z~rPVbynz(c6I34C|$LERt61=i`FtmSE&86#O9+nk4UB4OWgv2j!7m~DorYi&apdD2`Z&F
zF3R5o3&;f_SF@jnnyzq1a?~HDko;OK`EbMrD#TZsNy#fK9d?Xi-Z6B}eb8wz$qk^x
zvfssNGc6)XQ`;^Ra8mrnLPggRQ4Y_g^?Ncvi2CX#e1dFW*MvpsGt%3eI=ho>HHvfl
zN4xI(GB_}WgW;qEi8rWfg_&Ij{X{mSNc)5N19zpaf|oJ;PP+If68=>AbpeB}QZd#~
zYC`<9hf|8bTa40kwq1S}ea5b%#F8$&MxJ?4w6n0{lk$~>jmHSf;+&c-pBDw?lJjaR
zMU~YmPAL
z^Z{Tn#gLsN)u;Szz`@sQ+mW`WjqGWBj38!KC`;45i5Ow>_ZyU}P_t`3>JF|`ax8+u
zA9S9`Z}i9$54P!h^hd7VP}3=YP%LiNTr9|J3RrDnHEYDLElX0L!Li<%gdd2*>&(
z83;6tun7HTOCo&pR@(W!RL_TaJXqZb%Xin@4kRlT(@4-rI3ir7PLTV8yTjr%?wh=pgcYTS|NZo0
zX+)HxD4_}GFiEEX>xvO{;!%q2(Y0IsIzdkY;>F`dvPzxYEQ7FW4P1q_1b7KpgVQ6#
zm0>6i0|!=8)8!N|yC$ZV)yTt$U@yI1cUM|@>e5{>6PGe0Adrs2V|h%9dEZZ`A}%$w
ztd&fX#k#D*@|`I|`gDqTno1$neWCT^tAud^wPtfKAP*rM{KvSd#?jCC>**!=w;%s(
zUF9rG!WwBX#CnYQ;O(aPn&60}+2$+e4?9)!myOQgD;=l=_G(
zS8D!CmwXqKXtBeK*2b5`Yn{~y-c*Vaa?A*=A?emSMAm=Y>-gpGTs3^X=>tZkVPWgr
z9-eF>5S$e@{L0x@Vi4%A<85VS9ZM6(mwlxB>?<%Aow;+vZ}y=N;GTUP$yGtp}*>u#!_g
z4;04;<(Lg3=ugF3@Q$nQy)D^pG#yj>)ccM+X0pXwdH4nw?3GrcAYP)lyrxmiE`qek
zCw2*iV?%vBFfndo=qM`+4N!)qn|4i(wD=1+A2n1Ik@G1QXMC{4%q&&+LTT7{9)_5V
z%AR`R)S)pQ;_`ENhWd2PcS*)Lm`?UT
zZ9I_t<8%Y-ID8{oKCH@l>yTh-ILrJb*OvP~O3BvR8}pcwjEUEAT<79we59;0O?K3M
z*}jHJkCcN2CvT)aZVr?T|z$V%}sX?R+b~7
z(0exq-s$-rC+Y)Ru#w>7XDG-+tm%(uX`Ny8HkF*eFm2oLbY73>KE}dOry$yh=IA
zw0)e_jraSo2oDP$a>e_r{9UNv&RiSEI6q&=DfT;!5#J@yQ)<1ZO@Ah{CghGuwR;0d0*f
zgiQA
zD+LFDl|I5X$ngMTP7?LU8ff76;KQS|gLf51g!Kggcje{v{9EH+?0Jb{JqHB9fnqC5
ziPaKd&H&u94^pN!;zFyP0`a!}-o0Ul4v}zjcbRNs1BiQNkIu8k62*GsJG`={m{xoUCD6yG283-uBA;pPay=(CtCRP
zf)gRYp-}@|m-!~MrTBl|Zjp8RSoQz&c0KtYZ4%-HAoq%gL|%^kuOnogJ~tlvgdA01
zk5;xGKIZ=O2@m!~N48ZFAkYdhxE^{zB;|PZNewLnY&^`0@jS(prBcLm_`o(($g!qo7g3Js~VFuZH_GxG8N#8COW)TIgo-Ly~}fhmHdcZ)nS%#|Y0hhjc}Ud;G3syrKyx3Qf&LwmAjOclKpaT!pZZhG?T37W;&jMX;vNQGEANxx30`z3)y1HLLr
zHQfG5v5ap#Dc@$c`_KJW7({I)g;zhBB1LoQ=4We5m=A*<$rnD*3pOZ7DV1rT`x60Z
z?|@v?wHk1p9o3ioWPy!3Jl^_v6YceCHUj~dD87CF?KsI9)b}z9QJpP~u-H{LKrviv1T3@cxqmpoJ61MvIV$lAPJ^iT;W(
zL&2o3i~39Q`A;U!P0|(;?8GcR+6JMMkv$^qd{@TH%UItT&|9Ej)|%wY;n>our29up
z`fo*y!O6sn{5LOL)B5nx3*Q@qU)BJooPnb-Mmf`-&?YmqzGrdkN`#A$KXL~FQQ~7O
zJ@$y8GM`Sd8VHU0RKI3Sgblj1p@c4*|Gb6)5X9EK(8!oKvy_E|c!_=DwyoC~bls=&
zB(d2@QY83ZgEZruuRf;5Ua*ehN1XIcQO+PTn;gcEXJL(x$k~pl|Mri4QQJ?X*mYUs
zuoWXpyZFx^YHOrPSU_9QPhv)h=0$;|*GuAk9VNQ79TZiBs|m;na?MLpOyWHv%`^Nw
zd}I`dz$W^)XYAOz#kay9_3Nsr=30;@{1w@V@-!6KOD<3M+M_Z}hl)cLEta+Eo3qJ9kJvutNrnL_5l0AbrGeR9#i)u{5M(&52Kj#qRs^Y0s77nIQW4qP*&?
z4$o5@5fE4|`zx=tt1pJ$5Dha11u#k@Lktsn9N+oS
z7jIrJng-@G?mWDu7C7Y|eTTeLNR=kVzWP+!L3b;9f-CcT?XwTk7`FfJNFromP>*W_
zph&0YT5|a;jsF7ywtJ4kI^Z;vPCbS4oSU8&_lfC-flwQu-TR$E{YUvf>V_O?V>aBq
ze7<*}AuH{SIv*4)*8XgIsxVo6){|p2RpJ)avl&^?~YXU6Q5npNxtn?{AY<1e_w31vRsspPWdl?aF!`6xofQcO_m;7EDYnee0
zR{;LpYjC(47+qOtC!ChEvd|Ypk~E13tMM-ebMg$C(zPt6o*E=3FWbnyIYPmIerHmz
z9Am9CmGT44UL}5YXh*GlT7cO&;>R4=fE(*;`HZ#VBL97{72q8~zfubaUE-z_7EsjPX~o~@{alNNZzT|i;%x3pX}3{A~L+v
z?!E3#N&)^RTE)KUt-zV10fTN`rVKX)obzEZop)ZpxOJXZY{dvVY+NiKW=jEA;sx=+
zW?w)LKkk(GUDF#GKh1TL8&mX~slS>rkS>R2tb%$jwf9;J{@<&PKd673nEA=b?s2J?
zo)OTgru*2@a>636aCJ5L|(=~4;67ScCOd&mu)Hf_aaGM|V&>fLI_w6=j0OuSt&_o7u
z4nCDKP@VgfBM;;G*4{dWoflC}(hSJ4pY(ugMos!W8FsF?udD_2SI!9DAk=-6Nq5=b
zxbeC!VQ;o1<7S#4?StE-QEZ25EM6VJ38Id61Q>8UgBLw3Q3^zf6NE<12%#dnD}k9`
z!t3PBDQN1!K1#+I2r$f@*d9)hNgupyW@Z^0Omv`?=p?Z
z7ih?IDe*N+%}5(>f#6o-&c^?Ih4JVa-d_w+C=UH3YDQ3SbrT{^q5o
zIa3Vb9^8^?f12MN@GD^-AGl47s;3??x^FtM&IvaV%)~%}MMyjuQ@iLK@mJx{>8_vS
z=|1YFsKc276RBC{!(@H=RMqfxGhM+i-=)|4Q!$jVQ2#f!XL;Ko7c2(oP8CS+w~Y=k
zkC!UjMDz&H{RVAi{Q>o=Q#kt|R_1SNn349Vh1%qz34atGj9~A=mhcbH*6aX?s6w2z
zI0@SCM{A7s7o4^Bmq`6#3OMbcdtW1`XQ5lwgaMek2EQf(jwFg}-B};9@c#x*myYw7
zbCsI$X=n5i!g#Frhg?rS)q6FPT0CSU*E8^RXBXC6R}lCXb#KO4Ixh`0N7U$L7#RW>f|TXUgknA5Q1)=<)0z|r4{hyhx>
zjG~g~5cA;;tC}}r)AW0E?kg?f^E#1*xszVdEJE9JzV6jO&98RvG%XL<(zCRgeS3wc`&a($}4-xiZq2}%;W@{}S3IP6A>
zCVR36(cCE$T5KfeTFWxax+vSc;~g~4mngn{)GZS*V~6LjUW@F}rs)?)CDaKTq(EnN
z7zqJd>c4zNbt86_V2QJO_SU__era*s#*(TgmHN054r^0Mp>FkEl&WPWZ>uy$hEis4
zTG(r|)_{C)lOuuo0H5Z=)Q?oaPeaWE2lDAPafTR(L>5D$T5+`0py;5k!oCZB`h0;H
z?{`tQGwT{-=^ATtEuJ3P4dV2STarZHT)HLN`hN32UxW@hfdGvfx1qVu*~VKje^p4}
zLX6+ZE%&YaQg&}>Ib_pei0E#p2uZShH1#!1!dH*+dxsdDCi!V-x}v=dgLp*+M>zmR
zr5zdt{-M%(jRiad7_FunsMj@e;dCV|u^JN+w}GklaI262KlpWZ4nSL3Xnp5t<{UTZEKDnu-{TKDbXDun18{E%#i`x%An8ksa2
z(LVG?9#0{K>OJ;HMCZPpK=*bU_;JbY-`0ux%KE}^aVz6Cby9k(TTgM=-P`>gp`TJZ
z(npn=DyqeHzi#GjY7ZWFKz{otCj4M6!9MV}c*B7z1$P
z;{>(x?u3=Z9)yyR^k!7u2M9f~YlDMJKvTuuNQT$G`&0RZ%$MWv0Z9W6RKMH7zyn_6
z_|euDZp-ZNEnR1SWXX`(3pt9Tn3h;!FFJ}0tu}1|dwdg^nlxmcV9@$wMk~tsI^bpq
z6eQ}dLZyGLX`NcS0&u(gL$3U~tsQMHEm2ojWRlfF1Lm&dNXRjx^Qnl?wp$Kxt2hT2BPsG+ywv?Pw~hJ`(wIE!T39`=Fuc#;GG^ip4udNK_`hmFW6!~^wMyU(E}P~Nm>4SCRL}af?&3bsj{jhyNd0Sjro2F=@R7-D
zX_vOKrCMy=_Vh_&-?|=`5roFyge?_p)7H*nk>puIizWJUi{)h>u(+4qS&g2u^nP&H
zCKe<|J^xr7XUMdlW|KZ+8^IndM>m%7)1aJ4gD*4X%9PZF*{-HDG%CQ!WT~!J-Eq~8
zy)QMTuD
zM{k7-9~Ro#3;mTx{_yrlXTbZIH+Zy3)p0&~{ws-PYe`e4gR#b-FWSeUodn^9oCRS%
z>+*RVNCCEC+=_51E-!|mDRNY)7+3f^i^*`@cSn`Axrn_FW$zPsD2Gy;ZI-KVk;B6g
zhvOD>E(2|J{aE$B3Mqij`TO@nh!-D;J#?3uv6%+m%QcM_#=S|2*DbT5j3ecJQR-?x
z$=r79-MdKYN;LS}=C<2h7o9&p5C0244o$`+{gA`}XCS-+B_z%3~Y%D0I|FJxum+Z|-4}XtCOaEE$NqpfNHZ=lcBmQ@!h79woqn+FqvJArJf-|1kNo<_%9NW@E?K!u2H*>Ty
zi|k*Q^TJoMo`l#J?4~f@wXh61y?ybvr$T|+;IRv|8$Z{lN~{T;8dl-7Uu6B!|JKP~
zFF>1wN*QeGIg1oN_Gijqp5#XprZDm7jcrA>;D>yJlQg7rcx=mTx&2kS#$J|}VBi8R;2)#tExqkU
z@b55C{7PTv+f`Zi6h$5#_8Dia<*ahM!*dDK=?&9+xqhSRE`q{_74&RyW+hqyc%@B
zAUHELNoUd=PkE$(FK>tR&XlWXc|kV+Ns=N}pzCW$aX5Q_tnzQyQ?|&pP6EY6|AX7-
zR`Kg;!zQ9fk@aPLK20f!(NKe{5eNayFX{eD=e^NulTJ5Yx+|q3qgPJ-wD&;LEpBbZ
zokxBGHWqgQT3QQkPxw3UsRC8LB#gC%CarWGz?>oS(cnoEv&Z)*9&dd+>~bTUg33YX
zi*{ec4}MyTG<`j^Y(nGT$M_>}p2~Di7wiY{N1rb1Lz9im``CFh{DbB3jMovEJHK;X
zx1;zTtyN;~|Le
zYwlo?lF@@_yVT|Kpf=ttS%Pxp?6^_Fz~B0-H_aWo3D&f=^Xfk>V-`A+n1#Tbq4MFC
zrV=S`tohwUSxxX9fZMM~OO|~hYqr4CiV+OQ6%l+4uN%RK!JBXO0$%Wy+-9qAwmVv#
z3N*}8wn`%md?%aO@MRxK8wO<;`@}g!GE^PL1HQ0W7FNA%O9uPiY%I%&tjMPGSC6#^9p?@+*Elcu7tGdQS;#1BxC-SSH(y=t
zUB<(3Z5yWik!X-fgV#Rk)A{)hbJzFfHhnPS`5Dr&@_m8bhlO8phpXwcOUUhGBV|4n
za!!y^_RVPk)78?=rT4^)-kLrB&^YP60KwleG
z(sJKhzYsU%cjxGpzCDezpJonuzjJ-Ok`*E4!F)Wg_$xVjQpR@Q(0+JX
zeyO%I&1}PPK~*+lU3-Q8d3pt|v0|LX|4in>4LJj6E8jmOQ)k??u=i_?3|Eh`%YJAn
zSpox$n8Mp=%(%#FHdXjlEn2izLYED$lSOy(&2}1=N-0=i&&b%8f!fHB9O@RJ?c`ZW
z{48mT+*8+|eni6Php62y>cmT8T#LC^X{cM;H93bcLJa0Vu~eAU@Yy!sJD!@Yz#sq}E$
za2j5%+Gwa|nva@MmWrap4gc$n-_)$adZ05;Pi+Ox?zhclt)fT0cL(BvV5Nv+SZWx>n*Q_h!5ZeVl#hQQ8^|gy4kTHVZepmO&%ACLLd6GP>cN
zjv;eY4bz-tw49Im-<0w#lYgUYAbM1tcRAOqvsD#~X*%HC6AE1#*Nt_4y3}pZc=HL%
za0?k%Cg(Cmk!E+!-)_$FymTXBod_vt>kaqDS4G0_EfNB{iQfY)hBogV^?CyJ+JA6{
zGmbAm*(u)%DUnCC?JWF_AYAMBJ|n#`K+rFi^9o%s{MlgoW6+;VVYB^x%yJBe+w!W5
zo{EgOTZ@Z##E$~Ez3d$GG=-2{gple;<&cAx-Wy~NfBSGh(0Dot_ct6STa1a+NuI9k
z7$TXyA41N}YgjqjqvnFRQ*j^E5H@lX5+NWgZK^#ETFt(i0LL@gs;|0d(MVx+1u|y2
z$;0?K-zrk&KdU<-3>8hanCbj*CmliRw$|X$_;?N(PBlFP3A8eV;J9!McnN8>u}vAm
zE*ReuMC3}r%w|cP0hjnR-x})9fAO4UJj#|T(q^;km}#QSh91D|8cQQdrz{BM(5C*R7FmCyE>MqfWc-L9y~;g0D?u(dG7qmsKoQvf;BRWm-c&ujRw@QNz?l{
zD#yBK`oAW_NonbRhnq@G{6J9}qw2(=iN|T|FL(3X428se^V@f#%WSiKK-7jYlBI$_
z?M+YqEDxVn%N|BZpr*>7(k{dP>@0y07_L^O^*8CPdvG=PbZVrv?L)3rmIQ=qQILs3
zbRkje6h#C^JX{!;7_g)7{t*Id|-Wa4~Baa;ksXVOYg>IR>~
zzVb5xrdF$gpiS-yy0`)tC4xJ}I3XjKOgp}dgf
zeQ=Z%oK|mREaZ}ui@xF97Sv^d&k2Is5+_JwMs*>y8CbQ+CAJ@7L3!kCPAEO`r9hk@
zw@kj2Jo1pdu(@@)JUzf9H5nTW$t0g>8EE$Skg64?&;4BZ!SG4`Mf(B2@!GOBx
zCn8Bft;+VuyfEt+o+iFHL3X%6h523Caj3N8Diz0VC>sAPpgPLM5M%R%%Ta`i0p!RA
zaGp{sjv+Qho^-|v*Mf*nYcWzpm@Q1n(hAA|WR1i3MVWyR^G4p^-C>cFbBKtr7ZEMy
z5Xg!Q4kut@Oh*DeM8pZRZb26NUI(Q6$&ylhs6K5Yej1-eb97E|!hp-ejk;UW4ew!Dchaoa%1Ix|~;gl7El#k0m?|
z*$&{ZG!0v7m7?(T+yd%C4Tos~2RhAsv~#RBcR|2$asW}0fwsLIX;mf^WL`rg7SVp&
ziv{iRXuO<+v(gZ<>R}CEoFC2G#fDD&?gi~41bqd}7k^;hsvJ4Rfo}gzR)twm5nxaT
zB5Wo3N3}AyQdRCAQ3z~*j_CbF1!#%T-&=uLT``yZ2tOJDoYy}Q5PB4(n$(jcDU<|(
znnfcrkO6Jpr4=-CGF%4E94SGE;0x$3QHTg&UnosH2MNN)(Ju#)!{K2=?P1zq={`YV
zuICGz$rz~wf>~rxYJWvvGI+JdUM(?734ja=&haJA_X3jYMc#Z;nq5^!D
zz$sev?<=`!B@DlY06}0iCt}o9
zw&O~xlNuN~kM4j6C=XcA@Ai^QGBC?53pVcklzep`Q}D~b5t;p*T-bwqHTjAC_|y}8
za+Y>%H5?Q*tlu^pzik4%d?|izi7|R|QC4{I|NHsx-2hh-UQ(OF7#-a;W_qKS<%I>S96t@aHPEPiPyK6O18B9
z3a@`9x?g({9+@%lpO+D_mvuQV;qH5Owe=el6wQ?)74N@T2VNno(l6A?cQCqW}AyQ@WZLU%^~&
zs2#NPo*er(FJ?0@Au3jh2wW!n=$8vKEKtev7pV1DS!ZfAu}x>6ur3!azO)*bk#=I+
z;^ohFZAmJlY?cS1*|NcvD1k8$^qE3kC2YnD?>bTzA{TGOu8T)M^raz()qnrlXqAa(jvNE(F%iXp9W*rBMZba~n4R3$zs{H};$iY`
zhRdp5q|pH7+g9f^1A734#<-~f-0c@Gs2VYSrJNy^yI}I~!~iV5Ndb>Ga_FzQQQlyS
z4u@QZq;>t_L9i1?Xa&V;H2oiG4{aqlMEfZJJIMK+v&GZjY%V(39PpC{98W0m)_a7w
z?zdottS&s7B+=)HM}6F67I%HU-FBghRP;?t1X#fn_&%vNFORBB!(RD)Uv1t$xBeL!
zgQh6jBW}v`h4<>nN91WLe0>dr-S@&}rjUChp5OP_;CrD73I)BoHBTOejIdv#jIwJ4wazH48{0lD{B-T
z2dMsW(n&DHSgd8o`pJp?m68W8$P9IJ9a8v_zK!)F!hRR}QT0PE3d|X4kH{1Ac_y2f
zGqd|iu(heY&^SHRPB%C)y79(DsKyiit}
z$-h7jQ}v^hcmk8>J{9v!g;hLW3jL;mDtQY1@qXT7TF?3^EL5iDW*+EnWPa8MBsVPS
z!Ke4CxeG9NPPxdH&r}nSr-Lpwe;Ru>T}tt;c9E{Efmeh<-Y%T2mhN}%D3FPT`Jcdx
z^4DBOxHB%;TSXwp-~4*@VS*4$i3Ht8w4QSCZyO!#G3jI&M1}OALuwa5lFZ;oh2$Ix
zh@tw($XB3S6#V+wCja_&(_L8I5rT7xAOU0FUdVwH@yfFuU|q{^8y>m>xG`7z|GyXD
zj*<1*5C&TQ=NeAjvxFyc4JN%aQVq1b+}OR*l4AlcGK*}gdK-{XLaJ@N!go>
z-FlhDP(yj6Gr}RM_o%3B9$3t%Q{E-WRjYh!Kp2mG>cYgw^Nfvup@E;b2h9RgELI62
zHxb@ioIvd(-cqsn1yXK=7-eDIgU>NCr@zFYt}r}Qb2yM{#Iq1;G4#!#N0~O
zSu7LBlOoBq9mrQj-J1#w`{fpJTs*=6a&Rm$0R=x%z++zSZRoL9T^m9N-2disGUTPg
z3PmhruI+HQit(s>vx2W_EZr@r3JX4-Gt|~S)v*HfL4AR*-C*-gkaB2NYkCq>8-
zPgQL;$k&}@og=v&8O(@&AP5ptzivxAA~2TLq_0y%a?@h}IQ5P+BREHgff%}%L76xF
zaXq|H3{2l8_bUP|inn$(s7qM49zV`^&EgSKt!Okw@g?l
zmae1u^`GR<2vZtpqY2#TH2Mxd@uUS0$4jvtSwg5vtedcK&(~>yOuk}VY_JNJSb>m?
zAa)T!l9Sr5#tlJ$VEm;j{X%x(J453xR7Wux|5vF)h3T=WGtoA{$o#TCya=t)e&V>ma-~
zitJ(UCwrj}7L%T1)PH}V$s{%LQcBBXCpkJsJ;rMaQCF`aL8IOis##2miWsw|yI|xM
z)+q@y|LnMRW{?<>g;5U?YNAnB9cryAYvZ?fARtpl?i&cZrbCLRggslK03@R9{_V+T
z5s)aXd17f4;V69DL`xIMD<3xXJn>}*ccnrH+Se6uPT744_&<@Uz7jGNMyT{{?zLcg
z{)Amn<5Fy_=nF;jwDJe|*NYzTDOB*Y7WHyLyMGPj)P;-2a<)Z)Y;H@(c
zIj9iF-p4{x>Y|WAQc1+4%XlO%4h*1^c+V-S`W==l3TM8yp{Uc-Nb?)IcmfLBjeh(O
zFO6UK=I{RsoDrYud=F0(I}-$mNVM_E`N62BPIh8c;m`oF%)~djKYbX^n<_J9gGKX~
z?^h-R)ARp&n}Y{*s0I$3A>=kOX8|Ame=m-s5w!;QBUGtw{a%-0V9bwe$AVVkiO>v!
zdY4BKm(4gdc8J6{9|c5aG=)kbCfkl~(jk1-{)vHzT&TYLvfDTOBtz)0&{}%FbD&|W
z2%+aUusUw#733gSN?XD(J)&;k=c8Qq0sR2|Fcx3vkZV=r+Zv{&Xr}oXwRySlrzmSh
zpNt|^jZg!1bFb3iF4NW6c_qZ?3c(FnhA}(4W}jpV@RG8K@nhQ^9W9FOnKb<(D!jky
zv|oAex+^)ddzN?Nz8rL=1q%`uAJ+CuG~1b_5*tQwoWy08IqbU`s*#JcUaJN@EYV)8
zj5l?v66_SM$KR(WWXQV0-GH~`Uq9Xb02r6H#ssI
zI!$Jdt~N=R>$HiDp{mK)pvEksu>33R{W~{*+%RjSr$}oyc%?3qEv}5h500r;8ew^u
zOy;cU4)EcAD9g^_+?`dhTn1FU+Au_GVPhXqbid<*(CRr4it;vZX=U!+9A&`0y6WS{
zo)BwatB8$omvi4{kGsx)L}2bPkEDp2n3n{cfctV-BY#-xe|yEuP8c=dl35nNLo=LT
zHq#qBsK&21P4;i9w$N&6_O{<~2$XsfkNK9fQNX!r790IhujNcXC`~lJI?yh~$4OGs
z#3_VWR+Qy32U7pn5*OzQ!rdH2@7(SAST
z@oOL5^MC`0OBK(s?(>nrn+J)#u9;F60r2T$F=!^3RgSjtLj#oWzl}I(>Y^L%(Z4tC
zIQVev-2`9fp*5)*wCMrdST8WVHxHSi!~L|x)r~d*_W2rzy%QF8(~NsR>k$+4N@oL%
z5*ot?x_jVt<#t3Lg1{XG5Gxi2Ol9l#G4vcl3|r8@`MmzS!2FWhv=Embd$g>?Y@Q-!
zAi#mU82UhIEdK~v>;u`6kXHh<7*Sr3Kj>zG
z77xBI!8?97H(0ors#KRx#}Ll_{z5`Jd^u{wLVJ4ZTHaaS43uOEMr;)e|E-ZjGh%+K
zN<|E_*yn%z9I#yXtEFfK`^Z|#&=)^QTdaXS;^k1E$Xs~zwoe$Y?(#I@K4GCgiV4Ma
zdoQ`pLy-U>^{SpDrABA@AOD^F$-LfzjcY$6F?n|{vtBI-!P*BCQ)O>8MTcfCGYK
zdSsBY0tn^kdc|sOs@@&zO_@hup3V8tIY}&bn)q{k`6|75k8?(HcEjN0o4t@PE%g+T
zb-gG+M_mRzbfZnQ);&lxUd-Z`qKM
z`sd6gy8oMbPun&S^K9JK?`kH){qt7pf5qS`DlTSP0EB8NOx_lcSsWm)UA{7D&A+K+
zR{+|B_M8HMHlrUeD6LKhf(%?+;xd$LGP3g`8Z9P;M+{XPptN(M$HMe{NmHBjq=^Ha
zq6ceEj=lcNw({9#LIX!*K20_`E%ViHD?Yvk?9yNuf}#u_}0B
z3Hpf@)6FYF?OK9nXzy`;1hPeuifzaA(_s9HP#G_UC
zr(Re841{92F2j2MlRd@Nlqi2)>uR
zaiB>PSudS8VnAHI6o*QN=27O$hhIoG+=D~_wuUO6WY?D%SlpPEo
zMo$Gt)%cM1NX~=GoGhoa)#}5DQ>+MRkxyAdw#;L)?`WQM|5Jg5*@RIm*u!1Ltdoj;
zF%hS%){B3UCcTC(u?`Z<<%Rj&EjoV)%HmoN*BF@LyV$3|36tiDlqFw-1vdIs
zGx{$DyR{r(&XiYORj5$tly@cWQJ(%uM9b+^2>Rj7V?mZEUgkUa!u)VjUcOv^rxV*mU(Gf?Oj;f&Jvb4!*5I7&1eS^82?DWo_Kw&L_GK!e|P6qM~H(ffKwlMRzb@4O&{HHvnKCOiMd+RBVQf)1{VLr|@F
z{7O?fpqLz(dzF
z2C-jAr4Ao_SZ^?1W-vUSc!{d29Y2UGJtdXB$?)RwNph6;Z+F;8191hz-1VfSwBN~T
z;iiwog?8P`F<3&3G^r?eT{J@Z?v}dI!lM|r{FuSn4)xc8r6_b7Pco%c7D1U5Wg-yV
z_9g9XS^oIHt`!2+xV=*zvy?2TSue;C;xxv%JIzS>`
zR)(U~!w4P??VKS?*oLGx?_xQ5L9N#?T%Co(gpVzVTz^?#8n<6*ajBYUg%Qq*5RfIX
zNzOZ7iRbuL&)|891C_O5bo7wBrbT~-?N^7S6<#4g68|p5CmS0m8}9M_XiW#I2zAnl
zf2N6UKTV{-G`Rp;=CZU>r)HnSgUZpY>b41Cc$q%@rC&)qic|CH#87HiZ4L;{mi-`F!5qX}-YL_DreuuyYpM+XCHHCXkCGk!JN`dZ307bVtc=
zdF+=Mr`2#2?S=m*P*hjt2=vs^f$3jeS}618z~!a7U>A6sYXxCF=kP`Mfv11&7nqYK
zy>TnoQTUMGFi;u-KyU!{M+%Upw*50n)X7Pa$!?N#hQ+J|buKk+K~1|-1f)2;HnFxL
z*={hb1F*q55q)Lg`_~#{Q~ikwkSGLkT}H^}!Jc^uuy}B6+YF#yn7}x`m0e4)YXMGX
z1<3R>1>@1ejWX!q+LZCrKv8}HX`|h{ziIfFnj=(vO_d1HCQW}C0{);oQ2mFZ3Xd3E
z$Zj<~4q&=Y*$Z+c%c#c(llszrX|UgcH?@k%<|v&noTBt1KDy2l}|EH27+{R
zJ^cB7;OIUBx#xiA&(k224jt$`^9Tc*7_;@(3gyF2Tt9JBleTYxI{oG0j=$hw=kmu)
zbltDw6T7Whk76PKFCLEbhe}lIY?E(*{_n8TL`Lv7?@}ALAa5)xMEi2^II>Ac09G0g
zxRJB{EycZ^PJXhIX4`_v?+NJ3gyyF`i7xzEsm|TN#f04J28XQp_Kw&k`7pS&<42-GLSyR}#@2pj2d<#C2A}^xfJjhK
zV$6-$0m@S-UC~CH*^W)?tbr&WoW2cA&+A+oOl=Nz20G1;t!)sbD^qc(GzyPjV(|et
z+>}C07HEj`Wo|6eutwWj*thAr+sIHp5xq=0
z9Hv*^;Y1Pcx0!yYE+OI~%{g0_KA;uWe5=l<9bH-wPtTX9x9RzDg=QujyOhhJj!Fj@
zZEld3l9lzlWbUt0Z&uRrWJVY`Da4SxbEBY5@@>BEAC3c10KLTOuiD0KV>UX?-|Sa5Z@ODa?1vS6e1ykoC=#>#n@
z5$G(p7Zd4QNE_ZjPBL)@Ui{tJj<#D+$L!LoZJP^`gSDb#Q+k8B{$q@*^Q&KlMx9r?J~&a)+4mKphHs}*&m
zCG;Gx)#z)un^KLe+u?F+#qVBk`;iK?-eqi8%d@%g2k%lf-h!dka%bzk#5yayWEON_
zRL7q=BYjJOSht}6@0B-!T*GZfsq=JIjkZ$XkVyJ+&ZG*sYwe5qS)_|UIxFeXp9>c$
z1Dk1&?9Cs!b6iE~xPdH1B7!m^a8n4?=J*6bE({W3itWXVpZ0M?w{~ZWwdu*`MBIAY
ze72zMzMPUop3O?}xr?uY6k|f(h*|^K4?+?-5Q*<;XB%+#1mC6{`IMZ7Y9|PkHYag%
z`H9`L@w`ac!ffVa%p~M0aX{ZAE3S?#;t_18Vtg-TE_Tu#G|=rth05-39?4W`>qWi3
ze1~XS@s#A>JJ);`Ek+*Zf8Ne1LB+osde6~SO))0Y69r{O&+OTgZszJCN8hBfUos7u
z*_j-#9*S0WBHSAN;)wP~H_PFpM7}b2C5+r}=iBL7C7P!e5h9nF42A$Hjr&i$Ot*Zx
za6TVT`gU6?c6M+PG)W%+s&9%;u-ndMVDOipQ8)!pYKfX?!+Q0T$i$p
z@o=?#g-=@m^vQFKeV_!pFzT?qN*A1}^YLz)=TuYZua%SJ7JsD)_8ecs^%ePup|Yd(
z{MQJJ-CNWXwu^y0&7)a4ENz`X>F^=nT64!2uymZBh_IF6_COt#$J@OaC4r-CpO1T}
zCa`N^VB*#*Q5h>kE*Dz8I&%?A1$|fFk1F~%-mnoSXrc_>jhlE*G&OMD%}ThVWN0ME
zmnYoREg(nPC?)rNzm3vC3SR3Lh{W?nag}iDw@BGV<0^k)c|A7hg021Th;B-X{MtK(
z=hv~b?N0o(!~;}a&@Rs5Ir4d7gW*1NugBOZ!ND$wAqsQumR5cVSf(qK>8D*4tS_(B
zy1AG&9~It{YI7`|lgP?>TJ^c0=6Jb{jt-NgJAiZ6+*s=kq=!>qY)!=rtUS7N{gNkt
zPe-6uG!NpCqx-q01M~K5ER{Sh{2pX;>~D#7`S(6u;|n0ZsBaYZXUjKk@wRlccP1
zxj1F(w51{1>uAr1#Mpb6xty#cLjEzUV2*T%FcGHbyo&HX^rTzNoj#KMkCTFEJBD6k
zFZ-I9ygssEtfw;jqQmiFb=FqK^~tL6lrSMT{1BPeM?`79|#NE5dqZocM1y9{EjgB@h7>NB_dy
z!@?U&)|t@*Msbz~gusqiY3&ec^hiu?Lnc3MgB4A?o4~@==5K=6`&B*Anb-JdcEb^s
zo8`4KItI@lYkm3vn?##!xOtx{%VBbdomOXN@Rh+|v0<*VwpZgnoG@
zWfc#{p)pyMk4n)E8Af912|pdVxIH8M-tT+$JrrB|;gqx(Obhe6;576lCx;@jMwe+YK0o
zL-{vd9??;(C{Rf;o|KPbR$`p#yaebY;V6;7miSt)t6RLV5L2onZ3^N(KIQNLxEzB_
zmSaIKtpevYHBRcBHA_L&f^Sd<9?GK&Kv0xaAHRK=mSsGOzag%@1|5n?)i&={RHUooE-);m
zUPGvm;>mt&jV0+G!5P9lxhpcVt(JE3Evi$-&?V2fr!(o9T@d8E%i@h1FCFPFpw@~}
zmk{^PRWdF=IK8(4V8
z6v)%2Spe4No%;zV`*>N(F~l%^qP{=URJw@@8hGErJ|4;!o;1r1Vo5}NXa0iF1NYF6
zT*0zI9~cdXLqbg4w+Ie#Q0g_OFUw4M2n*^p!DfvRRM&+yx~{K!X}OAB`&J(U6Q2|x
z`Hs^70_&M_@cwAe5AbDk_}Qp7C1$x$b%ojM3avIiiDwKirZJ|x*AMlEjHZy&9u%b4CeGf;0b3V<`ai_V7ad4_$
z>6?GMEvi)F<1fb4x~AYM%j_f6u**Zk@qYuESD}$ZwU#5eniI*c48iMP=PA!Eab!5vFmNpBJrzt%bsORnJBN15ueT@9ZWZDD7m8c&
zhzY+%&YadF_fPYwOS?Dzs~YSuc<>Ba)~#Tz1~Km+I8PTegpR%OvKTj^bHvXcZJkEQhBL=1iA<<1Exn
z>I-R*yW{cfwI9s9L^-i58_Vl^R#25uR@5V8tSc74Nm0n|+1RY;Gm()fji=~|yk8Jg
zOcd1Og?q^-!Lz4CRGl!H@e*4eb=qf{i_%{*muhCz9k#>ux*X1U%ADt6`|$06!&5U%
z+D!(xh&TfrVn=DS)>rk@Me-|yab;7x#r3PPD(38(Z6Un!
z(99a>qUAODcY>-I?L52i{g#7;xa~8pw<6R}&6LGCemUhrYo4^*Ddw7l-UoStL>TJ@
zg~ZMAx!dD`e(!UwLlbNs_P*uPhJxg6LL+00vs=FK@x$-9F9va<$e);~tjP#U0@%rh
zWb|n{*l83DRdaPo;HaLg45Y@9Ce+Jjt1^m|WVBSCMr@FO>pc0Si(v~WH12HRz7Kh^
z&uJjwKar>$-mU*yjn8MqgBsW26UR~$b*;a<@~b4G58*|F
z1MxP^(U-2|s5*+>T=s`Mc?97O`<4pM{NV&OOd)++C-jaB*3ntIP>o17-9A~qe_tcJ
zW^;xjXh&LB%udT{e}#x{>knl
zSHrc}tn7AjoBLgOBw3iQyKrOOH&i@mSWzz(dWC0@0%RoIU`^<{9;2K?YSzNy(1q{CJ{BLHm#0nrJXBq`A%D>z`laSpO*qv5
zD?UA4zMFo;Z1>|d78Q86E_TvKa?WPBBdn3c?{#8Jt?E+q4_~FFYMwK&S9>M0w#9f`4d0S(M9Zz`zF2h$#_yhsHx%Pf6r0ozLJx?3Xf!6;T3IrOM%gxs(9X;2CGIkF3-MXY7uu~
zG=8NvC$oZ{q9z(zaw05ei;~vO^<_^Ygf>CETb%{L@99GLufKh~*`Z>5bRuK}5!+FF&e6Q!ay
zRSyY#sG|0o9m1uq4CmE$aJCt1p|@5t5i-jr>A`y~EdvU1HV;W})k$fhpQ-4mlUKg0
zD7kK7LK@#w=TJbC@@_WI2qf8HQZKvA$7Psh<#Lqk>sQe)^Jv#O4}uqEIVcNw;{T@VkCHGi8=+U?w*-voI!
z-BqpdqJySuOzc*D*56s)J0Gi*qC$0?n?%QlrPD6UBXxURP4@~Q>d;jkkGJoz?Vsk6
zUyj7uL{k13mxRw(115-ud<3xQfec9YEzPyow!hZv%k&Csj2(?;$rH?|SSG?aIK~Ac
znL6m&5+e8`9bk!ez28kSg7g&@nG7gpayvNx80G2^e`A{DlmCFC_rv{+40mI?{G354
z#$(6>*~F}Kf2%ij9@~^KL~n8p2yLUlMKEqicJ6PF!>vOLc1DZ!D?^7m3f8wQ|GG_^
zRl@achURQK76I@QU)2ICa_uR&=ehW+qTB?*#?ypk7&LOpY#Jzb^cajK?+Q)gZn{Jk
zaXRZO3|;~ez%JLTmU#{8Mlj)*Px~enf?GT$RmRpx3UV<2CDPG)%@qDdXv#r0C78UK
zu$IC^{?x|o9xEI})in-FYBX^_8`Fvb%8rLy?-f%%MHwW?5A9{LA~=6>C>eUs^`(Xl
zHa$%72i)&mmyb8bftsMm^+d}uK@X@
zn)*Eu<5u{$>D7<&L{s-CHVrbTkc#w%*S#OopwBzoGK7T7@3y&K)h_olbQVDC<`pjt4oZLoc|0IIN>jH-av5CkGg@uTX
zE^a12arc>0PPV^0E1>0#pX$&@gbcExyi@K}cmg?A`|L860JdcvG9V~`(J0H$N+1L*
zc=DqmKn9QQrbJ-O&U1LEYcY@^aT53{?Pb|#NRX00A7haru7w>^`}mJsrii91{rSel
z_&r2SKhp8BY+XHC3AQ
zFy5D5xCl~Oa|L`m@jbm*sFVfEm+sJ0N$8xiLWg;(&keiGEGd(EN)5@Nj2M6_)ahlhiZ5r_tJu#zI6lt+#tisy?*bHbcu
zh@FjHy8|!6+#nM=;YdTjNn9oW@mKVoS0c|JEi)4Vh7QQW&vJhr53Umbq&{QU-MT##
zY^yj(UTptJblM#uD>ye+J2la_bnwKQ@8_9*
z_qcG%g}){Je*N!4_Ywd-w!G}-i`rytup$B~E(_u!4;@Qg2;nmi^n2ez*Uu`|E|h(D
zG8Gq=v_R}Ea$|6h;;3+bqPrq4=Ys5$i-ls<;NU^DU$#Wz8^pT%-z}T=cMMLFP&?j)
zS+pE#SR;6rr6YKMT$aoD&Jn4Zkt+oYO{NLUi<|3bW{a2F&$L!BeIqX@N>9q&k^{LC
ze@!A(>ZnJa9rQUQm^-83;DPN=R65pw*nv9z@>q`>{`Q}-jdzom_cDrz+gm+`lv|_?
zo90{OwolJj4CnsZVIG&sXq77w`iZemo{tg=(u6S=S0ll=PcJ)LdarSp_j=t?kse65
zB2SkLsd}BSrf(rDf&1pvQ0{K45iZEY1o7xj(Sst2z=E)Ifuy10TjNjFk>p$4Porm%
z>*pi_;EmegwttUk8vE*F$%jhcjjX>Jp3|#a%3(o7`MSQgC?#|UR`naN+!Jie5R*oy
z_se$-+z9#c7P|{k!GD$sR9GQ4^MNl(CAc5EOyQnvdY2_l*y0(EQVO4bz~0#z0_v5{
zmoots@Wjb*#3=g_RZ>BJ&iVe~OW1P+9z|w*n-M@dKhyZ#lgX7t>G-06G3D~EftPbC
zaQT|1s>>J2J%#L!ziF(%*Wp^^wIo+cyNsVyP=k18o<@~jCH5#U&vJWPNK(<_Q@`r&6qg_#$E
zU|O6*TiW)dy!2teCFa8>kTbC|nlOT7MO75l5+@%aqBP}(LL|!5#`8w7HFB=^h*LPm
zfFl0pn)RmuZ=@*M=eaQKptxa-I?C^{jEireLPgaXQL{6JteyJQDX%LW=spGUYqjGJ
z6u)0g^8#EtTPeZ)9Du(O+uNAqvOI@X)|`QnqKX5Wh-6V`bUd9s3KE8N@3T@Tz
z#FOgs&!AIZioirTi$}h4!an=Pr23bUtEIP1#19@-d9w+XtPt*<`+XIXC$&SPh{q9m
zu14A_opU@ah%l(oTL|4R?puDyBO(oSg`Vql$e(#X+C)qk#vl7=u+y1n)H_>2UbxsL
zRvPlg0^eiE>#Lgrl__2blp{lSV0?<5nkkfzNazS4l|Jv^01ZeG(J1@y}f
z#TBwy*|sT0S73aoOt+6)ewE=t7~4^!CUKba5VGo~QVu=?NL!0X))JXaDE
z1tWw%rXw5%y}#`aQaFy$q0DWb1s49yy@~YqZcG4W!n>nCSC9Sx3E*+Jl={=dARTI
z+WNIV(M||{6}^Jp!7Nhl76N15o|H(8U|>f<`4y7e;~%
zd{-9d)<_xn6t^>t=*KBLba65(+&tio*KlI&>CFE&4wXbnLWX
zs=Hlk8QfDk@RM7z(`Wj5oVV)>l$uApqdQ3<7W6yqDt~9a-U$EddSIfo*07Yb@2%!>
zca>V+B>I@mYE7}QXF3t_xJB+dZ$@P;Opxban)z#Bz(Efr=BJcsA#$j>0P+--8=5sq
zojc@cY29r2aooLzY-H(P#-j&%;|~-Utg-F^ovnMn3N}h%`vwRO)In7uFE*f6griI~
zRkZF?0GhTyY4f|NiIm@71qk!wK{QfV=0!EqTO{zRQkmo_+S~Kca%A(ufoXAHeVEfJB3K8r-bLaOe
z$a#Cm_4sM-=;Kd?FY7&^w>VMl=-e92-K`d|{c^iU!zw}v+Pdv;oGTqsAckCrey;@{WPE
zn@vvYWu-pa}YuAuZqgxpujj+aim
zs};q&e^hVswEH~2LP-BApry7{{CUVV`%_%Lf~xAm+O(3@B9mYp@x8%!4{C>m0v@LS;q-qyXZRqx(lY`;D&A94e1ynN
zkhovuKEVwMUEW&owFc>bCvGI78D>;@C7K8)w*+gOJ1NR%r2(4_FN8Gz0(XN
zcz5lfHc2n>EjPY93ko6rgfV?c;m5wJEjlb7%g0nfIN~6M^6>VSl?5xbI9jM~vuI5+
z$Q$j6N8szE20y`6T#np)3qp%***8f%572{OVR=YzHxI@1w`#-!C8@&c<>^0v9_OUS
ztbwo?QFd8c7;QS!KJ=^?yjE3u@=BgC3`w?V-E(U|R1bD6Y&c}V%IBBB2@+(Hv7F~|
zPu3MVB%w*6-O3cv=!jWXtfQWnl;*uBTvV;Etg}+m`wto<*`1O4=h7C0N(kNF3jH=e#Wq3yH0b#v$u1D
z;|<%JflqPo6=t+(OQQYYY}KAIAVthq&akeO^J)8HD~MY7ii6>;P3q2FV`5WMCVc;@
z?xKk*Y7;7~2ATKcH)z`GM4GEZ1J`#}1YvdPuB_i>1|oc;=8p2>LEzJKcJz%4bVpEL
z{jLDB@UGNgR41d^+v1x}+Gb1I)HVU3PVPY~_@*%a`!CBMQ&O(&CFN$Wj)MSBZuZpq6+#Rt_LlB_QpghtM
ztso9N1+thA#!D)<3x-BfDH~O}4|HjB3y!YJKZDgRg%2b4a!UcWFJEk7rf>u&c9tp&
zxOoh!mwuT3IzoS3;}@Ffl0`LI<8z}tsIM!}5*_3Xp7I$^n67&wfVge%on*~_0{xR8
z$w)>$5dkinX{AyGlyTxjW)n-h++|sjD>T-a$wqn0rGX5Xd(afP*}HTX9UL|p}XJpMdcj5o1E3Bwp5nL6U-YI31<4UAU8oc+aledGr`
z_z^m0E&vK5`_6=a4cdT?yPyezT|4altD~zTKr{~T=poyM#kbM;760la?5F)yYAV^e
zo{Is{sp4P1w0~2my(cC8onrNT@S$OYHT`o}bUr2&c4j;Chttu&`O`gs%%v|t93Xky
zl(jzk!a%aEumFpaO=gaAJcb#-qR87BII=)y0y`mPJb{pEEz40dmWgn|rDmzJp+Y3W
zaAU9EKTL+rU_n&Okurjx+J9#fK(xyv(8G==mZ;$Tp79?CdVCPTr5rq6koE5t?@e}U
zH-2no)vY&R#C&Cvsfl^&&{uxkAmw3>`+_ZNc6tJ7lkKNr2ZO>TeuB<$(V<$VIXBKdc+b?
zjD*NJOOquC!FRX80^3KN|M2$ljQgbuIBz^jAOXYzr26T92A|McnbJmL&`)9K1>Am^
z|G>JMh~EKw_!O?;l%sWPKZh*KhbSRE4AXW`Jf9OW1FL>D$Wo_^wXP*n!Fg>~Mw3vk
zbObI&{QK?wo_&j<_mgM8IfoIS9tbG{Ed(qiz-?w`uvP^Qct=2#f_BberG7BH7dF9$
z;*ZOju(X{De1O5{x8$F3uE-ioW2IQWIVJy4e1mYm?TxY9Q*F&aj4?vuI8qQB3)W4m
zt5ZPai|23zW3NX8)pkLOOQ$J2)lv?DeZHjQYHq_e=y*?<;TnB=1Dkq3F-B{t>EDLE
zhW2Dj6i9LUi=Y<28;&yQAHb%PJ9_Rc3WYub5M+L;r_ytW+mwNx9~|NA{$!_oU#`fa
zR4&4|xq;)jBH=hKLm+4USAhTw7li)eZ1ykMN;Bk#?1#TI#%Ksrce2ALtHlj2x|e;r
zasHF`j*IK|2?2dA)<{M_j^eSX{5dQyu#oVH{KNRhAn2Bc0!@QxNBqanvrxtky^bu5T%HcNb
z;B)hHvZ;^EHTfcOM+chl&=VJauorfU8OcX%0zvcwwbb5^$WZc!`=hTrVCM3gDkKGd
z1+`!|lb*=Pt~1gl49`#+#8KN(V~#gD&kC2qqgW+UFd$VZK8vBVu#UcYcCx-N9{|Jh
zS_MfeJK1{R?D8!3)AC;dy03wK-I;nTl_-$@s>rBGhOa>?(hh@sa4pnRYL5C=9YqN;7TR{M7oTZ9sxi_uox)@~ZANnmuED4;C}@fBCx;Eo&Y
za+kM$sfm|DH8Kj|79ccUGf5c{LaMBF7R>8LvMD`DE`Wh49ij0C2=JF1oSnOjGb_J+
zXqWv$V*OX0onp{z=#|)$It&r+
zk?St?H)R&G?mqht>y*+ObYutK@Y48Y?l$y;ByRg97$M>&>UdgXnGa~Jk52>Egy`(U
zDhAqdm=m+PXd9kFvp|f+bM-=wSlg^AZAs2QM?-CUhTdxb?v&5DjsZ%uis+02cC!0w
zK2R;gzxHtgMTX|2)5>NFc$dVVnPXuBK9v3<<`<(cH#oiKNfrfbE)|o{Hc`CKrC4XP
zDD?kxasGgk9zont>Er!Jk_7II0`iYW9WgJEWkxLw(`b98$M?McE6;1FsYfsc56lKuX}B9N07i
zGnmg($$3H1uxZ7*;_zJTc$fQYqHDO$>!#|O5WP(K$AxGeCSaVApWa}Iqqr94uBco?
z97ewI+~sLw~&bF$csn
zd(aSMVEDm0lK6%3f(=aTsX2I!fYKbjkAv|K=up@0b7V?L`EI8#jv&76wjE6C4Z(lV
z-c%a(U5*YtkR#xrqmAs1D*opKWtWrTNu%^j6RB-bG(-WKxGLl(BcS`Smyv7Km@WhT&
z`cr&E4mrO8szz+zy}m(z50yDLZKBM%_2j}MIl+5TH*QO7FksmHw`yQHVH%jzKu2!?
zbz?|WL--rcQ2#y_KM;~tkG%-Ztdvs{X
z$=OP{qUTK-vw4MgX11|FrLG*o_3A6mJT?T=1?k(3uiDsE
z7-D;v|F-|{_}hnMZyZ{?%fr;V7z6}+Tu46-*;$}g{T{)Tlg^x7&BCbB3@)WC{Ii8pd{?!B*f7k77ecXxLy?y$w7xI>YpIJ8jQy+|qU&f>-0ix+o_>&r9W_xI<{BqzDK
zlT1FFbI)lquD^Y3iFqH*>;B{W8m9ufstfzg0USG9lZbZCAgC82uJ&hz_fC~)V*wG3peKk7QkB|317ceAvFLh_sOOTVn-n+D}C<<}wMux8$+ruNe%F&bZ
z5nD0!TuS}-e_Vi#&dOW?Ny-2~--A+U3eB!@MQr`&vA@iC84;_acS@vH0Ppwit*ViX
zG3N~qMUV}6@ZEOik`KUzeWy$S=9Ackxe%|=q?bd&x`eMsTI~g7`nh`v8Dh!8HLq7zpSo_^Ugo~AiI*iDqX{KQn~%^zR*V`+P?eMQLfC7*
z9BXEXPH|X%E7E#QcCI6Vacl=jSLIBnAOnAT5;&9&GJA-NuB$A%7SPe^$+xDr#
z8vid|MJ+DBJC*Urr8TQmHK-n1HODWQ}}mA)U8@%;fIP{^$M^GU86L`Y1wQ%Az!ebk8d
zijMt_OOe9WdOUn-s(%(CqJ$kuh(C7Sy+zs~>$gfd+npdspe6=PNXEE^UeCL(8atU_h@>?AT0JLRt@K;c}A0>c7(KCtUAzQ~T)
z$5Oxx}`AMV4|qWXTdyYl1TtTS+A1?;w&Y(IW9-sqLlEH9(Rmu97#H7)EY<4Ch6P{e4_p#WL-A5Qg;EglBYK1?%Yokmy^KHi{lB(sk$za_z)Nq`!8We5Kk5h_z;x
zQKUr_40LnBl+=bQ_o)redZMp+{FonZC`)?a@BNm(Q>l|fqxt^DX;$GF8F1Q9HoSYF
zn9FJ&<>6CLLCaejSjy7>m9xumYnJO==c{#PW-uWkjkm3)s@0TQB=6e_vavP1RT&0a
zdtLX9DES<#6$O{&Uy+}yDQpD{{pL(&nsExquX##at-GB+oarG(SFIg&WzTldeUs))
z`LD5bxaT3)?73V((d0yTpD1;-m))nVDk8tMA9dcY7H0ts7fwANO}RA$$hNE3woGiJ
zC&m+wchEyp5CQqnRvEV28=#2AOYX9U|~%WzKwqCAv4XP2&w
zHw=Y8aGBai5ijbcLL7l6f{IftR&NyFeWJCVGj5;PUHW|v*shZhuu0BC?cXv!V
z(@{N{_J2Smw`9%ClIo=&agGLw2ew9fH9s%DJ6c6(J(@tRk876?{=rW+coO$rX9aJ@mwFFF*rM0v1^9~4{qzqFNmmZ9HG$S@uToTl
zXBr!H=6*IfE}s53n8;E9XUNzmFOJOU7EOb|ik5D&@5a?L{0L8E;v2Gf%_C
z5&aK#C2F-})`)Dh01L)PAGe!S&1*CXO0sRf~}=WC9$+y#M1I?Lw96NH{{hD
z^(yuX%L|Ve_N?agB(h39Gx!b*2E7iBjJx>Cc)6OR5}4R61WW0ArSt>!ijFL-?k_&6
zRW#nUP~Z441Zn1xJ>$c(EWmA1GuK}>!m(hMKe=oE%yrk)RVvLNsU-$slyM8L&ytF)
zBqOu^jcL;=HE1fgpwde(i}y2YWnN__S*(Q(Sd+BX&Q|Z2Qt%9meGou7$(kR}c{w+K
zTQjKz8SB=5pBx!Vz@ITe>9TZvOi|rh#7>2<4VDc})NZ8Iv($cg>awyDLOC!&Jdd_Wgv>CJ
zGTDO8t8C)|0J&Uw%iuRs)9r_#EM?EU$C01!fSl9ddxD9BJUVbqg5?HNLIX=d#KLDT
z!fFjHa*gUNrqt~6m~c3fStm`1jV3EFR8FFp*;Zd#!p(Buj1SspDm%E=rx!z4RBrLH
zC-m7JfHGBY2#Sd9D}27ZqUIu{cXmHXRf#>lxFVgt?2zISY%a!(MRVhdf^)c@#O4IU
zCKA(^&Krf`iZ^5Sy}oi;?6|$y)ciV!S4M#_4u%@k@V>YD`@1$-n@3#jk6q^rfuLEQ
z?*W14#me}m9-1SrO)c3B7O;=_r5+a5$VG;zxcAaWl{hEZ!|9r2yk`VAdj)70%a$M{
zsqpqbdwH6z_JV&r<|HD)MS!_smhgWD`1q@o47r}pNK4Y@bKLwNa(6qrUO)qY$3|R7
zAPR7-nvxA@{DJHAafJ+Zb$eF~d*CTHFcAL(Spppx<=&OSW6~RCtK|BLl&z<}7#!Og
z#q_~P-;@b`eQVYq%awS@ANg(N1F4zN+1TRiFEC4ru6a~)%6?u833_*C9y*N4yPOdJlBC~+WMgo|;|ayC=9-Nb00;7NRP
z<~7lYQ-{$XXwBG!u6{9$NbSc>if~_x7Og-aNw1nLiNR?Ru2F*(ccm&tM00Wf8ZGw7
z>xfDWs8ky8j+HiNl|z_em99mKH&w9wetQ@s6+9eiFF@pQKKT%ewrx1z3|b3^kUjt!
z&r1$?zByT7Hfy{aYZwY0i&a@%-nqN*d%uK|*@(mSP2y%To3k;aooqLou!?I@VvgGp
zM29e-rzm!#B9phHosYnUE%A#a)BK@(ZH^Vy#7=ko{N$B(5Yg)s*jv1MHSuP6FhEIA
zQ*bQ9n_Qjq;Kqfu^^@#@oIZ~u+m&{SRK;lifMMhzbJvRl45y;_+2f|a@&;V~iPL?0
z-GpzJxKBlBbL~=!Ju=VR7Mb=uv8vMXdu}J`XAu@XK>Y%vyCmM8)j$vGwN#{a)B^0
z_&Q`1w6W0w`ybHmC{gX_>t{U?@?^ggmCO+7cP#KaSpL2^$sv_4!R+WEN5{r|K1+LQ
z-?TUgu9cf3`WhxMo%NGp;S$)ftZZ3+26=)$g&-dc_L-kHrl?I_7xvh
zFs8cWzGsF1{YFo2+r(UTB)PN_@GTk41Z-9wbLARxxW}K-h$mBj6!SYpqx)yhZJSIL
z8G}KcxqJC3Pg&&S`KbUas$d(1h7{W~^^|A!nL4Ikk+vKA1zX?a
zok#e+gufLMAdAc?$~Wd;P)?aw+`zbeEV+J^>g%Y`>`CBf`Yx)g-LIxYFy#;N57BVQ
zXfBMo7CfraRRE_4Sj_2;0&q5N7j$LqLCCDD9sHQ7j#r;=ma58RAl8@<=
z(%oaL=*JgjSTcR{ayNeb;}f%Fc(+=Gsz~NAATkYW406U~h~({m>7wzsqiRFhO{$u7
zrHU!AJQDQg5W!&FneHO>AzDtH)wc5aoPE$KE@EqW;aH#1
zcUrDarAib9^exwpZ{&CyHA-#d3?jP?3LSe1`fcNh9J%LFEb{#P4bosXrMA9$aQP{M
zR?Z_cR?F8HEgtb_V^x4^f{3kxuQ(DzkaO^KnmyCEMSUpy_w6f}5k>r6y;;QhWP%3P
zcjU8gzVuq8;w!y^RowX3hM6HMhi<9sgs*%)pB$5p+z3%Jf|;!QZHw+LAD4jVIr}>b
zx1V6TDP`YpBHTFo0Sr~*^vXuv*%6lU8-%TAWe2|Z*QD7Bgtkevl1RtoOO*UjMz@qnoLoojl#|WJ;P?MDeWq(4kd0@LgT7-LKHvk{@+k
z`ed&li3)#qZnDJMZ&ST~zFw?m$(E)u!_!|El1aqn`L-_@RpyNfP&s^RCh-^lQ_Pg3
zz%CR{j6v4Fa)1qemlkaQQ%mcARtKc{CrHT>T%w-HzQDZE?l$Fk&0URoX=9
zJ+|FzS2ua^i!LQv&~qYt-j{Y?s%l=WtLNcAsGtd=dF6fOIN+}T%oxy3xWFS-!xh)#
zdqR(qUZkk946C~xFN;z>6-MgIKtIH;*VmZ9!lba>#TUi^m0Wh@w}x#RrqY)U3fj@q
zLS7F&m9(}1h=MMvRf}Pvb>dVf4CqeASw8
z=pFTbrn$Dt1f02?+=aFm;Ykv;8u7X8Rn*=IojMP&abIwZW!yET7bP>J(gy_f>q(ooq@Bqt8t |