From 41591d4f8c586aa801220fac0924556f406c58bd Mon Sep 17 00:00:00 2001 From: Jan-Simon Moeller Date: Tue, 8 Dec 2020 11:15:02 +0100 Subject: [PATCH] SPEC-3723: restructure meta-agl-demo All demo related components should be in here now. We keep the packagegroups on purpose for now to stay backward-compatible. v2: layer does pass yocto-check-layer, dependencies adapted v3: remove the dynamic-layer setup, use all-in-one approach v4: Fixed comments from Paul Barker. Tnx! v5: Removed wayland/weston/agl-compositor additions, except for demo specific weston-init bbappend Follow-up changes required later: - massaging packagegroups - scrub of recipes Bug-AGL: SPEC-3723 Signed-off-by: Jan-Simon Moeller Signed-off-by: Scott Murray Change-Id: I47cefd8c23d46b2cdd063470e3f7d97d5ad952d8 --- README | 1 + classes/agl-graphical.bbclass | 5 + conf/include/agl-cluster-demo-preload.inc | 1 + conf/include/agl-cluster-demo.inc | 5 + conf/include/agl-demo-preload.inc | 2 +- conf/include/agl-demo.inc | 6 +- conf/include/agl-telematics-demo.inc | 5 + conf/layer.conf | 11 +- docs/devguides-book.yml | 13 - .../agl-service-bluetooth-map_git.bb | 18 + .../agl-service-bluetooth-pbap_git.bb | 18 + .../agl-service-bluetooth_git.bb | 18 + .../agl-service-can-low-level_git.bb | 23 + .../agl-service-can-low-level_git.bbappend | 4 +- .../agl-service-can-low-level/files/run-ptest | 3 + .../agl-service-data-persistence_git.bb | 17 + .../agl-service-geoclue/agl-service-geoclue_git.bb | 17 + .../agl-service-geofence_git.bb | 18 + .../agl-service-gps/agl-service-gps_git.bb | 18 + .../agl-service-homescreen_git.bb | 14 + .../agl-service-hvac/agl-service-hvac-conf_git.bb | 27 + .../agl-service-hvac/agl-service-hvac_git.bb | 20 + .../agl-service-identity-agent_git.bb | 17 + .../agl-service-iiodevices_git.bb | 19 + .../agl-service-mediaplayer_git.bb | 18 + .../agl-service-mediascanner_git.bb | 18 + .../agl-service-navigation_git.bb | 18 + .../agl-service-network/agl-service-network_git.bb | 25 + .../agl-service-nfc/agl-service-nfc_git.bb | 17 + .../agl-service-platform-info_git.bb | 17 + .../agl-service-radio/agl-service-radio_git.bb | 19 + .../agl-service-signal-composer_git.bb | 18 + .../agl-service-signal-composer/files/run-ptest | 3 + .../agl-service-taskmanager.bb | 18 + .../agl-service-telephony_git.bb | 18 + .../agl-service-unicens-controller_git.bb | 19 + .../agl-service-unicens/agl-service-unicens_git.bb | 19 + .../agl-service-weather/agl-service-weather_git.bb | 18 + .../agl-login-manager/agl-login-manager_0.1.bb | 19 + recipes-config/agl-users/agl-users_0.1.bb | 27 + .../cluster-dashboard-demo-config_1.0.bb | 11 + .../files/AGL.conf.cluster | 2 + .../dev-mapping/dev-mapping.conf.default | 6 + recipes-config/dev-mapping/dev-mapping_0.1.bb | 18 + .../systemd-sync/systemd-agl-sync_1.0.bb | 39 + ...-gstreamer-helper-application-for-interco.patch | 517 ++ .../bluez-alsa/bluealsa-gst-helper@.service | 18 + recipes-connectivity/bluez-alsa/bluez-alsa_git.bb | 43 + .../bluez-alsa/bluez-alsa_git.bbappend | 35 + .../bluez-alsa/files/bluez-alsa.service | 11 + recipes-connectivity/bluez5/bluez5/bluetooth.conf | 39 + .../bluez5/bluez5/bluetooth.service | 21 + recipes-connectivity/bluez5/bluez5/obex.service | 10 + recipes-connectivity/bluez5/bluez5/tmpdir.conf | 2 + recipes-connectivity/bluez5/bluez5_%.bbappend | 1 + recipes-connectivity/bluez5/bluez5_agldemo.inc | 24 + .../cluster-connman-conf/cluster.config | 3 + .../cluster-connman-conf_1.0.bb | 15 + .../0001-remove-Fido-service-provider.patch | 31 + .../mobile-broadband-provider-info_agldemo.inc | 4 + .../mobile-broadband-provider-info_git.bbappend | 1 + ...rd-add-multi-user.target-to-neard.service.patch | 25 + ...dbus-property_get_type-method-on-empty-re.patch | 33 + recipes-connectivity/neard/neard_0.16.bbappend | 1 + recipes-connectivity/neard/neard_agldemo.inc | 7 + recipes-connectivity/neardal/neardal.inc | 22 + ...-fix-segfault-on-help-page-being-displaye.patch | 27 + .../0002-neardal-lib-fix-memory-corruption.patch | 58 + recipes-connectivity/neardal/neardal/ncl.patch | 25 + recipes-connectivity/neardal/neardal_0.14.bb | 10 + ...llow-duplicate-entries-from-mbpi_lookup_a.patch | 27 + recipes-connectivity/ofono/files/ofono.conf | 30 + recipes-connectivity/ofono/ofono_%.bbappend | 1 + recipes-connectivity/ofono/ofono_agldemo.inc | 11 + .../0001-remove-I-usr-include-in-pkg-config.patch | 40 + recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb | 32 + recipes-core/dbus/dbus/dbus.service | 10 + recipes-core/dbus/dbus/dbus.socket | 9 + recipes-core/dbus/dbus/dbus_env.conf | 5 + .../dbus/dbus/libdbus-c++/dbus-c++-threading.patch | 45 + recipes-core/dbus/dbus_%.bbappend | 1 + recipes-core/dbus/dbus_agldemo.inc | 28 + .../dbus/libdbus-c++/dbus-c++-threading.patch | 45 + recipes-core/dbus/libdbus-c++_0.9.0.bbappend | 1 + recipes-core/dbus/libdbus-c++_agldemo.inc | 2 + .../distro-build-manifest/distro-build-manifest.bb | 164 + recipes-core/psplash/.appends.core | 0 recipes-core/psplash/files/psplash-colors.h | 34 + recipes-core/psplash/files/psplash-poky-img.h | 5411 ++++++++++++++++++++ recipes-core/psplash/psplash_agldemo.inc | 9 + recipes-core/psplash/psplash_git.bbappend | 1 + .../udev/sw-gpsd-udev-conf/60-sw-gpsd.rules | 8 + recipes-core/udev/sw-gpsd-udev-conf_1.0.bb | 16 + .../udev/usb-can-udev-conf/60-usb-can.rules | 7 + recipes-core/udev/usb-can-udev-conf/slcand-default | 2 + .../udev/usb-can-udev-conf/slcand@.service | 13 + recipes-core/udev/usb-can-udev-conf_1.0.bb | 25 + .../alexa-viewer/alexa-viewer_git.bb | 0 .../cluster-dashboard/cluster-dashboard_git.bb | 29 + .../cluster-gauges-qtcompositor_git.bb | 29 + .../cluster-receiver/cluster-receiver_git.bb | 25 + .../cluster-receiver/qt-cluster-receiver_git.bb | 28 + .../cluster-windowmanager-conf/areas.json | 40 + .../cluster-windowmanager-conf/layers.json | 47 + .../cluster-windowmanager-conf/roles.db | 34 + .../cluster-windowmanager-conf_1.0.bb | 19 + .../dashboard/dashboard_git.bb | 0 .../homescreen-demo-ci/homescreen-demo-ci_git.bb | 0 .../homescreen/homescreen_git.bb | 0 .../html5-background/html5-background_git.bb | 0 .../html5-dashboard/html5-dashboard_git.bb | 0 .../html5-homescreen/html5-homescreen_git.bb | 0 .../html5-hvac/html5-hvac_git.bb | 0 .../html5-launcher/html5-launcher_git.bb | 0 .../html5-mediaplayer/html5-mediaplayer_git.bb | 0 .../html5-mixer/html5-mixer_git.bb | 0 .../html5-settings/html5-settings_git.bb | 0 .../hvac/hvac_git.bb | 0 .../inputeventmanager/inputeventmanager_git.bb | 2 +- .../launcher/launcher_git.bb | 0 .../mediaplayer/mediaplayer_git.bb | 0 .../messaging/messaging_git.bb | 0 .../mixer/mixer_git.bb | 0 .../navigation/navigation-demo_git.bb | 0 .../navigation/ondemandnavi-config/naviconfig.ini | 0 .../navigation/ondemandnavi-config_1.0.bb | 0 .../navigation/ondemandnavi_git.bb | 0 .../navigation/poiapp-api-key_1.0.bb | 0 .../poiapp/0001-add-display-permission.patch | 0 .../navigation/poiapp_git.bb | 0 .../navigation/tbtnavi_git.bb | 0 .../onscreenapp/onscreenapp_git.bb | 0 .../phone/phone_git.bb | 0 .../qtquickcontrols2-agl-style_git.bb | 0 .../qtquickcontrols2-agl_git.bb | 0 .../radio/files/presets-ALS.conf | 0 .../radio/files/presets-CES.conf | 0 .../radio/files/presets-FOSDEM.conf | 0 .../radio/radio_git.bb | 0 .../settings/settings_git.bb | 0 .../files/simple_can_simulator.py | 381 ++ .../simple-can-simulator/simple-can-simulator.bb | 15 + .../taskmanager/taskmanager_git.bb | 0 .../telematics-recorder/telematics-recorder_git.bb | 25 + .../waltham-receiver/waltham-receiver_git.bb | 0 .../low-level-can-generator_git.bb | 17 + recipes-devtools/python/python3-asyncssh_2.3.0.bb | 15 + .../python/python3-pytest-dependency_0.5.1.bb | 12 + .../python/python3-pytest-reverse_1.0.1.bb | 12 + .../run-agl-postinsts/run-agl-postinsts | 48 + .../run-agl-postinsts/run-agl-postinsts.service | 17 + .../run-agl-postinsts/run-agl-postinsts_1.0.bb | 46 + .../run-agl-postinsts_1.0.bbappend | 1 + recipes-graphics/hmi-debug/files/hmi-debug | 8 + recipes-graphics/hmi-debug/hmi-debug_git.bb | 19 + recipes-graphics/kms-conf/kms-conf/kms.conf | 8 + recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf | 12 + recipes-graphics/kms-conf/kms-conf_1.0.bb | 12 + .../libhomescreen/libhomescreen_git.bb | 19 + .../qlibhomescreen/qlibhomescreen_git.bb | 13 + recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend | 13 +- recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc | 12 + recipes-graphics/wayland/weston-init.bbappend | 1 + .../wayland/weston-init/tmpfiles.conf.in | 6 + .../wayland/weston-init/weston-dep.conf.in | 3 + .../wayland/weston-init/weston.conf.in | 12 + .../wayland/weston-init/zz-dri-imx.rules.in | 2 + .../wayland/weston-init/zz-dri.rules.in | 1 + .../wayland/weston-init/zz-input.rules.in | 1 + .../wayland/weston-init/zz-tty.rules.in | 1 + recipes-graphics/wayland/weston-init_agldemo.inc | 77 + .../0002-src-most-add-auto-conf-feature.patch | 472 ++ ...003-core-remove-kernel-log-for-MBO-status.patch | 26 + .../files/0004-most-video-set-device_caps.patch | 25 + ...-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch | 25 + .../files/0006-dim2-fix-startup-sequence.patch | 186 + .../most/files/0007-dim2-use-device-tree.patch | 378 ++ ...im2-read-clock-speed-from-the-device-tree.patch | 92 + ...use-device-for-coherent-memory-allocation.patch | 47 + .../most/files/0010-backport-usb-setup-timer.patch | 35 + ...1-handle-snd_pcm_lib_mmap_vmalloc-removal.patch | 30 + .../files/0012-Fix-build-with-5.4-kernel.patch | 68 + recipes-kernel/most/most.bb | 14 + recipes-kernel/most/most.bbappend | 15 + ...-Install-wayland-header-from-gstwayland-l.patch | 28 + .../gstreamer1.0-plugins-bad_1.16.%.bbappend | 1 + .../gstreamer1.0-plugins-bad_agldemo.inc | 2 + .../gstreamer1.0-plugins-good_%.bbappend | 1 + .../gstreamer1.0-plugins-good_agldemo.inc | 2 + ...gure-option-to-disable-build-of-man-pages.patch | 40 + recipes-multimedia/libmp4v2/libmp4v2_git.bb | 18 + .../lightmediascanner/.appends.meta-efl | 0 ...ine-comparison_fn_t-for-non-glibc-systems.patch | 33 + ...m-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch | 49 + .../files/dbus-lightmediascanner.conf | 12 + .../id3-plugin-support-out-of-tree-build.patch | 11 + .../files/lightmediascanner.service | 16 + .../files/plugin-ogg-fix-chucksize-issue.patch | 53 + .../lightmediascanner/lightmediascanner_%.bbappend | 42 + .../lightmediascanner/lightmediascanner_0.5.1.bb | 63 + .../files/org.freedesktop.GeoClue2.Client.conf | 8 + recipes-navigation/geoclue/geoclue_%.bbappend | 1 + recipes-navigation/geoclue/geoclue_agldemo.inc | 11 + recipes-navigation/gpsd/gpsd/sw-device-hook | 23 + recipes-navigation/gpsd/gpsd_%.bbappend | 1 + recipes-navigation/gpsd/gpsd_agldemo.inc | 28 + .../images/agl-cluster-demo-platform-crosssdk.bb | 27 + .../images/agl-cluster-demo-platform.bb | 14 + .../images/agl-cluster-demo-platform.inc | 3 + .../images/agl-cluster-demo-qtcompositor.bb | 15 + .../images/agl-cluster-demo-qtcompositor.inc | 2 + .../images/agl-demo-platform-crosssdk.bb | 2 +- recipes-platform/images/agl-image-cluster-qt5.bb | 9 + recipes-platform/images/agl-image-cluster-qt5.inc | 7 + recipes-platform/images/agl-image-cluster.bb | 9 + recipes-platform/images/agl-image-cluster.inc | 7 + .../images/agl-image-graphical-html5.bb | 10 + .../images/agl-image-graphical-html5.inc | 9 + .../images/agl-image-graphical-qt5-crosssdk.bb | 18 + .../images/agl-image-graphical-qt5-crosssdk.inc | 14 + recipes-platform/images/agl-image-graphical-qt5.bb | 5 + .../images/agl-image-graphical-qt5.inc | 1 + recipes-platform/images/agl-image-telematics.bb | 9 + recipes-platform/images/agl-image-telematics.inc | 5 + .../agl-telematics-demo-platform-crosssdk.bb | 21 + .../images/agl-telematics-demo-platform.bb | 13 + .../images/agl-telematics-demo-platform.inc | 3 + .../nativesdk-packagegroup-sdk-host.bbappend | 6 + .../packagegroup-agl-app-framework.bbappend | 1 + .../packagegroups/packagegroup-agl-appfw-html5.bb | 18 + .../packagegroup-agl-appfw-native-qt5.bb | 29 + .../packagegroup-agl-cluster-demo-platform.bb | 43 + .../packagegroup-agl-cluster-demo-qtcompositor.bb | 43 + .../packagegroup-agl-core-devel.bbappend | 10 + .../packagegroup-agl-demo-qt-examples.bb | 26 + .../packagegroup-agl-graphical-services.bb | 15 + .../packagegroup-agl-graphical-weston.bbappend | 1 + .../packagegroup-agl-graphical-weston_agldemo.inc | 8 + .../packagegroups/packagegroup-agl-image-ivi.bb | 5 - .../packagegroup-agl-image-ivi.bbappend | 1 + .../packagegroup-agl-ivi-connectivity.bbappend | 0 .../packagegroups/packagegroup-agl-ivi-identity.bb | 0 .../packagegroup-agl-ivi-navigation.bb | 2 +- .../packagegroups/packagegroup-agl-ivi-services.bb | 3 + .../packagegroups/packagegroup-agl-networking.bb | 23 + .../packagegroup-agl-profile-cluster-qt5.bb | 21 + ...ackagegroup-agl-profile-cluster-qtcompositor.bb | 36 + .../packagegroup-agl-profile-cluster.bb | 20 + .../packagegroup-agl-profile-graphical-html5.bb | 23 + .../packagegroup-agl-profile-graphical-qt5.bb | 23 + .../packagegroup-agl-profile-graphical.bbappend | 3 + .../packagegroup-agl-profile-telematics.bb | 25 + .../packagegroup-agl-source-han-sans-ttf-fonts.bb | 20 + .../packagegroup-agl-telematics-demo-platform.bb | 35 + .../packagegroups/packagegroup-agl-ttf-fonts.bb | 21 + .../packagegroup-qt5-toolchain-target.bbappend | 18 + recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb | 40 + recipes-qt/qt/qtbase-native_git.bbappendTOCHECK | 3 + ...-to-make-introspect-for-every-findMetaObj.patch | 30 + recipes-qt/qt/qtbase_%.bbappend | 1 + recipes-qt/qt/qtbase_agldemo.inc | 16 + ...mapbox-update-API-url-to-match-new-schema.patch | 47 + recipes-qt/qt/qtlocation_%.bbappend | 1 + recipes-qt/qt/qtlocation_agldemo.inc | 14 + ...age-support-with-the-data-URL-scheme-for-.patch | 80 + recipes-qt/qt/qtmultimedia_%.bbappend | 1 + recipes-qt/qt/qtmultimedia_agldemo.inc | 7 + recipes-qt/qt/qtsystems_%.bbappend | 1 + recipes-qt/qt/qtsystems_agldemo.inc | 3 + recipes-qt/qt/qtwayland-config/qtwayland | 12 + recipes-qt/qt/qtwayland-config_1.0.0.bb | 21 + ...update-3rd-party-ivi-application-protocol.patch | 56 + ...dow-add-support-for-IVI-Surface-ID-proper.patch | 34 + ...est-file-according-to-smack-3-domain-mode.patch | 33 + ...Add-xdg-shell-protocol-file-version-1.4.0.patch | 468 ++ ...dd-minimize-feature-to-QWindow-using-wayl.patch | 1029 ++++ ...pgrade-to-support-current-version-weston-.patch | 772 +++ ...-IVI-Shell-protocol-file-version-patch-v6.patch | 128 + .../0021-Implement-initial-IVI-Shell-support.patch | 539 ++ .../qt/qtwayland/0099_qtwayland_no_evdev.patch | 14 + ...018-packaging-enable-xdg-shell-at-runtime.patch | 31 + recipes-qt/qt/qtwayland_%.bbappend | 1 + recipes-qt/qt/qtwayland_agldemo.inc | 26 + recipes-qt/qt/qtwebkit_%.bbappend | 1 + recipes-qt/qt/qtwebkit_agldemo.inc | 1 + recipes-support/curl/curl_%.bbappend | 1 + recipes-support/curl/curl_agldemo.inc | 5 + recipes-support/opencv/opencv_4.%.bbappend | 1 + recipes-support/opencv/opencv_agldemo.inc | 1 + recipes-support/udisks/files/99-udisks2.rules | 5 + recipes-support/udisks/files/automount.service | 9 + recipes-support/udisks/files/automount.sh | 93 + recipes-support/udisks/udisks2_%.bbappend | 1 + recipes-support/udisks/udisks2_agldemo.inc | 27 + recipes-test/afb-test/afb-test_git.bb | 25 + recipes-test/afb-test/files/run-ptest | 3 + .../gcovr-wrapper/gcovr-wrapper/gcovr-wrapper | 320 ++ recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb | 17 + ...0001-add-gcov-filter-source-errors-option.patch | 68 + recipes-test/gcovr/gcovr_%.bbappend | 2 + recipes-test/gcovr/gcovr_git.bb | 32 + recipes-test/pyagl/pyagl_git.bb | 33 + recipes-wam/chromium/chromium-browser-service.bb | 19 + .../chromium/chromium68/v8-qemu-wrapper.patch | 40 + recipes-wam/chromium/chromium68_git.bb | 404 ++ recipes-wam/chromium/gn-utils.inc | 157 + recipes-wam/wam/files/WebAppMgr.env | 202 + recipes-wam/wam/files/WebAppMgr@.service | 37 + recipes-wam/wam/files/trunc-webapp-roles.patch | 56 + recipes-wam/wam/wam_git.bb | 51 + scripts/run-yocto-check-layer-all-layers.sh | 67 + scripts/run-yocto-check-layer.sh | 49 + .../agl-cluster-demo-preload/50_local.conf.inc | 2 + .../README_feature_agl-cluster-demo-preload.md | 9 + .../feature/agl-cluster-demo/50_local.conf.inc | 2 + templates/feature/agl-cluster-demo/included.dep | 1 + .../agl-demo-soundmanager/50_bblayers.conf.inc | 5 - .../agl-demo-soundmanager/50_local.conf.inc | 2 - .../README_feature_agl-demo-soundmanager.md | 18 - .../feature/agl-demo-soundmanager/included.dep | 1 - templates/feature/agl-demo/50_bblayers.conf.inc | 3 + templates/feature/agl-demo/included.dep | 2 +- .../feature/agl-telematics-demo/50_local.conf.inc | 2 + templates/feature/agl-telematics-demo/included.dep | 1 + 324 files changed, 16341 insertions(+), 69 deletions(-) create mode 120000 README create mode 100644 classes/agl-graphical.bbclass create mode 100644 conf/include/agl-cluster-demo-preload.inc create mode 100644 conf/include/agl-cluster-demo.inc create mode 100644 conf/include/agl-telematics-demo.inc delete mode 100644 docs/devguides-book.yml create mode 100644 recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb create mode 100644 recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb create mode 100644 recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb create mode 100644 recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb create mode 100644 recipes-apis/agl-service-can-low-level/files/run-ptest create mode 100644 recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb create mode 100644 recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb create mode 100644 recipes-apis/agl-service-geofence/agl-service-geofence_git.bb create mode 100644 recipes-apis/agl-service-gps/agl-service-gps_git.bb create mode 100644 recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb create mode 100644 recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb create mode 100644 recipes-apis/agl-service-hvac/agl-service-hvac_git.bb create mode 100644 recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb create mode 100644 recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb create mode 100644 recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb create mode 100644 recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb create mode 100755 recipes-apis/agl-service-navigation/agl-service-navigation_git.bb create mode 100644 recipes-apis/agl-service-network/agl-service-network_git.bb create mode 100644 recipes-apis/agl-service-nfc/agl-service-nfc_git.bb create mode 100644 recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb create mode 100644 recipes-apis/agl-service-radio/agl-service-radio_git.bb create mode 100644 recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb create mode 100644 recipes-apis/agl-service-signal-composer/files/run-ptest create mode 100644 recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb create mode 100644 recipes-apis/agl-service-telephony/agl-service-telephony_git.bb create mode 100644 recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb create mode 100644 recipes-apis/agl-service-unicens/agl-service-unicens_git.bb create mode 100644 recipes-apis/agl-service-weather/agl-service-weather_git.bb create mode 100644 recipes-config/agl-login-manager/agl-login-manager_0.1.bb create mode 100644 recipes-config/agl-users/agl-users_0.1.bb create mode 100644 recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb create mode 100644 recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster create mode 100644 recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default create mode 100644 recipes-config/dev-mapping/dev-mapping_0.1.bb create mode 100644 recipes-config/systemd-sync/systemd-agl-sync_1.0.bb create mode 100644 recipes-connectivity/bluez-alsa/bluez-alsa/0001-utils-add-a-gstreamer-helper-application-for-interco.patch create mode 100644 recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service create mode 100644 recipes-connectivity/bluez-alsa/bluez-alsa_git.bb create mode 100644 recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend create mode 100644 recipes-connectivity/bluez-alsa/files/bluez-alsa.service create mode 100644 recipes-connectivity/bluez5/bluez5/bluetooth.conf create mode 100644 recipes-connectivity/bluez5/bluez5/bluetooth.service create mode 100644 recipes-connectivity/bluez5/bluez5/obex.service create mode 100644 recipes-connectivity/bluez5/bluez5/tmpdir.conf create mode 100644 recipes-connectivity/bluez5/bluez5_%.bbappend create mode 100644 recipes-connectivity/bluez5/bluez5_agldemo.inc create mode 100644 recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config create mode 100644 recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb create mode 100644 recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch create mode 100644 recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc create mode 100644 recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend create mode 100644 recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch create mode 100644 recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch create mode 100644 recipes-connectivity/neard/neard_0.16.bbappend create mode 100644 recipes-connectivity/neard/neard_agldemo.inc create mode 100644 recipes-connectivity/neardal/neardal.inc create mode 100644 recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch create mode 100644 recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch create mode 100644 recipes-connectivity/neardal/neardal/ncl.patch create mode 100644 recipes-connectivity/neardal/neardal_0.14.bb create mode 100644 recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch create mode 100644 recipes-connectivity/ofono/files/ofono.conf create mode 100644 recipes-connectivity/ofono/ofono_%.bbappend create mode 100644 recipes-connectivity/ofono/ofono_agldemo.inc create mode 100644 recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch create mode 100644 recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb create mode 100644 recipes-core/dbus/dbus/dbus.service create mode 100644 recipes-core/dbus/dbus/dbus.socket create mode 100644 recipes-core/dbus/dbus/dbus_env.conf create mode 100644 recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch create mode 100644 recipes-core/dbus/dbus_%.bbappend create mode 100644 recipes-core/dbus/dbus_agldemo.inc create mode 100644 recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch create mode 100644 recipes-core/dbus/libdbus-c++_0.9.0.bbappend create mode 100644 recipes-core/dbus/libdbus-c++_agldemo.inc create mode 100644 recipes-core/distro-build-manifest/distro-build-manifest.bb create mode 100644 recipes-core/psplash/.appends.core create mode 100644 recipes-core/psplash/files/psplash-colors.h create mode 100644 recipes-core/psplash/files/psplash-poky-img.h create mode 100644 recipes-core/psplash/psplash_agldemo.inc create mode 100644 recipes-core/psplash/psplash_git.bbappend create mode 100644 recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules create mode 100644 recipes-core/udev/sw-gpsd-udev-conf_1.0.bb create mode 100644 recipes-core/udev/usb-can-udev-conf/60-usb-can.rules create mode 100644 recipes-core/udev/usb-can-udev-conf/slcand-default create mode 100644 recipes-core/udev/usb-can-udev-conf/slcand@.service create mode 100644 recipes-core/udev/usb-can-udev-conf_1.0.bb rename {recipes-demo-hmi => recipes-demo}/alexa-viewer/alexa-viewer_git.bb (100%) create mode 100644 recipes-demo/cluster-dashboard/cluster-dashboard_git.bb create mode 100644 recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb create mode 100644 recipes-demo/cluster-receiver/cluster-receiver_git.bb create mode 100644 recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb create mode 100644 recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json create mode 100644 recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json create mode 100644 recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db create mode 100644 recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb rename {recipes-demo-hmi => recipes-demo}/dashboard/dashboard_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/homescreen-demo-ci/homescreen-demo-ci_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/homescreen/homescreen_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-background/html5-background_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-dashboard/html5-dashboard_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-homescreen/html5-homescreen_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-hvac/html5-hvac_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-launcher/html5-launcher_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-mediaplayer/html5-mediaplayer_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-mixer/html5-mixer_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/html5-settings/html5-settings_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/hvac/hvac_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/inputeventmanager/inputeventmanager_git.bb (99%) rename {recipes-demo-hmi => recipes-demo}/launcher/launcher_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/mediaplayer/mediaplayer_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/messaging/messaging_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/mixer/mixer_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/navigation-demo_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/ondemandnavi-config/naviconfig.ini (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/ondemandnavi-config_1.0.bb (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/ondemandnavi_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/poiapp-api-key_1.0.bb (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/poiapp/0001-add-display-permission.patch (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/poiapp_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/navigation/tbtnavi_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/onscreenapp/onscreenapp_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/phone/phone_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/radio/files/presets-ALS.conf (100%) rename {recipes-demo-hmi => recipes-demo}/radio/files/presets-CES.conf (100%) rename {recipes-demo-hmi => recipes-demo}/radio/files/presets-FOSDEM.conf (100%) rename {recipes-demo-hmi => recipes-demo}/radio/radio_git.bb (100%) rename {recipes-demo-hmi => recipes-demo}/settings/settings_git.bb (100%) create mode 100755 recipes-demo/simple-can-simulator/files/simple_can_simulator.py create mode 100644 recipes-demo/simple-can-simulator/simple-can-simulator.bb rename {recipes-demo-hmi => recipes-demo}/taskmanager/taskmanager_git.bb (100%) create mode 100644 recipes-demo/telematics-recorder/telematics-recorder_git.bb rename {recipes-demo-hmi => recipes-demo}/waltham-receiver/waltham-receiver_git.bb (100%) create mode 100644 recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb create mode 100644 recipes-devtools/python/python3-asyncssh_2.3.0.bb create mode 100644 recipes-devtools/python/python3-pytest-dependency_0.5.1.bb create mode 100644 recipes-devtools/python/python3-pytest-reverse_1.0.1.bb create mode 100755 recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts create mode 100644 recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service create mode 100644 recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb create mode 100644 recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend create mode 100644 recipes-graphics/hmi-debug/files/hmi-debug create mode 100644 recipes-graphics/hmi-debug/hmi-debug_git.bb create mode 100644 recipes-graphics/kms-conf/kms-conf/kms.conf create mode 100644 recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf create mode 100644 recipes-graphics/kms-conf/kms-conf_1.0.bb create mode 100644 recipes-graphics/libhomescreen/libhomescreen_git.bb create mode 100644 recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb create mode 100644 recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc create mode 100644 recipes-graphics/wayland/weston-init.bbappend create mode 100644 recipes-graphics/wayland/weston-init/tmpfiles.conf.in create mode 100644 recipes-graphics/wayland/weston-init/weston-dep.conf.in create mode 100644 recipes-graphics/wayland/weston-init/weston.conf.in create mode 100644 recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in create mode 100644 recipes-graphics/wayland/weston-init/zz-dri.rules.in create mode 100644 recipes-graphics/wayland/weston-init/zz-input.rules.in create mode 100644 recipes-graphics/wayland/weston-init/zz-tty.rules.in create mode 100644 recipes-graphics/wayland/weston-init_agldemo.inc create mode 100644 recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch create mode 100644 recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch create mode 100644 recipes-kernel/most/files/0004-most-video-set-device_caps.patch create mode 100644 recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch create mode 100644 recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch create mode 100644 recipes-kernel/most/files/0007-dim2-use-device-tree.patch create mode 100644 recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch create mode 100644 recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch create mode 100644 recipes-kernel/most/files/0010-backport-usb-setup-timer.patch create mode 100644 recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch create mode 100644 recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch create mode 100644 recipes-kernel/most/most.bb create mode 100644 recipes-kernel/most/most.bbappend create mode 100644 recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch create mode 100644 recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend create mode 100644 recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc create mode 100644 recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend create mode 100644 recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc create mode 100644 recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch create mode 100644 recipes-multimedia/libmp4v2/libmp4v2_git.bb create mode 100644 recipes-multimedia/lightmediascanner/.appends.meta-efl create mode 100644 recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch create mode 100644 recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch create mode 100644 recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf create mode 100644 recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch create mode 100644 recipes-multimedia/lightmediascanner/files/lightmediascanner.service create mode 100644 recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch create mode 100644 recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend create mode 100644 recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb create mode 100644 recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf create mode 100644 recipes-navigation/geoclue/geoclue_%.bbappend create mode 100644 recipes-navigation/geoclue/geoclue_agldemo.inc create mode 100644 recipes-navigation/gpsd/gpsd/sw-device-hook create mode 100644 recipes-navigation/gpsd/gpsd_%.bbappend create mode 100644 recipes-navigation/gpsd/gpsd_agldemo.inc create mode 100644 recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb create mode 100644 recipes-platform/images/agl-cluster-demo-platform.bb create mode 100644 recipes-platform/images/agl-cluster-demo-platform.inc create mode 100644 recipes-platform/images/agl-cluster-demo-qtcompositor.bb create mode 100644 recipes-platform/images/agl-cluster-demo-qtcompositor.inc create mode 100644 recipes-platform/images/agl-image-cluster-qt5.bb create mode 100644 recipes-platform/images/agl-image-cluster-qt5.inc create mode 100644 recipes-platform/images/agl-image-cluster.bb create mode 100644 recipes-platform/images/agl-image-cluster.inc create mode 100644 recipes-platform/images/agl-image-graphical-html5.bb create mode 100644 recipes-platform/images/agl-image-graphical-html5.inc create mode 100755 recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb create mode 100644 recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc create mode 100644 recipes-platform/images/agl-image-graphical-qt5.bb create mode 100644 recipes-platform/images/agl-image-graphical-qt5.inc create mode 100644 recipes-platform/images/agl-image-telematics.bb create mode 100644 recipes-platform/images/agl-image-telematics.inc create mode 100644 recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb create mode 100644 recipes-platform/images/agl-telematics-demo-platform.bb create mode 100644 recipes-platform/images/agl-telematics-demo-platform.inc create mode 100644 recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend create mode 100644 recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend create mode 100644 recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend create mode 100644 recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend create mode 100644 recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc rename {recipes-core => recipes-platform}/packagegroups/packagegroup-agl-image-ivi.bbappend (63%) rename {recipes-core => recipes-platform}/packagegroups/packagegroup-agl-ivi-connectivity.bbappend (100%) rename {recipes-core => recipes-platform}/packagegroups/packagegroup-agl-ivi-identity.bb (100%) create mode 100644 recipes-platform/packagegroups/packagegroup-agl-networking.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend create mode 100644 recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb create mode 100644 recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb create mode 100644 recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend create mode 100644 recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb create mode 100644 recipes-qt/qt/qtbase-native_git.bbappendTOCHECK create mode 100644 recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch create mode 100644 recipes-qt/qt/qtbase_%.bbappend create mode 100644 recipes-qt/qt/qtbase_agldemo.inc create mode 100644 recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch create mode 100644 recipes-qt/qt/qtlocation_%.bbappend create mode 100644 recipes-qt/qt/qtlocation_agldemo.inc create mode 100644 recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch create mode 100644 recipes-qt/qt/qtmultimedia_%.bbappend create mode 100644 recipes-qt/qt/qtmultimedia_agldemo.inc create mode 100644 recipes-qt/qt/qtsystems_%.bbappend create mode 100644 recipes-qt/qt/qtsystems_agldemo.inc create mode 100644 recipes-qt/qt/qtwayland-config/qtwayland create mode 100644 recipes-qt/qt/qtwayland-config_1.0.0.bb create mode 100644 recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch create mode 100644 recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch create mode 100644 recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch create mode 100644 recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch create mode 100644 recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch create mode 100644 recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch create mode 100644 recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch create mode 100644 recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch create mode 100644 recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch create mode 100644 recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch create mode 100644 recipes-qt/qt/qtwayland_%.bbappend create mode 100644 recipes-qt/qt/qtwayland_agldemo.inc create mode 100644 recipes-qt/qt/qtwebkit_%.bbappend create mode 100644 recipes-qt/qt/qtwebkit_agldemo.inc create mode 100644 recipes-support/curl/curl_%.bbappend create mode 100644 recipes-support/curl/curl_agldemo.inc create mode 100644 recipes-support/opencv/opencv_4.%.bbappend create mode 100644 recipes-support/opencv/opencv_agldemo.inc create mode 100644 recipes-support/udisks/files/99-udisks2.rules create mode 100644 recipes-support/udisks/files/automount.service create mode 100644 recipes-support/udisks/files/automount.sh create mode 100644 recipes-support/udisks/udisks2_%.bbappend create mode 100644 recipes-support/udisks/udisks2_agldemo.inc create mode 100644 recipes-test/afb-test/afb-test_git.bb create mode 100644 recipes-test/afb-test/files/run-ptest create mode 100644 recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper create mode 100644 recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb create mode 100644 recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch create mode 100644 recipes-test/gcovr/gcovr_%.bbappend create mode 100644 recipes-test/gcovr/gcovr_git.bb create mode 100644 recipes-test/pyagl/pyagl_git.bb create mode 100644 recipes-wam/chromium/chromium-browser-service.bb create mode 100644 recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch create mode 100644 recipes-wam/chromium/chromium68_git.bb create mode 100644 recipes-wam/chromium/gn-utils.inc create mode 100644 recipes-wam/wam/files/WebAppMgr.env create mode 100644 recipes-wam/wam/files/WebAppMgr@.service create mode 100644 recipes-wam/wam/files/trunc-webapp-roles.patch create mode 100644 recipes-wam/wam/wam_git.bb create mode 100755 scripts/run-yocto-check-layer-all-layers.sh create mode 100755 scripts/run-yocto-check-layer.sh create mode 100644 templates/feature/agl-cluster-demo-preload/50_local.conf.inc create mode 100644 templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md create mode 100644 templates/feature/agl-cluster-demo/50_local.conf.inc create mode 100644 templates/feature/agl-cluster-demo/included.dep delete mode 100644 templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc delete mode 100644 templates/feature/agl-demo-soundmanager/50_local.conf.inc delete mode 100644 templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md delete mode 100644 templates/feature/agl-demo-soundmanager/included.dep create mode 100644 templates/feature/agl-telematics-demo/50_local.conf.inc create mode 100644 templates/feature/agl-telematics-demo/included.dep diff --git a/README b/README new file mode 120000 index 000000000..42061c01a --- /dev/null +++ b/README @@ -0,0 +1 @@ +README.md \ No newline at end of file diff --git a/classes/agl-graphical.bbclass b/classes/agl-graphical.bbclass new file mode 100644 index 000000000..8b5fbf6ba --- /dev/null +++ b/classes/agl-graphical.bbclass @@ -0,0 +1,5 @@ +WESTONUSER ??= "display" +WESTONGROUP ??= "display" +WESTONARGS ?= "--idle-time=0 --tty=7" +WESTONLAUNCHARGS ??= "--tty /dev/tty7 --user ${WESTONUSER}" +DISPLAY_XDG_RUNTIME_DIR ??= "/run/platform/${WESTONUSER}" diff --git a/conf/include/agl-cluster-demo-preload.inc b/conf/include/agl-cluster-demo-preload.inc new file mode 100644 index 000000000..70421e8cf --- /dev/null +++ b/conf/include/agl-cluster-demo-preload.inc @@ -0,0 +1 @@ +AGL_FEATURES_append = " agl-cluster-demo-preload" diff --git a/conf/include/agl-cluster-demo.inc b/conf/include/agl-cluster-demo.inc new file mode 100644 index 000000000..a8847e071 --- /dev/null +++ b/conf/include/agl-cluster-demo.inc @@ -0,0 +1,5 @@ +IMAGE_FEATURES =+ "debug-tweaks" + +#DISTRO_FEATURES_append = " " + +#IMAGE_INSTALL_append = " " diff --git a/conf/include/agl-demo-preload.inc b/conf/include/agl-demo-preload.inc index da46810b9..484bc0578 100644 --- a/conf/include/agl-demo-preload.inc +++ b/conf/include/agl-demo-preload.inc @@ -1,4 +1,4 @@ -DISTRO_FEATURES_append = " agl-demo-preload" +AGL_FEATURES_append = " agl-demo-preload" # Use demo device mapping for low-can that enables sllin0 PREFERRED_RPROVIDER_virtual/low-can-dev-mapping = "dev-mapping-demo" diff --git a/conf/include/agl-demo.inc b/conf/include/agl-demo.inc index 32d447af3..390f47ea8 100644 --- a/conf/include/agl-demo.inc +++ b/conf/include/agl-demo.inc @@ -1,11 +1,13 @@ IMAGE_FEATURES =+ "debug-tweaks" -# disable the webruntime -#DISTRO_FEATURES_append = " webruntime " DISTRO_FEATURES_append = " automount " +# convenience IMAGE_INSTALL_append = " screen mc " # Extend agl-voiceagent-alexa image feature with local alexa-viewer # package. FEATURE_PACKAGES_agl-voiceagent-alexa_append = " alexa-viewer" + +# enable the layer +AGL_FEATURES_append = " agldemo" diff --git a/conf/include/agl-telematics-demo.inc b/conf/include/agl-telematics-demo.inc new file mode 100644 index 000000000..a8847e071 --- /dev/null +++ b/conf/include/agl-telematics-demo.inc @@ -0,0 +1,5 @@ +IMAGE_FEATURES =+ "debug-tweaks" + +#DISTRO_FEATURES_append = " " + +#IMAGE_INSTALL_append = " " diff --git a/conf/layer.conf b/conf/layer.conf index 7da7ac0d2..f9ef8c6f2 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -5,8 +5,11 @@ BBPATH =. "${LAYERDIR}:" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend" -BBFILE_COLLECTIONS += "agl-demo" -BBFILE_PATTERN_agl-demo = "^${LAYERDIR}/" -BBFILE_PRIORITY_agl-demo = "7" +BBFILE_COLLECTIONS += "agldemo" +BBFILE_PATTERN_agldemo = "^${LAYERDIR}/" +BBFILE_PRIORITY_agldemo = "70" + +LAYERSERIES_COMPAT_agldemo = "dunfell" + +LAYERDEPENDS_agldemo = "aglcore app-framework qt5-layer openembedded-layer" -LAYERSERIES_COMPAT_agl-demo = "dunfell" diff --git a/docs/devguides-book.yml b/docs/devguides-book.yml deleted file mode 100644 index 5a580980c..000000000 --- a/docs/devguides-book.yml +++ /dev/null @@ -1,13 +0,0 @@ -type: books -books: -- - id: meta-agl-demo - title: Meta AGL Demo - description: Meta AGL Demo documentation - keywords: - author: "AGL" - version: master - chapters: - - url: ../meta-agl-demo.md - destination: meta-agl-demo.md - name: meta-agl-demo diff --git a/recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb b/recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb new file mode 100644 index 000000000..bc53051f2 --- /dev/null +++ b/recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Bluetooth MAP Service Binding" +DESCRIPTION = "AGL Bluetooth MAP Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth-map" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth-map;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "glib-2.0 json-c" +RDEPENDS_${PN} = "bluez5-obex agl-service-bluetooth" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb b/recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb new file mode 100644 index 000000000..3f9ff7be1 --- /dev/null +++ b/recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Bluetooth PBAP Service Binding" +DESCRIPTION = "AGL Bluetooth PBAP Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth-pbap" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth-pbap;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "glib-2.0 json-c" +RDEPENDS_${PN} = "bluez5-obex agl-service-bluetooth agl-service-data-persistence" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb b/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb new file mode 100644 index 000000000..8cfa8ec8f --- /dev/null +++ b/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Bluetooth Service Binding" +DESCRIPTION = "AGL Bluetooth Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "glib-2.0 json-c" +RDEPENDS_${PN} = "agl-service-data-persistence agl-service-network" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb new file mode 100644 index 000000000..83f6c1e75 --- /dev/null +++ b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb @@ -0,0 +1,23 @@ +SUMMARY = "Low level CAN service" +DESCRIPTION = "AGL Service application for read and decode CAN messages" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/low-level-can-service" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-can-low-level;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "${AGLVERSION}" +S = "${WORKDIR}/git" + +DEPENDS = "libafb-helpers libappcontroller" + +inherit cmake aglwgt pkgconfig ptest + +# For now, just enable J1939 on the qemu platforms where we know the +# linux-yocto kernel is new enough (>= 5.4) and has the support enabled. +AGLWGT_CMAKE_CONFIGURE_ARGS_append_qemuall = " -DWITH_FEATURE_J1939=ON" + +RDEPENDS_${PN} = "virtual/low-can-dev-mapping" diff --git a/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend index 4f2821043..cc198c1cf 100644 --- a/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend +++ b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend @@ -1,10 +1,10 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/files:" -SRC_URI += "file://can-dev-mapping-helper.conf" +SRC_URI_append = " file://can-dev-mapping-helper.conf" do_install_append() { install -D -m 0644 ${WORKDIR}/can-dev-mapping-helper.conf \ ${D}${sysconfdir}/systemd/system/afm-service-agl-service-can-low-level-.service.d/can-dev-mapping-helper.conf } -RDEPENDS_${PN} += "can-dev-mapping-helper" +RDEPENDS_${PN}_append = " can-dev-mapping-helper" diff --git a/recipes-apis/agl-service-can-low-level/files/run-ptest b/recipes-apis/agl-service-can-low-level/files/run-ptest new file mode 100644 index 000000000..cc9c41365 --- /dev/null +++ b/recipes-apis/agl-service-can-low-level/files/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +afm-test /usr/AGL/apps/testwgt/low-can-service-test.wgt diff --git a/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb b/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb new file mode 100644 index 000000000..569f0707e --- /dev/null +++ b/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "AGL low level user database binding" +HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-data-persistence/" +SECTION = "base" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-data-persistence;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +inherit cmake aglwgt pkgconfig + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS += " af-binder json-c gdbm " + diff --git a/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb b/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb new file mode 100644 index 000000000..a12923247 --- /dev/null +++ b/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb @@ -0,0 +1,17 @@ +SUMMARY = "GeoClue Service Binding" +DESCRIPTION = "AGL GeoClue Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-geoclue" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-geoclue;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c geoclue" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb b/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb new file mode 100644 index 000000000..8bdcd7c93 --- /dev/null +++ b/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Geofence Service Binding" +DESCRIPTION = "AGL Geofence Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-geofence" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-geofence;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c glib-2.0" +RDEPENDS_${PN} = "agl-service-gps" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-gps/agl-service-gps_git.bb b/recipes-apis/agl-service-gps/agl-service-gps_git.bb new file mode 100644 index 000000000..254e5e409 --- /dev/null +++ b/recipes-apis/agl-service-gps/agl-service-gps_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "GPS/GNSS Service Binding" +DESCRIPTION = "AGL GPS/GNSS Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-gps" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-gps;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c gpsd" +RDEPENDS_${PN} = "libgps" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb b/recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb new file mode 100644 index 000000000..7d2661bc0 --- /dev/null +++ b/recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb @@ -0,0 +1,14 @@ +SUMMARY = "Homescreen binding and client library for application" +DESCRIPTION = "agl-service-homescreen is the binding library" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/apps/agl-service-homescreen" +SECTION = "HMI" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +DEPENDS = "dbus glib-2.0 af-binder json-c" + +inherit cmake aglwgt + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-homescreen;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" +S = "${WORKDIR}/git" diff --git a/recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb b/recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb new file mode 100644 index 000000000..e4dccbf3d --- /dev/null +++ b/recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb @@ -0,0 +1,27 @@ +SUMMARY = "HVAC Service Binding Configuration" +DESCRIPTION = "AGL HVAC Service Binding Configuration" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-hvac" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-hvac;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +do_install () { + install -D -m 644 ${S}/hvac.json ${D}${sysconfdir}/hvac.json +} + +do_install_append_ulcb() { + sed -i -e "s#vcan0#sllin0#g" ${D}${sysconfdir}/hvac.json +} + diff --git a/recipes-apis/agl-service-hvac/agl-service-hvac_git.bb b/recipes-apis/agl-service-hvac/agl-service-hvac_git.bb new file mode 100644 index 000000000..545ab6a28 --- /dev/null +++ b/recipes-apis/agl-service-hvac/agl-service-hvac_git.bb @@ -0,0 +1,20 @@ +SUMMARY = "HVAC Service Binding" +DESCRIPTION = "AGL HVAC Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-hvac" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-hvac;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c" + +inherit cmake aglwgt pkgconfig + +RDEPENDS_${PN} += "agl-service-identity-agent agl-service-can-low-level" +RRECOMMENDS_${PN} += "agl-service-hvac-conf" diff --git a/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb b/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb new file mode 100644 index 000000000..f2474be7b --- /dev/null +++ b/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "AGL identity agent binding" +HOMEPAGE = "https://gitlab.com/iotbzh/aia-binding" +SECTION = "base" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-identity-agent;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" +PV = "1.0+git${SRCPV}" + +inherit cmake aglwgt pkgconfig + +S = "${WORKDIR}/git" + +DEPENDS = "curl af-binder json-c systemd" + diff --git a/recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb b/recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb new file mode 100644 index 000000000..cc893698c --- /dev/null +++ b/recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb @@ -0,0 +1,19 @@ +SUMMARY = "IIODEVICES Service Binding" +DESCRIPTION = "AGL IIODEVICES Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-iiodevices" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-iiodevices;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c libiio glib-2.0" + +RDEPENDS_${PN} = "libiio" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb b/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb new file mode 100644 index 000000000..4f1757c7d --- /dev/null +++ b/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Mediaplayer Service Binding" +DESCRIPTION = "AGL Mediaplayer Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-mediaplayer" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-mediaplayer;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c gstreamer1.0 gstreamer1.0-plugins-base" +RDEPENDS_${PN} = "agl-service-mediascanner agl-service-bluetooth gstreamer1.0-plugins-bad-waylandsink" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb b/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb new file mode 100644 index 000000000..c50a04804 --- /dev/null +++ b/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Mediascanner Service Binding" +DESCRIPTION = "AGL Mediascanner Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-mediascanner" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-mediascanner;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c sqlite3 glib-2.0" +RDEPENDS_${PN} = "lightmediascanner" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb b/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb new file mode 100755 index 000000000..71a615cf4 --- /dev/null +++ b/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Navigation Service Binding" +DESCRIPTION = "AGL Navigation Service API Binding" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +DEPENDS = "json-c libdbus-c++" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-navigation;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "0.1+git${SRCPV}" +S = "${WORKDIR}/git" + +inherit cmake aglwgt pkgconfig + +RDEPENDS_${PN} += "json-c libdbus-c++" diff --git a/recipes-apis/agl-service-network/agl-service-network_git.bb b/recipes-apis/agl-service-network/agl-service-network_git.bb new file mode 100644 index 000000000..c7fb72f22 --- /dev/null +++ b/recipes-apis/agl-service-network/agl-service-network_git.bb @@ -0,0 +1,25 @@ +SUMMARY = "Network Service Binding" +DESCRIPTION = "AGL Network Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-network" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-network;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "glib-2.0 json-c" + +inherit cmake aglwgt pkgconfig + +do_install_append() { + install -d ${D}${sbindir} + install -m 755 ${B}/build-release/test/agl-service-network-ctl ${D}${sbindir} +} + +FILES_${PN}-tools = "${sbindir}/agl-service-network-ctl" +PACKAGES_prepend = "${PN}-tools " diff --git a/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb b/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb new file mode 100644 index 000000000..1757dcb38 --- /dev/null +++ b/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb @@ -0,0 +1,17 @@ +SUMMARY = "agl-service-nfc" +DESCRIPTION = "" +HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-nfc/" +SECTION = "apps" +DEPENDS = "af-binder json-c glib-2.0 neardal" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit cmake pkgconfig aglwgt + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-nfc;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + diff --git a/recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb b/recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb new file mode 100644 index 000000000..43eed3f2e --- /dev/null +++ b/recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb @@ -0,0 +1,17 @@ +SUMMARY = "Platform info provider binding" +DESCRIPTION = "AGL Platform info provider binding" +HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-platform-info/" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-platform-info;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "libafb-helpers" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-radio/agl-service-radio_git.bb b/recipes-apis/agl-service-radio/agl-service-radio_git.bb new file mode 100644 index 000000000..a46ce128c --- /dev/null +++ b/recipes-apis/agl-service-radio/agl-service-radio_git.bb @@ -0,0 +1,19 @@ +SUMMARY = "Radio Service Binding" +DESCRIPTION = "AGL Radio Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-radio" +SECTION = "apps" +LICENSE = "Apache-2.0 & GPLv2" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \ + file://LICENSE.GPL-2.0-only;md5=751419260aa954499f7abaabaa882bbe" + +PV = "1.0+git${SRCPV}" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-radio;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +S = "${WORKDIR}/git" + +# build-time dependencies +DEPENDS = "rtl-sdr glib-2.0 gstreamer1.0 libusb-compat" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb b/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb new file mode 100644 index 000000000..bf714f45d --- /dev/null +++ b/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "agl-service-signal-composer" +DESCRIPTION = "AGL High Level Signaling service to handle CAN, LIN, and others signaling sources" +HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-signal-composer/" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit cmake pkgconfig aglwgt ptest + +DEPENDS += "lua lua-native libappcontroller libafb-helpers" +RDEPENDS_${PN} += "lua" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-signal-composer;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "${AGLVERSION}" +S = "${WORKDIR}/git" diff --git a/recipes-apis/agl-service-signal-composer/files/run-ptest b/recipes-apis/agl-service-signal-composer/files/run-ptest new file mode 100644 index 000000000..49187ad85 --- /dev/null +++ b/recipes-apis/agl-service-signal-composer/files/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +afm-test /usr/AGL/apps/testwgt/signal-composer-test.wgt diff --git a/recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb b/recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb new file mode 100644 index 000000000..6c5a18107 --- /dev/null +++ b/recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb @@ -0,0 +1,18 @@ +SUMMARY = "Task Manager Service Binding" +DESCRIPTION = "AGL Task Manager Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-taskmanager" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-taskmanager;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c procps" + +inherit cmake aglwgt pkgconfig + diff --git a/recipes-apis/agl-service-telephony/agl-service-telephony_git.bb b/recipes-apis/agl-service-telephony/agl-service-telephony_git.bb new file mode 100644 index 000000000..ff3913643 --- /dev/null +++ b/recipes-apis/agl-service-telephony/agl-service-telephony_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Telephony Service Binding" +DESCRIPTION = "AGL Telephony Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-telephony" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-telephony;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "json-c glib-2.0" +RDEPENDS_${PN} = "ofono" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb b/recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb new file mode 100644 index 000000000..85ebc90f6 --- /dev/null +++ b/recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb @@ -0,0 +1,19 @@ +SUMMARY = "Infotainment network device control" +DESCRIPTION = "Abstraction layer to control INICnet devices" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-unicens-controller" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-unicens-controller;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "0.1+git${SRCPV}" +S = "${WORKDIR}/git" + +inherit cmake aglwgt pkgconfig + +DEPENDS += "json-c af-binder libafb-helpers" +RDEPENDS_${PN} += "agl-service-unicens" + diff --git a/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb b/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb new file mode 100644 index 000000000..e7e25c74e --- /dev/null +++ b/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb @@ -0,0 +1,19 @@ +SUMMARY = "4A - Infotainment network setup and access" +DESCRIPTION = "Infotainment network setup and access (using Unified Centralized Network Stack)" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-unicens" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-unicens;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "0.1+git${SRCPV}" +S = "${WORKDIR}/git" + +inherit cmake aglwgt pkgconfig + +DEPENDS += "alsa-lib json-c systemd af-binder glib-2.0 libxml2 libafb-helpers" +RDEPENDS_${PN} += "libxml2 " + diff --git a/recipes-apis/agl-service-weather/agl-service-weather_git.bb b/recipes-apis/agl-service-weather/agl-service-weather_git.bb new file mode 100644 index 000000000..75532da42 --- /dev/null +++ b/recipes-apis/agl-service-weather/agl-service-weather_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "Weather Service Binding" +DESCRIPTION = "AGL Weather Service Binding" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-weather" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-weather;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +DEPENDS = "glib-2.0 json-c" +RDEPENDS_${PN} = "agl-service-geoclue" + +inherit cmake aglwgt pkgconfig diff --git a/recipes-config/agl-login-manager/agl-login-manager_0.1.bb b/recipes-config/agl-login-manager/agl-login-manager_0.1.bb new file mode 100644 index 000000000..49efce796 --- /dev/null +++ b/recipes-config/agl-login-manager/agl-login-manager_0.1.bb @@ -0,0 +1,19 @@ +SUMMARY = "AGL Login manager" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +LOGIN_USER ??="1001 1002" + +RDEPENDS_${PN} += "af-main" + +do_install_append() { + + install -d ${D}${systemd_system_unitdir}/multi-user.target.wants/ + + for AGL_USER in ${LOGIN_USER};do + ln -s ../afm-user-session@.service ${D}${systemd_system_unitdir}/multi-user.target.wants/afm-user-session@${AGL_USER}.service + done +} + +FILES_${PN} += "${systemd_system_unitdir}" diff --git a/recipes-config/agl-users/agl-users_0.1.bb b/recipes-config/agl-users/agl-users_0.1.bb new file mode 100644 index 000000000..709a1091f --- /dev/null +++ b/recipes-config/agl-users/agl-users_0.1.bb @@ -0,0 +1,27 @@ +inherit allarch useradd + +SUMMARY = "AGL Users Seed" +DESCRIPTION = "This is a core framework component that\ + defines how users are managed and who are the default users." + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +ALLOW_EMPTY_${PN} = "1" + +USERADD_PACKAGES = "${PN}" + +USERADDEXTENSION = "useradd-staticids" + +GROUPADD_PARAM_${PN} = "\ + --system display ; \ + --system weston-launch ; \ + -g 1001 agl-driver ; \ + -g 1002 agl-passenger \ +" + +USERADD_PARAM_${PN} = "\ + -g 1001 -u 1001 -o -d /home/1001 -m -K PASS_MAX_DAYS=-1 agl-driver ; \ + -g 1002 -u 1002 -o -d /home/1002 -m -K PASS_MAX_DAYS=-1 agl-passenger ; \ + --gid display --groups weston-launch,video,input --home-dir /run/platform/display --shell /bin/false --comment \"Display daemon\" --key PASS_MAX_DAYS=-1 display \ +" diff --git a/recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb b/recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb new file mode 100644 index 000000000..f1fce78f8 --- /dev/null +++ b/recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb @@ -0,0 +1,11 @@ +SUMMARY = "AGL cluster demo dashboard configuration file" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI += "file://AGL.conf.cluster" + +inherit allarch + +do_install() { + install -D -m 0644 ${WORKDIR}/AGL.conf.cluster ${D}${sysconfdir}/xdg/AGL.conf +} diff --git a/recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster b/recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster new file mode 100644 index 000000000..dd8a912c5 --- /dev/null +++ b/recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster @@ -0,0 +1,2 @@ +[dashboard] +animation=false diff --git a/recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default b/recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default new file mode 100644 index 000000000..7bd8bf2eb --- /dev/null +++ b/recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default @@ -0,0 +1,6 @@ +; Default CAN device mapping +; Format has to follow ini rules key="value", notice " around value. + +[CANbus-mapping] +hs="can0" +ls="can0" diff --git a/recipes-config/dev-mapping/dev-mapping_0.1.bb b/recipes-config/dev-mapping/dev-mapping_0.1.bb new file mode 100644 index 000000000..1309ffa20 --- /dev/null +++ b/recipes-config/dev-mapping/dev-mapping_0.1.bb @@ -0,0 +1,18 @@ +SUMMARY = "AGL Device mapping configuration file" +DESCRIPTION = "This provide default dev-mapping.conf file \ + that defines mapping between kernel device and logical name \ + used in low-can binding by example." + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI += "file://dev-mapping.conf.default" + +inherit allarch + +do_install() { + install -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/dev-mapping.conf.default ${D}${sysconfdir}/dev-mapping.conf +} + +RPROVIDES_${PN} = "virtual/low-can-dev-mapping" diff --git a/recipes-config/systemd-sync/systemd-agl-sync_1.0.bb b/recipes-config/systemd-sync/systemd-agl-sync_1.0.bb new file mode 100644 index 000000000..389ab2424 --- /dev/null +++ b/recipes-config/systemd-sync/systemd-agl-sync_1.0.bb @@ -0,0 +1,39 @@ +SUMMARY = "Systemd synchronization script" +DESCRIPTION = "\ +Systemd synchronization script \ +reload daemon at the first boot. \ +" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +#This script should be the last to be execute at the first boot +POST_INSTALL_LEVEL = "X0" +POST_INSTALL_SCRIPT ?= "${POST_INSTALL_LEVEL}-${PN}.sh" + +do_install() { + install -d ${D}/${sysconfdir}/agl-postinsts + cat > ${D}/${sysconfdir}/agl-postinsts/${POST_INSTALL_SCRIPT} < +Date: Fri, 4 Oct 2019 20:51:24 +0300 +Subject: [PATCH] utils: add a gstreamer helper application for interconnection + with pipewire + +Unfortunately, the bluez-alsa PCM plugin does not work correctly +when it is used through pipewire (or gstreamer, or anywhere really...). + +Thanfully, the bluez-alsa PCM plugin is only a simple client that +reads/writes on a file descriptor that was opened by bluealsa. +This allows us to use bluealsa without the PCM plugin, just like it +is done in the aplay.c util. + +This one uses GStreamer to implement the plumbing between pipewire +and the file descriptor. On the reading side we are also doing some +tricks to ensure a smooth stream, which is not the case for the +stream that is coming out of bluealsa. + +This helper is implemented as a patch to bluez-alsa so that it can +use its internal private API. In the future this needs some re-thinking. + +Upstream-Status: Inappropriate +--- + configure.ac | 7 + + utils/Makefile.am | 20 +++ + utils/gst-helper.c | 432 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 459 insertions(+) + create mode 100644 utils/gst-helper.c + +diff --git a/configure.ac b/configure.ac +index 4825afa..9125871 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -141,6 +141,13 @@ AM_COND_IF([ENABLE_HCITOP], [ + PKG_CHECK_MODULES([NCURSES], [ncurses]) + ]) + ++AC_ARG_ENABLE([gsthelper], ++ [AS_HELP_STRING([--enable-gsthelper], [enable building of gsthelper tool])]) ++AM_CONDITIONAL([ENABLE_GSTHELPER], [test "x$enable_gsthelper" = "xyes"]) ++AM_COND_IF([ENABLE_GSTHELPER], [ ++ PKG_CHECK_MODULES([GST], [gstreamer-1.0 glib-2.0]) ++]) ++ + AC_ARG_ENABLE([test], + [AS_HELP_STRING([--enable-test], [enable unit test])]) + AM_CONDITIONAL([ENABLE_TEST], [test "x$enable_test" = "xyes"]) +diff --git a/utils/Makefile.am b/utils/Makefile.am +index 9057f2c..9790474 100644 +--- a/utils/Makefile.am ++++ b/utils/Makefile.am +@@ -47,3 +47,23 @@ hcitop_LDADD = \ + @LIBBSD_LIBS@ \ + @NCURSES_LIBS@ + endif ++ ++if ENABLE_GSTHELPER ++bin_PROGRAMS += bluealsa-gst-helper ++bluealsa_gst_helper_SOURCES = \ ++ ../src/shared/dbus-client.c \ ++ ../src/shared/ffb.c \ ++ ../src/shared/log.c \ ++ gst-helper.c ++bluealsa_gst_helper_CFLAGS = \ ++ -I$(top_srcdir)/src \ ++ @ALSA_CFLAGS@ \ ++ @BLUEZ_CFLAGS@ \ ++ @DBUS1_CFLAGS@ \ ++ @GST_CFLAGS@ ++bluealsa_gst_helper_LDADD = \ ++ @ALSA_LIBS@ \ ++ @BLUEZ_LIBS@ \ ++ @DBUS1_LIBS@ \ ++ @GST_LIBS@ ++endif +diff --git a/utils/gst-helper.c b/utils/gst-helper.c +new file mode 100644 +index 0000000..de1d47c +--- /dev/null ++++ b/utils/gst-helper.c +@@ -0,0 +1,432 @@ ++/* Bluez-Alsa PipeWire integration GStreamer helper ++ * ++ * Copyright © 2016-2019 Arkadiusz Bokowy ++ * Copyright © 2019 Collabora Ltd. ++ * @author George Kiagiadakis ++ * ++ * SPDX-License-Identifier: MIT ++ */ ++ ++#if HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "shared/dbus-client.h" ++#include "shared/defs.h" ++#include "shared/ffb.h" ++#include "shared/log.h" ++ ++struct worker { ++ /* used BlueALSA PCM device */ ++ struct ba_pcm ba_pcm; ++ /* file descriptor of PCM FIFO */ ++ int ba_pcm_fd; ++ /* file descriptor of PCM control */ ++ int ba_pcm_ctrl_fd; ++ /* the gstreamer pipelines (sink & source) */ ++ GstElement *pipeline[2]; ++ /* the queue & pwaudiosink of the sink pipeline */ ++ GstElement *queue; ++ GstElement *pwelem; ++}; ++ ++static struct ba_dbus_ctx dbus_ctx; ++static GHashTable *workers; ++static bool main_loop_on = true; ++ ++static void ++main_loop_stop(int sig) ++{ ++ /* Call to this handler restores the default action, so on the ++ * second call the program will be forcefully terminated. */ ++ ++ struct sigaction sigact = { .sa_handler = SIG_DFL }; ++ sigaction(sig, &sigact, NULL); ++ ++ main_loop_on = false; ++} ++ ++static GstBusSyncReply ++bus_sync_handler(GstBus *bus, GstMessage *message, gpointer user_data) ++{ ++ struct worker *w = user_data; ++ GstState s; ++ ++ switch (GST_MESSAGE_TYPE (message)) { ++ case GST_MESSAGE_REQUEST_STATE: ++ gst_message_parse_request_state (message, &s); ++ ++ debug ("corked: %d", (s == GST_STATE_PAUSED)); ++ ++ /* drop queue data when corked */ ++ g_object_set (w->queue, ++ "leaky", (s == GST_STATE_PAUSED) ? 2 /* downstream */ : 0 /* no */, ++ NULL); ++ gst_element_set_state (w->pwelem, s); ++ ++ /* flush the queue when resuming */ ++ if (s == GST_STATE_PLAYING) { ++ gst_element_send_event (w->queue, gst_event_new_flush_start ()); ++ gst_element_send_event (w->queue, gst_event_new_flush_stop (FALSE)); ++ } ++ break; ++ default: ++ break; ++ } ++ ++ gst_message_unref (message); ++ return GST_BUS_DROP; ++} ++ ++static int ++worker_start_pipeline(struct worker *w, int id, int mode, int profile) ++{ ++ GError *gerr = NULL; ++ DBusError err = DBUS_ERROR_INIT; ++ const gchar * role = NULL; ++ ++ if (w->pipeline[id]) ++ return 0; ++ ++ if (!bluealsa_dbus_pcm_open(&dbus_ctx, w->ba_pcm.pcm_path, mode, ++ &w->ba_pcm_fd, &w->ba_pcm_ctrl_fd, &err)) { ++ error("Couldn't open PCM: %s", err.message); ++ dbus_error_free(&err); ++ goto fail; ++ } ++ ++ if (mode == BA_PCM_FLAG_SINK) { ++ debug("sink start"); ++ w->pipeline[id] = gst_parse_launch( ++ /* add a silent live source to ensure a perfect live stream on the ++ output, even when the bt device is not sending or has gaps; ++ this also effectively changes the clock to be the system clock, ++ which is the same clock used by bluez-alsa on the sending side */ ++ "audiotestsrc is-live=true wave=silence ! capsfilter name=capsf " ++ "! audiomixer name=m " ++ /* mix the input from bluez-alsa using fdsrc; rawaudioparse ++ is necessary to convert bytes to time and align the buffers */ ++ "fdsrc name=fdelem do-timestamp=true ! capsfilter name=capsf2 " ++ "! rawaudioparse use-sink-caps=true ! m. " ++ /* take the mixer output, convert and push to pipewire */ ++ "m.src ! capsfilter name=capsf3 ! audioconvert ! audioresample " ++ "! audio/x-raw,format=F32LE,rate=48000 ! identity sync=true " ++ "! queue name=queue leaky=no max-size-time=0 max-size-buffers=0 max-size-bytes=192000 " ++ "! pwaudiosink name=pwelem", ++ &gerr); ++ ++ /* a2dp is for music, sco is for calls */ ++ role = (profile == BA_PCM_FLAG_PROFILE_A2DP) ? "Multimedia" : "Communication"; ++ } ++ else if (mode == BA_PCM_FLAG_SOURCE && profile == BA_PCM_FLAG_PROFILE_SCO) { ++ debug("source start"); ++ w->pipeline[id] = gst_parse_launch( ++ /* read from pipewire and put the buffers on a leaky queue, which ++ will essentially allow pwaudiosrc to continue working while ++ the fdsink is blocked (when there is no phone call in progress). ++ 9600 bytes = 50ms @ F32LE/1ch/48000 ++ */ ++ "pwaudiosrc name=pwelem ! audio/x-raw,format=F32LE,rate=48000 " ++ "! queue name=queue leaky=downstream max-size-time=0 max-size-buffers=0 max-size-bytes=9600 " ++ "! audioconvert ! audioresample ! capsfilter name=capsf " ++ "! fdsink name=fdelem", &gerr); ++ ++ role = "Communication"; ++ } ++ ++ if (gerr) { ++ error("Failed to start pipeline: %s", gerr->message); ++ g_error_free(gerr); ++ goto fail; ++ } ++ ++ if (w->pipeline[id]) { ++ g_autofree gchar *capsstr = NULL; ++ g_autoptr (GstElement) fdelem = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "fdelem"); ++ g_autoptr (GstElement) pwelem = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "pwelem"); ++ g_autoptr (GstElement) queue = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "queue"); ++ g_autoptr (GstElement) capsf = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "capsf"); ++ g_autoptr (GstElement) capsf2 = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "capsf2"); ++ g_autoptr (GstElement) capsf3 = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "capsf3"); ++ g_autoptr (GstCaps) caps = gst_caps_new_simple("audio/x-raw", ++ "format", G_TYPE_STRING, "S16LE", ++ "layout", G_TYPE_STRING, "interleaved", ++ "channels", G_TYPE_INT, w->ba_pcm.channels, ++ "rate", G_TYPE_INT, w->ba_pcm.sampling, ++ NULL); ++ g_autoptr (GstStructure) stream_props = gst_structure_new("props", ++ "media.role", G_TYPE_STRING, role, ++ "bluealsa.profile", G_TYPE_STRING, ++ (profile == BA_PCM_FLAG_PROFILE_SCO) ? "sco" : "a2dp", ++ NULL); ++ ++ g_object_set(capsf, "caps", caps, NULL); ++ if (capsf2) ++ g_object_set(capsf2, "caps", caps, NULL); ++ if (capsf3) ++ g_object_set(capsf3, "caps", caps, NULL); ++ ++ capsstr = gst_caps_to_string (caps); ++ debug(" caps: %s", capsstr); ++ ++ g_object_set(fdelem, "fd", w->ba_pcm_fd, NULL); ++ g_object_set(pwelem, "stream-properties", stream_props, NULL); ++ ++ if (mode == BA_PCM_FLAG_SINK) { ++ g_autoptr (GstBus) bus = gst_pipeline_get_bus(GST_PIPELINE(w->pipeline[id])); ++ gst_bus_set_sync_handler(bus, bus_sync_handler, w, NULL); ++ w->queue = queue; ++ w->pwelem = pwelem; ++ } ++ ++ gst_element_set_state(w->pipeline[id], GST_STATE_PLAYING); ++ } ++ ++ return 0; ++fail: ++ g_clear_object(&w->pipeline[id]); ++ return -1; ++} ++ ++static int ++worker_start(struct worker *w) ++{ ++ int mode = w->ba_pcm.flags & (BA_PCM_FLAG_SOURCE | BA_PCM_FLAG_SINK); ++ int profile = w->ba_pcm.flags & (BA_PCM_FLAG_PROFILE_A2DP | BA_PCM_FLAG_PROFILE_SCO); ++ /* human-readable BT address */ ++ char addr[18]; ++ ++ g_return_val_if_fail (profile != 0 && profile != (BA_PCM_FLAG_PROFILE_A2DP | BA_PCM_FLAG_PROFILE_SCO), -1); ++ ++ ba2str(&w->ba_pcm.addr, addr); ++ debug("%p: worker start addr:%s, mode:0x%x, profile:0x%x", w, addr, mode, profile); ++ ++ if (mode & BA_PCM_FLAG_SINK) ++ worker_start_pipeline(w, 0, BA_PCM_FLAG_SINK, profile); ++ if (mode & BA_PCM_FLAG_SOURCE) ++ worker_start_pipeline(w, 1, BA_PCM_FLAG_SOURCE, profile); ++} ++ ++static int ++worker_stop(struct worker *w) ++{ ++ debug("stop worker %p", w); ++ if (w->pipeline[0]) { ++ gst_element_set_state(w->pipeline[0], GST_STATE_NULL); ++ g_clear_object(&w->pipeline[0]); ++ } ++ if (w->pipeline[1]) { ++ gst_element_set_state(w->pipeline[1], GST_STATE_NULL); ++ g_clear_object(&w->pipeline[1]); ++ } ++ if (w->ba_pcm_fd != -1) { ++ close(w->ba_pcm_fd); ++ w->ba_pcm_fd = -1; ++ } ++ if (w->ba_pcm_ctrl_fd != -1) { ++ close(w->ba_pcm_ctrl_fd); ++ w->ba_pcm_ctrl_fd = -1; ++ } ++ return 0; ++} ++ ++static int ++supervise_pcm_worker(struct worker *worker) ++{ ++ if (worker == NULL) ++ return -1; ++ ++ /* no mode? */ ++ if (worker->ba_pcm.flags & (BA_PCM_FLAG_SOURCE | BA_PCM_FLAG_SINK) == 0) ++ goto stop; ++ ++ /* no profile? */ ++ if (worker->ba_pcm.flags & (BA_PCM_FLAG_PROFILE_A2DP | BA_PCM_FLAG_PROFILE_SCO) == 0) ++ goto stop; ++ ++ /* check whether SCO has selected codec */ ++ if (worker->ba_pcm.flags & BA_PCM_FLAG_PROFILE_SCO && ++ worker->ba_pcm.codec == 0) { ++ debug("Skipping SCO with codec not selected"); ++ goto stop; ++ } ++ ++start: ++ return worker_start(worker); ++stop: ++ return worker_stop(worker); ++} ++ ++static void ++worker_new(struct ba_pcm *pcm) ++{ ++ struct worker *w = g_slice_new0 (struct worker); ++ memcpy(&w->ba_pcm, pcm, sizeof(struct ba_pcm)); ++ w->ba_pcm_fd = -1; ++ w->ba_pcm_ctrl_fd = -1; ++ g_hash_table_insert(workers, w->ba_pcm.pcm_path, w); ++ supervise_pcm_worker(w); ++} ++ ++static DBusHandlerResult ++dbus_signal_handler(DBusConnection *conn, DBusMessage *message, void *data) ++{ ++ (void)conn; ++ (void)data; ++ ++ const char *path = dbus_message_get_path(message); ++ const char *interface = dbus_message_get_interface(message); ++ const char *signal = dbus_message_get_member(message); ++ ++ DBusMessageIter iter; ++ struct worker *worker; ++ ++ if (strcmp(interface, BLUEALSA_INTERFACE_MANAGER) == 0) { ++ ++ if (strcmp(signal, "PCMAdded") == 0) { ++ struct ba_pcm pcm; ++ if (!dbus_message_iter_init(message, &iter) || ++ !bluealsa_dbus_message_iter_get_pcm(&iter, NULL, &pcm)) { ++ error("Couldn't add new PCM: %s", "Invalid signal signature"); ++ goto fail; ++ } ++ worker_new(&pcm); ++ return DBUS_HANDLER_RESULT_HANDLED; ++ } ++ ++ if (strcmp(signal, "PCMRemoved") == 0) { ++ if (!dbus_message_iter_init(message, &iter) || ++ dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH) { ++ error("Couldn't remove PCM: %s", "Invalid signal signature"); ++ goto fail; ++ } ++ dbus_message_iter_get_basic(&iter, &path); ++ g_hash_table_remove(workers, path); ++ return DBUS_HANDLER_RESULT_HANDLED; ++ } ++ ++ } ++ ++ if (strcmp(interface, DBUS_INTERFACE_PROPERTIES) == 0) { ++ worker = g_hash_table_lookup(workers, path); ++ if (!worker) ++ goto fail; ++ if (!dbus_message_iter_init(message, &iter) || ++ dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) { ++ error("Couldn't update PCM: %s", "Invalid signal signature"); ++ goto fail; ++ } ++ dbus_message_iter_get_basic(&iter, &interface); ++ dbus_message_iter_next(&iter); ++ if (!bluealsa_dbus_message_iter_get_pcm_props(&iter, NULL, &worker->ba_pcm)) ++ goto fail; ++ supervise_pcm_worker(worker); ++ return DBUS_HANDLER_RESULT_HANDLED; ++ } ++ ++fail: ++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; ++} ++ ++static void ++destroy_worker(void *worker) ++{ ++ struct worker *w = worker; ++ worker_stop(w); ++ g_slice_free(struct worker, w); ++} ++ ++int ++main(int argc, char *argv[]) ++{ ++ int ret = EXIT_SUCCESS; ++ ++ log_open(argv[0], false, false); ++ gst_init(&argc, &argv); ++ dbus_threads_init_default(); ++ ++ DBusError err = DBUS_ERROR_INIT; ++ if (!bluealsa_dbus_connection_ctx_init(&dbus_ctx, BLUEALSA_SERVICE, &err)) { ++ error("Couldn't initialize D-Bus context: %s", err.message); ++ return EXIT_FAILURE; ++ } ++ ++ bluealsa_dbus_connection_signal_match_add(&dbus_ctx, ++ BLUEALSA_SERVICE, NULL, BLUEALSA_INTERFACE_MANAGER, "PCMAdded", NULL); ++ bluealsa_dbus_connection_signal_match_add(&dbus_ctx, ++ BLUEALSA_SERVICE, NULL, BLUEALSA_INTERFACE_MANAGER, "PCMRemoved", NULL); ++ bluealsa_dbus_connection_signal_match_add(&dbus_ctx, ++ BLUEALSA_SERVICE, NULL, DBUS_INTERFACE_PROPERTIES, "PropertiesChanged", ++ "arg0='"BLUEALSA_INTERFACE_PCM"'"); ++ ++ if (!dbus_connection_add_filter(dbus_ctx.conn, dbus_signal_handler, NULL, NULL)) { ++ error("Couldn't add D-Bus filter: %s", err.message); ++ return EXIT_FAILURE; ++ } ++ ++ workers = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, destroy_worker); ++ ++ { ++ struct ba_pcm *pcms = NULL; ++ size_t pcms_count = 0, i; ++ ++ if (!bluealsa_dbus_get_pcms(&dbus_ctx, &pcms, &pcms_count, &err)) ++ warn("Couldn't get BlueALSA PCM list: %s", err.message); ++ ++ for (i = 0; i < pcms_count; i++) { ++ worker_new(&pcms[i]); ++ } ++ ++ free(pcms); ++ } ++ ++ struct sigaction sigact = { .sa_handler = main_loop_stop }; ++ sigaction(SIGTERM, &sigact, NULL); ++ sigaction(SIGINT, &sigact, NULL); ++ ++ /* Ignore SIGPIPE, which may be received when writing to the bluealsa ++ socket when it is closed on the remote end */ ++ signal(SIGPIPE, SIG_IGN); ++ ++ debug("Starting main loop"); ++ while (main_loop_on) { ++ ++ struct pollfd pfds[10]; ++ nfds_t pfds_len = ARRAYSIZE(pfds); ++ ++ if (!bluealsa_dbus_connection_poll_fds(&dbus_ctx, pfds, &pfds_len)) { ++ error("Couldn't get D-Bus connection file descriptors"); ++ ret = EXIT_FAILURE; ++ goto out; ++ } ++ ++ if (poll(pfds, pfds_len, -1) == -1 && ++ errno == EINTR) ++ continue; ++ ++ if (bluealsa_dbus_connection_poll_dispatch(&dbus_ctx, pfds, pfds_len)) ++ while (dbus_connection_dispatch(dbus_ctx.conn) == DBUS_DISPATCH_DATA_REMAINS) ++ continue; ++ ++ } ++ ++out: ++ g_hash_table_unref(workers); ++ return ret; ++} +-- +2.24.0 + diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service b/recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service new file mode 100644 index 000000000..495ab6222 --- /dev/null +++ b/recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service @@ -0,0 +1,18 @@ +[Unit] +Description=Bluetooth audio helper for user %i +Requires=pipewire@%i.socket bluez-alsa.service +After=pipewire@%i.socket bluez-alsa.service + +[Service] +Type=simple +Restart=on-failure +ExecStart=/usr/bin/bluealsa-gst-helper + +Environment=XDG_RUNTIME_DIR=/run/user/%i +Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%i/bus + +User=%i +Slice=user-%i.slice +SupplementaryGroups=audio +UMask=0077 +CapabilityBoundingSet= diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa_git.bb b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bb new file mode 100644 index 000000000..010329ee7 --- /dev/null +++ b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bb @@ -0,0 +1,43 @@ +SUMMARY = "Bluetooth Audio ALSA Backend" +HOMEPAGE = "https://github.com/Arkq/bluez-alsa" +SECTION = "libs" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7d6ac7e2dbd2505652dceb3acdf1fe" + +SRC_URI = "git://github.com/Arkq/bluez-alsa.git;protocol=https;branch=master" +SRCREV = "2cd6e4686f7808276480b430fb37df55dfdcc02b" + +SRC_URI += "file://bluez-alsa.service" + +S = "${WORKDIR}/git" + +DEPENDS += "alsa-lib bluez5 systemd glib-2.0 sbc" + +PACKAGECONFIG[aac] = "--enable-aac, --disable-aac, " +PACKAGECONFIG[aptx] = "--enable-aptx,--disable-aptx," +PACKAGECONFIG[ofono] = "--enable-ofono, --disable-ofono," + +inherit autotools pkgconfig +inherit systemd + +SYSTEMD_AUTO_ENABLE = "enable" +SYSTEMD_SERVICE_${PN} = "bluez-alsa.service" + +PACKAGECONFIG += "ofono" + +# enable debug tools in devel images +PACKAGECONFIG[hcitop] = "--enable-hcitop, --disable-hcitop, libbsd ncurses" +PACKAGECONFIG[rfcomm] = "--enable-rfcomm, --disable-rfcomm," +PACKAGECONFIG_append_agl-devel = " hcitop rfcomm" + +do_install_append () { + install -d ${D}${base_libdir}/systemd/system + install -m 0644 ${WORKDIR}/bluez-alsa.service ${D}${base_libdir}/systemd/system +} + +FILES_${PN} += "\ + ${datadir}/alsa/alsa.conf.d/20-bluealsa.conf\ + ${libdir}/alsa-lib/libasound_module_ctl_bluealsa.so\ + ${libdir}/alsa-lib/libasound_module_pcm_bluealsa.so\ +" diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend new file mode 100644 index 000000000..bcb47888f --- /dev/null +++ b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend @@ -0,0 +1,35 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/bluez-alsa:" + +SRC_URI += "\ + file://0001-utils-add-a-gstreamer-helper-application-for-interco.patch \ + file://bluealsa-gst-helper@.service \ + " + +PACKAGECONFIG += "gsthelper" +PACKAGECONFIG[gsthelper] = "--enable-gsthelper, --disable-gsthelper, gstreamer1.0" + +do_install_append() { + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + # install the service file + mkdir -p ${D}${systemd_system_unitdir}/ + install -m 0644 ${WORKDIR}/bluealsa-gst-helper@.service ${D}${systemd_system_unitdir}/bluealsa-gst-helper@.service + + # enable the helper to start together with afm-user-session + mkdir -p ${D}${systemd_system_unitdir}/afm-user-session@.target.wants + ln -sf ../bluealsa-gst-helper@.service ${D}${systemd_system_unitdir}/afm-user-session@.target.wants/bluealsa-gst-helper@.service + fi +} + +PACKAGES =+ "${PN}-pipewire" + +FILES_${PN}-pipewire = "\ + ${bindir}/bluealsa-gst-helper \ + ${systemd_system_unitdir}/bluealsa-gst-helper@.service \ + ${systemd_system_unitdir}/afm-user-session@.target.wants/bluealsa-gst-helper@.service \ + " +RDEPENDS_${PN}-pipewire += "\ + bluez-alsa \ + pipewire \ + gstreamer1.0-plugins-base \ + gstreamer1.0-pipewire \ + " diff --git a/recipes-connectivity/bluez-alsa/files/bluez-alsa.service b/recipes-connectivity/bluez-alsa/files/bluez-alsa.service new file mode 100644 index 000000000..b59302ee4 --- /dev/null +++ b/recipes-connectivity/bluez-alsa/files/bluez-alsa.service @@ -0,0 +1,11 @@ +[Unit] +Description=Bluetooth Audio ALSA Backend +After=bluetooth.service +Requires=bluetooth.service + +[Service] +Type=simple +ExecStart=/usr/bin/bluealsa -p a2dp-sink -p hfp-ofono + +[Install] +WantedBy=multi-user.target diff --git a/recipes-connectivity/bluez5/bluez5/bluetooth.conf b/recipes-connectivity/bluez5/bluez5/bluetooth.conf new file mode 100644 index 000000000..1f2762de7 --- /dev/null +++ b/recipes-connectivity/bluez5/bluez5/bluetooth.conf @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/recipes-connectivity/bluez5/bluez5/bluetooth.service b/recipes-connectivity/bluez5/bluez5/bluetooth.service new file mode 100644 index 000000000..8ae83bd48 --- /dev/null +++ b/recipes-connectivity/bluez5/bluez5/bluetooth.service @@ -0,0 +1,21 @@ +[Unit] +Description=Bluetooth service +Documentation=man:bluetoothd(8) +ConditionPathIsDirectory=/sys/class/bluetooth + +[Service] +Type=dbus +BusName=org.bluez +ExecStartPre=-/usr/bin/hciconfig hci0 aclmtu 930:10 +ExecStart=/usr/libexec/bluetooth/bluetoothd +NotifyAccess=main +#WatchdogSec=10 +#Restart=on-failure +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +LimitNPROC=1 +ProtectHome=true +ProtectSystem=full + +[Install] +WantedBy=bluetooth.target +Alias=dbus-org.bluez.service diff --git a/recipes-connectivity/bluez5/bluez5/obex.service b/recipes-connectivity/bluez5/bluez5/obex.service new file mode 100644 index 000000000..87ffff6ae --- /dev/null +++ b/recipes-connectivity/bluez5/bluez5/obex.service @@ -0,0 +1,10 @@ +[Unit] +Description=Bluetooth OBEX service + +[Service] +Type=dbus +BusName=org.bluez.obex +ExecStart=/usr/libexec/bluetooth/obexd --root=/var/volatile/tmp + +[Install] +Alias=dbus-org.bluez.obex.service diff --git a/recipes-connectivity/bluez5/bluez5/tmpdir.conf b/recipes-connectivity/bluez5/bluez5/tmpdir.conf new file mode 100644 index 000000000..8545d76ec --- /dev/null +++ b/recipes-connectivity/bluez5/bluez5/tmpdir.conf @@ -0,0 +1,2 @@ +[Service] +Environment="TMPDIR=/run/user/%U/usrshr" diff --git a/recipes-connectivity/bluez5/bluez5_%.bbappend b/recipes-connectivity/bluez5/bluez5_%.bbappend new file mode 100644 index 000000000..18e694989 --- /dev/null +++ b/recipes-connectivity/bluez5/bluez5_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'bluez5_agldemo.inc', '', d)} diff --git a/recipes-connectivity/bluez5/bluez5_agldemo.inc b/recipes-connectivity/bluez5/bluez5_agldemo.inc new file mode 100644 index 000000000..0e9cd62c1 --- /dev/null +++ b/recipes-connectivity/bluez5/bluez5_agldemo.inc @@ -0,0 +1,24 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/bluez5:" +SRC_URI_append = " \ + file://bluetooth.conf \ + file://tmpdir.conf \ + file://obex.service \ + file://bluetooth.service \ +" + +FILES_${PN}_append = " ${systemd_user_unitdir}/obex.service.d/tmpdir.conf" + +do_install_append() { + install -m 0644 ${WORKDIR}/bluetooth.conf ${D}${sysconfdir}/dbus-1/system.d/bluetooth.conf + + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + mkdir -p ${D}${systemd_user_unitdir}/obex.service.d + + install -m 0644 ${WORKDIR}/obex.service ${D}${systemd_user_unitdir} + install -m 0644 ${WORKDIR}/tmpdir.conf ${D}${systemd_user_unitdir}/obex.service.d/tmpdir.conf + mkdir -p ${D}/etc/systemd/user + ln -sf ${systemd_user_unitdir}/obex.service ${D}/etc/systemd/user/dbus-org.bluez.obex.service + mkdir -p ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/bluetooth.service ${D}${systemd_system_unitdir} + fi +} diff --git a/recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config new file mode 100644 index 000000000..6ce2a76f5 --- /dev/null +++ b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config @@ -0,0 +1,3 @@ +[service_cluster_ethernet] +Type=ethernet +IPv4=@CLUSTER_DEMO_SERVER_IP@/255.255.255.0 diff --git a/recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb new file mode 100644 index 000000000..78528aa7f --- /dev/null +++ b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb @@ -0,0 +1,15 @@ +SUMMARY = "Cluster demo connman configuration" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI = "file://cluster.config" + +CLUSTER_DEMO_SERVER_IP ?= "192.168.20.99" + +do_install() { + install -d ${D}${localstatedir}/lib/connman + sed "s/@CLUSTER_DEMO_SERVER_IP@/${CLUSTER_DEMO_SERVER_IP}/g" \ + ${WORKDIR}/cluster.config > ${D}${localstatedir}/lib/connman/cluster.config +} + +FILES_${PN} += "${localstatedir}/*" diff --git a/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch new file mode 100644 index 000000000..c1545c727 --- /dev/null +++ b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch @@ -0,0 +1,31 @@ +diff --git a/serviceproviders.xml b/serviceproviders.xml +index e7f36ac..f1a0ca3 100644 +--- a/serviceproviders.xml ++++ b/serviceproviders.xml +@@ -2236,26 +2236,6 @@ conceived. + + + +- +- Fido +- +- +- +- +- +- fido +- fido +- 204.92.15.211 +- 207.181.101.4 +- +- +- +- Fido MMS +- http://mms.fido.ca +- mm1.fido.ca:80 +- +- +- + + Rogers + diff --git a/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc new file mode 100644 index 000000000..f64bcfbc8 --- /dev/null +++ b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc @@ -0,0 +1,4 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/mobile-broadband-provider-info:" + +SRC_URI += "file://0001-remove-Fido-service-provider.patch" + diff --git a/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend new file mode 100644 index 000000000..afd888038 --- /dev/null +++ b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'mobile-broadband-provider-info_agldemo.inc', '', d)} diff --git a/recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch b/recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch new file mode 100644 index 000000000..c32951693 --- /dev/null +++ b/recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch @@ -0,0 +1,25 @@ +From d8c03a31e2734e59af43dd50cbd7f5a94d798ab1 Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Tue, 10 Jul 2018 21:18:26 -0700 +Subject: [PATCH] systemd: neard: add multi-user.target to neard.service + +Allowing a service to be system level requires a WantedBy= target + +Signed-off-by: Matt Ranostay +--- + src/neard.service.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/neard.service.in b/src/neard.service.in +index dfa238c..540da7e 100644 +--- a/src/neard.service.in ++++ b/src/neard.service.in +@@ -9,4 +9,5 @@ ExecStart=@pkglibexecdir@/neard -n + LimitNPROC=1 + + [Install] ++WantedBy=multi-user.target + Alias=dbus-org.neard.service +-- +2.17.1 + diff --git a/recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch b/recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch new file mode 100644 index 000000000..49c11a509 --- /dev/null +++ b/recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch @@ -0,0 +1,33 @@ +From d7ea2a00e00795ad24897e3481b015a27d37d60f Mon Sep 17 00:00:00 2001 +From: Raquel Medina +Date: Tue, 22 Jan 2019 09:00:05 -0500 +Subject: [PATCH] ndef: avoid dbus property_get_type method on empty record + +Signed-off-by: Raquel Medina +--- + src/ndef.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/src/ndef.c b/src/ndef.c +index 5656baf..883c6f4 100644 +--- a/src/ndef.c ++++ b/src/ndef.c +@@ -2832,10 +2832,14 @@ GList *near_ndef_parse_msg(uint8_t *ndef_data, size_t ndef_length, + case RECORD_TYPE_WKT_ALTERNATIVE_CARRIER: + case RECORD_TYPE_WKT_COLLISION_RESOLUTION: + case RECORD_TYPE_WKT_ERROR: +- case RECORD_TYPE_UNKNOWN: + case RECORD_TYPE_ERROR: + break; + ++ case RECORD_TYPE_UNKNOWN: ++ if (record->header->tnf == RECORD_TNF_EMPTY) ++ goto fail; ++ break; ++ + case RECORD_TYPE_WKT_HANDOVER_REQUEST: + case RECORD_TYPE_WKT_HANDOVER_SELECT: + /* +-- +2.17.1 + diff --git a/recipes-connectivity/neard/neard_0.16.bbappend b/recipes-connectivity/neard/neard_0.16.bbappend new file mode 100644 index 000000000..2ab0381cc --- /dev/null +++ b/recipes-connectivity/neard/neard_0.16.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'neard_agldemo.inc', '', d)} diff --git a/recipes-connectivity/neard/neard_agldemo.inc b/recipes-connectivity/neard/neard_agldemo.inc new file mode 100644 index 000000000..f39fc9bcb --- /dev/null +++ b/recipes-connectivity/neard/neard_agldemo.inc @@ -0,0 +1,7 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI_append = "\ + file://0001-systemd-neard-add-multi-user.target-to-neard.service.patch \ + file://0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch \ + " +SYSTEMD_SERVICE_${PN}_append = " neard.service" diff --git a/recipes-connectivity/neardal/neardal.inc b/recipes-connectivity/neardal/neardal.inc new file mode 100644 index 000000000..3bb6b24ec --- /dev/null +++ b/recipes-connectivity/neardal/neardal.inc @@ -0,0 +1,22 @@ +SUMMARY = "Neard Abstraction Library (NeardAL)" + +DESCRIPTION = "NeardAL is a library that provides a simple C API \ +to exchange data with NFC daemon (Neard)." + +HOMEPAGE = "https://github.com/connectivity/neardal" +SECTION = "libs" +LICENSE = "LGPLv2" + +DEPENDS = "glib-2.0 readline glib-2.0-native" + +LIC_FILES_CHKSUM = "file://COPYING;md5=6a6e689d19255cf0557f3fe7d7068212 \ + file://lib/neardal.h;endline=20;md5=a53e93aea9357387078ed217565c0a99" + +inherit autotools pkgconfig + +PACKAGES =+ "${PN}-tools ${PN}-tools-dbg" + +FILES_${PN}-tools = "${libexecdir}/ncl" +FILES_${PN}-tools-dbg += "${libexecdir}/.debug" + +RDEPENDS_${PN}-tools = "bash" diff --git a/recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch b/recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch new file mode 100644 index 000000000..596fe0579 --- /dev/null +++ b/recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch @@ -0,0 +1,27 @@ +From 795308b2452ee617da4096914b53ba3a1142e3db Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Fri, 6 Jul 2018 17:19:09 -0700 +Subject: [PATCH] neardal: ncl: fix segfault on help page being displayed + +LISTCMD_NAME is declared as a const char due to being defined in a +macro so g_strdup it to stop proceeding operations from segfaulting. + +Signed-off-by: Matt Ranostay + +--- + ncl/ncl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ncl/ncl.c b/ncl/ncl.c +index 590d13b..f4165b7 100644 +--- a/ncl/ncl.c ++++ b/ncl/ncl.c +@@ -329,7 +329,7 @@ int main(int argc, char *argv[]) + g_io_channel_unref(gNclCtx.channel); + + if (show_help) +- ncl_exec(LISTCMD_NAME); ++ ncl_exec(g_strdup(LISTCMD_NAME)); + + rl_callback_handler_install(NCL_PROMPT, ncl_parse_line); + diff --git a/recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch b/recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch new file mode 100644 index 000000000..d40d9a4fe --- /dev/null +++ b/recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch @@ -0,0 +1,58 @@ +From ee6267f357b3d158f0a0e88460782e8b9d44274a Mon Sep 17 00:00:00 2001 +From: Raquel Medina +Date: Fri, 4 Jan 2019 07:43:03 -0500 +Subject: [PATCH] neardal: lib: fix memory corruption + + The current commit fixes an invalid memory access + which manifests as a random segfault when executing + continuous tag read operations. + + The corruption happens when releasing the memory allocated to a + record: in the time between the memory being g_free'd and the + subsequent memset operation, the memory could have been reused by + some other process. And since memory allocation depends on + system-wide factors, it makes this bug hard to track. + + Tested using ACR122U reader and NTAG213 + tags on Automotive Grade Linux (flounder, + guppy and master branches) + +Signed-off-by: Raquel Medina +--- + lib/neardal_record.c | 1 - + lib/neardal_tools.c | 5 ++++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/lib/neardal_record.c b/lib/neardal_record.c +index 669012c..cfed5e8 100644 +--- a/lib/neardal_record.c ++++ b/lib/neardal_record.c +@@ -31,7 +31,6 @@ void neardal_record_free(neardal_record *r) + { + g_return_if_fail(r); + neardal_g_strfreev((void **) r, &r->uriObjSize); +- memset(r, 0, sizeof(*r)); + } + + void neardal_free_record(neardal_record *record) \ +diff --git a/lib/neardal_tools.c b/lib/neardal_tools.c +index f0d6157..f307df6 100644 +--- a/lib/neardal_tools.c ++++ b/lib/neardal_tools.c +@@ -32,9 +32,12 @@ + void neardal_g_strfreev(void **array, void *end) + { + void **p = array; +- for (; (void *) p < end; p++) ++ for (; (void *) p < end; p++) { + g_free(*p); ++ *p = NULL; ++ } + g_free(array); ++ array = NULL; + } + + void neardal_g_variant_add_parsed(GVariant **v, const char *format, ...) +-- +2.17.1 + diff --git a/recipes-connectivity/neardal/neardal/ncl.patch b/recipes-connectivity/neardal/neardal/ncl.patch new file mode 100644 index 000000000..baef6ccaa --- /dev/null +++ b/recipes-connectivity/neardal/neardal/ncl.patch @@ -0,0 +1,25 @@ +From eab402bae42c3ea5caa8d540b6702d39e56c84c1 Mon Sep 17 00:00:00 2001 +From: Oleg Zhurakivskyy +Date: Tue, 10 Feb 2015 12:58:39 +0200 +Subject: [PATCH] build: Install ncl + +Signed-off-by: Oleg Zhurakivskyy +--- + ncl/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ncl/Makefile.am b/ncl/Makefile.am +index beda75b..c06742f 100644 +--- a/ncl/Makefile.am ++++ b/ncl/Makefile.am +@@ -1,6 +1,6 @@ + AM_CPPFLAGS = @gio_CFLAGS@ -I$(top_builddir)/lib -I$(top_srcdir)/lib + +-noinst_PROGRAMS=ncl ++libexec_PROGRAMS = ncl + + ncl_SOURCES = \ + $(srcdir)/ncl.c $(srcdir)/ncl.h \ +-- +2.1.0 + diff --git a/recipes-connectivity/neardal/neardal_0.14.bb b/recipes-connectivity/neardal/neardal_0.14.bb new file mode 100644 index 000000000..f8634c468 --- /dev/null +++ b/recipes-connectivity/neardal/neardal_0.14.bb @@ -0,0 +1,10 @@ +require neardal.inc + +SRC_URI = "git://github.com/connectivity/neardal.git;protocol=https \ + file://ncl.patch \ + file://0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch \ + file://0002-neardal-lib-fix-memory-corruption.patch \ + " +SRCREV = "fe0fa79c94e9a0f1c2cfa1f58b3acc9bdc7d5e13" + +S = "${WORKDIR}/git" diff --git a/recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch b/recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch new file mode 100644 index 000000000..7b44e483e --- /dev/null +++ b/recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch @@ -0,0 +1,27 @@ +From 7782f8f9d9634ebeddafefedab10ba254f9cc34a Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Fri, 1 Mar 2019 17:53:17 +0900 +Subject: [PATCH] provision: allow duplicate entries from mbpi_lookup_apn() + results + +Signed-off-by: Matt Ranostay +--- + plugins/provision.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/plugins/provision.c b/plugins/provision.c +index 99c299eb..aa0b05e4 100644 +--- a/plugins/provision.c ++++ b/plugins/provision.c +@@ -50,7 +50,7 @@ static int provision_get_settings(const char *mcc, const char *mnc, + + DBG("Provisioning for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn); + +- apns = mbpi_lookup_apn(mcc, mnc, FALSE, &error); ++ apns = mbpi_lookup_apn(mcc, mnc, TRUE, &error); + if (apns == NULL) { + if (error != NULL) { + ofono_error("%s", error->message); +-- +2.20.1 + diff --git a/recipes-connectivity/ofono/files/ofono.conf b/recipes-connectivity/ofono/files/ofono.conf new file mode 100644 index 000000000..e47214c76 --- /dev/null +++ b/recipes-connectivity/ofono/files/ofono.conf @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/recipes-connectivity/ofono/ofono_%.bbappend b/recipes-connectivity/ofono/ofono_%.bbappend new file mode 100644 index 000000000..0386aa9c9 --- /dev/null +++ b/recipes-connectivity/ofono/ofono_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'ofono_agldemo.inc', '', d)} diff --git a/recipes-connectivity/ofono/ofono_agldemo.inc b/recipes-connectivity/ofono/ofono_agldemo.inc new file mode 100644 index 000000000..b02d6ee22 --- /dev/null +++ b/recipes-connectivity/ofono/ofono_agldemo.inc @@ -0,0 +1,11 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +SRC_URI_append = "\ + file://ofono.conf \ + file://0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch \ + " + +do_install_append() { + install -m 0644 ${WORKDIR}/ofono.conf ${D}${sysconfdir}/dbus-1/system.d/ofono.conf +} + +SYSTEMD_AUTO_ENABLE = "enable" diff --git a/recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch b/recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch new file mode 100644 index 000000000..86b7392df --- /dev/null +++ b/recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch @@ -0,0 +1,40 @@ +From 3aeaf8054fcb2617ca8f6196ca32be3e69337f77 Mon Sep 17 00:00:00 2001 +From: Martin Kelly +Date: Fri, 21 Apr 2017 10:29:19 -0700 +Subject: [PATCH] remove -I/usr/include in pkg-config + +This shouldn't be necessary as it's part of the default compiler include +paths anyway. Morever, it can cause GCC 6 C++ build failures in +downstream packages when combined with QMake (such as +qtmultimedia-rtlfm-radio-plugin). + +Fix these issues by removing it. + +Upstream-Status: Inappropriate [disable-feature] + +This patch should not go upstream because it breaks the ability to build +with --prefix. That's not a problem for Openembedded, but it is for +upstream more generally. See this mail thread for more information: + +http://lists.osmocom.org/pipermail/osmocom-sdr/2017-April/001580.html + +Signed-off-by: Martin Kelly +--- + librtlsdr.pc.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/librtlsdr.pc.in b/librtlsdr.pc.in +index 5e55049..84b6d0c 100644 +--- a/librtlsdr.pc.in ++++ b/librtlsdr.pc.in +@@ -6,6 +6,6 @@ includedir=@includedir@ + Name: RTL-SDR Library + Description: C Utility Library + Version: @VERSION@ +-Cflags: -I${includedir}/ @RTLSDR_PC_CFLAGS@ ++Cflags: @RTLSDR_PC_CFLAGS@ + Libs: -L${libdir} -lrtlsdr -lusb-1.0 + Libs.private: @RTLSDR_PC_LIBS@ +-- +2.1.4 + diff --git a/recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb b/recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb new file mode 100644 index 000000000..b442d9f46 --- /dev/null +++ b/recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb @@ -0,0 +1,32 @@ +SUMMARY = "Turns a Realtek RTL2832U-based DVB dongle into a SDR receiver" +DESCRIPTION = "DVB-T dongles based on the Realtek RTL2832U chipset can be used as Software Digital Radio adapters, since the chip allows transferring raw I/Q samples to the host, which is really used for DAB/DAB+/FM demodulation." +HOMEPAGE = "http://sdr.osmocom.org/trac/wiki/rtl-sdr" + +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \ + file://src/librtlsdr.c;endline=18;md5=1b05599c3ebd4d74857a0a7c45f3d4ef" + +DEPENDS = "libusb1" + +SRC_URI = "git://git.osmocom.org/rtl-sdr \ + file://0001-remove-I-usr-include-in-pkg-config.patch \ + " +SRCREV = "e3c03f738f5aef4dc51e2b741fbdb542b9cc1bb1" +S = "${WORKDIR}/git" + +inherit autotools pkgconfig + +EXTRA_OECONF = "--enable-driver-detach" + +do_configure_append() { + # remove included temporary path from pc file due to pass-through of OE CFLAGS + # debug-prefix-map + # See: http://lists.openembedded.org/pipermail/openembedded-devel/2016-May/107456.html + sed -i -e "s# -fdebug-prefix-map=.*##g;s# -fmacro-prefix-map=.*##g" librtlsdr.pc +} + +do_install_append() { + install -D -m 0644 ${S}/rtl-sdr.rules ${D}${sysconfdir}/udev/rules.d/55-rtl-sdr.rules + sed -i 's/MODE:="0666"/GROUP="audio", MODE="0660", SECLABEL{smack}="*"/' \ + ${D}${sysconfdir}/udev/rules.d/55-rtl-sdr.rules +} diff --git a/recipes-core/dbus/dbus/dbus.service b/recipes-core/dbus/dbus/dbus.service new file mode 100644 index 000000000..dee6ad741 --- /dev/null +++ b/recipes-core/dbus/dbus/dbus.service @@ -0,0 +1,10 @@ +[Unit] +Description=D-Bus User Message Bus +Documentation=man:dbus-daemon(1) +Requires=dbus.socket + +[Service] +ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation +ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig +Restart=always +RestartSec=1 diff --git a/recipes-core/dbus/dbus/dbus.socket b/recipes-core/dbus/dbus/dbus.socket new file mode 100644 index 000000000..af76b2f12 --- /dev/null +++ b/recipes-core/dbus/dbus/dbus.socket @@ -0,0 +1,9 @@ +[Unit] +Description=D-Bus User Message Bus Socket +Before=sockets.target + +[Socket] +ListenStream=%t/bus + +[Install] +WantedBy=default.target diff --git a/recipes-core/dbus/dbus/dbus_env.conf b/recipes-core/dbus/dbus/dbus_env.conf new file mode 100644 index 000000000..f8f02669b --- /dev/null +++ b/recipes-core/dbus/dbus/dbus_env.conf @@ -0,0 +1,5 @@ +[Unit] +Wants=dbus.service + +[Service] +Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/bus diff --git a/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch b/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch new file mode 100644 index 000000000..c4fafef62 --- /dev/null +++ b/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch @@ -0,0 +1,45 @@ +--- libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h.threading 2017-02-15 13:40:53.796004263 +0000 ++++ libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h 2017-02-15 13:40:46.907000493 +0000 +@@ -188,6 +188,7 @@ + /* classes for multithreading support + */ + ++#if 0 + class DXXAPI Mutex + { + public: +@@ -243,9 +244,11 @@ + typedef bool (*CondVarWaitTimeoutFn)(CondVar *cv, Mutex *mx, int timeout); + typedef void (*CondVarWakeOneFn)(CondVar *cv); + typedef void (*CondVarWakeAllFn)(CondVar *cv); ++#endif + + void DXXAPI _init_threading(); + ++#if 0 + void DXXAPI _init_threading( + MutexNewFn, MutexFreeFn, MutexLockFn, MutexUnlockFn, + CondVarNewFn, CondVarFreeFn, CondVarWaitFn, CondVarWaitTimeoutFn, CondVarWakeOneFn, CondVarWakeAllFn +@@ -312,6 +315,7 @@ + cv->wake_all(); + } + }; ++#endif + + } /* namespace DBus */ + +--- libdbus-c++-0.9.0/src/dispatcher.cpp.threading 2017-02-15 13:48:22.627249868 +0000 ++++ libdbus-c++-0.9.0/src/dispatcher.cpp 2017-02-15 13:48:29.164253445 +0000 +@@ -253,6 +253,7 @@ + #endif//DBUS_HAS_THREADS_INIT_DEFAULT + } + ++#if 0 + void DBus::_init_threading( + MutexNewFn m1, + MutexFreeFn m2, +@@ -318,3 +319,4 @@ + #endif//DBUS_HAS_RECURSIVE_MUTEX + dbus_threads_init(&functions); + } ++#endif diff --git a/recipes-core/dbus/dbus_%.bbappend b/recipes-core/dbus/dbus_%.bbappend new file mode 100644 index 000000000..8abed7128 --- /dev/null +++ b/recipes-core/dbus/dbus_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'dbus_agldemo.inc', '', d)} diff --git a/recipes-core/dbus/dbus_agldemo.inc b/recipes-core/dbus/dbus_agldemo.inc new file mode 100644 index 000000000..379c5435e --- /dev/null +++ b/recipes-core/dbus/dbus_agldemo.inc @@ -0,0 +1,28 @@ +FILESEXTRAPATHS_append := ":${THISDIR}/dbus" + +SRC_URI += "file://dbus.service \ + file://dbus.socket \ + file://dbus_env.conf \ + " + +inherit systemd + +do_install_append() { + if [ "${PN}" != "nativesdk-dbus" ]; then + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -m 644 -p -D ${WORKDIR}/dbus.service ${D}${systemd_user_unitdir}/dbus.service + install -m 644 -p -D ${WORKDIR}/dbus.socket ${D}${systemd_user_unitdir}/dbus.socket + install -m 644 -p -D ${WORKDIR}/dbus_env.conf ${D}${systemd_system_unitdir}/user@.service.d/dbus_env.conf + + # Execute these manually on behalf of systemctl script (from systemd-systemctl-native.bb) + # because it does not support systemd's user mode. + mkdir -p ${D}/etc/systemd/user/default.target.wants/ + ln -sf ${systemd_user_unitdir}/dbus.socket ${D}/etc/systemd/user/default.target.wants/dbus.socket + fi + fi +} + +FILES_${PN} += " \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_user_unitdir}/dbus.*', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/user@.service.d/dbus_env.conf', '', d)} \ + " diff --git a/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch b/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch new file mode 100644 index 000000000..c4fafef62 --- /dev/null +++ b/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch @@ -0,0 +1,45 @@ +--- libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h.threading 2017-02-15 13:40:53.796004263 +0000 ++++ libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h 2017-02-15 13:40:46.907000493 +0000 +@@ -188,6 +188,7 @@ + /* classes for multithreading support + */ + ++#if 0 + class DXXAPI Mutex + { + public: +@@ -243,9 +244,11 @@ + typedef bool (*CondVarWaitTimeoutFn)(CondVar *cv, Mutex *mx, int timeout); + typedef void (*CondVarWakeOneFn)(CondVar *cv); + typedef void (*CondVarWakeAllFn)(CondVar *cv); ++#endif + + void DXXAPI _init_threading(); + ++#if 0 + void DXXAPI _init_threading( + MutexNewFn, MutexFreeFn, MutexLockFn, MutexUnlockFn, + CondVarNewFn, CondVarFreeFn, CondVarWaitFn, CondVarWaitTimeoutFn, CondVarWakeOneFn, CondVarWakeAllFn +@@ -312,6 +315,7 @@ + cv->wake_all(); + } + }; ++#endif + + } /* namespace DBus */ + +--- libdbus-c++-0.9.0/src/dispatcher.cpp.threading 2017-02-15 13:48:22.627249868 +0000 ++++ libdbus-c++-0.9.0/src/dispatcher.cpp 2017-02-15 13:48:29.164253445 +0000 +@@ -253,6 +253,7 @@ + #endif//DBUS_HAS_THREADS_INIT_DEFAULT + } + ++#if 0 + void DBus::_init_threading( + MutexNewFn m1, + MutexFreeFn m2, +@@ -318,3 +319,4 @@ + #endif//DBUS_HAS_RECURSIVE_MUTEX + dbus_threads_init(&functions); + } ++#endif diff --git a/recipes-core/dbus/libdbus-c++_0.9.0.bbappend b/recipes-core/dbus/libdbus-c++_0.9.0.bbappend new file mode 100644 index 000000000..ee21af860 --- /dev/null +++ b/recipes-core/dbus/libdbus-c++_0.9.0.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'libdbus-c++_agldemo.inc', '', d)} diff --git a/recipes-core/dbus/libdbus-c++_agldemo.inc b/recipes-core/dbus/libdbus-c++_agldemo.inc new file mode 100644 index 000000000..4c135cc1c --- /dev/null +++ b/recipes-core/dbus/libdbus-c++_agldemo.inc @@ -0,0 +1,2 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/libdbus-c++:" +SRC_URI_append = " file://dbus-c++-threading.patch" diff --git a/recipes-core/distro-build-manifest/distro-build-manifest.bb b/recipes-core/distro-build-manifest/distro-build-manifest.bb new file mode 100644 index 000000000..823cc28a1 --- /dev/null +++ b/recipes-core/distro-build-manifest/distro-build-manifest.bb @@ -0,0 +1,164 @@ +SUMMARY = "Distribution build manifest" +DESCRIPTION = "The folder /etc/platform-info contains build manifest (SPEC-720)." +LICENSE = "MIT" + +# information distributed by the package is machine specific +PACKAGE_ARCH = "${MACHINE_ARCH}" + +# dependencies of ${DISTRO_MANIFEST_GENERATOR} +DEPENDS = "coreutils-native bash-native git-native gawk-native sed-native jq-native" + +# force a rebuild everytime a build is started +do_compile[nostamp] = "1" + +# borrowed to os-release.bb (output format is very close) +python do_compilestep1 () { + import shutil + with open(d.expand('${B}/bbinfo-deploy'),'w') as f: + allkeys=[] + for field in d.getVar('BUILD_MANIFEST_FIELDS_DEPLOY').split(): + key='DIST_BB_{0}'.format(field) + allkeys.append(key) + value=d.getVar(field) + if value: + f.write('{0}="{1}"\n'.format(key,value)) + f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[deploy]="%s"' % ' '.join(allkeys)) + + with open(d.expand('${B}/bbinfo-target'),'w') as f: + allkeys=[] + for field in d.getVar('BUILD_MANIFEST_FIELDS_TARGET').split(): + key='DIST_BB_{0}'.format(field) + allkeys.append(key) + value=d.getVar(field) + if value: + f.write('{0}="{1}"\n'.format(key,value)) + f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[target]="%s"' % ' '.join(allkeys)) + + with open(d.expand('${B}/bbinfo-sdk'),'w') as f: + allkeys=[] + for field in d.getVar('BUILD_MANIFEST_FIELDS_SDK').split(): + key='DIST_BB_{0}'.format(field) + allkeys.append(key) + value=d.getVar(field) + if value: + f.write('{0}="{1}"\n'.format(key,value)) + f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[sdk]="%s"' % ' '.join(allkeys)) +} + +do_compilestep2 () { + rc=99 + timestamp=${DATETIME} + outfile=${B}/build-info + if [ -x "${DISTRO_MANIFEST_GENERATOR}" -a -f "${DISTRO_SETUP_MANIFEST}" ]; then + rc=0 + for format in bash json; do + if [ "$format" = "json" ]; then + ext=".json" + else + ext="" + fi + for mode in deploy target sdk; do + ${DISTRO_MANIFEST_GENERATOR} -m $mode -f $format -t $timestamp -s ${B}/bbinfo-${mode} ${DISTRO_SETUP_MANIFEST} >${outfile}-${mode}${ext} + rc=$? + if [ $rc -ne 0 ]; then + break + fi + done + done + else + if [ -z "${DISTRO_MANIFEST_GENERATOR}" ]; then + echo "The name of the generation script is not defined." + elif [ ! -f "${DISTRO_MANIFEST_GENERATOR}" ]; then + echo "Generation script ${DISTRO_MANIFEST_GENERATOR} is missing." + elif [ ! -x "${DISTRO_MANIFEST_GENERATOR}" ]; then + echo "Generation script ${DISTRO_MANIFEST_GENERATOR} isn't executable." + fi + if [ -z "${DISTRO_SETUP_MANIFEST}" ]; then + echo "The name of the data file is not defined." + elif [ ! -f "${DISTRO_SETUP_MANIFEST}" ]; then + echo "Data file ${DISTRO_SETUP_MANIFEST} is missing." + fi + echo "You can try to rerun aglsetup.sh to solve that issue." + echo "You can also try to source agl-init-build-env instead of oe-init-build-env." + fi + + if [ "$rc" -ne 0 ]; then + echo "distro-build-manifest generation failed." + fi + return $rc +} + +do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_DEPLOY}" +do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_TARGET}" +do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_SDK}" + +# avoid errors "ERROR: When reparsing .../distro-build-manifest/distro-build-manifest.bb.do_compile, the basehash value changed from .... to .... . The metadata is not deterministic and this needs to be fixed." +do_compilestep2[vardepsexclude] = "DATETIME" + +# combine the two steps +python do_compile() { + bb.build.exec_func("do_compilestep1",d) + bb.build.exec_func("do_compilestep2",d) +} + +do_install () { + # install in target dir + install -d ${D}${sysconfdir}/platform-info + install -m 0644 build-info-target ${D}${sysconfdir}/platform-info/build + install -m 0644 build-info-target.json ${D}${sysconfdir}/platform-info/build.json + + # also copy in deploy dir + install -d ${DEPLOY_DIR_IMAGE} + install -m 0644 build-info-deploy ${DEPLOY_DIR_IMAGE}/build-info + install -m 0644 build-info-deploy.json ${DEPLOY_DIR_IMAGE}/build-info.json + + # copy into sdk deploy dir + install -d ${DEPLOY_DIR}/sdk + install -m 0644 build-info-sdk ${DEPLOY_DIR}/sdk/${SDK_NAME}.build-info + install -m 0644 build-info-sdk.json ${DEPLOY_DIR}/sdk/${SDK_NAME}.build-info.json + + # and copy to nativesdk package + # TODO +} + +# list of variables to add to the various manifests +# smalles one is 'target', then 'deploy' and finally 'sdk' +BUILD_MANIFEST_FIELDS_TARGET = "\ + MACHINE_ARCH \ + MACHINEOVERRIDES \ + MACHINE_FEATURES \ + DISTRO_CODENAME \ + DISTRO_FEATURES \ + DISTRO_BRANCH_VERSION_TAG \ + AGLVERSION \ + AGL_BRANCH \ + AGLRELEASETYPE \ +" + +BUILD_MANIFEST_FIELDS_DEPLOY = "\ + ${BUILD_MANIFEST_FIELDS_TARGET} \ + DISTRO \ + DISTRO_VERSION \ + DISTROOVERRIDES \ + TUNE_FEATURES \ + TUNE_PKGARCH \ + ALL_MULTILIB_PACKAGE_ARCHS \ +" + +BUILD_MANIFEST_FIELDS_SDK = "\ + ${BUILD_MANIFEST_FIELDS_DEPLOY} \ + HOST_SYS \ + TARGET_SYS \ + TARGET_VENDOR \ + SDK_ARCH \ + SDK_VENDOR \ + SDK_VERSION \ + SDK_OS \ +" + +# dont exec useless tasks +do_fetch[noexec] = "1" +do_unpack[noexec] = "1" +do_patch[noexec] = "1" +do_configure[noexec] = "1" + diff --git a/recipes-core/psplash/.appends.core b/recipes-core/psplash/.appends.core new file mode 100644 index 000000000..e69de29bb diff --git a/recipes-core/psplash/files/psplash-colors.h b/recipes-core/psplash/files/psplash-colors.h new file mode 100644 index 000000000..447490397 --- /dev/null +++ b/recipes-core/psplash/files/psplash-colors.h @@ -0,0 +1,34 @@ +/* + * pslash - a lightweight framebuffer splashscreen for embedded devices. + * + * Copyright (c) 2012 sleep(5) ltd + * Author: Tomas Frydrych + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef _HAVE_PSPLASH_COLORS_H +#define _HAVE_PSPLASH_COLORS_H + +/* This is the overall background color */ +#define PSPLASH_BACKGROUND_COLOR 0xff,0xff,0xff + +/* This is the color of any text output */ +#define PSPLASH_TEXT_COLOR 0x00,0x00,0x00 + +/* This is the color of the progress bar indicator */ +#define PSPLASH_BAR_COLOR 0x00,0x00,0x00 + +/* This is the color of the progress bar background */ +#define PSPLASH_BAR_BACKGROUND_COLOR 0xff,0xff,0xff + +#endif diff --git a/recipes-core/psplash/files/psplash-poky-img.h b/recipes-core/psplash/files/psplash-poky-img.h new file mode 100644 index 000000000..c0e8b0818 --- /dev/null +++ b/recipes-core/psplash/files/psplash-poky-img.h @@ -0,0 +1,5411 @@ +/* GdkPixbuf RGB C-Source image dump 1-byte-run-length-encoded */ + +#define POKY_IMG_ROWSTRIDE (1800) +#define POKY_IMG_WIDTH (600) +#define POKY_IMG_HEIGHT (400) +#define POKY_IMG_BYTES_PER_PIXEL (3) /* 3:RGB, 4:RGBA */ +#define POKY_IMG_RLE_PIXEL_DATA ((uint8*) \ + "\377\377\377\377\377\377\377\377\203\377\377\377\1\376\376\376\221\377" \ + "\377\377\1\376\376\376\215\377\377\377\1\376\376\376\203\377\377\377" \ + "\1\376\376\376\233\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \ + "\376\202\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\376\376\376\206\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \ + "\376\204\377\377\377\1\376\376\376\203\377\377\377\5\376\376\376\377" \ + "\377\377\376\376\376\377\377\377\376\376\376\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\202\376\376\376\207\377\377" \ + "\377\1\376\376\376\205\377\377\377\1\376\376\376\211\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\235\377\377\377\1\376\376\376\203\377" \ + "\377\377\1\376\376\376\213\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\216\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\365\377\377\377\1\376" \ + "\376\376\203\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376" \ + "\203\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\205\377" \ + "\377\377\1\376\376\376\203\377\377\377\12\376\376\376\377\377\377\346" \ + "\346\346\315\315\315\316\316\316\265\265\265\235\235\235\234\234\234" \ + "\233\233\233\204\204\204\203kkm\202lln\2EEG;;=\215::<\204kkm\3kkkxxx" \ + "\235\235\235\202\234\234\234\1\265\265\265\202\316\316\316\1\332\332" \ + "\332\207\377\377\377\202\376\376\376\2\377\377\377\376\376\376\211\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\203\377\377\377\5\376" \ + "\376\376\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\366\377\377\377\1\376\376\376\205" \ + "\377\377\377\1\376\376\376\214\377\377\377\11\376\376\376\332\332\332" \ + "\316\316\320\247\247\251\236\236\240\204\204\206kkm__a<<>\202::<\11;" \ + ";=99;;;=99;::<;;=::<;;=99;\203::<\1<<>\213::<\13;;=::<;;=::<;;=::<;;" \ + "=::<;;=::<;;=\207::<\3SSUllnxxz\202\234\234\236\202\316\316\316\2\377" \ + "\377\377\376\376\376\214\377\377\377\1\376\376\376\203\377\377\377\1" \ + "\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\376\377" \ + "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\203\377\377\377" \ + "\7\332\332\334\302\302\304\234\234\236\203\203\205llnEEG;;=\202::<\6" \ + ";;=::<;;=::<;;=99;\204::<\1""99;\202;;=\1""99;\205::<\1;;=\213::<\11" \ + ";;=::<;;=::<;;=::<;;=::<;;=\202::<\1""99;\206::<\1;;=\203::<\13;;=99" \ + ";;;=::<;;=::\202::<\7llnkkm\233" \ + "\233\235\235\235\237\302\302\304\316\316\320\347\347\351\241\377\377" \ + "\377\202\376\376\376\203\377\377\377\17\376\376\376\377\377\377\376\376" \ + "\376\377\377\377\376\376\376\363\363\363\316\316\316\315\315\315\234" \ + "\234\234\235\235\235xxxllnFFH::<;;=\205::<\5;;=99;;;=::<;;=\212::<\202" \ + ";;=\212::<\5;;=99;;;=::<99;\202::<\5__a\250\250\252\346\346\346\377\377" \ + "\377\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\271\377\377\377\202\376\376\376\2\377\377\377" \ + "\376\376\376\203\377\377\377\3\363\363\363\266\266\266wwy\202;;=\210" \ + "::<\1<<>\203::<\2<<>99;\215::<\1;;=\205::<\11;;=::<;;;___xxx\235\235" \ + "\235\266\266\266\315\315\315\364\364\364\207\377\377\377\1\376\376\376" \ + "\213\377\377\377\1\376\376\376\231\377\377\377\5\376\376\376\377\377" \ + "\377\376\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376\376" \ + "\204\377\377\377\1\376\376\376\202\377\377\377\5\316\316\316\302\302" \ + "\302\233\233\233yyykkk\202::<\6;;=::<;;=::<99;;;=\211::<\1;;=\202::<" \ + "\1;;=\206::<\1""99;\202;;=\202::<\203;;=\1""99;\202::<\3__a\251\251\253" \ + "\346\346\346\204\377\377\377\3\376\376\376\377\377\377\376\376\376\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\266\377\377\377\1\376\376" \ + "\376\202\377\377\377\2\302\302\302xxx\203::<\3;;=::<;;=\232::<\1;;=\202" \ + "::<\6RRTkkm\235\235\237\301\301\303\332\332\334\376\376\376\222\377\377" \ + "\377\1\376\376\376\260\377\377\377\3\376\376\376\377\377\377\376\376" \ + "\376\202\377\377\377\5\345\345\347\316\316\320\235\235\237xxzSSU\215" \ + "::<\202;;=\202::<\203;;=\2::<;;=\203::<\1;;=\204::<\10;;=::<;;=::<;;" \ + "=kkm\266\266\266\363\363\363\202\377\377\377\1\376\376\376\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\245\377\377\377\1\376\376\376\214" \ + "\377\377\377\1\376\376\376\202\377\377\377\5\376\376\376\377\377\377" \ + "\332\332\332\205\205\207GGI\202::<\1;;=\211::<\202;;=\205::<\2;;=::<" \ + "\202;;=\203::<\14;;=99;::<;;=99;;;=FFFxxx\234\234\234\315\315\315\364" \ + "\364\364\376\376\376\323\377\377\377\4\317\317\317\250\250\250xxxSSS" \ + "\202::<\1;;=\206::<\2;;=::<\203;;=\202::<\2;;=99;\204::<\7;;=::<;;=:" \ + ":<;;=::<;;=\204::<\3\204\204\206\301\301\301\376\376\376\220\377\377" \ + "\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\225" \ + "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\206\377\377" \ + "\377\1\376\376\376\202\377\377\377\4\363\363\363\251\251\251___;;=\202" \ + "::<\1;;=\202::<\202;;=\204::<\1;;=\202::<\7;;=::<;;=::<;;=::<;;=\203" \ + "::<\3""99;::<;;=\202::<\5;;=__a\221\221\223\265\265\267\346\346\346\323" \ + "\377\377\377\1\376\376\376\211\377\377\377\5\363\363\363\301\301\303" \ + "\235\235\237lln::<\202;;=\203::<\1;;=\204::<\1;;=\202::<\2""99;;;=\205" \ + "::<\2;;=99;\203::<\1""99;\204::<\3TTT\233\233\233\346\346\346\207\377" \ + "\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\250\377\377\377\3\316\316\316\204\204\204;;=\203::<\1;;=\203::<\1;;" \ + "=\202::<\1;;=\205::<\3;;=::<;;=\202::<\4""99;;;=::<;;=\202::<\202;;=" \ + "\4___\221\221\221\301\301\303\363\363\365\203\377\377\377\1\376\376\376" \ + "\203\377\377\377\202\376\376\376\321\377\377\377\1\376\376\376\210\377" \ + "\377\377\1\376\376\376\202\377\377\377\4\316\316\316\235\235\235kkk;" \ + ";=\202::<\202;;=\203::<\5;;=::<;;=99;;;=\204::<\202;;=\7::<;;=99;::<" \ + ";;=::<;;=\202::<\202;;=\2xxz\302\302\304\213\377\377\377\1\376\376\376" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\1\376" \ + "\376\376\212\377\377\377\3\363\363\363\266\266\266TTV\203::<\3;;=::<" \ + ";;=\202::<\203;;=\202::<\202;;=\205::<\1;;=\202::<\1;;=\204::<\4SSU\221" \ + "\221\223\301\301\301\363\363\363\206\377\377\377\1\376\376\376\203\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\315\377\377\377" \ + "\202\376\376\376\202\377\377\377\1\376\376\376\210\377\377\377\1\376" \ + "\376\376\202\377\377\377\1\376\376\376\202\377\377\377\3\316\316\316" \ + "\221\221\223__a\203::<\1;;=\203::<\3;;=::<;;=\203::<\5;;=99;;;=::<;;" \ + "=\204::<\1""99;\205::<\3SSU\234\234\236\346\346\346\207\377\377\377\3" \ + "\376\376\376\377\377\377\376\376\376\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\233\377\377\377\4\376\376\376\347\347\347\221\221\221" \ + "FFH\207::<\4""99;;;=::<;;=\20299;\202;;=\202::<\1;;=\203::<\2;;=::<\202" \ + ";;=\202::<\3xxz\250\250\252\346\346\350\215\377\377\377\203\376\376\376" \ + "\316\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\211\377" \ + "\377\377\1\376\376\376\211\377\377\377\4\363\363\363\265\265\267\205" \ + "\205\207FFH\210::<\3;;=::<;;=\204::<\1;;=\207::<\2;;=::<\202;;=\2\203" \ + "\203\205\317\317\321\206\377\377\377\1\376\376\376\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\233\377\377\377\3\316\316\316yy{99;\206" \ + "::<\2;;=99;\202;;=\205::<\5""99;::<;;=::<;;=\202::<\6;;=::<;;=SSU\204" \ + "\204\204\301\301\301\226\377\377\377\1\376\376\376\317\377\377\377\1" \ + "\376\376\376\203\377\377\377\1\376\376\376\204\377\377\377\1\376\376" \ + "\376\204\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\202" \ + "\377\377\377\3\316\316\316\221\221\221SSU\203::<\3;;=::<99;\204::<\1" \ + ";;=\203::<\2""99;;;=\202::<\1;;=\204::<\5""99;<<>::99;\202::<\4""99;;;=F" \ + "FF\234\234\234\377\377\377\377\377\377\377\377\375\377\377\377\11\316" \ + "\316\320kkm::<;;=::<;;=99;::<;;=\203::<\202;;=\2::<99;\205::<\13;;=F" \ + "FH\221\221\221\346\346\346\376\376\376\377\377\377\376\376\376\377\377" \ + "\377\376\376\376\377\377\377\376\376\376\204\377\377\377\1\376\376\376" \ + "\273\377\377\377\2\376\376\376\317\317\317\212::<\6;;=;;;\316\316\316" \ + "\376\376\376\377\377\377\376\376\376\304\377\377\377\1\376\376\376\206" \ + "\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \ + "\376\204\377\377\377\4\363\363\363\235\235\235RRT;;=\202::<\202;;=\7" \ + "::<;;=99;::<;;=::<;;=\203::<\1;;=\202::<\6;;=::\202::<\2FFH\331\331\333\377\377\377\377\205\377" \ + "\377\377\1\316\316\316\214::<\1\316\316\316\377\377\377\377\216\377\377" \ + "\377\1\376\376\376\203\377\377\377\4\376\376\376\377\377\377\363\363" \ + "\363__a\204::<\2;;=99;\206::<\2;;=\204\204\204\203\377\377\377\1\376" \ + "\376\376\377\377\377\377\377\377\377\377\220\377\377\377\1\204\204\204" \ + "\205::<\1;;=\203::<\1;;=\203::<\4__a\363\363\363\377\377\377\376\376" \ + "\376\377\377\377\377\204\377\377\377\1\316\316\316\214::<\1\316\316\316" \ + "\377\377\377\377\224\377\377\377\4\376\376\376\363\363\363xxx::<\202" \ + ";;=\202::<\1;;=\203::<\1;;=\203::<\1\205\205\207\204\377\377\377\1\376" \ + "\376\376\377\377\377\377\377\377\377\377\215\377\377\377\1\250\250\250" \ + "\205::<\1;;=\203::<\12;;=99;;;=::<__a\363\363\365\377\377\377\376\376" \ + "\376\377\377\377\376\376\376\377\377\377\377\203\377\377\377\1\316\316" \ + "\316\214::<\1\316\316\316\377\377\377\377\227\377\377\377\5\204\204\204" \ + "::<;;=::<;;=\204::<\1""99;\204::<\1\204\204\204\377\377\377\377\377\377" \ + "\377\377\213\377\377\377\1\376\376\376\202\377\377\377\4\376\376\376" \ + "\377\377\377\265\265\267;;=\212::<\4;;=::<__a\363\363\363\217\377\377" \ + "\377\1\376\376\376\367\377\377\377\1\316\316\316\214::<\1\316\316\316" \ + "\376\377\377\377\202\377\377\375\3\377\376\377\377\377\377\376\377\375" \ + "\224\377\377\377\3\204\204\206::<;;=\211::<\7""99;::<\203\203\205\377" \ + "\377\377\376\376\376\377\377\377\376\376\376\205\377\377\377\1\376\376" \ + "\376\202\377\377\377\202\376\376\376\377\377\377\377\377\377\377\377" \ + "\2\264\264\266;;=\202::<\202;;=\1""99;\207::<\2__a\363\363\365\217\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\366\377\377\377\1\316" \ + "\316\316\214::<\1\316\316\316\375\377\377\377\5\377\377\375\377\376\377" \ + "\377\375\377\377\377\375\377\377\377\202\377\376\377\221\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\204\204\206\203::<\1;;=\202::<\2;;=" \ + "::<\202;;=\202::<\3;;=\204\204\204\376\376\376\211\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\377\377\377\377\375\377\377\377\7\376" \ + "\376\376\264\264\266;;=99;::<;;=99;\204::<\1;;=\203::<\2aac\363\363\363" \ + "\221\377\377\377\1\376\376\376\367\377\377\377\1\316\316\316\214::<\1" \ + "\316\316\316\375\377\377\377\202\376\376\376\203\377\377\377\202\376" \ + "\377\377\222\377\377\377\10\376\376\376\377\377\377\376\376\376\204\204" \ + "\206::<;;=::<;;=\203::<\202;;=\202::<\6""99;;;=\205\205\207\376\376\376" \ + "\377\377\377\376\376\376\203\377\377\377\202\376\376\376\202\377\377" \ + "\377\1\376\376\376\377\377\377\377\375\377\377\377\3\376\376\376\302" \ + "\302\304;;=\203::<\1;;=\204::<\6;;=99;;;=::\202::<\2__a\363\363\365\202\377\377\377\1" \ + "\376\376\376\213\377\377\377\1\376\376\376\375\377\377\377\1\316\316" \ + "\316\214::<\1\316\316\316\374\377\377\377\7\377\376\377\376\377\377\376" \ + "\376\374\377\376\377\377\377\375\376\377\377\377\377\375\226\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\203\203\203\214::<\2;;=\265\265" \ + "\265\206\377\377\377\1\376\376\376\377\377\377\377\374\377\377\377\4" \ + "\364\364\364GGI99;;;=\206::<\1;;=\203::<\2__a\363\363\363\205\377\377" \ + "\377\1\376\376\376\212\377\377\377\1\363\363\363\203\377\377\377\1\376" \ + "\376\376\370\377\377\377\1\316\316\316\214::<\1\316\316\316\374\377\377" \ + "\377\10\377\377\375\377\376\377\377\377\377\377\377\375\377\376\377\370" \ + "\373\362\370\373\364\377\376\377\220\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\204\204\204\203::<\1;;=\210::<\2FFH\332\332\334\204\377\377\377\1" \ + "\376\376\376\377\377\377\377\374\377\377\377\3\363\363\363___;;=\202" \ + "::<\1;;=\204::<\6;;=99;;;=::<__a\363\363\365\220\377\377\377\3\265\265" \ + "\265FFF\333\333\333\373\377\377\377\1\316\316\316\214::<\1\316\316\316" \ + "\376\377\377\377\6\374\377\377\377\377\375\371\374\365\242\320c\240\322" \ + "c\371\372\362\221\377\377\377\1\376\376\376\210\377\377\377\2\203\203" \ + "\203;;=\202::<\1;;=\203::<\1;;=\203::<\3;;=FFH\333\333\333\202\377\377" \ + "\377\1\376\376\376\377\377\377\377\371\377\377\377\1\376\376\376\203" \ + "\377\377\377\2kkm::<\202;;=\1""99;\205::<\202;;=\3::<__a\363\363\363" \ + "\220\377\377\377\5\265\265\267::<;;=FFH\332\332\332\206\377\377\377\3" \ + "\376\376\376\377\377\377\376\376\376\361\377\377\377\1\316\316\316\213" \ + "::<\2;;=\316\316\316\365\377\377\377\22\376\376\377\377\377\375\377\377" \ + "\377\377\377\375\377\377\377\377\376\377\377\377\375\377\377\377\376" \ + "\376\377\377\377\377\371\374\365\242\320c\215\307\77\215\305@\242\322" \ + "e\372\373\365\376\377\375\377\376\377\230\377\377\377\3\205\205\207:" \ + ":<;;=\206::<\1;;=\202::<\4;;=SSU\363\363\365\376\376\376\377\377\377" \ + "\377\374\377\377\377\13\376\376\376\204\204\204::<;;=99;::<;;=::<;;=" \ + "::<;;=\203::<\3__a\364\364\366\376\376\376\217\377\377\377\1\265\265" \ + "\267\203::<\3;;=FFF\332\332\332\206\377\377\377\1\376\376\376\361\377" \ + "\377\377\2\376\376\376\317\317\317\212::<\6;;=;;;\316\316\316\376\376" \ + "\376\377\377\377\376\376\376\361\377\377\377\6\376\376\377\377\376\377" \ + "\375\376\377\376\377\377\377\377\375\375\377\376\202\377\377\377\17\376" \ + "\376\376\377\377\377\371\372\364\240\322a\215\305@\212\307>\215\307\77" \ + "\215\305>\242\320c\370\372\365\377\377\377\377\376\377\376\377\375\377" \ + "\377\375\377\376\377\225\377\377\377\5kkm::<;;=99;;;=\210::<\4__a\364" \ + "\364\364\376\376\376\377\377\377\202\376\376\376\377\377\377\377\363" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\4" \ + "\250\250\252::<;;=99;\202;;=\205::<\202;;=\3FFH\345\345\345\376\376\376" \ + "\217\377\377\377\4\264\264\266;;=::<;;=\203::<\2GGI\332\332\332\203\377" \ + "\377\377\1\376\376\376\356\377\377\377\1\376\376\376\205\377\377\377" \ + "\2\315\315\315;;;\211::<\3;;;:::\315\315\315\202\377\377\377\1\376\376" \ + "\376\361\377\377\377\23\377\377\375\375\376\377\376\377\377\376\377\375" \ + "\377\374\377\377\377\375\375\377\376\377\377\377\377\377\375\371\372" \ + "\364\242\321g\215\306A\212\307>\215\306A\212\306@\214\305@\212\306B\241" \ + "\322_\367\372\361\204\377\377\377\1\377\377\375\220\377\377\377\1\376" \ + "\376\376\203\377\377\377\3\363\363\363__a99;\202::<\6;;=::<99;;;=99;" \ + ";;=\203::<\1\205\205\207\204\377\377\377\1\376\376\376\377\377\377\377" \ + "\362\377\377\377\1\376\376\376\202\377\377\377\22\376\376\376\265\265" \ + "\267::<99;;;=::<;;=99;;;=::<;;=::<;;=::\214\305@\214" \ + "\306>\202\214\305@\4\241\321a\371\374\365\376\376\377\377\377\375\202" \ + "\376\377\377\221\377\377\377\1\376\376\376\203\377\377\377\3\362\362" \ + "\362``b99;\205::<\1;;=\203::<\6;;=99;\235\235\237\376\376\376\377\377" \ + "\377\376\376\376\377\377\377\377\366\377\377\377\2\332\332\332FFH\202" \ + ";;=\4""99;;;=::<;;=\205::<\2FFH\332\332\334\202\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\213\377\377\377\4\266\266\26699;::<;;=\202" \ + "::<\1;;=\202::<\4;;=::\215\305" \ + "@\212\306@\213\310=\214\306<\216\306\77\214\304=\214\306>\241\321c\372" \ + "\375\362\376\376\376\377\376\377\376\376\374\220\377\377\377\2\376\376" \ + "\376\377\377\377\203\376\376\376\4\377\377\377\364\364\364FFH;;=\202" \ + "::<\1;;=\202::<\1;;=\203::<\3;;=::<\265\265\265\377\377\377\377\367\377" \ + "\377\377\4\362\362\362SSU::<;;=\205::<\1""99;\202;;=\3::<;;=\265\265" \ + "\267\216\377\377\377\3\376\376\376\377\377\377\265\265\265\202::<\5;" \ + ";=99;;;=::<;;=\204::<\4;;=FFH\332\332\332\376\376\376\205\377\377\377" \ + "\1\376\376\376\355\377\377\377\1\376\376\376\214\377\377\377\1\376\376" \ + "\376\366\377\377\377\1\375\377\376\202\377\377\375\24\377\377\377\376" \ + "\376\376\373\373\363\243\322b\213\307A\214\306>\215\305@\214\305@\212" \ + "\307>\214\306>\215\305>\213\307A\214\305@\216\310@\214\306>\215\305>" \ + "\242\320c\366\373\364\375\377\376\377\376\377\221\377\377\377\1\376\376" \ + "\376\204\377\377\377\3\376\376\376\333\333\333EEG\202;;=\2::<;;=\207" \ + "::<\3GGI\332\332\332\376\376\376\377\377\377\377\365\377\377\377\1__" \ + "a\205::<\10;;=::<;;=::<;;=::<;;=\265\265\265\202\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\213\377\377\377\1\266\266\266\203::<\5""9" \ + "9;<<>::<;;=::<\202;;=\203::<\4;;=FFH\333\333\333\376\376\376\202\377" \ + "\377\377\1\376\376\376\355\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\376\376\376\215\377\377\377\1\376\376\376\363\377\377\377\3\377\376" \ + "\377\377\377\377\375\377\376\202\377\377\377\2\373\373\363\241\321d\202" \ + "\214\306>\17\216\306=\215\305@\215\307\77\214\306>\217\304>\214\306>" \ + "\214\305B\215\307\77\211\305A\215\306A\216\306\77\214\305@\242\322e\370" \ + "\373\364\377\377\375\230\377\377\377\1\333\333\335\203::<\202;;=\206" \ + "::<\3;;=FFH\363\363\363\377\377\377\377\364\377\377\377\1\204\204\206" \ + "\203::<\1;;=\207::<\2;;=\204\204\206\220\377\377\377\1\346\346\346\204" \ + "::<\1;;=\203::<\1;;=\202::<\202;;=\203::<\2FFH\332\332\332\357\377\377" \ + "\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\204\377\377" \ + "\377\1\377\377\375\202\377\377\377\17\377\376\377\370\373\364\243\322" \ + "b\214\306>\213\310\77\212\307>\214\306>\215\306C\212\307>\214\306<\213" \ + "\310\77\214\305@\214\306<\214\306>\216\306\77\203\214\306>\3\214\306" \ + "<\265\334\211\376\376\376\222\377\377\377\1\376\376\376\205\377\377\377" \ + "\4\376\376\377\265\265\267::<;;=\212::<\1___\377\377\377\377\363\377" \ + "\377\377\1\265\265\267\204::<\1;;=\206::<\2;;=\203\203\203\222\377\377" \ + "\377\2\265\265\265;;=\203::<\1;;=\205::<\1;;=\204::<\3;;=FFH\332\332" \ + "\332\206\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\377\345\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375" \ + "\377\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370" \ + "\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4" \ + "\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306" \ + ">\215\307\77\214\305@\244\317c\367\375\361\233\377\377\377\3\234\234" \ + "\236::<99;\211::<\2;;=\204\204\206\377\377\377\377\360\377\377\377\13" \ + "\376\376\376\332\332\33299;::<99;;;=::<99;;;=::<;;=\202::<\3;;=^^`\364" \ + "\364\364\223\377\377\377\12\265\265\267;;=::<;;=99;;;=::<;;=::<;;=\202" \ + "::<\1;;=\203::<\3;;=FFF\332\332\332\206\377\377\377\1\376\376\376\377" \ + "\377\377\377\345\377\377\377\6\376\376\377\377\376\377\375\376\377\376" \ + "\377\377\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373" \ + "\366\241\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212" \ + "\306@\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306" \ + ">\215\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\233" \ + "\377\377\377\1\204\204\206\203::<\13;;=::<;;=::<;;=::<;;=::<;;=\266\266" \ + "\266\376\376\376\203\377\377\377\1\376\376\376\377\377\377\377\352\377" \ + "\377\377\2\363\363\363TTV\202::<\3;;=99;;;=\204::<\4;;=99;FFH\363\363" \ + "\363\224\377\377\377\7\376\376\376\265\265\265;;=::<;;=::<;;=\203::<" \ + "\1;;=\203::<\1;;=\203::<\2GGI\332\332\332\203\377\377\377\1\376\376\376" \ + "\377\377\377\377\347\377\377\377\7\377\377\375\375\376\377\376\377\377" \ + "\376\377\375\377\374\377\377\377\375\375\377\376\202\377\377\377\5\372" \ + "\373\366\240\320b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305" \ + "@\212\306@\214\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@" \ + "\214\306>\215\307\77\215\305@\242\320c\370\373\362\377\377\373\377\376" \ + "\377\377\377\375\232\377\377\377\3\376\376\376\377\377\377^^`\202;;=" \ + "\205::<\1""99;\202;;=\5::<;;=\332\332\332\377\377\377\376\376\376\377" \ + "\377\377\377\347\377\377\377\1\376\376\376\204\377\377\377\1lln\204:" \ + ":<\202;;=\203::<\6;;=99;GGI\332\332\332\377\377\377\376\376\376\225\377" \ + "\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::<\3""99;;;=::<\202;;" \ + "=\202::<\4;;=::\212\307<\214\306>\214\306<\214\306>\216" \ + "\306\77\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306" \ + ">\242\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377" \ + "\234\377\377\377\2\364\364\364RRT\202::<\4""99;;;=::<;;=\205::<\3SSU" \ + "\362\362\362\377\377\377\202\376\376\376\377\377\377\377\351\377\377" \ + "\377\1\234\234\236\204::<\1;;=\203::<\1;;=\203::<\1\265\265\267\231\377" \ + "\377\377\2\265\265\267;;=\203::<\2""99;;;=\202::<\1;;=\202::<\1;;=\202" \ + "::<\4;;=::\212\307>\212\306@\214\305B" \ + "\214\305@\214\305B\214\306>\212\307>\212\310\77\214\306>\217\304@\214" \ + "\306>\214\305@\242\322b\370\373\362\377\377\377\202\377\376\377\1\377" \ + "\377\375\235\377\377\377\3\376\376\376\332\332\334GGI\202;;=\6::<;;=" \ + "99;;;=::<;;=\203::<\1yyy\202\376\376\376\202\377\377\377\1\376\376\376" \ + "\377\377\377\377\345\377\377\377\4\376\376\376\317\317\317::<;;=\202" \ + "::<\3;;=99;;;=\204::<\6;;=\221\221\223\377\377\377\376\376\376\377\377" \ + "\377\376\376\376\226\377\377\377\3\376\376\376\265\265\267;;=\202::<" \ + "\2;;=99;\205::<\1;;=\204::<\4;;=FFH\332\332\332\376\376\376\205\377\377" \ + "\377\1\376\376\376\377\377\377\377\342\377\377\377\1\375\377\376\202" \ + "\377\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307" \ + "B\212\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214" \ + "\306<\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307" \ + ">\244\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377" \ + "\377\377\375\377\376\377\236\377\377\377\4\265\265\267::<;;=99;\202;" \ + ";=\205::<\202;;=\1\250\250\250\202\377\377\377\1\376\376\376\377\377" \ + "\377\377\343\377\377\377\1\376\376\376\202\377\377\377\3\363\363\363" \ + "FFH;;=\202::<\5;;=::<;;=::<99;\202;;=\2::\213\310=\214\306>\214" \ + "\305@\213\310=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214" \ + "\306>\215\305>\217\304@\215\307\77\215\307=\242\320c\367\375\361\376" \ + "\376\377\377\376\377\376\376\376\202\377\377\375\2\374\377\377\377\376" \ + "\377\234\377\377\377\1\376\376\376\202\377\377\377\10\221\221\221::<" \ + ";;=99;::<;;=::<;;=\205::<\2\333\333\333\376\376\376\377\377\377\377\347" \ + "\377\377\377\1kkk\202::<\1;;=\205::<\1;;=\202::<\2RRT\363\363\365\236" \ + "\377\377\377\1\265\265\267\203::<\2""99;;;=\203::<\1;;=\202::<\202;;" \ + "=\203::<\2FFH\332\332\332\377\377\377\377\346\377\377\377\1\377\377\375" \ + "\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306>\213\310" \ + "\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215\307=\214" \ + "\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<\244\317c" \ + "\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377\377\377" \ + "\377\202\377\376\377\241\377\377\377\2kkm::<\202;;=\1""99;\204::<\203" \ + ";;=\2SSU\364\364\364\377\377\377\377\336\377\377\377\3\376\376\376\377" \ + "\377\377\376\376\376\204\377\377\377\2\376\376\376\250\250\252\202::" \ + "<\1;;=\210::<\2FFH\333\333\333\202\377\377\377\1\376\376\376\235\377" \ + "\377\377\2\265\265\265;;=\203::<\1;;=\205::<\1;;=\204::<\3;;=FFH\332" \ + "\332\332\206\377\377\377\3\376\376\376\377\377\377\376\376\376\243\377" \ + "\377\377\4\376\377\377\377\377\375\377\376\377\376\376\377\202\377\377" \ + "\377\2\376\377\375\376\377\377\230\377\377\377\10\376\377\377\377\376" \ + "\377\376\377\377\376\377\375\376\376\376\376\377\377\377\377\377\377" \ + "\376\377\231\377\377\377\7\377\376\377\376\376\374\376\377\377\377\377" \ + "\375\374\377\377\376\377\377\377\376\377\231\377\377\377\17\375\377\374" \ + "\377\377\375\377\377\377\377\376\377\376\377\377\377\376\377\377\377" \ + "\377\376\377\377\376\376\374\377\377\377\377\377\373\377\377\377\376" \ + "\377\377\377\377\377\377\377\375\220\377\377\377\4\377\377\373\377\377" \ + "\377\377\377\375\377\377\377\202\376\377\377\2\377\377\375\377\377\373" \ + "\251\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375\377" \ + "\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370\373" \ + "\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4\214" \ + "\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215" \ + "\307\77\214\305@\244\317c\367\375\361\251\377\377\377\6\363\363\363T" \ + "TT::<;;=::<;;=\206::<\2;;=www\204\377\377\377\1\376\376\376\377\377\377" \ + "\377\340\377\377\377\2\332\332\332;;=\203::<\3;;=99;;;=\203::<\3;;=:" \ + ":<\265\265\267\204\377\377\377\1\376\376\376\235\377\377\377\12\265\265" \ + "\267;;=::<;;=99;;;=::<;;=::<;;=\202::<\1;;=\203::<\3;;=FFF\332\332\332" \ + "\206\377\377\377\1\376\376\376\244\377\377\377\202\377\377\375\1\377" \ + "\377\377\202\376\377\375\3\376\376\377\377\377\377\377\376\377\230\377" \ + "\377\377\3\376\377\375\377\377\377\377\377\373\202\377\376\377\2\377" \ + "\377\377\376\376\376\231\377\377\377\10\376\377\373\376\375\377\377\377" \ + "\375\377\376\377\377\375\377\377\377\373\377\376\377\377\377\375\230" \ + "\377\377\377\12\377\376\377\377\377\377\377\375\376\376\377\377\376\377" \ + "\372\376\377\377\377\377\377\376\377\375\377\376\377\377\377\375\203" \ + "\377\377\377\202\376\377\375\1\375\376\377\227\377\377\377\1\377\374" \ + "\377\250\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377" \ + "\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241" \ + "\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@" \ + "\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215" \ + "\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\251\377" \ + "\377\377\2\331\331\331;;=\206::<\1;;=\203::<\2;;=\265\265\265\204\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377" \ + "\322\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\202\377\377\377\2\363\363\363SSU\203::<\2;;=::<\202" \ + ";;=\2""99;;;=\202::<\1\204\204\204\206\377\377\377\1\376\376\376\234" \ + "\377\377\377\7\376\376\376\265\265\265;;=::<;;=::<;;=\203::<\1;;=\203" \ + "::<\1;;=\203::<\2GGI\332\332\332\203\377\377\377\1\376\376\376\247\377" \ + "\377\377\1\377\377\375\202\377\376\377\1\377\375\377\202\377\377\377" \ + "\1\377\376\377\232\377\377\377\6\377\377\375\377\377\377\375\377\376" \ + "\376\377\375\377\377\375\377\375\377\230\377\377\377\202\377\377\375" \ + "\2\377\377\377\376\376\376\202\377\377\377\2\376\377\377\374\377\377" \ + "\230\377\377\377\1\377\377\375\202\377\376\377\1\375\376\377\203\377" \ + "\377\377\1\377\377\375\202\377\377\377\6\376\376\377\377\377\375\377" \ + "\377\377\377\375\377\377\376\377\377\377\375\220\377\377\377\1\376\377" \ + "\377\202\377\377\377\3\376\377\375\376\376\376\377\376\377\252\377\377" \ + "\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374\377\377" \ + "\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215\307\77" \ + "\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D\216\306" \ + "\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77\215\305" \ + "@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\252\377\377" \ + "\377\2\250\250\25099;\204::<\12;;=99;::<;;=99;::\212\307<\214\306" \ + ">\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212" \ + "\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377" \ + "\376\376\376\376\377\377\253\377\377\377\1yyy\205::<\3;;=::<99;\202;" \ + ";=\3::<__a\376\376\376\377\377\377\377\335\377\377\377\1\376\376\376" \ + "\202\377\377\377\5\301\301\301::<;;=99;;;=\207::<\2GGI\332\332\332\203" \ + "\377\377\377\1\376\376\376\243\377\377\377\2\265\265\267;;=\203::<\2" \ + "99;;;=\202::<\1;;=\202::<\1;;=\202::<\4;;=::\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>" \ + "\212\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370" \ + "\373\362\377\377\377\202\377\376\377\1\377\377\375\254\377\377\377\4" \ + "\363\363\363SSU;;=99;\202;;=\1""99;\204::<\3;;=::<\235\235\237\377\377" \ + "\377\377\334\377\377\377\1\376\376\376\202\377\377\377\2\363\363\363" \ + "GGI\202::<\7;;=::<99;::<;;=::<;;=\202::<\2\266\266\266\376\376\376\204" \ + "\377\377\377\202\376\376\376\202\377\377\377\1\376\376\376\236\377\377" \ + "\377\3\376\376\376\265\265\267;;=\202::<\2;;=99;\205::<\1;;=\204::<\4" \ + ";;=FFH\332\332\332\376\376\376\205\377\377\377\1\376\376\376\240\377" \ + "\377\377\10\376\377\375\377\375\377\377\377\375\376\377\375\377\377\377" \ + "\377\376\377\377\377\377\376\376\374\230\377\377\377\10\374\377\377\377" \ + "\376\374\377\377\377\376\376\374\377\376\377\376\377\377\377\377\377" \ + "\377\376\377\230\377\377\377\3\377\377\375\377\377\377\376\377\375\203" \ + "\377\377\377\1\377\376\377\231\377\377\377\6\377\375\377\376\376\374" \ + "\377\377\377\377\376\377\376\377\375\377\376\377\202\377\377\377\2\377" \ + "\376\377\377\377\377\202\376\377\377\2\376\376\377\376\377\377\222\377" \ + "\377\377\2\377\377\375\377\375\377\202\376\377\377\4\376\376\376\376" \ + "\377\377\375\377\374\377\375\377\251\377\377\377\1\375\377\376\202\377" \ + "\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212" \ + "\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<" \ + "\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244" \ + "\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377" \ + "\377\375\377\376\377\252\377\377\377\5\376\376\376\377\377\377\333\333" \ + "\33399;;;=\202::<\5;;=99;;;=99;;;=\203::<\1\332\332\334\377\377\377\377" \ + "\330\377\377\377\1\376\376\376\205\377\377\377\1xxx\202::<\1;;=\202:" \ + ":<\1;;=\204::<\4:::xxx\376\376\376\377\377\377\202\376\376\376\205\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\237\377\377\377\1\265" \ + "\265\265\204::<\6;;=::<;;=::<;;=::<\202;;=\203::<\4;;=FFH\333\333\333" \ + "\376\376\376\202\377\377\377\1\376\376\376\242\377\377\377\7\376\376" \ + "\376\377\376\377\326\352\267\247\324o\247\324m\252\324r\247\324o\231" \ + "\252\324p\10\323\353\271\377\376\377\377\377\377\376\377\377\350\365" \ + "\333\253\323p\250\324r\251\324k\230\252\324p\10\250\325n\252\324p\277" \ + "\337\223\376\377\377\377\377\377\375\377\376\376\377\377\276\336\222" \ + "\230\252\324p\7\250\325p\250\324r\247\324o\253\324n\251\323m\346\364" \ + "\332\377\376\377\202\377\377\377\7\323\352\266\253\323p\251\323m\253" \ + "\323r\251\323o\247\324m\252\324r\220\252\324p\10\252\324n\253\324n\247" \ + "\324k\252\324p\254\325o\247\324m\252\324p\324\353\267\250\377\377\377" \ + "\3\377\376\377\377\377\377\375\377\376\202\377\377\377\11\373\373\363" \ + "\241\321d\214\306>\213\310=\214\306>\214\305@\213\310=\212\306@\217\304" \ + ">\202\215\307=\14\214\306>\215\305>\214\306>\215\305>\217\304@\215\307" \ + "\77\215\307=\242\320c\367\375\361\376\376\377\377\376\377\376\376\376" \ + "\202\377\377\375\2\374\377\377\377\376\377\254\377\377\377\2\376\376" \ + "\376\251\251\251\202::<\5;;=::<;;=99;;;=\204::<\1``b\377\377\377\377" \ + "\334\377\377\377\3\376\376\376\301\301\301:::\205::<\1""99;\202::<\4" \ + ";;=::\10\304\341\237\377\374\377\377\376\377\377\377\377" \ + "\341\362\322\215\305>\212\307>\215\305>\230\214\306>\4\215\305<\214\305" \ + "@\252\324r\376\377\377\202\377\377\377\2\377\377\375\250\324r\230\214" \ + "\306>\20\215\307\77\214\306>\214\306<\214\305B\212\307>\337\363\320\377" \ + "\376\377\376\377\377\376\376\374\305\342\240\214\305@\213\310=\215\305" \ + "@\214\306>\212\307<\214\305@\220\214\306>\10\214\305@\215\306C\212\307" \ + "<\214\306>\215\305>\212\306@\215\305>\304\343\237\250\377\377\377\1\377" \ + "\377\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306" \ + ">\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215" \ + "\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<" \ + "\244\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377" \ + "\377\377\377\202\377\376\377\257\377\377\377\1kkm\202::<\2;;=::<\202" \ + ";;=\3::<;;=::<\202;;=\1\233\233\233\377\377\377\377\330\377\377\377\1" \ + "\376\376\376\202\377\377\377\3\364\364\366FFH;;=\205::<\3;;=::<;;=\202" \ + "::<\1\316\316\316\256\377\377\377\2\265\265\265;;=\203::<\1;;=\205::" \ + "<\1;;=\204::<\3;;=FFH\332\332\332\206\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\235\377\377\377\1\304\343\240\235\214\306>\1\305\342" \ + "\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377" \ + "\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377" \ + "\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306" \ + ">\1\214\305@\205\214\306>\1\305\342\237\241\377\377\377\10\376\376\377" \ + "\377\377\375\377\377\377\377\377\375\377\377\377\377\376\377\377\377" \ + "\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211\307B\213" \ + "\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214\306<\215" \ + "\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305@\244\317" \ + "c\367\375\361\267\377\377\377\2\363\363\363FFF\204::<\1;;=\203::<\4:" \ + "9>::<;;=\332\332\332\377\377\377\377\332\377\377\377\1yy{\202::<\2""9" \ + "9;;;=\202::<\6;;=99;::<;;=::<\234\234\236\260\377\377\377\12\265\265" \ + "\267;;=::<;;=99;;;=::<;;=::<;;=\202::<\1;;=\203::<\3;;=FFF\332\332\332" \ + "\206\377\377\377\1\376\376\376\236\377\377\377\1\304\343\240\235\214" \ + "\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214\306>\1\250" \ + "\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316" \ + "\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305" \ + "@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\240\377\377\377" \ + "\6\376\376\377\377\376\377\375\376\377\376\377\377\377\377\375\375\377" \ + "\376\203\377\377\377\27\377\377\375\372\373\366\241\321a\217\304@\212" \ + "\307<\214\306>\215\305>\215\305@\213\310=\212\306@\214\306>\214\305B" \ + "\215\307\77\215\305>\215\306A\212\307>\214\306>\215\307\77\214\306>\242" \ + "\322b\370\373\362\376\376\377\377\375\376\267\377\377\377\1\301\301\301" \ + "\205::<\3;;=::<;;=\202::<\2""99;```\377\377\377\377\331\377\377\377\1" \ + "\301\301\301\202::<\1;;=\203::<\1;;=\202::<\3<<>::<__a\261\377\377\377" \ + "\7\376\376\376\265\265\265;;=::<;;=::<;;=\203::<\1;;=\203::<\1;;=\203" \ + "::<\2GGI\332\332\332\203\377\377\377\1\376\376\376\240\377\377\377\1" \ + "\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \ + "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \ + "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \ + "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \ + "\240\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377" \ + "\374\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320" \ + "b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214" \ + "\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307" \ + "\77\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375" \ + "\270\377\377\377\3\204\204\204::<;;=\206::<\4;;=::<;;=\234\234\236\377" \ + "\377\377\377\325\377\377\377\4\376\376\376\377\377\377\363\363\363SS" \ + "U\211::<\4""99;::<\332\332\334\376\376\376\202\377\377\377\1\376\376" \ + "\376\257\377\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::<\3""99;" \ + ";;=::<\202;;=\202::<\4;;=::\1\305\342\237\203\377" \ + "\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252" \ + "\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342" \ + "\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305" \ + "@\205\214\306>\1\305\342\237\241\377\377\377\37\376\377\377\376\377\375" \ + "\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373" \ + "\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306" \ + ">\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212" \ + "\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377" \ + "\376\376\376\376\377\377\270\377\377\377\3\363\363\363TTT;;=\202::<\1" \ + ";;=\203::<\5""99;;;=::<;;=\332\332\332\377\377\377\377\323\377\377\377" \ + "\1\376\376\376\202\377\377\377\4\221\221\221;;=99;;;=\202::<\1;;=\202" \ + "::<\1;;=\202::<\1\233\233\233\202\377\377\377\1\376\376\376\262\377\377" \ + "\377\2\265\265\267;;=\203::<\2""99;;;=\202::<\1;;=\202::<\1;;=\202::" \ + "<\4;;=::\1\305\342\237" \ + "\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377" \ + "\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305" \ + "\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214" \ + "\305@\205\214\306>\1\305\342\237\240\377\377\377\202\377\377\375\3\377" \ + "\374\377\375\377\376\376\377\377\202\377\377\377\25\370\373\364\243\322" \ + "b\217\304@\212\306@\214\305@\215\305>\212\307>\212\306@\214\305B\214" \ + "\305@\214\305B\214\306>\212\307>\212\310\77\214\306>\217\304@\214\306" \ + ">\214\305@\242\322b\370\373\362\377\377\377\202\377\376\377\1\377\377" \ + "\375\272\377\377\377\7\316\316\316::<;;=::<99;::<;;=\205::<\1kkm\377" \ + "\377\377\377\325\377\377\377\1\315\315\315\206::<\6""99;::<99;;;=::<" \ + "```\206\377\377\377\1\376\376\376\257\377\377\377\3\376\376\376\265\265" \ + "\267;;=\202::<\2;;=99;\205::<\1;;=\204::<\4;;=FFH\332\332\332\376\376" \ + "\376\205\377\377\377\1\376\376\376\232\377\377\377\1\304\343\240\235" \ + "\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214\306>\1" \ + "\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362" \ + "\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214" \ + "\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\241\377\377" \ + "\377\1\375\377\376\202\377\377\375\34\377\377\377\376\376\376\373\373" \ + "\363\243\322b\211\307B\212\307<\215\305>\214\306>\212\307>\214\305@\217" \ + "\304>\212\307<\214\306<\214\306>\215\307\77\213\307A\214\306>\215\305" \ + "@\215\307\77\212\307>\244\317c\370\373\362\377\377\373\376\377\377\377" \ + "\376\377\375\376\377\377\377\375\377\376\377\272\377\377\377\2\222\222" \ + "\22299;\205::<\1;;=\203::<\2;;=\250\250\250\377\377\377\377\324\377\377" \ + "\377\4```;;=99;;;=\204::<\5;;=::<;;=::<\331\331\331\207\377\377\377\1" \ + "\376\376\376\260\377\377\377\1\265\265\265\204::<\6;;=::<;;=::<;;=::" \ + "<\202;;=\203::<\4;;=FFH\333\333\333\376\376\376\202\377\377\377\1\376" \ + "\376\376\234\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203" \ + "\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1" \ + "\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305" \ + "\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214" \ + "\305@\205\214\306>\1\305\342\237\240\377\377\377\3\377\376\377\377\377" \ + "\377\375\377\376\202\377\377\377\11\373\373\363\241\321d\214\306>\213" \ + "\310=\214\306>\214\305@\213\310=\212\306@\217\304>\202\215\307=\14\214" \ + "\306>\215\305>\214\306>\215\305>\217\304@\215\307\77\215\307=\242\320" \ + "c\367\375\361\376\376\377\377\376\377\376\376\376\202\377\377\375\2\374" \ + "\377\377\377\376\377\262\377\377\377\2\376\376\376\377\377\377\202\376" \ + "\376\376\204\377\377\377\5\363\363\363SSU99;::<;;=\207::<\2GGG\363\363" \ + "\363\377\377\377\377\322\377\377\377\4\234\234\234:::::<;;=\202::<\1" \ + ";;=\203::<\202;;=\1\234\234\236\207\377\377\377\1\376\376\376\262\377" \ + "\377\377\1\265\265\267\203::<\2""99;;;=\203::<\1;;=\202::<\202;;=\203" \ + "::<\2FFH\332\332\332\237\377\377\377\1\304\343\240\235\214\306>\1\305" \ + "\342\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377" \ + "\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377" \ + "\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214" \ + "\306>\1\214\305@\205\214\306>\1\305\342\237\240\377\377\377\1\377\377" \ + "\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306>\213" \ + "\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215\307" \ + "=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<\244" \ + "\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377\377" \ + "\377\377\202\377\376\377\273\377\377\377\2\376\376\376\316\316\316\206" \ + "::<\202;;=\4::<;;=::\1\305\342\237\203\377" \ + "\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252" \ + "\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342" \ + "\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305" \ + "@\205\214\306>\1\305\342\237\231\377\377\377\10\376\376\377\377\377\375" \ + "\377\377\377\377\377\375\377\377\377\377\376\377\377\377\375\376\377" \ + "\377\202\377\377\377\6\370\373\362\243\322b\211\307B\213\310=\214\305" \ + "@\214\306<\202\215\305@\4\214\306<\214\305@\214\306<\215\307\77\202\214" \ + "\306>\6\212\307>\214\306>\215\307\77\214\305@\244\317c\367\375\361\305" \ + "\377\377\377\2xxz;;=\203::<\3;;=::<;;=\203::<\2;;=\315\315\315\377\377" \ + "\377\377\313\377\377\377\203\376\376\376\202\377\377\377\3xxz;;=::<\202" \ + ";;=\1""99;\202;;=\202::<\4;;=::<\333\333\335\376\376\376\274\377\377" \ + "\377\12\265\265\267;;=::<;;=99;;;=::<;;=::<;;=\202::<\1;;=\202::<\4;" \ + ";=99;GGI\332\332\332\235\377\377\377\1\304\343\240\235\214\306>\1\305" \ + "\342\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377" \ + "\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377" \ + "\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214" \ + "\306>\1\214\305@\205\214\306>\1\305\342\237\230\377\377\377\6\376\376" \ + "\377\377\376\377\375\376\377\376\377\377\377\377\375\375\377\376\203" \ + "\377\377\377\27\377\377\375\372\373\366\241\321a\217\304@\212\307<\214" \ + "\306>\215\305>\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77" \ + "\215\305>\215\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370" \ + "\373\362\376\376\377\377\375\376\304\377\377\377\2\364\364\364FFH\203" \ + "::<\2""99;;;=\203::<\4<<>99;TTT\376\376\376\377\377\377\377\310\377\377" \ + "\377\1\376\376\376\205\377\377\377\3\316\316\316::<99;\206::<\1;;=\202" \ + "::<\1\221\221\221\203\377\377\377\1\376\376\376\272\377\377\377\7\376" \ + "\376\376\265\265\265;;=::<;;=::<;;=\203::<\1;;=\203::<\6;;=::<;;=::<" \ + "FFH\332\332\332\234\377\377\377\1\304\343\240\235\214\306>\1\305\342" \ + "\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377" \ + "\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377" \ + "\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306" \ + ">\1\214\305@\205\214\306>\1\305\342\237\230\377\377\377\7\377\377\375" \ + "\375\376\377\376\377\377\376\377\375\377\374\377\377\377\375\375\377" \ + "\376\202\377\377\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305" \ + ">\202\214\305@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215" \ + "\307\77\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373" \ + "\362\377\377\373\377\376\377\377\377\375\304\377\377\377\3\376\376\376" \ + "\265\265\267;;=\204::<\1""99;\203::<\3;;=::<\234\234\234\203\377\377" \ + "\377\1\376\376\376\377\377\377\377\306\377\377\377\7\376\376\376\377" \ + "\377\377\376\376\376\377\377\377__a::<;;=\203::<\7;;=::<;;=::<;;=SSU" \ + "\363\363\363\300\377\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::" \ + "<\3""99;;;=::<\202;;=\204::<\2FFH\332\332\332\233\377\377\377\1\304\343" \ + "\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214" \ + "\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77" \ + "\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214" \ + "\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\231" \ + "\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376\377\377" \ + "\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77\215\307" \ + "=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306\77\215" \ + "\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321" \ + "a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\301\377" \ + "\377\377\1\376\376\376\204\377\377\377\2kkm99;\203::<\202;;=\1""99;\203" \ + "::<\2FFH\363\363\363\377\377\377\377\310\377\377\377\1\376\376\376\203" \ + "\377\377\377\3\250\250\252::<;;=\203::<\1;;=\202::<\5;;=::<;;=\301\301" \ + "\301\376\376\376\301\377\377\377\2\265\265\267;;=\203::<\2""99;;;=\202" \ + "::<\1;;=\202::<\2;;=::<\202;;=\3::\1\305\342\237\203\377\377\377\1\342\362\316" \ + "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \ + "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \ + "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \ + "\230\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377" \ + "\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215" \ + "\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>" \ + "\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362" \ + "\377\377\377\202\377\376\377\1\377\377\375\301\377\377\377\1\376\376" \ + "\376\204\377\377\377\2\376\376\376\346\346\350\203::<\4;;=99;::<;;=\204" \ + "::<\3\203\203\203\377\377\377\376\376\376\377\377\377\377\311\377\377" \ + "\377\2\364\364\364FFH\202::<\5;;=::<;;=::<;;=\202::<\2;;=kkm\202\377" \ + "\377\377\1\376\376\376\300\377\377\377\3\376\376\376\265\265\267;;=\202" \ + "::<\2;;=99;\204::<\3;;=99;;;=\202::<\3;;=::<\265\265\265\232\377\377" \ + "\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362" \ + "\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>" \ + "\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215" \ + "\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1" \ + "\305\342\237\231\377\377\377\1\375\377\376\202\377\377\375\34\377\377" \ + "\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214" \ + "\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77" \ + "\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \ + "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \ + "\377\301\377\377\377\202\376\376\376\2\377\377\377\376\376\376\202\377" \ + "\377\377\1\234\234\236\203::<\1;;=\206::<\2;;=\331\331\331\377\377\377" \ + "\377\306\377\377\377\1\376\376\376\203\377\377\377\4\233\233\233;;=:" \ + ":<;;=\202::<\3;;=99;;;=\203::<\1\346\346\350\305\377\377\377\1\265\265" \ + "\265\204::<\3;;=::<;;=\203::<\5;;=99;;;=::<\265\265\267\233\377\377\377" \ + "\1\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \ + "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \ + "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \ + "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \ + "\230\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \ + "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \ + "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \ + ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \ + "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\301\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\6\364" \ + "\364\364SSU::<;;=::<;;=\205::<\4""99;kkk\377\377\377\376\376\376\377" \ + "\377\377\377\307\377\377\377\2\346\346\346;;;\204::<\3;;=99;;;=\203:" \ + ":<\1\234\234\236\205\377\377\377\1\376\376\376\301\377\377\377\1\265" \ + "\265\267\203::<\2""99;;;=\202::<\1;;;\204::<\1\265\265\267\234\377\377" \ + "\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362" \ + "\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>" \ + "\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215" \ + "\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1" \ + "\305\342\237\230\377\377\377\1\377\377\375\202\377\377\377\32\377\376" \ + "\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215\305" \ + "@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A\212" \ + "\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377" \ + "\375\376\377\377\375\376\377\377\377\377\377\202\377\376\377\306\377" \ + "\377\377\1\376\376\376\202\377\377\377\2\301\301\303::<\202;;=\11::<" \ + ";;=::<;;=::<99;;;=::<\301\301\301\377\377\377\377\306\377\377\377\12" \ + "\376\376\376\377\377\377\204\204\204;;=::<:9>;;=::<99;;;=\203::<\5SS" \ + "U\363\363\363\376\376\376\377\377\377\376\376\376\305\377\377\377\5\265" \ + "\265\26599;;;=::<;;=\206::<\1\266\266\270\235\377\377\377\1\304\343\240" \ + "\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214\306" \ + ">\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77\342" \ + "\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214\306" \ + ">\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\221\377" \ + "\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375\377\377\377" \ + "\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243" \ + "\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214" \ + "\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77" \ + "\214\305@\244\317c\367\375\361\322\377\377\377\1kkk\203::<\4;;=99;::" \ + "<;;=\203::<\1SSU\210\377\377\377\1\376\376\376\377\377\377\377\276\377" \ + "\377\377\1\316\316\316\202::<\1;;=\202::<\202;;=\202::<\4;;=::<\265\265" \ + "\267\376\376\376\307\377\377\377\3\376\376\376\377\377\377\265\265\267" \ + "\207::<\3""99;\266\266\270\376\376\377\202\377\377\377\1\376\376\376" \ + "\232\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \ + "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \ + "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \ + "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \ + "\214\306>\1\305\342\237\220\377\377\377\6\376\376\377\377\376\377\375" \ + "\376\377\376\377\377\377\377\375\375\377\376\203\377\377\377\27\377\377" \ + "\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215\305>\215\305" \ + "@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305>\215\306A\212" \ + "\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362\376\376\377\377" \ + "\375\376\321\377\377\377\1\346\346\346\204::<\1;;=\202::<\5;;=99;;;=" \ + "::<\266\266\266\205\377\377\377\202\376\376\376\2\377\377\377\376\376" \ + "\376\377\377\377\377\273\377\377\377\5\376\376\376\377\377\377kkm::<" \ + ";;=\202::<\1;;=\203::<\3;;=::\1\305\342\237" \ + "\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377" \ + "\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305" \ + "\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214" \ + "\305@\205\214\306>\1\305\342\237\220\377\377\377\7\377\377\375\375\376" \ + "\377\376\377\377\376\377\375\377\374\377\377\377\375\375\377\376\202" \ + "\377\377\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305>\202" \ + "\214\305@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307\77" \ + "\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362" \ + "\377\377\373\377\376\377\377\377\375\322\377\377\377\1\221\221\223\202" \ + "::<\12;;=99;::<;;=::<;;=99;;;=EEG\364\364\364\203\377\377\377\1\376\376" \ + "\376\202\377\377\377\1\376\376\376\377\377\377\377\275\377\377\377\2" \ + "\316\316\320;;=\205::<\2""99;;;=\203::<\3\316\316\316\377\377\377\376" \ + "\376\376\313\377\377\377\3\265\265\265;;=99;\202::<\1\266\266\270\203" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\232\377\377\377\1" \ + "\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \ + "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \ + "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \ + "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \ + "\221\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376\377" \ + "\377\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77\215" \ + "\307=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306\77" \ + "\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242" \ + "\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\322" \ + "\377\377\377\2\363\363\363FFH\203::<\202;;=\203::<\3;;=::<\235\235\235" \ + "\204\377\377\377\1\376\376\376\377\377\377\377\277\377\377\377\1__a\202" \ + "::<\1;;=\203::<\5;;=::<;;=::<\204\204\206\312\377\377\377\1\376\376\376" \ + "\202\377\377\377\7\376\376\376\377\377\377\265\265\267;;=99;\266\266" \ + "\270\376\376\377\203\377\377\377\202\376\376\376\233\377\377\377\1\304" \ + "\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235" \ + "\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307" \ + "\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214" \ + "\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\220" \ + "\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202" \ + "\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305" \ + ">\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212" \ + "\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377" \ + "\377\377\202\377\376\377\1\377\377\375\324\377\377\377\4\234\234\234" \ + ";;=::<<<>\204::<\1;;=\202::<\2FFH\363\363\363\204\377\377\377\1\376\376" \ + "\376\202\377\377\377\1\376\376\376\377\377\377\377\272\377\377\377\1" \ + "\265\265\265\202::<\5;;=99;::<;;=::<\202;;=\3""99;;;=\346\346\346\320" \ + "\377\377\377\2\264\264\266\265\265\267\203\377\377\377\202\376\376\376" \ + "\235\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \ + "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \ + "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \ + "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \ + "\214\306>\1\305\342\237\221\377\377\377\1\375\377\376\202\377\377\375" \ + "\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215" \ + "\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>" \ + "\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370" \ + "\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375" \ + "\377\376\377\320\377\377\377\1\376\376\376\203\377\377\377\2SSU;;=\203" \ + "::<\1;;=\203::<\3""99;::<\234\234\236\203\377\377\377\1\376\376\376\377" \ + "\377\377\377\276\377\377\377\5RRT99;;;=99;;;=\203::<\4""99;;;=::<\234" \ + "\234\236\314\377\377\377\1\376\376\376\212\377\377\377\1\376\376\376" \ + "\235\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \ + "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \ + "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \ + "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \ + "\214\306>\1\305\342\237\220\377\377\377\3\377\376\377\377\377\377\375" \ + "\377\376\202\377\377\377\11\373\373\363\241\321d\214\306>\213\310=\214" \ + "\306>\214\305@\213\310=\212\306@\217\304>\202\215\307=\14\214\306>\215" \ + "\305>\214\306>\215\305>\217\304@\215\307\77\215\307=\242\320c\367\375" \ + "\361\376\376\377\377\376\377\376\376\376\202\377\377\375\2\374\377\377" \ + "\377\376\377\324\377\377\377\3\265\265\265;;=99;\202;;=\1""99;\202;;" \ + "=\5::<;;=::\1\305\342\237\203\377\377" \ + "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \ + "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \ + "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \ + "\214\306>\1\305\342\237\220\377\377\377\1\377\377\375\202\377\377\377" \ + "\32\377\376\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215" \ + "\305>\215\305@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>" \ + "\215\306A\212\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377" \ + "\377\377\377\375\376\377\377\375\376\377\377\377\377\377\202\377\376" \ + "\377\326\377\377\377\1__a\203::<\1;;=\203::<\1;;=\202::<\1\234\234\234" \ + "\377\377\377\377\274\377\377\377\1\376\376\376\203\377\377\377\3SSU;" \ + ";=99;\210::<\1\234\234\234\365\377\377\377\7\376\377\375\304\341\236" \ + "\215\306A\214\305B\215\307=\212\307>\212\306@\230\214\305@\1\304\341" \ + "\236\203\377\377\377\4\341\362\320\214\306>\213\310\77\215\305@\231\214" \ + "\305@\2\215\307\77\252\322q\202\377\376\377\202\377\377\377\1\250\325" \ + "n\230\214\305@\3\215\305>\215\306A\215\307\77\202\214\306<\10\342\360" \ + "\317\376\377\377\377\377\375\376\377\377\305\342\240\215\305@\212\306" \ + "@\215\305>\202\214\305@\1\215\307=\220\214\305@\10\214\306>\212\306@" \ + "\216\306A\212\307>\215\305>\215\305@\214\305@\304\343\237\211\377\377" \ + "\377\10\376\376\377\377\377\375\377\377\377\377\377\375\377\377\377\377" \ + "\376\377\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322" \ + "b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305" \ + "@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214" \ + "\305@\244\317c\367\375\361\335\377\377\377\2\376\376\376\316\316\316" \ + "\211::<\3;;=GGI\363\363\365\203\377\377\377\1\376\376\376\377\377\377" \ + "\377\266\377\377\377\10\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\265\265\265;;=::<;;=\207::<\2GGI\363\363\363\364\377\377\377\7\377\376" \ + "\377\377\377\375\304\341\236\215\305>\215\307\77\214\306>\214\305@\231" \ + "\214\306>\7\304\343\237\377\377\377\375\376\377\377\377\375\341\360\321" \ + "\215\306A\214\305@\233\214\306>\6\252\324n\376\376\376\377\377\377\376" \ + "\377\377\377\376\377\252\324p\230\214\306>\7\215\306A\212\307>\214\306" \ + ">\212\307>\214\306>\343\361\320\376\377\377\202\377\377\377\7\305\342" \ + "\237\215\305>\213\310\77\214\306>\214\305@\212\306@\215\307\77\222\214" \ + "\306>\6\215\305>\212\307>\214\306>\215\307=\215\305@\305\342\237\210" \ + "\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377\377\377" \ + "\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241\321a" \ + "\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@\214\306" \ + ">\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215\307\77" \ + "\214\306>\242\322b\370\373\362\376\376\377\377\375\376\336\377\377\377" \ + "\1kkm\202::<\1;;=\205::<\202;;=\3\233\233\235\377\377\377\376\376\376" \ + "\377\377\377\377\274\377\377\377\3SSU99;;;=\20299;\1;;=\203::<\3;;=:" \ + ":<\234\234\236\366\377\377\377\7\376\377\375\305\342\240\213\304\77\213" \ + "\310\77\214\305@\215\306A\216\306=\230\214\306>\10\305\342\240\377\377" \ + "\375\376\377\377\377\376\377\341\360\317\214\306<\214\305@\212\306@\231" \ + "\214\306>\7\215\305@\252\324p\377\377\377\377\377\375\376\377\377\377" \ + "\376\374\252\324p\230\214\306>\7\212\307>\215\307\77\216\306A\212\307" \ + ">\213\304\77\343\361\320\377\377\375\202\377\377\377\3\307\342\237\214" \ + "\304\77\213\310\77\203\214\306>\1\215\307\77\220\214\306>\4\214\305@" \ + "\214\306<\215\304B\213\310\77\202\212\307>\2\215\305@\305\342\240\210" \ + "\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374" \ + "\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215" \ + "\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D" \ + "\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77" \ + "\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\331" \ + "\377\377\377\1\376\376\376\203\377\377\377\4\376\376\376\317\317\321" \ + "::<;;=\203::<\3;;=::<;;=\202::<\4FFH\363\363\363\377\377\377\376\376" \ + "\376\377\377\377\377\264\377\377\377\1\376\376\376\205\377\377\377\1" \ + "\265\265\267\202;;=\3::<99;;;=\202::<\202;;=\2::\231\214\306>\2\305\342\240\377\377\377\202\377\376\377\3\341" \ + "\362\316\216\306\77\214\306<\231\214\306>\3\215\305@\212\307>\252\324" \ + "p\203\377\377\377\2\377\376\377\247\324o\230\214\306>\20\215\306A\214" \ + "\305B\215\307\77\211\305\77\214\304;\342\362\315\377\377\377\377\376" \ + "\377\376\376\376\305\342\237\215\306A\210\307;\215\306A\216\306A\214" \ + "\306>\212\306@\220\214\306>\202\214\305@\6\216\305C\213\305=\214\305" \ + "B\215\307\77\216\306\77\303\344\237\211\377\377\377\37\376\377\377\376" \ + "\377\375\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377" \ + "\370\373\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<" \ + "\214\306>\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215" \ + "\305>\212\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376" \ + "\377\377\376\376\376\376\377\377\331\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\203\377\377\377\1kkm\202::<\6;;=::<;;=::<;;=::<\202" \ + ";;=\1\233\233\235\377\377\377\377\267\377\377\377\1\376\376\376\204\377" \ + "\377\377\2kkm;;=\202::<\2;;=::<\202;;=\203::<\5\265\265\267\377\377\377" \ + "\376\376\376\377\377\377\376\376\376\362\377\377\377\2\376\377\377\377" \ + "\376\377\202\377\377\377\202\377\376\377\2\377\377\377\377\377\375\231" \ + "\377\377\377\4\377\376\377\376\377\377\375\377\376\377\377\377\202\376" \ + "\377\377\231\377\377\377\10\374\377\375\377\376\377\377\377\375\376\376" \ + "\376\377\377\377\376\377\377\376\376\374\377\376\377\230\377\377\377" \ + "\1\377\376\377\203\377\377\375\4\376\377\377\377\375\377\377\377\377" \ + "\376\377\377\202\377\377\377\3\376\376\376\377\376\377\377\377\375\202" \ + "\376\377\377\1\377\377\375\220\377\377\377\10\377\377\375\377\377\377" \ + "\376\376\376\377\377\377\377\377\375\377\377\377\376\377\377\377\375" \ + "\377\210\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377" \ + "\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305" \ + "@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212" \ + "\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373" \ + "\362\377\377\377\202\377\376\377\1\377\377\375\340\377\377\377\1\316" \ + "\316\316\203::<\3;;=99;;;=\204::<\2FFH\363\363\363\202\377\377\377\1" \ + "\376\376\376\377\377\377\377\264\377\377\377\1\376\376\376\202\377\377" \ + "\377\1\316\316\320\206::<\1;;=\203::<\2SSU\376\376\376\366\377\377\377" \ + "\1\377\377\375\202\377\376\377\202\377\377\377\3\377\377\375\377\377" \ + "\377\376\377\377\230\377\377\377\202\376\377\377\6\377\377\375\377\377" \ + "\377\376\377\375\377\377\377\376\377\375\377\377\375\231\377\377\377" \ + "\2\376\377\377\377\377\375\202\377\377\377\1\376\376\376\232\377\377" \ + "\377\5\377\376\377\377\377\377\376\377\375\377\377\377\377\377\375\204" \ + "\377\377\377\202\376\377\377\1\376\376\376\202\377\377\377\202\376\377" \ + "\377\220\377\377\377\1\377\377\375\202\377\377\377\4\376\376\374\377" \ + "\376\377\377\377\377\376\377\375\212\377\377\377\1\375\377\376\202\377" \ + "\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212" \ + "\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<" \ + "\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244" \ + "\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377" \ + "\377\375\377\376\377\334\377\377\377\1\376\376\376\202\377\377\377\10" \ + "\376\376\376kkm::<;;=99;;;=::<;;=\202::<\202;;=\1\234\234\236\203\377" \ + "\377\377\1\376\376\376\377\377\377\377\262\377\377\377\5\376\376\376" \ + "\377\377\377\376\376\376\377\377\377lln\210::<\3""99;;;=\265\265\265" \ + "\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\370\377" \ + "\377\377\1\376\377\377\230\377\377\377\7\377\376\377\377\377\375\377" \ + "\376\377\376\376\377\377\377\375\377\377\377\377\377\375\233\377\377" \ + "\377\1\377\376\377\203\377\377\377\1\376\377\375\231\377\377\377\5\377" \ + "\377\375\377\377\377\377\377\375\377\377\377\377\377\375\202\377\377" \ + "\377\1\377\377\375\203\377\377\377\2\376\376\376\377\376\377\226\377" \ + "\377\377\5\377\377\375\377\377\377\376\377\377\377\377\375\376\377\377" \ + "\210\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \ + "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \ + "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \ + ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \ + "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\333\377\377" \ + "\377\1\376\376\376\202\377\377\377\3\376\376\376\377\377\377\316\316" \ + "\320\203::<\1;;=\202::<\1;;=\203::<\2FFH\377\377\377\202\376\376\376" \ + "\377\377\377\377\262\377\377\377\5\376\376\376\377\377\377\376\376\376" \ + "\377\377\377\332\332\332\206::<\1;;=\202::<\5;;=FFH\363\363\363\377\377" \ + "\377\376\376\376\203\377\377\377\1\376\376\376\365\377\377\377\1\377" \ + "\377\375\202\377\377\377\1\377\377\375\230\377\377\377\2\376\377\377" \ + "\377\377\375\204\377\377\377\2\377\376\377\376\377\375\230\377\377\377" \ + "\4\377\377\375\377\377\377\377\377\373\376\377\377\203\377\377\377\1" \ + "\377\376\377\230\377\377\377\13\376\377\377\377\377\375\377\377\377\376" \ + "\377\377\377\375\376\377\377\377\377\377\375\376\377\377\377\376\377" \ + "\377\377\377\376\376\376\202\377\377\377\1\377\377\375\226\377\377\377" \ + "\202\376\377\377\2\377\377\375\377\376\377\210\377\377\377\1\377\377" \ + "\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306>\213" \ + "\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215\307" \ + "=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<\244" \ + "\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377\377" \ + "\377\377\202\377\376\377\333\377\377\377\1\376\376\376\204\377\377\377" \ + "\11\376\376\376\377\377\377kkm::<;;=99;;;=::<;;=\202::<\3;;=::<\264\264" \ + "\264\377\377\377\377\265\377\377\377\1\376\376\376\202\377\377\377\1" \ + "\204\204\204\203::<\1;;=\206::<\1\235\235\237\377\377\377\377\377\377" \ + "\377\377\203\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377" \ + "\375\377\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377" \ + "\6\370\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305" \ + "@\4\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214" \ + "\306>\215\307\77\214\305@\244\317c\367\375\361\352\377\377\377\1\316" \ + "\316\316\203::<\1;;=\203::<\202;;=\2::\215\305>\215" \ + "\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305>\215\306" \ + "A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362\376\376" \ + "\377\377\375\376\352\377\377\377\2kkm;;=\207::<\3;;=::<\301\301\301\377" \ + "\377\377\377\266\377\377\377\2\221\221\221;;=\202::<\202;;=\202::<\1" \ + ";;=\202::<\1\235\235\237\377\377\377\377\377\377\377\377\203\377\377" \ + "\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374\377\377" \ + "\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215\307\77" \ + "\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D\216\306" \ + "\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77\215\305" \ + "@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\350\377\377" \ + "\377\4\376\376\376\377\377\377\265\265\26799;\203::<\3;;=::<;;=\203:" \ + ":<\2kkk\376\376\376\377\377\377\377\264\377\377\377\2\362\362\362FFH" \ + "\202::<\1;;=\203::<\5;;=::<;;=::<\363\363\363\377\377\377\377\377\377" \ + "\377\377\204\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377" \ + "\376\377\377\375\377\377\377\377\376\377\370\373\362\241\321a\215\307" \ + "\77\215\307=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216" \ + "\306\77\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306" \ + ">\242\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377" \ + "\352\377\377\377\2\376\376\376TTV\204::<\7;;=99;::<;;=99;::<\332\332" \ + "\332\377\377\377\377\263\377\377\377\3\376\376\376\266\266\266;;=\203" \ + "::<\202;;=\204::<\1\205\205\207\377\377\377\377\377\377\377\377\204\377" \ + "\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202\377" \ + "\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305>" \ + "\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212\310" \ + "\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377\377" \ + "\377\202\377\376\377\1\377\377\375\354\377\377\377\2\265\265\267::<\202" \ + ";;=\205::<\4;;=::<\204\204\204\376\376\376\377\377\377\377\263\377\377" \ + "\377\1SSU\202::<\1;;=\206::<\2;;=\346\346\346\377\377\377\377\377\377" \ + "\377\377\205\377\377\377\1\375\377\376\202\377\377\375\34\377\377\377" \ + "\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214\306" \ + ">\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77\213" \ + "\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362\377" \ + "\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376\377" \ + "\354\377\377\377\4FFH;;=99;;;=\203::<\5;;=99;;;=99;\364\364\364\377\377" \ + "\377\377\262\377\377\377\1\316\316\316\202;;=\1""99;\203::<\1;;=\203" \ + "::<\1xxz\377\377\377\377\377\377\377\377\205\377\377\377\3\377\376\377" \ + "\377\377\377\375\377\376\202\377\377\377\11\373\373\363\241\321d\214" \ + "\306>\213\310=\214\306>\214\305@\213\310=\212\306@\217\304>\202\215\307" \ + "=\14\214\306>\215\305>\214\306>\215\305>\217\304@\215\307\77\215\307" \ + "=\242\320c\367\375\361\376\376\377\377\376\377\376\376\376\202\377\377" \ + "\375\2\374\377\377\377\376\377\354\377\377\377\1\235\235\237\204::<\1" \ + "<<>\202::<\4;;=::<;;=\247\247\251\377\377\377\377\262\377\377\377\4\204" \ + "\204\204;;=::<;;=\206::<\2;;=\316\316\316\377\377\377\377\377\377\377" \ + "\377\205\377\377\377\1\377\377\375\202\377\377\377\32\377\376\377\370" \ + "\373\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215\305@\214" \ + "\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A\212\306@" \ + "\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377\375" \ + "\376\377\377\375\376\377\377\377\377\377\202\377\376\377\355\377\377" \ + "\377\1\363\363\363\212::<\1TTV\377\377\377\377\261\377\377\377\5\347" \ + "\347\351::<;;=::<;;=\204::<\3;;=::\6\212\307>\214\306>\215\307\77\214\305" \ + "@\244\317c\367\375\361\361\377\377\377\1\376\376\376\204\377\377\377" \ + "\1\204\204\204\202;;=\203::<\1;;=\202::<\202;;=\1\302\302\302\203\377" \ + "\377\377\1\376\376\376\377\377\377\377\244\377\377\377\1\376\376\376" \ + "\203\377\377\377\1\376\376\376\203\377\377\377\1\234\234\236\202::<\1" \ + ";;=\204::<\6;;=::<;;=\264\264\264\377\377\377\376\376\376\377\377\377" \ + "\377\373\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377" \ + "\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241" \ + "\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@" \ + "\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215" \ + "\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\365\377" \ + "\377\377\1\332\332\332\202::<\1;;=\202::<\6""99;::<;;=99;;;=xxx\205\377" \ + "\377\377\1\376\376\376\377\377\377\377\243\377\377\377\1\376\376\376" \ + "\206\377\377\377\4SSU;;=::<;;=\202::<\1;;=\203::<\3GGI\362\362\362\376" \ + "\376\376\377\377\377\377\374\377\377\377\7\377\377\375\375\376\377\376" \ + "\377\377\376\377\375\377\374\377\377\377\375\375\377\376\202\377\377" \ + "\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305>\202\214\305" \ + "@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307\77\214\306" \ + ">\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362\377\377" \ + "\373\377\376\377\377\377\375\364\377\377\377\3\376\376\376\377\377\377" \ + "__a\203::<\202;;=\6::<99;;;=::<;;=\345\345\345\203\377\377\377\1\376" \ + "\376\376\377\377\377\377\245\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\202\377\377\377\2\316\316\316::<\202;;=\205::<\202;;=\1\203" \ + "\203\205\204\377\377\377\1\376\376\376\377\377\377\377\372\377\377\377" \ + "\37\376\377\377\376\377\375\377\375\376\375\377\376\377\377\375\377\377" \ + "\377\377\376\377\370\373\362\241\321a\215\307\77\215\307=\214\305@\214" \ + "\306>\212\307<\214\306>\214\306<\214\306>\216\306\77\215\305<\212\307" \ + ">\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321a\373\374\364" \ + "\377\377\377\376\377\377\376\376\376\376\377\377\362\377\377\377\202" \ + "\376\376\376\3\377\377\377\376\376\376\265\265\267\202::<\1;;=\207::" \ + "<\3\251\251\253\377\377\377\376\376\376\203\377\377\377\1\376\376\376" \ + "\377\377\377\377\247\377\377\377\2\376\376\376\204\204\206\207::<\1;" \ + ";=\202::<\3\346\346\346\377\377\377\376\376\376\377\377\377\377\374\377" \ + "\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202\377" \ + "\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305>" \ + "\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212\310" \ + "\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377\377" \ + "\377\202\377\376\377\1\377\377\375\364\377\377\377\17\376\376\376\377" \ + "\377\377\376\376\376\377\377\377FFH;;=99;::<;;=::<;;=99;;;=::\214" \ + "\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77" \ + "\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \ + "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \ + "\377\361\377\377\377\202\376\376\376\2\377\377\377\376\376\376\202\377" \ + "\377\377\1\221\221\221\205::<\202;;=\5::<;;=99;\316\316\320\376\376\376" \ + "\377\377\377\377\250\377\377\377\1\376\376\376\202\377\377\377\4\266" \ + "\266\270::<99;;;=\203::<\1;;=\203::<\1\265\265\265\377\377\377\377\377" \ + "\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377\11" \ + "\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310=\212" \ + "\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305>\217" \ + "\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376\377" \ + "\376\376\376\202\377\377\375\2\374\377\377\377\376\377\360\377\377\377" \ + "\1\376\376\376\202\377\377\377\202\376\376\376\202\377\377\377\6\346" \ + "\346\346;;=99;::<99;;;=\204::<\2;;=\204\204\206\202\377\377\377\1\376" \ + "\376\376\377\377\377\377\251\377\377\377\1__a\203::<\3;;=::<;;=\203:" \ + ":<\4FFF\363\363\363\377\377\377\376\376\376\377\377\377\377\375\377\377" \ + "\377\1\377\377\375\202\377\377\377\32\377\376\377\370\373\364\243\322" \ + "b\214\306>\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212" \ + "\307<\215\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>" \ + "\212\307<\244\317c\370\373\364\377\377\377\377\375\376\377\377\375\376" \ + "\377\377\377\377\377\202\377\376\377\371\377\377\377\4^^`;;=::<;;=\202" \ + "::<\5;;=::<;;=::\6\212\307>\214\306" \ + ">\215\307\77\214\305@\244\317c\367\375\361\377\377\377\377\202\377\377" \ + "\377\3\265\265\267::<;;=\204::<\1;;=\202::<\2;;=\265\265\265\202\377" \ + "\377\377\1\376\376\376\377\377\377\377\246\377\377\377\2\376\376\376" \ + "\234\234\234\202;;=\203::<\1;;=\202::<\3""99;::<\332\332\332\377\377" \ + "\377\377\370\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377" \ + "\377\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366" \ + "\241\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306" \ + "@\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215" \ + "\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\377\377" \ + "\377\377\5\377\377\377\363\363\365;;=::<;;=\202::<\3;;=::<;;=\202::<" \ + "\3xxz\377\377\377\376\376\376\377\377\377\377\246\377\377\377\3\376\376" \ + "\376\377\377\377SSS\202::<\1;;=\202::<\1;;=\202::<\6;;=SSU\377\377\377" \ + "\376\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376\376\377" \ + "\377\377\377\362\377\377\377\7\377\377\375\375\376\377\376\377\377\376" \ + "\377\375\377\374\377\377\377\375\375\377\376\202\377\377\377\5\372\373" \ + "\366\240\320b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212" \ + "\306@\214\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306" \ + ">\215\307\77\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377" \ + "\377\375\377\377\377\377\11\377\377\377\376\376\376\204\204\206;;=::" \ + "<99;;;=::<;;=\204::<\3\362\362\362\377\377\377\376\376\376\377\377\377" \ + "\377\246\377\377\377\1\333\333\333\203::<\202;;=\202::<\5<<>99;::<\250" \ + "\250\252\376\376\376\203\377\377\377\1\376\376\376\377\377\377\377\365" \ + "\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376\377\377" \ + "\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77\215\307" \ + "=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306\77\215" \ + "\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321" \ + "a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\377\377" \ + "\377\377\202\377\377\377\1\301\301\301\202::<\1;;=\203::<\1;;=\203::" \ + "<\1\266\266\270\377\377\377\377\250\377\377\377\2\220\220\220;;=\204" \ + "::<\6;;=::<99;;;=::<\346\346\346\205\377\377\377\1\376\376\376\377\377" \ + "\377\377\363\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376" \ + "\377\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214" \ + "\305@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>" \ + "\212\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370" \ + "\373\362\377\377\377\202\377\376\377\1\377\377\375\377\377\377\377\204" \ + "\377\377\377\2TTV99;\202::<\1;;=\202::<\6;;=::<;;=__a\377\377\377\376" \ + "\376\376\377\377\377\377\244\377\377\377\3\376\376\376\377\377\377TT" \ + "V\207::<\3;;=99;```\377\377\377\377\373\377\377\377\1\375\377\376\202" \ + "\377\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307" \ + "B\212\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214" \ + "\306<\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307" \ + ">\244\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377" \ + "\377\377\375\377\376\377\377\377\377\377\203\377\377\377\3\221\221\221" \ + "::<;;=\202::<\202;;=\203::<\2;;=\345\345\347\377\377\377\377\246\377" \ + "\377\377\4\332\332\332;;=::<;;=\203::<\1;;=\203::<\1\265\265\265\203" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\364" \ + "\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377\11" \ + "\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310=\212" \ + "\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305>\217" \ + "\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376\377" \ + "\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377\377" \ + "\202\377\377\377\5\376\376\376\332\332\332;;=::<;;=\202::<\6;;=::<;;" \ + "=99;::<\250\250\252\377\377\377\377\244\377\377\377\6\376\376\376\377" \ + "\377\377\221\221\223::<;;=99;\202::<\3;;=::<;;=\202::<\1\363\363\363" \ + "\377\377\377\377\372\377\377\377\1\377\377\375\202\377\377\377\32\377" \ + "\376\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215" \ + "\305@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A" \ + "\212\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377" \ + "\377\375\376\377\377\375\376\377\377\377\377\377\202\377\376\377\377" \ + "\377\377\377\204\377\377\377\2\376\376\376SSU\204::<\204;;=\2::<__a\377" \ + "\377\377\377\243\377\377\377\6\376\376\376\377\377\377\376\376\376TT" \ + "V99;;;=\204::<\4;;=99;<<>xxz\377\377\377\377\364\377\377\377\10\376\376" \ + "\377\377\377\375\377\377\377\377\377\375\377\377\377\377\376\377\377" \ + "\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211\307B" \ + "\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214\306" \ + "<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305@\244" \ + "\317c\367\375\361\377\377\377\377\213\377\377\377\5\376\376\376\377\377" \ + "\377\221\221\223::<;;=\204::<\5;;=::<;;=::<\363\363\363\204\377\377\377" \ + "\1\376\376\376\202\377\377\377\202\376\376\376\377\377\377\377\233\377" \ + "\377\377\5\332\332\332::<;;=99;<<>\202::<\1;;=\203::<\1\265\265\267\377" \ + "\377\377\377\363\377\377\377\6\376\376\377\377\376\377\375\376\377\376" \ + "\377\377\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373" \ + "\366\241\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212" \ + "\306@\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306" \ + ">\215\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\377" \ + "\377\377\377\213\377\377\377\2\375\375\375\333\333\333\202::<\1;;=\202" \ + "::<\1;;=\202::<\3""99;::<\265\265\265\206\377\377\377\3\376\376\376\377" \ + "\377\377\376\376\376\377\377\377\377\233\377\377\377\2\235\235\23599" \ + ";\202;;=\1""99;\202;;=\202::<\3;;=::<\363\363\365\377\377\377\377\363" \ + "\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374" \ + "\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215" \ + "\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D" \ + "\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77" \ + "\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\377" \ + "\377\377\377\214\377\377\377\2\376\376\376SSU\207::<\3;;=::\212\307<\214\306>\214\306<\214\306>\216\306" \ + "\77\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>" \ + "\242\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377" \ + "\377\377\377\377\212\377\377\377\4\376\376\376\377\377\377\376\376\376" \ + "\222\222\222\205::<\1;;=\20299;\202::<\3\363\363\363\377\377\377\376" \ + "\376\376\377\377\377\377\240\377\377\377\1\346\346\346\202::<\1;;=\204" \ + "::<\1;;=\202::<\1\250\250\252\202\377\377\377\1\376\376\376\377\377\377" \ + "\377\361\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377" \ + "\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305" \ + "@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212" \ + "\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373" \ + "\362\377\377\377\202\377\376\377\1\377\377\375\377\377\377\377\212\377" \ + "\377\377\1\376\376\376\203\377\377\377\2\332\332\332<<>\203::<\3;;=:" \ + ":<<<>\203::<\2\301\301\303\376\376\376\202\377\377\377\5\376\376\376" \ + "\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377\377\231" \ + "\377\377\377\4\376\376\376\251\251\253::<;;=\204::<\5;;=::<99;::<\346" \ + "\346\346\377\377\377\377\365\377\377\377\1\375\377\376\202\377\377\375" \ + "\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215" \ + "\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>" \ + "\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370" \ + "\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375" \ + "\377\376\377\377\377\377\377\212\377\377\377\1\376\376\376\203\377\377" \ + "\377\1SSS\207::<\3;;=::<\205\205\207\205\377\377\377\1\376\376\376\377" \ + "\377\377\377\234\377\377\377\3wwy::<;;=\206::<\2;;=__a\377\377\377\377" \ + "\365\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \ + "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \ + "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \ + ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \ + "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377" \ + "\377\211\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\204" \ + "\204\204::<\202;;=\1::<\202;;=\203::<\1SSU\204\377\377\377\1\376\376" \ + "\376\377\377\377\377\235\377\377\377\1;;=\203::<\1;;=\202::<\1;;=\202" \ + "::<\1\234\234\234\202\377\377\377\1\376\376\376\377\377\377\377\362\377" \ + "\377\377\1\377\377\375\202\377\377\377\32\377\376\377\370\373\364\243" \ + "\322b\214\306>\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305" \ + "B\212\307<\215\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214" \ + "\306>\212\307<\244\317c\370\373\364\377\377\377\377\375\376\377\377\375" \ + "\376\377\377\377\377\377\202\377\376\377\377\377\377\377\212\377\377" \ + "\377\1\376\376\376\204\377\377\377\6\301\301\301;;=::<;;=::<;;=\205:" \ + ":<\1\333\333\333\202\377\377\377\1\376\376\376\377\377\377\377\231\377" \ + "\377\377\1\376\376\376\203\377\377\377\1\301\301\303\204::<\1;;=\202" \ + "::<\1:9>\202::<\1\332\332\332\377\377\377\377\356\377\377\377\10\376" \ + "\376\377\377\377\375\377\377\377\377\377\375\377\377\377\377\376\377" \ + "\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211\307" \ + "B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214\306" \ + "<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305@\244" \ + "\317c\367\375\361\377\377\377\377\230\377\377\377\2""99;;;=\210::<\1" \ + "\250\250\250\377\377\377\377\240\377\377\377\3\221\221\223::<;;=\207" \ + "::<\2SSU\376\376\376\377\377\377\377\355\377\377\377\6\376\376\377\377" \ + "\376\377\375\376\377\376\377\377\377\377\375\375\377\376\203\377\377" \ + "\377\27\377\377\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215" \ + "\305>\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305" \ + ">\215\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362" \ + "\376\376\377\377\375\376\377\377\377\377\227\377\377\377\1yy{\211::<" \ + "\6lll\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376\377" \ + "\377\377\377\224\377\377\377\202\376\376\376\7\377\377\377\376\376\376" \ + "\377\377\377\376\376\376\377\377\377__a;;=\202::<\4<<>;;=::<;;=\202:" \ + ":<\1\204\204\206\203\377\377\377\1\376\376\376\377\377\377\377\352\377" \ + "\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374\377" \ + "\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215\307" \ + "\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D\216" \ + "\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77\215" \ + "\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\377\377" \ + "\377\377\221\377\377\377\3\376\376\376\377\377\377\376\376\376\203\377" \ + "\377\377\1\265\265\267\212::<\1\363\363\363\377\377\377\377\227\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377\1\345" \ + "\345\345\202::<\202;;=\1""99;\203::<\4;;=::<\301\301\301\376\376\376" \ + "\203\377\377\377\1\376\376\376\377\377\377\377\352\377\377\377\37\376" \ + "\377\377\376\377\375\377\375\376\375\377\376\377\377\375\377\377\377" \ + "\377\376\377\370\373\362\241\321a\215\307\77\215\307=\214\305@\214\306" \ + ">\212\307<\214\306>\214\306<\214\306>\216\306\77\215\305<\212\307>\213" \ + "\307A\215\305>\212\307>\215\307\77\214\306>\242\321a\373\374\364\377" \ + "\377\377\376\377\377\376\376\376\376\377\377\377\377\377\377\222\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\1\347" \ + "\347\347\212::<\1\302\302\304\205\377\377\377\1\376\376\376\377\377\377" \ + "\377\222\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202" \ + "\377\377\377\5\265\265\265::<;;=99;;;=\203::<\1;;=\202::<\1\363\363\363" \ + "\377\377\377\377\356\377\377\377\202\377\377\375\3\377\374\377\375\377" \ + "\376\376\377\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212" \ + "\306@\214\305@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B" \ + "\214\306>\212\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242" \ + "\322b\370\373\362\377\377\377\202\377\376\377\1\377\377\375\377\377\377" \ + "\377\230\377\377\377\2\376\376\376TTT\211::<\3\221\221\223\377\377\377" \ + "\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377\231\377\377" \ + "\377\2\204\204\204::<\202;;=\202::<\1;;=\203::<\2``b\376\376\376\377" \ + "\377\377\377\357\377\377\377\1\375\377\376\202\377\377\375\34\377\377" \ + "\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214" \ + "\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77" \ + "\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \ + "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \ + "\377\377\377\377\377\225\377\377\377\1\376\376\376\202\377\377\377\1" \ + "\221\221\221\210::<\2;;=__a\202\377\377\377\1\376\376\376\377\377\377" \ + "\377\227\377\377\377\1\376\376\376\203\377\377\377\1SSU\202::<\1;;=\204" \ + "::<\202;;=\1\234\234\234\204\377\377\377\1\376\376\376\377\377\377\377" \ + "\352\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \ + "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \ + "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \ + ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \ + "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377" \ + "\377\222\377\377\377\1\376\376\376\205\377\377\377\1\301\301\301\210" \ + "::<\4""99;;;=\364\364\366\376\376\376\377\377\377\377\233\377\377\377" \ + "\1\346\346\346\207::<\4;;=99;::<\316\316\316\203\377\377\377\1\376\376" \ + "\376\377\377\377\377\353\377\377\377\1\377\377\375\202\377\377\377\32" \ + "\377\376\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215\305" \ + ">\215\305@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215" \ + "\306A\212\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377" \ + "\377\377\375\376\377\377\375\376\377\377\377\377\377\202\377\376\377" \ + "\377\377\377\377\224\377\377\377\1\376\376\376\204\377\377\377\1\363" \ + "\363\363\210::<\3;;=::<\302\302\304\377\377\377\377\231\377\377\377\1" \ + "\376\376\376\202\377\377\377\1\266\266\270\203::<\203;;=\203::<\1:::" \ + "\377\377\377\377\351\377\377\377\10\376\376\377\377\377\375\377\377\377" \ + "\377\377\375\377\377\377\377\376\377\377\377\375\376\377\377\202\377" \ + "\377\377\6\370\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202" \ + "\215\305@\4\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212" \ + "\307>\214\306>\215\307\77\214\305@\244\317c\367\375\361\377\377\377\377" \ + "\242\377\377\377\3__a::<;;=\207::<\1\221\221\221\377\377\377\377\234" \ + "\377\377\377\1\204\204\206\204::<\202;;=\203::<\1lll\203\377\377\377" \ + "\1\375\375\375\377\377\377\377\344\377\377\377\6\376\376\377\377\376" \ + "\377\375\376\377\376\377\377\377\377\375\375\377\376\203\377\377\377" \ + "\27\377\377\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215\305" \ + ">\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305>\215" \ + "\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362\376" \ + "\376\377\377\375\376\377\377\377\377\241\377\377\377\2\221\221\223;;" \ + "=\202::<\202;;=\203::<\2;;=^^^\204\377\377\377\1\376\376\376\377\377" \ + "\377\377\224\377\377\377\1\376\376\376\202\377\377\377\1``b\202::<\1" \ + ";;=\206::<\1\234\234\234\205\377\377\377\1\376\376\376\377\377\377\377" \ + "\342\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377" \ + "\374\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320" \ + "b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214" \ + "\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307" \ + "\77\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375" \ + "\377\377\377\377\241\377\377\377\6\301\301\303::<;;=::<99;;;=\203::<" \ + "\6;;=:::\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\377\224\377\377\377\1\376\376\376\202\377\377\377\2\363\363\363;;=\211" \ + "::<\1\316\316\316\203\377\377\377\1\376\376\376\202\377\377\377\1\376" \ + "\376\376\377\377\377\377\342\377\377\377\37\376\377\377\376\377\375\377" \ + "\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373\362" \ + "\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306>\214" \ + "\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212\307" \ + ">\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377\376" \ + "\376\376\376\377\377\377\377\377\377\241\377\377\377\1\363\363\365\202" \ + "::<\1;;=\202::<\2""99;;;=\202::<\2;;=\316\316\316\377\377\377\377\231" \ + "\377\377\377\10\376\376\376\316\316\316::<;;=::<;;=99;;;=\204::<\202" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\344" \ + "\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202" \ + "\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305" \ + ">\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212" \ + "\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377" \ + "\377\377\202\377\376\377\1\377\377\375\377\377\377\377\243\377\377\377" \ + "\1``b\203::<\203;;=\6::<<<>::<\234\234\234\377\377\377\376\376\376\377" \ + "\377\377\377\230\377\377\377\1\234\234\236\204::<\12;;=99;::<;;=::\214\306>\212\307>\214" \ + "\305@\217\304>\212\307<\214\306<\214\306>\215\307\77\213\307A\214\306" \ + ">\215\305@\215\307\77\212\307>\244\317c\370\373\362\377\377\373\376\377" \ + "\377\377\376\377\375\376\377\377\377\375\377\376\377\377\377\377\377" \ + "\242\377\377\377\2\222\222\222::<\202;;=\7""99;::<;;=::<99;;;=lln\202" \ + "\377\377\377\1\376\376\376\377\377\377\377\225\377\377\377\3\376\376" \ + "\376\377\377\377jjl\204;;=\2""99;;;=\202::<\2;;=\221\221\223\202\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377" \ + "\343\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \ + "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \ + "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \ + ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \ + "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377" \ + "\377\242\377\377\377\2\264\264\264;;=\206::<\6;;=::\213\310\77\214\305@\215\305>\215\305@\214\306" \ + ">\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A\212\306@\212" \ + "\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377\375\376" \ + "\377\377\375\376\377\377\377\377\377\202\377\376\377\377\377\377\377" \ + "\243\377\377\377\2\346\346\346;;=\211::<\1\346\346\350\377\377\377\377" \ + "\230\377\377\377\3\346\346\350::<;;=\202::<\1;;=\205::<\1\346\346\346" \ + "\302\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376" \ + "\376\376\377\377\377\377\233\377\377\377\10\376\376\377\377\377\375\377" \ + "\377\377\377\377\375\377\377\377\377\376\377\377\377\375\376\377\377" \ + "\202\377\377\377\6\370\373\362\243\322b\211\307B\213\310=\214\305@\214" \ + "\306<\202\215\305@\4\214\306<\214\305@\214\306<\215\307\77\202\214\306" \ + ">\6\212\307>\214\306>\215\307\77\214\305@\244\317c\367\375\361\345\377" \ + "\377\377\1\376\376\376\305\377\377\377\3FFF::<;;=\202::<\3;;=::<;;=\202" \ + "::<\1\301\301\303\377\377\377\377\230\377\377\377\4\301\301\30399;::" \ + "<;;=\204::<\3;;=::\215\305>\215\305@\213\310=\212\306@\214\306>" \ + "\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215\307\77\214" \ + "\306>\242\322b\370\373\362\376\376\377\377\375\376\341\377\377\377\5" \ + "\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376\265\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\212\377\377\377\3\376" \ + "\376\376\377\377\377lll\206::<\202;;=\2::<\234\234\236\377\377\377\377" \ + "\224\377\377\377\1\376\376\376\203\377\377\377\2\233\233\235;;=\203:" \ + ":<\2""99;;;=\202::<\2;;=xxz\213\377\377\377\1\376\376\376\265\377\377" \ + "\377\1\376\376\376\377\377\377\377\240\377\377\377\7\377\377\375\375" \ + "\376\377\376\377\377\376\377\375\377\374\377\377\377\375\375\377\376" \ + "\202\377\377\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305>" \ + "\202\214\305@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307" \ + "\77\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362" \ + "\377\377\373\377\376\377\377\377\375\377\377\377\377\233\377\377\377" \ + "\3\376\376\376\377\377\377\376\376\376\213\377\377\377\6\376\376\376" \ + "\377\377\377\233\233\233;;=::<;;=\206::<\1lln\377\377\377\377\226\377" \ + "\377\377\3\376\376\376\377\377\377kkm\210::<\2;;=\234\234\236\214\377" \ + "\377\377\1\315\315\315\202\234\234\234\262\234\234\236\2\234\234\234" \ + "\265\265\265\377\377\377\377\240\377\377\377\37\376\377\377\376\377\375" \ + "\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373" \ + "\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306" \ + ">\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212" \ + "\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377" \ + "\376\376\376\376\377\377\344\377\377\377\4\376\376\376\347\347\347\234" \ + "\234\234\235\235\235\260\234\234\236\204\234\234\234\216\377\377\377" \ + "\1\301\301\301\202::<\1;;=\203::<\202;;=\2::\212\307>\212\306@\214\305B" \ + "\214\305@\214\305B\214\306>\212\307>\212\310\77\214\306>\217\304@\214" \ + "\306>\214\305@\242\322b\370\373\362\377\377\377\202\377\376\377\1\377" \ + "\377\375\346\377\377\377\2\316\316\316:::\263::<\4;;=:::\377\377\377" \ + "\376\376\376\214\377\377\377\3\346\346\346::<;;=\205::<\4;;=::<;;=\346" \ + "\346\346\377\377\377\377\226\377\377\377\2\362\362\362;;=\204::<\3""9" \ + "9;::<;;=\202::<\1\346\346\350\214\377\377\377\2\234\234\234;;=\264::" \ + "<\1kkm\377\377\377\377\240\377\377\377\1\375\377\376\202\377\377\375" \ + "\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215" \ + "\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>" \ + "\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370" \ + "\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375" \ + "\377\376\377\345\377\377\377\2\316\316\31699;\265::<\216\377\377\377" \ + "\2\376\376\376FFH\203::<\1;;=\203::<\3;;=99;\316\316\316\377\377\377" \ + "\377\226\377\377\377\1\317\317\317\206::<\202;;=\4""99;FFH\377\377\377" \ + "\376\376\376\213\377\377\377\1\234\234\236\202::<\1;;=\261::<\2;;=kk" \ + "m\205\377\377\377\1\376\376\376\377\377\377\377\231\377\377\377\3\377" \ + "\376\377\377\377\377\375\377\376\202\377\377\377\11\373\373\363\241\321" \ + "d\214\306>\213\310=\214\306>\214\305@\213\310=\212\306@\217\304>\202" \ + "\215\307=\14\214\306>\215\305>\214\306>\215\305>\217\304@\215\307\77" \ + "\215\307=\242\320c\367\375\361\376\376\377\377\376\377\376\376\376\202" \ + "\377\377\375\2\374\377\377\377\376\377\345\377\377\377\1\316\316\316" \ + "\264::<\202;;=\215\377\377\377\4\376\376\376\377\377\377lln99;\210::" \ + "<\2\234\234\234\376\376\376\377\377\377\377\225\377\377\377\5\234\234" \ + "\234::<;;=99;::<\202;;=\5::<;;=::\261::<\1kkm\377\377\377\377\237\377\377\377\1\377" \ + "\377\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306" \ + ">\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215" \ + "\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<" \ + "\244\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377" \ + "\377\377\377\202\377\376\377\346\377\377\377\1\316\316\316\266::<\217" \ + "\377\377\377\2\234\234\236;;=\206::<\3""99;;;=www\377\377\377\377\226" \ + "\377\377\377\3\204\204\206::<;;=\207::<\3\222\222\222\377\377\377\376" \ + "\376\376\213\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\210" \ + "\377\377\377\7\376\376\376\377\377\377\377\377\375\376\377\375\376\377" \ + "\377\377\377\377\377\376\377\203\377\377\377\1\376\376\376\203\377\377" \ + "\377\1\376\377\377\203\377\377\377\16\377\377\375\377\377\377\377\376" \ + "\377\377\377\377\377\377\373\376\377\377\377\377\377\377\377\373\371" \ + "\372\364\242\322d\214\306<\215\307\77\214\305@\214\306<\202\215\305@" \ + "\4\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214" \ + "\306>\215\307\77\214\305@\244\317c\367\375\361\356\377\377\377\1\316" \ + "\316\316\266::<\214\377\377\377\1\376\376\376\202\377\377\377\1\266\266" \ + "\266\202::<\1;;=\203::<\1;;=\202::<\3__a\377\377\377\376\376\376\377" \ + "\377\377\377\224\377\377\377\2kkm;;=\202::<\202;;=\202::<\3;;=::<\265" \ + "\265\265\215\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\214" \ + "\377\377\377\2\376\377\377\376\377\375\202\377\377\375\203\377\377\377" \ + "\204\377\377\375\205\377\377\377\1\376\376\377\202\377\377\377\6\377" \ + "\377\375\377\377\377\371\372\362\242\320c\214\305@\215\305@\202\214\306" \ + ">\20\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305" \ + ">\215\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362" \ + "\376\376\377\377\375\376\355\377\377\377\1\316\316\316\266::<\215\377" \ + "\377\377\4\376\376\376\377\377\377\315\315\315;;=\203::<\1;;=\203::<" \ + "\2;;=99;\377\377\377\377\226\377\377\377\203::<\1;;=\202::<\1;;=\203" \ + "::<\2\317\317\317\376\376\376\214\377\377\377\1\234\234\236\265::<\1" \ + "kkm\377\377\377\377\211\377\377\377\3\376\376\376\377\376\377\377\377" \ + "\377\203\377\376\377\204\377\377\377\1\376\376\376\202\377\377\377\1" \ + "\377\376\377\203\377\377\377\1\376\376\376\203\377\377\377\31\376\376" \ + "\377\377\376\377\371\372\365\241\322e\212\307<\216\306\77\212\311<\216" \ + "\303\77\212\307>\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307" \ + "\77\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362" \ + "\377\377\373\377\376\377\377\377\375\355\377\377\377\1\316\316\316\266" \ + "::<\220\377\377\377\202::<\4;;=::<;;=::<\202;;=\3""99;;;=\346\346\346" \ + "\377\377\377\377\224\377\377\377\2\362\362\362;;=\202::<\7""99;::<;;" \ + "=88:;;=::<;;=\216\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377" \ + "\212\377\377\377\202\376\377\377\202\377\377\377\1\377\376\377\206\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377" \ + "\1\376\376\376\202\377\377\377\6\370\373\364\242\322b\214\306>\214\305" \ + "@\215\305>\214\305@\202\215\306A\20\214\306<\214\306>\216\306\77\215" \ + "\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321" \ + "a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\355\377" \ + "\377\377\1\316\316\316\266::<\216\377\377\377\6\376\376\376\377\377\377" \ + "SSU;;=99;;;=\206::<\1\316\316\316\377\377\377\377\224\377\377\377\2\316" \ + "\316\31699;\205::<\1;;=\202::<\1FFH\216\377\377\377\1\234\234\236\265" \ + "::<\1kkm\377\377\377\377\207\377\377\377\202\377\376\377\2\377\377\377" \ + "\377\377\375\203\377\377\377\1\376\377\375\202\377\377\375\203\377\377" \ + "\377\202\377\377\375\2\377\377\377\377\377\375\205\377\377\377\26\377" \ + "\377\375\371\372\362\243\322b\211\305A\215\305>\215\307\77\214\305@\214" \ + "\306>\215\305@\212\307>\214\305@\214\305B\214\306>\212\307>\212\310\77" \ + "\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377\377\377" \ + "\202\377\376\377\1\377\377\375\356\377\377\377\1\316\316\316\266::<\220" \ + "\377\377\377\3kkm::<;;=\202::<\6;;=::<;;=::<;;=\233\233\233\377\377\377" \ + "\377\223\377\377\377\2\376\376\376\265\265\265\205::<\1;;=\202::<\2""9" \ + "9;lln\216\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\207\377" \ + "\377\377\3\376\377\375\375\377\376\377\377\377\202\377\376\377\3\377" \ + "\376\374\377\377\377\376\377\377\202\377\377\377\1\377\377\375\204\377" \ + "\377\377\2\375\377\376\377\377\375\202\377\377\377\1\377\377\375\202" \ + "\377\377\377\32\376\376\374\365\367\354\223\312K\215\305>\214\306<\211" \ + "\305\77\214\306>\212\307>\215\307\77\214\306>\214\306<\214\306>\215\307" \ + "\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \ + "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \ + "\377\355\377\377\377\1\316\316\316\266::<\217\377\377\377\5\376\376\376" \ + "\234\234\236;;=::<;;=\202::<\2""99;::<\202;;=\1\221\221\221\377\377\377" \ + "\377\224\377\377\377\1\235\235\235\211::<\2\221\221\223\376\376\376\215" \ + "\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\207\377\377\377" \ + "\1\377\376\377\202\377\377\375\202\377\377\377\202\377\377\375\1\377" \ + "\377\377\202\376\377\377\1\377\377\377\202\377\377\375\5\376\376\377" \ + "\377\377\377\377\377\373\377\377\377\376\376\376\203\377\377\377\27\376" \ + "\376\376\377\377\375\376\377\372\347\365\333\225\311K\217\304>\214\305" \ + "B\215\307\77\212\306B\214\306>\215\306A\214\306>\215\305>\214\306>\215" \ + "\305>\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377" \ + "\376\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\355\377" \ + "\377\377\1\316\316\316\266::<\214\377\377\377\1\376\376\376\203\377\377" \ + "\377\3\250\250\252::<;;=\203::<\202;;=\202::<\1kkk\377\377\377\377\224" \ + "\377\377\377\4www;;=::<;;=\202::<\202;;=\202::<\1\234\234\236\216\377" \ + "\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\207\377\377\377\15" \ + "\367\374\365\343\361\316\316\346\254\305\342\240\304\343\240\303\342" \ + "\236\305\342\237\312\346\251\345\356\317\365\373\357\376\377\377\376" \ + "\376\377\377\377\375\214\377\377\377\24\350\365\333\223\312K\216\306" \ + "\77\212\307>\215\304B\214\306>\215\307=\214\306>\215\306A\212\306@\212" \ + "\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377\375\376" \ + "\377\377\375\376\377\377\377\377\377\202\377\376\377\356\377\377\377" \ + "\1\316\316\316\266::<\217\377\377\377\2\376\376\376\316\316\320\207:" \ + ":<\3;;=::\10\212\306@\212\307>\232\315W\277\337\224" \ + "\352\364\333\377\377\377\377\376\377\377\377\375\202\376\377\377\202" \ + "\377\377\377\2\377\376\377\377\377\375\202\377\377\377\17\377\377\375" \ + "\377\376\377\347\365\333\226\312L\215\306A\213\310=\212\306@\217\304" \ + ">\216\307<\214\305@\215\305<\214\305@\215\307=\244\317c\366\373\364\377" \ + "\377\377\377\276\377\377\377\6\346\346\346;;=99;;;=::<;;=\205::<\377" \ + "\377\377\377\224\377\377\377\1::<\202;;=\2::<;;=\203::<\4;;=::<\316\316" \ + "\316\376\376\376\377\377\377\377\274\377\377\377\14\377\375\377\377\377" \ + "\377\376\376\374\377\377\375\377\376\377\377\377\375\376\377\377\377" \ + "\377\377\376\377\377\377\376\377\324\353\265\231\316Z\202\214\306<\1" \ + "\215\305>\210\214\306>\202\215\305>\16\214\306>\213\307A\211\306;\233" \ + "\314V\324\353\265\377\377\377\377\376\377\377\377\375\375\377\376\376" \ + "\377\377\377\377\377\377\376\377\376\377\377\377\377\373\202\377\377" \ + "\377\6\376\376\377\350\365\333\222\312K\215\306A\217\304>\212\306@\202" \ + "\214\305@\6\213\310\77\212\307>\242\322d\370\373\364\377\377\377\377" \ + "\377\375\377\377\377\377\276\377\377\377\203::<\3;;=::<99;\202;;=\202" \ + "::<\1\346\346\350\377\377\377\377\222\377\377\377\2\376\376\376;;=\202" \ + "::<\202;;=\205::<\377\377\377\377\275\377\377\377\4\377\377\375\377\377" \ + "\377\377\377\373\377\376\374\202\376\377\377\12\377\377\375\377\377\377" \ + "\376\377\375\342\360\317\232\315V\214\306<\220\306=\215\306A\215\306" \ + "C\215\306A\210\214\306>\202\215\307\77\7\215\306A\214\306>\214\305@\213" \ + "\307A\214\305@\230\315W\341\361\315\203\377\377\377\2\376\376\374\374" \ + "\377\375\202\377\377\377\2\377\377\375\377\376\377\202\377\377\377\13" \ + "\352\364\331\221\311J\215\306A\213\310=\216\306\77\214\305@\214\306<" \ + "\242\322e\370\373\364\376\376\377\377\377\375\377\377\377\377\277\377" \ + "\377\377\1``b\202::<\2;;=99;\202;;=\4::<;;=::<\316\316\320\377\377\377" \ + "\377\222\377\377\377\4\316\316\316;;=::<99;\202::<\2;;=::<\202;;=\3:" \ + ":<\376\376\376\377\377\377\202\376\376\376\377\377\377\377\271\377\377" \ + "\377\17\376\377\377\376\376\374\377\376\374\376\377\377\377\377\377\377" \ + "\377\375\376\377\377\370\373\364\277\336\222\215\305<\214\305@\215\307" \ + "\77\212\307>\215\307\77\213\307A\211\214\306>\16\216\306A\214\305B\213" \ + "\307A\214\306>\215\305<\213\305=\215\306A\214\306<\215\305>\300\337\223" \ + "\370\373\362\376\376\377\377\377\375\376\377\377\204\377\377\377\16\377" \ + "\376\377\376\376\377\376\377\377\352\364\331\222\312K\215\306A\214\306" \ + "<\214\305@\243\321d\371\373\360\376\376\377\376\377\377\377\377\377\376" \ + "\377\377\377\377\377\377\273\377\377\377\4\376\376\376\377\377\377\376" \ + "\376\376lln\203::<\1;;=\20299;\1;;=\202::<\1\266\266\270\377\377\377" \ + "\377\222\377\377\377\5\316\316\316::<;;=::<;;=\205::<\3kkm\377\377\377" \ + "\376\376\376\377\377\377\377\274\377\377\377\14\377\377\375\376\377\377" \ + "\377\377\377\377\377\375\376\376\376\367\374\365\244\317c\214\305@\215" \ + "\307=\211\306=\213\307A\215\306A\202\212\306@\1\213\310<\210\214\306" \ + ">\202\212\307>\3\212\307<\214\306>\216\306\77\202\214\306>\12\215\305" \ + "<\215\307\77\212\306@\242\322b\371\374\365\377\377\375\376\376\374\376" \ + "\377\377\377\376\377\376\377\377\202\377\377\377\13\376\377\375\376\376" \ + "\377\377\377\377\350\365\333\225\311K\214\305B\242\320c\371\374\361\377" \ + "\377\377\376\377\377\377\376\377\377\377\377\377\300\377\377\377\7\221" \ + "\221\223::<99;::<;;=::<;;=\203::<\1\234\234\236\377\377\377\377\222\377" \ + "\377\377\2\250\250\25099;\206::<\3;;=::\216\306" \ + "\77\215\305>\215\305@\210\214\306>\37\215\305@\215\307\77\212\306@\215" \ + "\307\77\214\304\77\215\306A\212\307;\212\306@\214\306>\216\307B\214\306" \ + ">\222\312K\354\364\334\377\376\377\377\377\377\377\377\373\376\377\377" \ + "\377\375\376\376\377\375\377\377\377\377\376\377\377\377\377\376\376" \ + "\377\347\365\333\260\327z\371\374\363\375\377\376\376\377\377\377\376" \ + "\377\377\377\377\377\377\375\377\377\377\377\276\377\377\377\3\376\376" \ + "\376\234\234\23699;\203;;=\205::<\1\221\221\223\377\377\377\377\222\377" \ + "\377\377\2\234\234\234;;=\204::<\202;;=\3::<;;=\235\235\237\377\377\377" \ + "\377\276\377\377\377\202\377\377\375\15\376\377\377\367\374\365\223\312" \ + "K\214\306>\213\310\77\215\305@\214\306<\215\307=\214\305@\213\307A\211" \ + "\305\77\215\307\77\215\305>\210\214\306>\20\215\306A\213\305=\215\307" \ + "=\214\305@\215\306A\214\306>\213\304A\220\305\77\216\306\77\212\306@" \ + "\215\305@\213\307A\221\311L\367\375\363\376\377\377\377\377\377\202\377" \ + "\377\373\1\377\375\376\202\377\377\377\4\377\376\377\376\377\377\377" \ + "\376\377\376\377\377\203\377\377\377\3\377\376\377\376\376\377\374\377" \ + "\375\377\377\377\377\277\377\377\377\2\265\265\267<<>\20299;\7::<;;=" \ + "::<99;;;=::\214\305" \ + "@\210\214\306>\22\216\306A\215\307\77\213\305=\216\306\77\214\306>\212" \ + "\307>\213\310\77\214\305@\215\306C\214\306<\215\307=\215\305>\213\310" \ + "=\242\320d\372\372\362\376\377\375\377\375\377\377\377\375\202\376\377" \ + "\377\5\377\377\377\377\377\375\377\377\377\377\377\375\377\377\377\202" \ + "\377\376\377\5\376\377\375\376\377\377\377\377\377\377\375\376\377\377" \ + "\375\377\377\377\377\274\377\377\377\5\376\376\376\377\377\377\316\316" \ + "\320::<;;=\202::<\1;;=\202::<\3""99;::\214" \ + "\306<\214\306>\211\307>\231\214\306>\1\216\306\77\203\214\306>\2\214" \ + "\305@\266\334\207\202\377\377\377\7\377\376\377\377\377\377\377\376\377" \ + "\377\377\375\377\377\377\377\377\375\376\377\377\377\377\377\377\303" \ + "\377\377\377\1\376\376\376\202\377\377\377\1\316\316\316\206::<\6;;=" \ + "::<;;=FFH\377\377\377\376\376\376\205\377\377\377\1\376\376\376\377\377" \ + "\377\377\212\377\377\377\1lln\202::<\3;;=99;;;=\204::<\3\317\317\317" \ + "\377\377\377\376\376\376\377\377\377\377\273\377\377\377\10\377\375\377" \ + "\374\377\375\343\361\320\214\306>\215\306A\214\304=\212\307>\215\305" \ + ">\230\214\306>\20\214\306<\213\304\77\212\307>\212\306B\214\306<\212" \ + "\307>\220\304>\337\363\316\377\376\377\377\377\377\376\377\377\377\377" \ + "\377\376\376\377\377\377\377\376\376\376\376\377\377\377\377\377\377" \ + "\302\377\377\377\1\376\376\376\202\377\377\377\2\376\376\376\377\377" \ + "\377\204::<\1;;=\202::<\3;;=99;;;=\203\377\377\377\1\376\376\376\202" \ + "\377\377\377\1\376\376\376\377\377\377\377\213\377\377\377\2SSU;;=\202" \ + "::<\2;;=99;\204::<\1\315\315\315\203\377\377\377\1\376\376\376\377\377" \ + "\377\377\271\377\377\377\10\376\376\376\377\377\377\233\316W\214\305" \ + "@\212\306@\216\306=\214\305@\215\305@\230\214\306>\17\214\306<\215\306" \ + "C\211\306=\213\307A\214\304\77\212\306@\214\305B\234\313W\376\377\375" \ + "\377\377\377\376\377\375\377\377\375\376\377\377\376\376\377\376\377" \ + "\375\377\377\377\377\302\377\377\377\1\376\376\376\202\377\377\377\4" \ + "\376\376\376\377\377\377\376\376\376;;=\206::<\202;;=\3::<\377\377\377" \ + "\376\376\376\203\377\377\377\3\376\376\376\377\377\377\376\376\376\377" \ + "\377\377\377\212\377\377\377\3::<99;;;=\202::<\10;;=::<;;=99;;;=\363" \ + "\363\363\377\377\377\376\376\376\377\377\377\377\274\377\377\377\7\323" \ + "\354\265\214\305@\215\307\77\215\306A\216\305C\213\304\77\212\307<\230" \ + "\214\306>\20\215\307\77\215\304B\214\305@\214\306>\215\305>\215\307=" \ + "\212\307<\215\307\77\323\351\270\377\376\377\377\377\377\376\376\376" \ + "\376\377\375\376\376\376\376\377\377\377\376\374\377\377\377\377\302" \ + "\377\377\377\202\376\376\376\202\377\377\377\2\376\376\376FFH\210::<" \ + "\2;;=\316\316\316\202\377\377\377\1\376\376\376\377\377\377\377\215\377" \ + "\377\377\1\376\376\376\202;;=\4""99;;;=::<;;=\202::<\2;;=::<\377\377" \ + "\377\377\277\377\377\377\7\231\316X\220\304>\214\305@\215\307\77\214" \ + "\306<\214\311>\214\305@\231\214\306>\11\215\304B\214\306>\215\306A\214" \ + "\306<\215\306A\214\305B\215\307\77\234\315X\375\377\374\204\377\377\377" \ + "\2\376\377\377\377\376\377\377\377\377\377\304\377\377\377\202\376\376" \ + "\376\4\377\377\377jjl::<99;\202;;=\205::<\7\316\316\316\377\377\377\376" \ + "\376\376\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\377\212\377\377\377\6\363\363\363::<99;;;=::<;;=\202::<\1;;=\202::<" \ + "\377\377\377\377\276\377\377\377\2\342\361\320\214\306<\202\215\305>" \ + "\4\212\307>\215\307=\211\306=\215\305>\230\214\306>\2\213\310=\214\306" \ + "<\202\214\305@\7\215\306A\214\306>\215\307=\214\304\77\211\310<\343\362" \ + "\321\377\377\375\202\377\376\377\2\377\377\375\376\376\376\377\377\377" \ + "\377\310\377\377\377\4kkm::<;;=::<\202;;=\202::<\3;;=::<\316\316\316" \ + "\202\377\377\377\1\376\376\376\377\377\377\377\215\377\377\377\3\316" \ + "\316\316::<;;=\202::<\1;;=\204::<\1__a\202\377\377\377\3\376\376\376" \ + "\377\377\377\376\376\376\377\377\377\377\271\377\377\377\4\270\333\207" \ + "\214\306>\214\305@\214\306>\203\214\305@\1\215\305>\230\214\306>\17\215" \ + "\306A\213\310=\212\307<\214\306>\214\306<\215\306A\214\306>\214\305@" \ + "\213\306E\267\332\206\377\377\375\376\377\377\377\377\375\377\377\377" \ + "\377\377\375\377\377\377\377\303\377\377\377\1\376\376\376\204\377\377" \ + "\377\6lln;;=::<99;::<;;=\204::<\1\250\250\250\204\377\377\377\1\376\376" \ + "\376\377\377\377\377\213\377\377\377\1\316\316\316\203::<\1;;=\205::" \ + "<\1lln\203\377\377\377\1\376\376\376\377\377\377\377\272\377\377\377" \ + "\10\232\315V\215\305@\212\306@\215\305>\214\306<\215\304D\215\305<\212" \ + "\306@\230\214\306>\3\217\304@\214\306<\215\306A\202\215\305@\7\214\306" \ + ">\214\305@\212\307>\215\305<\233\316W\376\376\377\376\377\375\203\377" \ + "\377\377\1\376\377\377\377\377\377\377\305\377\377\377\3\376\376\376" \ + "\377\377\377\234\234\236\203::<\2;;=99;\204::<\1\234\234\234\202\377" \ + "\377\377\1\376\376\376\377\377\377\377\215\377\377\377\5\316\316\320" \ + "::<;;=::<;;=\202::<\1;;=\202::<\1kkm\377\377\377\377\266\377\377\377" \ + "\10\375\377\374\376\377\377\376\376\376\377\377\375\377\377\377\376\377" \ + "\377\377\377\375\360\371\350\250\214\306>\4\214\305@\212\307>\360\371" \ + "\346\376\377\375\202\377\377\377\1\377\377\375\377\377\377\377\304\377" \ + "\377\377\1\376\376\376\203\377\377\377\1\234\234\234\211::<\1\234\234" \ + "\234\205\377\377\377\1\376\376\376\377\377\377\377\212\377\377\377\4" \ + "\316\316\320llnkkmlln\203kkm\1jjl\202kkm\1\221\221\223\377\377\377\377" \ + "\270\377\377\377\1\377\376\377\202\377\377\377\3\375\376\377\377\377" \ + "\375\341\361\315\251\214\306>\2\215\307\77\342\360\314\377\377\377\377" \ + "\310\377\377\377\202\376\376\376\202\377\377\377\2\266\266\266kkk\210" \ + "kkm\1\265\265\265\206\377\377\377\1\376\376\376\377\377\377\377\211\377" \ + "\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376" \ + "\377\377\377\377\264\377\377\377\1\377\376\377\205\377\377\377\2\375" \ + "\377\374\310\340\246\252\214\306>\1\310\340\246\377\377\377\377\307\377" \ + "\377\377\1\376\376\376\202\377\377\377\3\375\375\375\377\377\377\376" \ + "\376\376\211\377\377\377\7\376\376\376\377\377\377\376\376\376\377\377" \ + "\377\376\376\376\377\377\377\376\376\376\377\377\377\377\213\377\377" \ + "\377\1\376\376\376\204\377\377\377\1\376\376\376\206\377\377\377\1\376" \ + "\376\376\377\377\377\377\263\377\377\377\1\377\376\377\204\377\377\377" \ + "\3\376\376\377\376\377\375\304\342\234\251\214\306>\7\215\305@\305\343" \ + "\235\376\376\377\377\377\377\376\376\377\377\376\377\377\377\375\377" \ + "\377\377\377\306\377\377\377\1\376\376\376\217\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\377\377\377\377\214\377\377\377\5\376\376" \ + "\376\377\377\377\376\376\376\377\377\377\376\376\376\203\377\377\377" \ + "\1\376\376\376\377\377\377\377\267\377\377\377\1\377\377\375\202\377" \ + "\377\377\3\377\376\377\376\377\375\305\342\237\251\214\306>\3\215\305" \ + "@\303\344\235\376\376\376\202\377\377\377\1\377\376\377\377\377\377\377" \ + "\305\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\214\377" \ + "\377\377\1\376\376\376\377\377\377\377\216\377\377\377\1\376\376\376" \ + "\203\377\377\377\1\376\376\376\206\377\377\377\1\376\376\376\377\377" \ + "\377\377\266\377\377\377\5\376\377\377\376\376\377\377\376\377\377\377" \ + "\377\305\342\242\251\214\306>\4\215\306A\302\341\236\377\377\375\376" \ + "\376\376\377\377\377\377\305\377\377\377\1\376\376\376\203\377\377\377" \ + "\1\376\376\376\214\377\377\377\1\376\376\376\377\377\377\377\231\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\264\377" \ + "\377\377\2\376\376\376\377\376\377\202\376\377\377\202\377\377\377\1" \ + "\305\342\240\251\214\306>\7\214\305@\306\343\240\377\376\374\377\377" \ + "\377\376\377\377\377\377\377\376\376\376\377\377\377\377\325\377\377" \ + "\377\1\376\376\376\377\377\377\377\222\377\377\377\1\376\376\376\205" \ + "\377\377\377\1\376\376\376\377\377\377\377\265\377\377\377\4\377\377" \ + "\375\377\376\377\375\377\376\376\377\375\202\377\377\377\1\305\343\235" \ + "\251\214\306>\4\213\310\77\306\341\234\377\376\377\377\377\377\202\376" \ + "\377\375\377\377\377\377\311\377\377\377\1\377\377\375\215\377\377\377" \ + "\1\376\376\376\377\377\377\377\377\377\377\377\314\377\377\377\3\377" \ + "\377\375\377\377\377\376\377\375\203\377\377\377\11\376\377\377\345\360" \ + "\320\214\305@\214\306>\214\305@\214\304\77\214\306<\215\305>\212\307" \ + ">\231\214\306>\1\214\305@\202\215\307\77\205\214\306>\5\212\307>\214" \ + "\306>\342\360\315\377\377\377\376\376\376\202\377\377\377\1\377\377\375" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\244" \ + "\377\377\377\3\377\376\377\377\377\377\376\377\375\203\377\377\377\11" \ + "\376\377\377\362\371\347\214\306>\214\305B\215\310<\215\306A\214\305" \ + "@\215\307\77\214\305@\231\214\306>\4\215\307\77\213\305=\214\306>\215" \ + "\307\77\202\214\306>\5\215\307\77\214\306>\216\306\77\215\306A\360\367" \ + "\345\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\251\377\377\377\2\377\376\377\377\377\375\203\377\377\377\13\377\377" \ + "\375\377\377\377\375\377\374\233\316W\214\305@\213\304\77\212\306@\215" \ + "\307\77\214\305@\215\306A\214\305@\230\214\306>\3\215\307\77\214\306" \ + ">\215\306A\203\214\305@\7\215\306A\214\305@\215\304B\232\315T\377\377" \ + "\375\376\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\250\377\377\377\1\377\377\375\205\377\377\377" \ + "\11\377\376\377\267\333\204\213\307A\213\307C\215\307\77\213\304\77\215" \ + "\307\77\215\305<\212\306@\231\214\306>\1\215\307\77\203\214\305@\202" \ + "\214\306>\7\215\307\77\212\306@\267\333\204\377\376\377\376\377\377\377" \ + "\377\375\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\247\377\377\377\17\377\377\375\377\377\377\377\377\375" \ + "\376\376\376\377\377\377\377\377\375\376\376\377\334\354\305\211\306" \ + "=\213\307A\213\305;\215\306A\214\306<\215\305>\213\307A\232\214\306>" \ + "\202\214\305@\11\214\306>\214\306<\214\306>\215\307\77\212\311=\333\355" \ + "\305\377\376\377\377\377\377\376\376\376\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\252\377\377\377\3\377\377\375\377" \ + "\377\377\377\376\377\203\377\377\375\7\233\314V\215\307\77\215\305>\214" \ + "\306>\215\307\77\214\305@\212\307>\232\214\306>\14\214\305@\214\306>" \ + "\214\306<\215\307=\215\307\77\214\305@\232\315V\374\377\373\376\376\377" \ + "\377\377\375\377\377\377\376\376\376\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\255\377\377\377\10\377\377\375\377\376" \ + "\377\324\353\267\214\304\77\215\305>\214\305@\212\307<\214\305@\232\214" \ + "\306>\2\215\307\77\215\306A\202\214\306>\4\215\307\77\213\304\77\215" \ + "\306E\316\346\254\202\377\377\377\3\377\377\375\376\376\377\376\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\247" \ + "\377\377\377\1\376\376\376\206\377\377\377\10\377\377\373\375\376\377" \ + "\232\315W\214\306>\215\307=\211\307>\215\306A\215\305>\232\214\306>\1" \ + "\214\305@\202\215\307\77\13\214\305@\215\306E\227\317P\377\377\377\377" \ + "\377\375\376\377\377\377\377\377\377\377\375\375\377\376\377\377\377" \ + "\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\254\377\377\377\20\376\377\377\377\375\377\331\356\303\215\305" \ + "@\213\310\77\215\305>\216\306\77\213\307A\215\306A\214\306<\214\306>" \ + "\216\306\77\213\304\77\212\307<\214\306>\215\305@\210\214\306>\1\214" \ + "\305@\202\215\307\77\205\214\306>\10\214\305@\212\307>\215\305>\214\305" \ + "@\215\305>\214\305@\215\305>\331\356\305\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\264\377\377\377\20\376\376\374\377" \ + "\377\375\376\376\374\261\330{\214\306>\216\306A\214\306>\213\307A\215" \ + "\305>\215\306A\215\307\77\213\304A\215\307\77\214\305@\214\306<\216\306" \ + "A\210\214\306>\4\215\307\77\213\305=\214\306>\215\307\77\202\214\306" \ + ">\12\215\307\77\214\306>\212\307>\220\305\77\212\307>\214\306>\213\310" \ + "=\214\306<\262\327z\376\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\265\377\377\377\17\374\377\377\377\377\377\370" \ + "\373\362\241\321d\211\310<\215\305>\215\305@\216\306=\214\305@\214\306" \ + ">\215\307\77\214\306>\212\307<\212\306@\212\307<\210\214\306>\3\215\307" \ + "\77\214\306>\215\306A\203\214\305@\12\215\306A\214\305@\215\305>\212" \ + "\307>\213\307A\216\305C\215\307=\242\322e\371\372\364\375\377\376\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\264\377" \ + "\377\377\1\375\377\374\203\377\377\377\4\352\364\333\223\311O\212\306" \ + "@\215\305@\202\213\310\77\202\214\306>\4\216\307F\213\305=\215\307\77" \ + "\215\305@\211\214\306>\1\215\307\77\203\214\305@\202\214\306>\1\215\307" \ + "\77\202\214\305@\6\216\305C\215\307\77\225\311K\351\363\332\377\377\377" \ + "\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\265\377\377\377\17\377\375\376\377\376\377\377\377\377\377\377" \ + "\375\352\365\327\223\313L\212\307<\215\305>\214\305@\215\307=\214\305" \ + "@\214\306<\213\310\77\213\304\77\220\305A\212\214\306>\202\214\305@\12" \ + "\214\306>\214\306<\214\306>\215\307\77\214\306>\213\310=\215\307=\225" \ + "\311K\347\365\334\377\377\375\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\267\377\377\377\1\377\377\375\202\377\377\377" \ + "\13\377\376\377\376\377\377\353\363\334\245\320d\214\305B\214\305@\215" \ + "\306A\213\305=\214\306>\213\307A\213\310=\213\214\306>\5\214\305@\214" \ + "\306>\214\306<\215\307=\215\307\77\202\214\305@\5\214\306<\242\322e\351" \ + "\363\332\377\377\375\376\376\376\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\267\377\377\377\1\376\376\374\202\377\377" \ + "\375\6\376\377\377\377\376\377\377\377\375\371\372\364\255\330|\217\304" \ + ">\202\212\306@\2\215\306A\214\303A\202\214\305@\211\214\306>\2\215\307" \ + "\77\215\306A\202\214\306>\6\215\307\77\213\304\77\215\306E\215\305>\262" \ + "\327z\371\372\364\203\377\377\377\2\376\377\377\377\377\375\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\264\377\377\377" \ + "\1\376\376\376\202\377\377\377\2\377\377\375\377\376\377\203\377\377" \ + "\377\6\377\377\375\331\356\303\233\314W\215\310<\214\305@\215\307\77" \ + "\214\214\306>\1\214\305@\202\215\307\77\7\214\305@\215\306E\227\317P" \ + "\331\356\305\376\377\377\375\377\376\376\377\377\202\377\377\377\2\377" \ + "\377\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\274\377\377\377\10\377\377\375\377\376\377\365\375\362" \ + "\307\342\237\234\315Z\212\306@\212\307>\214\305@\202\215\307\77\16\214" \ + "\306>\215\307\77\214\306>\215\306A\214\306>\213\310\77\214\306>\215\305" \ + "<\216\306A\213\310\77\212\307>\232\315T\307\341\242\370\373\362\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377\377" \ + "\377\1\377\377\375\202\377\377\377\10\377\376\377\376\376\374\335\354" \ + "\303\270\333\207\222\311J\214\305@\215\306A\213\305=\202\214\306>\13" \ + "\215\307\77\216\306\77\215\305>\212\306@\212\307>\226\312K\270\333\211" \ + "\334\354\307\376\377\377\376\376\376\377\377\375\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\306\377\377\377\2\376\377" \ + "\375\376\377\377\204\377\377\377\16\350\366\334\332\354\302\311\341\245" \ + "\306\341\234\305\342\237\304\341\237\305\342\240\305\342\237\334\355" \ + "\303\352\364\333\377\377\375\377\375\376\377\376\377\377\377\375\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\307\377" \ + "\377\377\15\376\376\376\377\376\377\377\377\375\377\377\373\376\377\377" \ + "\376\377\375\376\377\377\377\377\375\377\377\377\376\376\376\376\377" \ + "\377\376\377\375\377\377\377\202\377\376\377\204\377\377\377\1\376\376" \ + "\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\307\377\377\377\3\376\377\377\377\377\377\376\376\376\202\377\377\377" \ + "\1\376\376\376\210\377\377\377\3\375\377\376\376\377\377\377\377\377" \ + "\203\377\376\377\4\376\377\375\376\377\377\377\377\377\377\376\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377" \ + "\377\377\10\377\377\375\377\376\377\377\377\373\377\377\377\375\377\376" \ + "\376\377\377\376\376\376\377\376\377\202\376\377\377\1\377\377\377\202" \ + "\376\376\376\202\377\377\377\202\376\377\377\5\376\377\375\377\377\377" \ + "\376\376\374\377\377\377\377\377\375\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\307\377\377\377\1\376\376\377\202\377" \ + "\377\377\2\377\377\375\376\376\377\202\377\377\377\2\376\377\375\377" \ + "\377\375\204\377\377\377\202\377\377\375\1\376\377\375\202\376\377\377" \ + "\202\377\377\375\202\377\377\377\1\377\376\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\310\377\377\377\5\377\377\375" \ + "\377\376\377\377\377\375\376\376\377\377\376\377\207\377\377\377\202" \ + "\377\376\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\261\377\377\377" \ + "\1\376\376\376\210\377\377\377\3\376\376\376\377\377\377\376\376\376" \ + "\331\377\377\377\1\376\376\376\204\377\377\377\1\376\376\376\257\377" \ + "\377\377\1\376\376\376\212\377\377\377\1\376\376\376\211\377\377\377" \ + "\1\376\376\376\221\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \ + "\376\205\377\377\377\1\376\376\376\312\377\377\377\1\376\376\376\214" \ + "\377\377\377\1\376\376\376\202\377\377\377\6\377\376\375\377\377\377" \ + "\376\377\377\377\377\377\377\376\377\376\377\377\270\377\377\377\7\376" \ + "\377\377\377\376\377\376\377\377\377\377\375\377\377\377\377\375\377" \ + "\377\376\377\273\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \ + "\376\302\377\377\377\1\376\376\376\305\377\377\377\1\376\376\376\241" \ + "\377\377\377\1\376\376\376\214\377\377\377\1\376\376\376\235\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376" \ + "\376\376\202\377\377\377\1\376\376\376\252\377\377\377\1\376\376\376" \ + "\212\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377" \ + "\1\376\376\376\251\377\377\377\202\376\376\376\215\377\377\377\1\376" \ + "\376\376\202\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376" \ + "\224\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\376\376\376\232\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\206\377\377\377\1\376\376" \ + "\376\243\377\377\377\1\376\376\376\204\377\377\377\1\376\376\376\202" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\2" \ + "\376\376\376\377\377\377\202\377\377\375\3\377\377\377\376\377\377\377" \ + "\377\375\202\377\376\377\1\377\377\377\270\377\376\377\14\377\377\377" \ + "\377\376\377\377\376\374\377\377\375\375\376\377\376\377\377\377\377" \ + "\375\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376\203" \ + "\377\377\377\1\376\376\376\266\377\377\377\1\376\376\376\203\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\376\376\376\214\377\377\377\202" \ + "\376\376\376\207\377\377\377\1\376\376\376\272\377\377\377\1\376\376" \ + "\376\252\377\377\377\202\376\376\376\247\377\377\377\5\376\376\376\377" \ + "\377\377\376\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376" \ + "\376\203\377\377\377\1\376\376\376\311\377\377\377\1\376\376\376\221" \ + "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\302\377\377" \ + "\377\1\376\376\376\207\377\377\377\1\346\346\346\204\316\316\316\10\317" \ + "\317\317\315\315\315\316\316\316\363\363\365\377\377\377\376\376\376" \ + "\377\377\377\376\376\376\204\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\376\376\376\234\377\377\377\1\376\376\376\262\377\377\377\1\376\376" \ + "\376\213\377\377\377\1\377\377\375\202\376\377\377\1\376\376\377\202" \ + "\377\377\377\2\377\376\377\377\377\375\270\276\317\331\1\377\376\377" \ + "\205\377\377\377\3\376\377\375\377\377\375\376\376\376\257\377\377\377" \ + "\1\376\376\376\210\377\377\377\202\376\376\376\210\377\377\377\1\376" \ + "\376\376\220\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376" \ + "\243\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\207\377\377\377\1\376\376\376\331\377\377\377\12\376" \ + "\376\376\377\377\377\235\235\235kkmllnkkmllnjjlkkm\346\346\346\202\377" \ + "\377\377\1\376\376\376\237\377\377\377\2\346\346\346\317\317\317\204" \ + "\316\316\316\2\317\317\317\346\346\346\234\377\377\377\1\376\376\376" \ + "\203\377\377\377\1\376\376\376\202\377\377\377\1\332\332\332\203\316" \ + "\316\316\1\317\317\317\202\316\316\316\213\377\377\377\5\346\346\346" \ + "\317\317\317\315\315\315\316\316\316\315\315\315\252\316\316\316\1\363" \ + "\363\363\205\377\377\377\1\376\376\376\212\377\377\377\1\376\376\376" \ + "\211\377\377\377\4\346\346\346\250\250\250\204\204\206``b\202::<\1;;" \ + "=\202::<\3;;=99;;;=\203::<\4lln\220\220\222\266\266\266\363\363\363\202" \ + "\376\376\376\240\377\377\377\1\346\346\346\202\316\316\316\10\317\317" \ + "\317\315\315\315\317\317\317\316\316\316\332\332\332\376\376\376\377" \ + "\377\377\376\376\376\203\377\377\377\1\376\376\376\241\377\377\377\6" \ + "\376\376\376\377\377\377\346\346\346\316\316\320\317\317\321\316\316" \ + "\320\203\316\316\316\2\347\347\347\376\376\376\205\377\377\377\1\376" \ + "\376\376\202\377\377\375\5\376\377\377\377\377\375\377\377\377\317\334" \ + "\344\37V\177\270\0>i\12\37U{\317\334\344\377\376\374\377\377\375\376" \ + "\377\377\377\376\374\376\377\377\376\376\376\377\377\377\363\363\363" \ + "\202\316\316\316\1\315\315\315\202\317\317\317\251\316\316\316\1\332" \ + "\332\332\202\377\377\377\1\376\376\376\203\377\377\377\202\376\376\376" \ + "\204\377\377\377\3\346\346\346\316\316\316\316\316\320\204\316\316\316" \ + "\2\346\346\346\376\376\376\212\377\377\377\1\347\347\347\206\316\316" \ + "\316\2\317\317\317\363\363\363\250\377\377\377\2\376\376\376\331\331" \ + "\331\206\316\316\316\1\332\332\332\202\377\377\377\1\376\376\376\204" \ + "\377\377\377\1\376\376\376\203\377\377\377\3\332\332\332\316\316\316" \ + "\316\316\320\250\316\316\316\1\363\363\363\205\377\377\377\1\376\376" \ + "\376\242\377\377\377\4\346\346\346::<;;=99;\204::<\1\204\204\206\237" \ + "\377\377\377\1\376\376\376\202\377\377\377\3\235\235\235::<;;=\202::" \ + "<\3;;=::<\235\235\235\202\377\377\377\1\376\376\376\232\377\377\377\1" \ + "\376\376\376\205\377\377\377\4kkm;;;99;;;=\202::<\1;;;\213\377\377\377" \ + "\4\234\234\234:::::<;;=\202::<\1;;;\250::<\1\316\316\316\202\377\377" \ + "\377\1\376\376\376\203\377\377\377\1\376\376\376\212\377\377\377\203" \ + "\376\376\376\203\377\377\377\3\346\346\346\250\250\250```\204::<\202" \ + ";;=\202::<\3;;=::<;;=\203::<\1;;=\202::<\5;;=::<```\265\265\265\362\362" \ + "\362\203\377\377\377\1\376\376\376\233\377\377\377\1\234\234\236\204" \ + "::<\5""99;;;=::<\333\333\335\376\376\376\203\377\377\377\1\376\376\376" \ + "\241\377\377\377\4\376\376\376\377\377\377\363\363\363FFH\202::<\1;;" \ + "=\203::<\1\234\234\234\210\377\377\377\6\376\377\377\377\377\375\375" \ + "\376\377\356\363\366\40Vz\0\77h\270\0=i\20\0>i\22Ip\356\363\367\376\377" \ + "\377\377\377\375\377\377\377\376\376\377\377\376\377\377\377\377\315" \ + "\315\315:::::<;;=::<99;;;;\250::<\1kkm\205\377\377\377\1\376\376\376" \ + "\203\377\377\377\4\376\376\376\377\377\377\376\376\376\234\234\234\203" \ + "::<\6;;=::<:::\234\234\234\377\377\377\376\376\376\211\377\377\377\3" \ + "\332\332\332:::;;=\202::<\202;;=\2::<\204\204\206\250\377\377\377\2\364" \ + "\364\364FFF\204::<\202:::\1\234\234\234\206\377\377\377\1\376\376\376" \ + "\204\377\377\377\2kkk;;=\251::<\1\316\316\316\202\377\377\377\1\376\376" \ + "\376\203\377\377\377\1\376\376\376\240\377\377\377\6\376\376\376\234" \ + "\234\236::<;;=::<;;=\203::<\2FFH\362\362\362\235\377\377\377\1\376\376" \ + "\376\203\377\377\377\3\234\234\236::<;;=\202::<\3;;=::<\234\234\236\203" \ + "\377\377\377\1\376\376\376\233\377\377\377\1\376\376\376\203\377\377" \ + "\377\7kkm::<;;=::<;;=::<;;=\213\377\377\377\4\235\235\235::<;;=99;\202" \ + ";;=\251::<\1\315\315\315\203\377\377\377\202\376\376\376\213\377\377" \ + "\377\1\376\376\376\202\377\377\377\6\376\376\376\377\377\377\315\315" \ + "\315\205\205\205::<;;=\213::<\4;;=::<;;=::<\203;;=\204::<\4FFF\204\204" \ + "\204\346\346\346\376\376\376\234\377\377\377\3\234\234\236::<;;=\202" \ + "::<\4;;=99;::<``b\244\377\377\377\1\376\376\376\203\377\377\377\1xxz" \ + "\202::<\10;;=99;;;=::<;;=\233\233\235\377\377\377\376\376\376\202\377" \ + "\377\377\1\376\376\376\203\377\377\377\4\375\377\376\377\376\373\377" \ + "\377\375\235\267\310\202\0>i\271\0=i\4\0\77j\237\266\306\377\376\377" \ + "\377\375\374\202\376\377\377\4\377\377\377\376\376\376\316\316\31699" \ + ";\202;;=\2::<;;=\251::<\1kkm\203\377\377\377\1\376\376\376\210\377\377" \ + "\377\4\235\235\235::<99;;;=\203::<\1\235\235\235\214\377\377\377\2ll" \ + "n99;\202;;=\1::<\203;;=\2\362\362\364\376\376\376\245\377\377\377\2\376" \ + "\376\376\250\250\250\204::<\4;;=::<:::\346\346\346\203\377\377\377\1" \ + "\376\376\376\205\377\377\377\3\376\376\376\377\377\377jjl\252::<\1\315" \ + "\315\315\203\377\377\377\202\376\376\376\242\377\377\377\3\362\362\364" \ + "GGI::<\202;;=\2""99;;;=\202::<\2""99;\235\235\235\237\377\377\377\3\376" \ + "\376\376\377\377\377\235\235\237\202::<\202;;=\202::<\3\235\235\237\377" \ + "\377\377\376\376\376\233\377\377\377\1\376\376\376\203\377\377\377\4" \ + "\376\376\376\377\377\377kkm;;=\202::<\5""99;;;=99;\377\377\377\376\376" \ + "\376\211\377\377\377\1\233\233\233\202::<\3;;=::<99;\251::<\1\317\317" \ + "\317\205\377\377\377\1\376\376\376\214\377\377\377\3\376\376\376\347" \ + "\347\347xxz\203::<\1;;=\202::<\1;;=\204::<\1;;=\203::<\1;;=\205::<\1" \ + ";;=\203::<\1;;=\203::<\2\234\234\236\362\362\362\233\377\377\377\2\233" \ + "\233\235;;=\204::<\1;;=\202::<\1\234\234\236\245\377\377\377\4\376\376" \ + "\376\302\302\304::<;;=\206::<\1\235\235\237\202\377\377\377\1\376\376" \ + "\376\203\377\377\377\7\375\376\377\377\377\377\377\377\375\376\377\377" \ + "\377\377\377\177\235\265\0\77k\271\0\77j\7\0\77k\0\77j~\236\265\377\376" \ + "\377\376\377\377\375\377\374\377\377\375\202\377\377\377\5\315\315\315" \ + ";;=::<99;;;=\252::<\3kkm\377\377\377\376\376\376\203\377\377\377\1\376" \ + "\376\376\203\377\377\377\1\376\376\376\202\377\377\377\3\233\233\233" \ + "::<;;=\202::<\3;;=::<\234\234\234\202\377\377\377\1\376\376\376\211\377" \ + "\377\377\4\264\264\264;;=::<;;=\204::<\3\247\247\251\377\377\377\376" \ + "\376\376\245\377\377\377\1SSS\203::<\1;;=\202::<\1\204\204\204\213\377" \ + "\377\377\4\376\376\376lln::<:9>\250::<\1\317\317\317\205\377\377\377" \ + "\1\376\376\376\241\377\377\377\1\265\265\267\204::<\1;;=\204::<\1FFF" \ + "\241\377\377\377\2\234\234\236;;=\204::<\2;;=\234\234\236\234\377\377" \ + "\377\3\376\376\376\377\377\377\376\376\376\204\377\377\377\1kkm\203:" \ + ":<\4;;=::<;;=\376\376\376\212\377\377\377\1\234\234\234\204::<\1;;=\251" \ + "::<\1\316\316\316\203\377\377\377\202\376\376\376\215\377\377\377\4\234" \ + "\234\234;;=::<;;=\202::<\1""99;\204::<\1;;=\203::<\1;;=\211::<\1""99" \ + ";\207::<\2FFF\301\301\301\232\377\377\377\2\234\234\23699;\210::<\1\333" \ + "\333\333\241\377\377\377\6\376\376\376\377\377\377\376\376\376\363\363" \ + "\363FFH;;=\205::<\3;;=::<\234\234\236\206\377\377\377\7\377\376\377\377" \ + "\377\377\377\377\375\375\376\377\377\376\377\201\235\263\0>g\272\0>i" \ + "\13\0>e\177\236\263\377\375\374\377\377\377\377\377\375\376\376\376\377" \ + "\376\377\377\377\377\316\316\316::<;;=\202::<\2""99;;;=\250::<\1kkm\204" \ + "\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \ + "\376\202\377\377\377\2\376\376\376\234\234\234\206::<\1\234\234\234\215" \ + "\377\377\377\2RRT;;=\205::<\1SSU\246\377\377\377\2\316\316\316999\206" \ + "::<\1\316\316\316\202\377\377\377\3\376\376\376\377\377\377\376\376\376" \ + "\207\377\377\377\3jjl::<:9>\250::<\1\316\316\316\203\377\377\377\202" \ + "\376\376\376\242\377\377\377\2SSU99;\202;;=\204::<\4;;=99;::<\264\264" \ + "\266\240\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377" \ + "\1kkm\206::<\213\377\377\377\2\234\234\236;;=\216::<\4""99;;;=::<;;=" \ + "\206::<\3;;=::<;;=\222::<\1\316\316\316\205\377\377\377\1\376\376\376" \ + "\207\377\377\377\1\376\376\376\202\377\377\377\2\346\346\350__a\202:" \ + ":<\3;;=::<;;=\204::<\1;;=\202::<\3;;=::<;;=\203::<\1;;=\202::<\2""99" \ + ";;;=\202::<\1;;=\204::<\7;;=::<;;=::<;;=\204\204\206\363\363\363\203" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\222\377\377\377\4" \ + "\234\234\236::<;;=99;\204::<\3;;=::<__a\244\377\377\377\1xxx\205::<\1" \ + ";;=\203::<\1\234\234\236\213\377\377\377\3\177\236\263\0=i\0>i\211\0" \ + "=i\2\0>j\0=i\202\1>j\2\0\77k\0>j\232\0>i\2\0>j\0\77k\202\1>j\2\0=i\0" \ + ">j\211\0=i\3\0>i\0=i\177\236\263\206\377\377\377\6\316\316\316:::::<" \ + ";;=::<;;=\217::<\1;;=\203::<\1;;=\202::<\1;;=\222::<\1kkk\205\377\377" \ + "\377\1\376\376\376\206\377\377\377\1\234\234\236\206::<\1\234\234\236" \ + "\215\377\377\377\3\234\234\234;;=::<\202;;=\203::<\3\316\316\320\377" \ + "\377\377\376\376\376\240\377\377\377\1\376\376\376\202\377\377\377\3" \ + "xxz::<;;=\202::<\3;;=::<__a\215\377\377\377\1kkm\204::<\1;;=\202::<\1" \ + ";;=\242::<\1\316\316\316\205\377\377\377\1\376\376\376\240\377\377\377" \ + "\1\265\265\265\202::<\5;;=::<;;=::<;;=\204::<\2TTV\376\376\376\237\377" \ + "\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206" \ + "::<\213\377\377\377\3\234\234\23499;;;=\214::<\1""99;\207::<\1;;=\227" \ + "::<\1\316\316\316\204\377\377\377\3\376\376\376\377\377\377\376\376\376" \ + "\203\377\377\377\1\376\376\376\204\377\377\377\2\333\333\335FFH\214:" \ + ":<\16``b\221\221\223\251\251\251\315\315\315\316\316\316\363\363\363" \ + "\377\377\377\332\332\332\316\316\316\301\301\301\235\235\237jjlFFH;;" \ + "=\207::<\1;;=\202::<\3;;=__a\363\363\363\227\377\377\377\4\234\234\236" \ + "99;::<;;=\205::<\3;;=::<\233\233\233\240\377\377\377\12\376\376\376\377" \ + "\377\377\301\301\301;;=::<;;=::<;;=::<99;\203::<\1\234\234\236\213\377" \ + "\377\377\3\177\236\263\0=i\0>i\211\0=i\7\1>j\0=i\1>j\0=i\0>g\3>h\2=g" \ + "\230\0=i\7\2=g\3>h\0>g\0=i\1>j\0=i\1>j\211\0=i\3\0>i\0=i\177\236\263" \ + "\206\377\377\377\2\317\317\317:::\221::<\202;;=\202::<\3;;=::<99;\203" \ + "::<\2;;=99;\220::<\1kkk\214\377\377\377\1\234\234\236\206::<\1\234\234" \ + "\236\213\377\377\377\3\376\376\376\377\377\377\363\363\363\204::<\4;" \ + ";=::<;;=xxz\202\377\377\377\1\376\376\376\236\377\377\377\1\376\376\376" \ + "\202\377\377\377\3\346\346\346::<;;=\202::<\4;;=99;;;=\266\266\270\215" \ + "\377\377\377\1kkm\203::<\1;;=\202::<\1;;=\243::<\1\316\316\316\204\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\232\377\377\377\1\376" \ + "\376\376\204\377\377\377\1kkm\202;;=\202::<\202;;=\2::<;;=\204::<\3\317" \ + "\317\317\377\377\377\376\376\376\235\377\377\377\1\234\234\234\206::" \ + "<\1\234\234\234\243\377\377\377\1kkm\206::<\212\377\377\377\1\376\376" \ + "\376\224\377\377\377\1lln\203::<\1;;=\202::<\1\234\234\236\234\377\377" \ + "\377\1\376\376\376\204\377\377\377\4\376\376\376\265\265\267::<;;=\202" \ + "::<\1;;=\202::<\1;;=\203::<\5__a\266\266\270\363\363\363\377\377\377" \ + "\376\376\376\204\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \ + "\376\202\377\377\377\4\301\301\303\204\204\206;;=::<\203;;=\202::<\2" \ + ";;=::<\202;;=\3GGI\332\332\334\376\376\376\203\377\377\377\1\376\376" \ + "\376\221\377\377\377\2\235\235\237::<\202;;=\202::<\1;;=\202::<\4""9" \ + "9;::<;;=\331\331\331\240\377\377\377\2\363\363\363GGI\203::<\2;;=::<" \ + "\203;;=\202::<\1\234\234\236\213\377\377\377\3\177\236\263\0=i\0>i\210" \ + "\0=i\10\0\77k\0=i\1>j\0>i\0\77j\0=i\0>i\0>j\230\0>i\10\0>j\0>i\0=i\0" \ + "\77j\0>i\1>j\0=i\0\77k\210\0=i\3\0>i\0=i\177\236\263\206\377\377\377" \ + "\1\376\376\376\217\377\377\377\1\376\376\376\203\377\377\377\1\315\315" \ + "\317\204::<\3;;=::i\211\0=i\202\0>i\5\0j\0=i\1>j" \ + "\0>i\230\0=i\5\0>i\1>j\0=i\1>j\0i\211\0=i\3\0>i\0=i\177\236" \ + "\263\212\377\377\377\3\376\376\376\377\377\377\376\376\376\212\377\377" \ + "\377\1\376\376\376\202\377\377\377\10\316\316\320::<;;=::<;;=99;::::<99;::<99;\202;;=\203::<\1" \ + "\234\234\236\213\377\377\377\3\177\236\263\0=i\0>i\210\0=i\7\2=g\0>i" \ + "\0>j\0\77j\0=i\0\77j\0=h\232\1>j\7\0=h\0\77j\0=i\0\77j\0>j\0>i\2=g\210" \ + "\0=i\3\0>i\0=i\177\236\263\213\377\377\377\1\376\376\376\216\377\377" \ + "\377\1\317\317\321\202::<\6;;=::<;;=::i\210\0=i\10\0\77j\0>j\0\77k\0=i\3>h\2=" \ + "g\1>j\0\77k\230\0=i\10\0\77k\1>j\2=g\3>h\0=i\0\77k\0>j\0\77j\210\0=i" \ + "\3\0>i\0=i\177\236\263\232\377\377\377\12\316\316\316;;=::<;;=::<;;=" \ + "::i\210\0=i\10\0>i\0=i\0>i\0\77k\0>j\2=g\1\77h\0>l\230\0>i\10\0>l\1\77" \ + "h\2=g\0>j\0\77k\0>i\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\205\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\376\376\376\221\377\377\377\3\316" \ + "\316\316::<;;=\204::<\1kkm\225\377\377\377\202\376\376\376\211\377\377" \ + "\377\1\234\234\236\206::<\1\234\234\236\217\377\377\377\3\376\376\376" \ + "TTV99;\202::<\4""99;;;=::i\210\0=i\7\0>j\2=g\0>g\0>j\40V|o\224\256\177\236\262\232" \ + "\177\236\263\7\177\236\262o\224\256\40V|\0>j\0>g\2=g\0>j\210\0=i\3\0" \ + ">i\0=i\177\236\263\232\377\377\377\3\316\316\316::<;;=\203::<\2;;=kk" \ + "m\232\377\377\377\1\376\376\376\205\377\377\377\1\234\234\236\206::<" \ + "\1\234\234\236\220\377\377\377\2\233\233\235;;=\202::<\1<<>\203::<\1" \ + "\346\346\346\237\377\377\377\1\204\204\204\206::<\2SSU\376\376\376\217" \ + "\377\377\377\1kkm\203::<\4;;=::<;;=\316\316\320\304\377\377\377\1\376" \ + "\376\376\202\377\377\377\2\234\234\236;;=\202::<\4;;=::<;;=\234\234\234" \ + "\203\377\377\377\1\346\346\346\205::<\3;;=FFH\363\363\365\203\377\377" \ + "\377\1\376\376\376\230\377\377\377\1\234\234\234\206::<\1\234\234\234" \ + "\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236" \ + "\235\377\377\377\2\316\316\316;;=\202::<\6;;=::<;;=::<:::\265\265\265" \ + "\237\377\377\377\7\376\376\376\363\363\363___::<;;=::<;;=\203::<\2GG" \ + "I\363\363\363\204\377\377\377\1\376\376\376\214\377\377\377\1\234\234" \ + "\234\203::<\202;;=\5::<\266\266\266GGI99;;;=\202::<\1;;=\202::<\1\332" \ + "\332\332\206\377\377\377\1\376\376\376\211\377\377\377\1\376\376\376" \ + "\207\377\377\377\2\363\363\363FFH\206::<\3FFH\301\301\30399;\202::<\202" \ + ";;=\2::<\234\234\236\206\377\377\377\7\377\377\375\377\377\377\377\377" \ + "\375\376\377\377\376\376\376\200\237\263\0\77i\211\0>i\7\0>g\1>j\0>g" \ + "_\210\236\377\377\377\376\377\377\377\376\377\231\377\377\377\10\377" \ + "\377\375\376\377\375\377\377\377\377\377\375`\210\242\3>h\0\77j\1\77" \ + "h\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<" \ + "\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377\377" \ + "\377\1\363\363\363\204::<\202;;=\2""99;\205\205\207\207\377\377\377\1" \ + "\376\376\376\224\377\377\377\4\376\376\376\377\377\377\363\363\363FF" \ + "H\202::<\5;;=99;;;=::<\265\265\265\220\377\377\377\1kkm\206::<\1\316" \ + "\316\316\305\377\377\377\5\376\376\376\364\364\364FFH::<;;=\202::<\4" \ + ";;=FFH\363\363\363\377\377\377\202\376\376\376\6\377\377\377xxz::<;;" \ + "=::<;;=\202::<\1\234\234\236\206\377\377\377\202\376\376\376\224\377" \ + "\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206" \ + "::<\237\377\377\377\1kkm\206::<\1\234\234\236\225\377\377\377\1\376\376" \ + "\376\207\377\377\377\2SSS;;=\202::<\1;;=\203::<\1\234\234\234\202\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\232\377\377\377\1\376" \ + "\376\376\202\377\377\377\4\332\332\332FFH::<;;=\202::<\1;;=\202::<\1" \ + "\222\222\224\205\377\377\377\1\376\376\376\213\377\377\377\3\234\234" \ + "\234::<;;=\202::<\5""99;;;=\315\315\315\250\250\252;;=\206::<\2``b\376" \ + "\376\376\202\377\377\377\1\376\376\376\216\377\377\377\1\376\376\376" \ + "\205\377\377\377\2xxx;;=\202::<\1;;=\203::<\2\300\300\300\317\317\321" \ + "\203::<\1;;=\202::<\1\234\234\236\207\377\377\377\1\377\376\377\202\377" \ + "\377\377\4\377\376\377\201\235\263\0=j\3>j\210\0=i\5\1>j\0=j\37V\177" \ + "\377\376\377\376\376\376\202\377\377\377\1\376\377\377\230\377\377\377" \ + "\10\376\377\377\377\377\375\374\377\377\377\376\374\376\377\377#W\177" \ + "\0>g\0\77i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316" \ + "\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377" \ + "\377\377\2\376\376\376\204\204\206\205::<\3;;=FFH\362\362\362\204\377" \ + "\377\377\202\376\376\376\2\377\377\377\376\376\376\224\377\377\377\3" \ + "\376\376\376\265\265\265;;=\203::<\4;;=99;FFH\363\363\363\220\377\377" \ + "\377\1kkm\206::<\1\316\316\316\306\377\377\377\4\265\265\26599;;;=::" \ + "<\202;;=\2""99;\222\222\224\204\377\377\377\12\376\376\376\316\316\320" \ + ";;=::<;;=99;;;=99;SSU\376\376\376\202\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\226\377\377\377\1\234\234\234\206::<\1\234\234\234\243" \ + "\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\234" \ + "\377\377\377\11\234\234\234::<;;=99;;;=99;::<;;=kkm\241\377\377\377\1" \ + "\376\376\376\202\377\377\377\1\301\301\303\203::<\6;;=99;::<;;=::<\346" \ + "\346\350\203\377\377\377\1\376\376\376\214\377\377\377\1\234\234\234" \ + "\203::<\202;;=\10""99;\316\316\316\377\377\377kkm::<;;=::<;;=\203::<" \ + "\1\235\235\237\203\377\377\377\1\376\376\376\214\377\377\377\1\376\376" \ + "\376\205\377\377\377\3\302\302\304::<;;=\202::<\7""99;;;=99;xxz\377\377" \ + "\377\315\315\315;;=\203::<\3:9>::<\234\234\236\206\377\377\377\3\376" \ + "\377\377\377\377\375\377\377\377\202\377\377\375\3|\237\265\0\77k\0>" \ + "g\210\0=i\10\0@h\3j\210\0=i\3\0>i\0=i\177" \ + "\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1" \ + "\234\234\236\206::<\1\234\234\236\215\377\377\377\1\376\376\376\203\377" \ + "\377\377\2\332\332\334;;=\206::<\2\266\266\266\376\376\376\202\377\377" \ + "\377\1\376\376\376\202\377\377\377\1\376\376\376\222\377\377\377\1\376" \ + "\376\376\203\377\377\377\1SSS\203::<\4""99;::<;;=\221\221\223\221\377" \ + "\377\377\1kkm\206::<\1\316\316\316\306\377\377\377\4RRT;;=::<;;=\202" \ + "::<\2;;=\345\345\345\202\377\377\377\1\376\376\376\203\377\377\377\2" \ + "__a;;=\202::<\1;;=\202::<\1\264\264\264\206\377\377\377\1\376\376\376" \ + "\224\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1" \ + "kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\226\377\377\377" \ + "\1\376\376\376\204\377\377\377\2\363\363\363FFH\203::<\1;;=\202::<\2" \ + "FFH\346\346\346\204\377\377\377\1\376\376\376\233\377\377\377\1\376\376" \ + "\376\203\377\377\377\3\376\376\376xxz99;\202::<\1""99;\202::<\4;;=\204" \ + "\204\206\377\377\377\376\376\376\202\377\377\377\1\376\376\376\213\377" \ + "\377\377\1\234\234\234\202::<\10;;=99;;;=::<\317\317\317\376\376\376" \ + "\363\363\363GGI\203::<\1;;=\203::<\3\331\331\331\377\377\377\376\376" \ + "\376\202\377\377\377\1\376\376\376\217\377\377\377\5\363\363\363GGI;" \ + ";=::<;;=\202::<\7""99;FFH\363\363\363\377\377\377\316\316\316::<;;=\202" \ + "::<\3:9>::<\234\234\236\207\377\377\377\7\376\377\377\376\376\376\377" \ + "\377\377\377\377\375\377\377\377\377\375\374\376\377\377\210\377\377" \ + "\377\10\376\376\374\376\377\377\354\364\366\377\377\375\376\377\377\377" \ + "\376\374\377\377\375\376\377\377\230\377\377\377\10\377\377\375\376\377" \ + "\377\377\376\375\375\376\377\376\377\377\301\317\330\0>g\0>j\210\0=i" \ + "\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240" \ + "\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377\377\377\5\376" \ + "\376\376\377\377\377kkm::<;;=\202::<\3""99;::<^^`\204\377\377\377\1\376" \ + "\376\376\227\377\377\377\1\316\316\316\202::<\203;;=\202::<\1\347\347" \ + "\347\221\377\377\377\1kkm\206::<\1\316\316\316\303\377\377\377\12\376" \ + "\376\376\377\377\377\301\301\301;;=::<;;=::<99;::<\204\204\206\204\377" \ + "\377\377\4\376\376\376\377\377\377\376\376\376\266\266\266\202::<\5;" \ + ";=::<;;=::<``b\203\377\377\377\1\376\376\376\227\377\377\377\1\234\234" \ + "\234\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377" \ + "\1kkm\206::<\1\234\234\236\233\377\377\377\1\265\265\267\204::<\4""9" \ + "9;;;=::<\234\234\234\203\377\377\377\3\376\376\376\377\377\377\376\376" \ + "\376\231\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\376\376\376\202\377\377\377\5\363\363\363GGI99;::<;;=\202::<\3;;=::" \ + "<\346\346\346\204\377\377\377\1\376\376\376\212\377\377\377\3\234\234" \ + "\234::<99;\202;;=\202::<\1\315\315\315\202\377\377\377\3\301\301\303" \ + ";;=99;\202;;=\5::<;;=::<``b\376\376\376\202\377\377\377\1\376\376\376" \ + "\215\377\377\377\6\376\376\376\377\377\377\376\376\376xxz::<;;=\203:" \ + ":<\202;;=\1\300\300\302\202\377\377\377\3\316\316\316;;=99;\202::<\3" \ + ";:\77::<\234\234\236\206\377\377\377\2\377\377\375\376\377\375\202\376" \ + "\377\377\4\377\377\375\377\377\377\377\376\377\377\377\375\211\377\377" \ + "\377\1\376\376\374\202\377\377\377\3\377\376\377\377\377\377\375\376" \ + "\377\231\377\377\377\202\376\377\377\5\377\376\377\376\377\377\377\377" \ + "\375\277\320\332\0\77j\211\0=i\3\0>i\0=i\177\236\263\232\377\377\377" \ + "\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234" \ + "\234\236\213\377\377\377\3\376\376\376\377\377\377\376\376\376\204\377" \ + "\377\377\1\265\265\265\202::<\1;;=\204::<\1\315\315\317\204\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\220\377\377\377\1\376\376" \ + "\376\202\377\377\377\3\204\204\204::<;;=\204::<\2yy{\376\376\376\221" \ + "\377\377\377\1kkm\206::<\1\316\316\316\305\377\377\377\4kkm;;=::<;;=" \ + "\203::<\1\316\316\316\210\377\377\377\1TTV\206::<\2\317\317\321\376\376" \ + "\376\231\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377" \ + "\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\233\377\377\377" \ + "\1TTV\202::<\7;;=::<;;=::i\0=i\177\236\263\232\377\377" \ + "\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1" \ + "\234\234\236\221\377\377\377\4\376\376\376\377\377\377SSU;;=\202::<\4" \ + ";;=99;;;=\204\204\206\203\377\377\377\1\376\376\376\226\377\377\377\11" \ + "\363\363\36399;;;=::<;;=::<;;=::<\316\316\316\202\377\377\377\1\376\376" \ + "\376\217\377\377\377\1kkm\206::<\1\316\316\316\304\377\377\377\1\316" \ + "\316\316\206::<\1kkk\211\377\377\377\2\235\235\23599;\202;;=\6::<;;=" \ + "::99;\202::<\3;;" \ + "=::<\234\234\236\211\377\377\377\4\377\375\376\376\377\377\254\334\363" \ + "Z\266\347\211[\267\350\6\\\266\350X\267\347\326\354\367\377\376\377\376" \ + "\377\377\377\377\375\232\377\377\377\3\377\377\373\375\377\376\376\377" \ + "\377\202\377\377\375\3\276\320\336\0>g\0>i\210\0=i\3\0>i\0=i\177\236" \ + "\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234" \ + "\234\236\206::<\1\234\234\236\223\377\377\377\1\235\235\237\204::<\4" \ + "<<>::<;;=\363\363\363\206\377\377\377\1\376\376\376\222\377\377\377\2" \ + "\234\234\234;;=\205::<\1SSU\204\377\377\377\1\376\376\376\216\377\377" \ + "\377\1kkm\206::<\1\316\316\316\304\377\377\377\1\204\204\204\203::<\1" \ + "99;\202::<\1\265\265\265\211\377\377\377\2\363\363\363FFH\205::<\2;;" \ + "=\346\346\346\231\377\377\377\1\234\234\234\206::<\1\234\234\234\243" \ + "\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\232" \ + "\377\377\377\1\222\222\222\202::<\1;;=\202::<\3;;=FFH\362\362\364\251" \ + "\377\377\377\1\235\235\235\203::<\7;;=::<;;=;;;\331\331\331\377\377\377" \ + "\376\376\376\214\377\377\377\2\234\234\234;;=\205::<\1\316\316\316\202" \ + "\377\377\377\3\376\376\376\377\377\377\301\301\301\205::<\4;;=::<__a" \ + "\376\376\376\216\377\377\377\4\376\376\376yyy::<;;=\205::<\1\316\316" \ + "\320\204\377\377\377\2\316\316\31699;\203::<\3""99;::<\234\234\236\207" \ + "\377\377\377\2\376\377\377\376\376\374\202\377\376\377\3\254\332\362" \ + "Y\267\352[\267\350\210Y\270\350\7[\267\350Y\267\352\326\356\370\376\376" \ + "\377\377\376\377\377\375\377\376\377\377\231\377\377\377\10\377\377\375" \ + "\376\377\377\377\377\377\377\376\377\377\377\375\276\317\331\1>j\0>j" \ + "\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1" \ + "kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377\377\377" \ + "\1\376\376\376\202\377\377\377\4\363\363\365;;=::<;;=\204::<\1\234\234" \ + "\234\231\377\377\377\1SSS\202::<\1;;=\203::<\1\265\265\267\223\377\377" \ + "\377\1kkm\206::<\1\316\316\316\300\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\346\346\350\203::<\4;;=::<;;=SSU\213\377\377\377\1\204\204" \ + "\204\203::<\1;;=\202::<\1\204\204\206\202\377\377\377\1\376\376\376\226" \ + "\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm" \ + "\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\227\377\377\377\1\376" \ + "\376\376\202\377\377\377\3TTV::<;;=\203::<\2;;=\205\205\205\252\377\377" \ + "\377\1\347\347\347\202::<\202;;=\203::<\1\235\235\237\204\377\377\377" \ + "\1\376\376\376\211\377\377\377\1\234\234\234\206::<\1\316\316\316\205" \ + "\377\377\377\1\205\205\205\202::<\6;;=::<;;=::<;;=\234\234\236\213\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\302\302\302\202;;=\203::<\3" \ + ";;=::<\221\221\221\202\377\377\377\1\376\376\376\202\377\377\377\1\316" \ + "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \ + "\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317" \ + "\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \ + "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\224" \ + "\377\377\377\4\204\204\204;;=::<;;=\203::<\1TTT\204\377\377\377\1\376" \ + "\376\376\223\377\377\377\1\300\300\300\203::<\5;;=::<;;=FFF\363\363\363" \ + "\223\377\377\377\1kkm\203::<\4;;=::<;;=\316\316\320\277\377\377\377\14" \ + "\376\376\376\377\377\377\376\376\376\377\377\377\204\204\206::<;;=::" \ + "<99;<<>99;\265\265\267\213\377\377\377\3\346\346\346::<;;=\202::<\1;" \ + ";=\202::<\2\347\347\347\376\376\376\227\377\377\377\1\234\234\234\206" \ + "::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206" \ + "::<\1\234\234\236\226\377\377\377\4\376\376\376\377\377\377\376\376\376" \ + "\346\346\350\202;;=\203::<\3""99;<<>\301\301\301\253\377\377\377\1aa" \ + "c\202::<\1;;=\202::<\2;;=jjl\205\377\377\377\1\376\376\376\210\377\377" \ + "\377\1\234\234\234\206::<\1\316\316\316\202\377\377\377\1\376\376\376" \ + "\202\377\377\377\3\362\362\362SSU;;=\205::<\2;;=\332\332\332\210\377" \ + "\377\377\1\376\376\376\203\377\377\377\2\363\363\363FFH\202::<\202;;" \ + "=\5::<;;=SSS\363\363\363\376\376\376\204\377\377\377\1\316\316\316\206" \ + "::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350" \ + "\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0" \ + ">i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::" \ + "<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\224\377\377" \ + "\377\1\332\332\332\207::<\1\301\301\301\227\377\377\377\1lll\204::<\3" \ + ";;=::<\221\221\221\202\377\377\377\3\376\376\376\377\377\377\376\376" \ + "\376\217\377\377\377\1kkm\204::<\3;;=99;\316\316\316\241\377\377\377" \ + "\1\376\376\376\234\377\377\377\10\376\376\376\377\377\377\376\376\376" \ + "\377\377\377\363\363\363FFH;;=::<\202;;=\3::i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \ + "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \ + "\225\377\377\377\1__a\204;;=\5""99;::99;\202::<\4;;=::<;;=\331\331\331\215\377\377\377\1\234\234\234" \ + "\206::<\1\316\316\316\207\377\377\377\1\222\222\224\202::<\3;;=99;<<" \ + ">\202::<\4\234\234\236\376\376\376\377\377\377\376\376\376\203\377\377" \ + "\377\1\376\376\376\203\377\377\377\6\302\302\304;;=99;;;=::<;;=\202:" \ + ":<\1\234\234\234\202\377\377\377\1\376\376\376\204\377\377\377\1\316" \ + "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \ + "\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317" \ + "\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \ + "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\225" \ + "\377\377\377\2\265\265\265;;=\202::<\2""99;;;=\202::<\2\347\347\347\376" \ + "\376\376\215\377\377\377\3\376\376\376\377\377\377\376\376\376\204\377" \ + "\377\377\3\221\221\223;;=99;\204::<\3xxz\377\377\377\376\376\376\202" \ + "\377\377\377\202\376\376\376\217\377\377\377\1kkm\202::<\5;;=99;;;=9" \ + "9;\317\317\317\233\377\377\377\1\376\376\376\237\377\377\377\1\376\376" \ + "\376\204\377\377\377\3\376\376\376\377\377\377GGI\202::<\5;;=::<;;=:" \ + ":<\346\346\346\213\377\377\377\1\376\376\376\202\377\377\377\2``b99;" \ + "\202;;=\203::<\3\247\247\247\377\377\377\376\376\376\225\377\377\377" \ + "\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377" \ + "\377\377\1kkm\206::<\1\234\234\236\231\377\377\377\10kkm::<;;=::<;;=" \ + "99;::<\235\235\237\255\377\377\377\202::<\1;;=\204::<\1\301\301\301\215" \ + "\377\377\377\1\234\234\234\206::<\1\316\316\316\206\377\377\377\5\376" \ + "\376\376\364\364\364TTV::<99;\202;;=\203::<\4\332\332\334\376\376\376" \ + "\377\377\377\376\376\376\203\377\377\377\6\376\376\376\377\377\377\363" \ + "\363\363FFH::<;;=\204::<\1__a\210\377\377\377\1\316\316\316\206::<\1" \ + "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270" \ + "\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0" \ + "=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240" \ + "\377\377\377\1\234\234\236\206::<\1\234\234\236\224\377\377\377\5\376" \ + "\376\376\377\377\377GGI::<;;=\203::<\4;;=\220\220\222\377\377\377\376" \ + "\376\376\214\377\377\377\1\376\376\376\203\377\377\377\10\376\376\376" \ + "\377\377\377\363\363\363FFH::<;;=99;;;=\202::<\1\316\316\320\202\377" \ + "\377\377\1\376\376\376\204\377\377\377\1\376\376\376\215\377\377\377" \ + "\1kkm\206::<\1\316\316\316\277\377\377\377\3\376\376\376\377\377\377" \ + "\265\265\267\204::<\3;;=::<\205\205\205\213\377\377\377\1\376\376\376" \ + "\202\377\377\377\2\376\376\376\265\265\265\202::<\5""99;<<>::<;;=SSU" \ + "\202\377\377\377\1\376\376\376\224\377\377\377\1\234\234\234\206::<\1" \ + "\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<" \ + "\1\234\234\236\230\377\377\377\2\376\376\376SSU\204::<\3;;=::<\266\266" \ + "\266\253\377\377\377\3\376\376\376\377\377\377^^`\206::<\1\234\234\234" \ + "\202\377\377\377\1\376\376\376\212\377\377\377\1\234\234\234\206::<\1" \ + "\316\316\316\205\377\377\377\6\376\376\376\377\377\377\376\376\376\315" \ + "\315\317::<;;=\202::<\4;;=99;::<``b\210\377\377\377\4xxz99;<<>::<\202" \ + ";;=\202::<\1\332\332\332\203\377\377\377\1\376\376\376\204\377\377\377" \ + "\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \ + "\350\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276" \ + "\317\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \ + "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \ + "\226\377\377\377\1\234\234\234\206::<\2FFH\376\376\376\214\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377\3\265\265" \ + "\265;;=99;\202;;=\202::<\1SSU\202\377\377\377\1\376\376\376\223\377\377" \ + "\377\1kkm\203::<\4""99;::<;;=\316\316\320\275\377\377\377\202\376\376" \ + "\376\4\377\377\377\376\376\376SSU;;=\202::<\4;;=::<;;=\332\332\332\215" \ + "\377\377\377\5\376\376\376\377\377\377\376\376\376SSU;;=\204::<\2;;=" \ + "\264\264\264\226\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377" \ + "\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\231\377" \ + "\377\377\207::<\1\316\316\316\254\377\377\377\2\376\376\376lln\202::" \ + "<\1;;=\202::<\4;;=\233\233\233\377\377\377\376\376\376\202\377\377\377" \ + "\1\376\376\376\210\377\377\377\1\234\234\234\206::<\1\316\316\316\203" \ + "\377\377\377\202\376\376\376\204\377\377\377\1\234\234\234\207::<\1\234" \ + "\234\236\205\377\377\377\4\376\376\376\300\300\302::<;;=\205::<\2\234" \ + "\234\234\376\376\376\202\377\377\377\1\376\376\376\205\377\377\377\1" \ + "\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \ + "\350\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276" \ + "\317\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \ + "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \ + "\226\377\377\377\1\347\347\347\204::<\5;;=99;;;=\265\265\265\376\376" \ + "\376\222\377\377\377\2___99;\202::<\4;;=::<;;=\265\265\265\207\377\377" \ + "\377\1\376\376\376\216\377\377\377\1kkm\203::<\1;;=\202::<\1;;=\233:" \ + ":<\5""99;;;=::<:::\234\234\234\240\377\377\377\2\316\316\316;;=\204:" \ + ":<\2;;=kkm\221\377\377\377\1\234\234\236\203::<\1;;=\202::<\3kkk\377" \ + "\377\377\376\376\376\224\377\377\377\1\234\234\234\206::<\1\234\234\234" \ + "\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236" \ + "\231\377\377\377\207::<\1\316\316\316\255\377\377\377\2\221\221\221;" \ + ";=\205::<\1\204\204\204\203\377\377\377\1\376\376\376\211\377\377\377" \ + "\1\234\234\234\206::<\1\316\316\316\210\377\377\377\3\376\376\376\377" \ + "\377\377``b\202::<\7;;=::<;;=::<;;=\332\332\332\376\376\376\202\377\377" \ + "\377\3\376\376\376\363\363\363GGI\203::<\4;;=::<;;=__a\206\377\377\377" \ + "\1\376\376\376\203\377\377\377\1\316\316\316\206::<\1\234\234\236\213" \ + "\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[\267\350" \ + "\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3\0>i\0=i" \ + "\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377" \ + "\1\234\234\236\206::<\1\234\234\236\227\377\377\377\1\204\204\206\204" \ + "::<\3;;=::i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316" \ + "\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\227\377" \ + "\377\377\1\315\315\315\205::<\3;;=::<\332\332\334\221\377\377\377\1\204" \ + "\204\206\205::<\2;;=\205\205\205\227\377\377\377\1kkm\203::<\3;;=::<" \ + ";;=\234::<\1:9>\203::<\1\234\234\236\237\377\377\377\1\331\331\331\202" \ + ";;=\204::<\1SSU\217\377\377\377\5\376\376\376\377\377\377\376\376\376" \ + "\377\377\377\204\204\204\204::<\3;;=99;yyy\203\377\377\377\1\376\376" \ + "\376\221\377\377\377\1\234\234\234\206::<\1\234\234\234\235\377\377\377" \ + "\1\376\376\376\205\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206:" \ + ":<\1\234\234\236\231\377\377\377\203::<\1;;=\203::<\202\377\377\377\1" \ + "\376\376\376\253\377\377\377\2\233\233\235;;=\205::<\3kkm\377\377\377" \ + "\376\376\376\202\377\377\377\1\376\376\376\210\377\377\377\1\234\234" \ + "\234\206::<\1\316\316\316\213\377\377\377\1\234\234\236\202;;=\1""99" \ + ";\203::<\5;;=\235\235\235\377\377\377\376\376\376\302\302\302\207::<" \ + "\1\251\251\251\213\377\377\377\1\316\316\316\206::<\1\234\234\236\213" \ + "\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[\267\350" \ + "\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3\0>i\0=i" \ + "\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377" \ + "\1\234\234\236\206::<\1\234\234\236\223\377\377\377\1\376\376\376\204" \ + "\377\377\377\1^^`\202::<\202;;=\3::<<<>\204\204\206\213\377\377\377\1" \ + "\376\376\376\204\377\377\377\1\363\363\363\205::<\3;;=::<\346\346\346" \ + "\227\377\377\377\1kkm\204::<\3;;=::<;;=\234::<\1;;=\202::<\1\234\234" \ + "\236\237\377\377\377\4\204\204\20499;::<;;=\203::<\3\266\266\270\377" \ + "\377\377\376\376\376\221\377\377\377\5\346\346\346;;=::<;;=::<\202;;" \ + "=\4::<\346\346\350\377\377\377\376\376\376\202\377\377\377\1\376\376" \ + "\376\217\377\377\377\1\234\234\234\206::<\1\234\234\234\237\377\377\377" \ + "\202\376\376\376\202\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206" \ + "::<\1\234\234\236\224\377\377\377\6\376\376\376\377\377\377\376\376\376" \ + "\377\377\377\376\376\376;;=\206::<\1\331\331\331\255\377\377\377\1\234" \ + "\234\236\202::<\1;;=\203::<\2kkm\376\376\376\202\377\377\377\1\376\376" \ + "\376\211\377\377\377\1\234\234\234\206::<\1\316\316\316\212\377\377\377" \ + "\3\376\376\376\377\377\377___\204::<\7;;=99;::<\332\332\332\363\363\365" \ + "FFH;;=\204::<\3;;=kkm\376\376\376\213\377\377\377\1\316\316\316\206:" \ + ":<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350" \ + "\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0" \ + ">i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::" \ + "<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\224\377\377" \ + "\377\1\376\376\376\203\377\377\377\4\265\265\267::<;;=::<\202;;=\3::" \ + "i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206" \ + "::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\231\377\377" \ + "\377\10FFH::<;;=99;;;=::<;;=\265\265\265\216\377\377\377\4\376\376\376" \ + "TTV99;;;=\202::<\202;;=\1\301\301\301\230\377\377\377\1kkm\202::<\1;" \ + ";=\204::<\3;;=::<;;=\232::<\5;;=::<\234\234\234\377\377\377\376\376\376" \ + "\232\377\377\377\3\376\376\376\377\377\377\221\221\221\202::<\1""99;" \ + "\203::<\5\234\234\236\377\377\377\376\376\376\377\377\377\376\376\376" \ + "\216\377\377\377\1\376\376\376\202\377\377\377\2\316\316\320::<\202;" \ + ";=\204::<\2\363\363\363\376\376\376\202\377\377\377\1\376\376\376\217" \ + "\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm" \ + "\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\224\377\377\377\1\376" \ + "\376\376\204\377\377\377\1""99;\202::<\1;;=\203::<\1\316\316\316\252" \ + "\377\377\377\10\376\376\376\377\377\377\376\376\376kkm;;=::<;;=99;\202" \ + "::<\1\234\234\236\215\377\377\377\1\234\234\234\206::<\1\316\316\316" \ + "\215\377\377\377\5\247\247\247;;=99;::<;;=\210::<\5""99;::<\250\250\252" \ + "\377\377\377\376\376\376\213\377\377\377\1\316\316\316\206::<\1\234\234" \ + "\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[" \ + "\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3" \ + "\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377" \ + "\377\377\1\234\234\236\206::<\1\234\234\236\223\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\203\377\377\377\1\234\234\236\202::<\1;" \ + ";=\202::<\2""99;SSU\214\377\377\377\5\376\376\376\377\377\377\301\301" \ + "\301;;=<<>\202::<\3;;=::i\210\0=i\3\0>i\0=i\177\236\263" \ + "\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234" \ + "\236\206::<\1\234\234\236\224\377\377\377\1\376\376\376\204\377\377\377" \ + "\2\346\346\34699;\202::<\2;;=::<\202;;=\1\315\315\315\212\377\377\377" \ + "\1\376\376\376\202\377\377\377\1yy{\203::<\4;;=99;;;=\250\250\250\202" \ + "\377\377\377\1\376\376\376\226\377\377\377\1kkm\206::<\1\317\317\317" \ + "\240\377\377\377\1\376\376\376\234\377\377\377\1\234\234\234\202::<\2" \ + "99;;;=\202::<\1\204\204\206\203\377\377\377\1\376\376\376\220\377\377" \ + "\377\1\376\376\376\202\377\377\377\2\264\264\264::<\202;;=\203::<\3G" \ + "GI\364\364\364\376\376\376\202\377\377\377\1\376\376\376\216\377\377" \ + "\377\1\234\234\234\206::<\1\234\234\234\241\377\377\377\3\376\376\376" \ + "\377\377\377kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\225" \ + "\377\377\377\202\376\376\376\202\377\377\377\12kkm::<;;=99;::<;;=::<" \ + "\204\204\204\377\377\377\376\376\376\251\377\377\377\4\376\376\376\377" \ + "\377\377::<99;\202;;=\203::<\1\316\316\320\215\377\377\377\1\234\234" \ + "\234\206::<\1\316\316\316\216\377\377\377\5\346\346\350GGI;;=::<;;=\202" \ + "::<\2""99;;;=\202::<\3;;=GGI\346\346\350\216\377\377\377\1\316\316\316" \ + "\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267" \ + "\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0" \ + "=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206" \ + "::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\231\377\377" \ + "\377\2\376\376\376\205\205\205\202::<\5""99;;;=::<;;=\205\205\207\213" \ + "\377\377\377\12\376\376\376\346\346\346::<;;=99;::<99;;;=FFH\363\363" \ + "\363\231\377\377\377\1kkm\202::<\2;;=::<\202;;=\3\316\316\316\377\377" \ + "\377\376\376\376\234\377\377\377\1\376\376\376\236\377\377\377\1SSS\204" \ + "::<\3;;=99;\347\347\351\204\377\377\377\1\376\376\376\215\377\377\377" \ + "\1\376\376\376\205\377\377\377\1SSU\203::<\4;;=99;::<\265\265\265\202" \ + "\377\377\377\1\376\376\376\217\377\377\377\1\234\234\234\206::<\1\234" \ + "\234\234\242\377\377\377\2\376\376\376SSU\206::<\237\377\377\377\1kk" \ + "m\206::<\1\234\234\236\231\377\377\377\4\221\221\223;;=::<;;=\202::<" \ + "\3;;=___\376\376\376\253\377\377\377\1\332\332\332\204::<\1;;=\202::" \ + "<\1\346\346\350\203\377\377\377\1\376\376\376\211\377\377\377\1\234\234" \ + "\234\206::<\1\316\316\316\217\377\377\377\1\250\250\252\204::<\202;;" \ + "=\2::<;;=\202::<\1\265\265\267\217\377\377\377\1\316\316\316\206::<\1" \ + "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270" \ + "\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0" \ + "=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240" \ + "\377\377\377\1\234\234\236\206::<\1\234\234\236\232\377\377\377\1\316" \ + "\316\316\203::<\2""99;<<>\202::<\1\346\346\350\213\377\377\377\4\221" \ + "\221\223;;=::<;;=\203::<\1\204\204\206\232\377\377\377\1kkm\203::<\1" \ + ";;=\202::<\1\316\316\316\274\377\377\377\2\265\265\267;;=\205::<\1xx" \ + "x\231\377\377\377\1\250\250\250\206::<\1TTV\222\377\377\377\1\234\234" \ + "\234\204::<\3;;=::<\235\235\235\203\377\377\377\1\376\376\376\237\377" \ + "\377\377\202;;=\203::<\3;;=::<\376\376\376\236\377\377\377\1kkm\206:" \ + ":<\1\234\234\236\225\377\377\377\1\376\376\376\203\377\377\377\1\265" \ + "\265\267\204::<\1;;=\202::<\1\363\363\363\253\377\377\377\1\250\250\250" \ + "\204::<\3;;=::j\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316" \ + "\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\233\377" \ + "\377\377\1``b\205::<\2;;=\235\235\237\210\377\377\377\1\376\376\376\202" \ + "\377\377\377\2FFH;;=\205::<\1\346\346\346\202\377\377\377\1\376\376\376" \ + "\227\377\377\377\1kkm\206::<\1\316\316\316\266\377\377\377\1\376\376" \ + "\376\205\377\377\377\5__a::<;;=::<;;=\202::<\1SSU\202kkm\1lln\203kkm" \ + "\1lln\222kkm\4__a;;=99;;;=\204::<\3\301\301\301\377\377\377\376\376\376" \ + "\215\377\377\377\202\376\376\376\1\235\235\235\204::<\3""99;;;=\221\221" \ + "\221\243\377\377\377\203::<\1;;=\202::<\1""99;\237\377\377\377\1kkm\206" \ + "::<\1\234\234\236\231\377\377\377\1\332\332\332\202::<\3;;=::<99;\202" \ + ";;=\1\264\264\264\210\377\377\377\1\376\376\376\232\377\377\377\1\376" \ + "\376\376\206\377\377\377\2\376\376\376xxx\202::<\1;;=\203::<\1xxz\216" \ + "\377\377\377\1\234\234\234\206::<\1\316\316\316\220\377\377\377\3\363" \ + "\363\365FFH;;=\202::<\1;;=\202::<\2FFH\363\363\363\220\377\377\377\1" \ + "\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \ + "\350\211[\267\350\10X\267\347Y\267\352\326\354\371\377\377\377\376\376" \ + "\376\377\376\377\377\377\377\377\376\377\234\377\377\377\2\376\376\374" \ + "\277\320\330\212\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \ + "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\233" \ + "\377\377\377\1\265\265\267\203::<\4""99;;;=::9" \ + "9;::<;;=::<99;\203::<\2;;=99;\202::<\1;;=\224::<\1;;=\202::<\1;;=\203" \ + "::<\1kkm\203\377\377\377\1\376\376\376\215\377\377\377\1\300\300\300" \ + "\202::<\11;;=::<99;;;=jjl\377\377\377\376\376\376\377\377\377\376\376" \ + "\376\236\377\377\377\1\346\346\350\206::<\1__a\237\377\377\377\1kkm\206" \ + "::<\1\234\234\236\231\377\377\377\2\376\376\376SSU\206::<\2yy{\376\376" \ + "\376\206\377\377\377\1\376\376\376\234\377\377\377\1\376\376\376\205" \ + "\377\377\377\4\363\363\363::<<<>99;\202::<\3;;=::<\265\265\267\203\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\210\377\377\377\1\234" \ + "\234\234\206::<\1\316\316\316\221\377\377\377\4\301\301\30199;::<;;=" \ + "\202::<\6;;=\301\301\301\377\377\377\376\376\376\377\377\377\376\376" \ + "\376\215\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377" \ + "\2\255\333\363Y\270\350\211[\267\350\6Y\270\350Y\267\352\325\353\370" \ + "\377\377\377\376\377\375\377\375\377\234\377\377\377\5\376\376\376\377" \ + "\377\377\377\377\375\276\317\327\2\77k\211\0=i\3\0>i\0=i\177\236\263" \ + "\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234" \ + "\236\206::<\1\234\234\236\234\377\377\377\1GGI\203::<\1;;=\202::<\2\301" \ + "\301\301\376\376\376\204\377\377\377\1\376\376\376\203\377\377\377\3" \ + "lln::<;;=\202::<\202;;=\4\301\301\303\376\376\376\377\377\377\376\376" \ + "\376\230\377\377\377\1kkm\206::<\1\316\316\316\265\377\377\377\1\376" \ + "\376\376\205\377\377\377\3kkm::<;;=\202::<\2""99;<<>\202::<\3;;=::<;" \ + ";=\202::<\1;;=\222::<\4""99;;;=::<;;=\203::<\1;;=\202::<\3\316\316\316" \ + "\377\377\377\376\376\376\215\377\377\377\3\376\376\376\316\316\316;;" \ + "=\203::<\3;;=::\204::<\3\346" \ + "\346\346\377\377\377\376\376\376\202\377\377\377\1\376\376\376\211\377" \ + "\377\377\1\234\234\234\206::<\1\316\316\316\220\377\377\377\14\376\376" \ + "\376\377\377\377yy{::<99;;;=::j\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \ + "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\234" \ + "\377\377\377\1\234\234\234\206::<\3jjj\377\377\377\376\376\376\204\377" \ + "\377\377\4\376\376\376\377\377\377\332\332\33299;\203::<\3;;=::j\210\0=i\3\0>i\0=i\177" \ + "\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1" \ + "\234\234\236\206::<\1\234\234\236\233\377\377\377\2\376\376\376\347\347" \ + "\347\202::<\2;;=::<\203;;=\1\346\346\346\207\377\377\377\5\204\204\204" \ + "<<>99;::<;;=\202::<\2\251\251\251\376\376\376\205\377\377\377\1\376\376" \ + "\376\225\377\377\377\1kkm\206::<\1\316\316\316\264\377\377\377\1\376" \ + "\376\376\205\377\377\377\3\204\204\206::<;;=\203::<\1;;=\205::<\1;;=" \ + "\225::<\3;;=::<;;=\202::<\1;;=\202::<\1;;=\202::<\1\347\347\347\220\377" \ + "\377\377\2SSU;;=\203::<\3;;=::<\265\265\265\237\377\377\377\7\376\376" \ + "\376\377\377\377lln99;::<;;=99;\202::<\1\265\265\267\237\377\377\377" \ + "\1kkm\206::<\1\234\234\236\225\377\377\377\1\376\376\376\204\377\377" \ + "\377\3\376\376\376SSU;;=\204::<\3;;=FFH\346\346\346\202\377\377\377\1" \ + "\376\376\376\237\377\377\377\1\376\376\376\204\377\377\377\2\265\265" \ + "\267;;=\202::<\1;;=\203::<\1\265\265\265\217\377\377\377\1\234\234\234" \ + "\206::<\1\316\316\316\223\377\377\377\4\301\301\301::<:::\302\302\302" \ + "\223\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2" \ + "\255\333\363Y\270\350\212[\267\350\2Y\270\350\332\354\370\202\377\377" \ + "\377\3\376\376\376\376\377\377\377\376\373\235\377\377\377\1\276\317" \ + "\331\202\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \ + "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\235" \ + "\377\377\377\1\204\204\204\206::<\1\221\221\223\206\377\377\377\2\363" \ + "\363\363GGI\202::<\5""99;;;=::i\210\0=i\3\0>i\0=i\177\236" \ + "\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234" \ + "\234\236\206::<\1\234\234\236\235\377\377\377\1\316\316\316\206::<\1" \ + "FFH\203\377\377\377\1\376\376\376\202\377\377\377\1\250\250\250\203:" \ + ":<\1;;=\202::<\1\204\204\206\203\377\377\377\1\376\376\376\231\377\377" \ + "\377\1kkm\206::<\1\316\316\316\271\377\377\377\1\234\234\236\204::<\4" \ + ";;=::j\0>i\210\0=i\3\0>i\0=i\177\236\263\232" \ + "\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236" \ + "\206::<\1\234\234\236\236\377\377\377\2__a;;=\204::<\5;;=\265\265\265" \ + "\376\376\376\377\377\377\376\376\376\202\377\377\377\1SSU\204::<\3;;" \ + "=::<\346\346\350\235\377\377\377\1kkm\206::<\1\316\316\316\270\377\377" \ + "\377\2\363\363\365GGI\205::<\3;;=\333\333\333\376\376\376\237\377\377" \ + "\377\10FFH::<;;=::<;;=99;;;=\233\233\235\217\377\377\377\5\346\346\346" \ + "::<;;=::<;;=\203::<\1\234\234\234\210\377\377\377\1\376\376\376\217\377" \ + "\377\377\1\376\376\376\206\377\377\377\1TTT\205::<\3;;=\221\221\221\376" \ + "\376\376\237\377\377\377\1kkm\206::<\1\234\234\236\234\377\377\377\12" \ + "\233\233\233::<;;=::<;;=::<;;=::l\0\77j\210\0=i\3\0>i\0=" \ + "i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377" \ + "\1\234\234\236\206::<\1\234\234\236\236\377\377\377\1\265\265\265\204" \ + "::<\3;;=::<__a\204\377\377\377\1\317\317\321\206::<\1kkk\236\377\377" \ + "\377\1kkm\206::<\1\316\316\316\267\377\377\377\3\376\376\376\250\250" \ + "\25299;\202;;=\203::<\1kkm\233\377\377\377\1\376\376\376\205\377\377" \ + "\377\10\234\234\236;;=::<;;=::<;;=99;GGI\204\377\377\377\3\376\376\376" \ + "\377\377\377\376\376\376\210\377\377\377\5\376\376\376__a::<;;=99;\203" \ + ";;=\2FFH\363\363\363\204\377\377\377\3\376\376\376\377\377\377\376\376" \ + "\376\224\377\377\377\5\376\376\376\377\377\377\301\301\301:::;;=\202" \ + "::<\202;;=\4::<\332\332\332\377\377\377\376\376\376\236\377\377\377\1" \ + "kkm\206::<\1\234\234\236\233\377\377\377\3\376\376\376\364\364\364FF" \ + "H\205::<\4;;=99;xxx\376\376\376\203\377\377\377\1\376\376\376\203\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\224\377\377\377" \ + "\4\376\376\376\377\377\377\362\362\362GGI\202::<\6;;=::<;;=::<99;\250" \ + "\250\252\221\377\377\377\1\234\234\234\206::<\1\316\316\316\252\377\377" \ + "\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363" \ + "Y\270\350\211[\267\350\7Y\267\352X\267\347[\266\353\301\344\367\377\377" \ + "\377\376\376\376\376\377\377\211\377\377\377\6\377\376\377\377\377\377" \ + "\377\375\376\377\377\377\377\377\375\377\376\377\202\377\377\377\210" \ + "\377\376\377\10\377\377\375\376\377\377\377\377\377\376\377\375\237\266" \ + "\306\0=i\2=g\0>e\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \ + "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \ + "\237\377\377\377\1EEG\202::<\202;;=\11""99;;;=\332\332\332\377\377\377" \ + "\376\376\376\377\377\377xxz::<;;=\204::<\1\302\302\302\236\377\377\377" \ + "\1kkm\206::<\1\316\316\316\266\377\377\377\4\376\376\376\377\377\377" \ + "SSU;;=\202::<\1;;=\202::<\1\316\316\320\235\377\377\377\15\376\376\376" \ + "\377\377\377\376\376\376\377\377\377\363\363\365::<;;=99;;;=::<;;=::" \ + "<\265\265\265\215\377\377\377\3\376\376\376\377\377\377\266\266\270\202" \ + "::<\1;;=\203::<\2;;=\204\204\206\205\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\213\377\377\377\1\376\376\376\205\377\377\377\1\376" \ + "\376\376\202\377\377\377\2\363\363\363SSU\203::<\4;;=99;;;=SSU\241\377" \ + "\377\377\1kkm\206::<\1\234\234\236\235\377\377\377\3\265\265\265;;=9" \ + "9;\202::<\1;;=\203::<\1\204\204\206\206\377\377\377\1\376\376\376\216" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\206\377\377\377\6" \ + "\376\376\376\377\377\377\362\362\364``b::<;;=\202::<\1;;=\202::<\2aa" \ + "c\376\376\376\221\377\377\377\1\234\234\234\206::<\1\316\316\316\252" \ + "\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255" \ + "\333\363Y\270\350\211[\267\350\10X\267\347[\267\346[\265\347[\267\346" \ + "\230\320\361\327\360\367\325\356\365\331\355\370\210\326\354\371\10\325" \ + "\355\367\323\355\372\366\373\377\377\376\374\376\377\375\276\320\332" \ + "\277\320\330\301\317\330\210\276\317\331\10\276\317\327\276\320\334\301" \ + "\316\327_\207\241\0>i\0=l\0\77k\0>i\210\0=i\3\0>i\0=i\177\236\263\232" \ + "\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236" \ + "\206::<\1\234\234\236\237\377\377\377\3\222\222\224::<;;=\202::<\3;;" \ + "=99;\205\205\207\202\377\377\377\2\346\346\346;;=\202::<\1;;=\202::<" \ + "\1SSU\237\377\377\377\1kkm\206::<\1\316\316\316\267\377\377\377\5\265" \ + "\265\26799;;;=::<;;=\202::<\1TTV\243\377\377\377\1\204\204\206\205::" \ + "<\2;;=SSU\206\377\377\377\1\376\376\376\210\377\377\377\3\376\376\376" \ + "GGI;;=\202::<\5;;=::<;;=::<\301\301\303\203\377\377\377\1\376\376\376" \ + "\214\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\376\376\376\204\377\377\377\3\204\204\206;;=::<\202;;=\203" \ + "::<\1\265\265\265\241\377\377\377\1kkm\206::<\1\234\234\236\236\377\377" \ + "\377\12kkk::<99;;;=::<99;;;=::<;;=\204\204\206\210\377\377\377\202\376" \ + "\376\376\213\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376" \ + "\202\377\377\377\1\376\376\376\202\377\377\377\2\364\364\366__a\206:" \ + ":<\3;;=::<\332\332\332\222\377\377\377\1\234\234\234\206::<\1\316\316" \ + "\316\252\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377" \ + "\2\255\333\363Y\270\350\211[\267\350\3\\\266\350X\270\352\\\266\352\202" \ + "[\267\350\3X\267\347Y\270\350Z\266\347\210Y\270\350\10[\267\350[\265" \ + "\351\327\355\372\376\377\377\377\377\375\0>j\0>i\1\77h\210\0>i\10\0\77" \ + "k\0>g\2=g\0=i\0\77j\0j\210\0=i\3\0>i\0=i\177\236\263\232\377" \ + "\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206" \ + "::<\1\234\234\236\236\377\377\377\2\376\376\376\346\346\346\202::<\10" \ + ";;=::<99;;;=::<\363\363\363\377\377\377\234\234\236\202::<\6;;=::<;;" \ + "=::<\250\250\250\376\376\376\236\377\377\377\1kkm\206::<\1\316\316\316" \ + "\267\377\377\377\10kkm;;=::<;;=99;::<;;=\264\264\266\236\377\377\377" \ + "\1\376\376\376\204\377\377\377\2\346\346\346;;=\202::<\202;;=\202::<" \ + "\2\316\316\320\376\376\376\203\377\377\377\1\376\376\376\205\377\377" \ + "\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\3\234\234" \ + "\234::<;;=\202::<\6;;=::<;;=GGI\332\332\332\376\376\376\224\377\377\377" \ + "\1\376\376\376\203\377\377\377\2\266\266\266;;=\202::<\6;;=::<;;=::<" \ + "SSU\376\376\376\241\377\377\377\1kkm\206::<\1\234\234\236\236\377\377" \ + "\377\2\363\363\363GGI\203::<\1;;=\203::<\3""99;\204\204\204\363\363\363" \ + "\225\377\377\377\1\376\376\376\204\377\377\377\4\376\376\376\346\346" \ + "\346``b::<\202;;=\3::<99;<<>\202::<\1\250\250\250\223\377\377\377\1\234" \ + "\234\234\206::<\1\316\316\316\252\377\377\377\1\316\316\316\206::<\1" \ + "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\10Y" \ + "\270\350X\270\353Y\267\352X\266\351X\271\346[\267\350\\\266\353[\267" \ + "\350\210Y\270\350\7X\267\345]\267\351\323\355\372\377\376\377\376\377" \ + "\377\4=h\0>g\211\0=i\10\2=i\0@j\0>i\1>j\0>i\1\77h\0>g\0>j\210\0=i\3\0" \ + ">i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377" \ + "\377\377\1\234\234\236\206::<\1\234\234\236\237\377\377\377\6\376\376" \ + "\376yy{::<;;=::<;;=\202::<\4\251\251\251\376\376\376SSU;;=\203::<\3;" \ + ";=FFH\363\363\363\237\377\377\377\1kkm\206::<\1\316\316\316\264\377\377" \ + "\377\5\376\376\376\377\377\377\315\315\317::<;;=\204::<\2FFH\376\376" \ + "\376\237\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376kkm;" \ + ";=\204::<\6""99;lln\377\377\377\376\376\376\377\377\377\376\376\376\202" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\205\377\377\377\10" \ + "\376\376\376\377\377\377SSU::<99;;;=99;;;=\202::<\2FFF\332\332\332\203" \ + "\377\377\377\1\376\376\376\212\377\377\377\1\376\376\376\210\377\377" \ + "\377\1\265\265\265\206::<\3""99;::<\265\265\265\203\377\377\377\1\376" \ + "\376\376\236\377\377\377\1kkm\206::<\1\234\234\236\233\377\377\377\1" \ + "\376\376\376\203\377\377\377\1\331\331\331\204::<\3""99;;;=99;\202;;" \ + "=\2^^^\332\332\332\202\377\377\377\1\376\376\376\216\377\377\377\1\376" \ + "\376\376\206\377\377\377\5\376\376\376\316\316\316FFH::<;;=\204::<\7" \ + "99;::<\204\204\204\377\377\377\376\376\376\377\377\377\376\376\376\220" \ + "\377\377\377\1\234\234\234\206::<\1\316\316\316\252\377\377\377\1\316" \ + "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \ + "\213[\267\350\6Y\270\350[\266\353[\267\350]\267\351X\266\351X\270\350" \ + "\210[\267\350\10X\266\351Z\266\351\326\354\367\377\376\377\376\377\372" \ + "\0>j\0>i\1>j\210\0=i\10\1\77h\0=h\0>i\1\77h\0>j\0=i\0>i\1>j\210\0=i\3" \ + "\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377" \ + "\377\377\1\234\234\236\206::<\1\234\234\236\237\377\377\377\2\376\376" \ + "\376\316\316\316\203::<\1;;=\202::<\4SSU\265\265\267;;=99;\202::<\5;" \ + ";=99;\204\204\204\377\377\377\376\376\376\236\377\377\377\1kkm\206::" \ + "<\1\316\316\316\263\377\377\377\1\376\376\376\202\377\377\377\1xxz\202" \ + "::<\1;;=\202::<\3""99;\234\234\236\376\376\376\236\377\377\377\1\375" \ + "\375\375\202\377\377\377\1\376\376\376\202\377\377\377\5\317\317\317" \ + "99;::<;;=::<\202;;=\2::<\332\332\332\210\377\377\377\3\376\376\376\377" \ + "\377\377\376\376\376\204\377\377\377\2\316\316\316;;=\206::<\3;;=::<" \ + "\250\250\252\217\377\377\377\1\376\376\376\204\377\377\377\2\363\363" \ + "\363\222\222\224\202::<\2;;=::<\202;;=\3""99;;;=kkm\205\377\377\377\1" \ + "\376\376\376\235\377\377\377\1kkm\206::<\1\234\234\236\235\377\377\377" \ + "\1\376\376\376\202\377\377\377\2\266\266\26699;\202::<\3;;=::<;;=\202" \ + "::<\3;;=FFH\234\234\234\202\377\377\377\1\376\376\376\223\377\377\377" \ + "\2\364\364\364\204\204\206\202::<\1;;=\202::<\1;;=\202::<\3""99;``b\376" \ + "\376\376\224\377\377\377\1\234\234\234\206::<\1\316\316\316\252\377\377" \ + "\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363" \ + "Y\270\350\211[\267\350\10Y\271\353Z\266\347\\\267\344[\267\346X\267\347" \ + "[\267\350X\270\353Z\266\347\210Y\270\350\10Y\267\352\\\267\346\325\355" \ + "\371\377\377\377\376\377\377\0>g\0\77k\0>i\210\0\77j\10\0>i\3>h\0=i\0" \ + "\77i\0=j\0>g\0=j\0=f\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1" \ + "\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234" \ + "\236\234\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377" \ + "\377\2SSU;;=\202::<\202;;=\3::j\0=i\1>j\210\0>i\10\0\77j\1\77h\0>j\0>g\3>j\0\77i\0=j\0>i\210" \ + "\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm" \ + "\240\377\377\377\1\234\234\236\206::<\1\234\234\236\241\377\377\377\6" \ + "\266\266\270::<;;=::<99;::<\202;;=\205::<\2kkm\376\376\376\240\377\377" \ + "\377\1kkm\206::<\1\316\316\316\265\377\377\377\4\205\205\205;;=::<;;" \ + "=\203::<\3\204\204\206\377\377\377\376\376\376\245\377\377\377\1\265" \ + "\265\267\207::<\2\346\346\346\376\376\376\216\377\377\377\4\376\376\376" \ + "lll::<;;=\202::<\13;;=::<;;=::<;;=::g\1\1>k\220\0=i\15\0>g\1>j\0>" \ + "i\0\77j\1>j\0=i\0\77j\0>j\0=i\199;\203::<\1;;=\202::<\2""99;;;=\203::<\1\204\204\206" \ + "\206\377\377\377\1\376\376\376\221\377\377\377\10\234\234\234;;=::<9" \ + "9;;;=::<99;\316\316\316\252\377\377\377\4\317\317\317;;=88:;;=\202::" \ + "<\3;;=\234\234\234\376\376\376\205\377\377\377\1\377\375\377\202\377" \ + "\377\375\6\377\376\377\377\377\375\253\333\362Y\270\350X\267\347Z\266" \ + "\347\202Y\270\350\1[\267\350\202Z\266\347\2[\267\350Z\266\347\220[\267" \ + "\350\5[\267\352Z\266\351\327\355\372\377\375\376\377\376\377\202\1>j" \ + "\1\1>k\220\0>i\202\0=i\14\0\77k\0>i\0=i\1>j\0=i\0=j\0\77k\0=i\177\236" \ + "\263\377\377\377\376\377\377\375\376\377\224\377\377\377\1\376\376\376" \ + "\202\377\377\377\1\316\316\316\203::<\202;;=\3""99;kkm\376\376\376\234" \ + "\377\377\377\1\376\376\376\202\377\377\377\1\233\233\233\202::<\7;;=" \ + "::<;;=::<\234\234\236\377\377\377\376\376\376\233\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\202\377\377\377\4\221\221\221;;=99;;;=\202" \ + "::<\202;;=\203::<\1SSU\203\377\377\377\1\376\376\376\233\377\377\377" \ + "\10\376\376\376\377\377\377\376\376\376kkm::<;;=::<;;=\202::<\1;;=\202" \ + "::<\1;;=\240::<\1kkk\207\377\377\377\1\376\376\376\203\377\377\377\3" \ + "\375\375\375\377\377\377\376\376\376\202\377\377\377\2\233\233\235::" \ + "<\202;;=\203::<\1xxz\251\377\377\377\1\235\235\237\202::<\1;;=\203::" \ + "<\3GGI\363\363\363\376\376\376\217\377\377\377\2\363\363\363yyy\204:" \ + ":<\1;;=\203::<\1;;=\206::<\1""99;\203::<\1;;=\203::<\6;;=99;;;=::<;;" \ + "=99;\202;;=\3""99;GGI\301\301\301\206\377\377\377\1\376\376\376\232\377" \ + "\377\377\1\376\376\376\204\377\377\377\1lln\202::<\1;;=\202::<\2;;=\234" \ + "\234\236\241\377\377\377\1\376\376\376\202\377\377\377\2\332\332\334" \ + "__a\211::<\1;;=\205::<\1;;=\202::<\1;;=\202::<\4;;=::<99;;;=\202::<\1" \ + ";;=\202::<\1;;=\203::<\2FFH\265\265\267\206\377\377\377\3\376\376\376" \ + "\377\377\377\376\376\376\220\377\377\377\3\234\234\236::<;;=\203::<\2" \ + ";;=\316\316\316\252\377\377\377\2\315\315\31599;\203::<\5;;=::<\234\234" \ + "\234\377\377\377\376\376\376\205\377\377\377\7\377\377\375\375\377\376" \ + "\377\377\377\375\376\377\255\333\365Z\266\345[\267\350\202Y\270\350\1" \ + "X\267\347\202Y\267\352\3Z\266\351Z\266\347Y\270\350\221[\267\350\2[\267" \ + "\352\323\355\372\202\376\377\377\1\0=j\222\0=i\204\0>i\14\1\77h\0>g\0" \ + "=f\1>j\0\77i\0>i\177\237\266\377\377\375\377\376\375\377\377\377\376" \ + "\377\377\377\376\377\225\377\377\377\2\316\316\316::<\202;;=\202::<\4" \ + ";;=kkm\377\377\377\376\376\376\235\377\377\377\2\376\376\376\235\235" \ + "\235\202::<\1;;=\202::<\2;;=\234\234\236\242\377\377\377\3\346\346\346" \ + "::<;;=\210::<\2\235\235\237\376\376\376\234\377\377\377\1\376\376\376" \ + "\204\377\377\377\1lln\202::<\3;;=::<;;=\203::<\2;;=99;\240::<\1kkk\210" \ + "\377\377\377\11\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \ + "\376\377\377\377\376\376\376\364\364\366GGI\205::<\6;;=\316\316\316\377" \ + "\377\377\376\376\376\377\377\377\376\376\376\245\377\377\377\11\345\345" \ + "\345;;=::<;;=::<;;=::<;;=\234\234\236\222\377\377\377\7\234\234\234;" \ + ";=::<;;=99;;;=99;\203::<\1;;=\202::<\203;;=\2::<;;=\202::<\1;;=\202:" \ + ":<\1;;=\202::<\12;;=::<;;=99;::<``b\332\332\332\376\376\376\377\377\377" \ + "\376\376\376\202\377\377\377\5\376\376\376\377\377\377\376\376\376\377" \ + "\377\377\376\376\376\232\377\377\377\5\376\376\376\377\377\377\376\376" \ + "\376kkm;;=\202::<\1;;=\202::<\1\234\234\236\236\377\377\377\1\376\376" \ + "\376\207\377\377\377\2\234\234\236;;=\202::<\1;;=\204::<\1;;=\211::<" \ + "\1;;=\202::<\1;;=\202::<\1;;=\202::<\1;;=\203::<\3;;=kkm\346\346\346" \ + "\203\377\377\377\1\376\376\376\204\377\377\377\1\376\376\376\221\377" \ + "\377\377\2\234\234\236;;=\202::<\1;;=\202::<\1\316\316\316\252\377\377" \ + "\377\4\316\316\316;;=99;;;=\203::<\1\234\234\234\210\377\377\377\7\376" \ + "\377\377\377\375\376\377\377\375\256\332\363Y\270\350Y\267\352[\267\352" \ + "\202[\267\350\5X\270\350X\270\352Y\267\352Y\270\350X\267\347\220[\267" \ + "\350\5X\267\347[\267\350\325\355\367\377\377\373\377\377\375\202\0\77" \ + "j\1\0>g\220\0>i\1\0\77j\203\0>i\202\0=i\6\1>j\0>i\0\77h\0>g\177\236\263" \ + "\377\377\375\203\377\377\377\1\377\376\377\222\377\377\377\1\376\376" \ + "\376\202\377\377\377\1\316\316\316\203::<\1;;=\202::<\2kkm\376\376\376" \ + "\233\377\377\377\1\376\376\376\203\377\377\377\5\234\234\234::<;;=::" \ + "<;;=\202::<\1\234\234\236\235\377\377\377\202\376\376\376\202\377\377" \ + "\377\5\376\376\376\377\377\377xxz99;;;=\204::<\4;;=::<;;=\362\362\362" \ + "\237\377\377\377\5\376\376\376\377\377\377\376\376\376kkm;;=\207::<\2" \ + "99;;;=\240::<\1lll\205\377\377\377\1\376\376\376\203\377\377\377\1\376" \ + "\376\376\202\377\377\377\1\376\376\376\202\377\377\377\4\265\265\267" \ + ";;=::<;;=\202::<\2;;=__a\205\377\377\377\1\376\376\376\245\377\377\377" \ + "\3\204\204\206::<;;=\204::<\2SSU\376\376\376\215\377\377\377\1\376\376" \ + "\376\204\377\377\377\2\316\316\316__a\206::<\1;;=\214::<\5;;=::<;;=:" \ + ":<;;=\203::<\2\234\234\234\363\363\363\204\377\377\377\1\376\376\376" \ + "\243\377\377\377\1lln\206::<\2\233\233\235\376\376\376\233\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\207\377\377\377\3\345\345" \ + "\345lln;;=\204::<\5;;=99;::<99;;;=\205::<\1;;=\203::<\3""99;;;=99;\206" \ + "::<\2TTV\265\265\265\234\377\377\377\10\234\234\234;;=::<;;=::<;;=::" \ + "<\316\316\316\252\377\377\377\1\315\315\315\206::<\4\235\235\235\376" \ + "\376\376\377\377\377\376\376\376\205\377\377\377\12\377\377\373\377\377" \ + "\377\377\377\375\267\340\366[\270\344Z\266\351[\267\352Z\266\351[\265" \ + "\347[\267\350\202Y\270\350\2\\\270\351Z\266\347\220[\267\350\10X\267" \ + "\347X\266\351\325\355\371\377\376\377\377\377\377\0\77k\0=h\3>j\220\0" \ + "\77j\16\1>j\0=i\1>j\0=i\0\77j\0>i\0=h\0\77j\0\77h\1g\0\77h\221\0=i\1\0>g\202\1\77h\1\0=i\202\0>i\11\0\77j\0>g\0>" \ + "j\0\77m\336\347\354\376\377\377\377\376\377\376\377\377\377\377\375\222" \ + "\377\377\377\1\376\376\376\203\377\377\377\1\316\316\316\202::<\1;;=" \ + "\203::<\2kkm\376\376\376\233\377\377\377\1\376\376\376\202\377\377\377" \ + "\3\376\376\376\234\234\234;;=\202::<\6""99;::<;;=\234\234\236\377\377" \ + "\377\376\376\376\237\377\377\377\1\376\376\376\202\377\377\377\1SSS\202" \ + ";;=\1""99;\204;;=\3\331\331\331\377\377\377\376\376\376\234\377\377\377" \ + "\3\376\376\376\377\377\377\376\376\376\202\377\377\377\3lll::<;;=\202" \ + "::<\202;;=\203::<\1;;=\240::<\1kkk\204\377\377\377\1\376\376\376\211" \ + "\377\377\377\3\302\302\302;;;999\202::<\3;;=::g\0" \ + "\77m\220\0=i\6\0\77j\0>i\0=h\0\77j\0=i\0\77j\202\0>g\2\1\77h\240\266" \ + "\304\204\377\377\377\2\376\376\376\377\377\375\223\377\377\377\14\376" \ + "\376\376\377\377\377\315\315\315;;=::<:::;;;:::;;;kkk\377\377\377\376" \ + "\376\376\233\377\377\377\1\376\376\376\202\377\377\377\10\235\235\235" \ + "99;::<999;;;:::;;;\233\233\233\234\377\377\377\1\376\376\376\207\377" \ + "\377\377\1\265\265\265\202::<\1;;=\203::<\1kkk\203\377\377\377\1\376" \ + "\376\376\240\377\377\377\2kkk:::\202::<\3;;=99;;;=\244::<\1kkk\205\377" \ + "\377\377\1\376\376\376\210\377\377\377\1\346\346\346\206\316\316\316" \ + "\3\332\332\332\377\377\377\377\377\375\253\377\377\377\2\346\346\346" \ + "\316\316\316\202\316\316\320\203\316\316\316\1\315\315\315\225\377\377" \ + "\377\202\376\376\376\202\377\377\377\4\316\316\320\234\234\236kkmSSU" \ + "\205::<\1;;=\203::<\5kkm\204\204\206\264\264\266\346\346\350\376\376" \ + "\376\214\377\377\377\1\376\376\376\202\377\377\377\202\376\376\376\231" \ + "\377\377\377\1\376\376\376\203\377\377\377\2\331\331\331\317\317\317" \ + "\205\316\316\316\1\347\347\347\243\377\377\377\1\376\376\376\211\377" \ + "\377\377\5\376\376\377\347\347\351\265\265\267\204\204\206lln\212::<" \ + "\4``bxxz\234\234\236\332\332\332\207\377\377\377\1\376\376\376\210\377" \ + "\377\377\1\376\376\376\222\377\377\377\1\346\346\346\203\316\316\320" \ + "\4\316\316\316\316\316\320\315\315\315\364\364\364\251\377\377\377\2" \ + "\376\376\376\364\364\364\205\316\316\316\2\316\316\320\346\346\346\210" \ + "\377\377\377\16\377\376\377\377\377\375\376\377\377\377\377\377\377\375" \ + "\377\326\354\371\241\326\366\206\310\352\200\312\357\202\312\362\204" \ + "\310\357\204\312\356\203\311\355\205\311\360\220\204\312\356\10\203\311" \ + "\355\201\311\361\342\360\371\376\377\377\377\377\375>n\222Bm\215@n\220" \ + "\220@n\217\3@l\217An\217Bo\220\202An\217\5@m\214Dm\213l\223\260\277\320" \ + "\332\376\377\377\202\377\377\377\1\377\377\375\202\377\377\377\1\376" \ + "\377\377\225\377\377\377\3\363\363\363\317\317\321\316\316\320\204\316" \ + "\316\316\1\332\332\332\240\377\377\377\1\346\346\346\202\316\316\320" \ + "\204\316\316\316\1\347\347\347\243\377\377\377\3\376\376\376\363\363" \ + "\363lln\202kkm\1lln\202kkm\1\301\301\301\240\377\377\377\1\376\376\376" \ + "\203\377\377\377\2\331\331\331\317\317\317\202\316\316\316\202\317\317" \ + "\317\245\316\316\316\2\332\332\332\376\376\376\351\377\377\377\5\332" \ + "\332\332\315\315\315\316\316\316\315\315\315\363\363\363\361\377\377" \ + "\377\202\316\316\316\1\317\317\317\202\316\316\316\2\315\315\315\363" \ + "\363\363\377\377\377\377\377\377\377\377\377\377\377\377\334\377\377" \ + "\377\1\376\376\376\375\377\377\377\1\376\376\376\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\340\377\377\377\1\376\376\376\370\377\377" \ + "\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\342" \ + "\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\334\377\377\377\1\376\376\376\362\377\377\377\1" \ + "\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\346\377" \ + "\377\377\1\376\376\376\363\377\377\377\1\376\376\376\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\342\377\377\377\1\376\376\376\373\377" \ + "\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\340\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\243\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\203\377\377\377\1\376\376\376\233\377" \ + "\377\377\1\376\376\376\205\377\377\377\1\376\376\376\214\377\377\377" \ + "\1\376\376\376\205\377\377\377\1\376\376\376\260\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\300\377\377\377\1\376\376\376\306\377\377" \ + "\377\1\376\376\376\233\377\377\377\4\376\377\377\376\376\376\377\376" \ + "\377\377\377\377\203\376\377\375\203\377\377\377\3\377\377\375\376\377" \ + "\375\376\377\377\265\377\377\377\4\377\377\375\377\376\377\376\377\377" \ + "\377\377\375\202\377\376\377\210\377\377\377\7\377\377\375\376\377\377" \ + "\377\377\377\375\377\376\376\377\377\377\376\377\376\377\377\211\377" \ + "\377\377\4\376\377\375\377\377\377\376\376\376\377\377\375\202\377\377" \ + "\377\2\377\377\375\376\376\376\220\377\377\377\1\376\377\375\202\377" \ + "\377\375\5\377\376\377\377\377\373\377\377\377\375\377\376\377\377\375" \ + "\210\377\377\377\1\377\376\377\202\377\377\375\202\377\377\377\3\376" \ + "\377\377\377\377\375\377\376\377\213\377\377\377\3\376\377\377\376\377" \ + "\375\377\377\375\203\377\377\377\203\376\377\375\4\377\377\377\377\376" \ + "\377\376\376\376\376\377\377\233\377\377\377\3\376\377\377\376\377\375" \ + "\377\377\375\203\377\377\377\203\376\377\375\4\377\377\377\377\376\377" \ + "\376\376\376\376\377\377\210\377\377\377\1\377\376\377\203\377\377\377" \ + "\4\376\377\377\377\377\375\377\376\377\376\377\373\211\377\377\377\4" \ + "\376\377\377\376\376\374\377\376\377\377\375\376\226\377\377\377\5\376" \ + "\377\377\375\377\374\377\377\375\376\375\377\377\377\375\210\377\377" \ + "\377\1\377\377\375\202\376\377\377\1\377\377\373\242\377\377\377\1\376" \ + "\376\376\212\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376" \ + "\237\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\214\377" \ + "\377\377\1\376\376\376\204\377\377\377\202\376\376\376\257\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \ + "\376\246\377\377\377\1\376\376\376\224\377\377\377\1\376\376\376\250" \ + "\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\236\377\377" \ + "\377\3\376\376\376\377\377\377\376\376\376\230\377\377\377\4\377\377" \ + "\373\376\377\377\376\376\376\377\376\377\203\377\377\377\1\377\377\375" \ + "\202\377\377\377\1\377\376\377\202\377\377\375\3\377\377\377\377\377" \ + "\375\376\376\374\260\377\377\377\2\377\377\375\376\376\376\203\377\376" \ + "\377\214\377\377\377\7\376\377\377\377\376\377\377\377\375\377\377\377" \ + "\377\376\377\375\377\376\377\377\375\210\377\377\377\7\377\376\374\377" \ + "\377\375\377\376\377\377\377\375\376\376\376\377\377\377\376\376\376" \ + "\221\377\377\377\1\377\376\377\203\377\377\377\202\377\377\375\212\377" \ + "\377\377\2\377\377\375\377\377\377\202\377\377\375\214\377\377\377\3" \ + "\376\376\374\377\377\375\377\377\377\202\377\377\375\1\377\376\377\202" \ + "\377\377\377\1\377\377\375\203\377\377\377\4\377\376\377\376\376\376" \ + "\376\377\377\377\377\373\230\377\377\377\3\376\376\374\377\377\375\377" \ + "\377\377\202\377\377\375\1\377\376\377\202\377\377\377\1\377\377\375" \ + "\203\377\377\377\4\377\376\377\376\376\376\376\377\377\377\377\373\213" \ + "\377\377\377\1\377\376\374\214\377\377\377\2\377\377\375\377\376\377" \ + "\202\377\377\375\3\376\377\377\377\377\377\377\377\373\221\377\377\377" \ + "\3\376\377\375\376\377\377\377\376\377\204\377\377\377\1\377\377\375" \ + "\212\377\377\377\5\377\376\377\377\377\375\377\377\377\376\377\375\376" \ + "\377\373\243\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376" \ + "\204\377\377\377\1\376\376\376\242\377\377\377\1\376\376\376\205\377" \ + "\377\377\1\376\376\376\213\377\377\377\1\376\376\376\206\377\377\377" \ + "\1\376\376\376\263\377\377\377\3\376\376\376\377\377\377\376\376\376" \ + "\270\377\377\377\1\376\376\376\312\377\377\377\1\376\376\376\234\377" \ + "\377\377\1\377\377\375\202\376\377\377\7\377\376\377\377\377\377\376" \ + "\377\377\377\376\377\377\377\375\377\377\377\376\377\377\202\377\376" \ + "\377\2\376\377\375\376\377\377\262\377\377\377\10\377\377\375\376\377" \ + "\377\377\376\377\377\377\373\377\377\377\377\376\377\376\377\375\377" \ + "\377\375\211\377\377\377\3\376\377\377\377\376\377\377\377\375\202\377" \ + "\377\377\2\376\377\377\376\376\376\210\377\377\377\202\377\376\377\4" \ + "\374\377\377\376\377\377\377\376\377\377\377\375\222\377\377\377\4\377" \ + "\376\375\376\377\377\377\377\377\376\377\377\202\377\376\377\202\377" \ + "\377\375\210\377\377\377\4\377\377\375\377\377\377\377\377\375\377\377" \ + "\377\202\377\376\377\2\377\377\377\376\377\377\212\377\377\377\2\376" \ + "\377\377\376\377\375\202\377\376\377\7\376\377\377\377\377\377\377\377" \ + "\375\377\376\377\376\377\377\377\377\377\377\376\377\202\376\377\377" \ + "\1\377\377\375\232\377\377\377\2\376\377\377\376\377\375\202\377\376" \ + "\377\7\376\377\377\377\377\377\377\377\375\377\376\377\376\377\377\377" \ + "\377\377\377\376\377\202\376\377\377\1\377\377\375\210\377\377\377\1" \ + "\377\377\375\202\377\377\377\4\377\377\375\377\376\377\377\377\377\376" \ + "\377\377\211\377\377\377\7\375\376\377\377\377\375\377\376\377\376\376" \ + "\377\376\377\375\375\377\376\377\377\375\222\377\377\377\6\376\377\377" \ + "\377\376\377\377\377\377\377\377\375\377\376\377\376\377\377\213\377" \ + "\377\377\202\377\376\377\3\377\377\375\376\377\377\376\377\375\236\377" \ + "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\376\376\376\203\377\377\377\2\376\376\376\377\377\377\202\376\376" \ + "\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\204" \ + "\377\377\377\1\376\376\376\235\377\377\377\1\376\376\376\217\377\377" \ + "\377\1\376\376\376\206\377\377\377\1\376\376\376\260\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\241\377\377\377\202\376\376\376\204" \ + "\377\377\377\1\376\376\376\222\377\377\377\1\376\376\376\205\377\377" \ + "\377\1\376\376\376\246\377\377\377\1\376\376\376\233\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\234\377\377\377\15\376\376\376\377\377" \ + "\377\377\376\377\377\377\375\375\377\376\377\377\377\376\377\375\377" \ + "\377\377\375\376\377\377\377\377\377\377\375\376\377\377\377\377\377" \ + "\202\377\376\377\260\377\377\377\7\377\376\377\376\377\377\377\377\377" \ + "\376\377\377\377\377\377\377\377\375\376\377\377\212\377\377\377\1\376" \ + "\376\374\203\377\377\377\3\376\376\377\377\377\375\376\377\377\210\377" \ + "\377\377\10\376\377\377\377\376\377\374\377\373\376\377\373\377\376\377" \ + "\376\376\376\377\377\377\376\377\375\220\377\377\377\2\377\376\377\377" \ + "\377\377\202\377\377\375\202\377\377\377\2\376\376\374\376\377\377\210" \ + "\377\377\377\1\376\377\377\202\377\377\377\5\376\377\377\377\377\377" \ + "\376\376\376\377\377\377\376\377\375\210\377\377\377\202\377\376\377" \ + "\15\377\377\377\376\377\377\377\377\375\377\377\377\375\376\377\377\377" \ + "\377\376\377\375\377\377\377\375\377\376\377\377\375\377\376\377\377" \ + "\377\377\376\376\376\231\377\377\377\202\377\376\377\15\377\377\377\376" \ + "\377\377\377\377\375\377\377\377\375\376\377\377\377\377\376\377\375" \ + "\377\377\377\375\377\376\377\377\375\377\376\377\377\377\377\376\376" \ + "\376\211\377\377\377\4\377\376\377\377\377\377\376\377\375\376\377\377" \ + "\202\377\377\377\2\376\377\377\376\377\375\210\377\377\377\1\376\377" \ + "\375\202\376\376\376\202\377\377\377\2\377\377\375\375\376\377\221\377" \ + "\377\377\10\377\377\375\377\377\377\376\376\374\376\377\373\376\376\376" \ + "\377\376\377\376\377\377\377\377\375\210\377\377\377\6\376\376\376\377" \ + "\377\377\377\377\375\377\377\377\374\375\377\377\377\375\242\377\377" \ + "\377\1\376\376\376\214\377\377\377\1\376\376\376\204\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\235\377\377\377\1\376\376\376\203\377" \ + "\377\377\202\376\376\376\212\377\377\377\1\376\376\376\202\377\377\377" \ + "\202\376\376\376\264\377\377\377\5\376\376\376\377\377\377\376\376\376" \ + "\377\377\377\376\376\376\242\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\202\377\377\377\1\376\376\376\223\377\377\377\1\376\376\376" \ + "\244\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\233\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\234\377\377\377" \ + "\1\375\377\372\202\377\377\377\3\376\376\376\377\377\375\377\377\377" \ + "\202\376\377\377\204\377\377\377\4\376\377\377\377\377\377\377\376\377" \ + "\375\377\372\260\377\377\377\202\377\377\375\2\377\377\377\376\375\377" \ + "\202\377\377\377\1\375\377\376\212\377\377\377\6\377\377\375\377\377" \ + "\377\376\377\375\377\377\375\377\376\377\377\376\375\212\377\377\377" \ + "\1\377\376\377\202\377\377\377\4\377\375\376\377\377\377\377\377\373" \ + "\376\375\377\221\377\377\377\203\376\376\376\4\377\377\375\376\376\374" \ + "\377\376\377\376\376\374\210\377\377\377\5\377\376\377\377\377\375\377" \ + "\376\377\376\376\376\376\377\375\202\377\377\377\1\376\376\376\210\377" \ + "\377\377\4\375\377\372\377\376\377\377\377\377\376\377\377\204\377\377" \ + "\377\202\376\377\377\3\377\377\377\377\377\375\376\376\376\202\377\377" \ + "\377\1\375\377\372\230\377\377\377\4\375\377\372\377\376\377\377\377" \ + "\377\376\377\377\204\377\377\377\202\376\377\377\3\377\377\377\377\377" \ + "\375\376\376\376\202\377\377\377\1\375\377\372\210\377\377\377\3\376" \ + "\377\377\377\377\377\376\376\376\202\376\377\377\202\377\377\377\1\376" \ + "\377\375\210\377\377\377\7\376\376\377\377\377\375\376\377\375\376\376" \ + "\376\377\376\377\377\377\377\376\377\377\221\377\377\377\5\376\376\376" \ + "\376\377\377\377\377\377\375\375\375\377\376\377\202\377\377\377\1\377" \ + "\377\375\211\377\377\377\7\377\376\377\376\376\374\376\377\377\377\377" \ + "\377\377\376\377\377\377\375\377\377\373\233\377\377\377\1\376\376\376" \ + "\205\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\203\377" \ + "\377\377\1\376\376\376\204\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\204\377\377\377\1\376\376\376\237\377\377\377\1\376\376\376" \ + "\212\377\377\377\1\376\376\376\213\377\377\377\1\376\376\376\255\377" \ + "\377\377\1\376\376\376\247\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\376\376\376\224\377\377\377\1\376\376\376\247\377\377\377\1\376\376" \ + "\376\236\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\232" \ + "\377\377\377\10\377\376\377\377\377\375\377\377\377\376\377\377\376\376" \ + "\376\377\376\377\377\377\375\377\376\377\202\377\377\375\1\377\376\377" \ + "\202\377\377\377\3\377\376\377\377\375\376\377\376\377\260\377\377\377" \ + "\2\377\376\377\377\377\377\202\377\376\377\4\377\377\375\376\376\374" \ + "\377\375\377\377\376\377\210\377\377\377\3\376\376\374\377\376\377\376" \ + "\376\376\204\377\377\377\1\376\377\375\210\377\377\377\4\375\377\374" \ + "\377\377\377\377\375\376\377\376\377\203\377\377\377\1\377\377\375\220" \ + "\377\377\377\3\376\377\377\377\377\375\376\377\377\202\377\377\377\3" \ + "\377\376\377\373\377\377\376\377\377\211\377\377\377\202\376\377\375" \ + "\1\377\377\375\203\377\377\377\1\377\376\377\210\377\377\377\3\377\376" \ + "\377\377\375\376\377\376\377\202\377\377\377\1\377\376\377\202\377\377" \ + "\375\10\377\376\377\377\377\375\377\376\377\376\376\376\376\377\377\377" \ + "\377\377\377\377\375\377\376\377\230\377\377\377\3\377\376\377\377\375" \ + "\376\377\376\377\202\377\377\377\1\377\376\377\202\377\377\375\10\377" \ + "\376\377\377\377\375\377\376\377\376\376\376\376\377\377\377\377\377" \ + "\377\377\375\377\376\377\210\377\377\377\2\377\377\375\375\376\371\202" \ + "\377\376\377\3\377\377\377\377\377\375\377\376\377\212\377\377\377\1" \ + "\377\375\376\202\377\377\377\4\377\377\375\376\376\376\376\377\377\377" \ + "\376\377\220\377\377\377\2\376\377\377\376\376\377\202\377\377\377\2" \ + "\376\377\375\375\377\374\212\377\377\377\10\373\377\376\377\377\377\377" \ + "\377\375\376\376\374\377\377\375\377\376\377\377\377\377\376\377\377" \ + "\235\377\377\377\1\376\376\376\202\377\377\377\7\316\316\320\250\250" \ + "\252\221\221\223llnjjlGGI99;\204::<\7TTVkkmyy{\234\234\236\265\265\267" \ + "\332\332\332\376\376\376\237\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\222\377\377\377\1\376\376\376\205\377\377\377\3\376\376\376" \ + "\377\377\377\376\376\376\255\377\377\377\1\376\376\376\246\377\377\377" \ + "\1\376\376\376\227\377\377\377\1\376\376\376\252\377\377\377\1\376\376" \ + "\376\233\377\377\377\1\376\376\376\236\377\377\377\17\305\344\240\303" \ + "\342\237\304\343\240\304\343\237\307\342\237\303\342\236\305\342\240" \ + "\303\342\236\305\342\237\304\343\240\304\343\237\304\341\237\304\343" \ + "\237\323\352\266\376\377\375\250\377\377\377\210\305\342\240\10\305\342" \ + "\237\303\342\234\304\343\237\306\341\236\304\343\240\322\352\270\376" \ + "\377\377\375\377\376\211\377\377\377\5\377\376\377\376\376\376\377\376" \ + "\377\360\371\350\305\342\237\202\304\341\236\210\305\342\240\5\304\341" \ + "\236\327\356\302\376\377\377\377\377\373\376\377\375\202\377\377\375" \ + "\1\377\376\377\220\377\377\377\202\377\377\375\2\376\377\377\377\377" \ + "\377\202\377\377\375\2\304\343\237\306\341\236\210\305\342\240\5\307" \ + "\342\237\303\342\236\304\341\236\341\357\314\377\377\375\213\377\377" \ + "\377\17\376\377\375\323\352\266\304\343\237\304\341\237\304\343\237\304" \ + "\343\240\305\342\237\303\342\236\305\342\240\303\342\236\307\342\237" \ + "\304\343\237\304\343\240\303\342\237\305\344\240\231\377\377\377\17\376" \ + "\377\375\323\352\266\304\343\237\304\341\237\304\343\237\304\343\240" \ + "\305\342\237\303\342\236\305\342\240\303\342\236\307\342\237\304\343" \ + "\237\304\343\240\303\342\237\305\344\240\211\377\377\377\10\360\367\347" \ + "\306\343\241\303\342\237\307\342\237\303\342\237\304\343\235\307\341" \ + "\240\304\343\240\210\305\342\240\7\315\347\252\376\377\375\377\375\376" \ + "\376\377\375\377\377\377\377\377\373\376\377\377\221\377\377\377\10\377" \ + "\377\375\376\377\375\323\352\266\307\341\240\307\342\237\305\342\240" \ + "\307\340\236\306\341\236\210\305\342\240\4\304\343\237\311\335\236\377" \ + "\377\377\377\376\377\203\377\377\377\1\376\377\377\230\377\377\377\1" \ + "\376\376\376\203\377\377\377\3\346\346\346\251\251\251jjl\202;;=\210" \ + "::<\1;;=\202::<\2;;=99;\203::<\5FFHxxx\265\265\265\363\363\363\376\376" \ + "\376\234\377\377\377\2\376\376\376\346\346\346\214\234\234\234\1\235" \ + "\235\235\203\234\234\234\3\235\235\235\234\234\234\250\250\250\203\316" \ + "\316\316\1\346\346\346\263\377\377\377\202\250\250\250\245\377\377\377" \ + "\1\316\316\316\222\234\234\234\1\302\302\302\203\316\316\316\1\363\363" \ + "\363\247\377\377\377\3\316\316\316\234\234\234\235\235\235\240\234\234" \ + "\234\1\316\316\316\231\377\377\377\6\215\305>\216\306A\215\305@\213\310" \ + "=\215\305>\212\307>\202\214\305@\6\214\306>\212\306@\214\306<\215\304" \ + "B\214\306>\252\323m\251\377\377\377\210\214\306>\10\215\305@\215\307" \ + "\77\212\307>\217\304@\214\305@\251\323m\377\377\377\377\377\375\213\377" \ + "\377\377\5\377\375\377\341\363\315\215\305>\212\307>\215\305@\210\214" \ + "\306>\6\215\306A\220\305\77\350\365\333\377\377\377\376\377\377\377\376" \ + "\377\202\376\377\377\225\377\377\377\3\377\376\377\214\306>\215\306A" \ + "\210\214\306>\6\215\305>\212\310\77\215\305@\307\341\240\376\377\377" \ + "\377\376\377\213\377\377\377\6\252\323m\214\306>\215\304B\214\306<\212" \ + "\306@\214\306>\202\214\305@\6\212\307>\215\305>\213\310=\215\305@\216" \ + "\306A\215\305>\232\377\377\377\6\252\323m\214\306>\215\304B\214\306<" \ + "\212\306@\214\306>\202\214\305@\6\212\307>\215\305>\213\310=\215\305" \ + "@\216\306A\215\305>\211\377\377\377\4\376\377\377\242\321a\213\307A\215" \ + "\305>\202\214\306>\2\215\305@\215\307\77\210\214\306>\7\215\305<\332" \ + "\354\304\377\377\377\376\377\375\376\376\376\377\376\377\376\376\376" \ + "\221\377\377\377\10\377\376\377\342\362\316\215\305>\213\310\77\212\305" \ + "D\212\307<\216\306\77\211\307>\211\214\306>\4\304\343\240\373\377\376" \ + "\377\377\377\375\377\376\202\377\377\377\1\377\377\375\225\377\377\377" \ + "\1\376\376\376\204\377\377\377\6\265\265\267__a99;;;=::<;;=\202::<\1" \ + ";;=\202::<\1;;=\202::<\1;;=\203::<\1;;=\203::<\3;;=::<99;\202::<\2xx" \ + "z\301\301\301\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \ + "\376\206\377\377\377\1\376\376\376\217\377\377\377\1\316\316\316\205" \ + "::<\202;;=\221::<\4TTVwwy\250\250\252\346\346\350\255\377\377\377\1\316" \ + "\316\320\202::<\1\316\316\316\244\377\377\377\1\234\234\236\204::<\1" \ + ";;=\205::<\3;;=::<;;=\206::<\1;;=\204::<\6SSUkkm\204\204\206\250\250" \ + "\250\316\316\316\376\376\376\206\377\377\377\1\376\376\376\231\377\377" \ + "\377\1\234\234\234\206::<\3;;=::<;;=\222::<\1;;=\204::<\3;;=::<\234\234" \ + "\236\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214" \ + "\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325" \ + "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306>" \ + "\15\212\306@\215\307\77\233\316W\365\374\364\377\376\375\376\377\377" \ + "\377\376\377\377\377\375\377\377\377\377\377\375\376\376\376\377\377" \ + "\377\376\376\374\202\377\377\377\1\376\376\376\216\377\377\377\213\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\212\377\377\377\7\350\364\334\215\305>\212\307" \ + "<\214\305@\215\304B\215\305@\213\310\77\210\214\306>\10\214\305@\225" \ + "\311J\370\373\362\377\376\377\376\377\377\377\377\375\377\377\377\376" \ + "\377\377\210\377\377\377\40\376\377\377\376\377\375\377\376\377\377\377" \ + "\377\375\376\377\377\377\375\377\376\377\376\377\377\370\373\364\233" \ + "\314W\215\307\77\214\304=\212\306@\215\307\77\213\305=\215\307\77\214" \ + "\306>\217\304@\215\306A\212\307>\214\306<\215\306A\214\306>\211\307@" \ + "\242\321a\377\377\377\377\376\377\376\377\377\377\376\377\377\377\377" \ + "\376\377\377\377\376\377\223\377\377\377\7\376\376\376\377\377\377\376" \ + "\376\376\377\377\377\363\363\365\234\234\236FFH\202::<\10;;=99;;;=::" \ + "<;;=::<99;;;=\203::<\1;;=\203::<\2;;=99;\204::<\11""99;;;=::<;;=::<;" \ + ";=TTV\265\265\265\363\363\363\203\377\377\377\1\376\376\376\207\377\377" \ + "\377\1\376\376\376\215\377\377\377\1\316\316\316\205::<\3;;=::<;;=\202" \ + "::<\1;;=\214::<\3;;=99;;;=\202::<\4lln\316\316\316\376\376\376\377\377" \ + "\377\202\376\376\376\246\377\377\377\2\376\376\376xxz\202::<\2xxx\376" \ + "\376\376\243\377\377\377\1\234\234\236\204::<\202;;=\205::<\1;;=\204" \ + "::<\1;;=\202::<\1""99;\206::<\1;;=\202::<\6;;=kkk\250\250\250\346\346" \ + "\346\377\377\377\376\376\376\205\377\377\377\1\376\376\376\225\377\377" \ + "\377\1\234\234\234\204::<\1;;=\202::<\4;;=::<99;;;=\225::<\3;;=::<\234" \ + "\234\236\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4" \ + "\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250" \ + "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306" \ + ">\4\215\306A\213\304\77\215\305@\262\327x\202\377\377\377\1\376\377\375" \ + "\203\377\377\375\204\377\377\377\1\376\376\376\217\377\377\377\213\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\212\377\377\377\7\376\376\376\305\342\237\212" \ + "\307>\214\306>\212\307<\214\306>\212\307>\210\214\306>\3\214\306<\215" \ + "\306A\300\337\221\202\377\377\377\3\377\376\377\376\376\376\377\377\375" \ + "\210\377\377\377\1\377\375\377\202\377\377\377\2\376\376\377\376\377" \ + "\375\202\377\376\377\30\377\377\377\277\340\221\215\306A\213\305=\215" \ + "\305>\212\306B\214\306>\216\306\77\214\306<\212\307>\215\307=\213\305" \ + ";\215\307\77\216\305C\214\306>\214\305@\216\306\77\347\365\333\377\376" \ + "\377\377\377\375\376\377\377\377\376\374\377\377\377\377\377\375\222" \ + "\377\377\377\1\376\376\376\204\377\377\377\12\265\265\267FFH;;=::<;;" \ + "=99;::<;;=::<;;=\202::<\4<<>99;::<;;=\202::<\1;;=\203::<\1<<>\204::<" \ + "\5<<>99;;;=99;;;=\202::<\4:::SSS\266\266\266\376\376\376\203\377\377" \ + "\377\1\376\376\376\204\377\377\377\1\376\376\376\216\377\377\377\1\316" \ + "\316\316\204::<\3;;=::<;;=\204::<\1;;=\214::<\1;;=\202::<\1;;=\202::" \ + "<\2yyy\363\363\363\202\377\377\377\1\376\376\376\245\377\377\377\3\346" \ + "\346\346::<;;=\202::<\1\347\347\347\202\377\377\377\1\376\376\376\240" \ + "\377\377\377\1\234\234\236\203::<\4;;=99;::<;;=\202::<\7;;=::<;;=99;" \ + ";;=::<;;=\203::<\202;;=\210::<\1""99;\202::<\4;;=xxz\317\317\317\376" \ + "\376\376\202\377\377\377\1\376\376\376\227\377\377\377\1\234\234\234" \ + "\204::<\1""99;\203;;=\224::<\1;;=\204::<\2<<>\234\234\236\231\377\377" \ + "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \ + "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \ + "\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\10\215\305>\214\306" \ + ">\213\307A\214\306>\315\345\253\377\377\375\377\376\377\376\377\377\226" \ + "\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \ + "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \ + "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \ + "\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377\7\377\377" \ + "\375\377\376\377\376\376\376\241\321a\212\307>\211\305\77\215\306A\211" \ + "\214\306>\4\213\310\77\214\305@\213\305=\342\361\320\202\377\376\377" \ + "\2\377\377\375\377\376\377\210\377\377\377\1\377\376\377\202\377\377" \ + "\377\30\377\377\375\376\377\377\377\377\375\376\377\377\351\366\334\214" \ + "\305B\211\306;\215\307\77\214\306>\212\306@\215\305>\215\305@\212\307" \ + ">\214\305@\212\306B\214\306>\213\305=\213\310\77\215\305>\215\307\77" \ + "\314\345\253\377\375\377\377\376\374\376\377\377\203\377\377\377\1\377" \ + "\376\374\225\377\377\377\2\345\345\345kkm\205::<\202;;=\203::<\1;;=\203" \ + "::<\1;;=\202::<\202;;=\202::<\1;;=\210::<\2;;=99;\205::<\2```\331\331" \ + "\331\211\377\377\377\1\376\376\376\214\377\377\377\1\316\316\316\206" \ + "::<\5""99;::<;;=::<99;\212::<\1;;=\202::<\1;;=\204::<\4;;=::\214\305@" \ + "\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215" \ + "\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214" \ + "\305@\210\214\306>\10\215\305@\212\307>\214\305@\215\306A\214\305@\352" \ + "\364\334\376\376\377\377\377\373\202\377\377\377\3\376\376\376\377\377" \ + "\377\377\377\375\202\377\377\377\1\376\376\374\216\377\377\377\213\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\211\377\377\377\1\376\377\377\202\377\377\375" \ + "\5\347\364\332\215\307\77\215\306C\214\307;\216\306\77\210\214\306>\10" \ + "\214\305@\214\305D\215\307\77\233\314V\371\374\363\376\377\377\377\377" \ + "\377\377\377\375\210\377\377\377\20\375\377\374\377\376\377\376\376\377" \ + "\376\377\377\377\376\377\376\377\375\376\377\377\244\317d\212\307>\215" \ + "\306A\215\305@\214\305@\211\306=\215\307=\215\306A\214\305@\204\214\306" \ + ">\14\211\305A\212\307>\251\324k\377\376\377\377\375\376\376\377\377\377" \ + "\377\377\377\377\375\377\377\377\377\377\375\377\377\377\377\377\375" \ + "\217\377\377\377\1\376\376\376\203\377\377\377\2\265\265\267FFH\205:" \ + ":<\1;;=\203::<\202;;=\7:::TTT\203\203\203\235\235\235\316\316\316\332" \ + "\332\332\377\377\377\202\376\376\376\202\377\377\377\5\316\316\316\317" \ + "\317\317\234\234\234yyyFFF\202::<\1;;=\202::<\3""99;;;=99;\204::<\2;" \ + ";=\233\233\233\206\377\377\377\1\376\376\376\216\377\377\377\1\316\316" \ + "\316\204::<\1;;=\205::<\1;;=\212::<\3""99;::<;;=\202::<\2;;=99;\204:" \ + ":<\2;;=\265\265\265\245\377\377\377\4\346\346\346::<99;;;=\202::<\4""9" \ + "9;\347\347\347\377\377\377\376\376\376\240\377\377\377\1\234\234\236" \ + "\205::<\1;;=\203::<\202;;=\1""99;\203;;=\2::<;;=\203::<\1;;=\202::<\2" \ + ";;=::<\202;;=\7::<;;=99;::<;;=99;;;=\202::<\3;;=xxx\362\362\362\227\377" \ + "\377\377\1\234\234\234\205::<\202;;=\4::<;;=::<;;=\223::<\2;;=99;\202" \ + ";;=\1\234\234\236\231\377\377\377\3\214\305@\214\306>\214\305@\207\214" \ + "\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306" \ + ">\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \ + "\214\306>\12\212\307>\215\306A\214\305@\215\307\77\213\306:\226\312N" \ + "\372\374\361\375\376\377\377\377\375\377\377\373\224\377\377\377\213" \ + "\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p" \ + "\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \ + "@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>" \ + "\3\214\305@\214\306>\214\305@\211\377\377\377\10\376\377\377\376\376" \ + "\377\376\377\377\377\375\376\307\342\237\214\306<\215\306A\214\305@\210" \ + "\214\306>\5\215\307\77\213\305=\216\306A\213\310\77\277\337\223\202\377" \ + "\377\375\1\377\376\377\210\377\377\377\14\376\377\375\376\376\376\377" \ + "\376\377\377\377\375\377\376\377\377\377\377\303\342\236\215\307\77\216" \ + "\306A\215\305>\214\306<\215\306A\203\214\306>\20\215\307\77\212\307>" \ + "\215\305@\216\306\77\214\305@\216\307<\223\312K\356\372\346\377\377\377" \ + "\376\377\377\375\377\376\377\377\377\377\376\377\377\377\375\377\377" \ + "\377\377\377\375\216\377\377\377\1\376\376\376\203\377\377\377\2\375" \ + "\375\375\205\205\207\202::<\202;;=\3::<;;=::<\202;;=\6::<:::SSS\250\250" \ + "\250\346\346\346\376\376\376\216\377\377\377\3\332\332\332\220\220\220" \ + "SSS\202::<\4;;=99;::<;;=\202::<\1""99;\202;;=\2__a\332\332\334\223\377" \ + "\377\377\1\316\316\316\204::<\6;;=RRT\235\235\237\235\235\235\233\233" \ + "\233\234\234\234\212\234\234\236\5xxzkkm__a99;;;=\204::<\202;;=\1""9" \ + "9;\202::<\1\316\316\316\244\377\377\377\4\204\204\206;;=::<;;=\202::" \ + "<\2;;=\220\220\222\203\377\377\377\1\376\376\376\236\377\377\377\1\234" \ + "\234\236\203::<\3;;=::\214\305" \ + "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \ + "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \ + "\214\305@\210\214\306>\7\212\306@\214\306<\217\307@\214\304\77\214\311" \ + ">\214\306>\251\323m\202\376\377\377\4\376\376\374\377\377\375\377\377" \ + "\377\376\376\376\202\377\377\377\1\376\376\376\216\377\377\377\213\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\212\377\377\377\7\377\377\375\377\376\377\376" \ + "\377\377\377\376\377\251\323o\211\307>\214\305@\210\214\306>\7\212\307" \ + ">\215\305>\214\305@\214\306>\215\307\77\347\365\334\377\376\377\211\377" \ + "\377\377\2\377\376\377\375\377\374\203\377\376\377\15\352\364\333\212" \ + "\306@\215\306A\214\306>\215\307\77\213\310\77\214\306>\216\306A\215\306" \ + "A\214\306<\212\307>\213\310=\212\307>\202\214\305@\4\214\306>\314\345" \ + "\253\377\376\377\376\377\377\202\377\377\375\6\377\376\377\375\376\377" \ + "\377\377\377\377\376\377\376\377\375\377\376\377\217\377\377\377\3\376" \ + "\376\376\362\362\362lln\20299;\1;;=\204::<\202;;=\6::<\204\204\204\317" \ + "\317\317\376\376\376\377\377\377\376\376\376\206\377\377\377\1\376\376" \ + "\376\213\377\377\377\2\301\301\301kkm\211::<\6;;=FFH\301\301\301\376" \ + "\376\376\377\377\377\376\376\376\217\377\377\377\1\316\316\316\204::" \ + "<\3;;=kkm\376\376\376\221\377\377\377\3\316\316\316\204\204\204FFF\202" \ + "::<\1;;=\202::<\202;;=\2FFH\363\363\363\242\377\377\377\5\364\364\364" \ + "::<;;=99;;;=\203::<\3GGI\363\363\363\376\376\376\240\377\377\377\1\234" \ + "\234\236\205::<\1\234\234\236\210\377\377\377\1\376\376\376\204\377\377" \ + "\377\1\376\376\376\202\377\377\377\6\362\362\362\316\316\316\265\265" \ + "\265\234\234\234kkmFFH\202::<\2;;=99;\205::<\1;;=\202::<\1\221\221\221" \ + "\225\377\377\377\1\234\234\234\205::<\1\234\234\236\202\377\377\377\1" \ + "\376\376\376\225\377\377\377\1\375\375\375\235\377\377\377\3\214\305" \ + "@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324" \ + "p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \ + "\202\214\306>\1\214\305@\210\214\306>\4\215\307\77\214\306>\214\304\77" \ + "\214\306>\202\214\305@\6\215\307\77\307\341\240\376\377\375\376\377\377" \ + "\376\376\374\377\377\373\202\377\377\377\202\377\377\375\216\377\377" \ + "\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252" \ + "\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214" \ + "\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\212\377\377\377\7\377\376\377\376\376" \ + "\377\377\377\377\376\376\377\361\372\347\222\312K\215\305>\210\214\306" \ + ">\10\214\305@\215\306A\214\305@\214\306<\213\304A\243\322b\376\376\374" \ + "\376\377\375\211\377\377\377\24\377\377\373\377\377\377\376\377\377\377" \ + "\377\375\242\320c\215\307=\214\306>\213\310\77\213\304A\212\306@\215" \ + "\307\77\215\305@\214\306>\215\307\77\212\306@\215\305>\215\307\77\213" \ + "\310\77\213\306:\253\325q\202\377\377\377\11\377\377\375\377\376\377" \ + "\377\377\377\377\377\375\376\377\375\377\377\375\377\375\377\376\377" \ + "\377\377\377\375\214\377\377\377\7\376\376\376\377\377\377\376\376\376" \ + "\363\363\363__a::<;;=\203::<\202;;=\202::<\4xxz\347\347\351\377\377\377" \ + "\376\376\376\210\377\377\377\1\376\376\376\204\377\377\377\2\376\376" \ + "\376\377\377\377\203\376\376\376\205\377\377\377\2\316\316\320kkm\202" \ + "::<\3;;=::<;;=\202::<\202;;=\2:::\250\250\250\202\377\377\377\1\376\376" \ + "\376\216\377\377\377\1\316\316\316\205::<\1kkm\203\377\377\377\1\376" \ + "\376\376\215\377\377\377\1\376\376\376\202\377\377\377\3\363\363\363" \ + "xxx::<\202;;=\203::<\2;;=xxz\242\377\377\377\1\234\234\234\202::<\1;" \ + ";=\202::<\1;;=\202::<\1\234\234\234\241\377\377\377\1\234\234\236\202" \ + "::<\10;;=::<;;=\234\234\236\377\377\377\376\376\376\377\377\377\376\376" \ + "\376\216\377\377\377\1\376\376\376\203\377\377\377\3\332\332\332\221" \ + "\221\223FFH\205::<\2;;=::<\202;;=\2::<\204\204\204\224\377\377\377\1" \ + "\234\234\234\205::<\3\234\234\236\377\377\377\376\376\376\264\377\377" \ + "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \ + "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \ + "\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\5\216\306\77\212" \ + "\307>\215\307=\212\306@\214\306>\202\215\305>\5\215\305@\345\356\317" \ + "\376\377\375\376\377\377\377\377\375\202\377\377\377\1\377\377\375\217" \ + "\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \ + "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \ + "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \ + "\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377\4\376\377" \ + "\377\377\377\377\377\377\375\376\377\377\202\377\377\377\2\315\347\252" \ + "\212\306@\210\214\306>\10\216\306A\212\306@\212\307>\215\305<\213\310" \ + "\77\215\305>\307\341\240\376\377\377\212\377\377\377\10\375\377\374\377" \ + "\377\377\305\342\237\215\305@\212\306@\216\306\77\215\307=\215\305>\202" \ + "\214\306>\24\213\307A\213\310=\215\304B\214\306>\212\306@\215\304B\212" \ + "\307>\225\311K\370\373\362\377\377\377\376\377\375\377\377\375\377\377" \ + "\377\374\377\375\376\376\376\377\377\377\377\377\375\377\376\377\376" \ + "\377\377\377\377\375\211\377\377\377\1\376\376\376\205\377\377\377\1" \ + "___\204::<\1;;=\203::<\2SSS\316\316\316\235\377\377\377\2\317\317\317" \ + "``b\207::<\3;;=::<\204\204\206\220\377\377\377\1\316\316\316\205::<\1" \ + "kkm\226\377\377\377\3\204\204\206::<;;=\205::<\1\316\316\316\232\377" \ + "\377\377\1\376\376\376\205\377\377\377\2\364\364\364FFF\202;;=\202::" \ + "<\6;;=99;;;=::\214\305@\207\214\306>\4\214\305@\215" \ + "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \ + "\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>\2\222\313" \ + "J\366\373\364\202\377\376\377\4\377\377\373\376\376\374\376\377\377\377" \ + "\376\377\216\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240" \ + "\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3" \ + "\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305" \ + ">\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377" \ + "-\377\377\375\376\377\377\377\377\377\376\376\374\376\377\377\377\376" \ + "\377\376\377\377\252\324p\212\306@\215\305>\212\307<\215\305@\215\305" \ + "<\214\305B\215\305@\214\306<\212\307>\215\305>\214\306>\211\306=\215" \ + "\305>\212\307>\214\306<\350\364\334\374\377\377\377\376\377\376\376\376" \ + "\374\377\375\377\377\377\376\377\375\377\377\375\377\376\377\377\377" \ + "\375\377\377\377\377\376\377\357\367\350\223\312K\213\310\77\215\305" \ + ">\214\306>\215\305>\213\310\77\212\306@\214\306>\215\305@\202\214\306" \ + ">\10\214\305@\216\306=\212\307>\215\305>\333\355\303\376\376\374\377" \ + "\377\377\377\377\375\223\377\377\377\1\376\376\376\203\377\377\377\1" \ + "\203\203\203\206::<\4;;=::<\204\204\206\363\363\363\230\377\377\377\1" \ + "\376\376\376\207\377\377\377\1\235\235\237\202::<\1;;=\203::<\5;;=99" \ + ";;;=\204\204\204\376\376\376\216\377\377\377\1\316\316\316\205::<\1k" \ + "km\227\377\377\377\12\204\204\206::<;;=::<99;;;=::<\204\204\204\377\377" \ + "\377\376\376\376\232\377\377\377\1\376\376\376\203\377\377\377\2\234" \ + "\234\234;;=\203::<\1;;=\204::<\3<<>\250\250\250\376\376\376\237\377\377" \ + "\377\1\234\234\236\205::<\1\234\234\234\231\377\377\377\10\376\376\376" \ + "\377\377\377\265\265\265FFH::<;;=::<;;=\203::<\2;;=\204\204\204\222\377" \ + "\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305" \ + "@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324" \ + "p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \ + "\202\214\306>\1\214\305@\220\214\306>\4\216\306\77\250\322n\376\377\375" \ + "\376\377\373\222\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \ + "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \ + "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377" \ + "\377\13\376\376\377\376\377\377\377\376\377\376\376\374\374\377\377\377" \ + "\377\375\377\376\377\356\372\346\225\311K\214\306>\213\310=\203\214\306" \ + ">\2\213\310\77\214\306>\202\214\305@\7\214\306<\213\307A\214\304\77\214" \ + "\305B\212\307>\244\317d\377\376\377\202\377\377\377\1\377\375\377\202" \ + "\377\377\377\25\376\377\377\377\376\377\377\377\377\374\377\375\376\376" \ + "\374\253\324n\214\306<\215\307\77\215\305>\211\307@\216\305C\214\305" \ + "@\215\307\77\214\305@\214\306<\212\307<\211\306=\214\306>\214\305@\213" \ + "\307A\263\327}\202\376\377\377\3\377\377\377\377\375\376\377\377\375" \ + "\221\377\377\377\1\376\376\376\203\377\377\377\1\250\250\250\204::<\1" \ + ";;=\202::<\2;;=\264\264\264\202\377\377\377\1\376\376\376\232\377\377" \ + "\377\1\376\376\376\205\377\377\377\2\332\332\332SSS\202::<\1;;=\204:" \ + ":<\4xxx\364\364\364\377\377\377\376\376\376\214\377\377\377\1\316\316" \ + "\316\205::<\1kkm\227\377\377\377\2\363\363\363SSU\202::<\4;;=99;::<;" \ + ";;\202\377\377\377\1\376\376\376\226\377\377\377\1\376\376\376\204\377" \ + "\377\377\11\376\376\376\363\363\363FFH99;;;=::<;;=99;;;=\203::<\4""9" \ + "9;SSU\377\377\377\376\376\376\236\377\377\377\1\234\234\236\205::<\1" \ + "\234\234\234\225\377\377\377\1\376\376\376\204\377\377\377\10\376\376" \ + "\376\377\377\377\363\363\363yyy::<;;=99;;;=\204::<\1\266\266\266\221" \ + "\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214" \ + "\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252" \ + "\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \ + "\320\202\214\306>\1\214\305@\220\214\306>\4\214\306<\213\307A\275\335" \ + "\222\376\377\377\203\377\377\377\1\377\377\375\216\377\377\377\213\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\211\377\377\377\4\377\376\377\376\376\377\377" \ + "\377\377\377\377\375\202\376\377\377\5\377\375\376\377\376\377\315\346" \ + "\255\212\307>\214\305@\202\215\306A\22\214\305@\212\307<\214\305B\214" \ + "\306>\213\307A\214\306>\213\305=\214\306>\215\305>\213\307A\211\310<" \ + "\313\347\254\377\377\375\377\375\377\376\377\377\376\377\373\376\377" \ + "\377\377\376\377\202\376\377\377\10\377\377\377\315\346\254\212\307>" \ + "\212\306@\215\306A\216\306A\212\307>\214\306<\202\215\306A\10\215\306" \ + "C\214\305B\215\307\77\214\306<\214\305@\213\310<\222\310L\372\373\363" \ + "\225\377\377\377\1\376\376\376\202\377\377\377\6\376\376\376\333\333" \ + "\333::<;;=::<;;=\202::<\3;;=FFH\315\315\315\205\377\377\377\1\376\376" \ + "\376\225\377\377\377\202\376\376\376\202\377\377\377\1\376\376\376\202" \ + "\377\377\377\1\376\376\376\202\377\377\377\2\363\363\363xxx\204::<\2" \ + ";;=\203\203\203\220\377\377\377\1\316\316\316\205::<\1kkm\230\377\377" \ + "\377\3\266\266\27099;;;=\204::<\1\316\316\316\230\377\377\377\1\376\376" \ + "\376\202\377\377\377\1\376\376\376\202\377\377\377\3\265\265\267::<;" \ + ";=\204::<\202;;=\202::<\202;;=\1\265\265\265\237\377\377\377\1\234\234" \ + "\236\205::<\1\234\234\234\236\377\377\377\5\234\234\234::<;;=::<;;=\202" \ + "::<\3;;=FFH\332\332\332\220\377\377\377\1\234\234\234\205::<\1\234\234" \ + "\236\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214" \ + "\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325" \ + "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>" \ + "\4\215\307\77\214\304\77\213\310\77\333\355\303\202\377\377\377\1\376" \ + "\377\375\217\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240" \ + "\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3" \ + "\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305" \ + ">\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\213\377\377\377" \ + "\5\377\377\373\377\376\377\377\377\377\375\377\374\376\377\377\202\376" \ + "\376\376\22\260\331{\212\307>\214\306>\215\305>\215\305@\215\307\77\215" \ + "\307=\214\305@\214\306>\215\306A\214\306>\213\307C\214\306>\214\304;" \ + "\213\307A\222\312K\357\370\345\377\377\375\202\377\377\377\15\377\375" \ + "\376\377\377\375\376\376\376\377\377\375\361\367\351\222\311J\213\310" \ + "\77\214\305B\215\310<\213\305=\216\306\77\212\307<\214\305B\202\214\306" \ + ">\6\216\306\77\215\305@\215\306A\214\305@\215\305<\333\356\301\202\377" \ + "\376\377\3\377\377\375\377\377\377\377\376\377\225\377\377\377\1``b\202" \ + "::<\6;;=::<;;=::\214\305@\207\214\306>\4\214\305@\215" \ + "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \ + "\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>\10\216\306" \ + "\77\215\306A\214\305@\224\310J\360\371\350\377\377\377\377\376\377\376" \ + "\377\377\216\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240" \ + "\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3" \ + "\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305" \ + ">\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\212\377\377\377" \ + "\1\377\377\375\202\377\377\377\2\377\376\377\377\377\377\202\376\377" \ + "\377\25\377\377\375\370\373\362\223\312K\212\307>\215\305>\216\306A\212" \ + "\307<\214\305B\215\307\77\214\305@\214\306>\214\305@\212\306@\215\307" \ + "=\216\306A\215\305>\214\306<\252\324n\376\377\377\376\376\376\377\376" \ + "\377\202\377\377\375\4\377\376\377\376\376\377\252\324n\215\306A\202" \ + "\214\306>\21\214\305@\215\307\77\215\305>\212\307>\214\306<\213\304A" \ + "\215\307=\214\304=\215\307\77\212\307>\214\306>\277\337\226\377\376\377" \ + "\376\377\375\377\377\375\377\377\377\376\376\376\225\377\377\377\3\234" \ + "\234\236::<;;=\204::<\4;;=\265\265\267\377\377\377\376\376\376\204\377" \ + "\377\377\202\376\376\376\202\377\377\377\1\376\376\376\225\377\377\377" \ + "\1\376\376\376\203\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \ + "\376\202\377\377\377\3\250\250\250::<\204\204\206\205\377\377\377\1\376" \ + "\376\376\214\377\377\377\1\316\316\316\205::<\1kkm\226\377\377\377\1" \ + "\376\376\376\202\377\377\377\2kkm99;\202::<\4;;=::<\204\204\206\376\376" \ + "\376\202\377\377\377\1\376\376\376\224\377\377\377\1\376\376\376\203" \ + "\377\377\377\2\376\376\376\265\265\265\202::<\1;;=\202::<\3;;=\316\316" \ + "\320\316\316\316\204::<\3;;=::<\266\266\266\236\377\377\377\1\234\234" \ + "\236\205::<\1\234\234\234\226\377\377\377\202\376\376\376\2\377\377\377" \ + "\376\376\376\205\377\377\377\4\376\376\376\251\251\253;;=99;\202::<\4" \ + "<<>99;::<\250\250\252\217\377\377\377\1\234\234\234\205::<\1\234\234" \ + "\236\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214" \ + "\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325" \ + "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>" \ + "\202\214\305@\6\212\306@\215\307\77\243\321d\377\377\375\377\375\377" \ + "\376\377\377\216\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \ + "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \ + "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377" \ + "\377\2\376\377\377\377\377\375\202\377\377\377\1\376\376\376\202\377" \ + "\377\377\6\376\377\372\376\377\377\377\376\377\331\357\301\213\304\77" \ + "\215\307=\202\214\305@\25\214\305B\214\306<\215\305@\212\307<\214\306" \ + ">\216\306=\212\307>\212\306B\214\305@\215\306E\212\306@\313\347\255\376" \ + "\377\375\376\376\377\376\377\377\377\376\377\377\377\377\333\355\305" \ + "\212\307>\216\306\77\215\307\77\202\214\306>\1\215\307\77\202\214\306" \ + ">\13\215\305<\212\306@\212\307<\215\307\77\211\306=\213\307A\233\314" \ + "V\370\373\362\377\377\375\377\377\377\376\377\377\202\377\377\375\2\374" \ + "\377\377\377\375\376\222\377\377\377\3\363\363\363GGI::<\202;;=\202:" \ + ":<\2;;=\234\234\234\214\377\377\377\1\376\376\376\221\377\377\377\1\376" \ + "\376\376\202\377\377\377\3\376\376\376\377\377\377\376\376\376\206\377" \ + "\377\377\3\376\376\376\377\377\377\316\316\316\203\377\377\377\1\376" \ + "\376\376\203\377\377\377\1\376\376\376\213\377\377\377\1\316\316\316" \ + "\205::<\1kkm\227\377\377\377\5\376\376\376\377\377\377\235\235\237::" \ + "<;;=\203::<\2lln\376\376\376\203\377\377\377\1\376\376\376\224\377\377" \ + "\377\13\376\376\376\377\377\377\376\376\376\377\377\377RRR::<99;::<;" \ + ";=::\214\305@\207\214\306" \ + ">\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>" \ + "\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\221" \ + "\214\306>\5\213\307A\216\306\77\212\307<\214\306>\277\337\223\220\377" \ + "\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377" \ + "\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306" \ + ">\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207" \ + "\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377\4\376\377\377" \ + "\377\377\375\377\375\377\377\377\377\202\377\377\375\202\377\376\377" \ + "\202\376\377\377\22\377\376\377\262\331~\213\304\77\213\310\77\216\306" \ + "A\212\307<\215\306A\214\304=\213\310\77\214\305@\215\304B\214\305B\214" \ + "\306<\212\307>\212\307<\216\306A\221\312I\370\373\362\203\377\377\377" \ + "\13\370\373\364\226\310K\214\306>\212\307>\215\304B\214\306>\215\306" \ + "A\213\304\77\215\306A\214\306>\215\305@\202\212\306@\13\215\307\77\213" \ + "\310=\220\303@\336\362\315\377\376\377\377\377\377\374\377\377\377\376" \ + "\377\377\377\377\376\376\374\376\377\375\223\377\377\377\1\204\204\206" \ + "\203::<\4""99;;;=::\214\305@\207\214\306>\4\214\305@\215\305>\214" \ + "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \ + "\1\342\361\320\202\214\306>\1\214\305@\220\214\306>\10\215\304B\214\306" \ + "<\214\305@\215\305@\212\306@\215\305>\323\354\265\377\376\377\216\377" \ + "\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377" \ + "\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306" \ + ">\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207" \ + "\214\306>\3\214\305@\214\306>\214\305@\212\377\377\377\3\375\377\376" \ + "\377\377\377\377\377\375\202\377\377\377\26\377\377\375\375\377\374\376" \ + "\377\377\377\376\377\377\377\375\365\375\362\225\311K\212\306@\214\306" \ + ">\214\305@\212\306@\216\306=\211\306;\215\306A\214\306>\215\307\77\217" \ + "\304@\214\306>\212\307>\215\305@\214\305@\262\327z\203\377\377\377\13" \ + "\260\331{\213\310\77\214\305B\214\305@\215\305@\215\307\77\212\307<\216" \ + "\306A\213\305;\214\305@\215\305>\202\214\306>\11\215\305@\214\306<\276" \ + "\340\224\377\376\375\377\377\375\376\377\377\377\376\375\376\377\375" \ + "\377\376\377\202\377\377\377\1\376\377\375\221\377\377\377\1\346\346" \ + "\346\206::<\2:::\346\346\346\202\377\377\377\1\376\376\376\276\377\377" \ + "\377\1\316\316\316\205::<\1kkm\216\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\376\376\376\207\377\377\377\3\234\234\236::<;;=\203::<\1k" \ + "km\226\377\377\377\1\376\376\376\204\377\377\377\2\376\376\376lln\205" \ + "::<\1``b\204\377\377\377\1SSS\205::<\1kkm\235\377\377\377\1\234\234\236" \ + "\205::<\1\234\234\234\242\377\377\377\2\316\316\316:::\202::<\5;;=::" \ + "<;;=FFH\363\363\363\206\377\377\377\1\376\376\376\206\377\377\377\1\234" \ + "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \ + "\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377" \ + "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \ + ">\1\214\305@\210\214\306>\27\215\306A\212\307>\215\305>\215\305@\215" \ + "\307=\217\304B\214\306<\214\305@\215\307\77\215\305@\215\307\77\214\305" \ + "@\216\306\77\211\310<\226\312L\347\364\332\377\377\377\377\376\377\377" \ + "\377\375\374\377\377\377\376\377\376\376\376\376\377\377\207\377\377" \ + "\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252" \ + "\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214" \ + "\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\221\377\377\377\1\377\377\375\203\377" \ + "\377\377\5\333\355\303\214\306>\212\307<\216\306A\214\305@\202\214\306" \ + ">\15\215\305@\214\306>\212\306@\213\310\77\215\305>\216\306A\211\306" \ + "=\212\306@\212\307<\334\354\305\377\377\375\335\354\303\212\307>\210" \ + "\214\306>\10\216\306A\212\307;\215\306A\216\306A\214\305@\241\321a\371" \ + "\374\361\375\376\377\223\377\377\377\1\376\376\376\204\377\377\377\2" \ + "\376\376\376\234\234\234\203::<\1""99;\202::<\1\234\234\234\302\377\377" \ + "\377\1\316\316\316\205::<\1kkm\217\377\377\377\1\376\376\376\202\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\3\376" \ + "\376\376\377\377\377xxz\202::<\5""99;::<;;=xxz\376\376\377\232\377\377" \ + "\377\3\317\317\31799;;;=\202::<\5;;=::<\265\265\265\377\377\377\376\376" \ + "\376\202\377\377\377\2\265\265\265;;=\202::<\203;;=\1\332\332\332\203" \ + "\377\377\377\1\376\376\376\230\377\377\377\1\234\234\236\205::<\1\234" \ + "\234\234\242\377\377\377\4\376\376\376\204\204\204::<;;=\202::<\3;;=" \ + "::<\266\266\266\207\377\377\377\1\376\376\376\205\377\377\377\1\234\234" \ + "\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305" \ + "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \ + "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \ + "\214\305@\211\214\306>\27\216\306A\214\306>\212\306@\214\306<\213\310" \ + "\77\215\305@\215\307\77\213\305=\216\306\77\212\307;\212\306@\215\305" \ + ">\215\306A\212\307>\245\320d\367\375\361\376\377\377\377\376\377\377" \ + "\377\377\376\376\377\377\376\377\375\377\376\377\377\375\206\377\377" \ + "\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252" \ + "\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214" \ + "\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\221\377\377\377\6\376\376\376\377\376" \ + "\377\377\377\377\375\377\376\376\377\377\270\333\207\203\214\306>\17" \ + "\211\306=\212\307<\214\306<\214\305@\215\307\77\214\305@\216\305C\214" \ + "\306>\212\310A\215\305@\216\306\77\223\312K\360\371\346\222\311I\214" \ + "\305@\210\214\306>\10\214\305@\212\307>\214\305@\216\306A\215\307=\350" \ + "\364\334\375\377\376\377\376\377\225\377\377\377\7\376\376\376\377\377" \ + "\377\376\376\376\377\377\377SSS::<;;=\203::<\5FFH\364\364\364\376\376" \ + "\376\377\377\377\376\376\376\277\377\377\377\1\316\316\316\205::<\1k" \ + "km\222\377\377\377\1\376\376\376\204\377\377\377\3\376\376\376\377\377" \ + "\377SSU\205::<\1\234\234\236\202\377\377\377\1\376\376\376\202\377\377" \ + "\377\1\376\376\376\220\377\377\377\1\376\376\376\204\377\377\377\2kk" \ + "m;;=\202::<\5;;=::\214\305@\207\214\306>\4\214\305" \ + "@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p" \ + "\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\27" \ + "\214\304=\215\305>\213\307A\212\306@\214\305B\215\305<\213\310=\215\307" \ + "\77\215\304B\214\306<\213\307A\215\305>\216\306A\212\306@\212\307>\270" \ + "\332\204\377\376\377\377\377\377\377\376\377\376\376\374\377\377\373" \ + "\377\376\377\377\377\375\206\377\377\377\213\214\306>\3\215\305>\214" \ + "\306>\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305" \ + "@\207\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324" \ + "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \ + "@\223\377\377\377\1\377\377\375\202\377\377\377\2\371\372\364\232\315" \ + "W\202\214\305@\4\214\306<\215\307\77\214\305B\215\306C\202\215\306A\1" \ + "\214\306<\202\212\307>\6\215\305@\212\307>\215\305>\212\306B\216\306" \ + "A\212\307>\210\214\306>\10\214\305B\215\307\77\214\306<\214\306>\304" \ + "\341\237\377\377\377\377\376\377\377\377\375\220\377\377\377\1\376\376" \ + "\376\203\377\377\377\1\376\376\376\203\377\377\377\10\301\301\301::<" \ + ";;=99;;;=::<99;\234\234\236\207\377\377\377\1\376\376\376\273\377\377" \ + "\377\1\316\316\316\205::<\1kkm\216\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\376\376\376\204\377\377\377\3\376\376\376\377\377\377\315" \ + "\315\315\202;;=\203::<\6;;=\265\265\267\377\377\377\376\376\376\377\377" \ + "\377\376\376\376\225\377\377\377\2\376\376\376\317\317\317\203::<\4;" \ + ";=::<;;=\264\264\264\206\377\377\377\10\234\234\234;;=::<;;=99;;;=::" \ + "<\346\346\346\233\377\377\377\1\234\234\236\205::<\1\234\234\234\237" \ + "\377\377\377\1\376\376\376\204\377\377\377\1\204\204\206\202::<\6;;=" \ + "99;;;=::<\346\346\346\376\376\376\204\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\204\377\377\377\1\234\234\234\205::<\1\234\234\236\266" \ + "\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215" \ + "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \ + "\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\22\215\307" \ + "\77\212\307>\216\306A\212\304<\215\307\77\215\305@\216\306\77\213\307" \ + "A\214\306>\214\305@\215\307\77\213\310=\212\307>\214\306>\214\306<\214" \ + "\306>\216\306\77\324\353\267\202\376\376\376\3\377\377\377\376\376\377" \ + "\376\377\375\207\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \ + "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \ + "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\221\377\377" \ + "\377\3\376\377\377\377\377\377\376\377\375\202\377\377\377\7\377\376" \ + "\377\341\363\315\215\305@\214\305@\215\306A\215\305@\216\306\77\202\214" \ + "\306>\12\214\305B\212\307<\213\304A\213\310=\216\306A\211\306;\213\310" \ + "=\214\305@\212\307>\215\305>\210\214\306>\10\215\307\77\214\304=\212" \ + "\307>\243\322b\377\377\377\376\377\377\377\376\377\377\377\375\226\377" \ + "\377\377\4\376\376\376\377\377\377\204\204\206;;=\203::<\3""99;;;=\364" \ + "\364\364\205\377\377\377\1\376\376\376\275\377\377\377\1\316\316\316" \ + "\205::<\1kkm\217\377\377\377\202\376\376\376\202\377\377\377\1\376\376" \ + "\376\203\377\377\377\4\376\376\376xxz;;=99;\202;;=\4::<;;=\346\346\346" \ + "\376\376\376\204\377\377\377\1\376\376\376\224\377\377\377\1xxz\203:" \ + ":<\3;;=::\214\305" \ + "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \ + "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \ + "\214\305@\210\214\306>\7\213\305=\214\306<\210\306\77\216\306\77\215" \ + "\307=\214\306>\215\307\77\202\214\306>\14\215\307\77\214\305B\214\306" \ + "<\212\307<\214\305@\216\306\77\215\305>\214\305@\224\313L\352\364\331" \ + "\374\377\377\377\376\377\211\377\377\377\213\214\306>\3\215\305>\214" \ + "\306>\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305" \ + "@\207\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324" \ + "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \ + "@\222\377\377\377\1\376\377\377\202\377\377\377\24\376\376\374\376\377" \ + "\375\377\375\377\277\337\224\214\306>\212\307>\215\307\77\214\304=\215" \ + "\307=\213\304A\214\306<\212\307>\215\307\77\214\305@\213\304\77\215\307" \ + "\77\215\305@\214\304=\215\305<\215\306A\210\214\306>\1\212\307>\202\215" \ + "\306A\4\350\365\333\377\375\376\377\376\377\375\376\377\226\377\377\377" \ + "\1\376\376\376\202\377\377\377\3TTV::<99;\202;;=\4::<\203\203\203\377" \ + "\377\377\376\376\376\302\377\377\377\1\316\316\316\205::<\1kkm\222\377" \ + "\377\377\1\376\376\376\204\377\377\377\3\300\300\302;;=::<\202;;=\202" \ + "::<\2```\376\376\376\227\377\377\377\7\376\376\376\377\377\377\346\346" \ + "\346;;=99;::<;;=\202::<\3\251\251\251\377\377\377\376\376\376\206\377" \ + "\377\377\1\234\234\234\202::<\1;;=\202::<\2;;=\346\346\346\232\377\377" \ + "\377\1\234\234\236\205::<\1\234\234\234\235\377\377\377\1\376\376\376" \ + "\207\377\377\377\11SSU::<;;=99;<<>::\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252" \ + "\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \ + "\320\202\214\306>\1\214\305@\210\214\306>\25\213\307A\216\306A\232\315" \ + "W\215\306C\212\306@\214\305@\212\307;\216\306A\215\305>\215\307\77\214" \ + "\305@\215\307\77\214\306>\214\305@\212\306B\213\307C\214\306>\215\305" \ + "@\232\315V\372\374\367\376\376\376\202\377\377\375\1\376\376\376\206" \ + "\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \ + "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \ + "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \ + "\207\214\306>\3\214\305@\214\306>\214\305@\221\377\377\377\5\377\376" \ + "\377\376\377\377\377\375\376\377\376\377\376\377\377\202\377\377\377" \ + "\10\370\373\362\233\314V\213\307A\211\306=\215\307\77\212\307<\212\306" \ + "@\215\305<\202\214\306>\7\215\307=\215\306A\214\305@\212\307>\216\306" \ + "A\212\306@\215\307=\210\214\306>\10\212\307>\212\307<\313\347\254\376" \ + "\377\377\377\377\377\377\376\377\376\377\377\377\377\375\223\377\377" \ + "\377\1\376\376\376\203\377\377\377\1\332\332\332\202::<\1;;=\203::<\1" \ + "\302\302\302\203\377\377\377\5\376\376\376\377\377\377\376\376\376\377" \ + "\377\377\376\376\376\274\377\377\377\1\316\316\316\205::<\1kkm\217\377" \ + "\377\377\1\376\376\376\206\377\377\377\3\332\332\334FFH;;=\205::<\1\265" \ + "\265\265\202\377\377\377\1\376\376\376\224\377\377\377\1\376\376\376" \ + "\202\377\377\377\1\205\205\207\202::<\1;;=\202::<\2GGI\363\363\363\202" \ + "\377\377\377\1\376\376\376\205\377\377\377\1\363\363\363\202::<\1;;=" \ + "\202::<\2""99;\234\234\234\203\377\377\377\1\376\376\376\226\377\377" \ + "\377\1\234\234\236\205::<\1\234\234\234\234\377\377\377\1\376\376\376" \ + "\210\377\377\377\3\222\222\222::<99;\202;;=\5""99;GGI\376\376\376\377" \ + "\377\377\376\376\376\211\377\377\377\1\234\234\234\205::<\1\234\234\236" \ + "\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305" \ + "@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p" \ + "\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\10" \ + "\213\307A\214\306>\331\356\303\232\315W\215\305>\215\306A\214\305B\214" \ + "\306>\202\214\305@\7\213\310=\214\306>\215\304B\215\306A\211\306;\213" \ + "\310\77\214\305@\202\215\307\77\2\257\326{\376\377\373\202\377\377\377" \ + "\1\377\377\375\206\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \ + "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \ + ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \ + "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\221\377\377" \ + "\377\6\377\377\373\377\377\375\377\377\377\376\376\377\377\376\377\373" \ + "\377\374\202\377\376\377\4\336\362\315\220\303@\213\310=\215\307\77\202" \ + "\212\306@\1\215\305@\202\214\306>\7\213\305=\214\306>\213\305=\214\305" \ + "@\213\310\77\212\306@\213\307A\210\214\306>\10\215\307\77\252\324p\377" \ + "\377\375\376\377\377\377\377\375\377\377\377\377\376\377\377\377\375" \ + "\220\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\265\265\265\204::<\5;;=::<\363\363\363\377\377\377\376\376" \ + "\376\302\377\377\377\1\316\316\316\205::<\1kkm\225\377\377\377\2\317" \ + "\317\317FFH\206::<\1SSU\204\377\377\377\1\376\376\376\225\377\377\377" \ + "\2\346\346\346;;=\203::<\3;;=::<\234\234\236\202\377\377\377\1\376\376" \ + "\376\207\377\377\377\2\204\204\206;;=\204::<\2FFF\362\362\362\231\377" \ + "\377\377\1\234\234\236\205::<\1\234\234\234\245\377\377\377\1\301\301" \ + "\301\202::<\6;;=::<;;=::<\347\347\347\376\376\376\212\377\377\377\1\234" \ + "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \ + "\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377" \ + "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \ + ">\1\214\305@\210\214\306>\27\214\305@\215\305<\342\362\315\353\365\334" \ + "\223\312K\215\305<\212\306@\215\305<\212\307>\215\306A\214\306>\212\307" \ + ">\215\307\77\215\304B\215\307\77\215\305@\214\306>\215\305>\214\305@" \ + "\215\305<\315\345\253\377\377\375\376\377\377\207\377\377\377\213\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\221\377\377\377\14\376\377\377\376\376\377\377" \ + "\377\377\377\377\373\376\377\375\377\376\377\376\377\377\377\377\377" \ + "\377\376\375\276\340\224\214\306<\215\305@\202\214\306>\12\215\305>\214" \ + "\305@\215\305@\214\305@\213\310\77\214\306>\216\306\77\211\305\77\215" \ + "\307=\214\305@\210\214\306>\4\223\312K\360\367\347\377\377\377\377\377" \ + "\375\232\377\377\377\2\376\376\376\234\234\236\204::<\2;;=___\234\377" \ + "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\244\377\377\377" \ + "\1\316\316\316\205::<\1kkm\202\377\377\377\1\376\376\376\216\377\377" \ + "\377\4\376\376\376\377\377\377\347\347\347\204\204\204\203::<\6;;=::" \ + "<;;=::<;;=\301\301\303\226\377\377\377\1\376\376\376\203\377\377\377" \ + "\1\203\203\205\202;;=\5::<;;=::\214\305@\207\214\306>\4" \ + "\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250" \ + "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306" \ + ">\40\213\307A\215\305>\341\360\317\377\375\376\324\353\267\215\304B\214" \ + "\306>\215\307=\214\305@\212\307>\212\307<\215\305<\215\306A\214\306>" \ + "\214\306<\212\306@\214\305@\215\307\77\216\306=\212\306B\214\306>\352" \ + "\364\333\377\376\377\377\377\377\377\376\377\377\377\377\377\377\375" \ + "\376\377\373\375\376\377\377\376\377\214\306>\215\307\77\211\214\306" \ + ">\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214\306" \ + ">\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232\377" \ + "\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305" \ + "@\214\306>\214\305@\232\377\377\377\7\374\377\375\242\321a\216\306A\212" \ + "\307>\214\306>\215\307\77\212\307<\210\214\306>\16\215\307\77\214\307" \ + ";\213\304\77\216\306A\214\305B\215\307\77\215\305>\212\307>\320\345\254" \ + "\374\377\377\377\376\377\377\377\375\377\376\377\375\377\372\223\377" \ + "\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377\377kkm\203" \ + "::<\3<<>::<\221\221\221\305\377\377\377\1\316\316\316\204::<\2;;=jjl" \ + "\217\377\377\377\16\316\316\316\300\300\300\234\234\234__a::<;;=::<;" \ + ";=::<99;;;=::<;;=\204\204\206\232\377\377\377\1\362\362\362\202;;=\202" \ + "::<\3""99;::<\235\235\235\212\377\377\377\12\376\376\376\377\377\377" \ + "\205\205\20799;;;=::<;;=::\214\305" \ + "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \ + "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \ + "\214\305@\210\214\306>\202\214\306<\32\342\361\322\377\377\377\377\377" \ + "\375\266\334\205\212\306B\215\307\77\212\306@\220\306=\214\306>\215\307" \ + "\77\214\305B\213\305=\216\306\77\215\307\77\215\305<\212\306B\215\306" \ + "A\215\305@\216\306=\232\315V\371\373\360\377\377\375\377\377\377\375" \ + "\376\377\377\375\377\376\376\377\202\377\377\377\2\214\305@\212\307>" \ + "\211\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324" \ + "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \ + "@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>" \ + "\3\214\305@\214\306>\214\305@\233\377\377\377\5\347\365\334\211\306=" \ + "\215\305>\216\306=\214\305@\211\214\306>\2\215\304B\212\307>\202\214" \ + "\306>\14\215\306A\214\306<\215\305@\252\324p\374\377\377\377\377\377" \ + "\377\375\376\377\376\377\376\376\377\377\377\375\377\377\377\377\375" \ + "\377\222\377\377\377\1\376\376\376\203\377\377\377\4\376\376\376lln:" \ + ":<;;=\203::<\2\235\235\235\376\376\376\304\377\377\377\1\316\316\316" \ + "\205::<\202;;=\2::<;;=\202::<\1;;=\211::<\202;;=\204::<\1""99;\202::" \ + "<\5;;=::<;;=__a\376\376\376\224\377\377\377\1\376\376\376\205\377\377" \ + "\377\1\235\235\235\206::<\3\346\346\346\377\377\377\376\376\376\207\377" \ + "\377\377\5\376\376\376\377\377\377\376\376\376\346\346\350;;=\203::<" \ + "\3;;=::<\265\265\265\230\377\377\377\1\234\234\236\205::<\1\234\234\234" \ + "\246\377\377\377\1lln\202::<\4""99;;;=99;\234\234\234\213\377\377\377" \ + "\1\234\234\234\203::<\7;;=::<;;=::<;;=::<;;=\222::<\7;;=99;;;=::<;;=" \ + "::<\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305@\207\214" \ + "\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306" \ + ">\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \ + "\214\306>\13\216\306A\213\310\77\343\361\320\377\377\375\375\377\376" \ + "\371\374\361\242\320c\213\310\77\216\306\77\214\306>\215\306A\202\214" \ + "\305@\2\216\306A\213\305=\204\214\306>\11\213\307A\216\306A\212\307>" \ + "\260\331y\377\376\377\376\377\375\377\377\373\376\377\377\377\377\377" \ + "\202\377\376\377\2\212\311=\215\306A\211\214\306>\3\215\305>\214\306" \ + ">\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207" \ + "\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\231" \ + "\377\377\377\6\377\376\377\377\377\373\377\376\377\305\342\240\212\310" \ + "\77\214\304=\202\215\305@\210\214\306>\4\215\305>\213\305=\212\306@\215" \ + "\306A\202\214\306>\10\222\312M\370\373\362\377\376\377\377\375\376\377" \ + "\376\377\377\377\377\376\377\375\377\377\377\202\377\376\377\221\377" \ + "\377\377\1\376\376\376\205\377\377\377\2::<;;=\202::<\202;;=\3\300\300" \ + "\300\377\377\377\376\376\376\235\377\377\377\1\376\376\376\245\377\377" \ + "\377\1\316\316\316\207::<\5;;=::<;;=::<;;=\210::<\202;;=\2""99;;;=\202" \ + "::<\3;;=::<;;=\202::<\3;;=xxz\363\363\363\225\377\377\377\3\376\376\376" \ + "\377\377\377\376\376\376\202\377\377\377\3\363\363\363FFH::<\202;;=\202" \ + "::<\1\204\204\206\205\377\377\377\1\376\376\376\205\377\377\377\1\376" \ + "\376\376\202\377\377\377\1kkm\202::<\1;;=\202::<\1SSU\230\377\377\377" \ + "\1\234\234\236\205::<\1\234\234\234\244\377\377\377\3\376\376\376\377" \ + "\377\377xxz\202::<\1;;=\202::<\3xxx\377\377\377\376\376\376\211\377\377" \ + "\377\1\234\234\234\203::<\1;;=\202::<\1;;=\224::<\5;;=99;;;=::<;;=\202" \ + "::<\1\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305@\207\214" \ + "\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306" \ + ">\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \ + "\214\306>\3\214\305@\214\306<\343\361\316\202\377\377\377\26\377\376" \ + "\374\353\365\335\223\312K\211\305\77\215\307=\215\306C\211\306;\214\306" \ + ">\215\305@\215\307\77\214\305@\213\307A\214\306>\212\307<\216\306\77" \ + "\212\306B\215\305>\212\306@\304\341\236\377\376\377\375\377\376\377\377" \ + "\375\203\377\377\377\2\212\306@\214\306<\211\214\306>\3\215\305>\214" \ + "\306>\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305" \ + "@\207\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324" \ + "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \ + "@\231\377\377\377\2\377\377\373\376\377\377\202\377\377\377\4\241\321" \ + "c\215\306A\215\305>\213\310\77\210\214\306>\20\215\305@\215\307=\213" \ + "\310\77\214\304;\216\306\77\213\310\77\333\355\303\377\375\376\377\377" \ + "\375\377\376\377\377\377\377\375\377\374\376\377\377\377\377\377\377" \ + "\377\375\376\376\376\222\377\377\377\1\376\376\376\204\377\377\377\206" \ + "::<\2\316\316\316\376\376\376\234\377\377\377\1\376\376\376\247\377\377" \ + "\377\1\316\316\316\204::<\1;;=\205::<\1;;=\212::<\4""99;;;=::<;;=\203" \ + "::<\1;;=\202::<\1\233\233\233\234\377\377\377\3\235\235\23799;;;=\203" \ + "::<\2;;=\346\346\346\203\377\377\377\1\376\376\376\204\377\377\377\3" \ + "\376\376\376\377\377\377\376\376\376\203\377\377\377\4\316\316\320;;" \ + "=::<;;=\202::<\2;;=\264\264\264\227\377\377\377\1\234\234\236\205::<" \ + "\1\234\234\234\246\377\377\377\2\234\234\236;;=\203::<\2;;=kkk\213\377" \ + "\377\377\1\234\234\234\204::<\3;;=::<;;=\225::<\2;;=99;\202::<\3;;=:" \ + "::\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306" \ + ">\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>" \ + "\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \ + "\214\306>\14\215\307\77\215\305@\340\361\315\376\376\376\377\376\377" \ + "\377\377\375\377\377\377\323\353\267\212\307>\215\305@\214\305@\214\311" \ + "@\202\214\306>\22\212\307>\215\305@\214\306>\212\306@\214\305@\215\305" \ + ">\215\307=\214\306>\214\304=\215\307\77\341\362\316\377\376\377\377\377" \ + "\377\376\376\376\377\377\375\375\376\377\217\307@\212\306@\211\214\306" \ + ">\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214\306" \ + ">\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232\377" \ + "\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305" \ + "@\214\306>\214\305@\232\377\377\377\7\377\376\377\376\377\377\377\377" \ + "\377\352\364\331\212\307<\215\307=\212\307>\211\214\306>\13\212\306@" \ + "\214\306<\216\306A\214\305@\252\322q\376\376\377\376\377\373\377\376" \ + "\377\376\376\377\377\377\375\376\377\377\203\377\377\377\1\376\377\375" \ + "\227\377\377\377\202::<\202;;=\3::<;;=\316\316\316\233\377\377\377\1" \ + "\375\375\375\251\377\377\377\1\316\316\316\211::<\1;;=\213::<\3;;=::" \ + "<;;=\204::<\3""99;\205\205\207\346\346\346\233\377\377\377\4\376\376" \ + "\376\364\364\364FFH;;=\202::<\202;;=\1\204\204\204\215\377\377\377\1" \ + "\376\376\376\202\377\377\377\7kkm::<99;::<;;=99;TTV\227\377\377\377\1" \ + "\234\234\236\205::<\1\234\234\234\246\377\377\377\1\234\234\236\202:" \ + ":<\202;;=\2::\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251" \ + "\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202" \ + "\214\306>\1\214\305@\210\214\306>\202\214\305@\15\341\362\316\377\377" \ + "\375\376\377\375\377\377\377\373\377\374\377\376\377\271\332\211\212" \ + "\307>\212\307<\214\305B\214\305@\216\306\77\212\307>\202\215\307\77\11" \ + "\214\305B\215\306A\212\311=\214\303A\214\306>\215\306A\212\307>\225\311" \ + "K\371\372\362\202\377\377\375\202\377\377\377\2\214\305@\215\306A\211" \ + "\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p" \ + "\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \ + "@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>" \ + "\3\214\305@\214\306>\214\305@\231\377\377\377\10\376\377\377\377\376" \ + "\377\377\377\375\377\375\376\331\356\303\214\306>\214\305B\215\307\77" \ + "\210\214\306>\12\215\305>\212\306B\215\304B\214\306>\215\307=\224\310" \ + "J\364\370\351\376\376\374\375\377\372\377\377\375\203\377\377\377\3\377" \ + "\376\377\377\377\377\376\377\375\221\377\377\377\3\376\376\376\377\377" \ + "\377\376\376\376\203\377\377\377\7::<;;=99;::<;;=::<\315\315\315\232" \ + "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\246\377\377" \ + "\377\1\316\316\316\204::<\1;;=\202::<\1;;=\203::<\1;;=\210::<\1;;=\202" \ + "::<\1;;=\202::<\4``b\233\233\235\347\347\351\376\376\376\235\377\377" \ + "\377\2\265\265\265;;=\202::<\1;;=\202::<\1\332\332\332\216\377\377\377" \ + "\3\376\376\376\377\377\377\302\302\302\206::<\1\315\315\315\226\377\377" \ + "\377\1\234\234\236\205::<\1\234\234\234\245\377\377\377\2\376\376\376" \ + "\235\235\237\205::<\1jjj\203\377\377\377\3\376\376\376\377\377\377\376" \ + "\376\376\205\377\377\377\1\234\234\234\204::<\2;;=kkm\202\234\234\236" \ + "\1\233\233\235\223\234\234\234\202\235\235\235\1\233\233\233\203\234" \ + "\234\234\1\346\346\346\231\377\377\377\3\214\305@\214\306>\214\305@\207" \ + "\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214" \ + "\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305" \ + "@\210\214\306>\17\212\307>\216\306A\342\360\315\376\377\377\376\376\374" \ + "\375\377\376\377\376\377\377\376\374\377\377\375\242\320d\215\307=\214" \ + "\306>\214\305@\215\305@\212\306@\202\214\305@\17\215\305@\212\307>\215" \ + "\307\77\214\306<\215\306A\213\304\77\215\306A\215\307\77\252\324n\377" \ + "\377\377\375\377\376\377\376\377\377\377\375\212\307<\215\305@\211\214" \ + "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \ + "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \ + "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \ + "\305@\214\306>\214\305@\232\377\377\377\6\376\377\375\377\375\377\367" \ + "\375\363\223\312H\216\306\77\215\305>\212\214\306>\2\215\305@\214\306" \ + ">\202\212\307>\3\214\305@\247\324o\377\376\377\202\377\377\377\2\377" \ + "\376\377\377\377\375\233\377\377\377\2::<;;=\204::<\2\316\316\316\376" \ + "\376\376\236\377\377\377\3\316\316\316;;;:::\230::<\213\377\377\377\1" \ + "\316\316\316\224::<\6kkmlln\205\205\207\234\234\236\301\301\303\363\363" \ + "\363\202\377\377\377\1\376\376\376\202\377\377\377\3\376\376\376\377" \ + "\377\377\376\376\376\231\377\377\377\1SSS\204::<\2;;=lln\213\377\377" \ + "\377\1\376\376\376\205\377\377\377\2\376\376\376TTV\205::<\1lll\226\377" \ + "\377\377\1\234\234\236\205::<\1\234\234\234\246\377\377\377\2\233\233" \ + "\235;;=\204::<\2kkk\376\376\376\203\377\377\377\1\376\376\376\206\377" \ + "\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305" \ + "@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324" \ + "p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \ + "\202\214\306>\1\214\305@\210\214\306>\3\212\307>\215\305>\342\362\315" \ + "\202\377\377\377\22\377\376\377\376\377\377\377\377\375\376\377\377\363" \ + "\367\346\225\311K\211\307@\216\306\77\212\307>\215\305@\214\306<\212" \ + "\307>\214\305@\214\306>\212\306@\215\306C\214\304\77\215\307\77\202\214" \ + "\306>\7\212\306@\307\341\240\377\376\377\376\377\372\377\377\377\212" \ + "\307>\215\305>\211\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \ + "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \ + "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \ + "\207\214\306>\3\214\305@\214\306>\214\305@\231\377\377\377\4\377\376" \ + "\377\376\377\375\376\377\377\257\330z\202\214\305@\1\215\307\77\211\214" \ + "\306>\14\212\307>\215\307\77\214\305@\215\305@\212\307>\215\307=\214" \ + "\305B\313\347\252\377\377\377\377\375\377\377\376\377\376\376\376\202" \ + "\376\377\375\231\377\377\377\4GGI;;=::<;;=\202::<\1\233\233\235\237\377" \ + "\377\377\3\316\316\316::<;;=\230::<\213\377\377\377\1\316\316\316\205" \ + "::<\1kkm\202\377\377\377\2\376\376\376\250\250\250\206::<\2FFH\346\346" \ + "\346\210\377\377\377\1\376\376\376\237\377\377\377\1\264\264\266\203" \ + ";;=\4::<;;=;;;\316\316\316\222\377\377\377\1\265\265\265\204::<\3;;=" \ + "::<\316\316\316\203\377\377\377\1\376\376\376\221\377\377\377\1\234\234" \ + "\236\205::<\1\234\234\234\245\377\377\377\2\376\376\376\235\235\237\205" \ + "::<\1lll\213\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377" \ + "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \ + "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \ + "\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \ + "\316\205\377\377\377\10\376\377\375\377\377\377\333\355\303\215\305@" \ + "\214\306>\214\306<\214\305@\215\305>\202\214\305@\207\214\306>\6\212" \ + "\306@\214\307;\330\355\304\377\376\377\377\377\377\215\305>\212\214\306" \ + ">\3\215\305>\214\306>\305\342\240\215\377\377\377\17\251\323q\214\306" \ + ">\215\307\77\214\305B\215\307\77\213\305=\215\307\77\214\305@\212\307" \ + ">\215\305@\213\310\77\214\305@\215\305<\214\306>\376\377\377\230\377" \ + "\377\377\6\376\377\377\253\323p\215\305@\213\307A\214\306<\212\306B\202" \ + "\214\306>\4\214\305@\214\306>\212\307>\214\305@\202\214\306>\2\214\305" \ + "@\376\377\375\220\377\377\377\1\377\377\375\202\377\377\377\16\376\377" \ + "\375\377\376\377\377\375\376\374\377\377\377\377\375\376\377\375\377" \ + "\377\377\336\355\304\214\306>\215\306A\214\306>\215\306A\212\306@\216" \ + "\306A\202\214\305@\4\215\307\77\214\306>\215\307\77\214\306>\202\214" \ + "\305@\16\214\306>\215\307\77\214\306>\215\307\77\214\305@\214\305B\222" \ + "\313H\361\370\346\376\377\377\377\377\377\377\376\377\377\377\377\374" \ + "\377\377\377\376\377\230\377\377\377\1kkm\202::<\1""99;\202::<\1\235" \ + "\235\237\233\377\377\377\1\376\376\376\203\377\377\377\1\316\316\316" \ + "\224::<\1;;=\205::<\213\377\377\377\1\316\316\316\205::<\1kkm\204\377" \ + "\377\377\3wwy::<;;=\202::<\4""99;;;=``b\363\363\363\206\377\377\377\1" \ + "\376\376\376\235\377\377\377\4\376\376\376\377\377\377\376\376\376TT" \ + "V\205::<\1lln\223\377\377\377\10\376\376\376SSU;;=::<;;=99;::\214\305@\207\214\306>\4\214\305@\215" \ + "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \ + "\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305" \ + "@\343\361\316\205\377\377\377\7\377\375\377\377\377\375\376\377\377\276" \ + "\337\220\213\310\77\213\304A\216\306=\207\214\306>\3\215\307\77\214\306" \ + ">\212\307>\202\215\305>\5\223\312J\361\371\344\377\375\377\212\307<\214" \ + "\305@\211\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\14" \ + "\376\376\374\252\324n\214\306>\213\305=\215\307\77\214\305@\215\306A" \ + "\214\306>\215\307\77\213\310\77\215\305@\212\307>\202\214\306>\1\214" \ + "\305@\232\377\377\377\3\247\324m\215\305>\214\305@\202\214\306>\1\215" \ + "\307=\202\214\305@\6\214\306<\215\307=\214\305B\215\307\77\214\306>\214" \ + "\305@\224\377\377\377\15\377\377\375\376\376\376\377\377\377\377\376" \ + "\377\376\377\375\377\377\375\372\373\366\222\312M\216\306A\215\305<\214" \ + "\306>\212\307>\215\305<\202\214\306>\2\215\307\77\213\305=\204\214\306" \ + ">\1\214\305@\203\214\306>\14\215\307\77\214\305@\213\304\77\214\305B" \ + "\253\324n\376\376\377\376\377\377\377\376\377\377\377\377\376\377\375" \ + "\377\377\375\376\377\375\227\377\377\377\3lln::<;;=\203::<\2kkm\376\376" \ + "\376\236\377\377\377\2\316\316\316;;=\226::<\3;;=::\214\305" \ + "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \ + "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \ + "\214\305@\211\214\306>\2\214\305@\343\361\316\205\377\377\377\2\377\377" \ + "\375\377\375\377\202\377\377\377\1\242\322b\202\214\305@\2\214\305B\215" \ + "\307\77\205\214\306>\12\215\307\77\214\306>\215\306A\214\306>\212\306" \ + "@\215\307=\241\321c\377\377\377\215\304B\212\307>\211\214\306>\3\215" \ + "\305>\214\306>\305\342\240\214\377\377\377\5\376\377\375\251\323o\215" \ + "\307\77\214\306>\215\307\77\202\214\305@\2\214\306>\215\307\77\202\214" \ + "\306>\5\213\310\77\215\305>\214\305@\214\306>\377\376\377\230\377\377" \ + "\377\12\377\376\377\247\326p\213\304\77\215\307\77\214\305B\214\306<" \ + "\214\306>\215\307\77\214\305@\214\306>\202\215\307\77\3\214\306>\215" \ + "\306A\216\306\77\223\377\377\377\5\376\377\372\377\377\375\376\376\376" \ + "\377\377\377\377\377\375\202\377\376\377\4\250\325p\212\307<\214\305" \ + "@\215\307\77\202\214\305@\3\214\307;\215\307=\214\306>\202\214\305@\202" \ + "\214\306>\1\215\307\77\207\214\306>\202\214\305@\5\212\307>\307\341\240" \ + "\376\376\374\377\377\377\377\376\377\202\377\377\377\1\376\376\374\227" \ + "\377\377\377\7\234\234\236;;=99;<<>99;::<;;=\237\377\377\377\1\316\316" \ + "\316\223::<\7;;=99;;;=99;::<;;=kkm\213\377\377\377\1\316\316\316\205" \ + "::<\2mmo\376\376\377\204\377\377\377\12\332\332\332FFH;;=::<;;=99;<<" \ + ">::<\266\266\270\376\376\376\203\377\377\377\1\376\376\376\202\377\377" \ + "\377\1\376\376\376\230\377\377\377\3\376\376\376\377\377\377\376\376" \ + "\376\202\377\377\377\1kkm\205::<\202;;=\224::<\10;;=::<;;=::<;;=88:;" \ + ";=\205\205\205\224\377\377\377\1\234\234\236\205::<\1\234\234\234\246" \ + "\377\377\377\3SSU;;=::<\203;;=\1\234\234\234\206\377\377\377\1\376\376" \ + "\376\204\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377" \ + "\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306" \ + ">\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1" \ + "\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \ + "\316\205\377\377\377\10\376\376\374\376\377\375\377\375\377\377\377\377" \ + "\367\372\357\224\313L\214\305B\215\305<\203\214\306>\202\215\307\77\204" \ + "\214\306>\6\215\306A\213\307A\214\306>\212\306@\277\337\223\215\305>" \ + "\212\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\2\376\377" \ + "\377\251\322r\202\215\307\77\1\214\305B\202\214\306>\202\215\307\77\7" \ + "\214\306>\215\307\77\214\306>\214\304\77\212\306@\215\307\77\377\376" \ + "\377\230\377\377\377\7\377\377\375\215\305@\214\306>\214\305@\214\306" \ + ">\216\306\77\214\306<\203\214\305@\6\215\306C\215\307=\214\305@\215\306" \ + "A\233\314V\377\377\375\220\377\377\377\5\376\376\376\377\377\377\377" \ + "\376\377\377\375\377\377\377\375\202\376\377\377\21\377\376\377\314\346" \ + "\251\212\306B\215\307=\212\307>\216\306\77\215\306C\212\307>\215\306" \ + "C\214\305@\215\307\77\213\304\77\215\306A\214\306>\214\305@\215\307\77" \ + "\215\306A\203\214\306>\1\215\307\77\202\214\306>\202\215\307\77\10\214" \ + "\306>\214\305@\350\364\334\377\377\375\377\376\377\377\377\377\376\376" \ + "\376\377\376\377\222\377\377\377\1\376\376\376\204\377\377\377\1\301" \ + "\301\301\202::<\2""99;;;=\202::<\1\316\316\316\233\377\377\377\1\376" \ + "\376\376\202\377\377\377\2\316\316\316;;;\222::<\7""99;;;=::<;;=::<9" \ + "9;\204\204\206\213\377\377\377\1\316\316\316\205::<\1jjl\202\377\377" \ + "\377\202\376\376\376\202\377\377\377\1\265\265\267\202::<\202;;=\202" \ + "::<\2FFH\332\332\332\205\377\377\377\1\376\376\376\234\377\377\377\2" \ + "\376\376\376\317\317\317\202::<\1;;=\204::<\3;;=::<;;=\222::<\2""99;" \ + ";;=\202::<\1;;=\203::<\3\346\346\346\377\377\377\376\376\376\221\377" \ + "\377\377\1\234\234\236\205::<\1\234\234\234\246\377\377\377\1;;=\203" \ + "::<\4;;=::<\316\316\316\376\376\376\203\377\377\377\1\376\376\376\206" \ + "\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214" \ + "\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252" \ + "\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \ + "\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\205" \ + "\377\377\377\203\376\377\377\202\377\376\377\2\341\361\315\214\305@\203" \ + "\215\307\77\202\214\306>\1\215\307\77\203\214\306>\10\214\305@\215\307" \ + "\77\214\306>\212\307>\216\306A\213\305;\214\305@\215\305<\211\214\306" \ + ">\3\215\305>\214\306>\305\342\240\214\377\377\377\2\376\377\377\252\324" \ + "p\202\214\306>\3\214\305B\214\306<\215\307\77\203\214\306>\6\214\306" \ + "<\214\307;\217\307@\212\307>\214\305@\376\377\377\231\377\377\377\10" \ + "\215\307=\214\305B\213\304A\216\310@\214\304\77\215\307=\214\305@\215" \ + "\307\77\203\214\306>\3\215\307\77\214\306>\247\324o\222\377\377\377\3" \ + "\377\377\375\377\377\377\377\375\376\203\377\377\377\20\360\371\346\223" \ + "\312K\216\306\77\213\304A\215\306A\213\305=\215\305@\212\307>\215\305" \ + "<\214\305B\214\305@\214\306>\214\306<\214\306>\215\307\77\213\305=\204" \ + "\214\306>\202\215\307\77\203\214\306>\10\215\306A\212\307<\243\321d\377" \ + "\377\373\375\377\376\377\376\377\377\377\377\376\376\374\223\377\377" \ + "\377\5\375\375\375\377\377\377\376\376\376\377\377\377\346\346\346\202" \ + "::<\1;;=\203::<\1\221\221\221\235\377\377\377\3\376\376\376\377\377\377" \ + "\376\376\376\222\377\377\377\1__a\204::<\2;;=\234\234\234\213\377\377" \ + "\377\1\316\316\316\205::<\3jjl\377\377\377\376\376\376\205\377\377\377" \ + "\2\204\204\206;;=\204::<\3;;=RRT\363\363\363\237\377\377\377\1\376\376" \ + "\376\202\377\377\377\2jjl;;=\206::<\4;;=::<99;;;=\223::<\1;;=\205::<" \ + "\1\204\204\206\203\377\377\377\1\376\376\376\217\377\377\377\1\234\234" \ + "\236\205::<\1\234\234\234\245\377\377\377\3\315\315\315;;=99;\202::<" \ + "\5""99;;;=\346\346\346\377\377\377\376\376\376\211\377\377\377\1\234" \ + "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \ + "\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377" \ + "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \ + ">\1\214\305@\211\214\306>\2\214\305@\343\361\316\207\377\377\377\202" \ + "\377\377\375\4\376\377\377\377\377\375\303\342\237\212\306@\202\214\305" \ + "@\206\214\306>\7\216\306\77\213\305;\214\305@\216\306A\214\306>\215\307" \ + "\77\213\307A\212\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \ + "\377\17\252\323k\215\306A\214\306>\215\307\77\214\306>\215\307\77\214" \ + "\305@\214\306>\213\304A\215\306C\214\305@\213\304A\213\310=\214\306<" \ + "\342\357\321\230\377\377\377\6\360\371\346\214\305B\212\307<\215\307" \ + "=\213\305=\215\307\77\202\214\305@\7\215\306A\214\306>\214\306<\214\305" \ + "@\214\306>\214\305@\252\324p\222\377\377\377\11\377\376\377\376\377\377" \ + "\377\377\377\377\377\375\376\376\374\377\377\377\253\323p\215\307\77" \ + "\211\306;\202\215\306A\6\214\306>\214\306<\215\305>\216\305C\215\307" \ + "\77\213\304\77\202\215\307\77\2\215\307=\213\305;\202\215\307\77\2\214" \ + "\306>\215\307\77\205\214\306>\5\215\307\77\212\306@\214\306>\215\307" \ + "\77\304\341\236\202\377\377\377\2\376\376\377\374\377\377\230\377\377" \ + "\377\7SSU;;=99;::<;;=::\214\305@\207\214\306>\4\214\305@\215\305>\214\306" \ + ">\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1" \ + "\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \ + "\316\206\377\377\377\13\377\376\377\377\377\377\376\377\375\377\377\377" \ + "\377\376\377\376\377\377\253\324l\214\305B\213\304\77\214\305@\215\307" \ + "\77\203\214\306>\11\214\305@\214\306<\216\306=\214\306>\212\306@\215" \ + "\306C\214\304;\212\307>\214\305@\211\214\306>\3\215\305>\214\306>\305" \ + "\342\240\215\377\377\377\1\261\330\177\202\214\306>\2\214\306<\215\306" \ + "A\203\214\306>\7\215\307\77\214\306>\214\306<\215\307=\214\306>\215\306" \ + "C\323\353\267\230\377\377\377\4\340\361\315\215\305@\215\306A\214\305" \ + "@\202\214\306>\2\213\305=\215\306A\202\214\305@\5\214\306>\215\307\77" \ + "\214\306>\214\305@\260\330x\221\377\377\377\3\376\376\376\377\377\373" \ + "\375\377\376\202\377\377\377\25\376\377\377\314\345\253\214\305@\213" \ + "\304\77\216\306\77\212\307>\215\305@\214\306>\214\305@\215\305>\214\305" \ + "@\214\306>\214\306<\214\305@\215\306A\214\305@\215\306C\214\306>\214" \ + "\305@\214\306>\215\307\77\207\214\306>\7\212\306@\220\306=\215\306C\350" \ + "\364\336\376\377\373\377\377\375\376\377\377\230\377\377\377\1\221\221" \ + "\223\203::<\1;;=\202::<\1\265\265\265\230\377\377\377\1\376\376\376\227" \ + "\377\377\377\1\316\316\316\202::<\1;;=\203::<\1\363\363\363\213\377\377" \ + "\377\1\316\316\316\205::<\1kkm\204\377\377\377\1\376\376\376\203\377" \ + "\377\377\2\346\346\346FFH\206::<\2\234\234\236\376\376\376\237\377\377" \ + "\377\1\205\205\205\206::<\3;;=::<;;=\223::<\1;;=\203::<\202;;=\204::" \ + "<\2\234\234\234\376\376\376\221\377\377\377\1\234\234\236\205::<\1\234" \ + "\234\234\245\377\377\377\1RRR\204::<\2""99;yy{\203\377\377\377\1\376" \ + "\376\376\202\377\377\377\202\376\376\376\204\377\377\377\1\234\234\234" \ + "\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305@\207" \ + "\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214" \ + "\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305" \ + "@\211\214\306>\2\214\305@\343\361\316\205\377\377\377\30\377\377\375" \ + "\377\377\377\375\377\376\377\377\377\377\376\377\377\377\377\376\377" \ + "\377\371\372\365\222\313H\214\305B\214\305@\215\307\77\214\306>\215\307" \ + "\77\214\306>\214\305@\212\306B\214\305@\212\307>\216\306\77\212\307>" \ + "\215\307\77\214\306<\214\305@\211\214\306>\3\215\305>\214\306>\305\342" \ + "\240\214\377\377\377\20\377\376\377\301\345\237\215\305>\215\306A\213" \ + "\304\77\215\306C\214\306>\214\306<\216\306\77\214\306>\214\305B\215\307" \ + "\77\214\306>\215\307\77\214\305@\271\332\211\230\377\377\377\10\307\341" \ + "\240\215\305>\214\305@\214\306>\215\305<\212\307>\214\305B\214\306<\202" \ + "\214\306>\5\215\305<\214\305B\215\307\77\214\306>\303\344\235\222\377" \ + "\377\377\6\376\376\377\377\377\375\376\377\377\377\376\377\352\364\333" \ + "\215\305@\202\215\307\77\16\214\306>\215\307\77\214\306>\215\307\77\214" \ + "\306<\216\306A\213\310\77\214\305D\215\3108\214\305@\215\305>\223\312" \ + "K\236\323a\215\307\77\207\214\306>\202\214\305@\10\214\306>\215\307\77" \ + "\212\307>\212\307<\241\321c\377\376\377\377\375\376\377\375\377\230\377" \ + "\377\377\3\332\332\332:::;;=\204::<\1SSU\203\377\377\377\1\376\376\376" \ + "\247\377\377\377\1\376\376\376\204\377\377\377\1\221\221\221\202::<\1" \ + ";:\77\202::<\1RRT\214\377\377\377\1\316\316\316\205::<\1kkm\211\377\377" \ + "\377\2\316\316\316;;=\202::<\5;;=::<;;=::<\316\316\316\210\377\377\377" \ + "\1\376\376\376\215\377\377\377\1\376\376\376\207\377\377\377\2\346\346" \ + "\350::<\202;;=\202::<\2:::xxx\230\234\234\234\3\235\235\235\234\234\234" \ + "kkm\203::<\4;;=::\214\305@\204\214\306>\2\213\307A\213\310\77\204\214\306>\1\252\324" \ + "p\232\377\377\377\1\377\377\375\216\377\377\377\215\214\306>\1\250\325" \ + "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>" \ + "\2\214\305@\343\361\316\215\377\377\377\10\352\363\336\214\306>\212\306" \ + "B\215\307\77\212\307<\215\305>\214\305@\215\307\77\221\214\306>\3\215" \ + "\305>\214\306>\305\342\240\214\377\377\377\30\377\376\377\313\347\254" \ + "\215\307\77\214\304=\215\307\77\212\306@\215\307\77\215\306A\214\305" \ + "@\214\306>\215\307\77\214\306>\215\307\77\214\305@\214\305B\222\313H" \ + "\377\376\377\377\375\376\377\376\377\377\377\377\377\376\377\377\377" \ + "\373\376\377\377\377\376\377\211\377\377\377\26\377\377\375\377\376\377" \ + "\377\377\377\376\377\377\377\377\375\376\377\375\377\377\377\241\323" \ + "b\215\304D\214\307;\215\307\77\214\305B\215\307\77\214\306<\215\306A" \ + "\212\307>\215\305@\214\306>\213\310=\215\305@\215\306A\323\352\264\221" \ + "\377\377\377\11\376\377\377\376\376\374\376\377\377\377\376\374\377\376" \ + "\377\242\320c\215\307\77\215\306A\214\306>\202\214\305@\203\214\306>" \ + "\25\214\305@\215\306A\214\305@\215\307\77\214\306>\215\307=\315\345\253" \ + "\361\370\346\215\307\77\214\306>\212\306@\216\306A\214\306>\215\305>" \ + "\215\305@\214\305@\212\307>\215\305@\212\306@\215\305<\215\305@\202\214" \ + "\306>\12\277\337\223\377\377\377\376\377\375\377\376\377\377\377\375" \ + "\376\377\377\377\377\377\376\376\376\377\377\377\377\377\375\222\377" \ + "\377\377\1___\202::<\202;;=\202::<\1\266\266\266\250\377\377\377\1\376" \ + "\376\376\202\377\377\377\1\376\376\376\203\377\377\377\1SSU\203::<\3" \ + ";;=::<\221\221\223\214\377\377\377\1\316\316\316\205::<\1kkm\210\377" \ + "\377\377\3\376\376\376\377\377\377\233\233\233\203::<\5;;=::<;;=FFH\364" \ + "\364\364\210\377\377\377\1\376\376\376\213\377\377\377\2\376\376\376" \ + "\377\377\377\202\376\376\376\205\377\377\377\1\204\204\206\202::<\1;" \ + ";=\202::<\3FFF\363\363\363\376\376\376\231\377\377\377\3\346\346\346" \ + "::<;;=\204::<\3\234\234\234\377\377\377\376\376\376\217\377\377\377\1" \ + "\234\234\236\205::<\1\234\234\234\234\377\377\377\1\376\376\376\207\377" \ + "\377\377\3\205\205\207::<;;=\204::<\1\346\346\350\214\377\377\377\1\234" \ + "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \ + "\305@\205\214\306>\7\214\306<\214\306>\215\307\77\214\305@\214\306>\252" \ + "\324p\376\377\375\230\377\377\377\203\377\376\377\203\377\377\377\1\376" \ + "\376\377\211\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342" \ + "\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316" \ + "\215\377\377\377\2\376\377\375\313\347\254\203\214\306>\3\214\305@\216" \ + "\306\77\211\306=\221\214\306>\3\215\305>\214\306>\305\342\240\214\377" \ + "\377\377\11\375\376\377\343\361\316\215\305>\215\307\77\213\304A\215" \ + "\307\77\215\305>\214\306<\214\305@\203\214\306>\14\215\307\77\214\305" \ + "@\213\304\77\214\305B\322\353\264\377\377\377\377\377\375\377\377\377" \ + "\377\376\377\376\377\377\377\377\377\376\377\377\210\377\377\377\13\377" \ + "\377\375\377\377\377\376\377\375\377\376\377\376\376\374\377\377\375" \ + "\377\377\377\350\364\334\215\304D\215\305>\215\307\77\202\214\305@\202" \ + "\214\306>\10\214\305@\215\306A\214\306<\215\306C\214\304=\215\307=\212" \ + "\307<\351\366\332\222\377\377\377\14\377\377\375\377\377\377\377\377" \ + "\375\304\343\237\214\306>\212\307>\217\307@\214\305@\215\307\77\214\306" \ + ">\214\305@\215\306A\202\214\306>\5\214\306<\215\305>\211\307>\216\306" \ + "=\251\323o\202\376\377\377\31\304\341\241\212\306@\215\306A\212\307>" \ + "\215\307\77\214\306<\216\305C\212\307<\216\306A\214\306<\215\307\77\215" \ + "\305>\212\307>\216\306A\214\305@\216\306A\341\361\315\377\376\377\377" \ + "\377\375\376\377\377\377\376\377\376\376\376\377\377\377\377\376\377" \ + "\376\377\375\222\377\377\377\1\265\265\265\202;;=\204::<\2SSU\364\364" \ + "\364\203\377\377\377\1\376\376\376\245\377\377\377\1\376\376\376\203" \ + "\377\377\377\1\316\316\316\203::<\1;;=\202::<\1\302\302\302\214\377\377" \ + "\377\1\316\316\316\205::<\1kkm\213\377\377\377\1lln\204::<\3;;=::<__" \ + "a\202\377\377\377\1\376\376\376\206\377\377\377\1\376\376\376\213\377" \ + "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377" \ + "\3\346\346\346::<;;=\204::<\1\234\234\234\234\377\377\377\1\204\204\206" \ + "\202;;=\202::<\2;;=SSU\221\377\377\377\1\234\234\236\205::<\1\234\234" \ + "\234\235\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202" \ + "\377\377\377\2\346\346\346::<\202;;=\4""99;;;=::\214\305@\204\214\306>\10\214\305@\215\306A\215\305@\213\305=\214\306" \ + ">\215\307\77\252\324p\376\377\377\230\377\377\377\1\376\376\376\205\377" \ + "\377\377\2\376\377\377\376\377\375\210\377\377\377\215\214\306>\1\250" \ + "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306" \ + ">\2\214\305@\343\361\316\215\377\377\377\10\377\377\375\377\375\376\262" \ + "\331|\214\305@\215\306A\214\306>\214\305B\215\307\77\221\214\306>\3\215" \ + "\305>\214\306>\305\342\240\214\377\377\377\10\376\377\375\377\377\377" \ + "\214\304\77\212\307>\216\306A\214\306>\215\305@\215\307\77\206\214\306" \ + ">\202\214\305@\3\233\316X\376\376\377\376\377\373\202\377\377\377\3\377" \ + "\375\376\377\377\375\377\376\377\210\377\377\377\12\377\376\377\376\377" \ + "\375\377\375\376\376\376\374\377\377\377\377\377\375\377\377\377\257" \ + "\330x\214\307;\215\307\77\202\214\305@\2\215\307\77\213\305=\202\214" \ + "\306>\1\215\305>\202\214\306>\5\216\306\77\215\306A\215\305@\376\377" \ + "\375\377\376\377\220\377\377\377\11\377\377\375\377\377\377\376\377\377" \ + "\350\364\334\212\307>\213\310\77\216\306\77\212\307>\214\305@\202\214" \ + "\306>%\215\306A\214\306>\213\305=\214\306>\215\307\77\215\305@\211\307" \ + ">\223\311M\363\367\350\376\377\375\377\377\377\377\377\375\242\320d\212" \ + "\307<\215\306A\214\305@\212\306@\215\306A\214\306>\212\307>\215\307\77" \ + "\217\304@\211\310<\215\305>\213\310\77\212\307>\214\306>\234\315W\367" \ + "\372\363\376\377\377\377\376\377\377\377\375\377\377\377\376\376\376" \ + "\377\377\375\377\377\377\376\377\375\222\377\377\377\1RRR\202::<\203" \ + ";;=\2::<\234\234\236\204\377\377\377\1\376\376\376\246\377\377\377\3" \ + "\376\376\376\377\377\377kkk\202::<\4;;=99;;;=FFH\215\377\377\377\1\316" \ + "\316\316\205::<\1kkm\211\377\377\377\5\376\376\376\377\377\377\363\363" \ + "\363SSU;;=\202::<\202;;=\2""99;\222\222\222\207\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\214\377\377\377\1\376\376\376\204\377\377" \ + "\377\3\204\204\204;;=99;\202;;=\3::\214\305@\204\214\306>\2\214\305@\214\306>\203\215\306A\2\215\307\77" \ + "\251\323q\231\377\377\377\203\377\377\375\202\377\377\377\1\377\375\376" \ + "\202\377\376\377\210\377\377\377\215\214\306>\1\250\325p\216\377\377" \ + "\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343" \ + "\361\316\215\377\377\377\7\376\376\376\377\377\375\366\373\364\233\316" \ + "X\215\305@\215\307=\215\305>\222\214\306>\3\215\305>\214\306>\305\342" \ + "\240\216\377\377\377\6\243\322b\214\306>\215\305@\215\307\77\215\305" \ + "@\215\306A\203\214\306>\1\215\307\77\202\214\306>\202\215\307\77\2\214" \ + "\306>\315\346\254\202\377\377\377\4\377\376\375\376\377\375\376\376\377" \ + "\377\376\377\212\377\377\377\7\377\377\375\377\376\377\377\377\373\377" \ + "\377\375\327\356\304\214\306>\215\307\77\202\214\305@\203\214\306>\12" \ + "\215\307\77\214\306>\214\305@\216\306\77\214\306<\214\304\77\212\307" \ + ">\260\331{\376\377\375\377\376\377\220\377\377\377\13\376\377\377\377" \ + "\377\375\370\373\362\233\315Z\216\306A\214\305@\212\307>\215\306A\214" \ + "\306>\214\305@\215\306A\202\214\306>\6\215\307\77\214\305@\214\305B\214" \ + "\306>\215\307=\313\347\254\202\377\377\377\23\377\376\377\377\377\375" \ + "\350\364\334\212\307>\220\306=\214\305@\216\306=\214\306>\214\305@\214" \ + "\306>\212\306@\215\305>\212\306@\215\307\77\212\307>\215\307\77\214\305" \ + "@\212\306@\277\340\221\202\377\377\377\1\377\377\375\203\377\377\377" \ + "\2\377\376\377\377\377\375\220\377\377\377\4\376\376\376\377\377\377" \ + "\265\265\265::<\202;;=\5""99;::<;;=99;\317\317\317\250\377\377\377\1" \ + "\376\376\376\202\377\377\377\2\316\316\31699;\202::<\202;;=\2::<\221" \ + "\221\223\215\377\377\377\1\316\316\316\205::<\1kkm\207\377\377\377\1" \ + "\376\376\376\204\377\377\377\1\332\332\334\203::<\5;;=::<;;=99;\302\302" \ + "\302\202\377\377\377\1\376\376\376\216\377\377\377\1\376\376\376\202" \ + "\377\377\377\1\376\376\376\204\377\377\377\4\362\362\362FFH::<;;=\202" \ + "::<\2;;=\221\221\223\204\377\377\377\202\376\376\376\224\377\377\377" \ + "\1\376\376\376\203\377\377\377\1kkm\202;;=\203::<\1SSU\220\377\377\377" \ + "\1\234\234\236\205::<\1\234\234\234\240\377\377\377\3\376\376\376\377" \ + "\377\377\315\315\315\203::<\1;;=\202::<\1SSU\216\377\377\377\1\234\234" \ + "\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305" \ + "@\204\214\306>\3\215\306A\214\306<\215\307=\202\214\305@\3\214\306>\253" \ + "\324n\377\377\375\230\377\377\377\2\375\376\377\376\376\376\203\377\377" \ + "\377\1\377\377\375\212\377\377\377\215\214\306>\1\250\325p\216\377\377" \ + "\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343" \ + "\361\316\220\377\377\377\5\350\365\333\214\306>\214\305@\214\306>\215" \ + "\306A\221\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\7" \ + "\377\377\375\277\337\224\212\306@\215\305@\212\307>\215\306A\215\307" \ + "\77\203\214\306>\202\215\307\77\203\214\306>\3\214\306<\214\306>\351" \ + "\363\330\202\377\377\377\3\376\376\376\374\377\377\376\377\377\211\377" \ + "\377\377\1\376\377\377\202\377\377\377\7\375\376\377\351\365\337\223" \ + "\311M\215\307=\214\305B\214\305@\215\307\77\202\214\306>\12\215\306A" \ + "\214\305@\214\306>\212\307>\215\306A\214\306>\215\307=\213\310\77\316" \ + "\345\255\376\377\377\221\377\377\377\7\376\377\377\377\377\375\300\337" \ + "\223\216\306A\213\305=\215\307=\215\305>\202\214\306>\1\215\307\77\203" \ + "\214\306>\202\214\305@\5\215\307\77\213\307A\251\322r\377\377\377\377" \ + "\377\375\202\377\377\377\14\377\376\377\377\377\377\305\342\237\212\307" \ + "<\220\305\77\214\306>\212\306@\215\306A\214\306<\214\305@\214\306<\216" \ + "\305C\202\214\306>\7\215\305<\214\306>\215\305>\214\305@\342\362\316" \ + "\377\377\377\377\377\375\202\377\377\377\3\376\377\377\377\376\377\376" \ + "\376\376\221\377\377\377\3\376\376\376\377\377\377___\205::<\4;;=FFH" \ + "\363\363\363\377\377\377\202\376\376\376\246\377\377\377\3\363\363\363" \ + "SSU;;=\204::<\4;;=\345\345\345\377\377\377\376\376\376\213\377\377\377" \ + "\1\316\316\316\205::<\1kkm\211\377\377\377\1\376\376\376\203\377\377" \ + "\377\4\264\264\266;;=99;::<\202;;=\3::\214\305@\204\214\306>\2\212\306@\213\310" \ + "\77\202\214\305@\3\215\307\77\214\306<\251\323o\231\377\377\377\4\377" \ + "\376\377\377\377\375\377\377\377\376\376\377\214\377\377\377\215\214" \ + "\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305" \ + "@\211\214\306>\2\214\305@\343\361\316\215\377\377\377\1\377\377\375\203" \ + "\377\377\377\4\323\353\267\212\307<\214\306<\212\306B\221\214\306>\3" \ + "\215\305>\214\306>\305\342\240\214\377\377\377\7\376\377\377\377\376" \ + "\377\350\365\331\215\307\77\215\305>\214\306>\212\307>\202\214\306>\1" \ + "\215\307\77\205\214\306>\11\215\307\77\213\304A\212\307>\222\312M\343" \ + "\361\316\376\376\377\377\376\377\377\377\377\377\375\377\210\377\377" \ + "\377\1\377\376\377\202\377\377\375\12\377\376\377\350\364\334\220\313" \ + "K\216\306=\215\305<\215\307\77\214\306>\213\305=\214\306>\215\306A\202" \ + "\214\306>\1\214\305@\202\212\307>\6\214\305@\215\306C\215\305>\360\370" \ + "\351\377\377\373\376\377\377\221\377\377\377\7\345\360\322\215\305@\214" \ + "\305@\215\307=\214\304=\213\310=\215\305>\202\214\306>\2\213\305=\215" \ + "\307\77\202\214\305@\7\215\307\77\214\307;\214\305@\363\367\346\376\377" \ + "\377\377\377\373\377\376\377\202\377\377\377\30\376\377\375\377\376\377" \ + "\241\321a\216\306\77\212\306@\213\310=\215\305@\213\307A\217\304>\215" \ + "\305@\214\306<\216\306A\215\306A\212\307>\214\306<\214\306>\212\307<" \ + "\233\314W\366\373\365\377\377\375\377\377\377\377\376\377\373\377\377" \ + "\377\376\377\224\377\377\377\1\317\317\317\205::<\4;;=::<``b\362\362" \ + "\362\247\377\377\377\2\376\376\376\221\221\221\206::<\3\204\204\206\377" \ + "\377\377\376\376\376\214\377\377\377\1\316\316\316\205::<\1kkm\212\377" \ + "\377\377\6\376\376\376\377\377\377\376\376\376\377\377\377\203\203\203" \ + ";;=\205::<\3``b\363\363\363\376\376\376\216\377\377\377\1\376\376\376" \ + "\206\377\377\377\3\363\363\363FFH;;=\203::<\2;;=\203\203\203\203\377" \ + "\377\377\3\376\376\376\377\377\377\376\376\376\225\377\377\377\1\376" \ + "\376\376\204\377\377\377\3kkk::<<<>\202::<\2;;=kkm\217\377\377\377\1" \ + "\234\234\236\205::<\1\234\234\234\236\377\377\377\4\376\376\376\377\377" \ + "\377\376\376\376kkk\202::<\5;;=::<99;;;=TTV\202\377\377\377\1\376\376" \ + "\376\214\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377" \ + "\3\214\305@\214\306>\214\305@\204\214\306>\10\214\306<\214\306>\214\305" \ + "@\214\306>\215\307\77\214\306>\252\324r\376\377\377\230\377\377\377\1" \ + "\377\377\375\202\377\377\377\2\377\377\375\376\376\374\203\377\376\377" \ + "\210\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \ + "\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\215\377" \ + "\377\377\10\375\377\374\377\376\377\375\377\376\376\376\377\377\377\377" \ + "\270\333\207\214\305@\215\307\77\221\214\306>\3\215\305>\214\306>\305" \ + "\342\240\214\377\377\377\12\375\376\377\377\376\377\376\377\377\234\313" \ + "Y\215\306A\214\305@\212\307>\214\305@\214\306>\215\307\77\206\214\306" \ + ">\7\215\307\77\214\306>\215\305@\213\310\77\304\343\240\371\372\364\376" \ + "\377\377\212\377\377\377\10\376\377\377\377\376\377\315\345\251\223\311" \ + "M\214\306>\216\306\77\214\305B\214\306<\202\214\306>\15\215\306A\214" \ + "\305@\214\306>\215\307\77\214\305@\214\306<\214\305@\215\307\77\213\304" \ + "A\263\330{\377\377\377\376\376\376\377\377\375\220\377\377\377\7\370" \ + "\373\364\232\315V\216\306=\212\311=\214\306>\216\306A\213\307A\202\214" \ + "\305@\202\214\306>\202\214\305@\10\215\307\77\215\305>\215\304D\304\341" \ + "\237\376\377\377\377\376\377\376\376\377\377\377\375\202\377\376\377" \ + "\24\376\377\377\377\377\373\350\365\333\215\305>\214\306<\214\306>\212" \ + "\306@\215\307\77\213\305=\215\305@\215\307\77\214\306>\215\305>\215\306" \ + "A\211\305A\215\305@\214\305B\213\310=\262\327z\374\377\377\202\377\377" \ + "\377\2\377\377\375\373\377\376\225\377\377\377\1\221\221\223\203::<\6" \ + ";;=99;;;=::<``b\362\362\362\246\377\377\377\2\265\265\265:::\202::<\1" \ + ";;=\203::<\1\346\346\350\216\377\377\377\1\316\316\316\205::<\1kkm\216" \ + "\377\377\377\6\363\363\363__a::<;;=::<;;=\202::<\1\204\204\204\204\377" \ + "\377\377\1\376\376\376\221\377\377\377\1\234\234\234\204::<\3;;=::<\347" \ + "\347\347\202\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376" \ + "\225\377\377\377\3\376\376\376\377\377\377\265\265\265\202::<\202;;=" \ + "\3::<;;=\316\316\316\216\377\377\377\1\234\234\236\205::<\1\234\234\234" \ + "\240\377\377\377\2\204\204\204:::\206::<\1\301\301\303\217\377\377\377" \ + "\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306" \ + ">\214\305@\205\214\306>\7\214\305@\216\306A\215\307=\213\304\77\213\307" \ + "A\242\321a\345\356\317\230\342\362\316\7\341\361\315\342\361\322\342" \ + "\361\320\343\361\315\345\360\322\365\373\357\376\377\377\211\377\377" \ + "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \ + ">\1\214\305@\211\214\306>\2\214\305@\343\361\316\216\377\377\377\7\376" \ + "\377\375\377\377\375\377\377\377\377\376\377\371\374\365\242\322d\215" \ + "\306A\221\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\10" \ + "\377\377\375\377\377\377\377\377\373\312\346\253\215\307=\212\307>\214" \ + "\305B\216\306=\206\214\306>\202\214\305@\10\214\306>\212\307>\216\306" \ + "\77\214\306>\212\307>\233\316W\306\340\237\361\370\346\210\377\377\377" \ + "\12\361\370\350\314\345\253\233\314W\214\306>\213\310\77\215\305<\214" \ + "\305@\212\307<\215\306A\214\305@\203\214\306>\202\214\305@\202\214\306" \ + ">\4\216\306A\212\306@\213\310\77\333\356\301\202\377\377\377\1\377\377" \ + "\375\220\377\377\377\26\270\332\204\215\306A\212\306B\214\306>\213\307" \ + "A\215\305@\214\306<\214\306>\215\306A\214\306<\215\307\77\214\305B\215" \ + "\307\77\214\307;\215\304D\241\323b\377\377\375\376\377\377\377\377\377" \ + "\377\377\373\377\377\377\376\377\377\202\377\377\375\16\377\377\377\376" \ + "\377\377\277\337\224\214\305@\215\306A\214\306>\215\305>\212\310\77\214" \ + "\305@\215\307\77\212\307>\214\305B\216\306=\215\306A\202\214\306<\6\214" \ + "\306>\213\307C\331\356\305\377\376\377\377\377\373\376\376\376\227\377" \ + "\377\377\3__a::<;:\77\205::<\2__a\363\363\363\203\377\377\377\1\376\376" \ + "\376\213\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377" \ + "\377\377\376\376\376\213\377\377\377\1\376\376\376\202\377\377\377\1" \ + "\265\265\267\205::<\3;;=:::\234\234\234\217\377\377\377\1\316\316\316" \ + "\205::<\1kkm\217\377\377\377\4\332\332\332GGI::<;;=\204::<\1\250\250" \ + "\252\225\377\377\377\1FFH\205::<\1\204\204\204\242\377\377\377\1TTV\205" \ + "::<\4lln\376\376\376\377\377\377\376\376\376\203\377\377\377\1\376\376" \ + "\376\207\377\377\377\1\234\234\236\205::<\1\235\235\237\221\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\202\376" \ + "\376\376\205\377\377\377\3\363\363\365\204\204\206;;=\204::<\3;;=:::" \ + "xxx\220\377\377\377\1\234\234\234\203::<\3;;=::<\234\234\234\204\377" \ + "\377\377\1\376\376\376\261\377\377\377\3\214\305@\214\306>\214\305@\250" \ + "\214\306>\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250" \ + "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306" \ + ">\2\214\305@\343\361\316\216\377\377\377\11\375\376\377\377\376\377\377" \ + "\377\375\376\377\377\377\376\377\351\365\335\223\311M\212\307<\214\306" \ + ">\202\216\306A\4\212\307<\215\306A\215\305>\215\307\77\211\214\306>\3" \ + "\215\305>\214\306>\305\342\240\214\377\377\377\20\377\376\377\377\377" \ + "\375\377\376\377\365\374\364\223\312J\217\304>\215\307\77\212\307;\215" \ + "\306A\214\305B\214\305@\215\307\77\214\306<\213\310\77\214\305@\215\305" \ + ">\210\214\306>\10\234\315Z\257\327~\304\343\235\306\340\237\307\341\240" \ + "\304\343\237\257\327\177\241\321a\210\214\306>\20\217\304>\215\306A\212" \ + "\306@\212\307>\213\305;\216\306A\213\305=\215\306C\211\310<\216\306A" \ + "\214\306>\234\314V\377\377\377\375\377\374\376\377\377\377\376\377\211" \ + "\377\377\377\7\377\376\377\376\377\375\376\377\377\376\377\375\377\376" \ + "\377\377\377\377\333\355\303\210\214\306>\10\215\306A\214\305@\216\306" \ + "=\214\306>\215\307\77\214\305@\215\307\77\352\364\334\211\377\377\377" \ + "\6\377\376\377\367\375\363\232\315V\215\307\77\214\306>\214\305@\212" \ + "\214\306>\6\212\307>\223\311M\366\373\364\377\376\377\377\377\377\376" \ + "\377\373\221\377\377\377\1\376\376\376\204\377\377\377\2\346\346\346" \ + "FFH\203::<\1""99;\203::<\2__a\332\332\332\211\377\377\377\1\376\376\376" \ + "\203\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\206\377" \ + "\377\377\1\376\376\376\207\377\377\377\1\265\265\267\202::<\1;;=\204" \ + "::<\2```\376\376\376\217\377\377\377\1\316\316\316\205::<\1kkm\216\377" \ + "\377\377\4\376\376\376\377\377\377\301\301\301;;=\205::<\2;;=\331\331" \ + "\331\202\377\377\377\3\376\376\376\377\377\377\376\376\376\216\377\377" \ + "\377\1\265\265\267\205::<\3;;=\332\332\332\376\376\376\241\377\377\377" \ + "\1\266\266\270\205::<\2""99;\316\316\320\215\377\377\377\1\234\234\236" \ + "\203::<\5;;=::<\234\234\234\377\377\377\376\376\376\220\377\377\377\1" \ + "\376\376\376\206\377\377\377\1\376\376\376\203\377\377\377\2\346\346" \ + "\346``b\202::<\2""99;;;=\203::<\4FFF\363\363\363\377\377\377\376\376" \ + "\376\216\377\377\377\1\234\234\234\204::<\3;;=\234\234\234\376\376\376" \ + "\265\377\377\377\3\214\305@\214\306>\214\305@\250\214\306>\2\215\307" \ + "\77\342\362\316\212\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \ + "\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \ + "\316\215\377\377\377\16\377\376\377\376\377\377\377\376\377\377\377\377" \ + "\376\377\377\377\376\377\375\377\374\323\353\267\215\305<\215\306C\215" \ + "\305<\213\306:\213\310\77\212\306@\202\214\305@\211\214\306>\3\215\305" \ + ">\214\306>\305\342\240\215\377\377\377\4\376\377\377\377\377\375\377" \ + "\376\377\305\342\242\202\214\305@\5\216\306A\214\306>\215\307=\215\307" \ + "\77\213\304A\202\214\305@\2\214\306>\212\306@\210\214\306>\7\214\306" \ + "<\215\307=\215\307\77\213\305=\214\306>\215\307\77\213\305=\211\214\306" \ + ">\11\215\306A\215\305>\212\307;\213\304\77\215\306A\211\306=\215\306" \ + "A\212\307<\216\306A\202\215\307\77\4\343\361\320\376\377\375\377\377" \ + "\375\376\376\377\212\377\377\377\1\377\376\377\202\377\377\377\4\377" \ + "\376\377\376\377\377\367\375\363\225\311J\210\214\306>\10\215\307=\213" \ + "\310\77\214\305@\216\306\77\214\305@\212\307>\307\341\240\376\377\375" \ + "\210\377\377\377\5\377\376\377\374\377\375\377\376\377\343\361\320\212" \ + "\306@\202\214\306>\1\213\310\77\210\214\306>\10\215\306A\215\305>\214" \ + "\305@\260\327z\377\376\374\374\377\377\377\377\377\377\376\377\226\377" \ + "\377\377\1\332\332\332\210::<\2GGI\250\250\250\223\377\377\377\3\376" \ + "\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376\376\202\377" \ + "\377\377\1\376\376\376\204\377\377\377\2\250\250\252;;=\204::<\202;;" \ + "=\2EEG\331\331\331\220\377\377\377\1\316\316\316\205::<\1kkm\221\377" \ + "\377\377\5\222\222\224::<;;=::<;;=\202::<\5SSU\364\364\364\376\376\376" \ + "\377\377\377\376\376\376\216\377\377\377\2\376\376\376TTV\203::<\4;;" \ + "=99;lln\376\376\376\243\377\377\377\1TTV\204::<\5;;=\204\204\206\376" \ + "\376\376\377\377\377\376\376\376\212\377\377\377\1\234\234\236\202::" \ + "<\1;;=\202::<\1\234\234\234\215\377\377\377\1\376\376\376\202\377\377" \ + "\377\1\376\376\376\212\377\377\377\6\376\376\376\250\250\252FFH99;::" \ + "<;;=\205::<\1\316\316\316\221\377\377\377\1\234\234\234\203::<\3;;=:" \ + ":<\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305@\250\214\306" \ + ">\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325p\216" \ + "\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214" \ + "\305@\343\361\316\215\377\377\377\3\377\376\377\376\377\375\376\377\377" \ + "\202\377\377\377\13\377\377\375\377\376\377\376\376\374\271\332\211\215" \ + "\306A\211\306;\216\306A\212\307>\213\307A\215\306A\212\307>\211\214\306" \ + ">\3\215\305>\214\306>\305\342\240\214\377\377\377\20\376\377\375\377" \ + "\377\377\377\377\375\377\377\377\371\370\364\233\316U\214\306>\214\305" \ + "@\215\306A\214\306>\214\305@\215\307=\214\306>\215\305@\215\304B\213" \ + "\310=\210\214\306>\3\215\305@\214\306>\213\305=\202\213\310\77\3\214" \ + "\306>\215\307\77\215\305@\210\214\306>\20\212\306@\212\307;\216\306\77" \ + "\215\307\77\212\306@\214\306<\215\305>\215\307\77\220\305\77\211\307" \ + ">\263\330{\377\376\377\377\377\375\376\377\377\377\377\377\376\376\376" \ + "\211\377\377\377\7\377\377\373\377\377\377\377\375\376\377\377\377\377" \ + "\377\375\257\330|\213\310\77\211\214\306>\6\215\306C\211\306=\214\305" \ + "@\214\306>\242\322e\377\377\375\212\377\377\377\7\376\377\377\377\377" \ + "\375\377\375\376\277\337\224\216\307B\212\307>\214\305@\210\214\306>" \ + "\2\214\305@\216\306\77\202\212\307>\4\332\360\302\376\376\374\376\376" \ + "\376\377\376\377\227\377\377\377\1\266\266\266\202::<\1;;=\202::<\2;" \ + ";=::<\202;;=\2kkm\346\346\350\202\377\377\377\1\376\376\376\207\377\377" \ + "\377\1\376\376\376\203\377\377\377\5\376\376\376\377\377\377\376\376" \ + "\376\377\377\377\376\376\376\202\377\377\377\3\376\376\376\377\377\377" \ + "\376\376\376\204\377\377\377\2\364\364\364yy{\203::<\2;;=99;\203::<\3" \ + "\265\265\267\377\377\377\376\376\376\217\377\377\377\1\316\316\316\205" \ + "::<\1kkm\222\377\377\377\1kkm\203::<\1;;=\202::<\5kkm\377\377\377\376" \ + "\376\376\377\377\377\376\376\376\212\377\377\377\5\376\376\376\377\377" \ + "\377\376\376\376\265\265\267;;=\204::<\2;;=\315\315\315\244\377\377\377" \ + "\11\234\234\234::<99;;;=::<;;=::<\347\347\347\376\376\376\213\377\377" \ + "\377\1\234\234\236\204::<\2;;=\233\233\233\217\377\377\377\1\376\376" \ + "\376\206\377\377\377\6\376\376\376\377\377\377\376\376\376\377\377\377" \ + "\265\265\265TTT\202::<\202;;=\203::<\3;;=::<\266\266\270\202\377\377" \ + "\377\1\376\376\376\217\377\377\377\1\234\234\234\204::<\4;;=\235\235" \ + "\237\377\377\377\376\376\376\224\377\377\377\1\376\376\376\203\377\377" \ + "\377\1\376\376\376\233\377\377\377\3\214\305@\214\306>\214\305@\250\214" \ + "\306>\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325" \ + "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>" \ + "\2\214\305@\343\361\316\215\377\377\377\202\377\377\375\16\377\377\377" \ + "\377\377\375\377\377\377\376\377\375\376\376\374\377\376\377\375\377" \ + "\376\241\322_\215\306A\212\306B\215\305>\215\307\77\214\306<\214\305" \ + "B\211\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\1\377" \ + "\376\377\202\377\377\375\15\376\377\377\377\375\376\340\361\317\214\306" \ + ">\212\307>\214\306>\215\307\77\214\306>\212\307<\215\307\77\215\305>" \ + "\216\306=\213\305=\210\214\306>\1\212\307>\202\214\305@\202\214\306>" \ + "\3\214\305@\215\306A\212\307>\210\214\306>\20\212\307>\213\304\77\214" \ + "\306>\211\310<\214\306>\216\306A\212\306@\215\305@\214\306>\223\313N" \ + "\367\372\363\376\377\377\377\377\377\377\376\377\376\377\373\377\376" \ + "\377\212\377\377\377\202\376\377\377\3\377\375\376\324\353\265\215\306" \ + "A\211\214\306>\7\215\305>\213\305=\215\307\77\215\306A\212\307>\351\363" \ + "\333\377\377\375\211\377\377\377\10\377\376\377\375\377\376\376\377\377" \ + "\377\376\377\370\373\362\233\314W\215\307\77\215\305<\210\214\306>\1" \ + "\215\307\77\202\214\306>\4\214\306<\225\310O\360\366\350\377\376\377" \ + "\221\377\377\377\3\376\376\376\377\377\377\376\376\376\205\377\377\377" \ + "\1\266\266\266\202::<\4;;=99;::<;;=\202::<\4;;=::<\204\204\206\346\346" \ + "\350\207\377\377\377\1\376\376\376\206\377\377\377\202\376\376\376\202" \ + "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377\377" \ + "\377\3\251\251\251FFF99;\202::<\1""99;\202::<\5;;=::<\234\234\236\377" \ + "\377\377\376\376\376\220\377\377\377\1\316\316\316\205::<\1kkm\222\377" \ + "\377\377\11\363\363\363GGI99;::<99;;;=::<;;=\234\234\234\214\377\377" \ + "\377\1\376\376\376\203\377\377\377\1SSU\202::<\1;;=\202::<\1kkm\245\377" \ + "\377\377\5\362\362\362GGI;;=::<;;=\202::<\1\204\204\206\206\377\377\377" \ + "\1\376\376\376\205\377\377\377\1\234\234\236\203::<\3""99;::<\234\234" \ + "\234\223\377\377\377\1\376\376\376\203\377\377\377\3\331\331\331\222" \ + "\222\222SSU\203::<\2;;=::<\202;;=\4::<;;=::<\265\265\267\202\377\377" \ + "\377\1\376\376\376\203\377\377\377\1\376\376\376\214\377\377\377\1\234" \ + "\234\234\205::<\1\234\234\236\203\377\377\377\1\376\376\376\223\377\377" \ + "\377\1\376\376\376\236\377\377\377\3\214\305@\214\306>\214\305@\250\214" \ + "\306>\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325" \ + "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>" \ + "\2\214\305@\343\361\316\216\377\377\377\17\377\376\377\377\377\377\376" \ + "\376\376\377\376\377\377\377\375\376\377\377\375\377\376\377\377\377" \ + "\363\367\350\222\312K\214\305@\213\310\77\214\304\77\215\307\77\216\306" \ + "A\211\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\14\377" \ + "\376\377\376\377\375\376\377\377\377\376\377\376\377\377\376\377\375" \ + "\307\342\237\214\305@\214\306<\215\304D\214\306>\214\305D\202\212\307" \ + "<\2\212\307>\213\307A\210\214\306>\3\215\307\77\214\306>\215\307\77\202" \ + "\214\305@\213\214\306>\12\213\305;\215\306A\212\306@\214\306>\213\307" \ + "C\212\307>\215\305>\212\307>\215\305>\333\356\301\202\377\377\377\3\377" \ + "\377\375\377\377\377\377\376\377\211\377\377\377\10\376\377\375\377\377" \ + "\375\376\377\375\374\377\375\362\371\347\225\311M\215\307\77\215\305" \ + "<\210\214\306>\2\214\305@\216\306=\202\212\306@\2\305\342\237\377\375" \ + "\376\212\377\377\377\1\376\376\374\203\377\377\377\4\376\376\376\337" \ + "\363\316\215\306C\215\305<\211\214\306>\1\215\307\77\202\214\305@\4\214" \ + "\306<\253\324n\375\377\374\377\377\375\224\377\377\377\1\376\376\376" \ + "\204\377\377\377\2\301\301\301FFH\202::<\2;;=99;\202;;=\2::<;;=\202:" \ + ":<\2\204\204\206\316\316\320\207\377\377\377\1\376\376\376\203\377\377" \ + "\377\1\376\376\376\206\377\377\377\6\376\376\376\377\377\377\364\364" \ + "\364\265\265\267SSU::<\202;;=\202::<\5;;=::<;;=::<\204\204\204\223\377" \ + "\377\377\1\316\316\316\205::<\1kkm\223\377\377\377\11\315\315\315;;=" \ + "::<;;=::<;;=::<99;\302\302\302\216\377\377\377\5\301\301\303::<;;=::" \ + "<;;=\202::<\2\316\316\316\377\377\377\202\376\376\376\241\377\377\377" \ + "\14\376\376\376\377\377\377\234\234\234;;=::<;;=::<;;=::<\347\347\351" \ + "\377\377\377\376\376\376\211\377\377\377\1\234\234\236\203::<\3;;=::" \ + "<\234\234\236\216\377\377\377\202\376\376\376\1\377\377\377\202\316\316" \ + "\316\6\250\250\250\234\234\234jjjFFF;;=99;\202;;=\2::<;;=\202::<\5<<" \ + ">99;;;=::<\265\265\267\204\377\377\377\1\376\376\376\217\377\377\377" \ + "\1\234\234\234\204::<\2;;=\234\234\236\202\377\377\377\1\376\376\376" \ + "\223\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\234\377" \ + "\377\377\3\214\305@\214\306>\214\305@\250\214\306>\2\215\307\77\342\362" \ + "\316\212\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \ + "\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\215" \ + "\377\377\377\202\377\376\377\16\377\377\375\376\377\377\377\377\377\377" \ + "\377\375\377\376\377\376\376\376\377\376\377\377\377\377\333\354\302" \ + "\212\307>\213\310\77\214\306<\213\310=\215\305@\211\214\306>\3\215\305" \ + ">\214\306>\305\342\240\214\377\377\377\1\377\376\377\202\376\377\377" \ + "\202\377\377\375\13\376\377\377\377\375\376\271\333\205\215\305>\214" \ + "\306>\212\307>\214\306>\215\306A\214\306>\212\306@\214\305@\210\214\306" \ + ">\3\214\305@\215\307\77\214\306>\202\212\307>\3\214\306>\215\307\77\215" \ + "\306A\210\214\306>\4\216\306A\211\306=\214\306<\216\306A\202\212\307" \ + ">\202\215\306A\10\322\352\270\377\377\375\376\376\374\377\377\377\376" \ + "\377\377\377\376\377\377\377\375\376\377\377\210\377\377\377\10\377\377" \ + "\375\377\377\377\377\376\377\374\376\373\250\325n\216\306\77\212\307" \ + ">\214\305B\210\214\306>\202\212\307>\6\214\305@\242\322d\376\376\374" \ + "\377\377\375\375\377\376\377\376\377\210\377\377\377\10\376\377\377\377" \ + "\377\375\377\375\376\377\377\375\375\376\377\376\377\375\270\333\207" \ + "\211\310<\210\214\306>\10\214\304=\216\307B\214\306>\212\307>\216\306" \ + "A\215\307\77\313\350\250\376\376\377\221\377\377\377\1\376\376\376\203" \ + "\377\377\377\1\376\376\376\204\377\377\377\7\332\332\332RRT;;=::<;;=" \ + "::<;;=\202::<\1;;=\203::<\3RRT\221\221\223\317\317\321\214\377\377\377" \ + "\11\376\376\376\377\377\377\364\364\364\301\301\301\204\204\206EEG;;" \ + "=99;;;=\204::<\1""99;\202::<\1\251\251\251\207\377\377\377\1\376\376" \ + "\376\214\377\377\377\1\316\316\316\205::<\1kkm\224\377\377\377\1\247" \ + "\247\247\203::<\5;;=::<;;=FFH\345\345\345\214\377\377\377\2\376\376\376" \ + "kkm\205::<\1SSU\202\377\377\377\1\376\376\376\244\377\377\377\2\363\363" \ + "\363FFH\204::<\2;;=\221\221\223\213\377\377\377\1\234\234\236\204::<" \ + "\4;;=SSUkkmlln\213kkm\5;;=::<;;=::<;;=\204::<\2;;=99;\202;;=\2::<;;=" \ + "\202::<\7;;=99;::\214\305@\250\214\306>\2\215" \ + "\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325p\216\377\377" \ + "\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343" \ + "\361\316\215\377\377\377\1\377\376\377\202\377\377\375\202\377\377\377" \ + "\202\377\376\377\11\377\377\375\377\377\377\376\377\377\377\376\377\276" \ + "\336\223\214\306<\213\310\77\214\304=\215\306A\211\214\306>\3\215\305" \ + ">\214\306>\305\342\240\214\377\377\377\20\377\377\375\376\377\375\376" \ + "\376\376\377\376\377\375\377\376\377\375\377\376\377\377\376\377\375" \ + "\270\333\207\217\305<\212\307>\214\305@\216\306\77\213\305=\214\305@" \ + "\216\306=\211\214\306>\2\215\306A\215\305@\202\216\306\77\3\215\305@" \ + "\214\305@\215\307\77\210\214\306>\13\213\305=\215\306A\215\305>\212\306" \ + "@\215\305>\215\306A\220\305A\323\352\266\376\377\375\377\376\377\377" \ + "\377\375\202\377\377\377\3\376\377\377\377\375\377\376\377\375\213\377" \ + "\377\377\5\316\347\256\212\307>\213\305;\216\306A\212\307<\210\214\306" \ + ">\10\212\307>\216\306\77\215\305>\350\364\336\377\376\377\376\376\374" \ + "\377\377\377\377\376\377\210\377\377\377\1\377\376\377\202\377\377\377" \ + "\5\377\376\377\376\377\375\377\376\377\370\373\360\225\311K\210\214\306" \ + ">\10\216\306=\214\305@\215\310<\212\307>\214\306>\214\305@\223\312J\356" \ + "\371\350\231\377\377\377\4\376\376\376\377\377\377\363\363\363xxz\202" \ + "::<\1""99;\202::<\1;;=\203::<\202;;=\203::<\4__a\205\205\205\234\234" \ + "\234\250\250\250\205\316\316\316\4\250\250\250\234\234\234xxx___\202" \ + "::<\3""99;;;=99;\203::<\1;;=\203::<\2FFH\265\265\265\205\377\377\377" \ + "\1\376\376\376\217\377\377\377\1\316\316\316\205::<\1kkm\225\377\377" \ + "\377\3xxx::<;;=\204::<\1```\213\377\377\377\4\376\376\376\317\317\317" \ + "::<;;=\204::<\1\266\266\270\203\377\377\377\1\376\376\376\241\377\377" \ + "\377\1\377\377\375\202\377\377\377\1\204\204\206\202::<\1;;=\202::<\2" \ + "GGI\363\363\363\212\377\377\377\1\234\234\236\203::<\1;;=\202::<\1;;" \ + "=\221::<\1;;=\207::<\1;;=\202::<\1;;=\202::<\2``b\346\346\350\210\377" \ + "\377\377\1\376\376\376\215\377\377\377\1\234\234\234\207::<\3;;=::<;" \ + ";=\221::<\1;;=\203::<\1;;=\202::<\1\316\316\320\231\377\377\377\3\214" \ + "\305@\214\306>\214\305@\250\214\306>\2\215\307\77\342\362\316\212\377" \ + "\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214" \ + "\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\215\377\377\377" \ + "\7\377\377\375\376\377\375\377\377\377\377\376\377\376\376\374\376\377" \ + "\377\377\377\377\202\376\377\377\202\377\377\375\4\377\377\377\242\320" \ + "d\211\306=\215\305@\212\214\306>\3\215\305>\214\306>\305\342\240\214" \ + "\377\377\377\6\377\376\377\377\377\377\377\377\375\377\375\377\376\377" \ + "\372\375\376\377\202\377\377\377\10\376\377\377\304\343\240\215\305@" \ + "\214\306>\216\306A\215\307\77\212\307>\215\307\77\212\214\306>\3\215" \ + "\307\77\214\306>\214\305@\202\215\307\77\211\214\306>\12\215\306C\212" \ + "\307<\215\307\77\215\305@\213\310\77\215\306A\323\352\266\377\376\377" \ + "\377\377\377\376\377\377\204\377\377\377\2\377\377\375\377\376\377\210" \ + "\377\377\377\10\376\377\377\377\376\377\361\370\346\225\311K\212\307" \ + ">\215\306A\214\305@\215\305>\210\214\306>\3\214\305@\214\306>\307\341" \ + "\240\203\376\377\377\2\377\377\375\376\377\377\210\377\377\377\5\376" \ + "\377\377\377\376\372\376\377\375\376\376\376\377\377\377\202\377\376" \ + "\377\1\334\355\301\210\214\306>\10\215\306A\213\310\77\215\305@\214\306" \ + ">\214\306<\215\306A\214\306>\254\322o\232\377\377\377\6\376\376\376\377" \ + "\377\377\376\376\376\302\302\302FFH;;=\206::<\1;;=\202::<\202;;=\203" \ + "::<\1;;=\204::<\3;;=::<;;=\202::<\1;;=\202::<\1;;=\203::<\2;;=::<\202" \ + ";;=\2__a\332\332\332\226\377\377\377\3\316\316\316::<;;=\203::<\1kkm" \ + "\222\377\377\377\7\376\376\376\377\377\377\376\376\376\363\363\363__" \ + "a::<;;=\204::<\1\203\203\203\202\377\377\377\2\376\376\376\377\377\377" \ + "\202\376\376\376\205\377\377\377\1kkm\202::<\1;;=\202::<\5TTV\377\377" \ + "\377\376\376\376\377\377\377\376\376\376\245\377\377\377\2\347\347\347" \ + "99;\202::<\1;;=\202::<\1\235\235\237\206\377\377\377\1\376\376\376\202" \ + "\377\377\377\2\376\376\376\234\234\234\224::<\1;;=\202::<\3""99;::<;" \ + ";=\204::<\1;;=\204::<\3;;=GGI\250\250\252\230\377\377\377\2\234\234\236" \ + ";;=\232::<\10;;=99;;;=::<;;=::<:::\316\316\316\230\377\377\377\10\377" \ + "\376\377\212\306@\214\305@\213\310=\214\306<\215\306A\214\307;\215\306" \ + "A\240\214\306>\10\214\305@\212\307<\214\306<\214\305@\212\306@\342\360" \ + "\315\376\377\377\377\376\377\210\377\377\377\212\214\306>\4\216\306\77" \ + "\212\306B\214\306>\250\325n\202\377\376\377\210\377\377\377\1\377\376" \ + "\377\202\377\377\377\5\376\377\375\342\362\316\214\305B\215\305@\214" \ + "\306<\210\214\306>\202\212\307>\5\343\361\320\377\377\377\377\377\375" \ + "\376\377\377\377\376\377\223\377\377\377\6\377\376\377\377\377\375\371" \ + "\372\364\223\312J\212\306@\215\305@\210\214\306>\10\214\305@\215\305" \ + ">\212\307>\304\343\240\377\377\375\377\377\377\377\377\375\377\376\377" \ + "\220\377\377\377\11\376\377\377\377\377\377\333\355\303\226\310K\213" \ + "\310\77\214\306>\215\305@\215\306A\214\305@\203\214\306>\7\215\305>\215" \ + "\305@\214\305@\212\307>\215\305>\215\307\77\215\306A\202\214\306<\5\215" \ + "\306A\213\305=\215\305@\215\307\77\213\305;\202\215\305@\13\215\307\77" \ + "\213\310\77\214\305@\215\307\77\212\307>\215\305>\214\306>\212\306@\235" \ + "\315U\347\365\334\377\376\377\220\377\377\377\15\376\376\376\377\377" \ + "\375\377\377\377\244\317c\213\307A\214\306<\213\307A\215\305>\215\305" \ + "<\215\307\77\214\306<\215\307\77\214\305@\202\215\307\77\12\214\305@" \ + "\215\306A\215\305@\234\315W\367\375\363\377\376\377\376\377\377\377\377" \ + "\375\376\377\377\377\376\377\220\377\377\377\10\260\331{\215\307=\212" \ + "\307>\213\307A\214\306>\215\305@\215\307\77\215\305>\210\214\306>\3\314" \ + "\345\253\377\377\377\376\377\375\202\377\376\377\2\377\377\377\376\377" \ + "\377\222\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377" \ + "\377\3\364\364\364\220\220\220;;=\211::<\2;;=::<\202;;=\2::<;;=\202:" \ + ":<\4;;=::<;;=99;\203::<\2;;=99;\206::<\2GGI\247\247\251\203\377\377\377" \ + "\1\376\376\376\222\377\377\377\6\376\376\376\377\377\377\316\316\316" \ + ";;=99;;;=\202::<\2lln\376\376\376\202\377\377\377\1\376\376\376\221\377" \ + "\377\377\4\376\376\376\333\333\333FFH;;=\202::<\1;;=\202::<\1\265\265" \ + "\265\202\377\377\377\1\376\376\376\202\377\377\377\5\376\376\376\377" \ + "\377\377\376\376\376\377\377\377\316\316\320\202::<\2;;=99;\202;;=\1" \ + "\264\264\266\202\377\377\377\1\376\376\376\244\377\377\377\1\376\376" \ + "\376\202\377\377\377\1\205\205\207\204::<\3;;=FFH\363\363\363\206\377" \ + "\377\377\1\376\376\376\202\377\377\377\3\233\233\233::<;;=\220::<\3""9" \ + "9;;;=99;\202::<\1;;=\203::<\1;;=\204::<\7;;=::\215\307\77" \ + "\214\306>\215\306A\240\214\306>\7\214\306<\214\306>\216\306\77\214\306" \ + ">\214\305@\343\361\320\377\377\375\211\377\377\377\210\214\306>\10\213" \ + "\307A\212\306@\215\305@\212\307<\215\307\77\247\324o\375\377\376\376" \ + "\377\377\211\377\377\377\7\376\377\375\377\377\377\377\377\375\342\360" \ + "\315\214\305@\213\305=\215\307\77\210\214\306>\10\215\305>\215\307\77" \ + "\343\361\316\376\376\376\377\376\377\376\377\377\377\377\375\376\377" \ + "\372\220\377\377\377\10\376\377\377\377\376\377\377\377\375\377\376\374" \ + "\376\377\375\343\362\321\212\307>\214\307;\210\214\306>\4\215\307=\215" \ + "\304B\213\307A\305\342\240\203\377\377\377\1\376\377\377\222\377\377" \ + "\377\21\377\376\377\367\374\365\267\332\206\215\306A\212\306@\214\306" \ + "<\214\306>\215\306A\215\307\77\214\306>\214\305@\212\306B\212\306@\212" \ + "\307<\215\307\77\214\306>\214\305@\202\215\305@\5\214\305@\214\306>\214" \ + "\305@\212\307>\215\306A\202\214\305@\11\214\307;\214\306>\215\306A\214" \ + "\305@\215\305>\212\306@\222\311I\306\343\240\366\373\364\224\377\377" \ + "\377\6\303\342\237\217\304@\214\306<\214\306>\215\306C\212\306B\204\214" \ + "\305@\1\215\306A\202\214\305@\11\215\306A\214\306<\214\306>\341\361\314" \ + "\377\377\377\376\377\375\377\377\377\377\375\377\377\377\375\221\377" \ + "\377\377\10\370\373\364\224\307N\215\305@\215\305>\212\307<\215\306A" \ + "\212\307<\215\306A\210\214\306>\10\215\307=\346\364\332\376\377\375\376" \ + "\377\373\377\377\377\376\376\377\377\376\377\377\377\375\230\377\377" \ + "\377\5\346\346\350\204\204\206GGI::<;;=\202::<\5;;=::<;;=::<;;=\202:" \ + ":<\3;;=::<;;=\202::<\5;;=99;;;=::<;;=\207::<\3FFH\234\234\234\363\363" \ + "\363\203\377\377\377\1\376\376\376\222\377\377\377\1\376\376\376\202" \ + "\377\377\377\4\316\316\316::<;;=99;\202;;=\1kkm\202\377\377\377\1\376" \ + "\376\376\220\377\377\377\1\376\376\376\202\377\377\377\5\376\376\376" \ + "\266\266\26699;;;=::<\202;;=\3::\215\307\77\212\307>\216\306\77\241\214\306" \ + ">\1\215\306C\202\215\305@\5\212\306@\215\307=\343\361\320\377\377\377" \ + "\377\376\377\210\377\377\377\210\214\306>\10\215\305<\215\307\77\216" \ + "\306\77\214\306>\216\305C\252\324r\377\377\377\377\377\373\211\377\377" \ + "\377\7\375\377\376\377\377\377\377\375\376\343\361\316\215\307=\212\307" \ + ">\215\305>\210\214\306>\10\214\305@\215\305<\342\362\316\377\377\375" \ + "\377\376\377\375\377\374\376\376\377\376\377\377\222\377\377\377\1\375" \ + "\377\372\202\377\377\377\3\377\376\377\304\341\237\215\307\77\210\214" \ + "\306>\10\212\307;\215\307\77\213\305=\305\342\240\377\377\377\377\376" \ + "\374\377\377\375\376\377\377\221\377\377\377\22\377\376\377\377\377\375" \ + "\376\377\377\377\375\376\361\367\351\270\334\204\214\306>\215\307\77" \ + "\214\305@\212\306@\213\307A\212\306@\213\310\77\214\306>\215\304B\214" \ + "\306>\212\307<\214\306>\202\216\306A\6\214\306>\213\310\77\214\305@\215" \ + "\305<\215\305>\215\307=\202\213\310\77\10\215\306A\214\306>\215\306A" \ + "\222\311I\300\336\226\361\370\346\376\376\376\377\377\377\202\377\376" \ + "\377\1\376\377\373\217\377\377\377\10\377\377\375\347\365\333\214\307" \ + ";\211\305A\213\304\77\215\307\77\215\305<\213\310\77\202\214\306>\1\215" \ + "\307\77\203\214\306>\4\215\307\77\214\306>\215\306A\275\337\223\202\377" \ + "\377\377\5\377\376\377\377\377\377\376\377\375\377\376\377\376\377\377" \ + "\220\377\377\377\10\375\377\376\331\357\301\215\307\77\215\305>\216\305" \ + "C\211\306=\220\305A\211\307@\210\214\306>\10\214\305@\246\321e\377\377" \ + "\377\377\376\377\376\377\377\377\377\375\376\377\377\377\376\377\227" \ + "\377\377\377\1\376\376\376\202\377\377\377\3\363\363\363\266\266\270" \ + "__a\207::<\202;;=\203::<\2;;=99;\202;;=\2""99;::<\202;;=\1::<\203;;=" \ + "\3^^^\250\250\250\363\363\363\203\377\377\377\1\376\376\376\202\377\377" \ + "\377\1\376\376\376\224\377\377\377\4\316\316\316999::<;;=\202::<\1ll" \ + "l\205\377\377\377\1\376\376\376\217\377\377\377\6\376\376\376\377\377" \ + "\377\376\376\376\204\204\204::<;;=\203::<\3:::TTT\363\363\363\206\377" \ + "\377\377\10\347\347\347;;;99;::<;;=::<:::\234\234\236\253\377\377\377" \ + "\3\376\376\376lln;;=\202::<\3;;=999SSS\202\377\377\377\1\376\376\376" \ + "\203\377\377\377\4\376\376\376\377\377\377\376\376\376\234\234\234\223" \ + "::<\1""99;\202::<\1;;=\203::<\5kkmxxz\235\235\237\301\301\301\346\346" \ + "\346\207\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\221" \ + "\377\377\377\1\376\376\376\202\377\377\377\3\235\235\235::<;;=\232::" \ + "<\2;;=99;\202::<\3;;=::<\316\316\316\230\377\377\377\10\373\377\376\216" \ + "\306A\214\306<\213\304A\212\306@\214\305@\214\304\77\215\307\77\240\214" \ + "\306>\6\214\306<\215\306A\215\305@\216\310@\217\304@\341\361\314\212" \ + "\377\377\377\210\214\306>\7\215\307\77\213\310\77\213\305=\215\307\77" \ + "\214\304\77\253\323r\374\377\373\211\377\377\377\1\377\376\377\203\377" \ + "\377\377\3\342\362\315\215\305@\215\307=\211\214\306>\10\214\306<\215" \ + "\304B\341\363\313\374\377\375\376\376\377\377\377\377\377\375\376\377" \ + "\377\375\221\377\377\377\7\376\377\375\376\376\377\377\377\377\375\377" \ + "\374\377\377\377\377\377\375\253\323p\210\214\306>\5\215\307\77\215\305" \ + ">\217\304@\305\342\237\376\377\375\202\377\377\377\1\377\377\375\220" \ + "\377\377\377\1\376\377\377\202\377\376\377\202\376\377\375\202\377\377" \ + "\377\5\360\370\351\311\347\247\245\320e\215\305>\212\307>\202\214\306" \ + ">\5\215\306A\212\307>\215\305@\214\306>\214\306<\202\214\306>\2\214\306" \ + "<\214\306>\202\216\306A\14\214\306>\215\306A\215\305<\214\306>\213\305" \ + "=\255\331x\323\353\267\366\374\362\377\377\377\377\377\375\377\377\377" \ + "\376\377\377\217\377\377\377\2\376\376\376\377\377\377\202\377\377\375" \ + "\11\244\317d\214\306>\213\307A\214\306>\214\305@\214\306>\215\306A\214" \ + "\306<\215\307\77\202\214\306>\202\214\305@\13\215\305<\215\305@\230\316" \ + "V\370\373\360\376\377\375\377\377\377\377\376\377\376\376\376\377\377" \ + "\375\377\376\377\376\377\377\220\377\377\377\10\376\376\376\377\376\377" \ + "\262\327x\214\306>\216\306A\215\307=\215\305<\215\306A\211\214\306>\6" \ + "\215\306C\307\341\240\376\377\373\376\377\377\376\377\375\376\376\374" \ + "\236\377\377\377\4\346\346\350\266\266\270\204\204\206SSU\202::<\1;;" \ + "=\202::<\1;;=\202::<\202;;=\3""99;::<;;=\203::<\4GGIxxz\247\247\247\347" \ + "\347\347\212\377\377\377\1\376\376\376\223\377\377\377\1\364\364\364" \ + "\205\316\316\316\1\332\332\332\203\377\377\377\202\376\376\376\221\377" \ + "\377\377\1\376\376\376\202\377\377\377\202\316\316\316\203\316\316\320" \ + "\3\316\316\316\317\317\317\346\346\346\206\377\377\377\5\346\346\346" \ + "\316\316\316\317\317\317\316\316\316\315\315\315\202\316\316\316\1\363" \ + "\363\363\250\377\377\377\1\376\376\376\203\377\377\377\3\346\346\346" \ + "\315\315\315\317\317\317\202\316\316\320\3\317\317\317\315\315\315\363" \ + "\363\363\202\377\377\377\202\376\376\376\204\377\377\377\3\346\346\346" \ + "\316\316\316\316\316\320\224\316\316\316\1\315\315\315\203\377\377\377" \ + "\1\376\376\376\215\377\377\377\1\376\376\376\225\377\377\377\2\346\346" \ + "\346\317\317\317\232\316\316\316\1\317\317\317\203\316\316\316\4\317" \ + "\317\317\315\315\315\316\316\316\363\363\363\231\377\377\377\3\340\361" \ + "\317\342\360\317\342\362\316\202\343\361\316\2\342\360\315\343\361\316" \ + "\240\342\361\320\10\342\362\316\342\361\320\343\363\317\341\360\317\342" \ + "\361\320\370\373\364\376\377\375\376\377\377\210\377\377\377\210\342" \ + "\361\320\7\341\360\317\342\362\316\343\361\316\342\360\314\342\361\320" \ + "\350\364\336\377\376\374\211\377\377\377\10\377\376\377\377\377\375\377" \ + "\377\377\377\377\375\370\373\362\341\360\321\340\357\316\342\362\316" \ + "\210\342\361\320\3\342\362\316\342\361\320\371\373\360\203\377\377\377" \ + "\202\377\376\377\220\377\377\377\4\377\377\375\376\376\376\377\376\377" \ + "\376\377\375\203\377\377\377\1\365\375\362\210\342\361\320\4\341\360" \ + "\321\342\361\322\343\363\317\360\367\345\224\377\377\377\7\376\377\377" \ + "\376\377\375\377\377\375\377\376\377\377\377\375\377\375\376\377\376" \ + "\377\202\377\377\377\30\376\376\377\364\370\351\333\354\277\277\337\224" \ + "\247\324k\224\313K\214\305@\214\306>\212\306@\214\306>\214\305B\215\306" \ + "C\215\307\77\212\306@\214\306>\215\307\77\241\321c\257\330|\304\342\242" \ + "\341\361\315\377\377\377\377\376\377\376\377\373\377\377\377\202\377" \ + "\377\375\1\377\376\377\203\377\377\377\1\376\377\377\212\377\377\377" \ + "\1\376\376\376\203\377\377\377\13\376\376\374\372\372\370\342\361\320" \ + "\343\361\316\342\362\316\341\360\317\342\361\320\341\360\317\342\362" \ + "\316\342\361\322\342\361\320\202\341\361\315\6\342\361\320\341\360\317" \ + "\343\361\315\343\361\320\356\371\350\377\376\377\203\377\377\377\1\376" \ + "\377\375\202\377\377\377\1\376\377\375\222\377\377\377\6\366\373\364" \ + "\342\361\320\342\362\316\342\360\317\341\362\316\343\361\320\210\342" \ + "\361\320\10\341\362\316\341\361\315\352\364\334\377\377\377\377\376\377" \ + "\377\377\377\376\377\377\376\377\375\222\377\377\377\202\376\376\376" \ + "\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377" \ + "\377\377\3\376\376\376\377\377\377\375\375\375\202\377\377\377\5\363" \ + "\363\363\316\316\316\264\264\264\235\235\235\233\233\233\202kkk\202k" \ + "km\3llnkkmyy{\202\234\234\236\6\316\316\320\346\346\346\377\377\377\376" \ + "\376\376\377\377\377\376\376\376\204\377\377\377\1\376\376\376\204\377" \ + "\377\377\1\376\376\376\240\377\377\377\1\376\376\376\231\377\377\377" \ + "\1\375\375\375\203\377\377\377\1\376\376\376\214\377\377\377\1\376\376" \ + "\376\202\377\377\377\1\376\376\376\242\377\377\377\1\376\376\376\206" \ + "\377\377\377\3\376\376\376\377\377\377\376\376\376\204\377\377\377\1" \ + "\376\376\376\202\377\377\377\202\376\376\376\225\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\202\377\377\377\3\376\376\376\377\377\377" \ + "\376\376\376\214\377\377\377\3\376\376\376\377\377\377\376\376\376\265" \ + "\377\377\377\1\375\375\375\234\377\377\377\7\376\377\377\377\376\377" \ + "\376\377\377\376\376\374\377\376\377\377\377\377\377\377\375\240\377" \ + "\377\377\1\377\377\375\202\377\377\377\5\377\376\377\376\376\376\377" \ + "\376\377\376\376\377\377\377\375\221\377\377\377\7\375\376\377\377\377" \ + "\377\377\376\377\377\377\375\376\377\377\377\377\373\377\376\377\210" \ + "\377\377\377\5\377\376\377\377\377\377\376\376\374\376\377\377\377\377" \ + "\377\202\377\377\375\1\376\377\377\210\377\377\377\6\376\377\377\375" \ + "\376\377\377\376\377\377\377\377\376\377\377\377\377\377\202\377\377" \ + "\375\224\377\377\377\202\377\376\377\2\374\377\377\377\376\377\210\377" \ + "\377\377\3\376\377\377\376\376\376\376\377\377\202\377\377\377\3\375" \ + "\377\376\377\377\377\377\376\377\220\377\377\377\202\377\376\377\2\376" \ + "\377\377\375\376\377\202\377\377\377\4\377\377\375\377\376\377\377\377" \ + "\377\377\377\375\202\376\377\377\7\377\377\377\377\376\377\377\377\377" \ + "\376\377\375\370\373\364\344\357\315\342\361\320\202\342\362\315\14\340" \ + "\357\316\345\360\316\376\377\373\376\376\376\377\377\377\377\375\376" \ + "\377\377\375\377\377\377\375\377\376\377\377\377\377\376\377\377\377" \ + "\375\202\376\377\375\5\376\377\377\377\377\377\377\377\375\376\376\376" \ + "\377\376\377\214\377\377\377\1\376\376\376\202\377\377\377\5\377\377" \ + "\375\376\375\377\377\377\377\376\376\377\377\377\375\204\377\377\377" \ + "\1\377\377\375\205\377\377\377\202\377\376\377\2\377\377\377\377\377" \ + "\375\202\377\377\377\202\376\377\377\222\377\377\377\5\377\377\375\377" \ + "\377\377\377\377\375\377\377\377\377\377\375\202\377\377\377\1\377\376" \ + "\372\212\377\377\377\1\377\375\377\202\377\377\377\3\377\376\377\377" \ + "\377\377\377\377\375\225\377\377\377\1\376\376\376\211\377\377\377\1" \ + "\376\376\376\204\377\377\377\1\376\376\376\205\377\377\377\1\376\376" \ + "\376\206\377\377\377\3\376\376\376\377\377\377\376\376\376\206\377\377" \ + "\377\1\376\376\376\233\377\377\377\1\376\376\376\203\377\377\377\5\376" \ + "\376\376\377\377\377\376\376\376\377\377\377\376\376\376\223\377\377" \ + "\377\3\376\376\376\377\377\377\376\376\376\205\377\377\377\3\376\376" \ + "\376\377\377\377\376\376\376\203\377\377\377\3\376\376\376\377\377\377" \ + "\376\376\376\203\377\377\377\1\376\376\376\205\377\377\377\1\376\376" \ + "\376\246\377\377\377\3\376\376\376\377\377\377\376\376\376\220\377\377" \ + "\377\1\376\376\376\246\377\377\377\1\376\376\376\225\377\377\377\1\376" \ + "\376\376\202\377\377\377\1\376\376\376\240\377\377\377\1\376\376\376" \ + "\230\377\377\377\6\377\377\375\377\377\377\377\376\377\376\377\375\374" \ + "\377\377\376\375\377\242\377\377\377\202\377\376\377\6\376\376\376\375" \ + "\376\377\377\377\377\377\377\375\377\377\377\376\377\375\220\377\377" \ + "\377\7\377\377\375\377\377\377\377\377\375\377\375\376\376\377\375\376" \ + "\377\377\376\376\376\212\377\377\377\4\377\376\377\377\377\375\377\377" \ + "\377\377\377\375\203\377\376\377\210\377\377\377\5\377\377\375\377\377" \ + "\377\377\375\376\377\376\377\377\377\375\202\377\377\377\1\376\377\377" \ + "\221\377\377\377\1\375\376\377\203\377\377\375\2\376\377\375\377\375" \ + "\376\211\377\377\377\204\377\376\377\4\377\377\377\376\377\375\377\377" \ + "\375\377\376\377\221\377\377\377\5\376\377\377\376\376\376\377\377\373" \ + "\376\376\377\376\377\377\202\377\377\377\2\377\376\377\377\377\375\202" \ + "\377\377\377\7\377\377\375\377\376\377\376\376\377\377\377\377\376\377" \ + "\377\376\377\375\376\377\377\202\377\377\377\203\376\377\377\2\377\377" \ + "\377\376\376\374\202\377\376\377\13\376\376\376\377\377\375\377\377\377" \ + "\377\375\376\376\377\377\377\377\377\376\376\377\377\376\377\376\376" \ + "\374\376\377\377\377\377\375\221\377\377\377\203\377\377\375\4\377\377" \ + "\377\377\377\375\377\376\377\376\376\376\210\377\377\377\1\377\377\373" \ + "\203\377\377\377\1\377\377\375\202\376\377\377\222\377\377\377\1\377" \ + "\377\375\202\377\376\377\3\377\377\377\377\376\377\377\376\374\202\376" \ + "\377\377\210\377\377\377\4\377\377\375\377\377\377\376\377\375\377\375" \ + "\377\202\376\377\377\1\377\376\375\227\377\377\377\1\376\376\376\207" \ + "\377\377\377\1\376\376\376\217\377\377\377\1\376\376\376\205\377\377" \ + "\377\1\376\376\376\204\377\377\377\1\376\376\376\233\377\377\377\1\376" \ + "\376\376\211\377\377\377\1\376\376\376\222\377\377\377\1\376\376\376" \ + "\206\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376\262\377" \ + "\377\377\1\376\376\376\212\377\377\377\1\376\376\376\202\377\377\377" \ + "\1\376\376\376\202\377\377\377\1\376\376\376\225\377\377\377\1\376\376" \ + "\376\306\377\377\377\1\376\376\376\235\377\377\377\7\377\376\377\376" \ + "\377\377\377\377\377\377\377\375\376\375\377\377\377\375\377\376\377" \ + "\241\377\377\377\1\376\377\377\203\377\377\377\3\377\377\375\377\375" \ + "\376\377\376\377\221\377\377\377\202\376\377\377\5\377\377\377\377\377" \ + "\375\377\377\377\377\376\377\377\377\375\211\377\377\377\203\377\377" \ + "\375\202\377\377\377\202\376\377\377\1\377\377\375\212\377\377\377\202" \ + "\376\377\375\3\376\377\377\377\377\375\377\376\377\223\377\377\377\6" \ + "\377\377\375\377\376\377\374\377\377\377\377\377\377\376\377\376\377" \ + "\375\210\377\377\377\3\377\377\375\376\377\377\377\377\375\202\377\377" \ + "\377\1\377\377\375\223\377\377\377\4\376\376\376\377\377\375\376\376" \ + "\376\377\376\377\202\377\377\375\1\376\376\376\206\377\377\377\1\377" \ + "\377\375\215\377\377\377\1\377\377\375\202\377\377\377\5\376\377\377" \ + "\377\377\377\376\376\374\377\377\377\377\376\377\202\377\377\377\1\376" \ + "\376\376\221\377\377\377\7\376\377\375\377\375\377\377\377\377\376\377" \ + "\377\377\377\377\377\377\373\377\376\377\202\377\377\377\1\377\377\375" \ + "\202\377\377\377\1\377\377\375\204\377\377\377\6\376\376\377\377\377" \ + "\375\376\377\377\377\377\375\377\376\377\375\377\374\222\377\377\377" \ + "\3\376\377\375\377\377\377\376\377\375\203\376\377\377\1\377\376\377" \ + "\211\377\377\377\7\377\377\373\377\376\377\377\377\375\377\377\377\377" \ + "\376\377\376\376\376\376\377\377") + + diff --git a/recipes-core/psplash/psplash_agldemo.inc b/recipes-core/psplash/psplash_agldemo.inc new file mode 100644 index 000000000..dad26129e --- /dev/null +++ b/recipes-core/psplash/psplash_agldemo.inc @@ -0,0 +1,9 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI_append = " file://psplash-colors.h" + +SPLASH_IMAGES = "file://psplash-poky-img.h;outsuffix=default" + +do_configure_append () { + cp -f ${WORKDIR}/psplash-colors.h ${S} +} diff --git a/recipes-core/psplash/psplash_git.bbappend b/recipes-core/psplash/psplash_git.bbappend new file mode 100644 index 000000000..931b27c78 --- /dev/null +++ b/recipes-core/psplash/psplash_git.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'psplash_agldemo.inc', '', d)} diff --git a/recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules b/recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules new file mode 100644 index 000000000..a55470039 --- /dev/null +++ b/recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules @@ -0,0 +1,8 @@ +# udev rules for gpsd for Sierra Wireless modems +SUBSYSTEM!="tty", GOTO="sw_gpsd_rules_end" + +ENV{ID_VENDOR_ID}=="1199", ATTRS{bInterfaceNumber}=="02", SYMLINK+="gps%n", TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service" + +ACTION=="remove", TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service" + +LABEL="sw_gpsd_rules_end" diff --git a/recipes-core/udev/sw-gpsd-udev-conf_1.0.bb b/recipes-core/udev/sw-gpsd-udev-conf_1.0.bb new file mode 100644 index 000000000..9b6fd57d2 --- /dev/null +++ b/recipes-core/udev/sw-gpsd-udev-conf_1.0.bb @@ -0,0 +1,16 @@ +SUMMARY = "Sierra-Wireless MC7xxx modem gpsd udev configuration" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI = "file://60-sw-gpsd.rules" + +do_compile[noexec] = "1" + +do_install() { + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${sysconfdir}/udev/rules.d + install -m 0644 ${WORKDIR}/60-sw-gpsd.rules ${D}${sysconfdir}/udev/rules.d/ + fi +} + +RDEPENDS_${PN} += "systemd" diff --git a/recipes-core/udev/usb-can-udev-conf/60-usb-can.rules b/recipes-core/udev/usb-can-udev-conf/60-usb-can.rules new file mode 100644 index 000000000..3aa800a83 --- /dev/null +++ b/recipes-core/udev/usb-can-udev-conf/60-usb-can.rules @@ -0,0 +1,7 @@ +# udev rules for USB CAN adapters +SUBSYSTEM!="tty", GOTO="usb_can_rules_end" + +# VScom USB-CAN Plus +ATTRS{idProduct}=="6015", ATTRS{idVendor}=="0403", SYMLINK+="usbcan%n", TAG+="systemd", ENV{SYSTEMD_WANTS}="slcand@%k.service" + +LABEL="usb_can_rules_end" diff --git a/recipes-core/udev/usb-can-udev-conf/slcand-default b/recipes-core/udev/usb-can-udev-conf/slcand-default new file mode 100644 index 000000000..a86552fd2 --- /dev/null +++ b/recipes-core/udev/usb-can-udev-conf/slcand-default @@ -0,0 +1,2 @@ +# Defaults for VScom USB-CAN Plus @ 500 Kb/s CAN rate +SLCAND_OPTS="-o -s6 -t hw -S 3000000" diff --git a/recipes-core/udev/usb-can-udev-conf/slcand@.service b/recipes-core/udev/usb-can-udev-conf/slcand@.service new file mode 100644 index 000000000..3c30e51b0 --- /dev/null +++ b/recipes-core/udev/usb-can-udev-conf/slcand@.service @@ -0,0 +1,13 @@ +[Unit] +Description=Serial CAN daemon (can-utils) +BindsTo=dev-%i.device +After=dev-%i.device + +[Service] +Type=forking +StopWhenUnneeded=yes +Environment=SLCAND_OPTS="-o -c -s6" SLCAND_DEV=can0 +EnvironmentFile=-/etc/default/slcand +EnvironmentFile=-/etc/sysconfig/slcand +ExecStart=/usr/bin/slcand $SLCAND_OPTS %I $SLCAND_DEV +ExecStartPost=/bin/sh -c '/bin/sleep 3; /sbin/ip link set $SLCAND_DEV up' diff --git a/recipes-core/udev/usb-can-udev-conf_1.0.bb b/recipes-core/udev/usb-can-udev-conf_1.0.bb new file mode 100644 index 000000000..fb5deec30 --- /dev/null +++ b/recipes-core/udev/usb-can-udev-conf_1.0.bb @@ -0,0 +1,25 @@ +SUMMARY = "USB CAN adapter udev configuration" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI = "file://60-usb-can.rules \ + file://slcand@.service \ + file://slcand-default \ +" + +do_compile[noexec] = "1" + +do_install() { + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${sysconfdir}/udev/rules.d + install -m 0644 ${WORKDIR}/60-usb-can.rules ${D}${sysconfdir}/udev/rules.d/ + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/slcand@.service ${D}${systemd_system_unitdir}/ + install -d ${D}${sysconfdir}/default + install -m 0644 ${WORKDIR}/slcand-default ${D}${sysconfdir}/default/slcand + fi +} + +FILES_${PN} += "${systemd_system_unitdir}" + +RDEPENDS_${PN} += "systemd" diff --git a/recipes-demo-hmi/alexa-viewer/alexa-viewer_git.bb b/recipes-demo/alexa-viewer/alexa-viewer_git.bb similarity index 100% rename from recipes-demo-hmi/alexa-viewer/alexa-viewer_git.bb rename to recipes-demo/alexa-viewer/alexa-viewer_git.bb diff --git a/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb new file mode 100644 index 000000000..da15ac83b --- /dev/null +++ b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb @@ -0,0 +1,29 @@ +SUMMARY = "Instrument Cluster Dashboard AGL Demonstration" +DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster dashboard" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-cluster-demo-dashboard" +SECTION = "apps" + +LICENSE = "Apache-2.0 & BSD" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \ + file://app/cluster-gauges.qml;beginline=9;endline=48;md5=54187d50b29429abee6095fe8b7c1a78" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-dashboard;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +# build-time dependencies +DEPENDS += "qtquickcontrols2 qtwebsockets libqtappfw glib-2.0 \ + wayland-native wayland qtwayland qtwayland-native" + +inherit pkgconfig cmake_qt5 aglwgt + +RDEPENDS_${PN} += " \ + qtquickcontrols \ + qtquickcontrols-qmlplugins \ + qtquickcontrols2 \ + qtquickcontrols2-qmlplugins \ + libqtappfw \ + agl-service-signal-composer \ +" diff --git a/recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb b/recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb new file mode 100644 index 000000000..44feecb15 --- /dev/null +++ b/recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb @@ -0,0 +1,29 @@ +SUMMARY = "Minimal cluster demo gauges that can be used standalone" +DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster gauges as a wayland compositor" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-cluster-demo-gauges" +SECTION = "apps" + +LICENSE = "Apache-2.0 & BSD" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \ + file://app/cluster-gauges.qml;beginline=10;endline=49;md5=54187d50b29429abee6095fe8b7c1a78" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-gauges;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +# build-time dependencies +DEPENDS += "qtquickcontrols2 qtwebsockets" + +inherit pkgconfig cmake_qt5 aglwgt + +RDEPENDS_${PN} += " \ + qtquickcontrols \ + qtquickcontrols-qmlplugins \ + qtquickcontrols2 \ + qtquickcontrols2-qmlplugins \ + qtwebsockets \ + qtwebsockets-qmlplugins \ + kms-conf \ +" diff --git a/recipes-demo/cluster-receiver/cluster-receiver_git.bb b/recipes-demo/cluster-receiver/cluster-receiver_git.bb new file mode 100644 index 000000000..534351f23 --- /dev/null +++ b/recipes-demo/cluster-receiver/cluster-receiver_git.bb @@ -0,0 +1,25 @@ +SUMMARY = "Instrument Cluster Receiver AGL Demonstration" +DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster remote display" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-cluster-demo-receiver" +SECTION = "apps" + +LICENSE = "Apache-2.0 & MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=374fee6a7817f1e1a5a7bfb7b7989553" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-receiver;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +# build-time dependencies +DEPENDS += "wayland wayland-native \ + gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad" + +inherit cmake pkgconfig aglwgt + +RDEPENDS_${PN} += " \ + gstreamer1.0-plugins-base \ + gstreamer1.0-plugins-good \ + gstreamer1.0-plugins-bad \ +" diff --git a/recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb b/recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb new file mode 100644 index 000000000..10728d569 --- /dev/null +++ b/recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb @@ -0,0 +1,28 @@ +SUMMARY = "Instrument Cluster Receiver AGL Demonstration" +DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster remote display" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/admin/repos/apps/agl-qt-cluster-demo-receiver" +SECTION = "apps" + +LICENSE = "Apache-2.0 & MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \ + file://app/surface.hpp;beginline=5;endline=21;md5=5351c531a191f0e3463aafcd0a6a00a3" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-qt-cluster-demo-receiver;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +# build-time dependencies +DEPENDS += "wayland wayland-native \ + qtwayland qtwayland-native \ + qtquickcontrols2 qtwebsockets qtbase qtdeclarative \ + gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad" + +inherit cmake_qt5 pkgconfig aglwgt + +RDEPENDS_${PN} += " \ + gstreamer1.0-plugins-base \ + gstreamer1.0-plugins-good \ + gstreamer1.0-plugins-bad \ +" diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json new file mode 100644 index 000000000..90180dcaf --- /dev/null +++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json @@ -0,0 +1,40 @@ +{ + "areas": [ + { + "name": "fullscreen", + "rect": { + "x": 0, + "y": 0, + "w": 1920, + "h": 1080 + } + }, + { + "name": "normal.full", + "rect": { + "x": 640, + "y": 180, + "w": 640, + "h": 720 + } + }, + { + "name": "restriction.normal", + "rect": { + "x": 640, + "y": 180, + "w": 640, + "h": 720 + } + }, + { + "name": "on_screen", + "rect": { + "x": 640, + "y": 180, + "w": 640, + "h": 720 + } + } + ] +} diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json new file mode 100644 index 000000000..5c6a5b35d --- /dev/null +++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json @@ -0,0 +1,47 @@ +{ + "description": "Layer mapping", + "mappings": [ + { + "name": "BackGroundLayer", + "role" : "receiver", + "id_range_begin": 0, + "id_range_end": 0, + "comment": "Work Around: This is a special fallback layer that not stopping wayland event loop." + }, + { + "name": "FarHomeScreen", + "role": "homescreen", + "id_range_begin": 100, + "id_range_end": 199, + "comment": "FarHomeScreen is the part of HomeScreen. The z order of this layer is lower than NearHomeScreen" + }, + { + "name": "Apps", + "role": "receiver|fallback", + "id_range_begin": 1000, + "id_range_end": 2999, + "comment": "Application layer" + }, + { + "name": "Popup", + "role": "popup*", + "id_range_begin": 4000, + "id_range_end": 4999, + "comment": "This layer is for popup application layer" + }, + { + "name": "Restriction", + "role": "restriction", + "id_range_begin": 5000, + "id_range_end": 5999, + "comment": "This layer is for restriction notification on driving. This is used by restriction role" + }, + { + "name": "OnScreen", + "role": "^on_screen.*", + "id_range_begin": 6000, + "id_range_end": 6999, + "comment": "System notification layer. For example, on_screen_low_battery_alert to notify user" + } + ] +} diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db new file mode 100644 index 000000000..13702144a --- /dev/null +++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db @@ -0,0 +1,34 @@ +{ + "roles":[ + { + "category": "homescreen", + "role": "homescreen", + "area": "fullscreen", + "layer": "homescreen", + }, + { + "category": "debug", + "role": "receiver | fallback", + "area": "normal.full", + "layer": "apps", + }, + { + "category": "restriction", + "role": "restriction", + "area": "restriction.normal", + "layer": "restriction", + }, + { + "category": "pop_up", + "role": "on_screen | on_screen_phone", + "area": "on_screen", + "layer": "on_screen", + }, + { + "category": "system_alert", + "role": "system_alert", + "area": "on_screen", + "layer": "on_screen", + } + ] +} diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb new file mode 100644 index 000000000..4be666bc4 --- /dev/null +++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb @@ -0,0 +1,19 @@ +SUMMARY = "Cluster demo windowmanager configuration" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +SRC_URI = "file://layers.json \ + file://areas.json \ + file://roles.db \ +" + +do_compile[noexec] = "1" + +do_install() { + install -d ${D}${sysconfdir}/xdg/windowmanager + install -m 0644 ${WORKDIR}/layers.json ${D}${sysconfdir}/xdg/windowmanager/layers.json + install -m 0644 ${WORKDIR}/areas.json ${D}${sysconfdir}/xdg/windowmanager/areas.json + install -m 0644 ${WORKDIR}/roles.db ${D}${sysconfdir}/xdg/windowmanager/roles.db +} + +#FILES_${PN} += "${sysconfdir}/*" diff --git a/recipes-demo-hmi/dashboard/dashboard_git.bb b/recipes-demo/dashboard/dashboard_git.bb similarity index 100% rename from recipes-demo-hmi/dashboard/dashboard_git.bb rename to recipes-demo/dashboard/dashboard_git.bb diff --git a/recipes-demo-hmi/homescreen-demo-ci/homescreen-demo-ci_git.bb b/recipes-demo/homescreen-demo-ci/homescreen-demo-ci_git.bb similarity index 100% rename from recipes-demo-hmi/homescreen-demo-ci/homescreen-demo-ci_git.bb rename to recipes-demo/homescreen-demo-ci/homescreen-demo-ci_git.bb diff --git a/recipes-demo-hmi/homescreen/homescreen_git.bb b/recipes-demo/homescreen/homescreen_git.bb similarity index 100% rename from recipes-demo-hmi/homescreen/homescreen_git.bb rename to recipes-demo/homescreen/homescreen_git.bb diff --git a/recipes-demo-hmi/html5-background/html5-background_git.bb b/recipes-demo/html5-background/html5-background_git.bb similarity index 100% rename from recipes-demo-hmi/html5-background/html5-background_git.bb rename to recipes-demo/html5-background/html5-background_git.bb diff --git a/recipes-demo-hmi/html5-dashboard/html5-dashboard_git.bb b/recipes-demo/html5-dashboard/html5-dashboard_git.bb similarity index 100% rename from recipes-demo-hmi/html5-dashboard/html5-dashboard_git.bb rename to recipes-demo/html5-dashboard/html5-dashboard_git.bb diff --git a/recipes-demo-hmi/html5-homescreen/html5-homescreen_git.bb b/recipes-demo/html5-homescreen/html5-homescreen_git.bb similarity index 100% rename from recipes-demo-hmi/html5-homescreen/html5-homescreen_git.bb rename to recipes-demo/html5-homescreen/html5-homescreen_git.bb diff --git a/recipes-demo-hmi/html5-hvac/html5-hvac_git.bb b/recipes-demo/html5-hvac/html5-hvac_git.bb similarity index 100% rename from recipes-demo-hmi/html5-hvac/html5-hvac_git.bb rename to recipes-demo/html5-hvac/html5-hvac_git.bb diff --git a/recipes-demo-hmi/html5-launcher/html5-launcher_git.bb b/recipes-demo/html5-launcher/html5-launcher_git.bb similarity index 100% rename from recipes-demo-hmi/html5-launcher/html5-launcher_git.bb rename to recipes-demo/html5-launcher/html5-launcher_git.bb diff --git a/recipes-demo-hmi/html5-mediaplayer/html5-mediaplayer_git.bb b/recipes-demo/html5-mediaplayer/html5-mediaplayer_git.bb similarity index 100% rename from recipes-demo-hmi/html5-mediaplayer/html5-mediaplayer_git.bb rename to recipes-demo/html5-mediaplayer/html5-mediaplayer_git.bb diff --git a/recipes-demo-hmi/html5-mixer/html5-mixer_git.bb b/recipes-demo/html5-mixer/html5-mixer_git.bb similarity index 100% rename from recipes-demo-hmi/html5-mixer/html5-mixer_git.bb rename to recipes-demo/html5-mixer/html5-mixer_git.bb diff --git a/recipes-demo-hmi/html5-settings/html5-settings_git.bb b/recipes-demo/html5-settings/html5-settings_git.bb similarity index 100% rename from recipes-demo-hmi/html5-settings/html5-settings_git.bb rename to recipes-demo/html5-settings/html5-settings_git.bb diff --git a/recipes-demo-hmi/hvac/hvac_git.bb b/recipes-demo/hvac/hvac_git.bb similarity index 100% rename from recipes-demo-hmi/hvac/hvac_git.bb rename to recipes-demo/hvac/hvac_git.bb diff --git a/recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb b/recipes-demo/inputeventmanager/inputeventmanager_git.bb similarity index 99% rename from recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb rename to recipes-demo/inputeventmanager/inputeventmanager_git.bb index 73da4878a..16ee007f7 100644 --- a/recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb +++ b/recipes-demo/inputeventmanager/inputeventmanager_git.bb @@ -20,7 +20,7 @@ PATH_prepend = "${STAGING_DIR_NATIVE}${OE_QMAKE_PATH_QT_BINS}:" do_install() { install -d ${D}/usr/AGL/${PN} install -m 0755 ${B}/inputeventmanager/InputEventManager ${D}/usr/AGL/${PN}/ - + install -d ${D}${systemd_user_unitdir} install -m 0644 ${S}/inputeventmanager/conf/InputEventManager.service ${D}${systemd_user_unitdir} } diff --git a/recipes-demo-hmi/launcher/launcher_git.bb b/recipes-demo/launcher/launcher_git.bb similarity index 100% rename from recipes-demo-hmi/launcher/launcher_git.bb rename to recipes-demo/launcher/launcher_git.bb diff --git a/recipes-demo-hmi/mediaplayer/mediaplayer_git.bb b/recipes-demo/mediaplayer/mediaplayer_git.bb similarity index 100% rename from recipes-demo-hmi/mediaplayer/mediaplayer_git.bb rename to recipes-demo/mediaplayer/mediaplayer_git.bb diff --git a/recipes-demo-hmi/messaging/messaging_git.bb b/recipes-demo/messaging/messaging_git.bb similarity index 100% rename from recipes-demo-hmi/messaging/messaging_git.bb rename to recipes-demo/messaging/messaging_git.bb diff --git a/recipes-demo-hmi/mixer/mixer_git.bb b/recipes-demo/mixer/mixer_git.bb similarity index 100% rename from recipes-demo-hmi/mixer/mixer_git.bb rename to recipes-demo/mixer/mixer_git.bb diff --git a/recipes-demo-hmi/navigation/navigation-demo_git.bb b/recipes-demo/navigation/navigation-demo_git.bb similarity index 100% rename from recipes-demo-hmi/navigation/navigation-demo_git.bb rename to recipes-demo/navigation/navigation-demo_git.bb diff --git a/recipes-demo-hmi/navigation/ondemandnavi-config/naviconfig.ini b/recipes-demo/navigation/ondemandnavi-config/naviconfig.ini similarity index 100% rename from recipes-demo-hmi/navigation/ondemandnavi-config/naviconfig.ini rename to recipes-demo/navigation/ondemandnavi-config/naviconfig.ini diff --git a/recipes-demo-hmi/navigation/ondemandnavi-config_1.0.bb b/recipes-demo/navigation/ondemandnavi-config_1.0.bb similarity index 100% rename from recipes-demo-hmi/navigation/ondemandnavi-config_1.0.bb rename to recipes-demo/navigation/ondemandnavi-config_1.0.bb diff --git a/recipes-demo-hmi/navigation/ondemandnavi_git.bb b/recipes-demo/navigation/ondemandnavi_git.bb similarity index 100% rename from recipes-demo-hmi/navigation/ondemandnavi_git.bb rename to recipes-demo/navigation/ondemandnavi_git.bb diff --git a/recipes-demo-hmi/navigation/poiapp-api-key_1.0.bb b/recipes-demo/navigation/poiapp-api-key_1.0.bb similarity index 100% rename from recipes-demo-hmi/navigation/poiapp-api-key_1.0.bb rename to recipes-demo/navigation/poiapp-api-key_1.0.bb diff --git a/recipes-demo-hmi/navigation/poiapp/0001-add-display-permission.patch b/recipes-demo/navigation/poiapp/0001-add-display-permission.patch similarity index 100% rename from recipes-demo-hmi/navigation/poiapp/0001-add-display-permission.patch rename to recipes-demo/navigation/poiapp/0001-add-display-permission.patch diff --git a/recipes-demo-hmi/navigation/poiapp_git.bb b/recipes-demo/navigation/poiapp_git.bb similarity index 100% rename from recipes-demo-hmi/navigation/poiapp_git.bb rename to recipes-demo/navigation/poiapp_git.bb diff --git a/recipes-demo-hmi/navigation/tbtnavi_git.bb b/recipes-demo/navigation/tbtnavi_git.bb similarity index 100% rename from recipes-demo-hmi/navigation/tbtnavi_git.bb rename to recipes-demo/navigation/tbtnavi_git.bb diff --git a/recipes-demo-hmi/onscreenapp/onscreenapp_git.bb b/recipes-demo/onscreenapp/onscreenapp_git.bb similarity index 100% rename from recipes-demo-hmi/onscreenapp/onscreenapp_git.bb rename to recipes-demo/onscreenapp/onscreenapp_git.bb diff --git a/recipes-demo-hmi/phone/phone_git.bb b/recipes-demo/phone/phone_git.bb similarity index 100% rename from recipes-demo-hmi/phone/phone_git.bb rename to recipes-demo/phone/phone_git.bb diff --git a/recipes-demo-hmi/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb b/recipes-demo/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb similarity index 100% rename from recipes-demo-hmi/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb rename to recipes-demo/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb diff --git a/recipes-demo-hmi/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb b/recipes-demo/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb similarity index 100% rename from recipes-demo-hmi/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb rename to recipes-demo/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb diff --git a/recipes-demo-hmi/radio/files/presets-ALS.conf b/recipes-demo/radio/files/presets-ALS.conf similarity index 100% rename from recipes-demo-hmi/radio/files/presets-ALS.conf rename to recipes-demo/radio/files/presets-ALS.conf diff --git a/recipes-demo-hmi/radio/files/presets-CES.conf b/recipes-demo/radio/files/presets-CES.conf similarity index 100% rename from recipes-demo-hmi/radio/files/presets-CES.conf rename to recipes-demo/radio/files/presets-CES.conf diff --git a/recipes-demo-hmi/radio/files/presets-FOSDEM.conf b/recipes-demo/radio/files/presets-FOSDEM.conf similarity index 100% rename from recipes-demo-hmi/radio/files/presets-FOSDEM.conf rename to recipes-demo/radio/files/presets-FOSDEM.conf diff --git a/recipes-demo-hmi/radio/radio_git.bb b/recipes-demo/radio/radio_git.bb similarity index 100% rename from recipes-demo-hmi/radio/radio_git.bb rename to recipes-demo/radio/radio_git.bb diff --git a/recipes-demo-hmi/settings/settings_git.bb b/recipes-demo/settings/settings_git.bb similarity index 100% rename from recipes-demo-hmi/settings/settings_git.bb rename to recipes-demo/settings/settings_git.bb diff --git a/recipes-demo/simple-can-simulator/files/simple_can_simulator.py b/recipes-demo/simple-can-simulator/files/simple_can_simulator.py new file mode 100755 index 000000000..83f88706e --- /dev/null +++ b/recipes-demo/simple-can-simulator/files/simple_can_simulator.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python3 +# Copyright (c) 2016 Alex Bencz +# Copyright (c) 2019 Konsulko Group, smurray@konsulko.com +# Copyright (c) 2020 The Linux Foundation, jsmoeller@linuxfoundation.org +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# +# CANSocket from: +# +# https://github.com/abencz/python_socketcan/blob/master/python_socketcan_example.py +# + +import sys +import socket +import argparse +import struct +import errno +import threading +import time + +class CANSocket(object): + FORMAT = "= self.vehicle_speed: + return + v = (self.vehicle_speed - target_speed) / (duration * self.freq) + r = (self.engine_speed - target_rpm) / (duration * self.freq) + while self.vehicle_speed > target_speed and (not self.CRUISEACTIVE or bycruise): + with self.lock: + self.vehicle_speed -= v; + self.engine_speed -= r; + time.sleep(1 / self.freq) + + def increase(self, bycruise = True): + if self.CRUISEACTIVE: + target_speed = self.vehicle_speed + 5 + target_rpm = self.engine_speed * 1.1 + self.accelerate(target_speed, target_rpm, 2, bycruise) + + def decrease(self, bycruise = True): + if self.CRUISEACTIVE: + target_speed = self.vehicle_speed - 5 + target_rpm = self.engine_speed * 0.9 + self.brake(target_speed, target_rpm, 2, bycruise) + + def resume(self, bycruise = True): + target_speed = self.CRUISESPEED + target_rpm = self.CRUISERPM + current_speed = self.get_vehicle_speed() + if target_speed > current_speed: + self.accelerate(target_speed, target_rpm, 2, bycruise) + else: + self.brake(target_speed, target_rpm, 2, bycruise) + + def run(self): + while True: + if not self.CRUISEACTIVE: + self.accelerate(80, 3000, 5) + self.accelerate(104, 4000, 3) + self.brake(80, 3000, 3) + self.accelerate(104, 4000, 6) + self.brake(40, 2000, 4) + self.accelerate(90, 3000, 5) + self.brake(1, 650, 5) + if not self.CRUISEACTIVE: + self.reset() + time.sleep(5) + +class DiagnosticMessageHandler(object): + def __init__(self, can_sock, simulator, verbose=False): + self.can_sock = can_sock + self.simulator = simulator + self.verbose = verbose + self.thread = threading.Thread(target=self.run, daemon=True) + + def start(self): + self.thread.start() + + def run(self): + while True: + can_id, data = self.can_sock.recv() + #print('%03X#%s' % (can_id, ''.join(format(x, '02X') for x in data))) + if can_id == 0x7df: + # OBD-II request + if data[1] == 0x01 and data[2] == 0x0C: + # Engine speed + speed = self.simulator.get_engine_speed() + #print('engine speed = %d' % speed) + if speed > 16383.75: + speed = 16383.75 + reply = [ 0x04, 0x41, 0x0C ] + reply.append(4 * speed // 256) + reply.append(4 * speed % 256) + # pad remaining bytes to make 8 + reply.append(0) + reply.append(0) + reply.append(0) + self.can_sock.send(0x7e8, bytes(reply), 0) + elif data[1] == 0x01 and data[2] == 0x0D: + # Vehicle speed + speed = int(self.simulator.get_vehicle_speed()) % 256 + #print('vehicle speed = %d' % speed) + reply = [ 0x03, 0x41, 0x0D ] + reply.append(speed) + # pad remaining bytes to make 8 + reply.append(0) + reply.append(0) + reply.append(0) + reply.append(0) + self.can_sock.send(0x7e8, bytes(reply), 0) + +class SteeringWheelMessageHandler(object): + def __init__(self, can_sock, simulator, verbose=False): + self.can_sock = can_sock + self.simulator = simulator + self.verbose = verbose + self.thread = threading.Thread(target=self.run, daemon=True) + self.buttonpressed = False + self.buttonenabled = False + self.buttoncancel = False + self.buttondec = False + self.buttoninc = False + self.cruisemode = False + self.cruiseactive = False + + def start(self): + self.thread.start() + + def run(self): + while True: + can_id, data = self.can_sock.recv() + #print('%03X#%s' % (can_id, ''.join(format(x, '02X') for x in data))) + if can_id == 0x21: + #print('%03X#%s' % (can_id, ''.join(format(x, '02X') for x in data))) + if data: + #if data[6]: + #print('data6: %02X' % (data[6])) + if data[6] == 0x80 and not self.buttonpressed: + # we do skip any further lin messages + # two buttons at the same time won't work + # (aka unlikely w/o twisting fingers) + self.buttonpressed = True + self.buttonenabled = True + if data[6] == 0x08 and not self.buttonpressed: + self.buttonpressed = True + self.buttoncancel = True + if data[6] == 0x10 and not self.buttonpressed: + self.buttonpressed = True + self.buttondec = True + if data[6] == 0x40 and not self.buttonpressed: + self.buttonpressed = True + self.buttoninc = True + if data[6] == 0x00 and self.buttonpressed: + #now handle it as the button was released + if self.buttonenabled: + self.buttonenabled = False + self.cruisemode = not self.cruisemode + #print("set cruisemode to %s" % self.cruisemode) + self.simulator.CRUISEMODE = self.cruisemode + # disable/reset all if going off + if not self.cruisemode: + self.cruiseactive = False + self.simulator.CRUISEACTIVE = self.cruiseactive + self.simulator.CRUISESPEED = 0 + self.simulator.CRUISERPM = 0 + #print("set cruiseactive to %s" % self.cruiseactive) + if self.buttoncancel: + self.buttoncancel = False + self.simulator.CRUISESPEED = self.simulator.get_vehicle_speed() + self.simulator.CRUISERPM = self.simulator.get_engine_speed() + #print("set cruisespeed to %d" % self.simulator.CRUISESPEED ) + #print("set cruiserpm to %d" % self.simulator.CRUISERPM ) + self.cruiseactive = False + #print("set cruiseactive to %s" % self.cruiseactive ) + self.simulator.CRUISEACTIVE = self.cruiseactive + if self.buttondec: + self.buttondec = False + if self.cruiseactive: + #print("decrease") + self.simulator.decrease() + else: + # set speed + #print("set speed") + self.simulator.CRUISESPEED = self.simulator.get_vehicle_speed() + self.simulator.CRUISERPM = self.simulator.get_engine_speed() + #print("set cruisespeed to %d" % self.simulator.CRUISESPEED ) + #print("set cruiserpm to %d" % self.simulator.CRUISERPM ) + self.cruiseactive = not self.cruiseactive + #print("set cruiseactive to %s" % self.cruiseactive ) + self.simulator.CRUISEACTIVE = self.cruiseactive + if self.buttoninc: + self.buttoninc = False + if self.cruiseactive: + #print("increase") + self.simulator.increase() + else: + if self.simulator.CRUISESPEED > 0: + # resume + self.cruiseactive = not self.cruiseactive + self.simulator.CRUISEACTIVE = self.cruiseactive + #print("set cruiseactive to %s" % self.cruiseactive ) + #print("resume") + self.simulator.resume() + self.buttonpressed = False + + +class StatusMessageSender(object): + def __init__(self, can_sock, simulator, verbose=False): + self.can_sock = can_sock + self.simulator = simulator + self.verbose = verbose + self.thread = threading.Thread(target=self.run, daemon=True) + + def start(self): + self.thread.start() + + def run(self): + while True: + # Engine speed + speed = self.simulator.get_engine_speed() + if self.verbose: + print('engine speed = %d' % speed) + if speed > 16383.75: + speed = 16383.75 + # Message is 1 byte unknown, 1 byte fuel level, 2 bytes engine speed (4x), fuel low @ bit 55 + msg = [ 0, 0 ] + speed *= 4 + msg.append(speed // 256) + msg.append(speed % 256) + # pad remaining bytes to make 8 + msg.append(0) + msg.append(0) + msg.append(0) + msg.append(0) + self.can_sock.send(0x3d9, bytes(msg), 0) + + # Vehicle speed + speed = int(self.simulator.get_vehicle_speed()) % 256 + if self.verbose: + print('vehicle speed = %d' % speed) + # Message is 15 bits speed (64x), left aligned + msg = [ ] + # Note: extra 2x to yield required left-alignment + speed *= 128 + msg.append(speed // 256) + msg.append(speed % 256) + # pad remaining bytes to make 8 + msg.append(0) + msg.append(0) + msg.append(0) + msg.append(0) + msg.append(0) + msg.append(0) + self.can_sock.send(0x3e9, bytes(msg), 0) + + # Sleep 100 ms + time.sleep(0.1) + +def main(): + parser = argparse.ArgumentParser(description='Simple CAN vehicle simulator.') + parser.add_argument('interface', type=str, help='interface name (e.g. vcan0)') + parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true') + args = parser.parse_args() + + try: + can_sock = CANSocket(args.interface) + diag_can_sock = CANSocket(args.interface) + steeringwheel_can_sock = CANSocket(args.interface) + except OSError as e: + sys.stderr.write('Could not listen on interface {0}\n'.format(args.interface)) + sys.exit(e.errno) + + print('Using {0}'.format(args.interface)) + sim = VehicleSimulator() + status_sender = StatusMessageSender(can_sock, sim, args.verbose) + diag_handler = DiagnosticMessageHandler(diag_can_sock, sim, args.verbose) + steeringwheel_handler = SteeringWheelMessageHandler(steeringwheel_can_sock, sim, args.verbose) + sim.start() + status_sender.start() + diag_handler.start() + steeringwheel_handler.start() + try: + while True: + time.sleep(60) + except (KeyboardInterrupt, SystemExit): + #sim.stop() + sys.exit(0) + +if __name__ == '__main__': + main() diff --git a/recipes-demo/simple-can-simulator/simple-can-simulator.bb b/recipes-demo/simple-can-simulator/simple-can-simulator.bb new file mode 100644 index 000000000..bca448763 --- /dev/null +++ b/recipes-demo/simple-can-simulator/simple-can-simulator.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Simulator that generates CAN messages of a driving car" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://simple_can_simulator.py" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +do_install() { + install -d ${D}${sbindir} + install -m 0755 ${WORKDIR}/simple_can_simulator.py ${D}${sbindir} +} + +RDEPENDS_${PN} = "python3" diff --git a/recipes-demo-hmi/taskmanager/taskmanager_git.bb b/recipes-demo/taskmanager/taskmanager_git.bb similarity index 100% rename from recipes-demo-hmi/taskmanager/taskmanager_git.bb rename to recipes-demo/taskmanager/taskmanager_git.bb diff --git a/recipes-demo/telematics-recorder/telematics-recorder_git.bb b/recipes-demo/telematics-recorder/telematics-recorder_git.bb new file mode 100644 index 000000000..1636cb000 --- /dev/null +++ b/recipes-demo/telematics-recorder/telematics-recorder_git.bb @@ -0,0 +1,25 @@ +SUMMARY = "Telematics Recorder AGL Demonstration" +DESCRIPTION = "AGL Application for demonstrating telematics recorder functionality" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-telematics-demo-recorder" +SECTION = "apps" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-telematics-demo-recorder;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AUTOREV}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +# build-time dependencies +DEPENDS = "glib-2.0 mosquitto" + +inherit cmake aglwgt + +RDEPENDS_${PN} += " \ + agl-service-can-low-level \ + agl-service-gps \ + agl-service-network \ + libmosquitto1 \ +" diff --git a/recipes-demo-hmi/waltham-receiver/waltham-receiver_git.bb b/recipes-demo/waltham-receiver/waltham-receiver_git.bb similarity index 100% rename from recipes-demo-hmi/waltham-receiver/waltham-receiver_git.bb rename to recipes-demo/waltham-receiver/waltham-receiver_git.bb diff --git a/recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb b/recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb new file mode 100644 index 000000000..4c0bda071 --- /dev/null +++ b/recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb @@ -0,0 +1,17 @@ +SUMMARY = "Low level CAN generator" +DESCRIPTION = "Generator used to customize low level CAN service with customs signals" +SECTION = "devel" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit cmake pkgconfig +BBCLASSEXTEND = "nativesdk" +DEPENDS = " cmake-apps-module" + +SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/src/low-level-can-generator;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "0a3e354c3d81866e1a755367ab5592b3ced868bb" + +PV = "${AGLVERSION}" +S = "${WORKDIR}/git" + diff --git a/recipes-devtools/python/python3-asyncssh_2.3.0.bb b/recipes-devtools/python/python3-asyncssh_2.3.0.bb new file mode 100644 index 000000000..ab7e8afa9 --- /dev/null +++ b/recipes-devtools/python/python3-asyncssh_2.3.0.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "\ +AsyncSSH is a Python package which provides an asynchronous client and \ +server implementation of the SSHv2 protocol on top of the Python \ +asyncio framework." +HOMEPAGE = "https://github.com/ronf/asyncssh" +LICENSE = "EPL-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=d9fc0efef5228704e7f5b37f27192723" + +SRC_URI[sha256sum] = "44bda34c7123f00c3df95d24e2dc8d43c4d17b456fbb8c434ef4f4a7ebb5265e" + +inherit pypi setuptools3 + +RDEPENDS_${PN} += "${PYTHON_PN}-asyncio ${PYTHON_PN}-cryptography" + +BBCLASSEXTEND = "native" diff --git a/recipes-devtools/python/python3-pytest-dependency_0.5.1.bb b/recipes-devtools/python/python3-pytest-dependency_0.5.1.bb new file mode 100644 index 000000000..5ff2d4ecf --- /dev/null +++ b/recipes-devtools/python/python3-pytest-dependency_0.5.1.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "pytest-dependency manages dependencies of tests." +HOMEPAGE = "https://github.com/RKrahl/pytest-dependency" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://README.rst;md5=35b9938ae48d25e6b8306232e98463dd" + +SRC_URI[sha256sum] = "c2a892906192663f85030a6ab91304e508e546cddfe557d692d61ec57a1d946b" + +inherit pypi setuptools3 + +DEPENDS += "${PYTHON_PN}-pytest-native" + +BBCLASSEXTEND = "native" diff --git a/recipes-devtools/python/python3-pytest-reverse_1.0.1.bb b/recipes-devtools/python/python3-pytest-reverse_1.0.1.bb new file mode 100644 index 000000000..5ed9b1d9d --- /dev/null +++ b/recipes-devtools/python/python3-pytest-reverse_1.0.1.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "pytest-reverse is a pytest plugin to reverse test order" +HOMEPAGE = "https://github.com/adamchainz/pytest-reverse" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=caf1f407ae86ecd57ab721dff94079b7" + +SRC_URI[sha256sum] = "40cbc47df8a262fed778e500f4d0b17d2d08ef8b9fbf899c0bab9488be192aac" + +inherit pypi setuptools3 + +DEPENDS += "${PYTHON_PN}-pytest-native" + +BBCLASSEXTEND = "native" diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts new file mode 100755 index 000000000..1d1a5a059 --- /dev/null +++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Copyright 2017 IoT.bzh. + +# Author: Ronan Le Martret +# + +# The following script will run all the scriptlets found in #SYSCONFDIR#/agl-postinsts. + +agl_pi_dir="#SYSCONFDIR#/agl-postinsts" + +POSTINST_LOGGING=1 +LOGFILE=/var/log/agl-postinstall.log + +[ -e $LOGFILE ] && mv ${LOGFILE} ${LOGFILE}.old.$(date +%F--%H%M.%S) + +append_log=">>$LOGFILE 2>&1" + +exec_postinst_scriptlets() { + for i in `ls $agl_pi_dir`; do + i=$agl_pi_dir/$i + echo "Running postinst $i..." + [ "$POSTINST_LOGGING" = "1" ] && eval echo "Running postinst $i..." $append_log + if [ -x $i ]; then + eval sh -c $i $append_log + if [ $? -eq 0 ]; then + rm $i + else + echo "ERROR: postinst $i failed." + [ "$POSTINST_LOGGING" = "1" ] && eval echo "ERROR: postinst $i failed." $append_log + remove_agl_pi_dir=0 + fi + else + echo "ERROR: postinst $i do not exists or do not have execute permission." + [ "$POSTINST_LOGGING" = "1" ] && eval echo "ERROR: postinst $i do not exists or do not have execute permission." $append_log + remove_agl_pi_dir=0 + fi + done +} + +remove_agl_pi_dir=1 +exec_postinst_scriptlets +systemctl daemon-reload + +# since all postinstalls executed successfully, remove the postinstalls directory +if [ $remove_agl_pi_dir = 1 ]; then + rm -rf $agl_pi_dir +fi diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service new file mode 100644 index 000000000..8f8667db6 --- /dev/null +++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service @@ -0,0 +1,17 @@ +[Unit] +Description=Run pending agl postinsts +DefaultDependencies=no +After=#SYSTEMD_SERVICE_AFTER# +Before=#SYSTEMD_SERVICE_BEFORE# +ConditionPathExists=#SYSCONFDIR#/agl-postinsts + +[Service] +Type=oneshot +StandardOutput=journal+console +ExecStart=#SBINDIR#/run-agl-postinsts +ExecStartPost=#BASE_BINDIR#/systemctl disable run-agl-postinsts.service +RemainAfterExit=No +TimeoutSec=0 + +[Install] +WantedBy=multi-user.target diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb new file mode 100644 index 000000000..31503aa2f --- /dev/null +++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb @@ -0,0 +1,46 @@ +SUMMARY = "Runs AGL postinstall scripts on first boot of the target device" +SECTION = "devel" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = "file://run-agl-postinsts \ + file://run-agl-postinsts.service" + +S = "${WORKDIR}" + +inherit allarch systemd + +SYSTEMD_SERVICE_${PN} = "run-agl-postinsts.service" + +SYSTEMD_SERVICE_AFTER ?= "dbus.service cynagora.service" + +SYSTEMD_SERVICE_BEFORE ?= "systemd-user-sessions.service" + +do_configure() { + : +} + +do_compile () { + : +} + +do_install() { + install -d ${D}${sbindir} + install -m 0755 ${WORKDIR}/run-agl-postinsts ${D}${sbindir}/ + + install -d ${D}${systemd_unitdir}/system/ + install -m 0644 ${WORKDIR}/run-agl-postinsts.service ${D}${systemd_unitdir}/system/ + + sed -i -e 's:#SYSCONFDIR#:${sysconfdir}:g' \ + -e 's:#SBINDIR#:${sbindir}:g' \ + -e 's:#BASE_BINDIR#:${base_bindir}:g' \ + -e 's:#LOCALSTATEDIR#:${localstatedir}:g' \ + ${D}${sbindir}/run-agl-postinsts \ + ${D}${systemd_unitdir}/system/run-agl-postinsts.service + + sed -i -e 's:#SYSTEMD_SERVICE_AFTER#:${SYSTEMD_SERVICE_AFTER}:g' \ + -e 's:#SYSTEMD_SERVICE_BEFORE#:${SYSTEMD_SERVICE_BEFORE}:g' \ + ${D}${systemd_unitdir}/system/run-agl-postinsts.service +} + diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend new file mode 100644 index 000000000..590ab708a --- /dev/null +++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend @@ -0,0 +1 @@ +SYSTEMD_SERVICE_AFTER_append = " afm-system-daemon.service" diff --git a/recipes-graphics/hmi-debug/files/hmi-debug b/recipes-graphics/hmi-debug/files/hmi-debug new file mode 100644 index 000000000..fee9573b7 --- /dev/null +++ b/recipes-graphics/hmi-debug/files/hmi-debug @@ -0,0 +1,8 @@ +#You can select log level of HMI framework +#1 ERROR +#2 WARNING +#3 NOTICE +#4 INFO +#5 DEBUG +#If you want to output debug log about hmi-framework, please uncomment the following. +#USE_HMI_DEBUG=5 diff --git a/recipes-graphics/hmi-debug/hmi-debug_git.bb b/recipes-graphics/hmi-debug/hmi-debug_git.bb new file mode 100644 index 000000000..27fb60d66 --- /dev/null +++ b/recipes-graphics/hmi-debug/hmi-debug_git.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "Configurations for HMI framework" + +SECTION = "HMI" +LICENSE = "Apache-2.0" + +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI = " \ + file://hmi-debug \ +" + +FILES_${PN} = " \ + ${sysconfdir}/afm/unit.env.d \ +" + +do_install() { + install -d ${D}${sysconfdir}/afm/unit.env.d + install -m 644 ${WORKDIR}/hmi-debug ${D}${sysconfdir}/afm/unit.env.d +} diff --git a/recipes-graphics/kms-conf/kms-conf/kms.conf b/recipes-graphics/kms-conf/kms-conf/kms.conf new file mode 100644 index 000000000..7fa9686e2 --- /dev/null +++ b/recipes-graphics/kms-conf/kms-conf/kms.conf @@ -0,0 +1,8 @@ +{ + "device": "/dev/dri/card0", + "outputs": [ + { + "name":"HDMI-A-1" + } + ] +} diff --git a/recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf b/recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf new file mode 100644 index 000000000..16ea328f2 --- /dev/null +++ b/recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf @@ -0,0 +1,12 @@ +{ + "device": "/dev/dri/card0", + "outputs": [ + { + "name":"HDMI-A-1" + }, + { + "name":"LVDS1", + "mode":"off" + } + ] +} diff --git a/recipes-graphics/kms-conf/kms-conf_1.0.bb b/recipes-graphics/kms-conf/kms-conf_1.0.bb new file mode 100644 index 000000000..b063f65ff --- /dev/null +++ b/recipes-graphics/kms-conf/kms-conf_1.0.bb @@ -0,0 +1,12 @@ +SUMMARY = "kms configuration file for the qt eglfs platform" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = " \ + file://kms.conf \ +" + +do_install_append() { + install -d ${D}/etc + install -m 644 ${WORKDIR}/kms.conf ${D}/etc +} diff --git a/recipes-graphics/libhomescreen/libhomescreen_git.bb b/recipes-graphics/libhomescreen/libhomescreen_git.bb new file mode 100644 index 000000000..da511c8a1 --- /dev/null +++ b/recipes-graphics/libhomescreen/libhomescreen_git.bb @@ -0,0 +1,19 @@ +SUMMARY = "AGL Home Screen Library" +DESCRIPTION = "libhomescreen" +HOMEPAGE = "http://docs.automotivelinux.org" +LICENSE = "Apache-2.0" +SECTION = "libs" + +BBCLASSEXTEND = " nativesdk" + +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +DEPENDS = "af-binder json-c" + +inherit cmake + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/libhomescreen.git;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "0d65d54ba63508c0ef545d02e94d5702f9c8ecb3" +S = "${WORKDIR}/git" + +RDEPENDS_${PN} = "agl-service-homescreen" diff --git a/recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb b/recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb new file mode 100644 index 000000000..09a262eb7 --- /dev/null +++ b/recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb @@ -0,0 +1,13 @@ +SUMMARY = "A wrapper library of libhomescreen for Qt Application in AGL" +SECTION = "libs" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93" + +DEPENDS = "qtbase libhomescreen" +RDEPENDS_${PN} = "libhomescreen" + +inherit qmake5 + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/libqthomescreen.git;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "b218476402bceda7eb42d41064552a7261ff3205" +S = "${WORKDIR}/git" diff --git a/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend b/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend index 159865860..86a5d90ca 100644 --- a/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend +++ b/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend @@ -1,12 +1 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/files:" -DEPENDS += "fontforge-native" - -# From the orginal work located at https://aur.archlinux.org/packages/ttf-dejavu-emojiless/ - -SRC_URI_append = " file://cleaner.py" - -do_install_prepend() { - for TTF in ${S}/*.ttf; do - fontforge -script ${WORKDIR}/cleaner.py ${TTF} - done -} +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'ttf-dejavu_agldemo.inc', '', d)} diff --git a/recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc b/recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc new file mode 100644 index 000000000..bb47bdc73 --- /dev/null +++ b/recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc @@ -0,0 +1,12 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +DEPENDS_append = " fontforge-native" + +# From the orginal work located at https://aur.archlinux.org/packages/ttf-dejavu-emojiless/ + +SRC_URI_append = " file://cleaner.py" + +do_install_prepend() { + for TTF in ${S}/*.ttf; do + fontforge -script ${WORKDIR}/cleaner.py ${TTF} + done +} diff --git a/recipes-graphics/wayland/weston-init.bbappend b/recipes-graphics/wayland/weston-init.bbappend new file mode 100644 index 000000000..8af3184af --- /dev/null +++ b/recipes-graphics/wayland/weston-init.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'weston-init_agldemo.inc', '', d)} diff --git a/recipes-graphics/wayland/weston-init/tmpfiles.conf.in b/recipes-graphics/wayland/weston-init/tmpfiles.conf.in new file mode 100644 index 000000000..c4b302faf --- /dev/null +++ b/recipes-graphics/wayland/weston-init/tmpfiles.conf.in @@ -0,0 +1,6 @@ +# This file is distributed to create weston XDG_RUNTIME_DIR (/run/deamon/@WESTONUSER@) +# +# See tmpfiles.d(5) for details + +d /run/platform/ 0775 root root - +d /run/platform/@WESTONUSER@ 0770 @WESTONUSER@ @WESTONGROUP@ - diff --git a/recipes-graphics/wayland/weston-init/weston-dep.conf.in b/recipes-graphics/wayland/weston-init/weston-dep.conf.in new file mode 100644 index 000000000..2b8102096 --- /dev/null +++ b/recipes-graphics/wayland/weston-init/weston-dep.conf.in @@ -0,0 +1,3 @@ +[Unit] +Requires=@WESTON_DRM_DEVICE@ +After=@WESTON_DRM_DEVICE@ diff --git a/recipes-graphics/wayland/weston-init/weston.conf.in b/recipes-graphics/wayland/weston-init/weston.conf.in new file mode 100644 index 000000000..9c3df052d --- /dev/null +++ b/recipes-graphics/wayland/weston-init/weston.conf.in @@ -0,0 +1,12 @@ +[Service] +Type=notify +Environment="XDG_RUNTIME_DIR=@XDG_RUNTIME_DIR@" +# Note that clearing PAMName (thus not having PAMName=login) disables +# logind support for the session, which allows setting XDG_RUNTIME_DIR +# to something other than /run/user/% (as is done above). +# Without systemd-logind support, weston needs to be patched to allow +# its direct launcher to work for non-root users in this scenario. +PAMName= +ExecStart= +ExecStart=@WESTONSTART@ +SmackProcessLabel=System::Weston diff --git a/recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in b/recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in new file mode 100644 index 000000000..585db6be8 --- /dev/null +++ b/recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in @@ -0,0 +1,2 @@ +SUBSYSTEM=="gpu_class", MODE="0660", GROUP="@WESTONGROUP@", SECLABEL{smack}="*" + diff --git a/recipes-graphics/wayland/weston-init/zz-dri.rules.in b/recipes-graphics/wayland/weston-init/zz-dri.rules.in new file mode 100644 index 000000000..51c68c303 --- /dev/null +++ b/recipes-graphics/wayland/weston-init/zz-dri.rules.in @@ -0,0 +1 @@ +SUBSYSTEM=="drm", MODE="0660", GROUP="@WESTONGROUP@", SECLABEL{smack}="*", TAG+="systemd", ENV{SYSTEMD_WANTS}="weston@@WESTONUSER@.service" diff --git a/recipes-graphics/wayland/weston-init/zz-input.rules.in b/recipes-graphics/wayland/weston-init/zz-input.rules.in new file mode 100644 index 000000000..fb3e677f4 --- /dev/null +++ b/recipes-graphics/wayland/weston-init/zz-input.rules.in @@ -0,0 +1 @@ +SUBSYSTEM=="input", MODE="0660", GROUP="input", SECLABEL{smack}="*", TAG+="systemd", ENV{SYSTEMD_WANTS}="weston@@WESTONUSER@.service" diff --git a/recipes-graphics/wayland/weston-init/zz-tty.rules.in b/recipes-graphics/wayland/weston-init/zz-tty.rules.in new file mode 100644 index 000000000..e5ce4b553 --- /dev/null +++ b/recipes-graphics/wayland/weston-init/zz-tty.rules.in @@ -0,0 +1 @@ +SUBSYSTEM=="tty", KERNEL=="tty7", OWNER="@WESTONUSER@", SECLABEL{smack}="*", TAG+="systemd", ENV{SYSTEMD_WANTS}="weston@@WESTONUSER@.service" diff --git a/recipes-graphics/wayland/weston-init_agldemo.inc b/recipes-graphics/wayland/weston-init_agldemo.inc new file mode 100644 index 000000000..a5f0b09b5 --- /dev/null +++ b/recipes-graphics/wayland/weston-init_agldemo.inc @@ -0,0 +1,77 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/weston-init:" + +inherit agl-graphical + +AGL_DEFAULT_WESTONSTART ??= "/usr/bin/agl-compositor --config ${sysconfdir}/xdg/weston/weston.ini" + +WESTONSTART ??= "${AGL_DEFAULT_WESTONSTART} ${WESTONARGS}" +WESTONSTART_append = " ${@bb.utils.contains("IMAGE_FEATURES", "debug-tweaks", " --log=${DISPLAY_XDG_RUNTIME_DIR}/compositor.log", "",d)}" + +# Systemd name of DRM device to have weston/agl-compositor startup depend +# upon, if required. Currently only x86-64 seems to need a dependency to +# avoid failures due to racing with i915 driver init on e.g. UpSquared. +# It seems safer for now to only apply it there rather than doing a blanket +# default everywhere that might then need to be over-ridden for vendor BSPs. +WESTON_DRM_DEVICE ?= "" + +WIFILES = " \ + file://weston.conf.in \ + file://weston-dep.conf.in \ + file://tmpfiles.conf.in \ + file://zz-dri.rules.in \ + file://zz-input.rules.in \ + file://zz-tty.rules.in \ +" + +WIFILES_append_imx = " \ + file://zz-dri-imx.rules.in \ +" + +SRC_URI_append = " ${WIFILES}" + +do_install_append() { + # Remove upstream weston udev rules just to be safe + rm -f ${D}${sysconfdir}/udev/rules.d/71-weston-drm.rules + + # Process ".in" files + files=$(echo ${WIFILES} | sed s,file://,,g) + for f in ${files}; do + g=${f%.in} + if [ "${f}" != "${g}" ]; then + sed -e "s,@WESTONUSER@,${WESTONUSER},g" \ + -e "s,@WESTONGROUP@,${WESTONGROUP},g" \ + -e "s,@XDG_RUNTIME_DIR@,${DISPLAY_XDG_RUNTIME_DIR},g" \ + -e "s,@WESTONSTART@,${WESTONSTART},g" \ + -e "s,@WESTON_DRM_DEVICE@,${WESTON_DRM_DEVICE},g" \ + ${WORKDIR}/${f} > ${WORKDIR}/${g} + fi + done + + # Install weston drop-in + install -d ${D}${systemd_system_unitdir}/weston@.service.d + install -m644 ${WORKDIR}/weston.conf ${D}/${systemd_system_unitdir}/weston@.service.d/weston-init.conf + + # Install weston DRM device dependency drop-in if required + if [ -n "${WESTON_DRM_DEVICE}" ]; then + install -m 0644 ${WORKDIR}/weston-dep.conf ${D}/${systemd_system_unitdir}/weston@.service.d/ + fi + + # Install tmpfiles drop-in + install -d ${D}${libdir}/tmpfiles.d + install -m644 ${WORKDIR}/tmpfiles.conf ${D}${libdir}/tmpfiles.d/weston-init.conf + + # Install udev rules + install -d ${D}${sysconfdir}/udev/rules.d + for f in ${files}; do + g=${f%.in} + h=${g%.rules} + if [ "${g}" != "${h}" ]; then + install -m644 ${WORKDIR}/${g} ${D}${sysconfdir}/udev/rules.d + fi + done +} + +FILES_${PN} += " \ + ${libdir}/tmpfiles.d/ \ + ${systemd_system_unitdir}/weston@.service.d/ \ +" diff --git a/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch b/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch new file mode 100644 index 000000000..dd811c81b --- /dev/null +++ b/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch @@ -0,0 +1,472 @@ +From 9cb7cb85f59509ac445116e9458c502cf6cb74e6 Mon Sep 17 00:00:00 2001 +From: Christian Gromm +Date: Thu, 9 Nov 2017 13:20:23 +0100 +Subject: [PATCH 2/2] src: most: add auto conf feature + +This patch adds the auto configuration feature to the driver +sources. It is needed to have the driver configured automatically +upon start up w/o the need for userspace to set up sysfs. + +Signed-off-by: Christian Gromm +--- + driver/Makefile | 3 + + driver/default_conf.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++ + driver/include/mostcore.h | 64 ++++++++++++++++++ + driver/mostcore/core.c | 120 ++++++++++++++++++++++++++++------ + 4 files changed, 331 insertions(+), 18 deletions(-) + create mode 100644 driver/default_conf.c + +diff --git a/Makefile b/Makefile +index e77a4b6..6d74ebe 100644 +--- a/Makefile ++++ b/Makefile +@@ -6,6 +6,9 @@ obj-m := mostcore.o + mostcore-y := mostcore/core.o + CFLAGS_core.o := -I$(src)/include/ + ++obj-m += default_conf.o ++CFLAGL_default_conf.o := -I$(src)/include ++ + obj-m += aim_cdev.o + aim_cdev-y := aim-cdev/cdev.o + CFLAGS_cdev.o := -I$(src)/include/ +diff --git a/default_conf.c b/default_conf.c +new file mode 100644 +index 0000000..adb1786 +--- /dev/null ++++ b/default_conf.c +@@ -0,0 +1,162 @@ ++/* ++ * default_conf.c - Default configuration for the MOST channels. ++ * ++ * Copyright (C) 2017, Microchip Technology Germany II GmbH & Co. KG ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * This file is licensed under GPLv2. ++ */ ++ ++#include "include/mostcore.h" ++#include ++ ++static struct most_config_probe config_probes[] = { ++ ++ /* OS81118 Control */ ++ { ++ .ch_name = "ep8f", ++ .cfg = { ++ .direction = MOST_CH_RX, ++ .data_type = MOST_CH_CONTROL, ++ .num_buffers = 16, ++ .buffer_size = 64, ++ }, ++ .aim_name = "cdev", ++ .aim_param = "inic-usb-crx", ++ }, ++ { ++ .ch_name = "ep0f", ++ .cfg = { ++ .direction = MOST_CH_TX, ++ .data_type = MOST_CH_CONTROL, ++ .num_buffers = 16, ++ .buffer_size = 64, ++ }, ++ .aim_name = "cdev", ++ .aim_param = "inic-usb-ctx", ++ }, ++ /* OS81118 Async */ ++ { ++ .ch_name = "ep8e", ++ .cfg = { ++ .direction = MOST_CH_RX, ++ .data_type = MOST_CH_ASYNC, ++ .num_buffers = 20, ++ .buffer_size = 1522, ++ }, ++ .aim_name = "networking", ++ .aim_param = "inic-usb-arx", ++ }, ++ { ++ .ch_name = "ep0e", ++ .cfg = { ++ .direction = MOST_CH_TX, ++ .data_type = MOST_CH_ASYNC, ++ .num_buffers = 20, ++ .buffer_size = 1522, ++ }, ++ .aim_name = "networking", ++ .aim_param = "inic-usb-atx", ++ }, ++ /* OS81210 Control */ ++ { ++ .ch_name = "ep87", ++ .cfg = { ++ .direction = MOST_CH_RX, ++ .data_type = MOST_CH_CONTROL, ++ .num_buffers = 16, ++ .buffer_size = 64, ++ }, ++ .aim_name = "cdev", ++ .aim_param = "inic-usb-crx", ++ }, ++ { ++ .ch_name = "ep07", ++ .cfg = { ++ .direction = MOST_CH_TX, ++ .data_type = MOST_CH_CONTROL, ++ .num_buffers = 16, ++ .buffer_size = 64, ++ }, ++ .aim_name = "cdev", ++ .aim_param = "inic-usb-ctx", ++ }, ++ /* OS81210 Async */ ++ { ++ .ch_name = "ep86", ++ .cfg = { ++ .direction = MOST_CH_RX, ++ .data_type = MOST_CH_ASYNC, ++ .num_buffers = 20, ++ .buffer_size = 1522, ++ }, ++ .aim_name = "networking", ++ .aim_param = "inic-usb-arx", ++ }, ++ { ++ .ch_name = "ep06", ++ .cfg = { ++ .direction = MOST_CH_TX, ++ .data_type = MOST_CH_ASYNC, ++ .num_buffers = 20, ++ .buffer_size = 1522, ++ }, ++ .aim_name = "networking", ++ .aim_param = "inic-usb-atx", ++ }, ++ /* Streaming channels (common for all INICs) */ ++ { ++ .ch_name = "ep01", ++ .cfg = { ++ .direction = MOST_CH_TX, ++ .data_type = MOST_CH_SYNC, ++ .num_buffers = 8, ++ .buffer_size = 2 * 12 * 42, ++ .subbuffer_size = 12, ++ .packets_per_xact = 42, ++ }, ++ .aim_name = "sound", ++ .aim_param = "ep01-6ch.6x16", ++ }, ++ { ++ .ch_name = "ep02", ++ .cfg = { ++ .direction = MOST_CH_TX, ++ .data_type = MOST_CH_ISOC, ++ .num_buffers = 8, ++ .buffer_size = 40 * 188, ++ .subbuffer_size = 188, ++ .packets_per_xact = 2, ++ }, ++ .aim_name = "cdev", ++ .aim_param = "inic-usb-itx1", ++ }, ++ ++ /* sentinel */ ++ {} ++}; ++ ++static struct most_config_set config_set = { ++ .probes = config_probes ++}; ++ ++static int __init mod_init(void) ++{ ++ most_register_config_set(&config_set); ++ return 0; ++} ++ ++static void __exit mod_exit(void) ++{ ++ most_deregister_config_set(&config_set); ++} ++ ++module_init(mod_init); ++module_exit(mod_exit); ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Andrey Shvetsov "); ++MODULE_DESCRIPTION("Default configuration for the MOST channels"); +diff --git a/include/mostcore.h b/include/mostcore.h +index dc87121..3c00efb 100644 +--- a/include/mostcore.h ++++ b/include/mostcore.h +@@ -145,6 +145,39 @@ struct most_channel_config { + u16 dbr_size; + }; + ++/** ++ * struct most_config_probe - matching rule, channel configuration and ++ * the optional AIM name used for the automatic configuration and linking ++ * of the channel ++ * @dev_name: optional matching device id ++ * ("usb_device 1-1:1.0," "dim2-12345678", etc.) ++ * @ch_name: matching channel name ("ep8f", "ca2", etc.) ++ * @cfg: configuration that will be applied for the found channel ++ * @aim_name: optional name of the AIM that will be linked to the channel ++ * ("cdev", "networking", "v4l", "sound") ++ * @aim_param: AIM dependent parameter (it is the character device name ++ * for the cdev AIM, PCM format for the audio AIM, etc.) ++ */ ++struct most_config_probe { ++ const char *dev_name; ++ const char *ch_name; ++ struct most_channel_config cfg; ++ const char *aim_name; ++ const char *aim_param; ++}; ++ ++/** ++ * struct most_config_set - the configuration set containing ++ * several automatic configurations for the different channels ++ * @probes: list of the matching rules and the configurations, ++ * that must be ended with the empty structure ++ * @list: list head used by the MostCore ++ */ ++struct most_config_set { ++ const struct most_config_probe *probes; ++ struct list_head list; ++}; ++ + /* + * struct mbo - MOST Buffer Object. + * @context: context for core completion handler +@@ -285,6 +318,37 @@ struct most_aim { + }; + + /** ++ * most_register_config_set - registers the configuration set ++ * ++ * @cfg_set: configuration set to be registered for the future probes ++ * ++ * The function registers the given configuration set. ++ * ++ * It is possible to register or deregister several configuration sets ++ * independently. Different configuration sets may contain the ++ * overlapped matching rules but later registered configuration set has ++ * the higher priority over the prior registered set. ++ * ++ * The only the first matched configuration is applied for each ++ * channel. ++ * ++ * The configuration for the channel is applied at the time of ++ * registration of the parent most_interface. ++ */ ++void most_register_config_set(struct most_config_set *cfg_set); ++ ++/** ++ * most_deregister_config_set - deregisters the prior registered ++ * configuration set ++ * ++ * @cfg_set: configuration set to be deregistered ++ * ++ * The calling of this function does not change the current ++ * configuration of the channels. ++ */ ++void most_deregister_config_set(struct most_config_set *cfg_set); ++ ++/** + * most_register_interface - Registers instance of the interface. + * @iface: Pointer to the interface instance description. + * +diff --git a/mostcore/core.c b/mostcore/core.c +index 9e0a352..6035cf0 100644 +--- a/mostcore/core.c ++++ b/mostcore/core.c +@@ -36,6 +36,8 @@ static struct class *most_class; + static struct device *core_dev; + static struct ida mdev_id; + static int dummy_num_buffers; ++static struct list_head config_probes; ++struct mutex config_probes_mt; /* config_probes */ + + struct most_c_aim_obj { + struct most_aim *ptr; +@@ -918,6 +920,30 @@ most_c_obj *get_channel_by_name(char *mdev, char *mdev_ch) + return c; + } + ++static int link_channel_to_aim(struct most_c_obj *c, struct most_aim *aim, ++ char *aim_param) ++{ ++ int ret; ++ struct most_aim **aim_ptr; ++ ++ if (!c->aim0.ptr) ++ aim_ptr = &c->aim0.ptr; ++ else if (!c->aim1.ptr) ++ aim_ptr = &c->aim1.ptr; ++ else ++ return -ENOSPC; ++ ++ *aim_ptr = aim; ++ ret = aim->probe_channel(c->iface, c->channel_id, ++ &c->cfg, &c->kobj, aim_param); ++ if (ret) { ++ *aim_ptr = NULL; ++ return ret; ++ } ++ ++ return 0; ++} ++ + /** + * add_link_store - store() function for add_link attribute + * @aim_obj: pointer to AIM object +@@ -946,45 +972,33 @@ static ssize_t add_link_store(struct most_aim_obj *aim_obj, + size_t len) + { + struct most_c_obj *c; +- struct most_aim **aim_ptr; + char buffer[STRING_SIZE]; + char *mdev; + char *mdev_ch; +- char *mdev_devnod; ++ char *aim_param; + char devnod_buf[STRING_SIZE]; + int ret; + size_t max_len = min_t(size_t, len + 1, STRING_SIZE); + + strlcpy(buffer, buf, max_len); + +- ret = split_string(buffer, &mdev, &mdev_ch, &mdev_devnod); ++ ret = split_string(buffer, &mdev, &mdev_ch, &aim_param); + if (ret) + return ret; + +- if (!mdev_devnod || *mdev_devnod == 0) { ++ if (!aim_param || *aim_param == 0) { + snprintf(devnod_buf, sizeof(devnod_buf), "%s-%s", mdev, + mdev_ch); +- mdev_devnod = devnod_buf; ++ aim_param = devnod_buf; + } + + c = get_channel_by_name(mdev, mdev_ch); + if (IS_ERR(c)) + return -ENODEV; + +- if (!c->aim0.ptr) +- aim_ptr = &c->aim0.ptr; +- else if (!c->aim1.ptr) +- aim_ptr = &c->aim1.ptr; +- else +- return -ENOSPC; +- +- *aim_ptr = aim_obj->driver; +- ret = aim_obj->driver->probe_channel(c->iface, c->channel_id, +- &c->cfg, &c->kobj, mdev_devnod); +- if (ret) { +- *aim_ptr = NULL; ++ ret = link_channel_to_aim(c, aim_obj->driver, aim_param); ++ if (ret) + return ret; +- } + + return len; + } +@@ -1679,6 +1693,73 @@ int most_deregister_aim(struct most_aim *aim) + } + EXPORT_SYMBOL_GPL(most_deregister_aim); + ++void most_register_config_set(struct most_config_set *cfg_set) ++{ ++ mutex_lock(&config_probes_mt); ++ list_add(&cfg_set->list, &config_probes); ++ mutex_unlock(&config_probes_mt); ++} ++EXPORT_SYMBOL(most_register_config_set); ++ ++void most_deregister_config_set(struct most_config_set *cfg_set) ++{ ++ mutex_lock(&config_probes_mt); ++ list_del(&cfg_set->list); ++ mutex_unlock(&config_probes_mt); ++} ++EXPORT_SYMBOL(most_deregister_config_set); ++ ++static int probe_aim(struct most_c_obj *c, ++ const char *aim_name, const char *aim_param) ++{ ++ struct most_aim_obj *aim_obj; ++ char buf[STRING_SIZE]; ++ ++ list_for_each_entry(aim_obj, &aim_list, list) { ++ if (!strcmp(aim_obj->driver->name, aim_name)) { ++ strlcpy(buf, aim_param ? aim_param : "", sizeof(buf)); ++ return link_channel_to_aim(c, aim_obj->driver, buf); ++ } ++ } ++ return 0; ++} ++ ++static bool probe_config_set(struct most_c_obj *c, ++ const char *dev_name, const char *ch_name, ++ const struct most_config_probe *p) ++{ ++ int err; ++ ++ for (; p->ch_name; p++) { ++ if ((p->dev_name && strcmp(dev_name, p->dev_name)) || ++ strcmp(ch_name, p->ch_name)) ++ continue; ++ ++ c->cfg = p->cfg; ++ if (p->aim_name) { ++ err = probe_aim(c, p->aim_name, p->aim_param); ++ if (err) ++ pr_err("failed to autolink %s to %s: %d\n", ++ ch_name, p->aim_name, err); ++ } ++ return true; ++ } ++ return false; ++} ++ ++static void find_configuration(struct most_c_obj *c, const char *dev_name, ++ const char *ch_name) ++{ ++ struct most_config_set *plist; ++ ++ mutex_lock(&config_probes_mt); ++ list_for_each_entry(plist, &config_probes, list) { ++ if (probe_config_set(c, dev_name, ch_name, plist->probes)) ++ break; ++ } ++ mutex_unlock(&config_probes_mt); ++} ++ + /** + * most_register_interface - registers an interface with core + * @iface: pointer to the instance of the interface description. +@@ -1777,6 +1858,7 @@ struct kobject *most_register_interface(struct most_interface *iface) + mutex_init(&c->start_mutex); + mutex_init(&c->nq_mutex); + list_add_tail(&c->list, &inst->channel_list); ++ find_configuration(c, iface->description, channel_name); + } + pr_info("registered new MOST device mdev%d (%s)\n", + inst->dev_id, iface->description); +@@ -1880,6 +1962,8 @@ static int __init most_init(void) + pr_info("init()\n"); + INIT_LIST_HEAD(&instance_list); + INIT_LIST_HEAD(&aim_list); ++ INIT_LIST_HEAD(&config_probes); ++ mutex_init(&config_probes_mt); + ida_init(&mdev_id); + + err = bus_register(&most_bus); +-- +2.7.4 + diff --git a/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch b/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch new file mode 100644 index 000000000..4703844a1 --- /dev/null +++ b/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch @@ -0,0 +1,26 @@ +From b269994be937cbb31c0d73ecc899ca8a545a6a4a Mon Sep 17 00:00:00 2001 +From: Christian Gromm +Date: Mon, 4 Sep 2017 11:09:17 +0200 +Subject: [PATCH 3/5] core: remove kernel log for MBO status + +Signed-off-by: Christian Gromm +--- + driver/mostcore/core.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/mostcore/core.c b/mostcore/core.c +index 931efb9..595becc 100644 +--- a/mostcore/core.c ++++ b/mostcore/core.c +@@ -1348,8 +1348,6 @@ static void most_write_completion(struct mbo *mbo) + BUG_ON((!mbo) || (!mbo->context)); + + c = mbo->context; +- if (mbo->status == MBO_E_INVAL) +- pr_info("WARN: Tx MBO status: invalid\n"); + if (unlikely(c->is_poisoned || (mbo->status == MBO_E_CLOSE))) + trash_mbo(mbo); + else +-- +2.7.4 + diff --git a/recipes-kernel/most/files/0004-most-video-set-device_caps.patch b/recipes-kernel/most/files/0004-most-video-set-device_caps.patch new file mode 100644 index 000000000..010d4b0d0 --- /dev/null +++ b/recipes-kernel/most/files/0004-most-video-set-device_caps.patch @@ -0,0 +1,25 @@ +From a5fd2ae8d4a3b2a8f7a33a4ea469ea7ee0d946ef Mon Sep 17 00:00:00 2001 +From: Christian Gromm +Date: Mon, 4 Sep 2017 15:36:38 +0200 +Subject: [PATCH 4/5] most: video: set device_caps + +Signed-off-by: Christian Gromm +--- + driver/aim-v4l2/video.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c +index e074841..6405a03 100644 +--- a/aim-v4l2/video.c ++++ b/aim-v4l2/video.c +@@ -263,6 +263,7 @@ static int vidioc_querycap(struct file *file, void *priv, + snprintf(cap->bus_info, sizeof(cap->bus_info), + "%s", mdev->iface->description); + ++ cap->device_caps = + cap->capabilities = + V4L2_CAP_READWRITE | + V4L2_CAP_TUNER | +-- +2.7.4 + diff --git a/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch b/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch new file mode 100644 index 000000000..ebaee9e14 --- /dev/null +++ b/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch @@ -0,0 +1,25 @@ +From 7518453386ad3e82008186a6c9ca86ed8c136801 Mon Sep 17 00:00:00 2001 +From: Christian Gromm +Date: Mon, 4 Sep 2017 16:08:38 +0200 +Subject: [PATCH 5/5] most: video: set V4L2_CAP_DEVICE_CAPS flag + +Signed-off-by: Christian Gromm +--- + driver/aim-v4l2/video.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c +index 6405a03..db75d4d 100644 +--- a/aim-v4l2/video.c ++++ b/aim-v4l2/video.c +@@ -265,6 +265,7 @@ static int vidioc_querycap(struct file *file, void *priv, + + cap->device_caps = + cap->capabilities = ++ V4L2_CAP_DEVICE_CAPS | + V4L2_CAP_READWRITE | + V4L2_CAP_TUNER | + V4L2_CAP_VIDEO_CAPTURE; +-- +2.7.4 + diff --git a/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch b/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch new file mode 100644 index 000000000..59c6ae671 --- /dev/null +++ b/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch @@ -0,0 +1,186 @@ +From 63bcd9b421ae7927948bffec9566db47f40ea290 Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +Date: Tue, 30 Jan 2018 17:34:09 +0100 +Subject: [PATCH] staging: most: dim2: fix startup sequence + +Platform specific initializations (pdata->init) must be done before DIM2 +IP module startup (dim_startup). + +Signed-off-by: Andrey Shvetsov +--- + hdm-dim2/dim2_hdm.c | 90 +++++++++++++++++++++++++++++++++++++++--------------------------------------------------- + 1 file changed, 39 insertions(+), 51 deletions(-) + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index 893b8e4..e4629a5 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -155,38 +155,6 @@ void dimcb_on_error(u8 error_id, const char *error_message) + } + + /** +- * startup_dim - initialize the dim2 interface +- * @pdev: platform device +- */ +-static int startup_dim(struct platform_device *pdev) +-{ +- struct dim2_hdm *dev = platform_get_drvdata(pdev); +- struct dim2_platform_data *pdata = pdev->dev.platform_data; +- u8 hal_ret; +- int ret; +- +- if (!pdata) { +- pr_err("missing platform data\n"); +- return -EINVAL; +- } +- +- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0; +- if (ret) +- return ret; +- +- pr_info("sync: num of frames per sub-buffer: %u\n", fcnt); +- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt); +- if (hal_ret != DIM_NO_ERROR) { +- pr_err("dim_startup failed: %d\n", hal_ret); +- if (pdata && pdata->destroy) +- pdata->destroy(pdata); +- return -ENODEV; +- } +- +- return 0; +-} +- +-/** + * try_start_dim_transfer - try to transfer a buffer on a channel + * @hdm_ch: channel specific data + * +@@ -727,10 +695,12 @@ static void dma_free(struct mbo *mbo, u32 size) + */ + static int dim2_probe(struct platform_device *pdev) + { ++ struct dim2_platform_data *pdata = pdev->dev.platform_data; + struct dim2_hdm *dev; + struct resource *res; + int ret, i; + struct kobject *kobj; ++ u8 hal_ret; + int irq; + + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); +@@ -745,38 +715,59 @@ static int dim2_probe(struct platform_device *pdev) + if (IS_ERR(dev->io_base)) + return PTR_ERR(dev->io_base); + ++ if (!pdata) { ++ dev_err(&pdev->dev, "missing platform data\n"); ++ return -EINVAL; ++ } ++ ++ ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0; ++ if (ret) ++ return ret; ++ ++ dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt); ++ hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt); ++ if (hal_ret != DIM_NO_ERROR) { ++ dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret); ++ ret = -ENODEV; ++ goto err_bsp_destroy; ++ } ++ + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq); +- return irq; ++ ret = irq; ++ goto err_shutdown_dim; + } + + ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0, + "dim2_ahb0_int", dev); + if (ret) { + dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq); +- return ret; ++ goto err_shutdown_dim; + } + + irq = platform_get_irq(pdev, 1); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq); +- return irq; ++ ret = irq; ++ goto err_shutdown_dim; + } + + ret = devm_request_irq(&pdev->dev, irq, dim2_mlb_isr, 0, + "dim2_mlb_int", dev); + if (ret) { + dev_err(&pdev->dev, "failed to request mlb_int irq %d\n", irq); +- return ret; ++ goto err_shutdown_dim; + } + + init_waitqueue_head(&dev->netinfo_waitq); + dev->deliver_netinfo = 0; +- dev->netinfo_task = kthread_run(&deliver_netinfo_thread, (void *)dev, ++ dev->netinfo_task = kthread_run(&deliver_netinfo_thread, dev, + "dim2_netinfo"); +- if (IS_ERR(dev->netinfo_task)) +- return PTR_ERR(dev->netinfo_task); ++ if (IS_ERR(dev->netinfo_task)) { ++ ret = PTR_ERR(dev->netinfo_task); ++ goto err_shutdown_dim; ++ } + + for (i = 0; i < DMA_CHANNELS; i++) { + struct most_channel_capability *cap = dev->capabilities + i; +@@ -833,20 +824,17 @@ static int dim2_probe(struct platform_device *pdev) + if (ret) + goto err_unreg_iface; + +- ret = startup_dim(pdev); +- if (ret) { +- dev_err(&pdev->dev, "failed to initialize DIM2\n"); +- goto err_destroy_bus; +- } +- + return 0; + +-err_destroy_bus: +- dim2_sysfs_destroy(&dev->bus); + err_unreg_iface: + most_deregister_interface(&dev->most_iface); + err_stop_thread: + kthread_stop(dev->netinfo_task); ++err_shutdown_dim: ++ dim_shutdown(); ++err_bsp_destroy: ++ if (pdata && pdata->destroy) ++ pdata->destroy(pdata); + + return ret; + } +@@ -863,6 +851,10 @@ static int dim2_remove(struct platform_device *pdev) + struct dim2_platform_data *pdata = pdev->dev.platform_data; + unsigned long flags; + ++ dim2_sysfs_destroy(&dev->bus); ++ most_deregister_interface(&dev->most_iface); ++ kthread_stop(dev->netinfo_task); ++ + spin_lock_irqsave(&dim_lock, flags); + dim_shutdown(); + spin_unlock_irqrestore(&dim_lock, flags); +@@ -870,10 +862,6 @@ static int dim2_remove(struct platform_device *pdev) + if (pdata && pdata->destroy) + pdata->destroy(pdata); + +- dim2_sysfs_destroy(&dev->bus); +- most_deregister_interface(&dev->most_iface); +- kthread_stop(dev->netinfo_task); +- + /* + * break link to local platform_device_id struct + * to prevent crash by unload platform device module +-- +libgit2 0.26.0 diff --git a/recipes-kernel/most/files/0007-dim2-use-device-tree.patch b/recipes-kernel/most/files/0007-dim2-use-device-tree.patch new file mode 100644 index 000000000..679fab79c --- /dev/null +++ b/recipes-kernel/most/files/0007-dim2-use-device-tree.patch @@ -0,0 +1,378 @@ +From 8e16207392cd715ea88f6780981a3d55ab005588 Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +Date: Mon, 12 Feb 2018 12:23:37 +0100 +Subject: [PATCH] staging: most: dim2: use device tree + +Current dim2 driver expects the existence of a platform driver that +implements the platform specific initialization and delivery of the irq +numbers. + +This patch integrates the device tree activity and platform specific +code into the driver. + +Signed-off-by: Andrey Shvetsov +--- + hdm-dim2/dim2_hdm.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- + hdm-dim2/dim2_hdm.h | 28 ---------------------------- + hdm-dim2/platform/dim2_arwen_mlb3.c | 165 --------------------------------------------------------------------------------------------------------------------------------------------------------------------- + hdm-dim2/platform/dim2_arwen_mlb6.c | 169 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + hdm-dim2/platform/dim2_h2_dt.c | 227 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + hdm-dim2/platform/dim2_mx6q.c | 192 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + hdm-dim2/platform/dim2_mx6q_dt.c | 224 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 7 files changed, 193 insertions(+), 1034 deletions(-) + delete mode 100644 hdm-dim2/dim2_hdm.h + delete mode 100644 hdm-dim2/platform/dim2_arwen_mlb3.c + delete mode 100644 hdm-dim2/platform/dim2_arwen_mlb6.c + delete mode 100644 hdm-dim2/platform/dim2_h2_dt.c + delete mode 100644 hdm-dim2/platform/dim2_mx6q.c + delete mode 100644 hdm-dim2/platform/dim2_mx6q_dt.c + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index e4629a5..2dba917 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -14,6 +14,7 @@ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + + #include ++#include + #include + #include + #include +@@ -21,13 +22,13 @@ + #include + #include + #include ++#include + #include + #include + #include + + #include + #include "dim2_hal.h" +-#include "dim2_hdm.h" + #include "dim2_errors.h" + #include "dim2_sysfs.h" + +@@ -93,6 +94,9 @@ struct dim2_hdm { + struct most_interface most_iface; + char name[16 + sizeof "dim2-"]; + void __iomem *io_base; ++ u8 clk_speed; ++ struct clk *clk; ++ struct clk *clk_pll; + struct task_struct *netinfo_task; + wait_queue_head_t netinfo_waitq; + int deliver_netinfo; +@@ -102,6 +106,12 @@ struct dim2_hdm { + struct medialb_bus bus; + void (*on_netinfo)(struct most_interface *, + unsigned char, unsigned char *); ++ void (*disable_platform)(struct platform_device *); ++}; ++ ++struct dim2_platform_data { ++ int (*enable)(struct platform_device *); ++ void (*disable)(struct platform_device *); + }; + + #define iface_to_hdm(iface) container_of(iface, struct dim2_hdm, most_iface) +@@ -686,6 +696,8 @@ static void dma_free(struct mbo *mbo, u32 size) + dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address); + } + ++static const struct of_device_id dim2_of_match[]; ++ + /* + * dim2_probe - dim2 probe handler + * @pdev: platform device structure +@@ -695,7 +707,7 @@ static void dma_free(struct mbo *mbo, u32 size) + */ + static int dim2_probe(struct platform_device *pdev) + { +- struct dim2_platform_data *pdata = pdev->dev.platform_data; ++ const struct dim2_platform_data *pdata; + struct dim2_hdm *dev; + struct resource *res; + int ret, i; +@@ -703,6 +715,8 @@ static int dim2_probe(struct platform_device *pdev) + u8 hal_ret; + int irq; + ++ enum { MLB_INT_IDX, AHB0_INT_IDX }; ++ + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); + if (!dev) + return -ENOMEM; +@@ -710,29 +724,30 @@ static int dim2_probe(struct platform_device *pdev) + dev->atx_idx = -1; + + platform_set_drvdata(pdev, dev); ++ ++ dev->clk_speed = CLK_4096FS; ++ + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + dev->io_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dev->io_base)) + return PTR_ERR(dev->io_base); + +- if (!pdata) { +- dev_err(&pdev->dev, "missing platform data\n"); +- return -EINVAL; +- } +- +- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0; ++ pdata = of_match_node(dim2_of_match, pdev->dev.of_node)->data; ++ ret = pdata && pdata->enable ? pdata->enable(pdev) : 0; + if (ret) + return ret; + ++ dev->disable_platform = pdata ? pdata->disable : 0; ++ + dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt); +- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt); ++ hal_ret = dim_startup(dev->io_base, dev->clk_speed, fcnt); + if (hal_ret != DIM_NO_ERROR) { + dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret); + ret = -ENODEV; +- goto err_bsp_destroy; ++ goto err_disable_platform; + } + +- irq = platform_get_irq(pdev, 0); ++ irq = platform_get_irq(pdev, AHB0_INT_IDX); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq); + ret = irq; +@@ -746,7 +761,7 @@ static int dim2_probe(struct platform_device *pdev) + goto err_shutdown_dim; + } + +- irq = platform_get_irq(pdev, 1); ++ irq = platform_get_irq(pdev, MLB_INT_IDX); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq); + ret = irq; +@@ -832,9 +847,9 @@ static int dim2_probe(struct platform_device *pdev) + kthread_stop(dev->netinfo_task); + err_shutdown_dim: + dim_shutdown(); +-err_bsp_destroy: +- if (pdata && pdata->destroy) +- pdata->destroy(pdata); ++err_disable_platform: ++ if (dev->disable_platform) ++ dev->disable_platform(pdev); + + return ret; + } +@@ -848,7 +863,6 @@ static int dim2_probe(struct platform_device *pdev) + static int dim2_remove(struct platform_device *pdev) + { + struct dim2_hdm *dev = platform_get_drvdata(pdev); +- struct dim2_platform_data *pdata = pdev->dev.platform_data; + unsigned long flags; + + dim2_sysfs_destroy(&dev->bus); +@@ -859,37 +873,187 @@ static int dim2_remove(struct platform_device *pdev) + dim_shutdown(); + spin_unlock_irqrestore(&dim_lock, flags); + +- if (pdata && pdata->destroy) +- pdata->destroy(pdata); ++ if (dev->disable_platform) ++ dev->disable_platform(pdev); ++ ++ return 0; ++} ++ ++/* platform specific functions [[ */ ++ ++static int fsl_mx6_enable(struct platform_device *pdev) ++{ ++ struct dim2_hdm *dev = platform_get_drvdata(pdev); ++ int ret; ++ ++ dev->clk = devm_clk_get(&pdev->dev, "mlb"); ++ if (IS_ERR_OR_NULL(dev->clk)) { ++ dev_err(&pdev->dev, "unable to get mlb clock\n"); ++ return -EFAULT; ++ } ++ ++ ret = clk_prepare_enable(dev->clk); ++ if (ret) { ++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed"); ++ return ret; ++ } ++ ++ if (dev->clk_speed >= CLK_2048FS) { ++ /* enable pll */ ++ dev->clk_pll = devm_clk_get(&pdev->dev, "pll8_mlb"); ++ if (IS_ERR_OR_NULL(dev->clk_pll)) { ++ dev_err(&pdev->dev, "unable to get mlb pll clock\n"); ++ clk_disable_unprepare(dev->clk); ++ return -EFAULT; ++ } ++ ++ writel(0x888, dev->io_base + 0x38); ++ clk_prepare_enable(dev->clk_pll); ++ } ++ ++ return 0; ++} ++ ++static void fsl_mx6_disable(struct platform_device *pdev) ++{ ++ struct dim2_hdm *dev = platform_get_drvdata(pdev); ++ ++ if (dev->clk_speed >= CLK_2048FS) ++ clk_disable_unprepare(dev->clk_pll); ++ ++ clk_disable_unprepare(dev->clk); ++} ++ ++static int rcar_h2_enable(struct platform_device *pdev) ++{ ++ struct dim2_hdm *dev = platform_get_drvdata(pdev); ++ int ret; ++ ++ dev->clk = devm_clk_get(&pdev->dev, NULL); ++ if (IS_ERR(dev->clk)) { ++ dev_err(&pdev->dev, "cannot get clock\n"); ++ return PTR_ERR(dev->clk); ++ } ++ ++ ret = clk_prepare_enable(dev->clk); ++ if (ret) { ++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed"); ++ return ret; ++ } ++ ++ if (dev->clk_speed >= CLK_2048FS) { ++ /* enable MLP pll and LVDS drivers */ ++ writel(0x03, dev->io_base + 0x600); ++ /* set bias */ ++ writel(0x888, dev->io_base + 0x38); ++ } else { ++ /* PLL */ ++ writel(0x04, dev->io_base + 0x600); ++ } ++ + +- /* +- * break link to local platform_device_id struct +- * to prevent crash by unload platform device module +- */ +- pdev->id_entry = NULL; ++ /* BBCR = 0b11 */ ++ writel(0x03, dev->io_base + 0x500); ++ writel(0x0002FF02, dev->io_base + 0x508); + + return 0; + } + +-static const struct platform_device_id dim2_id[] = { +- { "medialb_dim2" }, +- { }, /* Terminating entry */ ++static void rcar_h2_disable(struct platform_device *pdev) ++{ ++ struct dim2_hdm *dev = platform_get_drvdata(pdev); ++ ++ clk_disable_unprepare(dev->clk); ++ ++ /* disable PLLs and LVDS drivers */ ++ writel(0x0, dev->io_base + 0x600); ++} ++ ++static int rcar_m3_enable(struct platform_device *pdev) ++{ ++ struct dim2_hdm *dev = platform_get_drvdata(pdev); ++ u32 enable_512fs = dev->clk_speed == CLK_512FS; ++ int ret; ++ ++ dev->clk = devm_clk_get(&pdev->dev, NULL); ++ if (IS_ERR(dev->clk)) { ++ dev_err(&pdev->dev, "cannot get clock\n"); ++ return PTR_ERR(dev->clk); ++ } ++ ++ ret = clk_prepare_enable(dev->clk); ++ if (ret) { ++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed"); ++ return ret; ++ } ++ ++ /* PLL */ ++ writel(0x04, dev->io_base + 0x600); ++ ++ writel(enable_512fs, dev->io_base + 0x604); ++ ++ /* BBCR = 0b11 */ ++ writel(0x03, dev->io_base + 0x500); ++ writel(0x0002FF02, dev->io_base + 0x508); ++ ++ return 0; ++} ++ ++static void rcar_m3_disable(struct platform_device *pdev) ++{ ++ struct dim2_hdm *dev = platform_get_drvdata(pdev); ++ ++ clk_disable_unprepare(dev->clk); ++ ++ /* disable PLLs and LVDS drivers */ ++ writel(0x0, dev->io_base + 0x600); ++} ++ ++/* ]] platform specific functions */ ++ ++enum dim2_platforms { FSL_MX6, RCAR_H2, RCAR_M3 }; ++ ++static struct dim2_platform_data plat_data[] = { ++ [FSL_MX6] = { .enable = fsl_mx6_enable, .disable = fsl_mx6_disable }, ++ [RCAR_H2] = { .enable = rcar_h2_enable, .disable = rcar_h2_disable }, ++ [RCAR_M3] = { .enable = rcar_m3_enable, .disable = rcar_m3_disable }, ++}; ++ ++static const struct of_device_id dim2_of_match[] = { ++ { ++ .compatible = "fsl,imx6q-mlb150", ++ .data = plat_data + FSL_MX6 ++ }, ++ { ++ .compatible = "renesas,mlp", ++ .data = plat_data + RCAR_H2 ++ }, ++ { ++ .compatible = "rcar,medialb-dim2", ++ .data = plat_data + RCAR_M3 ++ }, ++ { ++ .compatible = "xlnx,axi4-os62420_3pin-1.00.a", ++ }, ++ { ++ .compatible = "xlnx,axi4-os62420_6pin-1.00.a", ++ }, ++ {}, + }; + +-MODULE_DEVICE_TABLE(platform, dim2_id); ++MODULE_DEVICE_TABLE(of, dim2_of_match); + + static struct platform_driver dim2_driver = { + .probe = dim2_probe, + .remove = dim2_remove, +- .id_table = dim2_id, + .driver = { + .name = "hdm_dim2", ++ .of_match_table = dim2_of_match, + }, + }; + + module_platform_driver(dim2_driver); + +-MODULE_AUTHOR("Jain Roy Ambi "); + MODULE_AUTHOR("Andrey Shvetsov "); + MODULE_DESCRIPTION("MediaLB DIM2 Hardware Dependent Module"); + MODULE_LICENSE("GPL"); +libgit2 0.26.0 diff --git a/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch b/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch new file mode 100644 index 000000000..1b01fb156 --- /dev/null +++ b/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch @@ -0,0 +1,92 @@ +From 839ad403a2d8081a6c15f6fc2836b01919338f3c Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +Date: Mon, 12 Feb 2018 12:24:37 +0100 +Subject: [PATCH] staging: most: dim2: read clock speed from the device tree + +This implements reading of the clock speed parameter from the device +tree. + +Signed-off-by: Andrey Shvetsov +--- + Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + hdm-dim2/dim2_hdm.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 113 insertions(+), 1 deletion(-) + create mode 100644 Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index 2dba917..05e1896 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -698,6 +698,42 @@ static void dma_free(struct mbo *mbo, u32 size) + + static const struct of_device_id dim2_of_match[]; + ++static struct { ++ const char *clock_speed; ++ u8 clk_speed; ++} clk_mt[] = { ++ { "256fs", CLK_256FS }, ++ { "512fs", CLK_512FS }, ++ { "1024fs", CLK_1024FS }, ++ { "2048fs", CLK_2048FS }, ++ { "3072fs", CLK_3072FS }, ++ { "4096fs", CLK_4096FS }, ++ { "6144fs", CLK_6144FS }, ++ { "8192fs", CLK_8192FS }, ++}; ++ ++/** ++ * get_dim2_clk_speed - converts string to DIM2 clock speed value ++ * ++ * @clock_speed: string in the format "{NUMBER}fs" ++ * @val: pointer to get one of the CLK_{NUMBER}FS values ++ * ++ * By success stores one of the CLK_{NUMBER}FS in the *val and returns 0, ++ * otherwise returns -EINVAL. ++ */ ++static int get_dim2_clk_speed(const char *clock_speed, u8 *val) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(clk_mt); i++) { ++ if (!strcmp(clock_speed, clk_mt[i].clock_speed)) { ++ *val = clk_mt[i].clk_speed; ++ return 0; ++ } ++ } ++ return -EINVAL; ++} ++ + /* + * dim2_probe - dim2 probe handler + * @pdev: platform device structure +@@ -708,6 +744,7 @@ static const struct of_device_id dim2_of_match[]; + static int dim2_probe(struct platform_device *pdev) + { + const struct dim2_platform_data *pdata; ++ const char *clock_speed; + struct dim2_hdm *dev; + struct resource *res; + int ret, i; +@@ -725,7 +762,18 @@ static int dim2_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, dev); + +- dev->clk_speed = CLK_4096FS; ++ ret = of_property_read_string(pdev->dev.of_node, ++ "microchip,clock-speed", &clock_speed); ++ if (ret) { ++ dev_err(&pdev->dev, "missing dt property clock-speed\n"); ++ return ret; ++ } ++ ++ ret = get_dim2_clk_speed(clock_speed, &dev->clk_speed); ++ if (ret) { ++ dev_err(&pdev->dev, "bad dt property clock-speed\n"); ++ return ret; ++ } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + dev->io_base = devm_ioremap_resource(&pdev->dev, res); +-- +libgit2 0.26.0 diff --git a/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch b/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch new file mode 100644 index 000000000..08cd6f99d --- /dev/null +++ b/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch @@ -0,0 +1,47 @@ +From 756f2f1f90524c2620ed7951e436d13bdb929a6b Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +Date: Mon, 12 Feb 2018 12:25:37 +0100 +Subject: [PATCH] staging: most: dim2: use device for coherent memory allocation + +On several modern architectures the allocation of coherent memory needs +a device that has the dma_ops properly set. This patch enables use of +the DIM2 platform device for the allocation process. + +Signed-off-by: Andrey Shvetsov +--- + hdm-dim2/dim2_hdm.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c +index 05e1896..1847091 100644 +--- a/hdm-dim2/dim2_hdm.c ++++ b/hdm-dim2/dim2_hdm.c +@@ -688,12 +688,16 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx) + + static void *dma_alloc(struct mbo *mbo, u32 size) + { +- return dma_alloc_coherent(NULL, size, &mbo->bus_address, GFP_KERNEL); ++ struct device *dev = mbo->ifp->dev; ++ ++ return dma_alloc_coherent(dev, size, &mbo->bus_address, GFP_KERNEL); + } + + static void dma_free(struct mbo *mbo, u32 size) + { +- dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address); ++ struct device *dev = mbo->ifp->dev; ++ ++ dma_free_coherent(dev, size, mbo->virt_address, mbo->bus_address); + } + + static const struct of_device_id dim2_of_match[]; +@@ -875,6 +879,7 @@ static int dim2_probe(struct platform_device *pdev) + dev->most_iface.poison_channel = poison_channel; + dev->most_iface.request_netinfo = request_netinfo; + dev->most_iface.extra_attrs = DBR_ATTRS; ++ dev->most_iface.dev = &pdev->dev; + + kobj = most_register_interface(&dev->most_iface); + if (IS_ERR(kobj)) { +-- +libgit2 0.26.0 diff --git a/recipes-kernel/most/files/0010-backport-usb-setup-timer.patch b/recipes-kernel/most/files/0010-backport-usb-setup-timer.patch new file mode 100644 index 000000000..ff21b2130 --- /dev/null +++ b/recipes-kernel/most/files/0010-backport-usb-setup-timer.patch @@ -0,0 +1,35 @@ +From 8eaec876f732c7e4b238ada5f9304c6da2380eb1 Mon Sep 17 00:00:00 2001 +From: Andrey Shvetsov +Date: Fri, 8 Feb 2019 22:44:32 +0000 +Subject: [PATCH] backport: usb: setup_timer + +--- + driver/hdm-usb/hdm_usb.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/hdm-usb/hdm_usb.c b/hdm-usb/hdm_usb.c +index 5b0af88..9896835 100644 +--- a/hdm-usb/hdm_usb.c ++++ b/hdm-usb/hdm_usb.c +@@ -760,9 +760,9 @@ static void hdm_request_netinfo(struct most_interface *iface, int channel, + * The handler runs in interrupt context. That's why we need to defer the + * tasks to a work queue. + */ +-static void link_stat_timer_handler(unsigned long data) ++static void link_stat_timer_handler(struct timer_list *t) + { +- struct most_dev *mdev = (struct most_dev *)data; ++ struct most_dev *mdev = from_timer(mdev, t, link_stat_timer); + + schedule_work(&mdev->poll_work_obj); + mdev->link_stat_timer.expires = jiffies + (2 * HZ); +@@ -1154,8 +1154,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id) + num_endpoints = usb_iface_desc->desc.bNumEndpoints; + mutex_init(&mdev->io_mutex); + INIT_WORK(&mdev->poll_work_obj, wq_netinfo); +- setup_timer(&mdev->link_stat_timer, link_stat_timer_handler, +- (unsigned long)mdev); ++ timer_setup(&mdev->link_stat_timer, link_stat_timer_handler, 0); + + mdev->usb_device = usb_dev; + mdev->link_stat_timer.expires = jiffies + (2 * HZ); diff --git a/recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch b/recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch new file mode 100644 index 000000000..d4383c4f6 --- /dev/null +++ b/recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch @@ -0,0 +1,30 @@ +Handle snd_pcm_lib_mmap_vmalloc removal in 4.19 + +Add .mmap field back to pcm_ops for kernels older than 4.19. + +Upstream-Status: Inappropriate + +Signed-off-by: Scott Murray + +diff --git a/aim-sound/sound.c b/aim-sound/sound.c +index 4b3329b..c0a26be 100644 +--- a/aim-sound/sound.c ++++ b/aim-sound/sound.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -463,6 +464,9 @@ static const struct snd_pcm_ops pcm_ops = { + .trigger = pcm_trigger, + .pointer = pcm_pointer, + .page = snd_pcm_lib_get_vmalloc_page, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0) ++ .mmap = snd_pcm_lib_mmap_vmalloc, ++#endif + }; + + static int split_arg_list(char *buf, char **card_name, u16 *ch_num, diff --git a/recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch b/recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch new file mode 100644 index 000000000..02eca27d2 --- /dev/null +++ b/recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch @@ -0,0 +1,68 @@ +From 877d7475413bb787deb07aa83bafac03efa399fa Mon Sep 17 00:00:00 2001 +From: Paul Barker +Date: Mon, 24 Feb 2020 14:58:52 +0000 +Subject: [PATCH] Fix build with 5.4 kernel + +Signed-off-by: Paul Barker +--- + driver/Makefile | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index 281241d..609e692 100644 +--- a/Makefile ++++ b/Makefile +@@ -5,6 +5,7 @@ SRC := $(shell pwd) + obj-m := mostcore.o + mostcore-y := mostcore/core.o + CFLAGS_core.o := -I$(src)/include/ ++CFLAGS_mostcore/core.o := -I$(src)/include/ + + obj-m += default_conf.o + CFLAGL_default_conf.o := -I$(src)/include +@@ -12,33 +13,41 @@ CFLAGL_default_conf.o := -I$(src)/include + obj-m += aim_cdev.o + aim_cdev-y := aim-cdev/cdev.o + CFLAGS_cdev.o := -I$(src)/include/ ++CFLAGS_aim-cdev/cdev.o := -I$(src)/include/ + + obj-m += aim_network.o + aim_network-y := aim-network/networking.o + CFLAGS_networking.o := -I$(src)/include/ ++CFLAGS_aim-network/networking.o := -I$(src)/include/ + + obj-m += aim_sound.o + aim_sound-y := aim-sound/sound.o + CFLAGS_sound.o := -I$(src)/include/ ++CFLAGS_aim-sound/sound.o := -I$(src)/include/ + + obj-m += aim_v4l2.o + aim_v4l2-y := aim-v4l2/video.o + CFLAGS_video.o := -Idrivers/media/video -I$(src)/include/ ++CFLAGS_aim-v4l2/video.o := -Idrivers/media/video -I$(src)/include/ + + obj-m += hdm_i2c.o + hdm_i2c-y := hdm-i2c/hdm_i2c.o + CFLAGS_hdm_i2c.o := -I$(src)/include/ ++CFLAGS_hdm-i2c/hdm_i2c.o := -I$(src)/include/ + + ifdef CONFIG_OF + obj-m += hdm_dim2.o + hdm_dim2-y := hdm-dim2/dim2_hdm.o hdm-dim2/dim2_hal.o hdm-dim2/dim2_sysfs.o + CFLAGS_dim2_hdm.o := -I$(src)/include/ ++CFLAGS_hdm-dim2/dim2_hdm.o := -I$(src)/include/ ++CFLAGS_hdm-dim2/dim2_hal.o := -I$(src)/include/ ++CFLAGS_hdm-dim2/dim2_sysfs.o := -I$(src)/include/ + endif + + obj-m += hdm_usb.o + hdm_usb-y := hdm-usb/hdm_usb.o + CFLAGS_hdm_usb.o := -I$(src)/include/ +- ++CFLAGS_hdm-usb/hdm_usb.o := -I$(src)/include/ + + all: + $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules +-- +2.20.1 + diff --git a/recipes-kernel/most/most.bb b/recipes-kernel/most/most.bb new file mode 100644 index 000000000..48959a6ee --- /dev/null +++ b/recipes-kernel/most/most.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Build MOST driver" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +inherit module + +PV = "0.1" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/most;protocol=https;branch=${AGL_BRANCH}" + +S = "${WORKDIR}/git/driver" +SRCREV = "e4dbbaf9e7652efaed0df3e0aab4464f5f228573" + +KERNEL_MODULE_AUTOLOAD += "aim_cdev aim_sound aim_network aim_v4l2 hdm_i2c hdm_dim2 hdm_usb mostcore" diff --git a/recipes-kernel/most/most.bbappend b/recipes-kernel/most/most.bbappend new file mode 100644 index 000000000..ad422eb57 --- /dev/null +++ b/recipes-kernel/most/most.bbappend @@ -0,0 +1,15 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI_append = " \ + file://0002-src-most-add-auto-conf-feature.patch \ + file://0003-core-remove-kernel-log-for-MBO-status.patch \ + file://0004-most-video-set-device_caps.patch \ + file://0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch \ + file://0006-dim2-fix-startup-sequence.patch \ + file://0007-dim2-use-device-tree.patch \ + file://0008-dim2-read-clock-speed-from-the-device-tree.patch \ + file://0009-dim2-use-device-for-coherent-memory-allocation.patch \ + file://0010-backport-usb-setup-timer.patch \ + file://0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch \ + file://0012-Fix-build-with-5.4-kernel.patch \ +" diff --git a/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch new file mode 100644 index 000000000..443e7db8b --- /dev/null +++ b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch @@ -0,0 +1,28 @@ +From 03e502084633838badfcc2b91a1aca1651c18544 Mon Sep 17 00:00:00 2001 +From: Marius Vlad +Date: Wed, 24 Jun 2020 19:44:35 +0300 +Subject: [PATCH] gst/wayland/: Install wayland header from gstwayland library + +Necessary for cluster-receiver to pass out the wl_surface. + +Bug-AGL: SPEC-3382 + +Signed-off-by: Marius Vlad +--- + gst-libs/gst/wayland/meson.build | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/gst-libs/gst/wayland/meson.build b/gst-libs/gst/wayland/meson.build +index b1ede41f1..8957381d2 100644 +--- a/gst-libs/gst/wayland/meson.build ++++ b/gst-libs/gst/wayland/meson.build +@@ -21,4 +21,6 @@ if use_wayland + gstwayland_dep = declare_dependency(link_with : gstwayland, + include_directories : [libsinc], + dependencies : [gst_dep, gstvideo_dep]) ++ ++ install_headers('wayland.h', subdir: 'gst/wayland') + endif +-- +2.26.2 + diff --git a/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend new file mode 100644 index 000000000..7f389dab7 --- /dev/null +++ b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'gstreamer1.0-plugins-bad_agldemo.inc', '', d)} diff --git a/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc new file mode 100644 index 000000000..fcfda531b --- /dev/null +++ b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc @@ -0,0 +1,2 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/gstreamer1.0-plugins-bad:" +SRC_URI_append = " file://0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch" diff --git a/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend new file mode 100644 index 000000000..2d314acd7 --- /dev/null +++ b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'gstreamer1.0-plugins-good_agldemo.inc', '', d)} diff --git a/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc new file mode 100644 index 000000000..86a181fbb --- /dev/null +++ b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc @@ -0,0 +1,2 @@ +# libv4l2 is useful for making more efficient use of cameras via v4l2src. +PACKAGECONFIG_append = " libv4l2" diff --git a/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch b/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch new file mode 100644 index 000000000..51896e8db --- /dev/null +++ b/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch @@ -0,0 +1,40 @@ +From 530a31e3eb24b2f1ed7b30859ed62a2d1b24bd91 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20M=C3=BCller?= +Date: Tue, 7 Feb 2017 11:51:58 +0100 +Subject: [PATCH] add a configure option to disable build of man-pages +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Upstream-Status: Pending + +Signed-off-by: Andreas Müller +--- + configure.ac | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index 8316c67..099fc0c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -67,6 +67,8 @@ AC_ARG_ENABLE([largefile], + [AS_HELP_STRING([--disable-largefile],[disable LFS (large file support)])]) + AC_ARG_ENABLE([util], + [AS_HELP_STRING([--disable-util],[disable build of command-line utilities])]) ++AC_ARG_ENABLE([man], ++ [AS_HELP_STRING([--disable-man],[disable build of man-pages])]) + AC_ARG_ENABLE([bi], + [AS_HELP_STRING([--enable-bi=ARCH],[enable -mARCH for bi-arch compilation])]) + AC_ARG_ENABLE([ub], +@@ -395,7 +397,7 @@ AM_CONDITIONAL([ADD_PLATFORM_POSIX],[test "$X_PLATFORM" = "posix"]) + AM_CONDITIONAL([ADD_PLATFORM_WIN32],[test "$X_PLATFORM" = "win32"]) + + AM_CONDITIONAL([ADD_UTIL],[test "$enable_util" != "no"]) +-AM_CONDITIONAL([ADD_MANS],[test "$X_PLATFORM" != "win32"]) ++AM_CONDITIONAL([ADD_MANS],[test "$enable_man" != "no"]) + + ############################################################################### + # declare common substitutions +-- +2.9.3 + diff --git a/recipes-multimedia/libmp4v2/libmp4v2_git.bb b/recipes-multimedia/libmp4v2/libmp4v2_git.bb new file mode 100644 index 000000000..dd1b34747 --- /dev/null +++ b/recipes-multimedia/libmp4v2/libmp4v2_git.bb @@ -0,0 +1,18 @@ +SUMMARY = "The MP4v2 library provides an API to create and modify mp4 files" +HOMEPAGE = "https://github.com/sergiomb2/libmp4v2/wiki" +LICENSE = "MPLv1.1" +LIC_FILES_CHKSUM = "file://COPYING;md5=eb3014b036b6d2151d944aef6a84c36f" + +inherit autotools-brokensep pkgconfig + +SRC_URI = " \ + git://github.com/sergiomb2/${BPN}.git \ + file://0001-add-a-configure-option-to-disable-build-of-man-pages.patch \ +" +SRCREV = "855e9674232808ff3be7191b697dfb56917db21f" +S = "${WORKDIR}/git" +PV = "2.1.0+git${SRCPV}" + + +SECURITY_CFLAGS = "${SECURITY_NO_PIE_CFLAGS}" +EXTRA_OECONF = "--disable-man" diff --git a/recipes-multimedia/lightmediascanner/.appends.meta-efl b/recipes-multimedia/lightmediascanner/.appends.meta-efl new file mode 100644 index 000000000..e69de29bb diff --git a/recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch b/recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch new file mode 100644 index 000000000..15d4b3f0e --- /dev/null +++ b/recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch @@ -0,0 +1,33 @@ +From 5bc5b8c5dad3edec6736fd7e7ce61250c4ce3725 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 12 Jul 2017 17:13:19 -0700 +Subject: [PATCH] Define comparison_fn_t for non-glibc systems + +lightmediascanner.c:324:12: error: 'comparison_fn_t' undeclared (first use in this function) + (comparison_fn_t)_plugin_sort); + ^~~~~~~~~~~~~~~ + +Signed-off-by: Khem Raj +--- + src/lib/lightmediascanner.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/lib/lightmediascanner.c b/src/lib/lightmediascanner.c +index 344b247..b866883 100644 +--- a/src/lib/lightmediascanner.c ++++ b/src/lib/lightmediascanner.c +@@ -37,6 +37,11 @@ + #define DEFAULT_SLAVE_TIMEOUT 1000 + #define DEFAULT_COMMIT_INTERVAL 100 + ++#if !defined(__GLIBC__) ++typedef int (*__compar_fn_t) (const void*, const void*); ++typedef __compar_fn_t comparison_fn_t; ++#endif ++ + #ifdef HAVE_MAGIC_H + static magic_t _magic_handle; + +-- +2.13.2 + diff --git a/recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch b/recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch new file mode 100644 index 000000000..5abb980b8 --- /dev/null +++ b/recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch @@ -0,0 +1,49 @@ +From 5a618b444e424483c3a9d34dd9b196796cac8e3f Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Mon, 22 Jul 2019 13:29:52 -0700 +Subject: [PATCH] switch from G_BUS_TYPE_SESSION to G_BUS_TYPE_SYSTEM + +Signed-off-by: Matt Ranostay +--- + src/bin/lightmediascannerctl.c | 4 ++-- + src/bin/lightmediascannerd.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/bin/lightmediascannerctl.c b/src/bin/lightmediascannerctl.c +index 5764bc0..1d4d844 100644 +--- a/src/bin/lightmediascannerctl.c ++++ b/src/bin/lightmediascannerctl.c +@@ -11,7 +11,7 @@ start_service_by_name(void) + GVariant *var; + GDBusConnection *conn; + +- conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); ++ conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (error) { + fprintf(stderr, "Could not get session bus connection: %s\n", + error->message); +@@ -526,7 +526,7 @@ main(int argc, char *argv[]) + + app.timer = NULL; + app.loop = g_main_loop_new(NULL, FALSE); +- app.proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, ++ app.proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.lightmediascanner", +diff --git a/src/bin/lightmediascannerd.c b/src/bin/lightmediascannerd.c +index 319db42..6db81cc 100644 +--- a/src/bin/lightmediascannerd.c ++++ b/src/bin/lightmediascannerd.c +@@ -1721,7 +1721,7 @@ main(int argc, char *argv[]) + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + g_assert(introspection_xml != NULL); + +- id = g_bus_own_name(G_BUS_TYPE_SESSION, "org.lightmediascanner", ++ id = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.lightmediascanner", + G_BUS_NAME_OWNER_FLAGS_NONE, + NULL, on_name_acquired, NULL, NULL, NULL); + +-- +2.20.1 + diff --git a/recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf b/recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf new file mode 100644 index 000000000..8a9e35b09 --- /dev/null +++ b/recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch b/recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch new file mode 100644 index 000000000..9528bec79 --- /dev/null +++ b/recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch @@ -0,0 +1,11 @@ +--- a/src/plugins/Makefile.am 2015-10-25 16:12:29.331415823 +0000 ++++ b/src/plugins/Makefile.am 2015-10-25 16:14:37.593415808 +0000 +@@ -93,7 +93,7 @@ + id3_id3_la_SOURCES = id3/id3.c id3/id3v1_genres.c + id3_id3_la_LIBADD = $(PLUGINS_LIBADD) + +-id3/id3v1_genres.c: $(srcdir)/id3/id3v1_genres.def $(srcdir)/id3/id3v1_genres_gen.awk ++$(srcdir)/id3/id3v1_genres.c: $(srcdir)/id3/id3v1_genres.def $(srcdir)/id3/id3v1_genres_gen.awk + $(AWK) -f $(srcdir)/id3/id3v1_genres_gen.awk $(srcdir)/id3/id3v1_genres.def > $@ + + EXTRA_DIST += id3/id3v1_genres.def id3/id3v1_genres_gen.awk diff --git a/recipes-multimedia/lightmediascanner/files/lightmediascanner.service b/recipes-multimedia/lightmediascanner/files/lightmediascanner.service new file mode 100644 index 000000000..63b48ebf9 --- /dev/null +++ b/recipes-multimedia/lightmediascanner/files/lightmediascanner.service @@ -0,0 +1,16 @@ +[Unit] +Description=Lightmediascanner (LMS) +After=run-agl-postinsts.service systemd-remount-fs.service systemd-tmpfiles-setup.service tmp.mount +ConditionPathIsReadWrite=/var/volatile/tmp + +[Service] +Type=dbus +Restart=on-failure +RestartSec=0 +BusName=org.lightmediascanner +SmackProcessLabel=User::App::agl-service-mediascanner +ExecStart=/usr/bin/lightmediascannerd --startup-scan --db-path=/var/volatile/tmp/lightmediascannerd.db --directory=/media + +[Install] +WantedBy=multi-user.target +Alias=dbus-org.lightmediascanner.service diff --git a/recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch b/recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch new file mode 100644 index 000000000..6a0b8ff93 --- /dev/null +++ b/recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch @@ -0,0 +1,53 @@ +From 3e66b97221440b17a184feb48692dce7e0561cac Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Wed, 8 Mar 2017 16:30:01 -0800 +Subject: [PATCH] plugin: ogg: fix chucksize issue + +There are some OGG files that have metadata chucks that go over the +hardcoded 10 * 4096 size due to album art. This patchset just parses +each chuck and continues till it runs out of valid chunks. + +Signed-off-by: Matt Ranostay +--- + src/plugins/ogg/ogg.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +diff --git a/src/plugins/ogg/ogg.c b/src/plugins/ogg/ogg.c +index 1c0818e..c94dc38 100644 +--- a/src/plugins/ogg/ogg.c ++++ b/src/plugins/ogg/ogg.c +@@ -47,8 +47,6 @@ + int CHUNKSIZE = 4096; + #endif + +-#define MAX_CHUNKS_PER_PAGE 10 +- + struct stream { + struct lms_stream base; + int serial; +@@ -122,10 +120,8 @@ _set_lms_info(struct lms_string_size *info, const char *tag) + + static bool _ogg_read_page(FILE *fp, ogg_sync_state *osync, ogg_page *page) + { +- int i; +- +- for (i = 0; i < MAX_CHUNKS_PER_PAGE && ogg_sync_pageout(osync, page) != 1; +- i++) { ++ while(ogg_sync_pageout(osync, page) != 1) ++ { + lms_ogg_buffer_t buffer = lms_get_ogg_sync_buffer(osync, CHUNKSIZE); + int bytes = fread(buffer, 1, CHUNKSIZE, fp); + +@@ -136,9 +132,6 @@ static bool _ogg_read_page(FILE *fp, ogg_sync_state *osync, ogg_page *page) + ogg_sync_wrote(osync, bytes); + } + +- if (i > MAX_CHUNKS_PER_PAGE) +- return false; +- + return true; + } + +-- +2.7.4 + diff --git a/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend b/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend new file mode 100644 index 000000000..b47b2796c --- /dev/null +++ b/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend @@ -0,0 +1,42 @@ +# Disable everything but the roygalty-free formats +PACKAGECONFIG = "ogg flac wave m3u pls jpeg png" + +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI += "file://lightmediascanner.service \ + file://plugin-ogg-fix-chucksize-issue.patch \ + file://0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch \ + file://dbus-lightmediascanner.conf \ + " + +CFLAGS_append = " -D_FILE_OFFSET_BITS=64" + +inherit systemd + +SYSTEMD_PACKAGES = "${PN}" +SYSTEMD_SERVICE_${PN} = "lightmediascanner.service" +SYSTEMD_AUTO_ENABLE_${PN} = "enable" + +do_install_append() { + # Install LMS systemd service + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 644 -p -D ${WORKDIR}/lightmediascanner.service ${D}${systemd_system_unitdir}/lightmediascanner.service + fi + + install -d ${D}/etc/dbus-1/system.d + install -m 0644 ${WORKDIR}/dbus-lightmediascanner.conf ${D}/etc/dbus-1/system.d/org.lightmediascanner.conf +} + +FILES_${PN} += " \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/lightmediascanner.service', '', d)} \ + " + +EXTRA_OECONF = "--enable-static --with-dbus-services=${datadir}/dbus-1/system-services" +PACKAGECONFIG[mp4] = "--enable-mp4,--disable-mp4,libmp4v2" + +# add support MP3 because of the format of music files for AGL CES/ALS2017 Demo +PACKAGECONFIG_append = " id3 mp4" + +# add required character sets for id3 tag scanning +RDEPENDS_${PN}_append = " glibc-gconv-utf-16 glibc-gconv-iso8859-1" diff --git a/recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb b/recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb new file mode 100644 index 000000000..f2158760f --- /dev/null +++ b/recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb @@ -0,0 +1,63 @@ +SUMMARY = "Lightweight media scanner" +DESCRIPTION = "Lightweight media scanner meant to be used in not-so-powerful devices, like embedded systems or old machines." +SECTION = "libs/multimedia" + +LICENSE = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ + file://src/lib/lightmediascanner.c;endline=21;md5=6d8889bccb4c6c27e8b786342a3eb267" + +DEPENDS = "file gawk glib-2.0 sqlite3" + +PV = "0.5.1+git${SRCPV}" +SRCREV = "adfddb3486276a5ed2f5008c9e43a811e1271cc9" +SRC_URI = "git://github.com/profusion/lightmediascanner.git \ + file://id3-plugin-support-out-of-tree-build.patch \ + file://0001-Define-comparison_fn_t-for-non-glibc-systems.patch \ + " + +S = "${WORKDIR}/git" + +inherit autotools pkgconfig + +EXTRA_OECONF = "--enable-static --disable-mp4" + +PACKAGECONFIG ??= "ogg flac wave id3 m3u pls asf rm jpeg png" +PACKAGECONFIG[generic] = "--enable-generic,--disable-generic,libav" +PACKAGECONFIG[ogg] = "--enable-ogg,--disable-ogg,libogg libvorbis libtheora" +PACKAGECONFIG[flac] = "--enable-flac,--disable-flac,flac" +PACKAGECONFIG[wave] = "--enable-wave,--disable-wave" +PACKAGECONFIG[id3] = "--enable-id3,--disable-id3" +PACKAGECONFIG[m3u] = "--enable-m3u,--disable-m3u" +PACKAGECONFIG[pls] = "--enable-pls,--disable-pls" +PACKAGECONFIG[asf] = "--enable-asf,--disable-asf" +PACKAGECONFIG[rm] = "--enable-rm,--disable-rm" +PACKAGECONFIG[jpeg] = "--enable-jpeg,--disable-jpeg" +PACKAGECONFIG[png] = "--enable-png,--disable-png" + +do_install_append() { + # Install "test" binary for corresponding package + install -d ${D}/${bindir} + install -m 755 ${B}/src/bin/.libs/test ${D}/${bindir}/test-lms + # Remove .la files for loadable modules + rm -f ${D}/${libdir}/${PN}/plugins/*.la +} + +FILES_${PN} += "${datadir}/dbus-1" +FILES_${PN}-dbg += "${libdir}/${PN}/plugins/.debug" + +PACKAGES_prepend = "${PN}-test " +FILES_${PN}-test_prepend = "${bindir}/test-lms " + +PACKAGES += "${PN}-meta" +ALLOW_EMPTY_${PN}-meta = "1" + +PACKAGES_DYNAMIC = "${PN}-plugin-*" + +python populate_packages_prepend () { + lms_libdir = d.expand('${libdir}/${PN}') + pkgs = [] + + pkgs += do_split_packages(d, oe.path.join(lms_libdir, "plugins"), '^(.*)\.so$', d.expand('${PN}-plugin-%s'), 'LightMediaScanner plugin for %s', prepend=True, extra_depends=d.expand('${PN}')) + metapkg = d.getVar('PN') + '-meta' + d.setVar('RDEPENDS_' + metapkg, ' '.join(pkgs)) +} diff --git a/recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf b/recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf new file mode 100644 index 000000000..a7486d055 --- /dev/null +++ b/recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf @@ -0,0 +1,8 @@ + + + + + + diff --git a/recipes-navigation/geoclue/geoclue_%.bbappend b/recipes-navigation/geoclue/geoclue_%.bbappend new file mode 100644 index 000000000..eb1eef6b9 --- /dev/null +++ b/recipes-navigation/geoclue/geoclue_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'geoclue_agldemo.inc', '', d)} diff --git a/recipes-navigation/geoclue/geoclue_agldemo.inc b/recipes-navigation/geoclue/geoclue_agldemo.inc new file mode 100644 index 000000000..24936e5cc --- /dev/null +++ b/recipes-navigation/geoclue/geoclue_agldemo.inc @@ -0,0 +1,11 @@ +inherit gobject-introspection + +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +SRC_URI_append = " file://org.freedesktop.GeoClue2.Client.conf" + +PACKAGECONFIG = "nmea lib" + +do_install_append() { + install -d ${D}/etc/dbus-1/system.d + install -m 0644 ${WORKDIR}/org.freedesktop.GeoClue2.Client.conf ${D}/etc/dbus-1/system.d/org.freedesktop.GeoClue2.Client.conf +} diff --git a/recipes-navigation/gpsd/gpsd/sw-device-hook b/recipes-navigation/gpsd/gpsd/sw-device-hook new file mode 100644 index 000000000..e1e6f7a41 --- /dev/null +++ b/recipes-navigation/gpsd/gpsd/sw-device-hook @@ -0,0 +1,23 @@ +#!/bin/sh + +# Figure out the parent usb device +USBDEV=`ls -l "$1" |sed -ne 's!^c[^ ]* [0-9]* [^ ]* [^ ]* \([0-9]*\), \([0-9]*\) .*!/sys/dev/char/\1:\2/device/../..!p'` + +# Silently ignore any non-USB ports +if [ ! -r "$USBDEV/idVendor" ] || [ ! -r "$USBDEV/idProduct" ]; then + exit 0 +fi + +VID=`cat "$USBDEV/idVendor"` +PID=`cat "$USBDEV/idProduct"` +case "$2" in + ACTIVATE) CMD=START ;; + *) CMD=STOP ;; +esac + +case "$VID:$PID" in + "1199:9071"|"1199:9079") echo \$GPS_$CMD >"$1" ;; + *) ;; +esac + +exit 0 diff --git a/recipes-navigation/gpsd/gpsd_%.bbappend b/recipes-navigation/gpsd/gpsd_%.bbappend new file mode 100644 index 000000000..ac56bfb82 --- /dev/null +++ b/recipes-navigation/gpsd/gpsd_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'gpsd_agldemo.inc', '', d)} diff --git a/recipes-navigation/gpsd/gpsd_agldemo.inc b/recipes-navigation/gpsd/gpsd_agldemo.inc new file mode 100644 index 000000000..5899505bc --- /dev/null +++ b/recipes-navigation/gpsd/gpsd_agldemo.inc @@ -0,0 +1,28 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/gpsd:" + +SRC_URI += "file://sw-device-hook" + +do_install_append() { + # Install device-hook script for starting NMEA output on Sierra Wireless modems + install -d ${D}${sysconfdir}/gpsd + install -m 0755 ${WORKDIR}/sw-device-hook ${D}${sysconfdir}/gpsd/device-hook +} + + + +SYSTEMD_SERVICE_${PN}_append = " gpsdctl@.service" + +RPROVIDES_${PN}-conf_append = " virtual/gpsd-conf" + +do_install_append() { + # use the systemd compatible gpsd.rules + install -d ${D}/${sysconfdir}/udev/rules.d + install -m 0644 ${S}/gpsd.rules ${D}/${sysconfdir}/udev/rules.d/60-gpsd.rules + + #support for systemd + install -d ${D}${systemd_unitdir}/system/ + install -m 0644 ${S}/systemd/gpsdctl@.service ${D}${systemd_unitdir}/system + + #autoprobe usb gps devices + echo 'USBAUTO="true"' >> ${D}${sysconfdir}/default/gpsd.default +} diff --git a/recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb b/recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb new file mode 100644 index 000000000..6f8bf6297 --- /dev/null +++ b/recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb @@ -0,0 +1,27 @@ +SUMMARY = "Cross SDK of AGL Distribution for Cluster profile Demo" + +DESCRIPTION = "SDK image for AGL Distribution for Cluster profile Demo. \ +It includes the full meta-toolchain, plus developement headers and libraries \ +to form a standalone cross SDK." + +require agl-cluster-demo-platform.bb + +LICENSE = "MIT" + +IMAGE_FEATURES_append = " dev-pkgs" +IMAGE_INSTALL_append = " kernel-dev kernel-devsrc" + +inherit populate_sdk populate_sdk_qt5 + +# Task do_populate_sdk and do_rootfs can't be exec simultaneously. +# Both exec "createrepo" on the same directory, and so one of them +# can failed (randomly). +addtask do_populate_sdk after do_rootfs + +# Add wayland-scanner to SDK (SPEC-945) +# Use TOOLCHAIN_HOST_TASK instead of adding to the packagegroup +# wayland-scanner is in nativesdk-wayland-dev ! +# option: add also nativesdk-qtwayland-tools +TOOLCHAIN_HOST_TASK_append = " nativesdk-wayland nativesdk-wayland-dev" + +TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules " diff --git a/recipes-platform/images/agl-cluster-demo-platform.bb b/recipes-platform/images/agl-cluster-demo-platform.bb new file mode 100644 index 000000000..52d737b74 --- /dev/null +++ b/recipes-platform/images/agl-cluster-demo-platform.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "AGL Cluster Demo Platform image currently contains a simple cluster interface." + +require agl-cluster-demo-platform.inc + +LICENSE = "MIT" + +IMAGE_FEATURES_append = " \ + " + +# add packages for cluster demo platform (include demo apps) here +IMAGE_INSTALL_append = " \ + packagegroup-agl-cluster-demo-platform \ + " + diff --git a/recipes-platform/images/agl-cluster-demo-platform.inc b/recipes-platform/images/agl-cluster-demo-platform.inc new file mode 100644 index 000000000..8745ca941 --- /dev/null +++ b/recipes-platform/images/agl-cluster-demo-platform.inc @@ -0,0 +1,3 @@ +# Base image +require recipes-platform/images/agl-image-cluster-qt5.inc + diff --git a/recipes-platform/images/agl-cluster-demo-qtcompositor.bb b/recipes-platform/images/agl-cluster-demo-qtcompositor.bb new file mode 100644 index 000000000..d6f325662 --- /dev/null +++ b/recipes-platform/images/agl-cluster-demo-qtcompositor.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "AGL Cluster Demo Qtwayland Compositor image currently contains a \ +simple cluster interface and some AGL service." + +require agl-cluster-demo-qtcompositor.inc + +LICENSE = "MIT" + +IMAGE_FEATURES_append = " \ + " + +# add packages for cluster demo qtcompositor +IMAGE_INSTALL_append = " \ + packagegroup-agl-cluster-demo-qtcompositor \ + " + diff --git a/recipes-platform/images/agl-cluster-demo-qtcompositor.inc b/recipes-platform/images/agl-cluster-demo-qtcompositor.inc new file mode 100644 index 000000000..11c1ebce9 --- /dev/null +++ b/recipes-platform/images/agl-cluster-demo-qtcompositor.inc @@ -0,0 +1,2 @@ +# Base image +require recipes-platform/images/agl-image-cluster-qt5.inc diff --git a/recipes-platform/images/agl-demo-platform-crosssdk.bb b/recipes-platform/images/agl-demo-platform-crosssdk.bb index ff3e9dfd4..d4b6c9dd4 100644 --- a/recipes-platform/images/agl-demo-platform-crosssdk.bb +++ b/recipes-platform/images/agl-demo-platform-crosssdk.bb @@ -8,7 +8,7 @@ require agl-demo-platform.bb LICENSE = "MIT" -require recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc +require agl-image-graphical-qt5-crosssdk.inc inherit populate_sdk populate_sdk_qt5 diff --git a/recipes-platform/images/agl-image-cluster-qt5.bb b/recipes-platform/images/agl-image-cluster-qt5.bb new file mode 100644 index 000000000..244e2ba48 --- /dev/null +++ b/recipes-platform/images/agl-image-cluster-qt5.bb @@ -0,0 +1,9 @@ +SUMMARY = "A basic Wayland based cluster image with Qt5 support" + +require agl-image-cluster-qt5.inc + +LICENSE = "MIT" + +IMAGE_INSTALL_append = "\ + profile-cluster-qt5 \ + " diff --git a/recipes-platform/images/agl-image-cluster-qt5.inc b/recipes-platform/images/agl-image-cluster-qt5.inc new file mode 100644 index 000000000..93826aa46 --- /dev/null +++ b/recipes-platform/images/agl-image-cluster-qt5.inc @@ -0,0 +1,7 @@ +require recipes-platform/images/agl-image-boot.inc + +IMAGE_FEATURES += "splash package-management ssh-server-dropbear" + +inherit features_check + +REQUIRED_DISTRO_FEATURES = "wayland" diff --git a/recipes-platform/images/agl-image-cluster.bb b/recipes-platform/images/agl-image-cluster.bb new file mode 100644 index 000000000..552d7a74e --- /dev/null +++ b/recipes-platform/images/agl-image-cluster.bb @@ -0,0 +1,9 @@ +SUMMARY = "A basic Wayland based cluster image" + +require agl-image-cluster.inc + +LICENSE = "MIT" + +IMAGE_INSTALL_append = "\ + profile-cluster \ + " diff --git a/recipes-platform/images/agl-image-cluster.inc b/recipes-platform/images/agl-image-cluster.inc new file mode 100644 index 000000000..93826aa46 --- /dev/null +++ b/recipes-platform/images/agl-image-cluster.inc @@ -0,0 +1,7 @@ +require recipes-platform/images/agl-image-boot.inc + +IMAGE_FEATURES += "splash package-management ssh-server-dropbear" + +inherit features_check + +REQUIRED_DISTRO_FEATURES = "wayland" diff --git a/recipes-platform/images/agl-image-graphical-html5.bb b/recipes-platform/images/agl-image-graphical-html5.bb new file mode 100644 index 000000000..0ec6829ed --- /dev/null +++ b/recipes-platform/images/agl-image-graphical-html5.bb @@ -0,0 +1,10 @@ +SUMMARY = "An image containing all packages required to run web applications" + +require agl-image-graphical-html5.inc + +LICENSE = "MIT" + +IMAGE_INSTALL_append = "\ + packagegroup-agl-profile-graphical-html5 \ + " + diff --git a/recipes-platform/images/agl-image-graphical-html5.inc b/recipes-platform/images/agl-image-graphical-html5.inc new file mode 100644 index 000000000..e943b9903 --- /dev/null +++ b/recipes-platform/images/agl-image-graphical-html5.inc @@ -0,0 +1,9 @@ +require recipes-platform/images/agl-image-minimal.inc + +IMAGE_FEATURES += "splash" + +IMAGE_FEATURES += "${@bb.utils.contains('DISTRO_FEATURES', 'agl-devel', 'ssh-server-dropbear' , '', d)}" + +inherit features_check + +REQUIRED_DISTRO_FEATURES = "wayland" diff --git a/recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb new file mode 100755 index 000000000..5147ea44a --- /dev/null +++ b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb @@ -0,0 +1,18 @@ +SUMMARY = "Cross SDK of Full AGL Distribution for IVI profile" + +DESCRIPTION = "SDK image for full AGL Distribution for IVI profile. \ +It includes the full meta-toolchain, plus developement headers and libraries \ +to form a standalone cross SDK." + +require agl-image-graphical-qt5.bb + +LICENSE = "MIT" + +require agl-image-graphical-qt5-crosssdk.inc + +inherit populate_sdk populate_sdk_qt5 + +# Task do_populate_sdk and do_rootfs can't be exec simultaneously. +# Both exec "createrepo" on the same directory, and so one of them +# can failed (randomly). +addtask do_populate_sdk after do_rootfs diff --git a/recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc new file mode 100644 index 000000000..f43bb07d7 --- /dev/null +++ b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc @@ -0,0 +1,14 @@ +require recipes-platform/images/agl-image-minimal-crosssdk.inc + +TOOLCHAIN_TARGET_TASK += "libafb-helpers-qt-staticdev" + +# Add wayland-scanner to SDK (SPEC-945) +# Use TOOLCHAIN_HOST_TASK instead of adding to the packagegroup +# wayland-scanner is in nativesdk-wayland-dev ! +# option: add also nativesdk-qtwayland-tools +TOOLCHAIN_HOST_TASK_append = " nativesdk-wayland nativesdk-wayland-dev" + +TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules " + +# Add qtwaylandscanner to the SDK +TOOLCHAIN_HOST_TASK_append = " nativesdk-qtwayland-tools " diff --git a/recipes-platform/images/agl-image-graphical-qt5.bb b/recipes-platform/images/agl-image-graphical-qt5.bb new file mode 100644 index 000000000..bcfd724fa --- /dev/null +++ b/recipes-platform/images/agl-image-graphical-qt5.bb @@ -0,0 +1,5 @@ +SUMMARY = "A very basic Wayland image with a terminal" + +require agl-image-graphical-qt5.inc + +LICENSE = "MIT" diff --git a/recipes-platform/images/agl-image-graphical-qt5.inc b/recipes-platform/images/agl-image-graphical-qt5.inc new file mode 100644 index 000000000..114d06a07 --- /dev/null +++ b/recipes-platform/images/agl-image-graphical-qt5.inc @@ -0,0 +1 @@ +require recipes-platform/images/agl-image-weston.inc diff --git a/recipes-platform/images/agl-image-telematics.bb b/recipes-platform/images/agl-image-telematics.bb new file mode 100644 index 000000000..ad6ef9888 --- /dev/null +++ b/recipes-platform/images/agl-image-telematics.bb @@ -0,0 +1,9 @@ +SUMMARY = "A basic telematics image" + +require agl-image-telematics.inc + +LICENSE = "MIT" + +IMAGE_INSTALL_append = "\ + profile-telematics \ + " diff --git a/recipes-platform/images/agl-image-telematics.inc b/recipes-platform/images/agl-image-telematics.inc new file mode 100644 index 000000000..3e951550e --- /dev/null +++ b/recipes-platform/images/agl-image-telematics.inc @@ -0,0 +1,5 @@ +require recipes-platform/images/agl-image-boot.inc + +inherit features_check + +REQUIRED_DISTRO_FEATURES = "3g" diff --git a/recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb b/recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb new file mode 100644 index 000000000..75b4f5ce1 --- /dev/null +++ b/recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb @@ -0,0 +1,21 @@ +SUMMARY = "Cross SDK of AGL Distribution for telematics profile Demo" + +DESCRIPTION = "SDK image for AGL Distribution for Telematics profile Demo. \ +It includes the full meta-toolchain, plus developement headers and libraries \ +to form a standalone cross SDK." + +require agl-telematics-demo-platform.bb + +LICENSE = "MIT" + +IMAGE_FEATURES_append = " dev-pkgs" +IMAGE_INSTALL_append = " kernel-dev kernel-devsrc" + +inherit populate_sdk + +# Task do_populate_sdk and do_rootfs can't be exec simultaneously. +# Both exec "createrepo" on the same directory, and so one of them +# can failed (randomly). +addtask do_populate_sdk after do_rootfs + +TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules " diff --git a/recipes-platform/images/agl-telematics-demo-platform.bb b/recipes-platform/images/agl-telematics-demo-platform.bb new file mode 100644 index 000000000..403f4b702 --- /dev/null +++ b/recipes-platform/images/agl-telematics-demo-platform.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "AGL Telematics Demo Platform image." + +require agl-telematics-demo-platform.inc + +LICENSE = "MIT" + +IMAGE_FEATURES_append = " \ + " + +IMAGE_INSTALL_append = " \ + packagegroup-agl-telematics-demo-platform \ + " + diff --git a/recipes-platform/images/agl-telematics-demo-platform.inc b/recipes-platform/images/agl-telematics-demo-platform.inc new file mode 100644 index 000000000..bd3a89ee1 --- /dev/null +++ b/recipes-platform/images/agl-telematics-demo-platform.inc @@ -0,0 +1,3 @@ +# Base image +require recipes-platform/images/agl-image-telematics.inc + diff --git a/recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend b/recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend new file mode 100644 index 000000000..f75f9ab1e --- /dev/null +++ b/recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend @@ -0,0 +1,6 @@ +RDEPENDS_${PN} =+ "nativesdk-af-main-tools nativesdk-af-binder-devtools" +RDEPENDS_${PN} += "nativesdk-low-level-can-generator \ + nativesdk-cmake-apps-module \ + nativesdk-cmake-apps-module-doc \ +" + diff --git a/recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend b/recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend new file mode 100644 index 000000000..d0fa1a2e2 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend @@ -0,0 +1 @@ +RDEPENDS_${PN}_append = " systemd-agl-sync run-agl-postinsts" diff --git a/recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb b/recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb new file mode 100644 index 000000000..cc9ed3d64 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb @@ -0,0 +1,18 @@ +SUMMARY = "AGL web runtime packages" +DESCRIPTION = "Specific packages for the AGL web runtime (minus profile-graphical)" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-html5 \ + " + +ALLOW_EMPTY_${PN} = "1" + +# add packages for WAM +RDEPENDS_${PN} += " \ + chromium-browser-service \ + wam \ + " diff --git a/recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb b/recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb new file mode 100644 index 000000000..2161e1a8e --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb @@ -0,0 +1,29 @@ +SUMMARY = "Qt5 for native GUI framework of AGL IVI profile" +DESCRIPTION = "A set of Qt5 packages which required by Native App Fw Subsystem" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-appfw-native-qt5 \ + " + +#ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + qtbase \ + qtbase-dev \ + qtbase-plugins \ + qtbase-staticdev \ + qtbase-tools \ + qtdeclarative \ + qtdeclarative-qmlplugins \ + qtdeclarative-tools \ + qtcharts \ + qtwayland \ + qtwayland-plugins \ + qtwayland-tools \ + qtgraphicaleffects-qmlplugins \ + qtvirtualkeyboard \ + " diff --git a/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb new file mode 100644 index 000000000..2ca89e4e9 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb @@ -0,0 +1,43 @@ +SUMMARY = "The software for demo platform of AGL cluster profile" +DESCRIPTION = "A set of packages belong to AGL Cluster Demo Platform" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-cluster-demo-platform \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-profile-cluster-qt5 \ + packagegroup-agl-ttf-fonts \ + packagegroup-agl-source-han-sans-ttf-fonts \ + packagegroup-agl-networking \ + " + + +AGL_APPS = " \ + cluster-dashboard \ + cluster-receiver \ + qt-cluster-receiver \ + " + +AGL_APIS = " \ + agl-service-can-low-level \ + agl-service-gps \ + agl-service-signal-composer \ + " + +DEMO_PRELOAD = "${@bb.utils.contains("DISTRO_FEATURES", "agl-cluster-demo-preload", "cluster-dashboard-demo-config", "",d)}" + +RDEPENDS_${PN}_append = " \ + hmi-debug \ + can-utils \ + linux-firmware-ralink \ + ${AGL_APPS} \ + ${AGL_APIS} \ + ${DEMO_PRELOAD} \ +" diff --git a/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb new file mode 100644 index 000000000..70c7356a0 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb @@ -0,0 +1,43 @@ +SUMMARY = "The software for AGL Cluster Demo Qtwayland Compositor" +DESCRIPTION = "A set of packages belong to AGL Cluster Demo Qtwayland Compositor" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-cluster-demo-qtcompositor \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-profile-cluster-qtcompositor \ + packagegroup-agl-ttf-fonts \ + packagegroup-agl-networking \ + " + +AGL_SERVICE = " \ + agl-service-bluetooth \ + agl-service-can-low-level \ + agl-service-data-persistence \ + agl-service-gps \ + agl-service-network \ + agl-service-unicens \ + agl-service-hvac \ + agl-service-nfc \ + agl-service-identity-agent \ + " + +AGL_APPS = " \ + cluster-gauges-qtcompositor \ + " + +RDEPENDS_${PN}_append = " \ + libva-utils \ + linux-firmware-ralink \ + can-utils \ + most \ + ${AGL_SERVICE} \ + ${AGL_APPS} \ +" diff --git a/recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend b/recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend new file mode 100644 index 000000000..dfbddd934 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend @@ -0,0 +1,10 @@ +RDEPENDS_${PN}_append = "\ + pyagl \ + gcov \ + gcov-symlinks \ + gcovr \ + gcovr-wrapper \ + jq \ + htop \ + tree \ +" diff --git a/recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb b/recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb new file mode 100644 index 000000000..adebabe76 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb @@ -0,0 +1,26 @@ +SUMMARY = "The examples to test Qt5 on AGL Demo Platform" +DESCRIPTION = "A set of packages which contains Qt5 examples" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-demo-qt-examples \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + qt3d-examples \ + qtbase-examples \ + qtconnectivity-examples \ + qtdeclarative-examples \ + qtlocation-examples \ + qtmultimedia-examples \ + qtsensors-examples \ + qtsystems-examples \ + qttools-examples \ + qtwayland-examples \ + qtxmlpatterns-examples \ + " diff --git a/recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb b/recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb new file mode 100644 index 000000000..e587ab21c --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "The minimal set of packages for Connectivity Subsystem" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-graphical-services \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} = "\ + ${@bb.utils.contains('DISTRO_FEATURES', 'pipewire', 'agl-service-mediaplayer', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'pipewire', 'agl-service-radio', '', d)} \ + " diff --git a/recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend new file mode 100644 index 000000000..aa401a71e --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'packagegroup-agl-graphical-weston_agldemo.inc', '', d)} diff --git a/recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc new file mode 100644 index 000000000..d7d7be2a3 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc @@ -0,0 +1,8 @@ +RDEPENDS_${PN} += " \ + weston-ini-conf \ + agl-compositor \ + " +# appfw +RDEPENDS_${PN} += " \ + agl-login-manager \ + " diff --git a/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb index acaa405a9..d04c72fa7 100644 --- a/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb +++ b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb @@ -19,9 +19,4 @@ RDEPENDS_${PN} += "\ packagegroup-agl-ivi-graphics \ packagegroup-agl-ivi-multimedia \ packagegroup-agl-ivi-navigation \ - packagegroup-agl-ivi-services \ - " - -RDEPENDS_${PN} += "\ - agl-login-manager \ " diff --git a/recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend similarity index 63% rename from recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend rename to recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend index e1b68abc9..8856d9744 100644 --- a/recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend +++ b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend @@ -1,3 +1,4 @@ RDEPENDS_${PN} += " \ packagegroup-agl-ivi-identity \ + packagegroup-agl-ivi-services \ " diff --git a/recipes-core/packagegroups/packagegroup-agl-ivi-connectivity.bbappend b/recipes-platform/packagegroups/packagegroup-agl-ivi-connectivity.bbappend similarity index 100% rename from recipes-core/packagegroups/packagegroup-agl-ivi-connectivity.bbappend rename to recipes-platform/packagegroups/packagegroup-agl-ivi-connectivity.bbappend diff --git a/recipes-core/packagegroups/packagegroup-agl-ivi-identity.bb b/recipes-platform/packagegroups/packagegroup-agl-ivi-identity.bb similarity index 100% rename from recipes-core/packagegroups/packagegroup-agl-ivi-identity.bb rename to recipes-platform/packagegroups/packagegroup-agl-ivi-identity.bb diff --git a/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb b/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb index 90daf9230..6fa6c920e 100644 --- a/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb +++ b/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb @@ -12,6 +12,6 @@ PACKAGES = "\ RDEPENDS_${PN} += "\ gpsd \ - virtual/gpsd-conf \ geoclue \ + ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'virtual/gpsd-conf', '', d)} \ " diff --git a/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb b/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb index 489916b58..2b09fa417 100644 --- a/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb +++ b/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb @@ -27,4 +27,7 @@ RDEPENDS_${PN} += "\ agl-service-unicens-controller \ agl-service-weather \ ${@bb.utils.contains('AGL_CLOUDPROXY_WANTED','1', 'agl-service-cloudproxy libcloudproxy', '', d)} \ + agl-service-data-persistence \ + agl-service-network \ + agl-service-platform-info \ " diff --git a/recipes-platform/packagegroups/packagegroup-agl-networking.bb b/recipes-platform/packagegroups/packagegroup-agl-networking.bb new file mode 100644 index 000000000..3e89303be --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-networking.bb @@ -0,0 +1,23 @@ +SUMMARY = "The networking for AGL" +DESCRIPTION = "A set of packages for AGL cluster's networking" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-networking \ + " + +ALLOW_EMPTY_${PN} = "1" + + +# fonts +RDEPENDS_${PN}_append = " \ + connman \ + connman-client \ + connman-tools \ + cluster-connman-conf \ + iproute2 \ + dhcp-client \ +" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb new file mode 100644 index 000000000..5436a5617 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb @@ -0,0 +1,21 @@ +SUMMARY = "The middleware for AGL Qt5 based cluster profile" +DESCRIPTION = "The set of packages required for AGL Qt5 based Cluster Distribution" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-profile-cluster-qt5 \ + profile-cluster-qt5 \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-image-boot \ + packagegroup-agl-core-security \ + packagegroup-agl-graphical-weston \ + packagegroup-agl-appfw-native-qt5 \ +" + +RDEPENDS_profile-cluster-qt5 = "${PN}" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb new file mode 100644 index 000000000..9d54b33a4 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb @@ -0,0 +1,36 @@ +SUMMARY = "The middleware for AGL Qt5 based cluster qtcompositor" +DESCRIPTION = "The set of packages required for AGL Qt5 based Cluster Demo Qtcompositor Distribution" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-profile-cluster-qtcompositor \ + profile-cluster-qt5 \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-image-boot \ + packagegroup-agl-core-security \ + packagegroup-agl-core-connectivity \ +" + +QT_LITE = " \ + qtbase \ + qtdeclarative \ + qtwayland \ + qtgraphicaleffects-qmlplugins \ + qtsvg-plugins \ + qtwebsockets \ + qtwebsockets-qmlplugins \ + qtcompositor-conf \ +" + +RDEPENDS_${PN}_append = " \ + ${QT_LITE} \ + agl-login-manager \ +" + +RDEPENDS_profile-cluster-qt5 = "${PN}" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb new file mode 100644 index 000000000..c0c612467 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb @@ -0,0 +1,20 @@ +SUMMARY = "The middleware for AGL cluster profile" +DESCRIPTION = "The set of packages required for AGL Cluster Distribution" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-profile-cluster \ + profile-cluster \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-image-boot \ + packagegroup-agl-core-security \ + packagegroup-agl-graphical-weston \ +" + +RDEPENDS_profile-cluster = "${PN}" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb new file mode 100644 index 000000000..202750140 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb @@ -0,0 +1,23 @@ +SUMMARY = "AGL web runtime profile" +DESCRIPTION = "The full set of packages required for AGL web runtime" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-profile-graphical-html5 \ + profile-graphical-html5 \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-profile-graphical \ + packagegroup-agl-appfw-html5 \ +" + +RDEPENDS_${PN} += "\ + agl-login-manager \ + " + +RDEPENDS_profile-graphical-html5 = "${PN}" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb new file mode 100644 index 000000000..74b35f70a --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb @@ -0,0 +1,23 @@ +SUMMARY = "The middlewares for AGL IVI profile" +DESCRIPTION = "The set of packages required for AGL Distribution" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-profile-graphical-qt5 \ + profile-graphical-qt5 \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-profile-graphical \ + packagegroup-agl-appfw-native-qt5 \ +" + +RDEPENDS_${PN} += "\ + agl-login-manager \ + " + +RDEPENDS_profile-graphical-qt5 = "${PN}" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend new file mode 100644 index 000000000..1c980d93a --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend @@ -0,0 +1,3 @@ +RDEPENDS_${PN} += "\ + packagegroup-agl-graphical-services \ +" diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb new file mode 100644 index 000000000..66fc0f765 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb @@ -0,0 +1,25 @@ +SUMMARY = "The middleware for AGL telematics profile" +DESCRIPTION = "The set of packages required for AGL Telematics Distribution" +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-profile-telematics \ + profile-telematics \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-image-boot \ + packagegroup-agl-core-security \ + ${@bb.utils.contains('VIRTUAL-RUNTIME_net_manager','connman','connman connman-client','',d)} \ + ${@bb.utils.contains("DISTRO_FEATURES", "3g", "libqmi", "", d)} \ + agl-login-manager \ + agl-service-can-low-level \ + agl-service-network \ + can-utils \ +" + +RDEPENDS_profile-telematics = "${PN}" diff --git a/recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb b/recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb new file mode 100644 index 000000000..fb3328990 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb @@ -0,0 +1,20 @@ +SUMMARY = "The Source Han Sans ttf fonts for AGL" +DESCRIPTION = "A set of packages for source Han Sans ttf fonts" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-source-han-sans-ttf-fonts \ + " + +ALLOW_EMPTY_${PN} = "1" + + +# fonts +RDEPENDS_${PN}_append = " \ + source-han-sans-cn-fonts \ + source-han-sans-jp-fonts \ + source-han-sans-tw-fonts \ +" diff --git a/recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb b/recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb new file mode 100644 index 000000000..0dbbd6297 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb @@ -0,0 +1,35 @@ +SUMMARY = "The software for AGL telematics profile demo platform" +DESCRIPTION = "A set of packages belonging to the AGL telematics demo platform" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-telematics-demo-platform \ + " + +ALLOW_EMPTY_${PN} = "1" + +RDEPENDS_${PN} += "\ + packagegroup-agl-profile-telematics \ + " + +AGL_APPS = " \ + telematics-recorder \ + " + +AGL_APIS = " \ + agl-service-gps \ + " + +RDEPENDS_${PN}_append = " \ + gpsd \ + sw-gpsd-udev-conf \ + usb-can-udev-conf \ + simple-can-simulator \ + ${@bb.utils.contains('DISTRO_FEATURES', 'agl-devel', 'ofono-tests gps-utils' , '', d)} \ + ${AGL_APPS} \ + ${AGL_APIS} \ +" +# packagegroup-agl-core-navigation? (brings in geoclue...) diff --git a/recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb b/recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb new file mode 100644 index 000000000..9a3b578c0 --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb @@ -0,0 +1,21 @@ +SUMMARY = "The ttf fonts for AGL" +DESCRIPTION = "A set of packages for fonts" + +LICENSE = "MIT" + +inherit packagegroup + +PACKAGES = "\ + packagegroup-agl-ttf-fonts \ + " + +ALLOW_EMPTY_${PN} = "1" + + +# fonts +RDEPENDS_${PN}_append = " \ + ttf-bitstream-vera \ + ttf-dejavu-sans \ + ttf-dejavu-sans-mono \ + ttf-dejavu-serif \ +" diff --git a/recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend b/recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend new file mode 100644 index 000000000..08afa6c7f --- /dev/null +++ b/recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend @@ -0,0 +1,18 @@ +# add missing dependencies for SDK + +RDEPENDS_${PN} += " \ + qttools-plugins \ + qtquickcontrols-dev \ + qtquickcontrols-qmlplugins \ + qtquickcontrols2-dev \ + qtquickcontrols2-mkspecs \ + qtquickcontrols2-qmlplugins \ +" + +# remove dependency on qtwebkit (still added to SDK by packagegroup-qt5-toolchain-target) +# see SPEC-1159 +RDEPENDS_${PN}_remove = " \ + qtwebkit-dev \ + qtwebkit-mkspecs \ + qtwebkit-qmlplugins \ +" diff --git a/recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb b/recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb new file mode 100644 index 000000000..49111b6e8 --- /dev/null +++ b/recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb @@ -0,0 +1,40 @@ +SUMMARY = "Configuration files for running wayland with a non-weston compositor" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +inherit allarch agl-graphical + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +do_install() { + # Add a rule to ensure the 'display' user has permissions to + # open the graphics device + install -d ${D}${sysconfdir}/udev/rules.d + cat >${D}${sysconfdir}/udev/rules.d/zz-dri.rules <<'EOF' +SUBSYSTEM=="drm", MODE="0660", GROUP="${WESTONGROUP}", SECLABEL{smack}="*" +EOF + + # user 'display' must also be able to access /dev/input/* + cat >${D}${sysconfdir}/udev/rules.d/zz-input.rules <<'EOF' +SUBSYSTEM=="input", MODE="0660", GROUP="input", SECLABEL{smack}="^" +EOF + + # user 'display' must also be able to access /dev/media*, etc. + cat >${D}${sysconfdir}/udev/rules.d/zz-remote-display.rules <<'EOF' +SUBSYSTEM=="media", MODE="0660", GROUP="display", SECLABEL{smack}="*" +SUBSYSTEM=="video4linux", MODE="0660", GROUP="display", SECLABEL{smack}="*" +KERNEL=="uvcs", SUBSYSTEM=="misc", MODE="0660", GROUP="display", SECLABEL{smack}="*" +KERNEL=="rgnmm", SUBSYSTEM=="misc", MODE="0660", GROUP="display", SECLABEL{smack}="*" +EOF +} + +do_install_append_imx() { + install -d ${D}${sysconfdir}/udev/rules.d + cat >>${D}${sysconfdir}/udev/rules.d/zz-dri.rules <<'EOF' +SUBSYSTEM=="gpu_class", MODE="0660", GROUP="${WESTONGROUP}", SECLABEL{smack}="*" +EOF + +} + +RCONFLICTS_${PN} = "weston-init" diff --git a/recipes-qt/qt/qtbase-native_git.bbappendTOCHECK b/recipes-qt/qt/qtbase-native_git.bbappendTOCHECK new file mode 100644 index 000000000..b7cfe8dce --- /dev/null +++ b/recipes-qt/qt/qtbase-native_git.bbappendTOCHECK @@ -0,0 +1,3 @@ +# Backport this fix from meta-qt5: +# https://github.com/meta-qt5/meta-qt5/commit/bf7cdd963008f2d61bc4c324fff2bfafe511fb5f +SRC_URI_remove = "file://0012-qdbuscpp2xml.pro-do-not-build-with-bootstrapped-depe.patch" diff --git a/recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch b/recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch new file mode 100644 index 000000000..10a1ddd88 --- /dev/null +++ b/recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch @@ -0,0 +1,30 @@ +From a4943bb5c7fdf5eb297223d2c3bb02d2271bea48 Mon Sep 17 00:00:00 2001 +From: Risto Avila +Date: Thu, 17 Dec 2015 04:22:53 +0200 +Subject: [PATCH] Force qdbus to make introspect for every findMetaObject + +--- + src/dbus/qdbusintegrator.cpp | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp +index cce8b9c..ae2a9dc 100644 +--- a/src/dbus/qdbusintegrator.cpp ++++ b/src/dbus/qdbusintegrator.cpp +@@ -2512,8 +2512,11 @@ QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &pa + if (!interface.isEmpty()) { + QDBusReadLocker locker(FindMetaObject1Action, this); + QDBusMetaObject *mo = cachedMetaObjects.value(interface, 0); +- if (mo) +- return mo; ++ if (mo) { ++ // service is not unique. Remove cached object to force introspect ++ cachedMetaObjects.remove(interface); ++ delete mo; ++ } + } + + // introspect the target object +-- +1.9.1 + diff --git a/recipes-qt/qt/qtbase_%.bbappend b/recipes-qt/qt/qtbase_%.bbappend new file mode 100644 index 000000000..ff8fe687c --- /dev/null +++ b/recipes-qt/qt/qtbase_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtbase_agldemo.inc', '', d)} diff --git a/recipes-qt/qt/qtbase_agldemo.inc b/recipes-qt/qt/qtbase_agldemo.inc new file mode 100644 index 000000000..357e1e8bb --- /dev/null +++ b/recipes-qt/qt/qtbase_agldemo.inc @@ -0,0 +1,16 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/qtbase:" + +PACKAGECONFIG_WAYLAND = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)}" + +PACKAGECONFIG_GL = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', '', d)}" +# FIXME CLUSTER +#PACKAGECONFIG_GL_append = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', ' eglfs kms gbm', '', d)}" +# +PACKAGECONFIG_append = " ${PACKAGECONFIG_WAYLAND} icu accessibility" +PACKAGECONFIG_append = " fontconfig" +PACKAGECONFIG_append = " sql-sqlite" + +EXTRA_OECONF_append = "" + +# '-qpa wayland-egl' set wayland-egl as default of platform plagins +PACKAGECONFIG[wayland]="-qpa wayland-egl -no-qpa-platform-guard" diff --git a/recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch b/recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch new file mode 100644 index 000000000..ba8a991ed --- /dev/null +++ b/recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch @@ -0,0 +1,47 @@ +From 58197439eade86e7efc6fe98116c0092ea429d29 Mon Sep 17 00:00:00 2001 +From: Matt Ranostay +Date: Tue, 10 Mar 2020 13:59:58 -0700 +Subject: [PATCH] mapbox: update API url to match new schema + +--- + src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp | 7 ++++--- + src/plugins/geoservices/mapbox/qmapboxcommon.h | 2 +- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp b/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp +index 0b128556..bd2be6b6 100644 +--- a/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp ++++ b/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp +@@ -88,12 +88,13 @@ QGeoTiledMapReply *QGeoTileFetcherMapbox::getTileImage(const QGeoTileSpec &spec) + request.setRawHeader("User-Agent", m_userAgent); + + request.setUrl(QUrl(mapboxTilesApiPath + +- ((spec.mapId() >= m_mapIds.size()) ? QStringLiteral("mapbox.streets") : m_mapIds[spec.mapId() - 1]) + QLatin1Char('/') + ++ m_mapIds[m_mapIds.size() - 1] + ++ QStringLiteral("/tiles/256/") + + QString::number(spec.zoom()) + QLatin1Char('/') + + QString::number(spec.x()) + QLatin1Char('/') + + QString::number(spec.y()) + +- ((m_scaleFactor > 1) ? (QLatin1Char('@') + QString::number(m_scaleFactor) + QLatin1String("x.")) : QLatin1String(".")) + +- m_format + QLatin1Char('?') + ++ ((m_scaleFactor > 1) ? (QLatin1Char('@') + QString::number(m_scaleFactor) + QLatin1String("x")) : QLatin1String("")) + ++ QLatin1Char('?') + + QStringLiteral("access_token=") + m_accessToken)); + + QNetworkReply *reply = m_networkManager->get(request); +diff --git a/src/plugins/geoservices/mapbox/qmapboxcommon.h b/src/plugins/geoservices/mapbox/qmapboxcommon.h +index e60c4e83..4b2ea98d 100644 +--- a/src/plugins/geoservices/mapbox/qmapboxcommon.h ++++ b/src/plugins/geoservices/mapbox/qmapboxcommon.h +@@ -46,7 +46,7 @@ + + QT_BEGIN_NAMESPACE + +-static const QString mapboxTilesApiPath = QStringLiteral("http://api.tiles.mapbox.com/v4/"); ++static const QString mapboxTilesApiPath = QStringLiteral("https://api.mapbox.com/"); + + // https://www.mapbox.com/api-documentation/#geocoding + static const QString mapboxGeocodingApiPath = QStringLiteral("https://api.mapbox.com/geocoding/v5/mapbox.places/"); +-- +2.25.0 + diff --git a/recipes-qt/qt/qtlocation_%.bbappend b/recipes-qt/qt/qtlocation_%.bbappend new file mode 100644 index 000000000..b12c42810 --- /dev/null +++ b/recipes-qt/qt/qtlocation_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtlocation_agldemo.inc', '', d)} diff --git a/recipes-qt/qt/qtlocation_agldemo.inc b/recipes-qt/qt/qtlocation_agldemo.inc new file mode 100644 index 000000000..7d112d03d --- /dev/null +++ b/recipes-qt/qt/qtlocation_agldemo.inc @@ -0,0 +1,14 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/qtlocation:" + +SRC_URI += "\ + file://0001-mapbox-update-API-url-to-match-new-schema.patch \ + " + +# Need to explicitly enable the various plugins +PACKAGECONFIG += " \ + geoservices_osm \ + geoservices_here \ + geoservices_itemsoverlay \ + geoservices_mapbox \ + geoservices_mapboxgl \ +" diff --git a/recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch b/recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch new file mode 100644 index 000000000..007e46763 --- /dev/null +++ b/recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch @@ -0,0 +1,80 @@ +From ed61f1d932c5c6d38458fcd2e1d5d154383f017e Mon Sep 17 00:00:00 2001 +From: Tasuku Suzuki +Date: Mon, 12 Dec 2016 16:32:47 +0900 +Subject: [PATCH] metadata image support with the "data" URL scheme for QtQuick + +add posterImage, coverArtImage and thumbnailImage to metadata + +Change-Id: I10b9bae10c219ffa41506d6e6b345020790217a6 +--- + .../multimedia/qdeclarativemediametadata_p.h | 33 ++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + +diff --git a/src/imports/multimedia/qdeclarativemediametadata_p.h b/src/imports/multimedia/qdeclarativemediametadata_p.h +index ede7f87..6a6a815 100644 +--- a/src/imports/multimedia/qdeclarativemediametadata_p.h ++++ b/src/imports/multimedia/qdeclarativemediametadata_p.h +@@ -51,6 +51,9 @@ + // We mean it. + // + ++#include ++#include ++#include + #include + #include + #include +@@ -153,6 +156,9 @@ class QDeclarativeMediaMetaData : public QObject + Q_PROPERTY(QVariant gpsProcessingMethod READ gpsProcessingMethod WRITE setGPSProcessingMethod NOTIFY metaDataChanged) + Q_PROPERTY(QVariant gpsAreaInformation READ gpsAreaInformation WRITE setGPSAreaInformation NOTIFY metaDataChanged) + ++ Q_PROPERTY(QVariant posterImage READ posterImage NOTIFY metaDataChanged) ++ Q_PROPERTY(QVariant coverArtImage READ coverArtImage NOTIFY metaDataChanged) ++ Q_PROPERTY(QVariant thumbnailImage READ thumbnailImage NOTIFY metaDataChanged) + public: + QDeclarativeMediaMetaData(QMediaObject *player, QObject *parent = 0) + : QObject(parent) +@@ -425,6 +431,16 @@ QT_WARNING_POP + void setGPSAreaInformation(const QVariant &information) { + setMetaData(QMediaMetaData::GPSAreaInformation, information); } + ++ QVariant posterImage() const { ++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::PosterImage)); ++ } ++ QVariant coverArtImage() const { ++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::CoverArtImage)); ++ } ++ QVariant thumbnailImage() const { ++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::ThumbnailImage)); ++ } ++ + Q_SIGNALS: + void metaDataChanged(); + +@@ -440,6 +456,23 @@ private: + m_writerControl->setMetaData(key, value); + } + ++ QUrl convertImageToUrl(const QVariant &variant) const ++ { ++ if (variant.type() != QVariant::Image) ++ return QUrl(); ++ ++ QImage image = variant.value(); ++ QByteArray data; ++ QBuffer buffer(&data); ++ buffer.open(QBuffer::WriteOnly); ++ QImageWriter png(&buffer, "png"); ++ if (!png.write(image)) { ++ return QUrl(); ++ } ++ buffer.close(); ++ return QUrl(QStringLiteral("data:image/png;base64,") + data.toBase64()); ++ } ++ + QMediaObject *m_mediaObject; + QMetaDataWriterControl *m_writerControl; + bool m_requestedWriterControl; +-- +2.7.4 + diff --git a/recipes-qt/qt/qtmultimedia_%.bbappend b/recipes-qt/qt/qtmultimedia_%.bbappend new file mode 100644 index 000000000..dacca3bd5 --- /dev/null +++ b/recipes-qt/qt/qtmultimedia_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtmultimedia_agldemo.inc', '', d)} diff --git a/recipes-qt/qt/qtmultimedia_agldemo.inc b/recipes-qt/qt/qtmultimedia_agldemo.inc new file mode 100644 index 000000000..a8ef5afa1 --- /dev/null +++ b/recipes-qt/qt/qtmultimedia_agldemo.inc @@ -0,0 +1,7 @@ +FILESEXTRAPATHS_append := ":${THISDIR}/qtmultimedia" + +PACKAGECONFIG_append = " gstreamer" + +SRC_URI_append = " \ + file://0001-metadata-image-support-with-the-data-URL-scheme-for-.patch \ + " diff --git a/recipes-qt/qt/qtsystems_%.bbappend b/recipes-qt/qt/qtsystems_%.bbappend new file mode 100644 index 000000000..4fe0f28c4 --- /dev/null +++ b/recipes-qt/qt/qtsystems_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtsystems_agldemo.inc', '', d)} diff --git a/recipes-qt/qt/qtsystems_agldemo.inc b/recipes-qt/qt/qtsystems_agldemo.inc new file mode 100644 index 000000000..550c58d05 --- /dev/null +++ b/recipes-qt/qt/qtsystems_agldemo.inc @@ -0,0 +1,3 @@ +DEPENDS_remove = "bluez4" +# currently Qt5 does not support bluez5 "Nothing PROVIDES 'gconfbluez5'" +#DEPENDS_append = "bluez5" diff --git a/recipes-qt/qt/qtwayland-config/qtwayland b/recipes-qt/qt/qtwayland-config/qtwayland new file mode 100644 index 000000000..a371c6c4e --- /dev/null +++ b/recipes-qt/qt/qtwayland-config/qtwayland @@ -0,0 +1,12 @@ +QT_WAYLAND_SHELL_INTEGRATION=@QT_WAYLAND_DEFAULT_SHELL@ +# The following might be necessary when multiple/split surfaces are created. +# Without this, QtWayland will sometimes maintain the same/old size even if the +# split surface is destroyed. +# We keep it disabled by default as it causes an additional repaint of the +# surface until the compositor sends a configure event to scale the window to +# the actual area. Typical windows will, by default, have an initial size set +# by qtwayland when starting-up (without an explicit size specified by the +# application). +# Note that QtWayland will only test the presence of the environment variable +# so it will be enabled even if set to 0 +# QT_WAYLAND_RESIZE_AFTER_SWAP=1 diff --git a/recipes-qt/qt/qtwayland-config_1.0.0.bb b/recipes-qt/qt/qtwayland-config_1.0.0.bb new file mode 100644 index 000000000..ae7c956d4 --- /dev/null +++ b/recipes-qt/qt/qtwayland-config_1.0.0.bb @@ -0,0 +1,21 @@ +SUMMARY = "QtWayland config file." +DESCRIPTION = "Config file for qtwayland." +SECTION = "apps" +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = "file://qtwayland" + +inherit allarch + +QTWAYLAND_DEFAULT_SHELL ?= "xdg-shell" + +do_compile[noexec] = "1" + +do_install () { + install -D -m 644 ${WORKDIR}/qtwayland ${D}${sysconfdir}/afm/unit.env.d/qtwayland + sed -i -e 's/@QT_WAYLAND_DEFAULT_SHELL@/${QTWAYLAND_DEFAULT_SHELL}/' ${D}${sysconfdir}/afm/unit.env.d/qtwayland +} + +RPROVIDES_${PN} += "virtual/qtwayland-config" diff --git a/recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch b/recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch new file mode 100644 index 000000000..c91e11704 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch @@ -0,0 +1,56 @@ +From 8caaf802a8b42e9bb1d74fc335a571882c75d73e Mon Sep 17 00:00:00 2001 +From: Holger Behrens +Date: Tue, 3 Feb 2015 09:52:52 +0100 +Subject: [meta-ivi-demo][PATCH 1/2] protocol: update 3rd party ivi-application + protocol + +Signed-off-by: Holger Behrens +--- + src/3rdparty/protocol/ivi-application.xml | 31 +++---------------------------- + 1 file changed, 3 insertions(+), 28 deletions(-) + +diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml +index 833fd38..b06ae6c 100644 +--- a/src/3rdparty/protocol/ivi-application.xml ++++ b/src/3rdparty/protocol/ivi-application.xml +@@ -42,34 +42,9 @@ + + + +- +- +- These define all possible warning codes returned by ivi compositor on server-side warnings. +- invalid_wl_surface: +- - wl_surface already has a another role. +- - wl_surface is destroyed before the ivi_surface is destroyed. +- ivi_id_in_use: ivi_id is already assigned by another application. +- +- +- +- +- +- +- +- The ivi compositor encountered warning while processing a request by this +- application. The warning is defined by argument warning_code and optional +- warning_text. If the warning is detected, client shall destroy the ivi_surface +- object. +- +- When a warning event is sent, the compositor turns the ivi_surface object inert. +- The ivi_surface will not deliver further events, all requests on it are ignored +- except 'destroy', and the association to the ivi_id is removed. The client +- should destroy the ivi_surface object. If an inert ivi_surface object is used as +- an argument to any other object's request, that request will [produce a fatal +- error / produce a warning / be ignored]. +- +- +- ++ ++ ++ + + + +-- +2.2.1 + diff --git a/recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch b/recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch new file mode 100644 index 000000000..591ef71c5 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch @@ -0,0 +1,34 @@ +From 31c60aedf415fd06b5c1aa16fdcef1504b67b96d Mon Sep 17 00:00:00 2001 +From: Holger Behrens +Date: Tue, 3 Feb 2015 09:53:43 +0100 +Subject: [meta-ivi-demo][PATCH 2/2] qwaylandwindow: add support for + IVI-Surface-ID property + +Signed-off-by: Holger Behrens +--- + src/client/qwaylandwindow.cpp | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 45a58f2..781081a 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -100,7 +100,14 @@ QWaylandWindow::QWaylandWindow(QWindow *window) + + if (!(window->flags() & Qt::BypassWindowManagerHint)) { + if (mDisplay->shellIvi()) { +- mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this); ++ unsigned int id = 0; ++ QVariant value = window->property("IVI-Surface-ID"); ++ if (value.isValid()) { ++ id = value.toUInt(); ++ } else { ++ id = IVI_SURFACE_ID + getpid(); ++ } ++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(id, object()), this); + } else if (mDisplay->shellXdg()) { + if (window->type() & Qt::Window) { + mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this); +-- +2.2.1 + diff --git a/recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch b/recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch new file mode 100644 index 000000000..39296c769 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch @@ -0,0 +1,33 @@ +Add qt5wayland.manifest. Removed specfile change from patch. + +Adapted from: + +From 424c23191d81b072255bd7f178ad0ee2c2ea091a Mon Sep 17 00:00:00 2001 +From: Tomasz Olszak +Date: Fri, 25 Apr 2014 14:32:22 +0200 +Subject: [PATCH 10/21] Added manifest file according to smack 3-domain model. + +Bug-Tizen:TIVI-2416 + +Change-Id: I414e245a5c8847bec32ef6a97569d0f06221e1db +Signed-off-by: Tomasz Olszak +--- + packaging/qt5-qtwayland.manifest | 5 +++++ + packaging/qt5-qtwayland.spec | 4 ++++ + 2 files changed, 9 insertions(+) + create mode 100644 packaging/qt5-qtwayland.manifest + +diff --git a/packaging/qt5-qtwayland.manifest b/packaging/qt5-qtwayland.manifest +new file mode 100644 +index 0000000..75b0fa5 +--- /dev/null ++++ b/packaging/qt5-qtwayland.manifest +@@ -0,0 +1,5 @@ ++ ++ ++ ++ ++ +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch b/recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch new file mode 100644 index 000000000..6bea62621 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch @@ -0,0 +1,468 @@ +From 5cd43dc7519f54f9786fb6c686a2ce1e682d4366 Mon Sep 17 00:00:00 2001 +From: Philippe Coval +Date: Fri, 25 Apr 2014 10:31:42 +0200 +Subject: [PATCH 16/21] xdg-shell: Add xdg-shell protocol file version 1.4.0 + +Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.4.0 + +This file will need to be refreshed on protocol update +until xdg-shell land in wayland's public headers + +Task-number: QTBUG-38633/part/1of2 +Change-Id: I397d863dcfc2223ac6eb234c37dbcd7449ecffff +Reviewed-by: Giulio Camuffo +Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/c2a22eea6716e073875474adf624d8463eba836c +Bug-Tizen: TIVI-3113/part +Signed-off-by: Philippe Coval +--- + src/3rdparty/protocol/xdg-shell.xml | 438 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 438 insertions(+) + create mode 100644 src/3rdparty/protocol/xdg-shell.xml + +diff --git a/src/3rdparty/protocol/xdg-shell.xml b/src/3rdparty/protocol/xdg-shell.xml +new file mode 100644 +index 0000000..4e5cff8 +--- /dev/null ++++ b/src/3rdparty/protocol/xdg-shell.xml +@@ -0,0 +1,438 @@ ++ ++ ++ ++ ++ Copyright © 2008-2013 Kristian Høgsberg ++ Copyright © 2013 Rafael Antognolli ++ Copyright © 2013 Jasper St. Pierre ++ Copyright © 2010-2013 Intel Corporation ++ ++ Permission to use, copy, modify, distribute, and sell this ++ software and its documentation for any purpose is hereby granted ++ without fee, provided that the above copyright notice appear in ++ all copies and that both that copyright notice and this permission ++ notice appear in supporting documentation, and that the name of ++ the copyright holders not be used in advertising or publicity ++ pertaining to distribution of the software without specific, ++ written prior permission. The copyright holders make no ++ representations about the suitability of this software for any ++ purpose. It is provided "as is" without express or implied ++ warranty. ++ ++ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS ++ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND ++ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ++ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ++ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ++ THIS SOFTWARE. ++ ++ ++ ++ ++ This interface is implemented by servers that provide ++ desktop-style user interfaces. ++ ++ It allows clients to associate a xdg_surface with ++ a basic surface. ++ ++ ++ ++ ++ Use this enum to check the protocol version, and it will be updated ++ automatically. ++ ++ ++ ++ ++ ++ ++ ++ Use this request in order to enable use of this interface. ++ ++ Understand and agree that one is using an unstable interface, ++ that will likely change in the future, breaking the API. ++ ++ ++ ++ ++ ++ ++ Create a shell surface for an existing surface. ++ ++ Only one shell or popup surface can be associated with a given ++ surface. ++ ++ ++ ++ ++ ++ ++ ++ Create a popup surface for an existing surface. ++ ++ Only one shell or popup surface can be associated with a given ++ surface. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ An interface that may be implemented by a wl_surface, for ++ implementations that provide a desktop-style user interface. ++ ++ It provides requests to treat surfaces like windows, allowing to set ++ properties like maximized, fullscreen, minimized, and to move and resize ++ them, and associate metadata like title and app id. ++ ++ On the server side the object is automatically destroyed when ++ the related wl_surface is destroyed. On client side, ++ xdg_surface.destroy() must be called before destroying ++ the wl_surface object. ++ ++ ++ ++ ++ The xdg_surface interface is removed from the wl_surface object ++ that was turned into a xdg_surface with ++ xdg_shell.get_xdg_surface request. The xdg_surface properties, ++ like maximized and fullscreen, are lost. The wl_surface loses ++ its role as a xdg_surface. The wl_surface is unmapped. ++ ++ ++ ++ ++ ++ Setting a surface as transient of another means that it is child ++ of another surface. ++ ++ Child surfaces are stacked above their parents, and will be ++ unmapped if the parent is unmapped too. They should not appear ++ on task bars and alt+tab. ++ ++ ++ ++ ++ ++ ++ Set a short title for the surface. ++ ++ This string may be used to identify the surface in a task bar, ++ window list, or other user interface elements provided by the ++ compositor. ++ ++ The string must be encoded in UTF-8. ++ ++ ++ ++ ++ ++ ++ Set an id for the surface. ++ ++ The app id identifies the general class of applications to which ++ the surface belongs. ++ ++ It should be the ID that appears in the new desktop entry ++ specification, the interface name. ++ ++ ++ ++ ++ ++ ++ A client must respond to a ping event with a pong request or ++ the client may be deemed unresponsive. ++ ++ ++ ++ ++ ++ ++ Ping a client to check if it is receiving events and sending ++ requests. A client is expected to reply with a pong request. ++ ++ ++ ++ ++ ++ ++ Start a pointer-driven move of the surface. ++ ++ This request must be used in response to a button press event. ++ The server may ignore move requests depending on the state of ++ the surface (e.g. fullscreen or maximized). ++ ++ ++ ++ ++ ++ ++ ++ These values are used to indicate which edge of a surface ++ is being dragged in a resize operation. The server may ++ use this information to adapt its behavior, e.g. choose ++ an appropriate cursor image. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Start a pointer-driven resizing of the surface. ++ ++ This request must be used in response to a button press event. ++ The server may ignore resize requests depending on the state of ++ the surface (e.g. fullscreen or maximized). ++ ++ ++ ++ ++ ++ ++ ++ ++ The configure event asks the client to resize its surface. ++ ++ The size is a hint, in the sense that the client is free to ++ ignore it if it doesn't resize, pick a smaller size (to ++ satisfy aspect ratio or resize in steps of NxM pixels). ++ ++ The edges parameter provides a hint about how the surface ++ was resized. The client may use this information to decide ++ how to adjust its content to the new size (e.g. a scrolling ++ area might adjust its content position to leave the viewable ++ content unmoved). Valid edge values are from resize_edge enum. ++ ++ The client is free to dismiss all but the last configure ++ event it received. ++ ++ The width and height arguments specify the size of the window ++ in surface local coordinates. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Set the default output used by this surface when it is first mapped. ++ ++ If this value is NULL (default), it's up to the compositor to choose ++ which display will be used to map this surface. ++ ++ When fullscreen or maximized state are set on this surface, and it ++ wasn't mapped yet, the output set with this method will be used. ++ Otherwise, the output where the surface is currently mapped will be ++ used. ++ ++ ++ ++ ++ ++ ++ Event sent from the compositor to the client requesting that the client ++ goes to a fullscreen state. It's the client job to call set_fullscreen ++ and really trigger the fullscreen state. ++ ++ ++ ++ ++ ++ Event sent from the compositor to the client requesting that the client ++ leaves the fullscreen state. It's the client job to call ++ unset_fullscreen and really leave the fullscreen state. ++ ++ ++ ++ ++ ++ Set the surface as fullscreen. ++ ++ After this request, the compositor should send a configure event ++ informing the output size. ++ ++ This request informs the compositor that the next attached buffer ++ committed will be in a fullscreen state. The buffer size should be the ++ same size as the size informed in the configure event, if the client ++ doesn't want to leave any empty area. ++ ++ In other words: the next attached buffer after set_maximized is the new ++ maximized buffer. And the surface will be positioned at the maximized ++ position on commit. ++ ++ A simple way to synchronize and wait for the correct configure event is ++ to use a wl_display.sync request right after the set_fullscreen ++ request. When the sync callback returns, the last configure event ++ received just before it will be the correct one, and should contain the ++ right size for the surface to maximize. ++ ++ Setting one state won't unset another state. Use ++ xdg_surface.unset_fullscreen for unsetting it. ++ ++ ++ ++ ++ ++ Unset the surface fullscreen state. ++ ++ Same negotiation as set_fullscreen must be used. ++ ++ ++ ++ ++ ++ Event sent from the compositor to the client requesting that the client ++ goes to a maximized state. It's the client job to call set_maximized ++ and really trigger the maximized state. ++ ++ ++ ++ ++ ++ Event sent from the compositor to the client requesting that the client ++ leaves the maximized state. It's the client job to call unset_maximized ++ and really leave the maximized state. ++ ++ ++ ++ ++ ++ Set the surface as maximized. ++ ++ After this request, the compositor will send a configure event ++ informing the output size minus panel and other MW decorations. ++ ++ This request informs the compositor that the next attached buffer ++ committed will be in a maximized state. The buffer size should be the ++ same size as the size informed in the configure event, if the client ++ doesn't want to leave any empty area. ++ ++ In other words: the next attached buffer after set_maximized is the new ++ maximized buffer. And the surface will be positioned at the maximized ++ position on commit. ++ ++ A simple way to synchronize and wait for the correct configure event is ++ to use a wl_display.sync request right after the set_maximized request. ++ When the sync callback returns, the last configure event received just ++ before it will be the correct one, and should contain the right size ++ for the surface to maximize. ++ ++ Setting one state won't unset another state. Use ++ xdg_surface.unset_maximized for unsetting it. ++ ++ ++ ++ ++ ++ Unset the surface maximized state. ++ ++ Same negotiation as set_maximized must be used. ++ ++ ++ ++ ++ ++ Set the surface minimized state. ++ ++ Setting one state won't unset another state. ++ ++ ++ ++ ++ ++ The focused_set event is sent when this surface has been ++ activated. Window decorations should be updated accordingly. ++ ++ ++ ++ ++ ++ The focused_unset event is sent when this surface has been ++ deactivated, because another surface has been activated. Window ++ decorations should be updated accordingly. ++ ++ ++ ++ ++ ++ ++ An interface that may be implemented by a wl_surface, for ++ implementations that provide a desktop-style popups/menus. A popup ++ surface is a transient surface with an added pointer grab. ++ ++ An existing implicit grab will be changed to owner-events mode, ++ and the popup grab will continue after the implicit grab ends ++ (i.e. releasing the mouse button does not cause the popup to be ++ unmapped). ++ ++ The popup grab continues until the window is destroyed or a mouse ++ button is pressed in any other clients window. A click in any of ++ the clients surfaces is reported as normal, however, clicks in ++ other clients surfaces will be discarded and trigger the callback. ++ ++ The x and y arguments specify the locations of the upper left ++ corner of the surface relative to the upper left corner of the ++ parent surface, in surface local coordinates. ++ ++ xdg_popup surfaces are always transient for another surface. ++ ++ ++ ++ ++ The xdg_surface interface is removed from the wl_surface object ++ that was turned into a xdg_surface with ++ xdg_shell.get_xdg_surface request. The xdg_surface properties, ++ like maximized and fullscreen, are lost. The wl_surface loses ++ its role as a xdg_surface. The wl_surface is unmapped. ++ ++ ++ ++ ++ ++ A client must respond to a ping event with a pong request or ++ the client may be deemed unresponsive. ++ ++ ++ ++ ++ ++ ++ Ping a client to check if it is receiving events and sending ++ requests. A client is expected to reply with a pong request. ++ ++ ++ ++ ++ ++ ++ The popup_done event is sent out when a popup grab is broken, ++ that is, when the users clicks a surface that doesn't belong ++ to the client owning the popup surface. ++ ++ ++ ++ ++ ++ +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch b/recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch new file mode 100644 index 000000000..fe1bb50e8 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch @@ -0,0 +1,1029 @@ +From 0edba039247ce888dbb7ff0a93c7b9ec01bac46e Mon Sep 17 00:00:00 2001 +From: Philippe Coval +Date: Wed, 26 Mar 2014 10:16:01 +0100 +Subject: [PATCH 17/21] xdg-shell: Add minimize feature to QWindow using + wayland's xdg-shell + +The feature is disabled by default, +and can be enabled at runtime +by exporting QT_WAYLAND_USE_XDG_SHELL env variable. + +This patch relies on presence of protocol file +which has been imported from weston-1.4.0 sources, +until the xdg-shell is merge into wayland itself. + +Because xdg-shell is experimental, +code fallback to WaylandShell if no XdgShell +but keep in mind those shells are exclusive. + +Since xdg-shell and wayland-shell share most of the API, +some factorization is done by an (empty) abstraction class +to keep the code more readable. + +Despite xdg-shell introduces new popups concept, +they're not used on this change for maitainance purpose. + +Notes: + +* This change depends on presence of xdg-shell protocol file. + +* You can check a demo video + (qt-tizen-cinematic-experience-20140430-rzr) + of the test case at : + https://www.youtube.com/watch?v=pY_XXvKc_0E# + +* Use Super+Tab to show window again if hidden + +Task-number: QTBUG-38633/part/2of2 +Change-Id: I2d7ed85bea1847d82439fdfc893a3dbb2581ffff +Reviewed-by: Giulio Camuffo +Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/768484daaa64bea965bef981a16f59be8db0c190 +Bug-Tizen: TIVI-3113/part +Signed-off-by: Philippe Coval +--- + src/client/client.pro | 5 + + src/client/qwaylanddisplay.cpp | 5 + + src/client/qwaylanddisplay_p.h | 4 + + src/client/qwaylandshellsurface.cpp | 134 ------------------------ + src/client/qwaylandshellsurface_p.h | 40 +++----- + src/client/qwaylandwindow.cpp | 40 ++++++-- + src/client/qwaylandwlshellsurface.cpp | 186 ++++++++++++++++++++++++++++++++++ + src/client/qwaylandwlshellsurface_p.h | 101 ++++++++++++++++++ + src/client/qwaylandxdgsurface.cpp | 173 +++++++++++++++++++++++++++++++ + src/client/qwaylandxdgsurface_p.h | 105 +++++++++++++++++++ + 10 files changed, 625 insertions(+), 168 deletions(-) + create mode 100644 src/client/qwaylandwlshellsurface.cpp + create mode 100644 src/client/qwaylandwlshellsurface_p.h + create mode 100644 src/client/qwaylandxdgsurface.cpp + create mode 100644 src/client/qwaylandxdgsurface_p.h + +diff --git a/src/client/client.pro b/src/client/client.pro +index 10cbd31..9ecf82f 100644 +--- a/src/client/client.pro ++++ b/src/client/client.pro +@@ -41,6 +41,7 @@ WAYLANDCLIENTSOURCES += \ + ../extensions/qtkey-extension.xml \ + ../extensions/windowmanager.xml \ + ../3rdparty/protocol/text.xml \ ++ ../3rdparty/protocol/xdg-shell.xml \ + + SOURCES += qwaylandintegration.cpp \ + qwaylandnativeinterface.cpp \ +@@ -57,6 +58,8 @@ SOURCES += qwaylandintegration.cpp \ + qwaylanddatadevicemanager.cpp \ + qwaylanddatasource.cpp \ + qwaylandshellsurface.cpp \ ++ qwaylandwlshellsurface.cpp \ ++ qwaylandxdgsurface.cpp \ + qwaylandextendedoutput.cpp \ + qwaylandextendedsurface.cpp \ + qwaylandsubsurface.cpp \ +@@ -85,6 +88,8 @@ HEADERS += qwaylandintegration_p.h \ + qwaylanddatadevicemanager_p.h \ + qwaylanddatasource_p.h \ + qwaylandshellsurface_p.h \ ++ qwaylandwlshellsurface_p.h \ ++ qwaylandxdgsurface_p.h \ + qwaylandextendedoutput_p.h \ + qwaylandextendedsurface_p.h \ + qwaylandsubsurface_p.h \ +diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp +index 0b715c0..7f953ad 100644 +--- a/src/client/qwaylanddisplay.cpp ++++ b/src/client/qwaylanddisplay.cpp +@@ -61,6 +61,7 @@ + #include "qwaylandqtkey_p.h" + + #include ++#include + + #include + #include +@@ -206,6 +207,10 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin + mCompositor.init(registry, id); + } else if (interface == QStringLiteral("wl_shm")) { + mShm = static_cast(wl_registry_bind(registry, id, &wl_shm_interface,1)); ++ } else if (interface == QStringLiteral("xdg_shell") ++ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) { ++ mShellXdg.reset(new QtWayland::xdg_shell(registry, id)); ++ mShellXdg->use_unstable_version(QtWayland::xdg_shell::version_current); + } else if (interface == QStringLiteral("wl_shell")){ + mShell.reset(new QtWayland::wl_shell(registry, id)); + } else if (interface == QStringLiteral("wl_seat")) { +diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h +index 40cb2b2..cf5dfc2 100644 +--- a/src/client/qwaylanddisplay_p.h ++++ b/src/client/qwaylanddisplay_p.h +@@ -51,6 +51,7 @@ + + #include + #include ++#include + + struct wl_cursor_image; + +@@ -78,6 +79,7 @@ namespace QtWayland { + class qt_sub_surface_extension; + class qt_surface_extension; + class wl_text_input_manager; ++ class xdg_shell; + } + + typedef void (*RegistryListener)(void *data, +@@ -113,6 +115,7 @@ public: + QtWayland::wl_compositor *compositor() { return &mCompositor; } + + QtWayland::wl_shell *shell() { return mShell.data(); } ++ QtWayland::xdg_shell *shellXdg() { return mShellXdg.data(); } + + QList inputDevices() const { return mInputDevices; } + QWaylandInputDevice *defaultInputDevice() const; +@@ -168,6 +171,7 @@ private: + QThread *mEventThread; + QWaylandEventThread *mEventThreadObject; + QScopedPointer mShell; ++ QScopedPointer mShellXdg; + QList mScreens; + QList mInputDevices; + QList mRegistryListeners; +diff --git a/src/client/qwaylandshellsurface.cpp b/src/client/qwaylandshellsurface.cpp +index b7a819f..80e509b 100644 +--- a/src/client/qwaylandshellsurface.cpp ++++ b/src/client/qwaylandshellsurface.cpp +@@ -40,137 +40,3 @@ + ****************************************************************************/ + + #include "qwaylandshellsurface_p.h" +- +-#include "qwaylanddisplay_p.h" +-#include "qwaylandwindow_p.h" +-#include "qwaylandinputdevice_p.h" +-#include "qwaylanddecoration_p.h" +-#include "qwaylandscreen_p.h" +- +-#include +- +-QT_BEGIN_NAMESPACE +- +-QWaylandShellSurface::QWaylandShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window) +- : QtWayland::wl_shell_surface(shell_surface) +- , m_window(window) +- , m_maximized(false) +- , m_fullscreen(false) +-{ +-} +- +-QWaylandShellSurface::~QWaylandShellSurface() +-{ +- wl_shell_surface_destroy(object()); +-} +- +-void QWaylandShellSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) +-{ +- resize(inputDevice->wl_seat(), +- inputDevice->serial(), +- edges); +-} +- +-void QWaylandShellSurface::move(QWaylandInputDevice *inputDevice) +-{ +- move(inputDevice->wl_seat(), +- inputDevice->serial()); +-} +- +-void QWaylandShellSurface::setMaximized() +-{ +- m_maximized = true; +- m_size = m_window->window()->geometry().size(); +- set_maximized(0); +-} +- +-void QWaylandShellSurface::setFullscreen() +-{ +- m_fullscreen = true; +- m_size = m_window->window()->geometry().size(); +- set_fullscreen(WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, 0); +-} +- +-void QWaylandShellSurface::setNormal() +-{ +- if (m_fullscreen || m_maximized) { +- m_fullscreen = m_maximized = false; +- setTopLevel(); +- QMargins m = m_window->frameMargins(); +- m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom()); +- } +-} +- +-void QWaylandShellSurface::setMinimized() +-{ +- // TODO: There's no wl_shell_surface API for this +-} +- +-void QWaylandShellSurface::setTopLevel() +-{ +- set_toplevel(); +-} +- +-void QWaylandShellSurface::updateTransientParent(QWindow *parent) +-{ +- QWaylandWindow *parent_wayland_window = static_cast(parent->handle()); +- if (!parent_wayland_window) +- return; +- +- // set_transient expects a position relative to the parent +- QPoint transientPos = m_window->geometry().topLeft(); // this is absolute +- QWindow *parentWin = m_window->window()->transientParent(); +- transientPos -= parentWin->geometry().topLeft(); +- if (parent_wayland_window->decoration()) { +- transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left()); +- transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top()); +- } +- +- uint32_t flags = 0; +- Qt::WindowFlags wf = m_window->window()->flags(); +- if (wf.testFlag(Qt::ToolTip) +- || wf.testFlag(Qt::WindowTransparentForInput)) +- flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE; +- +- set_transient(parent_wayland_window->object(), +- transientPos.x(), +- transientPos.y(), +- flags); +-} +- +-void QWaylandShellSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial) +-{ +- QWaylandWindow *parent_wayland_window = parent; +- if (!parent_wayland_window) +- return; +- +- // set_popup expects a position relative to the parent +- QPoint transientPos = m_window->geometry().topLeft(); // this is absolute +- transientPos -= parent_wayland_window->geometry().topLeft(); +- if (parent_wayland_window->decoration()) { +- transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left()); +- transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top()); +- } +- +- set_popup(device->wl_seat(), serial, parent_wayland_window->object(), +- transientPos.x(), transientPos.y(), 0); +-} +- +-void QWaylandShellSurface::shell_surface_ping(uint32_t serial) +-{ +- pong(serial); +-} +- +-void QWaylandShellSurface::shell_surface_configure(uint32_t edges, +- int32_t width, +- int32_t height) +-{ +- m_window->configure(edges, width, height); +-} +- +-void QWaylandShellSurface::shell_surface_popup_done() +-{ +- QCoreApplication::postEvent(m_window->window(), new QCloseEvent()); +-} +- +-QT_END_NAMESPACE +diff --git a/src/client/qwaylandshellsurface_p.h b/src/client/qwaylandshellsurface_p.h +index 2477c3f..2f59f60 100644 +--- a/src/client/qwaylandshellsurface_p.h ++++ b/src/client/qwaylandshellsurface_p.h +@@ -55,39 +55,25 @@ class QWaylandWindow; + class QWaylandInputDevice; + class QWindow; + +-class Q_WAYLAND_CLIENT_EXPORT QWaylandShellSurface : public QtWayland::wl_shell_surface ++class Q_WAYLAND_CLIENT_EXPORT QWaylandShellSurface + { + public: +- QWaylandShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window); +- ~QWaylandShellSurface(); ++ virtual ~QWaylandShellSurface() {} ++ virtual void resize(QWaylandInputDevice * /*inputDevice*/, enum wl_shell_surface_resize /*edges*/) ++ {} + +- using QtWayland::wl_shell_surface::resize; +- void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges); +- +- using QtWayland::wl_shell_surface::move; +- void move(QWaylandInputDevice *inputDevice); ++ virtual void move(QWaylandInputDevice * /*inputDevice*/) {} ++ virtual void setTitle(const QString & /*title*/) {} ++ virtual void setAppId(const QString & /*appId*/) {} + + private: +- void setMaximized(); +- void setFullscreen(); +- void setNormal(); +- void setMinimized(); +- +- void setTopLevel(); +- void updateTransientParent(QWindow *parent); +- void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial); +- +- QWaylandWindow *m_window; +- bool m_maximized; +- bool m_fullscreen; +- QSize m_size; +- +- void shell_surface_ping(uint32_t serial) Q_DECL_OVERRIDE; +- void shell_surface_configure(uint32_t edges, +- int32_t width, +- int32_t height) Q_DECL_OVERRIDE; +- void shell_surface_popup_done() Q_DECL_OVERRIDE; ++ virtual void setMaximized() {} ++ virtual void setFullscreen() {} ++ virtual void setNormal() {} ++ virtual void setMinimized() {} + ++ virtual void setTopLevel() {} ++ virtual void updateTransientParent(QWindow * /*parent*/) {} + friend class QWaylandWindow; + }; + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 920c977..3fb3a49 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -46,6 +46,8 @@ + #include "qwaylandinputdevice_p.h" + #include "qwaylandscreen_p.h" + #include "qwaylandshellsurface_p.h" ++#include "qwaylandwlshellsurface_p.h" ++#include "qwaylandxdgsurface_p.h" + #include "qwaylandextendedsurface_p.h" + #include "qwaylandsubsurface_p.h" + #include "qwaylanddecoration_p.h" +@@ -92,8 +94,16 @@ QWaylandWindow::QWaylandWindow(QWindow *window) + static WId id = 1; + mWindowId = id++; + +- if (mDisplay->shell() && window->type() & Qt::Window && !(window->flags() & Qt::BypassWindowManagerHint)) +- mShellSurface = new QWaylandShellSurface(mDisplay->shell()->get_shell_surface(object()), this); ++ if (!(window->flags() & Qt::BypassWindowManagerHint)) { ++ if (mDisplay->shellXdg()) { ++ if (window->type() & Qt::Window) { ++ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this); ++ } ++ } else if (mDisplay->shell() && window->type() & Qt::Window) { ++ mShellSurface = new QWaylandWlShellSurface(mDisplay->shell()->get_shell_surface(object()), this); ++ } ++ } ++ + if (mDisplay->windowExtension()) + mExtendedWindow = new QWaylandExtendedSurface(this, mDisplay->windowExtension()->get_extended_surface(object())); + if (mDisplay->subSurfaceExtension()) +@@ -101,12 +111,12 @@ QWaylandWindow::QWaylandWindow(QWindow *window) + + if (mShellSurface) { + // Set initial surface title +- mShellSurface->set_title(window->title()); ++ mShellSurface->setTitle(window->title()); + + // Set surface class to the .desktop file name (obtained from executable name) + QFileInfo exeFileInfo(qApp->applicationFilePath()); + QString className = exeFileInfo.baseName() + QLatin1String(".desktop"); +- mShellSurface->set_class(className); ++ mShellSurface->setAppId(className); + } + + if (QPlatformWindow::parent() && mSubSurfaceWindow) { +@@ -170,7 +180,7 @@ void QWaylandWindow::setParent(const QPlatformWindow *parent) + void QWaylandWindow::setWindowTitle(const QString &title) + { + if (mShellSurface) { +- mShellSurface->set_title(title); ++ mShellSurface->setTitle(title); + } + + if (mWindowDecoration && window()->isVisible()) +@@ -212,8 +222,10 @@ void QWaylandWindow::setVisible(bool visible) + mMouseDevice = parent->mMouseDevice; + mMouseSerial = parent->mMouseSerial; + +- if (mMouseDevice) +- mShellSurface->setPopup(transientParent(), mMouseDevice, mMouseSerial); ++ QWaylandWlShellSurface *wlshellSurface = dynamic_cast(mShellSurface); ++ if (mMouseDevice && wlshellSurface) { ++ wlshellSurface->setPopup(transientParent(), mMouseDevice, mMouseSerial); ++ } + } + + if (!mSentInitialResize) { +@@ -428,6 +440,20 @@ void QWaylandWindow::setWindowFlags(Qt::WindowFlags flags) + + bool QWaylandWindow::createDecoration() + { ++ // so far only xdg-shell support this "unminimize" trick, may be moved elsewhere ++ if (mState == Qt::WindowMinimized) { ++ QWaylandXdgSurface *xdgSurface = dynamic_cast(mShellSurface); ++ if ( xdgSurface ) { ++ if (xdgSurface->isFullscreen()) { ++ setWindowStateInternal(Qt::WindowFullScreen); ++ } else if (xdgSurface->isMaximized()) { ++ setWindowStateInternal(Qt::WindowMaximized); ++ } else { ++ setWindowStateInternal(Qt::WindowNoState); ++ } ++ } ++ } ++ + static bool disableWaylandDecorations = !qgetenv("QT_WAYLAND_DISABLE_WINDOWDECORATION").isEmpty(); + if (disableWaylandDecorations) + return false; +diff --git a/src/client/qwaylandwlshellsurface.cpp b/src/client/qwaylandwlshellsurface.cpp +new file mode 100644 +index 0000000..4b73ec2 +--- /dev/null ++++ b/src/client/qwaylandwlshellsurface.cpp +@@ -0,0 +1,186 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "qwaylandwlshellsurface_p.h" ++ ++#include "qwaylanddisplay_p.h" ++#include "qwaylandwindow_p.h" ++#include "qwaylandinputdevice_p.h" ++#include "qwaylanddecoration_p.h" ++#include "qwaylandscreen_p.h" ++ ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++QWaylandWlShellSurface::QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window) ++ : QtWayland::wl_shell_surface(shell_surface) ++ , m_window(window) ++ , m_maximized(false) ++ , m_fullscreen(false) ++{ ++} ++ ++QWaylandWlShellSurface::~QWaylandWlShellSurface() ++{ ++ wl_shell_surface_destroy(object()); ++} ++ ++void QWaylandWlShellSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) ++{ ++ resize(inputDevice->wl_seat(), ++ inputDevice->serial(), ++ edges); ++} ++ ++void QWaylandWlShellSurface::move(QWaylandInputDevice *inputDevice) ++{ ++ move(inputDevice->wl_seat(), ++ inputDevice->serial()); ++} ++ ++void QWaylandWlShellSurface::setTitle(const QString & title) ++{ ++ return QtWayland::wl_shell_surface::set_title(title); ++} ++ ++void QWaylandWlShellSurface::setAppId(const QString & appId) ++{ ++ return QtWayland::wl_shell_surface::set_class(appId); ++} ++ ++void QWaylandWlShellSurface::setMaximized() ++{ ++ m_maximized = true; ++ m_size = m_window->window()->geometry().size(); ++ set_maximized(0); ++} ++ ++void QWaylandWlShellSurface::setFullscreen() ++{ ++ m_fullscreen = true; ++ m_size = m_window->window()->geometry().size(); ++ set_fullscreen(WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, 0); ++} ++ ++void QWaylandWlShellSurface::setNormal() ++{ ++ if (m_fullscreen || m_maximized) { ++ m_fullscreen = m_maximized = false; ++ setTopLevel(); ++ QMargins m = m_window->frameMargins(); ++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom()); ++ } ++} ++ ++void QWaylandWlShellSurface::setMinimized() ++{ ++ // TODO: There's no wl_shell_surface API for this ++} ++ ++void QWaylandWlShellSurface::setTopLevel() ++{ ++ set_toplevel(); ++} ++ ++void QWaylandWlShellSurface::updateTransientParent(QWindow *parent) ++{ ++ QWaylandWindow *parent_wayland_window = static_cast(parent->handle()); ++ if (!parent_wayland_window) ++ return; ++ ++ // set_transient expects a position relative to the parent ++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute ++ QWindow *parentWin = m_window->window()->transientParent(); ++ transientPos -= parentWin->geometry().topLeft(); ++ if (parent_wayland_window->decoration()) { ++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left()); ++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top()); ++ } ++ ++ uint32_t flags = 0; ++ Qt::WindowFlags wf = m_window->window()->flags(); ++ if (wf.testFlag(Qt::ToolTip) ++ || wf.testFlag(Qt::WindowTransparentForInput)) ++ flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE; ++ ++ set_transient(parent_wayland_window->object(), ++ transientPos.x(), ++ transientPos.y(), ++ flags); ++} ++ ++void QWaylandWlShellSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial) ++{ ++ QWaylandWindow *parent_wayland_window = parent; ++ if (!parent_wayland_window) ++ return; ++ ++ // set_popup expects a position relative to the parent ++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute ++ transientPos -= parent_wayland_window->geometry().topLeft(); ++ if (parent_wayland_window->decoration()) { ++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left()); ++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top()); ++ } ++ ++ set_popup(device->wl_seat(), serial, parent_wayland_window->object(), ++ transientPos.x(), transientPos.y(), 0); ++} ++ ++void QWaylandWlShellSurface::shell_surface_ping(uint32_t serial) ++{ ++ pong(serial); ++} ++ ++void QWaylandWlShellSurface::shell_surface_configure(uint32_t edges, ++ int32_t width, ++ int32_t height) ++{ ++ m_window->configure(edges, width, height); ++} ++ ++void QWaylandWlShellSurface::shell_surface_popup_done() ++{ ++ QCoreApplication::postEvent(m_window->window(), new QCloseEvent()); ++} ++ ++QT_END_NAMESPACE +diff --git a/src/client/qwaylandwlshellsurface_p.h b/src/client/qwaylandwlshellsurface_p.h +new file mode 100644 +index 0000000..d02bb7b +--- /dev/null ++++ b/src/client/qwaylandwlshellsurface_p.h +@@ -0,0 +1,101 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QWAYLANDWLSHELLSURFACE_H ++#define QWAYLANDWLSHELLSURFACE_H ++ ++#include ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandWlShellSurface : public QtWayland::wl_shell_surface ++ , public QWaylandShellSurface ++{ ++public: ++ QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window); ++ virtual ~QWaylandWlShellSurface(); ++ ++ using QtWayland::wl_shell_surface::resize; ++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE; ++ ++ using QtWayland::wl_shell_surface::move; ++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE; ++ ++ void setTitle(const QString & title) Q_DECL_OVERRIDE; ++ void setAppId(const QString &appId) Q_DECL_OVERRIDE; ++ ++private: ++ void setMaximized() Q_DECL_OVERRIDE; ++ void setFullscreen() Q_DECL_OVERRIDE; ++ void setNormal() Q_DECL_OVERRIDE; ++ void setMinimized() Q_DECL_OVERRIDE; ++ ++ void setTopLevel() Q_DECL_OVERRIDE; ++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE; ++ void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial); ++ ++ QWaylandWindow *m_window; ++ bool m_maximized; ++ bool m_fullscreen; ++ QSize m_size; ++ ++ void shell_surface_ping(uint32_t serial) Q_DECL_OVERRIDE; ++ void shell_surface_configure(uint32_t edges, ++ int32_t width, ++ int32_t height) Q_DECL_OVERRIDE; ++ void shell_surface_popup_done() Q_DECL_OVERRIDE; ++ ++ friend class QWaylandWindow; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDSHELLSURFACE_H +diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp +new file mode 100644 +index 0000000..1b8affa +--- /dev/null ++++ b/src/client/qwaylandxdgsurface.cpp +@@ -0,0 +1,173 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "qwaylandxdgsurface_p.h" ++ ++#include "qwaylanddisplay_p.h" ++#include "qwaylandwindow_p.h" ++#include "qwaylandinputdevice_p.h" ++#include "qwaylanddecoration_p.h" ++#include "qwaylandscreen_p.h" ++ ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++QWaylandXdgSurface::QWaylandXdgSurface(struct ::xdg_surface *xdg_surface, QWaylandWindow *window) ++ : QtWayland::xdg_surface(xdg_surface) ++ , m_window(window) ++ , m_maximized(false) ++ , m_minimized(false) ++ , m_fullscreen(false) ++{ ++} ++ ++QWaylandXdgSurface::~QWaylandXdgSurface() ++{ ++ xdg_surface_destroy(object()); ++} ++ ++void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) ++{ ++ // May need some conversion if types get incompatibles, ATM they're identical ++ enum resize_edge const * const arg = reinterpret_cast(&edges); ++ resize(inputDevice, *arg); ++} ++ ++void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum resize_edge edges) ++{ ++ resize(inputDevice->wl_seat(), ++ inputDevice->serial(), ++ edges); ++} ++ ++void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice) ++{ ++ move(inputDevice->wl_seat(), ++ inputDevice->serial()); ++} ++ ++void QWaylandXdgSurface::setMaximized() ++{ ++ m_maximized = true; ++ m_size = m_window->window()->geometry().size(); ++ set_maximized(); ++} ++ ++void QWaylandXdgSurface::setFullscreen() ++{ ++ m_fullscreen = true; ++ m_size = m_window->window()->geometry().size(); ++ set_fullscreen(); ++} ++ ++void QWaylandXdgSurface::setNormal() ++{ ++ if (m_fullscreen || m_maximized || m_minimized) { ++ if (m_maximized) { unset_maximized(); } ++ if (m_fullscreen) { unset_fullscreen(); } ++ ++ m_fullscreen = m_maximized = m_minimized = false; ++ setTopLevel(); ++ QMargins m = m_window->frameMargins(); ++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom()); ++ } ++} ++ ++void QWaylandXdgSurface::setMinimized() ++{ ++ m_minimized = true; ++ m_size = m_window->window()->geometry().size(); ++ set_minimized(); ++} ++ ++void QWaylandXdgSurface::setTopLevel() ++{ ++ // There's no xdg_shell_surface API for this, ignoring ++} ++ ++void QWaylandXdgSurface::updateTransientParent(QWindow *parent) ++{ ++ QWaylandWindow *parent_wayland_window = static_cast(parent->handle()); ++ if (!parent_wayland_window) ++ return; ++ ++ // set_transient expects a position relative to the parent ++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute ++ QWindow *parentWin = m_window->window()->transientParent(); ++ transientPos -= parentWin->geometry().topLeft(); ++ if (parent_wayland_window->decoration()) { ++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left()); ++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top()); ++ } ++ ++ uint32_t flags = 0; ++ Qt::WindowFlags wf = m_window->window()->flags(); ++ if (wf.testFlag(Qt::ToolTip) ++ || wf.testFlag(Qt::WindowTransparentForInput)) ++ flags |= XDG_SURFACE_SET_TRANSIENT_FOR; ++ ++ set_transient_for(parent_wayland_window->object()); ++} ++ ++void QWaylandXdgSurface::setTitle(const QString & title) ++{ ++ return QtWayland::xdg_surface::set_title(title); ++} ++ ++void QWaylandXdgSurface::setAppId(const QString & appId) ++{ ++ return QtWayland::xdg_surface::set_app_id(appId); ++} ++ ++void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial) ++{ ++ pong(serial); ++} ++ ++void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width, ++ int32_t height) ++{ ++ m_window->configure(edges, width, height); ++} ++ ++ ++QT_END_NAMESPACE +diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h +new file mode 100644 +index 0000000..744d3f3 +--- /dev/null ++++ b/src/client/qwaylandxdgsurface_p.h +@@ -0,0 +1,105 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QWAYLANDXDGSURFACE_H ++#define QWAYLANDXDGSURFACE_H ++ ++#include ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurface : public QtWayland::xdg_surface ++ , public QWaylandShellSurface ++{ ++public: ++ QWaylandXdgSurface(struct ::xdg_surface *shell_surface, QWaylandWindow *window); ++ virtual ~QWaylandXdgSurface(); ++ ++ using QtWayland::xdg_surface::resize; ++ void resize(QWaylandInputDevice *inputDevice, enum resize_edge edges); ++ ++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE; ++ ++ using QtWayland::xdg_surface::move; ++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE; ++ ++ void setTitle(const QString &title) Q_DECL_OVERRIDE; ++ void setAppId(const QString &appId) Q_DECL_OVERRIDE; ++ ++ bool isFullscreen() const { return m_fullscreen; } ++ bool isMaximized() const { return m_maximized; } ++ ++private: ++ void setMaximized() Q_DECL_OVERRIDE; ++ void setFullscreen() Q_DECL_OVERRIDE; ++ void setNormal() Q_DECL_OVERRIDE; ++ void setMinimized() Q_DECL_OVERRIDE; ++ ++ void setTopLevel() Q_DECL_OVERRIDE; ++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE; ++ ++private: ++ QWaylandWindow *m_window; ++ bool m_maximized; ++ bool m_minimized; ++ bool m_fullscreen; ++ QSize m_size; ++ ++ void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE; ++ void xdg_surface_configure(uint32_t edges, ++ int32_t width, ++ int32_t height) Q_DECL_OVERRIDE; ++ friend class QWaylandWindow; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDXDGSURFACE_H +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch b/recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch new file mode 100644 index 000000000..8f0425a76 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch @@ -0,0 +1,772 @@ +From c4219cca0febd7119e0bec776fdc2877b3448e0b Mon Sep 17 00:00:00 2001 +From: Philippe Coval +Date: Tue, 10 Jun 2014 16:22:17 +0200 +Subject: [PATCH 19/21] xdg-shell: upgrade to support current version + (weston-1.5.0) + +The protocol file is a raw copy of + +Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.5.0 + +Task-number: QTBUG-38633/related +Reviewed-by: Giulio Camuffo +Reviewed-by: Philippe Coval +Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/4bac130b97fbaa565aa9883eb302557ef0185d50 +Change-Id: I41ca2f89c09a8b6348ce2fbf6d59f44b4c81ffff +--- + src/3rdparty/protocol/xdg-shell.xml | 288 ++++++++++++++++++------------------ + src/client/client.pro | 2 + + src/client/qwaylanddisplay.cpp | 10 +- + src/client/qwaylanddisplay_p.h | 5 +- + src/client/qwaylandxdgshell.cpp | 77 ++++++++++ + src/client/qwaylandxdgshell_p.h | 73 +++++++++ + src/client/qwaylandxdgsurface.cpp | 60 ++++++-- + src/client/qwaylandxdgsurface_p.h | 11 +- + 8 files changed, 364 insertions(+), 162 deletions(-) + create mode 100644 src/client/qwaylandxdgshell.cpp + create mode 100644 src/client/qwaylandxdgshell_p.h + +diff --git a/src/3rdparty/protocol/xdg-shell.xml b/src/3rdparty/protocol/xdg-shell.xml +index 4e5cff8..79a2831 100644 +--- a/src/3rdparty/protocol/xdg-shell.xml ++++ b/src/3rdparty/protocol/xdg-shell.xml +@@ -40,19 +40,22 @@ + + + +- Use this enum to check the protocol version, and it will be updated +- automatically. ++ The 'current' member of this enum gives the version of the ++ protocol. Implementations can compare this to the version ++ they implement using static_assert to ensure the protocol and ++ implementation versions match. + +- ++ + + + + + +- Use this request in order to enable use of this interface. +- +- Understand and agree that one is using an unstable interface, +- that will likely change in the future, breaking the API. ++ Negotiate the unstable version of the interface. This ++ mechanism is in place to ensure client and server agree on the ++ unstable versions of the protocol that they speak or exit ++ cleanly if they don't agree. This request will go away once ++ the xdg-shell protocol is stable. + + + +@@ -84,6 +87,28 @@ + + + ++ ++ ++ ++ The ping event asks the client if it's still alive. Pass the ++ serial specified in the event back to the compositor by sending ++ a "pong" request back with the specified serial. ++ ++ Compositors can use this to determine if the client is still ++ alive. It's unspecified what will happen if the client doesn't ++ respond to the ping request, or in what timeframe. Clients should ++ try to respond in a reasonable amount of time. ++ ++ ++ ++ ++ ++ ++ A client must respond to a ping event with a pong request or ++ the client may be deemed unresponsive. ++ ++ ++ + + + +@@ -124,6 +149,32 @@ + + + ++ ++ ++ This tells the compositor what the visible size of the window ++ should be, so it can use it to determine what borders to use for ++ constrainment and alignment. ++ ++ CSD often has invisible areas for decoration purposes, like drop ++ shadows. These "shadow" drawings need to be subtracted out of the ++ normal boundaries of the window when computing where to place ++ windows (e.g. to set this window so it's centered on top of another, ++ or to put it to the left or right of the screen.) ++ ++ This value should change as little as possible at runtime, to ++ prevent flicker. ++ ++ This value is also ignored when the window is maximized or ++ fullscreen, and assumed to be 0. ++ ++ If never called, this value is assumed to be 0. ++ ++ ++ ++ ++ ++ ++ + + + Set a short title for the surface. +@@ -150,22 +201,6 @@ + + + +- +- +- A client must respond to a ping event with a pong request or +- the client may be deemed unresponsive. +- +- +- +- +- +- +- Ping a client to check if it is receiving events and sending +- requests. A client is expected to reply with a pong request. +- +- +- +- + + + Start a pointer-driven move of the surface. +@@ -217,12 +252,6 @@ + ignore it if it doesn't resize, pick a smaller size (to + satisfy aspect ratio or resize in steps of NxM pixels). + +- The edges parameter provides a hint about how the surface +- was resized. The client may use this information to decide +- how to adjust its content to the new size (e.g. a scrolling +- area might adjust its content position to leave the viewable +- content unmoved). Valid edge values are from resize_edge enum. +- + The client is free to dismiss all but the last configure + event it received. + +@@ -230,7 +259,6 @@ + in surface local coordinates. + + +- + + + +@@ -250,128 +278,122 @@ + + + +- +- +- Event sent from the compositor to the client requesting that the client +- goes to a fullscreen state. It's the client job to call set_fullscreen +- and really trigger the fullscreen state. +- +- +- +- +- +- Event sent from the compositor to the client requesting that the client +- leaves the fullscreen state. It's the client job to call +- unset_fullscreen and really leave the fullscreen state. +- +- ++ ++ ++ The different state values used on the surface. This is designed for ++ state values like maximized, fullscreen. It is paired with the ++ request_change_state event to ensure that both the client and the ++ compositor setting the state can be synchronized. + +- +- +- Set the surface as fullscreen. ++ States set in this way are double-buffered. They will get applied on ++ the next commit. + +- After this request, the compositor should send a configure event +- informing the output size. ++ Desktop environments may extend this enum by taking up a range of ++ values and documenting the range they chose in this description. ++ They are not required to document the values for the range that they ++ chose. Ideally, any good extensions from a desktop environment should ++ make its way into standardization into this enum. + +- This request informs the compositor that the next attached buffer +- committed will be in a fullscreen state. The buffer size should be the +- same size as the size informed in the configure event, if the client +- doesn't want to leave any empty area. ++ The current reserved ranges are: + +- In other words: the next attached buffer after set_maximized is the new +- maximized buffer. And the surface will be positioned at the maximized +- position on commit. +- +- A simple way to synchronize and wait for the correct configure event is +- to use a wl_display.sync request right after the set_fullscreen +- request. When the sync callback returns, the last configure event +- received just before it will be the correct one, and should contain the +- right size for the surface to maximize. +- +- Setting one state won't unset another state. Use +- xdg_surface.unset_fullscreen for unsetting it. ++ 0x0000 - 0x0FFF: xdg-shell core values, documented below. ++ 0x1000 - 0x1FFF: GNOME + +- ++ ++ A non-zero value indicates the surface is maximized. Otherwise, ++ the surface is unmaximized. ++ ++ ++ A non-zero value indicates the surface is fullscreen. Otherwise, ++ the surface is not fullscreen. ++ ++ + +- +- +- Unset the surface fullscreen state. ++ ++ ++ This asks the compositor to change the state. If the compositor wants ++ to change the state, it will send a change_state event with the same ++ state_type, value, and serial, and the event flow continues as if it ++ it was initiated by the compositor. + +- Same negotiation as set_fullscreen must be used. ++ If the compositor does not want to change the state, it will send a ++ change_state to the client with the old value of the state. + ++ ++ ++ ++ This serial is so the client can know which change_state event corresponds ++ to which request_change_state request it sent out. ++ + + +- +- +- Event sent from the compositor to the client requesting that the client +- goes to a maximized state. It's the client job to call set_maximized +- and really trigger the maximized state. ++ ++ ++ This event tells the client to change a surface's state. The client ++ should respond with an ack_change_state request to the compositor to ++ guarantee that the compositor knows that the client has seen it. + +- + +- +- +- Event sent from the compositor to the client requesting that the client +- leaves the maximized state. It's the client job to call unset_maximized +- and really leave the maximized state. +- ++ ++ ++ + + +- +- +- Set the surface as maximized. +- +- After this request, the compositor will send a configure event +- informing the output size minus panel and other MW decorations. +- +- This request informs the compositor that the next attached buffer +- committed will be in a maximized state. The buffer size should be the +- same size as the size informed in the configure event, if the client +- doesn't want to leave any empty area. ++ ++ ++ When a change_state event is received, a client should then ack it ++ using the ack_change_state request to ensure that the compositor ++ knows the client has seen the event. + +- In other words: the next attached buffer after set_maximized is the new +- maximized buffer. And the surface will be positioned at the maximized +- position on commit. ++ By this point, the state is confirmed, and the next attach should ++ contain the buffer drawn for the new state value. + +- A simple way to synchronize and wait for the correct configure event is +- to use a wl_display.sync request right after the set_maximized request. +- When the sync callback returns, the last configure event received just +- before it will be the correct one, and should contain the right size +- for the surface to maximize. +- +- Setting one state won't unset another state. Use +- xdg_surface.unset_maximized for unsetting it. ++ The values here need to be the same as the values in the cooresponding ++ change_state event. + ++ ++ ++ + + +- +- +- Unset the surface maximized state. +- +- Same negotiation as set_maximized must be used. ++ ++ ++ Minimize the surface. + + + +- +- +- Set the surface minimized state. +- +- Setting one state won't unset another state. ++ ++ ++ The activated_set event is sent when this surface has been ++ activated, which means that the surface has user attention. ++ Window decorations should be updated accordingly. You should ++ not use this event for anything but the style of decorations ++ you display, use wl_keyboard.enter and wl_keyboard.leave for ++ determining keyboard focus. + +- ++ + +- +- +- The focused_set event is sent when this surface has been +- activated. Window decorations should be updated accordingly. ++ ++ ++ The deactivate event is sent when this surface has been ++ deactivated, which means that the surface lost user attention. ++ Window decorations should be updated accordingly. You should ++ not use this event for anything but the style of decorations ++ you display, use wl_keyboard.enter and wl_keyboard.leave for ++ determining keyboard focus. + + + +- +- +- The focused_unset event is sent when this surface has been +- deactivated, because another surface has been activated. Window +- decorations should be updated accordingly. ++ ++ ++ The close event is sent by the compositor when the user ++ wants the surface to be closed. This should be equivalent to ++ the user clicking the close button in client-side decorations, ++ if your application has any... ++ ++ This is only a request that the user intends to close your ++ window. The client may choose to ignore this request, or show ++ a dialog to ask the user to save their data... + + + +@@ -409,22 +431,6 @@ + + + +- +- +- A client must respond to a ping event with a pong request or +- the client may be deemed unresponsive. +- +- +- +- +- +- +- Ping a client to check if it is receiving events and sending +- requests. A client is expected to reply with a pong request. +- +- +- +- + + + The popup_done event is sent out when a popup grab is broken, +diff --git a/src/client/client.pro b/src/client/client.pro +index 9ecf82f..73e3b7f 100644 +--- a/src/client/client.pro ++++ b/src/client/client.pro +@@ -59,6 +59,7 @@ SOURCES += qwaylandintegration.cpp \ + qwaylanddatasource.cpp \ + qwaylandshellsurface.cpp \ + qwaylandwlshellsurface.cpp \ ++ qwaylandxdgshell.cpp \ + qwaylandxdgsurface.cpp \ + qwaylandextendedoutput.cpp \ + qwaylandextendedsurface.cpp \ +@@ -89,6 +90,7 @@ HEADERS += qwaylandintegration_p.h \ + qwaylanddatasource_p.h \ + qwaylandshellsurface_p.h \ + qwaylandwlshellsurface_p.h \ ++ qwaylandxdgshell_p.h \ + qwaylandxdgsurface_p.h \ + qwaylandextendedoutput_p.h \ + qwaylandextendedsurface_p.h \ +diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp +index 7f953ad..2e25672 100644 +--- a/src/client/qwaylanddisplay.cpp ++++ b/src/client/qwaylanddisplay.cpp +@@ -50,7 +50,7 @@ + #include "qwaylandclipboard_p.h" + #include "qwaylanddatadevicemanager_p.h" + #include "qwaylandhardwareintegration_p.h" +- ++#include "qwaylandxdgshell_p.h" + + #include "qwaylandwindowmanagerintegration_p.h" + +@@ -209,8 +209,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin + mShm = static_cast(wl_registry_bind(registry, id, &wl_shm_interface,1)); + } else if (interface == QStringLiteral("xdg_shell") + && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) { +- mShellXdg.reset(new QtWayland::xdg_shell(registry, id)); +- mShellXdg->use_unstable_version(QtWayland::xdg_shell::version_current); ++ mShellXdg.reset(new QWaylandXdgShell(registry,id)); + } else if (interface == QStringLiteral("wl_shell")){ + mShell.reset(new QtWayland::wl_shell(registry, id)); + } else if (interface == QStringLiteral("wl_seat")) { +@@ -275,4 +274,9 @@ void QWaylandDisplay::forceRoundTrip() + wl_display_roundtrip(mDisplay); + } + ++QtWayland::xdg_shell *QWaylandDisplay::shellXdg() ++{ ++ return mShellXdg.data(); ++} ++ + QT_END_NAMESPACE +diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h +index cf5dfc2..f1b35a7 100644 +--- a/src/client/qwaylanddisplay_p.h ++++ b/src/client/qwaylanddisplay_p.h +@@ -72,6 +72,7 @@ class QWaylandWindow; + class QWaylandEventThread; + class QWaylandIntegration; + class QWaylandHardwareIntegration; ++class QWaylandXdgShell; + + namespace QtWayland { + class qt_output_extension; +@@ -115,7 +116,7 @@ public: + QtWayland::wl_compositor *compositor() { return &mCompositor; } + + QtWayland::wl_shell *shell() { return mShell.data(); } +- QtWayland::xdg_shell *shellXdg() { return mShellXdg.data(); } ++ QtWayland::xdg_shell *shellXdg(); + + QList inputDevices() const { return mInputDevices; } + QWaylandInputDevice *defaultInputDevice() const; +@@ -171,7 +172,7 @@ private: + QThread *mEventThread; + QWaylandEventThread *mEventThreadObject; + QScopedPointer mShell; +- QScopedPointer mShellXdg; ++ QScopedPointer mShellXdg; + QList mScreens; + QList mInputDevices; + QList mRegistryListeners; +diff --git a/src/client/qwaylandxdgshell.cpp b/src/client/qwaylandxdgshell.cpp +new file mode 100644 +index 0000000..eb9f91c +--- /dev/null ++++ b/src/client/qwaylandxdgshell.cpp +@@ -0,0 +1,77 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2014 Eurogiciel, author: ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "qwaylandxdgshell_p.h" ++ ++#include "qwaylanddisplay_p.h" ++#include "qwaylandwindow_p.h" ++#include "qwaylandinputdevice_p.h" ++#include "qwaylanddecoration_p.h" ++#include "qwaylandscreen_p.h" ++ ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++QWaylandXdgShell::QWaylandXdgShell(struct ::xdg_shell *shell) ++ : QtWayland::xdg_shell(shell) ++{ ++} ++ ++QWaylandXdgShell::QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id) ++ : QtWayland::xdg_shell(registry, id) ++{ ++ use_unstable_version(QtWayland::xdg_shell::version_current); ++} ++ ++QWaylandXdgShell::~QWaylandXdgShell() ++{ ++ xdg_shell_destroy(object()); ++} ++ ++ ++void QWaylandXdgShell::xdg_shell_ping(uint32_t serial) ++{ ++ pong(serial); ++} ++ ++ ++QT_END_NAMESPACE +diff --git a/src/client/qwaylandxdgshell_p.h b/src/client/qwaylandxdgshell_p.h +new file mode 100644 +index 0000000..6a396bd +--- /dev/null ++++ b/src/client/qwaylandxdgshell_p.h +@@ -0,0 +1,73 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2014 Eurogiciel, author: ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QWAYLANDXDGSHELL_H ++#define QWAYLANDXDGSHELL_H ++ ++#include ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_shell ++{ ++public: ++ QWaylandXdgShell(struct ::xdg_shell *shell); ++ QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id); ++ ++ virtual ~QWaylandXdgShell(); ++ ++private: ++ void xdg_shell_ping(uint32_t serial) Q_DECL_OVERRIDE; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDXDGSHELL_H +diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp +index 1b8affa..5fb74d2 100644 +--- a/src/client/qwaylandxdgsurface.cpp ++++ b/src/client/qwaylandxdgsurface.cpp +@@ -87,23 +87,25 @@ void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice) + + void QWaylandXdgSurface::setMaximized() + { +- m_maximized = true; +- m_size = m_window->window()->geometry().size(); +- set_maximized(); ++ if (!m_maximized) ++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, true, 0); + } + + void QWaylandXdgSurface::setFullscreen() + { +- m_fullscreen = true; +- m_size = m_window->window()->geometry().size(); +- set_fullscreen(); ++ if (!m_fullscreen) ++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, true, 0); + } + + void QWaylandXdgSurface::setNormal() + { + if (m_fullscreen || m_maximized || m_minimized) { +- if (m_maximized) { unset_maximized(); } +- if (m_fullscreen) { unset_fullscreen(); } ++ if (m_maximized) { ++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, false, 0); ++ } ++ if (m_fullscreen) { ++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, false, 0); ++ } + + m_fullscreen = m_maximized = m_minimized = false; + setTopLevel(); +@@ -158,16 +160,48 @@ void QWaylandXdgSurface::setAppId(const QString & appId) + return QtWayland::xdg_surface::set_app_id(appId); + } + +-void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial) ++void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height) + { +- pong(serial); ++ m_window->configure(0 , width, height); + } + +-void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width, +- int32_t height) ++void QWaylandXdgSurface::xdg_surface_change_state(uint32_t state, ++ uint32_t value, ++ uint32_t serial) + { +- m_window->configure(edges, width, height); ++ ++ if (state == XDG_SURFACE_STATE_MAXIMIZED ++ || state == XDG_SURFACE_STATE_FULLSCREEN) { ++ if (value) { ++ m_size = m_window->window()->geometry().size(); ++ } else { ++ QMargins m = m_window->frameMargins(); ++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom()); ++ } ++ } ++ ++ switch (state) { ++ case XDG_SURFACE_STATE_MAXIMIZED: ++ m_maximized = value; ++ break; ++ case XDG_SURFACE_STATE_FULLSCREEN: ++ m_fullscreen = value; ++ break; ++ } ++ ++ xdg_surface_ack_change_state(object(), state, value, serial); + } + ++void QWaylandXdgSurface::xdg_surface_activated() ++{ ++} ++ ++void QWaylandXdgSurface::xdg_surface_deactivated() ++{ ++} ++ ++void QWaylandXdgSurface::xdg_surface_close() ++{ ++} + + QT_END_NAMESPACE +diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h +index 744d3f3..d2a154e 100644 +--- a/src/client/qwaylandxdgsurface_p.h ++++ b/src/client/qwaylandxdgsurface_p.h +@@ -93,10 +93,15 @@ private: + bool m_fullscreen; + QSize m_size; + +- void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE; +- void xdg_surface_configure(uint32_t edges, +- int32_t width, ++ void xdg_surface_configure(int32_t width, + int32_t height) Q_DECL_OVERRIDE; ++ void xdg_surface_change_state(uint32_t state, ++ uint32_t value, ++ uint32_t serial) Q_DECL_OVERRIDE; ++ void xdg_surface_activated() Q_DECL_OVERRIDE; ++ void xdg_surface_deactivated() Q_DECL_OVERRIDE; ++ void xdg_surface_close() Q_DECL_OVERRIDE; ++ + friend class QWaylandWindow; + }; + +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch b/recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch new file mode 100644 index 000000000..413459fb6 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch @@ -0,0 +1,128 @@ +From b4f032b13338ad6c21024177b031c75063ef7493 Mon Sep 17 00:00:00 2001 +From: Manuel Bachmann +Date: Sun, 7 Sep 2014 08:19:30 +0200 +Subject: [PATCH 20/21] Add IVI-Shell protocol file version patch v6 + +Source : http://lists.freedesktop.org/archives/wayland-devel/2014-June/015617.html + +This file comes from the last proposed definition of the IVI-Shell protocol, +and will need to be refreshed on protocol update. + +Task-number: QTBUG-XXXXX/part/1of2 + +Signed-off-by: Manuel Bachmann +--- + src/3rdparty/protocol/ivi-application.xml | 101 ++++++++++++++++++++++++++++++ + 1 file changed, 101 insertions(+) + create mode 100644 src/3rdparty/protocol/ivi-application.xml + +diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml +new file mode 100644 +index 0000000..833fd38 +--- /dev/null ++++ b/src/3rdparty/protocol/ivi-application.xml +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ Copyright (C) 2013 DENSO CORPORATION ++ Copyright (c) 2013 BMW Car IT GmbH ++ ++ Permission is hereby granted, free of charge, to any person obtaining a copy ++ of this software and associated documentation files (the "Software"), to deal ++ in the Software without restriction, including without limitation the rights ++ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++ copies of the Software, and to permit persons to whom the Software is ++ furnished to do so, subject to the following conditions: ++ ++ The above copyright notice and this permission notice shall be included in ++ all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++ THE SOFTWARE. ++ ++ ++ ++ ++ ++ ++ ++ This removes link from ivi_id to wl_surface and destroys ivi_surface. ++ ++ ++ ++ ++ ++ The new visibility state is provided in argument visibility. ++ If visibility is 0, the surface has become invisible. ++ If visibility is not 0, the surface has become visible. ++ ++ ++ ++ ++ ++ ++ These define all possible warning codes returned by ivi compositor on server-side warnings. ++ invalid_wl_surface: ++ - wl_surface already has a another role. ++ - wl_surface is destroyed before the ivi_surface is destroyed. ++ ivi_id_in_use: ivi_id is already assigned by another application. ++ ++ ++ ++ ++ ++ ++ ++ The ivi compositor encountered warning while processing a request by this ++ application. The warning is defined by argument warning_code and optional ++ warning_text. If the warning is detected, client shall destroy the ivi_surface ++ object. ++ ++ When a warning event is sent, the compositor turns the ivi_surface object inert. ++ The ivi_surface will not deliver further events, all requests on it are ignored ++ except 'destroy', and the association to the ivi_id is removed. The client ++ should destroy the ivi_surface object. If an inert ivi_surface object is used as ++ an argument to any other object's request, that request will [produce a fatal ++ error / produce a warning / be ignored]. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ This interface is implemented by servers that provide desktop-style user interfaces. ++ It allows clients to associate a ivi_surface with a basic surface. ++ ++ ++ ++ ++ surface_create will create a interface:ivi_surface with numeric ID; ivi_id in ++ ivi compositor. These ivi_ids are defined as unique in the system to identify ++ it inside of ivi compositor. The ivi compositor implements business logic how to ++ set properties of the surface with ivi_id according to status of the system. ++ E.g. a unique ID for Car Navigation application is used for implementing special ++ logic of the application about where it shall be located. ++ if a wl_surface which already has another role is set, the server regards this as ++ error and disconnects the client. ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch b/recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch new file mode 100644 index 000000000..8723def26 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch @@ -0,0 +1,539 @@ +From 1ddfa43692cabae0f552351cfbc09377e479471e Mon Sep 17 00:00:00 2001 +From: Manuel Bachmann +Date: Mon, 8 Sep 2014 11:38:01 +0200 +Subject: [PATCH 21/21] Implement initial IVI-Shell support + +IVI-Shell provides a shell interface for Weston, which maps the GENIVI API (http://www.genivi.org) for In-Vehicle Infotainment. + +This patch enables detecting the IVI-Shell interface at runtime, and creating compatible surfaces if found. + +Task-number: QTBUG-XXXXX/part/2of2 + +Change-Id: I1f6c11bf56b727a54fb48faab9c076b61d635440 +Signed-off-by: Manuel Bachmann +--- + src/client/client.pro | 5 ++ + src/client/qwaylanddisplay.cpp | 9 ++++ + src/client/qwaylanddisplay_p.h | 5 ++ + src/client/qwaylandivishell.cpp | 69 +++++++++++++++++++++++++ + src/client/qwaylandivishell_p.h | 70 +++++++++++++++++++++++++ + src/client/qwaylandivisurface.cpp | 105 ++++++++++++++++++++++++++++++++++++++ + src/client/qwaylandivisurface_p.h | 90 ++++++++++++++++++++++++++++++++ + src/client/qwaylandwindow.cpp | 8 ++- + 8 files changed, 360 insertions(+), 1 deletion(-) + create mode 100644 src/client/qwaylandivishell.cpp + create mode 100644 src/client/qwaylandivishell_p.h + create mode 100644 src/client/qwaylandivisurface.cpp + create mode 100644 src/client/qwaylandivisurface_p.h + +diff --git a/src/client/client.pro b/src/client/client.pro +index 73e3b7f..adb526d 100644 +--- a/src/client/client.pro ++++ b/src/client/client.pro +@@ -42,6 +42,7 @@ WAYLANDCLIENTSOURCES += \ + ../extensions/windowmanager.xml \ + ../3rdparty/protocol/text.xml \ + ../3rdparty/protocol/xdg-shell.xml \ ++ ../3rdparty/protocol/ivi-application.xml \ + + SOURCES += qwaylandintegration.cpp \ + qwaylandnativeinterface.cpp \ +@@ -61,6 +62,8 @@ SOURCES += qwaylandintegration.cpp \ + qwaylandwlshellsurface.cpp \ + qwaylandxdgshell.cpp \ + qwaylandxdgsurface.cpp \ ++ qwaylandivishell.cpp \ ++ qwaylandivisurface.cpp \ + qwaylandextendedoutput.cpp \ + qwaylandextendedsurface.cpp \ + qwaylandsubsurface.cpp \ +@@ -92,6 +95,8 @@ HEADERS += qwaylandintegration_p.h \ + qwaylandwlshellsurface_p.h \ + qwaylandxdgshell_p.h \ + qwaylandxdgsurface_p.h \ ++ qwaylandivishell_p.h \ ++ qwaylandivisurface_p.h \ + qwaylandextendedoutput_p.h \ + qwaylandextendedsurface_p.h \ + qwaylandsubsurface_p.h \ +diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp +index 2e25672..2a93db7 100644 +--- a/src/client/qwaylanddisplay.cpp ++++ b/src/client/qwaylanddisplay.cpp +@@ -51,6 +51,7 @@ + #include "qwaylanddatadevicemanager_p.h" + #include "qwaylandhardwareintegration_p.h" + #include "qwaylandxdgshell_p.h" ++#include "qwaylandivishell_p.h" + + #include "qwaylandwindowmanagerintegration_p.h" + +@@ -62,6 +63,7 @@ + + #include + #include ++#include + + #include + #include +@@ -207,6 +209,8 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin + mCompositor.init(registry, id); + } else if (interface == QStringLiteral("wl_shm")) { + mShm = static_cast(wl_registry_bind(registry, id, &wl_shm_interface,1)); ++ } else if (interface == QStringLiteral("ivi_application")) { ++ mShellIvi.reset(new QWaylandIviShell(registry,id)); + } else if (interface == QStringLiteral("xdg_shell") + && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) { + mShellXdg.reset(new QWaylandXdgShell(registry,id)); +@@ -279,4 +283,9 @@ QtWayland::xdg_shell *QWaylandDisplay::shellXdg() + return mShellXdg.data(); + } + ++QtWayland::ivi_application *QWaylandDisplay::shellIvi() ++{ ++ return mShellIvi.data(); ++} ++ + QT_END_NAMESPACE +diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h +index f1b35a7..b9c686c 100644 +--- a/src/client/qwaylanddisplay_p.h ++++ b/src/client/qwaylanddisplay_p.h +@@ -52,6 +52,7 @@ + #include + #include + #include ++#include + + struct wl_cursor_image; + +@@ -72,6 +73,7 @@ class QWaylandWindow; + class QWaylandEventThread; + class QWaylandIntegration; + class QWaylandHardwareIntegration; ++class QWaylandIviShell; + class QWaylandXdgShell; + + namespace QtWayland { +@@ -81,6 +83,7 @@ namespace QtWayland { + class qt_surface_extension; + class wl_text_input_manager; + class xdg_shell; ++ class ivi_application; + } + + typedef void (*RegistryListener)(void *data, +@@ -117,6 +120,7 @@ public: + + QtWayland::wl_shell *shell() { return mShell.data(); } + QtWayland::xdg_shell *shellXdg(); ++ QtWayland::ivi_application *shellIvi(); + + QList inputDevices() const { return mInputDevices; } + QWaylandInputDevice *defaultInputDevice() const; +@@ -173,6 +177,7 @@ private: + QWaylandEventThread *mEventThreadObject; + QScopedPointer mShell; + QScopedPointer mShellXdg; ++ QScopedPointer mShellIvi; + QList mScreens; + QList mInputDevices; + QList mRegistryListeners; +diff --git a/src/client/qwaylandivishell.cpp b/src/client/qwaylandivishell.cpp +new file mode 100644 +index 0000000..9d63d0d +--- /dev/null ++++ b/src/client/qwaylandivishell.cpp +@@ -0,0 +1,69 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2014 Eurogiciel, author: ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "qwaylandivishell_p.h" ++ ++#include "qwaylanddisplay_p.h" ++#include "qwaylandwindow_p.h" ++#include "qwaylandinputdevice_p.h" ++#include "qwaylanddecoration_p.h" ++#include "qwaylandscreen_p.h" ++ ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++QWaylandIviShell::QWaylandIviShell(struct ::ivi_application *shell) ++ : QtWayland::ivi_application(shell) ++{ ++} ++ ++QWaylandIviShell::QWaylandIviShell(struct ::wl_registry *registry, uint32_t id) ++ : QtWayland::ivi_application(registry, id) ++{ ++} ++ ++QWaylandIviShell::~QWaylandIviShell() ++{ ++ ivi_application_destroy(object()); ++} ++ ++QT_END_NAMESPACE +diff --git a/src/client/qwaylandivishell_p.h b/src/client/qwaylandivishell_p.h +new file mode 100644 +index 0000000..f9f6983 +--- /dev/null ++++ b/src/client/qwaylandivishell_p.h +@@ -0,0 +1,70 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2014 Eurogiciel, author: ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QWAYLANDIVISHELL_H ++#define QWAYLANDIVISHELL_H ++ ++#include ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviShell : public QtWayland::ivi_application ++{ ++public: ++ QWaylandIviShell(struct ::ivi_application *shell); ++ QWaylandIviShell(struct ::wl_registry *registry, uint32_t id); ++ ++ virtual ~QWaylandIviShell(); ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDIVISHELL_H +diff --git a/src/client/qwaylandivisurface.cpp b/src/client/qwaylandivisurface.cpp +new file mode 100644 +index 0000000..a12309e +--- /dev/null ++++ b/src/client/qwaylandivisurface.cpp +@@ -0,0 +1,105 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "qwaylandivisurface_p.h" ++ ++#include "qwaylanddisplay_p.h" ++#include "qwaylandwindow_p.h" ++#include "qwaylandinputdevice_p.h" ++#include "qwaylanddecoration_p.h" ++#include "qwaylandscreen_p.h" ++ ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++QWaylandIviSurface::QWaylandIviSurface(struct ::ivi_surface *ivi_surface, QWaylandWindow *window) ++ : QtWayland::ivi_surface(ivi_surface) ++ , m_window(window) ++{ ++} ++ ++QWaylandIviSurface::~QWaylandIviSurface() ++{ ++ ivi_surface_destroy(object()); ++} ++ ++void QWaylandIviSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) ++{ ++} ++ ++void QWaylandIviSurface::move(QWaylandInputDevice *inputDevice) ++{ ++} ++ ++void QWaylandIviSurface::setMaximized() ++{ ++} ++ ++void QWaylandIviSurface::setFullscreen() ++{ ++} ++ ++void QWaylandIviSurface::setNormal() ++{ ++} ++ ++void QWaylandIviSurface::setMinimized() ++{ ++} ++ ++void QWaylandIviSurface::setTopLevel() ++{ ++} ++ ++void QWaylandIviSurface::updateTransientParent(QWindow *parent) ++{ ++} ++ ++void QWaylandIviSurface::setTitle(const QString & title) ++{ ++} ++ ++void QWaylandIviSurface::setAppId(const QString & appId) ++{ ++} ++ ++QT_END_NAMESPACE +diff --git a/src/client/qwaylandivisurface_p.h b/src/client/qwaylandivisurface_p.h +new file mode 100644 +index 0000000..c6a7ce6 +--- /dev/null ++++ b/src/client/qwaylandivisurface_p.h +@@ -0,0 +1,90 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ++** Contact: http://www.qt-project.org/legal ++** ++** This file is part of the config.tests of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and Digia. For licensing terms and ++** conditions see http://qt.digia.com/licensing. For further information ++** use the contact form at http://qt.digia.com/contact-us. ++** ++** GNU Lesser General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU Lesser ++** General Public License version 2.1 as published by the Free Software ++** Foundation and appearing in the file LICENSE.LGPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU Lesser General Public License version 2.1 requirements ++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Digia gives you certain additional ++** rights. These rights are described in the Digia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU ++** General Public License version 3.0 as published by the Free Software ++** Foundation and appearing in the file LICENSE.GPL included in the ++** packaging of this file. Please review the following information to ++** ensure the GNU General Public License version 3.0 requirements will be ++** met: http://www.gnu.org/copyleft/gpl.html. ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QWAYLANDIVISURFACE_H ++#define QWAYLANDIVISURFACE_H ++ ++#include ++ ++#include ++ ++#include ++#include ++#include "qwaylandshellsurface_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QWaylandWindow; ++class QWaylandInputDevice; ++class QWindow; ++class QWaylandExtendedSurface; ++ ++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviSurface : public QtWayland::ivi_surface ++ , public QWaylandShellSurface ++{ ++public: ++ QWaylandIviSurface(struct ::ivi_surface *shell_surface, QWaylandWindow *window); ++ virtual ~QWaylandIviSurface(); ++ ++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE; ++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE; ++ ++ void setTitle(const QString &title) Q_DECL_OVERRIDE; ++ void setAppId(const QString &appId) Q_DECL_OVERRIDE; ++ ++private: ++ void setMaximized() Q_DECL_OVERRIDE; ++ void setFullscreen() Q_DECL_OVERRIDE; ++ void setNormal() Q_DECL_OVERRIDE; ++ void setMinimized() Q_DECL_OVERRIDE; ++ ++ void setTopLevel() Q_DECL_OVERRIDE; ++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE; ++ ++private: ++ QWaylandWindow *m_window; ++ ++ friend class QWaylandWindow; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QWAYLANDIVISURFACE_H +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 3fb3a49..45a58f2 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -39,6 +39,8 @@ + ** + ****************************************************************************/ + ++#include ++ + #include "qwaylandwindow_p.h" + + #include "qwaylandbuffer_p.h" +@@ -48,10 +50,12 @@ + #include "qwaylandshellsurface_p.h" + #include "qwaylandwlshellsurface_p.h" + #include "qwaylandxdgsurface_p.h" ++#include "qwaylandivisurface_p.h" + #include "qwaylandextendedsurface_p.h" + #include "qwaylandsubsurface_p.h" + #include "qwaylanddecoration_p.h" + #include "qwaylandwindowmanagerintegration_p.h" ++#define IVI_SURFACE_ID 8000 + + #include + #include +@@ -95,7 +99,9 @@ QWaylandWindow::QWaylandWindow(QWindow *window) + mWindowId = id++; + + if (!(window->flags() & Qt::BypassWindowManagerHint)) { +- if (mDisplay->shellXdg()) { ++ if (mDisplay->shellIvi()) { ++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this); ++ } else if (mDisplay->shellXdg()) { + if (window->type() & Qt::Window) { + mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this); + } +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch b/recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch new file mode 100644 index 000000000..984ae8132 --- /dev/null +++ b/recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch @@ -0,0 +1,14 @@ +diff --git a/tests/auto/compositor/compositor/compositor.pro b/tests/auto/compositor/compositor/compositor.pro +index 2919fa4..d9acac3 100644 +--- a/tests/auto/compositor/compositor/compositor.pro ++++ b/tests/auto/compositor/compositor/compositor.pro +@@ -7,9 +7,6 @@ QT += core-private gui-private waylandcompositor waylandcompositor-private + + QMAKE_USE += wayland-client wayland-server + +-qtConfig(xkbcommon-evdev): \ +- QMAKE_USE += xkbcommon_evdev +- + WAYLANDCLIENTSOURCES += \ + ../../../../src/3rdparty/protocol/xdg-shell.xml \ + ../../../../src/3rdparty/protocol/ivi-application.xml \ diff --git a/recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch b/recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch new file mode 100644 index 000000000..bca61b5db --- /dev/null +++ b/recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch @@ -0,0 +1,31 @@ +From 9617c349a212d5407087daf4f4a2386bce94ecc1 Mon Sep 17 00:00:00 2001 +From: Philippe Coval +Date: Thu, 12 Jun 2014 11:55:29 +0200 +Subject: [PATCH 18/21] packaging: enable xdg-shell at runtime + +Change-Id: Iffbae496f1e09c8fa44a28d4eb515678e3bbb297 +Bug-Tizen: TIVI-3113/part +Signed-off-by: Philippe Coval +--- + packaging/qt5-qtwayland.spec | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/packaging/qt5-qtwayland.spec b/packaging/qt5-qtwayland.spec +index cba18e2..ff32185 100644 +--- a/packaging/qt5-qtwayland.spec ++++ b/packaging/qt5-qtwayland.spec +@@ -97,6 +97,11 @@ rm -rf %{buildroot} + + %post + /sbin/ldconfig ++ ++f="/etc/profile.d/qt.sh" ++grep QT_WAYLAND_USE_XDG_SHELL $f \ ++ || echo "QT_WAYLAND_USE_XDG_SHELL='defined'; export QT_WAYLAND_USE_XDG_SHELL" >> $f ++ + %postun + /sbin/ldconfig + +-- +1.9.1 + diff --git a/recipes-qt/qt/qtwayland_%.bbappend b/recipes-qt/qt/qtwayland_%.bbappend new file mode 100644 index 000000000..f9ab5fc8e --- /dev/null +++ b/recipes-qt/qt/qtwayland_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtwayland_agldemo.inc', '', d)} diff --git a/recipes-qt/qt/qtwayland_agldemo.inc b/recipes-qt/qt/qtwayland_agldemo.inc new file mode 100644 index 000000000..46bf2e744 --- /dev/null +++ b/recipes-qt/qt/qtwayland_agldemo.inc @@ -0,0 +1,26 @@ +FILESEXTRAPATHS_append := ":${THISDIR}/qtwayland" + +# QT_MODULE_BRANCH = "5.4" + +# TODO: +# These patches for IVI-SHELL are tempolary disabled because of issues. And new +# patches are proposed. +# +# file://0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch \ +# file://0021-Implement-initial-IVI-Shell-support.patch \ +# file://0001-protocol-update-3rd-party-ivi-application-protocol.patch \ +# file://0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch \ +# +# The xdg-shell merged into upstream, so we don't need these patch anymore. +# But xdg-shell doesn't work well in current AGL Distro because of +# mismatch of protocol versions between server(weston) and client(Qt Apps). +# +# file://0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch \ +# file://0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch \ +# file://0019-xdg-shell-upgrade-to-support-current-version-weston-.patch \ +# + +SRC_URI_append = "\ + file://0010-Added-manifest-file-according-to-smack-3-domain-mode.patch \ + " + diff --git a/recipes-qt/qt/qtwebkit_%.bbappend b/recipes-qt/qt/qtwebkit_%.bbappend new file mode 100644 index 000000000..d0b1302c0 --- /dev/null +++ b/recipes-qt/qt/qtwebkit_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtwebkit_agldemo.inc', '', d)} diff --git a/recipes-qt/qt/qtwebkit_agldemo.inc b/recipes-qt/qt/qtwebkit_agldemo.inc new file mode 100644 index 000000000..0420578e1 --- /dev/null +++ b/recipes-qt/qt/qtwebkit_agldemo.inc @@ -0,0 +1 @@ +PACKAGECONFIG = "gstreamer qtlocation qtmultimedia qtsensors" diff --git a/recipes-support/curl/curl_%.bbappend b/recipes-support/curl/curl_%.bbappend new file mode 100644 index 000000000..b126b6d20 --- /dev/null +++ b/recipes-support/curl/curl_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'curl_agldemo.inc', '', d)} diff --git a/recipes-support/curl/curl_agldemo.inc b/recipes-support/curl/curl_agldemo.inc new file mode 100644 index 000000000..fc24cea15 --- /dev/null +++ b/recipes-support/curl/curl_agldemo.inc @@ -0,0 +1,5 @@ +# Cannot just append to PACKAGECONFIG, as nghttp2's dependencies do not build +# for native/nativesdk, and appending class-target does not work because of +# the weak definition of PACKAGECONFIG in the recipe, so need to copy the +# definition to add nghttp2... +PACKAGECONFIG = "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} gnutls libidn proxy threaded-resolver verbose zlib nghttp2" diff --git a/recipes-support/opencv/opencv_4.%.bbappend b/recipes-support/opencv/opencv_4.%.bbappend new file mode 100644 index 000000000..a1016a6d0 --- /dev/null +++ b/recipes-support/opencv/opencv_4.%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'opencv_agldemo.inc', '', d)} diff --git a/recipes-support/opencv/opencv_agldemo.inc b/recipes-support/opencv/opencv_agldemo.inc new file mode 100644 index 000000000..86d759b61 --- /dev/null +++ b/recipes-support/opencv/opencv_agldemo.inc @@ -0,0 +1 @@ +PACKAGECONFIG_poky = "jpeg png v4l libv4l gstreamer" diff --git a/recipes-support/udisks/files/99-udisks2.rules b/recipes-support/udisks/files/99-udisks2.rules new file mode 100644 index 000000000..996e43439 --- /dev/null +++ b/recipes-support/udisks/files/99-udisks2.rules @@ -0,0 +1,5 @@ +# UDISKS_FILESYSTEM_SHARED +# ==1: mount filesystem to a shared directory (/media/VolumeName) +# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName) +# See udisks(8) +ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1" diff --git a/recipes-support/udisks/files/automount.service b/recipes-support/udisks/files/automount.service new file mode 100644 index 000000000..b16515196 --- /dev/null +++ b/recipes-support/udisks/files/automount.service @@ -0,0 +1,9 @@ +[Unit] +Description=Automount Disk Manager +After=udisks2.service + +[Service] +ExecStart=/usr/libexec/automount.sh + +[Install] +WantedBy=multi-user.target diff --git a/recipes-support/udisks/files/automount.sh b/recipes-support/udisks/files/automount.sh new file mode 100644 index 000000000..236791910 --- /dev/null +++ b/recipes-support/udisks/files/automount.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +MOUNT_OPTIONS_DEFAULT="ro,noexec" +MOUNT_OPTIONS_VFAT="umask=0022" +MOUNT_OPTIONS_EXT="" +MOUNT_OPTIONS_NTFS="" +MOUNT_OPTIONS_ISO9660="" + +VERBOSE=false + +# Source a configuration file that can override mount options if exists +[ -f /etc/automount.conf ] && . /etc/automount.conf + +mount_device() { + MOUNT_OPTIONS="" + FSTYPE="$( udevadm info "${1}" "${2}" | awk -v FS== '/ID_FS_TYPE/ {print $2}' )" + DEVNAME="$( udevadm info "${1}" "${2}" | awk -v FS== '/DEVNAME/ {print $2}' )" + case $FSTYPE in + vfat) + MOUNT_OPTIONS="${MOUNT_OPTIONS_VFAT}" + ;; + ext[2-4]) + MOUNT_OPTIONS="${MOUNT_OPTIONS_EXT}" + ;; + ntfs) + MOUNT_OPTIONS="${MOUNT_OPTIONS_NTFS}" + ;; + iso9660) + MOUNT_OPTIONS="${MOUNT_OPTIONS_ISO9660}" + ;; + "") + if $VERBOSE; then + echo "[INFO][${DEVNAME}] Not a partition with a filesystem!" + fi + return + ;; + *) + echo "[WARNING][${DEVNAME}] The filesystem '${FSTYPE}' is not supported!" + return + ;; + esac + + if [ -n "${MOUNT_OPTIONS_DEFAULT}" ]; then + if [ -z "${MOUNT_OPTIONS}" ]; then + MOUNT_OPTIONS="${MOUNT_OPTIONS_DEFAULT}" + else + MOUNT_OPTIONS="${MOUNT_OPTIONS_DEFAULT},${MOUNT_OPTIONS}" + fi + fi + if $VERBOSE; then + echo "[INFO][${DEVNAME}] Mounting a ${FSTYPE}'s filesystem with options: ${MOUNT_OPTIONS}" + fi + + if command -v udisksctl > /dev/null 2>&1; then + if [ -n "${MOUNT_OPTIONS}" ]; then + MOUNT_OPTIONS="-o ${MOUNT_OPTIONS}" + fi + udisksctl mount -t "${FSTYPE}" -b "${DEVNAME}" ${MOUNT_OPTIONS} + elif command -v udisks >/dev/null 2>&1; then + if [ -n "${MOUNT_OPTIONS}" ]; then + MOUNT_OPTIONS="--mount-options ${MOUNT_OPTIONS}" + fi + udisks --mount-fstype "${FSTYPE}" --mount "${DEVNAME}" ${MOUNT_OPTIONS} + else + echo "[ERROR] Unable to find binary for mounting ${DEVNAME}" >&2 + return + fi + if [ "$?" -ne "0" ]; then + echo "[ERROR] Failed to mount the device ${DEVNAME} of type ${FSTYPE} with options ${MOUNT_OPTIONS}" >&2 + fi +} + +# At startup, remove empty directories that may exists +rmdir /media/* > /dev/null 2>&1 + +# Mount already plugged devices +for DEVICE in $( lsblk -dn | cut -d' ' -f1 ); do + REMOVABLE=$( cat "/sys/block/${DEVICE}/removable" ) + if [ "${REMOVABLE}" -eq "1" ]; then + for PART in "/dev/${DEVICE}"*; do + mount_device -n "${PART}" + done + fi +done + +# Wait for plug events and mount devices +stdbuf -oL -- udevadm monitor --udev -s block | +while read -r -- _ _ EVENT DEVPATH _ +do + if [ "${EVENT}" = "add" ]; then + mount_device -p "/sys/${DEVPATH}" + fi +done diff --git a/recipes-support/udisks/udisks2_%.bbappend b/recipes-support/udisks/udisks2_%.bbappend new file mode 100644 index 000000000..a36862b9e --- /dev/null +++ b/recipes-support/udisks/udisks2_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'udisks2_agldemo.inc', '', d)} diff --git a/recipes-support/udisks/udisks2_agldemo.inc b/recipes-support/udisks/udisks2_agldemo.inc new file mode 100644 index 000000000..44c9a5bac --- /dev/null +++ b/recipes-support/udisks/udisks2_agldemo.inc @@ -0,0 +1,27 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +SRC_URI_append = " file://automount.service \ + file://automount.sh \ + file://99-udisks2.rules \ +" + +SYSTEMD_AUTO_ENABLE = "enable" +SYSTEMD_SERVICE_${PN}_append = " automount.service" + +do_install_append () { + sed -i 's/^WantedBy=.*/WantedBy=multi-user.target/' ${D}${systemd_unitdir}/system/udisks2.service + + install -d ${D}${base_libdir}/systemd/system + install -m 0644 ${WORKDIR}/automount.service ${D}${systemd_unitdir}/system + + install -d ${D}${libexecdir} + install -m 0755 ${WORKDIR}/automount.sh ${D}${libexecdir}/automount.sh + + install -d ${D}${sysconfdir}/udev/rules.d + install -m 0644 ${WORKDIR}/99-udisks2.rules ${D}${sysconfdir}/udev/rules.d +} + +FILES_${PN}_append = " \ + ${base_libdir}/systemd/system/automount.service \ + ${libexecdir}/automount.sh \ +" diff --git a/recipes-test/afb-test/afb-test_git.bb b/recipes-test/afb-test/afb-test_git.bb new file mode 100644 index 000000000..5246abb00 --- /dev/null +++ b/recipes-test/afb-test/afb-test_git.bb @@ -0,0 +1,25 @@ +SUMMARY = "Binding embedding test framework to test others binding" +DESCRIPTION = "This make testing binding running with Application Framework binder \ +easier by simply test verb return as well as event reception." +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/app-afb-test" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" +SECTION = "apps" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/app-afb-test;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +DEPENDS += "lua libafb-helpers libappcontroller" +RDEPENDS_${PN} += "lua bash jq" +RDEPENDS_${PN}-ptest += "af-binder" + +PV = "${AGLVERSION}" +S = "${WORKDIR}/git" + +inherit cmake aglwgt pkgconfig ptest + +do_install_append() { + install -d ${D}${bindir} + install -m 775 ${S}/afm-test.target.sh ${D}${bindir}/afm-test +} + diff --git a/recipes-test/afb-test/files/run-ptest b/recipes-test/afb-test/files/run-ptest new file mode 100644 index 000000000..883939a83 --- /dev/null +++ b/recipes-test/afb-test/files/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +afm-test /usr/AGL/apps/testwgt/aftest-test.wgt diff --git a/recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper b/recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper new file mode 100644 index 000000000..12580237d --- /dev/null +++ b/recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper @@ -0,0 +1,320 @@ +#!/bin/bash +# +# Copyright (C) 2020 Konsulko Group +# +# 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. + +# +# gcovr wrapper for generating coverage reports against AGL bindings +# on target. With a given binding name or coverage widget file, the +# coverage version will be installed, and the pyagl tests for the +# binding run before generating a report with gcovr. The afm-test +# test widget or a user-supplied command may be run instead of the +# pyagl tests, see usage below, or run with "--help". +# + +usage() { + cat <<-EOF + Usage: + $(basename $0) [options] + + Options: + -h, --help + Print this help and exit + + -k, --keep + Do not remove temporary files/directories + + -o, --gcovr-options + Additional gcovr options, multiple options should be quoted + + -w, --workdir + gcov/gcovr temporary working directory, defaults to /tmp/gcov + The directory will be removed after running without --keep if it + is empty, use caution if specifying existing system directories! + + --pyagl + Run pyagl tests for binding, enabled by default + + --afm-test + Run afm-test test widget tests for binding. + If specified, disables pyagl tests; note that the last argument in + the command-line will take precedence. + + -c, --command + Test command to use in place of pyagl or afm-test, should be quote + If specified, disables pyagl and afm-test tests. + + EOF +} + +# Helper to validate widget install dir +check_wgt_install() { + if [ ! \( -d $1 -o -f $1/config.xml \) ]; then + echo "ERROR: No widget install at $1" + exit 1 + elif [ ! -d $1/src ]; then + echo "ERROR: No source in $1/src" + exit 1 + fi +} + +# Helper to run gcovr inside mount namespace environment +gcovr_runner() { + wgt_install_dir=/var/local/lib/afm/applications/$1 + check_wgt_install ${wgt_install_dir} + + if [ ! -d $workdir/$1 ]; then + echo "ERROR: No coverage data in $workdir/$1" + exit 1 + fi + + # Get original source path + gcno=$(cd $workdir/$1 && find -name '*.gcno' | head -n 1 | cut -d/ -f2-) + if [ -z "$gcno" ]; then + echo "ERROR: no gcno file found in $workdir/$1" + exit 1 + fi + srcfile=$(strings $workdir/$1/${gcno} | grep "$(basename ${gcno%.gcno})$" | uniq) + srcdir=$(echo $srcfile | sed "s|/${gcno%%/*}/.*$||") + + # Set up mounts for chroot to run gcovr in + # NOTE: We do not unmount these later, as we assume we are in a + # private mount namespace and they will go away on exit from + # it. + echo "Setting up mounts" + tmpdir=$(mktemp -d) + echo $tmpdir > $workdir/.runner_tmpdir + mkdir -p $tmpdir/{lower,upper,work,merged} + # NOTE: Could potentially use rbind here, but explicitly mounting + # just what we need seems safer + mount --bind / $tmpdir/lower + mount -t overlay -o lowerdir=$tmpdir/lower,upperdir=$tmpdir/upper,workdir=$tmpdir/work overlay $tmpdir/merged + mount --bind /proc $tmpdir/merged/proc + mount --bind /sys $tmpdir/merged/sys + mount --bind /dev $tmpdir/merged/dev + mount --bind /tmp $tmpdir/merged/tmp + # Bind in the data files + # NOTE: $workdir is bound instead of specifically just $workdir/$1, + # so that e.g. html output to another directory in /tmp will + # work as expected. A determined user may be able to shoot + # themselves in the foot, but for now the trade off seems + # acceptable. + mkdir -p $tmpdir/merged/$workdir + mount --bind $workdir $tmpdir/merged/$workdir + # Bind the source files to their expected location + mkdir -p $tmpdir/merged/$srcdir + mount --bind ${wgt_install_dir}/src $tmpdir/merged/$srcdir + + echo "Entering chroot" + echo + exec chroot $tmpdir/merged \ + /usr/bin/gcovr -r $srcdir --object-directory $workdir/$1 --gcov-filter-source-errors -s ${GCOV_RUNNER_GCOVR_OPTIONS} +} + +# Helper to clean up after runner +gcovr_runner_cleanup() { + rm -rf $workdir/$1 + if [ -f $workdir/.runner_tmpdir ]; then + tmpdir=$(cat $workdir/.runner_tmpdir) + rm -rf $tmpdir + rm -f $workdir/.runner_tmpdir + fi + if [ "$workdir" != "/tmp" ]; then + rmdir $workdir 2>/dev/null || true + fi +} + +# Parse arguments +OPTS=$(getopt -o +hko:pw:c: --longoptions gcovr-runner,afm-test,command:,help,keep,gcovr-options:,pyagl,workdir: -n "$(basename $0)" -- "$@") +if [ $? -ne 0 ]; then + exit 1 +fi +eval set -- "$OPTS" + +runner=false +keep=false +wgt="" +cmd="" +options="" +afmtest=false +pyagl=true +workdir="/tmp/gcov" + +while true; do + case "$1" in + --gcovr-runner) runner=true; shift;; + --afm-test) afmtest=true; pyagl=false; shift;; + -c|--command) cmd="$2"; shift; shift;; + -h|--help) usage; exit 0;; + -k|--keep) keep=true; shift;; + -o|--gcovr-options) options="$2"; shift; shift;; + -p|--pyagl) pyagl=true; afmtest=false; shift;; + -w|--workdir) workdir="$2"; shift; shift;; + --) shift; break;; + *) break;; + esac +done + +# Encode the assumption that a specified command means it runs instead +# of any other tests. +if [ -s "$cmd" ]; then + pyagl=false + afmtest=false +fi + +if [ $# -ne 1 ]; then + # Always expect widget name as single non-option argument + usage + exit 1 +fi + +# Rationalize workdir just in case +workdir=$(realpath "$workdir") + +if [ "$runner" = "true" ]; then + if [ "${GCOV_RUNNER_READY}" != "true" ]; then + echo "ERROR: gcovr environment not ready!" + exit 1 + fi + gcovr_runner $1 + # If we get here, it'd be an error, so return 1 + exit 1 +fi + +binding=$1 +if [ "${1%.wgt}" != "$1" ]; then + # User has specified path to a widget file + wgt=$(realpath $1) + binding=$(basename "${1%-coverage.wgt}") +else + wgt=/usr/AGL/apps/coverage/${binding}-coverage.wgt +fi +if [ ! -f $wgt ]; then + echo "ERROR: No widget $wgt" + exit 1 +elif [ "$afmtest" = "true" -a ! -f /usr/AGL/apps/test/${binding}-test.wgt ]; then + echo "ERROR: No test widget for $binding" + exit 1 +fi + +# Determine starting systemd unit name +service=$(systemctl --all |grep afm-service-$binding |sed 's/^[ *] \([^ ]*\).*/\1/') +if [ -z "$service" ]; then + echo "ERROR: Could not determine systemd service unit for $binding" + exit 1 +fi + +# Install coverage widget +echo "Removing $binding widget" +systemctl stop $service +afm-util remove $binding +echo +echo "Installing $binding coverage widget" +afm-util install $wgt +echo + +wgt_install_dir=/var/local/lib/afm/applications/$binding +check_wgt_install ${wgt_install_dir} +gcov_src=${wgt_install_dir}/coverage +if [ ! -d ${gcov_src} ]; then + echo "ERROR: No coverage information in ${gcov_src}" + exit 1 +elif [ ! -f ${gcov_src}/gcov.env ]; then + echo "ERROR: No gcov environment file at ${gcov_src}/gcov.env" + exit 1 +fi + +# +# NOTE: In theory, the coverage data collection could be done inside +# the mount namespace / chroot, but the potential for issues +# when doing that seems higher than just running gcovr there, +# so a conservative approach is taken. +# + +# Set up things for the binary to write out gcda data files +# +# Having the matching build directory hierarchy in place and +# writeable by the target binary before any restart and testing is +# key to things working. +# +# As well, the environment file with the GCOV_PREFIX and +# GCOV_PREFIX_STRIP values needs to be present before running so the +# gcda files will get written into the relocated build hierarchy. +# +echo "Installing coverage information for $binding" +mkdir -p $workdir +rm -rf $workdir/$binding +cp -dr ${gcov_src} $workdir/$binding +chsmack -r -a System::Log $workdir +chmod -R go+w $workdir + +# Install the gcov environment file +mkdir -p /etc/afm/widget.env.d/$binding +if [ "${workdir}" = "/tmp/gcov" ]; then + cp ${gcov_src}/gcov.env /etc/afm/widget.env.d/$binding/gcov +else + # Update GCOV_PREFIX to point into workdir + sed "s|^GCOV_PREFIX=.*|GCOV_PREFIX=${workdir}/$binding|" ${gcov_src}/gcov.env > /etc/afm/widget.env.d/$binding/gcov +fi +chsmack -r -a _ /etc/afm/widget.env.d/$binding + +# Determine new systemd unit name (version may now be different) +service=$(systemctl --all |grep afm-service-$binding |sed 's/^[ *] \([^ ]*\).*/\1/') +if [ -z "$service" ]; then + echo "ERROR: Could not determine systemd service unit for $binding" + exit 1 +fi + +# Restart the binding +systemctl start $service +echo + +# Run tests or given command +if [ -n "$cmd" ]; then + echo "Running command: $cmd" + export AGL_AVAILABLE_INTERFACES=${AGL_AVAILABLE_INTERFACES:-ethernet} + eval $cmd +elif [ "$pyagl" = "true" ]; then + echo "Running $binding pyagl tests" + export AGL_AVAILABLE_INTERFACES=${AGL_AVAILABLE_INTERFACES:-ethernet} + pytest -k "${binding#agl-service-} and not hwrequired" /usr/lib/python3.?/site-packages/pyagl +else + echo "Running $binding test widget" + # NOTE: su to agl-driver is required here to avoid fallout from + # the "afm-util run" in afm-test seemingly triggering the + # start of other per-user bindings for the root user. + su -l -c "/usr/bin/afm-test /usr/AGL/apps/test/${binding}-test.wgt" agl-driver +fi + +# Restart again to trigger data file writing +systemctl restart $service +echo + +# Run ourselves in gcovr runner mode inside a private mount namespace +export GCOV_RUNNER_READY=true +# NOTE: Passing gcovr options in the environment to avoid quoting hassles +export GCOV_RUNNER_GCOVR_OPTIONS="$options" +runner_options="--workdir ${workdir}" +unshare -m $0 --gcovr-runner ${runner_options} $binding +rc=$? + +if [ "$keep" != "true" ]; then + # Clean up after ourselves + gcovr_runner_cleanup $1 + rm -f /etc/afm/widget.env.d/$1/gcov + rmdir /etc/afm/widget.env.d/$1 2>/dev/null || true +fi + +exit $rc + diff --git a/recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb b/recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb new file mode 100644 index 000000000..2ff39b211 --- /dev/null +++ b/recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb @@ -0,0 +1,17 @@ +SUMMARY = "AGL gcovr wrapper" +DESCRIPTION = "This wrapper script enables running gcovr against a \ +AGL binding to generate a coverage report of running pyagl tests, \ +the afm-test test widget, or a user-supplied command." + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI += "file://gcovr-wrapper" + +inherit allarch + +do_install() { + install -D -m 0755 ${WORKDIR}/gcovr-wrapper ${D}${bindir}/gcovr-wrapper +} + +RDEPENDS_${PN} = "bash gcovr" diff --git a/recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch b/recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch new file mode 100644 index 000000000..be1dcf829 --- /dev/null +++ b/recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch @@ -0,0 +1,68 @@ +Add option to filter gcov source errors + +Add "--gcov-filter-source-errors" to apply filters to the source +files in the errors from gcov. If all source files in the errors +are filtered, then the error is ignored so that the file will be +processed. This enables the usecase of running on a target where +only the source tree for a binary is available, but not all of the +external source headers are. + +Upstream-Status: pending + +Signed-off-by: Scott Murray + +diff --git a/gcovr/configuration.py b/gcovr/configuration.py +index 1356097..083532c 100644 +--- a/gcovr/configuration.py ++++ b/gcovr/configuration.py +@@ -915,6 +915,14 @@ GCOVR_CONFIG_OPTIONS = [ + "Default: {default!s}.", + action="store_true", + ), ++ GcovrConfigOption( ++ "gcov_filter_source_errors", ['--gcov-filter-source-errors'], ++ group="gcov_options", ++ help="Apply filters to missing source file errors in GCOV files " ++ "instead of exiting with an error. " ++ "Default: {default!s}.", ++ action="store_true", ++ ), + GcovrConfigOption( + "objdir", ['--object-directory'], + group="gcov_options", +diff --git a/gcovr/gcov.py b/gcovr/gcov.py +index de79215..171d68d 100644 +--- a/gcovr/gcov.py ++++ b/gcovr/gcov.py +@@ -667,11 +667,27 @@ def run_gcov_and_process_files( + chdir=chdir, + tempdir=tempdir) + ++ skip = False + if source_re.search(err): +- # gcov tossed errors: try the next potential_wd +- error(err) +- done = False +- else: ++ ignore = False ++ if options.gcov_filter_source_errors: ++ # Check if errors are all from source that is filtered ++ ignore = True ++ for line in err.splitlines(): ++ src_fname = line.split()[-1] ++ filtered, excluded = apply_filter_include_exclude( ++ src_fname, options.filter, options.exclude) ++ if not (filtered or excluded): ++ ignore = False ++ break ++ ++ if not ignore: ++ # gcov tossed errors: try the next potential_wd ++ error(err) ++ skip = True ++ ++ done = False ++ if not skip: + # Process *.gcov files + for fname in active_gcov_files: + process_gcov_data(fname, covdata, abs_filename, options) diff --git a/recipes-test/gcovr/gcovr_%.bbappend b/recipes-test/gcovr/gcovr_%.bbappend new file mode 100644 index 000000000..699aea214 --- /dev/null +++ b/recipes-test/gcovr/gcovr_%.bbappend @@ -0,0 +1,2 @@ +# Add not yet upstreamed patch that enables on target gcov usage +SRC_URI += "file://0001-add-gcov-filter-source-errors-option.patch" diff --git a/recipes-test/gcovr/gcovr_git.bb b/recipes-test/gcovr/gcovr_git.bb new file mode 100644 index 000000000..6da04cc53 --- /dev/null +++ b/recipes-test/gcovr/gcovr_git.bb @@ -0,0 +1,32 @@ +SUMMARY = "Generate GCC code coverage reports" +DESCRIPTION = "Gcovr provides a utility for managing the use of the GNU gcov \ +utility and generating summarized code coverage results." +HOMEPAGE = "https://gcovr.com" +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=221e634a1ceafe02ef74462cbff2fb16" + +PV = "4.2+git${SRCPV}" +SRC_URI = "git://github.com/gcovr/gcovr.git;protocol=https" +SRCREV = "1bc72e3bb59b9296e962b350691732ddafbd3195" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +RDEPENDS_${PN} += " \ + python3-compression \ + python3-core \ + python3-crypt \ + python3-datetime \ + python3-difflib \ + python3-io \ + python3-jinja2 \ + python3-json \ + python3-lxml \ + python3-multiprocessing \ + python3-pygments \ + python3-pytest \ + python3-shell \ + python3-threading \ + python3-typing \ +" diff --git a/recipes-test/pyagl/pyagl_git.bb b/recipes-test/pyagl/pyagl_git.bb new file mode 100644 index 000000000..821a1de7a --- /dev/null +++ b/recipes-test/pyagl/pyagl_git.bb @@ -0,0 +1,33 @@ +SUMMARY = "Python bindings and tests for Automotive Grade Linux services" +HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/src/pyagl" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/pyagl;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "dcc2f91e5ab3b70202e78ec7164a8e9d7501d70c" +PV = "${AGL_BRANCH}+git${SRCPV}" + +S = "${WORKDIR}/git" + +inherit setuptools3 + +do_install_append() { + install -D -m 0755 ${S}/pyagl/scripts/pyagl ${D}${bindir}/pyagl +} + +RDEPENDS_${PN} += " \ + python3-asyncio \ + python3-asyncssh \ + python3-core \ + python3-json \ + python3-logging \ + python3-math \ + python3-parse \ + python3-pprint \ + python3-pytest \ + python3-pytest-asyncio \ + python3-pytest-dependency \ + python3-pytest-reverse \ + python3-typing \ + python3-websockets \ +" diff --git a/recipes-wam/chromium/chromium-browser-service.bb b/recipes-wam/chromium/chromium-browser-service.bb new file mode 100644 index 000000000..90242d792 --- /dev/null +++ b/recipes-wam/chromium/chromium-browser-service.bb @@ -0,0 +1,19 @@ +SUMMARY = "Chromium browser widget" +DESCRIPTION = "Wgt packaging for running chromium installed browser" +HOMEPAGE = "https://webosose.org" +SECTION = "apps" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/chromium;protocol=https;branch=${AGL_BRANCH}" +SRCREV = "${AGL_APP_REVISION}" + +PV = "1.0+git${SRCPV}" +S = "${WORKDIR}/git" + +#build-time dependencies +DEPENDS += "af-binder af-main-native chromium68" + +inherit cmake aglwgt + +RDEPENDS_${PN} += "chromium68-browser" diff --git a/recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch b/recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch new file mode 100644 index 000000000..485766b02 --- /dev/null +++ b/recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch @@ -0,0 +1,40 @@ +Upstream-Status: Inappropriate [embedder specific] + +The patch below makes the V8 binaries run during the build be invoked through +QEMU, as they are built for the target. + +Signed-off-by: Raphael Kubo da Costa +Signed-off-by: Maksim Sisov + +Index: git/src/tools/v8_context_snapshot/BUILD.gn +=================================================================== +--- git.orig/src/tools/v8_context_snapshot/BUILD.gn ++++ git/src/tools/v8_context_snapshot/BUILD.gn +@@ -62,6 +62,7 @@ if (use_v8_context_snapshot) { + output_path = rebase_path(output_file, root_build_dir) + + args = [ ++ "./v8-qemu-wrapper.sh", + "./" + rebase_path( + get_label_info( + ":v8_context_snapshot_generator($v8_snapshot_toolchain)", +Index: git/src/v8/BUILD.gn +=================================================================== +--- git.orig/src/v8/BUILD.gn ++++ git/src/v8/BUILD.gn +@@ -900,6 +900,7 @@ action("run_torque") { + } + + args = [ ++ "./v8-qemu-wrapper.sh", + "./" + rebase_path(get_label_info(":torque($v8_torque_toolchain)", + "root_out_dir") + "/torque", + root_build_dir), +@@ -977,6 +978,7 @@ template("run_mksnapshot") { + data = [] + + args = [ ++ "./v8-qemu-wrapper.sh", + "./" + rebase_path(get_label_info(":mksnapshot($v8_snapshot_toolchain)", + "root_out_dir") + "/mksnapshot", + root_build_dir), diff --git a/recipes-wam/chromium/chromium68_git.bb b/recipes-wam/chromium/chromium68_git.bb new file mode 100644 index 000000000..4f545c145 --- /dev/null +++ b/recipes-wam/chromium/chromium68_git.bb @@ -0,0 +1,404 @@ +# Copyright (c) 2018 LG Electronics, Inc. + +SUMMARY = "Chromium webruntime for webOS" +AUTHOR = "Lokesh Kumar Goel " +SECTION = "webos/apps" +LICENSE = "Apache-2.0 & BSD-3-Clause & LGPL-2.0 & LGPL-2.1" +LIC_FILES_CHKSUM = "\ + file://src/LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \ + file://src/third_party/blink/renderer/core/LICENSE-LGPL-2;md5=36357ffde2b64ae177b2494445b79d21 \ + file://src/third_party/blink/renderer/core/LICENSE-LGPL-2.1;md5=a778a33ef338abbaf8b8a7c36b6eec80 \ +" + +require gn-utils.inc + +inherit gettext qemu pythonnative + +DEPENDS = "virtual/gettext wayland wayland-native pixman freetype glib-2.0 fontconfig openssl pango cairo icu libxkbcommon libexif dbus pciutils udev libcap alsa-lib virtual/egl elfutils-native libdrm atk gperf-native gconf nss nss-native nspr nspr-native bison-native qemu-native" + +PROVIDES = "${BROWSER_APPLICATION}" + +SRC_URI = "\ + git://github.com/igalia/${BPN};branch=WIP@39.agl.compositor;protocol=https;rev=${SRCREV_chromium68};name=chromium68 \ + git://github.com/webosose/v8;destsuffix=git/src/v8;rev=${SRCREV_v8};name=v8 \ + file://v8-qemu-wrapper.patch \ +" +SRCREV_chromium68 = "61e96d1ee5dfc2461697457d287bf922d8a03d9a" +SRCREV_v8 = "1e3af71f1ff3735e8a5b639c48dfca63a7b8a647" + +# we don't include SRCPV in PV, so we have to manually include SRCREVs in do_fetch vardeps +do_fetch[vardeps] += "SRCREV_v8" +SRCREV_FORMAT = "main_v8" + +S = "${WORKDIR}/git" + +SRC_DIR = "${S}/src" +OUT_DIR = "${WORKDIR}/build" +BUILD_TYPE = "Release" + +B = "${OUT_DIR}/${BUILD_TYPE}" + +WEBRUNTIME_BUILD_TARGET = "webos:weboswebruntime" +BROWSER_APP_BUILD_TARGET = "chrome" +BROWSER_APPLICATION = "chromium68-browser" +BROWSER_APPLICATION_DIR = "/opt/chromium68" + +TARGET = "${WEBRUNTIME_BUILD_TARGET} ${BROWSER_APP_BUILD_TARGET}" + +# Skip do_install_append of webos_system_bus. It is not compatible with this component. +WEBOS_SYSTEM_BUS_FILES_LOCATION = "${S}/files/sysbus" + +PACKAGECONFIG ?= "jumbo use-upstream-wayland" + +# Options to enable debug-webcore build. +# Add the following line to local.conf (or local.dev.inc) to enable them: +# PACKAGECONFIG_append_pn-chromium68 = " debug-webcore" +# Other debug options are controlled by sections later in this file +PACKAGECONFIG[debug-webcore] = "remove_webcore_debug_symbols=false,remove_webcore_debug_symbols=true" + +# Set a default value for jumbo file merge of 8. This should be good for build +# servers and workstations with a big number of cores. In case build is +# happening in a machine with less cores but still enough RAM a good value could +# be 50. +JUMBO_FILE_MERGE_LIMIT="8" +PACKAGECONFIG[jumbo] = "use_jumbo_build=true jumbo_file_merge_limit=${JUMBO_FILE_MERGE_LIMIT}, use_jumbo_build=false" + +PACKAGECONFIG[lttng] = "use_lttng=true,use_lttng=false,lttng-ust,lttng-tools lttng-modules babeltrace" + +# Chromium can use v4l2 device for hardware accelerated video decoding on such boards as Renesas R-car M3, for example. +# In case of R-car m3, additional patches are required for gstreamer and v4l2apps. +# See https://github.com/igel-oss/meta-browser-hwdecode/tree/igalia-chromium71. +PACKAGECONFIG[use-linux-v4l2] = "use_v4l2_codec=true use_v4lplugin=true use_linux_v4l2_only=true" + +PACKAGECONFIG[use-upstream-wayland] = " \ + ozone_platform_wayland_external=false ozone_platform_wayland=true \ + use_system_minigbm=true, \ + ozone_platform_wayland_external=true ozone_platform_wayland=false \ +" + +GN_ARGS = "\ + enable_memorymanager_webapi=false\ + ffmpeg_branding=\"Chrome\"\ + host_os=\"linux\"\ + ozone_auto_platforms=false\ + proprietary_codecs=true\ + target_os=\"linux\"\ + treat_warnings_as_errors=false\ + is_agl=true\ + use_cbe=true\ + is_chrome_cbe=true\ + use_cups=false\ + use_custom_libcxx=false\ + use_kerberos=false\ + use_neva_media=false\ + use_ozone=true\ + use_xkbcommon=true\ + use_pmlog=false\ + use_system_debugger_abort=true\ + use_webos_gpu_info_collector=false\ + ${PACKAGECONFIG_CONFARGS}\ +" + +# From Chromium's BUILDCONFIG.gn: +# Set to enable the official build level of optimization. This has nothing +# to do with branding, but enables an additional level of optimization above +# release (!is_debug). This might be better expressed as a tri-state +# (debug, release, official) but for historical reasons there are two +# separate flags. +# See also: https://groups.google.com/a/chromium.org/d/msg/chromium-dev/hkcb6AOX5gE/PPT1ukWoBwAJ +GN_ARGS += "is_debug=false is_official_build=true" + +# is_cfi default value is true for x86-64 builds with is_official_build=true. +# As of M63, we explicitly need to set it to false, otherwise we fail the +# following assertion in //build/config/sanitizers/sanitizers.gni: +# assert(!is_cfi || is_clang, +# "is_cfi requires setting is_clang = true in 'gn args'") +GN_ARGS += "is_cfi=false" + +# By default, passing is_official_build=true to GN causes its symbol_level +# variable to be set to "2". This means the compiler will be passed "-g2" and +# we will end up with a very large chrome binary (around 5Gb as of M58) +# regardless of whether DEBUG_BUILD has been set or not. In addition, binutils, +# file and other utilities are unable to read a 32-bit binary this size, which +# causes it not to be stripped. +# The solution is two-fold: +# 1. Make sure -g is not passed on 32-bit architectures via DEBUG_FLAGS. -g is +# the same as -g2. -g1 generates an 800MB binary, which is a lot more +# manageable. +# 2. Explicitly pass symbol_level=0 to GN. This causes -g0 to be passed +# instead, so that if DEBUG_BUILD is not set GN will not create a huge debug +# binary anyway. Since our compiler flags are passed after GN's, -g0 does +# not cause any issues if DEBUG_BUILD is set, as -g1 will be passed later. +DEBUG_FLAGS_remove_arm = "-g" +DEBUG_FLAGS_append_arm = "-g1" +DEBUG_FLAGS_remove_x86 = "-g" +DEBUG_FLAGS_append_x86 = "-g1" +GN_ARGS += "symbol_level=0" + +# We do not want to use Chromium's own Debian-based sysroots, it is easier to +# just let Chromium's build system assume we are not using a sysroot at all and +# let Yocto handle everything. +GN_ARGS += "use_sysroot=false" + +# Toolchains we will use for the build. We need to point to the toolchain file +# we've created, set the right target architecture and make sure we are not +# using Chromium's toolchain (bundled clang, bundled binutils etc). +GN_ARGS += "\ + custom_toolchain=\"//build/toolchain/yocto:yocto_target\" \ + gold_path=\"\" \ + host_toolchain=\"//build/toolchain/yocto:yocto_native\" \ + is_clang=${@is_default_cc_clang(d)} \ + clang_base_path=\"${@clang_install_path(d)}\" \ + clang_use_chrome_plugins=false \ + linux_use_bundled_binutils=false \ + target_cpu=\"${@gn_target_arch_name(d)}\" \ + v8_snapshot_toolchain=\"//build/toolchain/yocto:yocto_target\" \ +" + +# ARM builds need special additional flags (see ${S}/build/config/arm.gni). +# If we do not pass |arm_arch| and friends to GN, it will deduce a value that +# will then conflict with TUNE_CCARGS and CC. +# Note that as of M61 in some corner cases parts of the build system disable +# the "compiler_arm_fpu" GN config, whereas -mfpu is always passed via ${CC}. +# We might want to rework that if there are issues in the future. +def get_compiler_flag(params, param_name, d): + """Given a sequence of compiler arguments in |params|, returns the value of + an option |param_name| or an empty string if the option is not present.""" + for param in params: + if param.startswith(param_name): + return param.split('=')[1] + return '' + +ARM_FLOAT_ABI = "${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hard', 'softfp', d)}" +ARM_FPU = "${@get_compiler_flag(d.getVar('TUNE_CCARGS').split(), '-mfpu', d)}" +ARM_TUNE = "${@get_compiler_flag(d.getVar('TUNE_CCARGS').split(), '-mcpu', d)}" +ARM_VERSION_aarch64 = "8" +ARM_VERSION_armv7a = "7" +ARM_VERSION_armv7ve = "7" +ARM_VERSION_armv6 = "6" + +# GN computes and defaults to it automatically where needed +# forcing it from cmdline breaks build on places where it ends up +# overriding what GN wants +TUNE_CCARGS_remove = "-mthumb" + +GN_ARGS_append_arm = " \ + arm_float_abi=\"${ARM_FLOAT_ABI}\" \ + arm_fpu=\"${ARM_FPU}\" \ + arm_tune=\"${ARM_TUNE}\" \ + arm_version=${ARM_VERSION} \ +" +# tcmalloc's atomicops-internals-arm-v6plus.h uses the "dmb" instruction that +# is not available on (some?) ARMv6 models, which causes the build to fail. +GN_ARGS_append_armv6 += 'use_allocator="none"' +# The WebRTC code fails to build on ARMv6 when NEON is enabled. +# https://bugs.chromium.org/p/webrtc/issues/detail?id=6574 +GN_ARGS_append_armv6 += 'arm_use_neon=false' + +# Disable glibc shims on musl +# tcmalloc does not play well with musl as of M62 (and possibly earlier). +# https://github.com/gperftools/gperftools/issues/693 +GN_ARGS_append_libc-musl = ' use_allocator_shim=false' + +# V8's JIT infrastructure requires binaries such as mksnapshot and +# mkpeephole to be run in the host during the build. However, these +# binaries must have the same bit-width as the target (e.g. a x86_64 +# host targeting ARMv6 needs to produce a 32-bit binary). Instead of +# depending on a third Yocto toolchain, we just build those binaries +# for the target and run them on the host with QEMU. +python do_create_v8_qemu_wrapper () { + """Creates a small wrapper that invokes QEMU to run some target V8 binaries + on the host.""" + qemu_libdirs = [d.expand('${STAGING_DIR_HOST}${libdir}'), + d.expand('${STAGING_DIR_HOST}${base_libdir}')] + qemu_cmd = qemu_wrapper_cmdline(d, d.getVar('STAGING_DIR_HOST', True), + qemu_libdirs) + wrapper_path = d.expand('${B}/v8-qemu-wrapper.sh') + with open(wrapper_path, 'w') as wrapper_file: + wrapper_file.write("""#!/bin/sh + +# This file has been generated automatically. +# It invokes QEMU to run binaries built for the target in the host during the +# build process. + +%s "$@" +""" % qemu_cmd) + os.chmod(wrapper_path, 0o755) +} +do_create_v8_qemu_wrapper[dirs] = "${B}" +addtask create_v8_qemu_wrapper after do_patch before do_configure + +python do_write_toolchain_file () { + """Writes a BUILD.gn file for Yocto detailing its toolchains.""" + toolchain_dir = d.expand("${S}/src/build/toolchain/yocto") + bb.utils.mkdirhier(toolchain_dir) + toolchain_file = os.path.join(toolchain_dir, "BUILD.gn") + write_toolchain_file(d, toolchain_file) +} +addtask write_toolchain_file after do_patch before do_configure + +# More options to speed up the build +GN_ARGS += "\ + enable_nacl=false\ + disable_ftp_support=true\ + enable_print_preview=false\ + enable_remoting=false\ + use_glib=true\ + use_gnome_keyring=false\ + use_pulseaudio=false\ +" + +# Respect ld-is-gold in DISTRO_FEATURES when enabling gold +# Similar patch applied in meta-browser +# http://patchwork.openembedded.org/patch/77755/ +EXTRA_OEGN_GOLD = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', 'use_gold=true', 'use_gold=false', d)}" +GN_ARGS += "${EXTRA_OEGN_GOLD}" + +# Doesn't build for armv[45]* +COMPATIBLE_MACHINE = "(-)" +COMPATIBLE_MACHINE_aarch64 = "(.*)" +COMPATIBLE_MACHINE_armv6 = "(.*)" +COMPATIBLE_MACHINE_armv7a = "(.*)" +COMPATIBLE_MACHINE_armv7ve = "(.*)" +COMPATIBLE_MACHINE_x86 = "(.*)" +COMPATIBLE_MACHINE_x86-64 = "(.*)" + +#CHROMIUM_PLUGINS_PATH = "${libdir}" +CBE_DATA_PATH = "${libdir}/cbe" +CBE_DATA_LOCALES_PATH = "${CBE_DATA_PATH}/locales" + +# The text relocations are intentional -- see comments in [GF-52468] +# TODO: check if we need INSANE_SKIP on ldflags +INSANE_SKIP_${PN} = "textrel ldflags" + + +do_compile[progress] = "outof:^\[(\d+)/(\d+)\]\s+" +do_compile() { + if [ ! -f ${OUT_DIR}/${BUILD_TYPE}/build.ninja ]; then + do_configure + fi + + export PATH="${S}/depot_tools:$PATH" + ${S}/depot_tools/ninja -v -C ${OUT_DIR}/${BUILD_TYPE} ${TARGET} +} + +do_configure() { + configure_env +} + +configure_env() { + export GYP_CHROMIUM_NO_ACTION=1 + export PATH="${S}/depot_tools:$PATH" + + GN_ARGS="${GN_ARGS}" + echo GN_ARGS is ${GN_ARGS} + echo BUILD_TARGETS are ${TARGET} + cd ${SRC_DIR} + gn gen ${OUT_DIR}/${BUILD_TYPE} --args="${GN_ARGS}" +} + +WINDOW_SIZE ?= "1920,1080" + +configure_browser_settings() { + USER_AGENT="Mozilla/5.0 (Linux; NetCast; U) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/${CHROMIUM_VERSION} Safari/537.31" + echo "${USER_AGENT}" > ${D_DIR}/user_agent_conf + #We can replace below WINDOW_SIZE values from build configuration if available + #echo "${WINDOW_SIZE}" > ${D_DIR}/window_size_conf +} + +install_chromium_browser() { + D_DIR=${D}${BROWSER_APPLICATION_DIR} + install -d ${D_DIR} + + # Install browser files + if [ -e "${SRC_DIR}/webos/install" ]; then + cd ${OUT_DIR}/${BUILD_TYPE} + xargs --arg-file=${SRC_DIR}/webos/install/default_browser/binary.list cp -R --no-dereference --preserve=mode,links -v --target-directory=${D_DIR} + cd ${SRC_DIR} + xargs --arg-file=${SRC_DIR}/webos/install/default_browser/runtime.list cp -R --no-dereference --preserve=mode,links -v --target-directory=${D_DIR} + fi + + # AGL does not have PMLOG + sed -i.bak s/PmLogCtl.*// ${D_DIR}/run_webbrowser + + # To execute chromium in JAILER, Security Part needs permissions change + # run_webbrowser: Script file for launching chromium + chmod -v 755 ${D_DIR}/chrome + chmod -v 755 ${D_DIR}/kill_webbrowser + chmod -v 755 ${D_DIR}/run_webbrowser + + configure_browser_settings +} + +install_webruntime() { + install -d ${D}${libdir} + install -d ${D}${includedir}/${BPN} + install -d ${D}${CBE_DATA_PATH} + install -d ${D}${CBE_DATA_LOCALES_PATH} + + # Install webos webview files + if [ -e "${SRC_DIR}/webos/install" ]; then + cd ${SRC_DIR} + xargs --arg-file=${SRC_DIR}/webos/install/weboswebruntime/staging_inc.list cp --parents --target-directory=${D}${includedir}/${BPN} + + cd ${OUT_DIR}/${BUILD_TYPE} + + cp libcbe.so ${D}${libdir}/ + if [ "${WEBOS_LTTNG_ENABLED}" = "1" ]; then + # use bindir if building non-cbe + cp libchromium_lttng_provider.so ${D}${libdir}/ + fi + xargs --arg-file=${SRC_DIR}/webos/install/weboswebruntime/binary.list cp --parents --target-directory=${D}${CBE_DATA_PATH} + cat ${SRC_DIR}/webos/install/weboswebruntime/data_locales.list | xargs -I{} install -m 755 -p {} ${D}${CBE_DATA_LOCALES_PATH} + fi + + # move this to separate mksnapshot-cross recipe once we figure out how to build just cross mksnapshot from chromium repository + install -d ${D}${bindir_cross} + gzip -c ${OUT_DIR}/${BUILD_TYPE}/${MKSNAPSHOT_PATH}mksnapshot > ${D}${bindir_cross}/${HOST_SYS}-mksnapshot.gz +} + +do_install() { + install_webruntime + install_chromium_browser +} + +WEBOS_SYSTEM_BUS_DIRS_LEGACY_BROWSER_APPLICATION = " \ + ${webos_sysbus_prvservicesdir}/${BROWSER_APPLICATION}.service \ + ${webos_sysbus_pubservicesdir}/${BROWSER_APPLICATION}.service \ + ${webos_sysbus_prvrolesdir}/${BROWSER_APPLICATION}.json \ + ${webos_sysbus_pubrolesdir}/${BROWSER_APPLICATION}.json \ +" + +SYSROOT_DIRS_append = " ${bindir_cross}" + +PACKAGES_prepend = " \ + ${PN}-cross-mksnapshot \ + ${BROWSER_APPLICATION} \ +" + +FILES_${BROWSER_APPLICATION} += " \ + ${BROWSER_APPLICATION_DIR} \ + ${WEBOS_SYSTEM_BUS_DIRS_LEGACY_BROWSER_APPLICATION} \ +" + +RDEPENDS_${BROWSER_APPLICATION} += "${PN}" + +VIRTUAL-RUNTIME_gpu-libs ?= "" +RDEPENDS_${PN} += "${VIRTUAL-RUNTIME_gpu-libs}" + +# The text relocations are intentional -- see comments in [GF-52468] +# TODO: check if we need INSANE_SKIP on ldflags +INSANE_SKIP_${BROWSER_APPLICATION} += "libdir ldflags textrel" + +FILES_${PN} = " \ + ${libdir}/*.so \ + ${CBE_DATA_PATH}/* \ + ${libdir}/${BPN}/*.so \ + ${WEBOS_SYSTEM_BUS_DIRS} \ +" + +FILES_${PN}-dev = " \ + ${includedir} \ +" + +FILES_${PN}-cross-mksnapshot = "${bindir_cross}/${HOST_SYS}-mksnapshot.gz" diff --git a/recipes-wam/chromium/gn-utils.inc b/recipes-wam/chromium/gn-utils.inc new file mode 100644 index 000000000..0fd55a638 --- /dev/null +++ b/recipes-wam/chromium/gn-utils.inc @@ -0,0 +1,157 @@ +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# GN host architecture helpers. +# +# BUILD_ARCH's value corresponds to what uname returns as the machine name. +# The mapping in gn_host_arch_name() tries to match several possible values +# returned by the Linux kernel in uname(2) into the corresponding values GN +# understands. +def gn_host_arch_name(d): + """Returns a GN architecture name corresponding to the build host's machine + architecture.""" + import re + arch_translations = { + r'aarch64.*': 'arm64', + r'arm.*': 'arm', + r'i[3456]86$': 'x86', + r'x86_64$': 'x64', + } + build_arch = d.getVar("BUILD_ARCH") + for arch_regexp, gn_arch_name in arch_translations.items(): + if re.match(arch_regexp, build_arch): + return gn_arch_name + bb.fatal('Unsuported BUILD_ARCH value: "%s"' % build_arch) + +# GN target architecture helpers. +# +# Determining the target architecture is more difficult, as there are many +# different values we can use on the Yocto side (e.g. TUNE_ARCH, TARGET_ARCH, +# MACHINEOVERRIDES etc). What we do is define the mapping with regular, +# non-Python variables with overrides that are generic enough (i.e. "x86" +# instead of "i586") and then use gn_target_arch_name() to return the right +# value with some validation. +GN_TARGET_ARCH_NAME_aarch64 = "arm64" +GN_TARGET_ARCH_NAME_arm = "arm" +GN_TARGET_ARCH_NAME_x86 = "x86" +GN_TARGET_ARCH_NAME_x86-64 = "x64" + +BUILD_CC_toolchain-clang = "clang" +BUILD_CXX_toolchain-clang = "clang++" +BUILD_LD_toolchain-clang = "clang" + +# knob for clang, when using meta-clang to provide clang and case where +# clang happens to be default compiler for OE we should let it use clang +def is_default_cc_clang(d): + """Return true if clang is default cross compiler.""" + toolchain = d.getVar("TOOLCHAIN") + overrides = d.getVar("OVERRIDES") + if toolchain == "clang" and "toolchain-clang" in overrides.split(":"): + return "true" + return "false" + +def clang_install_path(d): + """Return clang compiler install path.""" + return d.getVar("STAGING_BINDIR_NATIVE") + +def gn_target_arch_name(d): + """Returns a GN architecture name corresponding to the target machine's + architecture.""" + name = d.getVar("GN_TARGET_ARCH_NAME") + if name is None: + bb.fatal('Unsupported target architecture. A valid override for the ' + 'GN_TARGET_ARCH_NAME variable could not be found.') + return name + +def write_toolchain_file(d, file_path): + """Creates a complete GN toolchain file in |file_path|.""" + import string + gcc_toolchain_tmpl = string.Template( + 'gcc_toolchain("${toolchain_name}") {\n' + ' cc = "${cc}"\n' + ' cxx = "${cxx}"\n' + ' ar = "${ar}"\n' + ' ld = cxx # GN expects a compiler, not a linker.\n' + ' nm = "${nm}"\n' + ' readelf = "${readelf}"\n' + ' extra_cflags = "${extra_cflags}"\n' + ' extra_cppflags = "${extra_cppflags}"\n' + ' extra_cxxflags = "${extra_cxxflags}"\n' + ' extra_ldflags = "${extra_ldflags}"\n' + ' toolchain_args = {\n' + ' current_cpu = "${current_cpu}"\n' + ' current_os = "linux"\n' + ' is_clang = false\n' + ' }\n' + '}\n' + ) + clang_toolchain_tmpl = string.Template( + 'clang_toolchain("clang_${toolchain_name}") {\n' + ' extra_cflags = "${extra_cflags}"\n' + ' extra_cppflags = "${extra_cppflags}"\n' + ' extra_cxxflags = "${extra_cxxflags}"\n' + ' extra_ldflags = "${extra_ldflags}"\n' + ' toolchain_args = {\n' + ' current_cpu = "${current_cpu}"\n' + ' current_os = "linux"\n' + ' is_clang = true\n' + ' use_gold = true\n' + ' }\n' + '}\n' + ) + + native_toolchain = { + 'toolchain_name': 'yocto_native', + 'current_cpu': gn_host_arch_name(d), + 'cc': d.expand('${BUILD_CC}'), + 'cxx': d.expand('${BUILD_CXX}'), + 'ar': d.expand('${BUILD_AR}'), + 'nm': d.expand('${BUILD_NM}'), + 'readelf': d.expand('${BUILD_PREFIX}readelf'), + 'extra_cflags': d.expand('${BUILD_CFLAGS}'), + 'extra_cppflags': d.expand('${BUILD_CPPFLAGS}'), + 'extra_cxxflags': d.expand('${BUILD_CXXFLAGS}'), + 'extra_ldflags': d.expand('${BUILD_LDFLAGS}'), + } + target_toolchain = { + 'toolchain_name': 'yocto_target', + 'current_cpu': gn_target_arch_name(d), + 'cc': d.expand('${CC}'), + 'cxx': d.expand('${CXX}'), + 'ar': d.expand('${AR}'), + 'nm': d.expand('${NM}'), + 'readelf': d.expand('${TARGET_PREFIX}readelf'), + 'extra_cflags': d.expand('${TARGET_CFLAGS}'), + 'extra_cppflags': d.expand('${TARGET_CPPFLAGS}'), + 'extra_cxxflags': d.expand('${TARGET_CXXFLAGS}'), + 'extra_ldflags': d.expand('${TARGET_LDFLAGS}'), + 'strip': '', + } + + with open(file_path, 'w') as toolchain_file: + toolchain_file.write( + '# This file has been generated automatically.\n' + '\n' + 'import("//build/config/sysroot.gni")\n' + 'import("//build/toolchain/gcc_toolchain.gni")\n' + '\n' + ) + toolchain_file.write(gcc_toolchain_tmpl.substitute(native_toolchain)) + toolchain_file.write(gcc_toolchain_tmpl.substitute(target_toolchain)) + toolchain_file.write(clang_toolchain_tmpl.substitute(native_toolchain)) + toolchain_file.write(clang_toolchain_tmpl.substitute(target_toolchain)) diff --git a/recipes-wam/wam/files/WebAppMgr.env b/recipes-wam/wam/files/WebAppMgr.env new file mode 100644 index 000000000..c8ddc5173 --- /dev/null +++ b/recipes-wam/wam/files/WebAppMgr.env @@ -0,0 +1,202 @@ +##### AGL: not set in WebAppMgr@.service +#XDG_SESSION_ID="c2" + +##### AGL: set by WebAppMgr@.service (depends on user) +#XDG_RUNTIME_DIR="/run/user/%i" + +# Set wam executable file path +HOOK_SEGV=NO +WAM_EXE_PATH="/usr/bin/WebAppMgr" + +# Set wam name for user-agent +WAM_NAME="WebAppManager" + +# Only allow UTF8 encoding for luna-service messages. +LS_ENABLE_UTF8=1 + +# Set effective userid and groupid +#WAM_UID="wam" +#WAM_GID="compositor" + +# Set location of error page (will follow localization rules based on this path) +#WAM_ERROR_PAGE="file:///usr/share/localization/wam/loaderror.html" + +# suspending javascript execution delay for page visibility +WAM_SUSPEND_DELAY_IN_MS=250 + +#if [ -e "etc/wam/make_shm.sh" ] ; then +# /etc/wam/make_shm.sh +#fi + +# Set user data directory for WebAppMgr +##### AGL: set by WebAppMgr@.service (depends on user) +#WAM_DATA_PATH="/home/%i/wamdata" + +# ensure that wam data directories exist +#mkdir -p ${WAM_DATA_PATH} + +# set directories permission +#chown ${WAM_UID}:${WAM_GID} ${WAM_DATA_PATH} + +# setup 50 Mb maximum for ApplicationCache +WAM_APPCACHE_MAXSIZE=52428800 + +# setup 10 Mb maximum for ApplicationCache per domain +WAM_APPCACHE_DOMAINLIMIT=10485760 + +# setup 50 Mb maximum for DiskCache +WAM_DISKCACHE_MAXSIZE=52428800 + +# setup 256 Kb maximum for resource buffer allocation +WAM_RESOURCE_BUFFER_MAX_ALLOC_SIZE=262144 + +# setup 1 Mb for resource buffer +WAM_RESOURCE_BUFFER_SIZE=1048576 + +# setup 200 seconds for watchdog timeout of render process +WATCHDOG_RENDER_TIMEOUT=200 + +# setup nubmer of raster threads to 1 +BLINK_NUM_RASTER_THREADS=2 + +# use default tile width if not sed by recipe +#if [ "$BLINK_NUM_RASTER_THREADS" = "WEBOS${BLINK_NUM_RASTER_THREADS#WEBOS}" ]; then +BLINK_NUM_RASTER_THREADS=1 +#fi + +# setup 6 Mb maximum for the program GPU cache +GPU_PROGRAM_CACHE_SIZE=6144 + +# disable using enyo system app specfic optimization +# currently used optimizations : inline caching off +#USE_SYSTEM_APP_OPTIMIZATION="0" + +# Set location of NaCl modules +#CHROMIUM_PATH="/usr/palm/applications/com.lge.app.chromium" +#NACL_PLUGIN=${CHROMIUM_PATH}"/libppGoogleNaClPluginChrome.so" +#NACL_IRT_LIBRARY=${CHROMIUM_PATH}"/nacl_irt_arm.nexe" +#NACL_HELPER=${CHROMIUM_PATH}"/nacl_helper" +#NACL_HELPER_BOOTSTRAP=${CHROMIUM_PATH}"/nacl_helper_bootstrap" + +# Set location of NPAPI plugins for all Apps including default Apps +# This is for the flash plugin of Signage, webOS TV doesn't use it. +#PRIVILEGED_PLUGIN_PATH="" + +# Set location of NPAPI plugins for NetCast Apps +# NetCast Apps should access only the plugins in this path +#NETCAST_PLUGIN_PATH="/usr/lib/BrowserPlugins" + +# Set location of NPAPI plugins for HbbTV app. +#HBBTV_PLUGIN_PATH="/usr/lib/HbbtvPlugins" + +# Set InetTV player stored path +#INETTV_HTML_PLAYER_PATH="/usr/share/inettv/inettv_player/index.html" + +# Set location of extra libraries +#CDM_LIB_PATH="/usr/lib" + +# Set location of all NPAPI plugins +NPAPI_PLUGIN_PATH=${HBBTV_PLUGIN_PATH}":"${NETCAST_PLUGIN_PATH}":"${PRIVILEGED_PLUGIN_PATH} + +#if [ -e "etc/wam/make_shm.sh" ] ; then +# /etc/wam/make_shm.sh +#fi + +# setup 8 Mb minimum codecache capacity +JSC_minGlobalCodeCacheCapacity=8388608 + +# Enable more explicit logging of timing with regards to rendering +# export WAM2_ENABLE_DEBUG_RENDER_TIMING=1 + +# enable Web Inspector and Tellurium if in developer mode +TELLURIUM_NUB_PATH=/usr/palm/tellurium/telluriumnub.js +ENABLE_INSPECTOR=1 + +# Enable cursor by default +ENABLE_CURSOR_BY_DEFAULT=1 + +# Enable launch optimization +ENABLE_LAUNCH_OPTIMIZATION=1 + +# Set the duration(seconds) passed from last network activity (e.g. FMP Detector) +# If set to a positive value, adjust a custom timeout for a network stable timer in FMPDetector +NETWORK_STABLE_TIMEOUT=3 + +# please keep it in alphabetical order +#WAM_EXTRA_FLAGS="" +#WAM_JS_FLAGS="" +#WAM_COMMON_SWITCHES=" \ +# --application-cache-domain-limit=$WAM_APPCACHE_DOMAINLIMIT \ +# --application-cache-size=$WAM_APPCACHE_MAXSIZE \ +# --browser-subprocess-path=$WAM_EXE_PATH \ +# --disable-direct-npapi-requests \ +# --disable-extensions \ +# --disable-low-res-tiling \ +# --disable-new-video-renderer \ +# --disk-cache-size=$WAM_DISKCACHE_MAXSIZE \ +# --enable-aggressive-release-policy \ +# --enable-accelerated-plugin-rendering \ +# --accelerated-plugin-rendering-blacklist=device;drmAgent;sound;service \ +# --enable-gpu-rasterization \ +# --disable-gpu-rasterization-for-first-frame \ +# --enable-key-event-throttling \ +# --enable-threaded-compositing \ +# --enable-watchdog \ +# --hide-selection-handles \ +# --ignore-gpu-blacklist \ +# --ignore-netif=p2p \ +# --in-process-gpu \ +# --max-unused-resource-memory-usage-percentage=0 \ +# --network-stable-timeout=$NETWORK_STABLE_TIMEOUT \ +# --noerrdialogs \ +# --num-raster-threads=$BLINK_NUM_RASTER_THREADS \ +# --ozone-platform=wayland \ +# --remote-debugging-port=9998 \ +# --resource-buffer-max-allocation-size=$WAM_RESOURCE_BUFFER_MAX_ALLOC_SIZE \ +# --resource-buffer-size=$WAM_RESOURCE_BUFFER_SIZE \ +# --touch-events=disabled \ +# --ui-disable-opaque-shader-program \ +# --user-agent-suffix=SmartTV \ +# --user-data-dir=$WAM_DATA_PATH \ +# --enable-devtools-experiments \ +# --webos-wam \ " + +#WAM_LITE_SWITCHES=" --in-process-zygote " + +#export WAM_WEBOS_LITE=NO +#if [ "${WAM_WEBOS_LITE}" = "YES" ] ; then +# export WAM_SWITCHES=${WAM_COMMON_SWITCHES}${WAM_LITE_SWITCHES} +# export SKIA_FONT_CACHE_SIZE=1 +# export SKIA_IMAGE_CACHE_SIZE=40 +# export SKIA_BACKGROUND_FONT_CACHE_SIZE=0 +#else +# export WAM_SWITCHES=${WAM_COMMON_SWITCHES} +# export SKIA_FONT_CACHE_SIZE=8 +# export SKIA_IMAGE_CACHE_SIZE=80 +# export SKIA_BACKGROUND_FONT_CACHE_SIZE=512 +#fi + +#export WAM_EXTRA_SKIA_CACHE_SWITCHES=" \ +# --skia-font-cache-size-mb=$SKIA_FONT_CACHE_SIZE \ +# --skia-image-cache-size-mb=$SKIA_IMAGE_CACHE_SIZE \ +# --skia-background-font-cache-size-kb=$SKIA_BACKGROUND_FONT_CACHE_SIZE \ +# " + +#export WAM_EXTRA_GPU_TUNING_SWITCHES=" \ +# --gpu-program-cache-size-kb=$GPU_PROGRAM_CACHE_SIZE \ +# " +#export WAM_WATCHDOG_RENDER_TIMEOUT_SWITCHES=" \ +# --watchdog-render-timeout=$WATCHDOG_RENDER_TIMEOUT \ +# " + +#WEBOS_LOAD_ACCESSIBILITY_PLUGIN=1 + +#WAM_V8_CODE_CACHE_SWITCHES=" --enable-local-resource-code-cache --disallow-code-cache-from-file-uris-with-query-string " + +# Load any special configuration from plugins +#if [ -e "/etc/wam/plugins/conf.sh" ] ; then +# . /etc/wam/plugins/conf.sh || true +#fi + +#exec $WAM_EXE_PATH $WAM_SWITCHES $WAM_EXTRA_SKIA_CACHE_SWITCHES $WAM_EXTRA_GPU_TUNING_SWITCHES $WAM_WATCHDOG_RENDER_TIMEOUT_SWITCHES $WAM_EXTRA_FLAGS $WAM_V8_CODE_CACHE_SWITCHES --js-flags="$WAM_JS_FLAGS" + diff --git a/recipes-wam/wam/files/WebAppMgr@.service b/recipes-wam/wam/files/WebAppMgr@.service new file mode 100644 index 000000000..a855bf9f5 --- /dev/null +++ b/recipes-wam/wam/files/WebAppMgr@.service @@ -0,0 +1,37 @@ +# @@@LICENSE +# +# Copyright (c) 2017-2018 LG Electronics, Inc. +# +# Confidential computer software. Valid license from LG required for +# possession, use or copying. Consistent with FAR 12.211 and 12.212, +# Commercial Computer Software, Computer Software Documentation, and +# Technical Data for Commercial Items are licensed to the U.S. Government +# under vendor's standard commercial license. +# +# LICENSE@@@ + +[Unit] +Description="WebAppMgr is responsible for running web apps and manage their lifecycle" +After=afm-service-homescreen-service--0.1--main@%i.service weston@display.service +Wants=afm-service-homescreen-service--0.1--main@%i.service +BindsTo=weston@display.service + +[Service] +Type=simple +User=%i +Slice=user-%i.slice +SmackProcessLabel=System +SupplementaryGroups=audio display +UMask=0077 +CapabilityBoundingSet= +OOMScoreAdjust=-1000 +EnvironmentFile=-/etc/default/WebAppMgr.env +Environment=XDG_RUNTIME_DIR=/run/user/%i +Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%i/bus +Environment=WAM_DATA_PATH="/home/%i/wamdata" +ExecStart=/usr/bin/WebAppMgr --no-sandbox --in-process-gpu --remote-debugging-port=9998 --user-data-dir="/home/%i/wamdata" --webos-wam +Restart=on-failure +RestartSec=50 + +[Install] +WantedBy=default.target diff --git a/recipes-wam/wam/files/trunc-webapp-roles.patch b/recipes-wam/wam/files/trunc-webapp-roles.patch new file mode 100644 index 000000000..829abe07f --- /dev/null +++ b/recipes-wam/wam/files/trunc-webapp-roles.patch @@ -0,0 +1,56 @@ +From f31e93261f34abaa3dcdc4959963f5b5a8983002 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jan-Simon=20M=C3=B6ller?= +Date: Thu, 25 Jun 2020 19:47:24 +0200 +Subject: [PATCH] Set webapp roles that are max 12 characters long. + +From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= + +This is a workaround for SPEC-3127. To prevent repeated roles as much +as possible, I'm using the appid as a basis instead of "Webapp-" + +host + port, which has many chances to be redundant in the first 12 +chars. + +Bug-AGL: SPEC-3127 + +--- + src/agl/WebRuntimeAGL.cpp | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/src/agl/WebRuntimeAGL.cpp b/src/agl/WebRuntimeAGL.cpp +index aed928b..efd2ee4 100644 +--- a/src/agl/WebRuntimeAGL.cpp ++++ b/src/agl/WebRuntimeAGL.cpp +@@ -274,7 +274,6 @@ int WebAppLauncherRuntime::run(int argc, const char** argv) { + + m_id = getAppId(args); + m_url = getAppUrl(args); +- m_role = "WebApp"; + + setup_signals(); + +@@ -326,15 +325,9 @@ bool WebAppLauncherRuntime::init() { + if (n != std::string::npos) { + std::string sport = authority.substr(n+1); + m_host = authority.substr(0, n); +- m_role.push_back('-'); +- m_role.append(m_host); +- m_role.push_back('-'); +- m_role.append(sport); + m_port = stringTo(sport); + } else { + m_host = authority; +- m_role.push_back('-'); +- m_role.append(m_host); + } + } + +@@ -375,6 +368,9 @@ bool WebAppLauncherRuntime::init() { + m_role = "homescreen"; + else if (m_id.rfind("webapps-homescreen", 0) == 0) + m_role = "homescreen"; ++ else { ++ m_role = m_id.substr(0,12); ++ } + + LOG_DEBUG("id=[%s], name=[%s], role=[%s], url=[%s], host=[%s], port=%d, token=[%s], width=[%s], height[%s], surface_type[%d], panel_type[%d]", + m_id.c_str(), m_name.c_str(), m_role.c_str(), m_url.c_str(), diff --git a/recipes-wam/wam/wam_git.bb b/recipes-wam/wam/wam_git.bb new file mode 100644 index 000000000..d50a14fa0 --- /dev/null +++ b/recipes-wam/wam/wam_git.bb @@ -0,0 +1,51 @@ +SUMMARY = "WAM" +AUTHOR = "Jani Hautakangas " +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit cmake + +DEPENDS = "glib-2.0 jsoncpp boost chromium68 wayland-ivi-extension libhomescreen" + +EXTRA_OECMAKE = "\ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${prefix} \ + -DPLATFORM_NAME=${@'${DISTRO}'.upper().replace('-', '_')} \ + -DCHROMIUM_SRC_DIR=${STAGING_INCDIR}/chromium68" + +PR="r0" + +PROVIDES += "virtual/webruntime" +RPROVIDES_${PN} += "virtual/webruntime" + +SRC_URI = "\ + git://github.com/igalia/${BPN}.git;branch=WIP@6.agl.compositor;protocol=https \ + file://WebAppMgr@.service \ + file://WebAppMgr.env \ + file://trunc-webapp-roles.patch \ +" +S = "${WORKDIR}/git" +SRCREV = "bd650046b688eb1593ae68c16ba3912837507d08" + +do_install_append() { + install -d ${D}${sysconfdir}/wam + install -v -m 644 ${S}/files/launch/security_policy.conf ${D}${sysconfdir}/wam/security_policy.conf + install -d ${D}${systemd_system_unitdir} + install -v -m 644 ${WORKDIR}/WebAppMgr@.service ${D}${systemd_system_unitdir}/WebAppMgr@.service + install -d ${D}${sysconfdir}/default/ + install -v -m 644 ${WORKDIR}/WebAppMgr.env ${D}${sysconfdir}/default/WebAppMgr.env + ln -snf WebAppMgr ${D}${bindir}/web-runtime + install -d ${D}${systemd_system_unitdir}/afm-user-session@.target.wants + ln -sf ../WebAppMgr@.service ${D}${systemd_system_unitdir}/afm-user-session@.target.wants/ +} + +FILES_${PN} += "${sysconfdir}/init ${sysconfdir}/wam ${libdir}/webappmanager/plugins/*.so ${systemd_system_unitdir}" + +CXXFLAGS_append_agl-devel = " -DAGL_DEVEL" + +do_install_append_agl-devel() { + # Enable remote inspector and dev mode + install -d ${D}${localstatedir}/agl-devel/preferences + touch ${D}${localstatedir}/agl-devel/preferences/debug_system_apps + touch ${D}${localstatedir}/agl-devel/preferences/devmode_enabled +} diff --git a/scripts/run-yocto-check-layer-all-layers.sh b/scripts/run-yocto-check-layer-all-layers.sh new file mode 100755 index 000000000..44f6e6b11 --- /dev/null +++ b/scripts/run-yocto-check-layer-all-layers.sh @@ -0,0 +1,67 @@ +#!/bin/bash +set -x + +SCRIPTPATH="$( cd $(dirname $0) >/dev/null 2>&1 ; pwd -P )" +echo $SCRIPTPATH +AGLROOT="$SCRIPTPATH/../.." +POKYDIR="$AGLROOT/external/poky" +TMPROOT=`mktemp -d` + +rm -rf ${TMPROOT}/testbuild-ycl || true +mkdir -p ${TMPROOT}/testbuild-ycl +cd ${TMPROOT}/testbuild-ycl + +source $POKYDIR/oe-init-build-env . + +cat << EOF >> conf/local.conf +# just define defaults +AGL_FEATURES ?= "" +AGL_EXTRA_IMAGE_FSTYPES ?= "" + +# important settings imported from poky-agl.conf +# we do not import +DISTRO_FEATURES_append = " systemd smack" +DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " sysvinit" +VIRTUAL-RUNTIME_init_manager = "systemd" +#AGL_FEATURES += "aglcore agldemo" +#DISTRO_FEATURES_append = " appfw" + +# workaround: +# ERROR: Nothing PROVIDES 'smack' (but /home/dl9pf/AGL/master-newlayout/external/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb DEPENDS on or otherwise requires it) +BBMASK += "meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb" +#ERROR: Nothing RPROVIDES 'qtwebengine-qmlplugins' (but /home/dl9pf/AGL/master-newlayout/external/meta-qt5/recipes-qt/qt5/qt5-creator_git.bb RDEPENDS on or otherwise requires it) +BBMASK += "meta-qt5/recipes-qt/qt5/qt5-creator_git.bb" +#ERROR: Nothing RPROVIDES 'python' (but /home/dl9pf/AGL/master-newlayout/external/meta-security/recipes-mac/smack/smack-test_1.0.bb RDEPENDS on or otherwise requires it) +BBMASK += "meta-security/recipes-mac/smack/smack-test_1.0.bb" + +# missing in upstream recipes ... aka FIXME upstream +BBCLASSEXTEND_pn-libzip = "native nativesdk" +BBCLASSEXTEND_pn-xmlsec1 = "native nativesdk" +AGL_APP_REVISION = "${AUTOREV}" + +EOF + + +yocto-check-layer -d \ + --dependency \ + $AGLROOT/external/meta-openembedded/meta-oe \ + $AGLROOT/external/meta-openembedded/meta-oe \ + $AGLROOT/external/meta-openembedded/meta-python \ + $AGLROOT/external/meta-openembedded/meta-networking \ + $AGLROOT/external/meta-security \ + $AGLROOT/external/meta-openembedded/meta-perl \ + $AGLROOT/meta-agl/meta-agl-core \ + $AGLROOT/external/meta-qt5 \ + $AGLROOT/meta-agl/meta-app-framework \ + --additional-layers \ + $AGLROOT/external/meta-qt5 \ + $AGLROOT/meta-agl/meta-app-framework \ + $AGLROOT/external/meta-python2 \ + -- \ + $AGLROOT/meta-agl-demo + +cat ${TMPROOT}/testbuild-ycl/conf/bblayers.conf + +[ $? = 0 ] && rm -rf ${TMPROOT}/testbuild-ycl + +exit 0 diff --git a/scripts/run-yocto-check-layer.sh b/scripts/run-yocto-check-layer.sh new file mode 100755 index 000000000..507f825d3 --- /dev/null +++ b/scripts/run-yocto-check-layer.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -x + +SCRIPTPATH="$( cd $(dirname $0) >/dev/null 2>&1 ; pwd -P )" +echo $SCRIPTPATH +AGLROOT="$SCRIPTPATH/../.." +POKYDIR="$AGLROOT/external/poky" +TMPROOT=`mktemp -d` + +rm -rf ${TMPROOT}/testbuild-ycl || true +mkdir -p ${TMPROOT}/testbuild-ycl +cd ${TMPROOT}/testbuild-ycl + +source $POKYDIR/oe-init-build-env . + +cat << EOF >> conf/local.conf +# just define defaults +AGL_FEATURES ?= "" +AGL_EXTRA_IMAGE_FSTYPES ?= "" + +# important settings imported from poky-agl.conf +# we do not import +DISTRO_FEATURES_append = " systemd smack" +DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " sysvinit" +VIRTUAL-RUNTIME_init_manager = "systemd" + +# workaround: +# ERROR: Nothing PROVIDES 'smack' (but /home/dl9pf/AGL/master-newlayout/external/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb DEPENDS on or otherwise requires it) +BBMASK += "meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb" + +EOF + + +yocto-check-layer \ + --dependency \ + $AGLROOT/external/meta-openembedded/meta-oe \ + $AGLROOT/meta-agl/meta-agl-core \ + -- \ + $AGLROOT/meta-agl-demo + + +[ $? = 0 ] && rm -rf ${TMPROOT}/testbuild-ycl + +exit 0 + + --dependency \ + $AGLROOT/external/meta-openembedded/meta-oe \ + $AGLROOT/external/meta-openembedded/meta-python \ + $AGLROOT/external/meta-openembedded/meta-networking \ diff --git a/templates/feature/agl-cluster-demo-preload/50_local.conf.inc b/templates/feature/agl-cluster-demo-preload/50_local.conf.inc new file mode 100644 index 000000000..f15acf66e --- /dev/null +++ b/templates/feature/agl-cluster-demo-preload/50_local.conf.inc @@ -0,0 +1,2 @@ +#see meta-agl-cluster-demo/conf/include/agl-cluster-demo-preload.inc +require conf/include/agl-cluster-demo-preload.inc diff --git a/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md b/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md new file mode 100644 index 000000000..bfb210867 --- /dev/null +++ b/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md @@ -0,0 +1,9 @@ +--- +description: Feature agl-cluster-demo-preload +authors: Scott Murray +--- + +### Feature agl-cluster-demo-preload + +*Description is missing - please complete file meta-agl-cluster-demo/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md* + diff --git a/templates/feature/agl-cluster-demo/50_local.conf.inc b/templates/feature/agl-cluster-demo/50_local.conf.inc new file mode 100644 index 000000000..90b0380d4 --- /dev/null +++ b/templates/feature/agl-cluster-demo/50_local.conf.inc @@ -0,0 +1,2 @@ +#see meta-agl-cluster-demo/conf/include/agl-cluster-demo.inc +require conf/include/agl-cluster-demo.inc diff --git a/templates/feature/agl-cluster-demo/included.dep b/templates/feature/agl-cluster-demo/included.dep new file mode 100644 index 000000000..82639da07 --- /dev/null +++ b/templates/feature/agl-cluster-demo/included.dep @@ -0,0 +1 @@ +agl-demo diff --git a/templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc b/templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc deleted file mode 100644 index 7e85c574e..000000000 --- a/templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc +++ /dev/null @@ -1,5 +0,0 @@ -# This layer contains the WIP feature/demo code only -#--------------------------------------------------- -BBLAYERS =+ " \ - ${METADIR}/meta-agl-demo \ -" diff --git a/templates/feature/agl-demo-soundmanager/50_local.conf.inc b/templates/feature/agl-demo-soundmanager/50_local.conf.inc deleted file mode 100644 index 76626243c..000000000 --- a/templates/feature/agl-demo-soundmanager/50_local.conf.inc +++ /dev/null @@ -1,2 +0,0 @@ -#see meta-agl-demo/conf/include/agl-demo.inc -require conf/include/agl-demo.inc diff --git a/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md b/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md deleted file mode 100644 index 28feb6eb6..000000000 --- a/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -description: Feature agl-demo-soundmanager -authors: Stephane Desneux ---- - -### Feature agl-demo-soundmanager - -*Description is missing - please complete file meta-agl-demo/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md* - -#### Dependent features pulled by agl-demo-soundmanager - -The following features are pulled: - -* agl-appfw-smack -* agl-hmi-framework -* agl-profile-graphical-qt5 -* agl-audio-soundmanager-framework - diff --git a/templates/feature/agl-demo-soundmanager/included.dep b/templates/feature/agl-demo-soundmanager/included.dep deleted file mode 100644 index b0b942853..000000000 --- a/templates/feature/agl-demo-soundmanager/included.dep +++ /dev/null @@ -1 +0,0 @@ -agl-appfw-smack agl-hmi-framework agl-profile-graphical-qt5 agl-audio-soundmanager-framework diff --git a/templates/feature/agl-demo/50_bblayers.conf.inc b/templates/feature/agl-demo/50_bblayers.conf.inc index afa14f238..55917ccbb 100644 --- a/templates/feature/agl-demo/50_bblayers.conf.inc +++ b/templates/feature/agl-demo/50_bblayers.conf.inc @@ -8,4 +8,7 @@ BBLAYERS =+ " \ #--------------------------------------------------- BBLAYERS =+ " \ ${METADIR}/external/meta-iot-cloud \ + ${METADIR}/external/meta-qt5 \ + ${METADIR}/external/meta-openembedded/meta-filesystems \ + ${METADIR}/external/meta-python2 \ " diff --git a/templates/feature/agl-demo/included.dep b/templates/feature/agl-demo/included.dep index cbf86e8df..14507678f 100644 --- a/templates/feature/agl-demo/included.dep +++ b/templates/feature/agl-demo/included.dep @@ -1 +1 @@ -agl-appfw-smack agl-hmi-framework agl-profile-graphical-qt5 agl-pipewire agl-speech-framework +agl-appfw-smack agl-hmi-framework agl-pipewire diff --git a/templates/feature/agl-telematics-demo/50_local.conf.inc b/templates/feature/agl-telematics-demo/50_local.conf.inc new file mode 100644 index 000000000..64c8714bb --- /dev/null +++ b/templates/feature/agl-telematics-demo/50_local.conf.inc @@ -0,0 +1,2 @@ +#see meta-agl-telematics-demo/conf/include/agl-telematics-demo.inc +require conf/include/agl-telematics-demo.inc diff --git a/templates/feature/agl-telematics-demo/included.dep b/templates/feature/agl-telematics-demo/included.dep new file mode 100644 index 000000000..92798cdc9 --- /dev/null +++ b/templates/feature/agl-telematics-demo/included.dep @@ -0,0 +1 @@ +agl-demo \ No newline at end of file -- 2.16.6