From b47fdc669876230143091d02c3aa05691522b454 Mon Sep 17 00:00:00 2001 From: pavloburykh Date: Tue, 20 Sep 2022 11:08:30 +0300 Subject: [PATCH] e2e: fixed failing e2e --- .../tests/critical/chats/test_group_chat.py | 24 +++++--- .../critical/test_pairing_devices_sync.py | 2 + .../tests/medium/test_activity_center.py | 57 ++++++------------ .../tests/medium/test_browser_profile.py | 12 ++-- test/appium/tests/medium/test_chats_m.py | 22 +++---- .../medium/test_pairing_devices_sync_m.py | 6 ++ test/appium/tests/medium/test_profile_m.py | 17 ++++-- .../appium/tests/medium/test_single_device.py | 4 +- .../elements_templates/logo_chats_view_2.png | Bin 0 -> 11325 bytes 9 files changed, 69 insertions(+), 75 deletions(-) create mode 100644 test/appium/views/elements_templates/logo_chats_view_2.png diff --git a/test/appium/tests/critical/chats/test_group_chat.py b/test/appium/tests/critical/chats/test_group_chat.py index 11ff94e6e1..0a75958b36 100644 --- a/test/appium/tests/critical/chats/test_group_chat.py +++ b/test/appium/tests/critical/chats/test_group_chat.py @@ -29,9 +29,10 @@ class TestGroupChatMultipleDeviceMerged(MultipleSharedDeviceTestCase): self.homes[0].add_contact(self.public_keys[i]) self.homes[0].home_button.double_click() - self.homes[0].just_fyi('Member adds admin to contacts to see PNs and put app in background') - self.homes[1].add_contact(self.public_keys[0]) - self.homes[1].home_button.double_click() + self.homes[0].just_fyi('Members add admin to contacts to see PNs and put app in background') + for i in range(1, 3): + self.homes[i].handle_contact_request(self.usernames[0]) + self.homes[i].home_button.double_click() self.homes[0].just_fyi('Admin creates group chat') self.chats[0] = self.homes[0].create_group_chat([self.usernames[1]], self.chat_name) @@ -102,19 +103,24 @@ class TestGroupChatMultipleDeviceMerged(MultipleSharedDeviceTestCase): self.errors.verify_no_errors() @marks.testrail_id(700732) - def test_group_chat_add_new_member_activity_centre(self): + def test_group_chat_add_new_member(self): [self.homes[i].home_button.double_click() for i in range(3)] self.homes[0].get_chat(self.chat_name).click() self.chats[0].add_members_to_group_chat([self.usernames[2]]) - self.chats[2].just_fyi("Check there will be no PN but unread in AC if got invite from non-contact") - if not self.homes[2].notifications_unread_badge.is_element_displayed(60): - self.drivers[2].fail("Group chat is not appeared in AC!") + self.chats[2].just_fyi("Check there will be PN and no unread in AC for a new member") + if self.homes[2].notifications_unread_badge.is_element_displayed(60): + self.drivers[2].fail("Group chat appeared in AC!") self.homes[2].open_notification_bar() - if self.homes[2].element_by_text_part(self.usernames[0]).is_element_displayed(): - self.errors.append("PN about group chat invite is shown when invited by non-contact") + if not self.homes[2].element_by_text_part(self.usernames[0]).is_element_displayed(): + self.errors.append("PN about group chat invite is not shown when invited by mutual contact") self.homes[2].click_system_back_button() + + self.homes[2].just_fyi("Check new group appeared in chat list for a new member") + if not self.homes[2].get_chat(self.chat_name).is_element_displayed(60): + self.drivers[2].fail("New group chat hasn't appeared in chat list") + self.homes[2].get_chat(self.chat_name).click() for message in (self.message_to_admin, self.message_before_adding): diff --git a/test/appium/tests/critical/test_pairing_devices_sync.py b/test/appium/tests/critical/test_pairing_devices_sync.py index e5cfa3e398..c64dc2c958 100644 --- a/test/appium/tests/critical/test_pairing_devices_sync.py +++ b/test/appium/tests/critical/test_pairing_devices_sync.py @@ -148,6 +148,8 @@ class TestPairingSyncMultipleDevicesMerged(MultipleSharedDeviceTestCase): dapp = self.home_1.dapp_tab_button.click() web_page = dapp.open_url('status.im') web_page.add_to_bookmarks() + if not web_page.home_button.is_element_displayed(): + web_page.click_system_back_button_until_element_is_shown() self.home_1.just_fyi("Close the ENS banner") [home.home_button.double_click() for home in (self.home_1, self.home_2)] diff --git a/test/appium/tests/medium/test_activity_center.py b/test/appium/tests/medium/test_activity_center.py index 16d2b7e963..54b4f8519c 100644 --- a/test/appium/tests/medium/test_activity_center.py +++ b/test/appium/tests/medium/test_activity_center.py @@ -15,8 +15,7 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): self.home_1, self.home_2 = self.device_1.create_user(enable_notifications=True), self.device_2.create_user() self.public_key_user_1, self.username_1 = self.home_1.get_public_key_and_username(return_username=True) self.public_key_user_2, self.username_2 = self.home_2.get_public_key_and_username(return_username=True) - [self.group_chat_name_1, self.group_chat_name_2, self.group_chat_name_3, self.group_chat_name_4, \ - self.group_chat_name_5] = "GroupChat1", "GroupChat2", "GroupChat3", "GroupChat4", "GroupChat5" + [self.group_chat_name_1, self.group_chat_name_2] = "GroupChat1", "GroupChat2" self.message_from_sender = "Message sender" self.home_2.home_button.double_click() @@ -36,39 +35,24 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): [home.home_button.double_click() for home in [self.home_1, self.home_2]] - self.device_2.just_fyi('Device2 creates Group chat 1 with Device1') - self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_1) - self.home_2.home_button.double_click() - self.home_1.home_button.double_click() - - self.device_1.just_fyi('Device1 rejects both chats and verifies they disappeared and not in Chats too') + self.device_1.just_fyi('Device1 rejects chat and verifies it disappeared and not in Chats too') self.home_1.notifications_unread_badge.wait_and_click(20) self.home_1.notifications_select_button.click() self.home_1.element_by_text_part(self.username_2[:10]).click() self.home_1.element_by_text_part("Please add me to your contacts").click() - self.home_1.element_by_text_part(self.group_chat_name_1).click() self.home_1.notifications_reject_and_delete_button.click() if self.home_1.element_by_text_part(self.username_2[:20]).is_element_displayed(2): self.errors.append("1-1 chat is on Activity Center view after action made on it") - if self.home_1.element_by_text_part(self.group_chat_name_1).is_element_displayed(2): - self.errors.append("Group chat is on Activity Center view after action made on it") - self.home_1.home_button.double_click() if self.home_1.element_by_text_part(self.username_2[:20]).is_element_displayed(2): self.errors.append("1-1 chat is added on home after rejection") - if self.home_1.element_by_text_part(self.group_chat_name_1).is_element_displayed(2): - self.errors.append("Group chat is added on home after rejection") - self.home_1.just_fyi("Verify there are still no chats after relogin") + self.home_1.just_fyi("Verify there is still no chat after relogin") self.home_1.reopen_app() if self.home_1.element_by_text_part(self.username_2[:20]).is_element_displayed(2): self.errors.append("1-1 chat appears on Chats view after relogin") - if self.home_1.element_by_text_part(self.group_chat_name_1).is_element_displayed(2): - self.errors.append("Group chat appears on Chats view after relogin") self.home_1.notifications_button.click() if self.home_1.element_by_text_part(self.username_2[:20]).is_element_displayed(2): self.errors.append("1-1 chat request reappears back in Activity Center view after relogin") - if self.home_1.element_by_text_part(self.group_chat_name_1).is_element_displayed(2): - self.errors.append("Group chat request reappears back in Activity Center view after relogin") self.errors.verify_no_errors() @@ -76,13 +60,12 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): def test_activity_center_accept_chats(self): [home.home_button.double_click() for home in [self.home_1, self.home_2]] - self.device_2.just_fyi('Device2 sends a message in 1-1 and creates Group chat 2') + self.device_2.just_fyi('Device2 sends a message in 1-1') self.home_2.get_chat_from_home_view(self.username_1).click() self.device_2_one_to_one_chat.send_message(self.message_from_sender) self.device_2_one_to_one_chat.home_button.double_click() - self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_2) - self.device_1.just_fyi('Device1 accepts both chats (via Select All button) and verifies they disappeared ' + self.device_1.just_fyi('Device1 accepts chat (via Select All button) and verifies it disappeared ' 'from activity center view but present on Chats view') self.home_1.notifications_unread_badge.wait_and_click(20) self.home_1.notifications_select_button.click() @@ -90,13 +73,10 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): self.home_1.notifications_accept_and_add_button.click() if self.home_1.element_by_text_part(self.username_2[:20]).is_element_displayed(2): self.errors.append("1-1 chat request stays on Activity Center view after it was accepted") - if self.home_1.element_by_text_part(self.group_chat_name_2).is_element_displayed(2): - self.errors.append("Group chat request stays on Activity Center view after it was accepted") + self.home_1.home_button.double_click() if not self.home_1.element_by_text_part(self.username_2[:20]).is_element_displayed(2): self.errors.append("1-1 chat is not added on home after accepted from Activity Center") - if not self.home_1.element_by_text_part(self.group_chat_name_2).is_element_displayed(2): - self.errors.append("Group chat is not added on home after accepted from Activity Center") self.errors.verify_no_errors() @@ -114,22 +94,21 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): profile_1.accept_new_chats_from_contacts_only.click() profile_1.profile_button.click() - self.device_1.just_fyi('Device2 creates 1-1 chat Group chats') + self.device_1.just_fyi('Device2 creates 1-1 chat') self.home_2.home_button.double_click() self.home_2.get_chat(self.username_1).click() self.device_2_one_to_one_chat.send_message(self.message_from_sender) self.device_2_one_to_one_chat.home_button.double_click() - self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_4) self.device_1.just_fyi('Device1 check there are no any chats in Activity Center nor Chats view') self.home_1.home_button.double_click() - if self.home_1.element_by_text_part(self.username_2).is_element_displayed() or self.home_1.element_by_text_part( - self.group_chat_name_4).is_element_displayed(): + + if self.home_1.element_by_text_part(self.username_2).is_element_displayed(): self.errors.append("Chats are present on Chats view despite they created by non-contact") self.home_1.notifications_button.click() - if self.home_1.element_by_text_part(self.username_2).is_element_displayed() or self.home_1.element_by_text_part( - self.group_chat_name_4).is_element_displayed(): - self.errors.append("Chats are present in Activity Center view despite they created by non-contact") + + if self.home_1.element_by_text_part(self.username_2).is_element_displayed(): + self.errors.append("Chat is present in Activity Center view despite they created by non-contact") self.device_1.just_fyi('Device1 adds Device2 in Contacts so chat requests should be visible now') self.home_1.home_button.double_click() @@ -140,13 +119,13 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): self.home_2.get_chat_from_home_view(self.username_1).click() self.device_2_one_to_one_chat.send_message(self.message_from_sender) self.device_2_one_to_one_chat.home_button.double_click() - self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_5) + self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_2) self.device_1.just_fyi('Device1 verifies 1-1 chat Group chats are visible') self.home_1.home_button.double_click() if not self.home_1.element_by_text_part( self.username_2).is_element_displayed() or not self.home_1.element_by_text_part( - self.group_chat_name_5).is_element_displayed(): + self.group_chat_name_2).is_element_displayed(): self.errors.append("Chats are not present on Chats view while they have to!") self.errors.verify_no_errors() @@ -156,16 +135,16 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): [home.home_button.double_click() for home in [self.home_1, self.home_2]] self.device_2.just_fyi('Device2 creates Group chat 3') - self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_3) + self.home_2.create_group_chat([self.username_1], group_chat_name=self.group_chat_name_1) self.home_2.home_button.double_click() self.home_1.just_fyi("Device1 joins Group chat 3") - group_chat_1 = self.home_1.get_chat(self.group_chat_name_3).click() + group_chat_1 = self.home_1.get_chat(self.group_chat_name_1).click() group_chat_1.join_chat_button.click_if_shown() group_chat_1.home_button.double_click() self.home_2.just_fyi("Device2 mentions Device1 in Group chat 3") - chat_2 = self.home_2.get_chat_from_home_view(self.group_chat_name_3).click() + chat_2 = self.home_2.get_chat_from_home_view(self.group_chat_name_1).click() chat_2.select_mention_from_suggestion_list(self.username_1, self.username_1[:2]) chat_2.send_as_keyevent("group") group_chat_message = self.username_1 + " group" @@ -187,7 +166,7 @@ class TestActivityCenterMultipleDeviceMedium(MultipleSharedDeviceTestCase): self.home_1.just_fyi("Check there are no unread messages counter on chats after message is read") if (self.home_1.notifications_unread_badge.is_element_present() or - self.home_1.get_chat_from_home_view(self.group_chat_name_3).new_messages_counter.text == "1"): + self.home_1.get_chat_from_home_view(self.group_chat_name_1).new_messages_counter.text == "1"): self.errors.append("Unread message indicator is kept after message is read in chat") self.home_1.just_fyi("Check there is an empty view on Activity Center") diff --git a/test/appium/tests/medium/test_browser_profile.py b/test/appium/tests/medium/test_browser_profile.py index d5d0b7be03..e01330830f 100644 --- a/test/appium/tests/medium/test_browser_profile.py +++ b/test/appium/tests/medium/test_browser_profile.py @@ -33,7 +33,7 @@ class TestBrowserProfileOneDevice(MultipleSharedDeviceTestCase): dapp.open_url(url) if dapp.web_page.is_element_differs_from_template(urls[url], 5): self.errors.append('Web page does not match expected template %s' % urls[url]) - base_web.browser_previous_page_button.click_until_presence_of_element(dapp.element_by_text_part('Discover')) + base_web.browser_previous_page_button.click_until_presence_of_element(dapp.element_by_text_part('Discover'), attempts=2) self.errors.verify_no_errors() @@ -47,19 +47,19 @@ class TestBrowserProfileOneDevice(MultipleSharedDeviceTestCase): browsing.just_fyi("Check next page") browsing.just_fyi('Navigate to next page and back') - browsing.element_by_text_part('може редагувати кожен').click() - browsing.element_by_text_part('написана спільно її читачами').wait_for_element(30) + browsing.element_by_text_part('може редагувати кожен').scroll_and_click() + browsing.element_by_text_part('написана спільно її читачами').scroll_to_element() browsing.browser_previous_page_button.click() - browsing.wait_for_element_starts_with_text('може редагувати кожен') + browsing.wait_for_element_starts_with_text('Головна сторінка') browsing.just_fyi('Relogin and check that tap on "Next" navigates to next page') browsing.reopen_app() self.home.dapp_tab_button.click() browsing.open_tabs_button.click() dapp.element_by_text_part(ua_url).click() - browsing.wait_for_element_starts_with_text('може редагувати кожен') + browsing.element_by_text_part('може редагувати кожен').scroll_to_element() browsing.browser_next_page_button.click() - browsing.element_by_text_part('написана спільно її читачами').wait_for_element(30) + browsing.element_by_text_part('написана спільно її читачами').scroll_to_element() self.errors.verify_no_errors() diff --git a/test/appium/tests/medium/test_chats_m.py b/test/appium/tests/medium/test_chats_m.py index c30ad76310..81ac2adac5 100644 --- a/test/appium/tests/medium/test_chats_m.py +++ b/test/appium/tests/medium/test_chats_m.py @@ -317,7 +317,7 @@ class TestChatMediumMultipleDevice(MultipleSharedDeviceTestCase): self.home_1.just_fyi("Creating group chats") self.initial_group_chat_name = "GroupChat before rename" self.new_group_chat_name = "GroupChat after rename" - self.group_user_not_a_contact = basic_user + # self.group_user_not_a_contact = basic_user self.group_chat_1 = self.home_1.create_group_chat(user_names_to_add=[self.default_username_2], group_chat_name=self.initial_group_chat_name) self.group_chat_2 = self.home_2.get_chat(self.initial_group_chat_name).click() @@ -640,9 +640,7 @@ class TestChatMediumMultipleDevice(MultipleSharedDeviceTestCase): chat_2.send_message("first") chat_2.home_button.click() chat_1.home_button.click() - chat_1 = self.home_1.add_contact(self.group_user_not_a_contact['public_key']) - chat_1.home_button.click() - chat_1 = self.home_1.create_group_chat([full_ens, self.group_user_not_a_contact['username']], group_name) + chat_1 = self.home_1.create_group_chat([full_ens], group_name) chat_2 = self.home_2.get_chat(group_name).click() chat_2.join_chat_button.click_if_shown() @@ -690,17 +688,6 @@ class TestChatMediumMultipleDevice(MultipleSharedDeviceTestCase): 'ENS is not resolved in chat input after setting nickname in mention suggestions list (search by nickname)!') chat_1.chat_message_input.clear() - self.home_1.just_fyi("Check can mention not a contact group member who hasn't sent messages yet") - chat_2.chat_message_input.send_keys('@') - if not chat_2.element_by_text('%s' % self.group_user_not_a_contact['username']).is_element_displayed(): - self.errors.append("Username of not a contact group member is not shown in mention input") - chat_2.chat_message_input.clear() - chat_2.select_mention_from_suggestion_list('%s' % self.group_user_not_a_contact['username'], typed_search_pattern=self.group_user_not_a_contact['username'][:2]) - if chat_2.chat_message_input.text != '@' + self.group_user_not_a_contact['username'] + ' ': - self.errors.append( - 'Can not select mention of not a contact member from suggestions list') - chat_2.chat_message_input.clear() - self.home_1.just_fyi('Can delete nickname via group info and recheck received messages') device_2_options = chat_1.get_user_options(full_ens) device_2_options.view_profile_button.click() @@ -737,6 +724,11 @@ class TestGroupChatMultipleDeviceMediumMerged(MultipleSharedDeviceTestCase): for member in (self.public_keys[1], self.public_keys[2]): self.homes[0].add_contact(member) self.homes[0].home_button.click() + + for i in range(1, 3): + self.homes[i].handle_contact_request(self.usernames[0]) + self.homes[i].home_button.double_click() + [SignInView(self.drivers[i]).put_app_to_background_and_back() for i in range(1, 3)] self.chat_name = self.homes[0].get_random_chat_name() self.invite_chat_name = '%s_invite' % self.homes[0].get_random_chat_name() diff --git a/test/appium/tests/medium/test_pairing_devices_sync_m.py b/test/appium/tests/medium/test_pairing_devices_sync_m.py index 82358b9658..48afc42703 100644 --- a/test/appium/tests/medium/test_pairing_devices_sync_m.py +++ b/test/appium/tests/medium/test_pairing_devices_sync_m.py @@ -18,6 +18,8 @@ class TestPairingSyncMediumMultipleDevicesMerged(MultipleSharedDeviceTestCase): self.drivers[1]), SignInView(self.drivers[2]) self.home_1 = self.device_1.create_user() + self.public_key_1, self.username_1 = self.home_1.get_public_key_and_username(return_username=True) + self.profile_1 = self.home_1.profile_button.click() self.profile_1.privacy_and_security_button.click() self.profile_1.backup_recovery_phrase_button.click() @@ -81,6 +83,10 @@ class TestPairingSyncMediumMultipleDevicesMerged(MultipleSharedDeviceTestCase): self.device_1.just_fyi('Add contact, start group chat') self.home_1.home_button.click() self.home_1.add_contact(self.public_key_3) + + self.home_3.handle_contact_request(self.username_1) + self.home_3.home_button.double_click() + self.device_2.put_app_to_background_and_back() self.home_1.get_back_to_home_view() self.chat_1 = self.home_1.create_group_chat([self.username_3], self.group_chat_name) diff --git a/test/appium/tests/medium/test_profile_m.py b/test/appium/tests/medium/test_profile_m.py index d1b592daa2..6810eaae6d 100644 --- a/test/appium/tests/medium/test_profile_m.py +++ b/test/appium/tests/medium/test_profile_m.py @@ -24,7 +24,7 @@ class TestProfileGapsCommunityMediumMultipleDevicesMerged(MultipleSharedDeviceTe self.home_1.just_fyi("Creating 1-1 chats") self.chat_1 = self.home_1.add_contact(self.public_key_2) self.first_message = 'first message' - self.chat_2 = self.home_2.add_contact(self.public_key_1, add_in_contacts=False) + self.chat_2 = self.home_2.add_contact(self.public_key_1) [home.home_button.click() for home in (self.home_1, self.home_2)] self.home_1.just_fyi("Creating group chat") @@ -46,7 +46,16 @@ class TestProfileGapsCommunityMediumMultipleDevicesMerged(MultipleSharedDeviceTe @marks.testrail_id(702281) def test_profile_show_profile_picture_and_online_indicator_settings(self): [home.home_button.double_click() for home in (self.home_1, self.home_2)] - logo_online, logo_default, logo_chats, logo_group = 'logo_new.png', 'sauce_logo.png', 'logo_chats_view.png', 'group_logo.png' + + self.chat_2.just_fyi('Removing user 1 from contacts') + self.home_2.get_chat(self.default_username_1).click() + self.chat_2.chat_options.click() + self.chat_2.view_profile_button.click() + self.chat_2.remove_from_contacts.click_until_absense_of_element(self.chat_2.remove_from_contacts) + self.chat_2.close_button.click() + self.chat_2.home_button.double_click() + + logo_online, logo_default, logo_chats, logo_group = 'logo_new.png', 'sauce_logo.png', 'logo_chats_view_2.png', 'group_logo.png' profile_1 = self.home_1.profile_button.click() profile_1.just_fyi("Set user Profile image from Gallery") @@ -149,7 +158,7 @@ class TestProfileGapsCommunityMediumMultipleDevicesMerged(MultipleSharedDeviceTe one_to_one_chat_2.get_back_to_home_view() one_to_one_chat_2.home_button.double_click() if self.home_2.get_chat(self.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') + self.errors.append('User profile picture is not returned to default after user removed from Contacts') profile_2.just_fyi('Enable to see profile image from "Everyone" setting') self.home_2.profile_button.double_click() @@ -160,7 +169,7 @@ class TestProfileGapsCommunityMediumMultipleDevicesMerged(MultipleSharedDeviceTe profile_2.home_button.click(desired_view='home') if not self.home_2.get_chat(self.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.append('User profile picture is not shown after user after enabling see profile image from Everyone') self.errors.verify_no_errors() @marks.testrail_id(702282) diff --git a/test/appium/tests/medium/test_single_device.py b/test/appium/tests/medium/test_single_device.py index 4db57b7cb4..03ce4180bb 100644 --- a/test/appium/tests/medium/test_single_device.py +++ b/test/appium/tests/medium/test_single_device.py @@ -998,15 +998,15 @@ class TestChatManagement(SingleDeviceTestCase): home = sign_in.recover_access(user_20_contacts['passphrase']) users = [chat_users['A'], - chat_users['B'], + transaction_senders['A'], transaction_senders['ETH_8'], transaction_senders['ETH_1'], transaction_senders['ETH_2'], transaction_senders['ETH_7'], transaction_senders['ETH_STT_3'], transaction_senders['ETH_STT_ADI_1'], + transaction_senders['ETH_STT_1'], transaction_senders['C'], - transaction_senders['F'], transaction_senders['G'], transaction_senders['H'], transaction_senders['I'], diff --git a/test/appium/views/elements_templates/logo_chats_view_2.png b/test/appium/views/elements_templates/logo_chats_view_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ee0e8229e9f4844bcbae0405c08ead4a31bacc GIT binary patch literal 11325 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 literal 0 HcmV?d00001