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)
--- /dev/null
+# wakeup-engine-default
+Reference wakeup engine
+++ /dev/null
-/*
- * 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 <tizen.h>
-#include <tzplatform_config.h>
-
-#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__ */
+++ /dev/null
-#ifndef __MULTI_ASSISTANT_SERVICE_H__
-#define __MULTI_ASSISTANT_SERVICE_H__
-
-#include <app.h>
-#include <glib.h>
-#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__ */
+++ /dev/null
-/*
- * 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 <dlog/dlog.h>
-
-
-#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_ */
+++ /dev/null
-/*
- * 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 <dlog/dlog.h>
-
-#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_ */
+++ /dev/null
-/*
- * 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 <dlog/dlog.h>
-#include <multi_assistant.h>
-
-#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_ */
+++ /dev/null
-<manifest>
- <request>
- <domain name="_"/>
- </request>
-</manifest>
-
+++ /dev/null
-<?xml version="1.0" encoding="utf-8" ?>
-<manifest xmlns="http://tizen.org/ns/packages" api-version="5.0" package="org.tizen.multi-assistant-service" version="0.1.1">
- <label>Multi Assistant Service</label>
- <author email="wn.jang@samsung.com" href="www.samsung.com">Won Nam Jang</author>
- <author email="sooyeon.kim@samsung.com" href="www.samsung.com">Sooyeon Kim</author>
- <author email="seongrae.jo@samsung.com" href="www.samsung.com">Seongrae Jo</author>
- <description>Multi Assistant Service</description>
- <service-application
- component-type="svcapp"
- auto-restart="true"
- on-boot="true"
- appid="org.tizen.multi-assistant-service"
- exec="org.tizen.multi-assistant-service"
- nodisplay="true"
- multiple="false"
- type="capp"
- taskmanage="false">
- <icon>org.tizen.multi-assistant-service.png</icon>
- <label>Multi Assistant Service</label>
- <background-category value="media"/>
- <background-category value="background-network"/>
- </service-application>
- <privileges>
- <privilege>http://tizen.org/privilege/application.launch</privilege>
- <privilege>http://tizen.org/privilege/power</privilege>
- <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
- <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
- <privilege>http://tizen.org/privilege/appmanager.kill</privilege>
- <privilege>http://tizen.org/privilege/keygrab</privilege>
- <privilege>http://tizen.org/privilege/recorder</privilege>
- <privilege>http://tizen.org/privilege/appdir.shareddata</privilege>
- <privilege>http://tizen.org/privilege/internet</privilege>
- <privilege>http://tizen.org/privilege/network.get</privilege>
- <privilege>http://tizen.org/privilege/bluetooth</privilege>
- <privilege>http://tizen.org/privilege/bluetooth.admin</privilege>
- </privileges>
-</manifest>
+++ /dev/null
-<manifest>
- <request>
- <domain name="_" />
- </request>
-</manifest>
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-ADD_SUBDIRECTORY(wakeup-manager)
+++ /dev/null
-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()
+++ /dev/null
-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/)
+++ /dev/null
-/*
- * 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 <tizen.h>
-
-#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_ */
+++ /dev/null
-/*
- * 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_
+++ /dev/null
-/*
- * 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_
+++ /dev/null
-#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;
-}
+++ /dev/null
-#include "dependency_default.h"
-#include "dependency_default_audio.h"
-
-static bool g_voice_key_pressed = false;
-static mas_proxy_interface g_proxy_interface;
-
-#include <stdlib.h>
-#include <thread>
-#include <atomic>
-#include <chrono>
-
-#include <dlog.h>
-#include <audio_io.h>
-#include <sound_manager.h>
-#include <sound_manager_internal.h>
-
-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<chrono::milliseconds>(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;
-}
+++ /dev/null
-#include "dependency_default.h"
-#include "dependency_default_button.h"
-
-#include <dlog.h>
-
-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()
-{
-}
+++ /dev/null
-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/)
+++ /dev/null
-/*
- * 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_ */
+++ /dev/null
-/*
- * 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_
+++ /dev/null
-/*
- * 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_
+++ /dev/null
-#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;
-}
-
+++ /dev/null
-#include "dependency_tv.h"
-#include "dependency_tv_audio.h"
-
-static bool g_voice_key_pressed = false;
-static mas_proxy_interface g_proxy_interface;
-
-#include <stdlib.h>
-#include <thread>
-#include <atomic>
-#include <chrono>
-
-#include <dlog.h>
-#include <sound_manager.h>
-#include <sound_manager_internal.h>
-
-using namespace std;
-
-#include <bluetooth_product.h>
-#include <farfield-voice-api.h>
-#include <vconf.h>
-
-#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<chrono::milliseconds>(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;
-}
-
+++ /dev/null
-#include "dependency_tv.h"
-#include "dependency_tv_button.h"
-#include "dependency_tv_audio.h"
-
-#include <chrono>
-
-#include <dlog.h>
-
-static mas_proxy_interface g_proxy_interface;
-
-#define EFL_BETA_API_SUPPORT
-
-#include <Ecore_Input.h>
-#include <Ecore_Wl2.h>
-#include <Key_Mode.h>
-
-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<std::chrono::milliseconds>(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();
-}
+++ /dev/null
-/*
- * 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 <tzplatform_config.h>
-
-#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_ */
+++ /dev/null
-/*
- * 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 <list>
-#include <mutex>
-#include <unordered_map>
-#include <string>
-#include <set>
-
-#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<void*, AllocationEntry> mManagedTable;
-
- std::mutex mUnmanagedRecordsMutex;
- std::list<AllocationEntry> mUnmanagedRecords;
- size_t mUnmanagedRecordsSize{0};
-
- enum class EntryOperation {
- INSERT,
- DELETE,
- };
- typedef struct {
- AllocationEntry entry;
- EntryOperation operation;
- struct timespec ts;
- } EntryHistory;
- std::list<EntryHistory> mEntryHistory;
-};
-
-#endif /* __HEAP_TRACER_H__ */
\ No newline at end of file
+++ /dev/null
-/*
- * 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 <atomic>
-#include <list>
-#include <mutex>
-#include <thread>
-#include <vector>
-
-#include <audio_io.h>
-#include <sound_manager.h>
-#include <sound_manager_internal.h>
-
-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<IAudioEventObserver*> 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<wakeup_speech_data_with_time> mPreviousAudioData;
- list<wakeup_speech_data_with_time> mAudioData;
-
- mutex mMutex;
- bool mVoiceKeyPressed{false};
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_AUDIO_MANAGER_H_ */
+++ /dev/null
-/*
- * 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 <multi_assistant.h>
-
-#include <atomic>
-#include <string>
-#include <thread>
-#include <vector>
-#include <set>
-
-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<string> assistant_list;
- set<string> activated_assistants;
- void *engine_handle{nullptr};
- } EngineInfo;
-
- void add_engine_directory(string name, string path);
- void add_engine(string name, string path);
-
- vector<IEngineEventObserver*> mObservers;
-
- void streaming_speech_data_thread_func();
-
- vector<EngineInfo> mEngineInfo;
- const EngineInfo* mSelectedEngine{nullptr};
- bool mAudioDataRequired{false};
-
- thread mStreamingThread;
- atomic_bool mStopStreamingThread{false};
-
- bool mWakeWordAudioRequired{false};
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_ENGINE_MANAGER_H_ */
+++ /dev/null
-/*
- * 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
+++ /dev/null
-/*
- * 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 <memory>
-#include <map>
-
-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<IWakeupEventObserver*> 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<string> languageList;
- } AssistantLanguageInfo;
- vector<AssistantLanguageInfo> mAssistantLanguageInfo;
- map<string, bool> mAssistantActivated;
-
- vector<IWakeupEventObserver*> mObservers;
-
- unique_ptr<CWakeupPolicy> 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_ */
+++ /dev/null
-#ifndef __MUTLI_WAKEUP_MAIN_H__
-#define __MUTLI_WAKEUP_MAIN_H__
-
-#include <dlog.h>
-#include <glib.h>
-
-#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__ */
+++ /dev/null
-/*
- * 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 <dlog.h>
-#include <stdbool.h>
-#include <tizen.h>
-#include <tzplatform_config.h>
-#include <multi_assistant.h>
-
-#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_ */
+++ /dev/null
-/*
- * 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 <string>
-#include <memory>
-
-#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<CWakeupPolicyImpl> mImpl;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_POLICY_H_ */
+++ /dev/null
-/*
- * 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 <vector>
-#include <string>
-
-#include <Ecore.h>
-
-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<PRIORITY_INFO> mPriorityInfos;
- vector<wakeup_event_info> mWakeupInfos;
-
- Ecore_Timer *mTimer{nullptr};
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_POLICY_H_ */
+++ /dev/null
-/*
- * 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 <string>
-#include <vector>
-
-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<IPolicyEventObserver*> mObservers;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_POLICY_IMPL_H_ */
+++ /dev/null
-/*
- * 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 <string>
-#include <vector>
-#include <vconf.h>
-
-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<ISettingsEventObserver*> get_observers();
-
- string get_default_assistant_appid();
- bool get_ui_panel_enabled();
- float get_conversation_timeout();
- bool get_multiple_mode();
- vector<string> get_enabled_assistants();
- float get_wakeup_policy_delay();
- vector<string> get_wakeup_policy_priority();
- float get_streaming_duration_max();
- string get_current_language(void);
-private:
- vector<ISettingsEventObserver*> mObservers;
-
- string mDefaultAssistantAppid{DEFAULT_ASSISTANT_APPID};
- bool mUiPanelEnabled{true};
- float mConversationTimeout{5.0};
- bool mMultipleMode{true};
- vector<string> mEnabledAssistants{DEFAULT_ASSISTANT_APPID};
- float mWakeupPolicyDelay{0.1};
- vector<string> mWakeupPolicyPriority; // No priority by default
- float mStreamingDurationMax{10.0};
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_SETTINGS_H_ */
+++ /dev/null
-/*
- * 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 <tizen.h>
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <vconf.h>
-
-#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;
-}
+++ /dev/null
-#include "heap_tracer.h"
-
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include <dlog.h>
-
-#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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> lock(mManagedTableMutex);
- auto iter = mManagedTable.find(ptr);
- if (iter != mManagedTable.end()) {
- if (RECORD_UNMANAGED_CHUNKS) {
- std::lock_guard<std::mutex> 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<std::mutex> lock(mManagedTableMutex);
- return mManagedTable.empty();
-}
-
-void HeapTracer::Trace()
-{
- LOGD("Heap Trace Start");
-
- std::lock_guard<std::mutex> 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");
-}
+++ /dev/null
-#include "wakeup_audio_manager.h"
-#include "wakeup_manager_main.h"
-#include "wakeup_interfaces.h"
-#include "dependency_resolver.h"
-#include "heap_tracer.h"
-
-#include <algorithm>
-
-#include <Ecore.h>
-
-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<chrono::milliseconds>(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<CAudioManager*>(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<mutex> 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<mutex> 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<mutex> 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<mutex> 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<mutex> 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<mutex> 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
+++ /dev/null
-#include "wakeup_engine_manager.h"
-#include "wakeup_manager_main.h"
-
-#include <dlfcn.h>
-#include <algorithm>
-#include <pkgmgr-info.h>
-#include <deque>
-
-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<class C, class T>
-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<CallbackUserData> 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<CallbackUserData*>(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<CallbackUserData*>(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
+++ /dev/null
-/*
- * 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 <algorithm>
-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<CWakeupPolicyDefault*>(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<chrono::milliseconds>(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<IWakeupEventObserver*> 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<CWakeupManager*>(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<IWakeupEventObserver*> 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<IWakeupEventObserver*> 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<IWakeupEventObserver*> 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<IWakeupEventObserver*> 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<IWakeupEventObserver*> 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
+++ /dev/null
-/*
- * 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<ma_plugin_event_e>(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);
- }
-}
+++ /dev/null
-#include "wakeup_policy.h"
-#include "wakeup_policy_impl.h"
-
-#include <vector>
-#include <algorithm>
-
-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
+++ /dev/null
-#include "wakeup_policy_default.h"
-#include "wakeup_policy_impl.h"
-
-#include <vector>
-
-#include <Eina.h>
-#include <dlog.h>
-
-#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<CWakeupPolicyDefault*>(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
+++ /dev/null
-#include "wakeup_settings.h"
-#include "wakeup_manager_main.h"
-
-#include <sstream>
-#include <algorithm>
-
-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<CWakeupSettings*>(data);
- if (nullptr == settings) return;
-
- if (VCONF_TYPE_STRING == node->type) {
- const char* value = static_cast<const char*>(node->value.s);
- vector<ISettingsEventObserver*> 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<ISettingsEventObserver*> 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<string> CWakeupSettings::get_enabled_assistants()
-{
- return mEnabledAssistants;
-}
-
-float CWakeupSettings::get_wakeup_policy_delay()
-{
- return mWakeupPolicyDelay;
-}
-
-vector<string> 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
--- /dev/null
+하이빅스비 H1 A2 W3 O1 I2 W3 B1 I2 G3 SS1 EU2 W3 B1 I2 W3
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+SOURCEFORMAT = WAV\r
+TARGETKIND = MFCC_0_D_A_Z\r
+TARGETRATE = 160000.0\r
+WINDOWSIZE = 320000.0\r
+SAVECOMPRESSED = F\r
+SAVEWITHCRC = F\r
+USEHAMMING = T\r
+PREEMCOEF = 0.97\r
+NUMCHANS = 26\r
+CEPLIFTER = 22\r
+NUMCEPS = 12\r
+ENORMALISE = T\r
+ZMEANSOURCE = T\r
+USEPOWER = T\r
--- /dev/null
+[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
+++ /dev/null
-/*
- * 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 <libxml/parser.h>
-#include <sys/types.h>
-#include <dirent.h>
-
-#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;
-}
+++ /dev/null
-/*
- * 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 <dbus/dbus.h>
-#include <dirent.h>
-#include <dlfcn.h>
-#include <Ecore.h>
-
-#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;
-}
+++ /dev/null
-/*
- * 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__ */
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 <dbus/dbus.h>
-
-#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__ */
+++ /dev/null
-/*
- * 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 <tizen.h>
-#include <service_app.h>
-#include <app_manager.h>
-#include <app.h>
-#include <aul.h>
-#include <malloc.h>
-#include <Ecore.h>
-#include <vconf.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <glib.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_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);
-}
+++ /dev/null
-/*
- * 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 <tizen.h>
-#include <service_app.h>
-#include <app_manager.h>
-#include <app.h>
-#include <malloc.h>
-#include <Ecore.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-#include <dlfcn.h>
-
-#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;
-}
--- /dev/null
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="4.0" package="wakeup-engine-default" version="1.0.0">
+ <profile name="mobile"/>
+ <service-application appid="wakeup-engine-default" exec="/usr/apps/wakeup-engine-default/bin/wakeup-engine-default" multiple="false" nodisplay="true" taskmanage="false" type="capp">
+ <label>service</label>
+ <icon>service.png</icon>
+ </service-application>
+ <privileges>
+ <privilege>http://tizen.org/privilege/mediastorage</privilege>
+ <privilege>http://tizen.org/privilege/network.get</privilege>
+ <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
+ <privilege>http://tizen.org/privilege/internet</privilege>
+ <privilege>http://tizen.org/privilege/alarm.set</privilege>
+ <privilege>http://tizen.org/privilege/recorder</privilege>
+ <privilege>http://tizen.org/privilege/datasharing</privilege>
+ </privileges>
+ <feature name="http://tizen.org/feature/microphone">true</feature>
+</manifest>