From 97a106a02554cbcd468462eedfeb9a40e21f12a3 Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Thu, 11 Nov 2021 12:40:31 +0100 Subject: [PATCH] e2e: geth log in failed tests + new checks for PNs Signed-off-by: Churikova Tetiana --- test/appium/support/base_test_report.py | 20 ++++++-- test/appium/support/test_data.py | 5 +- test/appium/support/testrail_report.py | 11 ++++- test/appium/tests/__init__.py | 2 - .../atomic/account_management/test_profile.py | 44 ++++++++++++------ test/appium/tests/base_test_case.py | 31 ++++++++++-- test/appium/views/base_view.py | 6 +-- .../views/elements_templates/group_logo.png | Bin 0 -> 8409 bytes .../elements_templates/logo_chats_view.png | Bin 0 -> 12040 bytes .../views/elements_templates/logo_new.png | Bin 0 -> 16018 bytes test/appium/views/profile_view.py | 11 +++-- test/appium/views/send_transaction_view.py | 2 +- test/appium/views/sign_in_view.py | 6 +-- test/appium/views/wallet_view.py | 21 ++++----- 14 files changed, 110 insertions(+), 49 deletions(-) create mode 100644 test/appium/views/elements_templates/group_logo.png create mode 100644 test/appium/views/elements_templates/logo_chats_view.png create mode 100644 test/appium/views/elements_templates/logo_new.png diff --git a/test/appium/support/base_test_report.py b/test/appium/support/base_test_report.py index 3fd16f67c6..8573d465c8 100644 --- a/test/appium/support/base_test_report.py +++ b/test/appium/support/base_test_report.py @@ -28,11 +28,19 @@ class BaseTestReport: file_name = "%s.json" % test_name return os.path.join(self.TEST_REPORT_DIR, file_name) - def save_test(self, test): + def save_test(self, test, geth: dict): file_path = self.get_test_report_file_path(test.name) + geth_paths = {} + for log in geth.keys(): + geth_path = os.path.join(self.TEST_REPORT_DIR, log) + result = open(geth_path, 'wb') + result.write(geth[log]) + result.close() + geth_paths[log] = geth_path test_dict = { 'testrail_case_id': test.testrail_case_id, 'name': test.name, + 'geth_paths': geth_paths, 'testruns': list() } for testrun in test.testruns: @@ -41,15 +49,19 @@ class BaseTestReport: def get_all_tests(self): tests = list() - file_list = [f for f in os.listdir(self.TEST_REPORT_DIR)] + file_list = [f for f in os.listdir(self.TEST_REPORT_DIR) if f.endswith('json')] for file_name in file_list: file_path = os.path.join(self.TEST_REPORT_DIR, file_name) test_data = json.load(open(file_path)) testruns = list() for testrun_data in test_data['testruns']: testruns.append(SingleTestData.TestRunData( - steps=testrun_data['steps'], jobs=testrun_data['jobs'], error=testrun_data['error'])) - tests.append(SingleTestData(name=test_data['name'], testruns=testruns, + steps=testrun_data['steps'], + jobs=testrun_data['jobs'], + error=testrun_data['error'])) + tests.append(SingleTestData(name=test_data['name'], + geth_paths=test_data['geth_paths'], + testruns=testruns, testrail_case_id=test_data['testrail_case_id'])) return tests diff --git a/test/appium/support/test_data.py b/test/appium/support/test_data.py index 99a0fe17de..1e7cf2db07 100644 --- a/test/appium/support/test_data.py +++ b/test/appium/support/test_data.py @@ -1,10 +1,11 @@ class SingleTestData(object): - def __init__(self, name, testruns, testrail_case_id): + def __init__(self, name, testruns, testrail_case_id, geth_paths): self.testrail_case_id = testrail_case_id self.name = name self.testruns = testruns + self.geth_paths = geth_paths class TestRunData(object): def __init__(self, steps, jobs, error): @@ -27,6 +28,6 @@ class TestSuiteData(object): if existing_test: self.current_test = existing_test else: - test = SingleTestData(test_name, list(), testrail_case_id) + test = SingleTestData(test_name, list(), testrail_case_id, list()) self.tests.append(test) self.current_test = test diff --git a/test/appium/support/testrail_report.py b/test/appium/support/testrail_report.py index bb93eaeefe..2c757a777d 100644 --- a/test/appium/support/testrail_report.py +++ b/test/appium/support/testrail_report.py @@ -43,6 +43,12 @@ class TestrailReport(BaseTestReport): data = bytes(json.dumps(data), 'utf-8') return requests.post(self.api_url + method, data=data, headers=self.headers).json() + def add_attachment(self, method, path): + files = {'attachment': (open(path, 'rb'))} + result = requests.post(self.api_url + method, headers={'Authorization': self.headers['Authorization']}, files=files) + files['attachment'].close() + return result.json() + def get_suites(self): return self.get('get_suites/%s' % self.project_id) @@ -119,7 +125,10 @@ class TestrailReport(BaseTestReport): data = {'status_id': self.outcomes['undefined_fail'] if last_testrun.error else self.outcomes['passed'], 'comment': '%s' % ('# Error: \n %s \n' % emoji.demojize(last_testrun.error)) + devices + test_steps if last_testrun.error else devices + test_steps} - self.post(method, data=data) + result_id =self.post(method, data=data)['id'] + if last_testrun.error: + for geth in test.geth_paths.keys(): + self.add_attachment(method='add_attachment_to_result/%s' % str(result_id), path=test.geth_paths[geth]) self.change_test_run_description() def change_test_run_description(self): diff --git a/test/appium/tests/__init__.py b/test/appium/tests/__init__.py index 056eaa4d44..aca59605a0 100644 --- a/test/appium/tests/__init__.py +++ b/test/appium/tests/__init__.py @@ -44,8 +44,6 @@ staging_fleet = 'eth.staging' prod_fleet = 'eth.prod' # This fleet is used in the tests used_fleet = staging_fleet -app_path = '/storage/emulated/0/Android/data/im.status.ethereum/files/Download/' -geth_log_emulator_path = app_path + 'geth.log' mailserver_ams = 'mail-01.do-ams3' mailserver_hk = 'mail-01.ac-cn-hongkong-c' diff --git a/test/appium/tests/atomic/account_management/test_profile.py b/test/appium/tests/atomic/account_management/test_profile.py index 58c29707ed..4dd33e386c 100644 --- a/test/appium/tests/atomic/account_management/test_profile.py +++ b/test/appium/tests/atomic/account_management/test_profile.py @@ -568,7 +568,6 @@ class TestProfileSingleDevice(SingleDeviceTestCase): class TestProfileMultipleDevice(MultipleDeviceTestCase): - @marks.testrail_id(6646) @marks.high def test_set_profile_picture(self): @@ -615,19 +614,21 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): @marks.testrail_id(6636) @marks.medium + @marks.flaky def test_show_profile_picture_of_setting(self): self.create_drivers(2) - home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user() + home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user(enable_notifications=True) profile_1, profile_2 = home_1.profile_button.click(), home_2.profile_button.click() public_key_1, default_username_1 = profile_1.get_public_key_and_username(return_username=True) - public_key_2 = profile_2.get_public_key_and_username() + public_key_2, default_username_2 = profile_2.get_public_key_and_username(return_username=True) + logo_online, logo_default, logo_chats, logo_group= 'logo_new.png', 'sauce_logo.png', 'logo_chats_view.png', 'group_logo.png' [profile.home_button.click() for profile in (profile_1, profile_2)] home_1.add_contact(public_key_2) home_1.profile_button.click() profile_1.just_fyi("Set user Profile image from Gallery") - profile_1.edit_profile_picture(file_name='sauce_logo.png') + profile_1.edit_profile_picture(file_name=logo_default) home_1.profile_button.click() profile_1.swipe_down() @@ -635,21 +636,21 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): device_1_status = 'My new update!' timeline = profile_1.status_button.click() timeline.set_new_status(device_1_status) - if not timeline.timeline_own_account_photo.is_element_image_similar_to_template('sauce_logo.png'): + if not timeline.timeline_own_account_photo.is_element_image_similar_to_template(logo_default): self.errors.append('Profile picture was not updated in timeline') profile_1.just_fyi('Check profile image it is not in mentions because user not in contacts yet') one_to_one_chat_2 = home_2.add_contact(public_key_1, add_in_contacts=False) one_to_one_chat_2.chat_message_input.set_value('@' + default_username_1) one_to_one_chat_2.chat_message_input.click() - if one_to_one_chat_2.user_profile_image_in_mentions_list(default_username_1).is_element_image_similar_to_template('sauce_logo.png'): + if one_to_one_chat_2.user_profile_image_in_mentions_list(default_username_1).is_element_image_similar_to_template(logo_default): self.errors.append('Profile picture is updated in 1-1 chat mentions list of contact not in Contacts list') profile_1.just_fyi('Check profile image is in mentions because now user was added in contacts') one_to_one_chat_2.add_to_contacts.click() one_to_one_chat_2.chat_message_input.set_value('@' + default_username_1) one_to_one_chat_2.chat_message_input.click() - if not one_to_one_chat_2.user_profile_image_in_mentions_list(default_username_1).is_element_image_similar_to_template('sauce_logo.png'): + if not one_to_one_chat_2.user_profile_image_in_mentions_list(default_username_1).is_element_image_similar_to_template(logo_default): self.errors.append('Profile picture was not updated in 1-1 chat mentions list') one_to_one_chat_2.get_back_to_home_view() @@ -657,11 +658,12 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): profile_2 = one_to_one_chat_2.profile_button.click() profile_2.contacts_button.click() profile_2.element_by_text(default_username_1).click() - if not profile_2.profile_picture.is_element_image_similar_to_template('sauce_logo.png'): + + if not profile_2.profile_picture.is_element_image_similar_to_template(logo_online): self.errors.append('Profile picture was not updated on user Profile view') profile_2.close_button.click() [home.home_button.click() for home in (profile_2, home_1)] - if not home_2.get_chat(default_username_1).chat_image.is_element_image_similar_to_template('sauce_logo.png'): + if not home_2.get_chat(default_username_1).chat_image.is_element_image_similar_to_template(logo_chats): self.errors.append('User profile picture was not updated on Chats view') profile_1.just_fyi('Check profile image updated in user profile view in Group chat views') @@ -671,17 +673,31 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): group_chat_1 = home_1.get_chat(group_chat_name).click() group_chat_1.join_chat_button.click() group_chat_1.send_message(group_chat_message) - if not group_chat_2.chat_element_by_text(group_chat_message).member_photo.is_element_image_similar_to_template('sauce_logo.png'): + if not group_chat_2.chat_element_by_text(group_chat_message).member_photo.is_element_image_similar_to_template(logo_default): self.errors.append('User profile picture was not updated in message Group chat view') + home_2.put_app_to_background() + + profile_1.just_fyi('Check profile image updated in group chat invite') + home_1.get_back_to_home_view() + new_group_chat = 'new_gr' + group_chat_1 = home_1.create_group_chat(user_names_to_add=[default_username_2], group_chat_name=new_group_chat) + home_2.click_system_back_button() + home_2.open_notification_bar() + + invite = group_chat_2.pn_invited_to_group_chat(default_username_1, new_group_chat) + home_2.get_pn(invite).wait_for_visibility_of_element(30) + if not home_2.get_pn(invite).group_chat_icon.is_element_image_similar_to_template(logo_group): + self.errors.append("Group chat invite is not updated with custom logo!") + home_2.get_pn(invite).click() profile_1.just_fyi('Check profile image updated in on login view') home_1.profile_button.click() profile_1.logout() sign_in_1 = home_1.get_sign_in_view() - if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template('sauce_logo.png'): + if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template(logo_default): self.errors.append('User profile picture was not updated on Multiaccounts list select login view') sign_in_1.element_by_text(default_username_1).click() - if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template('sauce_logo.png'): + if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template(logo_default): self.errors.append('User profile picture was not updated on account login view') sign_in_1.password_input.set_value(common_password) sign_in_1.sign_in_button.click() @@ -696,7 +712,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): group_chat_1.send_message(group_chat_message) one_to_one_chat_2.close_button.click() one_to_one_chat_2.home_button.click(desired_view='home') - if home_2.get_chat(default_username_1).chat_image.is_element_image_similar_to_template('sauce_logo.png'): + if home_2.get_chat(default_username_1).chat_image.is_element_image_similar_to_template(logo_default): self.errors.append('User profile picture is not default to default after user removed from Contacts') profile_2.just_fyi('Enable to see profile image from "Everyone" setting') @@ -706,7 +722,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): profile_2.element_by_translation_id("everyone").click() group_chat_1.send_message(group_chat_message) profile_2.home_button.click(desired_view='home') - if not home_2.get_chat(default_username_1).chat_image.is_element_image_similar_to_template('sauce_logo.png'): + if not home_2.get_chat(default_username_1).chat_image.is_element_image_similar_to_template(logo_chats): self.errors.append('User profile picture is not returned to default after user removed from Contacts') self.errors.verify_no_errors() diff --git a/test/appium/tests/base_test_case.py b/test/appium/tests/base_test_case.py index 4bc7fcb6f2..2ab24471f6 100644 --- a/test/appium/tests/base_test_case.py +++ b/test/appium/tests/base_test_case.py @@ -16,6 +16,8 @@ from tests import transl from support.api.network_api import NetworkApi from support.github_report import GithubHtmlReport from tests import test_suite_data, start_threads, appium_container, pytest_config_global +import base64 +from re import findall class AbstractTestCase: __metaclass__ = ABCMeta @@ -55,6 +57,15 @@ class AbstractTestCase: updated_capabilities.append(capabilities) return updated_capabilities + @property + def app_path(self): + app_path='/storage/emulated/0/Android/data/im.status.ethereum.pr/files/Download/' if findall(r'pr\d\d\d\d\d', pytest_config_global['apk']) else '/storage/emulated/0/Android/data/im.status.ethereum/files/Download/' + return app_path + + @property + def geth_path(self): + return self.app_path + 'geth.log' + @property def capabilities_sauce_lab(self): desired_caps = dict() @@ -136,6 +147,15 @@ class AbstractTestCase: % self.get_alert_text(driver) + def pull_geth(self, driver): + result = "" + try: + result = driver.pull_file(self.geth_path) + except WebDriverException: + pass + return base64.b64decode(result) + + class Driver(webdriver.Remote): @property @@ -189,13 +209,14 @@ class SingleDeviceTestCase(AbstractTestCase): self.print_sauce_lab_info(self.driver) try: self.add_alert_text_to_report(self.driver) + geth_content = self.pull_geth(self.driver) self.driver.quit() if pytest_config_global['docker']: appium_container.stop_container() except (WebDriverException, AttributeError): pass finally: - self.github_report.save_test(test_suite_data.current_test) + self.github_report.save_test(test_suite_data.current_test, {'%s_geth.log' % test_suite_data.current_test.name: geth_content}) class LocalMultipleDeviceTestCase(AbstractTestCase): @@ -244,15 +265,19 @@ class SauceMultipleDeviceTestCase(AbstractTestCase): custom_implicitly_wait if custom_implicitly_wait else self.implicitly_wait) def teardown_method(self, method): + geth_names, geth_contents = [], [] for driver in self.drivers: try: self.print_sauce_lab_info(self.drivers[driver]) self.add_alert_text_to_report(self.drivers[driver]) + geth_names.append('%s_geth%s.log' % (test_suite_data.current_test.name, str(self.drivers[driver].number))) + geth_contents.append(self.pull_geth(self.drivers[driver])) self.drivers[driver].quit() except (WebDriverException, AttributeError): pass - finally: - self.github_report.save_test(test_suite_data.current_test) + geth = {geth_names[i]: geth_contents[i] for i in range(len(geth_names))} + self.github_report.save_test(test_suite_data.current_test, geth) + @classmethod def teardown_class(cls): diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py index 38cc1d9590..f6a21f3ebb 100644 --- a/test/appium/views/base_view.py +++ b/test/appium/views/base_view.py @@ -12,7 +12,7 @@ from io import BytesIO from selenium.common.exceptions import NoSuchElementException, TimeoutException from support.device_apps import start_web_browser -from tests import common_password, pytest_config_global, geth_log_emulator_path, transl +from tests import common_password, pytest_config_global, transl from views.base_element import Button, BaseElement, EditBox, Text @@ -574,7 +574,8 @@ class BaseView(object): return items_in_logcat def find_values_in_geth(self, *args): - b64_log = self.driver.pull_file(geth_log_emulator_path) + from tests.base_test_case import AbstractTestCase + b64_log = self.driver.pull_file(AbstractTestCase().geth_path) file = base64.b64decode(b64_log) result = False for value in args: @@ -584,7 +585,6 @@ class BaseView(object): result = True return result - def asset_by_name(self, asset_name): return AssetButton(self.driver, asset_name) diff --git a/test/appium/views/elements_templates/group_logo.png b/test/appium/views/elements_templates/group_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..799676b9d3969932a527b3a972e3ab9f433fa77e GIT binary patch literal 8409 zcmV;~ASU05P)F;j^PEZzNfn6@U^T6_cH_`U5Qzjy(||0|1qK@<&(o7O zpM8e?J^TFjZ`!-iXBh2vTc3F13H{Yy{Z-AfOo0n-S(fQ7x7?yTcka}gnVDz$aTg7q ziJN@(v!B)N+qXX@nHRfl-@aWx{pn9X6OX=VTsDFaA3m&`H*daVq@HiP^2#f9|Ni}# zs~L;NB`5eh-}%mEC-r>Wx4!kQOWmABi={4vQ!#s7B^W&ZGd?$IHpO;*KGBJ2DH4jqX(IS{=ASR$Wkb;1x-c&$wb$N6U z4F+&A;xyLWssl~Vd*8{)Ng9m??|8>M7SqH<_oe6KDX-1R5?ujL`EHqe1BcRixkhg-TLlUs8w$tb#xLyI2qd0|ShYkK>$s%DR^t zPn+O&yUpO>AQyX@2&k<)Z!5q$g_kcI=DO9Z*dUgX;GyavStP-rC;r%x_Orv6x5+&F(yI1U_?+=qADge#1L`8Be8-+$lAh* zrNcZb!k<30i|_eJ8}Jw$5ikAw&OS?D0@kBIjUz{nux8Dg#j*A@aM1+cfB*elfBp4m z7xu|?+W(9bA+LmCN5X&GyooEUGU7V~iS(SKRSH1_6%ZAKNE9XZUzpMQ(q146 zBoTrrioqMmqi5O;a9eMNyZ0T1n2>0ol1LIA0gnSJ>Rx{CNORJ8a+bO4}lg~<53KX!}%Obq_mN4QcKuo zrNsV_Ya$q}|L{hMSdwTcTuJT?VEN+M6t|w7paN!}Vi*`}3Um^X65D_A3z58g_inaq z*|G@gE)GvgaJ$`RU|?XuV~+asBnPU+{ilK zvg=_ENJ4BF=y;r3JWxyRvoSqAecrZRDqN7@5CTb(EIgo@x~D~IqMs|mt=DX2ZS>@^ zTUUq)d8m7?7sWeJV^E*5C%61ldx{57O>wl_;QiIs`YFRkzT5p=$Odi z-XkUN8#_Tz#Y982!txmS+I2fvJ2lDi#sGh?Zy#Upl+45gOCU&GP+t}i%Cfwy+QkL0 zymIAARJA{r32OB8gGP%WSmXH_fwy0^ja=F+>o{i8CZ&{!ouNtwFw(<&OckbE8 zcPD$C06Ku+us9+)l>~4-mRIoVYp-Ta2vn{OK2Tw}_mt-YCy&!2VaishL`-nJW_W;= z?MWt^kyX7O@4R9q&mQaYzN4dbW|eOfYrR`M^xLGWEL*mW$;rvfM(}wJjkmnzEsTwg z0cRLn5v+n$0|+7W+}LdJdpoXSnX6dQ7WOTz5a}`;m9$KWGQ++w!Y}PS#mgUfoWGvz zv4@0dD})4m>M4_gRN5@l9vdq7UpvIBGCUDXEltesVQ#0`R2<;@PZ;@a&nR-OP0*5 zY_S9c2-rlqu`$4{tJmP|3=$Ho2&s0cTmau-SJvbM`w#KJRF{qgG$&Dm*bdJV!_O>T z&U1%`Se{$b;7OuEO{7(HiLM@=Ovw3Iug!-}j3T9giAZ7?D1_-$dH0GXyn0{&O97fu zILIo&(qY;^(w_E}~1faV}mY!!I1 zz->Ez02fEG>XDdZ)lg*+as16xn_KrEWfTh}I2TyuD{kJhj2|Cd#c)xPhc3~Sls1B< zST#hzTg7@0J;z<4;*NtSh&Y1ryl%s0?%w|-ZJV+zmfU;o7S{FJ6vhAv!Bm*&=w=;; zy3os)aqrkT?>T&ec4ELsoYEioP9x8Ay4~(2CwQKS`26QTKaX4l!t5Kb0@tYU+dFoU z%M30GHY5ZS=%${aEk1s5l(!r{$_x&*fo1gg$fostWBZl7G8b0$M#*X8O{9_((Hx@y zfkp@n7C>dVyXtb=v6CnX0naU~mh;51gS4&Sg7TYdhFMugW)i_@LM4VQR3H_NqDf!? ztvbA9q`^&tIgOZrrt`=J==FNse*5j0oZxvqSVR`6cG{w7didJbO)P75Sv8$7m07X~ zh4XmLc-Nkz{ADc3t3cNzysF`O>(*^7DW>rj@~VCr{ks8z4VEkj6U{D-N|{b`K0jG< z$HAj0DQW_5Tif724Q%9A?IbcNsvsDmfKdekJ!5&ru0uTG zn?S*7pWWG5q;qjW=H_tkz4tC$OCk+~)WiQ+znU#pSUK(3za)}qhh7RW%Cr_$X9T@s14}$U+Iyzmm+F#{wd#)VjC!?RO{2$FABzP6vZv&qK)Fci+8eQqQ99 z%pSaO@2wx+;kZ^Ke{#igvSy@N4H0dZXbaRW=i>)YamVxoAY?x9(W|!dV~k@+Nj1`S z;Kh)p091$0_hAc zKD7?33Y7+0J;!a+C;8Mw0cz0&g~g@q#dAIQfd?MAz!QQM&)cut!OB$WWfm`iEDBOK z_(r?S9n)hpd}PEcAKki{A8}(?&FCdCmDWDtGyn^@7mXT{qQS>IZQgt2BxwoGz-?DoyGvawR0~-$FO>Cy=Dt8Yg5TZ8VCZZIHraIH?LU98WfdmtR+(K? zBL&49rBxboTk*?lS0NYZr7wNyOE2oW7lS#14;?x*SC~TW9;B9Q4Lon&umLd{X)qWS zG$eGI6(8Gon4{tdw&LZk8O0U=<(5m z6O<;!gf?$oKfsMPA*KbRNyY~c9Ylhn*7J^Mtz|$wCN8I&O{0A`{)ILh1s4;%jifQ< zhgXlVVU~P>99P@teVjUV>e3Q?u3(P5$Zm6ZS6{S_E3f6Theqvw%95{r6I8QOYONwhilf)j$h%U2r{YGQhh}9;RoM6=mSf*Q{qyW@rz3+W8E< zq@r>iD%YiQy?OhE?NHh-xROTHIsltM8VYXQvWaE@QHz>La*o9K#3w#+NeFfT-~H}) z=Mya86`HF2^zZ-_6DW=(W>mK1P-~cf(Bn|1tfu5=k`%8UDr+&Sq`?qnp?H~~MapMF z#ruz(ps7Mndc0@#N?vXgFdYgblw$Zsdz=#q>tcb9o>d`h9R7g}P zOyp|^kI+rQm6q3T8ewVZQpN<3zH+a0QcvbBilS1BoFIlf<0OB0bQ+}zboiaE8+mDF z80vXWSVN;Shz{|ABaf1j(!=w}=rlh&{s_$oZGl{CQ(<9UK+fPw*(C6VAK1iT&tueJ z0_3sF%hs&s!^cNSBa~;mCV<)}Gdw)JD1yz26DJlv5+I`dY-@;dGYuGQOzD~lf=~Fz z6Ek>8Na^yj)+%P45=>`A{Y)R_@Y6T_J|V6JoIef zzbtDa{TG$Yezs>|-@bi|A{W4Y>QkSZU)q2BMk3E%vyy}ff`QCON>PqCGL9(_lq-!e zAfB}9yEV@l*rppDqKTy4l+XH#4(L1k-&CdP=f!jjQ0FB(iK ztwR)Syg21wrPekYB|Kr_d()mw;h#I>TtDov5lRaLVOhg5pq`of&pB7-EbhGXPCoLH zk33CE&!KX7cv$B-oGsX3FcSIeYp-Qfb&S$97$}5ZR`5**`L)M)(*=HIcqwmQlap5v zjO~kpGcQ$o`xcu^+&;l>qMH3Si23{hEqVDIQ8U9Fwh&mSB@WSYumEM#a;2ghAym;Zful%^Uy z9d6sSnwOfCK$o6_tg3tOZ0~mwR1>71U?K>p!=A^IKNn+-idI#z#pg6D=pyXyR*1>y zNktkICl05cwTaZXIIJtwpZUdDiC4T;yt&85l;63PYedDN{~o^T5Mp*yD5t2 zx+JApwdv$3qDpiXP9SQa0~ATdNLk>mK~M}StFnYh1@X-EluL&TdP|I)_AJe2%tR}6 zVy$5~Ai-e!nLLR`dRFOagRgWt+;+T!iepd>WvKYlkz;%{fpUHX{i2YQQBo3}BEB~1 z4RspC86NCz-5+z7IKzY-l@Ro+c z`!}q_T5uI~ogs?pTU~)h`2M=E7v-Bq`NqB}ECCY&H?|DFx8h2qGfibIS>-6wvVI;> z+QCyICDg#uo8UQ7lNT7Mvy;PtQgNnfg!J>6mP|~ImJiXYWOiOl!LGIuA zIG!Az7QCdD@b+~p=*5agm4iT$mgGLtPN3^tKQksHjTMbfm*6a@;zco`;8eFliHK1o zF66Dg90Z$sL@xz;k}+6L5)&m+gD0@5)x`D+Dqv^TWknk3I;GWHQcIJ*+1WLXxv$(` zAS2yHCDV$^)XfV9igX&Ij;Ykq?6!Hp4)KP^90^mL)`@5t3kt5w@%t zBpvP11s*#!%}a)d7%+j-b?WS&3t*u}1T0ZglHjRq1a-80WHO7mkn^oHaLYrxDQVzs zmm5;Ud$w*ws+sv$ROmTy0VacG(g4x3HM8`jBvFfvQ28#EO*vAAx%1BLy+cDo7fs~( z;BLP8W)_lNcg~nD~0|m<{jFr9iXrew^J0MA(G#7tg;7(EXqO>TL3Hzyoe4?olt?%cSYBALSaK&wdUr1Pbwmxwc#S3Gu*hqSiX z{?Aq0S(lEJ78xcQrt&TaXmG+j9QOHs1C`}8e%Dc8~ zCGSj9>LdfbglG(pYQ`@-yql9W5riLa8UASV6-1rER)AW%Nu0}vh*CRjB4BLf$!5yl zD4?G8K(i4rMM7bra4=LF{(iiNw-&2Vn)$+O)22;}A{W3lo6U2IYE`O^Xuzm}!;PF( z-Gb5vytO0|-nn))H?LenS0Wf8>6@YRZV;8O%W$z^GV?Ur8GoA^Zh!1CJYBW||50k6 z^msbNh$-1AgS_sEC+ZCKw8Ql(d~EgAXgNbLTKguLosCqhkETyFs<P@8f{)|EbrT~jiJ!)M@i;mw$xaQw?ZdzyyMATba0poeqp4^ zpfBherHBDn38fnT;>rC?8|wUsV5rW~Aud%)>s)5fnOQw4mNF62%2QF#W4m+vR-R{+ zDpoYA$aEe_Pir`HmYzAI(L!xaHLHZ46DHFJuYc%qcB`S1$lW`(^6c2A6%+m;HQe&> zK2A6=9$wghKfdxBk~m4%1_pa6g`0J?okr+SlBr^#NQ9l!lf3p|8&5{=3cj^{JvQcK zp+r_; zSZau zXTs9KYGl$5@<)4)BPJ*J!mm7M1En>Lc9!$gk9?0~R>1c7!Di&so1Vo`IX`bKn!b(` zYfqVrAdE2(ExkC*YaaS8C$j_$yig1;S-O%=(=kE=qe?psMAP7-2afg=$rr|b_uY3< zZMzuE5&VJ|yx_c*6o_iL?ca7XQC6sWtUvz)o(V4n&6x1XiIa>O=-G-_xRg!38IF+g z>L(s$($qcvrvyHB#YTc1qnFGlcur%8ij}%Q7n$L3I>4_y`~;6AU<$+L2)90K2O~wB ztcsK|P)5&^DZ`(fJjo%rKz`+gxp=xbE28n$uYUEswekS}OvT>^LuH#Rpf)ZD(Uc=u z%4d#FlEfyt_x$2>w=?cG@ZTTZ!-PN_u>82d?_af@TssVwiVNqzfeMtO^irXUYx%{8 zckzH#Y=m42K78HPtnG|aS%ZxUY6@JIu&+79pPZP%V40ueUgNI2?z*^!T_i3l0bA$? z1p_Qs`0}&1u|9S{YmM|w{nw}xL@)@Eh-k(q#*Xo^lRZjOUOQs>#Z^mr+2aTC2)$hS z(aP}A?b{iurWtRP4E7SD7|dLZL6E)^$7nrwqn$b)8z1B5!!t}dOIkT{3jTci)$E8< zb((+~qL(Nm#Wa&H<5hc(@OYUMqy!e8+I3kIumS$;&;D%wO{q;)G-FhRcR#k9nWRNX z1S1h4*3$tDSdEnZsC4N(qfNN$WQS4`meS*f%~$dI#}6{&5-JQoQotWvvyFkOjn#^! zT_q0@tM&DQ0W{XSt|>{e9C8hQeb-@r{_qS_fP}y%3hsK|4z|e@!6@D}Ks`;3OxgyY z8SC<7l@O?NkryKO{qKMOB_$WmGYO{IY|fhyV(I%sQb;OzRhIFNZQE$Z2}10lu}Ksq z4N5!pEbR%CndOeXqkPhL!NbcoY~-5<4=^bXvcL~|;Zxgo(CSTq6I3GJDutm=S_y*H zNKb^KVK`tCKD~P{e><&o$pC{$m!C`$Zr#3}e&SO4}G)*ar;+Y|M{xq(7UR*tE5>SiSz#9jb@U|68v960~imFGVqn8#8d3ZP- z;>L%cpo_(5pao0=4$BJ?+}H(jCgqOhL!y1)*wT^Ltzc7DNYpUr|H_1|0_*?KaAXn6#PizJ@f({rBRWH~Oz66TBgp_a{o5WUt&#*NlZ;kX zafMOtyk;}Qy&l~xkOael<{-cIuRD3b34{h#>93EXlvG$EDX_-Co7S!7#Um|D*(H?* zZP#P4$|%(1OhuzA8M7JR2}vy$kUGIbL%lprUwfG4_;SsUyC{OovLwsSpQdlI1QDEg zegxsSu6s7m86V|%3b*V%#@}gxDgj$!5U#btpI*I%p{h&aBCRg;nk|0&p|H7Cwv>B2$4^ooaT#T(@c_J=m!JN z6KpGrf;3GR$KnO>l*<{MI(3Q_D^@IYDh{nA-cmL!bOVm_FK2N4_;Kd@!!Io^YC(?u`}faxKKH+|IqiZ5Bo&GG zv=k;0(!QX(%3A(>+ZM!*lKGS<^pmG&FBbb5JEt!l5LEh;38Sf}*-D)vo5WBXA||C{ z3&aiZhldXGneiS4EtHC&wAGPN!!KaqL%f#;)*M{|Ni^WE}V=0NPktS zE~bi90uy~1T{u{gXMFU!Eo8KDewf0Y4j>iQ;7#qs=~;_67BBTy`Z8mX4 z9Ua$T*HF%vCnG=h&@MhcUQpstQ(!1bFF@{BzVel4gj~4D9z2V^d-t+=^XB?QW*_?u zb*CTh7rR5@|%s zXr8ghWZbiBKmXM3Z~#ydL>-1|F5|s^zWIwH?b@}Aty{M)inOPLr@gFKr_*6zVBl$) zlve7L|0ZyCQ+U;?4P3QkDZ{-kgQ3F40&6{p5M!*(_29u++DXPlmUF1=@i&LZ_||xv zV*=Actz=$gl8}fnK0ba)!az?4-}l0Ft5&UIbaeD7>(eWl?HIa}|;iC3qE*Hko&=6x|W7x}_=(iviv+(8H z-~M)`AJ918W=PdyRX{Ch(*Lbp^i~s6P3qz9obyaSlzF;L&N*&zPkH}aZn2|yS-^m3QCn6TYefQn>l%MV8+U~vg-b>w_MdPwAF}`-~+RIMrnl)?m$tRz@ zT+LWCo{>fJ@44q5ectn)cgaY-?z-#rOJDlZGx6w)#xp|jnV6WE(C>WbJNm{qzVV{| vn};+_^$l-$gMRzl-`26Qv1j^m7mfc1wNZXSOFf2O00000NkvXXu0mjfk&-Iv literal 0 HcmV?d00001 diff --git a/test/appium/views/elements_templates/logo_chats_view.png b/test/appium/views/elements_templates/logo_chats_view.png new file mode 100644 index 0000000000000000000000000000000000000000..f45c121fb8c9533eb62aea84f3c87410f8b95b25 GIT binary patch literal 12040 zcmV+jFZa-iP)~=H_|y(IXsv@+c>sImww*XPCb{&+6h5 zy>6eXECELpM|3(JMkYqsHZ#NS>vyyN#{C>Rc!=9?yN#*o>3^yrAbykp8e@3y!Ow8` z@L%)DBVXe9@#BC6;lP7HB9VyjXn;oo4hMj*-+8fhP37U{n{MKDcizbx?!KG1y!EYU zt$$QQ0{#iy+V71^a<3*@EW`V4|v4$dVNmU-%soJDDBaa zM@f&wH(CvU&pr3}&wlo^KZ>FG9~ywh82`H;`CWhD-~lgcfHnr6*6*(dFMd9FvhJ#W zeGw1^(xVek)CjLC@(Argdcfau;DG<|@BW@Q#{95``NIM5Lm&E(pPHH40zh8{L=9H6 z1_5Lkw3HqpUr2e+?^1fC_Q=R16OU|#E*c&h9uf~Vko9$^W~cmze(OU&jG_Ku0lfeI z`~CjCduvvdTi__^(Q*q&ffqrP)q~s^u-u}y?+Bo-foog^+Vgu7x`+acM|fiV-UEC6 z{hzr12RY;)41lLjo$~K^=R15Y-@QP4MdTHUS43VAdC&p82v35i5e5a)$3$ME0}F4k zuXwK@9!-2k_&6{KtN% z)e6)E0VpCbNW7-uW0FmPpa$bA08{Xz;K#1&6Ib=g=Y1Zlzds6o2z=-21?8&yYa*|R z0vD)yvT6W9`pMR?|F3`i@$VbJ?@NvO;0Hg*$L_li0E@&T3F?Og6p>U&R{;irf%+^8 zDnMHp0@}bZFd|_{LPts3T9PPDBT4CIIo+~k0IWI3vVks;*S)A;odn}RB1w?6bd%f^ zRML`52RLvVoFYXNBYEGi{|dkNk>C4XA^6_(z{SNy-t(UK@YjbAqmU?}P&%ft2J77B z_X77hG>#OA01c$Tu!OM`ZrL%#h*AuvDWf{3jiT)Z4eyA&pePEgkl0vJMVcO-#caUR zAYKFSoX2~I#G#}>BJj?TD8ND!7zOqMH;qrQcWi>GModfeNQEO& zk_d@(7OX)Thrl5bNUcyxVemLF0zErRW(ApzIA2+gmKjeM8P8@pb6H7gd{DXptLoW< z!0aYM*a(HglH)NPJa~`?9(aKL`}hCw06cp1C~te)+co)O1d35)QP!cW`>)_hH2*+QPC%|C8-uP z;|QrdMNzO`cxcbkb($4Zuxcw-y<^oGx~`%$h9uH3$QZ%1XLy($NrNG4X&8e@Bd$ov zH`bQ<+?7QhU56DQ26iFYO~Nm{>L(fWmN~I_j>i|4coygpw1B_^fvcb2?!NnO9)9@Y z?+V~|W#JEg@PjpY@`d0@Km-6sfStgPjU>G0`s>)$Xb^R~v`a(cLCBa=z=CsR-jm6g zely{jON%Vz6_>lqTya4?=>r46*0*Q^w*Vt?%J%j!l{b{$(f5kSi$0&Zw8-NFSdYL6 zh)Wnk^2&)>w)F>0wA<_-x}MoY@Wl&@oFo7}AgDixdTgFe&(Pt+hxyhuUB^h&rd0`Kr5RYy zTCBO!XmbvD^uioZ%$;S00Gg{Grdhw*x;vl++;PJ;Zk?XS%w0jIP2~7E$L8nx?D-2k zUIeN_#9$2(f{uzfxOY2~*&2=YRT>H0IWx*stog#}Ilk%x1?FgoBQOTMN5=`?R=CRW z`}f_)D{sG@_rC9a-w~tl$ik;jpXL>Z4w3f{=o%sA5=`0;Z?<=5m*>oWIP`wN=hIPX&yy_4}Db zvcECOOk;#bGbK$F%~a8fJbrDN@hBo%FYrXi~Q-*GAC^Sej2zeEwO`H2RAFh zPmGT+RphkIfEb5$ma@ng8yVuzj&1ZKO?Cbv-zW^LuAm@TF|{8TsRhn@`u#rt=e_sx zr+@ZmFCD;7e&Q4S<)=P{+i=P`2QHXGX{wQV$q;ZI@RmIj+>&UvRRu$pM^q7om6Tf0 zPZN$VEO2D8%hy(WEQDuc6nI$+_7B7C@HVE@5PSS2ZIO}-hw%fH$!OY=A>kOzT|qWR z=(XE?eSU$zxpIN$JoE+ZlrY?Gb9SwVuCM)5J7?M93?o$uRgR7YLTYm3CGM_(tmXknNz?!aS z*#SO1Y(djls=9{cVT_}jnrTbz3K6cSZC2P6oOl#0k3sDe;Gm`426^?PVmOEiQ* zMS{{PDy_JpBaSR(9G;u!Bth1V1FsyJ=B}Ny>>bubb^+#>X!#gbR#dJ;pb&|p5nDtQ z5qXX6d)Crn{%&D`zq)vVrvO7R316{iFICiJu{WThVaUPl+b0<_j&@a{oyDdJ16yK+ zL?jIoA;B3`mJ@r;9h2Kw>#noDyh83l*x>d?3J@A+1ARUF>}h`MxBoxx{g?myccwsV zE!S<|&eHr6)P|V_5Duk0ktt~dw^>lqI(E^^FR zO5nz3o1dAS=JrmT8-%0f3re41Oi43Ian50^r4$9ZF0ryC!edDBjVZozahbn77t{|2 z+yK0Jc$}MVyqQ0F>Nt-L7Lma1Q!($|c_Y{NGG=m1WF3Q8(GvzEH9C#)5`0yn%K|4N z^7aVFvy6u>pXN)e6&Ha*69~se2p5RR15-0&Ts(gorPL;X*C==Qee^yq&CdtW2v(0k zfOl9^q6p^MD`rNyX>^#h*JCVdLn-Nc$#Sc~QCo0$ZhjNIT`J~|iE&;%)#j$Oq){#* z`ztg`$%q=l4+2R^Wzmr*iVRvQoNO^jM)_Jd=fO*hJY9={3E<8f_wlNm_Hpj?ah|Qg z8wFlHdp+XocE|?xslfp=fyoAaU<7r@!%ZuDF)Z&)OF(wIWR3r&9-?vZ>1rQ;K5X2&wMu)}{UO6*EI_S|hhGflu5JlIKsKJjXE;#L^xm_{F_9a#O3tni}w})kRhb`r=QH53xUrY1o|Hb?GMsS<~TS zfl-b^I7;OZN`Q7)Y4GHXH#OD#CH9Su@Vfom7y?=)Xb0f8Oubs@e(Yoa@x=lB+(Qp> z;;E-M7`y(NLr@|q(H_QteXSv;fDz@1ZADY0c-i7y1%H2OiAz2xwFibq`0;HM>@huN zY?lrhTI4uka59)N$_WOmtF&}ND{X;Kka7s8CwOMX@%d-Zu~a|bPT;QXv+Qf8Y#VOy z<>!v^gbDI+R|^hxTFm4HjVdFFJuda+ssLqB(xap!5{^hZB4Go?OOLb#Mt*o4?bciZ3cBP_6@cP_3nR08Z$yC2bBkL2%3M&c< zH$b?IsLF^6un>-F27~RH>W|O2S(cV&c%c2sTGKO!?&#^=>mRpqK z24QK50x1l_gS47vp=p*HB$TnE(1tRWWIE!CNcmP?@R`dOd5k_KLD&50$!*+q!!CyG zfP#|8PCv_XZHnzn;nty1u8SJ9D^JraVi94z0I88e5aCH}=o*1UAxJ<(SYauv0ZnTe zF`iq-x3Rk(hptHpX=)qUA%H)B-~o&=TL3=zna?oD3fTCOcc2_r2Kmwic1yUS)nV9! zFEa2Id7?Pqi23Tu0;hc-^u54cySB5v%82{j+UF~!`DY&lo1QjE7L zhR1kxeU1Nq$7AvfXKIaBqzI`EMKw!1oMmp?rDJru#qY$ov zDPpQp<6Vq15g3K8B&yPQqp&u?*p$L2&}=d&3sNCy4k~s;4Q?4~lWt%kT+nT>2s{yv zGRt`I!3VeSI(+zV>MWGN_uhl8<3qL#Y_fM~lvx?0@(PVd2!Try&RWmo^NaYJ&F|Pb z$#sckIJd~WK&cQ6mQ{o>8Yd)93aoTg(i4x3aIwmGa&?`r&R^t-fx`edM(~E2X>J=z zn27}^*Ow8~UY#Sr%!E#~)M8Dh!l2}`kdBIaxR+#re?(LIsU{VshMMSLdWlA%T0ErWhN_$o!AHY-K ztc0||<7ZFvxrKsfY?!PYfVXWM;|){ebe6ARiP33;v;B&v=89l;0cxntk{9It0a8j5 z9pQ|n5|&&_d})Y{B{7hiFz_xKBL&K7+Evb;v|wA3P-Yn&)j?K{sYaU}X~e0#3ahUG za3O#en3_i(`C=frx%qjHA3KJk4j0s&+OUotv|^ZTrnJ4m+Z>r_vQn^O;pqG#B|#7S z@!6OuZ)uc$TosW|OZc(&#mSzn{9 zfl_`;#YiJquHz&d%@Wb4;@Fjp8%8GRq=rHk0UjA=RMe43W1X%!#A4 zB`S$g%_iP^jEY$jf+I`wd}(flQ#D202)y>XZM<^0#kN5YRaL}s%3ODub*0f|#rFDM zuJ#ueCQzHY>iP5feWPZ#bsW^3*lL0<$;D`;JQdvAcUab_nftgKR$V$ zfrTqY$x2=@6Gb@ZkY18X$#A3@1D>ndcB5@3c=`~j)MrkgyB1mDzz0GV1gGb=G)4C- zqz5My#w!L=a-sH4H-O3E28nb?Z@^iEbqF7!WkTOsR)kS7J=omghm@z<$*}NU|1+78Yv>nH?i2rp4w<#Vh3{J(kJV#22w4SyX zOhgGX%RvTjzoVut4>-x?%X8?}#U&(QH<#J@H6+HpV4atdol}FB= zv_RZOB@GJiF;b$G3PygJkXVOQiWO&ZSQ0DH!XX4`p-Isw5d!{Ea|r7SoUu3~u$83k z!*DBLsj8@i#Ct(370wzGYZ;F8CL|j{$W5FatS+vg``unRB^+CH8V*UIqZKkQNE3~q z!dY;!X0;qp)NHQ>baYBwI1~|;maN5^UZhwRiYHd*_}hice7jynQve;23(c42=5WP2 z-doZ*A@TxK7_bhhG+DKXkzq1K6vVmmmIx0*QOXGApj{Ot-eHwMBS@{LVI32ZVE5QC z>#ibJ8X*(%sKt1DhII9E$oQ%%s*U6brEsPqwlTv|8~_wGcvlk_l76>`4qFMXf_Wpb zQn!Xuh^j(25&*pSAOwT5+7zwIK|{7s-r}^Uj0LMYVl|4moK<||)McJ=0lX-MEQjaT zu5fAXO89+!OH;qbY^f!(K3>(YoA<2W7xnwrRo~SF**yllZDxX~nIZ-y2ubB7m9Qjn z$TspoZYwGqM3j^gDu=R`RO@T}ePZ*!@TMxwcMq(8r^E#z#HMMJ`WR)Jlx9HG8fMA& zS#P#^W^su}p1w?%5Ir+Mk%wof{iq~00Ja`X9Z@8`>T|@FL9lU55tQN$5cB$6m4eD) zM8HqnFvBfllO)|WCR&=Mrh5uvx3qLsH8w=1uyT!lt_BYkV!`_ z1*M9qREqY3QE#CtaVo|NL1i7W)HFp9>WPw=s>BIUsm9{Ts}hiyMu){H!-3rnjQ z0j`4CHoR)vD7Q~#Qo^FQL&NK)MtMVfCpWBH(m{#x7F*;*k-|HRz|k!-OikTGTBE!}N{JT& zDbh7R;eC$E2gGZN5fs*#u=hv=FOEh~Nl7n?a7c!{#^xD9Ib;%%*#hGYN(bXf`-)~9 z;f$xhwvKDI5kq6lXCCnQ?w<{5lS1Da_5$Y)LAu$-GA-3Dznq zCt1r4o*+WTqX=22+c^PVX$Ati)@{<&HHJogaAaZ>Ju@@S@#9Ygq3pp+8I&FGa5z?h zb>XOlK-4h;WevkJW*j&PtVx&?1uLxtt|OvM^NN<0C&vHaHuuH4MoI6 z1{EoVs3;;$UnIz+MOMTt7n0S1z~SitlSz!UB?uSXbXv0REX%fDC^vLK*dj&Yn3>crEBSM_d_vRnSQ#oj5@|PqQ_I%Q9>flZ=kAC}W;11xY_RMhm%q(M>L9DFMDmV!7XHM!{P1YQc7bOGz1G}w&@ldjbJ>IXy=eZ;GM>J&A?QwQoF}Qt&#emWBU5|p+kqz zx7~I-cpY3h-jQPP9ts({1D={+qc^dKl87NUK;#82U9xYe$*ok3V3`lx%y11vTz~G> z?=4$ah+|7{TL9uTBF`%#U=}zyGr<@cvanPtW+{pJO1I1B&Yb1UAjrH|0C!Gz_=%3D z-CM!?1~zU}_>{tg4E)L$v~^73N(M!a9~$P&pvRFxP+=0_rk!IX#R@JjNIDZ(FBoK! zg|z`0(3gZDv2ny+Za#nM;kMguLr+gnannsVbNs|Hg4;T@qBj024{ILI_Xg~YS`3vH z%4IYn$E2+I<-Ip?Nyl7F`xH83q_T93Agv_UDe|a=(=px%ytfE#u`b8^jJ)09+gZX_ zjt7r;3f#80O-DJJBB97F+2lB1oxj3EmoIQU3)DRg+&-T06EhQxWy>ViV1QhMLE;4n z9KwfLj8%g{0_#%p%?qdL6V$JpTTNz%nnYDWlBQI~<5ZKrhfAxglpE6Qn)HLPpZTW! zH!(dm9W0SM?|d!Ck3Y3(PSxzb*(w3gEL`E>uIm{$8kL0$b%0w^%`RYB#gqyf($mm_ zmJoOw0#5_u5K5s`$ZB;;P$n_+QIk`1U6cv2=Y3PKduo_;;3$2m zc%;1%y#D$f+%eQfXBmcO*n;OYvNE`MfOMdQM|+1VEu~i2<}jyLmv~|g)@th8KRwA< zE5R+U(@2I`9T@VC;_~V$r;9Q;i(Sn=PHtK~0khWubyV)|yWhYc{Qke+v?U=dDnTBC zQE+l)mHFM4nMk24jduoN3u3cO$4iuP*xHXCJ3%XVC< zGRM!)p$WqL72C&9{eot5oXcIs*~0U;r_OV{4({)0C|*4=&K(nz?7-2VU&OXX$rVUn zfiP(L2pq~vBBKyQ^qpefYrc8uGOP9YZf!L<&}xwu1B3yqEv1mGY0t5hc@}Fb4FS18 zh9O=QHWR(^?z^`DeCu1^LaWgr%d+6E0koIFOXwjpaN5DiL6_^(7R|H)uELrU8xVsc>ChA)3SwtSjYil8ve}{Q;j0(tIJy>6iaWq- z#>Y6|Bx!Fz8YdLiQ8rR8Ryj|u_UN+_e+i<<*W1RBk~mFx%Uj>d28W}y<{j^PS5121 zaQGMO-M$NX$WJfLbFRwCk_aQCkoDl z@%1i8*TaBXz-`;d*dC2AG&IX&=N90dW<8P|TV3Q#&8mSL z6$%}o62Zs!u6Mm_vo6D?c>JH={q9Zb!`EqT2pk$iFxQS=>GMo)oq0S33ZYV5lz>hV zqJb1Gq-z3AO4X!{o0M8(bVP;1L@C`yn`g3$Bge5Jp}!&lC6 zwg%)z0k58!Wky(rY(-PYWR<0-B^ON2k;_+D2Qm@D7u0Fan*ajue)qdK*N062-}I(8 zap0B%wY{>TNQa%z7Kuy+OTcq^pNrnHj>5_qL5%bfk{E3xk}5%$G5828Vl0ZvKv_8o z5wQ|QJToXb-mNGJR>UiJO;Ztba=p)Io;l8G90f3<;m7ujaLaVUgw9B-b)*@P7d>)k zXbd-rd_m$0BIk*$M%a`>wpmI$Txd7>;@Sd_Tv^2v0%Uhgjlw()kX`?+xgJNZ z%+XI87?B{2MimlKfG#DYMl$@1QuFxS9P5xG z$A3Bb1Scu!0aL)6_m6V>?qSk+oj$9WmPaHJ#F{*HtlKqwu}a4kv@(P5JDeOPAKt-Z zM(|&cALA>_eY&-n_}TFxUNbq(G?2@TwbZdtR5WLH@=UMG!^bYuBj~77g0qf|LJu1l ze&C<|+SQP~FvWMr_U$asFW_p*(<-5|8G?$Kpd{bcf_KbZ$B&Or5OzyT9!lfg5zbJN4TYuhw0U(eW=!%UGfT8z*t zhG`W;G;D)NDM&r%SLdk4nwUM)JQX|s+r{U&|MW9_Ymigalzdma!JB4waciT^a8)t> z_Wy}nzi^D}|LyNEeCJ&>rl&(RPAPWm+{w?s{pb1EAN?WcFP!21?|&}{0~qf8m%nih zcrT#9jdt_CeH?%8SwJIv2&P*?j-1!QA#fA$hOrUuynZJmRZdzN($df_OO%Ez_EZYi z2N|8I87}6Azh7A3zhCTf7HGC4`*-hU<>V=<(y&NKXM5N6Q@n0ynBCn~MqNqaJe7#> zZU{k&5|SczEVug%B12^zU9ULR9q{PfGEa43iJ%&FfH#bfamVO5w>H`gWf`Nt`LF2w z@-G9heEgey?ZTh%?esJB#!m+#TE3p~l{@)~?eFDPuXr^8fA9w%;uE~*p7+!x95fn9fx`;}4T;Dc(>{1Y-g4b`4i2~3ktW1hk9g1{)dH`fu#Q1t zabpu4%Ss+Nc80GLRHE^rl(gC4!rTfeA*tx~GsE09JvS94r{2PYu3E+MC^Z$Z} zcYgQ`umd13F3}8wqnO>qN~F3N)41^qgb0%vi{~EDTmzwmB!(3=4!H6@)~9y%D@-W{Nvz zw=+D*Xp{wGZ+|Bf|L*?<;4i=Ub9`&|)BhlN8?AZr_55FN{_F2}{yT3rJad{uFFSqC+dGh|GXa2{8@49^r}A9)C7>j;|C2%Ye}W zZ3Hb`NbQ)2c=OKdnUadE*T)SH@tm#r;;|FhW{aM%417k{K(Byawv~mokw34vuEJwYix^#&wo#DojaYkH>whrTBx~1aTUd9tO zc%_6$dQv>Iz#FHBdEJf~CM{IG3^_E+vDFnGI(43t1{Mds%>e#}TU`^>l8E5inr;hj zo|)nHu}Kb8p0Qq!Mw!uyJY50JUwjXGYMSK}-}*;`2k_wP`+52JFObO2O9v3(eeZi8 zj~zL}zrXK3oUI_MwxW05QF-uj!ctjq1XwzMnb%-=<-{xv*`hRp%g*zSrFj;BvJI3F zm2gnPYe!q$J-wZwK?N$JY_>VMvdW_u&U4uWwhZM<*bJd|2#d{BtQk)=duE$VwG?BC zqEjr=9uy?bqofK-{J=5t+MfmBtLOhS?D|LJ2f*?EUvX>aJ^wfW0eqIy50l@-nf)*1o!w-Tl&XE}1_G?#&8 z8L~$ANVt2l!_NBCham=7BK}nR7p^%TWcx#Z(5n0Qy zQeY}7Ybb?)B*HWr^t5Kx!^x!;e&hHBq*VOtV+x^PSY+a*G$msG?cU-A$6r#}lZlB5 z9(dpZ-uT8hKCkSF1T+GLl>)0u)*R#(*82szf0}|irx}=T!>hK<@MDwP*`7(v;$?JN zU~GXkCBo(?p&9Z5sS_e$G0um;eC6@jI@KhEAEi{-0eBkNSYgtLK`goA4QJQ8oX>N< z{M;hH@m)#edv7nfZp{Au`}y>zKYdN@m|&ws;nj-`JSh}d6LRWAoh8%&rqT{OMkg6= zcd(+w3^gfYiSq*K1y+Ew!KC!Q1ZycvgZDn9^$LMfp^A}|5+PDt+Mv=YnU<_b$LT?r zrx&mA_~H_0>LkibmoBkm=T6k}9^AI)z9*peG+z7t0SF-q_3*IV&PK zKTQ?(0Y_~X2Lmp3*Eru_=Tv{4b2zRLz^fE|^U-gyW9LrBSAK?t?-9V4554b2kAGjq z#||I>`2bu^l%Ze{VHIr<_R13T>jUPil2x`!ndE>>o2=(Kzxw|7^GAR9F~0HG zSNL@MHUHS*0`RYISbtG9=KCyv_s{wLkNy$XZES_w3`uQ9_Y}|&8t=n7&6ZBLv7M?- z0CZHsXdE%B6FN!~OM#Y((pY-Nux={Ws)|+TStSIA287tfMtU4lk~^r7SOijrJiv43 zPO^RbEWh_xA7Jt3YqzX^xAqIu_w%yO3+pAo_X!}tpM3n|{2#ym>va2lEWzt*u1*(r z@~Rv^x3!t4_5-CZQ0C?X@q!XRFWOvvuYsuZmSHRL$6u{IN(7Ey`)BXtKm5l(0N~$! z_6-d7{mn}n-|NQyZ(cwC|9r>uKae`oXHTEzU)_5zfBvaYg<5?Z&o1gjB?qFefZ^~V z(y!~?0472qaTq+l-WkbNTdeBluj+0iSnD9VDm9tjW@ola5!Z!i#nnY(MZ+UPk=hvT zcQ(#%fT%*Bnw|L{qYU!Z%^2f9{JS6aw;nj;ducN+|34H&++-)>mIcN`K(sE&g{u{6AnJ?&r79efA-L&pr3}Mzayv z4(SEjYvi>h;IA&+UDtlz1n{at-ioct=n2v%$W01vH-5CG;D7XgjNmg5a`@rHeC3fx zIC1>=W)jm292J}4)r~(+;Ofsx-Le~jQq3gGkG z{M;Nz9(|OfPaoyPi4&YTbB4kzP@WzK64tb*h0000UF{} z1Y%s*C6~`pE|+OOWXgPs{Pm_2(o^B2r#@uI~nIco`v7A|_bKkbx*^=?Oi{reB_ z_%EN}si&Ui+2^0(g%@66e0&s?tuKi6kAs6F_gL6i$rJPiinJRdLPGP8o!mrAxrOu2 zJC6^%{{k+)`hMQl9XzYP=(NO!ICSKJXOVXc6Rdd zkAIw7ZoY*N-|*qr`iXA~yrU6d+qP|d|9ju#?jQY#{kwN3gQDOai2&K>%$qll+i$y_ zJMOrH#ful8_+#HLQ13uk^T--?^Q|{49F(Q0u<}9WWXor^+%%h?*&Nvbg(aJv*&NyI z%=yfHu539_7Phjm6>d)974+uj^yYX9%hemUexJ1cmYZ)@YuBuOySsH-ct;_?0}ni) zuDt5XsRQH6=41vfGr&dJav&XV>p`$>y;)}CwQc5p+m+2z*g4rs>1Gx5MnOSNwhS_u z&9>E*S6`_fc<_O@yPK!LI|2b#ty+~1{E;*BHwXdDH(h!4m1@=MRd08G2(bF$ z)oS^<%clrQdUKV7CtEJrw`2o1WeXmPoNNWz{FDXwc*@09E^aCWW`#fJ7+XdNv~Xq1 zDT|zPC?uPHu0d8Wv*o7QMd0RKmWPU@$GMYi@|%8( zo4Hos8-bIUCDRw1hlVyqZ2rq<|4+X9&2LQ8(l-aD>yuLs>({U6gO^^)x4-qRx8im0 zYWS;feTQo=s8-*f?5V?A4k<+bBL zU7lG78kv27*oH7RUt*J!?<=`QeO=ffu=RAW+c61^iG^0g4tb#)J~mA+$k*))JeLU}-h;I&07KOpW1&X3 zeM5sB5_Yp&Fkz4sDHK^|V9T)>xrNXMJi%ZqCkGvJp)L1B1cF+B@`cawwXc2cs6IMX z@TReV+its!ugl<{hSv{Y|N7Ut?Y7(AwCA643NSo8%&oWH%A=1yDo5<(*LDQ!V}%mi zxe@jpJ9W~kI3#C`@FFA?fetye7&xn|Tkm)3-@bxR$(jHlZ^h(<++iH5&4%C`7L*1=Yd=ciG z3@HPx00V>`R-{ij#6&^?l(4?5ufCdl@4c7K&Q4AxoKgy~XU`s1u3VWJ{L^r%;L%4P zW#!71?Af#Dls@;AQGgvgc5vg3H?n#2<|EE%9CN)KVPFI~g(H}4Fwi6An+_nHkskRy zqs?boZ$AJ_+q;MP1kJ;(g|B)+ZrwXN#JB3opC&8ON5EL-neksNctmi;JbCX^xX z>-YGsORV$^b=?jIy%GRhTlM*kR>aQ^><8fKoja+Dbn3}R1tCPTuW}r%XGR_bIq3_F zkeZxMgu2P0`nS=XU}9`c?+2+H*_H8gfmrsdaZ34<3w?znuH`U{ zQ5-EC18m;BnHz7sk%u07h`Dp;PJ7L3fj7(ohKGl_>86{GJNT#J)WYV?o4M(xn;0G* ze#6gt!z|#MYpyu~&$lzbscM%O_1}@Vw*ZSpIC@`yI~VoO0-#$+czYP)*R`UhYLhr3 zMCL`^^YeKoLOp{5%O;dr9?Ng!IEfk-gfUU1uPx-Yniw}5_(F|}L=+4)5DMdl0d^$p zj8+bL1ps~)YQgiNfqgtv*Z0)WLMv#iB)|o8W-~gb2W;nPl@U2!HT{qW6?oFV=$I5B z3s+x#HIF><$O*4I9=st0xb3#vxaXdGPVff#b?qc-#t&0N%`Ev{-r{pnzvl60b+%Ei zYaZw|CiQRBB=72n6@3p|FvsZeV+{pm9iTZLyNrbTcqP&USWz(*p~2&EKvM=gXP9)g zM!O99g0?nh=k(CE8bk?0th^qeL$=K`qk1q`9n!4m`7x3~^?`YU`16Ia-Fo4rR44R3 zTL<^>!r>tRw#hvcq(-fP=}pno!6!cP3GTl8?h{;fYuH_;zHlz{3VPOg>L|>n@a=bjCb?3wNfCJ-twjGkGG!9J4JFBEV7}LBWaE|PM zaDFe#dV2M7X@_bwm=t#LLO994?%1pMwc^2;2Tl3rViT5&e0^Q_JpG-$y>yrKv2nZ3 zv-@@e@Yr5WL0%!HAXQQmGghX5%}8aUo(=rq``_pHKKV&rE4*e3uzvk|ZQDN$?_?;&z+6`X zE?T5#{kbz{5DpyD@6T&-&hF~srGp0n`01;Ac|i>S6Q*M-v1LMGs0fS7J-00>IC%H%Uo6XsrUELz>y4peXy61CH#s7Bm81 zFlP?SgatVxqqMbXF?HP4?fAv3JNWrN%~rNVBpQV!ihR%v@ooLk5)tRknxUT`=%|w(x0E0w8R+24Vt#@p{QMd z=a66Kse`&L>t5Z*GYw4vD)P(*5Sm$^nf{d&+ zzdCRTTaaaI1X@9$dN$Kl3Hnf$st$O#UChKmdO&^>yli8y2v26yU30{xU8m2hVseY~t8( z4)La;KxS1A=$Eq>w`o0pd0&a1x~8G-SS6YHIado_f$y@fsn4&kPVm4EE#1E=}s zp?!-Sm$N(dY+2E-`Nop&HoQ^I7>WVp13lYSC>nL#M8*2~O=lD<(qep0PL~VqOt!QG z@Z3m+d-v&?Z*q_Gq)|vq7o5S4fqj5P_sBQTmkXBnbWk4E?>CgDXmzQ_6GCpUv?w8%W0c|H3H;%#VsKu$iqcXffq4@HbzrsKN^FMJsI4%Wv zc=c-j*S+^1_W`HjoeTHgdq1mJA73CmE(Q3@Z+s(@U+-iBIc*S2oNY@WrwS8eb_rM} zcJmJ|TmV2Z7@}ZFM2=_Cj75EN_3t6qm!1A>Ws+xUgZ9sja#FNS!UNw*ky z-vXWG8+b(qC-e+2NDsEgaQ-YUcXWm^WeI|Hg@;G^995wPk!53vuOVkFeQ}5*5kW+MFXo%H=TH=0* zbl}e{>Ze}aGlTP6^!_3ON);_UHI*KsFf5Rl2;bO_2}L_;So-;Ow@GB_r+T3x6oRfg zv=si!eTR8)Uuu>$gw+&qYRmQInH*v**6;IZ1%9?dv*r$UIyfc^_?y4}>tmfd4ev7e>%aML$2>PJ1z7vYS{_}u4wzaf!BCwTD+%h1 z#MGN74c~fSe+OrEXbV7oLew0;Oueef*|=>pS<;kY!>~U8@W4S{lKY#$JV(!vi@Li2 zxU8?td?D-Z_$YQ$zqcT9_m0;}L-crDuw6|7TyYzFZkVuxSmmgCT2Xy*T$9~@-9Ly4 zX$gSYvVYZ?X8>?vM;Dv6ZvkLibugJZM)kXF=0dupv-~(B6v|`?i)+L&_#!2`J`GU= zRa{T*@kOAv2x$&$YP6_Nvx0NNPF|{LQ}hTr4*_&+gZ`)(Gn^_@0tal?J@z>$Ty)nDp)5@z>$xzIJxUGzd?$41C}^asR0oMX zjUb*U_W7EP@-+*oSS7ZN>Er*rO?wq~WV&pDV{y|0J@5-l(q^a1vlTrk6;jf9X_rQ% zC7w?~*jYUu$CXgAoEXgF&>@u6u!a>Ai&@t<9cafyCTdy5bP4O*eNe|4p3&RRhnDCT z4s1PylFl-|h!B+tB5{r~6@T~t{`+YW;3yWbZQC~PzyJQDE<6qIZn*#c|HZa#+m1SZ z6b1PH_r8atAWF=R5)`ROvUMy%ED?iDNLMFtMoG_xKA>Gr_=45Gm8UMVc259L?$;49 z`{n)#U}9i>f$_O2r&OUcaj*b^zOU30!R~ zetB?`NB8QPKa}})6Qgj=teKoq)HAoMO|z6bnN7z;jw%94UikcPHqlkIpnOx+;OVSoYwI+!P z6ACa*3<2=H?|qN2e)X$l;V24l_m6&b8v;L?W^AWWfYlE@#Qxp8#qu{5qA6B@ zI7x0X*0CiWIhJ;4fvqcyDH)Ydghb0JFzV{7pE`V)UrlNZAC>!Cf$RFU=yh%hW`x=? zQueg0U^`Kwo8_V$R;XK`L=BBpKq+qou8{GD1c>G}RccUX!$D0=9zJl0O)@pi1UVb{ zEpb*Y@99MO`eg?rO^JSeC`kBi4mh_bFKyMcvTt&Nz|w7v^AUmZ(THwdj3YczO_gJ$ z9q{FtLlYCWs#Gf66(s1j7{$yKA@cqGUF>@`OS_;xg#u(EhGZO2uxIyfRz36(H+(oP zVK)TP-i}OMaJj^fJ3Bar|KT z!%SNnl1iz{ux)+#{`>Bmf&f!kz)v1{fYb1s4G$hM#t8*jvt}(r!xc>YzBv&ZO5lJ& z+$c`{;qwKB7L{6Plk=)kgPcUPh!6hNg3lBCw1a1-N-2~np?J-_SEs^!SMyV62ATOjU=pito;@Fc zb2^Gd4IN)JVokC~0`}MM)q-7>G{*n^?JdlUHDz&x)x@EL<>)KIMo1w2;<|2f-Vx>9 zRk~IUKrAFWww$CuZDdC{BK%dwJe)5UDN4TC?ACV9Y1L}tuCde|osfHr)KV*L_T<^4 z!^5muvxb#Y);2+aRjVIP8l_K&p~4J$#t;xS(=@KdLJDWvK2BZi-zY56Z{wW4a(AS7 z;h@%|7200_aM2uXKAM}0XsheawCfEV6KZDCxdJaC`>|yciw!&yDLSwferG!X`+^!9 zE86Jv#6eB=U#!N7UH?oER*I?m{gT_)?_0bgi5u38F1BvdUbw6`@+|q*Gv~}BC%k*e z_)DfLIG?j$o?Xc{JU|n8d_j+J)1~8UnXvU)1eU#3RboPX9(&o?a@1aJcuQ;MK$vj z>!t-MsSHH79`RH<^G(Tt$OZ{IePQ=bRvp$t}XBV>0-S=1*b6Iq1Koa+%Msc8{)Ij$tHzz?H@0_4MVHjWDs4s9!O z9F>DQ3-bE?y+T2owHhss4pXy(n7)E;%WUzw?x+VTy|=)OoRbvZN;SI|*KcJ1{{76H zIa8l~{FkpSl=w8f`{D6lJ`M;4ck^J6H9{x(xAW@QzkBC)#V zTxyagGa?VzaBwiO^>+Z5%+wF)6E(5WoFtYgp}beb7M0J6h1Xjak*JoD6VntQLro~j zgyZw_0WHL>A8xQy-fP}D7x=A3I&AZ*jtZ0i7iZ?UFO9j%%wP1dXQwrgKU zJ*-g@8K}RbT|e`{VO$x)Fr(Y0Ifij+6twi1|L(27tK0PKb5Da6;AYH*RnuG(a1ekm zns5m?vsX8!&67cIHWLF!;P}*BO`={M(<8AbY9?{}D}Xb~S_tc?>MrPVkbDEMoFkr)I^@uvxQnSoT(p>g-D({Nx(~obiXWW*Yy!v z@*xddoMFKv#d13UvpTe)t9amWqNR+7cJgLp97=Pu0Slge?%A|`FTC)=G|f2;zsX?6 z+}*xoJL6;HQ%)+#plFK2M)fNKojHxIUaYawwE{vB%$l*HX6vg5sudt5rJ!T^TSaFs zNl>JxBJFWPN~(zv>EtAGrdUi$yo8R=kkHuYhP03T=K~|`kmrZMnX-SyT&*r$&{m>X zLa?16z!$UXfFzNQIWDfm7?_lGfH;#)B%%6P96f^-nS@TDkP*HB#)uPBq6LTr8CN={ ziN!84w2T3VOGbs%l5MFDO8jm_!TJglt5lJ>kGiu`2 zCH^pS$Xoh&(A2D`mb0met$zfI^<$dfKRT>`Uuvdg`3&Ideofjh?bal6t`(u`l9*vP zse76=wG=d>7A%(zUwaGB%av(}(IysKd?W7=iJa78xk=&5z&7URh``iAj9p6dU4|7< zaHz(5qS;O(v6DkWc?mnTl}%o>j5d*BI)Ux-s_BYL z#E`CkByHNdWh?e{KH}5x-hge}w&CvDwObqq@zjjj#EX=QIR=5+fL@sy?xauvrOlZD zp>n7ShVBhhzoHRRdfE!)Y=g~0T^m>dqCDf>Nf`OdShH%(|*p z(^0TM!~*mnSx!rc46<`yO-1O-h{n-_u?KLIF!Wx8)t;F$k+u^ z2ZOOyw*#$089Wipl(Mi)9HH$nDm>2Es3Sm9k66Un!lVpsXd#xi{pITR%C!OXmR5K@#PQ|*zH%-~oY>&-$d zvpqc-$Ai=YIVAc2vEvihO>~o;xRg!(<8Cj9Z76`9WRjqwTcWm`!Jn80U??!P4{ekTwr@Mc5^86hQf;0)W!R3a&=X}!IuL6U@$ldeW*g zp;6?c7+c)UwLptop`E6wSzfA1o9dk&N*e=!rtKw*f0RYY%&C}2R9_d1yqK~JBG`6& z7V|r`>O2+)`0{>Bgx$JVqN}V^YV(x?NbM;`4F$+3_KxEa3pMj2&DPpHKcxWHl!a7M zFg6Xe5L%s>#BJ2;M^k)@lzB|U4hoKgWpdvNx#W0KYr?Xqicux2k(y2`*rlXnP4sNj zx2VWqRy>abHGTgxk~i>joSIs_JQ#MjeN>x&_scI#U6IAu>@8AxA!`=3GuLI8s5nxS zb~48rqy`=n*I;Mf<&qZ0FhwhF?C-`Czll|CCV3Zu$PIxNku&vxNatN$Y5@h2N?3qx z+YrbE5*Cnm-QzBaGj$yG@;r@t6FUr#bZeZ3_X>nz`1*=PpG;L5W9iC9q~uNZZdjx# zSu~zl6o=F#W0DQ?^576Z+pK54F;cgX&ag&3MQB4RLsC<9*7uzlG&9HYM;r%jMa;^; zN1k^`J$ErjFBzkNK=_hVhjzK~1B*0SKc};Y+_(;T>n^zr4Qu@<*V-e`9LM$3Dr*Kz zNn6kJlGuYjB%uteuAU9=NWHo6F}3f{CeT6i2V8mf<1wI7UgC zw@@TMmvq)!KtXKOh64D2XX5;#7{{nTQd_VYRtZFxUjv{IegtSk}+&BXEJG?CXYpHc?g0eizX*S5)X3Zo`S1iw=9&37*3B4d^ zn|_S3GG*|MeIY4;t)?$8t+G2-`i~+em-lgtBSDv1*% zk`Q>TD4^Zf17HNN0GN;%_hzj^Nld6^d1?WhSyEhac1t^6n-0z}m1tr+N+M_@8=4|8 zRwen;jx9PG`k7I!M&L;maG`MZI7|?<;5gVK``F@*R8f!&y5;#qf*1|Kia=S6<61Px`8cEK+TpkIe^eXwgT%W6U!#5PeZ*#t71Yf52>@D|BR zQbBApDpW<03bbAFeRh}@k&i8HZH08bf$=DwLcpiE_RWFJ1rafw-JQ67GkV2;9H#{! zR9XW#n_^^q1r=aS$Z?SH{WL$_i9*_JO@dA8*ek%OJZivdFjCT==qN)9{e;B%wnxK| zJ3G}TOlnmrh*4sK^^8}|ftn)SZDPo&K5*PLNv%J&}z@mmnw_tl9Orl{0G(;|%v~t)vZ9%9tbUTL| zHkGRJ52&QnZI1-R*ikbv)LE8AES}LZVIjj&kPdb{&3Xe_o?yi&1${I6uxHPn&1raV z!tB|zap%vUmt>L{3Sa@DnfYc0;UqI$hb-wCWa9hdn8f_*Sr$c!UYVKXn8A=>;l_G{ zmYlx7L*&?;=OjLOWjll-L?%jz?IcUOlvRu^6kt+FVcoTvkXfr-ixzpmFHR{HG-%1| z#}NoP$GSw}{g zkSb25dTMB^bTKQ>qiLd+ZB62b#%okE>0BN1{2nP_ZAAgfq>-VL$lpR`^mWX{;B9vwvx*d`CqygN+7)=NRAEvB5lZBYaYWh)rQG zqD1yG>lqIPsoQ62P-rGB+z9zHq)X0Pg1czpB3fEn7#|y->N!eOgJdT$I!pkE#S7N3 zwJA4LF}64^@{UD8DtgV3N{U@5s-oTQtxs~Wo_;K7vT9h6f^>1|Oq0y{T;_P)APp*! z?6Zy=6NowkSS$i%OQ}qsso5ua30AqAAqiCd_2?+SIH;v}6KLrGy|RDRqE6l?!KOVj z0QHd(T(jg&OMy5q5zOWTn+=qdeR0Sqi&j-7$L?^mHYFFKLlC=5f>7Kz#x|v9W0z1g zo~pdRLMAW4ib)GQ=pQ%Tr3tjOwXkU6B7N0)=bguCcyGaZ=bi^hw$cUfznEV<_GB7& zu43{sn~dM5VW-t8V_?%k?R=Q%)}fe9JX*z+Y1JE)T#b)swCXu{E&=T_Zx50>c8uG! zNNP0PX;|FstuD97G)5* z?m}qRQ?N)@Cr`}xA^4IEQ_aDc*g1Z+SL+s&r11!6mx|1kiQ}1olYE}QtVr$@5&Ika zC8Dbd(^ZPifSq*(aLL7&q?cZP`K8m{aTzusHJlP+1{3HOhAfd(u*P>*EoXAQli&TY_ zS&oxb4IvDOCH$%>ma>ChksSk?ggarBunt+AjQM?SI5(HUBP|(L<+LO5;JTZ548@RH{;Tr^Vrb%>11a{Ms-L2gw67k=~@|1ey44~JN&hw|=*JeNy3CdkkkaYC*a; zwn%!nOR7h|ZlOjL#5PG=_m`2Ny!yBs9b)vUq?JuGJSlm6wqE;Dv_6JE0&34 zbt9Uhx{kVvmqxT5#bgi#WJ?03>EUUehZtMv!3{Uuki0WNfR!s((%spaEJ+?^&4%d8 zR^|b*0V&4E8g!CKZ zPYZB)mwx`z*d{N+wTWtOL@~{R?u>mwosF_yg1Ns*S`H?PoumX!5+-8XL@K7Uvok3W z1xLt>AN%;nISs$r@bM$YcuGLv&9~gbKmO1EssBkLfrRX4Rt$lV$%Nc!*gSNQvwO8* z(U$Y@8sf(mHL$MgSn^Ouc}aDrAVX=4U=@sco=fES(Ll z!25;t&+^&<$mh#EBUL|tF*wS4DMD@3#kp8~s6*TOK2R#qFCkl=SnRw2Y)`~A-%m=v z+d}Fsz?b%Uah#A)Q!HxCb&~x5b+4wCQjNNKUI~^;!tHDoVi^`v)bFfB4r9_6FAWW{ zOYSqmT?ol~2o7$_!jlxC2o&6M%PnMK3Ig2l;SV!={ycU|3Ko!zu$74riE%Mi_e_w- zhC`DqFKUUkH`hUrG^Qvqd$DCDB+3eXY)cSC_+o79a<2ff6Mz(+@PtJKA%x zuW8ouoGdK4mz10>XobZ+;;#!e3)pyIf;D?|&A?xi)(l)Czt_#0!G}8awVjP&JTZY6 zh3qO^#_N*C<`-}bf{L{7L>4(y*C=vm*dn6{TYP46l&59w;N5Ara<+8qW&Jbhmv^>C zBzcTuVkepKJ@!iF^XCp6N^%EHNLY-6qYT;45cXu)BIeDT$A@o7%f!MoCWG5=yZy*R zr{OmQrW@O%V#4pZ;|{*|7hlVSl4QMs2E)=!;+!}=hU$v#vM%5P)kaPzKu&}`ODXJR z^$|ZQ{G5v=HOx{V_3|S-V~LQTW)Rbm0MJR#<7JuoTgD}enAAsq!Mqs+BGbPzrrY$> zSGKTI+S~xTqR~K{Y#2P$|5)iK^@1@q<=(~+!-zw**U52-_n4( z%#hl6eI+DT(W5jxiW#TXVr-9^1^^o<1{$v+CTtHyXLWNM9-#wdqrC}M@St^eZX}~ zByPV~yLI#RF(!q_+a+*g6Om*hj$-0Sx5a8kw1|FcOTuZh850-vGwW@w{CZL=rK`5+ zrLdkJYa~KyFK~mbHFUXDGMPb0-PRN+&O1a>d8OE|!^>Z;>}T~BZ9AACb%L4D%_xeQ zGMq=K@pu0IA21zEivZVNb1he0c_r)Ct;@KF(h@SBlOqt)XjU$*0|(^%#*s13%a!Q z_l3gB-1aU;B)H@Gp&?cs)Fo`5uQrl)8qeqD(;G1*6GvmCP04C68e7c59z+?b}Y}E_L|P_ZaTZWIsd{7`Gep8 z1Deey-~Y$&@i+h1e`nL?m#4kwGoSv?$9$)yj+5zm?NwLtxFA6@vpBKq_=J&Jn$<9b zv_eL=g5Q$pnvX8lgn5n=k{4%+ryPnB4xSgkeKTw@SrErhImcv8GLG6bS* zMUwg^<1ktdXvh+DwaPfH9oj@3iFI)MSc50_X@>NxLxV}pLgV6X1uiRV7WU!(IV>$` zYSAKf6xu%XY1;nqKPG*Dc-HnS`*7sp9dEb@E zJ>UH1cleV(xoe7KcjbpZ$j=^K!?EDF2=MUg)qF(k#yVtP^jwwJ1dNQBZpBEH5~Tpn zl4q=x8va);oI|@*xylD2d66B;Qp3k_q2}wR1P+Wzs8&m#9@KsHkSAqr-~VslIL1;@ zEa|UZGJi26ujp zmnW%uMn;Jl7X;oht_Se>fnhdDD)SI2;u&w~%C1f>lFI7m7Rt2BWN_!sr0YB1AtzB; zd!GIwYwW*fSNrpv4CD?iXIbMv^YN>HAAo0``4xBk@Be|9MD|$q(|>z?YX<{dcm4I; zeCw^;e|iP+HwAL%ok#a~{}!jKi`tIO{B+>cywJ1u#5ZQ3(Yt}?_yb;g0(gV_Ul=H&5W7!RHZW6urp3Y*v4=e z@asJ~P3%Q!$PlSy?q$CFBFPfIyk{n}rO#TM4V+oCn0ep5I9**FdiG!WAFVeNT1ONY ze60|>eDLu9%XOFE!l6Tl7#ka#R`tumw82AJIOm*m_~M^_@r^a?G#mxJfAwEw@PER8 zYrFA{4?ch$@{7J(dHC`B>Fw=3;o!qbPyhof-oJtkFKz%J7u&c=Y4gldWhQW6#T2Eg zk@3r~0Iry=`S~R?XVM|Tl4??OYd;RinL2&3gOYOd`^8@Hi?LDuX|LA(50L8gtx}{a zXoQKH+6UY;Q_tqBW@;h z#1>1s^#GNmY_=CxX^~0b+xY|m_KM&8`NJbgr;h=llpL!_wXqWE3S?JwdtBS6J(GQc zlQpHN$h)>j0guTVf>E&oz=Rc1l>pQ65GKUUHX+(Zlc|e57&Y4ndGkHEqFd|sm(7?- zzbW7#)y!4FV!{r{FIqy|AKnSTPY3=BQSYf8e1O<$vU>2de6;6pPk8MKS%87-R$j+v z|M;_Ss9~o8dT;*}0K1?5Ausm6Hi7T8z|)n#<8bq(6JB@HEWp5}mtD#WPdu48hMH2< zBhI-{&x9UI(55eS@``bkkjS%u%NA;OaOP~yB--PU)-mHx_Zb(*$}bLSvj2mjz3h?u zn>I+MH3gv>bAaC#J^w?q`{@&Y5Q!x&Zf#-Hs1_0*+VLu{i1upK#Re$>i%Dm@A(5rb zz6;DK>+d_eUy?&Rdsr%LuXCbG!4#vG0@dS1i(09``Rg`gc^?1Iv*)v`?c`Lw*9&Kr zew*87K6u<~UUP-0@BWYPa`6Qh5J;WCSkl3$1ydbR$|Od}zkV(W-+B%hdQ}^aFBdz) z1>G|#NXS+*v^XI8`7=U74+Bl(LTiF21HVjY*cBZmt~2#`ssRXMHl@(RDoRpSh0e?|A&8gLk)YcLd*HuSFvO0*p|6d z4X@UZzarf0suA~lpZp|Swr=I?U;jD@;XIO&9Pxjx86_mP1~g1k=MF8}ja3?4)U^zr)D>PwU*Qp zh$MU0^*zc`lc3ehC8b%~B`C8km#1AKmb}^_N^-w19z>d9k_{AjHcioJs-nfXT{G~` zJR5*b(K_BLc)7ZYGfN*i=K0r50StWYYhU9NpZLVH?|8%UCf~k zj!=#HHhic{bLq=US_nHMu*pf5QS3F75c3ZC?Q$LFiVHaC>;#$ZRkI?8W8+9^I0uCz zL8r-Dh!a&jQ<~lJAv867B_6#aUpcssr7gP6lSLB}`sTw>^Y}{w zz2P#U_uhLiD_5@M`R9)%)FdgZNz`g&TST(P;HZfwh+u3|Rv??)nMAubGEbQyLg0nH z{aoCm1-@C5B^wSNz?J1z!>EzuBUmzkj^)y7Lekt^67(4gg2W19kysT`rW|fsn8`MR zT@@52D_EA6$$M0N-IhZtWVb{szbXYOAKyO6r;pJ?ZzsHN7GR*Wvy&hH_{S_=y7a^s zzsF%zs*X65T_?Em)Iq1e=(y)kNul7mbLaAtpZtUyZ@iJsn>SB6msa@j(tTxR2?GEP z2ZWkp$4NEyM8+%teR)knXLt0_Ru;#N*wDk)A`O{=v9gi?RFmNpM`__@rJA}94bW_w zItVIVBha#N#B6MSZQI7OB*Z;mAdr2?J&lb2IY#T;=is$ z1{yz`V(e{*A*&e%R3nq-R%WoOEeZQ2X7Sa@F?LL9|H2+(%<2WE+Iir>b1(jy3og2d z?#9JTu%L z7Kj6=#dc|vQnYQ7S=6c=O2QUOv0g$3peg3-$R;U2+jJc!MWdJyZD2eIlbU?n4h?Z| zOjCe^QUSa|YF(_8iQ1J#tH$beils6m!-w&GpRfM%TpGRWkKKW%08Yjfd`c-m7Vf_L zZocq^FT7cge^)}aTIC=A@%sQQYyQ!j{=VzFzj4BA-ZTne;0HhWA)orx?-NH3ky%xW zC|P?q3(hqA1xwZ#Q0et9Qyn*;qks&xD3el#4ngq_-=jkcShqNKvfQ03e7_k+Oh_W= zSQsRWHC04Ste~rSfS&2bi92Ow60^!^3_+4ZA*!cT1U>ugv)H)tIRO6R(JQIWdF-fu zI2CYl`+wx4J%4w?>)vz(09e0%J)gPrPM&@8Nk9*p={Pg2p~ci>hB(c-1+%1!Nm9ua zKFH9pykLXR(U5iaydH=%ZLL~qvBd-wnU&VuOv}^CO{V?d_{LZG+@E}w&0AmOpSTcZ zpW2uJ*UIsQMZx}Pd~%bCFk z=YMAYwv!rsc#9}N79M^0VgB@w|Ckpy=9%p|)gi_|orlETT!5}(RW zg7_WmBmrERX=#U3SA{xqJp_Gm`kNR6v$facU0!_jk~-OIl?@U$o;{z^gov}xUcw{m z9;LUpmo<;y$1i$6fqH|XVV;%eGxJ}e)jjzN@NYQ+82Iv+zQotR@)ep{N|~)sY!Dza z>k-%)1jzKOS&R^pq6$uO6{O7Kh%#paS%a_24(d_0k~0WkP5-Q^*B*gkD)TlK12LCe zatRMU_#nN#y#%Vt>cP+QbmhMve>871XO({Yq@QtC>9_f#d7JrY&)>f0!H2hz0%T$J z!>jqmUw(sikBRFt&fujo6d-eGN(GFRE;yzppHwi=M~^@A4IGmK93}0Mlz}z(CC^J( zOvchVg%Iegul&#zeExHv=lbi9ZKbP4BkZaFl2@v$*;RXt;imSRcKM5$SGa;Ri#ISQ zf9Y|feNGD0I|v?l@Bww@)mJGjH{I}*Hru2d0p}s-OMxdna#Y@J@Q?)tvAP3 zH{W`zTC;ZT+ug0x!aITm91FH@+r|&R_kHg9(cNs{y)(1qiJd84Wdy&p5MowHoKiJq zIxS#|6rVYEgfl9;AoX;MXvD;seV99M9=G3qJ9pf1$4O=Ayj}2)Mu04=dgvkUz5hNQ zc;Eqshb!+$1nB7O zQcm|(Sv~)V+Uok&ICCV<9G`l7L~7|e=W)S>7jwxa7jyY# zmnK!W->vYjM}X;I`;P5w-MW=++qSW5*Dm(%+snX#0fr6_QmIs!oT$;L*9pTA8w=NU z$>;Nw%O%>|+v)1=q<6*)X3w6@y!rE3ym&E7mMmf6qT`2Gy&K{G2b$-7dmz}%^#A|> M07*qoM6N<$g8cj}BLDyZ literal 0 HcmV?d00001 diff --git a/test/appium/views/profile_view.py b/test/appium/views/profile_view.py index 8cf5a616b7..ee4a6a0002 100644 --- a/test/appium/views/profile_view.py +++ b/test/appium/views/profile_view.py @@ -338,20 +338,21 @@ class ProfileView(BaseView): from views.chat_view import ChatView return ChatView(self.driver) - def add_custom_network(self): + def add_custom_network(self, rpc_url ='https://ropsten.infura.io/v3/f315575765b14720b32382a61a89341a', + name='custom_ropsten'): self.driver.info("## Add predefined custom network", device=False) self.advanced_button.click() self.network_settings_button.scroll_to_element() self.network_settings_button.click() self.plus_button.click_until_presence_of_element(self.ropsten_chain_button) - self.custom_network_url_input.send_keys('https://ropsten.infura.io/v3/f315575765b14720b32382a61a89341a') - self.specify_name_input.send_keys('custom_ropsten') + self.custom_network_url_input.send_keys(rpc_url) + self.specify_name_input.send_keys(name) self.ropsten_chain_button.scroll_to_element() self.ropsten_chain_button.click() self.ropsten_chain_button.click() self.save_button.click() - self.element_by_text_part('custom_ropsten').scroll_to_element() - self.element_by_text_part('custom_ropsten').click_until_presence_of_element(self.connect_button) + self.element_by_text_part(name).scroll_to_element() + self.element_by_text_part(name).click_until_presence_of_element(self.connect_button) self.connect_button.click() self.confirm_button.click() self.driver.info("## Custom network is added succesfully!", device=False) diff --git a/test/appium/views/send_transaction_view.py b/test/appium/views/send_transaction_view.py index 4991e139bf..b56ee8fef1 100644 --- a/test/appium/views/send_transaction_view.py +++ b/test/appium/views/send_transaction_view.py @@ -125,7 +125,7 @@ class SendTransactionView(BaseView): self.done_button.click_until_absense_of_element(self.done_button) def sign_transaction(self, sender_password: str = common_password, keycard=False): - self.driver.info("## Signing transaction, (keycard: %s)" % str(keycard), device=False) + self.driver.info("Signing transaction, (keycard: %s)" % str(keycard), device=False) if self.sign_in_phrase.is_element_displayed(30): self.set_up_wallet_when_sending_tx() if keycard: diff --git a/test/appium/views/sign_in_view.py b/test/appium/views/sign_in_view.py index 7813343cc7..e881cd1e42 100644 --- a/test/appium/views/sign_in_view.py +++ b/test/appium/views/sign_in_view.py @@ -1,7 +1,6 @@ -from appium.webdriver.common.touch_action import TouchAction from selenium.common.exceptions import NoSuchElementException import os -from tests import common_password, appium_root_project_path, app_path +from tests import common_password, appium_root_project_path from views.base_element import Button, EditBox, Text from views.base_view import BaseView @@ -266,6 +265,7 @@ class SignInView(BaseView): self.sign_in() def import_db(self, user, import_db_folder_name): + from tests.base_test_case import AbstractTestCase self.driver.info('## Importing database', device=False) import_file_name = 'export.db' home = self.recover_access(user['passphrase']) @@ -276,7 +276,7 @@ class SignInView(BaseView): self.multi_account_on_login_button.wait_for_visibility_of_element(30) self.get_multiaccount_by_position(1).click() self.password_input.set_value(common_password) - self.driver.push_file(source_path=full_path_to_file, destination_path=app_path + import_file_name) + self.driver.push_file(source_path=full_path_to_file, destination_path='%s%s'% (AbstractTestCase().app_path, import_file_name)) self.options_button.click() self.element_by_text('Import unencrypted').click() self.element_by_text('Import unencrypted').wait_for_invisibility_of_element(40) diff --git a/test/appium/views/wallet_view.py b/test/appium/views/wallet_view.py index 1769f1048e..3225832708 100644 --- a/test/appium/views/wallet_view.py +++ b/test/appium/views/wallet_view.py @@ -186,14 +186,14 @@ class WalletView(BaseView): def set_up_wallet_when_sending_tx(self): - self.driver.info("**Setting up wallet**") + self.driver.info("Setting up wallet") phrase = self.sign_in_phrase.text self.ok_got_it_button.click() return phrase def get_wallet_address(self, account_name=''): account_name = self.status_account_name if not account_name else account_name - self.driver.info("**Getting wallet address for '%s'**" % account_name) + self.driver.info("Getting wallet address for '%s'" % account_name) self.wallet_account_by_name(account_name).click() self.receive_transaction_button.click_until_presence_of_element(self.qr_code_image) address = self.address_text.text @@ -206,7 +206,7 @@ class WalletView(BaseView): def get_asset_amount_by_name(self, asset: str): - self.driver.info("*Getting %s amount*" % asset) + self.driver.info("Getting %s amount" % asset) asset_value = SilentButton(self.driver, xpath="//android.view.ViewGroup[@content-desc=':%s-asset-value']" "//android.widget.TextView[1]" % asset) asset_value.scroll_to_element() @@ -216,21 +216,21 @@ class WalletView(BaseView): return 0.0 def asset_by_name(self, asset_name): - self.driver.info("*Selecting %s asset*" % asset_name) + self.driver.info("Selecting %s asset" % asset_name) return SilentButton(self.driver, xpath="//*[contains(@text,'%s')]" % asset_name) def asset_checkbox_by_name(self, asset_name): - self.driver.info("*Selecting %s asset checkbox by name*" % asset_name) + self.driver.info("Selecting %s asset checkbox by name" % asset_name) return AssetCheckBox(self.driver, asset_name) def get_account_options_by_name(self, account_name=''): account_name = self.status_account_name if not account_name else account_name - self.driver.info("*Getting '%s'account options*" % account_name) + self.driver.info("Getting '%s'account options" % account_name) return SilentButton(self.driver, xpath="(//*[@text='%s']/../..//*[@content-desc='icon'])[2]" % account_name) def get_account_options_from_main_screen(self, account_name=''): account_name = self.status_account_name if not account_name else account_name - self.driver.info("*Getting '%s'account options from main wallet screen*" % account_name) + self.driver.info("Getting '%s'account options from main wallet screen" % account_name) return SilentButton(self.driver, xpath="//*[@content-desc='accountcard%s']//*[@content-desc='icon']" % account_name) def hidden_account_by_name_button(self, account_name=''): @@ -243,16 +243,15 @@ class WalletView(BaseView): def select_asset(self, *args): - self.driver.info("## Selecting asset(s)") + self.driver.info("Selecting asset(s)") self.multiaccount_more_options.click() self.manage_assets_button.click() for asset in args: self.asset_checkbox_by_name(asset).click() self.cross_icon.click() - self.driver.info("## Assets are selected!") def scan_tokens(self, *args): - self.driver.info("## Scanning tokens") + self.driver.info("Scanning tokens") self.multiaccount_more_options.click() self.scan_tokens_button.click() counter = 0 @@ -273,7 +272,7 @@ class WalletView(BaseView): return self def send_transaction(self, **kwargs): - self.driver.info("## Sending transaction") + self.driver.info("## Sending transaction", device=False) send_transaction_view = self.send_transaction_button.click() send_transaction_view.select_asset_button.click() asset_name = kwargs.get('asset_name', 'ETH').upper()