From: Ji-hoon Lee Date: Mon, 30 Sep 2019 07:06:11 +0000 (+0900) Subject: Replace with reference wakeup engine library X-Git-Tag: submit/tizen/20190930.111916^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F53%2F214953%2F3;p=platform%2Fcore%2Fuifw%2Fwakeup-engine-default.git Replace with reference wakeup engine library Change-Id: Ide243a7181d74d3860fdb5b909b571bcca8724cf --- diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100644 new mode 100755 index 59845fa..7696e98 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,76 +1,25 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(org.tizen.multi-assistant-service CXX C) - -# DEFAULT DATA -SET ( PACKAGE "org.tizen.multi-assistant-service") -SET ( PKGNAME ${PACKAGE}) -SET ( PREFIX ${CMAKE_INSTALL_PREFIX}) -SET ( BINDIR "${PREFIX}/bin") -SET ( RESDIR "${PREFIX}/res") -SET ( LIBDIR "${PREFIX}/lib") -SET ( SHARED_RESDIR "${PREFIX}/shared/res") -SET ( BINNAME org.tizen.multi-assistant-service) - -# SET FLAG --------------------------------------------------------------------------------------- -# Find Packages -INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED - capi-appfw-application - capi-appfw-app-manager - capi-appfw-package-manager - capi-appfw-service-application - capi-media-audio-io - capi-network-connection - dlog - ecore - dbus-1 - glib-2.0 - libxml-2.0 - multi-assistant - vconf -) - -# SET FLAG --------------------------------------------------------------------------------------- -FOREACH(flag ${pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -fPIE -std=c++11 -fvisibility=hidden -fvisibility-inlines-hidden") -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE -fvisibility=hidden") - -# SET WARNNING OPTION ---------------------------------------------------------------------------- -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") - -# OPTION DEBUG ----------------------------------------------------------------------------------- -IF("${_SDEBUG}" MATCHES "debug") - MESSAGE("Building in debug mode.") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -O0") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -O0") -ELSE() - MESSAGE("Building in release mode.") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE}") +PROJECT(wakeup-engine-default) + +SET(VERSION 0.2.0) +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +INSTALL(FILES wakeup-engine-default.xml DESTINATION /usr/share/packages) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/ + DESTINATION /usr/apps/wakeup-engine-default/shared/res/) +IF("${ARCH}" MATCHES "^arm.*") +INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/armv7l/libwakeup-engine.so + DESTINATION /usr/share/multiassistant/engines/wakeup-engine-default) +ELSEIF("${ARCH}" MATCHES "^i586.*") +INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/i586/libwakeup-engine.so + DESTINATION /usr/share/multiassistant/engines/wakeup-engine-default) +ELSEIF("${ARCH}" MATCHES "^i686.*") +INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/i586/libwakeup-engine.so + DESTINATION /usr/share/multiassistant/engines/wakeup-engine-default) +ELSEIF("${ARCH}" MATCHES "^aarch64.*") +INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/aarch64/libwakeup-engine.so + DESTINATION /usr/share/multiassistant/engines/wakeup-engine-default) +ELSEIF("${ARCH}" MATCHES "^x86_64.*") +INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/x86_64/libwakeup-engine.so + DESTINATION /usr/share/multiassistant/engines/wakeup-engine-default) ENDIF() - -LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/inc) - -SET(SRCS - src/multi_assistant_config.c - src/multi_assistant_service.c - src/multi_assistant_service_plugin.c - src/multi_assistant_dbus.c - src/multi_assistant_dbus_server.c -) -ADD_EXECUTABLE(${BINNAME} ${SRCS}) - -INSTALL(FILES ${CMAKE_SOURCE_DIR}/LICENSE.Flora DESTINATION /usr/share/license/) -INSTALL(FILES ${CMAKE_SOURCE_DIR}/${PKGNAME}.xml DESTINATION /usr/share/packages) -INSTALL(TARGETS ${BINNAME} DESTINATION ${BINDIR}) - -TARGET_LINK_LIBRARIES(${BINNAME} -ldl ${pkgs_LDFLAGS} ${EXTRA_LDFLAGS}) - -ADD_SUBDIRECTORY(plugins) diff --git a/README.md b/README.md new file mode 100644 index 0000000..2e066d3 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# wakeup-engine-default +Reference wakeup engine diff --git a/inc/multi_assistant_config.h b/inc/multi_assistant_config.h deleted file mode 100644 index d117b81..0000000 --- a/inc/multi_assistant_config.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef __MULTI_ASSISTANT_CONFIG_H__ -#define __MULTI_ASSISTANT_CONFIG_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define MAX_WAKEUP_LIST_NUM 32 -#define MAX_SUPPORTED_LANGUAGE_NUM 128 - -/************************************************************************************** - *** Definitions for xml file - *************************************************************************************/ -#define MA_TAG_ASSISTANT_BASE "multi-assistant" -#define MA_TAG_ASSISTANT_NAME "name" -#define MA_TAG_ASSISTANT_APPID "appid" -#define MA_TAG_ASSISTANT_ICON_PATH "icon-path" -#define MA_TAG_ASSISTANT_LANGUAGE_SET "languages" -#define MA_TAG_ASSISTANT_LANGUAGE "language" -#define MA_TAG_ASSISTANT_WAKEUP_WORD_SET "wakeup-words" -#define MA_TAG_ASSISTANT_WAKEUP_WORD "wakeup-word" -#define MA_TAG_ASSISTANT_WAKEUP_ENGINE_APPID "wakeup-engine-appid" -#define MA_TAG_ASSISTANT_CUSTOM_UI "custom-ui" - -/************************************************************************************** - *** Definitions for ETC - *************************************************************************************/ -#define MA_RETRY_COUNT 5 - -#define MA_ASSISTANT_INFO tzplatform_mkpath(TZ_USER_HOME, "share/.multiassistant/ma/1.0/assistant-info") - -typedef struct { - const char* app_id; - const char* name; - const char* icon_path; - const char* wakeup_list[MAX_WAKEUP_LIST_NUM]; - const char* wakeup_language[MAX_WAKEUP_LIST_NUM]; - int cnt_wakeup; - const char* supported_lang[MAX_SUPPORTED_LANGUAGE_NUM]; - int cnt_lang; - const char* wakeup_engine; - bool custom_ui_option; -} ma_assistant_info_s; - -typedef int (*mas_config_assistant_info_cb)(const char* appid, const char* name, const char* icon_path, - const char* wakeup_list[], const char* wakeup_language[], int cnt_wakeup, - const char* supported_lang[], int cnt_lang, - const char* wakeup_engine, bool custom_ui_option, void* user_data); -int mas_config_get_assistant_info(mas_config_assistant_info_cb callback, void* user_data); - -#ifdef __cplusplus -} -#endif - -/** - * @} - */ - -#endif /* __MULTI_ASSISTANT_CONFIG_H__ */ diff --git a/inc/multi_assistant_main.h b/inc/multi_assistant_main.h deleted file mode 100644 index 42c4e2f..0000000 --- a/inc/multi_assistant_main.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef __MULTI_ASSISTANT_SERVICE_H__ -#define __MULTI_ASSISTANT_SERVICE_H__ - -#include -#include -#include "multi_wakeup_recognizer.h" - -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "multi-assistant" - -#define MAS_SECURE_LOG_(id, prio, tag, fmt, arg...) \ - ({ do { \ - __dlog_print(id, prio, tag, "%s: %s(%d) > [SECURE_LOG] " fmt, __MODULE__, __func__, __LINE__, ##arg); \ - } while (0); }) - -#define MAS_LOG_(prio, tag, fmt, arg...) \ - ({ do { \ - dlog_print(prio, tag, "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg); \ - } while (0); }) - -#define MAS_LOGD(fmt, args...) MAS_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args) -#define MAS_LOGI(fmt, args...) MAS_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args) -#define MAS_LOGW(fmt, args...) MAS_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args) -#define MAS_LOGE(fmt, args...) MAS_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args) - -#define MAS_SLOGD(fmt, args...) MAS_SECURE_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args) -#define MAS_SLOGI(fmt, args...) MAS_SECURE_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args) -#define MAS_SLOGW(fmt, args...) MAS_SECURE_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args) -#define MAS_SLOGE(fmt, args...) MAS_SECURE_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args) - - -/************************************************************************************** - *** Definitions for DBus - *************************************************************************************/ -#define MA_CLIENT_SERVICE_NAME "org.tizen.multiassistant.maclient" -#define MA_CLIENT_SERVICE_OBJECT_PATH "/org/tizen/multiassistant/maclient" -#define MA_CLIENT_SERVICE_INTERFACE "org.tizen.multiassistant.maclient" - -#define MA_UI_CLIENT_SERVICE_NAME "org.tizen.multiassistant.mauiclient" -#define MA_UI_CLIENT_SERVICE_OBJECT_PATH"/org/tizen/multiassistant/mauiclient" -#define MA_UI_CLIENT_SERVICE_INTERFACE "org.tizen.multiassistant.mauiclient" - -#define MA_SERVER_SERVICE_NAME "org.tizen.multiassistant.maserver" -#define MA_SERVER_SERVICE_OBJECT_PATH "/org/tizen/multiassistant/maserver" -#define MA_SERVER_SERVICE_INTERFACE "org.tizen.multiassistant.maserver" - -/************************************************************************************** - *** Definitions for DBus methods - *************************************************************************************/ -#define MA_METHOD_HELLO "ma_method_hello" - -#define MA_METHOD_INITIALIZE "ma_method_initialize" -#define MA_METHOD_DEINITIALIZE "ma_method_deinitialize" -#define MA_METHOD_GET_RECORDING_AUDIO_FORMAT "ma_method_get_recording_audio_format" -#define MA_METHOD_GET_RECORDING_AUDIO_SOURCE_TYPE "ma_method_get_recording_audio_source_type" -#define MA_METHOD_SEND_ASR_RESULT "ma_method_send_asr_result" -#define MA_METHOD_SEND_RESULT "ma_method_send_result" -#define MA_METHOD_SEND_RECOGNITION_RESULT "ma_method_send_recognition_result" -#define MA_METHOD_START_STREAMING_AUDIO_DATA "ma_method_start_streaming_audio_data" -#define MA_METHOD_STOP_STREAMING_AUDIO_DATA "ma_method_stop_streaming_audio_data" -#define MA_METHOD_UPDATE_VOICE_FEEDBACK_STATE "ma_method_update_voice_feedback_state" -#define MA_METHOD_SEND_ASSISTANT_SPECIFIC_COMMAND "ma_method_send_assistant_specific_command" -#define MA_METHOD_SET_BACKGROUND_VOLUME "ma_method_set_background_volume" -#define MA_METHOD_SET_PREPROCESSING_ALLOW_MODE "ma_method_set_preprocessing_allow_mode" -#define MA_METHOD_SEND_PREPROCESSING_RESULT "ma_method_send_preprocessing_result" -#define MA_METHOD_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "ma_method_set_wake_word_audio_require_flag" -#define MA_METHOD_ERROR "ma_method_error" - -#define MA_UI_METHOD_INITIALIZE "ma_ui_method_initialize" -#define MA_UI_METHOD_DEINITIALIZE "ma_ui_method_deinitialize" -#define MA_UI_METHOD_CHANGE_ASSISTANT "ma_ui_method_change_assistant" - -#define MAS_METHOD_HELLO "mas_method_hello" -#define MAS_METHOD_ACTIVE_STATE_CHANGE "mas_method_active_state_change" -#define MAS_METHOD_STREAMING_AUDIO_DATA "mas_method_streaming_audio_data" -#define MAS_METHOD_WAKEUP_ENGINE_COMMAND "mas_method_wakeup_engine_command" -#define MAS_METHOD_ERROR "mas_method_error" -#define MAS_METHOD_SEND_PREPROCESSING_INFORMATION "mas_method_send_preprocessing_information" -#define MAS_METHOD_AUDIO_STREAMING_DATA_SECTION "mas_method_audio_streaming_data_section" - -#define MAS_UI_METHOD_SEND_ASR_RESULT "mas_ui_method_send_asr_result" -#define MAS_UI_METHOD_SEND_RESULT "mas_ui_method_send_result" -#define MAS_UI_METHOD_CHANGE_ASSISTANT "mas_ui_method_change_assistant" -#define MAS_UI_METHOD_ERROR "mas_ui_method_error" -#define MAS_UI_METHOD_SEND_RECOGNITION_RESULT "mas_ui_method_send_recognition_result" -#define MAS_UI_METHOD_ENABLE_COMMON_UI "mas_ui_method_enable_common_ui" - -#endif /* __MULTI_ASSISTANT_SERVICE_H__ */ diff --git a/inc/multi_assistant_service.h b/inc/multi_assistant_service.h deleted file mode 100644 index 2c496e0..0000000 --- a/inc/multi_assistant_service.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _MULTI_ASSISTANT_SERVICE_H_ -#define _MULTI_ASSISTANT_SERVICE_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX_APPID_LEN 255 - -int mas_client_initialize(int pid); - -int mas_client_deinitialize(int pid); - -int mas_client_get_audio_format(int pid, int* rate, int* channel, int* audio_type); - -int mas_client_get_audio_source_type(int pid, char** type); - -int mas_client_request_speech_data(int pid); - -int mas_client_send_asr_result(int pid, int event, char* asr_result); - -int mas_client_send_result(int pid, char* display_text, char* utterance_text, char* result_json); - -int mas_client_send_recognition_result(int pid, int result); - -int mas_client_start_streaming_audio_data(int pid, int type); - -int mas_client_stop_streaming_audio_data(int pid, int type); - -int mas_client_update_voice_feedback_state(int pid, int state); - -int mas_client_send_assistant_specific_command(int pid, const char *command); - -int mas_client_set_background_volume(int pid, double ratio); - -int mas_client_set_preprocessing_allow_mode(int pid, int mode, const char* appid); - -int mas_client_send_preprocessing_result(int pid, bool result); - -int mas_client_update_recognition_result(int pid, int result); - -int mas_ui_client_initialize(int pid); - -int mas_ui_client_deinitialize(int pid); - -int mas_ui_client_change_assistant(const char* appid); - -int mas_get_current_client_pid(); - -int mas_get_client_pid_by_wakeup_word(const char *wakeup_word); - -int mas_get_client_pid_by_appid(const char *appid); - -bool mas_get_client_custom_ui_option_by_appid(const char *appid); - -const char* mas_get_client_appid_by_wakeup_word(const char *wakeup_word); - -int mas_set_current_client_by_wakeup_word(const char *wakeup_word); - -int mas_set_current_client_by_appid(const char *appid); - -int mas_launch_client_by_wakeup_word(const char *wakeup_word); - -typedef enum { - CLIENT_LAUNCH_MODE_ACTIVATION, - CLIENT_LAUNCH_MODE_PRELAUNCH, -} CLIENT_LAUNCH_MODE; -int mas_launch_client_by_appid(const char *appid, CLIENT_LAUNCH_MODE launch_mode); - -int mas_process_voice_key_event(bool pressed); - -typedef enum { - PREPROCESSING_STATE_NONE, - PREPROCESSING_STATE_WAKEUP_PREPROCESS_ENABLED, - PREPROCESSING_STATE_WAKEUP_PREPROCESS_DISABLED, - PREPROCESSING_STATE_PREPROCESSING_UTTERANCE, - PREPROCESSING_STATE_PREPROCESSING_FOLLOW_UP, -} PREPROCESSING_STATE; - -typedef enum { - PREPROCESSING_STATE_EVENT_WAKEUP, - PREPROCESSING_STATE_EVENT_ACTIVE_ASSISTANT_LAUNCHED, - PREPROCESSING_STATE_EVENT_PREPROCESSING_ALLOW_MODE_CHANGED, - PREPROCESSING_STATE_EVENT_UTTERANCE_STREAMING_STARTED, - PREPROCESSING_STATE_EVENT_FOLLOW_UP_STREAMING_STARTED, - PREPROCESSING_STATE_EVENT_PREPROCESSING_SUCCEEDED, - PREPROCESSING_STATE_EVENT_PREPROCESSING_FAILED, -} PREPROCESSING_STATE_EVENT; - -int mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT event); - - -#ifdef __cplusplus -} -#endif - -#endif /* _MULTI_ASSISTANT_SERVICE_H_ */ diff --git a/inc/multi_assistant_service_plugin.h b/inc/multi_assistant_service_plugin.h deleted file mode 100644 index 9bb703c..0000000 --- a/inc/multi_assistant_service_plugin.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _MULTI_ASSISTANT_SERVICE_PLUGIN_H_ -#define _MULTI_ASSISTANT_SERVICE_PLUGIN_H_ - -#include - -#include "multi_wakeup_recognizer.h" -#include "multi_assistant_main.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MA_PLUGIN_EVENT_VOICE_KEY_PRESSED = 0, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH = MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP, -} ma_plugin_event_e; - -typedef struct { - int plugin_version; - bool ui_panel_enabled; -} ma_plugin_settings; - -int multi_assistant_service_plugin_initialize(void); - -int multi_assistant_service_plugin_deinitialize(void); - -int multi_assistant_service_plugin_get_settings(ma_plugin_settings **settings, size_t *struct_size); - -int multi_assistant_service_plugin_set_language(const char* language); - -int multi_assistant_service_plugin_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language); - -int multi_assistant_service_plugin_add_assistant_language(const char* appid, const char* language); - -int multi_assistant_service_plugin_set_assistant_wakeup_engine(const char* appid, const char* engine); - -int multi_assistant_service_plugin_activate(void); - -int multi_assistant_service_plugin_deactivate(void); - -int multi_assistant_service_plugin_update_voice_feedback_state(const char* appid, int state); - -int multi_assistant_service_plugin_send_assistant_specific_command(const char *appid, const char* command); - -int multi_assistant_service_plugin_set_background_volume(const char *appid, double ratio); - -int multi_assistant_service_plugin_update_recognition_result(const char* appid, int result); - -int multi_assistant_service_plugin_set_preprocessing_allow_mode(const char* appid, int mode, const char* preprocessing_appid); - -int multi_assistant_service_plugin_process_event(int event, void* data, int len); - -int multi_assistant_service_plugin_start_streaming_utterance_data(void); - -int multi_assistant_service_plugin_stop_streaming_utterance_data(void); - -int multi_assistant_service_plugin_start_streaming_previous_utterance_data(void); - -int multi_assistant_service_plugin_stop_streaming_previous_utterance_data(void); - -int multi_assistant_service_plugin_start_streaming_follow_up_data(void); - -int multi_assistant_service_plugin_stop_streaming_follow_up_data(void); - -int multi_assistant_service_plugin_get_recording_audio_format(int* rate, int* channel, int* audio_type); - -int multi_assistant_service_plugin_get_recording_audio_source_type(char **type); - -int multi_assistant_service_plugin_set_callbacks(void); - -int multi_assistant_service_plugin_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data); - -int multi_assistant_service_plugin_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data); - -int multi_assistant_service_plugin_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data); - -int multi_assistant_service_plugin_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data); - -int multi_assistant_service_plugin_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data); - -int multi_assistant_service_plugin_set_error_callback(wakeup_service_error_cb callback, void* user_data); - -#define MA_WAKEUP_MANAGER_PATH tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/") - -#define MA_DEFAULT_WAKEUP_MANAGER_FILENAME "libma-wakeup-manager.so" - - -#define MA_WAKEUP_MANAGER_FUNC_INITIALIZE "wakeup_manager_initialize" -typedef int (*wakeup_manager_initialize)(void); -#define MA_WAKEUP_MANAGER_FUNC_DEINITIALIZE "wakeup_manager_deinitialize" -typedef int (*wakeup_manager_deinitialize)(void); -#define MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS "wakeup_manager_get_settings" -typedef int (*wakeup_manager_get_settings)(ma_plugin_settings **settings, size_t *struct_size); -#define MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_WORD "wakeup_manager_add_assistant_wakeup_word" -typedef int (*wakeup_manager_add_assistant_wakeup_word)(const char* appid, const char* wakeup_word, const char* language); -#define MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_LANGUAGE "wakeup_manager_add_assistant_language" -typedef int (*wakeup_manager_add_assistant_language)(const char* appid, const char* language); -#define MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_WAKEUP_ENGINE "wakeup_manager_set_assistant_wakeup_engine" -typedef int (*wakeup_manager_set_assistant_wakeup_engine)(const char* appid, const char* engine); -#define MA_WAKEUP_MANAGER_FUNC_SET_LANGUAGE "wakeup_manager_set_language" -typedef int (*wakeup_manager_set_language)(const char* language); -#define MA_WAKEUP_MANAGER_FUNC_ACTIVATE "wakeup_manager_activate" -typedef int (*wakeup_manager_activate)(void); -#define MA_WAKEUP_MANAGER_FUNC_DEACTIVATE "wakeup_manager_deactivate" -typedef int (*wakeup_manager_deactivate)(void); -#define MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE "wakeup_manager_update_voice_feedback_state" -typedef int (*wakeup_manager_update_voice_feedback_state)(const char* appid, int state); -#define MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND "wakeup_manager_send_assistant_specific_command" -typedef int (*wakeup_manager_send_assistant_specific_command)(const char* appid, const char* command); -#define MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME "wakeup_manager_set_background_volume" -typedef int (*wakeup_manager_set_background_volume)(const char* appid, double ratio); -#define MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_manager_update_recognition_result" -typedef int (*wakeup_manager_update_recognition_result)(const char* appid, int result); -#define MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT "wakeup_manager_process_event" -typedef int (*wakeup_manager_process_event)(int event, void* data, int len); -#define MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA "wakeup_manager_start_streaming_utterance_data" -typedef int (*wakeup_manager_start_streaming_utterance_data)(void); -#define MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_UTTERANCE_DATA "wakeup_manager_stop_streaming_utterance_data" -typedef int (*wakeup_manager_stop_streaming_utterance_data)(void); -#define MA_WAKEUP_MANAGER_FUNC_START_STREAMING_PREVIOUS_UTTERANCE_DATA "wakeup_manager_start_streaming_previous_utterance_data" -typedef int (*wakeup_manager_start_streaming_previous_utterance_data)(void); -#define MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_PREVIOUS_UTTERANCE_DATA "wakeup_manager_stop_streaming_previous_utterance_data" -typedef int (*wakeup_manager_stop_streaming_previous_utterance_data)(void); -#define MA_WAKEUP_MANAGER_FUNC_START_STREAMING_FOLLOW_UP_DATA "wakeup_manager_start_streaming_follow_up_data" -typedef int (*wakeup_manager_start_streaming_follow_up_data)(void); -#define MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_FOLLOW_UP_DATA "wakeup_manager_stop_streaming_follow_up_data" -typedef int (*wakeup_manager_stop_streaming_follow_up_data)(void); -#define MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_FORMAT "wakeup_manager_get_audio_format" -typedef int (*wakeup_manager_get_audio_format)(int* rate, int* channel, int* audio_type); -#define MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_SOURCE_TYPE "wakeup_manager_get_audio_source_type" -typedef int (*wakeup_manager_get_audio_source_type)(char** type); -#define MA_WAKEUP_MANAGER_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "wakeup_manager_set_wake_word_audio_require_flag" -typedef int (*wakeup_manager_set_wake_word_audio_require_flag)(bool require); -#define MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_EVENT_CALLBACK "wakeup_manager_set_wakeup_event_callback" -typedef int (*wakeup_manager_set_wakeup_event_callback)(wakeup_service_wakeup_event_cb callback, void* user_data); -#define MA_WAKEUP_MANAGER_FUNC_SET_UTTERANCE_STREAMING_CALLBACK "wakeup_manager_set_utterance_streaming_callback" -typedef int (*wakeup_manager_set_utterance_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data); -#define MA_WAKEUP_MANAGER_FUNC_SET_PREVIOUS_UTTERANCE_STREAMING_CALLBACK "wakeup_manager_set_previous_utterance_streaming_callback" -typedef int (*wakeup_manager_set_previous_utterance_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data); -#define MA_WAKEUP_MANAGER_FUNC_SET_FOLLOW_UP_STREAMING_CALLBACK "wakeup_manager_set_follow_up_streaming_callback" -typedef int (*wakeup_manager_set_follow_up_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data); -#define MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_manager_set_speech_status_callback" -typedef int (*wakeup_manager_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data); -#define MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK "wakeup_manager_set_error_callback" -typedef int (*wakeup_manager_set_error_callback)(wakeup_service_error_cb callback, void* user_data); -#define MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK "wakeup_manager_set_streaming_section_changed_callback" -typedef int (*wakeup_manager_set_streaming_section_changed_callback)(wakeup_service_streaming_section_changed_cb callback, void* user_data); - -typedef struct { - wakeup_manager_initialize initialize; - wakeup_manager_deinitialize deinitialize; - wakeup_manager_get_settings get_settings; - wakeup_manager_add_assistant_wakeup_word add_assistant_wakeup_word; - wakeup_manager_add_assistant_language add_assistant_language; - wakeup_manager_set_assistant_wakeup_engine set_assistant_wakeup_engine; - wakeup_manager_set_language set_language; - wakeup_manager_activate activate; - wakeup_manager_deactivate deactivate; - wakeup_manager_update_voice_feedback_state update_voice_feedback_state; - wakeup_manager_send_assistant_specific_command send_assistant_specific_command; - wakeup_manager_set_background_volume set_background_volume; - wakeup_manager_update_recognition_result update_recognition_result; - wakeup_manager_process_event process_event; - wakeup_manager_start_streaming_utterance_data start_streaming_utterance_data; - wakeup_manager_stop_streaming_utterance_data stop_streaming_utterance_data; - wakeup_manager_start_streaming_previous_utterance_data start_streaming_previous_utterance_data; - wakeup_manager_stop_streaming_previous_utterance_data stop_streaming_previous_utterance_data; - wakeup_manager_start_streaming_follow_up_data start_streaming_follow_up_data; - wakeup_manager_stop_streaming_follow_up_data stop_streaming_follow_up_data; - wakeup_manager_get_audio_format get_audio_format; - wakeup_manager_get_audio_source_type get_audio_source_type; - wakeup_manager_set_wake_word_audio_require_flag set_wake_word_audio_require_flag; - wakeup_manager_set_wakeup_event_callback set_wakeup_event_callback; - wakeup_manager_set_utterance_streaming_callback set_utterance_streaming_callback; - wakeup_manager_set_previous_utterance_streaming_callback set_previous_utterance_streaming_callback; - wakeup_manager_set_follow_up_streaming_callback set_follow_up_streaming_callback; - wakeup_manager_set_speech_status_callback set_speech_status_callback; - wakeup_manager_set_error_callback set_error_callback; - wakeup_manager_set_streaming_section_changed_callback set_streaming_section_changed_callback; -} wakeup_manager_interface; - -#ifdef __cplusplus -} -#endif - -#endif /* _MULTI_ASSISTANT_SERVICE_PLUGIN_H_ */ diff --git a/inc/multi_wakeup_recognizer.h b/inc/multi_wakeup_recognizer.h deleted file mode 100644 index c818e1a..0000000 --- a/inc/multi_wakeup_recognizer.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _MULTI_WAKEUP_RECOGNIZER_H_ -#define _MULTI_WAKEUP_RECOGNIZER_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - const char *wakeup_appid; - const char *wakeup_word; - const char *wakeup_language; - const char *wakeup_voice_id; - const char *wakeup_engine; - float wakeup_confidence_score; - - long wakeup_start_time; - long wakeup_end_time; - bool wakeup_time_valid; - - const void *extra_data; - int extra_data_length; - const char *extra_data_description; -} wakeup_event_info; - -typedef enum { - WAKEUP_SPEECH_STREAMING_EVENT_FAIL = -1, /**< Failed */ - WAKEUP_SPEECH_STREAMING_EVENT_START = 1, /**< Start event */ - WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE = 2, /**< Continue event */ - WAKEUP_SPEECH_STREAMING_EVENT_FINISH = 3 /**< Finish event */ -} wakeup_speech_streaming_event_e; - -typedef enum { - WAKEUP_SPEECH_STATUS_NONE = -1, /**< None */ - WAKEUP_SPEECH_STATUS_BEGINNING_POINT_DETECTED = 1, /**< Beginning point of speech is detected */ - WAKEUP_SPEECH_STATUS_END_POINT_DETECTED = 2 /**< End point of speech is detected */ -} wakeup_speech_status_e; - -typedef enum { - WAKEUP_ASR_RESULT_EVENT_FINAL = 0, /**< Event when either the full matched or the final result is delivered */ - WAKEUP_ASR_RESULT_EVENT_PARTIAL, /**< Event when the partial matched result is delivered */ - WAKEUP_ASR_RESULT_EVENT_ERROR /**< Event when the recognition has failed */ -} wakeup_asr_result_event_e; - - -typedef void (*wakeup_service_wakeup_event_cb)(wakeup_event_info wakeup_info, const char* wakeup_word, void* user_data); - -typedef void (*wakeup_service_speech_streaming_cb)(wakeup_speech_streaming_event_e event, unsigned char* buffer, int len, void *user_data); - -typedef void (*wakeup_service_speech_status_cb)(wakeup_speech_status_e status, void *user_data); - -typedef void (*wakeup_service_error_cb)(int error, const char* err_msg, void* user_data); - -typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data); - -#ifdef __cplusplus -} -#endif - -#endif /* _MULTI_WAKEUP_RECOGNIZER_H_ */ diff --git a/lib/aarch64/libwakeup-engine.so b/lib/aarch64/libwakeup-engine.so new file mode 100644 index 0000000..ad2ca7b Binary files /dev/null and b/lib/aarch64/libwakeup-engine.so differ diff --git a/lib/armv7l/libwakeup-engine.so b/lib/armv7l/libwakeup-engine.so new file mode 100644 index 0000000..420be52 Binary files /dev/null and b/lib/armv7l/libwakeup-engine.so differ diff --git a/lib/i586/libwakeup-engine.so b/lib/i586/libwakeup-engine.so new file mode 100644 index 0000000..c983398 Binary files /dev/null and b/lib/i586/libwakeup-engine.so differ diff --git a/lib/x86_64/libwakeup-engine.so b/lib/x86_64/libwakeup-engine.so new file mode 100644 index 0000000..5950e50 Binary files /dev/null and b/lib/x86_64/libwakeup-engine.so differ diff --git a/org.tizen.multi-assistant-service.manifest b/org.tizen.multi-assistant-service.manifest deleted file mode 100644 index 41a9320..0000000 --- a/org.tizen.multi-assistant-service.manifest +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml deleted file mode 100644 index dfe8e7d..0000000 --- a/org.tizen.multi-assistant-service.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - Won Nam Jang - Sooyeon Kim - Seongrae Jo - Multi Assistant Service - - org.tizen.multi-assistant-service.png - - - - - - http://tizen.org/privilege/application.launch - http://tizen.org/privilege/power - http://tizen.org/privilege/packagemanager.info - http://tizen.org/privilege/appmanager.launch - http://tizen.org/privilege/appmanager.kill - http://tizen.org/privilege/keygrab - http://tizen.org/privilege/recorder - http://tizen.org/privilege/appdir.shareddata - http://tizen.org/privilege/internet - http://tizen.org/privilege/network.get - http://tizen.org/privilege/bluetooth - http://tizen.org/privilege/bluetooth.admin - - diff --git a/packaging/org.tizen.multi-assistant-service.manifest b/packaging/org.tizen.multi-assistant-service.manifest deleted file mode 100644 index a76fdba..0000000 --- a/packaging/org.tizen.multi-assistant-service.manifest +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec deleted file mode 100644 index 0ec20cb..0000000 --- a/packaging/org.tizen.multi-assistant-service.spec +++ /dev/null @@ -1,105 +0,0 @@ -Name: org.tizen.multi-assistant-service -Summary: Multi assistant service -Version: 0.1.1 -Release: 1 -Group: Graphics & UI Framework/Voice Framework -License: Flora-1.1 -Source: %{name}-%{version}.tar.gz -Source1001: %{name}.manifest - -Requires(post): /sbin/ldconfig -Requires(postun): /sbin/ldconfig - -BuildRequires: pkgconfig(capi-appfw-application) -BuildRequires: pkgconfig(capi-appfw-app-manager) -BuildRequires: pkgconfig(capi-appfw-package-manager) -BuildRequires: pkgconfig(capi-appfw-service-application) -BuildRequires: pkgconfig(capi-media-audio-io) -BuildRequires: pkgconfig(capi-network-connection) -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(ecore) -BuildRequires: pkgconfig(dbus-1) -BuildRequires: pkgconfig(libtzplatform-config) -BuildRequires: pkgconfig(libxml-2.0) -BuildRequires: pkgconfig(multi-assistant) -BuildRequires: pkgconfig(vconf) -BuildRequires: pkgconfig(pkgmgr-info) -%if "%{tizen_profile_name}" == "tv" -BuildRequires: pkgconfig(vd-win-util) -BuildRequires: pkgconfig(capi-network-bluetooth) -BuildRequires: pkgconfig(capi-network-bluetooth-tv) -#BuildRequires: pkgconfig(msfapi) -BuildRequires: pkgconfig(farfield-voice-api) -%endif - - -BuildRequires: boost-system -BuildRequires: boost-thread -BuildRequires: cmake - - -%description -org.tizen.multi-assistant-service (application) - -%define _usrdir /usr -#%define _appdir %{_usrdir}/apps/org.tizen.multi-assistant-service/ -%define _appdir %{TZ_SYS_RO_APP}/%{name} -%define _bindir %{_appdir}/bin/ - -%prep -%setup -q -cp %{SOURCE1001} . - -%build -LDFLAGS="$LDFLAGS -Wl,-z -Wl,nodelete" -%if 0%{?sec_build_binary_debug_enable} - export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" - export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" - export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" -%endif - -export LDFLAGS -cmake \ -%if "%{tizen_profile_name}" == "tv" - -D_TV_PRODUCT=TRUE \ -%endif - -DCMAKE_INSTALL_PREFIX=%{_appdir} \ - -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE \ - -make %{?jobs:-j%jobs} - -%install -rm -rf %{buildroot} -mkdir -p %{buildroot}%{TZ_SYS_RO_SHARE}/license -cp LICENSE.Flora %{buildroot}%{TZ_SYS_RO_SHARE}/license/%{name} - -%make_install - -%post -mkdir -p %{_bindir} -mkdir -p %{_libdir}/multiassistant/ma/1.0/engine - -/sbin/ldconfig -exit 0 - -%postun -/sbin/ldconfig -exit 0 - -# INITIALIZE VCONF ------------------------------------------------------------ - -%files -%manifest %{name}.manifest -%defattr(-,root,root,-) -/usr/share/license/* -/usr/share/packages/org.tizen.multi-assistant-service.xml -%{TZ_SYS_RO_SHARE}/multiassistant/libma-wakeup-manager.so -%if "%{tizen_profile_name}" == "tv" -%{TZ_SYS_RO_SHARE}/multiassistant/libma-dependency-tv.so -%else -%{TZ_SYS_RO_SHARE}/multiassistant/libma-dependency-default.so -%endif -#%{_appdir}/lib/* -%{_appdir}/bin/* -#%defattr(-,app,app,-) -#%{_bindir}/org.tizen.multi-assistant-service diff --git a/packaging/wakeup-engine-default.spec b/packaging/wakeup-engine-default.spec new file mode 100755 index 0000000..5bd2229 --- /dev/null +++ b/packaging/wakeup-engine-default.spec @@ -0,0 +1,41 @@ +Name: wakeup-engine-default +Summary: Default wakeup engine for multi-assistant-service +Version: 0.2.0 +Release: 1 +Group: Graphics & UI Framework/Voice Framework +License: Flora-1.1 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(libtzplatform-config) +%description +wakeup-engine-default is the library of reference wakeup-engine. + +%prep +%setup -q + +%build +%define _app_home_dir %{TZ_SYS_RO_APP}/%{name} +%define _app_bin_dir %{_app_home_dir}/bin +%define _app_lib_dir %{_app_home_dir}/lib +%define _app_res_dir %{_app_home_dir}/shared/res +%define _app_shared_dir %{_app_home_dir}/shared + +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} + +make %{?jobs:-j%jobs} +%install +rm -rf %{buildroot} + +%make_install + +%post + +%postun + +%files +%{_app_res_dir}/* +%{TZ_SYS_RO_PACKAGES}/wakeup-engine-default.xml +/usr/share/multiassistant/engines/wakeup-engine-default/libwakeup-engine.so +%manifest wakeup-engine-default.manifest +%license LICENSE.Flora diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt deleted file mode 100644 index 2d6e382..0000000 --- a/plugins/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -ADD_SUBDIRECTORY(wakeup-manager) diff --git a/plugins/wakeup-manager/CMakeLists.txt b/plugins/wakeup-manager/CMakeLists.txt deleted file mode 100644 index 752f085..0000000 --- a/plugins/wakeup-manager/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(ma-wakeup-manager) - -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(PACKAGE ${PROJECT_NAME}) - -SET(CMAKE_SKIP_BUILD_RPATH TRUE) - -INCLUDE_DIRECTORIES( - ${CMAKE_SOURCE_DIR}/inc - ./inc - ) - -SET(WMPKG_CHECK_MODULES - appcore-agent - ecore - dlog - capi-appfw-app-manager - capi-network-connection - capi-media-audio-io - capi-media-sound-manager - eina - vconf - pkgmgr-info -) - -INCLUDE(FindPkgConfig) -pkg_check_modules(wmpkgs REQUIRED ${WMPKG_CHECK_MODULES}) -MESSAGE("Modules : ${WMPKG_CHECK_MODULES}") - -IF("${CMAKE_BUILD_TYPE}" STREQUAL "") - SET(CMAKE_BUILD_TYPE "Release") -ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") -MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") - -ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") -ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"") - -SET(SRCS - src/wakeup_manager.cpp - src/wakeup_settings.cpp - src/wakeup_policy.cpp - src/wakeup_policy_default.cpp - src/wakeup_audio_manager.cpp - src/wakeup_engine_manager.cpp - src/wakeup_manager_wrapper.cpp - src/dependency_resolver.cpp - src/heap_tracer.cpp -) - -FOREACH(flag ${wmpkgs_CFLAGS}) - SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") -ENDFOREACH(flag) - - - -SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -fPIC -Wall" ) -IF("${_TV_PRODUCT}" STREQUAL "TRUE") - SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -DTV_PRODUCT") -ENDIF() -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fPIC -std=c++11 -fvisibility=hidden") -SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") - -ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} ) - -# Install libraries -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${wmpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS}) -MESSAGE("LDFLAG : ${wmpkgs_LDFLAGS}") -INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/libma-wakeup-manager.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/) - -IF("${_TV_PRODUCT}" STREQUAL "TRUE") -ADD_SUBDIRECTORY(dependency-tv) -ELSE() -ADD_SUBDIRECTORY(dependency-default) -ENDIF() diff --git a/plugins/wakeup-manager/dependency-default/CMakeLists.txt b/plugins/wakeup-manager/dependency-default/CMakeLists.txt deleted file mode 100644 index 163ede8..0000000 --- a/plugins/wakeup-manager/dependency-default/CMakeLists.txt +++ /dev/null @@ -1,60 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(ma-dependency-default) - -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(PACKAGE ${PROJECT_NAME}) - -SET(CMAKE_SKIP_BUILD_RPATH TRUE) - -INCLUDE_DIRECTORIES( - ${CMAKE_SOURCE_DIR}/inc - ./inc - ) - -SET(DDPKG_CHECK_MODULES - appcore-agent - ecore - dlog - capi-appfw-app-manager - capi-network-connection - capi-media-audio-io - capi-media-sound-manager - eina - vconf - pkgmgr-info -) - -INCLUDE(FindPkgConfig) -pkg_check_modules(ddpkgs REQUIRED ${DDPKG_CHECK_MODULES}) -MESSAGE("Modules : ${DDPKG_CHECK_MODULES}") - -IF("${CMAKE_BUILD_TYPE}" STREQUAL "") - SET(CMAKE_BUILD_TYPE "Release") -ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") -MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") - -ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") -ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"") - -SET(SRCS - src/dependency_default.cpp - src/dependency_default_audio.cpp - src/dependency_default_button.cpp -) - -FOREACH(flag ${ddpkgs_CFLAGS}) - SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") -ENDFOREACH(flag) - - - -SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -fPIC -Wall" ) -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fPIC -std=c++11 -fvisibility=hidden") -SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") - -ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} ) - -# Install libraries -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ddpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS}) -MESSAGE("LDFLAG : ${ddpkgs_LDFLAGS}") -INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/dependency-default/lib${PACKAGE}.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/) diff --git a/plugins/wakeup-manager/dependency-default/inc/dependency_default.h b/plugins/wakeup-manager/dependency-default/inc/dependency_default.h deleted file mode 100644 index 2598200..0000000 --- a/plugins/wakeup-manager/dependency-default/inc/dependency_default.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _DEPENDENCY_DEFAULT_H_ -#define _DEPENDENCY_DEFAULT_H_ - -#include - -#ifndef LOG_TAG -#define LOG_TAG "dependency_default" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - WAKEUP_SPEECH_STREAMING_EVENT_FAIL = -1, /**< Failed */ - WAKEUP_SPEECH_STREAMING_EVENT_START = 1, /**< Start event */ - WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE = 2, /**< Continue event */ - WAKEUP_SPEECH_STREAMING_EVENT_FINISH = 3 /**< Finish event */ -} wakeup_speech_streaming_event_e; - -typedef enum { - MA_PLUGIN_EVENT_VOICE_KEY_PRESSED = 0, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH = MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP, -} ma_plugin_event_e; - -typedef enum -{ - RECORDING_SESSION_WAKE_WORD, - RECORDING_SESSION_UTTERANCE, - RECORDING_SESSION_FOLLOW_UP, -} recording_session; - -typedef void (*mas_dependency_error_cb)(int error, const char* err_msg, void* user_data); - -typedef int (*mas_proxy_process_event)(int event, void* data, int len); -typedef int (*mas_proxy_feed_audio_data)(wakeup_speech_streaming_event_e event, void* buffer, int len); - -typedef struct { - mas_proxy_process_event process_event; - mas_proxy_feed_audio_data feed_audio_data; -} mas_proxy_interface; - -EXPORT_API int mas_dependency_initialize(mas_proxy_interface interfaces, int *dependency_version); -EXPORT_API int mas_dependency_deinitialize(void); -EXPORT_API int mas_dependency_set_error_callback(mas_dependency_error_cb callback, void* user_data); -EXPORT_API int mas_dependency_start_recording(void); -EXPORT_API int mas_dependency_stop_recording(void); -EXPORT_API int mas_dependency_set_recording_session(unsigned int session); -EXPORT_API int mas_dependency_set_background_volume(double ratio); -EXPORT_API int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type); -EXPORT_API int mas_dependency_get_audio_source_type(char** type); - -#ifdef __cplusplus -} -#endif - -#endif /* _DEPENDENCY_DEFAULT_H_ */ diff --git a/plugins/wakeup-manager/dependency-default/inc/dependency_default_audio.h b/plugins/wakeup-manager/dependency-default/inc/dependency_default_audio.h deleted file mode 100644 index a51bb03..0000000 --- a/plugins/wakeup-manager/dependency-default/inc/dependency_default_audio.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _DEPENDENCY_DEFAULT_AUDIO_H_ -#define _DEPENDENCY_DEFAULT_AUDIO_H_ - -void dependency_default_audio_initialize(mas_proxy_interface interface); -void dependency_default_audio_deinitialize(); - -void dependency_default_audio_start_recording(); -void dependency_default_audio_stop_recording(); - -void dependency_default_audio_set_recording_session(unsigned int session); - -void dependency_default_audio_voice_key_pressed_set(bool pressed); - -void dependency_default_audio_set_background_volume(double ratio); - -void dependency_default_audio_get_audio_format(int* rate, int* channel, int* audio_type); -void dependency_default_audio_get_audio_source_type(char** type); - -#endif //_DEPENDENCY_DEFAULT_AUDIO_H_ diff --git a/plugins/wakeup-manager/dependency-default/inc/dependency_default_button.h b/plugins/wakeup-manager/dependency-default/inc/dependency_default_button.h deleted file mode 100644 index 4639c4b..0000000 --- a/plugins/wakeup-manager/dependency-default/inc/dependency_default_button.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _DEPENDENCY_DEFAULT_BUTTON_H_ -#define _DEPENDENCY_DEFAULT_BUTTON_H_ - -void dependency_default_button_initialize(mas_proxy_interface interface); -void dependency_default_button_deinitialize(); - -#endif //_DEPENDENCY_DEFAULT_BUTTON_H_ diff --git a/plugins/wakeup-manager/dependency-default/src/dependency_default.cpp b/plugins/wakeup-manager/dependency-default/src/dependency_default.cpp deleted file mode 100644 index be13250..0000000 --- a/plugins/wakeup-manager/dependency-default/src/dependency_default.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include "dependency_default.h" -#include "dependency_default_audio.h" -#include "dependency_default_button.h" - -static mas_proxy_interface g_proxy_interface; -const int g_dependency_version = 1; - -int mas_dependency_initialize(mas_proxy_interface interface, int *dependency_version) -{ - g_proxy_interface = interface; - - dependency_default_audio_initialize(interface); - dependency_default_button_initialize(interface); - - if (dependency_version) { - *dependency_version = g_dependency_version; - } - - return 0; -} - -int mas_dependency_deinitialize(void) -{ - dependency_default_audio_deinitialize(); - dependency_default_button_deinitialize(); - - return 0; -} - -int mas_dependency_set_error_callback(mas_dependency_error_cb callback, void* user_data) -{ - return 0; -} - -int mas_dependency_start_recording(void) -{ - dependency_default_audio_start_recording(); - return 0; -} - -int mas_dependency_stop_recording(void) -{ - dependency_default_audio_stop_recording(); - return 0; -} - -int mas_dependency_set_recording_session(unsigned int session) -{ - dependency_default_audio_set_recording_session(session); - return 0; -} - -int mas_dependency_set_background_volume(double ratio) -{ - dependency_default_audio_set_background_volume(ratio); - return 0; -} - -int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type) -{ - dependency_default_audio_get_audio_format(rate, channel, audio_type); - return 0; -} - -int mas_dependency_get_audio_source_type(char** type) -{ - dependency_default_audio_get_audio_source_type(type); - return 0; -} diff --git a/plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp b/plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp deleted file mode 100644 index 1bc67c5..0000000 --- a/plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp +++ /dev/null @@ -1,377 +0,0 @@ -#include "dependency_default.h" -#include "dependency_default_audio.h" - -static bool g_voice_key_pressed = false; -static mas_proxy_interface g_proxy_interface; - -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace std; - -static audio_in_h g_audio_in = NULL; - -static sound_stream_info_h g_volume_stream = NULL; -static virtual_sound_stream_h g_virtual_sound_stream = NULL; - -static int g_device_id = -1; -static sound_stream_info_h g_stream_info = NULL; - -static thread g_recorder_thread; -static atomic_bool g_stop_recorder_thread{false}; - -static long get_current_milliseconds_after_epoch() -{ - auto now = chrono::system_clock::now(); - auto now_ms = chrono::time_point_cast(now); - /* number of milliseconds since the epoch of system_clock */ - auto value = now_ms.time_since_epoch(); - - return value.count(); -} - -static int _apply_device_for_stream_routing(void *user_data) -{ - sound_device_list_h deviceList = NULL; - sound_device_h device = NULL; - sound_device_type_e type; - sound_device_io_direction_e ioDirection; - - if (0 != sound_manager_get_device_list(SOUND_DEVICE_IO_DIRECTION_IN_MASK, &deviceList)) { - LOGE("[Recorder ERROR] Fail to get current device list"); - return -1; - } - - bool isFound = false; - while (0 == sound_manager_get_next_device(deviceList, &device)) { - if (0 != sound_manager_get_device_type(device, &type)) { - LOGE("[Recorder ERROR] Fail to get device type"); - continue; - } - if (0 != sound_manager_get_device_io_direction(device, &ioDirection)) { - LOGE("[Recorder ERROR] Fail to get device io direction"); - continue; - } - - if (SOUND_DEVICE_USB_AUDIO == type && SOUND_DEVICE_IO_DIRECTION_IN == ioDirection) { - if (0 != sound_manager_add_device_for_stream_routing(g_stream_info, device)) { - LOGE("[Recorder ERROR] Fail to add device"); - continue; - } - if (0 != sound_manager_apply_stream_routing(g_stream_info)) { - LOGE("[Recorder ERROR] Fail to apply stream routing"); - continue; - } - isFound = true; - break; - } - } - - sound_manager_free_device_list(deviceList); - deviceList = NULL; - - if (true != isFound) { - LOGI("[Recorder] No USB device"); - } else { - LOGD("[Recorder] Apply device for stream routing"); - } - return 0; -} - -static void _device_connection_changed_cb(sound_device_h device, bool isConnected, void *user_data) -{ - sound_device_type_e type; - if (isConnected) { - if (0 != sound_manager_get_device_type(device, &type)) { - LOGE("[Recorder ERROR] Fail to get device type"); - return; - } - if (type == SOUND_DEVICE_USB_AUDIO) { - if (0 != sound_manager_remove_device_for_stream_routing(g_stream_info, device)) - LOGE("[Recorder ERROR] Fail to remove device"); - - if (0 != sound_manager_add_device_for_stream_routing(g_stream_info, device)) { - LOGE("[Recorder ERROR] Fail to add device"); - return; - } - if (0 != sound_manager_apply_stream_routing(g_stream_info)) { - LOGE("[Recorder ERROR} Fail to apply stream routing"); - return; - } - LOGD("[Recorder] Apply device for stream routing"); - } - } - return; -} - -void dependency_default_audio_initialize(mas_proxy_interface interfaces) -{ - const int rate = 16000; - const audio_channel_e channel = AUDIO_CHANNEL_MONO; - const audio_sample_type_e type = AUDIO_SAMPLE_TYPE_S16_LE; - - g_proxy_interface = interfaces; - - int ret = audio_in_create(rate, channel, type, &g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGE("[Recorder ERROR] Rate(%d) Channel(%d) Type(%d)", rate, channel, type); - LOGE("[Recorder ERROR] Fail to create audio handle : %d", ret); - return; - } - - ret = sound_manager_add_device_connection_changed_cb(SOUND_DEVICE_IO_DIRECTION_IN_MASK, _device_connection_changed_cb, NULL, &g_device_id); - if (0 != ret) { - LOGE("[Recorder ERROR] Fail to add device connection changed callback"); - audio_in_destroy(g_audio_in); - g_audio_in = NULL; - return; - } - - ret = sound_manager_create_stream_information_internal( - SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_stream_info); - if (0 != ret) { - LOGE("[Recorder ERROR] Fail to create stream info"); - sound_manager_remove_device_connection_changed_cb(g_device_id); - audio_in_destroy(g_audio_in); - g_audio_in = NULL; - return; - } - - ret = _apply_device_for_stream_routing(NULL); - if (0 != ret) { - LOGE("[Recorder ERROR] Fail to apply device for stream routing: %d", ret); - sound_manager_remove_device_connection_changed_cb(g_device_id); - sound_manager_destroy_stream_information(g_stream_info); - g_stream_info = NULL; - audio_in_destroy(g_audio_in); - g_audio_in = NULL; - return; - } - - ret = audio_in_set_sound_stream_info(g_audio_in, g_stream_info); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGE("[Recorder ERROR] Fail to set stream info : %d", ret); - sound_manager_remove_device_connection_changed_cb(g_device_id); - sound_manager_destroy_stream_information(g_stream_info); - g_stream_info = NULL; - audio_in_destroy(g_audio_in); - g_audio_in = NULL; - return; - } - - ret = audio_in_prepare(g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - if (AUDIO_IO_ERROR_SOUND_POLICY == ret) - { - LOGE("[Recorder ERROR] Audio is busy."); - } else { - LOGE("[Recorder ERROR] Fail to start audio : %d", ret); - } - sound_manager_remove_device_connection_changed_cb(g_device_id); - sound_manager_destroy_stream_information(g_stream_info); - g_stream_info = NULL; - audio_in_destroy(g_audio_in); - g_audio_in = NULL; - return; - } - - ret = audio_in_pause(g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGE("[Recorder ERROR] Fail to pause audio in : %d", ret); - } -} - -void dependency_default_audio_deinitialize() -{ - int ret = 0; - if (g_virtual_sound_stream) { - sound_manager_stop_virtual_stream(g_virtual_sound_stream); - ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGE("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret); - } - g_virtual_sound_stream = NULL; - } - - if (g_device_id) { - ret = sound_manager_remove_device_connection_changed_cb(g_device_id); - if (0 != ret) - LOGE("[Audio ERROR] Fail to remove device connection changed callback, ret(%d)", ret); - } - - if (g_volume_stream) { - ret = sound_manager_destroy_stream_information(g_volume_stream); - if (0 != ret) { - LOGE("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret); - } - g_volume_stream = NULL; - } - - if (g_audio_in) { - ret = audio_in_unprepare(g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGD("[Recorder ERROR] Fail to stop audio : %d", ret); - } - } - - if (g_stream_info) { - if (0 != sound_manager_destroy_stream_information(g_stream_info)) { - LOGD("[Recorder ERROR] Fail to destroy stream info"); - } - g_stream_info = NULL; - } - - if (g_audio_in) { - ret = audio_in_destroy(g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGD("[Recorder ERROR] Fail to destroy audio : %d", ret); - } - g_audio_in = NULL; - } -} - -static void recorder_thread_func() -{ - const int FRAME_LENGTH = 160; - const int BUFFER_LENGTH = FRAME_LENGTH * 2; - - static int buffer_count = 0; - - while (!(g_stop_recorder_thread.load())) { - unsigned char buffer[BUFFER_LENGTH]; - memset(buffer, '\0', BUFFER_LENGTH); - - int read_bytes = audio_in_read(g_audio_in, buffer, BUFFER_LENGTH); - if (0 > read_bytes) { - LOGE("[Recorder WARNING] Fail to read audio : %d", read_bytes); - break; - } - - g_proxy_interface.feed_audio_data(WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE, - buffer, read_bytes); - - /* Audio read log */ - if (0 == buffer_count % 300) { - LOGD("[Recorder][%d] Recording... : read_size(%d)", buffer_count, read_bytes); - } - - buffer_count++; - } -} - -void dependency_default_audio_start_recording() -{ - int ret = audio_in_resume(g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGD("[Recorder ERROR] Fail to resume audio in : %d", ret); - } - g_stop_recorder_thread.store(false); - LOGD("Starting recorder thread"); - g_recorder_thread = thread(recorder_thread_func); -} - -void dependency_default_audio_stop_recording() -{ - if (g_recorder_thread.joinable()) { - LOGD("g_recorder_thread is joinable, trying join()"); - g_stop_recorder_thread.store(true); - g_recorder_thread.join(); - } - int ret = audio_in_pause(g_audio_in); - if (AUDIO_IO_ERROR_NONE != ret) { - LOGD("[Recorder ERROR] Fail to pause audio in : %d", ret); - } -} - -void dependency_default_audio_set_recording_session(unsigned int session) -{ - LOGD("Current recording session : [%s]", - (RECORDING_SESSION_WAKE_WORD == session) ? "wake word detecting" : - (RECORDING_SESSION_UTTERANCE == session) ? "utterance recording" : - (RECORDING_SESSION_FOLLOW_UP == session) ? "follow-up speech recording" : - "ERROR - Invalid recording session information" - ); -} - -void dependency_default_audio_voice_key_pressed_set(bool pressed) -{ - g_voice_key_pressed = pressed; -} - -void dependency_default_audio_set_background_volume(double ratio) -{ - int ret; - - if (ratio >= 0.5) { - if (g_virtual_sound_stream) { - ret = sound_manager_stop_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to stop virtual stream, ret(%d)", ret); - } - ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret); - return; - } - g_virtual_sound_stream = NULL; - } - - if (g_volume_stream) { - ret = sound_manager_destroy_stream_information(g_volume_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret); - return; - } - g_volume_stream = NULL; - } - } else { - if (!g_volume_stream) { - ret = sound_manager_create_stream_information_internal(SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_volume_stream); - if (0 != ret) { - LOGD("[Audio] Fail to create stream information, ret(%d)", ret); - return; - } - } - - if (!g_virtual_sound_stream) { - ret = sound_manager_create_virtual_stream(g_volume_stream, &g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to create virtual stream, ret(%d)", ret); - return; - } - } - if (g_virtual_sound_stream) { - ret = sound_manager_start_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to start virtual stream, ret(%d)", ret); - return; - } - } - } -} - -void dependency_default_audio_get_audio_format(int* rate, int* channel, int* audio_type) -{ - if (!audio_type || !rate || !channel) { - return; - } - *rate = 16000; - *channel = 0; - *audio_type = 0; -} - -void dependency_default_audio_get_audio_source_type(char** type) -{ - static char source_type[] = "default_audio"; - if (!type) { - return; - } - *type = source_type; -} diff --git a/plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp b/plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp deleted file mode 100644 index 5b39979..0000000 --- a/plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "dependency_default.h" -#include "dependency_default_button.h" - -#include - -static mas_proxy_interface g_proxy_interface; - -void dependency_default_button_initialize(mas_proxy_interface interface) -{ - g_proxy_interface = interface; -} - -void dependency_default_button_deinitialize() -{ -} diff --git a/plugins/wakeup-manager/dependency-tv/CMakeLists.txt b/plugins/wakeup-manager/dependency-tv/CMakeLists.txt deleted file mode 100644 index b89f19a..0000000 --- a/plugins/wakeup-manager/dependency-tv/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(ma-dependency-tv) - -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(PACKAGE ${PROJECT_NAME}) - -SET(CMAKE_SKIP_BUILD_RPATH TRUE) - -INCLUDE_DIRECTORIES( - ${CMAKE_SOURCE_DIR}/inc - ./inc - ) - -SET(DDPKG_CHECK_MODULES - ecore - ecore-wl2 - dlog - eina - capi-media-sound-manager - capi-network-bluetooth - capi-network-bluetooth-tv - vd-win-util - farfield-voice-api -) - -INCLUDE(FindPkgConfig) -pkg_check_modules(ddpkgs REQUIRED ${DDPKG_CHECK_MODULES}) -MESSAGE("Modules : ${DDPKG_CHECK_MODULES}") - -IF("${CMAKE_BUILD_TYPE}" STREQUAL "") - SET(CMAKE_BUILD_TYPE "Release") -ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") -MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") - -ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") -ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"") - -SET(SRCS - src/dependency_tv.cpp - src/dependency_tv_audio.cpp - src/dependency_tv_button.cpp -) - -FOREACH(flag ${ddpkgs_CFLAGS}) - SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") -ENDFOREACH(flag) - - - -SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -fPIC -Wall" ) -IF("${_TV_PRODUCT}" STREQUAL "TRUE") - SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -DTV_PRODUCT") -ENDIF() -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fPIC -std=c++11 -fvisibility=hidden") -SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") - -ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} ) - -# Install libraries -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ddpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS}) -MESSAGE("LDFLAG : ${ddpkgs_LDFLAGS}") -INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/dependency-tv/lib${PACKAGE}.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/) diff --git a/plugins/wakeup-manager/dependency-tv/inc/dependency_tv.h b/plugins/wakeup-manager/dependency-tv/inc/dependency_tv.h deleted file mode 100644 index bf39e54..0000000 --- a/plugins/wakeup-manager/dependency-tv/inc/dependency_tv.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _DEPENDENCY_TV_H_ -#define _DEPENDENCY_TV_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef LOG_TAG -#define LOG_TAG "dependency_tv" -#endif - -typedef enum { - WAKEUP_SPEECH_STREAMING_EVENT_FAIL = -1, /**< Failed */ - WAKEUP_SPEECH_STREAMING_EVENT_START = 1, /**< Start event */ - WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE = 2, /**< Continue event */ - WAKEUP_SPEECH_STREAMING_EVENT_FINISH = 3 /**< Finish event */ -} wakeup_speech_streaming_event_e; - -typedef enum { - MA_PLUGIN_EVENT_VOICE_KEY_PRESSED = 0, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH = MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP, -} ma_plugin_event_e; - -typedef enum -{ - RECORDING_SESSION_WAKE_WORD, - RECORDING_SESSION_UTTERANCE, - RECORDING_SESSION_FOLLOW_UP, -} recording_session; - -typedef void (*mas_dependency_error_cb)(int error, const char* err_msg, void* user_data); - -typedef int (*mas_proxy_process_event)(int event, void* data, int len); -typedef int (*mas_proxy_feed_audio_data)(wakeup_speech_streaming_event_e event, void* buffer, int len); - -typedef struct { - mas_proxy_process_event process_event; - mas_proxy_feed_audio_data feed_audio_data; -} mas_proxy_interface; - -#ifndef EXPORT_API - #if defined _WIN32 || defined __CYGWIN__ - #ifdef BUILDING_DLL - #ifdef __GNUC__ - #define EXPORT_API __attribute__ ((dllexport)) - #else - #define EXPORT_API __declspec(dllexport) // Note: actually gcc seems to also supports this syntax. - #endif - #else - #ifdef __GNUC__ - #define EXPORT_API __attribute__ ((dllimport)) - #else - #define EXPORT_API __declspec(dllimport) // Note: actually gcc seems to also supports this syntax. - #endif - #endif - #define DLL_LOCAL - #else - #if __GNUC__ >= 4 - #define EXPORT_API __attribute__ ((visibility ("default"))) - #define DLL_LOCAL __attribute__ ((visibility ("hidden"))) - #else - #define EXPORT_API - #define DLL_LOCAL - #endif - #endif -#endif - -EXPORT_API int mas_dependency_initialize(mas_proxy_interface interfaces, int *dependency_version); -EXPORT_API int mas_dependency_deinitialize(void); -EXPORT_API int mas_dependency_set_error_callback(mas_dependency_error_cb callback, void* user_data); -EXPORT_API int mas_dependency_start_recording(void); -EXPORT_API int mas_dependency_stop_recording(void); -EXPORT_API int mas_dependency_set_recording_session(unsigned int session); -EXPORT_API int mas_dependency_set_background_volume(double ratio); -EXPORT_API int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type); -EXPORT_API int mas_dependency_get_audio_source_type(char** type); - - -#ifdef __cplusplus -} -#endif - -#endif /* _DEPENDENCY_TV_H_ */ diff --git a/plugins/wakeup-manager/dependency-tv/inc/dependency_tv_audio.h b/plugins/wakeup-manager/dependency-tv/inc/dependency_tv_audio.h deleted file mode 100644 index b829865..0000000 --- a/plugins/wakeup-manager/dependency-tv/inc/dependency_tv_audio.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _DEPENDENCY_TV_AUDIO_H_ -#define _DEPENDENCY_TV_AUDIO_H_ - -void dependency_tv_audio_initialize(mas_proxy_interface interface); -void dependency_tv_audio_deinitialize(); - -void dependency_tv_audio_start_recording(); -void dependency_tv_audio_stop_recording(); - -void dependency_tv_audio_set_recording_session(unsigned int session); - -void dependency_tv_audio_set_background_volume(double ratio); - -void dependency_tv_audio_voice_key_pressed_set(bool pressed); - -void dependency_tv_audio_get_audio_format(int* rate, int* channel, int* audio_type); - -void dependency_tv_audio_get_audio_source_type(char** type); - -#endif //_DEPENDENCY_TV_AUDIO_H_ diff --git a/plugins/wakeup-manager/dependency-tv/inc/dependency_tv_button.h b/plugins/wakeup-manager/dependency-tv/inc/dependency_tv_button.h deleted file mode 100644 index a1b1db7..0000000 --- a/plugins/wakeup-manager/dependency-tv/inc/dependency_tv_button.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _DEPENDENCY_TV_BUTTON_H_ -#define _DEPENDENCY_TV_BUTTON_H_ - -void dependency_tv_button_initialize(mas_proxy_interface interface); -void dependency_tv_button_deinitialize(); - -#endif //_DEPENDENCY_TV_BUTTON_H_ diff --git a/plugins/wakeup-manager/dependency-tv/src/dependency_tv.cpp b/plugins/wakeup-manager/dependency-tv/src/dependency_tv.cpp deleted file mode 100644 index d6eb6f1..0000000 --- a/plugins/wakeup-manager/dependency-tv/src/dependency_tv.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "dependency_tv.h" -#include "dependency_tv_audio.h" -#include "dependency_tv_button.h" - -static mas_proxy_interface g_proxy_interface; -const int g_dependency_version = 1; - -int mas_dependency_initialize(mas_proxy_interface interface, int *dependency_version) -{ - g_proxy_interface = interface; - - dependency_tv_audio_initialize(interface); - dependency_tv_button_initialize(interface); - - if (dependency_version) { - *dependency_version = g_dependency_version; - } - - return 0; -} - -int mas_dependency_deinitialize(void) -{ - dependency_tv_audio_deinitialize(); - dependency_tv_button_deinitialize(); - - return 0; -} - -int mas_dependency_set_error_callback(mas_dependency_error_cb callback, void* user_data) -{ - return 0; -} - -int mas_dependency_start_recording(void) -{ - dependency_tv_audio_start_recording(); - return 0; -} - -int mas_dependency_stop_recording(void) -{ - dependency_tv_audio_stop_recording(); - return 0; -} - -int mas_dependency_set_recording_session(unsigned int session) -{ - dependency_tv_audio_set_recording_session(session); - return 0; -} - -int mas_dependency_set_background_volume(double ratio) -{ - dependency_tv_audio_set_background_volume(ratio); - return 0; -} - -int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type) -{ - dependency_tv_audio_get_audio_format(rate, channel, audio_type); - return 0; -} - -int mas_dependency_get_audio_source_type(char** type) -{ - dependency_tv_audio_get_audio_source_type(type); - return 0; -} - diff --git a/plugins/wakeup-manager/dependency-tv/src/dependency_tv_audio.cpp b/plugins/wakeup-manager/dependency-tv/src/dependency_tv_audio.cpp deleted file mode 100644 index 8b66842..0000000 --- a/plugins/wakeup-manager/dependency-tv/src/dependency_tv_audio.cpp +++ /dev/null @@ -1,420 +0,0 @@ -#include "dependency_tv.h" -#include "dependency_tv_audio.h" - -static bool g_voice_key_pressed = false; -static mas_proxy_interface g_proxy_interface; - -#include -#include -#include -#include - -#include -#include -#include - -using namespace std; - -#include -#include -#include - -#define SMART_CONTROL_EXTEND_CMD 0x03 -#define SMART_CONTROL_START_CMD 0x04 - -#define VC_AUDIO_ID_BLUETOOTH "VC_AUDIO_ID_BLUETOOTH" -#define VC_AUDIO_ID_MIC "VC_FARFIELD_VOICE_VD" - -/* Sound buf save for test */ -#if 0 -#define BUF_SAVE_MODE -#endif - -#ifdef BUF_SAVE_MODE -static char g_temp_file_name[128] = {'\0', }; - -static FILE* g_pFile = NULL; - -static int g_count = 1; -#endif - -static int g_bt_extend_count; -static farfield_voice_h g_farfieldvoice_h = NULL; - -static sound_stream_info_h g_volume_stream = NULL; -static virtual_sound_stream_h g_virtual_sound_stream = NULL; -#define AUDIO_SOURCE_TYPE_LEN 64 -static char g_audio_source_type[AUDIO_SOURCE_TYPE_LEN]; - -static long get_current_milliseconds_after_epoch() -{ - auto now = chrono::system_clock::now(); - auto now_ms = chrono::time_point_cast(now); - /* number of milliseconds since the epoch of system_clock */ - auto value = now_ms.time_since_epoch(); - - return value.count(); -} - -static void set_audio_source_type(const char* src_type) -{ - if (0 != strncmp(src_type, g_audio_source_type, AUDIO_SOURCE_TYPE_LEN)) { - snprintf(g_audio_source_type, AUDIO_SOURCE_TYPE_LEN, "%s", src_type); - g_audio_source_type[AUDIO_SOURCE_TYPE_LEN - 1] = '\0'; - LOGE("[Recorder] source_type [%s]", g_audio_source_type); - - // TODO:: - vconf_set_str("db/farfieldvoice/devicetype", src_type); - } -} - -static void _bt_cb_hid_state_changed(int result, bool connected, const char *remote_address, void *user_data) -{ - LOGD("[Recorder] Bluetooth Event [%d] Received address [%s]", result, remote_address); - return; -} - -static void _bt_hid_audio_data_receive_cb(bt_hid_voice_data_s *voice_data, void *user_data) -{ - static int g_buffer_count = 0; - if (nullptr == voice_data) return; - - set_audio_source_type(VC_AUDIO_ID_BLUETOOTH); - - g_proxy_interface.feed_audio_data(WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE, - voice_data->audio_buf, voice_data->length); - -#ifdef BUF_SAVE_MODE - /* write pcm buffer */ - if (g_pFile) - fwrite(voice_data->audio_buf, 1, voice_data->length, g_pFile); -#endif - - if (0 == g_buffer_count || 0 == g_buffer_count % 50) { - LOGD("[Recorder][%d] Recording... : read_size(%d)", g_buffer_count, voice_data->length); - - if (0 == g_bt_extend_count % 5 && 0 != g_buffer_count) { - const unsigned char input_data[2] = {SMART_CONTROL_EXTEND_CMD, 0x10 }; - if (BT_ERROR_NONE != bt_hid_send_rc_command(NULL, input_data, sizeof(input_data))) { - LOGE("[Recorder ERROR] Fail bt_hid_send_rc_command"); - } else { - LOGD("[Recorder] Extend bt audio recorder"); - } - } - g_bt_extend_count++; - - if (100000 == g_buffer_count) { - g_buffer_count = 0; - } - } - - g_buffer_count++; - - return; -} - -static void stereo_to_mono_pcm(char* mono_buffer, const char* stereo_buffer, int len) -{ - int cnt = 0; - while (cnt < len) { - /* The code below collects audio data from only one channel for testing */ - mono_buffer[cnt / 2] = stereo_buffer[cnt]; - mono_buffer[cnt / 2 + 1] = stereo_buffer[cnt + 1]; - cnt += 4; - } -} - -static void _ffv_audio_function_cb(void* data, unsigned int length, void* user_data) -{ - /* When voice key is pressed, _bt_hid_audio should receive audio data */ - if (g_voice_key_pressed) return; - - set_audio_source_type(VC_AUDIO_ID_MIC); - - static int g_buffer_count = 0; - if (0 == g_buffer_count || 0 == g_buffer_count % 50) { - LOGD("[Recorder INFO] farfield audio function callback is invoked"); - - if (100000 == g_buffer_count) { - g_buffer_count = 0; - } - } - g_buffer_count++; - -#ifdef STEREO_TO_MONO - int mono_length = length / 2; - char* mono_buffer = (char*)calloc(length, sizeof(char)); - if (!mono_buffer) return; - stereo_to_mono_pcm(mono_buffer, (const char*)data, length); - - g_proxy_interface.feed_audio_data(WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE, - mono_buffer, mono_length); - -#ifdef BUF_SAVE_MODE - /* write pcm buffer */ - if (g_pFile) - fwrite(mono_buffer, 1, mono_length, g_pFile); -#endif - - if (mono_buffer) free(mono_buffer); - mono_buffer = NULL; -#else - g_proxy_interface.feed_audio_data(WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE, - data, length); -#ifdef BUF_SAVE_MODE - /* write pcm buffer */ - if (g_pFile) - fwrite(data, 1, length, g_pFile); -#endif -#endif -} - -void dependency_tv_audio_initialize(mas_proxy_interface interfaces) -{ - g_proxy_interface = interfaces; - - bool is_bt_failed = false; - - if (false == is_bt_failed && BT_ERROR_NONE != bt_product_init()) { - LOGE("[Recorder ERROR] Fail to init bt"); - is_bt_failed = true; - } - - if (false == is_bt_failed && BT_ERROR_NONE != bt_hid_host_initialize(_bt_cb_hid_state_changed, NULL)) { - LOGE("[Recorder ERROR] Fail bt_hid_host_initialize()"); - is_bt_failed = true; - } - - if (false == is_bt_failed && BT_ERROR_NONE != bt_hid_set_audio_data_receive_cb(_bt_hid_audio_data_receive_cb, NULL)) { - LOGE("[Recorder ERROR] Fail bt_hid_set_audio_data_receive_cb()"); - is_bt_failed = true; - } - - if (false == is_bt_failed) { - LOGD("[Recorder] Bluetooth is available"); - } - -#if 1 - g_farfieldvoice_h = farfield_voice_init(); - if (NULL == g_farfieldvoice_h) { - LOGE("[Recorder ERROR] Fail to init farfield_voice_init"); - } - - if (g_farfieldvoice_h) { - LOGI("[Recorder INFO] Register farfield voice audio callback"); - farfield_voice_register_audio_cb(g_farfieldvoice_h, _ffv_audio_function_cb, NULL); - } -#endif - - set_audio_source_type(VC_AUDIO_ID_BLUETOOTH); -} - -void dependency_tv_audio_deinitialize() -{ - int ret; - if (g_virtual_sound_stream) { - sound_manager_stop_virtual_stream(g_virtual_sound_stream); - ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGE("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret); - } - g_virtual_sound_stream = NULL; - } - - if (g_volume_stream) { - ret = sound_manager_destroy_stream_information(g_volume_stream); - if (0 != ret) { - LOGE("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret); - } - g_volume_stream = NULL; - } - -#if 1 - if (NULL != g_farfieldvoice_h) { - LOGD("[Recorder INFO] Unregister farfield voice"); - farfield_voice_unregister_audio_cb(g_farfieldvoice_h); - farfield_voice_final(g_farfieldvoice_h); - g_farfieldvoice_h = NULL; - } -#endif - - bt_hid_unset_audio_data_receive_cb(); - bt_hid_host_deinitialize(); - bt_product_deinit(); -} - -static void recorder_thread_func() -{ - const int FRAME_LENGTH = 160; - const int BUFFER_LENGTH = FRAME_LENGTH * 2; -} - -void dependency_tv_audio_start_recording() -{ - /* Do not start normal recorder thread if TV_PRODUCT and g_voice_key_pressed, - just send bt_hid start message */ - if (g_voice_key_pressed) { - const unsigned char input_data[2] = {SMART_CONTROL_START_CMD, 0x00}; - int bt_retry = 0; - const int max_retry = 5; - while (max_retry > bt_retry) { - int ret = bt_hid_send_rc_command(NULL, input_data, sizeof(input_data)); - if (BT_ERROR_NONE == ret) { - LOGD("[Recorder] Start bt audio recorder"); - break; - } else if (BT_ERROR_NOW_IN_PROGRESS == ret) { - LOGE("[Recorder ERROR] Fail bt_hid_send_rc_command : %d", ret); - this_thread::sleep_for(chrono::milliseconds(50)); - bt_retry++; - } else { - break; - } - } - if (max_retry == bt_retry) { - LOGE("[Recorder ERROR] Fail to start bt audio"); - return; - } - - g_bt_extend_count = 0; - } -#ifdef BUF_SAVE_MODE - if (g_pFile) { - fclose(g_pFile); - g_pFile = NULL; - } else { - LOGD("[Recorder Info] File not found!"); - } - - while (1) { - snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/dependency_tv_%s_%d_%d", g_audio_source_type, getpid(), g_count); - int ret = access(g_temp_file_name, 0); - - if (0 == ret) { - LOGD("[Recorder ERROR] File is already exist"); - if (0 == remove(g_temp_file_name)) { - LOGD("[Recorder] Remove file"); - break; - } else { - g_count++; - } - } else { - break; - } - } - - LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name); - - /* open test file */ - g_pFile = fopen(g_temp_file_name, "wb+x"); - if (!g_pFile) { - LOGD("[Recorder ERROR] File not found!"); - return; - } - g_count++; -#endif -} - -void dependency_tv_audio_stop_recording() -{ -} - -void dependency_tv_audio_set_recording_session(unsigned int session) -{ - LOGD("Current recording session : [%s]", - (RECORDING_SESSION_WAKE_WORD == session) ? "wake word detecting" : - (RECORDING_SESSION_UTTERANCE == session) ? "utterance recording" : - (RECORDING_SESSION_FOLLOW_UP == session) ? "follow-up speech recording" : - "ERROR - Invalid recording session information" - ); -} - -void dependency_tv_audio_set_background_volume(double ratio) -{ - int ret; - - if (ratio >= 0.5) { - if (g_virtual_sound_stream) { - ret = sound_manager_stop_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to stop virtual stream, ret(%d)", ret); - } - ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret); - return; - } - g_virtual_sound_stream = NULL; - } - - if (g_volume_stream) { - ret = sound_manager_destroy_stream_information(g_volume_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret); - return; - } - g_volume_stream = NULL; - } - } else { - if (!g_volume_stream) { - ret = sound_manager_create_stream_information_internal(SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_volume_stream); - if (0 != ret) { - LOGD("[Audio] Fail to create stream information, ret(%d)", ret); - return; - } - } - - if (!g_virtual_sound_stream) { - ret = sound_manager_create_virtual_stream(g_volume_stream, &g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to create virtual stream, ret(%d)", ret); - return; - } - } - if (g_virtual_sound_stream) { - ret = sound_manager_start_virtual_stream(g_virtual_sound_stream); - if (0 != ret) { - LOGD("[Audio ERROR] Fail to start virtual stream, ret(%d)", ret); - return; - } - } - } -} - -void dependency_tv_audio_voice_key_pressed_set(bool pressed) -{ - LOGE("ENTER : %d", pressed); - if (true == g_voice_key_pressed && false == pressed) { - bt_hid_rc_stop_sending_voice(NULL); - } - - if (pressed != g_voice_key_pressed) { - if (pressed) { - set_audio_source_type(VC_AUDIO_ID_BLUETOOTH); - dependency_tv_audio_set_background_volume(0.3); - } else { - dependency_tv_audio_set_background_volume(1.0); - } - } - - g_voice_key_pressed = pressed; - LOGE("EXIT : %d", g_voice_key_pressed); -} - -void dependency_tv_audio_get_audio_format(int* rate, int* channel, int* audio_type) -{ - if (!audio_type || !rate || !channel) { - return; - } - *rate = 16000; - *channel = 0; - *audio_type = 0; -} - -void dependency_tv_audio_get_audio_source_type(char** type) -{ - if (!type) { - return; - } - *type = g_audio_source_type; -} - diff --git a/plugins/wakeup-manager/dependency-tv/src/dependency_tv_button.cpp b/plugins/wakeup-manager/dependency-tv/src/dependency_tv_button.cpp deleted file mode 100644 index 350d2fd..0000000 --- a/plugins/wakeup-manager/dependency-tv/src/dependency_tv_button.cpp +++ /dev/null @@ -1,142 +0,0 @@ -#include "dependency_tv.h" -#include "dependency_tv_button.h" -#include "dependency_tv_audio.h" - -#include - -#include - -static mas_proxy_interface g_proxy_interface; - -#define EFL_BETA_API_SUPPORT - -#include -#include -#include - -static Ecore_Event_Handler* _key_down_handler = NULL; -static Ecore_Event_Handler* _key_up_handler = NULL; - -static long get_current_milliseconds_after_epoch() -{ - auto now = std::chrono::system_clock::now(); - auto now_ms = std::chrono::time_point_cast(now); - /* number of milliseconds since the epoch of system_clock */ - auto value = now_ms.time_since_epoch(); - - return value.count(); -} - -static Eina_Bool _key_down_cb(void* data, int type, void* event) -{ - Ecore_Event_Key *ev = (Ecore_Event_Key *) event; - if (ev) { - LOGE("KEY[%s], typep[%d]", ev->keyname, type); - - if (ev->keyname && strncmp(ev->keyname, KEY_BT_VOICE, strlen(KEY_BT_VOICE)) == 0 ) { - dependency_tv_audio_voice_key_pressed_set(true); - if (g_proxy_interface.process_event) { - g_proxy_interface.process_event(MA_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0); - } - } - } - - return ECORE_CALLBACK_DONE; -} - -static Eina_Bool _key_up_cb(void* data, int type, void* event) -{ - Ecore_Event_Key *ev = (Ecore_Event_Key *) event; - if (ev) { - LOGE("KEY[%s], typep[%d]", ev->keyname, type); - - if (ev->keyname && strncmp(ev->keyname, KEY_BT_VOICE, strlen(KEY_BT_VOICE)) == 0) { - dependency_tv_audio_voice_key_pressed_set(false); - long key_up_time = get_current_milliseconds_after_epoch(); - ma_plugin_event_e event = MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH; - if (g_proxy_interface.process_event) { - g_proxy_interface.process_event(event, NULL, 0); - } - } - } - return ECORE_CALLBACK_DONE; -} - -static bool _grab_voice_key(void) -{ - Eina_Bool bRet = true; - bRet = ecore_wl2_window_keygrab_set(NULL, KEY_BT_VOICE, 0, 0, 0, ECORE_WL2_WINDOW_KEYGRAB_SHARED); - LOGD("ecore_wl2_window_keygrab_set ret[%d] [%s]", bRet, KEY_BT_VOICE); - return bRet; -} - -static bool _ungrab_voice_key(void) -{ - Eina_Bool bRet = true; - bRet = ecore_wl2_window_keygrab_unset(NULL, KEY_BT_VOICE, 0, 0); - LOGD("ecore_wl2_window_keygrab_unset ret[%d] [%s]", bRet, KEY_BT_VOICE); - return bRet; -} - -static bool _add_key_cb() -{ - if (_key_down_handler == NULL) - { - LOGE("_key_down_handler"); - _key_down_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL); - if(_key_down_handler == NULL) - { - LOGE("_key_down_handler == NULL "); - } - } - - if (_key_up_handler == NULL) - { - LOGE("_key_down_handler"); - _key_up_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, NULL); - if(_key_up_handler == NULL) - { - LOGE("_key_up_handler == NULL "); - } - } - return true; -} - -static bool _delete_key_cb(void) -{ - LOGE("start"); - if (_key_down_handler != NULL) - { - ecore_event_handler_del(_key_down_handler); - _key_down_handler = NULL; - } - - if (_key_up_handler != NULL) - { - ecore_event_handler_del(_key_up_handler); - _key_up_handler = NULL; - } - LOGE("end"); - return true; -} - -void dependency_tv_button_initialize(mas_proxy_interface interface) -{ - g_proxy_interface = interface; - Ecore_Wl2_Display *_ecore_wl2_display = NULL; - - Eina_Bool bRet = ecore_wl2_init(); - LOGD("ecore_wl2_init: %d", bRet); - - _ecore_wl2_display = ecore_wl2_display_connect(NULL); - LOGD("_ecore_wl2_display: %p", _ecore_wl2_display); - - _grab_voice_key(); - _add_key_cb(); -} - -void dependency_tv_button_deinitialize() -{ - _delete_key_cb(); - _ungrab_voice_key(); -} diff --git a/plugins/wakeup-manager/inc/dependency_resolver.h b/plugins/wakeup-manager/inc/dependency_resolver.h deleted file mode 100644 index b1ed068..0000000 --- a/plugins/wakeup-manager/inc/dependency_resolver.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _DEPENDENCY_RESOLVER_H_ -#define _DEPENDENCY_RESOLVER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*mas_dependency_error_cb)(int error, const char* err_msg, void* user_data); - -typedef int (*mas_proxy_process_event)(int event, void* data, int len); -typedef int (*mas_proxy_feed_audio_data)(wakeup_speech_streaming_event_e event, void* buffer, int len); - -typedef struct { - mas_proxy_process_event process_event; - mas_proxy_feed_audio_data feed_audio_data; -} mas_proxy_interface; - -int dependency_resolver_initialize(mas_proxy_interface interface); -int dependency_resolver_deinitialize(void); -int dependency_resolver_set_error_callback(mas_dependency_error_cb callback, void* user_data); -int dependency_resolver_start_recording(); -int dependency_resolver_stop_recording(); -int dependency_resolver_set_recording_session(unsigned int); -int dependency_resolver_set_background_volume(double ratio); -int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type); -int dependency_resolver_get_audio_source_type(char** type); - -/************************************************************************************** - *** Definitions for dependencies - *************************************************************************************/ -#define MAS_DEPENDENCY_DEFAULT_PATH tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/") -#ifdef TV_PRODUCT -#define MAS_DEPENDENCY_DEFAULT_FILENAME "libma-dependency-tv.so" -#else -#define MAS_DEPENDENCY_DEFAULT_FILENAME "libma-dependency-default.so" -#endif -#define MAS_DEPENDENCY_MODULE_PATH "db/multi-assistant/dependency_module_path" - -#define MAS_DEPENDENCY_FUNC_INITIALIZE "mas_dependency_initialize" -typedef int (*mas_dependency_initialize)(mas_proxy_interface interface, int *dependency_version); -#define MAS_DEPENDENCY_FUNC_DEINITIALIZE "mas_dependency_deinitialize" -typedef int (*mas_dependency_deinitialize)(void); -#define MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK "mas_dependency_set_error_callback" -typedef int (*mas_dependency_set_error_callback)(mas_dependency_error_cb callback, void* user_data); -#define MAS_DEPENDENCY_FUNC_START_RECORDING "mas_dependency_start_recording" -typedef int (*mas_dependency_start_recording)(void); -#define MAS_DEPENDENCY_FUNC_STOP_RECORDING "mas_dependency_stop_recording" -typedef int (*mas_dependency_stop_recording)(void); -#define MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION "mas_dependency_set_recording_session" -typedef int (*mas_dependency_set_recording_session)(unsigned int); -#define MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME "mas_dependency_set_background_volume" -typedef int (*mas_dependency_set_background_volume)(double ratio); -#define MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT "mas_dependency_get_audio_format" -typedef int (*mas_dependency_get_audio_format)(int* rate, int* channel, int* audio_type); -#define MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE "mas_dependency_get_audio_source_type" -typedef int (*mas_dependency_get_audio_source_type)(char** type); - -typedef struct { - mas_dependency_initialize initialize; - mas_dependency_deinitialize deinitialize; - mas_dependency_set_error_callback set_error_callback; - mas_dependency_start_recording start_recording; - mas_dependency_stop_recording stop_recording; - mas_dependency_set_recording_session set_recording_session; - mas_dependency_set_background_volume set_background_volume; - mas_dependency_get_audio_format get_audio_format; - mas_dependency_get_audio_source_type get_audio_source_type; -} mas_dependency; - -#ifdef __cplusplus -} -#endif - -#endif /* _DEPENDENCY_RESOLVER_H_ */ diff --git a/plugins/wakeup-manager/inc/heap_tracer.h b/plugins/wakeup-manager/inc/heap_tracer.h deleted file mode 100644 index fc7df29..0000000 --- a/plugins/wakeup-manager/inc/heap_tracer.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __HEAP_TRACER_H__ -#define __HEAP_TRACER_H__ - -#include -#include -#include -#include -#include - -#ifndef __MODULE__ -#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) -#endif - -#define vm_calloc_simple(nmemb, size) vm_calloc(nmemb, size, "%s: %s(%d)", __MODULE__, __func__, __LINE__) -#define vm_malloc_simple(size) vm_malloc(size, "%s: %s(%d)", __MODULE__, __func__, __LINE__) -#define vm_free_simple(ptr) vm_free(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__) -#define vm_strdup_simple(ptr) vm_strdup(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__) -#define vm_mark_unmanaged_simple(ptr) vm_mark_unmanaged(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__) - -void *vm_calloc(size_t nmemb, size_t size, const char *fmt, ...); -void *vm_malloc(size_t size, const char *fmt, ...); -void vm_free(void *ptr, const char *fmt, ...); -char *vm_strdup(const char *s, const char *fmt, ...); -void *vm_mark_unmanaged(void *ptr, const char *fmt, ...); - -class HeapTracer { -public: - HeapTracer(); - virtual ~HeapTracer(); - - bool Insert(void *ptr, std::string description, size_t size = 0); - bool Delete(void *ptr, std::string description); - std::string Find(void *ptr); - - void MarkUnmanaged(void *ptr, std::string description); - - bool Empty(); - void Trace(); -protected: - typedef struct { - void *ptr{nullptr}; - std::string description; - int size{0}; - } AllocationEntry; - - std::mutex mManagedTableMutex; - std::unordered_map mManagedTable; - - std::mutex mUnmanagedRecordsMutex; - std::list mUnmanagedRecords; - size_t mUnmanagedRecordsSize{0}; - - enum class EntryOperation { - INSERT, - DELETE, - }; - typedef struct { - AllocationEntry entry; - EntryOperation operation; - struct timespec ts; - } EntryHistory; - std::list mEntryHistory; -}; - -#endif /* __HEAP_TRACER_H__ */ \ No newline at end of file diff --git a/plugins/wakeup-manager/inc/wakeup_audio_manager.h b/plugins/wakeup-manager/inc/wakeup_audio_manager.h deleted file mode 100644 index 966e77a..0000000 --- a/plugins/wakeup-manager/inc/wakeup_audio_manager.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _WAKEUP_AUDIO_MANAGER_H_ -#define _WAKEUP_AUDIO_MANAGER_H_ - -#include "wakeup_interfaces.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -using namespace std; - -class IAudioEventObserver -{ -public: - virtual ~IAudioEventObserver() = default; - virtual bool on_recording_audio_data(long time, void* data, int len) = 0; - virtual bool on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) = 0; -}; - -typedef enum -{ - RECORDING_SESSION_WAKE_WORD, - RECORDING_SESSION_UTTERANCE, - RECORDING_SESSION_FOLLOW_UP, -} recording_session; - -class CAudioManager -{ -public: - CAudioManager(); - CAudioManager(IAudioEventObserver *observer); - ~CAudioManager(); - - CAudioManager(const CAudioManager&) = delete; - CAudioManager& operator=(const CAudioManager&) = delete; - - int initialize(); - int deinitialize(); - - void sound_focus_changed(); - - void subscribe(IAudioEventObserver *observer); - void unsubscribe(IAudioEventObserver *observer); - - void start_recording(bool proactive); - void stop_recording(bool proactive); - - void set_recording_session(recording_session session); - - void feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len); - void finalize_audio_data(); - void clear_audio_data(); - - void start_streaming_current_utterance_data(long start_time = 0); - void stop_streaming_current_utterance_data(); - - void start_streaming_previous_utterance_data(); - void stop_streaming_previous_utterance_data(); - - void start_streaming_follow_up_data(); - void stop_streaming_follow_up_data(); - - void set_background_volume(double ratio); -private: - void add_audio_data(wakeup_speech_data& data, long time); - void notify_audio_data_recording(long time, void* data, int len); - - void streaming_previous_audio_data_thread_func(); - void streaming_audio_data_thread_func(long start_time); - - int mSoundFocusWatchId{0}; - bool mRecordingRequired{false}; - bool mIsRecording{false}; - - vector mObservers; - - thread mStreamingThread; - atomic_bool mStopStreamingThread{false}; - - thread mStreamingPreviousThread; - atomic_bool mStopStreamingPreviousThread{false}; - - static constexpr long mAudioRecordingDurationMilliseconds = 10 * 1000; - typedef struct { - long time; - wakeup_speech_data data; - } wakeup_speech_data_with_time; - vector mPreviousAudioData; - list mAudioData; - - mutex mMutex; - bool mVoiceKeyPressed{false}; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_AUDIO_MANAGER_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_engine_manager.h b/plugins/wakeup-manager/inc/wakeup_engine_manager.h deleted file mode 100644 index 4e24631..0000000 --- a/plugins/wakeup-manager/inc/wakeup_engine_manager.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WAKEUP_ENGINE_MANAGER_H_ -#define _WAKEUP_ENGINE_MANAGER_H_ - -#include "wakeup_manager_wrapper.h" - -#include - -#include -#include -#include -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -using namespace std; - -/************************************************************************************** - *** Definitions for wakeup engine interface - *************************************************************************************/ -#define MA_WAKEUP_ENGINE_PATH tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/engines") -/* Need to check whether this dedicated engine path also needs to be configurable */ -#define MA_WAKEUP_DEDICATED_ENGINE_PATH "shared/lib/libwakeup-engine.so" - -/* Interfaces without version information */ -#define MA_WAKEUP_ENGINE_FUNC_INITIALIZE "wakeup_engine_initialize" -typedef int (*wakeup_engine_initialize)(void); -#define MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE "wakeup_engine_deinitialize" -typedef int (*wakeup_engine_deinitialize)(void); -#define MA_WAKEUP_ENGINE_FUNC_ACTIVATE "wakeup_engine_activate" -typedef int (*wakeup_engine_activate)(void); -#define MA_WAKEUP_ENGINE_FUNC_DEACTIVATE "wakeup_engine_deactivate" -typedef int (*wakeup_engine_deactivate)(void); -#define MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD "wakeup_engine_add_wakeup_word" -typedef int (*wakeup_engine_add_wakeup_word)(const char* appid, const char* wakeup_word, const char* language); -#define MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE "wakeup_engine_add_language" -typedef int (*wakeup_engine_add_language)(const char* appid, const char* language); -#define MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE "wakeup_engine_set_language" -typedef int (*wakeup_engine_set_language)(const char* language); -#define MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE "wakeup_engine_update_manager_state" -typedef int (*wakeup_engine_update_manager_state)(wakeup_manager_state_e state); -#define MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_engine_update_recognition_result" -typedef int (*wakeup_engine_update_recognition_result)(const char* appid, int result); -#define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT "wakeup_engine_set_audio_format" -typedef int (*wakeup_engine_set_audio_format)(int rate, int channel, int audio_type); -#define MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT "wakeup_engine_get_audio_format" -typedef int (*wakeup_engine_get_audio_format)(int* rate, int* channel, int* audio_type); -#define MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA "wakeup_engine_feed_audio_data" -typedef int (*wakeup_engine_feed_audio_data)(long time, void* data, int len); -#define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT "wakeup_engine_get_utterance_data_count" -typedef int (*wakeup_engine_get_utterance_data_count)(void); -#define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA "wakeup_engine_get_utterance_data" -typedef int (*wakeup_engine_get_utterance_data)(int index, wakeup_speech_data *data); -#define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT "wakeup_engine_get_wake_word_data_count" -typedef int (*wakeup_engine_get_wake_word_data_count)(void); -#define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA "wakeup_engine_get_wake_word_data" -typedef int (*wakeup_engine_get_wake_word_data)(int index, wakeup_speech_data *data); -#define MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND "wakeup_engine_set_assistant_specific_command" -typedef int (*wakeup_engine_set_assistant_specific_command)(const char* appid, const char* command); -#define MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "wakeup_engine_set_wake_word_audio_require_flag" -typedef int (*wakeup_engine_set_wake_word_audio_require_flag)(bool require); -#define MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK "wakeup_engine_set_wakeup_event_callback" -typedef int (*wakeup_engine_set_wakeup_event_callback)(wakeup_service_wakeup_event_cb callback, void* user_data); -#define MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_engine_set_speech_status_callback" -typedef int (*wakeup_engine_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data); -#define MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK "wakeup_engine_set_error_callback" -typedef int (*wakeup_engine_set_error_callback)(wakeup_service_error_cb callback, void* user_data); -#define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK "wakeup_engine_set_audio_data_require_status_callback" -typedef int (*wakeup_engine_set_audio_data_require_status_callback)(wakeup_service_audio_data_require_status_cb callback, void* user_data); - -/* Interfaces after version 1 */ -#define MA_WAKEUP_ENGINE_FUNC_GET_VERSION "wakeup_engine_get_version" -typedef int (*wakeup_engine_get_version)(int* version); - -typedef struct { - wakeup_engine_initialize initialize; - wakeup_engine_deinitialize deinitialize; - wakeup_engine_activate activate; - wakeup_engine_deactivate deactivate; - wakeup_engine_add_wakeup_word add_wakeup_word; - wakeup_engine_add_language add_language; - wakeup_engine_set_language set_language; - wakeup_engine_update_manager_state update_manager_state; - wakeup_engine_update_recognition_result update_recognition_result; - wakeup_engine_set_audio_format set_audio_format; - wakeup_engine_get_audio_format get_audio_format; - wakeup_engine_feed_audio_data feed_audio_data; - wakeup_engine_get_utterance_data_count get_utterance_data_count; - wakeup_engine_get_utterance_data get_utterance_data; - wakeup_engine_get_wake_word_data_count get_wake_word_data_count; - wakeup_engine_get_wake_word_data get_wake_word_data; - wakeup_engine_get_version get_version; - wakeup_engine_set_assistant_specific_command set_assistant_specific_command; - wakeup_engine_set_wake_word_audio_require_flag set_wake_word_audio_require_flag; - wakeup_engine_set_wakeup_event_callback set_wakeup_event_callback; - wakeup_engine_set_speech_status_callback set_speech_status_callback; - wakeup_engine_set_error_callback set_error_callback; - wakeup_engine_set_audio_data_require_status_callback set_audio_data_require_status_callback; -} wakeup_engine_interface; - -class IEngineEventObserver -{ -public: - virtual ~IEngineEventObserver() = default; - virtual bool on_wakeup_event(string engine_name, wakeup_event_info wakeup_info) = 0; - virtual bool on_speech_status(string engine_name, wakeup_service_speech_status_e status) = 0; - virtual bool on_error(string engine_name, int error_code, string error_message) = 0; - virtual bool on_audio_data_require_status(string engine_name, bool require) = 0; - - virtual bool on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) = 0; - virtual bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0; -}; - -class CWakeupEngineManager -{ -public: - CWakeupEngineManager(); - CWakeupEngineManager(IEngineEventObserver *observer); - virtual ~CWakeupEngineManager(); - - CWakeupEngineManager(const CWakeupEngineManager&) = delete; - CWakeupEngineManager& operator=(const CWakeupEngineManager&) = delete; - - void initialize(); - void deinitialize(); - - void subscribe(IEngineEventObserver *observer); - void unsubscribe(IEngineEventObserver *observer); - - bool get_audio_data_required(); - void set_selected_wakeup_info(wakeup_event_info wakeup_info); - - bool set_language(string language); - void set_assistant_activated(string appid, bool activated); - void set_wake_word_audio_require_flag(bool require); - - void start_streaming_current_utterance_data(); - void stop_streaming_current_utterance_data(); - - void update_manager_state(wakeup_manager_state_e state); - void update_recognition_result(string appid, int result); - - void engine_add_target_assistant(string engine_name, string appid); - void engine_add_wakeup_word(string appid, string wakeup_word, string language); - void engine_set_assistant_specific_command(string appid, string command); - void engine_feed_audio_data(long time, void* data, int len); - - bool on_wakeup_event(string engine_name, wakeup_event_info wakeup_info); - bool on_speech_status(string engine_name, wakeup_service_speech_status_e status); - bool on_error(string engine_name, int error_code, string error_message); - bool on_audio_data_require_status(string engine_name, bool require); -private: - typedef struct { - int version; - string engine_name; - bool activated{false}; - bool audio_data_require_status{false}; - string engine_path; - wakeup_engine_interface interface{nullptr, }; - vector assistant_list; - set activated_assistants; - void *engine_handle{nullptr}; - } EngineInfo; - - void add_engine_directory(string name, string path); - void add_engine(string name, string path); - - vector mObservers; - - void streaming_speech_data_thread_func(); - - vector mEngineInfo; - const EngineInfo* mSelectedEngine{nullptr}; - bool mAudioDataRequired{false}; - - thread mStreamingThread; - atomic_bool mStopStreamingThread{false}; - - bool mWakeWordAudioRequired{false}; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_ENGINE_MANAGER_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_interfaces.h b/plugins/wakeup-manager/inc/wakeup_interfaces.h deleted file mode 100644 index 6d12de9..0000000 --- a/plugins/wakeup-manager/inc/wakeup_interfaces.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WAKEUP_INTERFACES_H_ -#define _WAKEUP_INTERFACES_H_ - -typedef struct { - const char *wakeup_appid; - const char *wakeup_word; - const char *wakeup_language; - const char *wakeup_voice_id; - const char *wakeup_engine; - float wakeup_confidence_score; - - long wakeup_start_time; - long wakeup_end_time; - bool wakeup_time_valid; - - const void *extra_data; - int extra_data_length; - const char *extra_data_description; -} wakeup_event_info; - -typedef enum { - WAKEUP_SPEECH_STREAMING_EVENT_FAIL = -1, /**< Failed */ - WAKEUP_SPEECH_STREAMING_EVENT_START = 1, /**< Start event */ - WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE = 2, /**< Continue event */ - WAKEUP_SPEECH_STREAMING_EVENT_FINISH = 3 /**< Finish event */ -} wakeup_speech_streaming_event_e; - -typedef struct { - wakeup_speech_streaming_event_e event; - void* buffer; - int len; -} wakeup_speech_data; - -#endif /* _WAKEUP_INTERFACES_H_ */ \ No newline at end of file diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h deleted file mode 100644 index 645bcfc..0000000 --- a/plugins/wakeup-manager/inc/wakeup_manager.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _WAKEUP_MANAGER_H_ -#define _WAKEUP_MANAGER_H_ - -#include "wakeup_manager_wrapper.h" -#include "wakeup_settings.h" -#include "wakeup_engine_manager.h" -#include "wakeup_audio_manager.h" -#include "wakeup_policy_default.h" - -#include "multi_assistant_common.h" - -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -using namespace std; - -enum class STREAMING_MODE { - NONE, - UTTERANCE, - PREVIOUS_UTTERANCE, - FOLLOW_UP, -}; - -class IWakeupEventObserver { -public: - virtual ~IWakeupEventObserver() = default; - virtual void on_wakeup(wakeup_event_info wakeup_info) = 0; - virtual void on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) = 0; - virtual void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0; -}; - -/* If a wakeup event is raised by pressing a voice key, - the wakeup_engine attribute of wakeup_event_info will have the following value */ -#define WAKEUP_ENGINE_VOICE_KEY "voice_key" - -class CWakeupManager -{ -public: - CWakeupManager(IWakeupEventObserver *observer); - virtual ~CWakeupManager(); - - CWakeupManager(const CWakeupManager&) = delete; - CWakeupManager& operator=(const CWakeupManager&) = delete; - - bool initialize(); - bool deinitialize(); - - void subscribe(IWakeupEventObserver *observer); - void unsubscribe(IWakeupEventObserver *observer); - - bool activate(); - bool deactivate(); - - bool add_assistant_language(string appid, string language); - bool add_assistant_wakeup_word(string appid, string wakeup_word, string language); - bool set_assistant_wakeup_engine(string appid, string engine); - - bool update_voice_feedback_state(string appid, bool state); - bool send_assistant_specific_command(string appid, string command); - bool set_background_volume(string appid, double ratio); - bool update_recognition_result(string appid, int result); - bool process_event(ma_plugin_event_e event, void* data, int len); - bool get_audio_format(int* rate, int* channel, int* audio_type); - bool get_audio_source_type(char** type); - bool set_language(string language); - bool get_voice_key_pressed(); - bool set_wake_word_audio_require_flag(bool require); - - STREAMING_MODE get_streaming_mode(); - bool set_streaming_mode(STREAMING_MODE mode); - - bool start_streaming_utterance_data(); - bool stop_streaming_utterance_data(); - bool start_streaming_follow_up_data(); - bool stop_streaming_follow_up_data(); - bool start_streaming_previous_utterance_data(); - bool stop_streaming_previous_utterance_data(); - - CWakeupPolicy* get_wakeup_policy(); - CWakeupEngineManager* get_engine_manager(); - CAudioManager* get_audio_manager(); - CWakeupSettings* get_wakeup_settings(); - - vector get_observers(); - void set_last_wakeup_event_info(wakeup_event_info wakeup_info); - - bool change_manager_state(wakeup_manager_state_e state); - wakeup_manager_state_e get_manager_state(); - - void feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len); -private: - class CEngineEventObserver : public IEngineEventObserver - { - public: - bool on_wakeup_event(string engine_name, wakeup_event_info wakeup_info) override; - bool on_speech_status(string engine_name, wakeup_service_speech_status_e status) override; - bool on_error(string engine_name, int error_code, string error_message) override; - bool on_audio_data_require_status(string engine_name, bool require) override; - - bool on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) override; - bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override; - - void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; } - private: - CWakeupManager *mWakeupManager{nullptr}; - }; - - class CPolicyEventObserver : public IPolicyEventObserver - { - public: - void on_wakeup(wakeup_event_info wakeup_info) override; - - void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; } - private: - CWakeupManager *mWakeupManager{nullptr}; - }; - - class CAudioEventObserver : public IAudioEventObserver - { - public: - bool on_recording_audio_data(long time, void* data, int len) override; - bool on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) override; - - void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; } - void set_wakeup_engine_manager(CWakeupEngineManager *manager) { mEngineManager = manager; } - private: - CWakeupManager *mWakeupManager{nullptr}; - CWakeupEngineManager *mEngineManager{nullptr}; - }; - - class CSettingsEventObserver : public ISettingsEventObserver - { - public: - bool on_voice_input_language_changed(const char* language) override; - - void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; } - private: - CWakeupManager *mWakeupManager{nullptr}; - }; - - void initialize_wakeup_policy(); - - typedef struct { - string appid; - vector languageList; - } AssistantLanguageInfo; - vector mAssistantLanguageInfo; - map mAssistantActivated; - - vector mObservers; - - unique_ptr mWakeupPolicy; - - CAudioManager mAudioManager; - CWakeupEngineManager mWakeupEngineManager; - CWakeupSettings mWakeupSettings; - - CAudioEventObserver mAudioEventObserver; - CEngineEventObserver mEngineEventObserver; - CPolicyEventObserver mPolicyEventObserver; - CSettingsEventObserver mSettingsEventObserver; - - thread mEngineDataThread; - atomic_bool mStopEngineDataThread{false}; - - bool mVoiceKeyPressed{false}; - string mCurrentLanguage; - - STREAMING_MODE mStreamingMode{STREAMING_MODE::NONE}; - Ecore_Timer* mStreamingDurationTimer{nullptr}; - - wakeup_manager_state_e mWakeupManagerState{WAKEUP_MANAGER_STATE_INACTIVE}; - - wakeup_event_info mLastWakeupEventInfo; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_MANAGER_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_manager_main.h b/plugins/wakeup-manager/inc/wakeup_manager_main.h deleted file mode 100644 index 80ce706..0000000 --- a/plugins/wakeup-manager/inc/wakeup_manager_main.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __MUTLI_WAKEUP_MAIN_H__ -#define __MUTLI_WAKEUP_MAIN_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "wakeup-manager" - -#ifdef __MODULE__ -#undef __MODULE__ -#endif -#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) - -#define MWR_SECURE_LOG_(id, prio, tag, fmt, arg...) \ - ({ do { \ - __dlog_print(id, prio, tag, "%s: %s(%d) > [SECURE_LOG] " fmt, __MODULE__, __func__, __LINE__, ##arg); \ - } while (0); }) - -#define MWR_LOG_(prio, tag, fmt, arg...) \ - ({ do { \ - dlog_print(prio, tag, "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg); \ - } while (0); }) - -#define MWR_LOGD(fmt, args...) MWR_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args) -#define MWR_LOGI(fmt, args...) MWR_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args) -#define MWR_LOGW(fmt, args...) MWR_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args) -#define MWR_LOGE(fmt, args...) MWR_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args) - -#define MWR_SLOGD(fmt, args...) MWR_SECURE_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args) -#define MWR_SLOGI(fmt, args...) MWR_SECURE_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args) -#define MWR_SLOGW(fmt, args...) MWR_SECURE_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args) -#define MWR_SLOGE(fmt, args...) MWR_SECURE_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args) - -#ifdef __cplusplus -} -#endif - -#endif /* __MUTLI_WAKEUP_MAIN_H__ */ diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h deleted file mode 100644 index a5acc99..0000000 --- a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _WAKEUP_MANAGER_WRAPPER_H_ -#define _WAKEUP_MANAGER_WRAPPER_H_ - -#include -#include -#include -#include -#include - -#include "wakeup_interfaces.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - WAKEUP_SPEECH_STATUS_NONE = -1, /**< None */ - WAKEUP_SPEECH_STATUS_BEGINNING_POINT_DETECTED = 1, /**< Beginning point of speech is detected */ - WAKEUP_SPEECH_STATUS_END_POINT_DETECTED = 2 /**< End point of speech is detected */ -} wakeup_service_speech_status_e; - -typedef enum { - WAKEUP_MANAGER_STATE_INACTIVE = 0, - WAKEUP_MANAGER_STATE_LISTENING = 1, - WAKEUP_MANAGER_STATE_UTTERANCE = 2, - WAKEUP_MANAGER_STATE_PROCESSING = 3, - WAKEUP_MANAGER_STATE_VOICE_FEEDBACK = 4 -} wakeup_manager_state_e; - -typedef void (*wakeup_service_wakeup_event_cb)(wakeup_event_info wakeup_info, void* user_data); - -typedef void (*wakeup_service_speech_streaming_cb)(wakeup_speech_streaming_event_e event, void* buffer, int len, void *user_data); - -typedef void (*wakeup_service_speech_status_cb)(wakeup_service_speech_status_e status, void *user_data); - -typedef void (*wakeup_service_error_cb)(int error, const char* err_msg, void* user_data); - -typedef void (*wakeup_service_audio_data_require_status_cb)(bool require, void* user_data); - -typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data); - -typedef enum { - MA_PLUGIN_EVENT_VOICE_KEY_PRESSED = 0, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH = MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, - MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP, -} ma_plugin_event_e; - -typedef enum { - MA_SYSTEM_VOLUME_EVENT_CHANGE, - MA_SYSTEM_VOLUME_EVENT_RECOVER -} ma_system_volume_event_e; - -typedef struct { - int plugin_version; - bool ui_panel_enabled; -} ma_plugin_settings; - -EXPORT_API int wakeup_manager_initialize(void); - -EXPORT_API int wakeup_manager_deinitialize(void); - -EXPORT_API int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size); - -EXPORT_API int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language); - -EXPORT_API int wakeup_manager_add_assistant_language(const char* appid, const char* language); - -EXPORT_API int wakeup_manager_set_assistant_wakeup_engine(const char* appid, const char *engine); - -EXPORT_API int wakeup_manager_set_language(const char* language); - -EXPORT_API int wakeup_manager_activate(void); - -EXPORT_API int wakeup_manager_deactivate(void); - -EXPORT_API int wakeup_manager_update_voice_feedback_state(const char *appid, int state); - -EXPORT_API int wakeup_manager_send_assistant_specific_command(const char* appid, const char* command); - -EXPORT_API int wakeup_manager_set_background_volume(const char *appid, double ratio); - -EXPORT_API int wakeup_manager_update_recognition_result(const char *appid, int result); - -EXPORT_API int wakeup_manager_process_event(int event, void* data, int len); - -EXPORT_API int wakeup_manager_start_streaming_utterance_data(void); - -EXPORT_API int wakeup_manager_stop_streaming_utterance_data(void); - -EXPORT_API int wakeup_manager_start_streaming_previous_utterance_data(void); - -EXPORT_API int wakeup_manager_stop_streaming_previous_utterance_data(void); - -EXPORT_API int wakeup_manager_start_streaming_follow_up_data(void); - -EXPORT_API int wakeup_manager_stop_streaming_follow_up_data(void); - -EXPORT_API int wakeup_manager_get_audio_format(int *rate, int *channel, int *audio_type); - -EXPORT_API int wakeup_manager_get_audio_source_type(char** type); - -EXPORT_API int wakeup_manager_set_wake_word_audio_require_flag(bool require); - -EXPORT_API int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data); - -EXPORT_API int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data); - -EXPORT_API int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data); - -EXPORT_API int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data); - -EXPORT_API int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data); - -EXPORT_API int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data); - -EXPORT_API int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data); - -/* Internal API declarations for dependency modules */ - -int wakeup_manager_feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len); - -#ifdef __cplusplus -} -#endif - -#endif /* _WAKEUP_MANAGER_WRAPPER_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_policy.h b/plugins/wakeup-manager/inc/wakeup_policy.h deleted file mode 100644 index d1738ab..0000000 --- a/plugins/wakeup-manager/inc/wakeup_policy.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WAKEUP_POLICY_H_ -#define _WAKEUP_POLICY_H_ - -#include -#include - -#include "wakeup_interfaces.h" - -namespace multiassistant -{ -namespace wakeup -{ - -using namespace std; - -class IPolicyEventObserver -{ -public: - virtual ~IPolicyEventObserver() = default; - virtual void on_wakeup(wakeup_event_info wakeup_info) = 0; -}; - -class CWakeupPolicyImpl; - -class CWakeupPolicy -{ -public: - CWakeupPolicy(); - CWakeupPolicy(IPolicyEventObserver *observer); - virtual ~CWakeupPolicy(); - - CWakeupPolicy(const CWakeupPolicy&) = delete; - CWakeupPolicy& operator=(const CWakeupPolicy&) = delete; - - void subscribe(IPolicyEventObserver *observer); - void unsubscribe(IPolicyEventObserver *observer); - - virtual void wakeup_candidate(wakeup_event_info wakeup_info) = 0; -protected: - unique_ptr mImpl; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_POLICY_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_policy_default.h b/plugins/wakeup-manager/inc/wakeup_policy_default.h deleted file mode 100644 index be20625..0000000 --- a/plugins/wakeup-manager/inc/wakeup_policy_default.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WAKEUP_POLICY_DEFAULT_H_ -#define _WAKEUP_POLICY_DEFAULT_H_ - -#include "wakeup_policy.h" - -#include -#include - -#include - -namespace multiassistant -{ -namespace wakeup -{ - -using namespace std; - -class CWakeupPolicyDefault : public CWakeupPolicy -{ -public: - CWakeupPolicyDefault(); - CWakeupPolicyDefault(IPolicyEventObserver *observer); - ~CWakeupPolicyDefault(); - - void set_assistant_priority(string appid, int priority); - void set_delay(float seconds); - - void wakeup_candidate(wakeup_event_info wakeup_info); - void timer_expired(); -private: - typedef struct { - string appid; - int priority{0}; - } PRIORITY_INFO; - - float mDelaySeconds{0.0f}; - vector mPriorityInfos; - vector mWakeupInfos; - - Ecore_Timer *mTimer{nullptr}; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_POLICY_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_policy_impl.h b/plugins/wakeup-manager/inc/wakeup_policy_impl.h deleted file mode 100644 index 63723f1..0000000 --- a/plugins/wakeup-manager/inc/wakeup_policy_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WAKEUP_POLICY_IMPL_H_ -#define _WAKEUP_POLICY_IMPL_H_ - -#include "wakeup_policy.h" -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -class CWakeupPolicyImpl -{ -public: - CWakeupPolicyImpl() {} - ~CWakeupPolicyImpl() {} - - void subscribe(IPolicyEventObserver *observer); - void unsubscribe(IPolicyEventObserver *observer); - - void wakeup(wakeup_event_info wakeup_info); -private: - vector mObservers; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_POLICY_IMPL_H_ */ diff --git a/plugins/wakeup-manager/inc/wakeup_settings.h b/plugins/wakeup-manager/inc/wakeup_settings.h deleted file mode 100644 index e99c72e..0000000 --- a/plugins/wakeup-manager/inc/wakeup_settings.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WAKEUP_SETTINGS_H_ -#define _WAKEUP_SETTINGS_H_ - -#include -#include -#include - -typedef void (*input_language_changed_cb)(void* data); - -namespace multiassistant -{ -namespace wakeup -{ - -using namespace std; - -#define DEFAULT_ASSISTANT_APPID "org.tizen.voice-app" - -#define WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID "db/multi-assistant/default_assistant_appid" -#define WAKEUP_SETTINGS_KEY_UI_PANEL_ENABLED "db/multi-assistant/ui_panel_enabled" -#define WAKEUP_SETTINGS_KEY_CONVERSATION_TIMEOUT "db/multi-assistant/conversation_timeout" -#define WAKEUP_SETTINGS_KEY_MULTIPLE_MODE "db/multi-assistant/multiple_mode" -#define WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS "db/multi-assistant/enabled_assistants" -#define WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_DELAY "db/multi-assistant/wakeup_policy_delay" -#define WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_PRIORITY "db/multi-assistant/wakeup_policy_priority" -#define WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX "db/multi-assistant/streaming_duration_max" -#define WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE "db/multi-assistant/voice_input_language" - -class ISettingsEventObserver -{ -public: - virtual ~ISettingsEventObserver() = default; - virtual bool on_voice_input_language_changed(const char* language) = 0; -}; - -class CWakeupSettings -{ -public: - CWakeupSettings(); - virtual ~CWakeupSettings(); - - CWakeupSettings(const CWakeupSettings&) = delete; - CWakeupSettings& operator=(const CWakeupSettings&) = delete; - - void initialize(); - void deinitialize(); - - void subscribe(ISettingsEventObserver *observer); - void unsubscribe(ISettingsEventObserver *observer); - vector get_observers(); - - string get_default_assistant_appid(); - bool get_ui_panel_enabled(); - float get_conversation_timeout(); - bool get_multiple_mode(); - vector get_enabled_assistants(); - float get_wakeup_policy_delay(); - vector get_wakeup_policy_priority(); - float get_streaming_duration_max(); - string get_current_language(void); -private: - vector mObservers; - - string mDefaultAssistantAppid{DEFAULT_ASSISTANT_APPID}; - bool mUiPanelEnabled{true}; - float mConversationTimeout{5.0}; - bool mMultipleMode{true}; - vector mEnabledAssistants{DEFAULT_ASSISTANT_APPID}; - float mWakeupPolicyDelay{0.1}; - vector mWakeupPolicyPriority; // No priority by default - float mStreamingDurationMax{10.0}; -}; - -} // wakeup -} // multiassistant - -#endif /* _WAKEUP_SETTINGS_H_ */ diff --git a/plugins/wakeup-manager/src/dependency_resolver.cpp b/plugins/wakeup-manager/src/dependency_resolver.cpp deleted file mode 100644 index 551290e..0000000 --- a/plugins/wakeup-manager/src/dependency_resolver.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "multi_assistant_main.h" -#include "dependency_resolver.h" - -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "dependency-resolver" - -static void *g_handle = NULL; -static mas_dependency g_mas_dependency = { NULL, }; - -int dependency_resolver_initialize(mas_proxy_interface interface) -{ - MAS_LOGD("[Enter]"); - - const int FILEPATH_LEN = 512; - char filepath[FILEPATH_LEN] = {'\0', }; - char *vconf_str = vconf_get_str(MAS_DEPENDENCY_MODULE_PATH); - if (vconf_str) { - snprintf(filepath, FILEPATH_LEN - 1, "%s", vconf_str); - free(vconf_str); - } else { - const char *default_path = MAS_DEPENDENCY_DEFAULT_PATH; - snprintf(filepath, FILEPATH_LEN - 1, "%s/%s", default_path, MAS_DEPENDENCY_DEFAULT_FILENAME); - } - filepath[FILEPATH_LEN - 1] = '\0'; - - char *error; - g_handle = NULL; - g_handle = dlopen(filepath, RTLD_LAZY); - if (NULL != (error = dlerror())) { - MAS_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", filepath, error); - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - g_mas_dependency.initialize = - (mas_dependency_initialize)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_INITIALIZE); - g_mas_dependency.deinitialize = - (mas_dependency_deinitialize)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_DEINITIALIZE); - g_mas_dependency.set_error_callback = - (mas_dependency_set_error_callback)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK); - g_mas_dependency.start_recording = - (mas_dependency_start_recording)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_START_RECORDING); - g_mas_dependency.stop_recording = - (mas_dependency_stop_recording)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_STOP_RECORDING); - g_mas_dependency.set_recording_session = - (mas_dependency_set_recording_session)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION); - g_mas_dependency.set_background_volume = - (mas_dependency_set_background_volume)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME); - g_mas_dependency.get_audio_format = - (mas_dependency_get_audio_format)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT); - g_mas_dependency.get_audio_source_type = - (mas_dependency_get_audio_source_type)dlsym(g_handle, - MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE); - - int ret = -1; - int dependency_version = 0; - if (NULL != g_handle) { - mas_dependency_initialize func = g_mas_dependency.initialize; - - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_INITIALIZE); - } else { - ret = func(interface, &dependency_version); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to initialize, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - MAS_LOGD("g_handle : %p, dependency_version %d", g_handle, dependency_version); - return ret; -} - -int dependency_resolver_deinitialize(void) -{ - MAS_LOGD("g_handle : %p", g_handle); - int ret = -1; - if (NULL != g_handle) { - mas_dependency_deinitialize func = g_mas_dependency.deinitialize; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_DEINITIALIZE); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to deinitialize, ret(%d)", ret); - } - } - - dlclose(g_handle); - g_handle = NULL; - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int dependency_resolver_set_error_callback(mas_dependency_error_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - mas_dependency_set_error_callback func = g_mas_dependency.set_error_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set error callback(%p, %p), ret(%d)", callback, user_data, ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int dependency_resolver_start_recording(void) -{ - int ret = -1; - MAS_LOGD("g_handle : %p", g_handle); - if (NULL != g_handle) { - mas_dependency_start_recording func = g_mas_dependency.start_recording; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_START_RECORDING); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to start recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int dependency_resolver_stop_recording(void) -{ - int ret = -1; - if (NULL != g_handle) { - mas_dependency_stop_recording func = g_mas_dependency.stop_recording; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_STOP_RECORDING); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int dependency_resolver_set_recording_session(unsigned int session) -{ - int ret = -1; - MAS_LOGD("g_handle : %p", g_handle); - if (NULL != g_handle) { - mas_dependency_set_recording_session func = g_mas_dependency.set_recording_session; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION); - } else { - ret = func(session); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set recording session, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int dependency_resolver_set_background_volume(double ratio) -{ - int ret = -1; - if (NULL != g_handle) { - mas_dependency_set_background_volume func = g_mas_dependency.set_background_volume; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME); - } else { - ret = func(ratio); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set background volume to %f, ret(%d)", ratio, ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type) -{ - int ret = -1; - if (NULL != g_handle) { - mas_dependency_get_audio_format func = g_mas_dependency.get_audio_format; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT); - } else { - ret = func(rate, channel, audio_type); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to get audio format, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int dependency_resolver_get_audio_source_type(char** type) -{ - int ret = -1; - if (NULL != g_handle) { - mas_dependency_get_audio_source_type func = g_mas_dependency.get_audio_source_type; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE); - } else { - ret = func(type); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to get audio source type, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} diff --git a/plugins/wakeup-manager/src/heap_tracer.cpp b/plugins/wakeup-manager/src/heap_tracer.cpp deleted file mode 100644 index 317f670..0000000 --- a/plugins/wakeup-manager/src/heap_tracer.cpp +++ /dev/null @@ -1,230 +0,0 @@ -#include "heap_tracer.h" - -#include -#include - -#include - -#ifdef LOG_TAG -#undef LOG_TAG -#endif -#define LOG_TAG "ma_heap_tracer" - -static HeapTracer _tracer; - -const bool RECORD_UNMANAGED_CHUNKS = true; -const int MAX_UNMANAGED_RECORDS = 128; -const bool HEAP_TRACER_LOG_ENABLED = false -; - -#define DESCRIPTION_LENGTH 255 -//#define USE_HEAP_TRACER -//#define RECORD_ALL_HISTORY - -void* vm_calloc(size_t nmemb, size_t size, const char *fmt, ...) -{ - void *ptr = calloc(nmemb, size); -#ifdef USE_HEAP_TRACER - va_list argptr; - va_start(argptr, fmt); - - char description[DESCRIPTION_LENGTH]; - vsnprintf(description, sizeof(description), fmt, argptr); - _tracer.Insert(ptr, description, nmemb * size); - - va_end(argptr); -#endif - return ptr; -} - -void* vm_malloc(size_t size, const char *fmt, ...) -{ - void *ptr = malloc(size); -#ifdef USE_HEAP_TRACER - va_list argptr; - va_start(argptr, fmt); - - char description[DESCRIPTION_LENGTH]; - vsnprintf(description, sizeof(description), fmt, argptr); - _tracer.Insert(ptr, description, size); - - va_end(argptr); -#endif - return ptr; -} - -void vm_free(void *ptr, const char *fmt, ...) -{ - if (ptr) { -#ifdef USE_HEAP_TRACER - va_list argptr; - va_start(argptr, fmt); - - char description[DESCRIPTION_LENGTH]; - vsnprintf(description, sizeof(description), fmt, argptr); - if (false == _tracer.Delete(ptr, description)) { - _tracer.Find(ptr); - } - va_end(argptr); -#endif - free(ptr); - } else { - LOGD("Trying to free a null pointer"); - } -} - -char* vm_strdup(const char *s, const char *fmt, ...) -{ - char *ptr = nullptr; - if (s) { - ptr = strdup(s); -#ifdef USE_HEAP_TRACER - va_list argptr; - va_start(argptr, fmt); - - char description[DESCRIPTION_LENGTH]; - vsnprintf(description, sizeof(description), fmt, argptr); - _tracer.Insert(ptr, description, strlen(s) + 1); - - va_end(argptr); -#endif - } else { - LOGD("Trying to duplicate a null pointer"); - } - return ptr; -} - -void *vm_mark_unmanaged(void *ptr, const char *fmt, ...) -{ -#ifdef USE_HEAP_TRACER - va_list argptr; - va_start(argptr, fmt); - - char description[DESCRIPTION_LENGTH]; - vsnprintf(description, sizeof(description), fmt, argptr); - _tracer.MarkUnmanaged(ptr, description); - - va_end(argptr); -#endif - return ptr; -} - -HeapTracer::HeapTracer() -{ - LOGD("HeapTracer()"); -} - -HeapTracer::~HeapTracer() -{ - LOGD("~HeapTracer()"); - - Trace(); -} - -bool HeapTracer::Insert(void *ptr, std::string description, size_t size) -{ - if (HEAP_TRACER_LOG_ENABLED) { - LOGD("Heap allocated %p [size %zu] : %s", ptr, size, description.c_str()); - } - - AllocationEntry entry; - entry.ptr = ptr; - entry.description = description; - entry.size = size; - - std::lock_guard lock(mManagedTableMutex); - mManagedTable[ptr] = entry; - -#ifdef RECORD_ALL_HISTORY - EntryHistory history; - history.entry = entry; - history.operation = EntryOperation::INSERT; - clock_gettime(CLOCK_REALTIME, &(history.ts)); - mEntryHistory.push_back(history); -#endif - return true; -} - -bool HeapTracer::Delete(void *ptr, std::string description) -{ - if (HEAP_TRACER_LOG_ENABLED) { - LOGD("Heap deallocated %p : %s", ptr, description.c_str()); - } - - std::lock_guard lock(mManagedTableMutex); - if (mManagedTable.find(ptr) != mManagedTable.end()) { -#ifdef RECORD_ALL_HISTORY - EntryHistory history; - history.entry = mManagedTable[ptr]; - history.entry.description = description; - history.operation = EntryOperation::DELETE; - clock_gettime(CLOCK_REALTIME, &(history.ts)); - mEntryHistory.push_back(history); -#endif - mManagedTable.erase(ptr); - } else { - LOGE("Heap Trace Error : Trying to delete an entry that does not exist : %p, %s", - ptr, description.c_str()); - return false; - } - return true; -} - -std::string HeapTracer::Find(void *ptr) -{ - std::lock_guard lock(mManagedTableMutex); -#ifdef RECORD_ALL_HISTORY - for (auto entry : mEntryHistory) { - if (entry.entry.ptr == ptr) { - LOGD("Heap history record for %p : %s, %lld.%.9ld, %s", - ptr, - (entry.operation == EntryOperation::INSERT ? "INSERT" : "DELETE"), - (long long)(entry.ts.tv_sec), entry.ts.tv_nsec, - entry.entry.description.c_str()); - } - } -#endif - if (mManagedTable.find(ptr) != mManagedTable.end()) { - return mManagedTable[ptr].description; - } - return std::string("Not found"); -} - -void HeapTracer::MarkUnmanaged(void *ptr, std::string description) -{ - LOGD("Marking as unmanaged : %p %s", ptr, description.c_str()); - - std::lock_guard lock(mManagedTableMutex); - auto iter = mManagedTable.find(ptr); - if (iter != mManagedTable.end()) { - if (RECORD_UNMANAGED_CHUNKS) { - std::lock_guard lock(mUnmanagedRecordsMutex); - if (mUnmanagedRecordsSize >= MAX_UNMANAGED_RECORDS) { - mUnmanagedRecords.pop_front(); - mUnmanagedRecordsSize--; - } - mUnmanagedRecords.push_back(iter->second); - mUnmanagedRecordsSize++; - } - mManagedTable.erase(ptr); - } else { - LOGE("Heap Trace Error : Trying to mark an entry that does not exist as unmanaged : %p", ptr); - } -} - -bool HeapTracer::Empty() -{ - std::lock_guard lock(mManagedTableMutex); - return mManagedTable.empty(); -} - -void HeapTracer::Trace() -{ - LOGD("Heap Trace Start"); - - std::lock_guard lock(mManagedTableMutex); - for (auto item : mManagedTable) { - LOGD("No dealloc information exists for %p [size %d] : %s", item.first, item.second.size, item.second.description.c_str()); - } - LOGD("Heap Trace End"); -} diff --git a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp deleted file mode 100644 index d7ca9b0..0000000 --- a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp +++ /dev/null @@ -1,441 +0,0 @@ -#include "wakeup_audio_manager.h" -#include "wakeup_manager_main.h" -#include "wakeup_interfaces.h" -#include "dependency_resolver.h" -#include "heap_tracer.h" - -#include - -#include - -namespace multiassistant -{ -namespace wakeup -{ - -/* Need to check whether this value needs to be configurable */ -static int g_speech_pcm_wait_count = 800; - -static long get_current_milliseconds_after_epoch() -{ - auto now = chrono::system_clock::now(); - auto now_ms = chrono::time_point_cast(now); - /* number of milliseconds since the epoch of system_clock */ - auto value = now_ms.time_since_epoch(); - - return value.count(); -} - -CAudioManager::CAudioManager() -{ -} - -CAudioManager::~CAudioManager() -{ -} - -CAudioManager::CAudioManager(IAudioEventObserver *observer) : CAudioManager() -{ - subscribe(observer); -} - -void recording_focus_state_watch_cb(int id, sound_stream_focus_mask_e focus_mask, - sound_stream_focus_state_e focus_state, sound_stream_focus_change_reason_e reason, - const char *extra_info, void *user_data) -{ - MWR_LOGD("[Recorder] focus_mask : %d, focus_state : %d, reason : %d, [%s]", - focus_mask, focus_state, reason, extra_info); - - if (nullptr == user_data) return; - - /* The API description states that calling sound_manager_get_current_recording_focus() - function inside sound_stream_focus_state_watch_cb() function is prohibited */ - ecore_main_loop_thread_safe_call_async( - [](void* data) { - CAudioManager *manager = static_cast(data); - if (manager) { - manager->sound_focus_changed(); - } - }, user_data); -} - -int CAudioManager::initialize(void) -{ - sound_manager_add_focus_state_watch_cb(SOUND_STREAM_FOCUS_FOR_RECORDING, - recording_focus_state_watch_cb, this, &mSoundFocusWatchId); - return 0; -} - -int CAudioManager::deinitialize(void) -{ - sound_manager_remove_focus_state_watch_cb(mSoundFocusWatchId); - - return 0; -} - -void CAudioManager::sound_focus_changed() -{ - sound_stream_focus_change_reason_e acquired_by; - int sound_behavior; - char* extra_info; - int focus = sound_manager_get_current_recording_focus(&acquired_by, &sound_behavior, &extra_info); - MWR_LOGD("[Recorder] sound focus has changed : %d %d %d %s", focus, - (SOUND_MANAGER_ERROR_NO_DATA != focus ? acquired_by : -1), - (SOUND_MANAGER_ERROR_NO_DATA != focus ? sound_behavior : -1), - (SOUND_MANAGER_ERROR_NO_DATA != focus ? extra_info : "")); - if (SOUND_MANAGER_ERROR_NO_DATA == focus) { - if (mRecordingRequired && !mIsRecording) { - MWR_LOGD("[Recorder] Currently no other process has acquired sound focus, start recording"); - start_recording(false); - } - } else { - if (mIsRecording) { - MWR_LOGW("[Recorder] Sound focus acquired by other process, stop recording"); - stop_recording(false); - } - } - if (extra_info) { - free (extra_info); - extra_info = NULL; - } -} - -void CAudioManager::subscribe(IAudioEventObserver *observer) -{ - mObservers.push_back(observer); -} - -void CAudioManager::unsubscribe(IAudioEventObserver *observer) -{ - auto iter = find(mObservers.begin(), mObservers.end(), observer); - if (iter != mObservers.end()) { - mObservers.erase(iter); - } -} - -void CAudioManager::stop_recording(bool proactive) -{ - dependency_resolver_stop_recording(); - if (proactive) { - mRecordingRequired = false; - } - mIsRecording = false; -} - -void CAudioManager::start_recording(bool proactive) -{ - if (mIsRecording) { - stop_recording(false); - } - if (proactive) { - mRecordingRequired = true; - } - - sound_stream_focus_change_reason_e acquired_by; - int sound_behavior; - char* extra_info; - if (SOUND_MANAGER_ERROR_NO_DATA == sound_manager_get_current_recording_focus(&acquired_by, &sound_behavior, &extra_info)) { - MWR_LOGD("[Recorder] Currently no other process has acquired sound focus, start recording"); - dependency_resolver_start_recording(); - mIsRecording = true; - } else { - MWR_LOGW("[Recorder] Currently sound focus is acquired by other process, skip recording"); - } - if (extra_info) { - free (extra_info); - extra_info = NULL; - } -} - -void CAudioManager::set_recording_session(recording_session session) -{ - dependency_resolver_set_recording_session((unsigned int)session); -} - -/* Need to consider adapting conventional producer-consumer model */ -void CAudioManager::streaming_previous_audio_data_thread_func() -{ - MWR_LOGD("[ENTER]"); - - unique_lock lock(mMutex, defer_lock); - - int ret = -1; - int cnt = 0; - - /* get feedback data */ - size_t audio_data_size = 0; - lock.lock(); - audio_data_size = mPreviousAudioData.size(); - for (int index = 0; index < audio_data_size; index++) { - wakeup_speech_data& speech_data = mPreviousAudioData.at(index).data; - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - speech_data.event, speech_data.buffer, speech_data.len)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) { - MWR_LOGI("[INFO] Finish to send previous speech data"); - return; - } - } - - if (mStopStreamingThread.load()) { - MWR_LOGI("[INFO] Stop Streaming Requested, returning"); - return; - } - } - lock.unlock(); - - MWR_LOGD("[EXIT]"); -} - -void CAudioManager::streaming_audio_data_thread_func(long start_time) -{ - MWR_LOGD("[ENTER]"); - - unique_lock lock(mMutex, defer_lock); - - lock.lock(); - auto lead = mAudioData.begin(); - auto iter = lead; - while (lead != mAudioData.end() && lead->time < start_time) { - iter = lead; - advance(lead, 1); - } - MWR_LOGD("data_count : %zu", mAudioData.size()); - lock.unlock(); - - while (!(mStopStreamingThread.load())) { - int ret = -1; - int cnt = 0; - - /* get feedback data */ - lock.lock(); - auto end = mAudioData.end(); - lock.unlock(); - if (lead == end) { - /* empty queue */ - MWR_LOGD("[DEBUG] No feedback data. Waiting mode : %d", ret); - - /* waiting */ - while (!(mStopStreamingThread.load())) { - this_thread::sleep_for(chrono::milliseconds(10)); - lock.lock(); - end = mAudioData.end(); - auto begin = mAudioData.begin(); - lock.unlock(); - if (iter == end) { - iter = begin; - } - lead = iter; - if (lead != end) { - advance(lead, 1); - } - if (lead != end) { - MWR_LOGI("[INFO] Resume thread"); - break; - } - if (g_speech_pcm_wait_count < cnt) { - MWR_LOGE("[ERROR] Wrong request, there's no pcm data"); - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - WAKEUP_SPEECH_STREAMING_EVENT_FAIL, NULL, 0)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - MWR_LOGD("[EXIT]"); - return; - } - cnt++; - } - MWR_LOGI("[INFO] Finish to wait for new feedback data come"); - - /* resume feedback thread */ - continue; - } - - iter = lead; - - /* FIXME : Extracted audio data here should be used as previous audio data*/ - - wakeup_speech_data& speech_data = iter->data; - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - speech_data.event, speech_data.buffer, speech_data.len)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) { - MWR_LOGI("[INFO] Finish to get and send speech data"); - break; - } - - advance(lead, 1); - } - MWR_LOGD("[EXIT]"); -} - -void CAudioManager::add_audio_data(wakeup_speech_data& data, long time) -{ - long delta = mAudioRecordingDurationMilliseconds; - - notify_audio_data_recording(time, data.buffer, data.len); - - wakeup_speech_data_with_time data_with_time; - data_with_time.data = data; - data_with_time.time = time; - - lock_guard lock(mMutex); - - /* Pop items only when the streaming is not activated */ - while(false == mAudioData.empty() && mAudioData.front().time < time - delta) { - const auto &front = mAudioData.front(); - if (front.data.buffer) { - vm_free_simple(front.data.buffer); - } - mAudioData.pop_front(); - } - mAudioData.push_back(data_with_time); -} - -void CAudioManager::feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len) -{ - if (NULL == buffer || 0 == len) return; - - wakeup_speech_data speech_data; - speech_data.buffer = vm_malloc_simple(len); - if (speech_data.buffer) { - long time = get_current_milliseconds_after_epoch(); - - speech_data.event = event; - speech_data.len = len; - memcpy(speech_data.buffer, buffer, len); - add_audio_data(speech_data, time); - } -} - -void CAudioManager::finalize_audio_data() -{ - unsigned char final_buffer[2] = {'\0', }; - wakeup_speech_data speech_data; - speech_data.event = WAKEUP_SPEECH_STREAMING_EVENT_FINISH; - speech_data.len = sizeof(final_buffer); - speech_data.buffer = vm_malloc_simple(speech_data.len); - if (speech_data.buffer) { - long time = get_current_milliseconds_after_epoch(); - - memcpy(speech_data.buffer, final_buffer, speech_data.len); - add_audio_data(speech_data, time); - } -} - -void CAudioManager::clear_audio_data() -{ - lock_guard lock(mMutex); - while(!mAudioData.empty()) { - const auto &front = mAudioData.front(); - if (front.data.buffer) { - vm_free_simple(front.data.buffer); - } - mAudioData.pop_front(); - } - mAudioData.clear(); -} - -void CAudioManager::notify_audio_data_recording(long time, void* data, int len) -{ - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_recording_audio_data(time, data, len)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - return; - } - } - } -} - -void CAudioManager::start_streaming_current_utterance_data(long start_time) -{ - if (mStreamingThread.joinable()) { - MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread"); - return; - } - lock_guard lock(mMutex); - mStreamingThread = thread(&CAudioManager::streaming_audio_data_thread_func, this, start_time); -} - -void CAudioManager::stop_streaming_current_utterance_data() -{ - if (mStreamingThread.joinable()) { - MWR_LOGD("mStreamingThread is joinable, trying join()"); - mStopStreamingThread.store(true); - try { - mStreamingThread.join(); - } catch (std::exception &e) { - MWR_LOGE("Exception thrown : %s", e.what()); - } - } - mStopStreamingThread.store(false); - - /* FIXME : Need to move all the speech data to previous speech data for later use */ -} - -void CAudioManager::start_streaming_previous_utterance_data() -{ - if (mStreamingPreviousThread.joinable()) { - MWR_LOGE("ERROR : mStreamingPreviousThread is joinable, will not start a new thread"); - return; - } - lock_guard lock(mMutex); - mStreamingPreviousThread = thread(&CAudioManager::streaming_previous_audio_data_thread_func, this); -} - -void CAudioManager::stop_streaming_previous_utterance_data() -{ - if (mStreamingPreviousThread.joinable()) { - MWR_LOGD("mStreamingPreviousThread is joinable, trying join()"); - mStopStreamingPreviousThread.store(true); - try { - mStreamingPreviousThread.join(); - } catch (std::exception &e) { - MWR_LOGE("Exception thrown : %s", e.what()); - } - } - mStopStreamingThread.store(false); -} - -void CAudioManager::start_streaming_follow_up_data() -{ - if (mStreamingThread.joinable()) { - MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread"); - return; - } - - mStreamingThread = thread(&CAudioManager::streaming_audio_data_thread_func, this, 0); -} - -void CAudioManager::stop_streaming_follow_up_data() -{ - if (mStreamingThread.joinable()) { - MWR_LOGD("mStreamingThread is joinable, trying join()"); - mStopStreamingThread.store(true); - mStreamingThread.join(); - } - mStopStreamingThread.store(false); -} - -void CAudioManager::set_background_volume(double ratio) -{ - dependency_resolver_set_background_volume(ratio); -} - -} // wakeup -} // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_engine_manager.cpp b/plugins/wakeup-manager/src/wakeup_engine_manager.cpp deleted file mode 100644 index 7afcaa8..0000000 --- a/plugins/wakeup-manager/src/wakeup_engine_manager.cpp +++ /dev/null @@ -1,690 +0,0 @@ -#include "wakeup_engine_manager.h" -#include "wakeup_manager_main.h" - -#include -#include -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -/* Need to check whether this value needs to be configurable */ -static int g_speech_pcm_wait_count = 400; - -/* Utility function for checking if an element exists in a container */ -template -static auto contains(const C& v, const T& x) -> decltype(end(v), true) -{ - return end(v) != find(begin(v), end(v), x); -} - -CWakeupEngineManager::CWakeupEngineManager() -{ -} - -CWakeupEngineManager::~CWakeupEngineManager() -{ -} - -CWakeupEngineManager::CWakeupEngineManager(IEngineEventObserver *observer) : CWakeupEngineManager() -{ - subscribe(observer); -} - -void CWakeupEngineManager::initialize() -{ - DIR* dp = opendir(MA_WAKEUP_ENGINE_PATH); - if (nullptr == dp) { - MWR_LOGD("Failed opening directory : %s", (const char*)MA_WAKEUP_ENGINE_PATH); - } else { - struct dirent *dirp = nullptr; - char dirpath[_POSIX_PATH_MAX]; - do { - dirp = readdir(dp); - - if (nullptr != dirp) { - const string current_directory{"."}; - const string parent_directory{".."}; - if (0 == current_directory.compare(dirp->d_name) || - 0 == parent_directory.compare(dirp->d_name)) - continue; - - if (DT_DIR != dirp->d_type) /* If not a directory */ - continue; - - int dirpath_len = strlen(MA_WAKEUP_ENGINE_PATH) + strlen(dirp->d_name) + 1; - if (dirpath_len >= _POSIX_PATH_MAX) { - MWR_LOGD("File path is too long : %s", dirp->d_name); - closedir(dp); - return; - } - - memset(dirpath, '\0', _POSIX_PATH_MAX); - snprintf(dirpath, _POSIX_PATH_MAX, "%s/%s", - (const char*)(MA_WAKEUP_ENGINE_PATH), dirp->d_name); - - add_engine_directory(string{dirp->d_name}, dirpath); - } - } while (nullptr != dirp); - - closedir(dp); - } -} - -void CWakeupEngineManager::deinitialize() -{ - for (auto& info : mEngineInfo) { - if (info.interface.set_wakeup_event_callback) { - info.interface.set_wakeup_event_callback(nullptr, nullptr); - } - if (info.interface.set_speech_status_callback) { - info.interface.set_speech_status_callback(nullptr, nullptr); - } - if (info.interface.set_error_callback) { - info.interface.set_error_callback(nullptr, nullptr); - } - if (info.interface.set_audio_data_require_status_callback) { - info.interface.set_audio_data_require_status_callback(nullptr, nullptr); - } - if (info.interface.deinitialize) { - info.interface.deinitialize(); - } - if (info.engine_handle) { - dlclose(info.engine_handle); - info.engine_handle = nullptr; - } - } - mSelectedEngine = nullptr; - mEngineInfo.clear(); -} - -void CWakeupEngineManager::subscribe(IEngineEventObserver *observer) -{ - mObservers.push_back(observer); - MWR_LOGD("Added Observer : %p %zu", observer, mObservers.size()); -} - -void CWakeupEngineManager::unsubscribe(IEngineEventObserver *observer) -{ - auto iter = find(mObservers.begin(), mObservers.end(), observer); - if (iter != mObservers.end()) { - mObservers.erase(iter); - } -} - -bool CWakeupEngineManager::get_audio_data_required() -{ - return mAudioDataRequired; -} - -void CWakeupEngineManager::set_selected_wakeup_info(wakeup_event_info wakeup_info) -{ - mSelectedEngine = nullptr; - for (const auto& info : mEngineInfo) { - string appid = string{wakeup_info.wakeup_appid}; - bool found = contains(info.assistant_list, appid); - - if (found) { - mSelectedEngine = &info; - MWR_LOGD("Selected : %s", info.engine_name.c_str()); - } - } -} - -bool CWakeupEngineManager::set_language(string language) -{ - for (const auto& info : mEngineInfo) { - if (info.interface.set_language) { - info.interface.set_language(language.c_str()); - } - } - return true; -} - -void CWakeupEngineManager::set_assistant_activated(string appid, bool activated) -{ - MWR_LOGD("[ENTER] : %s %d", appid.c_str(), activated); - for (auto& info : mEngineInfo) { - const auto& iter = find_if(info.assistant_list.begin(), info.assistant_list.end(), - [appid](const string& assistant) { - return (0 == assistant.compare(appid)); - }); - - /* If the appid is in the assistant list */ - if (info.assistant_list.end() != iter) { - bool previously_activated = info.activated; - if (activated) { - info.activated_assistants.insert(appid); - } else { - info.activated_assistants.erase(appid); - } - info.activated = (info.activated_assistants.size() > 0); - if (previously_activated != info.activated) { - if (info.activated) { - info.interface.activate(); - } else { - info.interface.deactivate(); - } - /* Activated status changed, need to update audio_data_require_status too */ - on_audio_data_require_status(info.engine_name, info.audio_data_require_status); - } - } - } -} - -void CWakeupEngineManager::set_wake_word_audio_require_flag(bool require) -{ - MWR_LOGD("[ENTER]"); - mWakeWordAudioRequired = require; - for (const auto& info : mEngineInfo) { - if (info.interface.set_wake_word_audio_require_flag) { - info.interface.set_wake_word_audio_require_flag(require); - } - } -} - -void CWakeupEngineManager::streaming_speech_data_thread_func() -{ - MWR_LOGD("[ENTER]"); - - if (nullptr == mSelectedEngine) - return; - - const wakeup_engine_interface *interface = &(mSelectedEngine->interface); - - if (NULL == interface || - NULL == interface->get_utterance_data || - NULL == interface->get_utterance_data_count) - return; - - MWR_LOGD("data_count : %d", interface->get_utterance_data_count()); - - wakeup_speech_data speech_data; - int index = 0; - bool finish_event_sent = false; - - if (mWakeWordAudioRequired && - NULL != interface->get_wake_word_data || - NULL != interface->get_wake_word_data_count) { - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_audio_streaming_data_section(MA_AUDIO_STREAMING_DATA_SECTION_WAKE_WORD)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - int count = interface->get_wake_word_data_count(); - while (!(mStopStreamingThread.load()) && index < count) { - int ret = interface->get_wake_word_data(index, &speech_data); - if (0 == ret) { - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - speech_data.event, speech_data.buffer, speech_data.len)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - } else { - break; - } - index++; - } - index = 0; - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_audio_streaming_data_section(MA_AUDIO_STREAMING_DATA_SECTION_UTTERANCE)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - } - - while (!(mStopStreamingThread.load())) { - int ret = -1; - int cnt = 0; - - /* get feedback data */ - if (interface && interface->get_utterance_data) { - ret = interface->get_utterance_data(index, &speech_data); - if (0 != ret) { - /* empty queue */ - MWR_LOGD("[DEBUG] No feedback data. Waiting mode : %d", ret); - - /* waiting */ - while (!(mStopStreamingThread.load())) { - this_thread::sleep_for(chrono::milliseconds(10)); - if (index < interface->get_utterance_data_count()) { - MWR_LOGI("[INFO] Resume thread"); - break; - } - if (g_speech_pcm_wait_count < cnt) { - MWR_LOGE("[ERROR] Wrong request, there's no pcm data"); - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - WAKEUP_SPEECH_STREAMING_EVENT_FAIL, NULL, 0)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - return; - } - cnt++; - } - MWR_LOGI("[INFO] Finish to wait for new feedback data come"); - - /* resume feedback thread */ - continue; - } - - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - speech_data.event, speech_data.buffer, speech_data.len)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) { - MWR_LOGI("[INFO] Finish to get and send speech data"); - finish_event_sent = true; - break; - } - - index++; - } - } - - if (true != finish_event_sent) { - unsigned char final_buffer[2] = {'\0', }; - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_streaming_audio_data( - WAKEUP_SPEECH_STREAMING_EVENT_FINISH, final_buffer, sizeof(final_buffer))) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - } -} - -void CWakeupEngineManager::start_streaming_current_utterance_data() -{ - if (mStreamingThread.joinable()) { - MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread"); - return; - } - mStreamingThread = thread(&CWakeupEngineManager::streaming_speech_data_thread_func, this); -} - -void CWakeupEngineManager::stop_streaming_current_utterance_data() -{ - if (mStreamingThread.joinable()) { - MWR_LOGD("mStreamingThread is joinable, trying join()"); - mStopStreamingThread.store(true); - mStreamingThread.join(); - } - mStopStreamingThread.store(false); -} - -void CWakeupEngineManager::update_manager_state(wakeup_manager_state_e state) -{ - for (const auto& info : mEngineInfo) { - if (info.interface.update_manager_state) { - info.interface.update_manager_state(state); - } - } -} - -void CWakeupEngineManager::update_recognition_result(string appid, int result) -{ - if (mSelectedEngine) { - if (mSelectedEngine->interface.update_recognition_result) { - mSelectedEngine->interface.update_recognition_result(appid.c_str(), result); - } - } -} - -void CWakeupEngineManager::engine_add_target_assistant(string engine_name, string appid) -{ - const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(), - [engine_name](const EngineInfo& info) { - return (0 == info.engine_name.compare(engine_name)); - }); - - if (mEngineInfo.end() == iter) { - /* Not found, add new library */ - pkgmgrinfo_appinfo_h handle; - int ret = pkgmgrinfo_appinfo_get_appinfo(engine_name.c_str(), &handle); - if (PMINFO_R_OK == ret) { - char *root_path = nullptr; - ret = pkgmgrinfo_appinfo_get_root_path(handle, &root_path); - if (PMINFO_R_OK == ret && nullptr != root_path) { - string path = root_path; - path += "/"; - path += MA_WAKEUP_DEDICATED_ENGINE_PATH; - add_engine(engine_name, path); - } - pkgmgrinfo_appinfo_destroy_appinfo(handle); - } - /* Find again to add appid to the newly created engine's assistant list */ - const auto &new_iter = find_if(mEngineInfo.begin(), mEngineInfo.end(), - [engine_name](const EngineInfo& info) { - return (0 == info.engine_name.compare(engine_name)); - }); - if (mEngineInfo.end() != new_iter) { - new_iter->assistant_list.push_back(appid); - } - } else { - /* If the engine already exists, simply add the appid to the assistant list */ - iter->assistant_list.push_back(appid); - } -} - -void CWakeupEngineManager::engine_add_wakeup_word(string appid, string wakeup_word, string language) -{ - for (const auto& info : mEngineInfo) { - bool found = contains(info.assistant_list, appid); - if (found) { - if (info.interface.add_wakeup_word) { - info.interface.add_wakeup_word(appid.c_str(), wakeup_word.c_str(), language.c_str()); - } - } - } -} - -void CWakeupEngineManager::engine_set_assistant_specific_command(string appid, string command) -{ - for (const auto& info : mEngineInfo) { - bool found = contains(info.assistant_list, appid); - if (found) { - if (info.interface.set_assistant_specific_command) { - info.interface.set_assistant_specific_command(appid.c_str(), command.c_str()); - } - } - } -} - -void CWakeupEngineManager::engine_feed_audio_data(long time, void* data, int len) -{ - for (const auto& info : mEngineInfo) { - if (info.audio_data_require_status && - info.interface.feed_audio_data) { - int ret = info.interface.feed_audio_data(time, data, len); - if (0 != ret) { - LOGE("[ERROR] Fail to feed speech data, ret(%d) : %s", ret, info.engine_name.c_str()); - } - } - } -} - -bool CWakeupEngineManager::on_wakeup_event(string engine_name, wakeup_event_info info) -{ - MWR_LOGD("[ENTER]"); - - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_wakeup_event(engine_name, info)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - - return true; -} - -bool CWakeupEngineManager::on_speech_status(string engine_name, wakeup_service_speech_status_e status) -{ - MWR_LOGD("[ENTER]"); - - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_speech_status(engine_name, status)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - - return true; -} - -bool CWakeupEngineManager::on_error(string engine_name, int error_code, string error_message) -{ - MWR_LOGD("[ENTER]"); - - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_error(engine_name, error_code, error_message)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - - return true; -} - -bool CWakeupEngineManager::on_audio_data_require_status(string engine_name, bool require) -{ - MWR_LOGD("[ENTER] %s, %d", engine_name.c_str(), require); - - bool found = false; - // LOCK REQUIRED - int count = 0; - for (auto& info : mEngineInfo) { - if (info.engine_name.compare(engine_name) == 0) { - found = true; - info.audio_data_require_status = require; - } - if (info.activated && info.audio_data_require_status) { - count++; - } - } - MWR_LOGD("count : %d", count); - if (count > 0) { - mAudioDataRequired = true; - } else { - mAudioDataRequired = false; - } - - if (found) { - for (const auto& observer : mObservers) { - if (observer) { - if (!observer->on_audio_data_require_status(engine_name, require)) { - LOGE("[Recorder WARNING] One of the observer returned false"); - } - } - } - } - // UNLOCK REQUIRED - return true; -} - -void CWakeupEngineManager::add_engine(string name, string path) -{ - MWR_LOGD("Name (%s), Filepath(%s)", name.c_str(), path.c_str()); - - char* error = NULL; - EngineInfo info; - info.engine_handle = dlopen(path.c_str(), RTLD_LAZY); - if (nullptr != (error = dlerror()) || nullptr == info.engine_handle) { - MWR_LOGD("[ERROR] Fail to dlopen(%s), error(%s)", path.c_str(), error); - if (info.engine_handle) dlclose(info.engine_handle); - return; - } - - /* Interfaces without version information */ - info.interface.initialize = - (wakeup_engine_initialize)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_INITIALIZE); - info.interface.deinitialize = - (wakeup_engine_deinitialize)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE); - info.interface.activate = - (wakeup_engine_activate)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_ACTIVATE); - info.interface.deactivate = - (wakeup_engine_deactivate)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_DEACTIVATE); - info.interface.add_wakeup_word = - (wakeup_engine_add_wakeup_word)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD); - info.interface.add_language = - (wakeup_engine_add_language)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE); - info.interface.set_language = - (wakeup_engine_set_language)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE); - info.interface.update_manager_state = - (wakeup_engine_update_manager_state)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE); - info.interface.update_recognition_result = - (wakeup_engine_update_recognition_result)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT); - info.interface.set_audio_format = - (wakeup_engine_set_audio_format)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT); - info.interface.get_audio_format = - (wakeup_engine_get_audio_format)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT); - info.interface.feed_audio_data = - (wakeup_engine_feed_audio_data)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA); - info.interface.get_utterance_data_count = - (wakeup_engine_get_utterance_data_count)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT); - info.interface.get_utterance_data = - (wakeup_engine_get_utterance_data)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA); - info.interface.get_wake_word_data_count = - (wakeup_engine_get_wake_word_data_count)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT); - info.interface.get_wake_word_data = - (wakeup_engine_get_wake_word_data)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA); - info.interface.set_assistant_specific_command = - (wakeup_engine_set_assistant_specific_command)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND); - info.interface.set_wake_word_audio_require_flag = - (wakeup_engine_set_wake_word_audio_require_flag)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG); - info.interface.set_wakeup_event_callback = - (wakeup_engine_set_wakeup_event_callback)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK); - info.interface.set_speech_status_callback = - (wakeup_engine_set_speech_status_callback)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK); - info.interface.set_error_callback = - (wakeup_engine_set_error_callback)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK); - info.interface.set_audio_data_require_status_callback = - (wakeup_engine_set_audio_data_require_status_callback)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK); - - /* Interfaces after version 1 */ - info.interface.get_version = - (wakeup_engine_get_version)dlsym(info.engine_handle, - MA_WAKEUP_ENGINE_FUNC_GET_VERSION); - - info.version = 0; - info.engine_path = path; - info.engine_name = name; - - info.activated = false; - info.audio_data_require_status = false; - - /* All the necessary information has already been set properly */ - mEngineInfo.push_back(info); - - MWR_LOGD("Initializing wakeup engine : %s %p", - info.engine_path.c_str(), - info.interface.initialize); - - /* Workaround for registering C-style callbacks */ - typedef struct { - CWakeupEngineManager *manager; - string engine_name; - } CallbackUserData; - - static deque callback_user_data; - - CallbackUserData user_data; - user_data.manager = this; - user_data.engine_name = info.engine_name; - callback_user_data.push_back(user_data); - - if (info.interface.set_wakeup_event_callback) { - info.interface.set_wakeup_event_callback( - [](wakeup_event_info info, void* user_data) { - CallbackUserData *data = static_cast(user_data); - if (nullptr == data) return; - if (nullptr == data->manager) return; - info.wakeup_engine = data->engine_name.c_str(); - data->manager->on_wakeup_event(data->engine_name, info); - }, &(callback_user_data.back())); - } - - if (info.interface.set_audio_data_require_status_callback) { - info.interface.set_audio_data_require_status_callback( - [](bool require, void* user_data) { - CallbackUserData *data = static_cast(user_data); - if (nullptr == data) return; - if (nullptr == data->manager) return; - data->manager->on_audio_data_require_status(data->engine_name, require); - }, &(callback_user_data.back())); - } - - if (info.interface.initialize) { - info.interface.initialize(); - } - if (info.interface.get_version) { - int version; - if (0 == info.interface.get_version(&version)) { - info.version = version; - } - } -} - -void CWakeupEngineManager::add_engine_directory(string name, string path) -{ - if (0 == path.size()) return; - - DIR* dp = opendir(path.c_str()); - if (NULL == dp) { - MWR_LOGD("Failed opening directory : %s", path.c_str()); - } else { - struct dirent *dirp = NULL; - string filepath; - do { - dirp = readdir(dp); - - if (NULL != dirp) { - if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name)) - continue; - - if (DT_REG != dirp->d_type) /* If not a regular file */ - continue; - - filepath = path; - filepath += "/"; - filepath += dirp->d_name; - - if (filepath.length() >= _POSIX_PATH_MAX) { - MWR_LOGD("File path is too long : %s", filepath.c_str()); - closedir(dp); - return; - } - add_engine(name, filepath); - } - } while (NULL != dirp); - - closedir(dp); - } -} - -} // wakeup -} // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp deleted file mode 100644 index 14373df..0000000 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ /dev/null @@ -1,859 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include "wakeup_manager.h" -#include "wakeup_manager_main.h" -#include "wakeup_policy_default.h" -#include "dependency_resolver.h" - -#include -namespace multiassistant -{ -namespace wakeup -{ - -static bool check_language_valid(string language) -{ - return true; -} - -static bool initialize_wakeup_event_info(wakeup_event_info* wakeup_info) -{ - bool ret = false; - if (wakeup_info) { - ret = true; - - wakeup_info->wakeup_appid = nullptr; - wakeup_info->wakeup_word = nullptr; - wakeup_info->wakeup_language = nullptr; - wakeup_info->wakeup_voice_id = nullptr; - wakeup_info->wakeup_engine = nullptr; - wakeup_info->wakeup_confidence_score = 0.0f; - - wakeup_info->wakeup_start_time = 0; - wakeup_info->wakeup_end_time = 0L; - wakeup_info->wakeup_time_valid = false; - - wakeup_info->extra_data = nullptr; - wakeup_info->extra_data_length = 0; - wakeup_info->extra_data_description = nullptr; - } - return ret; -} - -CWakeupManager::CWakeupManager(IWakeupEventObserver *observer) -{ - initialize_wakeup_event_info(&mLastWakeupEventInfo); - - if (observer) { - subscribe(observer); - } -} - -CWakeupManager::~CWakeupManager() -{ -} - -void CWakeupManager::initialize_wakeup_policy() -{ - mWakeupPolicy.reset(new CWakeupPolicyDefault{&mPolicyEventObserver}); - - /* Default Policy specific initialization */ - CWakeupPolicyDefault *policy = - dynamic_cast(mWakeupPolicy.get()); - if (policy) { - int priority = 0; - - policy->set_delay(mWakeupSettings.get_wakeup_policy_delay()); - MWR_LOGD("Setting Delay : %f", mWakeupSettings.get_wakeup_policy_delay()); - for (const auto& assistant : mWakeupSettings.get_wakeup_policy_priority()) { - policy->set_assistant_priority(assistant, ++priority); - MWR_LOGD("Setting Priority : %d %s", priority, assistant.c_str()); - } - } -} - -bool CWakeupManager::initialize() -{ - MWR_LOGD("[ENTER]"); - - mPolicyEventObserver.set_wakeup_manager(this); - mEngineEventObserver.set_wakeup_manager(this); - mAudioEventObserver.set_wakeup_manager(this); - mSettingsEventObserver.set_wakeup_manager(this); - - mWakeupSettings.initialize(); - - mAudioEventObserver.set_wakeup_engine_manager(&mWakeupEngineManager); - mAudioManager.subscribe(&mAudioEventObserver); - mAudioManager.initialize(); - - initialize_wakeup_policy(); - - mWakeupEngineManager.subscribe(&mEngineEventObserver); - mWakeupEngineManager.initialize(); - - mas_proxy_interface interface; - interface.process_event = wakeup_manager_process_event; - interface.feed_audio_data = wakeup_manager_feed_audio_data; - - dependency_resolver_initialize(interface); - - mWakeupSettings.subscribe(&mSettingsEventObserver); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::deinitialize() -{ - MWR_LOGD("[ENTER]"); - - dependency_resolver_deinitialize(); - - mWakeupEngineManager.unsubscribe(&mEngineEventObserver); - mWakeupEngineManager.deinitialize(); - - mAudioManager.unsubscribe(&mAudioEventObserver); - mAudioManager.deinitialize(); - - mWakeupSettings.deinitialize(); - mAssistantLanguageInfo.clear(); - - MWR_LOGD("[END]"); - return true; -} - -void CWakeupManager::subscribe(IWakeupEventObserver *observer) -{ - mObservers.push_back(observer); -} - -void CWakeupManager::unsubscribe(IWakeupEventObserver *observer) -{ - auto iter = find(mObservers.begin(), mObservers.end(), observer); - if (iter != mObservers.end()) { - mObservers.erase(iter); - } -} - -bool CWakeupManager::activate(void) -{ - MWR_LOGD("[ENTER]"); - - if (WAKEUP_MANAGER_STATE_INACTIVE != mWakeupManagerState) - return false; - - /* Activate assistants that supports current voice input language */ - set_language(mWakeupSettings.get_current_language()); - - change_manager_state(WAKEUP_MANAGER_STATE_LISTENING); - if (mWakeupEngineManager.get_audio_data_required()) { - mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD); - mAudioManager.start_recording(true); - } - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::deactivate(void) -{ - MWR_LOGD("[ENTER]"); - - if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState) - return false; - - mAudioManager.stop_recording(true); - change_manager_state(WAKEUP_MANAGER_STATE_INACTIVE); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::add_assistant_language(string appid, string language) -{ - MWR_LOGD("[ENTER]"); - bool found = false; - for (auto& info : mAssistantLanguageInfo) { - if(0 == info.appid.compare(appid)) { - info.languageList.push_back(language); - found = true; - } - } - if(false == found) { - AssistantLanguageInfo info; - info.appid = appid; - info.languageList.push_back(language); - mAssistantLanguageInfo.push_back(info); - } - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::add_assistant_wakeup_word(string appid, string wakeup_word, string language) -{ - MWR_LOGD("[ENTER]"); - - mWakeupEngineManager.engine_add_wakeup_word(appid, wakeup_word, language); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::set_assistant_wakeup_engine(string appid, string engine) -{ - MWR_LOGD("[ENTER]"); - - mWakeupEngineManager.engine_add_target_assistant(engine, appid); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::set_language(string language) -{ - bool ret = false; - MWR_LOGD("[ENTER] : %s", language.c_str()); - - if (check_language_valid(language)) { - mCurrentLanguage = language; - - bool found = false; - for (auto& info : mAssistantLanguageInfo) { - found = false; - for(auto it = info.languageList.begin(); it != info.languageList.end(); it++) { - if(language == *it) { - found = true; - break; - } - } - if(false == found) { - mAssistantActivated[info.appid] = false; - } else { - mAssistantActivated[info.appid] = true; - } - - mWakeupEngineManager.set_assistant_activated(info.appid, found); - } - - mWakeupEngineManager.set_language(language); - ret = true; - } else { - MWR_LOGE("[ERROR] Not supported language (%s)", language.c_str()); - } - - MWR_LOGD("[END]"); - return ret; -} - -bool CWakeupManager::get_voice_key_pressed() -{ - return mVoiceKeyPressed; -} - -STREAMING_MODE CWakeupManager::get_streaming_mode() -{ - return mStreamingMode; -} - -bool CWakeupManager::set_streaming_mode(STREAMING_MODE mode) -{ - mStreamingMode = mode; - return true; -} - -bool CWakeupManager::change_manager_state(wakeup_manager_state_e state) -{ - if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState || - WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState) { - if (WAKEUP_MANAGER_STATE_VOICE_FEEDBACK == state || - WAKEUP_MANAGER_STATE_LISTENING == state) { - stop_streaming_utterance_data(); - stop_streaming_previous_utterance_data(); - stop_streaming_follow_up_data(); - } - } - mWakeupManagerState = state; - mWakeupEngineManager.update_manager_state(state); - return true; -} - -wakeup_manager_state_e CWakeupManager::get_manager_state() -{ - return mWakeupManagerState; -} - -bool CWakeupManager::update_voice_feedback_state(string appid, bool state) -{ - MWR_LOGD("[ENTER]"); - - if (state) { - if (WAKEUP_MANAGER_STATE_LISTENING == mWakeupManagerState || - WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState) { - change_manager_state(WAKEUP_MANAGER_STATE_VOICE_FEEDBACK); - } - } else { - if (WAKEUP_MANAGER_STATE_VOICE_FEEDBACK == mWakeupManagerState) { - change_manager_state(WAKEUP_MANAGER_STATE_LISTENING); - } - } - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::send_assistant_specific_command(string appid, string command) -{ - MWR_LOGD("[ENTER]"); - - /* - static const string voice_key_pressed{"voice_key_pressed"}; - static const string voice_key_released{"voice_key_released"}; - - if (0 == command.compare(voice_key_pressed)) { - process_event(MA_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0); - } else if (0 == command.compare(voice_key_released)) { - process_event(MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, NULL, 0); - } - */ - - mWakeupEngineManager.engine_set_assistant_specific_command(appid, command); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::set_background_volume(string appid, double ratio) -{ - MWR_LOGD("[DEBUG] set background volume (%f)", ratio); - - int ret = 0; - mAudioManager.set_background_volume(ratio); - return ret; -} - -bool CWakeupManager::update_recognition_result(string appid, int result) -{ - MWR_LOGD("[ENTER]"); - mWakeupEngineManager.update_recognition_result(appid, result); - if (WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState || - WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) { - change_manager_state(WAKEUP_MANAGER_STATE_LISTENING); - } - MWR_LOGD("[END]"); - return true; -} - -static long get_current_milliseconds_after_epoch() -{ - auto now = chrono::system_clock::now(); - auto now_ms = chrono::time_point_cast(now); - /* number of milliseconds since the epoch of system_clock */ - auto value = now_ms.time_since_epoch(); - - return value.count(); -} - -bool CWakeupManager::process_event(ma_plugin_event_e event, void* data, int len) -{ - MWR_LOGD("[ENTER] : %d", event); - if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState) - return false; - - // LOCK REQUIRED - if (MA_PLUGIN_EVENT_VOICE_KEY_PRESSED == event) { - if (mVoiceKeyPressed != true) { - mAudioManager.stop_recording(true); - - stop_streaming_utterance_data(); - stop_streaming_previous_utterance_data(); - stop_streaming_follow_up_data(); - - mAudioManager.clear_audio_data(); - change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE); - - mVoiceKeyPressed = true; - - /* Start recorder thread using appropriate recording device */ - mAudioManager.set_recording_session(RECORDING_SESSION_UTTERANCE); - mAudioManager.start_recording(true); - - /* Wakeup default assistant */ - /* TODO: apply conversation timeout for selecting assistant here */ - wakeup_event_info wakeup_info; - initialize_wakeup_event_info(&wakeup_info); - /* Make sure to use background data */ - wakeup_info.wakeup_time_valid = true; - wakeup_info.wakeup_end_time = get_current_milliseconds_after_epoch(); - wakeup_info.wakeup_engine = WAKEUP_ENGINE_VOICE_KEY; - - string appid = mWakeupSettings.get_default_assistant_appid(); - wakeup_info.wakeup_appid = appid.c_str(); - MWR_LOGD("wakeup_appid : %s", wakeup_info.wakeup_appid); - - set_last_wakeup_event_info(wakeup_info); - mWakeupEngineManager.set_selected_wakeup_info(wakeup_info); - for (const auto& observer : mObservers) { - observer->on_wakeup(wakeup_info); - } - } - } else if (MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH == event) { - if (mVoiceKeyPressed != false) { - mVoiceKeyPressed = false; - mAudioManager.finalize_audio_data(); - - if (mWakeupEngineManager.get_audio_data_required()) { - /* Restart recorder thread using appropriate recording device */ - mAudioManager.stop_recording(true); - mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD); - mAudioManager.start_recording(true); - } else { - mAudioManager.stop_recording(true); - } - } - } else if (MA_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP == event) { - if (mVoiceKeyPressed != false) { - mVoiceKeyPressed = false; - } - } - // UNLOCK REQUIRED - - MWR_LOGD("[END]"); - return true; -} - -vector CWakeupManager::get_observers() -{ - return mObservers; -} - -void CWakeupManager::set_last_wakeup_event_info(wakeup_event_info wakeup_info) -{ - mLastWakeupEventInfo = wakeup_info; -} - -static Eina_Bool streaming_duration_expired(void *data) -{ - MWR_LOGD("[ENTER]"); - CWakeupManager *wakeup_manager = static_cast(data); - if (nullptr == wakeup_manager) return ECORE_CALLBACK_CANCEL; - - CAudioManager *audio_manager = wakeup_manager->get_audio_manager(); - CWakeupEngineManager *engine_manager = wakeup_manager->get_engine_manager(); - - if (nullptr == audio_manager) return ECORE_CALLBACK_CANCEL; - if (nullptr == engine_manager) return ECORE_CALLBACK_CANCEL; - - switch(wakeup_manager->get_streaming_mode()) { - case STREAMING_MODE::UTTERANCE: - audio_manager->stop_streaming_current_utterance_data(); - engine_manager->stop_streaming_current_utterance_data(); - break; - case STREAMING_MODE::PREVIOUS_UTTERANCE: - audio_manager->stop_streaming_previous_utterance_data(); - break; - case STREAMING_MODE::FOLLOW_UP: - audio_manager->stop_streaming_follow_up_data(); - break; - } - - unsigned char final_buffer[2] = {'\0', }; - vector observers = wakeup_manager->get_observers(); - for (const auto& observer : observers) { - observer->on_streaming_audio_data( - WAKEUP_SPEECH_STREAMING_EVENT_FINISH, final_buffer, sizeof(final_buffer)); - } - wakeup_manager->set_streaming_mode(STREAMING_MODE::NONE); - - if (WAKEUP_MANAGER_STATE_UTTERANCE == wakeup_manager->get_manager_state()) { - wakeup_manager->change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING); - } - - return ECORE_CALLBACK_CANCEL; -} - -bool CWakeupManager::start_streaming_utterance_data() -{ - MWR_LOGD("[ENTER]"); - - mAudioManager.stop_streaming_current_utterance_data(); - mWakeupEngineManager.stop_streaming_current_utterance_data(); - - mStreamingMode = STREAMING_MODE::UTTERANCE; - - bool streaming_by_manager = true; - if (false == mLastWakeupEventInfo.wakeup_time_valid) { - mWakeupEngineManager.start_streaming_current_utterance_data(); - streaming_by_manager = false; - } else { - mAudioManager.start_streaming_current_utterance_data(mLastWakeupEventInfo.wakeup_end_time); - } - - ecore_thread_main_loop_begin(); - if (mStreamingDurationTimer) { - ecore_timer_del(mStreamingDurationTimer); - mStreamingDurationTimer = nullptr; - } - if (streaming_by_manager) { - mStreamingDurationTimer = ecore_timer_add( - mWakeupSettings.get_streaming_duration_max(), - streaming_duration_expired, this); - } - ecore_thread_main_loop_end(); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::stop_streaming_utterance_data() -{ - MWR_LOGD("[ENTER]"); - if (STREAMING_MODE::UTTERANCE != mStreamingMode) return false; - - if (mStreamingDurationTimer) { - ecore_thread_main_loop_begin(); - ecore_timer_del(mStreamingDurationTimer); - mStreamingDurationTimer = nullptr; - ecore_thread_main_loop_end(); - } - if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) { - change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING); - } - mAudioManager.stop_streaming_current_utterance_data(); - mWakeupEngineManager.stop_streaming_current_utterance_data(); - - mStreamingMode = STREAMING_MODE::NONE; - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::start_streaming_follow_up_data() -{ - MWR_LOGD("[ENTER]"); - - mAudioManager.stop_streaming_follow_up_data(); - mWakeupEngineManager.stop_streaming_current_utterance_data(); - - mStreamingMode = STREAMING_MODE::FOLLOW_UP; - - /* For the follow up streaming, audio data should be recorded from now on */ - mAudioManager.stop_recording(true); - mAudioManager.clear_audio_data(); - change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE); - mAudioManager.set_recording_session(RECORDING_SESSION_FOLLOW_UP); - mAudioManager.start_recording(true); - - mAudioManager.start_streaming_follow_up_data(); - - ecore_thread_main_loop_begin(); - if (mStreamingDurationTimer) { - ecore_timer_del(mStreamingDurationTimer); - mStreamingDurationTimer = nullptr; - } - mStreamingDurationTimer = ecore_timer_add( - mWakeupSettings.get_streaming_duration_max(), - streaming_duration_expired, this); - ecore_thread_main_loop_end(); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::stop_streaming_follow_up_data() -{ - MWR_LOGD("[ENTER]"); - if (STREAMING_MODE::FOLLOW_UP != mStreamingMode) return false; - - if (mStreamingDurationTimer) { - ecore_thread_main_loop_begin(); - ecore_timer_del(mStreamingDurationTimer); - mStreamingDurationTimer = nullptr; - ecore_thread_main_loop_end(); - } - if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) { - change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING); - } - mAudioManager.stop_streaming_follow_up_data(); - mWakeupEngineManager.stop_streaming_current_utterance_data(); - - mStreamingMode = STREAMING_MODE::NONE; - - mAudioManager.stop_recording(true); - mAudioManager.clear_audio_data(); - mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD); - mAudioManager.start_recording(true); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::start_streaming_previous_utterance_data() -{ - MWR_LOGD("[ENTER]"); - - mAudioManager.stop_streaming_previous_utterance_data(); - mWakeupEngineManager.stop_streaming_current_utterance_data(); - - mStreamingMode = STREAMING_MODE::PREVIOUS_UTTERANCE; - mAudioManager.start_streaming_previous_utterance_data(); - - ecore_thread_main_loop_begin(); - if (mStreamingDurationTimer) { - ecore_timer_del(mStreamingDurationTimer); - mStreamingDurationTimer = nullptr; - } - mStreamingDurationTimer = ecore_timer_add( - mWakeupSettings.get_streaming_duration_max(), - streaming_duration_expired, this); - ecore_thread_main_loop_end(); - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::stop_streaming_previous_utterance_data() -{ - MWR_LOGD("[ENTER]"); - if (STREAMING_MODE::PREVIOUS_UTTERANCE != mStreamingMode) return false; - - if (mStreamingDurationTimer) { - ecore_thread_main_loop_begin(); - ecore_timer_del(mStreamingDurationTimer); - mStreamingDurationTimer = nullptr; - ecore_thread_main_loop_end(); - } - if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) { - change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING); - } - mAudioManager.stop_streaming_previous_utterance_data(); - mWakeupEngineManager.stop_streaming_current_utterance_data(); - - mStreamingMode = STREAMING_MODE::NONE; - - MWR_LOGD("[END]"); - return true; -} - -bool CWakeupManager::get_audio_format(int* rate, int* channel, int* audio_type) -{ - MWR_LOGD("[ENTER]"); - - if (!audio_type || !rate || !channel) { - MWR_LOGE("[ERROR] Invalid parameter"); - return false; - } - - dependency_resolver_get_audio_format(rate, channel, audio_type); - - MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type); - return true; -} - -bool CWakeupManager::get_audio_source_type(char** type) -{ - MWR_LOGD("[ENTER]"); - - if (!type) { - MWR_LOGE("[ERROR] Invalid parameter"); - return false; - } - - dependency_resolver_get_audio_source_type(type); - - MWR_LOGD("[END] type(%s)", *type); - return true; -} - -bool CWakeupManager::set_wake_word_audio_require_flag(bool require) -{ - MWR_LOGD("[ENTER]"); - - mWakeupEngineManager.set_wake_word_audio_require_flag(require); - - MWR_LOGD("[END]"); - return true; -} - -CWakeupPolicy* CWakeupManager::get_wakeup_policy() -{ - return mWakeupPolicy.get(); -} - -CWakeupEngineManager* CWakeupManager::get_engine_manager() -{ - return &mWakeupEngineManager; -} - -CAudioManager* CWakeupManager::get_audio_manager() -{ - return &mAudioManager; -} - -CWakeupSettings* CWakeupManager::get_wakeup_settings() -{ - return &mWakeupSettings; -} - -void CWakeupManager::feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len) -{ - mAudioManager.feed_audio_data(event, buffer, len); -} - -bool CWakeupManager::CEngineEventObserver::on_wakeup_event(string engine_name, wakeup_event_info wakeup_info) -{ - MWR_LOGD("[ENTER]"); - if (nullptr == mWakeupManager) return false; - - CWakeupPolicy* policy = mWakeupManager->get_wakeup_policy(); - if (policy) { - policy->wakeup_candidate(wakeup_info); - } - return true; -} - -bool CWakeupManager::CEngineEventObserver::on_speech_status(string engine_name, wakeup_service_speech_status_e status) -{ - MWR_LOGD("[ENTER]"); - if (nullptr == mWakeupManager) return false; - - return true; -} - -bool CWakeupManager::CEngineEventObserver::on_error(string engine_name, int error_code, string error_message) -{ - MWR_LOGD("[ENTER]"); - if (nullptr == mWakeupManager) return false; - - return true; -} - -bool CWakeupManager::CEngineEventObserver::on_audio_data_require_status(string engine_name, bool require) -{ - MWR_LOGD("[ENTER]"); - if (nullptr == mWakeupManager) return false; - if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManager->get_manager_state()) return false; - - CAudioManager *audio_manager = mWakeupManager->get_audio_manager(); - CWakeupEngineManager *engine_manager = mWakeupManager->get_engine_manager(); - - if (audio_manager && engine_manager) { - if (engine_manager->get_audio_data_required()) { - if (mWakeupManager->get_voice_key_pressed() != true) { - audio_manager->set_recording_session(RECORDING_SESSION_WAKE_WORD); - audio_manager->start_recording(true); - } - } else { - if (mWakeupManager->get_voice_key_pressed() != true) { - audio_manager->stop_recording(true); - } - } - } - return true; -} - -bool CWakeupManager::CEngineEventObserver::on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) -{ - if (nullptr == mWakeupManager) return false; - - vector observers = mWakeupManager->get_observers(); - for (const auto& observer : observers) { - observer->on_streaming_audio_data(event, buffer, len); - } - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == event) { - mWakeupManager->set_streaming_mode(STREAMING_MODE::NONE); - } - - return true; -} - -bool CWakeupManager::CEngineEventObserver::on_audio_streaming_data_section( - ma_audio_streaming_data_section_e section) -{ - if (nullptr == mWakeupManager) return false; - - vector observers = mWakeupManager->get_observers(); - for (const auto& observer : observers) { - observer->on_audio_streaming_data_section(section); - } - - return true; -} - -void CWakeupManager::CPolicyEventObserver::on_wakeup(wakeup_event_info wakeup_info) -{ - if (nullptr == mWakeupManager) return; - mWakeupManager->stop_streaming_utterance_data(); - mWakeupManager->stop_streaming_previous_utterance_data(); - mWakeupManager->stop_streaming_follow_up_data(); - mWakeupManager->change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE); - - CWakeupEngineManager *engine_manager = mWakeupManager->get_engine_manager(); - if (nullptr == engine_manager) return; - - mWakeupManager->set_last_wakeup_event_info(wakeup_info); - engine_manager->set_selected_wakeup_info(wakeup_info); - vector observers = mWakeupManager->get_observers(); - for (const auto& observer : observers) { - observer->on_wakeup(wakeup_info); - } -} - -bool CWakeupManager::CAudioEventObserver::on_recording_audio_data(long time, void* data, int len) -{ - if (nullptr == mWakeupManager) return false; - if (nullptr == mEngineManager) return false; - - if (false == mEngineManager->get_audio_data_required()) return false; - - if (mWakeupManager->get_voice_key_pressed() != true) { - /* When follow-up streaming in progress, no need to feed audio data to wakeup engines */ - if (STREAMING_MODE::FOLLOW_UP != mWakeupManager->get_streaming_mode()) { - mEngineManager->engine_feed_audio_data(time, data, len); - } - } - - return true; -} - -bool CWakeupManager::CAudioEventObserver::on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) -{ - if (nullptr == mWakeupManager) return false; - - vector observers = mWakeupManager->get_observers(); - for (const auto& observer : observers) { - observer->on_streaming_audio_data(event, buffer, len); - } - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == event) { - mWakeupManager->set_streaming_mode(STREAMING_MODE::NONE); - } - - return true; -} - -bool CWakeupManager::CSettingsEventObserver::on_voice_input_language_changed( - const char* language) -{ - if (nullptr == mWakeupManager || nullptr == language) return false; - mWakeupManager->set_language(std::string(language)); - return true; -} - -} // wakeup -} // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp deleted file mode 100644 index d639cf1..0000000 --- a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ -#include "wakeup_manager_wrapper.h" -#include "wakeup_manager_main.h" -#include "wakeup_manager.h" - -using namespace multiassistant::wakeup; - -static wakeup_service_wakeup_event_cb g_wakeup_event_cb; -static void* g_wakeup_event_user_data; - -static wakeup_service_speech_streaming_cb g_utterance_streaming_cb; -static void* g_utterance_streaming_user_data; - -static wakeup_service_speech_streaming_cb g_previous_utterance_streaming_cb; -static void* g_previous_utterance_streaming_user_data; - -static wakeup_service_speech_streaming_cb g_follow_up_streaming_cb; -static void* g_follow_up_streaming_user_data; - -static wakeup_service_speech_status_cb g_speech_status_cb; -static void* g_speech_status_user_data; - -static wakeup_service_error_cb g_error_cb; -static void* g_error_user_data; - -static wakeup_service_streaming_section_changed_cb g_streaming_section_changed_cb; -static void* g_streaming_section_changed_user_data; - -class CWakeupEventObserver : public IWakeupEventObserver -{ - void on_wakeup(wakeup_event_info wakeup_info) override; - void on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) override; - void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override; -}; - -static CWakeupEventObserver g_wakeup_event_observer; -static CWakeupManager g_wakeup_manager(&g_wakeup_event_observer); - -int wakeup_manager_initialize(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_event_cb = NULL; - g_wakeup_event_user_data = NULL; - - g_utterance_streaming_cb = NULL; - g_utterance_streaming_user_data = NULL; - - g_follow_up_streaming_cb = NULL; - g_follow_up_streaming_user_data = NULL; - - g_speech_status_cb = NULL; - g_speech_status_user_data = NULL; - - g_error_cb = NULL; - g_error_user_data = NULL; - - g_wakeup_manager.initialize(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_deinitialize(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.deinitialize(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size) -{ - if (NULL == settings || NULL == struct_size) { - MWR_LOGD("[ERROR] Parameter is invalid, settings(%p), struct_size(%p)", settings, struct_size); - return -1; - } - CWakeupSettings* wakeup_settings = g_wakeup_manager.get_wakeup_settings(); - if (wakeup_settings) { - const int PLUGIN_VERSION = 1; - static ma_plugin_settings current_settings; - current_settings.plugin_version = PLUGIN_VERSION; - current_settings.ui_panel_enabled = wakeup_settings->get_ui_panel_enabled(); - *struct_size = sizeof(current_settings); - *settings = ¤t_settings; - } - - return 0; -} - -int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == appid || NULL == wakeup_word) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language); - return -1; - } - g_wakeup_manager.add_assistant_wakeup_word( - string{appid}, string{wakeup_word}, (language ? string{language} : string{})); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_add_assistant_language(const char* appid, const char* language) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == appid || NULL == language) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language); - return -1; - } - - g_wakeup_manager.add_assistant_language(string{appid}, string{language}); - - MWR_LOGD("[DEBUG] language(%s)", language); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_assistant_wakeup_engine(const char* appid, const char* engine) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == appid || NULL == engine) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup engine(%s)", appid, engine); - return -1; - } - - MWR_LOGD("[DEBUG] appid(%s), wakeup engine(%s)", appid, engine); - g_wakeup_manager.set_assistant_wakeup_engine(string{appid}, string{engine}); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_language(const char* language) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == language) { - MWR_LOGD("[ERROR] Parameter is invalid, language(%s)", language); - return -1; - } - - g_wakeup_manager.set_language(string{language}); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_change_state(wakeup_manager_state_e state) -{ - g_wakeup_manager.change_manager_state(state); - return 0; -} - -int wakeup_manager_activate(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.activate(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_deactivate(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.deactivate(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_update_voice_feedback_state(const char* appid, int state) -{ - MWR_LOGD("[ENTER]"); - - string appid_string; - if (NULL == appid) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s)", appid); - } else { - appid_string = appid; - } - - g_wakeup_manager.update_voice_feedback_state(appid_string, state); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_send_assistant_specific_command(const char* appid, const char* command) -{ - MWR_LOGD("[ENTER]"); - - string appid_string; - string command_string; - if (NULL == appid || NULL == command) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), command(%s)", appid, command); - } - if (appid) appid_string = appid; - if (command) command_string = command; - - g_wakeup_manager.send_assistant_specific_command(appid_string, command_string); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_background_volume(const char* appid, double ratio) -{ - MWR_LOGD("[ENTER]"); - - string appid_string; - if (NULL == appid) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s)", appid); - } else { - appid_string = appid; - } - - g_wakeup_manager.set_background_volume(appid_string, ratio); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_update_recognition_result(const char* appid, int result) -{ - MWR_LOGD("[ENTER]"); - - string appid_string; - if (NULL == appid) { - MWR_LOGD("[ERROR] Parameter is invalid, appid(%s)", appid); - } else { - appid_string = appid; - } - g_wakeup_manager.update_recognition_result(appid_string, result); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_process_event(int event, void* data, int len) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.process_event(static_cast(event), data, len); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_start_streaming_utterance_data(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.start_streaming_utterance_data(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_stop_streaming_utterance_data(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.stop_streaming_utterance_data(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_start_streaming_follow_up_data(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.start_streaming_follow_up_data(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_stop_streaming_follow_up_data(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.stop_streaming_follow_up_data(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_start_streaming_previous_utterance_data(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.start_streaming_previous_utterance_data(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_stop_streaming_previous_utterance_data(void) -{ - MWR_LOGD("[ENTER]"); - - g_wakeup_manager.stop_streaming_previous_utterance_data(); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_get_audio_format(int* rate, int* channel, int* audio_type) -{ - MWR_LOGD("[ENTER]"); - - if (!audio_type || !rate || !channel) { - MWR_LOGE("[ERROR] Invalid parameter"); - return -1; - } - - g_wakeup_manager.get_audio_format(rate, channel, audio_type); - - MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type); - return 0; -} - -int wakeup_manager_get_audio_source_type(char** type) -{ - MWR_LOGD("[ENTER]"); - - if (!type) { - MWR_LOGE("[ERROR] Invalid parameter"); - return -1; - } - - g_wakeup_manager.get_audio_source_type(type); - - MWR_LOGD("[END] type(%s)", *type); - return 0; -} - -int wakeup_manager_set_wake_word_audio_require_flag(bool require) -{ - MWR_LOGD("[ENTER] : %d", require); - - g_wakeup_manager.set_wake_word_audio_require_flag(require); - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_wakeup_event_cb = callback; - g_wakeup_event_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_utterance_streaming_cb = callback; - g_utterance_streaming_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_previous_utterance_streaming_cb = callback; - g_previous_utterance_streaming_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_follow_up_streaming_cb = callback; - g_follow_up_streaming_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_speech_status_cb = callback; - g_speech_status_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_error_cb = callback; - g_error_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data) -{ - MWR_LOGD("[ENTER]"); - - if (NULL == callback) { - MWR_LOGE("[ERROR] Input parameter is NULL"); - return -1; - } - - g_streaming_section_changed_cb = callback; - g_streaming_section_changed_user_data = user_data; - - MWR_LOGD("[END]"); - return 0; -} - -int wakeup_manager_feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len) -{ - g_wakeup_manager.feed_audio_data(event, buffer, len); - return 0; -} - -void CWakeupEventObserver::on_wakeup(wakeup_event_info wakeup_info) -{ - if (NULL != g_wakeup_event_cb) { - g_wakeup_event_cb(wakeup_info, g_wakeup_event_user_data); - } -} - -void CWakeupEventObserver::on_streaming_audio_data( - wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) -{ - if (WAKEUP_SPEECH_STREAMING_EVENT_START == event) { - MWR_LOGD("streaming_cb START"); - } - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == event) { - MWR_LOGD("streaming_cb FINISH"); - } - if (NULL != g_utterance_streaming_cb) { - g_utterance_streaming_cb(event, buffer, len, g_utterance_streaming_user_data); - } else { - MWR_LOGI("[INFO] No service streaming callback"); - } -} - -void CWakeupEventObserver::on_audio_streaming_data_section( - ma_audio_streaming_data_section_e section) -{ - if (g_streaming_section_changed_cb) { - g_streaming_section_changed_cb(section, g_streaming_section_changed_user_data); - } -} diff --git a/plugins/wakeup-manager/src/wakeup_policy.cpp b/plugins/wakeup-manager/src/wakeup_policy.cpp deleted file mode 100644 index 1ab9f12..0000000 --- a/plugins/wakeup-manager/src/wakeup_policy.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "wakeup_policy.h" -#include "wakeup_policy_impl.h" - -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -void CWakeupPolicyImpl::subscribe(IPolicyEventObserver *observer) -{ - mObservers.push_back(observer); -} - -void CWakeupPolicyImpl::unsubscribe(IPolicyEventObserver *observer) -{ - auto iter = find(mObservers.begin(), mObservers.end(), observer); - if (iter != mObservers.end()) { - mObservers.erase(iter); - } -} - -void CWakeupPolicyImpl::wakeup(wakeup_event_info wakeup_info) -{ - for (const auto& observer : mObservers) { - if (observer) { - observer->on_wakeup(wakeup_info); - } - } -} - -CWakeupPolicy::CWakeupPolicy() -{ - mImpl.reset(new CWakeupPolicyImpl); -} - -CWakeupPolicy::~CWakeupPolicy() -{ -} - -CWakeupPolicy::CWakeupPolicy(IPolicyEventObserver *observer) : CWakeupPolicy() -{ - subscribe(observer); -} - -void CWakeupPolicy::subscribe(IPolicyEventObserver *observer) -{ - if (mImpl) mImpl->subscribe(observer); -} - -void CWakeupPolicy::unsubscribe(IPolicyEventObserver *observer) -{ - if (mImpl) mImpl->unsubscribe(observer); -} - -} // wakeup -} // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_policy_default.cpp b/plugins/wakeup-manager/src/wakeup_policy_default.cpp deleted file mode 100644 index 2415636..0000000 --- a/plugins/wakeup-manager/src/wakeup_policy_default.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "wakeup_policy_default.h" -#include "wakeup_policy_impl.h" - -#include - -#include -#include - -#ifndef LOG_TAG -#define LOG_TAG "WakeupPolicyDefault" -#endif - -namespace multiassistant -{ -namespace wakeup -{ - -CWakeupPolicyDefault::CWakeupPolicyDefault() -{ -} - -CWakeupPolicyDefault::CWakeupPolicyDefault(IPolicyEventObserver *observer) - : CWakeupPolicy(observer) -{ -} - -CWakeupPolicyDefault::~CWakeupPolicyDefault() -{ - if (mTimer) { - ecore_timer_del(mTimer); - mTimer = nullptr; - } -} - -void CWakeupPolicyDefault::set_assistant_priority(string appid, int priority) -{ - PRIORITY_INFO info; - info.appid = appid; - info.priority = priority; - - LOGD("Setting assistant priority : %s %d", appid.c_str(), priority); - mPriorityInfos.push_back(info); -} - -void CWakeupPolicyDefault::set_delay(float seconds) -{ - LOGD("Setting delay : %f", seconds); - mDelaySeconds = seconds; -} - -static Eina_Bool timer_func(void *data) -{ - LOGD("[ENTER]"); - if (data) { - CWakeupPolicyDefault *policy = static_cast(data); - policy->timer_expired(); - } - return ECORE_CALLBACK_CANCEL; -} - -void CWakeupPolicyDefault::wakeup_candidate(wakeup_event_info wakeup_info) -{ - mWakeupInfos.push_back(wakeup_info); - if (nullptr == mTimer) { - ecore_thread_main_loop_begin(); - mTimer = ecore_timer_add(mDelaySeconds, timer_func, this); - ecore_thread_main_loop_end(); - } -} - -void CWakeupPolicyDefault::timer_expired() -{ - LOGD("[ENTER]"); - if (0 == mWakeupInfos.size()) return; - - wakeup_event_info selected = mWakeupInfos.front(); - int selected_priority = -1; - for (const auto &wakeup : mWakeupInfos) { - for (const auto &info : mPriorityInfos) { - if (0 == info.appid.compare(wakeup.wakeup_appid)) { - if (info.priority > selected_priority || -1 == selected_priority) { - LOGD("Wakeup with higher priority found : %s, %d", - info.appid.c_str(), info.priority); - selected = wakeup; - selected_priority = info.priority; - } - } - } - } - if (mImpl) mImpl->wakeup(selected); - mWakeupInfos.clear(); - - if (mTimer) { - LOGD("Now deleting timer"); - ecore_timer_del(mTimer); - mTimer = nullptr; - } -} - -} // wakeup -} // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_settings.cpp b/plugins/wakeup-manager/src/wakeup_settings.cpp deleted file mode 100644 index 0787f09..0000000 --- a/plugins/wakeup-manager/src/wakeup_settings.cpp +++ /dev/null @@ -1,195 +0,0 @@ -#include "wakeup_settings.h" -#include "wakeup_manager_main.h" - -#include -#include - -namespace multiassistant -{ -namespace wakeup -{ - -CWakeupSettings::CWakeupSettings() -{ -} - -CWakeupSettings::~CWakeupSettings() -{ -} - -static void wakeup_setting_input_language_changed_cb(keynode_t *node, void* data) -{ - if (nullptr == node) return; - - CWakeupSettings* settings = static_cast(data); - if (nullptr == settings) return; - - if (VCONF_TYPE_STRING == node->type) { - const char* value = static_cast(node->value.s); - vector observers = settings->get_observers(); - for (const auto& observer : observers) { - if (observer) { - if (!observer->on_voice_input_language_changed(value)) { - LOGW("[Settings WARNING] One of the observer returned false"); - } - } - } - } else { - LOGE("[Settings ERROR] the value type is not string : %d", node->type); - } -} - -void CWakeupSettings::initialize() -{ - int vconf_ret; - char *vconf_str; - int vconf_bool; - double vconf_double; - - vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID); - if (vconf_str) { - mDefaultAssistantAppid = vconf_str; - MWR_LOGD("default_assistant_appid : %s", mDefaultAssistantAppid.c_str()); - free(vconf_str); - vconf_str = nullptr; - } - vconf_ret = vconf_get_bool(WAKEUP_SETTINGS_KEY_UI_PANEL_ENABLED, &vconf_bool); - if (0 == vconf_ret) { - mUiPanelEnabled = vconf_bool; - MWR_LOGD("ui_panel_enabled : %s", (mUiPanelEnabled ? "true" : "false")); - } - vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_CONVERSATION_TIMEOUT, &vconf_double); - if (0 == vconf_ret) { - mConversationTimeout = vconf_double; - MWR_LOGD("conversation_timeout : %f", mConversationTimeout); - } - vconf_ret = vconf_get_bool(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE, &vconf_bool); - if (0 == vconf_ret) { - mMultipleMode = vconf_bool; - MWR_LOGD("multiple_mode : %s", (mMultipleMode ? "true" : "false")); - } - vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS); - if (vconf_str) { - string token; - istringstream iss(vconf_str); - mEnabledAssistants.clear(); - while (getline(iss, token, ';')) { - mEnabledAssistants.push_back(token); - MWR_LOGD("enabled_assistants : %s", token.c_str()); - } - free(vconf_str); - vconf_str = nullptr; - } - vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_DELAY, &vconf_double); - if (0 == vconf_ret) { - mWakeupPolicyDelay = vconf_double; - MWR_LOGD("conversation_timeout : %f", mWakeupPolicyDelay); - } - vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_PRIORITY); - if (vconf_str) { - string token; - istringstream iss(vconf_str); - mWakeupPolicyPriority.clear(); - while (getline(iss, token, ';')) { - mWakeupPolicyPriority.push_back(token); - MWR_LOGD("wakeup_policy_priority : %s", token.c_str()); - } - free(vconf_str); - vconf_str = nullptr; - } - vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX, &vconf_double); - if (0 == vconf_ret) { - mStreamingDurationMax = vconf_double; - MWR_LOGD("streaming_duration_max : %f", mStreamingDurationMax); - } - - vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE, - wakeup_setting_input_language_changed_cb, this); -} - -void CWakeupSettings::deinitialize() -{ - vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE, NULL); -} - -void CWakeupSettings::subscribe(ISettingsEventObserver *observer) -{ - mObservers.push_back(observer); -} - -void CWakeupSettings::unsubscribe(ISettingsEventObserver *observer) -{ - auto iter = find(mObservers.begin(), mObservers.end(), observer); - if (iter != mObservers.end()) { - mObservers.erase(iter); - } -} - -vector CWakeupSettings::get_observers() -{ - return mObservers; -} - -string CWakeupSettings::get_default_assistant_appid() -{ - char *vconf_str; - vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID); - MWR_LOGD("default_assistant_appid : %s", vconf_str); - if (vconf_str) { - mDefaultAssistantAppid = vconf_str; - MWR_LOGD("default_assistant_appid : %s", mDefaultAssistantAppid.c_str()); - free(vconf_str); - vconf_str = nullptr; - } - - return mDefaultAssistantAppid; -} - -bool CWakeupSettings::get_ui_panel_enabled() -{ - return mUiPanelEnabled; -} - -float CWakeupSettings::get_conversation_timeout() -{ - return mConversationTimeout; -} - -bool CWakeupSettings::get_multiple_mode() -{ - return mMultipleMode; -} - -vector CWakeupSettings::get_enabled_assistants() -{ - return mEnabledAssistants; -} - -float CWakeupSettings::get_wakeup_policy_delay() -{ - return mWakeupPolicyDelay; -} - -vector CWakeupSettings::get_wakeup_policy_priority() -{ - return mWakeupPolicyPriority; -} - -float CWakeupSettings::get_streaming_duration_max() -{ - return mStreamingDurationMax; -} - -std::string CWakeupSettings::get_current_language(void) -{ - std::string result{"en_US"}; - char* language = vconf_get_str(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE); - if (language) { - result = language; - free(language); - } - return result; -} - -} // wakeup -} // multiassistant diff --git a/res/HMM_Reduced.binary b/res/HMM_Reduced.binary new file mode 100644 index 0000000..2768cd1 Binary files /dev/null and b/res/HMM_Reduced.binary differ diff --git a/res/PronDict_UTF8.txt b/res/PronDict_UTF8.txt new file mode 100644 index 0000000..4e93a1f --- /dev/null +++ b/res/PronDict_UTF8.txt @@ -0,0 +1 @@ +하이빅스비 H1 A2 W3 O1 I2 W3 B1 I2 G3 SS1 EU2 W3 B1 I2 W3 diff --git a/res/combine_4_phoneme_mono1.txt b/res/combine_4_phoneme_mono1.txt new file mode 100644 index 0000000..762bd1f --- /dev/null +++ b/res/combine_4_phoneme_mono1.txt @@ -0,0 +1,50 @@ +A2 +AE2 +B1 +B3 +BB1 +C1 +D1 +D3 +DD1 +E2 +EO2 +EU2 +G1 +G3 +GG1 +H1 +I2 +J1 +JJ1 +K1 +L3 +M1 +M3 +N1 +N3 +NG3 +O1 +O2 +OE2 +P1 +R1 +S1 +SS1 +T1 +U2 +W3 +WA2 +WAE2 +WE2 +WEO2 +WI2 +YA2 +YAE2 +YE2 +YEO2 +YI2 +YO2 +YU2 +sil +sp diff --git a/res/combine_4_phoneme_tri_xwrd1.txt b/res/combine_4_phoneme_tri_xwrd1.txt new file mode 100644 index 0000000..3be9ce6 --- /dev/null +++ b/res/combine_4_phoneme_tri_xwrd1.txt @@ -0,0 +1,11658 @@ +O2-NG3+C1 +N3-GG1+WI2 +O2-NG3+D1 +EO2-L3+R1 +EO2-L3+S1 +N3-R1+A2 +B3-P1+I2 +EO2-L3+T1 +O2-NG3+G1 +O2-NG3+H1 +A2-NG3+JJ1 +N3-R1+E2 +M3-GG1+OE2 +GG1-O2+W3 +O2-NG3+J1 +L3-B1 +O2-NG3+K1 +B3-P1+O2 +L3-C1 +B1-E2+NG3 +L3-D1 +O2-NG3+M1 +N3-R1+I2 +D3-C1+YEO2 +O2-NG3+N1 +O2-NG3+O1 +L3-G1 +O2-NG3+P1 +L3-G1+YAE2 L3-G1 +L3-H1 +B3-P1+U2 +O2-NG3+R1 +L3-J1 +O2-NG3+S1 +N3-R1+O2 +NG3-R1+AE2 +L3-K1 +O2-NG3+T1 O2-NG3+P1 +NG3-N1+OE2 +L3-M1 +G1-EO2+NG3 +L3-N1 +L3-O1 +D3-DD1+OE2 +L3-P1 +N3-R1+U2 +WAE2-W3+JJ1 +L3-R1 +SS1-I2+B3 +L3-S1 +M1+WA2 +L3-T1 +SS1-I2+D3 +N3-D1+AE2 +R1-O2+B3 +K1-YA2+B3 +R1-O2+D3 +M1+WE2 +SS1-I2+G3 +K1-YA2+D3 K1-YA2+B3 +R1-O2+G3 +K1-YA2+G3 K1-YA2+B3 +YAE2-G3+SS1 +M1+WI2 +B3-R1+WEO2 +G1-WEO2+B3 +SS1-I2+L3 +SS1-I2+M3 +GG1+AE2 M3-GG1+OE2 +B3-G1+EO2 +G1-WEO2+D3 +M3-K1+WAE2 +SS1-I2+N3 SS1-I2+M3 +R1-O2+L3 +K1-YA2+L3 +R1-O2+M3 +W3-JJ1+YA2 +K1-YA2+M3 +G1-WEO2+G3 G1-WEO2+B3 +R1-O2+N3 R1-O2+M3 +K1-YA2+N3 +W3-K1+A2 +B1+WEO2 +B3-G1+EU2 +W3-JJ1+YE2 W3-JJ1+YA2 +B1-WI2+NG3 +YI2-M3+JJ1 +M3-N1+YEO2 +G1-WEO2+L3 +W3-K1+E2 +G1-WEO2+M3 G1-WEO2+B3 +SS1-I2+W3 +G1-WEO2+N3 +D3-BB1+A2 +W3-JJ1+YI2 W3-JJ1+YA2 +R1-O2+W3 +K1-YA2+W3 +W3-K1+I2 +AE2+NG3 +D3-BB1+E2 +DD1-WA2+NG3 +S1-EO2+NG3 +W3-JJ1+YO2 +N3-GG1+YA2 +D3-BB1+I2 +W3-K1+O2 +L3-P1+AE2 +G1-WEO2+W3 G1-WEO2+B3 +W3-B1+EO2 +N3-GG1+YE2 N3-GG1+YA2 +W3-JJ1+YU2 W3-JJ1+YA2 +D3-BB1+O2 +W3-K1+U2 +N3-GG1+YI2 N3-GG1+YA2 +W3-B1+EU2 +YA2-G3+B1 +G3-GG1+YAE2 +YA2-G3+C1 +A2 +YA2-G3+D1 +D3-BB1+U2 +N3-R1+WEO2 B3-R1+WEO2 +B1 +B3 +YAE2-G3+B1 +C1 +N3-GG1+YO2 +BB1-U2+B3 +YAE2-G3+C1 +D1 +D3 +YA2-G3+G1 +YAE2-G3+D1 +E2 +YA2-G3+H1 +BB1-U2+D3 +K1-U2+B3 +U2-NG3 +G1 +G3 +YA2-G3+J1 +K1-U2+D3 K1-U2+B3 +YAE2-G3+G1 YAE2-G3+B1 +H1 +YA2-G3+K1 +BB1-U2+G3 +YAE2-G3+H1 +I2 +N3-GG1+YU2 N3-GG1+YA2 +D3-T1+YEO2 +J1 +YA2-G3+M1 +K1-U2+G3 +N1-WI2+NG3 +YAE2-G3+J1 +K1 L3-K1 +YA2-G3+N1 +D3-O1+A2 +YAE2-G3+K1 +L3 +YA2-G3+O1 +M1 M1+WE2 +M3 +YA2-G3+P1 +BB1-U2+L3 +YAE2-G3+M1 +N1 L3-N1 +N3 +BB1-U2+M3 +YAE2-G3+N1 YAE2-G3+M1 +O1 +O2 +YA2-G3+R1 +BB1-U2+N3 +K1-U2+L3 +D3-O1+E2 +YAE2-G3+O1 +P1 +YA2-G3+S1 +K1-U2+M3 +YAE2-G3+P1 +YA2-G3+T1 YA2-G3+R1 +K1-U2+N3 +R1 +YAE2-G3+R1 +S1 +D3-O1+I2 +YAE2-G3+S1 +T1 +L3-J1+WA2 +YAE2-G3+T1 YAE2-G3+R1 +U2 +M1+YA2 M1+WE2 +G1-WAE2+B3 +W3 +OE2-M3+JJ1 +L3-J1+WE2 L3-J1 +BB1-U2+W3 +G1-WAE2+D3 +D3-O1+O2 +SS1-YA2+NG3 +K1-U2+W3 +M1+YE2 M1+WE2 +G1-WAE2+G3 G1-WAE2+B3 +L3-J1+WI2 +W3-SS1+EO2 +M1+YI2 M1+WE2 +D3-O1+U2 +U2-M3+B1 +G1-WAE2+L3 +U2-M3+C1 +G1-WAE2+M3 +U2-M3+D1 +sil-DD1+WA2 +G1-WAE2+N3 G1-WAE2+L3 +W3-SS1+EU2 +M1+YO2 +U2-M3+G1 +U2-M3+H1 +sil-DD1+WE2 sil-DD1+WA2 +B3-DD1+AE2 +L3-SS1+OE2 +U2-M3+J1 +S1+WEO2 +U2-M3+K1 +sil-DD1+WI2 +M1+YU2 M1+WE2 +H1-YI2+B3 +U2-M3+M1 +G1-WAE2+W3 G1-WAE2+M3 +U2-M3+N1 +H1-YI2+D3 H1-YI2+B3 +U2-M3+O1 +U2-M3+P1 +H1-YI2+G3 H1-YI2+B3 +U2-M3+R1 +U2-M3+S1 +DD1-YU2+B3 +NG3-G1+A2 +U2-M3+T1 U2-M3+R1 +M3-H1+A2 +B3-GG1+WAE2 +DD1-YU2+D3 DD1-YU2+B3 +WA2-M3+B1 +sp +H1-YI2+L3 H1-YI2+B3 +WA2-M3+C1 YI2-M3+JJ1 +NG3-G1+E2 +H1-YI2+M3 H1-YI2+B3 +WA2-M3+D1 +M3-H1+E2 +DD1-YU2+G3 DD1-YU2+B3 +H1-YI2+N3 H1-YI2+B3 +W3-GG1+AE2 +WA2-M3+G1 +NG3-G1+I2 +WA2-M3+H1 +M3-H1+I2 +B3-H1+WEO2 +sil-G1+WEO2 +DD1-YU2+L3 +WA2-M3+J1 +DD1-YU2+M3 +WA2-M3+K1 +M3-S1+WA2 +DD1-YU2+N3 +WA2-M3+M1 +NG3-G1+O2 +H1-YI2+W3 H1-YI2+B3 +WA2-M3+N1 +A2-G3+SS1 +YU2-L3+BB1 +M3-H1+O2 +S1+EO2 +WA2-M3+O1 +M3-S1+WE2 M3-S1+WA2 +WA2-M3+P1 +E2+B3 +WA2-M3+R1 +E2+D3 +WA2-M3+S1 +M3-S1+WI2 +NG3-G1+U2 +WA2-M3+T1 WA2-M3+R1 +M3-H1+U2 +S1+EU2 +DD1-YU2+W3 DD1-YU2+M3 +E2+G3 E2+D3 +N3-DD1+AE2 +YAE2-M3+BB1 +W3-D1+AE2 +T1-YA2+B3 K1-YA2+B3 +N3+sil +SS1-WAE2 +T1-YA2+D3 K1-YA2+B3 +E2+L3 E2 +E2+M3 +E2+N3 E2 +OE2-G3+B1 +T1-YA2+G3 K1-YA2+B3 +OE2-G3+C1 +OE2-G3+D1 +L3-J1+YA2 L3-J1 +B3-C1+WA2 +L3-G1+YEO2 +OE2-G3+G1 +YO2-D3+sil +T1-YA2+L3 +OE2-G3+H1 +T1-YA2+M3 +NG3-R1+EO2 +L3-J1+YE2 L3-J1 +T1-YA2+N3 +OE2-G3+J1 +B3-C1+WE2 +E2+W3 +OE2-G3+K1 OE2-G3+G1 +OE2-G3+M1 +U2-M3+sil +L3-J1+YI2 L3-J1 +OE2-G3+N1 OE2-G3+M1 +B3-C1+WI2 +OE2-G3+O1 +NG3-R1+EU2 +D3-G1+WAE2 +OE2-G3+P1 +B1-OE2+B3 +OE2-G3+R1 OE2-G3+C1 +SS1-YU2+B3 DD1-YU2+B3 +T1-YA2+W3 +OE2-G3+S1 +sil-BB1+A2 +B1-OE2+D3 +L3-J1+YO2 +sil-DD1+YA2 sil-DD1+WA2 +N3-D1+EO2 +OE2-G3+T1 OE2-G3+C1 +SS1-YU2+D3 DD1-YU2+B3 +B1-OE2+G3 +sil-BB1+E2 +SS1-YU2+G3 DD1-YU2+B3 +sil-DD1+YE2 sil-DD1+WA2 +L3-J1+YU2 L3-J1 +N3-D1+EU2 +L3-N1+YAE2 +sil-BB1+I2 +B1-OE2+L3 B1-OE2+D3 +sil-DD1+YI2 sil-DD1+WA2 +B1-OE2+M3 +GG1+EO2 +SS1-YU2+L3 DD1-YU2+L3 +M3-K1+WEO2 +B1-OE2+N3 +SS1-YU2+M3 DD1-YU2+M3 +SS1-YU2+N3 DD1-YU2+N3 +sil-BB1+O2 +sil-DD1+YO2 sil-DD1+WA2 +GG1+EU2 +B1-OE2+W3 B1-OE2+B3 +sil-BB1+U2 +SS1-YU2+W3 DD1-YU2+M3 +sil-DD1+YU2 sil-DD1+WA2 +sil-D1+A2 +E2-M3+SS1 +sil-D1+E2 +M3-S1+YA2 M3-S1+WA2 +C1-AE2 +L3-P1+EO2 +M3-R1+WAE2 R1 +sil-D1+I2 +M3-S1+YE2 M3-S1+WA2 +E2-B3 +YU2-L3+DD1 +L3-P1+EU2 +E2-D3 +M3-S1+YI2 M3-S1+WA2 +sil-D1+O2 +E2-G3 +G3-GG1+YEO2 +WI2-G3+SS1 +YAE2-M3+DD1 WA2-M3+R1 +EO2-W3+sil +M3-S1+YO2 +E2-L3 +sil-D1+U2 +E2-M3 +E2-N3 +M3-S1+YU2 +B3-C1+YA2 B3-C1+WE2 +JJ1-EU2+B3 +AE2-G3+SS1 +JJ1-EU2+D3 +YO2-N3+SS1 +D1-YU2+B3 DD1-YU2+B3 +B3-C1+YE2 B3-C1+WE2 +N1-WEO2+NG3 +E2-W3 +P1-WAE2 +D1-YU2+D3 DD1-YU2+B3 +JJ1-EU2+G3 JJ1-EU2+B3 +B3-C1+YI2 +WEO2+B3 +D1-YU2+G3 DD1-YU2+B3 +W3-BB1+YAE2 +WEO2-G3+BB1 YAE2-G3+P1 +U2-W3+SS1 +G1+YAE2 G1 +G3-M1+WAE2 +WEO2+D3 +JJ1-EU2+L3 +JJ1-EU2+M3 +WEO2+G3 WEO2+B3 +JJ1-EU2+N3 +D1-YU2+L3 DD1-YU2+L3 +B3-C1+YO2 B3-C1+WE2 +D1-YU2+M3 +D1-YU2+N3 DD1-YU2+N3 +WEO2+L3 +WEO2+M3 +B3-C1+YU2 B3-C1+WE2 +WEO2+N3 +JJ1-EU2+W3 +NG3-T1+AE2 +A2-M3+BB1 YAE2-M3+BB1 +M3-JJ1+WAE2 +NG3-P1+OE2 +D1-YU2+W3 D1-YU2+M3 +B3-DD1+EO2 +WEO2+W3 WEO2+B3 +O1+WA2 +J1-WA2+NG3 +B3-DD1+EU2 +N3-B1+OE2 +A2-G3+B1 +O1+WE2 +A2-G3+C1 +WAE2-M3+sil +A2-G3+D1 +B3-GG1+WEO2 +O1+WI2 +M3-GG1+WA2 +A2-G3+G1 +A2-G3+H1 +H1-A2+NG3 +A2-G3+J1 +M3-GG1+WE2 N3-GG1+YA2 +A2-G3+K1 A2-G3+G1 +W3-GG1+EO2 GG1+EO2 +A2-G3+M1 +A2-G3+N1 A2-G3+M1 +M3-GG1+WI2 +A2-G3+O1 +A2-G3+P1 +W3-GG1+EU2 GG1+EU2 +A2-G3+R1 +NG3-N1+WA2 +A2-G3+S1 +A2-G3+T1 A2-G3+R1 +L3-GG1+OE2 M3-GG1+OE2 +D3-DD1+WA2 +NG3-N1+WE2 +YE2+NG3 +D3-DD1+WE2 D3-DD1+WA2 +NG3-N1+WI2 +N3-DD1+EO2 +WAE2+B3 +L3-R1+AE2 +O1-YO2+B3 +W3-D1+EO2 +WAE2+D3 G1-WAE2+D3 +L3-N1+OE2 +D3-DD1+WI2 +O1-YO2+D3 O1-YO2+B3 +SS1-WEO2 +WAE2+G3 WAE2+B3 +E2-NG3+sil +N3-DD1+EU2 +YE2-G3+SS1 YAE2-G3+SS1 +WEO2-NG3+sil +O1-YO2+G3 O1-YO2+B3 +W3-D1+EU2 +WEO2-B3 B3 +WAE2+L3 +WEO2-D3 D3 +WAE2+M3 P1-WAE2 +O1-YO2+L3 +WAE2+N3 WAE2+L3 +WEO2-G3+DD1 YAE2-G3+R1 +O1-YO2+M3 O1-YO2+L3 +O1-YO2+N3 O1-YO2+L3 +WEO2-G3 G3 +L3-BB1 +YU2-L3+GG1 +WEO2-L3 +NG3-T1+A2 +WEO2-M3 M3 +D3-G1+WEO2 +BB1-WAE2+NG3 +WEO2-N3 N3 +WAE2+W3 P1-WAE2 +A2-NG3+SS1 +O1-YO2+W3 +NG3-T1+E2 NG3-T1+AE2 +L3-K1+WAE2 M3-K1+WAE2 +YAE2-M3+GG1 +A2-M3+DD1 WA2-M3+R1 +NG3-T1+I2 +G3-JJ1+AE2 +WEO2-W3 +L3-N1+YEO2 +B3-M1+YAE2 M1+WE2 +O1+YA2 +WI2-M3+BB1 +NG3-T1+O2 +W3-G1+YAE2 G1 +JJ1-E2+NG3 +O1+YE2 +NG3-T1+U2 +R1-EO2+NG3 +O1+YI2 +WAE2-W3+SS1 +M3-GG1+YA2 N3-GG1+YA2 +AE2-M3+BB1 +M3-GG1+YE2 N3-GG1+YA2 +EU2-NG3+B1 +O1+YO2 +EU2-NG3+C1 +EU2-NG3+D1 +M3-GG1+YI2 N3-GG1+YA2 +EU2-NG3+G1 +B1-YEO2+NG3 +C1-EO2 +EU2-NG3+H1 +O1+YU2 +NG3-N1+YA2 +M3-R1+WEO2 B3-R1+WEO2 +M1-YU2+B3 +EU2-NG3+J1 +M3-GG1+YO2 N3-GG1+YO2 +EU2-NG3+K1 +M1-YU2+D3 M1-YU2+B3 +D3-DD1+YA2 D3-DD1+WA2 +NG3-N1+YE2 +EU2-NG3+M1 +C1-EU2 +EU2-NG3+N1 +M1-YU2+G3 M1-YU2+B3 +EU2-NG3+O1 +EU2-NG3+P1 +D3-DD1+YE2 D3-DD1+WA2 +YI2-M3+SS1 +BB1-EU2+B3 +M3-GG1+YU2 N3-GG1+YA2 +NG3-N1+YI2 +WAE2-B3 B3 +EU2-NG3+R1 +M1-WI2+NG3 N1-WI2+NG3 +BB1-EU2+D3 +B3-K1+AE2 +EU2-NG3+S1 +N3-M1+YAE2 M1+WE2 +WAE2-D3 +M1-YU2+L3 +EU2-NG3+T1 EU2-NG3+P1 +D3-DD1+YI2 D3-DD1+WA2 +B3-G1+OE2 +M1-YU2+M3 +BB1-EU2+G3 BB1-EU2+B3 +M1-YU2+N3 +WAE2-G3 +NG3-N1+YO2 +D3-DD1+YO2 D3-DD1+WA2 +BB1-EU2+L3 +BB1-EU2+M3 +WAE2-L3 L3 +D3-GG1+A2 +BB1-EU2+N3 +WAE2-M3 M3 +NG3-N1+YU2 +WAE2-N3 +YU2-N3+BB1 +M1-YU2+W3 +N1-I2+B3 +D3-DD1+YU2 D3-DD1+WA2 +D3-GG1+E2 +L3-SS1+WA2 +P1-WEO2 +N1-I2+D3 +L3-DD1 +D3-GG1+I2 +N1-I2+G3 +L3-SS1+WE2 +BB1-EU2+W3 +K1-WAE2+NG3 G1-WAE2+M3 +W3-BB1+YEO2 W3-BB1+YAE2 +G1+YEO2 +G3-M1+WEO2 +WAE2-W3 W3 +L3-SS1+WI2 +W3-B1+OE2 +D3-GG1+YAE2 +N1-I2+L3 +D3-GG1+O2 +N1-I2+M3 +N1-I2+N3 +D3-GG1+U2 +NG3-T1+EO2 +WI2-M3+DD1 +M3-JJ1+WEO2 +N1-I2+W3 +YAE2-NG3+BB1 +M3-DD1+A2 +NG3-T1+EU2 +N1+YAE2 L3-N1+YAE2 +OE2-M3+SS1 E2-M3+SS1 +M3-DD1+E2 +WEO2-G3+GG1 YAE2-G3+K1 +AE2-M3+DD1 +M3-DD1+I2 +WAE2+NG3 P1-WAE2 +YU2-L3+JJ1 +M3-DD1+O2 +G1-O2+B3 +G1-O2+D3 +M3-DD1+U2 +B3-C1+YAE2 B3-C1+WE2 +sil-B1+YAE2 +YAE2-M3+JJ1 YI2-M3+JJ1 +A2-M3+GG1 YAE2-M3+GG1 +M3-DD1+AE2 M3-DD1+E2 +G1-O2+G3 +W3-SS1+OE2 +AE2-NG3+BB1 +G1-O2+L3 +G1-O2+M3 +G1-O2+N3 +G1-WA2+B3 +L3-R1+EO2 +EO2-B3+BB1 +G1-WA2+D3 +WE2-W3+sil +YU2-N3+DD1 +G1-WA2+G3 G1-WA2+B3 +H1-EU2+NG3 +L3-SS1+YA2 L3-SS1+WE2 +G1-O2+W3 +L3-R1+EU2 +M3-DD1+YAE2 +N3-JJ1+YAE2 +G1-WA2+L3 +L3-SS1+YE2 L3-SS1+WE2 +G1-WA2+M3 +G1-WA2+N3 +K1-WE2+NG3 +L3-SS1+YI2 L3-SS1+WE2 +L3-SS1+YO2 L3-SS1+WE2 +G1-WA2+W3 +BB1-E2+NG3 +L3-K1+WEO2 L3-K1 +S1+OE2 +L3-SS1+YU2 L3-SS1+WE2 +W3-D1+WAE2 +B3+B1 +B3+C1 +G3-JJ1+EO2 +B3+D1 B3 +YAE2-NG3+DD1 +B3-M1+YEO2 +B3+G1 +B3+H1 B3 +W3-G1+YEO2 +G3-JJ1+EU2 +B3+J1 B3+C1 +WA2-NG3+B1 +B3+K1 +WA2-NG3+C1 +B1-I2+NG3 +WA2-NG3+D1 +T1-EU2+NG3 +B3+M1 +B3+N1 +J1-WEO2+NG3 +B3+O1 +WA2-NG3+G1 +B3+P1 B3+B1 +WA2-NG3+H1 +L3-GG1 N3-GG1+YA2 +WI2-G3+B1 +WI2-G3+C1 +B3+R1 B3 +WA2-NG3+J1 +WI2-G3+D1 +B3+S1 +WA2-NG3+K1 +L3-R1+WAE2 L3-R1 +B3+T1 B3 +NG3-R1+OE2 +WA2-NG3+M1 +WI2-G3+G1 +WA2-NG3+N1 +WI2-G3+H1 +WA2-NG3+O1 +WA2-NG3+P1 +WI2-G3+J1 WI2-G3+C1 +WI2-G3+K1 WI2-G3+G1 +JJ1-OE2+B3 +WA2-NG3+R1 +B3-T1+YAE2 D3-T1+YEO2 +sil-S1+YAE2 +WA2-NG3+S1 +WI2-G3+M1 OE2-G3+M1 +JJ1-OE2+D3 +WA2-NG3+T1 +WI2-G3+N1 OE2-G3+M1 +sil-GG1+A2 +WI2-G3+O1 OE2-G3+O1 +N3-H1+AE2 +WI2-G3+P1 +JJ1-OE2+G3 JJ1-OE2+B3 +N3-D1+OE2 +AE2-NG3+DD1 +WI2-G3+R1 WI2-G3+D1 +sil-GG1+E2 +D1-YAE2 +WI2-G3+S1 +WI2-M3+GG1 +WI2-G3+T1 WI2-G3+D1 +JJ1-OE2+L3 JJ1-OE2+D3 +JJ1-OE2+M3 +sil-GG1+I2 +JJ1-OE2+N3 B1-OE2+N3 +B3-K1+EO2 +N3-M1+YEO2 B3-M1+YEO2 +EO2-B3+DD1 +GG1+OE2 M3-GG1+OE2 +EO2-B3+B1 EO2-B3+BB1 +GG1-E2+B3 +EO2-B3+C1 +SS1-WEO2+B3 SS1-WEO2 +sil-GG1+O2 +EO2-B3+D1 +GG1-E2+D3 +B3-K1+EU2 +SS1-WEO2+D3 WEO2+D3 +WEO2-G3+JJ1 YAE2-G3+C1 +EO2-B3+G1 +AE2-M3+GG1 YAE2-M3+GG1 +GG1-E2+G3 GG1-E2+B3 +JJ1-OE2+W3 JJ1-OE2+B3 +EO2-B3+H1 EO2-B3+BB1 +SS1-WEO2+G3 SS1-WEO2 +sil-GG1+U2 sil-GG1+O2 +NG3-P1+WA2 +EO2-B3+J1 EO2-B3+C1 +EO2-B3+K1 EO2-B3+G1 +GG1-E2+L3 +EO2-B3+M1 +GG1-E2+M3 +SS1-WEO2+L3 +NG3-P1+WE2 NG3-P1+WA2 +EO2-B3+N1 +GG1-E2+N3 GG1-E2+L3 +SS1-WEO2+M3 +DD1-WE2+NG3 K1-WE2+NG3 +EO2-B3+O1 +YA2-W3+sil +SS1-WEO2+N3 +EO2-B3+P1 EO2-B3+BB1 +NG3-P1+WI2 +EO2-B3+R1 EO2-B3+BB1 +L3-T1+AE2 +EO2-B3+S1 +N3-H1+A2 +EO2-B3+T1 EO2-B3+BB1 +N3-T1+YAE2 NG3-T1+AE2 +L3-P1+OE2 +N3-B1+WA2 +A2-M3+JJ1 +K1+A2 +D3-GG1+YEO2 +N3-H1+E2 N3-H1+AE2 +GG1-E2+W3 GG1-E2+M3 +N3-B1+WE2 +SS1-WEO2+W3 SS1-WEO2 +B3-B1 +B3-C1 B3-C1+WE2 +K1+E2 +B3-D1 +N3-H1+I2 +N3-B1+WI2 +B3-G1 +K1+I2 W3-K1+I2 +B3-H1 +N3-BB1+WAE2 +B3-J1 +N3-H1+O2 M3-H1+O2 +N3-BB1 N3-BB1+WAE2 +B3-K1 L3-K1 +B3-M1 M1+WE2 +K1+O2 +B3-N1 +YU2-N3+GG1 +B3-O1 O1 +B3-P1 P1 +N3-H1+U2 +N1+YEO2 L3-N1+YEO2 +L3-GG1+WA2 +B3-R1 R1 +N3-JJ1+A2 +B3-S1 +K1+U2 +B3-T1 T1 +L3-GG1+WE2 N3-GG1+YA2 +R1-E2+B3 +N3-JJ1+E2 +R1-E2+D3 R1-E2+B3 +L3-GG1+WI2 M3-GG1+WI2 +JJ1-YU2+NG3 DD1-YU2+M3 +L3-N1+WA2 +N3-JJ1+I2 +R1-E2+G3 R1-E2+B3 +L3-N1+WE2 +SS1-YE2+NG3 +R1-E2+L3 +N3-JJ1+O2 +R1-E2+M3 R1-E2+B3 +R1-E2+N3 R1-E2+B3 +L3-N1+WI2 +SS1-WAE2+B3 +B3-C1+YEO2 +sil-B1+YEO2 sil-B1+YAE2 +SS1-WAE2+D3 +M3-DD1+EO2 +N3-JJ1+U2 +G3-N1+A2 +SS1-WAE2+G3 SS1-WAE2+B3 +YAE2-NG3+GG1 +R1-E2+W3 +G3-N1+E2 +M3-DD1+EU2 +SS1-WAE2+L3 SS1-WAE2 +SS1-WAE2+M3 SS1-WAE2 +J1-EO2+B3 +SS1-WAE2+N3 SS1-WAE2 +B3-DD1+OE2 +G3-N1+I2 +J1-EO2+D3 +NG3-P1+YA2 NG3-P1+WA2 +L3-JJ1 +O1-WE2+B3 +J1-EO2+G3 +O1-WE2+D3 O1-WE2+B3 +G3-N1+O2 +NG3-P1+YE2 NG3-P1+WA2 +M3-DD1+YEO2 M3-DD1+YAE2 +SS1-WAE2+W3 SS1-WAE2 +O1-WE2+G3 O1-WE2+B3 +J1-EO2+L3 +N3-JJ1+YEO2 N3-JJ1+YAE2 +J1-EO2+M3 +NG3-P1+YI2 NG3-P1+WA2 +NG3-P1+WAE2 NG3-P1+WA2 +J1-EO2+N3 +B3-M1+AE2 +G3-N1+U2 +N3-B1+YA2 N3-B1+WE2 +O1-WE2+L3 O1-WE2+B3 +E2-G3+sil +O1-WE2+M3 O1-WE2+B3 +K1-A2 +O1-WE2+N3 +NG3-P1+YO2 +W3-GG1+OE2 +N3-B1+YE2 N3-B1+WE2 +K1-E2 +AE2-NG3+GG1 +J1-EO2+W3 +D3-B1+YAE2 +N3-B1+YI2 +O2-W3+sil +WI2-M3+JJ1 +NG3-P1+YU2 +K1-I2 +O1-WE2+W3 O1-WE2+B3 +W3-D1+WEO2 +N3-B1+YO2 N3-B1+WE2 +EO2-B3+GG1 +N3-DD1 +K1-O2 +YI2-N3+B1 +YI2-N3+C1 +L3-GG1+YA2 N3-GG1+YA2 +N3-DD1+OE2 +YI2-N3+D1 +W3-H1+AE2 +N3-B1+YU2 +AE2-M3+JJ1 OE2-M3+JJ1 +K1-U2 +W3-D1+OE2 W3-D1+WAE2 +YI2-N3+G1 +L3-GG1+YE2 N3-GG1+YA2 +YI2-N3+H1 +BB1-OE2+B3 JJ1-OE2+B3 +YI2-N3+J1 +YI2-N3+K1 +BB1-OE2+D3 JJ1-OE2+D3 +L3-GG1+YI2 N3-GG1+YA2 +L3-N1+YA2 +YI2-N3+M1 +B3-G1+WA2 +YI2-N3+N1 +BB1-OE2+G3 JJ1-OE2+B3 +YI2-N3+O1 +YI2-N3+P1 +L3-R1+WEO2 L3-R1 +L3-N1+YE2 L3-N1 +B3-G1+WE2 +WAE2-G3+B1 +L3-GG1+YO2 N3-GG1+YO2 +YI2-N3+R1 +WAE2-G3+C1 +W3-K1+WAE2 +YI2-N3+S1 +WAE2-G3+D1 +BB1-OE2+L3 JJ1-OE2+D3 +YI2-N3+T1 +L3-N1+YI2 +BB1-OE2+M3 JJ1-OE2+M3 +B3-G1+WI2 +BB1-OE2+N3 B1-OE2+N3 +WAE2-G3+G1 WAE2-G3+B1 +G3-SS1+A2 +WAE2-G3+H1 +H1-EU2+B3 +L3-GG1+YU2 N3-GG1+YA2 +B3-T1+YEO2 D3-T1+YEO2 +sil-S1+YEO2 sil-S1+YAE2 +J1-AE2+B3 +WAE2-G3+J1 +H1-EU2+D3 +J1-AE2+D3 +M3-M1+YAE2 M1+WE2 +WAE2-G3+K1 +L3-N1+YO2 +G3-SS1+E2 +N3-H1+EO2 +WAE2-G3+M1 +H1-EU2+G3 +J1-AE2+G3 J1-AE2+B3 +WAE2-G3+N1 WAE2-G3+M1 +D1-YEO2 +WAE2-G3+O1 +BB1-OE2+W3 JJ1-OE2+B3 +G3-SS1+I2 +WAE2-G3+P1 +L3-N1+YU2 +N3-H1+EU2 +WAE2-G3+R1 +H1-EU2+L3 +J1-AE2+L3 J1-AE2+B3 +W3-B1+WA2 +WAE2-G3+S1 +H1-EU2+M3 +YU2-N3+JJ1 +J1-AE2+M3 J1-AE2+B3 +WAE2-G3+T1 WAE2-G3+R1 +H1-EU2+N3 +J1-AE2+N3 J1-AE2+B3 +G3-SS1+O2 +W3-B1+WE2 B1 +O1-O2+NG3 +sil-GG1+YAE2 +YU2-B3+sil +W3-B1+WI2 +G3-SS1+U2 +WE2-B3+BB1 B3+B1 +H1-EU2+W3 +J1-AE2+W3 +K1-YAE2 D1-YAE2 +G1-YA2+B3 +G1-AE2 +W3-JJ1+A2 +L3-T1+EO2 +G3-H1+YAE2 +EO2-D3+BB1 +G1-YA2+D3 +N3-T1+YEO2 NG3-T1+AE2 +D3-S1+YAE2 +C1-OE2 +W3-JJ1+E2 +G1-YA2+G3 +GG1-YAE2+NG3 D1-YAE2 +L3-T1+EU2 +YAE2-NG3+JJ1 YAE2-NG3+DD1 +W3-JJ1+I2 +G1-YA2+L3 +G1-YA2+M3 +G1-YA2+N3 +N3-BB1+WEO2 N3-BB1+WAE2 +W3-JJ1+O2 +S1-YAE2+NG3 D1-YAE2 +W3-SS1+WA2 +W3-JJ1+U2 +G1-YA2+W3 K1-YA2+W3 +B3-G1+YA2 +W3-SS1+WE2 +B3-G1+YE2 +W3-SS1+WI2 +S1-EO2+B3 +B3-G1+YI2 +S1-EO2+D3 +L3-DD1+AE2 +AE2-NG3+JJ1 AE2-NG3+DD1 +S1-EO2+G3 +R1+WAE2 R1 +B3-S1+A2 +B3-G1+YO2 +S1-EO2+L3 +B3-S1+E2 +S1-EO2+M3 +S1-EO2+N3 +EO2-B3+JJ1 EO2-B3+C1 +N3-GG1 N3-GG1+YA2 +B3-G1+YU2 +W3-B1+YA2 B1 +B3-S1+I2 +NG3-T1+OE2 NG3-T1+AE2 +W3-B1+YE2 B1 +G1-EU2+NG3 +J1-A2+B3 +B3-S1+O2 +S1-EO2+W3 +W3-B1+YI2 +J1-A2+D3 +YU2-L3+SS1 +B3-G1+WAE2 D3-G1+WAE2 +S1+WA2 +J1-A2+G3 +WE2-B3+DD1 B3 +U2-NG3+B1 +B3-S1+U2 +N3-J1+AE2 +U2-NG3+C1 +J1-WE2+NG3 K1-WE2+NG3 +U2-NG3+D1 +W3-B1+YO2 B1 +S1+WE2 S1 +J1-A2+L3 +U2-NG3+G1 +J1-A2+M3 +U2-NG3+H1 +J1-A2+N3 +YAE2-M3+SS1 YI2-M3+SS1 +S1+WI2 +U2-NG3+J1 +W3-B1+YU2 +NG3-P1+WEO2 NG3-P1+WA2 +U2-NG3+K1 +B3-M1+EO2 +H1-E2+NG3 +U2-NG3+M1 +EO2-D3+DD1 +U2-NG3+N1 +YA2-B3+BB1 B3+B1 +U2-NG3+O1 +U2-NG3+P1 +J1-A2+W3 +B3-M1+EU2 +YEO2-NG3+BB1 +U2-NG3+R1 U2-NG3 +U2-NG3+S1 +U2-NG3+T1 U2-NG3+P1 +D3-B1+YEO2 +NG3-R1+WA2 R1 +NG3-R1+WE2 R1 +YI2-G3+sil +S1-EU2+NG3 +YI2+NG3 +W3-SS1+YA2 W3-SS1+WE2 +W3-N1+A2 +S1-AE2+B3 +NG3-R1+WI2 N3-R1+I2 +S1-AE2+D3 +W3-H1+EO2 +L3-R1+OE2 +W3-SS1+YE2 W3-SS1+WE2 +N3-D1+WA2 N3-D1+OE2 +W3-N1+E2 +S1-AE2+G3 +W3-SS1+YI2 W3-SS1+WE2 +N3-D1+WE2 N3-D1+AE2 +W3-N1+I2 +W3-H1+EU2 +S1-AE2+L3 S1-AE2+B3 +S1-AE2+M3 +N3-D1+WI2 +GG1+WA2 +S1-AE2+N3 +W3-SS1+YO2 W3-SS1+WE2 +EO2-NG3+BB1 +W3-N1+O2 +DD1+WAE2 +GG1+WE2 N3-GG1+YA2 +W3-K1+WEO2 +O1-I2+B3 +E2-W3+BB1 +W3-SS1+YU2 W3-SS1+WE2 +O1-I2+D3 +GG1+WI2 M3-GG1+WI2 +W3-N1+U2 G3-N1+U2 +S1-AE2+W3 +YEO2-N3+B1 +O1-I2+G3 +YEO2-N3+C1 +YEO2-N3+D1 YI2-N3+D1 +M3-M1+YEO2 B3-M1+YEO2 +EU2-NG3+sil +R1-YEO2+NG3 +YEO2-N3+G1 +O1-I2+L3 +YEO2-N3+H1 +O1-I2+M3 +O1-I2+N3 +YEO2-N3+J1 +G3-JJ1+OE2 +YEO2-N3+K1 +L3-P1+WA2 +YEO2-N3+M1 +S1+YA2 S1 +YEO2-N3+N1 +G1-WEO2+NG3 G1-WEO2+B3 +YEO2-N3+O1 +D3-R1+A2 N3-R1+A2 +L3-P1+WE2 L3-P1 +JJ1-I2+NG3 +YEO2-N3+P1 +D3-C1+AE2 +S1+YE2 S1 +YEO2-N3+R1 +O1-I2+W3 +YEO2-N3+S1 +D3-R1+E2 N3-R1+E2 +L3-P1+WI2 +YEO2-N3+T1 +sil-GG1+YEO2 +H1-WAE2 +OE2-G3+sil E2-G3+sil +S1+YI2 S1 +D3-R1+I2 N3-R1+I2 +DD1-A2+NG3 +M3-T1+YAE2 NG3-T1+AE2 +S1+YO2 +I2-N3+B1 +K1-YEO2 +D3-R1+O2 N3-R1+O2 +I2-N3+C1 +YA2-B3+DD1 B3 +I2-N3+D1 +YEO2-NG3+DD1 +G1-EO2 +I2-N3+G1 +S1+YU2 +G3-H1+YEO2 +I2-N3+H1 +NG3-R1+YA2 +D3-S1+YEO2 +D3-R1+U2 N3-R1+U2 +N3-JJ1 N3-JJ1+YAE2 +O1-YE2+B3 +I2-N3+J1 +I2-N3+K1 +O1-YE2+D3 O1-YE2+B3 +H1-WA2+NG3 +NG3-R1+YE2 R1 +G1-EU2 G1-EU2+NG3 +I2-N3+M1 +I2-N3+N1 +H1-O2+B3 +O1-YE2+G3 O1-YE2+B3 +O2-B3+BB1 +I2-N3+O1 +WEO2-G3+SS1 YAE2-G3+SS1 +I2-N3+P1 +H1-O2+D3 +NG3-R1+YI2 +I2-N3+R1 +B3-O1+AE2 +WAE2-NG3+B1 +I2-N3+S1 +N3-D1+YA2 N3-D1+AE2 +H1-O2+G3 +WAE2-NG3+C1 +O1-YE2+L3 O1-YE2+B3 +I2-N3+T1 +B3-K1+OE2 +WAE2-NG3+D1 +O1-YE2+M3 O1-YE2+B3 +O1-YE2+N3 +NG3-R1+YO2 +WE2-B3+GG1 B3+K1 +N3-D1+YE2 N3-D1+AE2 +WAE2-NG3+G1 +H1-O2+L3 +WAE2-NG3+H1 +H1-O2+M3 +H1-O2+N3 +WAE2-NG3+J1 +N3-D1+YI2 N3-D1+AE2 +NG3-J1+A2 +WAE2-NG3+K1 +GG1+YA2 N3-GG1+YA2 +M3-K1+A2 +NG3-R1+YU2 +A2-M3+SS1 +WAE2-NG3+M1 +WAE2-NG3+N1 +O1-YE2+W3 +NG3-J1+E2 +WAE2-NG3+O1 +GG1+YE2 N3-GG1+YA2 +EO2-NG3+DD1 +M3-K1+E2 +WAE2-NG3+P1 +N3-D1+YO2 N3-D1+AE2 +EO2-D3+GG1 +B3-DD1+WA2 B3-DD1+OE2 +WAE2-NG3+R1 +H1-O2+W3 +NG3-J1+I2 +WAE2-NG3+S1 +GG1+YI2 N3-GG1+YA2 +M3-K1+I2 +E2-W3+DD1 E2-W3 +WAE2-NG3+T1 +B3-DD1+WE2 B3-DD1+OE2 +L3-DD1+EO2 +W3-J1+AE2 +N3-D1+YU2 N3-D1+AE2 +R1+WEO2 B3-R1+WEO2 +NG3-J1+O2 +GG1+YO2 N3-GG1+YO2 +B3-DD1+WI2 +M3-K1+O2 +SS1-A2+NG3 +L3-DD1+EU2 +D1-EO2+NG3 +L3-P1+YA2 L3-P1 +NG3-J1+U2 +GG1+YU2 N3-GG1+YA2 +M3-K1+U2 K1+U2 +NG3-D1+YAE2 +W3-GG1+WA2 GG1+WA2 +L3-P1+YE2 L3-P1 +W3-GG1+WE2 +L3-P1+YI2 L3-P1 +W3-GG1+WI2 +B3-G1+WEO2 D3-G1+WEO2 +D1-WEO2+B3 SS1-WEO2 +L3-P1+YO2 +N3-J1+EO2 +D1-WEO2+D3 WEO2+D3 +D1-WEO2+G3 SS1-WEO2 +N3-DD1+WA2 N3-DD1 +L3-P1+YU2 L3-P1 +N3-J1+EU2 +W3-D1+WA2 W3-D1+WAE2 +N3-DD1+WE2 N3-DD1 +D1-WEO2+L3 +D1-WEO2+M3 SS1-WEO2+M3 +D1-WEO2+N3 SS1-WEO2+N3 +W3-D1+WE2 W3-D1+WEO2 +N3-DD1+WI2 +YU2-D3+sil YO2-D3+sil +W3-D1+WI2 +P1-EO2+NG3 +WE2-D3+BB1 +O2-B3+DD1 +M3-DD1+OE2 N3-DD1+OE2 +D1-WEO2+W3 SS1-WEO2 +L3-SS1 L3-SS1+WE2 +H1-OE2+B3 +H1-OE2+D3 H1-OE2+B3 +H1-OE2+G3 +B3-DD1+YA2 B3-DD1+OE2 +sil-G1+A2 +H1-OE2+L3 H1-OE2+B3 +H1-OE2+M3 H1-OE2+B3 +H1-OE2+N3 H1-OE2+B3 +YA2-B3+GG1 B3+K1 +B3-DD1+YE2 B3-DD1+OE2 +WI2-M3+SS1 +sil-G1+E2 +K1-WI2+NG3 +YEO2-NG3+GG1 +L3-M1+YAE2 L3-M1 +DD1+WEO2 DD1+WAE2 +B3-DD1+YI2 B3-DD1+OE2 +sil-G1+I2 +sil-C1+AE2 +H1-OE2+W3 +B3-DD1+YO2 B3-DD1+OE2 +DD1+AE2 +sil-G1+O2 +BB1-I2+NG3 +NG3-SS1+WAE2 W3-SS1+WE2 +AE2-M3+SS1 E2-M3+SS1 +W3-GG1+YA2 W3-GG1+WE2 +D1-WAE2+B3 +B3-DD1+YU2 B3-DD1+OE2 +D1-WAE2+D3 +sil-G1+U2 +W3-GG1+YE2 W3-GG1+WE2 +WE2-B3+JJ1 B3+C1 +C1-WA2 +D1-WAE2+G3 D1-WAE2+B3 +O1-YAE2+NG3 +WEO2-M3+BB1 YAE2-M3+BB1 +YI2-W3+BB1 +W3-GG1+YI2 W3-GG1+WE2 +DD1-WA2+B3 +C1-WE2 K1-WE2+NG3 +DD1-WA2+D3 +D1-WAE2+L3 +D3-C1+EO2 +D1-WAE2+M3 D1-WAE2+L3 +D1-WAE2+N3 D1-WAE2+L3 +DD1-WA2+G3 DD1-WA2+B3 +W3-GG1+YO2 N3-GG1+YO2 +C1-WI2 +G1-E2+B3 +D1-WAE2+NG3 D1-WAE2+L3 +EO2-NG3+GG1 +N3-DD1+YA2 N3-DD1 +H1-WEO2 +G1-E2+D3 G1-E2+B3 +EO2-D3+JJ1 +EU2-W3+sil +D3-C1+EU2 +W3-D1+YA2 W3-D1+WEO2 +DD1-WA2+L3 +N3-DD1+YE2 N3-DD1 +G1-E2+G3 G1-E2+B3 +DD1-WA2+M3 DD1-WA2+NG3 +E2-W3+GG1 +W3-GG1+YU2 W3-GG1+WE2 +M3-T1+YEO2 NG3-T1+AE2 +DD1-WA2+N3 +W3-D1+YE2 W3-D1+WEO2 +D1-WAE2+W3 D1-WAE2+L3 +N3-DD1+YI2 N3-DD1 +G1-E2+L3 +G1-E2+M3 +W3-D1+YI2 W3-D1+WEO2 +G1-E2+N3 +YU2-N3+SS1 YO2-N3+SS1 +N3-DD1+YO2 N3-DD1 +DD1-WA2+W3 +WE2-D3+DD1 +EU2-L3+B1 +EU2-L3+C1 +W3-D1+YO2 W3-D1+WEO2 +N3-H1+OE2 +EU2-L3+D1 +N3-DD1+YU2 N3-DD1 +G1-E2+W3 G1-E2+L3 +EU2-L3+G1 +EU2-L3+H1 +O1-WAE2 +W3-D1+YU2 W3-D1+WEO2 +EU2-L3+J1 +YA2-W3+B1 +B3-O1+EO2 +EU2-L3+K1 +YA2-W3+C1 +YA2-W3+D1 +EU2-L3+M1 +YA2-D3+BB1 WE2-D3+BB1 +EU2-L3+N1 +YAE2-W3+B1 +EU2-L3+O1 +YAE2-W3+C1 +YA2-W3+G1 +EU2-L3+P1 +YAE2-W3+D1 +YA2-W3+H1 +B3-O1+EU2 +sil-JJ1+AE2 +EU2-L3+R1 +YA2-W3+J1 +EU2-L3+S1 +YAE2-W3+G1 +YA2-W3+K1 +EU2-L3+T1 +YAE2-W3+H1 +NG3-T1+WA2 NG3-T1+AE2 +YA2-W3+M1 +YAE2-W3+J1 +YA2-W3+N1 +OE2-NG3+sil +OE2-W3+BB1 E2-W3+BB1 +YAE2-W3+K1 +YA2-W3+O1 +YA2-W3+P1 +NG3-T1+WE2 NG3-T1+AE2 +SS1-WA2+B3 DD1-WA2+B3 +YAE2-W3+M1 +DD1-WI2+NG3 +YAE2-NG3+SS1 +YAE2-W3+N1 +YA2-W3+R1 +SS1-WA2+D3 DD1-WA2+D3 +YAE2-W3+O1 +YA2-W3+S1 +YAE2-W3+P1 +YA2-W3+T1 +NG3-T1+WI2 +DD1+A2 +YAE2-W3+R1 YA2-W3+R1 +SS1-WA2+G3 DD1-WA2+B3 +YAE2-W3+S1 +W3-J1+EO2 +L3-T1+OE2 L3-T1+AE2 +YAE2-W3+T1 +O2-B3+GG1 +DD1+E2 +SS1-WA2+L3 DD1-WA2+L3 +SS1-WA2+M3 DD1-WA2+NG3 +SS1-WA2+N3 DD1-WA2+N3 +W3-J1+EU2 +DD1+I2 +C1-YA2 +NG3-D1+YEO2 NG3-D1+YAE2 +WEO2-M3+DD1 WA2-M3+R1 +YI2-W3+DD1 +C1-YE2 +DD1+O2 +SS1-WA2+W3 DD1-WA2+W3 +G3-JJ1+YAE2 G3-JJ1+OE2 +C1-YI2 YI2+NG3 +DD1+U2 +WE2-N3+B1 YI2-N3+B1 +AE2-NG3+SS1 +WE2-N3+C1 YI2-N3+C1 +C1-YO2 +YA2-B3+JJ1 B3+C1 +WE2-N3+D1 YI2-N3+D1 +YEO2-NG3+JJ1 YEO2-NG3+DD1 +K1-OE2+NG3 +WE2-N3+G1 YI2-N3+G1 +WE2-N3+H1 YI2-N3+H1 +C1-YU2 +L3-R1+WA2 L3-R1 +WE2-N3+J1 +EO2-B3+SS1 +WE2-N3+K1 YI2-N3+K1 +NG3-K1+YAE2 M3-K1+WEO2 +WE2-N3+M1 +L3-R1+WE2 L3-R1 +WE2-N3+N1 +WE2-N3+O1 +WE2-N3+P1 YI2-N3+P1 +L3-R1+WI2 +WE2-N3+R1 YI2-N3+R1 +R1-EU2+NG3 +WE2-N3+S1 +WE2-N3+T1 YI2-N3+T1 +G3-SS1+AE2 G3-SS1+E2 +C1-WEO2+NG3 +YA2-D3+DD1 WE2-D3+DD1 +U2+B3 U2 +G3-B1+AE2 +D1-WA2+B3 DD1-WA2+B3 +U2+D3 +D1-WA2+D3 DD1-WA2+D3 +EO2-NG3+JJ1 EO2-NG3+DD1 +L3-BB1+YAE2 L3-BB1 +U2+G3 +NG3-T1+YA2 NG3-T1+AE2 +D1-WA2+G3 DD1-WA2+B3 +OE2-W3+DD1 +NG3-T1+YE2 NG3-T1+AE2 +G3-JJ1+WA2 G3-JJ1+OE2 +E2-W3+JJ1 +U2+L3 +U2+M3 +D1-WA2+L3 DD1-WA2+L3 +O2-D3+BB1 +U2+N3 +D1-WA2+M3 DD1-WA2+NG3 +OE2-W3+B1 +NG3-T1+YI2 NG3-T1+AE2 +G3-JJ1+WE2 G3-JJ1+OE2 +D1-WA2+N3 +OE2-W3+C1 E2-W3+JJ1 +DD1-A2 +OE2-W3+D1 +B3-M1+OE2 B3-M1+AE2 +G3-JJ1+WI2 +OE2-W3+G1 +L3-M1+YEO2 L3-M1 +DD1-E2 +OE2-W3+H1 +NG3-T1+YO2 NG3-T1+AE2 +WE2-D3+GG1 +sil-C1+EO2 +B3-JJ1+WAE2 +OE2-W3+J1 +U2+W3 U2 +OE2-W3+K1 +WI2-NG3+BB1 +D1-WA2+W3 DD1-WA2+W3 +DD1-I2 +OE2-W3+M1 +OE2-W3+N1 +DD1+EO2 +NG3-T1+YU2 NG3-T1+AE2 +OE2-W3+O1 +sil-C1+EU2 +NG3-SS1+WEO2 W3-SS1+WE2 +OE2-W3+P1 +D3-M1+WAE2 M1+WE2 +DD1-O2 +OE2-W3+R1 +OE2-W3+S1 +OE2-W3+T1 +DD1+EU2 +WA2-W3+sil +DD1-U2 +W3-H1+OE2 +L3-R1+YA2 +B3-K1+WA2 +YO2-L3+sil +L3-R1+YE2 L3-R1 +G3-D1+A2 +B3-K1+WE2 L3-K1 +G1-WA2+NG3 +O2-B3+JJ1 +L3-R1+YI2 L3-R1 +G3-D1+E2 B3-D1 +sil-T1+A2 +JJ1-I2+B3 +B3-K1+WI2 +JJ1-I2+D3 +G3-BB1+WAE2 +G3-D1+I2 +sil-T1+E2 +JJ1-I2+G3 +L3-R1+YO2 NG3-R1+YO2 +WEO2-M3+GG1 YAE2-M3+GG1 +sil-T1+I2 +YI2-W3+GG1 +U2-B3 +G3-D1+O2 +JJ1-I2+L3 +JJ1-I2+M3 +L3-R1+YU2 L3-R1 +U2-D3 +O1-WEO2 +JJ1-I2+N3 +sil-T1+O2 +U2-G3 +G3-D1+U2 +G3-JJ1+YA2 G3-JJ1+OE2 +BB1-A2+B3 +U2-L3 +sil-T1+U2 +U2-M3 +sil-JJ1+EO2 +BB1-A2+D3 +K1-A2+B3 +JJ1-I2+W3 +U2-N3 +G3-JJ1+YE2 G3-JJ1+OE2 +K1-A2+D3 +O2-D3+DD1 +BB1-A2+G3 +N3-SS1 L3-SS1+WE2 +K1-A2+G3 +G3-JJ1+YI2 G3-JJ1+OE2 +sil-JJ1+EU2 +YAE2-G3+sil YI2-G3+sil +BB1-A2+L3 +BB1-A2+M3 +JJ1-YO2+B3 C1-YO2 +U2-W3 +BB1-A2+N3 +K1-A2+L3 +K1-A2+M3 +C1-EO2+NG3 +JJ1-YO2+D3 C1-YO2 +G3-JJ1+YO2 +K1-A2+N3 +K1-AE2 +WI2-NG3+DD1 +YI2-D3+B1 +YI2-D3+C1 +G1-OE2 +JJ1-YO2+G3 C1-YO2 +YI2-D3+D1 +M1+YAE2 M1+WE2 +G3-JJ1+YU2 G3-JJ1+OE2 +YI2-D3+G1 +BB1-A2+W3 +YI2-D3+H1 +JJ1-YO2+L3 C1-YO2 +JJ1-YO2+M3 C1-YO2 +K1-A2+W3 +YI2-D3+J1 YI2-D3+C1 +JJ1-YO2+N3 C1-YO2 +YI2-D3+K1 D3 +YA2-D3+GG1 WE2-D3+GG1 +YI2-D3+M1 +YI2-D3+N1 +YI2-D3+O1 +YI2-D3+P1 D3 +YI2-D3+R1 +G3-JJ1+YEO2 G3-JJ1+OE2 +YI2-D3+S1 +JJ1-YO2+W3 C1-YO2 +YI2-D3+T1 +OE2-W3+GG1 E2-W3+GG1 +M3-DD1+WA2 M3-DD1+YAE2 +D3-JJ1+AE2 G3-JJ1+AE2 +B3-K1+YA2 L3-K1 +B3-B1+YAE2 B3-B1 +M3-DD1+WE2 M3-DD1+YAE2 +NG3-H1+WAE2 +B3-K1+YE2 L3-K1 +M1-WA2+B3 +M3-DD1+WI2 +EU2-B3+BB1 U2-B3 +A2-W3+B1 +B3-K1+YI2 +M1-WA2+D3 +D1-I2+B3 +A2-W3+C1 +WE2-D3+JJ1 EO2-D3+JJ1 +A2-W3+D1 +DD1-EU2+B3 +D1-I2+D3 +O1-EO2+NG3 +M1-WA2+G3 M1-WA2+B3 +NG3-K1+YEO2 +DD1-YA2+B3 G1-YA2+B3 +DD1-EU2+D3 DD1-EU2+B3 +A2-W3+G1 +L3-DD1+OE2 +D1-I2+G3 +A2-W3+H1 +DD1-YA2+D3 G1-YA2+D3 +B3-K1+YO2 +DD1-EU2+G3 DD1-EU2+B3 +B1-O2+NG3 +A2-W3+J1 +M1-WA2+L3 +A2-W3+K1 +DD1-YA2+G3 G1-YA2+G3 +M1-WA2+M3 +P1-I2+B3 +M1-WA2+N3 +D1-I2+L3 +A2-W3+M1 +D1-I2+M3 +A2-W3+N1 +P1-I2+D3 P1-I2+B3 +B3-K1+YU2 +DD1-EU2+L3 +D1-I2+N3 +A2-W3+O1 +DD1-EU2+M3 +G3-SS1+EO2 +A2-W3+P1 +DD1-YA2+L3 +DD1-EU2+N3 +P1-I2+G3 +DD1-YA2+M3 +A2-W3+R1 +DD1-YA2+N3 +A2-W3+S1 YA2-W3+S1 +A2-W3+T1 +M1-WA2+W3 +G3-SS1+EU2 +P1-I2+L3 +G3-B1+EO2 +P1-I2+M3 +D1-I2+W3 +P1-I2+N3 +DD1-EU2+W3 +L3-BB1+YEO2 L3-BB1 +DD1-YA2+W3 T1-YA2+W3 +N3-SS1+WAE2 L3-SS1+WE2 +N3-N1+AE2 +J1-WI2+NG3 +G3-B1+EU2 W3-B1+EU2 +N3-J1+OE2 N3-J1+AE2 +P1-I2+W3 +H1-I2+NG3 +C1-WAE2+B3 WAE2+B3 +G3-GG1+AE2 +B3-JJ1+WEO2 B3-JJ1+WAE2 +C1-WAE2+D3 G1-WAE2+D3 +WEO2-M3+JJ1 YI2-M3+JJ1 +YI2-W3+JJ1 +C1-WAE2+G3 WAE2+B3 +D3-M1+WEO2 +SS1-EU2+B3 +C1-WAE2+L3 WAE2+L3 +SS1-YA2+B3 G1-YA2+B3 +C1-WAE2+M3 P1-WAE2 +SS1-EU2+D3 +C1-WAE2+N3 WAE2+L3 +SS1-YA2+D3 G1-YA2+D3 +SS1-EU2+G3 +M3-DD1+YA2 M3-DD1+YAE2 +SS1-YA2+G3 G1-YA2+G3 +N3-H1+WA2 +M3-DD1+YE2 M3-DD1+YAE2 +O2-D3+GG1 +B3-S1+YAE2 B3-S1 +sil-R1+YAE2 +SS1-EU2+L3 +SS1-EU2+M3 +SS1-YA2+L3 DD1-YA2+L3 +C1-WAE2+W3 P1-WAE2 +N3-H1+WE2 +SS1-EU2+N3 +SS1-YA2+M3 DD1-YA2+M3 +M3-DD1+YI2 M3-DD1+YAE2 +SS1-YA2+N3 DD1-YA2+N3 +A2-G3+sil +C1-YAE2 D1-YAE2 +N3-H1+WI2 +EU2-B3+DD1 +N3-K1+A2 +M3-DD1+YO2 M3-DD1+YAE2 +WI2-NG3+GG1 +SS1-EU2+W3 +N1+A2 +SS1-YA2+W3 T1-YA2+W3 +N3-K1+E2 M3-K1+E2 +WE2-B3+SS1 +M3-DD1+YU2 M3-DD1+YAE2 +N1+E2 +N3-K1+I2 +G3-BB1+WEO2 G3-BB1+WAE2 +YA2-D3+JJ1 EO2-D3+JJ1 +N1+I2 G3-N1+I2 +J1-WI2+B3 J1-WI2+NG3 +N3-K1+O2 +J1-WI2+D3 J1-WI2+NG3 +L3-T1+WA2 L3-T1 +J1-WI2+G3 J1-WI2+NG3 +N1+O2 +EO2-D3+SS1 +N3-K1+U2 +OE2-W3+JJ1 E2-W3+JJ1 +L3-T1+WE2 L3-T1 +J1-WI2+L3 J1-WI2+NG3 +D3-G1+AE2 +BB1-YO2+B3 +J1-WI2+M3 J1-WI2+NG3 +N1+U2 G3-N1+U2 +N3-S1+YAE2 +J1-WI2+N3 J1-WI2+NG3 +D3-C1+OE2 +BB1-YO2+D3 BB1-YO2+B3 +L3-T1+WI2 +BB1-YO2+G3 +DD1-E2+NG3 DD1-E2 +BB1-YO2+L3 BB1-YO2+B3 +J1-WI2+W3 J1-WI2+NG3 +BB1-YO2+M3 +BB1-YO2+N3 BB1-YO2+M3 +G3-D1+AE2 B3-D1 +D1-YA2+B3 +D1-YA2+D3 D1-YA2+B3 +K1-EO2 +W3-D1+A2 +BB1-YEO2+NG3 +D1-YA2+G3 D1-YA2+B3 +M1+YEO2 B3-M1+YEO2 +W3-D1+E2 +BB1-YO2+W3 BB1-YO2+B3 +H1-WE2+NG3 K1-WE2+NG3 +K1-EU2 +D1-YA2+L3 +W3-D1+I2 +D1-YA2+M3 +D1-YA2+N3 +B3-S1+AE2 +N3-H1+YA2 N3-H1+WE2 +E2-M3+sil +B3-O1+OE2 +W3-D1+O2 +WA2+NG3 DD1-WA2+NG3 +N3-H1+YE2 +WA2-B3+BB1 B3+B1 +J1-OE2+NG3 +D1-YA2+W3 +D3-JJ1+EO2 +W3-D1+U2 +N3-H1+YI2 +YEO2-D3+B1 +B3-B1+YEO2 G3-B1+AE2 +YEO2-D3+C1 YI2-D3+C1 +T1+YAE2 D3-T1+YEO2 +YEO2-D3+D1 YI2-D3+D1 +NG3-H1+WEO2 NG3-H1+WAE2 +D3-JJ1+EU2 +N3-H1+YO2 N3-H1+WE2 +N1-A2 +YEO2-D3+G1 +YEO2-D3+H1 YEO2-D3+B1 +WI2-G3+sil +YEO2-D3+J1 YI2-D3+C1 +YAE2-W3+BB1 +N1-E2 +YEO2-D3+K1 YEO2-D3+B1 +W3-N1+AE2 +N3-H1+YU2 +YEO2-D3+M1 YI2-D3+M1 +W3-J1+OE2 +YEO2-D3+N1 YI2-D3+N1 +N1-I2 +YEO2-D3+O1 +D3-H1+A2 +YEO2-D3+P1 YEO2-D3+B1 +SS1-E2+NG3 +YEO2-D3+R1 YI2-D3+R1 +YEO2-D3+S1 YI2-D3+S1 +D3-H1+E2 +YEO2-D3+T1 YI2-D3+T1 +L3-T1+YA2 +AE2-G3+sil +N1-O2 +B3-M1+WA2 M1+WA2 +YO2-N3+sil N3+sil +D3-H1+I2 +YA2-B3+SS1 WE2-B3+SS1 +L3-T1+YE2 L3-T1 +NG3-O1+WAE2 +B3-M1+WE2 M1+WE2 +N1-U2 +YEO2-NG3+SS1 +O2-D3+JJ1 +U2-W3+sil +L3-T1+YI2 L3-T1 +I2-D3+B1 +B3-M1+WI2 M1+WI2 +D3-H1+O2 +I2-D3+C1 +I2-D3+D1 +WEO2-N3+B1 +I2-D3+G1 +WEO2-N3+C1 +L3-T1+YO2 L3-T1 +EU2-B3+GG1 U2-B3 +I2-D3+H1 I2-D3+B1 +N3-SS1+WEO2 L3-SS1+WE2 +N3-N1+EO2 +WEO2-N3+D1 +D3-H1+U2 +I2-D3+J1 +I2-D3+K1 +WEO2-N3+G1 +WI2-NG3+JJ1 WI2-NG3+DD1 +WEO2-N3+H1 +I2-D3+M1 +L3-T1+YU2 L3-T1 +I2-D3+N1 +H1-E2+B3 +N3-N1+EU2 +WEO2-N3+J1 +I2-D3+O1 I2-D3+M1 +W3-H1+WA2 +WEO2-N3+K1 YI2-N3+K1 +BB1-EO2+NG3 +I2-D3+P1 +H1-E2+D3 H1-E2+B3 +K1-YEO2+NG3 +WEO2-N3+M1 +I2-D3+R1 +WEO2-N3+N1 +I2-D3+S1 +H1-E2+G3 H1-E2+B3 +W3-H1+WE2 H1 +WEO2-N3+O1 YI2-N3+O1 +I2-D3+T1 I2-D3+R1 +WEO2-N3+P1 +G3-GG1+EO2 GG1+EO2 +WEO2-N3+R1 +O1-U2+NG3 +W3-H1+WI2 +WEO2-N3+S1 +H1-E2+L3 +WEO2-N3+T1 +H1-E2+M3 H1-E2+NG3 +H1-E2+N3 H1-E2+NG3 +EO2-NG3+SS1 +G3-GG1+EU2 +E2-W3+SS1 +M3-SS1+A2 W3-SS1+WA2 +WA2-B3+DD1 B3 +W3-J1+WAE2 +H1-E2+W3 H1-E2+NG3 +M3-SS1+E2 W3-SS1+OE2 +M1-AE2 +S1-WI2+B3 +M3-SS1+I2 +B3-S1+YEO2 +sil-R1+YEO2 +S1-WI2+D3 S1-WI2+B3 +S1-WI2+G3 S1-WI2+B3 +M3-SS1+O2 +C1-YEO2 +T1-WAE2+NG3 +YAE2-W3+DD1 YAE2-W3+T1 +S1-WI2+L3 +WI2-W3+B1 +S1-WI2+M3 S1-WI2+L3 +WI2-W3+C1 +S1-WI2+N3 S1-WI2+L3 +M3-GG1+YAE2 N3-GG1+YA2 +WI2-W3+D1 +M3-SS1+U2 +sil-G1+AE2 sil-G1+E2 +N3-BB1+AE2 +sil-C1+OE2 +WI2-W3+G1 +WI2-W3+H1 +B3-M1+YA2 M1+WE2 +WI2-W3+J1 +WI2-W3+K1 +YE2-G3+sil YI2-G3+sil +DD1+OE2 +S1-WI2+W3 S1-WI2+L3 +WI2-W3+M1 +B3-M1+YE2 M1+WE2 +WI2-W3+N1 +WI2-W3+O1 +M1-YA2+B3 +WI2-W3+P1 +EU2-D3+BB1 +B3-M1+YI2 M1+WE2 +M1-YA2+D3 M1-YA2+B3 +N3-P1+WAE2 +WI2-W3+R1 +G1-WA2 +WI2-W3+S1 +J1-YAE2 D1-YAE2 +WI2-W3+T1 +M1-YA2+G3 M1-YA2+B3 +G1-WE2 K1-WE2+NG3 +B3-M1+YO2 M1+YO2 +G3-G1+YAE2 B3-G1 +D3-G1+EO2 B3-G1+EO2 +N3-S1+YEO2 +M1-YA2+L3 +O2-B3+SS1 +GG1-U2+B3 +G1-WI2 +M1-YA2+M3 +M1-YA2+N3 +A2-NG3+sil +GG1-U2+D3 +B3-M1+YU2 M1+WE2 +B1-EO2+NG3 +D3-G1+EU2 B3-G1+EU2 +W3-H1+YA2 +AE2-N3+B1 +GG1-U2+G3 +AE2-N3+C1 +AE2-N3+D1 +A2-W3+BB1 +D3-BB1+WAE2 D3-BB1+E2 +W3-H1+YE2 +AE2-N3+G1 +GG1-U2+L3 +M1-YA2+W3 +AE2-N3+H1 +GG1-U2+M3 +G3-D1+EO2 W3-D1+EO2 +GG1-U2+N3 +W3-H1+YI2 +AE2-N3+J1 +JJ1-WE2+B3 K1-WE2+NG3 +AE2-N3+K1 +JJ1-WE2+D3 K1-WE2+NG3 +AE2-N3+M1 +AE2-N3+N1 +N3-P1+AE2 +AE2-N3+O1 +G3-D1+EU2 +JJ1-WE2+G3 K1-WE2+NG3 +W3-H1+YO2 +AE2-N3+P1 +AE2-N3+R1 +WAE2-W3+sil +GG1-U2+W3 +AE2-N3+S1 +DD1-OE2+B3 JJ1-OE2+B3 +AE2-N3+T1 +JJ1-WE2+L3 K1-WE2+NG3 +DD1-OE2+D3 JJ1-OE2+D3 +JJ1-WE2+M3 K1-WE2+NG3 +L3-DD1+WA2 L3-DD1 +W3-H1+YU2 +JJ1-WE2+N3 K1-WE2+NG3 +B3-S1+EO2 +DD1-OE2+G3 JJ1-OE2+B3 +L3-DD1+WE2 L3-DD1 +EU2-B3+JJ1 U2-B3 +DD1-OE2+L3 JJ1-OE2+D3 +B3-S1+EU2 +L3-DD1+WI2 +DD1-OE2+M3 +DD1-OE2+N3 B1-OE2+N3 +sil-JJ1+OE2 +JJ1-WE2+W3 K1-WE2+NG3 +W3-JJ1+YAE2 W3-JJ1+YA2 +N1-EO2+NG3 +T1+YEO2 D3-T1+YEO2 +SS1-O2+B3 +YI2-M3+sil WAE2-M3+sil +SS1-O2+D3 +YO2+NG3 +R1-U2+B3 +DD1-OE2+W3 JJ1-OE2+B3 +R1-U2+D3 R1-U2+B3 +SS1-O2+G3 +W3-N1+EO2 +N3-J1+WA2 +R1-U2+G3 R1-U2+B3 +SS1-O2+L3 +SS1-O2+M3 +N3-J1+WE2 N3-J1+EO2 +SS1-O2+N3 +R1-U2+L3 R1-U2+B3 +W3-N1+EU2 L3-N1+WA2 +R1-U2+M3 +R1-U2+N3 +G1-YA2 +N3-J1+WI2 +EU2-D3+DD1 +WA2-B3+GG1 B3+K1 +G1-YE2 +NG3-O1+WEO2 +SS1-O2+W3 +G1-YI2 +R1-U2+W3 +WE2-D3+SS1 +SS1-OE2+B3 JJ1-OE2+B3 +G1-YO2 +SS1-OE2+D3 JJ1-OE2+D3 +J1-YI2+B3 G1-YI2 +EU2-B3+B1 +YAE2-W3+GG1 +A2-W3+DD1 +EU2-B3+C1 U2-B3 +J1-YI2+D3 G1-YI2 +SS1-OE2+G3 JJ1-OE2+B3 +EU2-B3+D1 +G1-YU2 +J1-YI2+G3 G1-YI2 +EU2-B3+G1 +EU2-B3+H1 EU2-B3+B1 +SS1-OE2+L3 JJ1-OE2+D3 +WI2-W3+BB1 +SS1-OE2+M3 DD1-OE2+M3 +EU2-B3+J1 EU2-B3+B1 +YA2-M3+B1 +SS1-OE2+N3 B1-OE2+N3 +JJ1-O2+NG3 +EU2-B3+K1 U2-B3 +J1-YI2+L3 G1-YI2 +YA2-M3+C1 YI2-M3+JJ1 +J1-YI2+M3 G1-YI2 +YA2-M3+D1 WA2-M3+D1 +EU2-B3+M1 +J1-YI2+N3 G1-YI2 +EU2-B3+N1 +YAE2-M3+B1 YA2-M3+B1 +H1-YAE2+NG3 D1-YAE2 +EU2-B3+O1 +YAE2-M3+C1 YI2-M3+JJ1 +YA2-M3+G1 WA2-M3+G1 +YE2-N3+BB1 YU2-N3+BB1 +EU2-B3+P1 U2-B3 +YAE2-M3+D1 WA2-M3+D1 +YA2-M3+H1 WA2-M3+H1 +OE2-M3+sil E2-M3+sil +L3-DD1+YA2 L3-DD1 +EU2-B3+R1 EU2-B3+DD1 +YA2-M3+J1 WA2-M3+J1 +EU2-B3+S1 +YAE2-M3+G1 WA2-M3+G1 +YA2-M3+K1 WA2-M3+K1 +SS1-OE2+W3 JJ1-OE2+B3 +EU2-B3+T1 EU2-B3+DD1 +YAE2-M3+H1 WA2-M3+H1 +G3-SS1+OE2 G3-SS1+E2 +D3-H1+YAE2 B3-H1 +AE2-W3+BB1 +YA2-M3+M1 +L3-DD1+YE2 L3-DD1 +YAE2-M3+J1 WA2-M3+J1 +J1-YI2+W3 G1-YI2 +YA2-M3+N1 +YAE2-M3+K1 WA2-M3+K1 +YA2-M3+O1 WA2-M3+O1 +YA2-M3+P1 WA2-M3+P1 +YAE2-M3+M1 WA2-M3+M1 +L3-DD1+YI2 L3-DD1 +YAE2-M3+N1 WA2-M3+N1 +YA2-M3+R1 WA2-M3+R1 +W3-J1+WEO2 +G3-B1+OE2 +YAE2-M3+O1 WA2-M3+O1 +YA2-M3+S1 WA2-M3+S1 +YAE2-M3+P1 WA2-M3+P1 +M1-EO2 +YA2-M3+T1 WA2-M3+R1 +YAE2-M3+R1 WA2-M3+R1 +YAE2-M3+S1 WA2-M3+S1 +L3-DD1+YO2 L3-DD1 +YAE2-M3+T1 WA2-M3+R1 +M1-EU2 +WEO2-M3+SS1 YI2-M3+SS1 +YI2-W3+SS1 WAE2-W3+SS1 +L3-DD1+YU2 L3-DD1 +N3-J1+YA2 N3-J1+EO2 +D3-C1+WA2 +NG3-B1+AE2 +M3-GG1+YEO2 +sil-G1+EO2 +N3-J1+YE2 N3-J1+EO2 +WA2-D3+BB1 +N3-BB1+EO2 +WAE2-W3+B1 +D3-C1+WE2 C1 +WAE2-W3+C1 YAE2-W3+C1 +WAE2-W3+D1 +N3-J1+YI2 N3-J1+EO2 +D3-C1+WI2 +sil-G1+EU2 +WAE2-W3+G1 +N3-BB1+EU2 +WAE2-W3+H1 YAE2-W3+H1 +G1-WAE2 G1-WAE2+M3 +WE2-D3+B1 YI2-D3+B1 +WE2-D3+C1 YI2-D3+C1 +WAE2-W3+J1 YAE2-W3+J1 +WE2-D3+D1 YI2-D3+D1 +WAE2-W3+K1 +H1-YO2+B3 +N3-J1+YO2 N3-J1+EO2 +M3-S1+YAE2 M3-S1+WA2 +WAE2-W3+M1 YAE2-W3+M1 +H1-YO2+D3 H1-YO2+B3 +WE2-D3+G1 YI2-D3+G1 +WAE2-W3+N1 YAE2-W3+N1 +N3-P1+WEO2 N3-P1+WAE2 +WE2-D3+H1 YI2-D3+H1 +WAE2-W3+O1 +J1-YEO2 +NG3-DD1+WAE2 M3-DD1+YAE2 +WAE2-W3+P1 YAE2-W3+P1 +H1-YO2+G3 +WE2-D3+J1 YI2-D3+C1 +W3-P1+AE2 +N3-J1+YU2 N3-J1+EO2 +WE2-D3+K1 D3 +WAE2-W3+R1 YA2-W3+R1 +NG3-M1+A2 +M3-N1+A2 +WAE2-W3+S1 +WE2-D3+M1 YI2-D3+M1 +WAE2-W3+T1 +G3-G1+YEO2 +U2-B3+BB1 U2-B3 +WE2-D3+N1 YI2-D3+N1 +H1-YO2+L3 H1-YO2+B3 +WE2-D3+O1 YI2-D3+O1 +NG3-M1+E2 +BB1-WE2+B3 K1-WE2+NG3 +H1-YO2+M3 +M3-N1+E2 +WE2-D3+P1 D3 +H1-YO2+N3 H1-YO2+M3 +D1-EU2+NG3 +BB1-WE2+D3 K1-WE2+NG3 +WE2-D3+R1 YI2-D3+R1 +WE2-D3+S1 YI2-D3+S1 +B3-O1+WA2 O1+WA2 +NG3-M1+I2 +M3-N1+I2 +WE2-D3+T1 YI2-D3+T1 +BB1-WE2+G3 K1-WE2+NG3 +YA2-D3+SS1 WE2-D3+SS1 +B3-O1+WE2 O1+WE2 +WI2-W3+DD1 +D3-BB1+WEO2 D3-BB1+E2 +G1-WE2+NG3 K1-WE2+NG3 +NG3-M1+O2 +H1-YO2+W3 H1-YO2+B3 +BB1-WE2+L3 K1-WE2+NG3 +M3-N1+O2 +BB1-WE2+M3 K1-WE2+NG3 +B3-O1+WI2 D3-O1+I2 +BB1-WE2+N3 K1-WE2+NG3 +YE2-N3+DD1 +BB1-YAE2 D1-YAE2 +SS1-WA2+NG3 DD1-WA2+NG3 +OE2-W3+SS1 E2-W3+SS1 +NG3-M1+U2 +M3-N1+U2 +EU2-D3+GG1 EU2-D3+BB1 +N3-P1+EO2 +WA2-B3+JJ1 B3+C1 +AE2-W3+DD1 OE2-W3+DD1 +BB1-WE2+W3 K1-WE2+NG3 +N3-P1+EU2 +OE2-M3+B1 +W3-J1+WA2 +OE2-M3+C1 +OE2-M3+D1 +W3-J1+WE2 W3-J1+WAE2 +OE2-M3+G1 +OE2-M3+H1 WA2-M3+H1 +OE2-M3+J1 +W3-J1+WI2 +YAE2-W3+JJ1 WAE2-W3+JJ1 +A2-W3+GG1 +OE2-M3+K1 +P1-EU2+NG3 +YO2-N3+B1 YI2-N3+B1 +W3-JJ1+YEO2 +OE2-M3+M1 +YO2-N3+C1 YI2-N3+C1 +OE2-M3+N1 +YO2-N3+D1 YI2-N3+D1 +OE2-M3+O1 +D3-C1+YA2 C1 +OE2-M3+P1 +NG3-C1+YAE2 +YO2-N3+G1 YI2-N3+G1 +sil-JJ1+YAE2 +OE2-M3+R1 AE2-M3+DD1 +YO2-N3+H1 YI2-N3+H1 +OE2-M3+S1 +D3-C1+YE2 C1 +OE2-M3+T1 AE2-M3+DD1 +YO2-N3+J1 YI2-N3+J1 +WA2-D3+DD1 +YO2-N3+K1 YI2-N3+K1 +O1-AE2 +YO2-N3+M1 +EO2-L3+BB1 +D3-C1+YI2 D3-C1+EU2 +YO2-N3+N1 YI2-N3+N1 +K1-OE2 +S1-YI2+B3 G1-YI2 +YO2-N3+O1 YI2-N3+O1 +YO2-N3+P1 YI2-N3+P1 +S1-YI2+D3 G1-YI2 +YO2-N3+R1 YI2-N3+R1 +YO2-N3+S1 WE2-N3+S1 +D3-C1+YO2 C1 +S1-YI2+G3 G1-YI2 +YO2-N3+T1 YI2-N3+T1 +S1-YI2+L3 G1-YI2 +D3-C1+YU2 C1 +S1-YI2+M3 G1-YI2 +S1-YI2+N3 G1-YI2 +U2-B3+DD1 EU2-B3+DD1 +sil-J1+A2 +B3-O1+YA2 O1+YA2 +BB1-O2+NG3 +D3-JJ1+OE2 +S1-YI2+W3 G1-YI2 +sil-J1+E2 +B3-O1+YE2 O1+YE2 +sil-J1+I2 +B3-O1+YI2 O1+YI2 +sil-J1+O2 +B3-O1+YO2 +J1-A2+NG3 +O2-D3+SS1 +sil-J1+U2 +B3-O1+YU2 O1+YU2 +W3-J1+YA2 W3-J1+WAE2 +I2-G3+BB1 +D3-H1+YEO2 +WAE2-B3+BB1 B3+B1 +sil-C1+WA2 +W3-J1+YE2 W3-J1+WAE2 +WI2-NG3+SS1 +sil-C1+WE2 +W3-J1+YI2 W3-J1+WAE2 +JJ1-YE2+B3 SS1-YE2+NG3 +DD1+WA2 DD1+WAE2 +JJ1-YE2+D3 SS1-YE2+NG3 +sil-C1+WI2 +N3-R1+AE2 NG3-R1+AE2 +DD1+WE2 DD1+WAE2 +JJ1-YE2+G3 SS1-YE2+NG3 +W3-J1+YO2 +N3-N1+OE2 +M3-BB1+AE2 +DD1+WI2 L3-DD1+WI2 +WI2-W3+GG1 +JJ1-YE2+L3 SS1-YE2+NG3 +JJ1-YE2+M3 SS1-YE2+NG3 +W3-J1+YU2 W3-J1+WAE2 +JJ1-YE2+N3 SS1-YE2+NG3 +EO2-L3+DD1 +YE2-N3+GG1 +L3-B1+A2 +NG3-B1+EO2 +EU2-D3+JJ1 +G3-GG1+OE2 G3-GG1+AE2 +L3-B1+E2 +AE2-W3+GG1 +M3-P1+WAE2 N3-P1+WAE2 +JJ1-YE2+W3 SS1-YE2+NG3 +NG3-B1+EU2 +L3-B1+I2 +G1-WEO2 G1-WEO2+B3 +M3-S1+YEO2 +L3-B1+O2 +sil-BB1+WAE2 sil-BB1+E2 +A2-M3+B1 +NG3-DD1+WEO2 M3-DD1+YAE2 +A2-M3+C1 A2-M3+JJ1 +A2-M3+D1 WA2-M3+D1 +GG1-YEO2+B3 +W3-P1+EO2 +sil-SS1+AE2 +A2-W3+JJ1 A2-W3+C1 +GG1-YEO2+D3 +L3-B1+U2 +A2-M3+G1 +A2-M3+H1 +GG1-YEO2+G3 +A2-M3+J1 +W3-P1+EU2 +A2-M3+K1 +A2-M3+M1 +A2-M3+N1 +GG1-YEO2+L3 +L3-SS1+YAE2 L3-SS1+WE2 +WA2-D3+GG1 +A2-M3+O1 +GG1-YEO2+M3 +N1-WAE2 O1-WAE2 +A2-M3+P1 +GG1-YEO2+N3 +A2-M3+R1 WA2-M3+R1 +A2-M3+S1 +sil-JJ1+WA2 sil-JJ1+YAE2 +A2-M3+T1 WA2-M3+R1 +G3-K1+WAE2 M3-K1+WAE2 +sil-JJ1+WE2 sil-JJ1+YAE2 +BB1-YEO2 +B3-JJ1+AE2 G3-JJ1+AE2 +GG1+WAE2 +GG1-YEO2+W3 +sil-JJ1+WI2 +sil-C1+YA2 sil-C1+WE2 +I2-G3+DD1 +O1-YU2+B3 +WAE2-B3+DD1 B3 +O1-YU2+D3 +sil-C1+YE2 sil-C1+WE2 +DD1+YA2 DD1+WAE2 +U2-B3+GG1 U2-B3 +O1-YU2+G3 +sil-C1+YI2 sil-C1+WE2 +M1-EO2+NG3 +DD1+YE2 DD1+WAE2 +D3-K1+AE2 B3-K1+AE2 +O1-YU2+L3 +D3-G1+OE2 B3-G1+OE2 +O1-YU2+M3 +O1-YU2+N3 +DD1+YI2 DD1+WAE2 +sil-C1+YO2 sil-C1+WE2 +DD1-I2+NG3 +DD1+YO2 DD1+WAE2 +sil-C1+YU2 sil-C1+WE2 +NG3-C1+YEO2 NG3-C1+YAE2 +sil-JJ1+YEO2 +O1-YU2+W3 +G3-H1+AE2 +G3-D1+OE2 B3-D1 +DD1+YU2 DD1+WAE2 +O1-EO2 +GG1-YAE2+B3 D1-YAE2 +H1-WI2+NG3 +GG1-YAE2+D3 D1-YAE2 +O1-EU2 +EU2-B3+SS1 +GG1-YAE2+G3 D1-YAE2 +G3-SS1+WAE2 +GG1-YAE2+L3 D1-YAE2 +B3-S1+OE2 +S1-A2+NG3 +GG1-YAE2+M3 D1-YAE2 +WE2+NG3 K1-WE2+NG3 +NG3-J1+YAE2 +GG1-YAE2+N3 D1-YAE2 +D1+A2 +G3-SS1+WA2 +WI2-W3+JJ1 +D1+E2 D1 +GG1-YAE2+W3 D1-YAE2 +G3-SS1+WE2 +M3-B1+AE2 +D1+I2 W3-D1+I2 +G3-B1+WA2 +EO2-L3+GG1 +sil-JJ1+YA2 sil-JJ1+YAE2 +YE2-N3+JJ1 +G3-SS1+WI2 G3-SS1+I2 +G3-B1+WE2 B3-B1 +sil-JJ1+YE2 sil-JJ1+YAE2 +D1+O2 W3-D1+O2 +W3-R1+AE2 NG3-R1+AE2 +AE2-W3+JJ1 +W3-N1+OE2 +G3-B1+WI2 +sil-JJ1+YI2 sil-JJ1+YAE2 +U2-D3+BB1 +SS1-I2+NG3 +BB1-YE2+B3 SS1-YE2+NG3 +D1+U2 G3-D1+U2 +O2-L3+B1 +BB1-YE2+D3 SS1-YE2+NG3 +O2-L3+C1 +O2-L3+D1 +sil-JJ1+YO2 +BB1-YE2+G3 SS1-YE2+NG3 +O2-L3+G1 +P1-WEO2+NG3 +O2-L3+H1 +O2-L3+J1 O2-L3+C1 +sil-JJ1+YU2 sil-JJ1+YAE2 +BB1-YE2+L3 SS1-YE2+NG3 +G3-JJ1+A2 +O2-L3+K1 +BB1-YE2+M3 SS1-YE2+NG3 +BB1-YE2+N3 SS1-YE2+NG3 +N1-O2+B3 +YEO2-G3+BB1 +O2-L3+M1 +O2-L3+N1 +G3-JJ1+E2 G3-JJ1+AE2 +N1-O2+D3 +O2-L3+O1 +O2-L3+P1 +N3-R1+EO2 NG3-R1+EO2 +N1-O2+G3 +O2-L3+R1 +G3-JJ1+I2 +O2-L3+S1 +WA2-D3+JJ1 +O2-L3+T1 +G3-G1+A2 +BB1-YE2+W3 SS1-YE2+NG3 +M3-BB1+EO2 N3-BB1+EO2 +N1-O2+L3 +N1-O2+M3 +N3-R1+EU2 +G3-G1+E2 +G3-JJ1+O2 +N1-O2+N3 +N3-DD1+WAE2 N3-DD1 +M3-BB1+EU2 N3-BB1+EU2 +G3-G1+I2 B3-G1+WI2 +G3-JJ1+U2 +L3-S1+YAE2 L3-S1 +YU2-L3+sil +I2-G3+GG1 +N1-O2+W3 N1-O2 +M3-P1+WEO2 N3-P1+WAE2 +G3-G1+O2 +WAE2-B3+GG1 B3+K1 +WE2-L3+BB1 YU2-L3+BB1 +C1-EO2+B3 +U2-B3+JJ1 U2-B3 +C1-EO2+D3 +G3-G1+U2 +YAE2-M3+sil WAE2-M3+sil +H1-WE2+B3 K1-WE2+NG3 +D1-A2 +C1-EO2+G3 +N3-K1+YAE2 M3-K1+WEO2 +sil-BB1+WEO2 sil-BB1+E2 +C1-EU2+NG3 +H1-WE2+D3 K1-WE2+NG3 +G3-SS1+YA2 +EO2-N3+BB1 +D1-E2 +M1-OE2 +sil-SS1+EO2 +H1-WE2+G3 K1-WE2+NG3 +C1-EO2+L3 +C1-EO2+M3 +G3-SS1+YE2 G3-SS1+YA2 +C1-EO2+N3 +D1-I2 +G3-B1+YA2 B3-B1 +H1-WE2+L3 K1-WE2+NG3 +G3-SS1+YI2 G3-SS1+YA2 +sil-SS1+EU2 +H1-WE2+M3 K1-WE2+NG3 +H1-WE2+N3 K1-WE2+NG3 +G1-U2+B3 +G3-B1+YE2 B3-B1 +D1-O2 +L3-SS1+YEO2 L3-SS1+WE2 +G1-U2+D3 G1-U2+B3 +N1-WEO2 +YI2-G3+B1 YAE2-G3+B1 +C1-EO2+W3 +G3-SS1+YO2 G3-SS1+YA2 +YI2-G3+C1 YAE2-G3+C1 +G3-B1+YI2 +G1-U2+G3 +YI2-G3+D1 YAE2-G3+D1 +sil-K1+AE2 +U2-D3+DD1 EU2-D3+DD1 +sil-G1+OE2 +D1-U2 +G3-K1+WEO2 L3-K1 +H1-WE2+W3 K1-WE2+NG3 +YI2-G3+G1 YAE2-G3+B1 +E2-NG3+B1 +N3-BB1+OE2 N3-BB1+WAE2 +H1-OE2+NG3 H1-OE2+B3 +YI2-G3+H1 YAE2-G3+H1 +E2-NG3+C1 +G3-SS1+YU2 G3-SS1+YA2 +G1-U2+L3 K1-U2+L3 +E2-NG3+D1 +G3-B1+YO2 B3-B1 +G1-U2+M3 +YI2-G3+J1 YAE2-G3+J1 +B3-JJ1+EO2 +GG1+WEO2 +G1-U2+N3 +YI2-G3+K1 YAE2-G3+K1 +E2-NG3+G1 +WEO2-D3+B1 YI2-D3+B1 +YI2-G3+M1 YAE2-G3+M1 +E2-NG3+H1 +WEO2-D3+C1 YI2-D3+C1 +YI2-G3+N1 YAE2-G3+M1 +L3-O1+A2 +WEO2-D3+D1 YI2-D3+D1 +YI2-G3+O1 YAE2-G3+O1 +E2-NG3+J1 +G3-B1+YU2 +YI2-G3+P1 YAE2-G3+P1 +E2-NG3+K1 +B3-JJ1+EU2 +WEO2-D3+G1 YI2-D3+G1 +YI2-G3+R1 YAE2-G3+R1 +E2-NG3+M1 +L3-O1+E2 +K1-WA2 G1-WA2 +WEO2-D3+H1 YI2-D3+H1 +YI2-G3+S1 YAE2-G3+S1 +E2-NG3+N1 +G1-U2+W3 +YI2-G3+T1 YAE2-G3+R1 +O1-EU2+NG3 +E2-NG3+O1 +YEO2-G3+DD1 +WEO2-D3+J1 YI2-D3+C1 +E2-NG3+P1 +WEO2-D3+K1 D3 +L3-O1+I2 +K1-WE2 K1-WE2+NG3 +D3-SS1+AE2 +NG3-BB1+A2 +E2-NG3+R1 +WEO2-D3+M1 YI2-D3+M1 +D3-K1+EO2 B3-K1+EO2 +E2-NG3+S1 +WEO2-D3+N1 YI2-D3+N1 +B1-U2+NG3 +E2-NG3+T1 +WEO2-D3+O1 YI2-D3+O1 +K1-WI2 K1-WI2+NG3 +WEO2-D3+P1 D3 +G3-R1+WAE2 R1 +NG3-BB1+E2 +L3-O1+O2 +WEO2-D3+R1 YI2-D3+R1 +EO2-L3+JJ1 +WEO2-D3+S1 YI2-D3+S1 +D3-K1+EU2 +WEO2-D3+T1 YI2-D3+T1 +NG3-BB1+I2 +WAE2-D3+BB1 +L3-O1+U2 +WA2-B3+SS1 WE2-B3+SS1 +C1-AE2+B3 C1-AE2 +C1-AE2+D3 +NG3-BB1+O2 +G3-H1+EO2 +D3-JJ1+WA2 D3-JJ1+OE2 +C1-AE2+G3 +T1-OE2+NG3 +WE2-L3+DD1 YU2-L3+DD1 +D3-JJ1+WE2 D3-JJ1+OE2 +NG3-BB1+U2 +N3-T1+AE2 NG3-T1+AE2 +G3-H1+EU2 +C1-AE2+L3 C1-AE2 +N3-P1+OE2 +YA2-NG3 +C1-AE2+M3 +D3-JJ1+WI2 +C1-AE2+N3 +YAE2-W3+SS1 WAE2-W3+SS1 +G3-SS1+WEO2 G3-SS1+WE2 +H1-O2+NG3 +EO2-N3+DD1 +YA2-L3+BB1 YU2-L3+BB1 +WI2-M3+B1 +NG3-J1+YEO2 NG3-J1+YAE2 +C1-AE2+W3 +WI2-M3+C1 +WI2-M3+D1 +D1-YEO2+NG3 +WI2-M3+G1 +WI2-M3+H1 +WI2-M3+J1 +WI2-M3+K1 +M3-B1+EO2 +WI2-M3+M1 +WEO2-G3+sil YI2-G3+sil +WI2-M3+N1 +WI2-M3+O1 +WI2-M3+P1 +WI2-M3+R1 +M3-B1+EU2 +WI2-M3+S1 +I2-G3+JJ1 +W3-R1+EO2 NG3-R1+EO2 +N3-N1+WA2 +WI2-M3+T1 +WAE2-B3+JJ1 B3+C1 +N3-N1+WE2 +W3-R1+EU2 NG3-R1+EU2 +D1-WA2+NG3 DD1-WA2+NG3 +A2-M3+sil +K1-YA2 +N3-N1+WI2 +AE2-D3+B1 +K1-YE2 +AE2-D3+C1 +AE2-D3+D1 +G3-GG1+WA2 GG1+WA2 +K1-YI2 +AE2-D3+G1 +L3-BB1+AE2 +AE2-D3+H1 +M1-WAE2+NG3 O1-WAE2 +G3-GG1+WE2 G3-GG1+YAE2 +AE2-D3+J1 +AE2-D3+K1 +G3-GG1+WI2 +K1-YO2 +AE2-D3+M1 +AE2-D3+N1 +N3-N1+A2 +AE2-D3+O1 +AE2-D3+P1 +WAE2-D3+DD1 +SS1+A2 +AE2-D3+R1 +D3-JJ1+YA2 D3-JJ1+OE2 +N3-N1+E2 +K1-YU2 +AE2-D3+S1 +L3-P1+WAE2 L3-P1 +U2-D3+GG1 +AE2-D3+T1 +SS1+E2 W3-SS1+OE2 +N3-DD1+WEO2 N3-DD1 +D3-JJ1+YE2 D3-JJ1+OE2 +N3-N1+I2 N3-N1+WI2 +D3-M1+AE2 B3-M1+AE2 +SS1+I2 +D3-JJ1+YI2 D3-JJ1+OE2 +L3-S1+YEO2 +B3-R1+YAE2 R1 +N3-N1+O2 +SS1+O2 +D3-JJ1+YO2 +N3-N1+U2 +YEO2-G3+GG1 +B1+YAE2 B1 +SS1-E2+B3 +YA2-L3+DD1 YU2-L3+DD1 +SS1+U2 +G3-J1+AE2 +D3-JJ1+YU2 D3-JJ1+OE2 +SS1-E2+D3 +N3-K1+YEO2 NG3-K1+YEO2 +P1-WI2+B3 +SS1-E2+G3 SS1-E2+D3 +P1-WI2+D3 P1-WI2+B3 +P1-WI2+G3 P1-WI2+B3 +EU2-D3+SS1 +SS1-E2+L3 +SS1-E2+M3 SS1-E2+B3 +O2-L3+BB1 O2-L3+P1 +SS1-E2+N3 SS1-E2+NG3 +P1-WI2+L3 P1-WI2+B3 +P1-WI2+M3 P1-WI2+B3 +N3-N1+YA2 +P1-WI2+N3 P1-WI2+B3 +W3-G1+A2 +D3-G1+WA2 B3-G1+WA2 +WE2-L3+GG1 YU2-L3+GG1 +sil-K1+EO2 +N3-N1+YE2 +G3-T1+A2 +NG3-B1+OE2 +W3-G1+E2 +D3-G1+WE2 B3-G1+WE2 +SS1-E2+W3 +JJ1-EO2+NG3 +N3-R1+YAE2 R1 +N3-N1+YI2 +G3+BB1 YAE2-G3+P1 +G3-T1+E2 +W3-G1+I2 +D3-G1+WI2 +P1-WI2+W3 P1-WI2+B3 +sil-K1+EU2 +A2-W3+SS1 +J1-EU2+B3 +G3-T1+I2 +M3-D1+AE2 N3-D1+AE2 +J1-EU2+D3 +G3-GG1+YA2 G3-GG1+YAE2 +N3-N1+YO2 L3-N1+YO2 +W3-G1+O2 +G3-D1+WA2 B3-D1 +EO2-N3+GG1 +J1-EU2+G3 +WI2-M3+sil +G3-GG1+YE2 G3-GG1+YAE2 +G3-T1+O2 +G3-D1+WE2 B3-D1 +YI2-NG3+B1 WAE2-NG3+B1 +W3-T1+AE2 +N3-N1+YU2 +W3-G1+U2 +JJ1-WEO2+B3 +YI2-NG3+C1 WAE2-NG3+C1 +J1-EU2+L3 +G3-GG1+YI2 G3-GG1+YAE2 +W3-P1+OE2 +YI2-NG3+D1 WAE2-NG3+D1 +J1-EU2+M3 JJ1-EU2+M3 +D3-SS1+EO2 +YEO2-G3+B1 +JJ1-WEO2+D3 +G3-D1+WI2 +J1-EU2+N3 +YEO2-G3+C1 +G3-T1+U2 +YEO2-G3+D1 +YI2-NG3+G1 WAE2-NG3+G1 +JJ1-WEO2+G3 JJ1-WEO2+B3 +YI2-NG3+H1 WAE2-NG3+H1 +G3-R1+WEO2 B3-R1+WEO2 +SS1-A2 +G3-GG1+YO2 +YEO2-G3+G1 YEO2-G3+B1 +YI2-NG3+J1 WAE2-NG3+J1 +AE2-M3+sil E2-M3+sil +D3-SS1+EU2 +YEO2-G3+H1 +B3-S1+WA2 B3-S1 +YI2-NG3+K1 WAE2-NG3+K1 +YEO2-G3+J1 +SS1-E2 SS1-E2+NG3 +JJ1-WEO2+L3 +YI2-NG3+M1 WAE2-NG3+M1 +YEO2-G3+K1 YEO2-G3+GG1 +JJ1-WEO2+M3 J1-WEO2+NG3 +YI2-NG3+N1 WAE2-NG3+N1 +J1-EU2+W3 +JJ1-WEO2+N3 +B3-S1+WE2 B3-S1 +YI2-NG3+O1 WAE2-NG3+O1 +G3-GG1+YU2 G3-GG1+YAE2 +YEO2-G3+M1 +YI2-NG3+P1 WAE2-NG3+P1 +YEO2-G3+N1 YEO2-G3+M1 +SS1-I2 +G1-WI2+NG3 G1-WI2 +YEO2-G3+O1 +D3-K1+A2 K1+A2 +YI2-NG3+R1 WAE2-NG3+R1 +YEO2-G3+P1 YEO2-G3+BB1 +B3-S1+WI2 B3-S1+I2 +YI2-NG3+S1 WAE2-NG3+S1 +YI2-NG3+T1 WAE2-NG3+T1 +YEO2-G3+R1 YEO2-G3+DD1 +YEO2-G3+S1 +D3-K1+E2 K1+E2 +YEO2-G3+T1 YEO2-G3+DD1 +SS1-O2 SS1-O2+M3 +SS1-WE2+NG3 K1-WE2+NG3 +JJ1-WEO2+W3 JJ1-WEO2+B3 +N3-T1+EO2 +D3-K1+I2 W3-K1+I2 +S1+YAE2 S1 +SS1-U2 +D3-GG1+AE2 +N3-T1+EU2 NG3-T1+EU2 +I2-G3+B1 +D3-K1+O2 K1+O2 +W3-N1+WA2 L3-N1+WA2 +I2-G3+C1 +BB1-EU2+NG3 +I2-G3+D1 +W3-N1+WE2 L3-N1+WE2 +I2-G3+G1 I2-G3+GG1 +I2-G3+H1 +D3-K1+U2 K1+U2 +I2-G3+J1 +YU2-N3+sil N3+sil +W3-N1+WI2 W3-N1+I2 +I2-G3+K1 I2-G3+GG1 +WAE2-M3+B1 YA2-M3+B1 +WAE2-M3+C1 YI2-M3+JJ1 +WAE2-D3+GG1 +WE2-N3+BB1 YU2-N3+BB1 +I2-G3+M1 +O2-L3+DD1 +WAE2-M3+D1 WA2-M3+D1 +I2-G3+N1 I2-G3+M1 +I2-G3+O1 +I2-G3+P1 +D3-G1+YA2 B3-G1+YA2 +WAE2-M3+G1 WA2-M3+G1 +U2-D3+JJ1 EU2-D3+JJ1 +WAE2-M3+H1 WA2-M3+H1 +OE2-NG3+B1 +I2-G3+R1 +B3-H1+YAE2 B3-H1 +sil-G1+YAE2 sil-G1+E2 +OE2-NG3+C1 +I2-G3+S1 +WAE2-M3+J1 WA2-M3+J1 +OE2-NG3+D1 +I2-G3+T1 I2-G3+R1 +D3-G1+YE2 B3-G1+YE2 +WAE2-M3+K1 WA2-M3+K1 +H1-YE2+B3 +NG3-N1+WAE2 +WAE2-M3+M1 WA2-M3+M1 +OE2-NG3+G1 +H1-YE2+D3 H1-YE2+B3 +WAE2-M3+N1 WA2-M3+N1 +S1-AE2 S1-AE2+B3 +OE2-NG3+H1 +D3-G1+YI2 B3-G1+YI2 +WAE2-M3+O1 WA2-M3+O1 +O1-OE2 +WAE2-M3+P1 WA2-M3+P1 +OE2-NG3+J1 E2-NG3+J1 +G3+DD1 YAE2-G3+R1 +H1-YE2+G3 H1-YE2+B3 +OE2-NG3+K1 E2-NG3+K1 +JJ1-WAE2+B3 +WAE2-M3+R1 WA2-M3+R1 +NG3-C1+A2 +M3-D1+A2 +WAE2-M3+S1 WA2-M3+S1 +OE2-NG3+M1 +JJ1-WAE2+D3 +WAE2-M3+T1 WA2-M3+R1 +OE2-NG3+N1 E2-NG3+N1 +G3-D1+YA2 B3-D1 +D3-G1+YO2 B3-G1+YO2 +OE2-NG3+O1 +H1-YE2+L3 H1-YE2+B3 +YEO2-G3+JJ1 YEO2-G3+C1 +OE2-NG3+P1 +NG3-C1+E2 +H1-YE2+M3 H1-YE2+B3 +M3-D1+E2 +JJ1-WAE2+G3 JJ1-WAE2+B3 +H1-YE2+N3 H1-YE2+B3 +YA2-L3+GG1 YU2-L3+GG1 +OE2-NG3+R1 E2-NG3+R1 +G3-D1+YE2 B3-D1 +WI2-W3+SS1 +OE2-NG3+S1 E2-NG3+S1 +OE2-NG3+T1 +NG3-C1+I2 +M3-D1+I2 +D3-G1+YU2 B3-G1+YU2 +JJ1-WAE2+L3 +YAE2-NG3+sil WEO2-NG3+sil +G3-D1+YI2 B3-D1 +JJ1-WAE2+M3 BB1-WAE2+NG3 +sil-M1+AE2 +JJ1-WAE2+N3 JJ1-WAE2+L3 +YE2-N3+SS1 +NG3-C1+O2 +H1-YE2+W3 H1-YE2+B3 +M3-D1+O2 +L3-BB1+EO2 +A2+B3 +G3-D1+YO2 B3-D1 +B3-S1+YA2 B3-S1 +A2+D3 +AE2-W3+SS1 +NG3-C1+U2 +M3-D1+U2 +L3-BB1+EU2 +JJ1-WAE2+W3 BB1-WAE2+NG3 +B3-S1+YE2 B3-S1 +A2+G3 +G3-D1+YU2 B3-D1 +B3-S1+YI2 B3-S1 +WE2-L3+JJ1 YU2-L3+JJ1 +M1-WA2 +WEO2-W3+BB1 YAE2-W3+BB1 +A2+L3 A2 +L3-P1+WEO2 L3-P1 +A2+M3 +A2+N3 +M1-WE2 O1-WE2+B3 +B3-S1+YO2 +D3-M1+EO2 +J1-E2+NG3 JJ1-E2+NG3 +M1-WI2 N1-WI2+NG3 +B3-R1+YEO2 +AE2-NG3+sil +GG1-AE2 +EO2-N3+JJ1 +M3-K1+YAE2 M3-K1+WEO2 +B3-S1+YU2 +B1-EU2+NG3 +D3-M1+EU2 +A2+W3 +W3-N1+YA2 +YO2-D3+B1 YI2-D3+B1 +YO2-D3+C1 YI2-D3+C1 +YO2-D3+D1 YI2-D3+D1 +sil-G1+WA2 +W3-N1+YE2 L3-N1 +WA2-D3+SS1 +B1+YEO2 +N3-BB1+WA2 N3-BB1+WAE2 +YO2-D3+G1 YI2-D3+G1 +EO2-B3+sil +G3-J1+EO2 +YO2-D3+H1 YI2-D3+H1 +sil-G1+WE2 sil-G1+E2 +W3-N1+YI2 L3-N1+YI2 +N3-BB1+WE2 N3-BB1+WAE2 +YO2-D3+J1 YI2-D3+C1 +YO2-D3+K1 D3 +S1-EU2+B3 +sil-G1+WI2 +WE2-N3+DD1 +YO2-D3+M1 YI2-D3+M1 +N3-BB1+WI2 NG3-BB1+I2 +AE2-NG3 E2-NG3+R1 +S1-EU2+D3 +G3-J1+EU2 +YO2-D3+N1 YI2-D3+N1 +W3-N1+YO2 L3-N1+YO2 +YO2-D3+O1 YI2-D3+O1 +N3-R1+OE2 NG3-R1+OE2 +YO2-D3+P1 D3 +S1-EU2+G3 +YO2-D3+R1 YI2-D3+R1 +YO2-D3+S1 YI2-D3+S1 +M3-BB1+OE2 NG3-BB1+E2 +YO2-D3+T1 YI2-D3+T1 +G1-OE2+NG3 +W3-N1+YU2 L3-N1+YU2 +S1-EU2+L3 +S1-EU2+M3 +S1-EU2+N3 +U2-B3+SS1 EU2-B3+SS1 +YA2-N3+BB1 YU2-N3+BB1 +N3-R1+YEO2 B3-R1+YEO2 +L3-BB1+A2 +N1-EU2+NG3 +S1-EU2+W3 +M3-D1+EO2 +L3-BB1+E2 L3-BB1 +YU2+NG3 DD1-YU2+M3 +L3-BB1+I2 +M3-D1+EU2 +A2-B3 +W3-T1+EO2 +N3-P1+WA2 N3-P1+WAE2 +A2-D3 +WAE2-D3+JJ1 EO2-D3+JJ1 +O2-L3+GG1 +sil-SS1+OE2 sil-SS1+AE2 +L3-BB1+O2 +A2-G3 A2-G3+C1 +N3-P1+WE2 N3-P1+WAE2 +W3-T1+EU2 +BB1+AE2 +M1-YA2 +N3-P1+WI2 +A2-L3 +L3-BB1+U2 +A2-M3 M3 +S1-OE2+NG3 +WEO2-W3+DD1 +A2-N3 +M1-YE2 +G3+GG1 YAE2-G3+K1 +M1-YI2 +A2-W3 A2-W3+GG1 +WE2-NG3+BB1 YAE2-NG3+BB1 +B3-JJ1+OE2 B3-JJ1+WAE2 +M1-YO2 +W3-T1+A2 +YA2-L3+JJ1 YU2-L3+JJ1 +sil-G1+YA2 sil-G1+E2 +N3-BB1+YA2 N3-BB1+WAE2 +W3-T1+E2 G3-T1+E2 +S1+YEO2 +sil-G1+YE2 sil-G1+E2 +M1-YU2 M1-YU2+W3 +D3-GG1+EO2 +N3-BB1+YE2 N3-BB1+WAE2 +EO2-L3+SS1 +W3-T1+I2 G3-T1+I2 +sil-G1+YI2 sil-G1+E2 +NG3-GG1+A2 +N3-BB1+YI2 N3-BB1+WAE2 +JJ1-U2+NG3 +W3-SS1+WAE2 W3-SS1+WE2 +D3-O1+AE2 B3-O1+AE2 +D3-GG1+EU2 G3-GG1+EU2 +D3-K1+OE2 B3-K1+OE2 +B3-GG1+YAE2 G3-GG1+YAE2 +NG3-GG1+E2 +W3-T1+O2 +sil-G1+YO2 +sil-D1+WAE2 +N3-BB1+YO2 N3-BB1+WAE2 +O1-O2+B3 +NG3-GG1+I2 M3-GG1+WI2 +O1-O2+D3 +W3-T1+U2 +sil-G1+YU2 +N3-BB1+YU2 N3-BB1+WAE2 +O1-O2+G3 +B3-H1+YEO2 D3-H1+YEO2 +sil-G1+YEO2 +NG3-GG1+O2 +YA2-N3+DD1 YU2-N3+DD1 +NG3-N1+WEO2 NG3-N1+WE2 +G3-H1+OE2 +C1-WA2+NG3 J1-WA2+NG3 +O1-O2+L3 +S1-EO2 S1-EO2+W3 +O1-O2+M3 +P1-YI2+B3 +O1-O2+N3 +NG3-GG1+U2 +P1-YI2+D3 P1-YI2+B3 +P1-YI2+G3 P1-YI2+B3 +S1-EU2 +O2-N3+BB1 +O1-O2+W3 +P1-YI2+L3 P1-YI2+B3 +SS1-YAE2 D1-YAE2 +P1-YI2+M3 P1-YI2+B3 +DD1-WEO2+NG3 SS1-WEO2+M3 +N3-P1+YA2 N3-P1+WAE2 +P1-YI2+N3 P1-YI2+B3 +S1-E2+NG3 +WI2+NG3 +WE2-N3+GG1 YE2-N3+GG1 +sil-M1+EO2 +N3-P1+YE2 N3-P1+WAE2 +N3-P1+YI2 N3-P1+WAE2 +P1-YI2+W3 P1-YI2+B3 +sil-M1+EU2 +I2-G3+SS1 I2-G3+S1 +WAE2-B3+SS1 WE2-B3+SS1 +N3-P1+YO2 +M3-B1+OE2 N3-B1+OE2 +D3-G1+YAE2 B3-G1 +N3-P1+YU2 +H1-U2+B3 +AE2 +W3-R1+OE2 NG3-R1+OE2 +WE2-NG3+DD1 YAE2-NG3+DD1 +H1-U2+D3 +WE2-G3+B1 YAE2-G3+B1 +WE2-G3+C1 YAE2-G3+C1 +H1-U2+G3 +WE2-G3+D1 YAE2-G3+D1 +GG1-EO2 G1-EO2 +M3-K1+YEO2 NG3-K1+YEO2 +WE2-G3+G1 YAE2-G3+B1 +W3-BB1+AE2 +WE2-G3+H1 YAE2-G3+H1 +H1-U2+L3 U2+L3 +H1-U2+M3 +J1-WAE2+NG3 P1-WAE2 +WE2-G3+J1 YAE2-G3+J1 +H1-U2+N3 H1-U2+D3 +NG3-B1+WA2 +WE2-G3+K1 YAE2-G3+K1 +NG3-P1+A2 +GG1-EU2 +WE2-G3+M1 YAE2-G3+M1 +O2-L3+JJ1 O2-L3+C1 +WE2-G3+N1 YAE2-G3+M1 +NG3-B1+WE2 +WE2-G3+O1 YAE2-G3+O1 +NG3-P1+E2 NG3-P1+OE2 +WE2-G3+P1 YAE2-G3+P1 +J1-OE2+B3 +WE2-G3+R1 YAE2-G3+R1 +NG3-B1+WI2 N3-B1+WI2 +WE2-G3+S1 YAE2-G3+S1 +H1-U2+W3 H1-U2+B3 +J1-OE2+D3 +W3-P1+WAE2 W3-P1+OE2 +NG3-P1+I2 NG3-P1+WI2 +WE2-G3+T1 YAE2-G3+R1 +WEO2-W3+GG1 +J1-OE2+G3 +NG3-P1+O2 +G3+JJ1 YAE2-G3+C1 +M3-R1+YAE2 R1 +BB1 +J1-OE2+L3 J1-OE2+D3 +W3-P1+WA2 +J1-OE2+M3 B1-OE2+M3 +J1-OE2+N3 B1-OE2+N3 +NG3-P1+U2 +W3-P1+WE2 P1 +W3-P1+WI2 B3-P1+I2 +B3-DD1+A2 +O2-N3+DD1 +J1-OE2+W3 J1-OE2+B3 +B3-DD1+E2 B3-DD1+AE2 +B3-DD1+I2 B3-DD1+WI2 +B3-DD1+O2 +P1-YAE2 D1-YAE2 +G3-M1+YAE2 G3-M1+WAE2 +BB1+EO2 L3-BB1+EO2 +B3-DD1+U2 +YA2-N3+GG1 YE2-N3+GG1 +O2-B3+B1 O2-B3+BB1 +O2-B3+C1 O2-B3+JJ1 +O2-B3+D1 EO2-B3+D1 +BB1+EU2 L3-BB1+EU2 +O2-B3+G1 +sil-O1+AE2 +O2-B3+H1 O2-B3+G1 +sil-K1+OE2 +O2-B3+J1 O2-B3+JJ1 +O2-B3+K1 O2-B3+G1 +N1-E2+B3 N1-E2 +O2-B3+M1 +BB1-U2+NG3 +O2-B3+N1 +M3-JJ1+YAE2 M3-JJ1+WAE2 +N1-E2+D3 N1-E2 +O2-B3+O1 EO2-B3+O1 +O2-B3+P1 O2-B3+BB1 +NG3-B1+YA2 NG3-B1+WE2 +N1-E2+G3 N1-E2 +O2-B3+R1 O2-B3+G1 +O2-B3+S1 +O2-B3+T1 O2-B3+G1 +EU2-L3+BB1 EU2-L3+P1 +NG3-B1+YE2 NG3-B1+WE2 +WE2-N3+JJ1 YE2-N3+JJ1 +O1-WA2 +SS1-WEO2+NG3 SS1-WEO2+M3 +N1-E2+L3 N1-E2 +N1-E2+M3 N1-E2 +NG3-B1+YI2 +sil-M1+A2 +N1-E2+N3 N1-E2 +O1-WE2 O1-WE2+B3 +W3-SS1+WEO2 W3-SS1+WE2 +D3-O1+EO2 +D3-SS1+OE2 D3-SS1+AE2 +sil-M1+E2 +WE2-B3+sil YU2-B3+sil +B3-GG1+YEO2 G3-GG1+YEO2 +O1-WI2 N1-WI2+NG3 +NG3-B1+YO2 NG3-B1+WE2 +sil-D1+WEO2 sil-D1+E2 +sil-M1+I2 +D3-O1+EU2 +N1-E2+W3 +W3-P1+YA2 P1 +DD1 DD1+WAE2 +I2-M3+BB1 WI2-M3+BB1 +T1-YEO2+NG3 +NG3-B1+YU2 +W3-P1+YE2 +sil-M1+O2 +EO2-D3+sil +WE2-NG3+GG1 YAE2-NG3+GG1 +DD1-EO2+NG3 +W3-P1+YI2 P1 +sil-M1+U2 +W3-P1+YO2 +N3-T1+OE2 +YE2-NG3 WAE2-NG3+R1 +B1+AE2 +sil-K1+WAE2 sil-K1+OE2 +W3-P1+YU2 P1 +SS1-YEO2 D1-YEO2 +U2-D3+SS1 +WEO2-W3+JJ1 +G3-DD1+WAE2 B3-DD1+OE2 +D3-D1+WAE2 +YE2-N3+B1 YI2-N3+B1 +YE2-N3+C1 YI2-N3+C1 +YE2-N3+D1 +D3-G1+YEO2 G3-G1+YEO2 +YEO2-G3+SS1 +S1-OE2+B3 +YE2-N3+G1 YI2-N3+G1 +YE2-N3+H1 YI2-N3+H1 +L3-K1+YAE2 L3-K1 +YAE2-NG3+B1 WAE2-NG3+B1 +S1-OE2+D3 +YAE2-NG3+C1 WAE2-NG3+C1 +N3-R1+WA2 R1 +YE2-N3+J1 YI2-N3+J1 +YAE2-NG3+D1 WAE2-NG3+D1 +EO2 +YE2-N3+K1 YI2-N3+K1 +O2-N3+GG1 +S1-OE2+G3 +YE2-N3+M1 YO2-N3+M1 +YAE2-NG3+G1 WAE2-NG3+G1 +N3-R1+WE2 R1 +M3-BB1+WA2 NG3-BB1+E2 +YE2-N3+N1 +YAE2-NG3+H1 WAE2-NG3+H1 +YE2-N3+O1 YI2-N3+O1 +YE2-N3+P1 YI2-N3+P1 +YAE2-NG3+J1 WAE2-NG3+J1 +S1-OE2+L3 S1-OE2+D3 +EU2 +D1-WE2+NG3 K1-WE2+NG3 +O1-YA2 +YAE2-NG3+K1 WAE2-NG3+K1 +S1-OE2+M3 +N3-R1+WI2 N3-R1+I2 +EU2-L3+DD1 +M3-BB1+WE2 NG3-BB1+E2 +YE2-N3+R1 +S1-OE2+N3 B1-OE2+N3 +W3-BB1+EO2 +YE2-N3+S1 WE2-N3+S1 +YAE2-NG3+M1 WAE2-NG3+M1 +YE2-N3+T1 +YAE2-NG3+N1 WAE2-NG3+N1 +O1-YE2 O1-YE2+B3 +YAE2-NG3+O1 WAE2-NG3+O1 +M3-BB1+WI2 NG3-BB1+I2 +YAE2-NG3+P1 WAE2-NG3+P1 +YAE2-NG3+R1 WAE2-NG3+R1 +W3-BB1+EU2 +O1-YI2 +YAE2-NG3+S1 WAE2-NG3+S1 +YAE2-NG3+T1 WAE2-NG3+T1 +WE2-L3+SS1 YU2-L3+SS1 +S1-OE2+W3 S1-OE2+B3 +L3-BB1+OE2 L3-BB1 +W3-P1+WEO2 P1 +O1-YO2 O1-YO2+L3 +YA2-N3+JJ1 YE2-N3+JJ1 +I2-M3+DD1 WI2-M3+DD1 +M3-BB1+WAE2 NG3-BB1+E2 +O1-YU2 O1-YU2+W3 +EO2-N3+SS1 YO2-N3+SS1 +M3-R1+YEO2 B3-R1+YEO2 +YA2-B3+sil YU2-B3+sil +sil-SS1+WA2 +M1-EU2+NG3 +YEO2-NG3+sil WEO2-NG3+sil +sil-SS1+WE2 +B3-SS1+AE2 +D3-M1+OE2 B3-M1+AE2 +sil-SS1+WI2 +DD1-O2+NG3 +M1-WAE2 O1-WAE2 +G3-N1+AE2 +G3-J1+OE2 +B3-JJ1+WA2 B3-JJ1+WAE2 +G3-J1+WAE2 B3-J1 +R1-OE2+NG3 S1-OE2+NG3 +P1-YEO2 +B3-JJ1+WE2 B3-JJ1+WAE2 +GG1 N3-GG1+YA2 +B3-JJ1+WI2 +G3-M1+YEO2 +EO2-NG3+sil +WE2-NG3+JJ1 YAE2-NG3+DD1 +GG1-A2+B3 +N3-R1+YA2 NG3-R1+YA2 +GG1-A2+D3 +E2-W3+sil +D3-K1+WA2 B3-K1+WA2 +GG1-A2+G3 +sil-O1+EO2 +N3-R1+YE2 R1 +WA2-L3+BB1 +M3-BB1+YA2 NG3-BB1+E2 +N3-SS1+AE2 L3-SS1+OE2 +D3-K1+WE2 L3-K1 +B3-B1+A2 +N3-R1+YI2 NG3-R1+YI2 +GG1-A2+L3 +L3-GG1+A2 +M3-BB1+YE2 NG3-BB1+E2 +D3-K1+WI2 B3-K1+WI2 +GG1-A2+M3 +sil-O1+EU2 +GG1-A2+N3 +M3-JJ1+YEO2 M3-JJ1+WAE2 +B3-B1+E2 +WAE2-D3+SS1 +L3-GG1+E2 +M3-H1+AE2 M3-H1+E2 +M3-BB1+YI2 NG3-BB1+E2 +N3-R1+YO2 NG3-R1+YO2 +M3-D1+OE2 N3-D1+OE2 +G3-H1+WA2 +N3-D1+A2 +B3-B1+I2 +L3-GG1+I2 M3-GG1+WI2 +G1+A2 +M3-BB1+YO2 NG3-BB1+E2 +G3-H1+WE2 G3-H1+YAE2 +N3-D1+E2 M3-D1+E2 +GG1-A2+W3 +N3-R1+YU2 NG3-R1+YU2 +B3-B1+O2 +W3-T1+OE2 +G1+E2 +L3-GG1+O2 +G3-H1+WI2 +N3-D1+I2 +M3-BB1+YU2 NG3-BB1+E2 +SS1-O2+NG3 +WAE2-NG3 WAE2-NG3+R1 +NG3-GG1+WAE2 GG1+WAE2 +G1+I2 +B3-B1+U2 +L3-GG1+U2 +N3-D1+O2 +sil-SS1+YA2 sil-SS1+WE2 +YA2-L3+SS1 YU2-L3+SS1 +G1+O2 +A2-NG3+B1 +sil-SS1+YE2 sil-SS1+WE2 +A2-NG3+C1 +N3-D1+U2 M3-D1+U2 +A2-NG3+D1 +O2-N3+JJ1 +sil-SS1+YI2 sil-SS1+WE2 +YEO2-M3+BB1 YAE2-M3+BB1 +C1-WI2+B3 C1-WI2 +G1+U2 +A2-NG3+G1 +A2-NG3+H1 +C1-WI2+D3 C1-WI2 +R1-A2+B3 +SS1-WI2+NG3 DD1-WI2+NG3 +A2-NG3+J1 +R1-A2+D3 +M3-B1+WA2 N3-B1+WA2 +EU2-L3+GG1 +A2-NG3+K1 +C1-WI2+G3 C1-WI2 +O2-B3+sil EO2-B3+sil +sil-SS1+YO2 sil-SS1+WE2 +A2-NG3+M1 +R1-A2+G3 +A2-NG3+N1 +B1+EO2 +M3-B1+WE2 N3-B1+WE2 +A2-NG3+O1 +A2-NG3+P1 +sil-K1+WEO2 sil-K1+AE2 +C1-WI2+L3 C1-WI2 +C1-WI2+M3 C1-WI2 +A2-NG3+R1 A2-NG3+JJ1 +B3-JJ1+YA2 B3-JJ1+WAE2 +sil-SS1+YU2 sil-SS1+WE2 +C1-WI2+N3 C1-WI2 +W3-R1+WA2 R1 +D3-GG1+OE2 D3-GG1+AE2 +R1-A2+L3 +M3-B1+WI2 +A2-NG3+S1 +R1-A2+M3 +A2-NG3+T1 +B1+EU2 W3-B1+EU2 +R1-A2+N3 +B3-JJ1+YE2 B3-JJ1+WAE2 +W3-R1+WE2 R1 +B3-JJ1+YI2 B3-JJ1+WAE2 +G3-J1+A2 +W3-R1+WI2 N3-R1+I2 +I2-M3+GG1 WI2-M3+GG1 +C1-WI2+W3 C1-WI2 +G3-DD1+WEO2 +D3-D1+WEO2 D3-D1+WAE2 +R1-A2+W3 +G3-J1+E2 G3-J1+AE2 +JJ1-O2+B3 +M3-JJ1+A2 +D3-K1+YA2 L3-K1 +B3-JJ1+YO2 +JJ1+AE2 +JJ1-O2+D3 +G3-J1+I2 G3-J1+EU2 +M3-JJ1+E2 N3-JJ1+E2 +JJ1-O2+G3 +D3-K1+YE2 L3-K1 +WA2-L3+DD1 +O1-WA2+B3 M1-WA2+B3 +B3-JJ1+YU2 B3-JJ1+WAE2 +M3-JJ1+I2 +L3-K1+YEO2 +D3-K1+YI2 B3-K1+YI2 +O1-WA2+D3 M1-WA2+D3 +G3-J1+O2 +S1-OE2 S1-OE2+B3 +JJ1-O2+L3 +JJ1-O2+M3 +W3-D1+YAE2 W3-D1+WEO2 +JJ1-O2+N3 +O1-WA2+G3 M1-WA2+B3 +M3-JJ1+O2 N3-JJ1+O2 +G3-H1+YA2 +D3-K1+YO2 B3-K1+YO2 +G3-J1+U2 +O1-WA2+L3 +O1-WA2+M3 +D3-K1+WAE2 M3-K1+WAE2 +G1-A2 +G3-H1+YE2 +O1-WA2+N3 +M3-JJ1+U2 N3-JJ1+U2 +JJ1-O2+W3 +D3-K1+YU2 B3-K1+YU2 +G1-E2 G1-E2+L3 +G3-H1+YI2 D3-H1+I2 +sil-M1+OE2 sil-M1+E2 +G1-I2 +JJ1 L3-JJ1 +O1-WA2+W3 +G3-H1+YO2 G3-H1+YAE2 +L3-R1+YAE2 L3-R1 +JJ1-YU2+B3 DD1-YU2+B3 +JJ1-YU2+D3 DD1-YU2+B3 +G1-O2 +M3-BB1+WEO2 NG3-BB1+E2 +G3-H1+YU2 G3-H1+YAE2 +JJ1-YU2+G3 DD1-YU2+B3 +EU2-N3+BB1 +G1-U2 +YEO2-M3+DD1 WA2-M3+R1 +JJ1-YU2+L3 DD1-YU2+L3 +JJ1-YU2+M3 DD1-YU2+M3 +YU2-L3+B1 +WI2-NG3+B1 +JJ1-YU2+N3 DD1-YU2+N3 +M3-B1+YA2 N3-B1+WE2 +YU2-L3+C1 YU2-L3+JJ1 +WI2-NG3+C1 +YU2-L3+D1 +J1-I2+NG3 +WI2-NG3+D1 +B3-SS1+EO2 +WEO2-G3+B1 YAE2-G3+B1 +WE2-D3+sil YO2-D3+sil +WEO2-G3+C1 YAE2-G3+C1 +O2-L3+SS1 +M3-B1+YE2 N3-B1+WE2 +L3-R1+A2 +WEO2-G3+D1 YAE2-G3+D1 +YU2-L3+G1 +WI2-NG3+G1 +YU2-L3+H1 +WI2-NG3+H1 +WEO2-G3+G1 YAE2-G3+B1 +YU2-L3+J1 YU2-L3+JJ1 +W3-R1+YA2 NG3-R1+YA2 +GG1-OE2 +WI2-NG3+J1 +M3-B1+YI2 N3-B1+YI2 +L3-R1+E2 L3-R1+OE2 +B3-SS1+EU2 +WEO2-G3+H1 YAE2-G3+H1 +YU2-L3+K1 YU2-L3+GG1 +WI2-NG3+K1 +JJ1-YU2+W3 DD1-YU2+M3 +E2-L3+B1 +E2-L3+C1 +WEO2-G3+J1 YAE2-G3+J1 +YU2-L3+M1 +WI2-NG3+M1 +sil-K1+WA2 +E2-L3+D1 +WEO2-G3+K1 YAE2-G3+K1 +YU2-L3+N1 +W3-R1+YE2 R1 +AE2-NG3+B1 +WI2-NG3+N1 +L3-R1+I2 L3-R1+WI2 +YU2-L3+O1 +AE2-NG3+C1 E2-NG3+C1 +WI2-NG3+O1 +M1-WEO2 +WEO2-G3+M1 YAE2-G3+M1 +YU2-L3+P1 YU2-L3+BB1 +AE2-NG3+D1 +WI2-NG3+P1 +M3-B1+YO2 N3-B1+WE2 +E2-L3+G1 +WEO2-G3+N1 YAE2-G3+M1 +G3-N1+EO2 +sil-K1+WE2 sil-K1+AE2 +E2-L3+H1 YU2-L3+H1 +WEO2-G3+O1 YAE2-G3+O1 +YU2-L3+R1 +W3-R1+YI2 NG3-R1+YI2 +WI2-NG3+R1 WI2-NG3+DD1 +G3+SS1 YAE2-G3+SS1 +WEO2-G3+P1 YAE2-G3+P1 +YU2-L3+S1 +AE2-NG3+G1 +WI2-NG3+S1 +E2-L3+J1 +YU2-L3+T1 +AE2-NG3+H1 E2-NG3+H1 +WI2-NG3+T1 WI2-NG3+P1 +L3-R1+O2 +G3-J1+WEO2 B3-J1 +E2-L3+K1 +WEO2-G3+R1 YAE2-G3+R1 +sil-K1+WI2 +WEO2-G3+S1 YAE2-G3+S1 +AE2-NG3+J1 +D1-O2+B3 +M3-B1+YU2 N3-B1+YU2 +E2-L3+M1 +WEO2-G3+T1 YAE2-G3+R1 +AE2-NG3+K1 +G3-N1+EU2 +E2-L3+N1 +W3-R1+YO2 NG3-R1+YO2 +D1-O2+D3 D1-O2+B3 +E2-L3+O1 +AE2-NG3+M1 +D1+AE2 +E2-L3+P1 +AE2-NG3+N1 E2-NG3+N1 +L3-R1+U2 L3-R1+O2 +AE2-NG3+O1 +D1-O2+G3 D1-O2+B3 +E2-L3+R1 +AE2-NG3+P1 E2-NG3+P1 +E2-L3+S1 +E2-L3+T1 +W3-R1+YU2 NG3-R1+YU2 +AE2-NG3+R1 E2-NG3+R1 +B3-GG1+AE2 +AE2-NG3+S1 +P1-O2+B3 +H1-U2+NG3 +AE2-NG3+T1 E2-NG3+T1 +D3-SS1+WA2 +D1-O2+L3 +D1-O2+M3 +P1-O2+D3 +D1-O2+N3 D1-O2+M3 +T1-WAE2 T1-WAE2+NG3 +D3-SS1+WE2 +EU2-L3+JJ1 +P1-O2+G3 P1-O2+B3 +N3-SS1+EO2 +D3-SS1+WI2 +N3-BB1+YAE2 N3-BB1+WAE2 +P1-O2+L3 +P1-O2+M3 +N3-SS1+EU2 +D1-O2+W3 +P1-O2+N3 +M3-H1+EO2 N3-H1+EO2 +WEO2-M3+sil WAE2-M3+sil +NG3-C1+AE2 +YI2-W3+sil +M3-H1+EU2 +I2-M3+JJ1 WI2-M3+JJ1 +N3-T1+WA2 NG3-T1+AE2 +P1-O2+W3 +D3-JJ1+WAE2 D3-JJ1+OE2 +N3-T1+WE2 NG3-T1+AE2 +YI2-NG3+BB1 YAE2-NG3+BB1 +NG3-GG1+WEO2 GG1+WEO2 +N3-T1+WI2 NG3-T1+WI2 +BB1+OE2 BB1 +EU2-N3+DD1 +WA2-L3+GG1 +WE2-N3+SS1 YO2-N3+SS1 +sil-K1+YA2 sil-K1+AE2 +AE2-G3+B1 +AE2-G3+C1 +AE2-G3+D1 AE2-G3+C1 +JJ1+WAE2 L3-JJ1 +sil-K1+YE2 sil-K1+AE2 +B3-O1+A2 D3-O1+A2 +AE2-G3+G1 +YA2-D3+sil YO2-D3+sil +AE2-G3+H1 AE2-G3+C1 +JJ1-WEO2+NG3 J1-WEO2+NG3 +sil-K1+YI2 +AE2-G3+J1 AE2-G3+C1 +B3-O1+E2 D3-O1+E2 +AE2-G3+K1 +D3-S1+AE2 +AE2-G3+M1 +D3-O1+OE2 B3-O1+OE2 +AE2-G3+N1 AE2-G3+M1 +B3-O1+I2 D3-O1+I2 +AE2-G3+O1 +NG3-P1+YAE2 NG3-P1+WA2 +sil-K1+YO2 +AE2-G3+P1 +YU2-NG3+BB1 YAE2-NG3+BB1 +OE2-W3+sil +T1+A2 +AE2-G3+R1 +AE2-G3+S1 AE2-G3+C1 +AE2-G3+T1 AE2-G3+R1 +D3-SS1+YA2 D3-SS1+WE2 +B3-O1+O2 +sil-K1+YU2 +T1+E2 G3-T1+E2 +YEO2-M3+GG1 YAE2-M3+GG1 +JJ1+EO2 +D3-SS1+YE2 D3-SS1+WE2 +L3-BB1+WA2 L3-BB1 +G3-P1+AE2 +T1+I2 G3-T1+I2 +R1-EO2+B3 +B3-O1+U2 +R1-EO2+D3 +JJ1+EU2 +D3-SS1+YI2 D3-SS1+WE2 +E2-B3+BB1 E2-B3 +L3-BB1+WE2 L3-BB1 +R1-EO2+G3 +W3-D1+YEO2 W3-D1+WEO2 +T1+O2 W3-T1+O2 +L3-BB1+WI2 L3-BB1+I2 +NG3 WAE2-NG3+R1 +D3-SS1+YO2 D3-SS1+WE2 +R1-EO2+L3 +WEO2-W3+SS1 +R1-EO2+M3 +BB1-YU2+B3 +T1+U2 W3-T1+U2 +R1-EO2+N3 +D3-K1+WEO2 L3-K1 +BB1-YU2+D3 BB1-YU2+B3 +D3-SS1+YU2 D3-SS1+WE2 +N3-T1+YA2 NG3-T1+AE2 +D3-M1+WA2 +S1-I2+NG3 +BB1-YU2+G3 BB1-YU2+B3 +N3-T1+YE2 NG3-T1+AE2 +WA2-N3+BB1 +D3-M1+WE2 M1+WE2 +JJ1-EU2+NG3 +R1-EO2+W3 +BB1-YU2+L3 +YI2-NG3+DD1 YAE2-NG3+DD1 +BB1-YU2+M3 +N3-T1+YI2 NG3-T1+AE2 +M3+BB1 YAE2-M3+BB1 +BB1-YU2+N3 +L3-R1+YEO2 +D3-M1+WI2 M1+WI2 +W3-K1+YAE2 W3-K1+WEO2 +M3-J1+AE2 N3-J1+AE2 +W3-J1+A2 +N3-T1+YO2 NG3-T1+AE2 +G3-J1+WA2 +W3-J1+E2 +BB1-YU2+W3 BB1-YU2+M3 +D3-R1+WAE2 R1 +G3-J1+WE2 B3-J1 +N3-T1+YU2 NG3-T1+AE2 +W3-J1+I2 +G3-J1+WI2 G3-J1+EU2 +OE2 S1-OE2+B3 +U2-L3+BB1 +W3-J1+O2 +O1-E2+B3 +W3-BB1+OE2 W3-BB1+YAE2 +YA2-N3+SS1 YO2-N3+SS1 +O1-E2+D3 O1-E2+B3 +W3-J1+U2 +O1-E2+G3 O1-E2+B3 +C1-YI2+B3 YI2+NG3 +R1-AE2+B3 +T1-A2 +C1-YI2+D3 YI2+NG3 +YU2-NG3+DD1 YAE2-NG3+DD1 +O1-E2+L3 +R1-AE2+D3 +O1-E2+M3 +M3-D1+WA2 N3-D1+OE2 +EU2-N3+GG1 +O1-E2+N3 O1-E2+M3 +C1-YI2+G3 YI2+NG3 +O2-D3+sil +T1-E2 +R1-AE2+G3 R1-AE2+B3 +WA2-L3+JJ1 +D1+EO2 W3-D1+EO2 +M3-D1+WE2 N3-D1+AE2 +L3-BB1+YA2 L3-BB1 +M3-SS1+AE2 W3-SS1+OE2 +T1-I2 +C1-YI2+L3 YI2+NG3 +D3-N1+A2 +C1-YI2+M3 YI2+NG3 +R1-AE2+L3 R1-AE2+B3 +C1-YI2+N3 YI2+NG3 +W3-T1+WA2 D3-T1+YEO2 +B3-GG1+EO2 GG1+EO2 +R1-AE2+M3 +M3-D1+WI2 N3-D1+WI2 +L3-BB1+YE2 L3-BB1 +R1-AE2+N3 R1-AE2+M3 +D1+EU2 +O1-E2+W3 +D3-N1+E2 +E2-B3+DD1 +WI2-NG3+sil +T1-O2 +W3-T1+WE2 D3-T1+YEO2 +L3-BB1+YI2 L3-BB1 +YI2-W3+B1 +T1-WEO2 SS1-WEO2 +B3-GG1+EU2 +D3-N1+I2 G3-N1+I2 +YI2-W3+C1 +GG1-YA2+NG3 G1-YA2+M3 +YI2-W3+D1 +W3-T1+WI2 +C1-YI2+W3 YI2+NG3 +T1-U2 +R1-AE2+W3 +N3-BB1+YEO2 N3-BB1+WAE2 +YI2-W3+G1 +L3-BB1+YO2 L3-BB1 +YI2-W3+H1 +D3-N1+O2 +D3-M1+YA2 M1+WE2 +YI2-W3+J1 +YI2-W3+K1 +NG3-C1+EO2 NG3-C1+YAE2 +YI2-W3+M1 +L3-BB1+YU2 L3-BB1 +D3-M1+YE2 M1+WE2 +YI2-W3+N1 YAE2-W3+N1 +WA2-N3+DD1 +D3-N1+U2 G3-N1+U2 +YI2-W3+O1 +O1-YA2+B3 +U2-L3+B1 +YI2-W3+P1 +WE2-NG3+SS1 YAE2-NG3+SS1 +U2-L3+C1 +D3-M1+YI2 M1+WE2 +O1-YA2+D3 +U2-L3+D1 +YI2-W3+R1 +NG3-C1+EU2 +YI2-W3+S1 +M3+DD1 WA2-M3+R1 +YI2-W3+T1 YI2-W3+DD1 +O1-YA2+G3 +U2-L3+G1 +K1-YEO2+B3 +U2-L3+H1 +D3-JJ1+WEO2 D3-JJ1+OE2 +K1-YEO2+D3 +G3-J1+YA2 B3-J1 +D3-M1+YO2 M1+YO2 +U2-L3+J1 +YEO2-M3+JJ1 YI2-M3+JJ1 +D3-GG1+WA2 L3-GG1+WA2 +U2-L3+K1 +O1-YA2+L3 +K1-YEO2+G3 +O1-YA2+M3 +U2-L3+M1 +R1+YAE2 R1 +G3-J1+YE2 B3-J1 +O1-YA2+N3 +U2-L3+N1 +D3-GG1+WE2 D3-GG1+YAE2 +U2-L3+O1 +D3-M1+YU2 M1+WE2 +U2-L3+P1 +K1-YEO2+L3 +G3-J1+YI2 B3-J1 +U2-L3+R1 +K1-YEO2+M3 +D3-GG1+WI2 +sil-S1+AE2 +U2-L3+S1 +K1-YEO2+N3 K1-YEO2+M3 +U2-L3+T1 +U2-L3+DD1 U2-L3+T1 +M3-G1+A2 +sil-O1+OE2 +WA2-L3+B1 +WA2-L3+C1 +O1-YA2+W3 +G3-J1+YO2 +WA2-L3+D1 +M3-G1+E2 +WA2-L3+G1 +WA2-L3+H1 +K1-YEO2+W3 +M3-G1+I2 +G3-J1+YU2 B3-J1 +WA2-L3+J1 WA2-L3+C1 +WA2-L3+K1 +JJ1+WEO2 +B3-G1+YAE2 B3-G1 +S1-WA2 +WA2-L3+M1 +WA2-L3+N1 +M3-G1+O2 +NG3-M1+WAE2 +WA2-L3+O1 +WA2-L3+P1 WA2-L3+BB1 +YI2-NG3+GG1 YAE2-NG3+GG1 +S1-WE2 K1-WE2+NG3 +M3-D1+YA2 N3-D1+AE2 +WA2-L3+R1 +D3-S1+EO2 +WA2-L3+S1 YU2-L3+S1 +WA2-L3+T1 +M3-G1+U2 +O2-N3+SS1 +S1-WI2 S1-WI2+L3 +M3-D1+YE2 N3-D1+AE2 +NG3-P1+YEO2 +D3-S1+EU2 +W3-T1+YA2 +M3-D1+YI2 N3-D1+AE2 +N1-YAE2+NG3 +W3-DD1+WAE2 +WAE2-L3+BB1 YU2-L3+BB1 +sil-M1+WA2 +W3-T1+YE2 D3-T1+YEO2 +M3-D1+YO2 N3-D1+AE2 +G3-P1+EO2 +sil-M1+WE2 +W3-T1+YI2 +sil-M1+WI2 sil-M1+I2 +M3-D1+YU2 N3-D1+AE2 +G3-P1+EU2 +YO2-G3+B1 YAE2-G3+B1 +W3-T1+YO2 D3-T1+YEO2 +YI2-NG3 WAE2-NG3+R1 +YO2-G3+C1 +K1-YAE2+B3 D1-YAE2 +YO2-G3+D1 YAE2-G3+D1 +B1+OE2 W3-B1+OE2 +K1-YAE2+D3 D1-YAE2 +YO2-G3+G1 YAE2-G3+B1 +YO2-G3+H1 YAE2-G3+H1 +W3-T1+YU2 D3-T1+YEO2 +K1-YAE2+G3 D1-YAE2 +YO2-G3+J1 +YO2-G3+K1 YAE2-G3+K1 +YI2-B3+BB1 B3+B1 +YU2-NG3+GG1 YAE2-NG3+GG1 +YO2-G3+M1 YAE2-G3+M1 +K1-YAE2+L3 D1-YAE2 +YO2-G3+N1 YAE2-G3+M1 +W3-H1+WAE2 H1 +EU2-N3+JJ1 +K1-YAE2+M3 D1-YAE2 +YO2-G3+O1 YAE2-G3+O1 +K1-YAE2+N3 D1-YAE2 +YO2-G3+P1 YAE2-G3+P1 +D3-GG1+YA2 D3-GG1+YAE2 +GG1-WA2 +YO2-G3+R1 YAE2-G3+R1 +YO2-G3+S1 YAE2-G3+S1 +DD1+YAE2 DD1+WAE2 +YO2-G3+T1 YAE2-G3+R1 +D3-GG1+YE2 D3-GG1+YAE2 +GG1-WE2 +W3-K1+YEO2 +EU2-B3+sil +M3-J1+EO2 N3-J1+EO2 +D3-GG1+YI2 D3-GG1+YAE2 +GG1-WI2 DD1-WI2+NG3 +E2-B3+GG1 E2-B3+DD1 +K1-YAE2+W3 D1-YAE2 +D3-R1+WEO2 B3-R1+WEO2 +M3-J1+EU2 N3-J1+EU2 +D3-GG1+YO2 G3-GG1+YO2 +sil-C1+A2 +D3-GG1+YU2 D3-GG1+YAE2 +sil-C1+E2 +SS1 W3-SS1+WE2 +S1-YA2 D1-YA2+L3 +sil-C1+I2 +WA2-N3+GG1 +S1-YE2 H1-YE2+B3 +M3+GG1 YAE2-M3+GG1 +H1-YAE2 D1-YAE2 +sil-C1+O2 +S1-YI2 G1-YI2 +SS1-U2+B3 +SS1-U2+D3 SS1-U2+B3 +sil-C1+U2 +S1-YO2 +SS1-U2+G3 +sil-M1+YA2 sil-M1+WE2 +WAE2-L3+DD1 YU2-L3+DD1 +OE2-B3+BB1 E2-B3 +M3-SS1+EO2 N3-SS1+EO2 +sil-M1+YE2 sil-M1+WE2 +S1-YU2 +SS1-U2+L3 +C1-A2+NG3 +SS1-U2+M3 +U2-L3+GG1 +SS1-U2+N3 +sil-M1+YI2 sil-M1+WE2 +G1-A2+B3 +L3-C1+AE2 +M3-SS1+EU2 +G1-A2+D3 +BB1+WA2 BB1 +B3-SS1+OE2 B3-SS1+AE2 +sil-M1+YO2 sil-M1+WE2 +G1-A2+G3 +SS1-U2+W3 +BB1+WE2 BB1 +G1-A2+L3 +sil-M1+YU2 sil-M1+WE2 +G1-A2+M3 +BB1+WI2 L3-BB1+I2 +G1-A2+N3 +YI2-NG3+JJ1 YAE2-NG3+DD1 +YI2-B3+DD1 B3 +YE2-D3+B1 YI2-D3+B1 +YE2-D3+C1 YI2-D3+C1 +G3-R1+AE2 NG3-R1+AE2 +YE2-D3+D1 YI2-D3+D1 +GG1-YA2 G1-YA2 +J1-YO2+B3 C1-YO2 +G3-N1+OE2 G3-N1+AE2 +J1-YO2+D3 C1-YO2 +E2-D3+BB1 E2-D3 +M1-YEO2+NG3 +YE2-D3+G1 YI2-D3+G1 +YE2-D3+H1 YI2-D3+H1 +GG1-YE2 +J1-YO2+G3 C1-YO2 +G1-A2+W3 +YE2-D3+J1 YI2-D3+C1 +YE2-D3+K1 D3 +GG1-YI2 YI2+NG3 +EU2-L3+SS1 +YEO2-W3+B1 +YE2-D3+M1 YI2-D3+M1 +YEO2-W3+C1 +YE2-D3+N1 YI2-D3+N1 +J1-YO2+L3 C1-YO2 +YEO2-W3+D1 +YE2-D3+O1 YI2-D3+O1 +B1-WEO2+NG3 P1-WEO2+NG3 +J1-YO2+M3 C1-YO2 +YE2-D3+P1 D3 +J1-YO2+N3 C1-YO2 +R1+YEO2 B3-R1+YEO2 +YEO2-W3+G1 +YE2-D3+R1 YI2-D3+R1 +GG1-YO2 +YEO2-W3+H1 +YE2-D3+S1 YI2-D3+S1 +D3-O1+WA2 O1+WA2 +YE2-D3+T1 YI2-D3+T1 +YEO2-W3+J1 +YEO2-W3+K1 +sil-S1+EO2 +D3-O1+WE2 O1+WE2 +YEO2-W3+M1 YA2-W3+M1 +GG1-YU2 +YEO2-W3+N1 +N3-SS1+OE2 L3-SS1+OE2 +J1-YO2+W3 C1-YO2 +YEO2-W3+O1 +YEO2-W3+P1 +D3-O1+WI2 D3-O1+I2 +sil-S1+EU2 +I2-M3+SS1 WI2-M3+SS1 +B3-D1+WAE2 B3-D1 +sil-C1+WAE2 sil-C1+WE2 +YEO2-W3+R1 +YEO2-W3+S1 +YEO2-W3+T1 +M3-H1+OE2 +YU2-NG3+JJ1 YAE2-NG3+DD1 +B3-G1+YEO2 G3-G1+YEO2 +NG3-M1+WEO2 +I2-W3+B1 WI2-W3+B1 +I2-W3+C1 WI2-W3+C1 +I2-W3+D1 +U2-N3+BB1 +I2-W3+G1 +I2-W3+H1 +OE2-B3+DD1 E2-B3+DD1 +E2-B3+JJ1 EO2-B3+C1 +I2-W3+J1 +I2-W3+K1 +I2-W3+M1 +W3-DD1+WEO2 W3-DD1+WAE2 +I2-W3+N1 +I2-W3+O1 +I2-W3+P1 WI2-W3+P1 +BB1+YA2 BB1 +I2-W3+R1 +I2-W3+S1 +I2-W3+T1 +H1-YU2+B3 +NG3-T1+WAE2 NG3-T1+AE2 +BB1+YE2 BB1 +H1-YU2+D3 H1-YU2+B3 +D1-OE2+NG3 +N3-D1+WAE2 N3-D1+OE2 +BB1+YI2 BB1 +WA2-N3+JJ1 +H1-YU2+G3 H1-YU2+B3 +NG3-S1+A2 +M3-T1+A2 NG3-T1+A2 +M3+JJ1 YI2-M3+JJ1 +H1-YU2+L3 +BB1+YO2 BB1 +NG3-S1+E2 +H1-YU2+M3 +M3-T1+E2 N3-T1+OE2 +WA2 S1-WA2 +H1-YU2+N3 +WA2-B3+sil YU2-B3+sil +E2-D3+DD1 +NG3-S1+I2 +M3-T1+I2 NG3-T1+I2 +WE2 K1-WE2+NG3 +GG1-AE2+NG3 +W3-H1+WEO2 +BB1+YU2 BB1 +WI2 WI2+NG3 +W3-BB1+WA2 W3-BB1+YAE2 +WAE2-L3+GG1 YU2-L3+GG1 +NG3-S1+O2 +H1-YU2+W3 H1-YU2+M3 +M3-T1+O2 +DD1+YEO2 DD1+WAE2 +D3-O1+YA2 +W3-BB1+WE2 W3-BB1+YAE2 +U2-L3+JJ1 U2-L3+C1 +YAE2-W3+sil WE2-W3+sil +JJ1+OE2 +NG3-S1+U2 +M3-T1+U2 NG3-T1+U2 +P1-OE2+B3 +D3-O1+YE2 O1+YE2 +W3-BB1+WI2 +DD1-AE2 +P1-OE2+D3 P1-OE2+B3 +NG3-SS1+YAE2 W3-SS1+WE2 +D3-O1+YI2 O1+YI2 +P1-OE2+G3 P1-OE2+B3 +P1-OE2+NG3 K1-OE2+NG3 +W3-O1+WAE2 +P1-OE2+L3 P1-OE2+B3 +D3-O1+YO2 O1+YO2 +P1-OE2+M3 K1-OE2+NG3 +P1-OE2+N3 +YI2-B3+GG1 B3+K1 +D3-O1+YU2 O1+YU2 +U2-N3+DD1 EU2-N3+DD1 +H1-YEO2 +P1-OE2+W3 P1-OE2+B3 +S1-YO2+B3 +S1-YO2+D3 S1-YO2 +S1-YO2+G3 S1-YO2 +L3-C1+EO2 +O1-YAE2 O1-YAE2+NG3 +S1-YO2+L3 S1-YO2 +S1-YO2+M3 +S1-YO2+N3 S1-YO2+M3 +L3-C1+EU2 +YA2 +sil-P1+A2 +JJ1-E2+B3 +WAE2-N3+BB1 YU2-N3+BB1 +sil-O1+WA2 +WA2-L3+SS1 +J1-YEO2+B3 +YE2 YE2+NG3 +JJ1-E2+D3 JJ1-E2+B3 +J1-YEO2+D3 +S1-YO2+W3 +sil-P1+E2 +G3-R1+EO2 NG3-R1+EO2 +DD1-EU2+NG3 +sil-O1+WE2 +JJ1-E2+G3 JJ1-E2+B3 +YI2 YI2+NG3 +W3-BB1+YA2 W3-BB1+YAE2 +J1-YEO2+G3 +sil-P1+I2 +sil-O1+WI2 +OE2-B3+GG1 E2-B3+DD1 +G3-R1+EU2 NG3-R1+EU2 +W3-BB1+YE2 W3-BB1+YAE2 +JJ1-E2+L3 +JJ1-E2+M3 JJ1-E2+NG3 +J1-YEO2+L3 +YO2 +JJ1-E2+N3 JJ1-E2+NG3 +J1-YEO2+M3 +H1+AE2 W3-H1+AE2 +J1-YAE2+NG3 D1-YAE2 +J1-YEO2+N3 +sil-P1+O2 +W3-BB1+YI2 W3-BB1+YAE2 +D1+OE2 +YU2 DD1-YU2+M3 +B3-GG1+OE2 B3-GG1+AE2 +sil-P1+U2 +W3-BB1+YO2 W3-BB1+YAE2 +YI2-D3+BB1 WE2-D3+BB1 +JJ1-E2+W3 +J1-YEO2+W3 +JJ1-WA2+NG3 J1-WA2+NG3 +W3-BB1+YU2 W3-BB1+YAE2 +B3-D1+WEO2 B3-D1 +sil-C1+WEO2 sil-C1+WE2 +EU2-D3+sil +E2-D3+GG1 E2-D3 +NG3-G1+AE2 +YEO2-M3+SS1 YI2-M3+SS1 +NG3-C1+OE2 +WAE2-L3+JJ1 YU2-L3+JJ1 +YU2-B3+B1 B3+B1 +B1+WA2 W3-B1+WA2 +YU2-B3+C1 B3+C1 +YU2-B3+D1 B3 +B1+WE2 B1 +L3-H1+A2 +A2-W3+sil +YU2-B3+G1 B3+G1 +YU2-B3+H1 B3 +B3-K1+WAE2 M3-K1+WAE2 +sil-J1+WAE2 +YU2-B3+J1 B3+C1 +B1+WI2 +L3-H1+E2 +YU2-B3+K1 B3+K1 +E2-B3+B1 E2-B3 +E2-B3+C1 EO2-B3+C1 +YU2-B3+M1 B3+M1 +E2-B3+D1 EO2-B3+D1 +YU2-B3+N1 B3+N1 +L3-H1+I2 +J1-YAE2+B3 D1-YAE2 +YU2-B3+O1 B3+O1 +YU2-B3+P1 B3+B1 +J1-YAE2+D3 D1-YAE2 +E2-B3+G1 +E2-B3+H1 E2-B3 +YU2-B3+R1 B3 +YU2-B3+S1 B3+S1 +NG3-T1+WEO2 NG3-T1+AE2 +J1-YAE2+G3 D1-YAE2 +E2-B3+J1 EO2-B3+C1 +YU2-B3+T1 B3 +L3-H1+O2 +YI2-B3+JJ1 B3+C1 +E2-B3+K1 E2-B3 +N3-D1+WEO2 N3-D1+AE2 +D1-E2+B3 D1-E2 +sil-O1+YA2 +JJ1+A2 +E2-B3+M1 EO2-B3+M1 +E2-B3+N1 EO2-B3+N1 +D1-E2+D3 D1-E2 +WAE2-N3+DD1 YU2-N3+DD1 +J1-YAE2+L3 D1-YAE2 +E2-B3+O1 EO2-B3+O1 +OE2-D3+BB1 +J1-YAE2+M3 D1-YAE2 +E2-B3+P1 E2-B3 +sil-O1+YE2 +L3-H1+U2 +J1-YAE2+N3 D1-YAE2 +JJ1+E2 JJ1+AE2 +D1-E2+G3 D1-E2 +E2-B3+R1 E2-B3 +U2-N3+GG1 +E2-B3+S1 EO2-B3+S1 +E2-B3+T1 E2-B3 +sil-O1+YI2 +JJ1+I2 +P1-E2+B3 +D1-E2+L3 D1-E2 +D1-E2+M3 D1-E2 +P1-E2+D3 +D3-S1+OE2 +D1-E2+N3 D1-E2 +J1-YAE2+W3 D1-YAE2 +sil-O1+YO2 +JJ1+O2 +P1-E2+G3 P1-E2+D3 +P1-E2+L3 +B3-JJ1+YAE2 B3-JJ1+WAE2 +sil-O1+YU2 +JJ1+U2 +P1-E2+M3 +D1-E2+W3 +P1-E2+N3 P1-E2+L3 +YI2-D3+DD1 WE2-D3+DD1 +G3-T1+AE2 W3-T1+AE2 +DD1-EO2 +G3-P1+OE2 +NG3-SS1+YEO2 W3-SS1+WE2 +D3-M1+YAE2 M1+WE2 +P1-E2+W3 +DD1-EU2 +EU2-N3+SS1 +W3-O1+WEO2 +WE2-W3+B1 WAE2-W3+B1 +WE2-W3+C1 YAE2-W3+C1 +WE2-W3+D1 WAE2-W3+D1 +WE2-W3+G1 +WE2-W3+H1 +B3-SS1+WA2 +B1+YA2 B1 +OE2-B3+JJ1 O2-B3+JJ1 +WE2-W3+J1 +WE2-W3+K1 YAE2-W3+K1 +B3-SS1+WE2 +GG1-WEO2+B3 +WE2-W3+M1 YAE2-W3+M1 +B1+YE2 B1 +WE2-W3+N1 +GG1-WEO2+D3 G1-WEO2+D3 +WE2-W3+O1 +WE2-W3+P1 YAE2-W3+P1 +B3-SS1+WI2 +B1+YI2 W3-B1+YI2 +GG1-WEO2+G3 GG1-WEO2+B3 +WE2-W3+R1 YA2-W3+R1 +M3-N1+AE2 +WE2-W3+S1 WAE2-W3+S1 +WE2-W3+T1 WAE2-W3+T1 +M3-J1+OE2 N3-J1+AE2 +G3-N1+WA2 L3-N1+WA2 +WI2-W3+sil +G3-BB1+YAE2 G3-BB1+WAE2 +GG1-WEO2+L3 +B1+YO2 B1 +YO2-G3+BB1 YAE2-G3+P1 +GG1-WEO2+M3 +G3-N1+WE2 L3-N1+WE2 +GG1-WEO2+N3 +WEO2-NG3+B1 +WEO2-NG3+C1 +WEO2-NG3+D1 +YE2-N3+sil N3+sil +G3-N1+WI2 G3-N1+I2 +B1+YU2 W3-B1+YU2 +JJ1-A2 +WEO2-NG3+G1 +WEO2-NG3+H1 WAE2-NG3+H1 +O1-YEO2 +WEO2-NG3+J1 +N3-G1+A2 +JJ1-E2 +OE2-D3+DD1 E2-D3+DD1 +GG1-WEO2+W3 GG1-WEO2+B3 +AE2-W3+sil +E2-D3+JJ1 +WEO2-NG3+K1 +WEO2-NG3+M1 +J1+A2 +WEO2-NG3+N1 +N3-G1+E2 M3-G1+E2 +JJ1-I2 JJ1-I2+L3 +WEO2-NG3+O1 WAE2-NG3+O1 +WEO2-NG3+P1 +N3-SS1+WA2 L3-SS1+WA2 +J1+E2 +WEO2-NG3+R1 +N3-G1+I2 M3-G1+I2 +WEO2-NG3+S1 +WEO2-NG3+T1 +JJ1-O2 JJ1-O2+L3 +N3-SS1+WE2 L3-SS1+WE2 +J1+I2 +J1-WE2+B3 K1-WE2+NG3 +N3-G1+O2 M3-G1+O2 +J1-WE2+D3 K1-WE2+NG3 +M3-H1+WA2 +N3-SS1+WI2 +JJ1-U2 +J1-WE2+G3 K1-WE2+NG3 +J1+O2 +H1+EO2 W3-H1+EO2 +M3-H1+WE2 +N3-G1+U2 +M3-SS1+OE2 W3-SS1+OE2 +J1-WE2+L3 K1-WE2+NG3 +M3-H1+WI2 M3-H1+I2 +J1-WE2+M3 K1-WE2+NG3 +J1+U2 +WA2-D3+sil YO2-D3+sil +H1+EU2 +J1-WE2+N3 K1-WE2+NG3 +YAE2-B3+BB1 B3+B1 +YI2-NG3+SS1 YAE2-NG3+SS1 +GG1-YE2+NG3 GG1-YE2 +WAE2-N3+GG1 YE2-N3+GG1 +GG1-WAE2+B3 JJ1-WAE2+B3 +J1-WE2+W3 K1-WE2+NG3 +GG1-WAE2+D3 JJ1-WAE2+D3 +N1-U2+B3 N1-U2 +U2-N3+JJ1 +B3-SS1+YA2 B3-SS1+WE2 +N1-U2+D3 N1-U2 +GG1-WAE2+G3 JJ1-WAE2+B3 +NG3-G1+EO2 +B3-BB1+WAE2 +N1-U2+G3 N1-U2 +B3-SS1+YE2 B3-SS1+WE2 +GG1-WAE2+L3 +G3-M1+A2 NG3-M1+A2 +U2-B3+sil EU2-B3+sil +GG1-WAE2+M3 GG1-WAE2+L3 +NG3-H1+YAE2 NG3-H1+WAE2 +GG1-WAE2+N3 GG1-WAE2+L3 +B3-SS1+YI2 B3-SS1+WE2 +NG3-G1+EU2 +N1-U2+L3 +N1-U2+M3 +G3-M1+E2 +N1-U2+N3 N1-U2+M3 +G3-N1+YA2 +B3-SS1+YO2 B3-SS1+WE2 +G3-M1+I2 M1+WI2 +SS1+AE2 W3-SS1+OE2 +YI2-D3+GG1 WE2-D3+GG1 +G3-N1+YE2 L3-N1 +GG1-WAE2+W3 GG1-WAE2+L3 +YO2-G3+DD1 YAE2-G3+R1 +B3-K1+WEO2 L3-K1 +sil-J1+WEO2 sil-J1+WAE2 +N1-U2+W3 +C1-OE2+NG3 +B3-SS1+YU2 B3-SS1+WE2 +G3-M1+O2 +M3-D1+WAE2 N3-D1+OE2 +G3-N1+YI2 L3-N1+YI2 +GG1-WAE2+NG3 GG1-WAE2+L3 +B3-SS1+A2 +sil-S1+OE2 +YU2-NG3+SS1 YAE2-NG3+SS1 +C1-EU2+B3 +C1-EU2+D3 +G3-M1+U2 +G3-N1+YO2 +B3-SS1+E2 B3-SS1+AE2 +J1-A2 +C1-EU2+G3 C1-EU2+B3 +JJ1+WA2 L3-JJ1 +S1-WAE2+NG3 +B3-SS1+I2 B3-SS1+WI2 +N3-SS1+YA2 L3-SS1+WE2 +J1-E2 +G3-N1+YU2 L3-N1+YU2 +JJ1+WE2 L3-JJ1 +C1-EU2+L3 +C1-EU2+M3 +C1-EU2+N3 +E2-B3+SS1 +N3-SS1+YE2 L3-SS1+WE2 +J1-I2 +B3-SS1+O2 +D3-D1+A2 +N3-SS1+YAE2 L3-SS1+WE2 +JJ1+WI2 +M3-H1+YA2 M3-H1+WE2 +N3-SS1+YI2 L3-SS1+WE2 +D3-D1+E2 D3-D1+WAE2 +J1-O2+NG3 +J1-O2 +B3-SS1+U2 +M3-H1+YE2 N3-H1+YE2 +YI2-M3+B1 YA2-M3+B1 +B1-WAE2 P1-WAE2 +C1-EU2+W3 +YI2-M3+C1 YI2-M3+JJ1 +D3-D1+I2 G3-D1+I2 +YI2-M3+D1 WA2-M3+D1 +N3-SS1+YO2 L3-SS1+WE2 +M3-H1+YI2 M3-H1+I2 +J1-U2 +YI2-M3+G1 WA2-M3+G1 +YI2-M3+H1 WA2-M3+H1 +D3-J1+WAE2 +B3-JJ1+YEO2 +D3-D1+O2 G3-D1+O2 +WA2-N3+SS1 +O1-OE2+NG3 +YI2-M3+J1 WA2-M3+J1 +N3-SS1+YU2 L3-SS1+WE2 +YAE2-B3+DD1 B3 +YI2-M3+K1 WA2-M3+K1 +EO2-L3+sil +M3-H1+YO2 M3-H1+WE2 +G3-T1+EO2 +YI2-M3+M1 WA2-M3+M1 +M3+SS1 YI2-M3+SS1 +YI2-M3+N1 +YI2-M3+O1 WA2-M3+O1 +D3-D1+U2 G3-D1+U2 +D3-M1+YEO2 B3-M1+YEO2 +U2-B3+B1 EU2-B3+B1 +YI2-M3+P1 WA2-M3+P1 +U2-B3+C1 U2-B3 +OE2-D3+GG1 +M3-H1+YU2 N3-H1+YU2 +U2-B3+D1 EU2-B3+D1 +YI2-M3+R1 WA2-M3+R1 +G3-T1+EU2 +YI2-M3+S1 WA2-M3+S1 +YI2-M3+T1 WA2-M3+R1 +WA2-NG3+BB1 +H1-A2+B3 +U2-B3+G1 EU2-B3+G1 +J1+AE2 +U2-B3+H1 EU2-B3+B1 +H1-A2+D3 +U2-B3+J1 EU2-B3+B1 +U2-B3+K1 U2-B3 +H1-A2+G3 +P1-I2+NG3 +U2-B3+M1 +U2-B3+N1 +U2-L3+SS1 +U2-B3+O1 EU2-B3+O1 +U2-B3+P1 U2-B3 +H1-A2+L3 +H1-A2+M3 +U2-B3+R1 EU2-B3+DD1 +H1-A2+N3 +U2-B3+S1 EU2-B3+SS1 +U2-B3+T1 EU2-B3+DD1 +EO2+B3 +WA2-B3+B1 B3+B1 +EO2+D3 +WA2-B3+C1 B3+C1 +WA2-B3+D1 B3 +EO2+G3 +M3-N1+EO2 +N3+B1 YI2-N3+B1 +N1-EO2+B3 +WA2-B3+G1 B3+G1 +N3+C1 YI2-N3+C1 +H1-A2+W3 +WA2-B3+H1 B3 +N3+D1 YI2-N3+D1 +N1-EO2+D3 +A2-B3+BB1 +WA2-B3+J1 B3+C1 +G3-BB1+YEO2 G3-BB1+WAE2 +EO2+L3 +S1-WE2+B3 K1-WE2+NG3 +WA2-B3+K1 B3+K1 +N3+G1 YI2-N3+G1 +N1-EO2+G3 N1-EO2+D3 +EO2+M3 +M3-N1+EU2 +N3+H1 YI2-N3+H1 +EO2+N3 +S1-WE2+D3 K1-WE2+NG3 +WA2-B3+M1 B3+M1 +WA2-B3+N1 B3+N1 +N3+J1 YI2-N3+J1 +WA2-B3+O1 B3+O1 +WAE2-N3+JJ1 YE2-N3+JJ1 +N3+K1 YI2-N3+K1 +JJ1+YA2 L3-JJ1 +S1-WE2+G3 K1-WE2+NG3 +WA2-B3+P1 B3+B1 +N1-EO2+L3 +D1+WA2 D1+OE2 +N3+M1 YO2-N3+M1 +N1-EO2+M3 +WA2-B3+R1 B3 +N3+N1 YI2-N3+N1 +N1-EO2+N3 +WA2-B3+S1 B3+S1 +N3+O1 YI2-N3+O1 +JJ1+YE2 L3-JJ1 +WA2-B3+T1 B3 +N3+P1 YI2-N3+P1 +S1-WE2+L3 K1-WE2+NG3 +I2-G3+sil WI2-G3+sil +D1+WE2 D1 +EO2+W3 +B3-GG1+WA2 M3-GG1+WA2 +S1-WE2+M3 K1-WE2+NG3 +N3+R1 YI2-N3+R1 +WAE2-B3+sil YU2-B3+sil +S1-WE2+N3 K1-WE2+NG3 +N3+S1 WE2-N3+S1 +JJ1+YI2 L3-JJ1 +N3+T1 YI2-N3+T1 +G3-BB1+AE2 +D1+WI2 W3-D1+WI2 +B3-GG1+WE2 G3-GG1+YAE2 +N1-EO2+W3 +JJ1+YO2 +B3-GG1+WI2 D3-GG1+WI2 +S1-WE2+W3 K1-WE2+NG3 +S1-WAE2 S1-WAE2+NG3 +YI2-D3+JJ1 EO2-D3+JJ1 +JJ1+YU2 L3-JJ1 +R1-WI2+B3 +G3-P1+WAE2 W3-P1+OE2 +M1-I2+B3 N1-I2+B3 +YO2-G3+GG1 YAE2-G3+K1 +NG3-C1+WA2 +R1-WI2+D3 R1-WI2+B3 +M1-I2+D3 +R1-WI2+G3 R1-WI2+B3 +NG3-C1+WE2 NG3-C1+YAE2 +C1-E2+NG3 +M1-I2+G3 N1-I2+G3 +EO2-N3+B1 +R1-WEO2+NG3 +NG3-C1+WI2 NG3-C1+I2 +EO2-N3+C1 +R1-WI2+L3 R1-WI2+B3 +L3-G1+AE2 +M1-I2+L3 +EO2-N3+D1 +R1-WI2+M3 R1-WI2+B3 +M1-I2+M3 +R1-WI2+N3 R1-WI2+B3 +L3-C1+OE2 +M1-I2+N3 +WA2-NG3+DD1 +EO2-N3+G1 +EO2-N3+H1 +EO2-N3+J1 +AE2+B3 AE2 +EO2-N3+K1 +B3-R1+A2 +WA2-NG3 WA2-NG3+R1 +AE2+D3 C1-AE2+D3 +EO2-N3+M1 +EO2-N3+N1 +R1-WI2+W3 R1-WI2+B3 +M1-I2+W3 +EO2-N3+O1 +JJ1-WA2+B3 +AE2+G3 +B3-R1+E2 N3-R1+E2 +EO2-N3+P1 +N1-AE2+B3 +JJ1-WA2+D3 +B3-BB1+WEO2 B3-BB1+WAE2 +EO2-N3+R1 +N1-AE2+D3 +EO2-B3 EO2-B3+BB1 +EO2-N3+S1 +N3-T1+A2 NG3-T1+A2 +G3-R1+OE2 NG3-R1+OE2 +B3-R1+I2 N3-R1+I2 +G1-YAE2+NG3 D1-YAE2 +JJ1-WA2+G3 JJ1-WA2+B3 +EO2-N3+T1 +AE2+L3 AE2 +EO2-D3 +N1-AE2+G3 +AE2+M3 +NG3-H1+YEO2 +AE2+N3 +N3-T1+E2 N3-T1+OE2 +EO2-G3 +N3-B1 +JJ1-WA2+L3 +B3-R1+O2 N3-R1+O2 +N3-C1 +JJ1-WA2+M3 J1-WA2+NG3 +N1-AE2+L3 +N3-D1 N3-D1+AE2 +JJ1-WA2+N3 +N3-T1+I2 NG3-T1+I2 +N1-AE2+M3 +N1-AE2+N3 N1-AE2+M3 +SS1+EO2 +EO2-L3 +YAE2-B3+GG1 B3+K1 +A2-B3+DD1 +N3-G1 +EO2-M3 +N3-H1 N3-H1+WE2 +EO2-N3 +AE2+W3 +B3-R1+U2 N3-R1+U2 +N3-J1 N3-J1+EO2 +N3-T1+O2 +D3-S1+WA2 D3-S1+YAE2 +S1-O2+NG3 +N3-K1 M3-K1+WEO2 +SS1+EU2 M3-SS1+EU2 +M3-D1+WEO2 N3-D1+AE2 +D1+YA2 D1 +N3-M1 M1+WE2 +JJ1-WA2+W3 +OE2-D3+JJ1 E2-D3+JJ1 +WI2-B3+BB1 +N3-N1 N3-N1+YE2 +N1-AE2+W3 +D3-S1+WE2 D3-S1+YAE2 +N3-O1 +N3-P1 N3-P1+WAE2 +N3-T1+U2 NG3-T1+U2 +D1+YE2 D1 +EO2-W3 +B3-GG1+YA2 G3-GG1+YAE2 +N3-R1 R1 +D3-S1+WI2 +N3-S1 N3-S1+YAE2 +NG3-O1+YAE2 +N3-T1 NG3-T1+AE2 +WAE2-L3+SS1 YU2-L3+SS1 +D1+YI2 D1 +B3-GG1+YE2 G3-GG1+YAE2 +M3-P1+AE2 N3-P1+AE2 +G3-P1+WA2 W3-P1+WA2 +AE2-B3+BB1 B3+B1 +B3-GG1+YI2 G3-GG1+YAE2 +D1+YO2 D1 +G3-P1+WE2 P1 +N3-SS1+YEO2 L3-SS1+WE2 +B3-GG1+YO2 G3-GG1+YO2 +G3-P1+WI2 B3-P1+I2 +D1+YU2 D1 +NG3-C1+YA2 NG3-C1+YAE2 +W3-M1+A2 +B1-WEO2 P1-WEO2 +B3-GG1+YU2 G3-GG1+YAE2 +NG3-C1+YE2 NG3-C1+YAE2 +W3-M1+E2 +YI2-B3+SS1 WE2-B3+SS1 +NG3-C1+YI2 NG3-C1+EU2 +D3-J1+WEO2 D3-J1+WAE2 +NG3-JJ1+WAE2 +W3-M1+I2 +NG3-C1+YO2 NG3-C1+YAE2 +J1-YE2+B3 H1-YE2+B3 +W3-M1+O2 +AE2-B3 B3 +J1-YE2+D3 H1-YE2+B3 +AE2-D3 AE2-D3+P1 +M3-J1+WA2 N3-J1+WA2 +NG3-C1+YU2 NG3-C1+YAE2 +J1-YE2+G3 H1-YE2+B3 +AE2-G3 AE2-G3+R1 +J1+EO2 +W3-M1+U2 +W3-J1+YAE2 W3-J1+WAE2 +M3-J1+WE2 N3-J1+EO2 +YEO2-M3+B1 YA2-M3+B1 +YEO2-M3+C1 YI2-M3+JJ1 +J1-YE2+L3 H1-YE2+B3 +YEO2-M3+D1 WA2-M3+D1 +AE2-L3 +M3-J1+WI2 +J1-YE2+M3 H1-YE2+B3 +AE2-M3 +J1+EU2 +J1-YE2+N3 H1-YE2+B3 +AE2-N3 +YEO2-M3+G1 WA2-M3+G1 +YAE2-D3+BB1 WE2-D3+BB1 +YEO2-M3+H1 WA2-M3+H1 +YEO2-M3+J1 WA2-M3+J1 +YEO2-M3+K1 WA2-M3+K1 +YO2-G3+JJ1 YO2-G3+C1 +YEO2-M3+M1 WA2-M3+M1 +YEO2-M3+N1 WA2-M3+N1 +J1-YE2+W3 H1-YE2+B3 +YEO2-M3+O1 WA2-M3+O1 +AE2-W3 OE2-W3+DD1 +YEO2-M3+P1 WA2-M3+P1 +D3-S1+YA2 D3-S1+YAE2 +YEO2-M3+R1 WA2-M3+R1 +BB1-OE2+NG3 +YEO2-M3+S1 WA2-M3+S1 +JJ1-YEO2+NG3 +YEO2-M3+T1 WA2-M3+R1 +D3-S1+YE2 D3-S1+YAE2 +WI2-B3+DD1 +DD1-OE2 JJ1-OE2+B3 +WA2-NG3+GG1 +U2-D3+sil +D3-S1+YI2 D3-S1+YAE2 +I2-M3+B1 WI2-M3+B1 +I2-M3+C1 WI2-M3+C1 +OE2-B3+SS1 +I2-M3+D1 +N3-P1+YAE2 N3-P1+WAE2 +M3-SS1+WA2 W3-SS1+WA2 +G3-P1+YA2 P1 +D3-S1+YO2 +WEO2-W3+B1 +I2-M3+G1 WI2-M3+G1 +AE2-B3+DD1 B3 +WEO2-W3+C1 +I2-M3+H1 +YE2-B3+BB1 B3+B1 +WEO2-W3+D1 +M3-SS1+WE2 W3-SS1+WE2 +G3-P1+YE2 W3-P1+YE2 +I2-M3+J1 WI2-M3+J1 +I2-M3+K1 WI2-M3+K1 +D3-S1+YU2 +G3-BB1+EO2 +WEO2-W3+G1 +WEO2-W3+H1 +M3-SS1+WI2 M3-SS1+I2 +G3-P1+YI2 P1 +I2-M3+M1 +YEO2-G3+sil YI2-G3+sil +I2-M3+N1 WI2-M3+N1 +WEO2-W3+J1 +I2-M3+O1 +WEO2-W3+K1 +I2-M3+P1 WI2-M3+P1 +G3-BB1+EU2 +WEO2-W3+M1 +I2-M3+R1 WI2-M3+R1 +S1-WEO2 SS1-WEO2 +WEO2-W3+N1 +G3-P1+YO2 W3-P1+YO2 +I2-M3+S1 WI2-M3+S1 +WEO2-W3+O1 +I2-M3+T1 WI2-M3+T1 +WEO2-W3+P1 YAE2-W3+P1 +D3-BB1+YAE2 D3-BB1+E2 +YAE2-B3+JJ1 B3+C1 +A2-B3+GG1 +WEO2-W3+R1 +G3-P1+WEO2 P1 +WEO2-W3+S1 +WEO2-W3+T1 WEO2-W3+DD1 +G3-P1+YU2 P1 +M3-J1+A2 +E2-D3+SS1 +BB1-WA2+B3 DD1-WA2+B3 +M3-J1+E2 N3-J1+AE2 +M3-J1+YA2 N3-J1+EO2 +L3-G1+EO2 +BB1-WA2+D3 DD1-WA2+D3 +WE2-L3+sil YO2-L3+sil +M1-AE2+NG3 +M3-J1+I2 +M3-J1+YE2 N3-J1+EO2 +BB1-WA2+G3 DD1-WA2+B3 +O1-WAE2+NG3 O1-WAE2 +L3-G1+EU2 +M3-J1+YI2 N3-J1+EO2 +BB1-WA2+L3 DD1-WA2+L3 +M3-J1+O2 +I2-W3+BB1 WI2-W3+BB1 +BB1-WA2+M3 DD1-WA2+NG3 +N3-BB1+A2 NG3-BB1+A2 +BB1-WA2+N3 DD1-WA2+N3 +sil-S1+WA2 sil-S1+YAE2 +C1-OE2+B3 C1-OE2 +YAE2-D3+DD1 WE2-D3+DD1 +C1-OE2+D3 C1-OE2 +EO2-N3+sil +M3-J1+YO2 N3-J1+EO2 +N3-BB1+E2 N3-BB1+WAE2 +sil-S1+WE2 +M3-J1+U2 +C1-OE2+G3 C1-OE2 +N3-BB1+I2 NG3-BB1+I2 +sil-S1+WI2 +M3-J1+YU2 N3-J1+EO2 +BB1-WA2+W3 DD1-WA2+W3 +B1-OE2+NG3 J1-OE2+NG3 +C1-OE2+L3 C1-OE2 +YO2-NG3 +L3-D1+WAE2 +C1-OE2+M3 C1-OE2+NG3 +C1-OE2+N3 +N3-BB1+O2 NG3-BB1+O2 +H1+OE2 W3-H1+OE2 +U2-N3+SS1 +N3-BB1+U2 NG3-BB1+U2 +C1-OE2+W3 C1-OE2 +M3-SS1+YA2 W3-SS1+WE2 +JJ1-WE2+NG3 K1-WE2+NG3 +M3-SS1+YE2 W3-SS1+WE2 +NG3-O1+YEO2 +YE2-B3+DD1 B3 +M3-P1+EO2 +M3-SS1+YI2 W3-SS1+WE2 +NG3-K1+AE2 +A2-D3+BB1 +AE2-W3+B1 OE2-W3+B1 +NG3-G1+OE2 +AE2-W3+C1 +S1-YE2+B3 H1-YE2+B3 +AE2-W3+D1 +M3-P1+EU2 +M3-SS1+YO2 W3-SS1+WE2 +S1-YE2+D3 H1-YE2+B3 +AE2-W3+G1 +AE2-W3+H1 +S1-YE2+G3 H1-YE2+B3 +AE2-W3+J1 OE2-W3+J1 +N1-OE2+NG3 +AE2-W3+K1 +M3-SS1+YU2 W3-SS1+WE2 +AE2-W3+M1 OE2-W3+M1 +S1-YE2+L3 H1-YE2+B3 +AE2-W3+N1 OE2-W3+N1 +S1-YE2+M3 H1-YE2+B3 +WAE2-D3+sil YO2-D3+sil +AE2-W3+O1 +S1-YE2+N3 H1-YE2+B3 +AE2-W3+P1 +WI2-B3+GG1 +AE2-W3+R1 +WA2-NG3+JJ1 WA2-NG3+DD1 +AE2-W3+S1 +NG3-JJ1+WEO2 +AE2-W3+T1 OE2-W3+T1 +S1-YE2+W3 H1-YE2+B3 +AE2-B3+GG1 B3+K1 +R1-YI2+B3 +sil-S1+YA2 sil-S1+YAE2 +I2-W3+DD1 WI2-W3+DD1 +R1-YI2+D3 R1-YI2+B3 +W3-J1+YEO2 +sil-S1+YE2 sil-S1+YAE2 +R1-YI2+G3 R1-YI2+B3 +YA2-L3+sil YO2-L3+sil +sil-S1+YI2 sil-S1+YAE2 +R1-YI2+L3 R1-YI2+B3 +R1-YI2+M3 R1-YI2+B3 +R1-YI2+N3 R1-YI2+B3 +WAE2-NG3+BB1 YAE2-NG3+BB1 +A2-B3+JJ1 +EO2+NG3 +sil-S1+YO2 sil-S1+YAE2 +sil-S1+YU2 sil-S1+YAE2 +R1-YI2+W3 R1-YI2+B3 +JJ1-YA2+B3 G1-YA2+B3 +H1-YEO2+B3 +JJ1-YA2+D3 G1-YA2+D3 +H1-YEO2+D3 +NG3+BB1 YAE2-NG3+BB1 +G3-T1+OE2 W3-T1+OE2 +JJ1-YA2+G3 G1-YA2+G3 +G1-YAE2 D1-YAE2 +H1-YEO2+G3 +JJ1-YA2+L3 +JJ1-YA2+M3 G1-YA2+M3 +N3-P1+YEO2 +H1-YEO2+L3 +JJ1-YA2+N3 G1-YA2+N3 +H1-YEO2+M3 +NG3-DD1+YAE2 M3-DD1+YAE2 +YE2-G3+B1 YAE2-G3+B1 +H1-YEO2+N3 +YAE2-D3+GG1 WE2-D3+GG1 +A2-D3+DD1 WA2-D3+DD1 +YE2-G3+C1 YAE2-G3+C1 +GG1-EO2+B3 +YE2-G3+D1 YAE2-G3+D1 +GG1-EO2+D3 +L3-C1+WA2 +YE2-G3+G1 YAE2-G3+B1 +C1-YAE2+NG3 D1-YAE2 +YE2-G3+H1 YAE2-G3+H1 +O1-U2+B3 +L3-DD1+WAE2 L3-DD1 +GG1-EO2+G3 +JJ1-YA2+W3 T1-YA2+W3 +WI2-D3+BB1 +YE2-G3+J1 YAE2-G3+J1 +O1-U2+D3 O1-U2+B3 +L3-C1+WE2 L3-C1 +YE2-G3+K1 YAE2-G3+K1 +H1-YEO2+W3 +YE2-G3+M1 YAE2-G3+M1 +O1-U2+G3 +GG1-EO2+L3 +YE2-G3+N1 YAE2-G3+M1 +L3-C1+WI2 +GG1-EO2+M3 +YE2-G3+O1 YAE2-G3+O1 +GG1-EO2+N3 +YE2-G3+P1 YAE2-G3+P1 +D3-BB1+YEO2 D3-BB1+E2 +W3-BB1+A2 +NG3-B1+WAE2 NG3-B1+WE2 +WAE2-N3+SS1 YO2-N3+SS1 +YE2-G3+R1 YAE2-G3+R1 +M3-R1+AE2 NG3-R1+AE2 +O1-U2+L3 +YE2-G3+S1 YAE2-G3+S1 +O1-U2+M3 +P1-YO2+B3 +YE2-G3+T1 YAE2-G3+R1 +M3-N1+OE2 +O1-U2+N3 +W3-BB1+E2 W3-BB1+YAE2 +G3-R1+WA2 R1 +AE2-D3+BB1 OE2-D3+BB1 +P1-YO2+D3 P1-YO2+B3 +T1-YEO2+B3 +P1-YO2+G3 +W3-BB1+I2 W3-BB1+WI2 +G3-R1+WE2 R1 +T1-YEO2+D3 +GG1-EO2+W3 +T1-YEO2+G3 +G3-R1+WI2 N3-R1+I2 +O1-U2+W3 +P1-YO2+L3 P1-YO2+B3 +YE2-B3+GG1 B3+K1 +P1-YO2+M3 +W3-BB1+O2 +P1-YO2+N3 P1-YO2+M3 +T1-YEO2+L3 +T1-YEO2+M3 +T1-YEO2+N3 +W3-BB1+U2 +D3-DD1+A2 +YI2-D3+SS1 WE2-D3+SS1 +B3-B1+AE2 G3-B1+AE2 +P1-YO2+W3 P1-YO2+B3 +D3-DD1+E2 +WAE2-NG3+DD1 YAE2-NG3+DD1 +H1-YAE2+B3 D1-YAE2 +YEO2-W3+BB1 +T1-YEO2+W3 +D3-DD1+I2 D3-DD1+WI2 +H1-YAE2+D3 D1-YAE2 +H1-YAE2+G3 D1-YAE2 +O2-L3+sil +WI2-B3+JJ1 +L3-D1+WEO2 +D3-DD1+O2 +H1-YAE2+L3 D1-YAE2 +H1-YAE2+M3 D1-YAE2 +WE2-M3+B1 YA2-M3+B1 +H1-YAE2+N3 D1-YAE2 +WE2-M3+C1 YI2-M3+JJ1 +NG3+DD1 YAE2-NG3+DD1 +D3-DD1+U2 +WE2-M3+D1 WA2-M3+D1 +GG1-AE2+B3 GG1-AE2 +GG1-AE2+D3 +WE2-M3+G1 WA2-M3+G1 +WE2-M3+H1 WA2-M3+H1 +AE2-B3+JJ1 B3+C1 +G3+sil YI2-G3+sil +GG1-AE2+G3 GG1-AE2 +GG1-YI2+NG3 YI2+NG3 +WE2-M3+J1 WA2-M3+J1 +I2-W3+GG1 WI2-W3+GG1 +WE2-M3+K1 WA2-M3+K1 +H1-YAE2+W3 D1-YAE2 +WE2-M3+M1 WA2-M3+M1 +WE2-M3+N1 WA2-M3+N1 +GG1-AE2+L3 GG1-AE2 +WE2-M3+O1 WA2-M3+O1 +GG1-AE2+M3 GG1-AE2 +L3-C1+YA2 L3-C1 +WE2-M3+P1 WA2-M3+P1 +GG1-AE2+N3 +WE2-M3+R1 WA2-M3+R1 +NG3-K1+EO2 +WE2-M3+S1 WA2-M3+S1 +L3-C1+YE2 L3-C1 +WE2-M3+T1 WA2-M3+R1 +WI2-D3+DD1 +T1-YAE2+B3 D1-YAE2 +L3-C1+YI2 +T1-YAE2+D3 D1-YAE2 +NG3-K1+EU2 +GG1-AE2+W3 GG1-AE2 +NG3-S1+WAE2 +T1-YAE2+G3 D1-YAE2 +OE2-D3+SS1 E2-D3+SS1 +L3-C1+YO2 L3-C1 +G3-R1+YA2 NG3-R1+YA2 +N3-C1+WAE2 N3-C1 +AE2-D3+DD1 +T1-YAE2+L3 D1-YAE2 +SS1+OE2 W3-SS1+OE2 +YE2-D3+BB1 WE2-D3+BB1 +G3-R1+YE2 R1 +T1-YAE2+M3 D1-YAE2 +T1-YAE2+N3 D1-YAE2 +L3-C1+YU2 L3-C1 +G3-R1+YI2 NG3-R1+YI2 +sil-BB1 sil-BB1+E2 +G3-R1+YO2 NG3-R1+YO2 +T1-YAE2+W3 D1-YAE2 +YAE2-D3+JJ1 EO2-D3+JJ1 +A2-D3+GG1 +G3-R1+YU2 NG3-R1+YU2 +YO2-W3+B1 +DD1-WA2 S1-WA2 +YO2-W3+C1 +YO2-W3+D1 +YEO2-W3+DD1 YEO2-W3+T1 +DD1-WE2 K1-WE2+NG3 +YO2-W3+G1 +BB1-YA2+B3 G1-YA2+B3 +YO2-W3+H1 +R1-A2+NG3 +BB1-YA2+D3 G1-YA2+D3 +YO2-W3+J1 +DD1-WI2 DD1-WI2+NG3 +YO2-W3+K1 +WE2-N3+sil N3+sil +B1-I2+B3 +BB1-YA2+G3 G1-YA2+G3 +YO2-W3+M1 +YO2-W3+N1 +B1-I2+D3 B1-I2+B3 +YO2-W3+O1 +W3-N1+WAE2 L3-N1 +YO2-W3+P1 +YE2-NG3+BB1 YAE2-NG3+BB1 +B1-I2+G3 +BB1-YA2+L3 +YO2-W3+R1 +BB1-YA2+M3 G1-YA2+M3 +YO2-W3+S1 +BB1-YA2+N3 G1-YA2+N3 +YO2-W3+T1 +D1+WAE2 D1+OE2 +B1-I2+L3 +M3-P1+YAE2 N3-P1+WAE2 +B1-I2+M3 +B1-I2+N3 +YE2-B3+JJ1 B3+C1 +W3-GG1+WAE2 +G1-YEO2 +G3-C1+A2 +BB1-YA2+W3 +G3-C1+E2 +sil-S1+A2 +N1+AE2 +sil-BB1+YAE2 sil-BB1+E2 +B1-I2+W3 +J1+OE2 +YO2-G3+SS1 +NG3-DD1+YEO2 M3-DD1+YAE2 +G3-C1+I2 +sil-S1+E2 +WAE2-NG3+GG1 YAE2-NG3+GG1 +sil-S1+I2 sil-S1+WI2 +L3-DD1+WEO2 L3-DD1 +G3-C1+O2 +NG3-GG1+AE2 M3-GG1+OE2 +sil-S1+O2 +N1-YAE2 N1-YAE2+NG3 +G3-C1+U2 +YE2-D3+DD1 WE2-D3+DD1 +NG3-B1+WEO2 +sil-DD1+A2 +H1-WA2+B3 +M3-R1+EO2 NG3-R1+EO2 +NG3+GG1 YAE2-NG3+GG1 +G3-K1+YAE2 L3-K1 +sil-S1+U2 +WEO2-W3+sil +H1-WA2+D3 +NG3-M1+AE2 +sil-DD1+E2 +H1-WA2+G3 H1-WA2+B3 +GG1+YAE2 N3-GG1+YA2 +sil-DD1 sil-DD1+WA2 +M3-R1+EU2 NG3-R1+EU2 +sil-DD1+I2 +I2-W3+JJ1 WI2-W3+JJ1 +H1-WA2+L3 +H1-WA2+M3 H1-WA2+NG3 +H1+WA2 W3-H1+WA2 +H1-WA2+N3 +sil-DD1+O2 +DD1-YA2 +H1+WE2 H1 +WI2-D3+GG1 +DD1-YE2 SS1-YE2+NG3 +YAE2-B3+SS1 WE2-B3+SS1 +H1+WI2 W3-H1+WI2 +sil-DD1+U2 +H1-WA2+W3 +G3-BB1+OE2 G3-BB1+WAE2 +B3-B1+EO2 G3-B1+EO2 +DD1-YI2 +B3-B1+EU2 W3-B1+EU2 +L3-K1+A2 K1+A2 +DD1-YO2 +AE2-D3+GG1 AE2-D3+K1 +YE2-NG3+DD1 YAE2-NG3+DD1 +NG3-G1+WA2 +L3-K1+E2 K1+E2 +DD1-YU2 DD1-YU2+M3 +NG3-G1+WE2 NG3-G1+E2 +L3-K1+I2 +C1-I2+NG3 +YA2-N3+sil N3+sil +NG3-G1+WI2 +L3-K1+AE2 B3-K1+AE2 +L3-K1+O2 +L3-G1+OE2 +A2-D3+JJ1 +G3-SS1+YAE2 G3-SS1+YA2 +K1-YA2+NG3 K1-YA2+M3 +L3-K1+U2 +WE2-NG3 WAE2-NG3+R1 +N3-GG1+A2 +YEO2-W3+GG1 +B3-J1+WAE2 B3-J1 +D3+B1 YI2-D3+B1 +M1-OE2+NG3 +N3-GG1+E2 NG3-GG1+E2 +D3+C1 YI2-D3+C1 +D3+D1 YI2-D3+D1 +E2-L3+BB1 +N3-GG1+I2 +D3+G1 YI2-D3+G1 +D3+H1 YI2-D3+H1 +D3+J1 YI2-D3+C1 +NG3-S1+WEO2 +D3+K1 D3 +N3-GG1+O2 +D3+M1 YI2-D3+M1 +N3-C1+WEO2 +D3+N1 YI2-D3+N1 +D3+O1 YI2-D3+O1 +D3+P1 D3 +BB1-WEO2+NG3 P1-WEO2+NG3 +D3+R1 YI2-D3+R1 +N3-GG1+U2 L3-GG1+U2 +D3+S1 YI2-D3+S1 +D3+T1 YI2-D3+T1 +H1+YA2 W3-H1+YA2 +WE2-NG3+sil WEO2-NG3+sil +H1+YE2 W3-H1+YE2 +W3+BB1 YAE2-W3+BB1 +H1+YI2 W3-H1+YI2 +SS1-EO2+NG3 +M3-T1+AE2 NG3-T1+AE2 +WAE2-NG3+JJ1 YAE2-NG3+DD1 +M3-P1+OE2 N3-P1+OE2 +G3-T1+WA2 D3-T1+YEO2 +N3-J1+WAE2 N3-J1+EO2 +H1+YO2 W3-H1+YO2 +YO2-M3+BB1 YAE2-M3+BB1 +G3-T1+WE2 D3-T1+YEO2 +WA2-NG3+SS1 +G3-T1+WI2 W3-T1+WI2 +EO2-D3+B1 +H1+YU2 W3-H1+YU2 +EO2-D3+C1 +NG3-G1+YA2 NG3-G1+OE2 +YE2-D3+GG1 WE2-D3+GG1 +EO2-D3+D1 +B3-SS1+WAE2 B3-SS1+WE2 +G1-YEO2+B3 +NG3+JJ1 YAE2-NG3+DD1 +EO2-D3+G1 +NG3-G1+YE2 +N3-DD1+YAE2 N3-DD1 +G1-YEO2+D3 +W3-N1+WEO2 L3-N1+WE2 +EO2-D3+H1 EO2-D3 +EO2-D3+J1 EO2-D3+C1 +G1-YEO2+G3 +sil-GG1 sil-GG1+YAE2 +EO2-D3+K1 +NG3-G1+YI2 +B3-H1+A2 +B3-D1+AE2 B3-D1 +EO2-D3+M1 +D1+WEO2 D1 +EO2-D3+N1 +EO2-D3+O1 +M3-P1+YEO2 +B3-H1+E2 G3-H1+OE2 +G1-YEO2+L3 GG1-YEO2+L3 +EO2-D3+P1 +G1-YEO2+M3 +NG3-G1+YO2 +G1-YEO2+N3 +EO2-D3+R1 +W3-GG1+WEO2 GG1+WEO2 +EO2-D3+S1 +N3-J1+A2 M3-J1+A2 +B3-H1+I2 D3-H1+I2 +EO2-D3+T1 +M3-N1+WA2 +O2-N3+sil +M1+A2 +WI2-D3+JJ1 +N3-J1+E2 N3-J1+AE2 +NG3-G1+YU2 +A2-B3+SS1 +YU2-G3+BB1 +N1+EO2 G3-N1+EO2 +D3-B1 D3-B1+YAE2 +sil-BB1+YEO2 sil-BB1+E2 +B3-H1+O2 +M3-N1+WE2 +D3-C1 C1 +M1+E2 B3-M1+AE2 +G1-YEO2+W3 +D3-D1 D3-D1+WAE2 +N3-J1+I2 +M3-N1+WI2 +D3-G1 B3-G1 +M1+I2 M1+WI2 +N1+EU2 +D3-H1 B3-H1 +B3-H1+U2 D3-H1+U2 +E2-L3+DD1 +D3-J1 D3-J1+WAE2 +N3-J1+O2 M3-J1+O2 +K1+WAE2 M3-K1+WAE2 +D3-K1 L3-K1 +AE2-D3+JJ1 +YE2-NG3+GG1 YAE2-NG3+GG1 +D3-M1 M1+WE2 +NG3-GG1+EO2 GG1+EO2 +M1+O2 +D3-N1 L3-N1 +D3-O1 O1 +S1-YEO2+B3 +D3-P1 P1 +N3-J1+U2 M3-J1+U2 +K1-WEO2+NG3 GG1-WEO2+M3 +N1-YEO2 +S1-YEO2+D3 +D3-R1 R1 +K1-EO2+B3 +SS1-A2+B3 +D3-S1 D3-S1+YAE2 +NG3-GG1+EU2 +M1+U2 +D3-T1 T1 +S1-YEO2+G3 J1-YEO2+G3 +K1-EO2+D3 +SS1-A2+D3 +G3-K1+YEO2 +NG3-M1+EO2 D3-M1+EO2 +P1-WE2+B3 K1-WE2+NG3 +K1-EO2+G3 GG1-EO2+G3 +SS1-A2+G3 +P1-WE2+D3 K1-WE2+NG3 +S1-YEO2+L3 +GG1+YEO2 M3-GG1+YEO2 +S1-YEO2+M3 +S1-YEO2+N3 +P1-WE2+G3 K1-WE2+NG3 +NG3-M1+EU2 B3-M1+EU2 +W3+DD1 WAE2-W3+T1 +K1-EO2+L3 GG1-EO2+L3 +SS1-A2+L3 +K1-EO2+M3 +SS1-A2+M3 +K1-EO2+N3 GG1-EO2+N3 +SS1-A2+N3 +G3-T1+YA2 W3-T1+YA2 +P1-WE2+L3 K1-WE2+NG3 +YEO2-W3+JJ1 YEO2-W3+T1 +P1-WE2+M3 K1-WE2+NG3 +P1-WE2+N3 K1-WE2+NG3 +W3-C1+A2 +G1-YAE2+B3 D1-YAE2 +S1-YEO2+W3 +G3-T1+YE2 D3-T1+YEO2 +YO2-M3+DD1 WA2-M3+R1 +G1-YAE2+D3 D1-YAE2 +G3-P1+A2 +W3-C1+E2 +K1-EO2+W3 +SS1-A2+W3 +G1-YAE2+G3 D1-YAE2 +G3-T1+YI2 W3-T1+YI2 +G3-R1+YAE2 R1 +G3-P1+E2 +W3-C1+I2 +JJ1-U2+B3 +P1-WE2+W3 K1-WE2+NG3 +JJ1-U2+D3 +G1-YAE2+L3 D1-YAE2 +WEO2+NG3 WEO2+M3 +G1-YAE2+M3 D1-YAE2 +G3-P1+I2 B3-P1+I2 +G3-T1+YO2 D3-T1+YEO2 +G1-YAE2+N3 D1-YAE2 +JJ1-U2+G3 +W3-GG1+A2 +W3-C1+O2 +W3-GG1+E2 +sil +G3-P1+O2 +G3-T1+YU2 D3-T1+YEO2 +JJ1-U2+L3 +JJ1-U2+M3 +W3-C1+U2 +JJ1-U2+N3 +W3-GG1+I2 +G1-YAE2+W3 D1-YAE2 +G3-P1+U2 G3-P1+EU2 +M3-N1+YA2 +L3-K1+EO2 B3-K1+EO2 +M1-A2 +J1-U2+NG3 +W3-GG1+O2 +JJ1-U2+W3 +M3-N1+YE2 +SS1+WA2 W3-SS1+WA2 +YU2-G3+DD1 YU2-G3+BB1 +M1-E2 +G3-SS1+YEO2 G3-SS1+YA2 +L3-K1+EU2 D3-K1+EU2 +S1-YAE2+B3 D1-YAE2 +M3-N1+YI2 +W3-GG1+U2 +SS1+WE2 W3-SS1+WE2 +M1-I2 +D3-G1+A2 +S1-YAE2+D3 D1-YAE2 +WI2+B3 WI2+NG3 +WI2-B3+SS1 +K1-AE2+B3 +SS1+WI2 SS1+I2 +B3-J1+WEO2 B3-J1 +S1-YAE2+G3 D1-YAE2 +WI2+D3 WI2+NG3 +K1-AE2+D3 +D3-G1+E2 G3-G1+E2 +M3-N1+YO2 +M3-C1+WAE2 +M1-O2 +YE2-D3+JJ1 EO2-D3+JJ1 +WI2+G3 WI2+NG3 +K1-AE2+G3 +N1-WI2+B3 +D3-G1+I2 D3-G1+WI2 +S1-YAE2+L3 D1-YAE2 +S1-YAE2+M3 D1-YAE2 +N1-WI2+D3 N1-WI2+B3 +S1-YAE2+N3 D1-YAE2 +M3-N1+YU2 +sil-BB1+AE2 +M1-U2 +WI2+L3 WI2+NG3 +K1-AE2+L3 K1-AE2 +N1-WI2+G3 N1-WI2+B3 +WI2+M3 WI2+NG3 +K1-AE2+M3 +AE2-B3+SS1 WE2-B3+SS1 +sil-JJ1 sil-JJ1+YAE2 +WI2+N3 WI2+NG3 +P1+AE2 G3-P1+AE2 +K1-AE2+N3 +D3-G1+O2 G3-G1+O2 +N1-WI2+L3 N1-WI2+NG3 +WEO2-M3+B1 YA2-M3+B1 +N1-WI2+M3 N1-WI2+NG3 +WEO2-M3+C1 YI2-M3+JJ1 +S1-YAE2+W3 D1-YAE2 +P1-O2+NG3 +N1-WI2+N3 +WEO2-M3+D1 WA2-M3+D1 +D3-G1+U2 G3-G1+U2 +WEO2-B3+BB1 B3+B1 +YI2-L3+BB1 YU2-L3+BB1 +WI2+W3 WI2+NG3 +K1-AE2+W3 +WEO2-M3+G1 WA2-M3+G1 +sil-P1+WAE2 +WEO2-M3+H1 WA2-M3+H1 +WEO2-M3+J1 WA2-M3+J1 +JJ1-WI2+NG3 DD1-WI2+NG3 +WEO2-M3+K1 WA2-M3+K1 +N1-WI2+W3 +WEO2-M3+M1 +WEO2-M3+N1 +WEO2-M3+O1 WA2-M3+O1 +EU2-L3+sil +H1-YA2+B3 +WEO2-M3+P1 WA2-M3+P1 +M3-T1+EO2 +H1-YA2+D3 H1-YA2+B3 +WEO2-M3+R1 WA2-M3+R1 +E2-L3+GG1 E2-L3+K1 +NG3-O1+AE2 +WEO2-M3+S1 WA2-M3+S1 +N3-J1+WEO2 N3-J1+EO2 +D1-U2+B3 +WEO2-M3+T1 WA2-M3+R1 +NG3-K1+OE2 B3-K1+OE2 +H1-YA2+G3 H1-YA2+B3 +D1-U2+D3 +YE2-NG3+JJ1 YAE2-NG3+DD1 +M3-T1+EU2 NG3-T1+EU2 +D1-U2+G3 +H1-YA2+L3 +H1-YA2+M3 +J1+WA2 +H1-YA2+N3 H1-YA2+M3 +P1-U2+B3 +D1-U2+L3 +L3-P1+YAE2 L3-P1 +D1-U2+M3 +B3-SS1+WEO2 B3-SS1+WE2 +P1-U2+D3 +J1+WE2 J1 +D1-U2+N3 +I2-M3+sil +N3-DD1+YEO2 N3-DD1 +P1-U2+G3 +YAE2-D3+SS1 WE2-D3+SS1 +J1+WI2 L3-J1+WI2 +H1-YA2+W3 D1-YA2+W3 +B3-D1+EO2 W3-D1+EO2 +W3+GG1 YAE2-W3+GG1 +P1-U2+L3 +P1-U2+M3 +D1-U2+W3 +SS1+YA2 W3-SS1+WE2 +P1-U2+N3 +B3-D1+EU2 G3-D1+EU2 +T1-EO2+B3 +SS1+YE2 W3-SS1+WE2 +T1-EO2+D3 +WI2-B3 +YO2-M3+GG1 YAE2-M3+GG1 +SS1+YI2 W3-SS1+WE2 +T1-EO2+G3 +WI2-D3 +P1-U2+W3 +OE2-L3+BB1 E2-L3+BB1 +WI2-G3 WI2-G3+D1 +T1-EO2+L3 +SS1+YO2 W3-SS1+WE2 +T1-EO2+M3 +T1-EO2+N3 +L3-M1+AE2 +WI2-L3 +K1+WEO2 L3-K1 +WI2-M3 +WI2-N3 +SS1+YU2 W3-SS1+WE2 +K1-AE2+NG3 +YE2-B3+SS1 WE2-B3+SS1 +G3-BB1+WA2 G3-BB1+WAE2 +T1-EO2+W3 T1-EO2+D3 +WI2-W3 +G3-BB1+WE2 G3-BB1+WAE2 +WEO2-B3+DD1 B3 +H1-WAE2+NG3 H1-WAE2 +YI2-L3+DD1 YU2-L3+DD1 +G3-BB1 G3-BB1+WAE2 +G3-BB1+WI2 +AE2-M3+B1 +AE2-M3+C1 OE2-M3+JJ1 +E2-N3+BB1 +AE2-M3+D1 +YU2-G3+GG1 YU2-G3+BB1 +R1-WAE2 T1-WAE2+NG3 +AE2-M3+G1 +AE2-M3+H1 +AE2-M3+J1 +G3-O1+WAE2 B3-O1+OE2 +AE2-M3+K1 +AE2-M3+M1 +AE2-M3+N1 +AE2-M3+O1 A2-M3+O1 +L3-G1+WA2 +AE2-M3+P1 OE2-M3+P1 +S1-U2+NG3 +AE2-M3+R1 AE2-M3+DD1 +J1+YA2 J1 +G3-R1+YEO2 B3-R1+YEO2 +AE2-M3+S1 +L3-G1+WE2 +AE2-M3+T1 AE2-M3+DD1 +J1+YE2 J1 +L3-G1+WI2 +I2-W3+SS1 WI2-W3+SS1 +R1-EU2+B3 +J1+YI2 J1 +T1-AE2+B3 +R1-EU2+D3 +T1-AE2+D3 K1-AE2+D3 +M3-R1+OE2 NG3-R1+OE2 +R1-EU2+G3 R1-EU2+B3 +T1-AE2+G3 +J1+YO2 +J1-YA2+NG3 G1-YA2+M3 +JJ1-OE2+NG3 BB1-OE2+NG3 +R1-EU2+L3 +T1-AE2+L3 T1-AE2+B3 +R1-EU2+M3 +T1-AE2+M3 T1-AE2+B3 +R1-EU2+N3 +J1+YU2 J1 +T1-AE2+N3 +OE2-L3+DD1 E2-L3+DD1 +E2-L3+JJ1 E2-L3+C1 +R1-EU2+W3 R1-EU2+B3 +T1-AE2+W3 +B3-B1+OE2 G3-B1+OE2 +M3-C1+WEO2 +W3-P1+A2 +G3-BB1+YA2 G3-BB1+WAE2 +M3-P1+WA2 N3-P1+WAE2 +W3-P1+E2 +sil-BB1+EO2 +NG3-N1+YAE2 NG3-N1+WAE2 +G3-BB1+YE2 G3-BB1+WAE2 +A2-D3+SS1 WA2-D3+SS1 +P1+EO2 +M3-P1+WE2 N3-P1+WAE2 +W3-P1+I2 B3-P1+I2 +C1-I2+B3 +W3+JJ1 WAE2-W3+JJ1 +G3-BB1+YI2 G3-BB1+WAE2 +sil-BB1+EU2 +G3-DD1 +C1-I2+D3 +M3-P1+WI2 +P1+EU2 W3-P1+EU2 +WA2-L3+sil +E2-N3+DD1 YU2-N3+DD1 +W3-P1+O2 +C1-I2+G3 +DD1-WAE2 SS1-WAE2 +G3-BB1+YO2 G3-BB1+WAE2 +sil-P1+WEO2 sil-P1+WAE2 +M3-J1+WAE2 N3-J1+EO2 +YO2-M3+JJ1 YI2-M3+JJ1 +C1-I2+L3 +W3-P1+U2 +C1-I2+M3 +C1-I2+N3 +G3-BB1+YU2 G3-BB1+WAE2 +YA2-L3+B1 YU2-L3+B1 +YA2-L3+C1 YU2-L3+JJ1 +L3-G1+YA2 L3-G1 +C1-YO2+B3 C1-YO2 +YA2-L3+D1 YU2-L3+D1 +C1-YO2+D3 C1-YO2 +YAE2-L3+B1 YU2-L3+B1 +YAE2-L3+C1 YU2-L3+JJ1 +YA2-L3+G1 +NG3-O1+EO2 +L3-G1+YE2 L3-G1 +YAE2-L3+D1 YU2-L3+D1 +P1-YE2+B3 +YA2-L3+H1 YU2-L3+H1 +C1-YO2+G3 C1-YO2 +P1-YE2+D3 P1-YE2+B3 +C1-I2+W3 +YA2-L3+J1 YU2-L3+JJ1 +YAE2-L3+G1 YA2-L3+G1 +YA2-L3+K1 YU2-L3+GG1 +L3-G1+YI2 +YAE2-L3+H1 YU2-L3+H1 +P1-YE2+G3 P1-YE2+B3 +YA2-L3+M1 YU2-L3+M1 +NG3-O1+EU2 +C1-YO2+L3 C1-YO2 +YAE2-L3+J1 YU2-L3+JJ1 +YA2-L3+N1 YU2-L3+N1 +D3-T1+A2 +C1-YO2+M3 C1-YO2 +YAE2-L3+K1 YU2-L3+GG1 +YA2-L3+O1 YU2-L3+O1 +C1-YO2+N3 C1-YO2 +YA2-L3+P1 YU2-L3+BB1 +D3-BB1+AE2 +YAE2-L3+M1 YU2-L3+M1 +L3-G1+YO2 +YAE2-L3+N1 YU2-L3+N1 +P1-YE2+L3 P1-YE2+B3 +YA2-L3+R1 +D3-T1+E2 +YAE2-L3+O1 YU2-L3+O1 +P1-YE2+M3 P1-YE2+B3 +YA2-L3+S1 YU2-L3+S1 +L3-P1+YEO2 +YAE2-L3+P1 YU2-L3+BB1 +WEO2-B3+GG1 B3+K1 +P1-YE2+N3 P1-YE2+B3 +YA2-L3+T1 YU2-L3+T1 +YI2-L3+GG1 YU2-L3+GG1 +YAE2-L3+R1 YA2-L3+R1 +D3-T1+I2 +YAE2-L3+S1 YU2-L3+S1 +L3-G1+YU2 +YAE2-L3+T1 YU2-L3+T1 +C1-YO2+W3 C1-YO2 +WAE2-NG3+SS1 YAE2-NG3+SS1 +YU2-G3+JJ1 +YEO2-M3+sil WAE2-M3+sil +D3-T1+O2 G3-T1+O2 +D3-P1+WAE2 W3-P1+OE2 +P1-YE2+W3 P1-YE2+B3 +D3-T1+U2 +NG3+SS1 YAE2-NG3+SS1 +R1-YEO2+B3 +R1-YEO2+D3 +M3-P1+YA2 N3-P1+WAE2 +L3-M1+EO2 +R1-E2+NG3 +R1-YEO2+G3 +M3-P1+YE2 N3-P1+WAE2 +M1-YI2+NG3 M1-YI2 +L3-M1+EU2 D3-M1+EU2 +R1-YEO2+L3 +R1-YEO2+M3 +M3-P1+YI2 N3-P1+WAE2 +M3-M1+A2 +R1-YEO2+N3 R1-YEO2+M3 +YI2+B3 YI2+NG3 +WI2-D3+SS1 +M3-M1+E2 +YI2+D3 YI2+NG3 +GG1-YEO2+NG3 +M3-P1+YO2 +M3-M1+I2 +YI2+G3 YI2+NG3 +N1-YI2+B3 +R1-YEO2+W3 +N1-YI2+D3 N1-YI2+B3 +OE2-L3+GG1 +M3-P1+YU2 N3-P1+YU2 +R1-WEO2 +YI2+L3 YI2+NG3 +GG1-WA2+NG3 +YU2-NG3 WAE2-NG3+R1 +M3-M1+O2 +N1-YI2+G3 N1-YI2+B3 +YI2+M3 YI2+NG3 +AE2-D3+SS1 +S1-YEO2+NG3 D1-YEO2+NG3 +YI2+N3 YI2+NG3 +R1+AE2 NG3-R1+AE2 +N1+OE2 N1+AE2 +G3-O1+WEO2 +N1-YI2+L3 N1-YI2+B3 +M3-M1+U2 +N1-YI2+M3 N1-YI2+B3 +N1-YI2+N3 N1-YI2+B3 +WEO2-D3+BB1 +YI2-N3+BB1 YU2-N3+BB1 +YI2+W3 YI2+NG3 +BB1-AE2 +OE2-L3+B1 +NG3-GG1+OE2 M3-GG1+OE2 +OE2-L3+C1 +N1-YI2+W3 N1-YI2+B3 +OE2-L3+D1 +G3-GG1 G3-GG1+YAE2 +EU2-N3+sil +OE2-L3+G1 +OE2-L3+H1 +E2-N3+GG1 +OE2-L3+J1 +YEO2-W3+SS1 +OE2-L3+K1 OE2-L3+GG1 +NG3-M1+OE2 NG3-M1+E2 +YO2-M3+B1 YA2-M3+B1 +OE2-L3+M1 E2-L3+M1 +YO2-M3+C1 YI2-M3+JJ1 +OE2-L3+N1 YU2-L3+N1 +YO2-M3+D1 WA2-M3+D1 +OE2-L3+O1 YU2-L3+O1 +R1-YAE2+B3 D1-YAE2 +OE2-L3+P1 E2-L3+P1 +YO2-M3+G1 WA2-M3+G1 +R1-YAE2+D3 D1-YAE2 +OE2-L3+R1 +YO2-M3+H1 WA2-M3+H1 +OE2-L3+S1 YU2-L3+S1 +OE2-L3+T1 E2-L3+T1 +YO2-M3+J1 WA2-M3+J1 +N3-C1+AE2 +R1-YAE2+G3 D1-YAE2 +YO2-M3+K1 WA2-M3+K1 +L3-C1+WAE2 L3-C1 +YO2-M3+M1 WA2-M3+M1 +YO2-M3+N1 WA2-M3+N1 +YO2-M3+O1 WA2-M3+O1 +R1-YAE2+L3 D1-YAE2 +W3-SS1+YAE2 W3-SS1+WE2 +YO2-M3+P1 WA2-M3+P1 +R1-YAE2+M3 D1-YAE2 +R1-YAE2+N3 D1-YAE2 +YO2-M3+R1 WA2-M3+R1 +YO2-M3+S1 WA2-M3+S1 +YO2-M3+T1 WA2-M3+R1 +sil-D1+YAE2 sil-D1+E2 +N1-A2+B3 +N1-A2+D3 +N1-A2+G3 N1-A2+B3 +WEO2-B3+JJ1 B3+C1 +R1-YAE2+W3 D1-YAE2 +YI2-L3+JJ1 YU2-L3+JJ1 +YI2-B3 B3 +NG3-K1+WA2 +NG3-N1+YEO2 +N1-A2+L3 +YI2-D3 D3 +OE2-N3+BB1 E2-N3+BB1 +N1-A2+M3 +N1-A2+N3 +NG3-K1+WE2 M3-K1+WEO2 +YI2-G3 G3 +NG3-K1+WI2 M3-K1+I2 +L3-O1+AE2 +YI2-L3 L3 +DD1-WEO2 SS1-WEO2 +YI2-M3 M3 +L3-K1+OE2 B3-K1+OE2 +GG1-WI2+B3 DD1-WI2+NG3 +EU2+NG3 JJ1-EU2+NG3 +YI2-N3 N3 +N1-A2+W3 +GG1-WI2+D3 DD1-WI2+NG3 +M3-J1+WEO2 N3-J1+EO2 +YE2-D3+SS1 WE2-D3+SS1 +K1-YE2+NG3 K1-YE2 +GG1-WI2+G3 DD1-WI2+NG3 +WI2-NG3 WI2-NG3+DD1 +YI2-W3 +WEO2-D3+DD1 WE2-D3+DD1 +GG1-WI2+L3 DD1-WI2+NG3 +sil-SS1 sil-SS1+WE2 +YI2-N3+DD1 YU2-N3+DD1 +GG1-WI2+M3 DD1-WI2+NG3 +GG1-WI2+N3 DD1-WI2+NG3 +YI2-NG3+sil WEO2-NG3+sil +D3-BB1+EO2 +GG1-WI2+W3 DD1-WI2+NG3 +D3-BB1+EU2 +S1-I2+B3 D1-I2+B3 +OE2-L3+JJ1 OE2-L3+C1 +D3-P1+WEO2 P1 +S1-I2+D3 +YE2-NG3+SS1 YAE2-NG3+SS1 +S1-I2+G3 +L3-T1+WAE2 L3-T1 +J1-YU2+B3 DD1-YU2+B3 +EU2-N3+B1 +YO2-NG3+BB1 +EU2-N3+C1 EU2-N3+JJ1 +J1-YU2+D3 DD1-YU2+B3 +S1-I2+L3 +EU2-N3+D1 +M3-T1+OE2 N3-T1+OE2 +S1-I2+M3 +S1-I2+N3 +J1-YU2+G3 DD1-YU2+B3 +EU2-N3+G1 +EU2-N3+H1 +J1-AE2+NG3 +W3-P1+YAE2 P1 +EU2-N3+J1 +EU2-N3+K1 +J1-YU2+L3 DD1-YU2+L3 +J1-YU2+M3 D1-YU2+M3 +EU2-N3+M1 +YU2-NG3+sil +J1-YU2+N3 DD1-YU2+N3 +EU2-N3+N1 +NG3-K1+YA2 M3-K1+WEO2 +S1-I2+W3 +EU2-N3+O1 +G3-JJ1 G3-JJ1+OE2 +EU2-N3+P1 +A2-L3+B1 +A2-L3+C1 WA2-L3+C1 +OE2-N3+DD1 YU2-N3+DD1 +EU2-N3+R1 +NG3-K1+YE2 M3-K1+WEO2 +E2-N3+JJ1 +A2-L3+D1 +EU2-N3+S1 +EU2-N3+T1 +A2-L3+G1 +NG3-K1+YI2 N3-K1+I2 +J1-YU2+W3 D1-YU2+M3 +A2-L3+H1 WA2-L3+H1 +B3-H1+AE2 G3-H1+AE2 +A2-L3+J1 +A2-L3+K1 +E2-B3+sil +B3-D1+OE2 B3-D1 +A2-L3+M1 WA2-L3+M1 +NG3-K1+YO2 +A2-L3+N1 +R1-OE2+B3 +A2-L3+O1 +A2-L3+P1 +R1-OE2+D3 +M3-R1+WA2 R1 +A2-L3+R1 +A2-L3+S1 +NG3-K1+YU2 +R1-OE2+G3 +A2+NG3 +A2-L3+T1 +R1+EO2 NG3-R1+EO2 +M3-R1+WE2 R1 +R1-OE2+L3 R1-OE2+D3 +R1-OE2+M3 S1-OE2+M3 +N1-A2+NG3 +M3-R1+WI2 N3-R1+I2 +P1-YAE2+NG3 D1-YAE2 +R1-OE2+N3 B1-OE2+N3 +R1+EU2 NG3-R1+EU2 +WA2-N3+sil +YAE2-L3+BB1 YU2-L3+BB1 +W3-C1+AE2 +BB1-EO2 +M3+sil WAE2-M3+sil +GG1-YO2+NG3 YO2+NG3 +R1-OE2+W3 R1-OE2+B3 +BB1-EU2 +B3-B1+WA2 G3-B1+WA2 +B3-B1+WE2 B3-B1 +U2-L3+sil YU2-L3+sil +B3-B1+WI2 G3-B1+WI2 +YO2-NG3+DD1 +N3-C1+EO2 +WEO2-D3+GG1 +L3-C1+WEO2 L3-C1+EO2 +YI2-N3+GG1 YE2-N3+GG1 +W3-SS1+YEO2 W3-SS1+WE2 +N3-C1+EU2 +B3-JJ1+A2 +sil-D1+YEO2 sil-D1+E2 +B3-JJ1+E2 G3-JJ1+AE2 +B3-JJ1+I2 +C1+A2 W3-C1+A2 +B3-JJ1+O2 B3-JJ1+WAE2 +L3-J1+WAE2 L3-J1 +E2-L3+SS1 +C1+E2 W3-C1+E2 +B3-JJ1+U2 +M3-R1+YA2 NG3-R1+YA2 +C1+I2 D3-C1+WI2 +B1-AE2 +L3-O1+EO2 +sil-K1+YAE2 sil-K1+AE2 +M3-R1+YE2 R1 +NG3-R1+WAE2 R1 +C1+O2 W3-C1+O2 +L3-O1+EU2 +N3-B1+WAE2 N3-B1+WE2 +M3-R1+YI2 NG3-R1+YI2 +C1-WE2+B3 K1-WE2+NG3 +C1+U2 W3-C1+U2 +YAE2-L3+DD1 YU2-L3+DD1 +C1-WE2+D3 K1-WE2+NG3 +M3-R1+YO2 NG3-R1+YO2 +G3-DD1+YAE2 G3-DD1+WEO2 +D3-D1+YAE2 D3-D1+WAE2 +W3+SS1 WAE2-W3+SS1 +C1-WE2+G3 K1-WE2+NG3 +S1-YU2+B3 +OE2-N3+GG1 +M3-R1+YU2 NG3-R1+YU2 +S1-YU2+D3 S1-YU2+B3 +B3-B1+YA2 B3-B1 +C1-WE2+L3 K1-WE2+NG3 +sil-BB1+OE2 sil-BB1+E2 +C1-WE2+M3 K1-WE2+NG3 +T1+AE2 W3-T1+AE2 +S1-YU2+G3 S1-YU2+B3 +C1-WE2+N3 K1-WE2+NG3 +YO2-M3+SS1 YI2-M3+SS1 +P1+OE2 G3-P1+OE2 +B3-B1+YE2 B3-B1 +S1-YU2+L3 +B3-B1+YI2 G3-B1+YI2 +DD1-OE2+NG3 +S1-YU2+M3 S1-YU2 +S1-YU2+N3 +C1-WE2+W3 K1-WE2+NG3 +B3-B1+YO2 B3-B1 +O1-YEO2+NG3 +B1-WI2+B3 B1-WI2+NG3 +L3-T1+WEO2 L3-T1 +B1-WI2+D3 B1-WI2+NG3 +S1-YU2+W3 S1-YU2 +W3-M1+WAE2 +B3-B1+YU2 G3-B1+YU2 +B1-WI2+G3 B1-WI2+NG3 +NG3-S1+AE2 +A2-L3+BB1 A2-L3+P1 +NG3-O1+OE2 +D1-WEO2+NG3 SS1-WEO2+M3 +C1+WAE2 C1 +B1-WI2+L3 B1-WI2+NG3 +W3-P1+YEO2 +B1-WI2+M3 B1-WI2+NG3 +B1-WI2+N3 B1-WI2+NG3 +M3-BB1+YAE2 NG3-BB1+E2 +YU2-G3+SS1 +N1+WA2 L3-N1+WA2 +C1-A2 +N1+WE2 L3-N1+WE2 +C1-E2 C1-E2+NG3 +WAE2-L3+sil YO2-L3+sil +B1-WI2+W3 B1-WI2+NG3 +N1+WI2 G3-N1+I2 +C1-I2 +B3-H1+EO2 +NG3-GG1+WA2 GG1+WA2 +B3-DD1+WAE2 B3-DD1+OE2 +YO2-NG3+GG1 +C1-O2 +NG3-GG1+WE2 N3-GG1+YA2 +B3-H1+EU2 +WEO2-D3+JJ1 EO2-D3+JJ1 +YI2-N3+JJ1 YE2-N3+JJ1 +NG3-GG1+WI2 M3-GG1+WI2 +M1-YAE2 D1-YAE2 +NG3-M1+WA2 +C1-U2 +G3-J1+YAE2 B3-J1 +NG3-M1+WE2 NG3-M1+WAE2 +C1-O2+NG3 +YI2-B3+sil YU2-B3+sil +YE2-W3+B1 OE2-W3+B1 +YE2-W3+C1 +NG3-M1+WI2 NG3-M1+I2 +YE2-W3+D1 +L3-N1+A2 +W3-C1+EO2 D3-C1+EO2 +L3-M1+OE2 L3-M1+AE2 +GG1-YI2+B3 YI2+NG3 +YE2-W3+G1 +YE2-W3+H1 +L3-N1+E2 +GG1-YI2+D3 YI2+NG3 +O2-NG3+BB1 +YE2-W3+J1 +YE2-W3+K1 YAE2-W3+K1 +GG1-YI2+G3 YI2+NG3 +L3-N1+I2 +W3-C1+EU2 +YE2-W3+M1 +YE2-W3+N1 YAE2-W3+N1 +YE2-W3+O1 +YE2-W3+P1 +GG1-YI2+L3 YI2+NG3 +GG1-YI2+M3 YI2+NG3 +YE2-W3+R1 +L3-N1+O2 +GG1-YI2+N3 YI2+NG3 +YE2-W3+S1 WAE2-W3+S1 +YE2-W3+T1 +L3-N1+U2 G3-N1+U2 +GG1-YI2+W3 YI2+NG3 +G3+B1 YAE2-G3+B1 +YAE2-L3+GG1 YU2-L3+GG1 +A2-L3+DD1 A2-L3+T1 +G3+C1 YAE2-G3+C1 +G3+D1 YAE2-G3+D1 +L3-K1+WA2 B3-K1+WA2 +G3+G1 YAE2-G3+B1 +G3+H1 YAE2-G3+H1 +NG3-GG1+YAE2 N3-GG1+YA2 +N1+YA2 G3-N1+YA2 +OE2-N3+JJ1 E2-N3+JJ1 +WI2-L3+BB1 +G3+J1 YAE2-G3+J1 +L3-K1+WE2 L3-K1 +G3+K1 YAE2-G3+K1 +G1-EO2+B3 +N1+YE2 L3-N1 +G3+M1 YAE2-G3+M1 +G3+N1 YAE2-G3+M1 +L3-K1+WI2 B3-K1+WI2 +G1-EO2+D3 +G3+O1 YAE2-G3+O1 +L3-GG1+WAE2 GG1+WAE2 +G3+P1 YAE2-G3+P1 +OE2-B3+sil E2-B3+sil +N1+YI2 L3-N1+YI2 +WI2-L3+B1 +SS1-EU2+NG3 +G1-EO2+G3 GG1-EO2+G3 +WI2-L3+C1 +G3+R1 YAE2-G3+R1 +WI2-L3+D1 +G3+S1 YAE2-G3+S1 +G3+T1 YAE2-G3+R1 +NG3-GG1+YA2 N3-GG1+YA2 +AE2-L3+BB1 +WI2-L3+G1 +G1-EO2+L3 GG1-EO2+L3 +N1+YO2 L3-N1+YO2 +WI2-L3+H1 +L3-J1+WEO2 L3-J1 +sil-H1+WAE2 +G1-EO2+M3 G1-EO2+NG3 +NG3-GG1+YE2 N3-GG1+YA2 +G1-EO2+N3 +WI2-L3+J1 WI2-L3+C1 +W3-C1+WAE2 C1 +J1-YE2+NG3 H1-YE2+B3 +WI2-L3+K1 +WI2-L3+M1 +NG3-GG1+YI2 N3-GG1+YA2 +B1-EO2 +N1+YU2 L3-N1+YU2 +WI2-L3+N1 +NG3-M1+YA2 NG3-M1+WAE2 +WI2-L3+O1 +sil-K1+YEO2 +WI2-L3+P1 +NG3-R1+WEO2 B3-R1+WEO2 +WI2-L3+R1 +NG3-M1+YE2 NG3-M1+WAE2 +G1-EO2+W3 +WI2-L3+S1 +NG3-GG1+YO2 N3-GG1+YO2 +B1-EU2 +WI2-L3+T1 +N3-B1+WEO2 +WEO2-B3+SS1 WE2-B3+SS1 +YI2-L3+SS1 YU2-L3+SS1 +NG3-M1+YI2 NG3-M1+WAE2 +I2-NG3+B1 +B3-J1+AE2 G3-J1+AE2 +I2-NG3+C1 +NG3-GG1+YU2 N3-GG1+YA2 +I2-NG3+D1 +EO2-G3+B1 +E2-D3+sil +EO2-G3+C1 +G3-DD1+YEO2 G3-DD1+WEO2 +D3-D1+YEO2 D3-D1+WAE2 +K1-WI2+B3 K1-WI2+NG3 +EO2-G3+D1 +I2-NG3+G1 +NG3-M1+YO2 +I2-NG3+H1 +O2-NG3+DD1 +K1-WI2+D3 K1-WI2+NG3 +EO2-G3+G1 +I2-NG3+J1 WI2-NG3+J1 +JJ1-AE2 +EO2-G3+H1 +I2-NG3+K1 WI2-NG3+K1 +M3-T1+WA2 NG3-T1+AE2 +K1-WI2+G3 K1-WI2+NG3 +EO2-G3+J1 EO2-G3+C1 +I2-NG3+M1 +NG3-M1+YU2 NG3-M1+WAE2 +EO2-G3+K1 +B3-K1+A2 K1+A2 +I2-NG3+N1 +YU2-M3+BB1 YAE2-M3+BB1 +T1+EO2 W3-T1+EO2 +I2-NG3+O1 +M3-T1+WE2 NG3-T1+AE2 +EO2-G3+M1 +I2-NG3+P1 +K1-WI2+L3 K1-WI2+NG3 +EO2-G3+N1 EO2-G3+M1 +K1-WI2+M3 K1-WI2+NG3 +EO2-G3+O1 +B3-K1+E2 K1+E2 +I2-NG3+R1 WI2-NG3+DD1 +K1-WI2+N3 K1-WI2+NG3 +EO2-G3+P1 EO2-G3+B1 +I2-NG3+S1 +M3-T1+WI2 NG3-T1+WI2 +I2-NG3+T1 I2-NG3+P1 +EO2-G3+R1 +T1+EU2 W3-T1+EU2 +YO2-NG3+JJ1 YO2-NG3+DD1 +EO2-G3+S1 +N3-M1+A2 +B3-K1+I2 W3-K1+I2 +YAE2-N3+BB1 YU2-N3+BB1 +EO2-G3+T1 EO2-G3+R1 +P1+A2 +N3-M1+E2 NG3-M1+E2 +D3-K1+YAE2 L3-K1 +G3-B1 B3-B1 +K1-WI2+W3 K1-WI2+NG3 +B3-K1+O2 K1+O2 +D3-SS1+A2 +G3-C1 +P1+E2 G3-P1+E2 +G3-D1 B3-D1 +G1-AE2+B3 +N3-M1+I2 +G1-AE2+D3 +L3-K1+YA2 L3-K1 +D3-SS1+E2 D3-SS1+AE2 +W3-M1+WEO2 +G3-G1 B3-G1 +B3-D1+WA2 B3-D1 +P1+I2 B3-P1+I2 +G3-H1 G3-H1+YAE2 +B3-K1+U2 K1+U2 +G1-AE2+G3 +NG3-S1+EO2 +G3-J1 B3-J1 +N3-M1+O2 +L3-K1+YE2 L3-K1 +D3-SS1+I2 D3-SS1+WI2 +G3-K1 L3-K1 +B3-D1+WE2 B3-D1 +WI2-L3+DD1 +C1+WEO2 D3-C1+EO2 +G3-M1 G3-M1+WAE2 +P1+O2 +G3-N1 L3-N1 +G1-AE2+L3 G1-AE2 +U2-N3+sil +L3-K1+YI2 B3-K1+YI2 +G3-O1 O1 +G1-AE2+M3 G1-AE2 +B3-D1+WI2 G3-D1+WI2 +NG3-S1+EU2 +G3-P1 P1 +G1-AE2+N3 +N3-M1+U2 G3-M1+U2 +D3-SS1+O2 +M3-BB1+YEO2 NG3-BB1+E2 +G3-R1 R1 +G3-S1 +OE2-L3+SS1 E2-L3+SS1 +P1+U2 +G3-T1 T1 +L3-K1+YO2 B3-K1+YO2 +D3-BB1+OE2 D3-BB1+E2 +D3-SS1+U2 +AE2-L3+DD1 +YE2-L3+BB1 YU2-L3+BB1 +G1-AE2+W3 +L3-K1+YU2 B3-K1+YU2 +W3-T1+WAE2 D3-T1+YEO2 +B3-DD1+WEO2 B3-DD1+OE2 +J1+WAE2 J1 +YAE2-L3+JJ1 YU2-L3+JJ1 +A2-L3+GG1 +M1-YEO2 +G3-S1+A2 +NG3-DD1+AE2 M3-DD1+E2 +G3-SS1 G3-SS1+YA2 +G3-S1+E2 +G3-J1+YEO2 +E2-N3+SS1 +G3-S1+I2 +H1-YA2+NG3 H1-YA2+M3 +M3-T1+YA2 NG3-T1+AE2 +D1-AE2 +R1-I2+NG3 +M3-T1+YE2 NG3-T1+AE2 +YU2-M3+DD1 WA2-M3+R1 +O1-A2+B3 +G3-S1+O2 +O1-A2+D3 +M3-T1+YI2 NG3-T1+AE2 +O1-A2+G3 +YA2-B3+B1 B3+B1 +T1-YAE2 D1-YAE2 +G3-S1+U2 +YA2-B3+C1 B3+C1 +C1-YE2+B3 C1-YE2 +YA2-B3+D1 B3 +YAE2-N3+DD1 YU2-N3+DD1 +GG1-A2+NG3 +P1-A2 +C1-YE2+D3 C1-YE2 +YAE2-B3+B1 B3+B1 +M3-T1+YO2 NG3-T1+AE2 +P1-EO2+B3 +O1-A2+L3 +YAE2-B3+C1 B3+C1 +YA2-B3+G1 B3+G1 +O1-A2+M3 +YAE2-B3+D1 B3 +YA2-B3+H1 B3 +P1-EO2+D3 +O1-A2+N3 +C1-YE2+G3 C1-YE2 +P1-E2 P1-E2+L3 +YA2-B3+J1 B3+C1 +YAE2-B3+G1 B3+G1 +YA2-B3+K1 B3+K1 +P1-EO2+G3 +YAE2-B3+H1 B3 +M3-T1+YU2 NG3-T1+AE2 +YA2-B3+M1 B3+M1 +B3-D1+YA2 B3-D1 +P1-I2 +C1-YE2+L3 C1-YE2 +YAE2-B3+J1 B3+C1 +YA2-B3+N1 B3+N1 +GG1-WE2+NG3 GG1-WE2 +D3-J1+A2 +C1-YE2+M3 C1-YE2 +YAE2-B3+K1 B3+K1 +YA2-B3+O1 B3+O1 +C1-YE2+N3 C1-YE2 +YA2-B3+P1 B3+B1 +P1-EO2+L3 +YAE2-B3+M1 B3+M1 +R1+OE2 NG3-R1+OE2 +B3-D1+YE2 B3-D1 +P1-EO2+M3 +O1-A2+W3 +YAE2-B3+N1 B3+N1 +YA2-B3+R1 B3 +D3-J1+E2 +P1-EO2+N3 +YAE2-B3+O1 B3+O1 +YA2-B3+S1 B3+S1 +P1-O2 P1-O2+NG3 +YAE2-B3+P1 B3+B1 +YA2-B3+T1 B3 +P1-U2+NG3 +B3-D1+YI2 B3-D1 +YAE2-B3+R1 B3 +D3-JJ1+YAE2 D3-JJ1+OE2 +D3-J1+I2 +O2-NG3+GG1 +YAE2-B3+S1 B3+S1 +YAE2-B3+T1 B3 +T1-YA2+NG3 T1-YA2+N3 +C1-YE2+W3 C1-YE2 +NG3-GG1+YEO2 M3-GG1+YEO2 +P1-U2 +BB1-OE2 JJ1-OE2+B3 +B3-D1+YO2 B3-D1 +P1-EO2+W3 +D3-J1+O2 +B1-YI2+B3 +B1-YI2+D3 B1-YI2+B3 +L3-GG1+WEO2 GG1+WEO2 +YE2-L3+DD1 YU2-L3+DD1 +B3-D1+YU2 B3-D1 +D3-J1+U2 G3-J1+U2 +B1-YI2+G3 B1-YI2+B3 +DD1-I2+B3 SS1-I2+B3 +T1-WI2+B3 K1-WI2+NG3 +WAE2-L3+B1 YU2-L3+B1 +A2-N3+BB1 +DD1-I2+D3 SS1-I2+D3 +WAE2-L3+C1 YU2-L3+JJ1 +T1-WI2+D3 K1-WI2+NG3 +WAE2-L3+D1 YU2-L3+D1 +sil-H1+WEO2 +B1-YI2+L3 B1-YI2+B3 +DD1-I2+G3 SS1-I2+G3 +D1-YEO2+B3 +B1-YI2+M3 B1-YI2+B3 +W3-C1+WEO2 D3-C1+EO2 +M3-B1+WAE2 N3-B1+WE2 +B1-YI2+N3 B1-YI2+B3 +T1-WI2+G3 K1-WI2+NG3 +WAE2-L3+G1 YA2-L3+G1 +sil-BB1+WA2 sil-BB1+E2 +D1-YEO2+D3 +WAE2-L3+H1 YU2-L3+H1 +WAE2-L3+J1 YU2-L3+JJ1 +P1+WA2 W3-P1+WA2 +DD1-I2+L3 SS1-I2+L3 +D1-YEO2+G3 J1-YEO2+G3 +WAE2-L3+K1 YU2-L3+GG1 +DD1-I2+M3 +JJ1+YAE2 L3-JJ1 +sil-BB1+WE2 sil-BB1+E2 +T1-WI2+L3 K1-WI2+NG3 +N3-G1+AE2 +B3-BB1+AE2 +DD1-I2+N3 +T1-I2+B3 SS1-I2+B3 +T1-WI2+M3 K1-WI2+NG3 +WAE2-L3+M1 YU2-L3+M1 +T1-WI2+N3 K1-WI2+NG3 +N3-C1+OE2 +WAE2-L3+N1 YU2-L3+N1 +P1+WE2 P1 +T1-I2+D3 SS1-I2+D3 +WAE2-L3+O1 YU2-L3+O1 +sil-BB1+WI2 sil-BB1+I2 +D1-YEO2+L3 S1-YEO2+L3 +WAE2-N3+sil N3+sil +B1-YI2+W3 B1-YI2+B3 +WAE2-L3+P1 YU2-L3+BB1 +D1-YEO2+M3 +WI2-L3+GG1 WI2-L3+K1 +D1-YEO2+N3 S1-YEO2+N3 +T1-I2+G3 +WAE2-L3+R1 YA2-L3+R1 +NG3-B1+A2 +P1+WI2 B3-P1+I2 +EU2+B3 +M3-C1+A2 +WAE2-L3+S1 YU2-L3+S1 +WAE2-L3+T1 YU2-L3+T1 +EU2+D3 +B3-J1+EO2 G3-J1+EO2 +DD1-I2+W3 +NG3-B1+E2 +T1-I2+L3 +M3-C1+E2 +T1-WI2+W3 K1-WI2+NG3 +T1-I2+M3 DD1-I2+M3 +EU2+G3 EU2+B3 +B3-P1+WAE2 W3-P1+OE2 +N1-EU2+B3 +T1-I2+N3 +sil-O1+WAE2 +P1-AE2+B3 +YEO2-NG3+B1 +NG3-B1+I2 +sil-SS1+A2 +YEO2-NG3+C1 +D1-YEO2+W3 +N1-EU2+D3 N1-EU2+B3 +M3-C1+I2 +B3-J1+EU2 +P1-AE2+D3 +YEO2-NG3+D1 +JJ1-EO2 +AE2-L3+GG1 +EU2+L3 +N1-EU2+G3 N1-EU2+B3 +EU2+M3 H1-EU2+M3 +P1-AE2+G3 +sil-SS1+E2 sil-SS1+AE2 +YEO2-NG3+G1 +EU2+N3 JJ1-EU2+N3 +NG3-O1+WA2 +YEO2-NG3+H1 WAE2-NG3+H1 +NG3-B1+O2 +M3-C1+O2 +YEO2-NG3+J1 +T1-I2+W3 +JJ1-EU2 +sil-SS1+I2 sil-SS1+WI2 +YEO2-NG3+K1 +N1-EU2+L3 +P1-AE2+L3 +NG3-O1+WE2 NG3-O1+YAE2 +N1-EU2+M3 +YI2-D3+sil YO2-D3+sil +P1-AE2+M3 +YEO2-NG3+M1 +N1-EU2+N3 +P1-AE2+N3 P1-AE2+L3 +YEO2-NG3+N1 +P1-YEO2+B3 +NG3-B1+U2 +YEO2-NG3+O1 +M3-C1+U2 +NG3-O1+WI2 +YEO2+NG3 JJ1-YEO2+NG3 +YEO2-NG3+P1 +EU2+W3 +L3-S1+AE2 +P1-YEO2+D3 T1-YEO2+D3 +sil-SS1+O2 +YEO2-NG3+R1 +L3-O1+OE2 +A2-L3+JJ1 WA2-L3+JJ1 +YEO2-NG3+S1 +P1-YEO2+G3 +YEO2-NG3+T1 +D3-K1+YEO2 L3-K1+YEO2 +G3-BB1+A2 +N1-EU2+W3 +P1-AE2+W3 P1-AE2+M3 +sil-SS1+U2 +K1-YI2+NG3 K1-YI2 +OE2-B3+B1 E2-B3 +OE2-B3+C1 O2-B3+JJ1 +P1-YEO2+L3 +OE2-B3+D1 EO2-B3+D1 +G3-BB1+E2 G3-BB1+WAE2 +P1-YEO2+M3 +P1-YEO2+N3 +OE2-B3+G1 E2-B3+G1 +OE2-B3+H1 E2-B3 +G3-BB1+I2 G3-BB1+WI2 +M3-BB1 NG3-BB1+E2 +OE2-B3+J1 O2-B3+JJ1 +M1-O2+B3 +OE2-B3+K1 E2-B3 +M1-O2+D3 +OE2-B3+M1 O2-B3+M1 +YU2-M3+GG1 YAE2-M3+GG1 +OE2-B3+N1 O2-B3+N1 +G3-BB1+O2 +D1-YAE2+B3 D1-YAE2 +P1-YEO2+W3 +OE2-B3+O1 EO2-B3+O1 +M1-O2+G3 +OE2-B3+P1 E2-B3 +D1-YAE2+D3 D1-YAE2 +OE2-B3+R1 E2-B3 +OE2-B3+S1 O2-B3+S1 +D1-YAE2+G3 D1-YAE2 +D3-R1+YAE2 R1 +OE2-B3+T1 E2-B3 +G3-BB1+U2 +M1-O2+L3 +YAE2-N3+GG1 YE2-N3+GG1 +A2-N3+DD1 WA2-N3+DD1 +M1-O2+M3 +M1-O2+N3 +D1-YAE2+L3 D1-YAE2 +sil-BB1+YA2 sil-BB1+E2 +L3-M1+WA2 +D1-YAE2+M3 D1-YAE2 +W3-T1+WEO2 D3-T1+YEO2 +D1-YAE2+N3 D1-YAE2 +P1+YA2 P1 +WI2-N3+BB1 +sil-BB1+YE2 sil-BB1+E2 +L3-M1+WE2 L3-M1 +J1+WEO2 J1 +P1+YE2 W3-P1+YE2 +M1-O2+W3 +sil-BB1+YI2 sil-BB1+E2 +L3-M1+WI2 +D1-YAE2+W3 D1-YAE2 +OE2-D3+sil +P1+YI2 P1 +EU2-B3 U2-B3 +EU2-D3 +sil-BB1+YO2 sil-BB1+E2 +O2-NG3+JJ1 O2-NG3+R1 +NG3-DD1+EO2 M3-DD1+EO2 +AE2-N3+BB1 +EU2-G3 +P1+YO2 W3-P1+YO2 +DD1-YAE2+NG3 D1-YAE2 +sil-BB1+YU2 sil-BB1+E2 +NG3-DD1+EU2 M3-DD1+EU2 +EU2-L3 +P1-YAE2+B3 D1-YAE2 +D1-EO2 +EU2-M3 +P1+YU2 P1 +EU2-N3 +NG3-O1+YA2 +P1-YAE2+D3 D1-YAE2 +YE2-L3+GG1 YU2-L3+GG1 +P1-YAE2+G3 D1-YAE2 +NG3-O1+YE2 +BB1+WAE2 BB1 +D1-EU2 +G3-N1+WAE2 L3-N1 +WEO2-D3+SS1 WE2-D3+SS1 +YI2-N3+SS1 YO2-N3+SS1 +NG3-O1+YI2 +P1-YAE2+L3 D1-YAE2 +EU2-W3 +T1-YEO2 +P1-YAE2+M3 D1-YAE2 +P1-YAE2+N3 D1-YAE2 +B3-H1+OE2 G3-H1+OE2 +K1-YI2+B3 K1-YI2 +NG3-O1+YO2 +K1-YI2+D3 K1-YI2 +K1-YI2+G3 K1-YI2 +P1-YAE2+W3 D1-YAE2 +WI2-L3+JJ1 +NG3-O1+YU2 NG3-O1+YE2 +E2+NG3 E2 +K1-YI2+L3 K1-YI2 +K1-YI2+M3 K1-YI2 +K1-YI2+N3 K1-YI2 +M3-DD1 M3-DD1+YAE2 +N1-E2+NG3 N1-E2 +W3-S1+A2 +D3-JJ1+YEO2 D3-JJ1+OE2 +W3-G1+AE2 +W3-S1+E2 +AE2-L3+JJ1 +W3-C1+OE2 +K1-YI2+W3 K1-YI2 +W3-S1+I2 +L3-M1+YA2 L3-M1 +YA2-NG3+BB1 +YO2-G3+sil YI2-G3+sil +W3-S1+O2 +EU2-D3+B1 EU2-D3 +EU2-D3+C1 +L3-M1+YE2 L3-M1 +EU2-D3+D1 +WI2-N3+DD1 +EU2-D3+G1 +L3-M1+YI2 L3-M1 +W3-S1+U2 +EU2-D3+H1 EU2-D3 +M3-B1+WEO2 N3-B1+WEO2 +EU2-D3+J1 EU2-D3+C1 +EU2-D3+K1 EU2-D3 +OE2-N3+SS1 E2-N3+SS1 +EU2-D3+M1 +JJ1+YEO2 +L3-M1+YO2 +N3-G1+EO2 +EU2-D3+N1 YI2-D3+N1 +B3-BB1+EO2 G3-BB1+EO2 +EU2-D3+O1 +NG3-M1+YAE2 NG3-M1+WAE2 +EU2-D3+P1 EU2-D3 +AE2-N3+DD1 +A2-B3+B1 +A2-B3+C1 A2-B3+JJ1 +EU2-D3+R1 +A2-B3+D1 +EU2-D3+S1 +L3-M1+YU2 L3-M1 +N3-G1+EU2 +EU2-D3+T1 EU2-D3+R1 +B3-BB1+EU2 G3-BB1+EU2 +A2-B3+G1 +YU2-M3+JJ1 YI2-M3+JJ1 +A2-B3+H1 +A2-B3+J1 A2-B3+JJ1 +A2-B3+K1 A2-B3+GG1 +B3-P1+WEO2 P1 +sil-O1+WEO2 +A2-B3+M1 +W3-DD1+YAE2 W3-DD1+WAE2 +A2-B3+N1 +YAE2-N3+JJ1 YE2-N3+JJ1 +A2-B3+O1 EO2-B3+O1 +A2-N3+GG1 WA2-N3+GG1 +A2-B3+P1 A2-B3+BB1 +A2-B3+R1 A2-B3 +A2-B3+S1 +A2-B3+T1 A2-B3 +YAE2-B3+sil YU2-B3+sil +H1-AE2+NG3 +L3-S1+EO2 +D3-BB1+WA2 D3-BB1+E2 +B1-OE2 B1-OE2+B3 +D3-BB1+WE2 D3-BB1+E2 +M1-YO2+NG3 +L3-S1+EU2 +D3-BB1+WI2 D3-BB1+I2 +W3-H1+YAE2 H1 +SS1-YAE2+NG3 D1-YAE2 +YE2-L3+JJ1 YU2-L3+JJ1 +G3-D1+WAE2 B3-D1 +D3-O1+WAE2 B3-O1+OE2 +T1-WEO2+NG3 SS1-WEO2+M3 +YO2-NG3+SS1 +NG3-O1+A2 +M3-P1+A2 +YA2-NG3+DD1 +NG3-O1+E2 NG3-O1+AE2 +M3-P1+E2 N3-P1+OE2 +T1+OE2 W3-T1+OE2 +D3-R1+YEO2 B3-R1+YEO2 +NG3-O1+I2 NG3-O1+WI2 +M3-P1+I2 M3-P1+WI2 +T1-AE2+NG3 +NG3-O1+O2 +M3-P1+O2 NG3-P1+O2 +NG3+B1 WAE2-NG3+B1 +NG3+C1 WAE2-NG3+C1 +NG3-O1+U2 +M3-P1+U2 +NG3+D1 WAE2-NG3+D1 +M3-GG1 N3-GG1+YA2 +G1-YA2+NG3 G1-YA2+M3 +NG3+G1 WAE2-NG3+G1 +T1-YI2+B3 YI2+NG3 +NG3+H1 +NG3-S1+OE2 +T1-YI2+D3 YI2+NG3 +NG3+J1 WAE2-NG3+J1 +NG3+K1 WAE2-NG3+K1 +T1-YI2+G3 YI2+NG3 +NG3+M1 WAE2-NG3+M1 +NG3+N1 WAE2-NG3+N1 +NG3+O1 WAE2-NG3+O1 +NG3+P1 WAE2-NG3+P1 +R1+WA2 R1 +T1-YI2+L3 YI2+NG3 +NG3+R1 WAE2-NG3+R1 +T1-YI2+M3 YI2+NG3 +NG3+S1 WAE2-NG3+S1 +T1-YI2+N3 YI2+NG3 +NG3+T1 WAE2-NG3+T1 +R1+WE2 R1 +BB1+WEO2 BB1 +WI2-N3+GG1 +G3-N1+WEO2 L3-N1+WE2 +YAE2-L3+SS1 YU2-L3+SS1 +R1+WI2 N3-R1+I2 +D3-BB1+YA2 D3-BB1+E2 +BB1-WA2 S1-WA2 +T1-YI2+W3 YI2+NG3 +D3-BB1+YE2 D3-BB1+E2 +BB1-WE2 K1-WE2+NG3 +WA2-NG3+sil A2-NG3+sil +D3-BB1+YI2 D3-BB1+E2 +BB1-WI2 +AE2-N3+GG1 +S1-YA2+NG3 D1-YA2+N3 +D3-BB1+YO2 D3-BB1+E2 +K1-A2+NG3 +D3-BB1+YU2 D3-BB1+E2 +W3-G1+EO2 +N3-C1+WA2 +A2-N3+JJ1 +N3-C1+WE2 N3-C1 +JJ1-A2+B3 +OE2+B3 S1-OE2+B3 +W3-G1+EU2 +C1-YEO2+B3 +JJ1-A2+D3 +L3-B1+WAE2 L3-B1 +OE2+D3 S1-OE2+D3 +A2-B3+sil +C1-YEO2+D3 +N3-C1+WI2 +JJ1-A2+G3 +OE2+G3 S1-OE2+G3 +C1-YEO2+G3 T1-YEO2+G3 +N1-OE2+B3 +N1-OE2+D3 +R1-YO2+B3 +B3-D1+YAE2 B3-D1 +sil-C1+YAE2 sil-C1+WE2 +JJ1-A2+L3 +R1-YO2+D3 R1-YO2+B3 +OE2+L3 S1-OE2+D3 +JJ1-A2+M3 +C1-YEO2+L3 +N1-OE2+G3 N1-OE2+B3 +OE2+M3 B1-OE2+M3 +NG3-B1 NG3-B1+WE2 +JJ1-A2+N3 +C1-YEO2+M3 +OE2+N3 B1-OE2+N3 +NG3-C1 NG3-C1+YAE2 +C1-YEO2+N3 +R1-YO2+G3 R1-YO2+B3 +NG3-D1 NG3-D1+YAE2 +N1-OE2+L3 N1-OE2+D3 +NG3-G1 NG3-G1+OE2 +N1-OE2+M3 N1-OE2+NG3 +NG3-H1 NG3-H1+WAE2 +N1-OE2+N3 +R1-YO2+L3 R1-YO2+B3 +R1-YO2+M3 +NG3-M1+YEO2 NG3-M1+WAE2 +NG3-J1 NG3-J1+YAE2 +R1-YO2+N3 R1-YO2+M3 +NG3-K1 M3-K1+WEO2 +JJ1-A2+W3 +OE2+W3 S1-OE2+B3 +C1-YEO2+W3 +NG3-M1 NG3-M1+WAE2 +L3-O1+WA2 +NG3-N1 NG3-N1+WAE2 +NG3-O1 NG3-O1+YAE2 +NG3-P1 NG3-P1+WA2 +R1+YA2 NG3-R1+YA2 +L3-O1+WE2 L3-O1+OE2 +N1-OE2+W3 N1-OE2+B3 +NG3-R1 R1 +D3-B1+AE2 +NG3-S1 NG3-S1+WEO2 +R1-YO2+W3 R1-YO2+B3 +NG3-T1 NG3-T1+AE2 +R1+YE2 R1 +YA2-NG3+GG1 +L3-O1+WI2 +W3-DD1+YEO2 W3-DD1+WAE2 +O1-YEO2+B3 +R1+YI2 NG3-R1+YI2 +O1-YEO2+D3 +BB1-YA2 +H1-YEO2+NG3 +O1-YEO2+G3 +R1+YO2 NG3-R1+YO2 +NG3-T1+YAE2 NG3-T1+AE2 +BB1-YE2 SS1-YE2+NG3 +YO2-W3+BB1 +N3-D1+YAE2 N3-D1+AE2 +J1-YI2+NG3 G1-YI2 +O1-YEO2+L3 +BB1-YI2 P1-YI2+B3 +YE2-M3+B1 YA2-M3+B1 +O1-YEO2+M3 +YE2-M3+C1 YI2-M3+JJ1 +O1-YEO2+N3 +GG1-EU2+B3 +R1+YU2 NG3-R1+YU2 +YE2-M3+D1 WA2-M3+D1 +L3-D1+A2 +GG1-EU2+D3 +M3-JJ1 M3-JJ1+WAE2 +YE2-M3+G1 WA2-M3+G1 +BB1-YO2 BB1-YO2+B3 +YE2-M3+H1 WA2-M3+H1 +L3-D1+E2 +GG1-EU2+G3 GG1-EU2+B3 +YE2-M3+J1 WA2-M3+J1 +YE2-M3+K1 WA2-M3+K1 +L3-D1+I2 +C1-YAE2+B3 D1-YAE2 +O1-YEO2+W3 +YE2-M3+M1 WA2-M3+M1 +W3-H1+YEO2 +GG1-EU2+L3 +BB1-YU2 BB1-YU2+M3 +YE2-M3+N1 WA2-M3+N1 +B3-N1+AE2 +C1-YAE2+D3 D1-YAE2 +GG1-EU2+M3 GG1-EU2 +YE2-M3+O1 WA2-M3+O1 +N3-C1+YA2 N3-C1 +GG1-EU2+N3 +YE2-M3+P1 WA2-M3+P1 +B3-J1+OE2 G3-J1+OE2 +C1-YAE2+G3 D1-YAE2 +YE2-M3+R1 WA2-M3+R1 +L3-D1+O2 +YE2-M3+S1 WA2-M3+S1 +P1-YU2+B3 BB1-YU2+B3 +N3-C1+YE2 N3-C1 +G3-D1+WEO2 B3-D1 +YE2-M3+T1 WA2-M3+R1 +D1-A2+B3 +OE2-B3 E2-B3 +D3-O1+WEO2 G3-O1+WEO2 +P1-YU2+D3 BB1-YU2+B3 +D1-A2+D3 +OE2-D3 +C1-YAE2+L3 D1-YAE2 +N3-C1+YI2 N3-C1+EU2 +C1-YAE2+M3 D1-YAE2 +JJ1-OE2 JJ1-OE2+B3 +WI2-N3+JJ1 +P1-YU2+G3 BB1-YU2+B3 +L3-D1+U2 +C1-YAE2+N3 D1-YAE2 +GG1-EU2+W3 +D1-A2+G3 +OE2-G3 OE2-G3+C1 +A2-L3+SS1 +P1-YU2+L3 BB1-YU2+L3 +N3-C1+YO2 N3-C1 +P1-A2+B3 +D1-A2+L3 +P1-YU2+M3 BB1-YU2+M3 +OE2-L3 +D1-A2+M3 +P1-YU2+N3 BB1-YU2+N3 +OE2-M3 E2-M3 +WI2-B3+sil +P1-A2+D3 +D1-A2+N3 +OE2-N3 E2-N3 +C1-YAE2+W3 D1-YAE2 +W3-O1+YAE2 +P1-A2+G3 +N3-C1+YU2 N3-C1 +AE2-N3+JJ1 E2-N3+JJ1 +G3-GG1+A2 +GG1-YU2+NG3 GG1-YU2 +P1-A2+L3 +P1-YU2+W3 BB1-YU2+M3 +P1-A2+M3 +D1-A2+W3 +OE2-W3 OE2-W3+DD1 +P1-A2+N3 +G3-GG1+E2 +GG1-WAE2 GG1-WAE2+L3 +L3-O1+YA2 +AE2-B3+sil +B3-H1+WA2 +O1-YAE2+B3 O1-YAE2+NG3 +WI2-B3+B1 +G3-GG1+I2 +WI2-B3+C1 +O1-YAE2+D3 O1-YAE2+NG3 +WI2-B3+D1 +L3-O1+YE2 +B3-H1+WE2 B3-H1 +O1-YAE2+G3 O1-YAE2+NG3 +WI2-B3+G1 +P1-A2+W3 +WI2-B3+H1 WI2-B3 +L3-O1+YI2 +G3-GG1+O2 +B3-H1+WI2 G3-H1+WI2 +WI2-B3+J1 WI2-B3 +WI2-B3+K1 +O1-YAE2+L3 O1-YAE2+NG3 +O1-YAE2+M3 O1-YAE2+NG3 +WI2-B3+M1 +O1-YAE2+N3 O1-YAE2+NG3 +WI2-B3+N1 +L3-O1+YO2 +G3-GG1+U2 +T1-A2+NG3 +WI2-B3+O1 +WI2-B3+P1 +WI2-B3+R1 WI2-B3+D1 +WI2-B3+S1 WI2-B3+SS1 +YO2-W3+DD1 +WI2-B3+T1 +L3-O1+YU2 +W3-C1+WA2 +O1-YAE2+W3 O1-YAE2+NG3 +T1-WEO2+B3 SS1-WEO2 +O2-NG3+SS1 +T1-WEO2+D3 WEO2+D3 +W3-C1+WE2 C1 +T1-WEO2+G3 SS1-WEO2 +W3-C1+WI2 W3-C1+I2 +T1-WEO2+L3 SS1-WEO2+L3 +T1-WEO2+M3 SS1-WEO2+M3 +T1-WEO2+N3 SS1-WEO2+N3 +NG3-DD1+OE2 N3-DD1+OE2 +YAE2-D3+sil YO2-D3+sil +YA2-NG3+JJ1 YA2-NG3+DD1 +H1-YE2+NG3 H1-YE2+B3 +H1-AE2 +N3-C1+A2 N3-C1+WA2 +D1-OE2 +T1-WEO2+W3 SS1-WEO2 +N3-C1+E2 +N3-C1+I2 N3-C1+WI2 +L3-B1+WEO2 B1+WEO2 +WI2-L3+SS1 +GG1-E2+NG3 GG1-E2+M3 +J1-WA2+B3 JJ1-WA2+B3 +N3-C1+O2 +J1-WA2+D3 JJ1-WA2+D3 +sil-B1+AE2 +B3-D1+YEO2 B3-D1 +sil-C1+YEO2 sil-C1+WE2 +J1-WA2+G3 JJ1-WA2+B3 +B3-H1+YA2 G3-H1+YA2 +N3-C1+U2 +GG1-WI2+NG3 DD1-WI2+NG3 +AE2-L3+SS1 +YE2-B3+sil YU2-B3+sil +J1-WA2+L3 JJ1-WA2+L3 +J1-WA2+M3 J1-WA2+NG3 +B3-H1+YE2 G3-H1+YE2 +J1-WA2+N3 +O2-N3+B1 +O2-N3+C1 +O2-N3+D1 +B1-O2+B3 +B3-H1+YI2 D3-H1+I2 +B1-WA2 +WEO2-L3+BB1 EO2-L3+BB1 +B1-O2+D3 +O2-N3+G1 +O2-N3+H1 +T1-YE2+NG3 C1-YE2 +B1-O2+G3 +O2-N3+J1 +B1-WE2 K1-WE2+NG3 +J1-WA2+W3 JJ1-WA2+W3 +D1-EO2+B3 T1-EO2+B3 +T1-WAE2+B3 +O2-N3+K1 +B3-H1+YO2 +D3-B1+EO2 G3-B1+EO2 +D1-EO2+D3 +T1-WAE2+D3 +O2-N3+M1 +B3-K1+YAE2 L3-K1 +sil-J1+YAE2 sil-J1+WAE2 +O2-N3+N1 +B1-WI2 B1-WI2+NG3 +B1-O2+L3 +O2-N3+O1 +D1-EO2+G3 +B1-O2+M3 +G1-AE2+NG3 +T1-WAE2+G3 T1-WAE2+B3 +O2-N3+P1 +B1-O2+N3 +B3-H1+YU2 +D3-B1+EU2 +O2-N3+R1 +W3-C1+YA2 C1 +O2-N3+S1 +O2-N3+T1 +D1-EO2+L3 +T1-WAE2+L3 T1-WAE2+NG3 +D1-EO2+M3 +T1-WAE2+M3 T1-WAE2+NG3 +W3-C1+YE2 C1 +D1-EO2+N3 +NG3-T1+YEO2 NG3-T1+AE2 +T1-WAE2+N3 T1-WAE2+NG3 +N3-D1+YEO2 N3-D1+AE2 +B1-O2+W3 +W3-C1+YI2 D3-C1+EU2 +YU2-M3+SS1 YI2-M3+SS1 +T1+WA2 D3-T1+YEO2 +N3-K1+AE2 NG3-K1+AE2 +D1-EO2+W3 +T1-WAE2+W3 T1-WAE2+NG3 +W3-C1+YO2 C1 +N3-G1+OE2 +B3-BB1+OE2 B3-BB1+WAE2 +T1+WE2 D3-T1+YEO2 +I2-W3+sil +YAE2-N3+SS1 YO2-N3+SS1 +T1+WI2 W3-T1+WI2 +W3-C1+YU2 C1 +B3-N1+EO2 G3-N1+EO2 +B3-N1+EU2 +BB1-YEO2+B3 +S1-AE2+NG3 +YO2-W3+GG1 YO2-W3+K1 +BB1-YEO2+D3 +NG3-S1+WA2 NG3-S1+WEO2 +BB1-YEO2+G3 +NG3-S1+WE2 NG3-S1+WEO2 +C1-U2+NG3 +BB1-YEO2+L3 +NG3-S1+WI2 +BB1-YEO2+M3 +W3-O1+YEO2 +BB1-YEO2+N3 +L3-S1+OE2 +YE2-L3+SS1 YU2-L3+SS1 +D1-AE2+B3 +D1-AE2+D3 +GG1-WEO2 GG1-WEO2+B3 +A2-D3+sil +B1-YA2 +BB1-YEO2+W3 +D1-AE2+G3 D1-AE2+B3 +G1-WI2+B3 G1-WI2 +WEO2-L3+DD1 +G1-WI2+D3 G1-WI2 +B1-YE2 H1-YE2+B3 +WAE2-B3+B1 B3+B1 +D1-AE2+L3 +G1-WI2+G3 G1-WI2 +JJ1-YAE2+NG3 D1-YAE2 +WAE2-B3+C1 B3+C1 +D1-AE2+M3 D1-AE2 +WAE2-B3+D1 B3 +D1-AE2+N3 +B1-YI2 B1-YI2+B3 +WAE2-B3+G1 B3+G1 +G1-WI2+L3 G1-WI2 +WAE2-B3+H1 B3 +G1-WI2+M3 G1-WI2 +G1-WI2+N3 G1-WI2 +WAE2-B3+J1 B3+C1 +B1-YO2 +WAE2-B3+K1 B3+K1 +WAE2-B3+M1 B3+M1 +D1-AE2+W3 D1-AE2 +WAE2-B3+N1 B3+N1 +WAE2-B3+O1 B3+O1 +WAE2-B3+P1 B3+B1 +B1-YU2 +WAE2-B3+R1 B3 +G1-WI2+W3 G1-WI2 +WAE2-B3+S1 B3+S1 +T1+YA2 W3-T1+YA2 +WAE2-B3+T1 B3 +R1-YA2+NG3 +D3-D1+AE2 D3-D1+WAE2 +T1+YE2 D3-T1+YEO2 +T1+YI2 W3-T1+YI2 +BB1-YAE2+B3 D1-YAE2 +S1-WA2+B3 DD1-WA2+B3 +BB1-YAE2+D3 D1-YAE2 +S1-WA2+D3 DD1-WA2+D3 +T1+YO2 D3-T1+YEO2 +BB1-YAE2+G3 D1-YAE2 +NG3-G1+WAE2 NG3-G1+OE2 +S1-WA2+G3 DD1-WA2+B3 +WAE2-NG3+sil WEO2-NG3+sil +B1-YEO2+B3 +H1-EO2 +B1-YEO2+D3 +BB1-YAE2+L3 D1-YAE2 +T1+YU2 D3-T1+YEO2 +S1-WA2+L3 DD1-WA2+L3 +BB1-YAE2+M3 D1-YAE2 +NG3-S1+YA2 NG3-S1+WEO2 +S1-WA2+M3 DD1-WA2+NG3 +BB1-YAE2+N3 D1-YAE2 +S1-WA2+N3 D1-WA2+N3 +B1-YEO2+G3 +NG3-S1+YE2 NG3-S1+WEO2 +H1-EU2 +B1-YEO2+L3 +B1-YEO2+M3 +NG3-S1+YI2 NG3-S1+WEO2 +B1-YEO2+N3 +B3-P1+AE2 G3-P1+AE2 +NG3+sil WEO2-NG3+sil +BB1-YAE2+W3 D1-YAE2 +S1-WA2+W3 DD1-WA2+W3 +M1-EO2+B3 +M1-EO2+D3 +NG3-S1+YO2 +sil-B1+EO2 +R1-WE2+B3 K1-WE2+NG3 +M1-EO2+G3 +M1-E2+B3 +R1-WE2+D3 K1-WE2+NG3 +M1-E2+D3 M1-E2+B3 +B1-YEO2+W3 +NG3-S1+YU2 +R1-WE2+G3 K1-WE2+NG3 +I2+NG3 +B3-BB1+YAE2 B3-BB1+WAE2 +sil-B1+EU2 +M1-EO2+L3 +M1-E2+G3 M1-E2+B3 +A2-N3+SS1 +M1-EO2+M3 +M1-EO2+N3 +R1-WE2+L3 K1-WE2+NG3 +M1-E2+L3 +R1-WE2+M3 K1-WE2+NG3 +N1-I2+NG3 +M1-E2+M3 M1-E2 +WI2-D3+sil +R1-WE2+N3 K1-WE2+NG3 +GG1-OE2+B3 GG1-OE2 +M1-E2+N3 N1-E2 +N1-YEO2+B3 +GG1-OE2+D3 +W3-B1+WAE2 B1 +W3-K1+AE2 +N1-YEO2+D3 +M1-EO2+W3 +SS1-AE2 +GG1-OE2+G3 GG1-OE2 +W3-G1+OE2 B3-G1+OE2 +B3-N1+A2 +YO2-W3+JJ1 +N1-YEO2+G3 +B3-K1+YEO2 G3-K1+YEO2 +sil-J1+YEO2 sil-J1+WAE2 +R1-WE2+W3 K1-WE2+NG3 +M1-E2+W3 +B3-N1+E2 +GG1-OE2+L3 GG1-OE2+D3 +M3-D1+YAE2 N3-D1+AE2 +GG1-OE2+M3 +AE2-D3+sil OE2-D3+sil +N1-YEO2+L3 +GG1-OE2+N3 +B3-J1+WA2 +N1-YEO2+M3 +N3-P1+A2 +N1-YEO2+N3 +B3-N1+I2 +B3-J1+WE2 B3-J1 +N1-YU2+NG3 +S1+A2 +N3-P1+E2 N3-P1+OE2 +JJ1-WA2 C1-WA2 +B3-N1+O2 +B3-J1+WI2 B3-J1+EU2 +GG1-OE2+W3 GG1-OE2 +S1+E2 +N3-P1+I2 N3-P1+WI2 +B1-YAE2+B3 D1-YAE2 +N1-YEO2+W3 +JJ1-WE2 K1-WE2+NG3 +B1-YAE2+D3 D1-YAE2 +S1+I2 +N3-K1+EO2 NG3-K1+EO2 +B3-N1+U2 +JJ1-WI2 DD1-WI2+NG3 +WEO2-L3+GG1 +B1-YAE2+G3 D1-YAE2 +N3-P1+O2 NG3-P1+O2 +S1+O2 +N3-K1+EU2 +B1-YAE2+L3 D1-YAE2 +N3-H1+WAE2 +B1-YAE2+M3 D1-YAE2 +YEO2-W3+sil +N3-P1+U2 +B1-YAE2 D1-YAE2 +B1-YAE2+N3 D1-YAE2 +K1-EU2+B3 +M1-AE2+B3 M1-AE2 +S1+U2 W3-S1+U2 +K1-EU2+D3 +M1-AE2+D3 +D3-J1+YAE2 D3-J1+WAE2 +K1-EU2+G3 K1-EU2+B3 +M1-AE2+G3 +B1-YAE2+W3 D1-YAE2 +M3-SS1 W3-SS1+WE2 +K1-EU2+L3 +M1-AE2+L3 M1-AE2 +K1-EU2+M3 K1-EU2 +M1-AE2+M3 +K1-EU2+N3 +M1-AE2+N3 M1-AE2+M3 +J1-AE2 J1-AE2+B3 +R1-O2+NG3 +EO2-G3+BB1 +N1-YAE2+B3 N1-YAE2+NG3 +N1-YAE2+D3 N1-YAE2+NG3 +K1-EU2+W3 +M1-AE2+W3 +N1-YAE2+G3 N1-YAE2+NG3 +WI2-N3+SS1 +N1-YAE2+L3 N1-YAE2+NG3 +N1-YAE2+M3 N1-YAE2+NG3 +J1-YA2+B3 G1-YA2+B3 +W3-S1+WAE2 +N1-YAE2+N3 N1-YAE2+NG3 +J1-YA2+D3 G1-YA2+D3 +sil-D1+AE2 sil-D1+WAE2 +N1-WAE2+NG3 O1-WAE2 +J1-YA2+G3 G1-YA2+G3 +B3-J1+YA2 B3-J1 +NG3-DD1+WA2 M3-DD1+YAE2 +AE2-N3+SS1 E2-N3+SS1 +N1-YAE2+W3 N1-YAE2+NG3 +YE2-D3+sil YO2-D3+sil +J1-YA2+L3 G1-YA2+L3 +S1-WEO2+B3 SS1-WEO2 +J1-YA2+M3 G1-YA2+M3 +B3-J1+YE2 B3-J1 +J1-YA2+N3 G1-YA2+N3 +S1-WEO2+D3 WEO2+D3 +S1-A2 +NG3-DD1+WE2 M3-DD1+YAE2 +JJ1-YA2 YA2 +S1-WEO2+G3 SS1-WEO2 +B3-J1+YI2 B3-J1 +S1-E2 +D1-WA2 S1-WA2 +NG3-DD1+WI2 M3-DD1+WI2 +WEO2-N3+BB1 +JJ1-YE2 SS1-YE2+NG3 +S1-WEO2+L3 D1-WEO2+L3 +S1-I2 +D1-WE2 K1-WE2+NG3 +J1-YA2+W3 D1-YA2+W3 +S1-WEO2+M3 SS1-WEO2+M3 +D3-M1+A2 +B3-J1+YO2 G3-J1+YO2 +D3-D1+EO2 W3-D1+EO2 +S1-WEO2+N3 SS1-WEO2+N3 +JJ1-YI2 YI2+NG3 +D1-WI2 +D3-M1+E2 B3-M1+AE2 +S1-O2 +B3-J1+YU2 B3-J1 +D3-D1+EU2 G3-D1+EU2 +G1-YE2+NG3 G1-YE2 +JJ1-YO2 C1-YO2 +D3-M1+I2 M1+WI2 +I2-B3+BB1 WI2-B3+BB1 +S1-WEO2+W3 SS1-WEO2 +S1-YAE2 D1-YAE2 +S1-U2 S1-U2+NG3 +NG3-G1+WEO2 +JJ1-YU2 DD1-YU2+M3 +D3-M1+O2 +G3-P1+YAE2 P1 +YE2-NG3+sil WEO2-NG3+sil +N3-M1+AE2 NG3-M1+AE2 +D3-M1+U2 G3-M1+U2 +B3-P1+EO2 +EO2-G3+DD1 +WAE2 P1-WAE2 +B3-P1+EU2 +WEO2-L3+JJ1 +YA2-NG3+SS1 +B3-BB1+YEO2 B3-BB1+WAE2 +S1-YE2+NG3 H1-YE2+B3 +D3-SS1+WAE2 D3-SS1+WE2 +S1-WAE2+B3 +K1-E2+NG3 K1-E2 +S1-WAE2+D3 +W3+B1 WAE2-W3+B1 +W3+C1 YAE2-W3+C1 +W3+D1 WAE2-W3+D1 +S1-WAE2+G3 S1-WAE2+B3 +W3-B1+WEO2 B1+WEO2 +W3-K1+EO2 B3-K1+EO2 +NG3-DD1+YA2 M3-DD1+YAE2 +N3-G1+WA2 +B3-BB1+WA2 B3-BB1+WAE2 +W3+G1 WE2-W3+G1 +SS1-EO2 +W3+H1 YAE2-W3+H1 +S1-WAE2+L3 S1-WAE2+NG3 +W3+J1 YAE2-W3+J1 +S1-WAE2+M3 S1-WAE2+NG3 +NG3-DD1+YE2 M3-DD1+YAE2 +N3-G1+WE2 +B3-BB1+WE2 B3-BB1+WAE2 +W3+K1 YAE2-W3+K1 +S1-WAE2+N3 S1-WAE2+NG3 +K1-YO2+NG3 YO2+NG3 +W3-K1+EU2 B3-K1+EU2 +W3+M1 +SS1-EU2 +M3-D1+YEO2 N3-D1+AE2 +W3+N1 YAE2-W3+N1 +D1-YA2 D1-YA2+L3 +NG3-DD1+YI2 M3-DD1+YAE2 +N3-G1+WI2 +B3-BB1+WI2 +W3+O1 WE2-W3+O1 +G1-YI2+B3 G1-YI2 +W3+P1 YAE2-W3+P1 +WEO2-N3+DD1 EO2-N3+DD1 +T1-EU2+B3 +G1-YI2+D3 G1-YI2 +W3+R1 YA2-W3+R1 +D1-YE2 H1-YE2+B3 +T1-EU2+D3 +W3+S1 WAE2-W3+S1 +W3+T1 WAE2-W3+T1 +S1-WAE2+W3 S1-WAE2+NG3 +NG3-DD1+YO2 M3-DD1+YAE2 +G1-YI2+G3 G1-YI2 +SS1+WAE2 W3-SS1+WE2 +T1-EU2+G3 T1-EU2+B3 +D1-YI2 G1-YI2 +B3-O1+WAE2 B3-O1+OE2 +sil-N1+WAE2 +NG3-DD1+A2 M3-DD1+A2 +G1-YI2+L3 G1-YI2 +NG3-DD1+YU2 M3-DD1+YAE2 +G1-YI2+M3 G1-YI2 +T1-EU2+L3 +G1-YI2+N3 G1-YI2 +T1-EU2+M3 +D1-YO2 S1-YO2 +T1-EU2+N3 +NG3-DD1+E2 M3-DD1+E2 +I2-B3+DD1 WI2-B3+DD1 +M1-WEO2+NG3 +NG3-DD1+I2 M3-DD1+I2 +D1-YU2 D1-YU2+M3 +L3-S1+WA2 L3-S1 +N3-H1+WEO2 +R1-AE2+NG3 +G1-YI2+W3 G1-YI2 +M3-BB1+A2 NG3-BB1+A2 +B1-YEO2 +T1-EU2+W3 +L3-S1+WE2 L3-S1 +NG3-DD1+O2 M3-DD1+O2 +M3-BB1+E2 NG3-BB1+E2 +EO2-W3+B1 +D3-B1+OE2 +EO2-W3+C1 +L3-S1+WI2 +EO2-W3+D1 +D3-J1+YEO2 D3-J1+WAE2 +NG3-JJ1+YAE2 NG3-JJ1+WAE2 +M3-BB1+I2 NG3-BB1+I2 +NG3-DD1+U2 M3-DD1+U2 +EO2-W3+G1 +EO2-W3+H1 +S1-YA2+B3 D1-YA2+B3 +EO2-W3+J1 +B1-YAE2+NG3 D1-YAE2 +S1-YA2+D3 D1-YA2+B3 +EO2-W3+K1 WEO2-W3+K1 +M3-BB1+O2 NG3-BB1+O2 +L3-JJ1+WAE2 L3-JJ1 +EO2-W3+M1 +S1-YA2+G3 D1-YA2+B3 +EO2-W3+N1 +G3-C1+AE2 +EO2-W3+O1 +EO2-W3+P1 +N3-O1+WAE2 +J1-EO2 +M3-BB1+U2 +EO2-W3+R1 +S1-YA2+L3 D1-YA2+L3 +EO2-W3+S1 WEO2-W3+S1 +S1-YA2+M3 D1-YA2+M3 +EO2-W3+T1 +S1-YA2+N3 D1-YA2+N3 +J1-EU2 +W3-B1 B1 +J1-I2+B3 +sil-B1+A2 +W3-C1 C1 +W3-D1 W3-D1+WEO2 +J1-I2+D3 +B3-R1+AE2 NG3-R1+AE2 +S1-YA2+W3 D1-YA2+W3 +sil-B1+E2 +N3-G1+YA2 N3-G1 +B3-BB1+YA2 B3-BB1+WAE2 +W3-G1 G1 +J1-I2+G3 +E2-L3+sil +B3-N1+OE2 +W3-S1+WEO2 S1+WEO2 +W3-H1 H1 +W3-J1 W3-J1+WAE2 +sil-D1+EO2 +sil-B1+I2 +N3-G1+YE2 N3-G1 +B3-BB1+YE2 B3-BB1+WAE2 +R1-YE2+B3 +W3-K1 W3-K1+WEO2 +J1-I2+L3 +R1-YE2+D3 R1-YE2+B3 +W3-M1 W3-M1+WAE2 +J1-I2+M3 +W3-N1 L3-N1 +J1-I2+N3 +N3-G1+YI2 +B3-BB1+YI2 B3-BB1+WAE2 +W3-O1 +DD1-YO2+NG3 +R1-YE2+G3 R1-YE2+B3 +W3-P1 P1 +sil-D1+EU2 +sil-B1+O2 +W3-R1 R1 +W3-S1 S1 +W3-T1 T1 +N3-G1+YO2 +B3-BB1+YO2 B3-BB1+WAE2 +R1-YE2+L3 R1-YE2+B3 +EO2-G3+GG1 EO2-G3+K1 +R1-YE2+M3 R1-YE2+B3 +sil-B1+U2 sil-B1+EU2 +R1-YE2+N3 R1-YE2+B3 +J1-I2+W3 +W3-M1+AE2 +N3-G1+YU2 +B3-BB1+YU2 B3-BB1+WAE2 +W3+sil WE2-W3+sil +R1-YE2+W3 R1-YE2+B3 +P1+WAE2 W3-P1+OE2 +L3-S1+YA2 L3-S1 +YO2-M3+sil WAE2-M3+sil +L3-S1+YE2 L3-S1 +S1-YEO2 +L3-S1+YI2 L3-S1 +YEO2-B3+BB1 B3+B1 +G3-P1+YEO2 W3-P1+YEO2 +C1-O2+B3 +C1-O2+D3 +L3-S1+YO2 +N3-M1+EO2 D3-M1+EO2 +T1-E2+NG3 T1-E2 +EU2-G3+B1 +C1-O2+G3 +EU2-G3+C1 +WEO2-N3+GG1 YE2-N3+GG1 +EU2-G3+D1 +L3-S1+YU2 +EU2-G3+G1 +N3-M1+EU2 D3-M1+EU2 +C1-O2+L3 C1-O2 +EU2-G3+H1 +C1-O2+M3 +W3-G1+WA2 +C1-O2+N3 +EU2-G3+J1 EU2-G3+D1 +EU2-G3+K1 EU2-G3 +C1-YU2+B3 DD1-YU2+B3 +W3-G1+WE2 +EU2-G3+M1 +WEO2 WEO2+B3 +EU2-G3+N1 EU2-G3+M1 +C1-YU2+D3 DD1-YU2+B3 +EU2-G3+O1 +EU2-G3+P1 +YU2-G3+sil +W3-G1+WI2 +I2-B3+GG1 WI2-B3+GG1 +C1-YU2+G3 DD1-YU2+B3 +EU2-G3+R1 EU2-G3+C1 +WE2-G3+BB1 YAE2-G3+P1 +C1-O2+W3 +EU2-G3+S1 +M1-YEO2+B3 +EU2-G3+T1 EU2-G3+C1 +NG3-BB1+WAE2 NG3-BB1+E2 +M1-YEO2+D3 +D3-SS1+WEO2 D3-SS1+WE2 +C1-YU2+L3 DD1-YU2+L3 +C1-YU2+M3 C1-YU2 +C1-YU2+N3 DD1-YU2+N3 +M1-YEO2+G3 B1-YEO2+G3 +L3-D1+YAE2 +H1-YI2+NG3 H1-YI2+B3 +M1-YEO2+L3 +M1-YEO2+M3 +H1-OE2 H1-OE2+B3 +M1-YEO2+N3 +C1-YU2+W3 C1-YU2 +M1-YU2+NG3 +K1-OE2+B3 K1-OE2 +M1-YEO2+W3 +GG1-I2+NG3 +K1-OE2+D3 K1-OE2 +K1-OE2+G3 K1-OE2 +SS1+WEO2 W3-SS1+WE2 +sil-B1+OE2 sil-B1+E2 +B3-O1+WEO2 G3-O1+WEO2 +sil-N1+WEO2 +K1-OE2+L3 K1-OE2 +M3-H1+WAE2 N3-H1+WAE2 +K1-OE2+M3 K1-OE2+NG3 +G1-A2+NG3 +K1-OE2+N3 P1-OE2+N3 +YO2-W3+SS1 WAE2-W3+SS1 +YEO2-B3+DD1 B3 +T1-YI2+NG3 YI2+NG3 +K1-OE2+W3 K1-OE2 +NG3-R1+A2 B3-R1+A2 +M3-S1+A2 +YO2+B3 YO2 +NG3-R1+E2 N3-R1+E2 +M3-S1+E2 +YO2+D3 YO2 +NG3-JJ1+YEO2 NG3-JJ1+WAE2 +NG3-R1+I2 N3-R1+I2 +EO2-G3+JJ1 EO2-G3+C1 +M3-S1+I2 M3-S1+WI2 +YO2+G3 +W3-G1+YA2 B3-G1+YA2 +N1-YO2+B3 +M1-YAE2+B3 D1-YAE2 +N1-YO2+D3 N1-YO2+B3 +I2-D3+BB1 +SS1-AE2+NG3 +W3-G1+YE2 +M1-YAE2+D3 D1-YAE2 +YO2+L3 YO2 +NG3-R1+O2 N3-R1+O2 +M3-S1+O2 +N1-YO2+G3 N1-YO2+B3 +YO2+M3 +L3-JJ1+WEO2 JJ1+WEO2 +YO2+N3 YO2+M3 +M1-YAE2+G3 D1-YAE2 +G3-C1+EO2 +W3-G1+YI2 B3-G1+YI2 +G3-C1+WAE2 G3-C1 +N3-O1+WEO2 +N1-YO2+L3 N1-YO2+B3 +D3-N1+WAE2 L3-N1 +NG3-R1+U2 N3-R1+U2 +M3-S1+U2 +N1-YO2+M3 +WE2-G3+DD1 YAE2-G3+R1 +M1-YAE2+L3 D1-YAE2 +N1-YO2+N3 N1-YO2+M3 +N3-O1+AE2 N3-O1 +M1-YAE2+M3 D1-YAE2 +G3-C1+EU2 +W3-G1+YO2 +M1-YAE2+N3 D1-YAE2 +N3-K1+OE2 B3-K1+OE2 +YO2+W3 YO2 +W3-G1+YU2 B3-G1+YU2 +EO2-NG3 WEO2-NG3+R1 +N1-YO2+W3 N1-YO2+B3 +B3-R1+EO2 NG3-R1+EO2 +M1-YAE2+W3 D1-YAE2 +R1-WEO2+B3 R1-WEO2 +YA2-G3+BB1 YA2-G3+P1 +R1-WEO2+D3 +B3-R1+EU2 NG3-R1+EU2 +WEO2-N3+JJ1 +R1-WEO2+G3 R1-WEO2 +NG3-BB1 NG3-BB1+E2 +R1-WEO2+L3 +R1-WEO2+M3 R1-WEO2+NG3 +R1-WEO2+N3 +WEO2-B3+sil YU2-B3+sil +YI2-L3+sil YO2-L3+sil +O2-D3+B1 +O2-D3+C1 +O2-D3+D1 +B1-E2+B3 +B1-E2+D3 +I2-B3+JJ1 WI2-B3+JJ1 +O2-D3+G1 +W3-M1+EO2 +O2-D3+H1 +R1-WEO2+W3 R1-WEO2 +B1-E2+G3 B1-E2+B3 +O2-D3+J1 +O2-D3+K1 O2-D3+H1 +O2-D3+M1 +W3-M1+EU2 B3-M1+EU2 +O2-D3+N1 +P1+WEO2 P1 +L3-DD1+YAE2 L3-DD1 +B1-E2+L3 +O2-D3+O1 +B1-E2+M3 B1-E2+NG3 +O2-D3+P1 O2-D3+BB1 +B1-E2+N3 +O2-D3+R1 +O2-D3+S1 +O2-D3+T1 +YO2-B3 B3 +OE2+NG3 J1-OE2+NG3 +NG3-B1+YAE2 NG3-B1+WE2 +YO2-D3 D3 +sil-O1+A2 +B1-E2+W3 B1-E2+NG3 +YO2-G3 +sil-O1+E2 +YO2-L3 L3 +I2-D3+DD1 +YO2-M3 M3 +sil-O1+I2 +YO2-N3 N3 +sil-SS1+WAE2 sil-SS1+WE2 +G3-T1+WAE2 D3-T1+YEO2 +sil-O1+O2 +R1-YE2+NG3 R1-YE2+B3 +D3-H1+AE2 +R1-WAE2+B3 T1-WAE2+B3 +YO2-W3 +D3-D1+OE2 D3-D1+WAE2 +R1-WAE2+D3 T1-WAE2+D3 +sil-O1+U2 +YE2-M3+BB1 YAE2-M3+BB1 +OE2-L3+sil +T1-OE2+B3 +R1-WAE2+G3 T1-WAE2+B3 +T1-OE2+D3 T1-OE2+B3 +NG3-BB1+WEO2 NG3-BB1+E2 +DD1-WI2+B3 DD1-WI2+NG3 +T1-OE2+G3 T1-OE2+B3 +YEO2-B3+GG1 B3+K1 +DD1-WI2+D3 DD1-WI2+NG3 +R1-WAE2+L3 T1-WAE2+NG3 +R1-WAE2+M3 T1-WAE2+NG3 +YA2-G3+DD1 +R1-WAE2+N3 T1-WAE2+NG3 +J1-YO2+NG3 C1-YO2 +DD1-WI2+G3 DD1-WI2+NG3 +T1-OE2+L3 T1-OE2+B3 +L3-D1+YEO2 L3-D1+YAE2 +T1-OE2+M3 T1-OE2+NG3 +P1-A2+NG3 +T1-OE2+N3 +DD1-WI2+L3 DD1-WI2+NG3 +DD1-WI2+M3 DD1-WI2+NG3 +DD1-WI2+N3 DD1-WI2+NG3 +NG3-DD1 M3-DD1+YAE2 +R1-WAE2+W3 T1-WAE2+NG3 +S1-O2+B3 +O2-G3+BB1 +L3-DD1+A2 +WEO2-L3+SS1 EO2-L3+SS1 +S1-O2+D3 +T1-OE2+W3 T1-OE2+B3 +S1-O2+G3 +B3-T1+AE2 W3-T1+AE2 +L3-DD1+E2 +E2-N3+sil +B3-P1+OE2 G3-P1+OE2 +D3-B1+WA2 G3-B1+WA2 +DD1-WI2+W3 DD1-WI2+NG3 +L3-G1+A2 +WE2-G3+GG1 YAE2-G3+K1 +L3-DD1+I2 DD1+I2 +S1-O2+L3 +D3-B1+WE2 D3-B1+YAE2 +S1-O2+M3 +L3-G1+E2 G1+E2 +S1-O2+N3 +B3+BB1 B3+B1 +D3-B1+WI2 +L3-G1+I2 L3-G1+WI2 +M3-H1+WEO2 +L3-DD1+O2 DD1+O2 +YU2-W3+BB1 YAE2-W3+BB1 +S1-O2+W3 +L3-G1+O2 +L3-DD1+U2 +NG3-S1+YAE2 NG3-S1+WEO2 +N3-C1+YAE2 N3-C1 +W3-O1+AE2 +D3-JJ1+A2 W3-JJ1+A2 +D1-YA2+NG3 D1-YA2+N3 +L3-G1+U2 +W3-K1+OE2 +SS1-OE2 JJ1-OE2+B3 +D3-JJ1+E2 G3-JJ1+AE2 +SS1-WI2+B3 DD1-WI2+NG3 +SS1-WI2+D3 DD1-WI2+NG3 +B3-N1+WA2 +D3-JJ1+I2 +M3-O1+WAE2 N3-O1+WAE2 +SS1-WI2+G3 DD1-WI2+NG3 +B3-N1+WE2 +D3-JJ1+O2 D3-JJ1+OE2 +SS1-WI2+L3 DD1-WI2+NG3 +SS1-WI2+M3 DD1-WI2+NG3 +B3-N1+WI2 M3-N1+WI2 +SS1-WI2+N3 DD1-WI2+NG3 +YEO2-D3+BB1 +G3-C1+WEO2 G3-C1+EO2 +YE2-M3+DD1 WA2-M3+R1 +D3-N1+WEO2 L3-N1+WE2 +D3-JJ1+U2 B3-JJ1+U2 +N3-O1+EO2 +SS1-WI2+W3 DD1-WI2+NG3 +N3-O1+EU2 +M3-GG1+A2 NG3-GG1+A2 +W3-N1+YAE2 L3-N1+YAE2 +P1-YA2+NG3 K1-YA2+M3 +M3-GG1+E2 NG3-GG1+E2 +I2-D3+GG1 +M3-GG1+I2 M3-GG1+WI2 +D1+YAE2 D1 +O2-G3+DD1 +D3-B1+YA2 D3-B1+YAE2 +M3-GG1+O2 NG3-GG1+O2 +W3-GG1+YAE2 W3-GG1+WE2 +D3-B1+YE2 D3-B1+YAE2 +M3-GG1+U2 L3-GG1+U2 +N1-AE2 N1-AE2+B3 +D3-B1+YI2 +J1-OE2 J1-OE2+B3 +B3+DD1 B3 +YU2-W3+DD1 +B3-D1+A2 +D3-B1+YO2 D3-B1+YAE2 +YEO2-B3+JJ1 B3+C1 +L3-DD1+YEO2 L3-DD1 +D1-WI2+B3 +B3-D1+E2 B3-D1 +YA2-G3+GG1 +D1-WI2+D3 +D3-B1+YU2 +B3-D1+I2 G3-D1+I2 +D1-WI2+G3 D1-WI2+B3 +sil-H1+AE2 +NG3-B1+YEO2 NG3-B1+WE2 +sil-D1+OE2 +NG3-GG1 N3-GG1+YA2 +D1-WI2+L3 +B3-D1+O2 G3-D1+O2 +D1-WI2+M3 D1-WI2 +B3-N1+YA2 L3-N1+YA2 +D1-WI2+N3 D1-WI2+L3 +B3-N1+YE2 +B3-D1+U2 G3-D1+U2 +JJ1-YEO2+B3 +sil-SS1+WEO2 sil-SS1+WE2 +B3-N1+YI2 +JJ1-YEO2+D3 +WE2-G3+JJ1 YAE2-G3+C1 +H1-WA2 +D1-WI2+W3 +YEO2-D3+DD1 +JJ1-YEO2+G3 +G3-T1+WEO2 D3-T1+YEO2 +H1-WE2 K1-WE2+NG3 +B3-N1+YO2 M3-N1+YO2 +D3-H1+EO2 B3-H1+EO2 +JJ1-YEO2+L3 J1-YEO2+L3 +H1-WI2 H1-WI2+NG3 +JJ1-YEO2+M3 +JJ1-YEO2+N3 J1-YEO2+N3 +P1-WA2+B3 DD1-WA2+B3 +B3-N1+YU2 +D3-H1+EU2 B3-H1+EU2 +G1-YI2+NG3 G1-YI2 +P1-WA2+D3 DD1-WA2+D3 +sil-B1+WA2 +P1-WA2+G3 DD1-WA2+B3 +JJ1-YEO2+W3 +sil-B1+WE2 sil-B1+YAE2 +P1-WA2+L3 DD1-WA2+L3 +P1-WA2+M3 DD1-WA2+NG3 +P1-WA2+N3 DD1-WA2+N3 +sil-B1+WI2 sil-B1+I2 +N3-M1+OE2 NG3-M1+E2 +NG3-BB1+AE2 M3-BB1+AE2 +P1-WA2+W3 +B3-T1+EO2 W3-T1+EO2 +L3-H1+WAE2 L3-H1 +YE2-M3+GG1 YAE2-M3+GG1 +sil-JJ1+A2 +B3-T1+EU2 G3-T1+EU2 +sil-JJ1+E2 sil-JJ1+AE2 +B3-J1+YAE2 B3-J1 +sil-JJ1+I2 +S1-YI2+NG3 G1-YI2 +K1-I2+NG3 +WEO2-D3+sil YO2-D3+sil +YI2-N3+sil N3+sil +BB1-I2+B3 +sil-JJ1+O2 sil-JJ1+OE2 +JJ1-YAE2+B3 D1-YAE2 +NG3-S1+YEO2 +BB1-I2+D3 BB1-I2+B3 +K1-I2+B3 +JJ1-YAE2+D3 D1-YAE2 +N3-C1+YEO2 N3-C1 +K1-I2+D3 +I2-D3+JJ1 I2-D3+C1 +W3-O1+EO2 +N3-K1+WA2 NG3-K1+WA2 +BB1-I2+G3 +JJ1-YAE2+G3 D1-YAE2 +O2-G3+GG1 +sil-JJ1+U2 +K1-I2+G3 +D3-C1+A2 D3-C1+WA2 +N3-K1+WE2 M3-K1+WEO2 +WE2+B3 K1-WE2+NG3 +BB1-I2+L3 +W3-O1+EU2 +JJ1-YAE2+L3 D1-YAE2 +BB1-I2+M3 +WE2+D3 K1-WE2+NG3 +JJ1-YAE2+M3 D1-YAE2 +BB1-I2+N3 +H1-YA2 H1-YA2+L3 +K1-I2+L3 +D3-C1+E2 +N3-K1+WI2 M3-K1+I2 +JJ1-YAE2+N3 D1-YAE2 +K1-I2+M3 +K1-I2+N3 +M3-O1+WEO2 N3-O1+WEO2 +WE2+G3 K1-WE2+NG3 +YI2-L3+B1 YU2-L3+B1 +N1-WE2+B3 O1-WE2+B3 +H1-YE2 H1-YE2+B3 +YI2-L3+C1 YU2-L3+JJ1 +D3-C1+I2 D3-C1+WI2 +YI2-L3+D1 YU2-L3+D1 +W3-BB1 W3-BB1+YAE2 +N1-WE2+D3 O1-WE2+B3 +B3+GG1 B3+K1 +WE2+L3 K1-WE2+NG3 +R1-YAE2+NG3 D1-YAE2 +H1-YI2 H1-YI2+B3 +YI2-L3+G1 YA2-L3+G1 +N1-WE2+G3 O1-WE2+B3 +WE2+M3 K1-WE2+NG3 +YU2-W3+GG1 +BB1-I2+W3 +YI2-L3+H1 YU2-L3+H1 +WE2+N3 K1-WE2+NG3 +JJ1-YAE2+W3 D1-YAE2 +D3-C1+O2 +YU2-N3+B1 YI2-N3+B1 +K1-I2+W3 K1-I2 +YI2-L3+J1 YU2-L3+JJ1 +YU2-N3+C1 +YI2-L3+K1 YU2-L3+GG1 +N3-J1+YAE2 N3-J1+EO2 +YU2-N3+D1 +N1-WE2+L3 O1-WE2+B3 +H1-YO2 H1-YO2+B3 +YI2-L3+M1 YU2-L3+M1 +YA2-G3+JJ1 YA2-G3+C1 +N1-WE2+M3 O1-WE2+B3 +YI2-L3+N1 YU2-L3+N1 +L3-T1+A2 +N1-WE2+N3 O1-WE2+N3 +sil-B1+YA2 sil-B1+YAE2 +YU2-N3+G1 +YI2-L3+O1 YU2-L3+O1 +D3-C1+U2 G3-C1+U2 +G1-WAE2+NG3 G1-WAE2+M3 +YU2-N3+H1 +YI2-L3+P1 YU2-L3+BB1 +GG1-YO2+B3 GG1-YO2 +WE2+W3 K1-WE2+NG3 +YU2-N3+J1 +YI2-L3+R1 YA2-L3+R1 +L3-T1+E2 L3-T1+AE2 +sil-B1+YE2 sil-B1+YAE2 +GG1-YO2+D3 GG1-YO2 +YU2-N3+K1 +H1-YU2 H1-YU2+M3 +YI2-L3+S1 YU2-L3+S1 +E2-N3+B1 +EO2-G3+SS1 +YI2-L3+T1 YU2-L3+T1 +E2-N3+C1 +YU2-N3+M1 YO2-N3+M1 +E2-N3+D1 +GG1-YO2+G3 +YU2-N3+N1 YI2-N3+N1 +B3-SS1+YAE2 B3-SS1+WE2 +L3-T1+I2 +NG3-JJ1 NG3-JJ1+WAE2 +sil-B1+YI2 sil-B1+YAE2 +YU2-N3+O1 YI2-N3+O1 +N1-WE2+W3 O1-WE2+B3 +YU2-N3+P1 YI2-N3+P1 +W3-N1+YEO2 L3-N1+YEO2 +D3-J1+AE2 +E2-N3+G1 +E2-N3+H1 +YU2-N3+R1 YI2-N3+R1 +GG1-YO2+L3 GG1-YO2 +YU2-N3+S1 +E2-N3+J1 +GG1-YO2+M3 BB1-YO2+M3 +YU2-N3+T1 YI2-N3+T1 +M1-WI2+B3 N1-WI2+B3 +L3-T1+O2 +E2-N3+K1 +sil-B1+YO2 sil-B1+YAE2 +GG1-YO2+N3 BB1-YO2+M3 +OE2-N3+sil +D1+YEO2 D1 +M1-WI2+D3 N1-WI2+B3 +E2-N3+M1 +E2-N3+N1 +E2-N3+O1 +M1-WI2+G3 N1-WI2+B3 +DD1-YI2+B3 DD1-YI2 +E2-N3+P1 +L3-T1+U2 +sil-B1+YU2 sil-B1+YAE2 +YEO2-D3+GG1 YEO2-D3+BB1 +W3-GG1+YEO2 +DD1-YI2+D3 DD1-YI2 +E2-N3+R1 +E2-N3+S1 +E2-N3+T1 AE2-N3+T1 +GG1-YO2+W3 GG1-YO2 +M1-WI2+L3 N1-WI2+NG3 +G3-G1+AE2 D3-G1+AE2 +DD1-YI2+G3 DD1-YI2 +M1-WI2+M3 N1-WI2+NG3 +M3+B1 YA2-M3+B1 +M1-WI2+N3 N1-WI2+N3 +G3-C1+OE2 D3-C1+OE2 +M3+C1 YI2-M3+JJ1 +N1-EO2 N1-EO2+D3 +M3+D1 WA2-M3+D1 +DD1-YI2+L3 DD1-YI2 +DD1-YI2+M3 DD1-YI2 +SS1-OE2+NG3 DD1-OE2+NG3 +M3+G1 WA2-M3+G1 +DD1-YI2+N3 DD1-YI2 +M3+H1 WA2-M3+H1 +N1-EU2 N1-EU2+W3 +M3+J1 WA2-M3+J1 +M3+K1 WA2-M3+K1 +M1-WI2+W3 +WEO2-N3+SS1 YO2-N3+SS1 +K1+YAE2 L3-K1 +G1-EU2+B3 +M3+M1 WA2-M3+M1 +M3+N1 WA2-M3+N1 +G1-EU2+D3 +M3+O1 WA2-M3+O1 +N3-K1+YA2 M3-K1+WEO2 +M3+P1 WA2-M3+P1 +B3-R1+OE2 NG3-R1+OE2 +D3-D1+WA2 D3-D1+WAE2 +DD1-YI2+W3 DD1-YI2 +G1-EU2+G3 G1-EU2+B3 +M3+R1 WA2-M3+R1 +sil-H1+EO2 +M3+S1 WA2-M3+S1 +N3-K1+YE2 M3-K1+WEO2 +M3+T1 WA2-M3+R1 +D3-D1+WE2 D3-D1+WAE2 +WE2-B3 B3 +WE2-D3 D3 +G1-EU2+L3 +N3-K1+YI2 N3-K1+I2 +D3+BB1 WE2-D3+BB1 +G1-EU2+M3 +D3-D1+WI2 +O2+NG3 H1-O2+NG3 +G1-EU2+N3 +sil-H1+EU2 +I2-B3+SS1 WI2-B3+SS1 +WE2-G3 G3 +N3-K1+YO2 NG3-K1+YO2 +W3-DD1 +WE2-L3 L3 +YE2-M3+JJ1 YI2-M3+JJ1 +N1-O2+NG3 +WE2-M3 M3 +WE2-N3 N3 +G1-EU2+W3 +D1-AE2+NG3 +N3-K1+YU2 NG3-K1+YU2 +W3-M1+OE2 W3-M1+E2 +YO2-NG3+sil +SS1-YI2+B3 YI2+NG3 +EO2-M3+B1 +WE2-W3 W3 +EO2-M3+C1 +SS1-YI2+D3 YI2+NG3 +EO2-M3+D1 +B3-P1+WA2 W3-P1+WA2 +SS1-YI2+G3 YI2+NG3 +EO2-M3+G1 +EO2-M3+H1 +WEO2-NG3 WEO2-NG3+R1 +B3-P1+WE2 P1 +EO2-M3+J1 +JJ1-WAE2 BB1-WAE2+NG3 +EO2-M3+K1 +SS1-YI2+L3 YI2+NG3 +O2-G3+JJ1 +SS1-YI2+M3 YI2+NG3 +EO2-M3+M1 +B3-P1+WI2 B3-P1+I2 +SS1-YI2+N3 YI2+NG3 +EO2-M3+N1 +EO2-M3+O1 +EO2-M3+P1 +EO2-M3+R1 +T1-I2+NG3 DD1-I2+NG3 +EO2-M3+S1 +N3-S1+A2 +EO2-M3+T1 +SS1-YI2+W3 YI2+NG3 +N3-S1+E2 +B3+JJ1 B3+C1 +M3-B1 N3-B1+WE2 +NG3-BB1+EO2 N3-BB1+EO2 +W3-K1+WA2 B3-K1+WA2 +M3-C1 M3-C1+WAE2 +YU2-W3+JJ1 +M3-D1 N3-D1+AE2 +SS1-WA2 S1-WA2 +N3-S1+I2 +L3-H1+WEO2 +P1-AE2+NG3 +W3-K1+WE2 W3-K1+WEO2 +M3-G1 N3-G1 +M3-H1 M3-H1+WE2 +SS1-WE2 K1-WE2+NG3 +NG3-BB1+EU2 N3-BB1+EU2 +M3-J1 N3-J1+EO2 +N3-S1+O2 +W3-K1+WI2 B3-K1+WI2 +M3-K1 M3-K1+WEO2 +SS1-WI2 DD1-WI2+NG3 +B3-J1+YEO2 G3-J1+YEO2 +M3-M1 M1+WE2 +M3-N1 +M3-C1+YAE2 M3-C1+WAE2 +M3-O1 N3-O1 +M3-P1 N3-P1+WAE2 +N3-S1+U2 +D3-D1+YA2 D3-D1+WAE2 +C1-YA2+NG3 K1-YA2+M3 +M3-R1 R1 +YAE2-L3+sil YO2-L3+sil +M3-S1 M3-S1+WA2 +M3-T1 NG3-T1+AE2 +D3-D1+YE2 D3-D1+WAE2 +P1-AE2 P1-AE2+M3 +R1-U2+NG3 R1-U2+M3 +EO2-M3+BB1 +D3-D1+YI2 D3-D1+WAE2 +D3-DD1+WAE2 D3-DD1+WA2 +L3-O1+WAE2 L3-O1+OE2 +D3+DD1 WE2-D3+DD1 +D3-D1+YO2 D3-D1+WAE2 +YEO2-D3+JJ1 EO2-D3+JJ1 +D1-YI2+B3 G1-YI2 +sil-P1+YAE2 sil-P1+WAE2 +D1-YI2+D3 G1-YI2 +D3-D1+YU2 D3-D1+WAE2 +BB1+A2 L3-BB1+A2 +D1-YI2+G3 G1-YI2 +N3-G1+WAE2 N3-G1 +sil-J1+AE2 +BB1+E2 BB1 +D1-YI2+L3 G1-YI2 +D1-YI2+M3 G1-YI2 +B3-P1+YA2 P1 +D1-YI2+N3 G1-YI2 +BB1+I2 L3-BB1+I2 +N3-J1+YEO2 N3-J1+EO2 +C1-E2+B3 +G1-E2+NG3 G1-E2+M3 +C1-E2+D3 C1-E2+B3 +B3-P1+YE2 W3-P1+YE2 +O1-YA2+NG3 O1-YA2+M3 +C1-E2+G3 C1-E2+B3 +BB1+O2 L3-BB1+O2 +EU2-G3+BB1 EU2-G3 +B3-P1+YI2 P1 +J1-WA2 C1-WA2 +D1-YI2+W3 G1-YI2 +C1-E2+L3 C1-E2+NG3 +C1-E2+M3 C1-E2+NG3 +B3-SS1+YEO2 B3-SS1+WE2 +BB1+U2 +J1-WE2 K1-WE2+NG3 +C1-E2+N3 C1-E2+NG3 +YEO2-L3+B1 YU2-L3+B1 +B3-P1+YO2 W3-P1+YO2 +YEO2-L3+C1 +D3-J1+EO2 +YEO2-L3+D1 +J1-WI2 J1-WI2+NG3 +YEO2-L3+G1 YA2-L3+G1 +P1-EU2+B3 +YEO2-L3+H1 +P1-YA2+B3 K1-YA2+B3 +W3-GG1 W3-GG1+WE2 +B3-P1+YU2 P1 +P1-EU2+D3 +D3-J1+EU2 B3-J1+EU2 +W3-K1+YA2 W3-K1+WEO2 +YEO2-L3+J1 YEO2-L3+C1 +P1-YA2+D3 K1-YA2+B3 +C1-E2+W3 C1-E2+NG3 +SS1-YA2 DD1-YA2 +YEO2-L3+K1 +P1-EU2+G3 P1-EU2+B3 +YEO2-L3+M1 YU2-L3+M1 +sil-D1+WA2 sil-D1+E2 +P1-YA2+G3 K1-YA2+B3 +W3-K1+YE2 W3-K1+WEO2 +YEO2-L3+N1 YU2-L3+N1 +SS1-YE2 SS1-YE2+NG3 +YEO2-L3+O1 YU2-L3+O1 +D3-P1+A2 +YO2-NG3+B1 +YEO2-L3+P1 +W3-R1+WAE2 R1 +YO2-NG3+C1 +G3-G1+EO2 +P1-EU2+L3 +sil-D1+WE2 sil-D1+E2 +W3-K1+YI2 B3-K1+YI2 +YO2-NG3+D1 +YEO2-L3+R1 +P1-EU2+M3 +P1-YA2+L3 +SS1-YI2 YI2+NG3 +YEO2-L3+S1 +D3-P1+E2 G3-P1+E2 +P1-EU2+N3 +P1-YA2+M3 K1-YA2+M3 +YEO2-L3+T1 +P1-YA2+N3 K1-YA2+N3 +YO2-NG3+G1 +sil-D1+WI2 sil-D1+I2 +H1+WAE2 H1 +YO2-NG3+H1 +N3-S1+AE2 +G3-G1+EU2 +D3-P1+I2 B3-P1+I2 +W3-K1+YO2 B3-K1+YO2 +YO2-NG3+J1 +N3-O1+OE2 N3-O1+WAE2 +SS1-YO2 DD1-YO2 +YO2-NG3+K1 +YO2-NG3+M1 +N3-GG1+WAE2 GG1+WAE2 +YO2-NG3+N1 +I2-L3+B1 +P1-EU2+W3 +K1+YEO2 G3-K1+YEO2 +YO2-NG3+O1 +D3-P1+O2 G3-P1+O2 +I2-L3+C1 WI2-L3+C1 +P1-YA2+W3 BB1-YA2+W3 +W3-K1+YU2 B3-K1+YU2 +YO2-NG3+P1 +I2-L3+D1 +B1-YO2+B3 B1-YO2 +SS1-YU2 DD1-YU2+M3 +YO2-NG3+R1 YO2-NG3 +B1-YO2+D3 B1-YO2 +YO2-NG3+S1 +EO2-M3+DD1 +I2-L3+G1 +YO2-NG3+T1 +I2-L3+H1 WI2-L3+H1 +D3-P1+U2 +B1-YO2+G3 +DD1-O2+B3 +U2-N3+B1 +I2-L3+J1 WI2-L3+C1 +U2-N3+C1 +I2-L3+K1 +DD1-O2+D3 +U2-N3+D1 +I2-L3+M1 +I2-L3+N1 WI2-L3+N1 +B1-YO2+L3 B1-YO2 +DD1-O2+G3 +U2-N3+G1 +I2-L3+O1 +B1-YO2+M3 +U2-N3+H1 +I2-L3+P1 WI2-L3+P1 +B1-YO2+N3 B1-YO2+M3 +BB1-A2 +U2-N3+J1 +I2-L3+R1 +U2-N3+K1 +I2-L3+S1 +DD1-O2+L3 DD1-O2 +I2-L3+T1 WI2-L3+T1 +DD1-O2+M3 DD1-O2 +U2-N3+M1 +R1-YAE2 D1-YAE2 +YEO2-B3+SS1 +BB1-E2 BB1-E2+NG3 +DD1-O2+N3 DD1-O2 +U2-N3+N1 +T1-O2+B3 +U2-N3+O1 +U2-N3+P1 +T1-O2+D3 +B1-YO2+W3 B1-YO2 +BB1-I2 BB1-I2+W3 +U2-N3+R1 +N3-M1+WA2 M1+WA2 +G3-O1+YAE2 +U2-N3+S1 +T1-O2+G3 +NG3-H1+A2 +U2-N3+T1 U2-N3 +WA2-N3+B1 +N3-M1+WE2 M1+WE2 +WA2-N3+C1 +DD1-O2+W3 DD1-O2 +K1-YU2+NG3 K1-YU2 +YE2+B3 YE2+NG3 +BB1-O2 +NG3-H1+E2 +WA2-N3+D1 +T1-O2+L3 T1-O2 +T1-O2+M3 +YE2+D3 YE2+NG3 +A2-L3+sil +J1-YA2 B1-YA2 +T1-O2+N3 +N3-M1+WI2 N3-M1+I2 +EU2-G3+DD1 EU2-G3+C1 +WA2-N3+G1 +NG3-H1+I2 +WA2-N3+H1 +YE2+G3 YE2+NG3 +N1-YE2+B3 +BB1-U2 BB1-U2+NG3 +J1-YE2 H1-YE2+B3 +WA2-N3+J1 +WA2-N3+K1 +N1-YE2+D3 N1-YE2+B3 +JJ1-WEO2 JJ1-WEO2+B3 +D3+GG1 WE2-D3+GG1 +WA2-N3+M1 +YE2+L3 YE2+NG3 +NG3-H1+O2 +J1-YI2 G1-YI2 +WA2-N3+N1 +N1-YE2+G3 N1-YE2+B3 +YE2+M3 YE2+NG3 +WA2-N3+O1 +T1-WA2+NG3 DD1-WA2+NG3 +T1-O2+W3 +YE2+N3 YE2+NG3 +WE2-G3+SS1 YAE2-G3+SS1 +WA2-N3+P1 +WA2-N3+R1 +WA2-N3+S1 +N1-YE2+L3 N1-YE2+B3 +NG3-H1+U2 +J1-YO2 C1-YO2 +WA2-N3+T1 +N1-YE2+M3 N1-YE2+B3 +N1-YE2+N3 N1-YE2+B3 +sil-D1+YA2 sil-D1+E2 +YE2+W3 YE2+NG3 +sil-D1+YE2 sil-D1+E2 +J1-YU2 D1-YU2+M3 +sil-D1+YI2 sil-D1+E2 +R1-YI2+NG3 R1-YI2+B3 +N1-YE2+W3 N1-YE2+B3 +D3-H1+OE2 D3-H1+E2 +M1-YI2+B3 M1-YI2 +sil-D1+YO2 sil-D1+E2 +C1-WAE2+NG3 P1-WAE2 +I2-NG3+BB1 WI2-NG3+BB1 +M1-YI2+D3 M1-YI2 +M1-U2+B3 +M1-U2+D3 M1-U2+B3 +M3-C1+YEO2 M3-C1+WAE2 +M1-YI2+G3 M1-YI2 +sil-D1+YU2 sil-D1+E2 +M1-U2+G3 M1-U2+B3 +M1-YI2+L3 M1-YI2 +M1-YI2+M3 M1-YI2 +M1-YI2+N3 M1-YI2 +M1-U2+L3 +P1-E2+NG3 P1-E2+L3 +O2-NG3+sil +M1-U2+M3 +P1-EO2 +M1-U2+N3 M1-U2+M3 +D3-DD1+WEO2 D3-DD1+WA2 +L3-O1+WEO2 +B3-N1+WAE2 B3-N1+YE2 +sil-M1+WAE2 sil-M1+WE2 +W3-JJ1 W3-JJ1+YA2 +P1-EU2 +DD1-YEO2+B3 JJ1-YEO2+B3 +M1-YI2+W3 M1-YI2 +DD1-YEO2+D3 +DD1-YAE2 D1-YAE2 +sil-P1+YEO2 +M1-U2+W3 M1-U2 +DD1-YEO2+G3 JJ1-YEO2+G3 +M3-J1+YAE2 N3-J1+EO2 +N3-M1+YA2 M1+WE2 +B3-T1+OE2 W3-T1+OE2 +N3-G1+WEO2 +P1-WEO2+B3 P1-WEO2 +sil-J1+EO2 +N3-M1+YE2 M1+WE2 +WA2-G3+BB1 +DD1-YEO2+L3 S1-YEO2+L3 +YE2-B3 B3 +DD1-YEO2+M3 T1-YEO2+M3 +P1-WEO2+D3 +DD1-YEO2+N3 T1-YEO2+N3 +YE2-D3 D3 +D1-A2+NG3 +N3-M1+YI2 M1+WE2 +P1-WEO2+G3 P1-WEO2 +DD1-YU2+NG3 DD1-YU2+M3 +U2-NG3+BB1 +sil-J1+EU2 +I2-D3+SS1 +YE2-G3 G3 +M3-C1+AE2 +P1-WEO2+L3 +N3-M1+YO2 M1+YO2 +P1-WEO2+M3 P1-WEO2+NG3 +G3-C1+WA2 G3-C1+A2 +EO2-M3+GG1 EO2-M3+K1 +YE2-L3 L3 +DD1-YEO2+W3 D1-YEO2+W3 +P1-WEO2+N3 +YE2-M3 M3 +WI2-L3+sil +GG1-WE2+B3 GG1-WE2 +YE2-N3 N3 +GG1-WE2+D3 GG1-WE2 +G3-C1+WE2 G3-C1 +W3-S1+AE2 +N3-M1+YU2 M1+WE2 +D1-YE2+NG3 H1-YE2+B3 +GG1-WE2+G3 GG1-WE2 +W3-O1+OE2 +N3-N1+WAE2 N3-N1+YE2 +G3-C1+WI2 G3-C1+I2 +P1-WEO2+W3 P1-WEO2 +G1-OE2+B3 G1-OE2 +YE2-W3 +GG1-WE2+L3 GG1-WE2 +GG1-WE2+M3 GG1-WE2 +G1-OE2+D3 +K1-YO2+B3 K1-YO2 +AE2-L3+sil +GG1-WE2+N3 GG1-WE2 +B3-R1+WA2 R1 +K1-YO2+D3 K1-YO2 +D3-P1+YAE2 P1 +G1-OE2+G3 +YA2-G3+SS1 A2-G3+SS1 +K1-YO2+G3 +B3-R1+WE2 R1 +NG3-JJ1+AE2 N3-JJ1+E2 +G1-OE2+L3 G1-OE2+D3 +W3-R1+WEO2 B3-R1+WEO2 +G1-OE2+M3 +B3-R1+WI2 N3-R1+I2 +GG1-WE2+W3 GG1-WE2 +G1-OE2+N3 GG1-OE2+N3 +K1-YO2+L3 K1-YO2 +K1-YO2+M3 YO2+M3 +K1-YO2+N3 YO2+M3 +I2-NG3+DD1 WI2-NG3+DD1 +NG3-SS1 W3-SS1+WE2 +H1+WEO2 W3-H1+WEO2 +EU2-G3+GG1 EU2-G3 +N3-S1+EO2 +BB1-YA2+NG3 G1-YA2+M3 +G1-OE2+W3 G1-OE2 +N3-GG1+WEO2 GG1+WEO2 +S1-E2+B3 S1-E2 +DD1-YAE2+B3 D1-YAE2 +D3+JJ1 EO2-D3+JJ1 +N3-S1+EU2 +K1-YO2+W3 K1-YO2 +S1-E2+D3 +DD1-YAE2+D3 D1-YAE2 +W3-M1+WA2 +S1-E2+G3 S1-E2 +DD1-YAE2+G3 D1-YAE2 +W3-M1+WE2 W3-M1+WAE2 +P1-YE2+NG3 P1-YE2+B3 +P1-WAE2+B3 WAE2+B3 +S1-E2+L3 S1-E2 +DD1-YAE2+L3 D1-YAE2 +YU2-M3+sil WAE2-M3+sil +W3-M1+WI2 W3-M1+I2 +S1-E2+M3 S1-E2+NG3 +DD1-YAE2+M3 D1-YAE2 +P1-WAE2+D3 G1-WAE2+D3 +S1-E2+N3 S1-E2+NG3 +WE2-M3+BB1 YAE2-M3+BB1 +DD1-YAE2+N3 D1-YAE2 +O1+WAE2 B3-O1+OE2 +C1-AE2+NG3 +P1-WAE2+G3 WAE2+B3 +YAE2-N3+sil N3+sil +P1-WAE2+L3 WAE2+L3 +R1-YEO2 R1-YEO2+W3 +P1-WAE2+M3 P1-WAE2 +WA2-G3+DD1 +S1-E2+W3 S1-E2 +DD1-YAE2+W3 D1-YAE2 +P1-WAE2+N3 WAE2+L3 +H1-YO2+NG3 YO2+NG3 +R1-AE2 R1-AE2+B3 +N1-OE2 N1-OE2+B3 +G3-O1+YEO2 +U2-NG3+DD1 U2-NG3 +G3-C1+YA2 G3-C1 +P1-WAE2+W3 P1-WAE2 +G3-C1+YE2 G3-C1 +GG1-O2+NG3 +G3-C1+YI2 G3-C1+EU2 +YE2-M3+SS1 YI2-M3+SS1 +sil-H1+OE2 +G3-C1+YO2 G3-C1 +B3-R1+YA2 NG3-R1+YA2 +YE2-L3+sil YO2-L3+sil +O1-AE2+NG3 +B3-R1+YE2 R1 +G3-C1+YU2 G3-C1 +B3-R1+YI2 NG3-R1+YI2 +T1-YO2+NG3 DD1-YO2+NG3 +L3-C1+YAE2 L3-C1 +B3-R1+YO2 NG3-R1+YO2 +WE2-L3+B1 YU2-L3+B1 +B1-YA2+NG3 G1-YA2+M3 +W3-DD1+AE2 DD1+AE2 +WE2-L3+C1 YU2-L3+JJ1 +sil-DD1+WAE2 sil-DD1+WA2 +WE2-L3+D1 YU2-L3+D1 +O2-G3+SS1 +WE2-L3+G1 YA2-L3+G1 +EO2-M3+JJ1 +B3-R1+YU2 NG3-R1+YU2 +WE2-L3+H1 YU2-L3+H1 +W3-M1+YA2 +WE2-L3+J1 YU2-L3+JJ1 +WE2-L3+K1 YU2-L3+GG1 +W3-M1+YE2 W3-M1+WAE2 +WE2-L3+M1 YU2-L3+M1 +SS1-YI2+NG3 YI2+NG3 +WE2-L3+N1 YU2-L3+N1 +WE2-L3+O1 YU2-L3+O1 +M1-A2+NG3 +WE2-L3+P1 YU2-L3+BB1 +W3-M1+YI2 +B3+SS1 WE2-B3+SS1 +N1-YEO2+NG3 +WE2-L3+R1 YA2-L3+R1 +YU2-W3+SS1 WAE2-W3+SS1 +WE2-L3+S1 +WE2-M3+DD1 WA2-M3+R1 +WE2-L3+T1 YU2-L3+T1 +B3-N1+WEO2 B3-N1+WE2 +sil-M1+WEO2 sil-M1+WE2 +W3-M1+YO2 +M3-G1+WAE2 N3-G1 +DD1-YEO2 D1-YEO2 +W3-M1+YU2 +EU2-NG3 EU2-NG3+R1 +NG3-BB1+OE2 NG3-BB1+E2 +M3-J1+YEO2 N3-J1+EO2 +YA2-M3+BB1 YAE2-M3+BB1 +I2-NG3+GG1 WI2-NG3+GG1 +N1-YA2+NG3 +EU2-G3+JJ1 +T1-YO2+B3 +T1-YO2+D3 DD1-YO2 +sil-T1+WAE2 sil-T1+E2 +T1-YO2+G3 DD1-YO2 +M3-C1+EO2 M3-C1+WEO2 +T1-YO2+L3 DD1-YO2 +YEO2-D3+SS1 WE2-D3+SS1 +T1-YO2+M3 R1-YO2+M3 +T1-YO2+N3 R1-YO2+M3 +M3-C1+EU2 +W3-S1+EO2 +N3-O1+WA2 +G3-B1+WAE2 B3-B1 +N3-N1+WEO2 N3-N1+WE2 +N3-O1+WE2 +C1-WA2+B3 JJ1-WA2+B3 +W3-S1+EU2 S1+EU2 +T1-YO2+W3 DD1-YO2 +O2-G3+B1 +A2-N3+sil WA2-N3+sil +C1-WA2+D3 JJ1-WA2+D3 +N3-O1+WI2 +O2-G3+C1 O2-G3+JJ1 +O2-G3+D1 +D3-P1+YEO2 W3-P1+YEO2 +WA2-G3+GG1 +C1-WA2+G3 JJ1-WA2+B3 +GG1+A2 W3-GG1+A2 +O2-G3+G1 +L3-T1+YAE2 L3-T1 +O2-G3+H1 +GG1+E2 L3-GG1+E2 +U2-NG3+GG1 +NG3-JJ1+EO2 +O2-G3+J1 +C1-WA2+L3 JJ1-WA2+L3 +O2-G3+K1 O2-G3+G1 +C1-WA2+M3 J1-WA2+NG3 +C1-WA2+N3 JJ1-WA2+N3 +O2-G3+M1 +GG1+I2 M3-GG1+WI2 +O2-G3+N1 O2-G3+M1 +O2-G3+O1 +NG3-JJ1+EU2 +O2-G3+P1 +O2-G3+R1 +O2-G3+S1 +GG1+O2 +O2-G3+T1 O2-G3+R1 +G3-B1+A2 B3-B1+A2 +C1-WA2+W3 JJ1-WA2+W3 +G3-B1+E2 B3-B1+E2 +sil-R1+A2 +GG1+U2 L3-GG1+U2 +B1-WE2+B3 K1-WE2+NG3 +D3-N1+AE2 G3-N1+AE2 +B1-WE2+D3 K1-WE2+NG3 +G3-B1+I2 +sil-R1+E2 +D3-J1+OE2 D3-J1+AE2 +B1-WE2+G3 K1-WE2+NG3 +sil-R1+I2 +R1-YU2+B3 +G3-B1+O2 B3-B1+O2 +R1-YU2+D3 R1-YU2+B3 +B1-WE2+L3 K1-WE2+NG3 +O1+WEO2 G3-O1+WEO2 +B1-WE2+M3 K1-WE2+NG3 +R1-YU2+G3 +B1-WE2+N3 K1-WE2+NG3 +sil-R1+O2 +BB1-YAE2+NG3 D1-YAE2 +G3-B1+U2 B3-B1+U2 +YA2-M3+DD1 WA2-M3+R1 +G3-K1+AE2 B3-K1+AE2 +J1-YU2+NG3 D1-YU2+M3 +NG3-SS1+A2 +R1-YU2+L3 +A2-NG3 +G3-G1+OE2 B3-G1+OE2 +R1-YU2+M3 +sil-R1+U2 +R1-EO2 +R1-YU2+N3 +NG3-SS1+E2 W3-SS1+OE2 +B1-WE2+W3 K1-WE2+NG3 +M3-SS1+WAE2 W3-SS1+WE2 +NG3-SS1+I2 +R1-EU2 R1-EU2+B3 +O2-M3+BB1 +S1-WA2+NG3 DD1-WA2+NG3 +R1-YU2+W3 +NG3-SS1+O2 SS1+O2 +N3-O1+YA2 +D3-H1+WA2 +YI2-B3+B1 B3+B1 +YI2-B3+C1 B3+C1 +G3-S1+WAE2 +WE2-M3+GG1 YAE2-M3+GG1 +YI2-B3+D1 B3 +N3-O1+YE2 +D3-H1+WE2 B3-H1 +NG3-SS1+U2 +YI2-B3+G1 B3+G1 +YI2-B3+H1 B3 +N3-O1+YI2 N3-O1+WAE2 +D3-H1+WI2 G3-H1+WI2 +YU2-D3+B1 YI2-D3+B1 +YI2-B3+J1 B3+C1 +YU2-D3+C1 YI2-D3+C1 +YI2-B3+K1 B3+K1 +GG1-A2 +YU2-D3+D1 YI2-D3+D1 +YI2-B3+M1 B3+M1 +C1-WEO2+B3 +YI2-B3+N1 B3+N1 +N3-O1+YO2 +L3-J1+A2 +YU2-D3+G1 YI2-D3+G1 +EU2-W3+B1 +YI2-B3+O1 B3+O1 +GG1-E2 GG1-E2+M3 +C1-WEO2+D3 +YU2-D3+H1 YI2-D3+H1 +EU2-W3+C1 +YI2-B3+P1 B3+B1 +WI2-N3+sil +I2-NG3+JJ1 WI2-NG3+DD1 +GG1-YE2+B3 GG1-YE2 +EU2-W3+D1 +YU2-D3+J1 YI2-D3+C1 +YI2-B3+R1 B3 +C1-WEO2+G3 C1-WEO2+B3 +L3-J1+E2 D3-J1+E2 +GG1-YE2+D3 GG1-YE2 +YU2-D3+K1 D3 +YI2-B3+S1 B3+S1 +GG1-I2 +E2-D3+B1 +EU2-W3+G1 +YI2-B3+T1 B3 +N3-O1+YU2 +E2-D3+C1 +YU2-D3+M1 YI2-D3+M1 +EU2-W3+H1 +E2-D3+D1 AE2-D3+D1 +L3-C1+YEO2 L3-C1 +GG1-YE2+G3 GG1-YE2 +YU2-D3+N1 YI2-D3+N1 +L3-J1+I2 J1+I2 +YU2-D3+O1 YI2-D3+O1 +EU2-W3+J1 +C1-WEO2+L3 +U2-G3+BB1 +W3-DD1+EO2 +YU2-D3+P1 D3 +EU2-W3+K1 +C1-WEO2+M3 C1-WEO2+NG3 +E2-D3+G1 +GG1-O2 +C1-WEO2+N3 +sil-DD1+WEO2 sil-DD1+WA2 +E2-D3+H1 +YU2-D3+R1 YI2-D3+R1 +EU2-W3+M1 +GG1-YE2+L3 GG1-YE2 +YU2-D3+S1 YI2-D3+S1 +EU2-W3+N1 +E2-D3+J1 +GG1-YE2+M3 GG1-YE2 +YU2-D3+T1 YI2-D3+T1 +EU2-W3+O1 +AE2-N3+sil E2-N3+sil +L3-J1+O2 +E2-D3+K1 E2-D3 +GG1-YE2+N3 GG1-YE2 +EU2-W3+P1 +B3-T1+WA2 D3-T1+YEO2 +W3-DD1+EU2 +E2-D3+M1 AE2-D3+M1 +EU2-W3+R1 +D3-C1+WAE2 C1 +GG1-U2 +E2-D3+N1 AE2-D3+N1 +EU2-W3+S1 +E2-D3+O1 +EU2-W3+T1 +B3-T1+WE2 D3-T1+YEO2 +E2-D3+P1 E2-D3 +C1-WEO2+W3 C1-WEO2+B3 +L3-J1+U2 J1+U2 +E2-D3+R1 +E2-D3+S1 +B3-T1+WI2 W3-T1+WI2 +E2-D3+T1 E2-D3 +GG1-YE2+W3 GG1-YE2 +L3-J1+YAE2 L3-J1 +BB1-AE2+NG3 +K1-YAE2+NG3 D1-YAE2 +WA2-G3+JJ1 A2-G3+C1 +M3-G1+WEO2 +O1-WEO2+B3 O1-WEO2 +O1-WEO2+D3 WEO2+D3 +U2-NG3+JJ1 U2-NG3 +W3-O1+WA2 +O1-WEO2+G3 O1-WEO2 +NG3-R1+YAE2 R1 +W3-O1+WE2 W3-O1+OE2 +N3-B1+YAE2 N3-B1+WE2 +O1-WEO2+L3 +O1-WEO2+M3 +O1-WEO2+N3 +W3-O1+WI2 +O2-M3+DD1 +sil-T1+WEO2 sil-T1+E2 +W3-SS1 W3-SS1+WE2 +GG1-EO2+NG3 GG1-EO2+M3 +D3-H1+YA2 G3-H1+YA2 +C1-YE2+NG3 C1-YE2 +M3-N1+WAE2 M3-N1+YE2 +O1-WEO2+W3 O1-WEO2 +D3-H1+YE2 G3-H1+YE2 +T1-AE2 T1-AE2+B3 +D3-H1+YI2 D3-H1+I2 +P1-OE2 P1-OE2+B3 +G3-B1+WEO2 +YAE2+NG3 D1-YAE2 +YA2-NG3+sil +D3-H1+YO2 B3-H1+YO2 +YA2-M3+GG1 YAE2-M3+GG1 +K1-WE2+B3 K1-WE2+NG3 +K1-WE2+D3 K1-WE2+NG3 +D3-H1+YU2 B3-H1+YU2 +L3-T1+YEO2 L3-T1 +sil-N1+AE2 +K1-WE2+G3 K1-WE2+NG3 +U2-G3+DD1 +sil-J1+OE2 +W3-M1+YAE2 W3-M1+WAE2 +B3-G1+A2 D3-G1+A2 +B3-T1+YA2 W3-T1+YA2 +K1-WE2+L3 K1-WE2+NG3 +K1-WE2+M3 K1-WE2+NG3 +G1-I2+NG3 +B3-G1+E2 G3-G1+E2 +K1-WE2+N3 K1-WE2+NG3 +C1+YAE2 C1 +D3-T1+WAE2 D3-T1+YEO2 +B3-T1+YE2 D3-T1+YEO2 +O1-YE2+NG3 O1-YE2+B3 +B3-G1+I2 B3-G1+WI2 +B3-T1+YI2 W3-T1+YI2 +O1-WAE2+B3 +WE2-M3+JJ1 YI2-M3+JJ1 +N1-WA2 M1-WA2 +O1-WAE2+D3 +K1-WE2+W3 K1-WE2+NG3 +B3-G1+O2 G3-G1+O2 +B1-AE2+NG3 +N1-WE2 O1-WE2+B3 +O1-WAE2+G3 O1-WAE2+B3 +B3-T1+YO2 D3-T1+YEO2 +D3-N1+EO2 G3-N1+EO2 +N1-WI2 N1-WI2+NG3 +B3-G1+U2 G3-G1+U2 +O1-WAE2+L3 O1-WAE2 +O1-WAE2+M3 O1-WAE2 +O1-WAE2+N3 O1-WAE2 +B3-T1+YU2 D3-T1+YEO2 +D3-N1+EU2 +G1-YO2+NG3 YO2+NG3 +B3-DD1+YAE2 B3-DD1+OE2 +W3-O1+YA2 +I2-L3+BB1 WI2-L3+BB1 +WAE2-G3+BB1 WAE2-G3+P1 +sil-H1+WA2 +W3-O1+YE2 +G3-K1+EO2 B3-K1+EO2 +sil-H1+WE2 sil-H1+WEO2 +W3-O1+YI2 +O1-WAE2+W3 O1-WAE2 +D3+SS1 WE2-D3+SS1 +sil-H1+WI2 +B1-U2+B3 +G3-K1+EU2 +B1-U2+D3 +W3-O1+YO2 +M3-SS1+WEO2 W3-SS1+WE2 +N3-S1+OE2 +B1-U2+G3 +D1-EU2+B3 +D1-EU2+D3 +W3-O1+YU2 +B1-U2+L3 +D1-EU2+G3 D1-EU2+B3 +B1-U2+M3 +J1-YEO2+NG3 D1-YEO2+NG3 +W3-B1+A2 +B1-U2+N3 +N1-AE2+NG3 O1-AE2+NG3 +G3-S1+WEO2 G3-S1 +G3-O1+A2 D3-O1+A2 +W3-B1+E2 +D1-EU2+L3 +D1-EU2+M3 +D1-EU2+N3 +G3-O1+E2 D3-O1+E2 +W3-B1+I2 W3-B1+WI2 +S1-YO2+NG3 S1-YO2+M3 +B1-U2+W3 +G3-O1+I2 D3-O1+I2 +K1-O2+NG3 +W3-B1+O2 +D1-EU2+W3 +G3-O1+O2 +W3-B1+U2 +O2-M3+GG1 +YEO2-B3+B1 B3+B1 +YEO2-B3+C1 B3+C1 +G3-O1+U2 +YEO2-B3+D1 B3 +C1-YA2+B3 K1-YA2+B3 +NG3-BB1+WA2 NG3-BB1+E2 +N1-YA2 +C1-YA2+D3 K1-YA2+B3 +YEO2-B3+G1 B3+G1 +YEO2-B3+H1 B3 +C1-YA2+G3 K1-YA2+B3 +D3-C1+WEO2 D3-C1+EO2 +YEO2-B3+J1 B3+C1 +NG3-BB1+WE2 NG3-BB1+E2 +N1-YE2 N1-YE2+B3 +YEO2-B3+K1 B3+K1 +YEO2-B3+M1 B3+M1 +L3-G1+WAE2 +L3-GG1+YAE2 N3-GG1+YA2 +YEO2-B3+N1 B3+N1 +NG3-BB1+WI2 NG3-BB1+I2 +N1-YI2 N1-YI2+B3 +C1-YA2+L3 C1-YA2 +YEO2-B3+O1 B3+O1 +C1-YA2+M3 K1-YA2+M3 +T1-WE2+NG3 K1-WE2+NG3 +YEO2-B3+P1 B3+B1 +C1-YA2+N3 K1-YA2+N3 +YEO2-B3+R1 B3 +YEO2-B3+S1 B3+S1 +YEO2-B3+T1 B3 +N1-YO2 N1-YO2+B3 +L3-J1+YEO2 +sil-H1+YAE2 sil-H1+WEO2 +YA2-M3+JJ1 YI2-M3+JJ1 +sil-H1+YA2 +I2-L3+DD1 WI2-L3+DD1 +W3-C1+YAE2 C1 +WAE2-G3+DD1 WAE2-G3+R1 +M1-YA2+NG3 M1-YA2+M3 +C1-YA2+W3 T1-YA2+W3 +sil-H1+YE2 sil-H1+WEO2 +N1-YU2 +EO2-M3+SS1 +U2-G3+GG1 +I2-B3+B1 WI2-B3+B1 +I2-B3+C1 WI2-B3+C1 +sil-H1+YI2 sil-H1+WI2 +I2-B3+D1 WI2-B3+D1 +B1-YE2+B3 H1-YE2+B3 +NG3-R1+YEO2 B3-R1+YEO2 +D3-P1+AE2 G3-P1+AE2 +B1-YE2+D3 H1-YE2+B3 +WEO2-L3+B1 +O1-EO2+B3 +N3-B1+YEO2 +I2-B3+G1 WI2-B3+G1 +WEO2-L3+C1 WEO2-L3+JJ1 +I2-B3+H1 WI2-B3 +WEO2-L3+D1 +O1-EO2+D3 +B1-YE2+G3 H1-YE2+B3 +DD1-E2+B3 +U2-D3+B1 +I2-B3+J1 WI2-B3 +sil-H1+YO2 +U2-D3+C1 EU2-D3+C1 +I2-B3+K1 WI2-B3+K1 +T1-WE2+B3 K1-WE2+NG3 +WEO2-L3+G1 YA2-L3+G1 +O1-EO2+G3 +DD1-E2+D3 +U2-D3+D1 +WEO2-L3+H1 +I2-B3+M1 +T1-WE2+D3 K1-WE2+NG3 +I2-B3+N1 +B1-YE2+L3 H1-YE2+B3 +WEO2-L3+J1 WEO2-L3+JJ1 +DD1-E2+G3 DD1-E2+D3 +U2-D3+G1 U2-D3 +I2-B3+O1 WI2-B3+O1 +B1-YE2+M3 H1-YE2+B3 +WEO2-L3+K1 WEO2-L3+GG1 +U2-D3+H1 U2-D3 +I2-B3+P1 WI2-B3+P1 +sil-H1+YU2 +B1-YE2+N3 H1-YE2+B3 +T1-WE2+G3 K1-WE2+NG3 +O1-EO2+L3 +M3-N1+WEO2 M3-N1+WE2 +WEO2-L3+M1 +O1-EO2+M3 +U2-D3+J1 EU2-D3+C1 +I2-B3+R1 WI2-B3+D1 +WEO2-L3+N1 YU2-L3+N1 +O1-EO2+N3 +U2-D3+K1 U2-D3 +I2-B3+S1 WI2-B3+SS1 +WEO2-L3+O1 +G3-M1+AE2 G3-M1+E2 +DD1-E2+L3 +I2-B3+T1 WI2-B3+T1 +WEO2-L3+P1 EO2-L3+BB1 +DD1-E2+M3 DD1-E2+B3 +U2-D3+M1 +T1-WE2+L3 K1-WE2+NG3 +DD1-E2+N3 DD1-E2 +U2-D3+N1 +T1-E2+B3 +T1-WE2+M3 K1-WE2+NG3 +WEO2-L3+R1 +T1-EO2 T1-EO2+D3 +U2-D3+O1 +T1-WE2+N3 K1-WE2+NG3 +WEO2-L3+S1 +U2-D3+P1 U2-D3+B1 +T1-E2+D3 +WEO2-L3+T1 +B1-YE2+W3 H1-YE2+B3 +U2-D3+R1 +U2-D3+S1 +T1-E2+G3 T1-E2+D3 +O1-EO2+W3 +U2-D3+T1 U2-D3+R1 +T1-EU2 +EU2-G3+SS1 YU2-G3+SS1 +BB1-WEO2+B3 P1-WEO2 +WA2-D3+B1 +WA2-D3+C1 +DD1-E2+W3 +BB1-WEO2+D3 P1-WEO2+D3 +WA2-D3+D1 YI2-D3+D1 +T1-E2+L3 +T1-WE2+W3 K1-WE2+NG3 +T1-E2+M3 T1-E2+B3 +BB1-WEO2+G3 P1-WEO2 +T1-E2+N3 T1-E2 +WA2-D3+G1 +WA2-D3+H1 WA2-D3+B1 +D3-J1+WA2 +WA2-D3+J1 WA2-D3+C1 +G3-GG1+WAE2 B3-GG1+WAE2 +sil-N1+EO2 +WA2-D3+K1 WA2-D3+B1 +BB1-WEO2+L3 P1-WEO2+L3 +D3-J1+WE2 D3-J1+WAE2 +BB1-WEO2+M3 P1-WEO2+NG3 +W3-M1+YEO2 +WA2-D3+M1 +BB1-WEO2+N3 P1-WEO2+N3 +WA2-D3+N1 YI2-D3+N1 +NG3-BB1+YA2 NG3-BB1+E2 +D1-E2+NG3 D1-E2 +WA2-D3+O1 +T1-E2+W3 +WA2-D3+P1 WA2-D3+B1 +D3-J1+WI2 B3-J1+EU2 +U2+NG3 U2 +sil-N1+EU2 +WA2-D3+R1 YI2-D3+R1 +NG3-BB1+YE2 NG3-BB1+E2 +C1+YEO2 +WA2-D3+S1 YI2-D3+S1 +M3-G1+AE2 N3-G1+AE2 +D3-T1+WEO2 D3-T1+YEO2 +WA2-D3+T1 YI2-D3+T1 +M3-C1+OE2 +G3-G1+WA2 +BB1-WEO2+W3 P1-WEO2 +NG3-BB1+YI2 NG3-BB1+E2 +N1-U2+NG3 N1-U2+M3 +G3-G1+WE2 B3-G1+WE2 +NG3-BB1+YO2 NG3-BB1+E2 +D1-YI2+NG3 G1-YI2 +W3-S1+OE2 +G3-G1+WI2 B3-G1+WI2 +L3-SS1+A2 +M1-EU2+B3 M1-EU2 +O1-AE2+B3 O1-AE2 +W3-T1+YAE2 D3-T1+YEO2 +M1-EU2+D3 +NG3-BB1+YU2 NG3-BB1+E2 +O1-AE2+D3 N1-AE2+D3 +L3-SS1+E2 L3-SS1+OE2 +B3-DD1+YEO2 B3-DD1+OE2 +M1-EU2+G3 +YO2-W3+sil +O1-AE2+G3 +J1+YAE2 J1 +L3-SS1+I2 L3-SS1+WI2 +M1-EU2+L3 +O1-AE2+L3 O1-AE2 +O2-M3+JJ1 +M1-EU2+M3 +O1-AE2+M3 +NG3-JJ1+OE2 +M1-EU2+N3 +O1-AE2+N3 O1-AE2+M3 +YEO2-L3+BB1 YEO2-L3+P1 +L3-SS1+O2 +R1-WA2+NG3 DD1-WA2+NG3 +T1-O2+NG3 +AE2-L3+B1 E2-L3+B1 +L3-SS1+U2 +AE2-L3+C1 AE2-L3+JJ1 +BB1-YE2+NG3 SS1-YE2+NG3 +AE2-L3+D1 YU2-L3+D1 +M1-EU2+W3 M1-EU2 +O1-AE2+W3 +BB1-WAE2+B3 JJ1-WAE2+B3 +B3-T1+A2 T1+A2 +AE2-L3+G1 +AE2-L3+H1 YU2-L3+H1 +BB1-WAE2+D3 JJ1-WAE2+D3 +AE2-L3+J1 AE2-L3+JJ1 +B3-T1+E2 G3-T1+E2 +AE2-L3+K1 +BB1-WAE2+G3 JJ1-WAE2+B3 +P1-YI2+NG3 P1-YI2+B3 +AE2-L3+M1 E2-L3+M1 +AE2-L3+N1 E2-L3+N1 +B1-WEO2+B3 P1-WEO2 +B3-T1+I2 G3-T1+I2 +AE2-L3+O1 +AE2-L3+P1 +B1-WEO2+D3 P1-WEO2+D3 +BB1-WAE2+L3 JJ1-WAE2+L3 +I2-L3+GG1 I2-L3+K1 +BB1-WAE2+M3 BB1-WAE2+NG3 +AE2-L3+R1 E2-L3+R1 +WAE2-G3+GG1 WAE2-G3+K1 +BB1-WAE2+N3 JJ1-WAE2+L3 +AE2-L3+S1 +B1-WEO2+G3 P1-WEO2 +AE2-L3+T1 AE2-L3+DD1 +B3-T1+O2 G3-T1+O2 +D3-J1+YA2 D3-J1+WAE2 +U2-G3+JJ1 +B1-WEO2+L3 +B1-WEO2+M3 P1-WEO2+NG3 +D3-J1+YE2 D3-J1+WAE2 +B1-WEO2+N3 P1-WEO2+N3 +B3-T1+U2 G3-T1+U2 +BB1-WAE2+W3 BB1-WAE2+NG3 +D3-J1+YI2 D3-J1+WAE2 +R1-OE2 R1-OE2+B3 +B1-WEO2+W3 P1-WEO2 +G3-G1+YA2 B3-G1+YA2 +D3-J1+YO2 +G3-G1+YE2 B3-G1+YE2 +K1-YE2+B3 K1-YE2 +K1-YE2+D3 K1-YE2 +D3-J1+YU2 D3-J1+WAE2 +G3-G1+YI2 B3-G1+YI2 +sil-P1+AE2 +K1-YE2+G3 K1-YE2 +L3-G1+WEO2 D3-G1+WEO2 +L3-GG1+YEO2 M3-GG1+YEO2 +N1-WEO2+B3 N1-WEO2 +I2-NG3+SS1 WI2-NG3+SS1 +N1-WEO2+D3 WEO2+D3 +G3-G1+YO2 +K1-YE2+L3 K1-YE2 +K1-YE2+M3 K1-YE2 +GG1-WEO2+NG3 GG1-WEO2+M3 +N1-WEO2+G3 N1-WEO2 +K1-YE2+N3 K1-YE2 +sil-H1+YEO2 +W3-O1+A2 +W3-C1+YEO2 C1+YEO2 +M3-B1+YAE2 N3-B1+WE2 +G3-G1+YU2 B3-G1+YU2 +N1-WEO2+L3 +EU2-M3+BB1 +W3-O1+E2 +N1-WEO2+M3 N1-WEO2+NG3 +N1-WEO2+N3 +P1-WA2 S1-WA2 +YEO2-L3+DD1 +S1-WEO2+NG3 SS1-WEO2+M3 +K1-YE2+W3 K1-YE2 +W3-O1+I2 +P1-WE2 K1-WE2+NG3 +D3-P1+EO2 +B1-YE2+NG3 H1-YE2+B3 +L3-N1+WAE2 L3-N1 +W3-DD1+OE2 +P1-WI2 P1-WI2+B3 +B1-WAE2+B3 WAE2+B3 +W3-O1+O2 +N1-WEO2+W3 N1-WEO2 +B1-WAE2+D3 G1-WAE2+D3 +D3-P1+EU2 +B1-WAE2+G3 WAE2+B3 +I2-N3+BB1 WI2-N3+BB1 +B3-P1+YAE2 P1 +sil-O1+YAE2 +W3-O1+U2 +sil-J1+WA2 sil-J1+WAE2 +WA2-G3+SS1 A2-G3+SS1 +B1-WAE2+L3 WAE2+L3 +G3-M1+EO2 D3-M1+EO2 +sil-J1+WE2 sil-J1+WAE2 +M1-E2+NG3 +B1-WAE2+M3 P1-WAE2 +B1-WAE2+N3 WAE2+L3 +U2-NG3+SS1 +sil-J1+WI2 +G3-M1+EU2 B3-M1+EU2 +C1+AE2 W3-C1+AE2 +YEO2-NG3 YEO2-NG3+R1 +B1-WAE2+W3 P1-WAE2 +D3-S1+A2 +D3-S1+E2 +G3-GG1+WEO2 B3-GG1+WEO2 +D3-S1+I2 D3-S1+WI2 +N1-YE2+NG3 N1-YE2+B3 +N1-WAE2+B3 +N1-WAE2+D3 +D3-S1+O2 +YU2-NG3+B1 WAE2-NG3+B1 +N1-WAE2+G3 N1-WAE2+B3 +YU2-NG3+C1 +M3-G1+EO2 +YU2-NG3+D1 WAE2-NG3+D1 +WEO2-L3+sil YO2-L3+sil +D3-S1+U2 +YU2-NG3+G1 WAE2-NG3+G1 +N1-WAE2+L3 O1-WAE2 +YU2-NG3+H1 WAE2-NG3+H1 +N1-WAE2+M3 O1-WAE2 +M3-G1+EU2 +N1-WAE2+N3 O1-WAE2 +YU2-NG3+J1 WAE2-NG3+J1 +I2-L3+JJ1 WI2-L3+JJ1 +N3-S1+WA2 N3-S1+YAE2 +YU2-NG3+K1 WAE2-NG3+K1 +WAE2-G3+JJ1 WAE2-G3+C1 +YU2-NG3+M1 WAE2-NG3+M1 +YU2-NG3+N1 +W3-BB1+WAE2 W3-BB1+YAE2 +D1-OE2+B3 +G1+WAE2 D3-G1+WAE2 +N3-S1+WE2 N3-S1+YAE2 +YU2-NG3+O1 +WE2-B3+B1 B3+B1 +YU2-NG3+P1 WAE2-NG3+P1 +D1-OE2+D3 +WE2-B3+C1 B3+C1 +W3-T1+YEO2 D3-T1+YEO2 +WE2-B3+D1 B3 +YU2-NG3+R1 WAE2-NG3+R1 +P1-YA2 P1-YA2+L3 +N1-WAE2+W3 O1-WAE2 +N3-S1+WI2 N3-S1+I2 +YU2-NG3+S1 WAE2-NG3+S1 +EU2-M3+DD1 +D1-OE2+G3 D1-OE2 +YU2-NG3+T1 WAE2-NG3+T1 +WE2-B3+G1 B3+G1 +WE2-B3+H1 B3 +J1+YEO2 +P1-YE2 P1-YE2+B3 +WE2-B3+J1 B3+C1 +D1-OE2+L3 +WE2-B3+K1 B3+K1 +NG3-K1+A2 M3-K1+A2 +D1-OE2+M3 +D1-OE2+N3 +P1-YI2 P1-YI2+B3 +WE2-B3+M1 B3+M1 +WE2-B3+N1 B3+N1 +WE2-M3+SS1 YI2-M3+SS1 +WE2-B3+O1 B3+O1 +NG3-K1+E2 M3-K1+E2 +WE2-B3+P1 B3+B1 +WE2-B3+R1 B3 +P1-YO2 P1-YO2+B3 +WE2-B3+S1 B3+S1 +NG3-K1+I2 N3-K1+I2 +WE2-B3+T1 B3 +sil-J1+YA2 sil-J1+WAE2 +I2-N3+DD1 WI2-N3+DD1 +D1-OE2+W3 D1-OE2 +sil-J1+YE2 sil-J1+WAE2 +P1-YU2 BB1-YU2+M3 +NG3-K1+O2 M3-K1+O2 +I2+B3 C1-I2+B3 +sil-J1+YI2 sil-J1+WAE2 +R1-YO2+NG3 DD1-YO2+NG3 +I2+D3 +BB1+YAE2 BB1 +D3-R1+AE2 NG3-R1+AE2 +NG3-K1+U2 K1+U2 +G1-YO2+B3 G1-YO2 +G3-N1+YAE2 L3-N1+YAE2 +D3-N1+OE2 +I2+G3 C1-I2+G3 +G1-YO2+D3 G1-YO2 +sil-J1+YO2 sil-J1+WAE2 +YE2-W3+BB1 +T1-YE2+B3 C1-YE2 +G1-YO2+G3 +T1-YE2+D3 C1-YE2 +I2+L3 +I2+M3 +I2+N3 +sil-J1+YU2 sil-J1+WAE2 +T1-YE2+G3 C1-YE2 +YEO2-L3+GG1 YEO2-L3+K1 +G1-YO2+L3 G1-YO2 +G1-YO2+M3 +G1-YO2+N3 G1-YO2+M3 +G3-O1+AE2 B3-O1+AE2 +T1-YE2+L3 C1-YE2 +E2-NG3 E2-NG3+R1 +G3-K1+OE2 B3-K1+OE2 +T1-YE2+M3 C1-YE2 +T1-YE2+N3 C1-YE2 +I2+W3 +YO2-L3+B1 YU2-L3+B1 +YO2-L3+C1 YU2-L3+JJ1 +YO2-L3+D1 YU2-L3+D1 +G1-YO2+W3 G1-YO2 +G1-YEO2+NG3 +YO2-L3+G1 YA2-L3+G1 +S1-WE2+NG3 K1-WE2+NG3 +YO2-L3+H1 YU2-L3+H1 +T1-YE2+W3 C1-YE2 +YO2-L3+J1 YU2-L3+JJ1 +YO2-L3+K1 YU2-L3+GG1 +N3-S1+YA2 N3-S1+YAE2 +JJ1-YA2+NG3 G1-YA2+M3 +YO2-L3+M1 YU2-L3+M1 +YO2-L3+N1 YU2-L3+N1 +sil-P1+EO2 +YO2-L3+O1 YU2-L3+O1 +N3-S1+YE2 N3-S1+YAE2 +WA2-M3+BB1 YAE2-M3+BB1 +YO2-L3+P1 YU2-L3+BB1 +YO2-L3+R1 YA2-L3+R1 +YO2-L3+S1 YU2-L3+S1 +N3-S1+YI2 N3-S1+YAE2 +L3+BB1 YU2-L3+BB1 +YO2-L3+T1 YU2-L3+T1 +sil-P1+EU2 +N3-S1+YO2 +M3-B1+YEO2 N3-B1+YEO2 +YO2-B3+BB1 B3+B1 +N3-S1+YU2 +J1-O2+B3 +sil-H1+A2 +J1-O2+D3 +L3-N1+WEO2 L3-N1+WE2 +B3-M1+WAE2 M1+WE2 +P1-WAE2+NG3 P1-WAE2 +sil-H1+E2 +J1-O2+G3 +W3-G1+WAE2 D3-G1+WAE2 +sil-H1+I2 sil-H1+WI2 +I2-B3 WI2-B3 +J1-O2+L3 +J1-O2+M3 +YA2-M3+SS1 YI2-M3+SS1 +B3-P1+YEO2 W3-P1+YEO2 +sil-O1+YEO2 +I2-D3 +J1-O2+N3 +sil-H1+O2 +I2-G3 I2-G3+R1 +YEO2-N3+BB1 +YE2-W3+DD1 YE2-W3+T1 +I2-L3 +sil-H1+U2 +I2-M3 WI2-M3 +J1-O2+W3 +M3-C1+WA2 M3-C1+A2 +EU2-M3+GG1 +I2-N3 WI2-N3 +C1+EO2 D3-C1+EO2 +M3-C1+WE2 M3-C1+WAE2 +NG3-SS1+AE2 W3-SS1+OE2 +W3-S1+WA2 S1+WA2 +M3-C1+WI2 M3-C1+I2 +C1+EU2 W3-C1+EU2 +I2-W3 +M1-OE2+B3 M1-OE2 +W3-S1+WE2 S1 +M1-OE2+D3 +N3-M1+WAE2 M1+WE2 +W3-S1+WI2 +I2-N3+GG1 +M1-OE2+G3 M1-OE2 +M1-OE2+L3 M1-OE2+D3 +G3-D1+YAE2 B3-D1 +C1-YI2+NG3 YI2+NG3 +C1-U2+B3 JJ1-U2+B3 +M1-OE2+M3 M1-OE2+NG3 +D3-O1+YAE2 G3-O1+YAE2 +NG3-JJ1+WA2 NG3-JJ1+WAE2 +M1-OE2+N3 N1-OE2+N3 +C1-U2+D3 +EU2-M3+B1 +WA2-M3+DD1 WA2-M3+R1 +C1-U2+G3 JJ1-U2+G3 +NG3-JJ1+WE2 NG3-JJ1+WAE2 +EU2-M3+C1 +H1-YU2+NG3 +EU2-M3+D1 +T1-OE2 T1-OE2+B3 +L3+DD1 YU2-L3+DD1 +NG3-JJ1+WI2 +EU2-M3+G1 +C1-U2+L3 +EU2-M3+H1 +M1-OE2+W3 M1-OE2 +C1-U2+M3 C1-U2+NG3 +W3-BB1+WEO2 W3-BB1+YAE2 +C1-U2+N3 +G1+WEO2 D3-G1+WEO2 +EU2-M3+J1 +EU2-M3+K1 EU2-M3+GG1 +YEO2-L3+JJ1 YEO2-L3+C1 +EU2-M3+M1 +D3-GG1+WAE2 +EU2-M3+N1 +EU2-M3+O1 +YO2-B3+DD1 B3 +EU2-M3+P1 +GG1-U2+NG3 +EU2-M3+R1 EU2-M3+DD1 +C1-U2+W3 +EU2-M3+S1 +sil-R1+AE2 +EU2-M3+T1 EU2-M3+DD1 +sil-N1+OE2 +O1-YI2+NG3 O1-YI2 +N1+WAE2 L3-N1 +R1-WA2 S1-WA2 +YEO2-N3+DD1 +T1-YU2+NG3 C1-YU2 +R1-WE2 K1-WE2+NG3 +M3-C1+YA2 M3-C1+WAE2 +BB1+YEO2 BB1 +D3-R1+EO2 NG3-R1+EO2 +G3-N1+YEO2 +O2-M3+SS1 +R1-WI2 R1-WI2+B3 +M3-C1+YE2 M3-C1+WAE2 +D3-R1+EU2 N3-R1+EU2 +W3-S1+YA2 S1 +M3-C1+YI2 M3-C1+EU2 +B3-C1+WAE2 B3-C1+WE2 +sil-B1+WAE2 sil-B1+YAE2 +W3-S1+YE2 S1 +O1-WEO2+NG3 O1-WEO2+M3 +SS1-YO2+NG3 DD1-YO2+NG3 +EO2-G3+sil YI2-G3+sil +M3-C1+YO2 M3-C1+WAE2 +G3-O1+EO2 B3-O1+EO2 +W3-S1+YI2 S1 +M3-C1+YU2 M3-C1+WAE2 +G3-O1+EU2 B3-O1+EU2 +W3-S1+YO2 S1+YO2 +NG3-JJ1+YA2 NG3-JJ1+WAE2 +M1-WEO2+B3 M1-WEO2 +NG3-JJ1+YE2 NG3-JJ1+WAE2 +YU2+B3 DD1-YU2+B3 +W3-S1+YU2 S1+YU2 +M1-WEO2+D3 WEO2+D3 +YU2+D3 DD1-YU2+B3 +D1-YAE2+NG3 D1-YAE2 +M1-WEO2+G3 M1-WEO2 +NG3-JJ1+YI2 NG3-JJ1+WAE2 +M3-DD1+WAE2 M3-DD1+YAE2 +U2-G3+SS1 +YE2-W3+GG1 YAE2-W3+GG1 +W3-DD1+WA2 W3-DD1+WAE2 +N3-JJ1+AE2 N3-JJ1+E2 +YU2+G3 DD1-YU2+B3 +N3-JJ1+WAE2 N3-JJ1+YAE2 +N1-YU2+B3 +EU2-M3+JJ1 EU2-M3+C1 +L3-B1+YAE2 L3-B1 +N1-YU2+D3 N1-YU2+B3 +W3-DD1+WE2 W3-DD1+WAE2 +M1-WEO2+L3 +M1-WEO2+M3 M1-WEO2+NG3 +NG3-JJ1+YO2 +YU2+L3 DD1-YU2+L3 +M1-WEO2+N3 +N1-YU2+G3 N1-YU2+B3 +YU2+M3 DD1-YU2+M3 +YU2+N3 DD1-YU2+N3 +W3-DD1+WI2 +NG3-JJ1+YU2 NG3-JJ1+WAE2 +N1-YU2+L3 +WEO2-N3+sil +N1-YU2+M3 +NG3-D1+AE2 NG3-D1+YAE2 +N1-YU2+N3 +M1-WEO2+W3 M1-WEO2 +YU2+W3 DD1-YU2+M3 +B1+A2 +I2-N3+JJ1 WI2-N3+JJ1 +B1+E2 L3-B1+E2 +N1-YU2+W3 +B3-M1+WEO2 D3-M1+WEO2 +B1+I2 +W3-G1+WEO2 +I2-B3+sil WI2-B3+sil +R1-YA2 +WA2-M3+GG1 YAE2-M3+GG1 +R1-YE2 R1-YE2+B3 +B1+O2 +L3+GG1 YU2-L3+GG1 +R1-YI2 R1-YI2+B3 +T1-WI2+NG3 K1-WI2+NG3 +B1+U2 W3-B1+U2 +R1-YO2 R1-YO2+B3 +YO2-B3+GG1 B3+K1 +B3-T1+WAE2 D3-T1+YEO2 +sil-S1+WAE2 sil-S1+YAE2 +M1-YE2+NG3 M1-YE2 +R1-YU2 R1-YU2+M3 +M1-WAE2+B3 O1-WAE2+B3 +NG3-SS1+EO2 +N3-DD1+A2 M3-DD1+A2 +M1-WAE2+D3 O1-WAE2+D3 +D1-WAE2 D1-WAE2+L3 +L3-B1+AE2 +D3-T1+AE2 +M1-WAE2+G3 O1-WAE2+B3 +N3-DD1+E2 N3-DD1+AE2 +D3-P1+OE2 G3-P1+OE2 +NG3-SS1+EU2 M3-SS1+EU2 +N3-M1+WEO2 D3-M1+WEO2 +N3-DD1+I2 +M1-WAE2+L3 O1-WAE2 +YU2-B3 B3 +M1-WAE2+M3 O1-WAE2 +M1-WAE2+N3 O1-WAE2 +YU2-D3 D3 +G3-D1+YEO2 B3-D1 +W3-DD1+YA2 W3-DD1+WAE2 +YEO2-N3+GG1 +YU2-G3 YU2-G3+BB1 +N3-DD1+O2 M3-DD1+O2 +D3-O1+YEO2 G3-O1+YEO2 +W3-DD1+YE2 W3-DD1+WAE2 +G3-M1+OE2 G3-M1+E2 +YU2-L3 L3 +M1-WAE2+W3 O1-WAE2 +YU2-M3 M3 +N3-DD1+U2 +YU2-N3 +W3-DD1+YI2 W3-DD1+WAE2 +N3-T1+WAE2 NG3-T1+AE2 +W3-DD1+YO2 W3-DD1+WAE2 +D3-GG1+WEO2 B3-GG1+WEO2 +YU2-W3 +JJ1-AE2+NG3 +B1-A2 +D3-N1+WA2 L3-N1+WA2 +W3-DD1+YU2 W3-DD1+WAE2 +B1-E2 B1-E2+NG3 +sil-R1+EO2 +GG1-YAE2 D1-YAE2 +D3-N1+WE2 L3-N1+WE2 +B1-I2 B1-I2+W3 +D1-I2+NG3 +N3+BB1 YU2-N3+BB1 +D3-N1+WI2 G3-N1+I2 +C1-YEO2+NG3 T1-YEO2+NG3 +sil-R1+EU2 NG3-R1+EU2 +I2-L3+SS1 WI2-L3+SS1 +WAE2-G3+SS1 +M3-K1+AE2 NG3-K1+AE2 +B1-O2 +N1+WEO2 L3-N1+WE2 +M3-G1+OE2 N3-G1+OE2 +G3-K1+WA2 B3-K1+WA2 +YE2-W3+JJ1 +YO2-D3+BB1 WE2-D3+BB1 +B1-U2 +G3-K1+WE2 L3-K1 +S1-U2+B3 +S1-U2+D3 S1-U2+B3 +B1-EO2+B3 +YU2-G3+B1 +G3-K1+WI2 B3-K1+WI2 +B1-EO2+D3 +U2-M3+BB1 +YU2-G3+C1 YU2-G3+JJ1 +S1-U2+G3 +YU2-G3+D1 +WEO2-B3+B1 B3+B1 +G1-WE2+B3 K1-WE2+NG3 +WEO2-B3+C1 B3+C1 +B1-EO2+G3 +L3-M1+A2 +sil-GG1+AE2 +WEO2-B3+D1 B3 +YU2-G3+G1 YU2-G3+B1 +G1-WE2+D3 K1-WE2+NG3 +YU2-G3+H1 +S1-U2+L3 +S1-U2+M3 +WEO2-B3+G1 B3+G1 +YU2-G3+J1 +G1-WE2+G3 K1-WE2+NG3 +L3-M1+E2 L3-M1+AE2 +S1-U2+N3 SS1-U2+N3 +WEO2-B3+H1 B3 +B1-EO2+L3 +YU2-G3+K1 YU2-G3+BB1 +E2-G3+B1 WI2-G3+B1 +B1-EO2+M3 +B3-C1+WEO2 +sil-B1+WEO2 sil-B1+YAE2 +E2-G3+C1 E2-G3 +WEO2-B3+J1 B3+C1 +B1-EO2+N3 +YU2-G3+M1 +E2-G3+D1 WI2-G3+D1 +WEO2-B3+K1 B3+K1 +YU2-G3+N1 YU2-G3+M1 +L3-M1+I2 L3-M1+WI2 +YU2-G3+O1 +G1-WE2+L3 K1-WE2+NG3 +WEO2-B3+M1 B3+M1 +YU2-G3+P1 YU2-G3+BB1 +G1-WE2+M3 K1-WE2+NG3 +E2-G3+G1 +WEO2-B3+N1 B3+N1 +G1-WE2+N3 K1-WE2+NG3 +E2-G3+H1 WI2-G3+H1 +WEO2-B3+O1 B3+O1 +YU2-G3+R1 YU2-G3+BB1 +R1-WE2+NG3 K1-WE2+NG3 +WEO2-B3+P1 B3+B1 +YU2-G3+S1 +E2-G3+J1 WI2-G3+C1 +S1-U2+W3 +YU2-G3+T1 YU2-G3+BB1 +L3-M1+O2 +E2-G3+K1 E2-G3+G1 +WEO2-B3+R1 B3 +WEO2-B3+S1 B3+S1 +B1-EO2+W3 +E2-G3+M1 AE2-G3+M1 +WEO2-B3+T1 B3 +WA2-M3+JJ1 YI2-M3+JJ1 +E2-G3+N1 AE2-G3+M1 +BB1-YI2+NG3 P1-YI2+B3 +E2-G3+O1 AE2-G3+O1 +E2-G3+P1 WI2-G3+P1 +G1-WE2+W3 K1-WE2+NG3 +L3-M1+U2 +E2-G3+R1 E2-G3 +L3+JJ1 YU2-L3+JJ1 +E2-G3+S1 WI2-G3+S1 +E2-G3+T1 E2-G3 +M3-DD1+WEO2 M3-DD1+YAE2 +N3-JJ1+EO2 NG3-JJ1+EO2 +N3-JJ1+WEO2 M3-JJ1+WEO2 +L3-B1+YEO2 +YO2-B3+JJ1 B3+C1 +N3-JJ1+EU2 NG3-JJ1+EU2 +GG1-EU2+NG3 GG1-EU2 +D3-N1+YA2 L3-N1+YA2 +D3-B1+WAE2 D3-B1+YAE2 +NG3-D1+EO2 +D3-N1+YE2 L3-N1 +EO2-W3+BB1 +D3-N1+YI2 L3-N1+YI2 +NG3-D1+EU2 +N3+DD1 YU2-N3+DD1 +B1-AE2+B3 +B1-AE2+D3 +G3-K1+YA2 L3-K1 +D3-N1+YO2 L3-N1+YO2 +YEO2-N3+JJ1 YEO2-N3+C1 +B1-AE2+G3 +W3-DD1+A2 +G3-K1+YE2 L3-K1 +YO2-D3+DD1 WE2-D3+DD1 +R1-WA2+B3 DD1-WA2+B3 +D3-N1+YU2 L3-N1+YU2 +M1-A2+B3 +W3-DD1+E2 DD1+E2 +B1-AE2+L3 B1-AE2 +G3-K1+YI2 B3-K1+YI2 +R1-WA2+D3 DD1-WA2+D3 +YEO2-B3+sil YU2-B3+sil +M1-A2+D3 +B1-AE2+M3 B1-AE2 +sil-T1+AE2 sil-T1+E2 +B1-AE2+N3 B1-AE2 +U2-M3+DD1 U2-M3+R1 +sil-P1+OE2 sil-P1+E2 +W3-DD1+I2 DD1+I2 +R1-WA2+G3 DD1-WA2+B3 +M1-A2+G3 +G3-K1+YO2 B3-K1+YO2 +G1-O2+NG3 +GG1-I2+B3 +R1-WA2+L3 DD1-WA2+L3 +M1-A2+L3 +W3-DD1+O2 +R1-WA2+M3 DD1-WA2+NG3 +GG1-I2+D3 +M1-A2+M3 +R1-WA2+N3 DD1-WA2+N3 +M1-A2+N3 +B1-AE2+W3 +AE2-B3+B1 B3+B1 +G3-K1+YU2 B3-K1+YU2 +B3-T1+WEO2 D3-T1+YEO2 +sil-S1+WEO2 sil-S1+YAE2 +GG1-I2+G3 +AE2-B3+C1 B3+C1 +AE2-B3+D1 B3 +M3-M1+WAE2 M1+WE2 +W3-DD1+U2 +T1-WA2 S1-WA2 +B3-J1+A2 +AE2-B3+G1 B3+G1 +GG1-I2+L3 +AE2-B3+H1 B3 +D1-WEO2 SS1-WEO2 +GG1-I2+M3 +T1-WE2 K1-WE2+NG3 +R1-WA2+W3 DD1-WA2+W3 +GG1-I2+N3 +AE2-B3+J1 B3+C1 +M1-A2+W3 +L3-B1+EO2 +B3-J1+E2 G3-J1+AE2 +D3-T1+EO2 W3-T1+EO2 +AE2-B3+K1 B3+K1 +B1-YI2+NG3 B1-YI2+B3 +WE2-G3+sil YI2-G3+sil +AE2-B3+M1 A2-B3+M1 +T1-WI2 K1-WI2+NG3 +AE2-B3+N1 A2-B3+N1 +B3-J1+I2 D3-J1+I2 +AE2-B3+O1 EO2-B3+O1 +AE2-B3+P1 B3+B1 +L3-B1+EU2 +D3-T1+EU2 +G1-YU2+NG3 G1-YU2 +O1+A2 L3-O1+A2 +AE2-B3+R1 B3 +GG1-I2+W3 +AE2-B3+S1 B3+S1 +DD1-YA2+NG3 SS1-YA2+NG3 +AE2-B3+T1 B3 +B3-J1+O2 +sil-GG1+WAE2 +WAE2-M3+BB1 YAE2-M3+BB1 +sil-N1+WA2 +O1+E2 D3-O1+E2 +sil-N1+WE2 sil-N1+WEO2 +M1-I2+NG3 +O1+I2 +B3-J1+U2 G3-J1+U2 +P1-WA2+NG3 DD1-WA2+NG3 +K1-WAE2 G1-WAE2+M3 +sil-N1+WI2 +O1+O2 +G1+AE2 W3-G1+AE2 +G3-H1+WAE2 G3-H1+YAE2 +N3-T1+WEO2 NG3-T1+AE2 +D3-S1+WAE2 +C1+OE2 W3-C1+OE2 +O1+U2 +O2-W3+B1 +R1-I2+B3 +O2-W3+C1 +EO2-W3+DD1 EO2-W3+T1 +O2-W3+D1 +R1-I2+D3 +GG1-YEO2 +N1-YI2+NG3 N1-YI2+B3 +O2-W3+G1 +R1-I2+G3 R1-I2+B3 +O2-W3+H1 +O2-W3+J1 +O2-W3+K1 +S1-YU2+NG3 S1-YU2 +R1-I2+L3 +O2-W3+M1 +E2-NG3+BB1 AE2-NG3+BB1 +R1-I2+M3 +O2-W3+N1 +WEO2-NG3+BB1 EO2-NG3+BB1 +R1-I2+N3 +O2-W3+O1 +M3-K1+EO2 NG3-K1+EO2 +K1-U2+NG3 +O2-W3+P1 +O2-W3+R1 +YEO2-L3+SS1 +O2-W3+S1 +O2-W3+T1 +G3-R1+A2 B3-R1+A2 +M3-K1+EU2 NG3-K1+EU2 +R1-I2+W3 +G3-R1+E2 N3-R1+E2 +G3-R1+I2 N3-R1+I2 +sil-GG1+EO2 +I2-D3+sil WI2-D3+sil +T1-YA2 T1-YA2+L3 +O1-WI2+B3 N1-WI2+B3 +O1-WI2+D3 N1-WI2+B3 +G3-R1+O2 N3-R1+O2 +T1-YE2 C1-YE2 +sil-GG1+EU2 +O1-WI2+G3 N1-WI2+B3 +N3+GG1 YE2-N3+GG1 +T1-YI2 YI2+NG3 +G3-R1+U2 N3-R1+U2 +O1-WI2+L3 N1-WI2+NG3 +O1-WI2+M3 N1-WI2+NG3 +O1-A2 +BB1-O2+B3 +O1-WI2+N3 N1-WI2+N3 +T1-YO2 DD1-YO2 +BB1-O2+D3 +NG3-G1+YAE2 NG3-G1+OE2 +K1-O2+B3 +sil-N1+YA2 +YO2-D3+GG1 WE2-D3+GG1 +M3-JJ1+AE2 N3-JJ1+E2 +O1-E2 O1-E2+B3 +K1-O2+D3 +WAE2-M3+DD1 WA2-M3+R1 +BB1-O2+G3 +sil-N1+YE2 sil-N1+WAE2 +T1-YU2 C1-YU2 +K1-O2+G3 K1-O2+B3 +O1-I2 +U2-M3+GG1 +YA2-G3+sil A2-G3+sil +O1-WI2+W3 R1-WI2+B3 +BB1-O2+L3 +sil-N1+YI2 +BB1-O2+M3 +BB1-O2+N3 +K1-O2+L3 G1-O2+L3 +L3-D1+AE2 L3-D1+E2 +K1-O2+M3 +O1-O2 O1-O2+W3 +K1-O2+N3 +D3-R1+OE2 NG3-R1+OE2 +sil-N1+YO2 +O1-U2 O1-U2+W3 +BB1-O2+W3 +sil-N1+YU2 +K1-O2+W3 +D3-B1+WEO2 +G3-S1+AE2 +I2-NG3 WI2-NG3+DD1 +G3-O1+OE2 B3-O1+OE2 +U2-G3+B1 +GG1-YU2+B3 +U2-G3+C1 +U2-G3+D1 +B3-BB1+A2 G3-BB1+A2 +GG1-YU2+D3 +DD1-WAE2+NG3 SS1-WAE2 +U2-G3+G1 U2-G3 +E2-NG3+DD1 AE2-NG3+DD1 +WEO2-NG3+DD1 EO2-NG3+DD1 +GG1-YU2+G3 GG1-YU2+B3 +U2-G3+H1 +B3-BB1+E2 B3-BB1+WAE2 +EU2-M3+SS1 +U2-G3+J1 U2-G3+C1 +U2-G3+K1 +W3-B1+YAE2 B1 +S1-WI2+NG3 S1-WI2+L3 +B3-BB1+I2 B3-BB1+WI2 +GG1-YU2+L3 +U2-G3+M1 O2-G3+M1 +GG1-YU2+M3 GG1-YU2 +U2-G3+N1 +GG1-YU2+N3 +JJ1-YE2+NG3 SS1-YE2+NG3 +U2-G3+O1 O2-G3+O1 +D3-P1+WA2 W3-P1+WA2 +U2-G3+P1 U2-G3 +sil-T1+EO2 +U2-G3+R1 U2-G3+D1 +B3-BB1+O2 +U2-G3+S1 +D3-P1+WE2 P1 +DD1-YO2+B3 T1-YO2+B3 +U2-G3+T1 U2-G3+D1 +M3-B1+A2 +DD1-YO2+D3 DD1-YO2 +WA2-G3+B1 A2-G3+B1 +WA2-G3+C1 A2-G3+C1 +D3-P1+WI2 B3-P1+I2 +WA2-G3+D1 A2-G3+D1 +GG1-YU2+W3 GG1-YU2 +sil-T1+EU2 +I2-N3+SS1 WI2-N3+SS1 +M3-B1+E2 N3-B1+YEO2 +B3-BB1+U2 G3-BB1+U2 +DD1-YO2+G3 DD1-YO2 +M3-M1+AE2 +WA2-G3+G1 A2-G3+G1 +WA2-G3+H1 A2-G3+H1 +M3-B1+I2 +G3-M1+WA2 NG3-M1+WA2 +EO2-W3+GG1 WEO2-W3+GG1 +DD1-YO2+L3 DD1-YO2 +WA2-G3+J1 A2-G3+J1 +DD1-YO2+M3 R1-YO2+M3 +WA2-G3+K1 WA2-G3+GG1 +M3-M1+WEO2 D3-M1+WEO2 +DD1-YO2+N3 R1-YO2+M3 +WA2-G3+M1 YEO2-G3+M1 +G3-M1+WE2 G3-M1+WAE2 +WA2-G3+N1 YEO2-G3+M1 +M3-B1+O2 +WA2-G3+O1 +WA2-G3+P1 WA2-G3+BB1 +D1-YO2+NG3 S1-YO2+M3 +YE2-M3+sil WAE2-M3+sil +G3-M1+WI2 M1+WI2 +WA2-G3+R1 +WA2-G3+S1 A2-G3+S1 +WA2-G3+T1 WA2-G3+R1 +G3-DD1+AE2 G3-DD1 +G1-YE2+B3 G1-YE2 +M3-B1+U2 +DD1-YO2+W3 DD1-YO2 +N3-H1+YAE2 N3-H1+WE2 +G1-YE2+D3 G1-YE2 +G1-YE2+G3 G1-YE2 +sil-GG1+WEO2 +G1-YE2+L3 G1-YE2 +G1-YE2+M3 G1-YE2 +M3-T1+WAE2 NG3-T1+AE2 +G1-YE2+N3 G1-YE2 +K1-WEO2 GG1-WEO2+B3 +M3-G1+WA2 +T1-U2+NG3 T1-U2 +O2-G3+sil +YO2-B3+B1 B3+B1 +YO2-B3+C1 B3+C1 +G1+EO2 L3-G1+EO2 +G3-H1+WEO2 B3-H1+WEO2 +M3-G1+WE2 N3-G1+WE2 +YO2-B3+D1 B3 +G1-YE2+W3 G1-YE2 +D3-S1+WEO2 D3-S1+YAE2 +N3+JJ1 YE2-N3+JJ1 +YO2-B3+G1 B3+G1 +M3-G1+WI2 N3-G1+WI2 +YO2-B3+H1 B3 +SS1-YO2+B3 T1-YO2+B3 +G1+EU2 +NG3-SS1+OE2 W3-SS1+OE2 +YO2-B3+J1 B3+C1 +SS1-YO2+D3 DD1-YO2 +YO2-B3+K1 B3+K1 +P1-YO2+NG3 +YO2-B3+M1 B3+M1 +B3+sil YU2-B3+sil +SS1-YO2+G3 DD1-YO2 +YO2-B3+N1 B3+N1 +YO2-B3+O1 B3+O1 +YO2-D3+JJ1 EO2-D3+JJ1 +YU2-W3+sil +YO2-B3+P1 B3+B1 +WAE2-M3+GG1 YAE2-M3+GG1 +WE2-W3+BB1 YAE2-W3+BB1 +YO2-B3+R1 B3 +W3-S1+YAE2 S1 +SS1-YO2+L3 DD1-YO2 +YO2-B3+S1 B3+S1 +SS1-YO2+M3 R1-YO2+M3 +YO2-B3+T1 B3 +SS1-YO2+N3 R1-YO2+M3 +D3-P1+YA2 P1 +U2-M3+JJ1 U2-M3+C1 +YEO2+B3 JJ1-YEO2+B3 +YEO2+D3 +D3-P1+YE2 W3-P1+YE2 +YEO2+G3 JJ1-YEO2+G3 +D3-P1+YI2 P1 +SS1-YO2+W3 DD1-YO2 +J1-E2+B3 +YEO2+L3 J1-YEO2+L3 +YEO2+M3 +J1-E2+D3 J1-E2+B3 +YEO2+N3 +G3-M1+YA2 G3-M1+WAE2 +D3-P1+YO2 W3-P1+YO2 +J1-E2+G3 J1-E2+B3 +G3-M1+YE2 G3-M1+WAE2 +R1-YA2+B3 +D3-P1+YU2 P1 +J1-E2+L3 JJ1-E2+L3 +G3-M1+YI2 G3-M1+WAE2 +R1-YA2+D3 R1-YA2+B3 +YEO2-D3+sil YO2-D3+sil +J1-E2+M3 JJ1-E2+NG3 +YEO2+W3 +J1-E2+N3 JJ1-E2+NG3 +YE2-W3+SS1 WAE2-W3+SS1 +NG3-D1+WAE2 +sil-R1+OE2 sil-R1+E2 +R1-YA2+G3 R1-YA2+B3 +E2-NG3+GG1 +WEO2-NG3+GG1 EO2-NG3+GG1 +G3-M1+YO2 +R1-YA2+L3 R1-YA2 +SS1-WAE2+NG3 SS1-WAE2 +R1-YA2+M3 +NG3-G1+YEO2 +R1-YA2+N3 +J1-E2+W3 +M3-JJ1+EO2 NG3-JJ1+EO2 +G3-M1+YU2 G3-M1+WAE2 +JJ1-EO2+B3 +M3-JJ1+EU2 NG3-JJ1+EU2 +JJ1-EO2+D3 +R1-YA2+W3 +M3-G1+YA2 N3-G1 +D1-YO2+B3 S1-YO2+B3 +L3-D1+EO2 +D1-YO2+D3 S1-YO2 +JJ1-EO2+G3 +T1-YAE2+NG3 D1-YAE2 +W3-R1+A2 +M3-G1+YE2 N3-G1 +D1-YO2+G3 S1-YO2 +EO2-W3+JJ1 +L3-D1+EU2 +W3-R1+E2 N3-R1+E2 +JJ1-EO2+L3 +DD1-AE2+NG3 +M3-G1+YI2 N3-G1+YI2 +JJ1-EO2+M3 +JJ1-EO2+N3 +YAE2 D1-YAE2 +D1-YO2+L3 S1-YO2 +W3-R1+I2 N3-R1+I2 +D1-YO2+M3 S1-YO2+M3 +sil-P1+WA2 sil-P1+WAE2 +WA2-M3+SS1 YI2-M3+SS1 +D1-YO2+N3 S1-YO2+M3 +YAE2+B3 D1-YAE2 +M3-G1+YO2 +G3-S1+EO2 +sil-P1+WE2 sil-P1+WAE2 +YAE2+D3 D1-YAE2 +L3+SS1 YU2-L3+SS1 +W3-R1+O2 N3-R1+O2 +D3-SS1+YAE2 D3-SS1+WE2 +YAE2+G3 D1-YAE2 +JJ1-EO2+W3 +sil-P1+WI2 sil-P1+I2 +WE2-W3+DD1 WAE2-W3+T1 +M3-G1+YU2 N3-G1+YU2 +G3-S1+EU2 +D1-YO2+W3 S1-YO2+W3 +YEO2-B3 B3 +W3-R1+U2 N3-R1+U2 +YAE2+L3 D1-YAE2 +YEO2-D3 YEO2-D3+B1 +YAE2+M3 D1-YAE2 +YO2-B3+SS1 WE2-B3+SS1 +YAE2+N3 D1-YAE2 +YA2-N3+B1 YI2-N3+B1 +W3-B1+YEO2 B1+YEO2 +YA2-N3+C1 YI2-N3+C1 +YEO2-G3 YEO2-G3+C1 +YA2-N3+D1 YI2-N3+D1 +YAE2-N3+B1 YI2-N3+B1 +YAE2-N3+C1 YI2-N3+C1 +YA2-N3+G1 YI2-N3+G1 +YAE2-N3+D1 YI2-N3+D1 +YA2-N3+H1 YI2-N3+H1 +YA2-W3+BB1 +YEO2-L3 +YEO2-M3 M3 +N3-JJ1+OE2 N3-JJ1+O2 +YA2-N3+J1 YI2-N3+J1 +YEO2-N3 +YAE2+W3 D1-YAE2 +YAE2-N3+G1 YI2-N3+G1 +YA2-N3+K1 YI2-N3+K1 +YAE2-N3+H1 YI2-N3+H1 +YA2-N3+M1 YO2-N3+M1 +L3-M1+WAE2 L3-M1 +YAE2-N3+J1 YI2-N3+J1 +YA2-N3+N1 YI2-N3+N1 +YAE2-N3+K1 YI2-N3+K1 +YA2-N3+O1 YI2-N3+O1 +YA2-N3+P1 YI2-N3+P1 +YAE2-N3+M1 YO2-N3+M1 +YAE2-N3+N1 YI2-N3+N1 +YA2-N3+R1 YI2-N3+R1 +SS1+YAE2 W3-SS1+WE2 +M3-M1+EO2 +YAE2-N3+O1 YI2-N3+O1 +YA2-N3+S1 WE2-N3+S1 +YEO2-W3 +YAE2-N3+P1 YI2-N3+P1 +YA2-N3+T1 YI2-N3+T1 +NG3-H1+AE2 NG3-H1+E2 +B3-O1+YAE2 G3-O1+YAE2 +sil-N1+YAE2 sil-N1+WAE2 +YEO2-N3+SS1 YO2-N3+SS1 +YAE2-N3+R1 YI2-N3+R1 +NG3-D1+OE2 NG3-D1+WAE2 +YAE2-N3+S1 WE2-N3+S1 +YAE2-N3+T1 YI2-N3+T1 +M3-M1+EU2 B3-M1+EU2 +JJ1-AE2+B3 JJ1-AE2 +WAE2-M3+JJ1 YI2-M3+JJ1 +JJ1-AE2+D3 +C1+WA2 W3-C1+WA2 +B1-YU2+B3 +B1-YU2+D3 B1-YU2+B3 +G3-DD1+EO2 +JJ1-AE2+G3 JJ1-AE2 +N3-H1+YEO2 N3-H1+WE2 +C1+WE2 C1 +B1-YU2+G3 B1-YU2+B3 +DD1-U2+B3 +O1-YI2+B3 O1-YI2 +JJ1-AE2+L3 JJ1-AE2 +DD1-U2+D3 DD1-U2+B3 +O1-YI2+D3 O1-YI2 +O1-WA2+NG3 O1-WA2+M3 +C1+WI2 D3-C1+WI2 +G3-DD1+EU2 +JJ1-AE2+M3 JJ1-AE2 +JJ1-AE2+N3 +B1-YU2+L3 +DD1-U2+G3 +O1-YI2+G3 O1-YI2 +B1-YU2+M3 B1-YU2 +B1-YU2+N3 +M3-T1+WEO2 NG3-T1+AE2 +DD1-U2+L3 +O1-YI2+L3 O1-YI2 +DD1-U2+M3 +O1-YI2+M3 O1-YI2 +DD1-U2+N3 +O1-YI2+N3 O1-YI2 +T1-U2+B3 +JJ1-AE2+W3 JJ1-AE2 +L3-JJ1+YAE2 L3-JJ1 +T1-U2+D3 T1-U2+B3 +sil-P1+YA2 sil-P1+WAE2 +B1-YU2+W3 B1-YU2 +YAE2-B3 B3 +T1-U2+G3 D1-U2+G3 +NG3-N1+A2 +N3-O1+YAE2 +M3-O1+A2 +sil-P1+YE2 sil-P1+WAE2 +YAE2-D3 D3 +DD1-U2+W3 DD1-U2 +O1-YI2+W3 O1-YI2 +YAE2-G3 G3 +E2-NG3+JJ1 AE2-NG3+DD1 +NG3-N1+E2 G3-N1+AE2 +T1-U2+L3 +M3-O1+E2 +WEO2-NG3+JJ1 EO2-NG3+DD1 +sil-P1+YI2 sil-P1+WAE2 +R1-YU2+NG3 +T1-U2+M3 +T1-U2+N3 +L3-B1+OE2 +NG3-N1+I2 NG3-N1+WI2 +D3-T1+OE2 +M3-O1+I2 +YAE2-L3 L3 +YAE2-M3 M3 +sil-P1+YO2 +YAE2-N3 N3 +W3-S1+YEO2 S1+YEO2 +NG3-N1+O2 +M3-O1+O2 +T1-U2+W3 +sil-P1+YU2 sil-P1+WAE2 +NG3-JJ1+A2 N3-JJ1+A2 +K1-EO2+NG3 K1-EO2+M3 +YA2-W3+DD1 YA2-W3+T1 +YAE2-W3 W3 +NG3-N1+U2 N3-N1+U2 +M3-O1+U2 O1+U2 +NG3-JJ1+E2 N3-JJ1+E2 +E2-G3+BB1 +NG3-JJ1+I2 M3-JJ1+I2 +H1-WEO2+NG3 +OE2-N3+B1 E2-N3+B1 +OE2-N3+C1 E2-N3+C1 +OE2-N3+D1 +O2-W3+BB1 +NG3-JJ1+O2 NG3-JJ1+OE2 +K1-WEO2+B3 GG1-WEO2+B3 +OE2-N3+G1 +OE2-N3+H1 +K1-WEO2+D3 G1-WEO2+D3 +M1-YO2+B3 M1-YO2 +D3-R1+WA2 R1 +OE2-N3+J1 +M1-YO2+D3 M1-YO2 +NG3-JJ1+U2 N3-JJ1+U2 +OE2-N3+K1 +K1-WEO2+G3 GG1-WEO2+B3 +C1+YA2 C1 +WE2-W3+GG1 YAE2-W3+GG1 +L3-JJ1+AE2 +P1+YAE2 P1 +OE2-N3+M1 +M1-YO2+G3 +D3-R1+WE2 R1 +NG3-D1+WEO2 NG3-D1+YAE2 +OE2-N3+N1 +OE2-N3+O1 +BB1-EO2+B3 +C1+YE2 C1 +OE2-N3+P1 E2-N3+P1 +K1-WEO2+L3 GG1-WEO2+L3 +BB1-EO2+D3 +K1-WEO2+M3 GG1-WEO2+M3 +D3-R1+WI2 N3-R1+I2 +OE2-N3+R1 +K1-WEO2+N3 GG1-WEO2+N3 +M1-YO2+L3 M1-YO2 +OE2-N3+S1 E2-N3+S1 +G3-JJ1+WAE2 G3-JJ1+OE2 +M1-YO2+M3 +C1+YI2 D3-C1+EU2 +OE2-N3+T1 AE2-N3+T1 +BB1-EO2+G3 +M1-YO2+N3 M1-YO2+M3 +M3-O1+AE2 N3-O1 +B1-A2+B3 +M3-K1+OE2 B3-K1+OE2 +G3-O1+WA2 O1+WA2 +B1-A2+D3 +BB1-EO2+L3 +C1+YO2 C1 +BB1-EO2+M3 +BB1-EO2+N3 +G3-O1+WE2 O1+WE2 +K1-WEO2+W3 GG1-WEO2+B3 +B1-A2+G3 +M1-YO2+W3 M1-YO2 +G3-O1+WI2 D3-O1+I2 +C1+YU2 C1 +B1-A2+L3 +B1-A2+M3 +NG3-K1+WAE2 M3-K1+WAE2 +B1-A2+N3 +BB1-EO2+W3 +sil-GG1+OE2 +YEO2 +sil-K1+A2 +B1-A2+W3 +sil-K1+E2 +R1-WI2+NG3 R1-WI2+B3 +NG3-BB1+YAE2 NG3-BB1+E2 +D3-SS1+YEO2 D3-SS1+WE2 +sil-K1+I2 sil-K1+YI2 +YU2-B3+BB1 B3+B1 +L3-BB1+WAE2 L3-BB1 +sil-K1+O2 +K1-WAE2+B3 G1-WAE2+B3 +E2-G3+DD1 E2-G3 +K1-YU2+B3 GG1-YU2+B3 +K1-WAE2+D3 G1-WAE2+D3 +sil-K1+U2 +K1-YU2+D3 GG1-YU2+D3 +D3+sil YO2-D3+sil +K1-WAE2+G3 G1-WAE2+B3 +K1-YU2+G3 GG1-YU2+B3 +DD1-WE2+B3 K1-WE2+NG3 +L3-M1+WEO2 +BB1-AE2+B3 BB1-AE2 +O2-W3+DD1 +DD1-WE2+D3 K1-WE2+NG3 +K1-WAE2+L3 G1-WAE2+L3 +BB1-AE2+D3 +K1-WAE2+M3 G1-WAE2+M3 +K1-YU2+L3 +D3-R1+YA2 NG3-R1+YA2 +K1-WAE2+N3 G1-WAE2+L3 +DD1-WEO2+B3 SS1-WEO2 +C1-YO2+NG3 C1-YO2 +DD1-WE2+G3 K1-WE2+NG3 +K1-YU2+M3 K1-YU2 +SS1+YEO2 W3-SS1+WE2 +BB1-AE2+G3 BB1-AE2 +G1-I2+B3 +K1-YU2+N3 GG1-YU2+N3 +DD1-WEO2+D3 WEO2+D3 +NG3-H1+EO2 +B3-O1+YEO2 G3-O1+YEO2 +G1-I2+D3 +sil-N1+YEO2 +D3-R1+YE2 R1 +DD1-WEO2+G3 SS1-WEO2 +DD1-WE2+L3 K1-WE2+NG3 +M3-H1+YAE2 M3-H1+WE2 +G1-I2+G3 G1-I2+D3 +BB1-AE2+L3 BB1-AE2 +DD1-WE2+M3 K1-WE2+NG3 +BB1-AE2+M3 BB1-AE2 +DD1-WE2+N3 K1-WE2+NG3 +D3-R1+YI2 NG3-R1+YI2 +B3-GG1+A2 +BB1-AE2+N3 +K1-WAE2+W3 G1-WAE2+M3 +NG3-H1+EU2 NG3-H1+EO2 +DD1-WEO2+L3 SS1-WEO2+L3 +K1-YU2+W3 K1-YU2 +DD1-WEO2+M3 SS1-WEO2+M3 +G1-I2+L3 +B3-GG1+E2 +DD1-WEO2+N3 SS1-WEO2+N3 +G1-I2+M3 +G1-I2+N3 +G3-O1+YA2 O1+YA2 +D3-R1+YO2 NG3-R1+YO2 +YE2-L3+B1 YU2-L3+B1 +YE2-L3+C1 YU2-L3+JJ1 +B3-GG1+I2 +NG3-SS1+WA2 W3-SS1+WA2 +YE2-L3+D1 YU2-L3+D1 +DD1-WE2+W3 K1-WE2+NG3 +L3-C1+A2 +YA2-W3+GG1 +BB1-AE2+W3 BB1-AE2 +G3-O1+YE2 O1+YE2 +YE2-L3+G1 YA2-L3+G1 +D3-R1+YU2 NG3-R1+YU2 +NG3-SS1+WE2 W3-SS1+WE2 +YE2-L3+H1 YU2-L3+H1 +L3-C1+E2 +DD1-WEO2+W3 SS1-WEO2 +G3-O1+YI2 O1+YI2 +B3-GG1+O2 +G1-I2+W3 G1-I2 +YE2-L3+J1 YU2-L3+JJ1 +YE2-L3+K1 YU2-L3+GG1 +NG3-SS1+WI2 NG3-SS1+I2 +sil-T1+OE2 sil-T1+E2 +L3-C1+I2 +YE2-L3+M1 YU2-L3+M1 +YE2-L3+N1 YU2-L3+N1 +YE2-L3+O1 YU2-L3+O1 +G3-O1+YO2 O1+YO2 +B3-GG1+U2 +O1-A2+NG3 +YE2-L3+P1 YU2-L3+BB1 +YE2-L3+R1 YA2-L3+R1 +L3-C1+O2 +L3-JJ1+YEO2 JJ1+YEO2 +YE2-L3+S1 YU2-L3+S1 +A2-N3+B1 WA2-N3+B1 +YE2-L3+T1 YU2-L3+T1 +O1-YO2+NG3 O1-YO2+L3 +A2-N3+C1 +G3-O1+YU2 O1+YU2 +A2-N3+D1 +G3-C1+YAE2 G3-C1 +N3-O1+YEO2 +D3-N1+YAE2 L3-N1+YAE2 +WE2-W3+JJ1 WAE2-W3+JJ1 +L3-C1+U2 +A2-N3+G1 +A2-N3+H1 +SS1-YEO2+B3 JJ1-YEO2+B3 +A2-N3+J1 +SS1-WE2+B3 K1-WE2+NG3 +A2-N3+K1 +SS1-YEO2+D3 DD1-YEO2+D3 +SS1-WE2+D3 K1-WE2+NG3 +A2-N3+M1 +A2-N3+N1 +SS1-YEO2+G3 JJ1-YEO2+G3 +A2-N3+O1 +YU2-B3+DD1 B3 +SS1-WE2+G3 K1-WE2+NG3 +A2-N3+P1 A2-N3+BB1 +A2-N3+R1 +A2-N3+S1 +SS1-YEO2+L3 S1-YEO2+L3 +A2-N3+T1 +SS1-YEO2+M3 T1-YEO2+M3 +BB1-WA2+NG3 DD1-WA2+NG3 +DD1-YE2+NG3 SS1-YE2+NG3 +SS1-WE2+L3 K1-WE2+NG3 +SS1-YEO2+N3 T1-YEO2+N3 +SS1-WE2+M3 K1-WE2+NG3 +sil-R1+WA2 sil-R1+YAE2 +SS1-WE2+N3 K1-WE2+NG3 +DD1-WAE2+B3 SS1-WAE2+B3 +SS1-YU2+NG3 DD1-YU2+M3 +EO2-M3+sil +DD1-WAE2+D3 SS1-WAE2+D3 +sil-R1+WE2 sil-R1+YAE2 +N3+SS1 YO2-N3+SS1 +DD1-WAE2+G3 SS1-WAE2+B3 +P1-WE2+NG3 K1-WE2+NG3 +sil-R1+WI2 sil-R1+I2 +SS1-YEO2+W3 D1-YEO2+W3 +SS1-WE2+W3 K1-WE2+NG3 +DD1-WAE2+L3 SS1-WAE2 +K1+AE2 B3-K1+AE2 +DD1-WAE2+M3 SS1-WAE2 +DD1-WAE2+N3 SS1-WAE2 +YO2-D3+SS1 WE2-D3+SS1 +G1+OE2 B3-G1+OE2 +M1+WAE2 M1+WE2 +U2-M3+SS1 +YI2-G3+BB1 YAE2-G3+P1 +DD1-WAE2+W3 SS1-WAE2 +L3-JJ1+EO2 JJ1+EO2 +P1+YEO2 W3-P1+YEO2 +NG3-SS1+YA2 W3-SS1+WE2 +L3-JJ1+EU2 JJ1+EU2 +G3-JJ1+WEO2 G3-JJ1+OE2 +NG3-SS1+YE2 W3-SS1+WE2 +EU2-G3+sil +OE2-NG3 E2-NG3+R1 +M3-O1+EO2 +E2-G3+GG1 E2-G3+G1 +NG3-J1+AE2 +NG3-SS1+YI2 W3-SS1+WE2 +B3-B1+WAE2 B3-B1 +M3-O1+EU2 +NG3-SS1+YO2 W3-SS1+WE2 +O2-W3+GG1 +SS1-YAE2+B3 D1-YAE2 +D1-WE2+B3 K1-WE2+NG3 +sil-SS1+YAE2 sil-SS1+WE2 +SS1-YAE2+D3 D1-YAE2 +NG3-K1+WEO2 M3-K1+WEO2 +D1-WE2+D3 K1-WE2+NG3 +SS1-YAE2+G3 D1-YAE2 +NG3-SS1+YU2 W3-SS1+WE2 +G3-T1+YAE2 D3-T1+YEO2 +N3-B1+A2 +D1-WE2+G3 K1-WE2+NG3 +EU2-NG3+BB1 +T1-YU2+B3 DD1-YU2+B3 +N3-JJ1+WA2 N3-JJ1+YAE2 +SS1-YAE2+L3 D1-YAE2 +N3-B1+E2 +T1-YU2+D3 DD1-YU2+B3 +SS1-YAE2+M3 D1-YAE2 +D1-WE2+L3 K1-WE2+NG3 +SS1-YAE2+N3 D1-YAE2 +D1-WE2+M3 K1-WE2+NG3 +T1-YU2+G3 DD1-YU2+B3 +N3-JJ1+WE2 N3-JJ1+YAE2 +D1-WE2+N3 K1-WE2+NG3 +N3-B1+I2 +NG3-BB1+YEO2 NG3-BB1+E2 +N3-JJ1+WI2 +T1-YU2+L3 DD1-YU2+L3 +B1-WA2+NG3 +T1-YU2+M3 C1-YU2 +N3-B1+O2 +YA2-W3+JJ1 YA2-W3+T1 +T1-YU2+N3 DD1-YU2+N3 +SS1-YAE2+W3 D1-YAE2 +sil-R1+YA2 +JJ1-WAE2+NG3 BB1-WAE2+NG3 +NG3-D1+WA2 NG3-D1+WAE2 +D1-WE2+W3 K1-WE2+NG3 +M3-JJ1+OE2 N3-JJ1+O2 +OE2-G3+BB1 E2-G3+BB1 +L3-BB1+WEO2 L3-BB1 +sil-R1+YE2 sil-R1+YAE2 +NG3-D1+WE2 NG3-D1+YAE2 +N3-B1+U2 +EO2-W3+SS1 WEO2-W3+SS1 +sil-R1+YI2 +T1-YU2+W3 C1-YU2 +NG3-D1+WI2 +O2-M3+B1 +L3-H1+AE2 +O2-M3+C1 +O2-M3+D1 +L3-D1+OE2 L3-D1+WAE2 +sil-R1+YO2 +O2-M3+G1 +O2-M3+H1 +O2-M3+J1 +O2-M3+K1 O2-M3+GG1 +sil-R1+YU2 +O2-M3+M1 +O2-M3+N1 +O2-M3+O1 +YI2-G3+DD1 YAE2-G3+R1 +O2-M3+P1 +B3-BB1 B3-BB1+WAE2 +O2-M3+R1 +G3-S1+OE2 +M3-H1+YEO2 M3-H1+WE2 +O2-M3+S1 +O2-M3+T1 O2-M3+R1 +G3-H1+A2 +YU2-B3+GG1 B3+K1 +N1-WA2+NG3 M1-WA2+M3 +G3-H1+E2 G3-H1+OE2 +G3-H1+I2 D3-H1+I2 +B3-S1+WAE2 +sil-R1+WAE2 sil-R1+YAE2 +JJ1-YI2+NG3 YI2+NG3 +L3-B1+WA2 +D3-T1+WA2 D3-T1+YEO2 +G3-H1+O2 B3-H1+O2 +C1-WAE2 P1-WAE2 +L3-B1+WE2 L3-B1 +D3-T1+WE2 D3-T1+YEO2 +M3-O1+YAE2 N3-O1+YAE2 +D1-O2+NG3 +L3-B1+WI2 +G3-H1+U2 D3-H1+U2 +D3-T1+WI2 +EU2-NG3+DD1 +WAE2-M3+SS1 YI2-M3+SS1 +N3-JJ1+YA2 N3-JJ1+YAE2 +BB1-E2+B3 +BB1-E2+D3 BB1-E2+B3 +K1-E2+B3 +M3-M1+OE2 M3-M1+E2 +N3-JJ1+YE2 N3-JJ1+YAE2 +G3-C1+YEO2 +K1-E2+D3 +BB1-E2+G3 BB1-E2+B3 +D3-N1+YEO2 L3-N1+YEO2 +K1-E2+G3 K1-E2+B3 +N3-JJ1+YI2 N3-JJ1+YAE2 +L3-JJ1+A2 JJ1+A2 +WA2+B3 DD1-WA2+B3 +BB1-E2+L3 BB1-E2+NG3 +BB1-E2+M3 BB1-E2+NG3 +WA2+D3 DD1-WA2+D3 +I2-NG3+sil +NG3-D1+YA2 NG3-D1+YAE2 +BB1-E2+N3 BB1-E2+NG3 +K1-E2+L3 +L3-JJ1+E2 L3-JJ1+AE2 +K1-E2+M3 K1-E2 +J1-EO2+NG3 +N3-JJ1+YO2 NG3-JJ1+YO2 +K1-E2+N3 K1-E2+L3 +WA2+G3 DD1-WA2+B3 +G3-DD1+OE2 B3-DD1+OE2 +N1-WA2+B3 M1-WA2+B3 +OE2-G3+DD1 OE2-G3+C1 +NG3-D1+YE2 NG3-D1+YAE2 +E2-G3+JJ1 E2-G3 +L3-JJ1+I2 +N1-WA2+D3 M1-WA2+D3 +N3-S1+WAE2 +WA2+L3 DD1-WA2+L3 +N3-JJ1+YU2 N3-JJ1+YAE2 +NG3-D1+YI2 NG3-D1+YAE2 +N1-WA2+G3 M1-WA2+B3 +WA2+M3 DD1-WA2+NG3 +BB1-E2+W3 BB1-E2+NG3 +WA2+N3 DD1-WA2+N3 +L3-JJ1+O2 JJ1+O2 +K1-E2+W3 +O2-W3+JJ1 +N1-WA2+L3 M1-WA2+L3 +NG3-D1+YO2 NG3-D1+YAE2 +N1-WA2+M3 M1-WA2+M3 +L3-P1+A2 +N1-WA2+N3 M1-WA2+N3 +J1-WEO2+B3 JJ1-WEO2+B3 +E2-NG3+SS1 AE2-NG3+SS1 +L3-JJ1+U2 JJ1+U2 +WEO2-NG3+SS1 EO2-NG3+SS1 +J1-WEO2+D3 JJ1-WEO2+D3 +M3-K1+WA2 NG3-K1+WA2 +WA2+W3 DD1-WA2+W3 +L3-P1+E2 +NG3-D1+YU2 NG3-D1+YAE2 +BB1-YO2+NG3 P1-YO2+NG3 +J1-WEO2+G3 JJ1-WEO2+B3 +YU2-D3+BB1 WE2-D3+BB1 +K1+EO2 B3-K1+EO2 +M3-K1+WE2 M3-K1+WEO2 +L3-P1+I2 L3-P1+WI2 +N1-WA2+W3 M1-WA2+W3 +M1+WEO2 D3-M1+WEO2 +H1-EO2+B3 EO2+B3 +B3-DD1 B3-DD1+AE2 +J1-WEO2+L3 +M3-K1+WI2 M3-K1+I2 +H1-EO2+D3 +J1-WEO2+M3 J1-WEO2+NG3 +WA2-G3+sil A2-G3+sil +K1+EU2 B3-K1+EU2 +J1-WEO2+N3 JJ1-WEO2+N3 +M1-WE2+B3 O1-WE2+B3 +L3-P1+O2 +H1-EO2+G3 +M1-WE2+D3 O1-WE2+B3 +U2-NG3+sil +sil-GG1+WA2 +P1-YEO2+NG3 +M1-WE2+G3 O1-WE2+B3 +H1-EO2+L3 +DD1-YE2+B3 SS1-YE2+NG3 +L3-P1+U2 L3-P1+EU2 +H1-EO2+M3 EO2+M3 +H1-EO2+N3 +DD1-YE2+D3 SS1-YE2+NG3 +sil-GG1+WE2 sil-GG1+YAE2 +J1-WEO2+W3 JJ1-WEO2+B3 +L3-B1+YA2 L3-B1 +D3-T1+YA2 W3-T1+YA2 +M1-WE2+L3 O1-WE2+B3 +DD1-YE2+G3 SS1-YE2+NG3 +M1-WE2+M3 O1-WE2+B3 +sil-GG1+WI2 +M1-WE2+N3 O1-WE2+N3 +NG3-J1+EO2 +L3-B1+YE2 L3-B1 +D3-T1+YE2 D3-T1+YEO2 +B3-B1+WEO2 G3-B1+WEO2 +DD1-YE2+L3 SS1-YE2+NG3 +T1+WAE2 D3-T1+YEO2 +H1-EO2+W3 +DD1-YE2+M3 SS1-YE2+NG3 +L3-B1+YI2 W3-B1+YI2 +DD1-YE2+N3 SS1-YE2+NG3 +D3-T1+YI2 W3-T1+YI2 +NG3-J1+EU2 +M1-WE2+W3 O1-WE2+B3 +sil-SS1+YEO2 sil-SS1+WE2 +L3-B1+YO2 L3-B1 +D3-T1+YO2 D3-T1+YEO2 +W3-JJ1+AE2 W3-JJ1+E2 +YI2-G3+GG1 YAE2-G3+K1 +G3-T1+YEO2 D3-T1+YEO2 +DD1-YE2+W3 SS1-YE2+NG3 +WI2-N3+B1 I2-N3+B1 +WI2-N3+C1 I2-N3+C1 +WI2-N3+D1 I2-N3+D1 +L3-B1+YU2 W3-B1+YU2 +D3-T1+YU2 D3-T1+YEO2 +WA2-B3 B3 +YU2-B3+JJ1 B3+C1 +WI2-N3+G1 I2-N3+G1 +WA2-D3 WA2-D3+B1 +WI2-N3+H1 I2-N3+H1 +WI2-N3+J1 I2-N3+J1 +WA2-G3 A2-G3+C1 +WI2-N3+K1 +WI2-N3+M1 +WI2-N3+N1 I2-N3+N1 +G1-U2+NG3 +WI2-N3+O1 I2-N3+O1 +J1-WAE2+B3 WAE2+B3 +WA2-L3 +WI2-N3+P1 I2-N3+P1 +N3-GG1+AE2 +WA2-M3 M3 +J1-WAE2+D3 G1-WAE2+D3 +WA2-N3 +WI2-N3+R1 I2-N3+R1 +WI2-N3+S1 I2-N3+S1 +WI2-N3+T1 I2-N3+T1 +J1-WAE2+G3 WAE2+B3 +EU2-W3+BB1 +H1-AE2+B3 H1-AE2 +J1-WAE2+L3 WAE2+L3 +H1-AE2+D3 +SS1-YE2+B3 SS1-YE2+NG3 +J1-WAE2+M3 P1-WAE2 +M3-K1+YA2 M3-K1+WEO2 +WA2-W3 +L3-H1+EO2 +J1-WAE2+N3 WAE2+L3 +B1-YO2+NG3 P1-YO2+NG3 +SS1-YE2+D3 SS1-YE2+NG3 +WE2-M3+sil WAE2-M3+sil +H1-AE2+G3 H1-AE2 +EU2-NG3+GG1 +M3-K1+YE2 M3-K1+WEO2 +YU2-D3+DD1 WE2-D3+DD1 +SS1-YE2+G3 SS1-YE2+NG3 +YE2-NG3+B1 WAE2-NG3+B1 +L3-H1+EU2 +L3-H1+YAE2 L3-H1 +YE2-NG3+C1 WAE2-NG3+C1 +H1-AE2+L3 H1-AE2 +M3-K1+YI2 M3-K1+I2 +YE2-NG3+D1 WAE2-NG3+D1 +H1-AE2+M3 +B3-M1+A2 +H1-AE2+N3 +SS1-YE2+L3 SS1-YE2+NG3 +J1-WAE2+W3 P1-WAE2 +SS1-YE2+M3 SS1-YE2+NG3 +YE2-NG3+G1 WAE2-NG3+G1 +sil-T1+WA2 sil-T1+E2 +SS1-YE2+N3 SS1-YE2+NG3 +YE2-NG3+H1 WAE2-NG3+H1 +B3-M1+E2 B3-M1+AE2 +M3-K1+YO2 NG3-K1+YO2 +YE2-NG3+J1 WAE2-NG3+J1 +sil-GG1+YA2 sil-GG1+YAE2 +YE2-NG3+K1 WAE2-NG3+K1 +sil-T1+WE2 sil-T1+E2 +M1-O2+NG3 +YE2-NG3+M1 WAE2-NG3+M1 +N3-O1+A2 +B3-M1+I2 M1+WI2 +YE2-NG3+N1 WAE2-NG3+N1 +sil-GG1+YE2 sil-GG1+YAE2 +H1-AE2+W3 +YE2-NG3+O1 WAE2-NG3+O1 +sil-T1+WI2 +OE2-G3+GG1 OE2-G3+G1 +M3-K1+YU2 NG3-K1+YU2 +YE2-NG3+P1 WAE2-NG3+P1 +R1+A2 B3-R1+A2 +SS1-YE2+W3 SS1-YE2+NG3 +N3-O1+E2 +YE2-NG3+R1 WAE2-NG3+R1 +sil-GG1+YI2 sil-GG1+YAE2 +YE2-NG3+S1 WAE2-NG3+S1 +M1+AE2 B3-M1+AE2 +B3-M1+O2 +YE2-NG3+T1 WAE2-NG3+T1 +R1+E2 N3-R1+E2 +N3-O1+I2 +B3-S1+WEO2 B3-S1 +sil-R1+WEO2 +OE2-NG3+BB1 AE2-NG3+BB1 +R1+I2 N3-R1+I2 +C1-WE2+NG3 K1-WE2+NG3 +sil-GG1+YO2 +B3-M1+U2 G3-M1+U2 +N3-O1+O2 M3-O1+O2 +C1-WEO2 C1-WEO2+B3 +N1-YO2+NG3 M1-YO2+NG3 +R1+O2 N3-R1+O2 +sil-GG1+YU2 sil-GG1+YAE2 +M3-O1+YEO2 N3-O1+YEO2 +N3-O1+U2 O1+U2 +M3-GG1+WAE2 GG1+WAE2 +R1+U2 N3-R1+U2 +B3-GG1 G3-GG1+YAE2 +NG3-H1+OE2 +G1+WA2 W3-G1+WA2 +D1-YE2+B3 H1-YE2+B3 +J1-WAE2 P1-WAE2 +D1-YE2+D3 H1-YE2+B3 +W3-H1+A2 +G1+WE2 L3-G1+WE2 +EU2-W3+DD1 +D1-YE2+G3 H1-YE2+B3 +G3-G1+WAE2 D3-G1+WAE2 +N3-S1+WEO2 N3-S1+YAE2 +W3-H1+E2 +O1-WE2+NG3 O1-WE2+B3 +G1+WI2 +D1-YE2+L3 H1-YE2+B3 +W3-H1+I2 L3-H1+I2 +D1-YE2+M3 H1-YE2+B3 +D1-YE2+N3 H1-YE2+B3 +C1-A2+B3 +WE2-W3+SS1 WAE2-W3+SS1 +C1-A2+D3 +W3-H1+O2 +C1-A2+G3 +YI2-G3+JJ1 YAE2-G3+C1 +sil-T1+YA2 sil-T1+E2 +D1-YE2+W3 H1-YE2+B3 +C1-A2+L3 +W3-H1+U2 +C1-A2+M3 +sil-T1+YE2 sil-T1+E2 +C1-A2+N3 +YA2-D3+B1 YI2-D3+B1 +YA2-M3+sil WAE2-M3+sil +YA2-D3+C1 YI2-D3+C1 +YA2-D3+D1 YI2-D3+D1 +sil-T1+YI2 sil-T1+E2 +R1-A2 +YAE2-D3+B1 YI2-D3+B1 +L3-J1+AE2 +YAE2-D3+C1 YI2-D3+C1 +YA2-D3+G1 YI2-D3+G1 +YAE2-D3+D1 YI2-D3+D1 +YA2-D3+H1 YI2-D3+H1 +R1-E2 R1-E2+B3 +C1-A2+W3 +YA2-D3+J1 YI2-D3+C1 +sil-T1+YO2 sil-T1+E2 +YAE2-D3+G1 YI2-D3+G1 +YA2-D3+K1 D3 +YAE2-D3+H1 YI2-D3+H1 +YA2-D3+M1 YI2-D3+M1 +R1-I2 +YAE2-D3+J1 YI2-D3+C1 +YA2-D3+N1 YI2-D3+N1 +YAE2-D3+K1 D3 +YA2-D3+O1 YI2-D3+O1 +OE2-NG3+DD1 AE2-NG3+DD1 +M1-YAE2+NG3 D1-YAE2 +YA2-D3+P1 D3 +sil-T1+YU2 sil-T1+E2 +YAE2-D3+M1 YI2-D3+M1 +YAE2-D3+N1 YI2-D3+N1 +YA2-D3+R1 YI2-D3+R1 +W3-JJ1+WAE2 W3-JJ1+YA2 +YAE2-D3+O1 YI2-D3+O1 +YA2-D3+S1 YI2-D3+S1 +R1-O2 R1-O2+L3 +YAE2-D3+P1 D3 +YA2-D3+T1 YI2-D3+T1 +sil-DD1+AE2 sil-DD1+E2 +D3-BB1 D3-BB1+E2 +O2-NG3 O2-NG3+R1 +T1+WEO2 D3-T1+YEO2 +YAE2-D3+R1 YI2-D3+R1 +EU2-NG3+JJ1 EU2-NG3+DD1 +YAE2-D3+S1 YI2-D3+S1 +YU2-D3+GG1 WE2-D3+GG1 +YAE2-D3+T1 YI2-D3+T1 +B1-WAE2+NG3 P1-WAE2 +R1-U2 R1-U2+B3 +M3-JJ1+WA2 M3-JJ1+WAE2 +YU2-W3+B1 +YU2-W3+C1 +M3-JJ1+WE2 M3-JJ1+WAE2 +YU2-W3+D1 +N3-SS1+A2 +W3-JJ1+EO2 +O1-EU2+B3 O1-EU2 +O1-EU2+D3 +YU2-W3+G1 +M3-JJ1+WI2 N3-JJ1+WI2 +YU2-W3+H1 +N3-SS1+E2 L3-SS1+OE2 +L3-D1+WA2 L3-D1+WAE2 +WAE2-N3+B1 YI2-N3+B1 +O1-EU2+G3 O1-EU2 +YU2-W3+J1 +W3-JJ1+EU2 +WAE2-N3+C1 YI2-N3+C1 +G1+YA2 B3-G1+YA2 +YU2-W3+K1 +OE2-G3+JJ1 OE2-G3+C1 +WAE2-N3+D1 YI2-N3+D1 +E2-W3+B1 +N3-SS1+I2 N3-SS1+WI2 +WA2-W3+BB1 +L3-D1+WE2 L3-D1+WEO2 +H1-I2+B3 J1-I2+B3 +E2-W3+C1 E2-W3+JJ1 +YU2-W3+M1 +L3-JJ1+OE2 JJ1+OE2 +E2-W3+D1 +YU2-W3+N1 +H1-I2+D3 J1-I2+D3 +WAE2-N3+G1 YI2-N3+G1 +G1+YE2 W3-G1+YE2 +O1-EU2+L3 +YU2-W3+O1 +WAE2-N3+H1 +O1-EU2+M3 +YU2-W3+P1 +L3-D1+WI2 +E2-W3+G1 +O1-EU2+N3 +H1-I2+G3 +WAE2-N3+J1 YI2-N3+J1 +E2-W3+H1 +YU2-W3+R1 +N3-SS1+O2 L3-SS1+O2 +WAE2-N3+K1 YI2-N3+K1 +G1+YI2 B3-G1+YI2 +YU2-W3+S1 +JJ1-YAE2 D1-YAE2 +E2-W3+J1 +N3-GG1+EO2 +YU2-W3+T1 +M3-S1+AE2 +WAE2-N3+M1 YO2-N3+M1 +E2-W3+K1 OE2-W3+K1 +WAE2-N3+N1 WE2-N3+N1 +M3-O1+OE2 N3-O1+WAE2 +H1-I2+L3 +WAE2-N3+O1 YI2-N3+O1 +G3-S1+WA2 G3-S1 +E2-W3+M1 +H1-I2+M3 +WAE2-N3+P1 YI2-N3+P1 +E2-W3+N1 +N3-SS1+U2 +H1-I2+N3 +E2-W3+O1 +G1+YO2 W3-G1+YO2 +YO2-L3+BB1 YU2-L3+BB1 +WAE2-N3+R1 YI2-N3+R1 +E2-W3+P1 OE2-W3+P1 +N3-GG1+EU2 +NG3-D1+A2 +O1-EU2+W3 O1-EU2 +WAE2-N3+S1 WE2-N3+S1 +G3-S1+WE2 G3-S1 +WAE2-N3+T1 YI2-N3+T1 +E2-W3+R1 +E2-W3+S1 +D1-YU2+NG3 D1-YU2+M3 +YA2+B3 G1-YA2+B3 +E2-W3+T1 +NG3-D1+E2 +G3-S1+WI2 G3-S1+I2 +G1+YU2 B3-G1+YU2 +YA2+D3 G1-YA2+D3 +B3-JJ1 B3-JJ1+WAE2 +H1-I2+W3 +NG3-D1+I2 +YA2+G3 G1-YA2+G3 +N1-YA2+B3 +L3-H1+YEO2 +N1-YA2+D3 N1-YA2+B3 +YA2+L3 JJ1-YA2+L3 +YA2-W3+SS1 WAE2-W3+SS1 +NG3-D1+O2 +N1-YA2+G3 N1-YA2+B3 +YA2+M3 G1-YA2+M3 +M1-WA2+NG3 M1-WA2+M3 +YA2+N3 G1-YA2+N3 +B3-C1+AE2 +N1-YA2+L3 N1-YA2 +NG3-D1+U2 +D3-H1+WAE2 B3-H1 +N1-YA2+M3 +N1-YA2+N3 N1-YA2+NG3 +M3-M1+WA2 +EU2-W3+GG1 +YA2+W3 T1-YA2+W3 +O2-M3+sil +M1+EO2 D3-M1+EO2 +M3-M1+WE2 M1+WE2 +OE2-D3+B1 E2-D3+B1 +OE2-D3+C1 +N1-YA2+W3 +OE2-D3+D1 +D3-DD1+YAE2 D3-DD1+WA2 +L3-O1+YAE2 L3-O1 +D3-DD1 +M3-M1+WI2 M3-M1+I2 +M1+EU2 B3-M1+EU2 +OE2-D3+G1 E2-D3+G1 +OE2-D3+H1 E2-D3+H1 +YAE2-G3+BB1 YAE2-G3+P1 +M1-YE2+B3 M1-YE2 +M3-JJ1+YA2 M3-JJ1+WAE2 +P1-YU2+NG3 BB1-YU2+M3 +OE2-D3+J1 E2-D3+J1 +M1-YE2+D3 M1-YE2 +G3-DD1+WA2 B3-DD1+OE2 +OE2-D3+K1 OE2-D3+GG1 +OE2-D3+M1 AE2-D3+M1 +M3-JJ1+YE2 M3-JJ1+WAE2 +M1-YE2+G3 M1-YE2 +OE2-D3+N1 +G3-DD1+WE2 G3-DD1+WEO2 +OE2-D3+O1 +M3-GG1+WEO2 GG1+WEO2 +OE2-D3+P1 OE2-D3 +N3-G1+YAE2 N3-G1 +M3-JJ1+YI2 M3-JJ1+WAE2 +L3-D1+YA2 L3-D1+YAE2 +OE2-D3+R1 +M1-YE2+L3 M1-YE2 +G3-DD1+WI2 +OE2-D3+S1 E2-D3+S1 +M1-YE2+M3 M1-YE2 +OE2-D3+T1 AE2-D3+T1 +M1-YE2+N3 M1-YE2 +L3-D1+YE2 L3-D1+YAE2 +M3-JJ1+YO2 +WA2-W3+DD1 A2-W3+DD1 +U2-G3+sil +L3-D1+YI2 L3-D1+YAE2 +M3-S1+WAE2 +M3-JJ1+YU2 M3-JJ1+WAE2 +M1-YE2+W3 +J1-WEO2 JJ1-WEO2+B3 +OE2-NG3+GG1 E2-NG3+GG1 +JJ1-WI2+B3 DD1-WI2+NG3 +L3-D1+YO2 L3-D1+YAE2 +G3-S1+YA2 G3-S1 +JJ1-WI2+D3 DD1-WI2+NG3 +G3-G1+WEO2 D3-G1+WEO2 +G3-S1+YE2 G3-S1 +YO2-L3+DD1 YU2-L3+DD1 +JJ1-WI2+G3 DD1-WI2+NG3 +L3-D1+YU2 L3-D1+YAE2 +YA2-B3 B3 +G3-S1+YI2 G3-S1 +YU2-D3+JJ1 EO2-D3+JJ1 +YA2-D3 D3 +JJ1-WI2+L3 DD1-WI2+NG3 +JJ1-WI2+M3 DD1-WI2+NG3 +YA2-G3 YA2-G3+C1 +JJ1-WI2+N3 DD1-WI2+NG3 +D1-WI2+NG3 D1-WI2 +G3-S1+YO2 +O1-E2+NG3 O1-E2+M3 +YA2-L3 L3 +YA2-M3 M3 +GG1-WA2+B3 +W3-R1+YAE2 R1 +YA2-N3 N3 +G3-S1+YU2 +GG1-WA2+D3 +BB1-WAE2 BB1-WAE2+NG3 +JJ1-WI2+W3 DD1-WI2+NG3 +GG1-WA2+G3 GG1-WA2+B3 +E2-G3+SS1 AE2-G3+SS1 +H1+YAE2 H1 +M3-M1+YA2 M1+WE2 +YA2-W3 +L3-J1+EO2 +GG1-WA2+L3 +GG1-WA2+M3 GG1-WA2+NG3 +N3-GG1+YAE2 N3-GG1+YA2 +GG1-WA2+N3 +O2-W3+SS1 +W3-SS1+A2 +M3-M1+YE2 M1+WE2 +L3-J1+EU2 J1+EU2 +W3-SS1+E2 W3-SS1+OE2 +M3-M1+YI2 M1+WE2 +BB1-WE2+NG3 K1-WE2+NG3 +DD1-YI2+NG3 DD1-YI2 +W3-SS1+I2 W3-SS1+WI2 +GG1-WA2+W3 +YAE2-G3+DD1 YAE2-G3+R1 +G3-DD1+YA2 G3-DD1+WEO2 +W3-JJ1+WEO2 +M3-M1+YO2 M1+YO2 +sil-DD1+EO2 +G3-DD1+YE2 G3-DD1+WEO2 +W3-SS1+O2 +NG3-C1+WAE2 NG3-C1+YAE2 +sil-JJ1+WAE2 sil-JJ1+YAE2 +P1-WI2+NG3 P1-WI2+B3 +M3-M1+YU2 M1+WE2 +G3-DD1+YI2 G3-DD1+WEO2 +sil-DD1+EU2 +S1-A2+B3 +O1+AE2 B3-O1+AE2 +S1-A2+D3 +W3-SS1+U2 SS1+U2 +K1+OE2 B3-K1+OE2 +S1-A2+G3 +YE2-B3+B1 B3+B1 +G3-DD1+YO2 G3-DD1+WEO2 +YE2-B3+C1 B3+C1 +YE2-B3+D1 B3 +S1-A2+L3 +YE2-B3+G1 B3+G1 +M3-GG1+AE2 M3-GG1+OE2 +S1-A2+M3 +YE2-B3+H1 B3 +G3-DD1+YU2 G3-DD1+WEO2 +S1-A2+N3 +EU2-W3+JJ1 +YE2-B3+J1 B3+C1 +YE2-B3+K1 B3+K1 +B1-A2+NG3 +YE2-B3+M1 B3+M1 +YE2-B3+N1 B3+N1 +YE2-B3+O1 B3+O1 +YE2-B3+P1 B3+B1 +JJ1-YEO2 YEO2 +D3-GG1 D3-GG1+YAE2 +M3-S1+EO2 +S1-A2+W3 +YE2-B3+R1 B3 +YE2-B3+S1 B3+S1 +NG3-N1+AE2 NG3-N1+OE2 +A2-D3+B1 A2-D3 +YE2-B3+T1 B3 +A2-G3+BB1 A2-G3+P1 +A2-D3+C1 A2-D3+JJ1 +NG3-J1+OE2 NG3-J1+E2 +A2-D3+D1 +D3-DD1+AE2 D3-DD1 +M3-S1+EU2 +A2-D3+G1 +A2-D3+H1 A2-D3 +A2-D3+J1 A2-D3+JJ1 +YU2-B3+SS1 WE2-B3+SS1 +A2-D3+K1 A2-D3 +A2-D3+M1 +A2-D3+N1 +I2-L3+sil +A2-D3+O1 +A2-D3+P1 A2-D3 +WAE2-G3+sil YI2-G3+sil +WA2-W3+GG1 WA2-W3 +A2-D3+R1 +A2-D3+S1 YI2-D3+S1 +A2-D3+T1 +B3-C1+EO2 +D3-H1+WEO2 +OE2-NG3+JJ1 AE2-NG3+DD1 +B3-C1+EU2 B3-C1+YI2 +B1-WE2+NG3 K1-WE2+NG3 +U2-W3+B1 +U2-W3+C1 +YO2-L3+GG1 YU2-L3+GG1 +U2-W3+D1 +NG3-H1+WA2 +U2-W3+G1 +U2-W3+H1 +NG3-H1+WE2 NG3-H1+WAE2 +D3-DD1+YEO2 D3-DD1+WA2 +L3-O1+YEO2 +B3-N1+YAE2 +sil-M1+YAE2 sil-M1+WE2 +U2-W3+J1 +U2-W3+K1 +NG3-H1+WI2 +U2-W3+M1 +U2-W3+N1 +U2-W3+O1 +L3-H1+OE2 +U2-W3+P1 +U2-W3+R1 +U2-W3+S1 +U2-W3+T1 +M3-R1+A2 B3-R1+A2 +WA2-W3+B1 +N3-G1+YEO2 +WA2-W3+C1 +BB1-WI2+B3 BB1-WI2 +WA2-W3+D1 +M3-R1+E2 N3-R1+E2 +K1-EU2+NG3 K1-EU2 +BB1-WI2+D3 BB1-WI2 +WA2-W3+G1 +WA2-W3+H1 +M3-R1+I2 N3-R1+I2 +BB1-WI2+G3 BB1-WI2 +WA2-W3+J1 +E2-M3+BB1 AE2-M3+BB1 +WA2-W3+K1 +EO2-NG3+B1 WEO2-NG3+B1 +M3-S1+WEO2 M3-S1+WA2 +WA2-W3+M1 +EO2-NG3+C1 WEO2-NG3+C1 +N1-WE2+NG3 O1-WE2+B3 +BB1-WI2+L3 BB1-WI2 +WA2-W3+N1 +EO2-NG3+D1 WEO2-NG3+D1 +M3-R1+O2 N3-R1+O2 +BB1-WI2+M3 BB1-WI2 +WA2-W3+O1 +BB1-WI2+N3 BB1-WI2 +WA2-W3+P1 +O2+B3 +EO2-NG3+G1 +WA2-W3+R1 +O2+D3 H1-O2+D3 +EO2-NG3+H1 +WA2-W3+S1 +YAE2-G3+GG1 YAE2-G3+K1 +A2-G3+DD1 +WA2-W3+T1 A2-W3+T1 +G1-YU2+B3 GG1-YU2+B3 +EO2-NG3+J1 WEO2-NG3+J1 +M3-R1+U2 N3-R1+U2 +O2+G3 +EO2-NG3+K1 WEO2-NG3+K1 +G1-YU2+D3 GG1-YU2+D3 +N3-N1+YAE2 N3-N1+YE2 +EO2-NG3+M1 +EO2-NG3+N1 +BB1-WI2+W3 BB1-WI2 +G1-YU2+G3 GG1-YU2+B3 +EO2-NG3+O1 +O2+L3 +EO2-NG3+P1 WEO2-NG3+P1 +WI2-G3+BB1 +O2+M3 +L3-SS1+WAE2 L3-SS1+WE2 +O2+N3 +EO2-NG3+R1 WEO2-NG3+R1 +EO2-NG3+S1 +G1-YU2+L3 GG1-YU2+L3 +EO2-NG3+T1 WEO2-NG3+T1 +G1-YU2+M3 G1-YU2 +G1-YU2+N3 GG1-YU2+N3 +W3-R1+YEO2 B3-R1+YEO2 +O2+W3 +BB1-WEO2 P1-WEO2 +AE2-G3+BB1 +YO2-N3+BB1 YU2-N3+BB1 +H1+YEO2 W3-H1+YEO2 +L3-SS1+AE2 L3-SS1+OE2 +G1-YU2+W3 G1-YU2 +sil-B1 sil-B1+YAE2 +sil-C1 +sil-D1 sil-D1+E2 +U2-W3+BB1 +NG3-H1+YA2 +N3-GG1+YEO2 M3-GG1+YEO2 +sil-G1 sil-G1+E2 +O1-OE2+B3 O1-OE2 +D3-JJ1 D3-JJ1+OE2 +DD1-YEO2+NG3 JJ1-YEO2+NG3 +sil-H1 sil-H1+WEO2 +O1-OE2+D3 O1-OE2 +sil-J1 +NG3-H1+YE2 NG3-H1+WAE2 +sil-K1 sil-K1+AE2 +O1-OE2+G3 O1-OE2 +sil-M1 sil-M1+WE2 +YI2-G3+SS1 YAE2-G3+SS1 +sil-N1 sil-N1+WAE2 +NG3-H1+YI2 +sil-O1 +sil-P1 sil-P1+WAE2 +L3-JJ1+WA2 L3-JJ1 +O1-OE2+L3 O1-OE2 +sil-R1 sil-R1+YAE2 +O1-OE2+M3 O1-OE2+NG3 +sil-S1 +O1-OE2+N3 +sil-T1 sil-T1+E2 +L3-JJ1+WE2 L3-JJ1 +NG3-H1+YO2 NG3-H1+WAE2 +O1+YAE2 G3-O1+YAE2 +NG3-C1+WEO2 NG3-C1+YAE2 +sil-JJ1+WEO2 +L3-JJ1+WI2 +M3-O1+WA2 N3-O1+WA2 +NG3-H1+YU2 NG3-H1+WAE2 +WA2-W3+JJ1 WA2-W3+C1 +G3-DD1+A2 +O1+EO2 +J1-U2+B3 +sil-N1+A2 +M3-O1+WE2 +O1-OE2+W3 O1-OE2 +B1-WA2+B3 +J1-U2+D3 JJ1-U2+D3 +G3-DD1+E2 G3-DD1 +B1-WA2+D3 +sil-N1+E2 +M3-O1+WI2 M3-O1+I2 +J1-U2+G3 J1-U2+B3 +O1+EU2 M3-O1+EU2 +E2-M3+DD1 AE2-M3+DD1 +G3-DD1+I2 G3-DD1+WI2 +B1-WA2+G3 B1-WA2+B3 +M3-GG1+EO2 GG1+EO2 +sil-N1+I2 sil-N1+WI2 +O2-B3 O2-B3+G1 +J1-U2+L3 +J1-U2+M3 +YO2-L3+JJ1 YU2-L3+JJ1 +O2-D3 O2-D3+H1 +B1-WA2+L3 +J1-U2+N3 +G3-DD1+O2 +B1-WA2+M3 B1-WA2+NG3 +EU2-NG3+SS1 +B1-WA2+N3 +NG3-J1+WAE2 NG3-J1+YAE2 +M3-GG1+EU2 N3-GG1+EU2 +sil-N1+O2 +O2-G3 O2-G3+JJ1 +C1-YU2+NG3 C1-YU2 +G3-DD1+U2 +O2-L3 +sil-N1+U2 +NG3-N1+EO2 +O2-M3 O2-M3+GG1 +J1-U2+W3 +O2-N3 +WI2-G3+DD1 WI2-G3+D1 +B1-WA2+W3 +D3-DD1+EO2 +NG3-N1+EU2 +D3-DD1+EU2 +OE2-G3+SS1 AE2-G3+SS1 +JJ1-YI2+B3 YI2+NG3 +O2-W3 +JJ1-YI2+D3 YI2+NG3 +AE2-G3+DD1 AE2-G3+R1 +W3-JJ1+OE2 +YE2-G3+BB1 YAE2-G3+P1 +YO2-N3+DD1 YU2-N3+DD1 +JJ1-YI2+G3 YI2+NG3 +sil-DD1+YAE2 sil-DD1+WA2 +YEO2-L3+sil +JJ1-YI2+L3 YI2+NG3 +U2-W3+DD1 +JJ1-YI2+M3 YI2+NG3 +JJ1-YI2+N3 YI2+NG3 +YAE2-G3+JJ1 YAE2-G3+C1 +A2-G3+GG1 A2-G3+G1 +GG1-YA2+B3 G1-YA2+B3 +L3-JJ1+YA2 L3-JJ1 +N3-GG1+OE2 +O1-YU2+NG3 +GG1-YA2+D3 G1-YA2+D3 +A2-NG3+BB1 +B3-SS1 B3-SS1+WE2 +JJ1-YI2+W3 YI2+NG3 +L3-JJ1+YE2 L3-JJ1 +GG1-YA2+G3 G1-YA2+G3 +B3-N1+YEO2 +sil-M1+YEO2 +M3-G1+YAE2 N3-G1 +L3-JJ1+YI2 L3-JJ1 +M3-O1+YA2 +GG1-YA2+L3 G1-YA2+L3 +GG1-YA2+M3 G1-YA2+M3 +GG1-YA2+N3 G1-YA2+N3 +M3-O1+YE2 N3-O1+YE2 +H1-EO2+NG3 +L3-JJ1+YO2 JJ1+YO2 +DD1-EO2+B3 +M3-O1+YI2 N3-O1+WAE2 +DD1-EO2+D3 +L3-S1+WAE2 +WAE2-W3+BB1 YAE2-W3+BB1 +DD1-EO2+G3 +L3-JJ1+YU2 L3-JJ1 +GG1-YA2+W3 K1-YA2+W3 +M3-O1+YO2 +DD1-EO2+L3 +sil-T1+YAE2 sil-T1+E2 +DD1-EO2+M3 +DD1-EO2+N3 +H1-WEO2+B3 H1-WEO2 +M3-O1+YU2 N3-O1+YU2 +DD1-U2+NG3 DD1-U2 +H1-WEO2+D3 +N3-K1+WAE2 M3-K1+WAE2 +SS1-YEO2+NG3 JJ1-YEO2+NG3 +H1-WEO2+G3 H1-WEO2 +M1+OE2 B3-M1+AE2 +DD1-EO2+W3 +G3-B1+YAE2 B3-B1 +C1-WI2+NG3 C1-WI2 +WI2-D3+B1 +N3-N1+YEO2 +H1-WEO2+L3 +WI2-D3+C1 +H1-WEO2+M3 H1-WEO2+NG3 +WI2-D3+D1 I2-D3+D1 +YI2-M3+BB1 YAE2-M3+BB1 +H1-WEO2+N3 +WI2-D3+G1 +WI2-D3+H1 +L3-SS1+WEO2 L3-SS1+WE2 +WI2-D3+J1 +T1-EO2+NG3 +WI2-D3+K1 WI2-D3 +WI2-D3+M1 +YE2-G3+DD1 YAE2-G3+R1 +H1-WEO2+W3 H1-WEO2 +WI2-D3+N1 +EU2-M3+sil +WI2-D3+O1 +WI2-D3+P1 WI2-D3+BB1 +E2-M3+GG1 +NG3-P1+AE2 +WI2-D3+R1 +WI2-D3+S1 +WI2-D3+T1 WI2-D3+R1 +L3-SS1+EO2 SS1+EO2 +SS1-EO2+B3 +YU2-D3+SS1 WE2-D3+SS1 +K1+WA2 B3-K1+WA2 +SS1-EO2+D3 +L3-SS1+EU2 +N3-B1+AE2 +K1-WA2+B3 G1-WA2+B3 +SS1-EO2+G3 +A2-NG3+DD1 A2-NG3+JJ1 +K1+WE2 L3-K1 +I2-N3+sil +K1-WA2+D3 G1-WA2+D3 +WI2-G3+GG1 WI2-G3+G1 +DD1-AE2+B3 DD1-AE2 +K1-WA2+G3 G1-WA2+B3 +O1-WI2+NG3 N1-WI2+NG3 +K1+WI2 B3-K1+WI2 +DD1-AE2+D3 +SS1-EO2+L3 +B3-C1+A2 B3-C1+WA2 +SS1-EO2+M3 +SS1-EO2+N3 SS1-EO2+M3 +DD1-AE2+G3 +K1-WA2+L3 G1-WA2+L3 +SS1-U2+NG3 SS1-U2 +K1-WA2+M3 +B3-C1+E2 +K1-WA2+N3 +O1+YEO2 +DD1-AE2+L3 DD1-AE2 +DD1-AE2+M3 +B3-C1+I2 B3-C1+WI2 +AE2-G3+GG1 AE2-G3+K1 +DD1-AE2+N3 +SS1-EO2+W3 +H1-WAE2+B3 +YO2-N3+GG1 YE2-N3+GG1 +H1+A2 W3-H1+A2 +NG3-J1+WA2 +L3-GG1+AE2 M3-GG1+OE2 +R1-WAE2+NG3 T1-WAE2+NG3 +H1-WAE2+D3 +WAE2-W3+DD1 WAE2-W3+T1 +OE2-M3+BB1 AE2-M3+BB1 +K1-WA2+W3 +B3-C1+O2 +H1+E2 W3-H1+E2 +NG3-J1+WE2 NG3-J1+YAE2 +H1-WAE2+G3 H1-WAE2+B3 +U2-W3+GG1 +YA2+NG3 G1-YA2+M3 +DD1-AE2+W3 +M3-SS1+YAE2 W3-SS1+WE2 +H1+I2 L3-H1+I2 +NG3-J1+WI2 +B3-C1+U2 +L3-N1+AE2 +H1-WAE2+L3 +H1-WAE2+M3 H1-WAE2 +L3-J1+OE2 +A2-G3+JJ1 A2-G3+C1 +H1-WAE2+N3 H1-WAE2+L3 +H1+O2 W3-H1+O2 +NG3-J1+WEO2 NG3-J1+YAE2 +WE2-NG3+B1 WAE2-NG3+B1 +WE2-NG3+C1 WAE2-NG3+C1 +G3-S1+YAE2 G3-S1 +WE2-NG3+D1 WAE2-NG3+D1 +BB1-YI2+B3 P1-YI2+B3 +H1+U2 +H1-WAE2+W3 H1-WAE2 +WE2-NG3+G1 WAE2-NG3+G1 +BB1-YI2+D3 P1-YI2+B3 +YI2-M3+DD1 WA2-M3+R1 +WE2-NG3+H1 WAE2-NG3+H1 +WE2-NG3+J1 WAE2-NG3+J1 +BB1-YI2+G3 P1-YI2+B3 +sil-DD1+OE2 sil-DD1+WA2 +WE2-NG3+K1 WAE2-NG3+K1 +WE2-NG3+M1 WAE2-NG3+M1 +WE2-NG3+N1 WAE2-NG3+N1 +WE2-NG3+O1 WAE2-NG3+O1 +BB1-YI2+L3 P1-YI2+B3 +WE2-NG3+P1 WAE2-NG3+P1 +BB1-YI2+M3 P1-YI2+B3 +SS1-AE2+B3 SS1-AE2 +BB1-YI2+N3 P1-YI2+B3 +EU2-W3+SS1 +WE2-NG3+R1 WAE2-NG3+R1 +SS1-AE2+D3 +WE2-NG3+S1 WAE2-NG3+S1 +WE2-NG3+T1 WAE2-NG3+T1 +SS1-AE2+G3 SS1-AE2 +JJ1-YO2+NG3 C1-YO2 +L3-H1+WA2 +G3-K1+A2 K1+A2 +BB1-YI2+W3 P1-YI2+B3 +sil-DD1+YEO2 sil-DD1+WA2 +SS1-AE2+L3 SS1-AE2 +K1+YA2 L3-K1 +SS1-AE2+M3 SS1-AE2 +L3-H1+WE2 L3-H1 +SS1-AE2+N3 +JJ1-A2+NG3 +G3-K1+E2 K1+E2 +K1+YE2 L3-K1 +D1-U2+NG3 +D3-C1+YAE2 C1 +L3-H1+WI2 +G3-K1+I2 W3-K1+I2 +K1+YI2 B3-K1+YI2 +SS1-AE2+W3 SS1-AE2 +M3-S1+OE2 M3-S1+E2 +G3-K1+O2 K1+O2 +K1+YO2 B3-K1+YO2 +G3-K1+U2 K1+U2 +M3-G1+YEO2 N3-G1+YEO2 +YE2-W3+sil +K1+YU2 B3-K1+YU2 +H1-WI2+B3 H1-WI2+NG3 +H1-A2 +NG3-J1+YA2 NG3-J1+YAE2 +YE2-G3+GG1 YAE2-G3+K1 +J1-EU2+NG3 +H1-WI2+D3 H1-WI2+NG3 +OE2-M3+DD1 AE2-M3+DD1 +H1-E2 H1-E2+NG3 +NG3-J1+YE2 NG3-J1+YAE2 +E2-M3+JJ1 +OE2-NG3+SS1 AE2-NG3+SS1 +H1-WI2+G3 H1-WI2+NG3 +H1-I2 +L3-S1+WEO2 L3-S1 +NG3-J1+YI2 NG3-J1+YAE2 +B3-R1+WAE2 R1 +D3-B1+A2 B3-B1+A2 +M1-WE2+NG3 O1-WE2+B3 +H1-WI2+L3 H1-WI2+NG3 +B3-G1+AE2 D3-G1+AE2 +H1-WI2+M3 H1-WI2+NG3 +H1-WI2+N3 H1-WI2+NG3 +B3-C1+OE2 +D3-B1+E2 +H1-O2 +NG3-J1+YO2 NG3-J1+YAE2 +sil-T1+YEO2 sil-T1+E2 +B1+WAE2 B1 +D3-B1+I2 +A2-NG3+GG1 +M3-N1+YAE2 M3-N1+YE2 +WI2-G3+JJ1 +H1-U2 H1-U2+B3 +NG3-J1+YU2 NG3-J1+YAE2 +N3-K1+WEO2 M3-K1+WEO2 +H1-WI2+W3 H1-WI2+NG3 +BB1-YU2+NG3 BB1-YU2+M3 +B1-EU2+B3 B1-EU2 +D3-B1+O2 G3-B1+EO2 +YU2-M3+B1 YA2-M3+B1 +B1-YA2+B3 G1-YA2+B3 +B1-EU2+D3 +YU2-M3+C1 YI2-M3+JJ1 +YU2-M3+D1 WA2-M3+D1 +B1-YA2+D3 G1-YA2+D3 +G3-B1+YEO2 G3-B1+AE2 +YAE2-NG3 WAE2-NG3+R1 +B1-EU2+G3 B1-EU2 +WA2-M3+sil A2-M3+sil +L3-S1+A2 +YU2-M3+G1 WA2-M3+G1 +D3-B1+U2 B3-B1+U2 +B1-YA2+G3 G1-YA2+G3 +YU2-M3+H1 WA2-M3+H1 +DD1-A2+B3 +W3-B1+AE2 B1+AE2 +T1-WA2+B3 DD1-WA2+B3 +YA2-NG3+B1 +WAE2-D3+B1 YI2-D3+B1 +AE2-G3+JJ1 +YU2-M3+J1 WA2-M3+J1 +DD1-A2+D3 DD1-A2+B3 +L3+sil YO2-L3+sil +L3-S1+E2 +YA2-NG3+C1 +WAE2-D3+C1 YI2-D3+C1 +B1-EU2+L3 +YU2-M3+K1 WA2-M3+K1 +T1-WA2+D3 DD1-WA2+D3 +YA2-NG3+D1 +WAE2-D3+D1 YI2-D3+D1 +E2-M3+B1 OE2-M3+B1 +B1-EU2+M3 +YO2-N3+JJ1 YE2-N3+JJ1 +B1-YA2+L3 G1-YA2+L3 +E2-M3+C1 E2-M3+JJ1 +B1-EU2+N3 +YU2-M3+M1 WA2-M3+M1 +DD1-A2+G3 +B1-YA2+M3 G1-YA2+M3 +E2-M3+D1 +WAE2-W3+GG1 YAE2-W3+GG1 +YU2-M3+N1 WA2-M3+N1 +B1-YA2+N3 G1-YA2+N3 +T1-WA2+G3 DD1-WA2+B3 +L3-S1+I2 L3-S1+WI2 +YA2-NG3+G1 +WAE2-D3+G1 YI2-D3+G1 +YU2-M3+O1 WA2-M3+O1 +YA2-NG3+H1 +WAE2-D3+H1 YI2-D3+H1 +YU2-M3+P1 WA2-M3+P1 +E2-M3+G1 +L3-H1+YA2 +YA2-NG3+J1 YA2-NG3+D1 +WAE2-D3+J1 YI2-D3+C1 +U2-W3+JJ1 +E2-M3+H1 AE2-M3+H1 +YU2-M3+R1 WA2-M3+R1 +DD1-A2+L3 +YA2-NG3+K1 +WAE2-D3+K1 WAE2-D3 +YU2-M3+S1 WA2-M3+S1 +N3-R1+WAE2 R1 +DD1-A2+M3 +YO2-B3+sil YU2-B3+sil +T1-WA2+L3 DD1-WA2+L3 +E2-M3+J1 OE2-M3+J1 +YU2-M3+T1 WA2-M3+R1 +DD1-A2+N3 DD1-A2 +T1-A2+B3 +T1-WA2+M3 DD1-WA2+NG3 +L3-S1+O2 +YA2-NG3+M1 +WAE2-D3+M1 YI2-D3+M1 +NG3-P1+EO2 M3-P1+EO2 +E2-M3+K1 OE2-M3+K1 +L3-H1+YE2 W3-H1+YE2 +T1-WA2+N3 DD1-WA2+N3 +YA2-NG3+N1 +WAE2-D3+N1 YI2-D3+N1 +B1-EU2+W3 +T1-A2+D3 +YA2-NG3+O1 +WAE2-D3+O1 +E2-M3+M1 AE2-M3+M1 +B1-YA2+W3 D1-YA2+W3 +YA2-NG3+P1 +WAE2-D3+P1 WAE2-D3 +E2-M3+N1 AE2-M3+N1 +E2-M3+O1 WA2-M3+O1 +L3-H1+YI2 W3-H1+YI2 +T1-A2+G3 +YA2-NG3+R1 YA2-NG3 +WAE2-D3+R1 YI2-D3+R1 +E2-M3+P1 OE2-M3+P1 +D3-T1+YAE2 D3-T1+YEO2 +L3-S1+U2 +YA2-NG3+S1 +WAE2-D3+S1 YI2-D3+S1 +NG3-P1+EU2 NG3-P1+U2 +YA2-NG3+T1 +WAE2-D3+T1 YI2-D3+T1 +E2-M3+R1 AE2-M3+DD1 +E2-M3+S1 +DD1-A2+W3 +E2-M3+T1 AE2-M3+DD1 +T1-A2+L3 +T1-WA2+W3 P1-WA2+W3 +L3-H1+YO2 +T1-A2+M3 +N3-B1+EO2 +GG1-OE2+NG3 +L3+B1 YU2-L3+B1 +T1-A2+N3 +L3+C1 YU2-L3+JJ1 +YI2-M3+GG1 YAE2-M3+GG1 +L3+D1 YU2-L3+D1 +L3-H1+YU2 +L3+G1 YA2-L3+G1 +N3-B1+EU2 +L3+H1 YU2-L3+H1 +YEO2-N3+sil +L3+J1 YU2-L3+JJ1 +L3+K1 YU2-L3+GG1 +T1-A2+W3 +L3+M1 YU2-L3+M1 +L3+N1 E2-L3+N1 +L3+O1 E2-L3+O1 +O1-I2+NG3 O1-I2+N3 +L3+P1 YU2-L3+BB1 +W3-SS1+AE2 W3-SS1+OE2 +L3+R1 E2-L3+R1 +L3+S1 +L3+T1 YU2-L3+T1 +L3-GG1+EO2 N3-GG1+EO2 +D3-SS1 D3-SS1+WE2 +L3-GG1+EU2 +M3-SS1+YEO2 W3-SS1+WE2 +S1+WAE2 W3-S1+WAE2 +L3-N1+EO2 +B1-YU2+NG3 B1-YU2 +W3-JJ1+WA2 +L3-N1+EU2 +W3-JJ1+WE2 W3-JJ1+YA2 +BB1-WI2+NG3 BB1-WI2 +G3-S1+YEO2 +WA2-W3+SS1 A2-W3+SS1 +W3-JJ1+WI2 +EO2-L3+B1 WEO2-L3+B1 +GG1-O2+B3 +K1-WA2+NG3 +EO2-L3+C1 EO2-L3+JJ1 +EO2-L3+D1 WEO2-L3+D1 +GG1-O2+D3 +M1-U2+NG3 +YE2-G3+JJ1 YAE2-G3+C1 +EO2-L3+G1 +GG1-O2+G3 +B3-H1+WAE2 B3-H1 +sil-G1+WAE2 sil-G1+E2 +EO2-L3+H1 +N3-GG1+WA2 L3-GG1+WA2 +OE2-M3+GG1 E2-M3+GG1 +EO2-L3+J1 +EO2-L3+K1 EO2-L3+GG1 +BB1-A2+NG3 +B3-P1+A2 +GG1-O2+L3 +S1+AE2 W3-S1+AE2 +N3-GG1+WE2 N3-GG1+YA2 +EO2-L3+M1 +GG1-O2+M3 +EO2-L3+N1 +GG1-O2+N3 +YO2-L3+SS1 YU2-L3+SS1 +O1+OE2 B3-O1+OE2 +EO2-L3+O1 E2-L3+O1 +B3-P1+E2 G3-P1+E2 +O2-NG3+B1 +EO2-L3+P1 EO2-L3+BB1 diff --git a/res/config b/res/config new file mode 100644 index 0000000..b416a0b --- /dev/null +++ b/res/config @@ -0,0 +1,14 @@ +SOURCEFORMAT = WAV +TARGETKIND = MFCC_0_D_A_Z +TARGETRATE = 160000.0 +WINDOWSIZE = 320000.0 +SAVECOMPRESSED = F +SAVEWITHCRC = F +USEHAMMING = T +PREEMCOEF = 0.97 +NUMCHANS = 26 +CEPLIFTER = 22 +NUMCEPS = 12 +ENORMALISE = T +ZMEANSOURCE = T +USEPOWER = T diff --git a/res/hmmdefs_mono_mix16.binary b/res/hmmdefs_mono_mix16.binary new file mode 100644 index 0000000..def303f Binary files /dev/null and b/res/hmmdefs_mono_mix16.binary differ diff --git a/res/hmmdefs_tri_mix16.binary b/res/hmmdefs_tri_mix16.binary new file mode 100644 index 0000000..9d7204e Binary files /dev/null and b/res/hmmdefs_tri_mix16.binary differ diff --git a/res/online.ini b/res/online.ini new file mode 100644 index 0000000..564d84e --- /dev/null +++ b/res/online.ini @@ -0,0 +1,12 @@ +[Online_Keyword_Spotter] +Path_Executable = OfflineViterbi +Path_HTK_Config = /usr/apps/wakeup-engine-default/shared/res/config +Path_Keyword_HMM = /usr/apps/wakeup-engine-default/shared/res/HMM_Reduced.binary +Path_Keyword_Modellist = /usr/apps/wakeup-engine-default/shared/res/combine_4_phoneme_tri_xwrd1.txt +Path_Keyword_Prondict = /usr/apps/wakeup-engine-default/shared/res/PronDict_UTF8.txt +Path_Background_HMM = /usr/apps/wakeup-engine-default/shared/res/hmmdefs_mono_mix16.binary +Suffix_Keyword = _keyword.txt +Suffix_Background = _background.txt +Threshold_Keyword = 87 +Threshold_KeywordInSpeech = 85 +Show_Detail_On_Start = F diff --git a/src/multi_assistant_config.c b/src/multi_assistant_config.c deleted file mode 100644 index 25b3fdf..0000000 --- a/src/multi_assistant_config.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include -#include -#include - -#include "multi_assistant_config.h" -#include "multi_assistant_main.h" - -int mas_config_parse_assistant_info(mas_config_assistant_info_cb callback, const char *path, void* user_data) -{ - xmlDocPtr doc = NULL; - xmlNodePtr cur = NULL; - xmlChar *key; - - int loop; - int retry_count = 0; - - while (NULL == doc) { - doc = xmlParseFile(path); - if (NULL != doc) { - break; - } - - if (MA_RETRY_COUNT == retry_count++) { - MAS_LOGE("[ERROR] Fail to parse file error : %s", path); - xmlCleanupParser(); - return -1; - } - usleep(10000); - } - - cur = xmlDocGetRootElement(doc); - if (cur == NULL) { - MAS_LOGE("[ERROR] Empty document"); - xmlFreeDoc(doc); - return -1; - } - - if (xmlStrcmp(cur->name, (const xmlChar *) MA_TAG_ASSISTANT_BASE)) { - MAS_LOGE("[ERROR] The wrong type, root node is NOT %s", MA_TAG_ASSISTANT_BASE); - xmlFreeDoc(doc); - return -1; - } - - cur = cur->xmlChildrenNode; - if (cur == NULL) { - MAS_LOGE("[ERROR] Empty document"); - xmlFreeDoc(doc); - return -1; - } - - /* alloc assistant info */ - ma_assistant_info_s* temp; - temp = (ma_assistant_info_s*)calloc(1, sizeof(ma_assistant_info_s)); - if (NULL == temp) { - MAS_LOGE("[ERROR] Fail to allocate memory"); - xmlFreeDoc(doc); - return -1; - } - - temp->app_id = NULL; - temp->name = NULL; - temp->icon_path = NULL; - memset(temp->wakeup_list, 0x00, sizeof(temp->wakeup_list)); - memset(temp->wakeup_language, 0x00, sizeof(temp->wakeup_language)); - temp->cnt_wakeup = 0; - memset(temp->supported_lang, 0x00, sizeof(temp->supported_lang)); - temp->cnt_lang = 0; - temp->wakeup_engine = NULL; - temp->custom_ui_option = false; - - while (cur != NULL) { - if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar *)MA_TAG_ASSISTANT_LANGUAGE_SET)) { - xmlNodePtr child_node = cur->xmlChildrenNode; - while (child_node != NULL) { - if (child_node->name && 0 == xmlStrcmp(child_node->name, (const xmlChar*)MA_TAG_ASSISTANT_LANGUAGE)) { - key = xmlNodeGetContent(child_node); - if (key) { - temp->supported_lang[temp->cnt_lang++] = strdup((const char*)key); - MAS_LOGD("Language : %s", key); - xmlFree(key); - } - } - - child_node = child_node->next; - } - } else if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar *)MA_TAG_ASSISTANT_WAKEUP_WORD_SET)) { - xmlNodePtr child_node = cur->xmlChildrenNode; - while (child_node != NULL) { - if (child_node->name && 0 == xmlStrcmp(child_node->name, (const xmlChar*)MA_TAG_ASSISTANT_WAKEUP_WORD)) { - key = xmlNodeGetContent(child_node); - if (key) { - temp->wakeup_list[temp->cnt_wakeup] = strdup((const char*)key); - MAS_LOGD("Wakeup Word : %s", key); - xmlFree(key); - } - xmlChar* prop = xmlNodeGetLang(child_node); - if (prop) { - temp->wakeup_language[temp->cnt_wakeup] = strdup((const char*)prop); - MAS_LOGD("Wakeup Language for %s : %s", temp->wakeup_list[temp->cnt_wakeup], prop); - xmlFree(prop); - } - temp->cnt_wakeup++; - } - - child_node = child_node->next; - } - } else if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar*)MA_TAG_ASSISTANT_NAME)) { - key = xmlNodeGetContent(cur); - if (key) { - temp->name = strdup((const char*)key); - MAS_LOGD("Name : %s", key); - xmlFree(key); - } - } else if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar*)MA_TAG_ASSISTANT_APPID)) { - key = xmlNodeGetContent(cur); - if (key) { - temp->app_id = strdup((const char*)key); - MAS_LOGD("ID : %s", key); - xmlFree(key); - } - } else if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar*)MA_TAG_ASSISTANT_ICON_PATH)) { - key = xmlNodeGetContent(cur); - if (key) { - temp->icon_path = strdup((const char*)key); - MAS_LOGD("Icon Path : %s", key); - xmlFree(key); - } - } else if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar*)MA_TAG_ASSISTANT_WAKEUP_ENGINE_APPID)) { - key = xmlNodeGetContent(cur); - if (key) { - temp->wakeup_engine = strdup((const char*)key); - MAS_LOGD("Wakeup Engine : %s", key); - xmlFree(key); - } - } else if (cur->name && 0 == xmlStrcmp(cur->name, (const xmlChar*)MA_TAG_ASSISTANT_CUSTOM_UI)) { - key = xmlNodeGetContent(cur); - if (key) { - if (0 == xmlStrcasecmp(key, "true")) { - temp->custom_ui_option = true; - } - MAS_LOGD("Use custom UI : %d", temp->custom_ui_option); - xmlFree(key); - } - } - - cur = cur->next; - } - - if (callback) { - callback(temp->app_id, temp->name, temp->icon_path, - temp->wakeup_list, temp->wakeup_language, temp->cnt_wakeup, - temp->supported_lang, temp->cnt_lang, - temp->wakeup_engine, temp->custom_ui_option, user_data); - } - - if (temp->app_id) { - free((void*)temp->app_id); - } - if (temp->name) { - free((void*)temp->name); - } - if (temp->icon_path) { - free((void*)temp->icon_path); - } - for (loop = 0; loop < temp->cnt_wakeup; loop++) { - if (temp->wakeup_list[loop]) { - free((void*)(temp->wakeup_list[loop])); - } - } - for (loop = 0; loop < temp->cnt_lang; loop++) { - if (temp->supported_lang[loop]) { - free((void*)(temp->supported_lang[loop])); - } - } - if (temp->wakeup_engine) { - free((void*)temp->wakeup_engine); - } - - free(temp); - xmlFreeDoc(doc); - - return 0; -} - -int mas_config_get_assistant_info(mas_config_assistant_info_cb callback, void* user_data) -{ - const char *suffix = ".xml"; - - DIR *d; - struct dirent *dir; - d = opendir(MA_ASSISTANT_INFO); - - if (d) { - while (NULL != (dir = readdir(d))) { - if (suffix && strlen(suffix) <= strlen(dir->d_name)) { - if (0 == strcmp(dir->d_name + strlen(dir->d_name) - strlen(suffix), suffix)) { - char fullpath[_POSIX_PATH_MAX]; - snprintf(fullpath, _POSIX_PATH_MAX - 1, "%s/%s", MA_ASSISTANT_INFO, dir->d_name); - MAS_LOGD("Parsing file : %s\n", fullpath); - mas_config_parse_assistant_info(callback, fullpath, user_data); - } - } - } - closedir(d); - } - - return 0; -} diff --git a/src/multi_assistant_dbus.c b/src/multi_assistant_dbus.c deleted file mode 100644 index bbf0cbf..0000000 --- a/src/multi_assistant_dbus.c +++ /dev/null @@ -1,973 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include -#include -#include -#include - -#include "multi_assistant_main.h" -#include "multi_assistant_dbus_server.h" -#include "multi_assistant_dbus.h" - -static DBusConnection* g_conn_sender = NULL; -static DBusConnection* g_conn_listener = NULL; - -static Ecore_Fd_Handler* g_dbus_fd_handler = NULL; - -int mas_dbus_reconnect() -{ - if (!g_conn_sender || !g_conn_listener) { - mas_dbus_close_connection(); - - if (0 != mas_dbus_open_connection()) { - MAS_LOGE("[ERROR] Fail to reconnect"); - return -1; - } - - MAS_LOGD("[DBUS] Reconnect"); - return 0; - } - - bool sender_connected = dbus_connection_get_is_connected(g_conn_sender); - bool listener_connected = dbus_connection_get_is_connected(g_conn_listener); - MAS_LOGW("[DBUS] Sender(%s) Listener(%s)", - sender_connected ? "Connected" : "Not connected", listener_connected ? "Connected" : "Not connected"); - - if (false == sender_connected || false == listener_connected) { - mas_dbus_close_connection(); - - if (0 != mas_dbus_open_connection()) { - MAS_LOGE("[ERROR] Fail to reconnect"); - return -1; - } - - MAS_LOGD("[DBUS] Reconnect"); - } - - return 0; -} - -static int __dbus_check() -{ - if (NULL == g_conn_sender || NULL == g_conn_listener) { - MAS_LOGE("[ERROR] NULL connection"); - return mas_dbus_reconnect(); - } - return 0; -} - -int mas_check_dbus_connection() -{ - if (NULL == g_conn_sender || NULL == g_conn_listener) { - MAS_LOGE("[ERROR] NULL connection sender(%p), listener(%p)", g_conn_sender, g_conn_listener); - return -1; - } - return 0; -} - -int masc_dbus_send_hello(int pid) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - DBusError err; - dbus_error_init(&err); - - msg = dbus_message_new_method_call( - MA_CLIENT_SERVICE_NAME, - MA_CLIENT_SERVICE_OBJECT_PATH, - MA_CLIENT_SERVICE_INTERFACE, - MAS_METHOD_HELLO); - - if (NULL == msg) { - MAS_LOGE("[DBus ERROR] Request masc hello : Fail to make message"); - return -1; - } - - int result = -1; - DBusMessage* result_msg = NULL; - result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, 500, &err); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); - } - - dbus_message_unref(msg); - - if (NULL != result_msg) { - dbus_message_unref(result_msg); - result = 0; - } else { - result = -1; //MAS_ERROR_TIMED_OUT; - } - - return result; -} - -int masc_dbus_send_error_message(int reason, const char* err_msg) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - if (NULL == g_conn_sender) { - MAS_LOGE("[Dbus ERROR] Dbus connection is not available"); - return -1; - } - - DBusMessage* msg = NULL; - - /* create a message */ - msg = dbus_message_new_signal( - MA_CLIENT_SERVICE_OBJECT_PATH, /* object name of the signal */ - MA_CLIENT_SERVICE_INTERFACE, /* interface name of the signal */ - MAS_METHOD_ERROR); /* name of the signal */ - - if (NULL == msg) { - MAS_LOGE("[Dbus ERROR] Fail to create error message"); - return -1; - } - - char* temp_err_msg = NULL; - - if (err_msg) - temp_err_msg = strdup(err_msg); - else - temp_err_msg = strdup("#NULL"); - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &reason, - DBUS_TYPE_STRING, &temp_err_msg, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (!dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] <<<< error message : Out Of Memory !"); - } else { - MAS_LOGD("<<<< Send error message : reason(%d), err_msg(%s)", reason, temp_err_msg); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - if (temp_err_msg) - free(temp_err_msg); - return 0; -} - -int masc_dbus_send_streaming_audio_data(int pid, int event, unsigned char* data, unsigned int data_size) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - DBusError err; - dbus_error_init(&err); - - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s_%d", MA_CLIENT_SERVICE_NAME, pid); - - msg = dbus_message_new_method_call( - service_name, - MA_CLIENT_SERVICE_OBJECT_PATH, - MA_CLIENT_SERVICE_INTERFACE, - MAS_METHOD_STREAMING_AUDIO_DATA); - - static int count = 0; - if (NULL == msg) { - MAS_LOGE(">>>> Request mas send utterance stream : Fail to make message"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD(">>>> Request mas send utterance stream : %s event(%d) %d", service_name, event, count++); - } - - if (true != dbus_message_append_args(msg, - DBUS_TYPE_INT32, &event, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &data, data_size, - DBUS_TYPE_INVALID)) { - dbus_message_unref(msg); - MAS_LOGE("[ERROR] Fail to append args"); - return -1; - } - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send utterance stream"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - return 0; -} - -int masc_dbus_active_state_change(int pid, int state) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - DBusError err; - dbus_error_init(&err); - - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s_%d", MA_CLIENT_SERVICE_NAME, pid); - - msg = dbus_message_new_method_call( - service_name, - MA_CLIENT_SERVICE_OBJECT_PATH, - MA_CLIENT_SERVICE_INTERFACE, - MAS_METHOD_ACTIVE_STATE_CHANGE); - - static int count = 0; - if (NULL == msg) { - MAS_LOGE(">>>> Request mas send activate message : Fail to make message"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD(">>>> Request mas send activate message : %s", service_name); - } - - if (true != dbus_message_append_args(msg, - DBUS_TYPE_INT32, &state, - DBUS_TYPE_INVALID)) { - dbus_message_unref(msg); - MAS_LOGE("[ERROR] Fail to append args"); - return -1; - } - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send activate message : %d", state); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - return 0; -} - -int masc_dbus_send_preprocessing_information(int pid, const char* app_id) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - DBusError err; - dbus_error_init(&err); - - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s_%d", MA_CLIENT_SERVICE_NAME, pid); - - msg = dbus_message_new_method_call( - service_name, - MA_CLIENT_SERVICE_OBJECT_PATH, - MA_CLIENT_SERVICE_INTERFACE, - MAS_METHOD_SEND_PREPROCESSING_INFORMATION); - - static int count = 0; - if (NULL == msg) { - MAS_LOGE(">>>> Request mas send preprocessing assistant information : Fail to make message"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD(">>>> Request mas send preprocessing assistant information : %s", service_name); - } - - char* temp_app_id = NULL; - if (!app_id) - temp_app_id = strdup("#NULL"); - else - temp_app_id = strdup(app_id); - - if (true != dbus_message_append_args(msg, - DBUS_TYPE_STRING, &temp_app_id, - DBUS_TYPE_INVALID)) { - dbus_message_unref(msg); - MAS_LOGE("[ERROR] Fail to append args"); - if (temp_app_id) - free(temp_app_id); - return -1; - } - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - if (temp_app_id) - free(temp_app_id); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send preprocessing assistant information : %s", app_id); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - if (temp_app_id) - free(temp_app_id); - - return 0; -} - -int masc_dbus_send_streaming_section_changed(int pid, int section) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - DBusError err; - dbus_error_init(&err); - - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s_%d", MA_CLIENT_SERVICE_NAME, pid); - - msg = dbus_message_new_method_call( - service_name, - MA_CLIENT_SERVICE_OBJECT_PATH, - MA_CLIENT_SERVICE_INTERFACE, - MAS_METHOD_AUDIO_STREAMING_DATA_SECTION); - - static int count = 0; - if (NULL == msg) { - MAS_LOGE(">>>> Request mas send streaming section changed information : Fail to make message"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD(">>>> Request mas send streaming section changed information : %s", service_name); - } - - if (true != dbus_message_append_args(msg, - DBUS_TYPE_INT32, §ion, - DBUS_TYPE_INVALID)) { - dbus_message_unref(msg); - MAS_LOGE("[ERROR] Fail to append args"); - return -1; - } - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send streaming section changed information : %d", section); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - return 0; -} - -int masc_ui_dbus_send_hello(void) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - DBusError err; - dbus_error_init(&err); - - msg = dbus_message_new_method_call( - MA_UI_CLIENT_SERVICE_NAME, - MA_UI_CLIENT_SERVICE_OBJECT_PATH, - MA_UI_CLIENT_SERVICE_INTERFACE, - MAS_METHOD_HELLO); - - if (NULL == msg) { - MAS_LOGE("[DBus ERROR] Request masc hello : Fail to make message"); - return -1; - } - - DBusMessage* result_msg = NULL; - int result = 0; - - result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, 500, &err); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); - } - - dbus_message_unref(msg); - - if (NULL != result_msg) { - dbus_message_unref(result_msg); - result = 0; - } else { - result = -1; //ERROR_TIMED_OUT; - } - - return result; -} - -int masc_ui_dbus_send_asr_result(int pid, int event, char* asr_result) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - msg = dbus_message_new_method_call( - MA_UI_CLIENT_SERVICE_NAME, - MA_UI_CLIENT_SERVICE_OBJECT_PATH, - MA_UI_CLIENT_SERVICE_INTERFACE, - MAS_UI_METHOD_SEND_ASR_RESULT); - - if (NULL == msg) { - MAS_LOGE("@@ Request multi-assistant send ASR result : Fail to make message"); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[DEBUG] multi-assistant send ASR result, asr_result(%p)", asr_result); - } - - char* temp_asr_result = NULL; - if (!asr_result) - temp_asr_result = strdup("#NULL"); - else - temp_asr_result = strdup(asr_result); - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &event, - DBUS_TYPE_STRING, &temp_asr_result, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - if (NULL != temp_asr_result) { - free(temp_asr_result); - temp_asr_result = NULL; - } - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send ASR result"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - if (temp_asr_result) - free(temp_asr_result); - return 0; -} - -int masc_ui_dbus_send_result(int pid, const char* display_text, const char* utterance_text, const char* result_json) -{ - if (0 != __dbus_check()) { - return -1; //MA_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - msg = dbus_message_new_method_call( - MA_UI_CLIENT_SERVICE_NAME, - MA_UI_CLIENT_SERVICE_OBJECT_PATH, - MA_UI_CLIENT_SERVICE_INTERFACE, - MAS_UI_METHOD_SEND_RESULT); - - if (NULL == msg) { - MAS_LOGE("@@ Request multi-assistant send result : Fail to make message"); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[DEBUG] multi-assistant send result"); - } - char* temp_display_text = NULL; - char* temp_utterance_text = NULL; - char* temp_result_json = NULL; - -#if 0 - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_STRING, &display_text, - DBUS_TYPE_STRING, &utterance_text, - DBUS_TYPE_STRING, &result_json, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send result"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); -#else - if (!display_text) - temp_display_text = strdup("#NULL"); - else - temp_display_text = strdup(display_text); - if (!utterance_text) - temp_utterance_text = strdup("#NULL"); - else - temp_utterance_text = strdup(utterance_text); - if (!result_json) - temp_result_json = strdup("#NULL"); - else - temp_result_json = strdup(result_json); - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_STRING, &temp_display_text, - DBUS_TYPE_STRING, &temp_utterance_text, - DBUS_TYPE_STRING, &temp_result_json, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - if (temp_display_text) - free(temp_display_text); - if (temp_utterance_text) - free(temp_utterance_text); - if (temp_result_json) - free(temp_result_json); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send result"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - if (temp_display_text) - free(temp_display_text); - if (temp_utterance_text) - free(temp_utterance_text); - if (temp_result_json) - free(temp_result_json); -#endif - return 0; -} - -int masc_ui_dbus_change_assistant(char* app_id) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - if (NULL == app_id) { - MAS_LOGE("@@ Request multi-assistant send change assistant request : Fail to make message"); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[DEBUG] multi-assistant send change assistant request app_id(%s)", app_id); - } - - DBusMessage* msg; - - msg = dbus_message_new_method_call( - MA_UI_CLIENT_SERVICE_NAME, - MA_UI_CLIENT_SERVICE_OBJECT_PATH, - MA_UI_CLIENT_SERVICE_INTERFACE, - MAS_UI_METHOD_CHANGE_ASSISTANT); - - dbus_message_append_args(msg, - DBUS_TYPE_STRING, &app_id, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send change assistant request"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - return 0; -} - -int masc_ui_dbus_send_error_message(int reason, const char* err_msg) -{ - if (NULL == g_conn_sender) { - MAS_LOGE("[Dbus ERROR] Dbus connection is not available"); - return -1; - } - - DBusMessage* msg = NULL; - - /* create a message */ - msg = dbus_message_new_signal( - MA_UI_CLIENT_SERVICE_OBJECT_PATH, /* object name of the signal */ - MA_UI_CLIENT_SERVICE_INTERFACE, /* interface name of the signal */ - MAS_UI_METHOD_ERROR); /* name of the signal */ - - if (NULL == msg) { - MAS_LOGE("[Dbus ERROR] Fail to create error message"); - return -1; - } - - char* temp_err_msg = NULL; - - if (err_msg) - temp_err_msg = strdup(err_msg); - else - temp_err_msg = strdup("#NULL"); - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &reason, - DBUS_TYPE_STRING, &temp_err_msg, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (!dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] <<<< error message : Out Of Memory !"); - } else { - MAS_LOGD("<<<< Send error message : reason(%d), err_msg(%s)", reason, temp_err_msg); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - if (temp_err_msg) - free(temp_err_msg); - return 0; -} - -int masc_ui_dbus_send_recognition_result(int pid, int result) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - msg = dbus_message_new_method_call( - MA_UI_CLIENT_SERVICE_NAME, - MA_UI_CLIENT_SERVICE_OBJECT_PATH, - MA_UI_CLIENT_SERVICE_INTERFACE, - MAS_UI_METHOD_SEND_RECOGNITION_RESULT); - - if (NULL == msg) { - MAS_LOGE("@@ Request multi-assistant send recognition result : Fail to make message"); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[DEBUG] multi-assistant send recognition result(%d)", result); - } - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send ASR result"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - return 0; -} - -int masc_ui_dbus_enable_common_ui(int enable) -{ - if (0 != __dbus_check()) { - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - DBusMessage* msg; - - msg = dbus_message_new_method_call( - MA_UI_CLIENT_SERVICE_NAME, - MA_UI_CLIENT_SERVICE_OBJECT_PATH, - MA_UI_CLIENT_SERVICE_INTERFACE, - MAS_UI_METHOD_ENABLE_COMMON_UI); - - if (NULL == msg) { - MAS_LOGE("@@ Request multi-assistant enable common ui : Fail to make message"); - return -1; //MA_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[DEBUG] multi-assistant enable common ui (%d)", enable); - } - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &enable, - DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { - MAS_LOGE("[Dbus ERROR] Fail to Send"); - return -1; // MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[Dbus DEBUG] Success to Send ASR result"); - dbus_connection_flush(g_conn_sender); - } - - dbus_message_unref(msg); - - return 0; -} - -static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler) -{ - if (NULL == g_conn_listener) return ECORE_CALLBACK_RENEW; - - dbus_connection_read_write_dispatch(g_conn_listener, 50); - - while (1) { - DBusMessage* msg = NULL; - msg = dbus_connection_pop_message(g_conn_listener); - - if (true != dbus_connection_get_is_connected(g_conn_listener)) { - MAS_LOGE("[ERROR] Connection is disconnected"); - return ECORE_CALLBACK_RENEW; - } - - /* loop again if we haven't read a message */ - if (NULL == msg) { - return ECORE_CALLBACK_RENEW; - } - - /* client event */ - if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_HELLO)) { - ma_service_dbus_hello(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_INITIALIZE)) { - ma_service_dbus_initialize(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_DEINITIALIZE)) { - ma_service_dbus_deinitialize(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_GET_RECORDING_AUDIO_FORMAT)) { - ma_service_dbus_get_audio_format(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_GET_RECORDING_AUDIO_SOURCE_TYPE)) { - ma_service_dbus_get_audio_source_type(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SEND_ASR_RESULT)) { - ma_service_dbus_send_asr_result(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SEND_RESULT)) { - ma_service_dbus_send_result(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SEND_RECOGNITION_RESULT)) { - ma_service_dbus_send_recognition_result(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_START_STREAMING_AUDIO_DATA)) { - ma_service_dbus_start_streaming_audio_data(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_STOP_STREAMING_AUDIO_DATA)) { - ma_service_dbus_stop_streaming_audio_data(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_UPDATE_VOICE_FEEDBACK_STATE)) { - ma_service_dbus_update_voice_feedback_state(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SEND_ASSISTANT_SPECIFIC_COMMAND)) { - ma_service_dbus_send_assistant_specific_command(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SET_BACKGROUND_VOLUME)) { - ma_service_dbus_set_background_volume(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SET_PREPROCESSING_ALLOW_MODE)) { - ma_service_dbus_set_preprocessing_allow_mode(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SEND_PREPROCESSING_RESULT)) { - ma_service_dbus_send_preprocessing_result(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG)) { - ma_service_dbus_set_wake_word_audio_require_flag(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_UI_METHOD_INITIALIZE)) { - ma_service_ui_dbus_initialize(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_UI_METHOD_DEINITIALIZE)) { - ma_service_ui_dbus_deinitialize(g_conn_listener, msg); - - } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_UI_METHOD_CHANGE_ASSISTANT)) { - ma_service_ui_dbus_change_assistant(g_conn_listener, msg); - - } else { - MAS_LOGD("Message is NOT valid"); - /* Invalid method */ - } - /* free the message */ - dbus_message_unref(msg); - } - - return ECORE_CALLBACK_RENEW; -} - -static void __mas_dbus_connection_free() -{ - if (NULL != g_conn_listener) { - dbus_connection_close(g_conn_listener); - dbus_connection_unref(g_conn_listener); - g_conn_listener = NULL; - } - if (NULL != g_conn_sender) { - dbus_connection_close(g_conn_sender); - dbus_connection_unref(g_conn_sender); - g_conn_sender = NULL; - } -} - -int mas_dbus_open_connection() -{ - DBusError err; - dbus_error_init(&err); - - int ret; - - /* Create connection for sender */ - g_conn_sender = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] Fail dbus_bus_get : %s", err.message); - dbus_error_free(&err); - } - - if (NULL == g_conn_sender) { - MAS_LOGE("[Dbus ERROR] Fail to get dbus connection"); - return -1; - } - - dbus_connection_set_exit_on_disconnect(g_conn_sender, false); - - /* connect to the bus and check for errors */ - g_conn_listener = dbus_bus_get_private(DBUS_BUS_SESSION, &err); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] Fail dbus_bus_get : %s", err.message); - dbus_error_free(&err); - } - - if (NULL == g_conn_listener) { - MAS_LOGE("[Dbus ERROR] Fail to get dbus connection"); - __mas_dbus_connection_free(); - return -1; - } - - dbus_connection_set_exit_on_disconnect(g_conn_listener, false); - - /* request our name on the bus and check for errors */ - ret = dbus_bus_request_name(g_conn_listener, MA_SERVER_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING, &err); - - if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { - printf("Fail to be primary owner in dbus request."); - MAS_LOGE("[Dbus ERROR] Fail to be primary owner"); - __mas_dbus_connection_free(); - return -1; - } - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] dbus_bus_request_name() : %s", err.message); - dbus_error_free(&err); - __mas_dbus_connection_free(); - return -1; - } - - /* Flush messages which are received before fd event handler registration */ - while (DBUS_DISPATCH_DATA_REMAINS == dbus_connection_get_dispatch_status(g_conn_listener)) { - listener_event_callback(NULL, NULL); - } - - /* add a rule for getting signal */ - char rule[128]; - snprintf(rule, 128, "type='signal',interface='%s'", MA_SERVER_SERVICE_INTERFACE); - - /* add a rule for which messages we want to see */ - dbus_bus_add_match(g_conn_listener, rule, &err);/* see signals from the given interface */ - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] dbus_bus_add_match() : %s", err.message); - dbus_error_free(&err); - __mas_dbus_connection_free(); - return -1; - } - - int fd = 0; - if (1 != dbus_connection_get_unix_fd(g_conn_listener, &fd)) { - MAS_LOGE("fail to get fd from dbus "); - __mas_dbus_connection_free(); - return -1; - } else { - MAS_LOGD("Get fd from dbus : %d", fd); - } - - - g_dbus_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn_listener, NULL, NULL); - - if (NULL == g_dbus_fd_handler) { - MAS_LOGE("[Dbus ERROR] Fail to get fd handler"); - __mas_dbus_connection_free(); - return -1; - } - - return 0; -} - -int mas_dbus_close_connection() -{ - DBusError err; - dbus_error_init(&err); - - if (NULL != g_dbus_fd_handler) { - ecore_main_fd_handler_del(g_dbus_fd_handler); - g_dbus_fd_handler = NULL; - } - - dbus_bus_release_name(g_conn_listener, MA_SERVER_SERVICE_NAME, &err); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[Dbus ERROR] dbus_bus_release_name() : %s", err.message); - dbus_error_free(&err); - } - - __mas_dbus_connection_free(); - - return 0; -} diff --git a/src/multi_assistant_dbus.h b/src/multi_assistant_dbus.h deleted file mode 100644 index 47091bf..0000000 --- a/src/multi_assistant_dbus.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MULTI_ASSISTANT_DBUS_h__ -#define __MULTI_ASSISTANT_DBUS_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -int mas_dbus_open_connection(); - -int mas_dbus_close_connection(); - -int masc_dbus_send_hello(int pid); - -int masc_dbus_send_error_message(int reason, const char* err_msg); - -int masc_dbus_send_streaming_audio_data(int pid, int event, unsigned char* data, unsigned int data_size); - -int masc_dbus_active_state_change(int pid, int state); - -int masc_dbus_send_preprocessing_information(int pid, const char* app_id); - -int masc_ui_dbus_send_hello(void); - -int masc_ui_dbus_send_asr_result(int pid, int event, char* asr_result); - -int masc_ui_dbus_send_result(int pid, const char* display_text, const char* utterance_text, const char* result_json); - -int masc_ui_dbus_change_assistant(char* app_id); - -int masc_ui_dbus_send_error_message(int reason, const char* err_msg); - -int masc_ui_dbus_send_recognition_result(int pid, int result); - -int masc_ui_dbus_enable_common_ui(int enable); - -#ifdef __cplusplus -} -#endif - -#endif /* __MULTI_ASSISTANT_DBUS_h__ */ diff --git a/src/multi_assistant_dbus_server.c b/src/multi_assistant_dbus_server.c deleted file mode 100644 index 16ec6c8..0000000 --- a/src/multi_assistant_dbus_server.c +++ /dev/null @@ -1,819 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include "multi_assistant_main.h" -#include "multi_assistant_dbus.h" -#include "multi_assistant_dbus_server.h" -#include "multi_assistant_service.h" - -/* -* Dbus Client-Daemon Server -*/ -int ma_service_dbus_hello(DBusConnection* conn, DBusMessage* msg) -{ - MAS_LOGD("[DEBUG] MAS HELLO"); - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] Fail to create reply message!!"); - } - - return 0; -} - -int ma_service_dbus_initialize(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid = -1; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS INITIALIZE"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas initialize : get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas initialize : pid(%d)", pid); - ret = mas_client_initialize(pid); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - MAS_LOGD("[OUT] mas initialize : result(%d)", ret); - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas initialize : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas initialize : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas initialize : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas initialize : Fail to create reply message!!"); - } - - return 0; -} - -int ma_service_dbus_deinitialize(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid = -1; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS DEINITIALIZE"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas deinitialize : get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas deinitialize : pid(%d)", pid); - ret = mas_client_deinitialize(pid); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - MAS_LOGD("[OUT] mas deinitialize : result(%d)", ret); - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas deinitialize : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas deinitialize : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas deinitialize : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas deinitialize : Fail to create reply message!!"); - } - - return 0; -} - -int ma_service_dbus_get_audio_format(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid = -1; - int rate, channel, audio_type; - int ret; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS GET AUDIO FORMAT"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas get audio format : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas get default voice"); - ret = mas_client_get_audio_format(pid, &rate, &channel, &audio_type); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - /* Append result and voice */ - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INT32, &rate, - DBUS_TYPE_INT32, &channel, - DBUS_TYPE_INT32, &audio_type, - DBUS_TYPE_INVALID); - if (0 == ret) { - MAS_LOGD("[OUT] mas get audio format : rate(%d), channel(%d), audio_type(%d)", rate, channel, audio_type); - } else { - MAS_LOGE("[OUT ERROR] mas get audio format : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas get audio format : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] tts default voice : Fail to create reply message!!"); - } - - return 0; -} - -int ma_service_dbus_get_audio_source_type(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid = -1; - char *type = NULL; - int ret; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS GET AUDIO SOURCE TYPE"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas get audio source type : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas get default voice"); - ret = mas_client_get_audio_source_type(pid, &type); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - char* temp_type = NULL; - - if (type) - temp_type = strdup(type); - else - temp_type = strdup("#NULL"); - - if (NULL != reply) { - /* Append result and voice */ - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_STRING, &temp_type, - DBUS_TYPE_INVALID); - if (0 == ret) { - MAS_LOGD("[OUT] mas get audio source type : type(%s)", temp_type); - } else { - MAS_LOGE("[OUT ERROR] mas get audio source type : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas get audio source type : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas get audio source type : Fail to create reply message!!"); - } - - if (temp_type) - free(temp_type); - - return 0; -} - -int ma_service_dbus_send_asr_result(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid, event; - char *asr_result; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &event, - DBUS_TYPE_STRING, &asr_result, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND ASR RESULT"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas send asr result : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas send asr result : pid(%d), event(%d), asr_result(%s)", pid, event, asr_result); - ret = mas_client_send_asr_result(pid, event, asr_result); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas send asr result : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas send asr result : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas send asr result : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas send asr result : Fail to create reply message!!"); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_send_result(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - char* display_text; - char* utterance_text; - char* result_json; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_STRING, &display_text, - DBUS_TYPE_STRING, &utterance_text, - DBUS_TYPE_STRING, &result_json, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND RESULT"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas send result : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas send result : pid(%d), display_text(%s), utterance_text(%s), result_json(%s)", pid, display_text, utterance_text, result_json); - ret = mas_client_send_result(pid, display_text, utterance_text, result_json); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas send result : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas send result : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas send result : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas send result : Fail to create reply message!!"); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_send_recognition_result(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int result; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND RECOGNITION RESULT"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas send error : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas send error : pid(%d), result(%d)", pid, result); - ret = mas_client_send_recognition_result(pid, result); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_start_streaming_audio_data(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int type; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &type, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND START STREAMING"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas send start streaming : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas send start streaming : pid(%d), result(%d)", pid, type); - ret = mas_client_start_streaming_audio_data(pid, type); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_stop_streaming_audio_data(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int type; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &type, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND STOP STREAMING"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas stop streaming : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas stop streaming : pid(%d), result(%d)", pid, type); - ret = mas_client_stop_streaming_audio_data(pid, type); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_update_voice_feedback_state(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int state; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &state, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND UPDATE VOICE FEEDBACK"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas update voice feedback : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas update voice feedback : pid(%d), result(%d)", pid, state); - ret = mas_client_update_voice_feedback_state(pid, state); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_send_assistant_specific_command(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int ret = 0; - char* command; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_STRING, &command, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND ASSISTANT SPECIFIC COMMAND"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas send assistant specific command : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas send assistant specific command : pid(%d), command(%s)", pid, command); - ret = mas_client_send_assistant_specific_command(pid, command); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_set_background_volume(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int ret = 0; - double ratio; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_DOUBLE, &ratio, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SET BACKGROUND VOLUME"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas set background volume : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas set background volume : pid(%d), ratio(%f)", pid, ratio); - ret = mas_client_set_background_volume(pid, ratio); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_set_preprocessing_allow_mode(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int ret = 0; - int mode; - char* app_id; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &mode, - DBUS_TYPE_STRING, &app_id, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SET PREPROCESSING ALLOW MODE"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas set preprocessing allow mode : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - char* temp_app_id = NULL; - if (NULL != app_id && strcmp("#NULL", app_id)) { - temp_app_id = strdup(app_id); - } - MAS_LOGD("[IN] mas set preprocessing allow mode : pid(%d), mode(%d), app_id(%s)", pid, mode, temp_app_id); - ret = mas_client_set_preprocessing_allow_mode(pid, mode, temp_app_id); - if (NULL != temp_app_id) - free(temp_app_id); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_send_preprocessing_result(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int ret = 0; - int result; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SEND PREPROCESSING RESULT"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas send preprocessing result : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas send preprocessing result : pid(%d), result(%d)", pid, result); - ret = mas_client_send_preprocessing_result(pid, (bool)result); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_dbus_set_wake_word_audio_require_flag(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid; - int ret = 0; - int require; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &require, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS SET WAKE WORD AUDIO REQUIRE FLAG"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas set wake word audio require flag : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas set wake word audio require flag : pid(%d), require(%d)", pid, require); - ret = mas_client_set_wake_word_audio_require_flag(pid, (bool)require); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} - -int ma_service_ui_dbus_initialize(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid = -1; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS UI INITIALIZE"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas ui initialize : get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas ui initialize : pid(%d)", pid); - ret = mas_ui_client_initialize(pid); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - MAS_LOGD("[OUT] mas ui initialize : result(%d)", ret); - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas ui initialize : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas ui initialize : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas ui initialize : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas ui initialize : Fail to create reply message!!"); - } - - return 0; -} - -int ma_service_ui_dbus_deinitialize(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - int pid = -1; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS UI DEINITIALIZE"); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas ui deinitialize : get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas ui deinitialize : pid(%d)", pid); - ret = mas_ui_client_deinitialize(pid); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - MAS_LOGD("[OUT] mas ui deinitialize : result(%d)", ret); - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas ui deinitialize : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas ui deinitialize : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas ui deinitialize : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas ui deinitialize : Fail to create reply message!!"); - } - - return 0; -} - -int ma_service_ui_dbus_change_assistant(DBusConnection* conn, DBusMessage* msg) -{ - DBusError err; - dbus_error_init(&err); - - char *app_id; - int ret = 0; - - dbus_message_get_args(msg, &err, - DBUS_TYPE_STRING, &app_id, - DBUS_TYPE_INVALID); - - MAS_LOGD("[DEBUG] MAS UI CHANGE ASSISTANT : %s", (app_id ? app_id : "NULL")); - - if (dbus_error_is_set(&err)) { - MAS_LOGE("[IN ERROR] mas ui change assisant : Get arguments error (%s)", err.message); - dbus_error_free(&err); - ret = -1; //MAS_ERROR_OPERATION_FAILED; - } else { - MAS_LOGD("[IN] mas ui change assisant : app_id(%s)", app_id); - ret = mas_ui_client_change_assistant(app_id); - } - - DBusMessage* reply; - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - - if (0 == ret) { - MAS_LOGD("[OUT] mas ui change assisant : result(%d)", ret); - } else { - MAS_LOGE("[OUT ERROR] mas ui change assisant : result(%d)", ret); - } - - if (!dbus_connection_send(conn, reply, NULL)) { - MAS_LOGE("[OUT ERROR] mas ui change assisant : Out Of Memory!"); - } - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - MAS_LOGE("[OUT ERROR] mas ui change assisant : Fail to create reply message!!"); - } - - MAS_LOGD("<<<<<"); - MAS_LOGD(" "); - - return 0; -} diff --git a/src/multi_assistant_dbus_server.h b/src/multi_assistant_dbus_server.h deleted file mode 100644 index a205cac..0000000 --- a/src/multi_assistant_dbus_server.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MULTI_ASSISTANT_DBUS_SERVER_H__ -#define __MULTI_ASSISTANT_DBUS_SERVER_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -int ma_service_dbus_hello(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_initialize(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_deinitialize(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_get_audio_format(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_get_audio_source_type(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_send_asr_result(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_send_result(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_send_recognition_result(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_start_streaming_audio_data(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_stop_streaming_audio_data(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_update_voice_feedback_state(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_send_assistant_specific_command(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_set_background_volume(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_set_preprocessing_allow_mode(DBusConnection* conn, DBusMessage* msg); - -int ma_service_dbus_send_preprocessing_result(DBusConnection* conn, DBusMessage* msg); - -int ma_service_ui_dbus_initialize(DBusConnection* conn, DBusMessage* msg); - -int ma_service_ui_dbus_deinitialize(DBusConnection* conn, DBusMessage* msg); - -int ma_service_ui_dbus_change_assistant(DBusConnection* conn, DBusMessage* msg); - -#ifdef __cplusplus -} -#endif - - -#endif /* __MULTI_ASSISTANT_DBUS_SERVER_H__ */ diff --git a/src/multi_assistant_service.c b/src/multi_assistant_service.c deleted file mode 100644 index f5ffe23..0000000 --- a/src/multi_assistant_service.c +++ /dev/null @@ -1,1171 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "multi_assistant_main.h" -#include "multi_assistant_service.h" -#include "multi_assistant_service_plugin.h" -#include "multi_assistant_dbus.h" -#include "multi_assistant_config.h" -#include "multi_assistant_common.h" - -static const char *g_current_lang = "en_US"; - -#define MULTI_ASSISTANT_SETTINGS_ACTIVATED "db/multi-assistant/activated" -#define WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID "db/multi-assistant/default_assistant_appid" -#define WAKEUP_SETTINGS_KEY_PREPROCESSING_ASSISTANT_APPID "db/multi-assistant/preprocessing_assistant_appid" -#define WAKEUP_SETTINGS_KEY_PRELAUNCH_MODE "db/multi-assistant/prelaunch_mode" - -#define MAX_MACLIENT_INFO_NUM 16 -#define MAX_WAKEUP_WORDS_NUM 255 -#define MAX_WAKEUP_WORD_LEN 32 -#define MAX_SUPPORTED_LANGUAGES_NUM 255 -#define MAX_SUPPORTED_LANGUAGE_LEN 16 -typedef struct { - bool used; - char appid[MAX_APPID_LEN]; - char wakeup_word[MAX_WAKEUP_WORDS_NUM][MAX_WAKEUP_WORD_LEN]; - char wakeup_language[MAX_WAKEUP_WORDS_NUM][MAX_SUPPORTED_LANGUAGE_LEN]; - char wakeup_engine[MAX_APPID_LEN]; - char supported_language[MAX_SUPPORTED_LANGUAGES_NUM][MAX_SUPPORTED_LANGUAGE_LEN]; - bool custom_ui_option; - - ma_preprocessing_allow_mode_e preprocessing_allow_mode; - char preprocessing_allow_appid[MAX_APPID_LEN]; -} ma_client_info; - -static ma_client_info g_maclient_info[MAX_MACLIENT_INFO_NUM]; - -typedef struct { - int pid; - char appid[MAX_APPID_LEN]; -} ma_client_s; - -static int g_current_maclient_info = 0; -static const char *g_wakeup_maclient_appid = NULL; - -static PREPROCESSING_STATE g_current_preprocessing_state = PREPROCESSING_STATE_NONE; - -/* client list */ -static GSList* g_client_list = NULL; - -int ma_client_create(ma_client_s *info) -{ - if (NULL == info) { - MAS_LOGE("Input parameter is NULL"); //LCOV_EXCL_LINE - return -1; - } - - ma_client_s* data = NULL; - - data = (ma_client_s*)calloc(1, sizeof(ma_client_s)); - if (NULL == data) { - MAS_LOGE("[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE - return -1;// MA_ERROR_OUT_OF_MEMORY; - } - - *data = *info; - - g_client_list = g_slist_append(g_client_list, data); - - return 0; -} - -int ma_client_destroy(ma_client_s *client) -{ - if (NULL == client) { - MAS_LOGE("Input parameter is NULL"); //LCOV_EXCL_LINE - return -1;// MA_ERROR_OPERATION_FAILED; - } - - g_client_list = g_slist_remove(g_client_list, client); - - free(client); - client = NULL; - - return 0; -} - -ma_client_s* ma_client_find_by_appid(const char *appid) -{ - if (NULL == appid) { - MAS_LOGE("Input parameter is NULL"); //LCOV_EXCL_LINE - return NULL; - } - - ma_client_s *data = NULL; - - int count = g_slist_length(g_client_list); - int i; - - for (i = 0; i < count; i++) { - data = g_slist_nth_data(g_client_list, i); - - if (NULL != data) { - if (0 == strncmp(data->appid, appid, MAX_APPID_LEN)) { - return data; - } - } - } - - MAS_LOGE("[ERROR] client Not found"); - - return NULL; -} - -ma_client_s* ma_client_find_by_pid(int pid) -{ - ma_client_s *data = NULL; - - int count = g_slist_length(g_client_list); - int i; - - for (i = 0; i < count; i++) { - data = g_slist_nth_data(g_client_list, i); - - if (NULL != data) { - if (data->pid == pid) { - return data; - } - } - } - - MAS_LOGE("[ERROR] client Not found"); - - return NULL; -} - -bool check_preprocessing_assistant_exists() -{ - bool ret = false; - - char* vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_PREPROCESSING_ASSISTANT_APPID); - if (vconf_str) { - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (g_maclient_info[loop].used) { - if (strncmp(vconf_str, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - ret = true; - } - } - } - free(vconf_str); - vconf_str = NULL; - } - - return ret; -} - -bool is_current_preprocessing_assistant(const char* appid) -{ - if (NULL == appid) return false; - - bool ret = false; - - char* vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_PREPROCESSING_ASSISTANT_APPID); - if (vconf_str) { - if (strncmp(vconf_str, appid, MAX_APPID_LEN) == 0) { - ret = true; - } - free(vconf_str); - vconf_str = NULL; - } - - return ret; -} - -int mas_client_initialize(int pid) -{ - MAS_LOGD("[Enter] pid(%d)", pid); - - char appid[MAX_APPID_LEN] = {'\0',}; - if (AUL_R_OK == aul_app_get_appid_bypid(pid, appid, sizeof(appid))) { - appid[MAX_APPID_LEN - 1] = '\0'; - - MAS_LOGD("appid for pid %d is : %s", pid, (appid ? appid : "Unknown")); - - /* Remove existing client that has same appid, if there's any */ - ma_client_s *old_client = NULL; - old_client = ma_client_find_by_appid(appid); - if (old_client) { - ma_client_destroy(old_client); - old_client = NULL; - } - - /* And remove a client that has same pid also */ - old_client = ma_client_find_by_pid(pid); - if (old_client) { - ma_client_destroy(old_client); - old_client = NULL; - } - - ma_client_s new_client; - new_client.pid = pid; - strncpy(new_client.appid, appid, MAX_APPID_LEN); - new_client.appid[MAX_APPID_LEN - 1] = '\0'; - ma_client_create(&new_client); - - const char *current_maclient_appid = NULL; - if (g_current_maclient_info >= 0 && g_current_maclient_info < MAX_MACLIENT_INFO_NUM) { - current_maclient_appid = g_maclient_info[g_current_maclient_info].appid; - } - - if (current_maclient_appid && 0 == strncmp(current_maclient_appid, appid, MAX_APPID_LEN)) { - MAS_LOGD("MA client with current maclient appid connected!"); - - if (g_wakeup_maclient_appid && strncmp(g_wakeup_maclient_appid, appid, MAX_APPID_LEN) == 0) { - g_wakeup_maclient_appid = NULL; - mas_client_send_preprocessing_information(pid); - mas_client_activate(pid); - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_ACTIVE_ASSISTANT_LAUNCHED); - } else { - MAS_LOGE("[ERROR] g_wakeup_maclient_appid and appid differ : %s %s", - (g_wakeup_maclient_appid ? g_wakeup_maclient_appid : "NULL"), appid); - } - } else { - MAS_LOGD("MA client connected, but its appid does not match with current maclient"); - } - } else { - MAS_LOGE("[ERROR] Fail to retrieve appid"); - } - - return 0; -} - -int mas_client_deinitialize(int pid) -{ - MAS_LOGD("[Enter] pid(%d)", pid); - ma_client_s *client = ma_client_find_by_pid(pid); - if (client) { - ma_client_destroy(client); - client = NULL; - } - return 0; -} - -int mas_client_get_audio_format(int pid, int* rate, int* channel, int* audio_type) -{ - MAS_LOGD("[Enter] pid(%d)", pid); - - int ret = multi_assistant_service_plugin_get_recording_audio_format(rate, channel, audio_type); - if (0 != ret){ - MAS_LOGE("[ERROR] Fail to get recording audio format, ret(%d)", ret); - } - - return ret; -} - -int mas_client_get_audio_source_type(int pid, char** type) -{ - MAS_LOGD("[Enter] pid(%d)", pid); - - int ret = multi_assistant_service_plugin_get_recording_audio_source_type(type); - if (0 != ret){ - MAS_LOGE("[ERROR] Fail to get recording audio source type, ret(%d)", ret); - } - - return ret; -} - -bool check_pid_is_current_maclient(int pid) -{ - bool ret = false; - char appid[MAX_APPID_LEN] = {'\0',}; - if (AUL_R_OK == aul_app_get_appid_bypid(pid, appid, sizeof(appid))) { - appid[MAX_APPID_LEN - 1] = '\0'; - const char *current_maclient_appid = NULL; - if (g_current_maclient_info >= 0 && g_current_maclient_info < MAX_MACLIENT_INFO_NUM) { - current_maclient_appid = g_maclient_info[g_current_maclient_info].appid; - } - - if (current_maclient_appid && 0 == strncmp(current_maclient_appid, appid, MAX_APPID_LEN)) { - ret = true; - } else { - MAS_LOGE("appid %s does not match with current MA Client", appid); - } - } - return ret; -} - -int mas_client_send_preprocessing_information(int pid) -{ - int ret = -1; - MAS_LOGD("[Enter] pid(%d)", pid); - - if (check_pid_is_current_maclient(pid)) { - char* vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_PREPROCESSING_ASSISTANT_APPID); - MAS_LOGD("preprocessing_assistant_appid : %s", vconf_str); - ret = masc_dbus_send_preprocessing_information(pid, vconf_str); - free(vconf_str); - vconf_str = NULL; - } - - return ret; -} - -int mas_client_activate(int pid) -{ - int ret = -1; - MAS_LOGD("[Enter] pid(%d)", pid); - - ret = masc_dbus_active_state_change(pid, MA_ACTIVE_STATE_ACTIVE); - - return ret; -} - -int mas_client_deactivate(int pid) -{ - int ret = -1; - MAS_LOGD("[Enter] pid(%d)", pid); - - ret = masc_dbus_active_state_change(pid, MA_ACTIVE_STATE_INACTIVE); - - return ret; -} - -int mas_client_send_asr_result(int pid, int event, char* asr_result) -{ - MAS_LOGD("[Enter] pid(%d), event(%d), asr_result(%s)", pid, event, asr_result); - int ret = masc_ui_dbus_send_asr_result(pid, event, asr_result); - if (0 != ret){ - MAS_LOGE("[ERROR] Fail to send asr result, ret(%d)", ret); - } - - // if final event is , launch assistant app which is invoked with wakeup word. - /* TO_DO */ - return ret; -} - -int mas_client_send_result(int pid, char* display_text, char* utterance_text, char* result_json) -{ - MAS_LOGD("[Enter] pid(%d), display_text(%s), utterance_text(%s), result_json(%s)", pid, display_text, utterance_text, result_json); - int ret = masc_ui_dbus_send_result(pid, display_text, utterance_text, result_json); - if (0 != ret){ - MAS_LOGE("[ERROR] Fail to send result, ret(%d)", ret); - } - - multi_assistant_service_plugin_update_recognition_result(NULL, MA_RECOGNITION_RESULT_EVENT_SUCCESS); - - return ret; -} - -int mas_client_send_recognition_result(int pid, int result) -{ - MAS_LOGD("[Enter] pid(%d), result(%d)", pid, result); - int ret = masc_ui_dbus_send_recognition_result(pid, result); - if (0 != ret){ - MAS_LOGE("[ERROR] Fail to send recognition result, ret(%d)", ret); - } - - multi_assistant_service_plugin_update_recognition_result(NULL, result); - - return ret; -} - -int mas_client_start_streaming_audio_data(int pid, int type) -{ - int ret = -1; - switch(type) { - case MA_AUDIO_STREAMING_DATA_TYPE_CURRENT_UTTERANCE: - ret = multi_assistant_service_plugin_start_streaming_utterance_data(); - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_UTTERANCE_STREAMING_STARTED); - break; - case MA_AUDIO_STREAMING_DATA_TYPE_PREVIOUS_UTTERANCE: - ret = multi_assistant_service_plugin_start_streaming_previous_utterance_data(); - /* Preprocessing is not required for previous utterance streaming */ - break; - case MA_AUDIO_STREAMING_DATA_TYPE_FOLLOW_UP_SPEECH: - ret = multi_assistant_service_plugin_start_streaming_follow_up_data(); - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_FOLLOW_UP_STREAMING_STARTED); - break; - } - return ret; -} - -int mas_client_stop_streaming_audio_data(int pid, int type) -{ - int ret = -1; - switch(type) { - case MA_AUDIO_STREAMING_DATA_TYPE_CURRENT_UTTERANCE: - ret = multi_assistant_service_plugin_stop_streaming_utterance_data(); - break; - case MA_AUDIO_STREAMING_DATA_TYPE_PREVIOUS_UTTERANCE: - ret = multi_assistant_service_plugin_stop_streaming_previous_utterance_data(); - break; - case MA_AUDIO_STREAMING_DATA_TYPE_FOLLOW_UP_SPEECH: - ret = multi_assistant_service_plugin_stop_streaming_follow_up_data(); - break; - } - return ret; -} - -int mas_client_update_voice_feedback_state(int pid, int state) -{ - multi_assistant_service_plugin_update_voice_feedback_state(NULL, state); - return 0; -} - -int mas_client_send_assistant_specific_command(int pid, const char *command) -{ - multi_assistant_service_plugin_send_assistant_specific_command(NULL, command); - return 0; -} - -int mas_client_set_background_volume(int pid, double ratio) -{ - multi_assistant_service_plugin_set_background_volume(NULL, ratio); - return 0; -} - -int mas_client_set_preprocessing_allow_mode(int pid, int mode, const char* appid) -{ - const char* pid_appid = NULL; - char buf[MAX_APPID_LEN] = {'\0',}; - if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) { - buf[MAX_APPID_LEN - 1] = '\0'; - pid_appid = buf; - } - - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (g_maclient_info[loop].used) { - if (pid_appid && strncmp(pid_appid, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - g_maclient_info[loop].preprocessing_allow_mode = mode; - if (appid) { - strncpy(g_maclient_info[loop].preprocessing_allow_appid, appid, MAX_APPID_LEN); - g_maclient_info[loop].preprocessing_allow_appid[MAX_APPID_LEN - 1] = '\0'; - } else { - g_maclient_info[loop].preprocessing_allow_appid[0] = '\0'; - } - } - } - } - - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_ALLOW_MODE_CHANGED); - - return 0; -} - -int mas_client_send_preprocessing_result(int pid, bool result) -{ - const char* pid_appid = NULL; - char buf[MAX_APPID_LEN] = {'\0',}; - if (AUL_R_OK == aul_app_get_appid_bypid(pid, buf, sizeof(buf))) { - buf[MAX_APPID_LEN - 1] = '\0'; - pid_appid = buf; - } - if (!is_current_preprocessing_assistant(pid_appid)) return -1; - - if (result) { - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_SUCCEEDED); - } else { - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_PREPROCESSING_FAILED); - } - return 0; -} - -int mas_client_set_wake_word_audio_require_flag(int pid, bool require) -{ - multi_assistant_service_plugin_set_wake_word_audio_require_flag(NULL, require); - return 0; -} - -int mas_client_update_recognition_result(int pid, int state) -{ - multi_assistant_service_plugin_update_recognition_result(NULL, state); - return 0; -} - -int mas_ui_client_initialize(int pid) -{ - MAS_LOGD("[Enter] pid(%d)", pid); - - return 0; -} - -int mas_ui_client_deinitialize(int pid) -{ - MAS_LOGD("[Enter] pid(%d)", pid); - - return 0; -} - -int mas_ui_client_change_assistant(const char* appid) -{ - MAS_LOGD("[Enter]"); - - if (NULL == appid) { - MAS_LOGE("NULL parameter"); - return -1; - } - - bool use_custom_ui = mas_get_client_custom_ui_option_by_appid(appid); - masc_ui_dbus_enable_common_ui(!use_custom_ui); - - mas_set_current_client_by_appid(appid); - int pid = mas_get_client_pid_by_appid(appid); - if (pid != -1) { - mas_bring_client_to_foreground(appid); - mas_client_send_preprocessing_information(pid); - mas_client_activate(pid); - MAS_LOGD("MA Client with appid %s exists, requesting speech data", (appid ? appid : "NULL")); - /* - int ret = multi_assistant_service_plugin_start_streaming_utterance_data(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to start streaming utterance data(%d)", ret); - } - */ - } else { - // Appropriate MA Client not available, trying to launch new one - MAS_LOGD("MA Client with appid %s does not exist, launching client", (appid ? appid : "NULL")); - - /* The appid parameter might not exist after this function call, so we use appid string in our g_maclient_info */ - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid) && - 0 < strlen(g_maclient_info[loop].wakeup_word[0])) { - if (strncmp(appid, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - mas_launch_client_by_appid(g_maclient_info[loop].appid, CLIENT_LAUNCH_MODE_ACTIVATION); - } - } - } - } - - return 0; -} - -int __mas_assistant_info_cb(const char* appid, const char* name, const char* icon_path, - const char* wakeup_list[], const char* wakeup_language[], int cnt_wakeup, - const char* supported_lang[], int cnt_lang, const char* wakeup_engine, - bool custom_ui_option, void* user_data) { - MAS_LOGD("__mas_assistant_info_cb called"); - - if (NULL == appid) { - MAS_LOGD("app_id NULL, returning"); - return -1; - } - - int index = -1; - int loop = 0; - while(-1 == index && loop < MAX_MACLIENT_INFO_NUM) { - if (false == g_maclient_info[loop].used) { - index = loop; - } - loop++; - } - if (-1 != index) { - g_maclient_info[index].used = true; - g_maclient_info[index].preprocessing_allow_mode = MA_PREPROCESSING_ALLOW_NONE; - g_maclient_info[index].preprocessing_allow_appid[0] = '\0'; - MAS_LOGD("app_id(%s)", appid); - strncpy(g_maclient_info[index].appid, appid, MAX_APPID_LEN); - g_maclient_info[index].appid[MAX_APPID_LEN - 1] = '\0'; - - for (loop = 0;loop < MAX_WAKEUP_WORDS_NUM;loop++) { - if (loop < cnt_wakeup && wakeup_list[loop]) { - MAS_LOGD("wakeup_list(%d)(%s)(%s)", loop, wakeup_list[loop], wakeup_language[loop]); - strncpy(g_maclient_info[index].wakeup_word[loop], wakeup_list[loop], MAX_WAKEUP_WORD_LEN); - g_maclient_info[index].wakeup_word[loop][MAX_WAKEUP_WORD_LEN - 1] = '\0'; - if (wakeup_language[loop]) { - strncpy(g_maclient_info[index].wakeup_language[loop], wakeup_language[loop], MAX_SUPPORTED_LANGUAGE_LEN); - g_maclient_info[index].wakeup_language[loop][MAX_SUPPORTED_LANGUAGE_LEN - 1] = '\0'; - } else { - strncpy(g_maclient_info[index].wakeup_language[loop], "", MAX_SUPPORTED_LANGUAGE_LEN); - } - } else { - strncpy(g_maclient_info[index].wakeup_word[loop], "", MAX_WAKEUP_WORD_LEN); - } - } - - for (loop = 0;loop < MAX_SUPPORTED_LANGUAGES_NUM;loop++) { - if (loop < cnt_lang && supported_lang[loop]) { - MAS_LOGD("supported_lang(%d)(%s)", loop, supported_lang[loop]); - strncpy(g_maclient_info[index].supported_language[loop], supported_lang[loop], MAX_SUPPORTED_LANGUAGE_LEN); - g_maclient_info[index].supported_language[loop][MAX_SUPPORTED_LANGUAGE_LEN - 1] = '\0'; - } else { - strncpy(g_maclient_info[index].supported_language[loop], "", MAX_SUPPORTED_LANGUAGE_LEN); - } - } - - MAS_LOGD("wakeup_engine(%s)", wakeup_engine); - if (wakeup_engine) { - strncpy(g_maclient_info[index].wakeup_engine, wakeup_engine, MAX_APPID_LEN); - g_maclient_info[index].wakeup_engine[MAX_APPID_LEN - 1] = '\0'; - } else { - g_maclient_info[index].wakeup_engine[0] = '\0'; - MAS_LOGW("Wakeup engine information not provided for : %s", appid); - } - g_maclient_info[index].custom_ui_option = custom_ui_option; - } else { - MAS_LOGD("Couldn't find an empty slot for storing assistant info"); - } - - MAS_LOGD("__mas_assistant_info_cb end"); - - return 0; -} - -static void mas_active_state_changed_cb(keynode_t* key, void* data) -{ - int vconf_value = 0; - if (vconf_get_bool(MULTI_ASSISTANT_SETTINGS_ACTIVATED, &vconf_value) == 0) { - MAS_LOGD("multi-assistant active state : %d\n", vconf_value); - - if (vconf_value) { - multi_assistant_service_plugin_activate(); - } else { - multi_assistant_service_plugin_deactivate(); - } - } -} - -static int init_wakeup(void) -{ - MAS_LOGD("[Enter] init_wakeup"); - - int ret = mas_dbus_open_connection(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to open connection"); - } - - if (0 != multi_assistant_service_plugin_initialize()) { - MAS_LOGE("Fail to ws intialize"); - return -1; - } - - if (0 != multi_assistant_service_plugin_set_language(g_current_lang)) { - MAS_LOGE("Fail to ws set language"); - return -1; - } - - if (0 == mas_config_get_assistant_info(__mas_assistant_info_cb, NULL)) { - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - int inner_loop; - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid)) { - if (0 < strlen(g_maclient_info[loop].wakeup_engine)) { - multi_assistant_service_plugin_set_assistant_wakeup_engine( - g_maclient_info[loop].appid, - g_maclient_info[loop].wakeup_engine); - } - for (inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { - if (0 < strlen(g_maclient_info[loop].wakeup_word[inner_loop])) { - MAS_LOGD("Registering wakeup word %s for app %s", - g_maclient_info[loop].wakeup_word[inner_loop], g_maclient_info[loop].appid); - if (0 != multi_assistant_service_plugin_add_assistant_wakeup_word( - g_maclient_info[loop].appid, - g_maclient_info[loop].wakeup_word[inner_loop], - g_maclient_info[loop].wakeup_language[inner_loop])) { - MAS_LOGE("Fail to add assistant's wakeup word"); - } - } - } - for (inner_loop = 0; inner_loop < MAX_SUPPORTED_LANGUAGE_NUM; inner_loop++) { - if (0 < strlen(g_maclient_info[loop].supported_language[inner_loop])) { - MAS_LOGD("Adding language %s for app %s", - g_maclient_info[loop].supported_language[inner_loop], g_maclient_info[loop].appid); - if (0 != multi_assistant_service_plugin_add_assistant_language( - g_maclient_info[loop].appid, - g_maclient_info[loop].supported_language[inner_loop])) { - MAS_LOGE("Fail to add assistant's language"); - } - } - } - } - } - } else { - MAS_LOGE("Fail to load assistant info"); - } - - if (0 != multi_assistant_service_plugin_set_callbacks()) { - MAS_LOGE("Fail to set callbacks"); - return -1; - } - - if (0 == vconf_notify_key_changed(MULTI_ASSISTANT_SETTINGS_ACTIVATED, mas_active_state_changed_cb, NULL)) { - /* Activate / deactivate according to the vconf key setting */ - mas_active_state_changed_cb(NULL, NULL); - } else { - /* Multi-assistant needs to be enabled by default, unless disabled explicitly */ - multi_assistant_service_plugin_activate(); - vconf_set_bool(MULTI_ASSISTANT_SETTINGS_ACTIVATED, 1); - vconf_notify_key_changed(MULTI_ASSISTANT_SETTINGS_ACTIVATED, mas_active_state_changed_cb, NULL); - } - - /* CHECK NEEDED : should the code segment below and activation logic above be moved to wakeup manger? */ - int prelaunch_mode; - int res = vconf_get_bool(WAKEUP_SETTINGS_KEY_PRELAUNCH_MODE, &prelaunch_mode); - if (0 == res && 0 != prelaunch_mode) { - char *vconf_str; - vconf_str = vconf_get_str(WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID); - if (vconf_str) { - MAS_LOGD("prelaunching default_assistant_appid : %s", vconf_str); - mas_launch_client_by_appid(vconf_str, CLIENT_LAUNCH_MODE_PRELAUNCH); - free(vconf_str); - vconf_str = NULL; - } - } - - return 0; -} - -static void deinit_wakeup(void) -{ - MAS_LOGD("[Enter] deinit_wakeup "); - -/* if (NULL != g_current_lang) { - free(g_current_lang); - g_current_lang = NULL; - } -*/ - - vconf_ignore_key_changed(MULTI_ASSISTANT_SETTINGS_ACTIVATED, mas_active_state_changed_cb); - - int ret = mas_dbus_close_connection(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to close connection"); - } - - if (0 != multi_assistant_service_plugin_deinitialize()) { - MAS_LOGE("Fail to ws deinitialize"); - } -} - -int mas_get_current_client_pid() -{ - int ret = -1; - if (g_current_maclient_info >= 0 && g_current_maclient_info < MAX_MACLIENT_INFO_NUM) { - const char *current_maclient_appid = g_maclient_info[g_current_maclient_info].appid; - ma_client_s* client = ma_client_find_by_appid(current_maclient_appid); - if (client) { - ret = client->pid; - } - } - return ret; -} - -int mas_get_client_pid_by_appid(const char *appid) -{ - int ret = -1; - - if (appid) { - ma_client_s *client = NULL; - client = ma_client_find_by_appid(appid); - if (client) { - ret = client->pid; - } - } - - int status = aul_app_get_status_bypid(ret); - if (-1 != ret && 0 > status) { - MAS_LOGE("The PID for %s was %d, but it seems to be terminated : %d", - (appid ? appid : "NULL"), ret, status); - mas_client_deinitialize(ret); - ret = -1; - } - - return ret; -} - -bool mas_get_client_custom_ui_option_by_appid(const char *appid) -{ - bool ret = false; - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid) && - 0 < strlen(g_maclient_info[loop].wakeup_word[0])) { - if (strncmp(appid, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - ret = g_maclient_info[loop].custom_ui_option; - } - } - } - return ret; -} - -int mas_get_client_pid_by_wakeup_word(const char *wakeup_word) -{ - const char *appid = mas_get_client_appid_by_wakeup_word(wakeup_word); - return mas_get_client_pid_by_appid(appid); -} - -const char* mas_get_client_appid_by_wakeup_word(const char *wakeup_word) -{ - int loop; - const char *appid = NULL; - - if (NULL == wakeup_word) return NULL; - - for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && NULL == appid; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid)) { - for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { - if (0 < strlen(g_maclient_info[loop].wakeup_word[inner_loop])) { - if (0 == strncmp(wakeup_word, g_maclient_info[loop].wakeup_word[inner_loop], MAX_WAKEUP_WORD_LEN)) { - appid = g_maclient_info[loop].appid; - } - } - } - } - } - - /* Perform extended search, by eliminating blank characters */ - if (NULL == appid) { - for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && NULL == appid; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid)) { - for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { - if (0 < strlen(g_maclient_info[loop].wakeup_word[inner_loop])) { - char comparand[MAX_WAKEUP_WORD_LEN]; - int comparand_index = 0; - for (int index = 0; index < MAX_WAKEUP_WORD_LEN; index++) { - if (' ' != g_maclient_info[loop].wakeup_word[inner_loop][index]) { - comparand[comparand_index++] = g_maclient_info[loop].wakeup_word[inner_loop][index]; - } - } - if (0 == strncmp(wakeup_word, comparand, MAX_WAKEUP_WORD_LEN)) { - appid = g_maclient_info[loop].appid; - } - } - } - } - } - } - - return appid; -} - -int mas_set_current_client_by_wakeup_word(const char *wakeup_word) -{ - int loop; - int ret = -1; - int prev_selection = g_current_maclient_info; - - for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && -1 == ret; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid)) { - for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { - if (0 < strlen(g_maclient_info[loop].wakeup_word[inner_loop])) { - if (0 == strncmp(wakeup_word, g_maclient_info[loop].wakeup_word[inner_loop], MAX_WAKEUP_WORD_LEN)) { - g_current_maclient_info = loop; - ret = 0; - } - } - } - } - } - /* Perform extended search, by eliminating blank characters */ - if (ret == -1) { - for (loop = 0; loop < MAX_MACLIENT_INFO_NUM && -1 == ret; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid)) { - for (int inner_loop = 0; inner_loop < MAX_WAKEUP_WORDS_NUM; inner_loop++) { - if (0 < strlen(g_maclient_info[loop].wakeup_word[inner_loop])) { - char comparand[MAX_WAKEUP_WORD_LEN]; - int comparand_index = 0; - for (int index = 0; index < MAX_WAKEUP_WORD_LEN; index++) { - if (' ' != g_maclient_info[loop].wakeup_word[inner_loop][index]) { - comparand[comparand_index++] = g_maclient_info[loop].wakeup_word[inner_loop][index]; - } - } - if (0 == strncmp(wakeup_word, comparand, MAX_WAKEUP_WORD_LEN)) { - g_current_maclient_info = loop; - ret = 0; - } - } - } - } - } - } - - if (g_current_maclient_info != prev_selection) { - if (prev_selection >= 0 && prev_selection < MAX_MACLIENT_INFO_NUM) { - mas_client_deactivate(mas_get_client_pid_by_appid(g_maclient_info[prev_selection].appid)); - } - } - - return ret; -} - -int mas_set_current_client_by_appid(const char *appid) -{ - int ret = -1; - int prev_selection = g_current_maclient_info; - - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid) && - 0 < strlen(g_maclient_info[loop].wakeup_word[0])) { - if (strncmp(appid, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - g_current_maclient_info = loop; - ret = 0; - } - } - } - - if (g_current_maclient_info != prev_selection) { - if (prev_selection >= 0 && prev_selection < MAX_MACLIENT_INFO_NUM) { - mas_client_deactivate(mas_get_client_pid_by_appid(g_maclient_info[prev_selection].appid)); - } - } - - return ret; -} - -int mas_launch_client_by_appid(const char *appid, CLIENT_LAUNCH_MODE launch_mode) -{ - if (NULL == appid || 0 == strlen(appid)) { - MAS_LOGE("appid invalid, failed launching MA Client"); - return -1; - } - - bundle *b = NULL; - b = bundle_create(); - if (NULL == b) { - MAS_LOGE("Failed creating bundle for aul operation"); - return -1; - } - - int result = aul_svc_set_background_launch(b, TRUE); - if (result < AUL_R_OK) { - MAS_LOGE("ERROR : aul_svc_set_background_launch failed. app_id [%s] bundle[%p] result[%d : %s]", - appid, b, result, get_error_message(result)); - } - - result = aul_launch_app(appid, b); - if (result < AUL_R_OK) { - MAS_LOGE("ERROR : aul_launch_app failed. app_id [%s] bundle[%p] result[%d : %s]", - appid, b, result, get_error_message(result)); - } - - if (CLIENT_LAUNCH_MODE_ACTIVATION == launch_mode) { - bool found = false; - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (g_maclient_info[loop].used && - 0 < strlen(g_maclient_info[loop].appid)) { - if (strncmp(appid, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - g_wakeup_maclient_appid = g_maclient_info[loop].appid; - found = true; - } - } - } - MAS_LOGD("g_wakeup_maclient_appid : %s, %d", g_wakeup_maclient_appid, found); - } - - if (b) bundle_free(b); - b = NULL; - - return result; -} - -int mas_bring_client_to_foreground(const char* appid) -{ - /* Bring MA client to foreground - is there a better way other than launching? */ - if (NULL == appid || 0 == strlen(appid)) { - MAS_LOGE("appid invalid, failed launching MA Client"); - return -1; - } - - bundle *b = NULL; - b = bundle_create(); - if (NULL == b) { - MAS_LOGE("Failed creating bundle for aul operation"); - return -1; - } - - int result = aul_launch_app(appid, b); - if (result < AUL_R_OK) { - MAS_LOGE("ERROR : aul_launch_app failed. app_id [%s] bundle[%p] result[%d : %s]", - appid, b, result, get_error_message(result)); - } - - if (b) bundle_free(b); - b = NULL; - - return result; -} - -int mas_launch_client_by_wakeup_word(const char *wakeup_word) -{ - const char *appid = mas_get_client_appid_by_wakeup_word(wakeup_word); - return mas_launch_client_by_appid(appid, CLIENT_LAUNCH_MODE_ACTIVATION); -} - - -int mas_process_voice_key_event(bool pressed) -{ - if (pressed) { - multi_assistant_service_plugin_process_event(MA_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0); - } else { - multi_assistant_service_plugin_process_event(MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, NULL, 0); - } - return 0; -} - -ma_preprocessing_allow_mode_e get_preprocessing_allow_mode(const char* appid) -{ - for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { - if (appid && g_maclient_info[loop].used) { - if (strncmp(appid, g_maclient_info[loop].appid, MAX_APPID_LEN) == 0) { - return g_maclient_info[loop].preprocessing_allow_mode; - } - } - } - return MA_PREPROCESSING_ALLOW_NONE; -} - -int mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT event) -{ - const char* current_maclient_appid = NULL; - const char* preprocessing_allow_appid = NULL; - if (g_current_maclient_info >= 0 && g_current_maclient_info < MAX_MACLIENT_INFO_NUM) { - current_maclient_appid = g_maclient_info[g_current_maclient_info].appid; - preprocessing_allow_appid = g_maclient_info[g_current_maclient_info].preprocessing_allow_appid; - } - ma_preprocessing_allow_mode_e mode = get_preprocessing_allow_mode(current_maclient_appid); - - switch (event) { - case PREPROCESSING_STATE_EVENT_WAKEUP: - case PREPROCESSING_STATE_EVENT_ACTIVE_ASSISTANT_LAUNCHED: - { - if (!check_preprocessing_assistant_exists()) { - mas_bring_client_to_foreground(current_maclient_appid); - } - } - /* Intentionally omitted break statement here */ - case PREPROCESSING_STATE_EVENT_PREPROCESSING_ALLOW_MODE_CHANGED: - { - g_current_preprocessing_state = PREPROCESSING_STATE_WAKEUP_PREPROCESS_DISABLED; - if (MA_PREPROCESSING_ALLOW_UTTERANCE == mode || - MA_PREPROCESSING_ALLOW_ALL == mode) { - if (is_current_preprocessing_assistant(preprocessing_allow_appid)) { - g_current_preprocessing_state = PREPROCESSING_STATE_WAKEUP_PREPROCESS_ENABLED; - } - } - } - break; - case PREPROCESSING_STATE_EVENT_UTTERANCE_STREAMING_STARTED: - { - if (PREPROCESSING_STATE_WAKEUP_PREPROCESS_ENABLED == g_current_preprocessing_state) { - g_current_preprocessing_state = PREPROCESSING_STATE_PREPROCESSING_UTTERANCE; - } else if (PREPROCESSING_STATE_WAKEUP_PREPROCESS_DISABLED == g_current_preprocessing_state) { - mas_bring_client_to_foreground(current_maclient_appid); - g_current_preprocessing_state = PREPROCESSING_STATE_NONE; - } - } - break; - case PREPROCESSING_STATE_EVENT_FOLLOW_UP_STREAMING_STARTED: - { - if (MA_PREPROCESSING_ALLOW_FOLLOW_UP == mode || - MA_PREPROCESSING_ALLOW_ALL == mode) { - g_current_preprocessing_state = PREPROCESSING_STATE_PREPROCESSING_FOLLOW_UP; - } - } - break; - case PREPROCESSING_STATE_EVENT_PREPROCESSING_SUCCEEDED: - { - g_current_preprocessing_state = PREPROCESSING_STATE_NONE; - } - break; - case PREPROCESSING_STATE_EVENT_PREPROCESSING_FAILED: - { - mas_bring_client_to_foreground(current_maclient_appid); - g_current_preprocessing_state = PREPROCESSING_STATE_NONE; - } - break; - } - return 0; -} - -bool service_app_create(void *data) -{ - // Todo: add your code here. - - MAS_LOGD("[Enter] Service app create"); - - if (0 != init_wakeup()) { - MAS_LOGE("Fail to init wakeup service"); - return false; - } - - return true; -} - -void service_app_terminate(void *data) -{ - // Todo: add your code here. - deinit_wakeup(); - return; -} - -void service_app_control(app_control_h app_control, void *data) -{ - // Todo: add your code here. - return; -} - -static void -service_app_lang_changed(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_LANGUAGE_CHANGED*/ - return; -} - -static void -service_app_region_changed(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_REGION_FORMAT_CHANGED*/ -} - -static void -service_app_low_battery(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_LOW_BATTERY*/ -} - -static void -service_app_low_memory(app_event_info_h event_info, void *user_data) -{ - /*APP_EVENT_LOW_MEMORY*/ -} - -int main(int argc, char* argv[]) -{ - char ad[50] = {0,}; - service_app_lifecycle_callback_s event_callback; - app_event_handler_h handlers[5] = {NULL, }; - - event_callback.create = service_app_create; - event_callback.terminate = service_app_terminate; - event_callback.app_control = service_app_control; - - service_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, service_app_low_battery, &ad); - service_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, service_app_low_memory, &ad); - service_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, service_app_lang_changed, &ad); - service_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, service_app_region_changed, &ad); - - return service_app_main(argc, argv, &event_callback, ad); -} diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c deleted file mode 100644 index 79f7aa5..0000000 --- a/src/multi_assistant_service_plugin.c +++ /dev/null @@ -1,1085 +0,0 @@ -/* - * Copyright 2018 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "multi_wakeup_recognizer.h" -#include "multi_assistant_main.h" -#include "multi_assistant_service.h" -#include "multi_assistant_service_plugin.h" -#include "multi_assistant_dbus.h" -#include "multi_assistant_common.h" - -/* Sound buf save for test */ -#if 0 -#define BUF_SAVE_MODE -#endif - -#ifdef BUF_SAVE_MODE -static char g_temp_file_name[128] = {'\0',}; - -static FILE* g_pFile = NULL; - -static int g_count = 1; -#endif - -static void *g_handle = NULL; - -static wakeup_manager_interface _wakeup_manager_interface = { NULL, }; -static ma_plugin_settings* g_plugin_settings = NULL; - -static bool is_ui_panel_enabled() -{ - /* By default we assume the ui panel is always enabled unless explicitly turned off */ - bool ret = true; - if (g_plugin_settings) { - ret = g_plugin_settings->ui_panel_enabled; - } - MAS_LOGD("UI Panel Enabled : %d", ret); - return ret; -} - -#if 0 /* + TEST_CODE */ -Eina_Bool __send_asr_result(void *data) -{ - MAS_LOGD("[ENTER]"); - - if (!strcmp((char*)data, "Today's")) { - masc_ui_dbus_send_asr_result(-1, 1, "Today's"); - } - if (!strcmp((char*)data, "weather.")) { - masc_ui_dbus_send_asr_result(-1, 0, "Today's weather."); - } - - MAS_LOGD("END"); - return EINA_FALSE; -} - -Eina_Bool __send_result(void *data) -{ - MAS_LOGD("[ENTER]"); - - int ret = masc_ui_dbus_send_result(-1, (const char*)data, (const char*)data, "test"); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to stop recording(%d)", ret); - return EINA_TRUE; - } - - MAS_LOGD("END"); - return EINA_FALSE; -} -#endif /* -TEST_CODE */ - -Eina_Bool process_wakeup_event_by_appid_timer(char* appid) -{ - MAS_LOGD("[ENTER] appid(%s)", appid); - - int pid = -1; - if (!appid) return ECORE_CALLBACK_CANCEL; - - bool use_custom_ui = mas_get_client_custom_ui_option_by_appid(appid); - bool ui_panel_enabled = is_ui_panel_enabled(); - if (ui_panel_enabled) masc_ui_dbus_enable_common_ui(!use_custom_ui); - - mas_set_current_client_by_appid(appid); - if (ui_panel_enabled) masc_ui_dbus_change_assistant(appid); - if ((pid = mas_get_client_pid_by_appid(appid)) != -1) { - mas_client_send_preprocessing_information(pid); - mas_client_activate(pid); - } else { - // Appropriate MA Client not available, trying to launch new one - MAS_LOGD("MA Client with appid %s does not exist, launching client", appid); - mas_launch_client_by_appid(appid, CLIENT_LAUNCH_MODE_ACTIVATION); - } - mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT_WAKEUP); - - if (appid) free(appid); - - MAS_LOGD("END"); - return ECORE_CALLBACK_CANCEL; -} - -Eina_Bool process_wakeup_event_by_word_timer(char* wakeup_word) -{ - MAS_LOGD("[ENTER]"); - - if (!wakeup_word) return EINA_FALSE; - - const char* appid = mas_get_client_appid_by_wakeup_word(wakeup_word); - process_wakeup_event_by_appid_timer(strdup(appid)); - - if (wakeup_word) free(wakeup_word); - - MAS_LOGD("END"); - return ECORE_CALLBACK_CANCEL; -} - -static void __wakeup_event_cb(wakeup_event_info wakeup_info, void* user_data) -{ - MAS_LOGD("[SUCCESS] __wakeup_event_cb is called, wakeup_word(%s)", wakeup_info.wakeup_word); - int ret = -1; - - if (is_ui_panel_enabled()) { - int retry_cnt = 0; - while (0 != ret) { - ret = masc_ui_dbus_send_hello(); - retry_cnt++; - if (5 < retry_cnt) { - MAS_LOGE("[ERROR] Fail to receive reply for hello, ret(%d)", ret); - break; - } - } - } - -#ifdef BUF_SAVE_MODE - if (g_pFile) { - fclose(g_pFile); - g_pFile = NULL; - } else { - MAS_LOGD("[Recorder Info] File not found!"); - } - - while (1) { - snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/ma_service_%d_%d", getpid(), g_count); - int ret = access(g_temp_file_name, 0); - - if (0 == ret) { - MAS_LOGD("[Recorder ERROR] File is already exist"); - if (0 == remove(g_temp_file_name)) { - MAS_LOGD("[Recorder] Remove file"); - break; - } else { - g_count++; - } - } else { - break; - } - } - - MAS_LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name); - - /* open test file */ - g_pFile = fopen(g_temp_file_name, "wb+x"); - if (!g_pFile) { - MAS_LOGD("[Recorder ERROR] File not found!"); - return; - } - g_count++; -#endif - -#if 0 /* + TEST_CODE */ - if (WAKEUP_EVENT_SUCCESS == event) { - ecore_thread_main_loop_begin(); - ecore_timer_add(1.0, __send_asr_result, "Today's"); - ecore_thread_main_loop_end(); - - ecore_thread_main_loop_begin(); - ecore_timer_add(2.0, __send_asr_result, "weather."); - ecore_thread_main_loop_end(); - - ecore_thread_main_loop_begin(); - ecore_timer_add(3.0, __send_result, "Partly cloudy with temperatures from 75 to 88"); - ecore_thread_main_loop_end(); - } -#endif /* - TEST_CODE */ - if (wakeup_info.wakeup_appid) { - ecore_thread_main_loop_begin(); - ecore_timer_add(0.0f, process_wakeup_event_by_appid_timer, (void*)strdup(wakeup_info.wakeup_appid)); - ecore_thread_main_loop_end(); - } else if (wakeup_info.wakeup_word) { - ecore_thread_main_loop_begin(); - ecore_timer_add(0.0f, process_wakeup_event_by_word_timer, (void*)strdup(wakeup_info.wakeup_word)); - ecore_thread_main_loop_end(); - } - -} - -static bool __validate_streaming_event_order(int pid, wakeup_speech_streaming_event_e *event) -{ - bool ret = false; - - static int previous_pid = -1; - static wakeup_speech_streaming_event_e previous_event = WAKEUP_SPEECH_STREAMING_EVENT_FINISH; - - if (NULL == event) return false; - - wakeup_speech_streaming_event_e expected_sequence [][2] = { - {WAKEUP_SPEECH_STREAMING_EVENT_START, WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE}, - {WAKEUP_SPEECH_STREAMING_EVENT_START, WAKEUP_SPEECH_STREAMING_EVENT_FINISH}, - {WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE, WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE}, - {WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE, WAKEUP_SPEECH_STREAMING_EVENT_FINISH}, - {WAKEUP_SPEECH_STREAMING_EVENT_FINISH, WAKEUP_SPEECH_STREAMING_EVENT_START}, - }; - - if (pid != previous_pid) { - /* When sending streaming event to a new client, it always sends START message first */ - previous_event = WAKEUP_SPEECH_STREAMING_EVENT_FINISH; - } - - for (int loop = 0;loop < sizeof(expected_sequence) / sizeof(expected_sequence[0]);loop++) { - if (previous_event == expected_sequence[loop][0] && - *event == expected_sequence[loop][1]) { - ret = true; - } - } - if (!ret) { - /* In case of FINISH -> CONTINUE without START, simply modify current event value */ - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == previous_event && - WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE == *event) { - *event = WAKEUP_SPEECH_STREAMING_EVENT_START; - ret = true; - - MAS_LOGD("[WARNING] forcibly changed CONTINUE to START : %d -> %d (PID %d -> %d)", - previous_event, *event, previous_pid, pid); - } - } - - if (ret) { - previous_pid = pid; - previous_event = *event; - } else { - MAS_LOGE("[ERROR] State sequence validation failed : %d -> %d (PID %d -> %d)", - previous_event, *event, previous_pid, pid); - } - return ret; -} - -static void handle_speech_streaming_event_failure(void *data) -{ - mas_client_send_recognition_result(0, MA_RECOGNITION_RESULT_EVENT_ERROR); -} - -static void __audio_streaming_cb(wakeup_speech_streaming_event_e event, unsigned char* buffer, int len, void *user_data) -{ - if (event == WAKEUP_SPEECH_STREAMING_EVENT_FAIL) { - ecore_main_loop_thread_safe_call_async(handle_speech_streaming_event_failure, NULL); - return; - } - static int count = 0; - if (event != WAKEUP_SPEECH_STREAMING_EVENT_CONTINUE || count % 100 == 0) { - MAS_LOGD( "[SUCCESS] __audio_streaming_cb is called, event(%d), buffer(%p), len(%d)", event, buffer, len); - } - ++count; - - int pid = mas_get_current_client_pid(); - if (pid == -1) { - MAS_LOGE("[ERROR] Fail to retrieve pid of current MA client"); - } else { - if (__validate_streaming_event_order(pid, &event)) { - int ret = masc_dbus_send_streaming_audio_data(pid, event, buffer, len); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to send speech data, ret(%d)", ret); - } - } - } - -#ifdef BUF_SAVE_MODE - /* write pcm buffer */ - if (g_pFile) - fwrite(buffer, 1, len, g_pFile); - - if (WAKEUP_SPEECH_STREAMING_EVENT_FINISH == event) { - if (g_pFile) { - MAS_LOGE("[Recorder SUCCESS] File Close"); - fclose(g_pFile); - g_pFile = NULL; - } else { - MAS_LOGE("[Recorder ERROR] File not found!"); - } - } -#endif -} - -static void __speech_status_cb(wakeup_speech_status_e status, void *user_data) -{ - MAS_LOGD( "[SUCCESS] __speech_status_cb is called, status(%d)", status); -} - -static void __error_cb(int error, const char* err_msg, void* user_data) -{ - MAS_LOGD( "[SUCCESS] __error_cb is called, error(%d), err_msg(%s)", error, err_msg); - - if (is_ui_panel_enabled()) { - int ret = masc_ui_dbus_send_error_message(error, err_msg); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to send error message, ret(%d)", ret); - } - } -} - -static void __streaming_section_changed_cb(ma_audio_streaming_data_section_e section, void* user_data) -{ - MAS_LOGD( "[SUCCESS] __streaming_section_changed_cb is called, section(%d)", section); - - int pid = mas_get_current_client_pid(); - int ret = masc_dbus_send_streaming_section_changed(pid, (int)section); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to send streaming section changed information, ret(%d)", ret); - } -} - -int multi_assistant_service_plugin_initialize(void) -{ - MAS_LOGD( "[Enter]"); - - char filepath[512] = {'\0',}; - const char *default_engine_path = MA_WAKEUP_MANAGER_PATH; - snprintf(filepath, 512, "%s/%s", default_engine_path, MA_DEFAULT_WAKEUP_MANAGER_FILENAME); - - char *error; - g_handle = NULL; - g_handle = dlopen(filepath, RTLD_LAZY); - if (NULL != (error = dlerror())) { - MAS_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", filepath, error); - return -1; //MAS_ERROR_OPERATION_FAILED; - } - - _wakeup_manager_interface.initialize = - (wakeup_manager_initialize)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_INITIALIZE); - _wakeup_manager_interface.deinitialize = - (wakeup_manager_deinitialize)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_DEINITIALIZE); - _wakeup_manager_interface.get_settings = - (wakeup_manager_get_settings)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS); - _wakeup_manager_interface.add_assistant_wakeup_word = - (wakeup_manager_add_assistant_wakeup_word)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_WORD); - _wakeup_manager_interface.add_assistant_language = - (wakeup_manager_add_assistant_language)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_LANGUAGE); - _wakeup_manager_interface.set_assistant_wakeup_engine = - (wakeup_manager_set_assistant_wakeup_engine)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_WAKEUP_ENGINE); - _wakeup_manager_interface.set_language = - (wakeup_manager_set_language)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_LANGUAGE); - _wakeup_manager_interface.activate = - (wakeup_manager_activate)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_ACTIVATE); - _wakeup_manager_interface.deactivate = - (wakeup_manager_deactivate)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_DEACTIVATE); - _wakeup_manager_interface.update_voice_feedback_state = - (wakeup_manager_update_voice_feedback_state)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE); - _wakeup_manager_interface.send_assistant_specific_command = - (wakeup_manager_send_assistant_specific_command)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND); - _wakeup_manager_interface.set_background_volume = - (wakeup_manager_set_background_volume)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME); - _wakeup_manager_interface.update_recognition_result = - (wakeup_manager_update_recognition_result)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT); - _wakeup_manager_interface.process_event = - (wakeup_manager_process_event)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT); - _wakeup_manager_interface.start_streaming_utterance_data = - (wakeup_manager_start_streaming_utterance_data)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA); - _wakeup_manager_interface.stop_streaming_utterance_data = - (wakeup_manager_stop_streaming_utterance_data)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_UTTERANCE_DATA); - _wakeup_manager_interface.start_streaming_previous_utterance_data = - (wakeup_manager_start_streaming_previous_utterance_data)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_START_STREAMING_PREVIOUS_UTTERANCE_DATA); - _wakeup_manager_interface.stop_streaming_previous_utterance_data = - (wakeup_manager_stop_streaming_previous_utterance_data)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_PREVIOUS_UTTERANCE_DATA); - _wakeup_manager_interface.start_streaming_follow_up_data = - (wakeup_manager_start_streaming_follow_up_data)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_START_STREAMING_FOLLOW_UP_DATA); - _wakeup_manager_interface.stop_streaming_follow_up_data = - (wakeup_manager_stop_streaming_follow_up_data)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_FOLLOW_UP_DATA); - _wakeup_manager_interface.get_audio_format = - (wakeup_manager_get_audio_format)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_FORMAT); - _wakeup_manager_interface.get_audio_source_type = - (wakeup_manager_get_audio_source_type)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_SOURCE_TYPE); - _wakeup_manager_interface.set_wake_word_audio_require_flag = - (wakeup_manager_set_wake_word_audio_require_flag)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG); - _wakeup_manager_interface.set_wakeup_event_callback = - (wakeup_manager_set_wakeup_event_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_EVENT_CALLBACK); - _wakeup_manager_interface.set_utterance_streaming_callback = - (wakeup_manager_set_utterance_streaming_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_UTTERANCE_STREAMING_CALLBACK); - _wakeup_manager_interface.set_previous_utterance_streaming_callback = - (wakeup_manager_set_previous_utterance_streaming_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_PREVIOUS_UTTERANCE_STREAMING_CALLBACK); - _wakeup_manager_interface.set_follow_up_streaming_callback = - (wakeup_manager_set_follow_up_streaming_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_FOLLOW_UP_STREAMING_CALLBACK); - _wakeup_manager_interface.set_speech_status_callback = - (wakeup_manager_set_speech_status_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK); - _wakeup_manager_interface.set_error_callback = - (wakeup_manager_set_error_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK); - _wakeup_manager_interface.set_streaming_section_changed_callback = - (wakeup_manager_set_streaming_section_changed_callback)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK); - - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_initialize func = _wakeup_manager_interface.initialize; - - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_INITIALIZE); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to initialize, ret(%d)", ret); - } - } - - wakeup_manager_get_settings get_settings_func = _wakeup_manager_interface.get_settings; - - if (NULL == get_settings_func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS); - } else { - size_t struct_size; - ret = get_settings_func(&g_plugin_settings, &struct_size); - if (0 != ret || struct_size != sizeof(ma_plugin_settings)) { - MAS_LOGE("[ERROR] Fail to get settings, ret(%d), size %zu", ret, struct_size); - g_plugin_settings = NULL; - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_deinitialize(void) -{ -#ifdef BUF_SAVE_MODE - if (g_pFile) { - fclose(g_pFile); - g_pFile = NULL; - } else { - MAS_LOGD("[Recorder ERROR] File not found!"); - } -#endif - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_deinitialize func = _wakeup_manager_interface.deinitialize; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_DEINITIALIZE); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to deinitialize, ret(%d)", ret); - } - } - - dlclose(g_handle); - g_handle = NULL; - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - - return ret; -} - -int multi_assistant_service_plugin_get_settings(ma_plugin_settings **settings, size_t *struct_size) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_get_settings func = _wakeup_manager_interface.get_settings; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS); - } else { - ret = func(settings, struct_size); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to get settings, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_language(const char* language) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_language func = _wakeup_manager_interface.set_language; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_LANGUAGE); - } else { - ret = func(language); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set langauge(%s), ret(%d)", language, ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_add_assistant_wakeup_word func = _wakeup_manager_interface.add_assistant_wakeup_word; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_WORD); - } else { - ret = func(appid, wakeup_word, language); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set wakeup word(%s)(%s)(%s), ret(%d)", appid, wakeup_word, language, ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_add_assistant_language(const char* appid, const char* language) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_add_assistant_language func = _wakeup_manager_interface.add_assistant_language; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_LANGUAGE); - } else { - ret = func(appid, language); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set wakeup word(%s)(%s), ret(%d)", appid, language, ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_assistant_wakeup_engine(const char* appid, const char* engine) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_assistant_wakeup_engine func = _wakeup_manager_interface.set_assistant_wakeup_engine; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_WAKEUP_ENGINE); - } else { - ret = func(appid, engine); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set wakeup engine(%s)(%s), ret(%d)", appid, engine, ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_activate(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_activate func = _wakeup_manager_interface.activate; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ACTIVATE); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to start recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_deactivate(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_deactivate func = _wakeup_manager_interface.deactivate; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_DEACTIVATE); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_update_voice_feedback_state(const char* appid, int state) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_update_voice_feedback_state func = _wakeup_manager_interface.update_voice_feedback_state; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE); - } else { - ret = func(appid, state); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_send_assistant_specific_command(const char* appid, const char* command) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_send_assistant_specific_command func = _wakeup_manager_interface.send_assistant_specific_command; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND); - } else { - ret = func(appid, command); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_background_volume(const char* appid, double ratio) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_background_volume func = _wakeup_manager_interface.set_background_volume; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME); - } else { - ret = func(appid, ratio); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set background volume, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_update_recognition_result(const char* appid, int state) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_update_recognition_result func = _wakeup_manager_interface.update_recognition_result; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT); - } else { - ret = func(appid, state); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to update result state, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_process_event(int event, void *data, int len) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_process_event func = _wakeup_manager_interface.process_event; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT); - } else { - ret = func(event, data, len); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_start_streaming_utterance_data(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_start_streaming_utterance_data func = _wakeup_manager_interface.start_streaming_utterance_data; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_stop_streaming_utterance_data(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_stop_streaming_utterance_data func = _wakeup_manager_interface.stop_streaming_utterance_data; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_UTTERANCE_DATA); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_start_streaming_previous_utterance_data(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_start_streaming_previous_utterance_data func = _wakeup_manager_interface.start_streaming_previous_utterance_data; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_START_STREAMING_PREVIOUS_UTTERANCE_DATA); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to request previous speech data, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_stop_streaming_previous_utterance_data(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_stop_streaming_previous_utterance_data func = _wakeup_manager_interface.stop_streaming_previous_utterance_data; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_PREVIOUS_UTTERANCE_DATA); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to request previous speech data, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_start_streaming_follow_up_data(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_start_streaming_follow_up_data func = _wakeup_manager_interface.start_streaming_follow_up_data; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_START_STREAMING_FOLLOW_UP_DATA); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_stop_streaming_follow_up_data(void) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_stop_streaming_follow_up_data func = _wakeup_manager_interface.stop_streaming_follow_up_data; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_FOLLOW_UP_DATA); - } else { - ret = func(); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_get_recording_audio_format(int *rate, int *channel, int *audio_type) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_get_audio_format func = _wakeup_manager_interface.get_audio_format; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_FORMAT); - } else { - ret = func(rate, channel, audio_type); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to get recording audio format, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_get_recording_audio_source_type(char** type) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_get_audio_source_type func = _wakeup_manager_interface.get_audio_source_type; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_SOURCE_TYPE); - } else { - ret = func(type); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to get recording audio source type, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_wake_word_audio_require_flag(const char* appid, bool require) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_wake_word_audio_require_flag func = _wakeup_manager_interface.set_wake_word_audio_require_flag; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG); - } else { - ret = func(require); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set wake word audio require flag, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_callbacks(void) -{ - int ret = multi_assistant_service_plugin_set_wakeup_event_callback(__wakeup_event_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set wakeup event cb"); - return ret; - } - - ret = multi_assistant_service_plugin_set_utterance_streaming_callback(__audio_streaming_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set utterance streaming cb"); - return ret; - } - - ret = multi_assistant_service_plugin_set_previous_utterance_streaming_callback(__audio_streaming_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set previous utterance streaming cb"); - return ret; - } - - ret = multi_assistant_service_plugin_set_follow_up_streaming_callback(__audio_streaming_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set follow-up streaming cb"); - return ret; - } - - ret = multi_assistant_service_plugin_set_speech_status_callback(__speech_status_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set speech status changed cb"); - return ret; - } - - ret = multi_assistant_service_plugin_set_error_callback(__error_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set error cb"); - return ret; - } - - ret = multi_assistant_service_plugin_set_streaming_section_changed_callback(__streaming_section_changed_cb, NULL); - if (0 != ret) { - MAS_LOGE("Fail to set streaming section changed cb"); - return ret; - } - - return 0; -} - -int multi_assistant_service_plugin_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_wakeup_event_callback func = _wakeup_manager_interface.set_wakeup_event_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_EVENT_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set wakeup event callback, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_utterance_streaming_callback func = _wakeup_manager_interface.set_utterance_streaming_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_UTTERANCE_STREAMING_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set utterance streaming callback, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_previous_utterance_streaming_callback func = _wakeup_manager_interface.set_previous_utterance_streaming_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_PREVIOUS_UTTERANCE_STREAMING_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set utterance streaming callback, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_follow_up_streaming_callback func = _wakeup_manager_interface.set_follow_up_streaming_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_FOLLOW_UP_STREAMING_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set follow-up streaming callback, ret(%d)", ret); - } - } - } else { - MAS_LOGE("[ERROR] g_handle is not valid"); - } - return ret; -} - -int multi_assistant_service_plugin_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_speech_status_callback func = _wakeup_manager_interface.set_speech_status_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set speech status callback, ret(%d)", ret); - } - } - } - return ret; -} - -int multi_assistant_service_plugin_set_error_callback(wakeup_service_error_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_error_callback func = _wakeup_manager_interface.set_error_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret); - } - } - } - return ret; -} - -int multi_assistant_service_plugin_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data) -{ - int ret = -1; - if (NULL != g_handle) { - wakeup_manager_set_streaming_section_changed_callback func = _wakeup_manager_interface.set_streaming_section_changed_callback; - if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK); - } else { - ret = func(callback, user_data); - if (0 != ret) { - MAS_LOGE("[ERROR] Fail to set streaming section changed callback, ret(%d)", ret); - } - } - } - return ret; -} diff --git a/wakeup-engine-default.manifest b/wakeup-engine-default.manifest new file mode 100644 index 0000000..017d22d --- /dev/null +++ b/wakeup-engine-default.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/wakeup-engine-default.xml b/wakeup-engine-default.xml new file mode 100644 index 0000000..d7094d6 --- /dev/null +++ b/wakeup-engine-default.xml @@ -0,0 +1,18 @@ + + + + + + service.png + + + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/network.get + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/internet + http://tizen.org/privilege/alarm.set + http://tizen.org/privilege/recorder + http://tizen.org/privilege/datasharing + + true +