From e7716aa1028febb0699774643198fbeb89c37384 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Fri, 7 Aug 2026 21:07:04 +0800 Subject: [PATCH 1/3] docs: add Android SDK documentation content - add Android SDK docs for chat, group, message, user, and calling - update generated navigation, routes, sidebar, and search metadata - adjust docs pages and tests to support Android content --- .../calling/managing-calls/accept-call.mdx | 17 + .../calling/managing-calls/cancel-call.mdx | 17 + .../managing-calls/handle-call-events.mdx | 17 + .../calling/managing-calls/hang-up-call.mdx | 17 + .../calling/managing-calls/reject-call.mdx | 17 + .../managing-calls/start-group-call.mdx | 17 + .../managing-calls/start-single-call.mdx | 17 + .../sdk/android/calling/overview-calling.mdx | 17 + .../get-room-by-group-id.mdx | 17 + .../get-token-by-room-id.mdx | 17 + .../restore-pending-invitation.mdx | 17 + .../send-a-custom-signal.mdx | 17 + .../clear-conversation-messages.mdx | 33 + .../clear-group-mentions.mdx | 33 + .../delete-conversation-with-messages.mdx | 34 + .../get-total-unread-count.mdx | 33 + .../hide-a-conversation.mdx | 33 + .../mark-conversation-read.mdx | 35 + .../pin-conversation.mdx | 32 + .../set-burn-duration.mdx | 32 + .../set-conversation-draft.mdx | 34 + .../set-conversation-extension.mdx | 34 + .../set-message-destruct.mdx | 38 + .../set-message-receive-option.mdx | 38 + .../set-private-chat.mdx | 32 + .../conversation/overview-conversation.mdx | 50 + .../get-conversation-by-target.mdx | 36 + .../get-conversation-id.mdx | 26 + .../get-conversations-by-id.mdx | 35 + .../retrieve-conversation-list.mdx | 59 + .../sdk/android/events/overview-events.mdx | 17 + .../track-file-upload-progress.mdx | 17 + .../sdk/android/file-uploads/upload-file.mdx | 17 + .../authenticate-and-manage-session.mdx | 195 + .../getting-started/before-you-start.mdx | 64 + .../environment-specific-implementation.mdx | 40 + .../getting-started/send-first-message.mdx | 109 +- .../sdk/android/group/change-group-mute.mdx | 17 + .../chat/sdk/android/group/create-group.mdx | 17 + .../chat/sdk/android/group/dismiss-group.mdx | 17 + .../accept-group-application.mdx | 17 + ...et-group-application-list-as-applicant.mdx | 17 + ...et-group-application-list-as-recipient.mdx | 17 + .../overview-group-applications.mdx | 17 + .../refuse-group-application.mdx | 17 + .../chat/sdk/android/group/join-group.mdx | 17 + .../change-group-member-mute.mdx | 17 + .../invite-user-to-group.mdx | 17 + .../kick-group-member.mdx | 17 + .../set-group-member-avatar.mdx | 17 + .../set-group-member-extension.mdx | 17 + .../set-group-member-nickname.mdx | 17 + .../set-group-member-role-level.mdx | 17 + .../transfer-group-owner.mdx | 17 + .../chat/sdk/android/group/overview-group.mdx | 17 + .../chat/sdk/android/group/quit-group.mdx | 17 + .../get-group-member-list.mdx | 17 + .../get-group-member-owner-and-admin.mdx | 17 + .../get-specified-group-members-info.mdx | 17 + .../get-users-in-group.mdx | 17 + .../overview-retrieving-group-members.mdx | 17 + .../search-group-members.mdx | 17 + .../get-joined-group-list-page.mdx | 17 + .../get-specified-groups-info.mdx | 17 + .../group/retrieving-groups/is-join-group.mdx | 17 + .../group/retrieving-groups/search-groups.mdx | 17 + .../android/group/set-group-announcement.mdx | 17 + .../sdk/android/group/set-group-extension.mdx | 17 + .../group/set-group-join-verification.mdx | 17 + .../set-group-member-friend-permission.mdx | 17 + .../group/set-group-member-profile-access.mdx | 17 + .../android/group/update-group-profile.mdx | 17 + .../update-typing-status.mdx | 17 + .../creating-messages/create-card-message.mdx | 17 + .../create-custom-message.mdx | 17 + .../creating-messages/create-face-message.mdx | 17 + .../create-file-message-by-file.mdx | 17 + .../create-file-message-by-url.mdx | 17 + .../create-forward-message.mdx | 17 + .../create-image-message-by-file.mdx | 17 + .../create-image-message-by-url.mdx | 17 + .../create-location-message.mdx | 17 + .../create-merger-message.mdx | 17 + .../create-quote-message.mdx | 17 + .../create-sound-message-by-file.mdx | 17 + .../create-sound-message-by-url.mdx | 17 + .../create-text-at-message.mdx | 17 + .../creating-messages/create-text-message.mdx | 17 + .../create-video-message-by-file.mdx | 17 + .../create-video-message-by-url.mdx | 17 + .../clear-all-local-messages.mdx | 17 + .../managing-messages/clear-all-messages.mdx | 17 + .../delete-local-message.mdx | 17 + .../delete-saved-messages.mdx | 17 + .../managing-messages/get-pinned-messages.mdx | 17 + .../insert-local-group-message.mdx | 17 + .../insert-local-single-message.mdx | 17 + .../managing-messages/modify-a-message.mdx | 17 + .../managing-messages/revoke-a-message.mdx | 17 + .../set-message-local-ex.mdx | 17 + .../managing-messages/set-message-pinned.mdx | 17 + .../receive-custom-business-messages.mdx | 17 + .../receiving-messages/receive-messages.mdx | 17 + .../find-messages-by-id.mdx | 17 + .../load-newer-messages.mdx | 17 + .../load-older-messages.mdx | 17 + .../searching-messages/search-messages.mdx | 17 + .../sending-messages/send-message-not-oss.mdx | 17 + .../message/sending-messages/send-message.mdx | 17 + .../set-msg-send-progress-listener.mdx | 17 + content/docs/chat/sdk/android/overview.mdx | 28 +- .../android/user/blacklist/add-blacklist.mdx | 43 + .../android/user/blacklist/get-blacklist.mdx | 55 + .../user/blacklist/remove-blacklist.mdx | 40 + .../accept-friend-application.mdx | 32 + .../user/friend-applications/add-friend.mdx | 34 + .../get-recv-friend-application-list.mdx | 75 + .../get-send-friend-application-list.mdx | 36 + .../refuse-friend-application.mdx | 32 + .../sdk/android/user/friends/check-friend.mdx | 33 + .../android/user/friends/delete-friend.mdx | 31 + .../user/friends/get-friend-list-page.mdx | 73 + .../android/user/friends/get-friends-info.mdx | 38 + .../android/user/friends/search-friends.mdx | 36 + .../android/user/friends/update-friends.mdx | 44 + .../get-subscribe-online-users-status.mdx | 32 + .../subscribe-users-online-status.mdx | 52 + .../chat/sdk/android/user/overview-user.mdx | 60 +- .../user-profile/get-self-local-user-info.mdx | 46 + .../user/user-profile/get-users-info.mdx | 55 + .../set-global-message-reception.mdx | 44 + .../user/user-profile/set-self-info.mdx | 60 + .../calling/managing-calls/accept-call.mdx | 32 + .../calling/managing-calls/cancel-call.mdx | 26 + .../managing-calls/handle-call-events.mdx | 74 + .../calling/managing-calls/hang-up-call.mdx | 26 + .../calling/managing-calls/reject-call.mdx | 26 + .../managing-calls/start-group-call.mdx | 44 + .../managing-calls/start-single-call.mdx | 64 + .../sdk/android/calling/overview-calling.mdx | 46 + .../get-room-by-group-id.mdx | 30 + .../get-token-by-room-id.mdx | 35 + .../restore-pending-invitation.mdx | 30 + .../send-a-custom-signal.mdx | 64 + .../clear-conversation-messages.mdx | 26 + .../clear-group-mentions.mdx | 28 + .../delete-conversation-with-messages.mdx | 29 + .../get-total-unread-count.mdx | 28 + .../hide-a-conversation.mdx | 28 + .../mark-conversation-read.mdx | 28 + .../pin-conversation.mdx | 27 + .../set-burn-duration.mdx | 27 + .../set-conversation-draft.mdx | 27 + .../set-conversation-extension.mdx | 27 + .../set-message-destruct.mdx | 33 + .../set-message-receive-option.mdx | 31 + .../set-private-chat.mdx | 27 + .../conversation/overview-conversation.mdx | 63 + .../get-conversation-by-target.mdx | 29 + .../get-conversation-id.mdx | 19 + .../get-conversations-by-id.mdx | 30 + .../retrieve-conversation-list.mdx | 52 + .../sdk/android/events/overview-events.mdx | 118 + .../track-file-upload-progress.mdx | 44 + .../sdk/android/file-uploads/upload-file.mdx | 54 + .../authenticate-and-manage-session.mdx | 188 + .../getting-started/before-you-start.mdx | 57 + .../environment-specific-implementation.mdx | 33 + .../getting-started/send-first-message.mdx | 104 + .../sdk/android/group/change-group-mute.mdx | 16 + .../chat/sdk/android/group/create-group.mdx | 23 + .../chat/sdk/android/group/dismiss-group.mdx | 16 + .../accept-group-application.mdx | 16 + ...et-group-application-list-as-applicant.mdx | 18 + ...et-group-application-list-as-recipient.mdx | 18 + .../overview-group-applications.mdx | 9 + .../refuse-group-application.mdx | 16 + .../chat/sdk/android/group/join-group.mdx | 16 + .../change-group-member-mute.mdx | 16 + .../invite-user-to-group.mdx | 16 + .../kick-group-member.mdx | 16 + .../set-group-member-avatar.mdx | 21 + .../set-group-member-extension.mdx | 21 + .../set-group-member-nickname.mdx | 21 + .../set-group-member-role-level.mdx | 21 + .../transfer-group-owner.mdx | 16 + .../chat/sdk/android/group/overview-group.mdx | 33 + .../chat/sdk/android/group/quit-group.mdx | 16 + .../get-group-member-list.mdx | 17 + .../get-group-member-owner-and-admin.mdx | 17 + .../get-specified-group-members-info.mdx | 17 + .../get-users-in-group.mdx | 16 + .../overview-retrieving-group-members.mdx | 9 + .../search-group-members.mdx | 17 + .../get-joined-group-list-page.mdx | 16 + .../get-specified-groups-info.mdx | 16 + .../group/retrieving-groups/is-join-group.mdx | 16 + .../group/retrieving-groups/search-groups.mdx | 16 + .../android/group/set-group-announcement.mdx | 20 + .../sdk/android/group/set-group-extension.mdx | 20 + .../group/set-group-join-verification.mdx | 20 + .../set-group-member-friend-permission.mdx | 20 + .../group/set-group-member-profile-access.mdx | 20 + .../android/group/update-group-profile.mdx | 21 + content/zh/docs/chat/sdk/android/logger.mdx | 112 + .../update-typing-status.mdx | 33 + .../creating-messages/create-card-message.mdx | 11 + .../create-custom-message.mdx | 12 + .../creating-messages/create-face-message.mdx | 11 + .../create-file-message-by-file.mdx | 12 + .../create-file-message-by-url.mdx | 11 + .../create-forward-message.mdx | 11 + .../create-image-message-by-file.mdx | 11 + .../create-image-message-by-url.mdx | 12 + .../create-location-message.mdx | 12 + .../create-merger-message.mdx | 12 + .../create-quote-message.mdx | 12 + .../create-sound-message-by-file.mdx | 12 + .../create-sound-message-by-url.mdx | 11 + .../create-text-at-message.mdx | 12 + .../creating-messages/create-text-message.mdx | 11 + .../create-video-message-by-file.mdx | 12 + .../create-video-message-by-url.mdx | 11 + .../clear-all-local-messages.mdx | 11 + .../managing-messages/clear-all-messages.mdx | 11 + .../delete-local-message.mdx | 11 + .../delete-saved-messages.mdx | 11 + .../managing-messages/get-pinned-messages.mdx | 14 + .../insert-local-group-message.mdx | 11 + .../insert-local-single-message.mdx | 11 + .../managing-messages/modify-a-message.mdx | 11 + .../managing-messages/revoke-a-message.mdx | 11 + .../set-message-local-ex.mdx | 11 + .../managing-messages/set-message-pinned.mdx | 11 + .../sdk/android/message/overview-message.mdx | 15 + .../receive-custom-business-messages.mdx | 17 + .../receiving-messages/receive-messages.mdx | 14 + .../find-messages-by-id.mdx | 14 + .../load-newer-messages.mdx | 11 + .../load-older-messages.mdx | 11 + .../searching-messages/search-messages.mdx | 12 + .../sending-messages/send-message-not-oss.mdx | 11 + .../message/sending-messages/send-message.mdx | 14 + .../set-msg-send-progress-listener.mdx | 15 + content/zh/docs/chat/sdk/android/overview.mdx | 21 + .../android/user/blacklist/add-blacklist.mdx | 36 + .../android/user/blacklist/get-blacklist.mdx | 50 + .../user/blacklist/remove-blacklist.mdx | 33 + .../accept-friend-application.mdx | 25 + .../user/friend-applications/add-friend.mdx | 27 + .../get-recv-friend-application-list.mdx | 68 + .../get-send-friend-application-list.mdx | 29 + .../refuse-friend-application.mdx | 25 + .../sdk/android/user/friends/check-friend.mdx | 26 + .../android/user/friends/delete-friend.mdx | 24 + .../user/friends/get-friend-list-page.mdx | 66 + .../android/user/friends/get-friends-info.mdx | 31 + .../android/user/friends/search-friends.mdx | 29 + .../android/user/friends/update-friends.mdx | 37 + .../get-subscribe-online-users-status.mdx | 25 + .../subscribe-users-online-status.mdx | 45 + .../chat/sdk/android/user/overview-user.mdx | 55 + .../user-profile/get-self-local-user-info.mdx | 39 + .../user/user-profile/get-users-info.mdx | 48 + .../set-global-message-reception.mdx | 37 + .../user/user-profile/set-self-info.mdx | 55 + data/structure/android-content-audit.json | 4520 +++++++++++++++++ data/structure/android-navigation-labels.json | 377 ++ data/structure/android-sidebar.json | 550 ++ data/structure/chat-pages.json | 1066 ++-- package.json | 8 +- .../build-client-sdk-zh-content.test.mjs | 7 + scripts/__tests__/build-search-index.test.mjs | 17 +- .../__tests__/client-sdk-publication.test.mjs | 16 +- scripts/__tests__/client-sdk-sidebar.test.mjs | 38 +- .../__tests__/search-index-contract.test.mjs | 9 +- .../sync-client-sdk-route-skeletons.test.mjs | 29 +- scripts/__tests__/wasm-commercial.test.mjs | 10 +- scripts/build-client-sdk-zh-content.mjs | 4 +- scripts/check-client-sdk-content-audit.mjs | 6 +- scripts/lib/client-sdk-platforms.mjs | 13 + scripts/sync-client-sdk-route-skeletons.mjs | 68 +- scripts/sync-content-metadata.mjs | 20 +- src/components/docs/documentation-page.tsx | 1 + src/components/docs/sdk-overview-page.tsx | 50 +- src/config/docs.ts | 3 +- src/generated/android-sdk-zh-content.json | 1765 +++++++ src/generated/navigation.json | 2071 ++++---- src/generated/routes.json | 2414 ++++----- src/generated/search-index-zh.json | 1324 ++--- src/generated/search-index.json | 1108 +--- src/lib/client-sdk-commercial.ts | 13 +- src/lib/client-sdk-publication.ts | 9 +- src/lib/localized-docs.ts | 2 + 294 files changed, 18405 insertions(+), 4350 deletions(-) create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/overview-calling.mdx create mode 100644 content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx create mode 100644 content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx create mode 100644 content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx create mode 100644 content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx create mode 100644 content/docs/chat/sdk/android/conversation/overview-conversation.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx create mode 100644 content/docs/chat/sdk/android/events/overview-events.mdx create mode 100644 content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx create mode 100644 content/docs/chat/sdk/android/file-uploads/upload-file.mdx create mode 100644 content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx create mode 100644 content/docs/chat/sdk/android/getting-started/before-you-start.mdx create mode 100644 content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx create mode 100644 content/docs/chat/sdk/android/group/change-group-mute.mdx create mode 100644 content/docs/chat/sdk/android/group/create-group.mdx create mode 100644 content/docs/chat/sdk/android/group/dismiss-group.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx create mode 100644 content/docs/chat/sdk/android/group/join-group.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx create mode 100644 content/docs/chat/sdk/android/group/overview-group.mdx create mode 100644 content/docs/chat/sdk/android/group/quit-group.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-announcement.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-extension.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-join-verification.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx create mode 100644 content/docs/chat/sdk/android/group/update-group-profile.mdx create mode 100644 content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx create mode 100644 content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx create mode 100644 content/docs/chat/sdk/android/message/sending-messages/send-message.mdx create mode 100644 content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx create mode 100644 content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx create mode 100644 content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx create mode 100644 content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/check-friend.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/delete-friend.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/get-friends-info.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/search-friends.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/update-friends.mdx create mode 100644 content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx create mode 100644 content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/overview-calling.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/events/overview-events.mdx create mode 100644 content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx create mode 100644 content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/change-group-mute.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/create-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/dismiss-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/join-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/overview-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/quit-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-extension.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/update-group-profile.mdx create mode 100644 content/zh/docs/chat/sdk/android/logger.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/overview-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx create mode 100644 content/zh/docs/chat/sdk/android/overview.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/overview-user.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx create mode 100644 data/structure/android-content-audit.json create mode 100644 data/structure/android-navigation-labels.json create mode 100644 data/structure/android-sidebar.json create mode 100644 src/generated/android-sdk-zh-content.json diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx new file mode 100644 index 0000000000..dab1418694 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Accept a call' +description: 'OpenIM Android SDK guide for Accept a call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx new file mode 100644 index 0000000000..cfe818d79a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Cancel a call invitation' +description: 'OpenIM Android SDK guide for Cancel a call invitation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx new file mode 100644 index 0000000000..5e00226229 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,17 @@ +--- +title: 'Handle call events' +description: 'OpenIM Android SDK guide for Handle call events.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx new file mode 100644 index 0000000000..a8f59457c7 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'End a call' +description: 'OpenIM Android SDK guide for End a call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx new file mode 100644 index 0000000000..1ab2de057c --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Reject a call' +description: 'OpenIM Android SDK guide for Reject a call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/reject-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx new file mode 100644 index 0000000000..0b701cf118 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Start a group call' +description: 'OpenIM Android SDK guide for Start a group call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx new file mode 100644 index 0000000000..09e21d3939 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Start a one-to-one call' +description: 'OpenIM Android SDK guide for Start a one-to-one call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/overview-calling.mdx b/content/docs/chat/sdk/android/calling/overview-calling.mdx new file mode 100644 index 0000000000..1893a85cc9 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,17 @@ +--- +title: 'Audio and video calling overview' +description: 'OpenIM Android SDK guide for Audio and video calling overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/overview-calling' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx new file mode 100644 index 0000000000..bbff58ad19 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get a group call room' +description: 'OpenIM Android SDK guide for Get a group call room.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx new file mode 100644 index 0000000000..a4642bd62a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get a call room token' +description: 'OpenIM Android SDK guide for Get a call room token.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx new file mode 100644 index 0000000000..46f22f6153 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,17 @@ +--- +title: 'Restore a pending call invitation' +description: 'OpenIM Android SDK guide for Restore a pending call invitation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx new file mode 100644 index 0000000000..98d59a1877 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,17 @@ +--- +title: 'Send a custom signal' +description: 'OpenIM Android SDK guide for Send a custom signal.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx new file mode 100644 index 0000000000..223229b3e4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,33 @@ +--- +title: 'Clear messages in a conversation' +description: 'Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' +--- + +Use `messageManager.clearConversationAndDeleteAllMsg()` for a product action such as “clear chat history”. + +```java +OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationClearFailure(code, error); + } + } +); +``` + +The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from `onConversationChanged` or a fresh query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx new file mode 100644 index 0000000000..05d2285f71 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,33 @@ +--- +title: 'Reset group mention status' +description: 'Use resetConversationGroupAtType() to reset an Android conversation group mention state.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +After handling group messages that mention the current user, call `resetConversationGroupAtType()` to reset `groupAtType` to the normal state. + +```java +OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( + new OnBase() { + @Override + public void onSuccess(String data) { + markGroupMentionStateReset(conversationID); + } + + @Override + public void onError(int code, String error) { + recordGroupMentionResetFailure(code, error); + } + }, + conversationID +); +``` + +This operation only resets the state and must not be used to set `atMe` or `atAll`. Group mention state is distinct from message read state. Reconcile the conversation through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx new file mode 100644 index 0000000000..ad542400b3 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,34 @@ +--- +title: 'Delete a conversation and its messages' +description: 'Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +Use `deleteConversationAndDeleteAllMsg()` for a product action such as “delete this chat”. + +```java +OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationDeleteFailure(code, error); + } + }, + conversationID +); +``` + +After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through `onConversationChanged` or a fresh query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx new file mode 100644 index 0000000000..85aee970c4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,33 @@ +--- +title: 'Track the total unread count' +description: 'Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` returns the complete unread snapshot for the signed-in account. Do not sum `unreadCount` values from only the currently loaded conversation pages. + +```java +OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( + new OnBase() { + @Override + public void onSuccess(String value) { + int totalUnread = Integer.parseInt(value); + updateApplicationBadge(totalUnread); + } + + @Override + public void onError(int code, String error) { + recordTotalUnreadFailure(code, error); + } + } +); +``` + +The callback value is a `String`; handle parse failures as an application error rather than treating it as a partial list total. This page owns `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`, which updates the application badge after the initial query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx new file mode 100644 index 0000000000..6e105c864a --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,33 @@ +--- +title: 'Hide a conversation' +description: 'Use hideConversation() to hide a conversation entry from the current Android account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` hides only the current account's conversation entry. It does not delete a one-to-one relationship, leave a group, or affect another account. + +```java +OpenIMClient.getInstance().conversationManager.hideConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationHideFailure(code, error); + } + }, + conversationID +); +``` + +A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later `onConversationChanged` events idempotently by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx new file mode 100644 index 0000000000..e73766fafb --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,35 @@ +--- +title: 'Mark a conversation as read' +description: 'Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' +--- + +Call `messageManager.markConversationMessageAsRead()` after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. + +```java +OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationReadSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMarkReadFailure(code, error); + } + } +); +``` + +Request completion does not guarantee `onConversationChanged` has arrived. Merge the current `ConversationInfo` by `conversationID`, or re-query it when immediate confirmation is required. + +For one-to-one chats, the peer can receive `OnAdvanceMsgListener.onRecvC2CReadReceipt`. Validate `sessionType == ConversationType.SINGLE_CHAT` and a non-empty `userID`, then update message read state from `msgIDList`. `MessageManager` retains one advanced message listener and should be configured once in a shared message state layer. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx new file mode 100644 index 0000000000..169a69bdaa --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,32 @@ +--- +title: 'Pin or unpin a conversation' +description: 'Use pinConversation() to set the pinned state of an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +OpenIMClient.getInstance().conversationManager.pinConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markPinRequestSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordConversationPinFailure(code, error); + } + }, + conversationID, + true +); +``` + +Pass `true` to pin and `false` to unpin. The setting affects only the current account's conversation list. A successful callback does not mean `onConversationChanged` has arrived; merge the later conversation increment by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx new file mode 100644 index 0000000000..e8a7398fb2 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,32 @@ +--- +title: 'Set the burn duration' +description: 'Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( + new OnBase() { + @Override + public void onSuccess(String data) { + markBurnDurationSubmitted(conversationID, 30); + } + + @Override + public void onError(int code, String error) { + recordBurnDurationFailure(code, error); + } + }, + conversationID, + 30 +); +``` + +`burnDuration` is measured in seconds. Enable or disable burn after reading with `isPrivateChat`; do not confuse this value with the scheduled server deletion period `msgDestructTime`. Merge the updated duration from `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx new file mode 100644 index 0000000000..82479d7b70 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,34 @@ +--- +title: 'Set a conversation draft' +description: 'Use setConversationDraft() to save an Android conversation draft.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. + +```java +OpenIMClient.getInstance().conversationManager.setConversationDraft( + new OnBase() { + @Override + public void onSuccess(String data) { + markDraftSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordDraftSaveFailure(code, error); + } + }, + conversationID, + editorValue +); +``` + +Pass an empty string to clear the draft. Request completion and the later `onConversationChanged` update are separate; merge `draftText` and `draftTextTime` by `conversationID`, and clear in-memory editor state after logout or an account switch. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx new file mode 100644 index 0000000000..db34de0d69 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,34 @@ +--- +title: 'Set conversation extra data' +description: 'Use setConversationEx() to set an Android conversation extension string.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. + +```java +OpenIMClient.getInstance().conversationManager.setConversationEx( + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationExtensionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationExtensionFailure(code, error); + } + }, + conversationID, + mergedExtensionJSON +); +``` + +Reconcile the result through `onConversationChanged` by `conversationID`; listener ownership is documented in [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list). diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx new file mode 100644 index 0000000000..80d1f51b7e --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,38 @@ +--- +title: 'Schedule server message deletion' +description: 'Use setConversation() to configure scheduled server message deletion for an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' +--- + +`isMsgDestruct` and `msgDestructTime` together configure scheduled server message deletion and can be sent in one `ConversationReq`. + +```java +ConversationReq request = new ConversationReq(); +request.setMsgDestruct(true); +request.setMsgDestructTime(3600); + +OpenIMClient.getInstance().conversationManager.setConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markMessageDestructSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMessageDestructFailure(code, error); + } + }, + conversationID, + request +); +``` + +`msgDestructTime` is measured in seconds. Set `request.setMsgDestruct(false)` to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx new file mode 100644 index 0000000000..2de3a73dd1 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,38 @@ +--- +title: 'Set conversation message reception' +description: 'Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( + new OnBase() { + @Override + public void onSuccess(String data) { + markReceiveOptionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordReceiveOptionFailure(code, error); + } + }, + conversationID, + 2 +); +``` + +| Value | Meaning | +| ----- | ------------------------------------------------------------- | +| `0` | Receive messages and allow notifications. | +| `1` | Do not receive messages from this conversation or notify. | +| `2` | Receive messages from this conversation without notification. | + +The account default is documented in [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception). Merge the later `onConversationChanged` result by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx new file mode 100644 index 0000000000..899e5cb2b4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,32 @@ +--- +title: 'Enable or disable burn after reading' +description: 'Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( + new OnBase() { + @Override + public void onSuccess(String data) { + markPrivateChatSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordPrivateChatFailure(code, error); + } + }, + conversationID, + true +); +``` + +Pass `false` to disable burn after reading. Set the duration separately with `burnDuration`; see [Set the burn duration](/sdk/android/conversation/managing-conversations/set-burn-duration). This is distinct from scheduled server message deletion. Reconcile the final state through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx new file mode 100644 index 0000000000..c8dd673cd0 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,50 @@ +--- +title: 'Conversation overview' +description: 'Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/overview-conversation' +--- + +A conversation is the chat-list state maintained by the signed-in account for a one-to-one or group chat. A `ConversationInfo` record contains unread count, latest message, pinning, draft, message reception, and extension data. `conversationID` identifies the account's conversation state; the chat target is the peer `userID` for a one-to-one chat or the `groupID` for a group chat. + +Group profile, membership, and permissions belong to Group APIs. Use `groupID` for group operations and `conversationID` for conversation settings, unread state, drafts, and message cleanup. + +## Conversation identifiers + +| Identifier | Purpose | +| ---------------- | ------------------------------------------------------------------------------------------------------------ | +| `conversationID` | Conversation record ID for settings, unread state, and message history. | +| `userID` | Peer user ID in a one-to-one chat. | +| `groupID` | Group ID for a group chat and Group API target. | +| `sourceId` | Chat target passed to queries and ID resolution: `userID` for a one-to-one chat, `groupID` for a group chat. | + +Use `ConversationType.SINGLE_CHAT` for one-to-one chats. For a group chat, use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` according to the group type. Do not construct a `conversationID` in application code. + +## ConversationInfo + +| Field | Description | +| ------------------------------------- | -------------------------------------------------- | +| `conversationID` / `conversationType` | Conversation ID and type. | +| `userID` / `groupID` | Peer user or target group. | +| `showName` / `faceURL` | Conversation-list display name and avatar. | +| `unreadCount` | Unread count for the conversation. | +| `latestMsg` / `latestMsgSendTime` | Latest-message JSON and send time. | +| `recvMsgOpt` / `groupAtType` | Reception option and group mention state. | +| `draftText` / `draftTextTime` | Draft and draft update time. | +| `isPinned` | Whether the conversation is pinned. | +| `isPrivateChat` / `burnDuration` | Burn-after-reading setting and duration. | +| `isMsgDestruct` / `msgDestructTime` | Server message-destruction configuration. | +| `ex` | Application-defined conversation extension string. | + +## State updates + +- [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) owns `onNewConversation` and `onConversationChanged`. +- [Track the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) owns `onTotalUnreadMessageCountChanged`. + +`ConversationManager` retains one `OnConversationListener`; `setOnConversationListener()` replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx new file mode 100644 index 0000000000..ebea8b814b --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,36 @@ +--- +title: 'Open a conversation' +description: 'Use getOneConversation() to retrieve one Android conversation by user or group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +Use `getOneConversation()` when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one-to-one chat and the group ID for a group chat; do not construct `ConversationInfo` locally when no messages exist yet. + +```java +OpenIMClient.getInstance().conversationManager.getOneConversation( + new OnBase() { + @Override + public void onSuccess(ConversationInfo conversation) { + openChatPage(conversation); + } + + @Override + public void onError(int code, String error) { + recordConversationOpenFailure(code, error); + } + }, + targetUserID, + ConversationType.SINGLE_CHAT +); +``` + +`sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` for a group according to its type. + +The callback returns `ConversationInfo`. This query does not trigger a conversation listener; [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) merges later changes by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx new file mode 100644 index 0000000000..dc28debd0b --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,26 @@ +--- +title: 'Resolve a conversation ID' +description: 'Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +When only the conversation ID is needed, call `getConversationIDBySessionType()` rather than constructing it in application code. + +```java +String conversationID = OpenIMClient.getInstance().conversationManager + .getConversationIDBySessionType( + targetUserID, + ConversationType.SINGLE_CHAT + ); +``` + +`sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use the group conversation type that matches the target group. + +This Android API synchronously returns a `String` `conversationID`. It does not return `ConversationInfo` or trigger a conversation listener. Use [Open a conversation](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) when profile data is required. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx new file mode 100644 index 0000000000..2f522702e2 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,35 @@ +--- +title: 'Get conversations by ID' +description: 'Use getMultipleConversation() to retrieve Android conversations by conversationID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +Use `getMultipleConversation()` when a set of `conversationID` values is already available and the latest conversation snapshot is needed. + +```java +OpenIMClient.getInstance().conversationManager.getMultipleConversation( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + for (ConversationInfo item : conversations) { + conversationStore.put(item.getConversationID(), item); + } + } + + @Override + public void onError(int code, String error) { + recordConversationQueryFailure(code, error); + } + }, + conversationIDs +); +``` + +Remove empty and duplicate IDs before calling. The callback returns `List`. Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx new file mode 100644 index 0000000000..78bd222c37 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,59 @@ +--- +title: 'Get the conversation list' +description: 'Use getConversationListSplit() to retrieve the current Android account conversation list by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +The conversation list belongs to the signed-in account. Each `ConversationInfo` contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non-paged `getAllConversationList()`. + +## Retrieve a page + +```java +OpenIMClient.getInstance().conversationManager.getConversationListSplit( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onError(int code, String error) { + recordConversationListFailure(code, error); + } + }, + 0, + 50 +); +``` + +| Parameter | Type | Description | +| --------- | ------ | ----------------------------------------------------- | +| `offset` | `long` | Zero-based paging offset; reset it to `0` on refresh. | +| `count` | `long` | Requested number of conversations. | + +The callback returns the current `List` page. Advance `offset` by the requested item count and deduplicate by `conversationID`. A page smaller than `count` normally indicates the end; clear paging state and reload from `0` on refresh. + +## Keep the list synchronized + +`getConversationListSplit()` only creates a snapshot. Combine these callbacks in the application's single `OnConversationListener`: + +```java +@Override +public void onNewConversation(List conversations) { + mergeConversations(conversations); +} + +@Override +public void onConversationChanged(List conversations) { + mergeConversations(conversations); +} +``` + +Both callbacks carry `List` and must merge idempotently by `conversationID`. A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined-group list for the conversation list. diff --git a/content/docs/chat/sdk/android/events/overview-events.mdx b/content/docs/chat/sdk/android/events/overview-events.mdx new file mode 100644 index 0000000000..7b89f87bab --- /dev/null +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,17 @@ +--- +title: 'Events overview' +description: 'OpenIM Android SDK guide for Events overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/events/overview-events' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx new file mode 100644 index 0000000000..b140b51680 --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -0,0 +1,17 @@ +--- +title: 'Track file upload progress' +description: 'OpenIM Android SDK guide for Track file upload progress.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx new file mode 100644 index 0000000000..d42e494ae4 --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Upload a file' +description: 'OpenIM Android SDK guide for Upload a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/upload-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx new file mode 100644 index 0000000000..29856453bf --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,195 @@ +--- +title: 'Authenticate and manage a session' +description: 'Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' +--- + +OpenIM Android SDK uses `initSDK()` to initialize the local runtime and `login()` to establish the current user's session. Complete the service, user, and token preparation in [Before you start](/sdk/android/getting-started/before-you-start), then add dependencies and permissions as described in [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation). + +The complete flow is: + +1. Create a stable `OnConnListener` in an application-level session component. +2. Call `initSDK()` and confirm that it returns `true`. +3. Register message, user, relationship, conversation, group, and call-signaling listeners before login. +4. Obtain the matching `userID` and token from a trusted backend, then call `login()`. +5. Wait separately for login success and `onConnectSuccess()` before enabling operations that require the persistent connection. +6. On sign-out or account switching, call `logout()` and then clear application state owned by the current account. + +The `apiAddr`, `wsAddr`, `userID`, and `token` used below are all provided by a trusted backend. + +## Initialize and handle the connection lifecycle + +During the `Application` lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. + +```java +import android.app.Application; + +import java.io.File; + +import io.openim.android.sdk.OpenIMClient; +import io.openim.android.sdk.enums.LogLevel; +import io.openim.android.sdk.listener.OnConnListener; +import io.openim.android.sdk.models.InitConfig; + +File dataDirectory = new File(application.getFilesDir(), "openim"); +if (!dataDirectory.exists() && !dataDirectory.mkdirs()) { + throw new IllegalStateException("Cannot create the OpenIM data directory."); +} + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = LogLevel.Info; +config.isLogStandardOutput = false; + +OnConnListener connectionListener = new OnConnListener() { + @Override + public void onConnecting() { + sessionState.setConnectionState("connecting"); + } + + @Override + public void onConnectSuccess() { + sessionState.setConnectionState("connected"); + sessionState.enableConnectedOperations(); + } + + @Override + public void onConnectFailed(long code, String error) { + sessionState.setConnectionState("failed"); + recordConnectionFailure(code, error); + } + + @Override + public void onKickedOffline() { + sessionState.clearCurrentAccount(); + showSignedInElsewhereScreen(); + } + + @Override + public void onUserTokenExpired() { + requestNewTokenAndRelogin(); + } + + @Override + public void onUserTokenInvalid(String reason) { + sessionState.clearCurrentAccount(); + showSignInScreen(reason); + } +}; + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); + +if (!initialized) { + throw new IllegalStateException("OpenIMClientSDK initialization failed."); +} +``` + +A `true` return value means that the local SDK runtime initialized successfully. `OnConnListener` starts reporting persistent-connection state after `login()` is called. + +| Field | Type | Description | +| --------------------- | ------------- | ------------------------------------------------------------------------- | +| `application` | `Application` | Application-level context that owns the SDK lifecycle. | +| `apiAddr` | `String` | OpenIMServer HTTP API endpoint. | +| `wsAddr` | `String` | OpenIMServer WebSocket endpoint. | +| `dataDirectory` | `File` | Application-private persistent directory for the SDK database and logs. | +| `config.logLevel` | `int` | A `LogLevel` constant; reduce the logging level explicitly in production. | +| `isLogStandardOutput` | `boolean` | Whether OpenIM Core logs are emitted to the standard log stream. | + +Initialize the SDK only once in `Application` or an application-level session component. The Java wrapper exposes `networkChanged()` to ask Core to re-evaluate network connectivity; call it only when the application already has one centralized system-network observer, not from multiple screens. + +## Register business listeners before login + +Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application-level event dispatcher and forward events to screen state. See [Send your first message](/sdk/android/getting-started/send-first-message) for the complete message-listener registration and incremental merge example. User, relationship, conversation, group, and call-signaling listeners follow the same ownership rule. + +The SDK does not expose remove or unset methods. During sign-out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. + +## Log in the current user + +```java +OpenIMClient.getInstance().login(new OnBase() { + @Override + public void onError(int code, String error) { + sessionState.setLoginState("failed"); + recordLoginFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.setLoginState("logged"); + sessionState.setCurrentUserID(userID); + } +}, userID, token); +``` + +The successful `login()` callback means that the current login call completed. `OnConnListener.onConnectSuccess()` means that the persistent connection is available. Handle these as separate stages. Do not call `login()` concurrently or infer both states from only one callback. + +## Inspect login state + +```java +int loginStatus = OpenIMClient.getInstance().getLoginStatus(); + +if (loginStatus == LoginStatus.Logged) { + String currentUserID = OpenIMClient.getInstance().getLoginUserID(); + restoreSessionFor(currentUserID); +} +``` + +| State | Description | +| --------------------- | ------------------------------------------------------------------------------------ | +| `LoginStatus.Logout` | The SDK is not logged in. | +| `LoginStatus.Logging` | Login is in progress; do not start another login concurrently. | +| `LoginStatus.Logged` | The SDK is logged in. Persistent-connection state still comes from `OnConnListener`. | + +`getLoginStatus()` and `getLoginUserID()` return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. + +## Handle token failure and forced logout + +After `onUserTokenExpired()` or `onUserTokenInvalid()`, obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign-in flow according to product policy. After `onKickedOffline()`, clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign-out. + +These callbacks do not have a business-entity merge key. Isolate them by the current `OpenIMClient` singleton and logged-in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. + +## Sign out and release the SDK + +```java +OpenIMClient.getInstance().logout(new OnBase() { + @Override + public void onError(int code, String error) { + recordLogoutFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.clearCurrentAccount(); + } +}); +``` + +Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling `login()` for the next account. + +When the application will no longer use the SDK, release the runtime with: + +```java +OpenIMClient.getInstance().unInit(); +``` + +`unInit()` is not a replacement for `logout()` and must not run when an ordinary screen is destroyed. + +## Next steps + +- [Before you start](/sdk/android/getting-started/before-you-start) +- [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation) +- [Send your first message](/sdk/android/getting-started/send-first-message) diff --git a/content/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/docs/chat/sdk/android/getting-started/before-you-start.mdx new file mode 100644 index 0000000000..b792c4ae9e --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -0,0 +1,64 @@ +--- +title: 'Before you start' +description: 'Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/before-you-start' +--- + +Before integrating OpenIMClientSDK into a native Android application, prepare an accessible OpenIMServer deployment, a trusted user-authentication flow, and an Android project that satisfies the SDK build requirements. These prerequisites apply to both [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) and [Send your first message](/sdk/android/getting-started/send-first-message). + +## Prepare OpenIMServer + +If OpenIMServer is not yet available, follow the [Docker deployment guide](/docs/guides/quick-deployment/docker). Confirm that both physical devices and emulators can reach these endpoints: + +| Field | Description | +| --------- | ---------------------------------------------------------------------------------------- | +| `apiAddr` | OpenIMServer HTTP API endpoint used for login, synchronization, and resource requests. | +| `wsAddr` | OpenIMServer WebSocket endpoint used for the persistent connection and real-time events. | + +Do not validate the endpoints only from the development computer. `localhost` inside an Android emulator refers to the emulator itself, so it cannot directly access services running locally on the development computer. When OpenIMServer runs on the development computer, map the API and WebSocket ports to the emulator first: + +```bash +adb reverse tcp:10002 tcp:10002 +adb reverse tcp:10001 tcp:10001 +``` + +After mapping, the emulator can use `http://127.0.0.1:10002` as `apiAddr` and `ws://127.0.0.1:10001` as `wsAddr`. Replace the port numbers with the ports that the development computer actually listens on, and confirm that `adb` is connected to the target emulator before running the commands. Production applications should use HTTPS and WSS, with DNS, TLS certificates, firewalls, reverse proxies, and WebSocket upgrades verified from a physical device. + +## Prepare the user and token + +`userID` identifies an OpenIMSDK user, while the token authenticates that user. A trusted backend must create or associate users, issue tokens, and enforce application permissions. The Android application must never store an administrator token, secret, or other server-side credential. + +For the backend flow, see [Prepare to use the Platform API](/platform-api/prepare-to-use-api) and [Issue a session token](/platform-api/user/managing-session-tokens/issue-a-session-token). After authenticating the application account, the backend should return only the following data needed for SDK login: + +| Data | Description | +| --- | --- | +| `userID` | The current user's OpenIM user ID. | +| `token` | The login token associated with that user. | +| `apiAddr` | The OpenIMServer HTTP API endpoint. | +| `wsAddr` | The OpenIMServer WebSocket endpoint. | + +The `userID` must correspond to the token. The client must not accept an arbitrary user ID and then issue, assemble, or exchange an administrator token. + +## Prepare the Android project + +Before integration, verify that the Android project meets the following requirements: + +- The application uses `minSdk` 21 or later, Java 8 compiler options, and `compileSdk` 36 or later. +- The application manifest declares `android.permission.INTERNET` and permits the SDK to inspect network state. +- An application-private persistent data directory is available, such as a dedicated directory under `Application.getFilesDir()`. Do not store the SDK database in a temporary cache or shared storage. +- Physical devices can reach `apiAddr`, `wsAddr`, and message-media domains. +- The release package covers the target device ABI; verify the native ABIs included in the actual delivery package. +- Product behavior is defined for network recovery, foreground and background transitions, token failure, forced logout, and multi-device login. + +For dependencies and manifest entries, see [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation). For SDK initialization and authentication, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Continue the integration + +Complete [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) first. After the login callback succeeds and `OnConnListener.onConnectSuccess()` arrives, verify the messaging path with [Send your first message](/sdk/android/getting-started/send-first-message). diff --git a/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx new file mode 100644 index 0000000000..aa6ac6db23 --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -0,0 +1,40 @@ +--- +title: 'Integrate for Android' +description: 'Add OpenIM Android SDK dependencies and network permissions to an Android project.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/environment-specific-implementation' +--- + +This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign-in, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Add SDK dependencies + +Add the dependencies to the application module's `build.gradle`: + +```groovy +dependencies { + implementation 'io.openim:android-sdk:latest@aar' + implementation 'io.openim:core-sdk:latest@aar' + implementation 'com.google.code.gson:gson:2.9.0' +} +``` + +## Configure the manifest + +The application needs network access: + +```xml + + +``` + +## Next steps + +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [Send your first message](/sdk/android/getting-started/send-first-message) diff --git a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx index 5371214066..e0d5c79bea 100644 --- a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx +++ b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -1,18 +1,111 @@ --- title: 'Send your first message' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +description: 'Send and verify the first one-to-one text message in an Android application.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/getting-started/send-first-message' --- - +Use one-to-one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign-in in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Before you start + +- Prepare a test account for the sender and another for the receiver. +- Initialize the SDK for both accounts as described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). Register the following listener on the receiver before it signs in. +- Replace `user_b` in the example with the receiver's actual `userID`. + +## Step 1: Listen for incoming messages on the receiver + +Register the message listener on the receiver before sign-in. When a message arrives, add it to the chat list or refresh the UI. + +```java +OpenIMClient.getInstance() + .messageManager + .setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + // Display message in the chat UI. + } + }); +``` + +## Step 2: Confirm that sending is available + +After both accounts sign in, the sender can send only after its login callback succeeds and `OnConnListener.onConnectSuccess()` arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling `login()` again. + +## Step 3: Send a text message + +### Send a one-to-one text message + +Create the message, then send it. Put the receiver's `userID` in the user destination and leave the group destination empty. + +```java +Message message = OpenIMClient.getInstance() + .messageManager + .createTextMessage("Hello, OpenIMSDK"); + +OnMsgSendCallback sendCallback = new OnMsgSendCallback() { + @Override + public void onProgress(long progress) { + // Text messages usually do not need progress handling. + } + + @Override + public void onError(int code, String error) { + // Tell the user that sending failed and allow a retry. + } + + @Override + public void onSuccess(Message sentMessage) { + // Update the sender's chat UI with sentMessage. + } +}; + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + message, + "user_b", + "", + new OfflinePushInfo() +); +``` + +`OfflinePushInfo` configures offline-push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. + +`onSuccess()` means the sender has sent the message successfully. `onRecvNewMessage()` on the receiver means the other side received it. Both callbacks should arrive before considering this one-to-one test complete. + +### Send a group text message + +To send a group message, leave the receiver `userID` empty and provide the group's `groupID`: + +```java +Message groupMessage = OpenIMClient.getInstance() + .messageManager + .createTextMessage("Hello, OpenIMSDK"); + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + groupMessage, + "", + "group_123", + new OfflinePushInfo() +); +``` + +Set either `userID` or `groupID` in a single call, never both. + +## Verify success + +- The sender enters `onSuccess()`. +- The receiver enters `onRecvNewMessage()` and sees the text message. +- A one-to-one message sets only the receiver's `userID`; a group message sets only `groupID`. + +## Next steps + +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [OpenIM Android SDK overview](/sdk/android/overview) diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx new file mode 100644 index 0000000000..9c15b73f1b --- /dev/null +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,17 @@ +--- +title: 'Change group mute status' +description: 'OpenIM Android SDK guide for Change group mute status.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/change-group-mute' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx new file mode 100644 index 0000000000..69c7b84bab --- /dev/null +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a group' +description: 'OpenIM Android SDK guide for Create a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/create-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx new file mode 100644 index 0000000000..470891a2b7 --- /dev/null +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Dismiss a group' +description: 'OpenIM Android SDK guide for Dismiss a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/dismiss-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx new file mode 100644 index 0000000000..002afef04a --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,17 @@ +--- +title: 'Accept a group application' +description: 'OpenIM Android SDK guide for Accept a group application.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/accept-group-application' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx new file mode 100644 index 0000000000..7f5554b186 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get sent group applications' +description: 'OpenIM Android SDK guide for Get sent group applications.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx new file mode 100644 index 0000000000..6dfb5603ad --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get received group applications' +description: 'OpenIM Android SDK guide for Get received group applications.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx new file mode 100644 index 0000000000..09014ab0b3 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -0,0 +1,17 @@ +--- +title: 'Group applications overview' +description: 'OpenIM Android SDK guide for Group applications overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/overview-group-applications' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx new file mode 100644 index 0000000000..e1096ebbe8 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,17 @@ +--- +title: 'Reject a group application' +description: 'OpenIM Android SDK guide for Reject a group application.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/join-group.mdx b/content/docs/chat/sdk/android/group/join-group.mdx new file mode 100644 index 0000000000..6d8cf63d19 --- /dev/null +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Apply to join a group' +description: 'OpenIM Android SDK guide for Apply to join a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/join-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx new file mode 100644 index 0000000000..1cfdf22d93 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,17 @@ +--- +title: 'Mute or unmute a group member' +description: 'OpenIM Android SDK guide for Mute or unmute a group member.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx new file mode 100644 index 0000000000..4a92ebecde --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Invite users to a group' +description: 'OpenIM Android SDK guide for Invite users to a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx new file mode 100644 index 0000000000..b26abd5092 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,17 @@ +--- +title: 'Remove group members' +description: 'OpenIM Android SDK guide for Remove group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx new file mode 100644 index 0000000000..2eed4eff78 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,17 @@ +--- +title: 'Update a group member’s avatar' +description: 'OpenIM Android SDK guide for Update a group member’s avatar.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx new file mode 100644 index 0000000000..eb98faea13 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set a group member extension' +description: 'OpenIM Android SDK guide for Set a group member extension.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx new file mode 100644 index 0000000000..fdad13ad63 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,17 @@ +--- +title: 'Update a member’s group nickname' +description: 'OpenIM Android SDK guide for Update a member’s group nickname.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx new file mode 100644 index 0000000000..33d54640cb --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,17 @@ +--- +title: 'Manage group administrators' +description: 'OpenIM Android SDK guide for Manage group administrators.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx new file mode 100644 index 0000000000..d93b0ea0c7 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,17 @@ +--- +title: 'Transfer group ownership' +description: 'OpenIM Android SDK guide for Transfer group ownership.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/overview-group.mdx b/content/docs/chat/sdk/android/group/overview-group.mdx new file mode 100644 index 0000000000..067715a67d --- /dev/null +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Group overview' +description: 'OpenIM Android SDK guide for Group overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/overview-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx new file mode 100644 index 0000000000..ee871c76e6 --- /dev/null +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Leave a group' +description: 'OpenIM Android SDK guide for Leave a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/quit-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx new file mode 100644 index 0000000000..fd056bb831 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,17 @@ +--- +title: 'List group members' +description: 'OpenIM Android SDK guide for List group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx new file mode 100644 index 0000000000..d758141c79 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get the group owner and administrators' +description: 'OpenIM Android SDK guide for Get the group owner and administrators.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx new file mode 100644 index 0000000000..8faea3fba3 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get specified group member profiles' +description: 'OpenIM Android SDK guide for Get specified group member profiles.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx new file mode 100644 index 0000000000..3b19bb1eef --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Check group membership' +description: 'OpenIM Android SDK guide for Check group membership.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx new file mode 100644 index 0000000000..09f43f4f5f --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: 'Group member queries overview' +description: 'OpenIM Android SDK guide for Group member queries overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx new file mode 100644 index 0000000000..261b3b6b1d --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: 'Search group members' +description: 'OpenIM Android SDK guide for Search group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx new file mode 100644 index 0000000000..9260220b44 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get joined groups by page' +description: 'OpenIM Android SDK guide for Get joined groups by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx new file mode 100644 index 0000000000..3efd2eec6f --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get group information' +description: 'OpenIM Android SDK guide for Get group information.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx new file mode 100644 index 0000000000..6c1a41ea33 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Check group membership' +description: 'OpenIM Android SDK guide for Check group membership.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx new file mode 100644 index 0000000000..28f5870b58 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,17 @@ +--- +title: 'Search groups' +description: 'OpenIM Android SDK guide for Search groups.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx new file mode 100644 index 0000000000..21b94105d2 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,17 @@ +--- +title: 'Publish a group announcement' +description: 'OpenIM Android SDK guide for Publish a group announcement.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-announcement' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx new file mode 100644 index 0000000000..2ff7858f49 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set group extra data' +description: 'OpenIM Android SDK guide for Set group extra data.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-extension' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx new file mode 100644 index 0000000000..dbb80b7c6a --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set group join verification' +description: 'OpenIM Android SDK guide for Set group join verification.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-join-verification' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx new file mode 100644 index 0000000000..6d04505804 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set member friend request permission' +description: 'OpenIM Android SDK guide for Set member friend request permission.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx new file mode 100644 index 0000000000..dd5387bdca --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set member profile access' +description: 'OpenIM Android SDK guide for Set member profile access.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx new file mode 100644 index 0000000000..dcd2399ee6 --- /dev/null +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,17 @@ +--- +title: 'Update group profile' +description: 'OpenIM Android SDK guide for Update group profile.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/update-group-profile' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx new file mode 100644 index 0000000000..de5209df08 --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,17 @@ +--- +title: 'Report typing status' +description: 'OpenIM Android SDK guide for Report typing status.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx new file mode 100644 index 0000000000..1580e92d0b --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a contact card message' +description: 'OpenIM Android SDK guide for Create a contact card message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-card-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx new file mode 100644 index 0000000000..e673b56096 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a custom message' +description: 'OpenIM Android SDK guide for Create a custom message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-custom-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx new file mode 100644 index 0000000000..4101251733 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an emoji message' +description: 'OpenIM Android SDK guide for Create an emoji message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-face-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx new file mode 100644 index 0000000000..4996020871 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a file message from a file' +description: 'OpenIM Android SDK guide for Create a file message from a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx new file mode 100644 index 0000000000..3fa9cce541 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a file message from a URL' +description: 'OpenIM Android SDK guide for Create a file message from a URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx new file mode 100644 index 0000000000..e5868d7827 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a forwarded message' +description: 'OpenIM Android SDK guide for Create a forwarded message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-forward-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx new file mode 100644 index 0000000000..204f98e23a --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an image message from a file' +description: 'OpenIM Android SDK guide for Create an image message from a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx new file mode 100644 index 0000000000..09ff19a178 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an image message from a URL' +description: 'OpenIM Android SDK guide for Create an image message from a URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx new file mode 100644 index 0000000000..1cb0f5805f --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a location message' +description: 'OpenIM Android SDK guide for Create a location message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx new file mode 100644 index 0000000000..a7d9803089 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a merged forward message' +description: 'OpenIM Android SDK guide for Create a merged forward message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx new file mode 100644 index 0000000000..41a9694cb6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a reply message' +description: 'OpenIM Android SDK guide for Create a reply message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-quote-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx new file mode 100644 index 0000000000..c4b8965e56 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an audio message from a file' +description: 'OpenIM Android SDK guide for Create an audio message from a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx new file mode 100644 index 0000000000..da093ce0e0 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an audio message from a URL' +description: 'OpenIM Android SDK guide for Create an audio message from a URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx new file mode 100644 index 0000000000..e17e180fd3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an @ message' +description: 'OpenIM Android SDK guide for Create an @ message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx new file mode 100644 index 0000000000..9c71b67d46 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a text message' +description: 'OpenIM Android SDK guide for Create a text message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx new file mode 100644 index 0000000000..7960d05813 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a video message from files' +description: 'OpenIM Android SDK guide for Create a video message from files.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx new file mode 100644 index 0000000000..6777dc8506 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a video message from URLs' +description: 'OpenIM Android SDK guide for Create a video message from URLs.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx new file mode 100644 index 0000000000..2cb99cd5e6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Clear all local messages' +description: 'OpenIM Android SDK guide for Clear all local messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx new file mode 100644 index 0000000000..1030a9cb05 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Clear local and server messages' +description: 'OpenIM Android SDK guide for Clear local and server messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx new file mode 100644 index 0000000000..f026d8cd54 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Delete a local message' +description: 'OpenIM Android SDK guide for Delete a local message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx new file mode 100644 index 0000000000..7649e1dfbe --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Delete messages in a batch' +description: 'OpenIM Android SDK guide for Delete messages in a batch.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx new file mode 100644 index 0000000000..969069c18b --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get pinned messages in a conversation' +description: 'OpenIM Android SDK guide for Get pinned messages in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx new file mode 100644 index 0000000000..f3543c748b --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Insert a local group message' +description: 'OpenIM Android SDK guide for Insert a local group message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx new file mode 100644 index 0000000000..ccaf2bcc05 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Insert a local one-to-one message' +description: 'OpenIM Android SDK guide for Insert a local one-to-one message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx new file mode 100644 index 0000000000..57f100501a --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Modify a message' +description: 'OpenIM Android SDK guide for Modify a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx new file mode 100644 index 0000000000..c47af6dbb7 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Revoke a message' +description: 'OpenIM Android SDK guide for Revoke a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx new file mode 100644 index 0000000000..628339da08 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set a local message extension' +description: 'OpenIM Android SDK guide for Set a local message extension.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx new file mode 100644 index 0000000000..7491a448cd --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,17 @@ +--- +title: 'Pin or unpin a message' +description: 'OpenIM Android SDK guide for Pin or unpin a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx new file mode 100644 index 0000000000..eb318b59c8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Receive custom business messages' +description: 'OpenIM Android SDK guide for Receive custom business messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx new file mode 100644 index 0000000000..ccaaaf7102 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Receive messages' +description: 'OpenIM Android SDK guide for Receive messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx new file mode 100644 index 0000000000..f606fc6ddc --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,17 @@ +--- +title: 'Find messages by ID' +description: 'OpenIM Android SDK guide for Find messages by ID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx new file mode 100644 index 0000000000..d582a57fdc --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Load message history in reverse' +description: 'OpenIM Android SDK guide for Load message history in reverse.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx new file mode 100644 index 0000000000..af547c4b35 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Load message history' +description: 'OpenIM Android SDK guide for Load message history.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx new file mode 100644 index 0000000000..aa0346051e --- /dev/null +++ b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Search messages' +description: 'OpenIM Android SDK guide for Search messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx new file mode 100644 index 0000000000..173ae35cee --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,17 @@ +--- +title: 'Send an uploaded media message' +description: 'OpenIM Android SDK guide for Send an uploaded media message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx new file mode 100644 index 0000000000..3764812cef --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Send a message' +description: 'OpenIM Android SDK guide for Send a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx new file mode 100644 index 0000000000..9cfa3ba752 --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,17 @@ +--- +title: 'Track message sending progress' +description: 'OpenIM Android SDK guide for Track message sending progress.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/overview.mdx b/content/docs/chat/sdk/android/overview.mdx index 05c6cb1618..08072e5a4a 100644 --- a/content/docs/chat/sdk/android/overview.mdx +++ b/content/docs/chat/sdk/android/overview.mdx @@ -1,18 +1,28 @@ --- -title: 'OpenIM SDK for Android' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'OpenIM Android SDK overview' +description: 'Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'overview' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/overview' --- - +OpenIM Android SDK brings OpenIMSDK capabilities to native Android applications. Choose a domain below to open its documentation. + +## Documentation navigation + +| Domain | Content | +| --- | --- | +| [Getting started](/sdk/android/getting-started/environment-specific-implementation) | Integrate the SDK, configure the Android project, authenticate, manage the connection lifecycle, and send the first message. | +| [Users and relationships](/sdk/android/user/overview-user) | User profiles, online status, friends, friend applications, and blacklist. | +| [Conversations](/sdk/android/conversation/overview-conversation) | Conversation queries, drafts, unread counts, receive options, burn-after-reading settings, hiding, and deletion. | +| [Groups](/sdk/android/group/overview-group) | Group profiles, members, applications, permissions, mute settings, and group events. | +| [Messages](/sdk/android/message/overview-message) | Message creation, sending, receiving, history, search, deletion, revocation, and read receipts. | +| [File uploads](/sdk/android/file-uploads/upload-file) | Standalone file uploads and upload progress. | +| [Audio and video calls](/sdk/android/calling/overview-calling) | Invitations, acceptance, rejection, cancellation, hangup, room credentials, and custom signaling. | +| [Events](/sdk/android/events/overview-events) | Manager listeners, connection state, and data events. | +| [Logging](/sdk/android/logger) | SDK logging configuration and troubleshooting. | diff --git a/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx new file mode 100644 index 0000000000..251fc09ca4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -0,0 +1,43 @@ +--- +title: 'Block a user' +description: 'Use addBlacklist() to add a user to the current account blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/add-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRequestSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistAddFailure(code, error); + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +The second argument is the target `userID`, and the third argument is optional extension data. Use the overload without `ex` when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. + +The blacklist is one-way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application-level rule. `ex` is a complete string, so merge application-owned fields before updating it. + +This page owns `onBlacklistAdded`. Combine it into the application's single `OnFriendshipListener`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo user) { + blacklistStore.put(user.getUserID(), user); +} +``` diff --git a/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx new file mode 100644 index 0000000000..33ad0f2ff1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,55 @@ +--- +title: 'Get the blacklist' +description: 'Use getBlacklist() to retrieve the current user blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. + +## Get the blacklist + +After SDK initialization and login, call `getBlacklist()` to retrieve the full blacklist for the signed-in account. An empty list means no users are blocked. + +```java +OpenIMClient.getInstance().friendshipManager.getBlacklist( + new OnBase>() { + @Override + public void onSuccess(List users) { + blacklistStore.replace(users); + } + + @Override + public void onError(int code, String error) { + recordBlacklistFailure(code, error); + } + } +); +``` + +The callback returns `List`; call `UserInfo.getBlackInfo()` to retrieve the blacklist relationship object. + +## Blacklist record fields + +Common `BlacklistInfo` fields are: + +| Field | Description | +| ---------------- | ------------------------------------------------------------------- | +| `userID` | Target user ID blocked by the current user and the stable list key. | +| `nickname` | Target user nickname snapshot. | +| `faceURL` | Target user avatar URL. | +| `gender` | Target user gender value. | +| `operatorUserID` | User ID that performed the block operation. | +| `createTime` | Blacklist relationship creation time. | +| `addSource` | Source that added the blacklist relationship. | +| `ex` | Blacklist relationship extension string. | + +When the screen also needs friend remarks or the latest public profile, separately merge `FriendInfo` or `PublicUserInfo` by `userID`. Do not treat blacklist fields as friend profile data. + +Merge blacklist state by `userID`. This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the [Block a user](/sdk/android/user/blacklist/add-blacklist) and [Unblock a user](/sdk/android/user/blacklist/remove-blacklist) listener pages. diff --git a/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx new file mode 100644 index 0000000000..fb9ed93480 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -0,0 +1,40 @@ +--- +title: 'Unblock a user' +description: 'Use removeBlacklist() to remove a user from the current account blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/remove-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.removeBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRemovalSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistRemovalFailure(code, error); + } + }, + targetUserID +); +``` + +A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after `onBlacklistDeleted`; if the event is missed, reconcile through [Get the blacklist](/sdk/android/user/blacklist/get-blacklist). + +This page owns `onBlacklistDeleted`; remove the local entry by `userID`: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + blacklistStore.remove(user.getUserID()); +} +``` diff --git a/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx new file mode 100644 index 0000000000..39b0d1a0e1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -0,0 +1,32 @@ +--- +title: 'Accept a friend request' +description: 'Use acceptFriendApplication() to accept a friend request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/accept-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationAccepted(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationAcceptFailure(code, error); + } + }, + applicantUserID, + "Accepted" +); +``` + +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: `onFriendApplicationAccepted` updates the application and `onFriendAdded` updates the friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx new file mode 100644 index 0000000000..a4e3ec4000 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -0,0 +1,34 @@ +--- +title: 'Send a friend request' +description: 'Use addFriend() to send a friend request to a specified user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/add-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendApplicationSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendApplicationFailure(code, error); + } + }, + "user_b", + "Hello, I am Alex" +); +``` + +The second argument is the recipient's `userID`, and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. + +Merge friend request changes through `OnFriendshipListener`, as documented in [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx new file mode 100644 index 0000000000..b50f4bd867 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,75 @@ +--- +title: 'Get received friend requests' +description: 'Use getRecvFriendApplicationList() to query received friend requests by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/get-recv-friend-application-list' +--- + +```java +GetFriendApplicationListAsRecipientReq request = + new GetFriendApplicationListAsRecipientReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceReceivedApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordReceivedApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` starts at `0`, and `count` is the page size. To filter by handling state, use `setHandleResults(int[])` with values defined by the server contract. The callback returns the current page as `List`. + +| Field | Description | +| --------------------------------------------- | ---------------------------------------------------------------- | +| `fromUserID` / `fromNickname` / `fromFaceURL` | Applicant ID, nickname, and avatar snapshot. | +| `toUserID` / `toNickname` / `toFaceURL` | Recipient ID, nickname, and avatar snapshot. | +| `reqMsg` | Friend request message. | +| `handleResult` | Handling result: `0` pending, `1` accepted, `2` rejected. | +| `handlerUserID` | User ID that handled the request; it can be empty while pending. | +| `handleMsg` | Handling message. | +| `handleTime` | Handling time; do not treat it as valid while pending. | +| `createTime` | Request creation time. | +| `ex` | Friend request extension string. | + +Use `fromUserID:toUserID` as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: + +```java +@Override +public void onFriendApplicationAdded(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationAccepted(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationRejected(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationDeleted(FriendApplicationInfo application) { + friendApplicationStore.remove( + application.getFromUserID(), + application.getToUserID() + ); +} +``` + +Use whether `toUserID` equals the signed-in user ID to route a record to the received or sent list. After an application is accepted, `onFriendAdded`, owned by [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page), merges the new friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx new file mode 100644 index 0000000000..1a9e8ee929 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -0,0 +1,36 @@ +--- +title: 'Get sent friend requests' +description: 'Use getSendFriendApplicationList() to query sent friend requests by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/get-send-friend-application-list' +--- + +```java +GetFriendApplicationListAsApplicantReq request = + new GetFriendApplicationListAsApplicantReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceSentApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordSentApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` starts at `0`, and `count` is the page size. The callback returns the current page as `List`. Merge items by `fromUserID:toUserID`. This query only establishes a snapshot and does not trigger friend request callbacks. + +For sent requests, the signed-in user is normally `fromUserID`. The record fields and handling semantics are the same as [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list): the Android server contract uses `0` for pending, `1` for accepted, and `2` for rejected. diff --git a/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx new file mode 100644 index 0000000000..ae72e17d21 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -0,0 +1,32 @@ +--- +title: 'Reject a friend request' +description: 'Use refuseFriendApplication() to reject a friend request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/refuse-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationRejected(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationRejectFailure(code, error); + } + }, + applicantUserID, + "Not now" +); +``` + +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is `handleResult == 2`. diff --git a/content/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/docs/chat/sdk/android/user/friends/check-friend.mdx new file mode 100644 index 0000000000..100488a665 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -0,0 +1,33 @@ +--- +title: 'Check friendship' +description: 'Use checkFriend() to check whether specified users are friends of the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/check-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.checkFriend( + new OnBase>() { + @Override + public void onSuccess(List relations) { + showFriendshipStates(relations); + } + + @Override + public void onError(int code, String error) { + recordFriendshipCheckFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b") +); +``` + +The callback returns `List`. Each item's `userID` identifies the target user. `result == 1` means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client-side states. + +This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info) when nickname, avatar, or friend remark data is required. diff --git a/content/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx new file mode 100644 index 0000000000..4cab7ed68e --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -0,0 +1,31 @@ +--- +title: 'Delete a friend' +description: 'Use deleteFriend() to remove one friendship from the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/delete-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.deleteFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendDeletionSubmitted(friendUserID); + } + + @Override + public void onError(int code, String error) { + recordFriendDeletionFailure(code, error); + } + }, + friendUserID +); +``` + +A successful callback means the delete request completed. Remove the local record by `userID` after `onFriendDeleted` arrives. Event handling is documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx new file mode 100644 index 0000000000..f06689e125 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,73 @@ +--- +title: 'Get the friend list by page' +description: 'Use getFriendListPage() to retrieve the current user friend list by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/get-friend-list-page' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendListPage( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendListFailure(code, error); + } + }, + 0, + 40, + true +); +``` + +The arguments after the callback are `offset`, `count`, and `filterBlack`. `offset` starts at `0`, `count` is the page size, and `filterBlack` removes blocked users when `true`. The callback returns the current page as `List`; call `getFriendInfo()` on each item for relationship details. Increase `offset` by the requested item count when loading another page; a page smaller than `count` normally marks the end. + +Use the paged API instead of `getFriendList()`. Merge snapshots and increments by `userID`. + +## Friend profile fields + +`UserInfo` is the Android wrapper object. `getFriendInfo()` returns `FriendInfo` for a friend list item. Common fields are: + +| Field | Description | +| ---------------- | ------------------------------------------------- | +| `userID` | Friend user ID and the stable friend-list key. | +| `nickname` | Account nickname of the friend. | +| `faceURL` | Account avatar URL of the friend. | +| `remark` | Friend remark set by the current account. | +| `ex` | Friendship extension string. | +| `addSource` | Source that created the friendship. | +| `operatorUserID` | User ID that created or updated the relationship. | +| `createTime` | Friendship creation time. | + +`nickname` and `faceURL` are account data, while `remark` and `ex` belong to the friendship. `UpdateFriendsReq` can submit `isPinned`, but the current Android `FriendInfo` model has no corresponding read field, so pinned state needs application-owned storage. Do not use a friend object to overwrite a stranger's `PublicUserInfo`, or write a friend remark back to the account nickname. + +This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + friendStore.remove(friend.getUserID()); +} +``` diff --git a/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx new file mode 100644 index 0000000000..cbd885d042 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -0,0 +1,38 @@ +--- +title: 'Get specified friend profiles' +description: 'Use getFriendsInfo() to query friendship profiles for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/get-friends-info' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendsInfo( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendInfoFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b"), + true +); +``` + +The second argument is the target user ID list. `filterBlack` controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns `List`; use `getFriendInfo()` for friend remarks and relationship fields, then merge by `userID`. + +The result can omit a target that is not a friend or is excluded by `filterBlack == true`. When the UI also needs account-level public data, call [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) and merge the two sources by `userID`. + +This query does not trigger friendship callbacks. Use [`checkFriend()`](/sdk/android/user/friends/check-friend) when only the relationship state is needed. diff --git a/content/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/docs/chat/sdk/android/user/friends/search-friends.mdx new file mode 100644 index 0000000000..10d52db56a --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -0,0 +1,36 @@ +--- +title: 'Search friends' +description: 'Use searchFriends() to search the current user friend list.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/search-friends' +--- + +```java +OpenIMClient.getInstance().friendshipManager.searchFriends( + new OnBase>() { + @Override + public void onSuccess(List results) { + showFriendSearchResults(results); + } + + @Override + public void onError(int code, String error) { + recordFriendSearchFailure(code, error); + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +Pass one non-empty value in `keywordList`. The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. + +The callback returns `List`. Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks. diff --git a/content/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/docs/chat/sdk/android/user/friends/update-friends.mdx new file mode 100644 index 0000000000..624e158896 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -0,0 +1,44 @@ +--- +title: 'Update friend profiles' +description: 'Use updateFriendsReq() to update friend remarks, pinned state, or extension data.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/update-friends' +--- + +```java +UpdateFriendsReq request = new UpdateFriendsReq(); +request.setFriendUserIDs(new String[] { friendUserID }); +request.setRemark(remark.trim()); + +OpenIMClient.getInstance().friendshipManager.updateFriendsReq( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendUpdateFailure(code, error); + } + }, + request +); +``` + +`UpdateFriendsReq` supports `friendUserIDs`, `remark`, `isPinned`, and `ex`. One call applies the same field value to every target friend. Use separate calls when friends need different values. `ex` is a complete string. + +| Field | Description | +| --------------- | ---------------------------------------------------------- | +| `friendUserIDs` | Friend ID array to update. | +| `remark` | Friend remark for the current account. | +| `isPinned` | Whether to pin the friend. | +| `ex` | Friendship extension string, replaced as a complete value. | + +A successful callback means the update request completed. Merge the friend increment through `onFriendInfoChanged`, as documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx new file mode 100644 index 0000000000..4c61c8b9c7 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,32 @@ +--- +title: 'Get subscribed user online status' +description: 'Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusQueryFailure(code, error); + } + } +); +``` + +This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed-user `List` snapshot, which can reconcile status by `userID` after reconnecting or reopening a screen. + +The query does not trigger `onUserStatusChanged`. Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs. diff --git a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx new file mode 100644 index 0000000000..d0d5962638 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -0,0 +1,52 @@ +--- +title: 'Subscribe to user online status' +description: 'Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' +--- + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusSubscriptionFailure(code, error); + } + }, + userIDs +); +``` + +Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial `List` snapshot. Each item contains `userID`, `status`, and `platformIDs`. Deduplicate repeated subscriptions in the application state layer. + +## Status fields + +| Field | Description | +| ------------- | --------------------------------------------------- | +| `userID` | Target user ID. | +| `status` | Online status value defined by the server contract. | +| `platformIDs` | Platforms on which the user is online. | + +This page owns `onUserStatusChanged`. Combine it into the application's single `OnUserListener` and merge by `userID`: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus status) { + onlineStatusStore.put(status.getUserID(), status); +} +``` + +Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one. diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index 0cfecbbd0d..a4e83af60a 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -1,18 +1,60 @@ --- -title: 'Overview' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'User overview' +description: 'Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' --- - +OpenIM Android SDK identifies each user by `userID`. When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. + +Group member lists, in-group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. + +## User objects + +Android SDK returns different user objects for different scenarios: + +| Type | Use case | Main APIs | +| ----------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `LocalUser` | The current user's local profile, settings page, avatar, nickname, and account-level receive setting | `getSelfLocalUserInfo()`, `setSelfInfo()` | +| `PublicUserInfo` | Application user lookup, friend candidates, and profiles for users who are not friends | `getUsersInfo()` | +| `UserInfo` | Combined Android wrapper object that can carry public, friend, or blacklist information | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | +| `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | +| `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | +| `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | +| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()` | + +The same `userID` can appear in public profile, friend, blocklist, and group member data. Prefer `UserInfo.getFriendInfo()` when displaying a contact, `PublicUserInfo` when only a public account profile is needed, and `UserInfo.getBlackInfo()` on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. + +Use `userID` as the stable key for user lists and events. A friend request contains both parties, so use `fromUserID:toUserID` to identify one request. + +## Feature entry points + +| Requirement | Recommended page | +| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| Retrieve public profiles by `userID` for friend candidates or profile cards | [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) | +| Page through, search, or retrieve friend relationships by ID | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | +| Send, retrieve, accept, or reject friend requests | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| Update friend data | [Update friend profiles](/sdk/android/user/friends/update-friends) | +| Delete a friend relationship | [Delete a friend](/sdk/android/user/friends/delete-friend) | +| View and maintain the current user's blocklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist) | +| Read or update the current user's nickname, avatar, and extension data | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | +| Subscribe to and retrieve online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | + +## State updates + +Each user-related capability page owns the listener and merge behavior for its events: + +- Current user profile changes: [Update the current user profile](/sdk/android/user/user-profile/set-self-info). +- Friend request changes: [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). +- Friend relationship and profile changes: [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). +- Blocklist changes: [Block a user](/sdk/android/user/blacklist/add-blacklist). +- Online status changes: [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status). + +`UserInfoManager` and `FriendshipManager` each retain one listener. `setOnUserListener()` and `setOnFriendshipListener()` replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners. diff --git a/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx new file mode 100644 index 0000000000..fab369eb88 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,46 @@ +--- +title: 'Get the current user profile' +description: 'Use getSelfLocalUserInfo() to retrieve the local profile for the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( + new OnBase() { + @Override + public void onSuccess(LocalUser user) { + currentUserStore.set(user); + } + + @Override + public void onError(int code, String error) { + recordSelfProfileFailure(code, error); + } + } +); +``` + +After initialization and login, call this method to retrieve the current account's local profile. Success returns `LocalUser` with fields such as `userID`, `nickname`, `faceURL`, `ex`, `attachedInfo`, `globalRecvMsgOpt`, and `addFriendPermission`. + +## Returned fields + +| Field | Description | +| --------------------- | -------------------------------------------------------------------------------------------- | +| `userID` | Signed-in user ID. | +| `nickname` | Current account nickname. | +| `faceURL` | Current account avatar URL. | +| `ex` | Current account extension string. | +| `attachedInfo` | SDK-attached data; parse only an application-defined format. | +| `globalRecvMsgOpt` | Global message reception: `0` receive, `1` do not receive, `2` receive without notification. | +| `addFriendPermission` | Add-friend permission value defined by the server contract. | + +The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. + +`getSelfUserInfo()` is deprecated and is not the recommended API. diff --git a/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx new file mode 100644 index 0000000000..900d018e33 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,55 @@ +--- +title: 'Get specified user profiles' +description: 'Use getUsersInfo() to query public profiles by userID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.getUsersInfo( + new OnBase>() { + @Override + public void onSuccess(List users) { + for (PublicUserInfo user : users) { + publicUserStore.put(user.getUserID(), user); + } + } + + @Override + public void onError(int code, String error) { + recordUserQueryFailure(code, error); + } + }, + userIDs +); +``` + +Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns `List` with fields such as `userID`, `nickname`, `faceURL`, `ex`, and `createTime`. This query does not trigger `OnUserListener`; query again and merge by `userID` when the profile snapshot must be refreshed. + +## Returned fields + +| Field | Description | +| ------------ | ----------------------------------------------------------------- | +| `userID` | OpenIM user ID and the stable local cache key. | +| `nickname` | Account-level public nickname. | +| `faceURL` | Account-level public avatar URL. | +| `ex` | Account-level public extension string defined by the application. | +| `createTime` | User profile creation time. | + +Do not use `PublicUserInfo` to overwrite friend remarks, pinned state, or in-group nicknames. Use `FriendInfo` for friends and the group member model for group members. + +Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. + +## Refreshing profiles + +Replace or merge the public profile snapshot after a successful query. Re-query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. `OnUserListener.onSelfInfoUpdated` only describes the signed-in user's profile and is not a change event for other users. diff --git a/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx new file mode 100644 index 0000000000..6a42e061ef --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -0,0 +1,44 @@ +--- +title: 'Set global message reception' +description: 'Use setSelfInfo() to set the account-wide message reception and notification policy.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +Use a separate `UserInfoReq` for `globalRecvMsgOpt` so profile updates do not accidentally overwrite the account-wide message policy. + +```java +UserInfoReq request = new UserInfoReq(); +request.setGlobalRecvMsgOpt(2); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markGlobalReceiveOptionSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordGlobalReceiveOptionFailure(code, error); + } + }, + request +); +``` + +| Value | Meaning | +| ----- | ----------------------------------------- | +| `0` | Receive messages and allow notifications. | +| `1` | Do not receive messages. | +| `2` | Receive messages without notifications. | + +If the product exposes only a global do-not-disturb switch, it usually toggles between `0` and `2`; `1` stops message reception and should be presented as a separate option. Per-conversation reception is managed by conversation APIs and is not replaced by this setting. + +A successful callback means the request completed. Reconcile the final account snapshot through `onSelfInfoUpdated` or `getSelfLocalUserInfo()`. Event handling is documented in [Update the current user profile](/sdk/android/user/user-profile/set-self-info). diff --git a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx new file mode 100644 index 0000000000..1994106aca --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,60 @@ +--- +title: 'Update the current user profile' +description: 'Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +Set only the fields that must change on `UserInfoReq`. The SDK omits `null` fields when serializing the request. + +```java +UserInfoReq request = new UserInfoReq(); +request.setNickname(displayName.trim()); +request.setFaceURL(avatarURL); +request.setEx(mergedExtra); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markProfileUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordProfileUpdateFailure(code, error); + } + }, + request +); +``` + +`UserInfoReq` supports fields such as `nickname`, `faceURL`, `ex`, and `addFriendPermission`. `ex` is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. + +A successful callback means the update request completed. Merge the final profile increment from `onSelfInfoUpdated(UserInfo info)`, or query `getSelfLocalUserInfo()` again. + +## Updatable fields + +| Field | Description | +| --------------------- | ---------------------------- | +| `nickname` | New nickname. | +| `faceURL` | New avatar URL. | +| `ex` | Complete extension string. | +| `addFriendPermission` | Add-friend permission value. | + +Send only fields that should change. Although the global message reception setting is also written with `setSelfInfo()`, use the dedicated [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) entry point. + +This page owns `onSelfInfoUpdated`. Combine it into the application's single `OnUserListener`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + currentUserStore.merge(info.getUserID(), info); +} +``` diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx new file mode 100644 index 0000000000..8e6ab3dc0c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,32 @@ +--- +title: '接受通话' +description: '使用 Android SDK 接受通话邀请并获取房间凭据。' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +--- + +从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请: + +```java +OpenIMClient.getInstance().signalingManager.signalingAccept( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showAcceptError(code, error); + } + }, + receivedInfo +); +``` + +`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。 + +成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx new file mode 100644 index 0000000000..0c754c80b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,26 @@ +--- +title: '取消通话邀请' +description: '使用 Android SDK 取消尚未接通的通话邀请。' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +--- + +邀请尚未接通时,发起方调用 `signalingCancel()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingCancel( + new OnBase() { + @Override + public void onSuccess(String result) { + stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showCancelError(code, error); + } + }, + activeInfo +); +``` + +必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx new file mode 100644 index 0000000000..d3890e8447 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,74 @@ +--- +title: '处理通话事件' +description: '集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +--- + +通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。 + +```java +OpenIMClient.getInstance().signalingManager.setSignalingListener( + new OnSignalingListener() { + @Override + public void onReceiveNewInvitation(SignalingInfo info) { + upsertCall(info, "ringing"); + } + + @Override + public void onInviteeAccepted(SignalingInfo info) { + mergeCallEvent("accepted", info); + } + + @Override + public void onInviteeRejected(SignalingInfo info) { + mergeCallEvent("rejected", info); + } + + @Override + public void onInvitationCancelled(SignalingInfo info) { + mergeCallEvent("cancelled", info); + } + + @Override + public void onInvitationTimeout(SignalingInfo info) { + mergeCallEvent("timeout", info); + } + + @Override + public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { + mergeCallEvent("accepted-by-other-device", info); + } + + @Override + public void onInviteeRejectedByOtherDevice(SignalingInfo info) { + mergeCallEvent("rejected-by-other-device", info); + } + + @Override + public void onHangup(SignalingInfo info) { + finishCall(info.getInvitation().getRoomID()); + } + + @Override + public void onRoomParticipantConnected(RoomCallingInfo room) { + mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onRoomParticipantDisconnected(RoomCallingInfo room) { + mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onStreamChange(String streamInfo) { + mergeStreamChange(streamInfo); + } + } +); +``` + +本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。 + +邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 + +`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx new file mode 100644 index 0000000000..3301761f13 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,26 @@ +--- +title: '挂断通话' +description: '使用 Android SDK 挂断已经建立的通话。' +sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' +--- + +通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。 + +```java +OpenIMClient.getInstance().signalingManager.signalingHungUp( + new OnBase() { + @Override + public void onSuccess(String result) { + releaseCallResources(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showHangUpError(code, error); + } + }, + activeInfo +); +``` + +成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx new file mode 100644 index 0000000000..3b0240957a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,26 @@ +--- +title: '拒绝通话' +description: '使用 Android SDK 拒绝通话邀请。' +sourcePath: '/sdk/android/calling/managing-calls/reject-call' +--- + +用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingReject( + new OnBase() { + @Override + public void onSuccess(String result) { + closeIncomingCallUI(); + } + + @Override + public void onError(int code, String error) { + showRejectError(code, error); + } + }, + receivedInfo +); +``` + +成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx new file mode 100644 index 0000000000..d88962deea --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,44 @@ +--- +title: '发起群聊通话' +description: '使用 Android SDK 发起群聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +--- + +`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。 + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(selectedGroupMemberIDs); +invitation.setGroupID(groupID); +invitation.setRoomID(groupID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.GROUP_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"group-call\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + startGroupCall(credentials); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。 + +成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx new file mode 100644 index 0000000000..d983335caf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,64 @@ +--- +title: '发起单聊通话' +description: '使用 Android SDK 发起单聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +--- + +`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 + +## 参数说明 + +| 字段 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 | +| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | +| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | +| `groupID` | `String` | 是 | 单聊固定传空字符串。 | +| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | +| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 | +| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 | +| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 | +| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 | +| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 | +| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 | + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(Collections.singletonList(peerUserID)); +invitation.setGroupID(""); +invitation.setRoomID(roomID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.SINGLE_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"contact-card\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInvite( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。 + +只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。 diff --git a/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx b/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx new file mode 100644 index 0000000000..52cf8f4c9e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,46 @@ +--- +title: '音视频通话概览' +description: '了解 Android SDK 的音视频通话信令、房间信息和事件边界。' +sourcePath: '/sdk/android/calling/overview-calling' +--- + +Android SDK 的 `SignalingManager` 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。 + +应用需要把 SDK 返回的 `roomID`、`token` 和 `liveURL` 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。 + +## 通话流程 + +1. 调用 `signalingInvite()` 发起单聊通话,或调用 `signalingInviteInGroup()` 发起群聊通话。 +2. 被邀请方从 `onReceiveNewInvitation` 获取 `SignalingInfo`,选择接受或拒绝。 +3. 接受方调用 `signalingAccept()`,双方使用返回的房间凭据接入媒体引擎。 +4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。 +5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。 + +## 核心数据 + +| 数据 | 说明 | +| --- | --- | +| `SignalingInvitationInfo` | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 | +| `SignalingInfo` | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 | +| `SignalingCertificate` | OpenIMServer 返回的 `roomID`、`token`、`liveURL` 和忙线用户列表。 | +| `RoomCallingInfo` | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 | + +`customData` 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。 + +## 状态更新与事件归属 + +发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。 + +邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events);自定义信令见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。房间、凭据和待处理邀请查询只返回调用时的状态快照。 + +概览页不设置 listener。通话状态以 `roomID` 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。 + +## 按任务查找页面 + +| 任务 | 页面 | +| --- | --- | +| 发起单聊或群聊通话 | [发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)、[发起群聊通话](/sdk/android/calling/managing-calls/start-group-call) | +| 接受或拒绝邀请 | [接受通话](/sdk/android/calling/managing-calls/accept-call)、[拒绝通话](/sdk/android/calling/managing-calls/reject-call) | +| 取消邀请或挂断通话 | [取消通话邀请](/sdk/android/calling/managing-calls/cancel-call)、[挂断通话](/sdk/android/calling/managing-calls/hang-up-call) | +| 恢复房间或待处理邀请 | [查询群组通话房间](/sdk/android/calling/retrieving-call-information/get-room-by-group-id)、[获取通话房间 Token](/sdk/android/calling/retrieving-call-information/get-token-by-room-id)、[恢复启动前收到的通话邀请](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) | +| 处理通话事件和业务协商 | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)、[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx new file mode 100644 index 0000000000..dcfadafd97 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,30 @@ +--- +title: '查询群组通话房间' +description: '使用 Android SDK 按群组 ID 查询进行中的通话房间。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +--- + +`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`: + +```java +OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( + new OnBase() { + @Override + public void onSuccess(RoomCallingInfo room) { + if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { + renderParticipants(room.getParticipant()); + } + } + + @Override + public void onError(int code, String error) { + showNoActiveGroupCall(); + } + }, + groupID +); +``` + +成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 + +没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx new file mode 100644 index 0000000000..f49f7a0827 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,35 @@ +--- +title: '获取通话房间 Token' +description: '使用 Android SDK 按房间 ID 重新获取入会凭据。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +--- + +已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + if (credentials.getToken() != null + && credentials.getRoomID() != null) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + } + + @Override + public void onError(int code, String error) { + showCredentialError(code, error); + } + }, + roomID +); +``` + +成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。 + +房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx new file mode 100644 index 0000000000..c466e6033a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,30 @@ +--- +title: '恢复启动前收到的通话邀请' +description: '使用 Android SDK 恢复应用启动时尚未处理的通话邀请。' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +--- + +`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: + +```java +OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( + new OnBase() { + @Override + public void onSuccess(SignalingInfo info) { + if (info != null + && info.getInvitation() != null + && info.getInvitation().getRoomID() != null + && !info.getInvitation().getRoomID().isEmpty()) { + restoreIncomingCall(info); + } + } + + @Override + public void onError(int code, String error) { + clearExpiredIncomingCall(); + } + } +); +``` + +成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx new file mode 100644 index 0000000000..27854c43a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,64 @@ +--- +title: '发送自定义信令' +description: '使用 Android SDK 在通话房间中发送和接收自定义信令。' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +--- + +`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 + +## 发送信令 + +`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 + +```java +JSONObject signal = new JSONObject(); +signal.put("version", 1); +signal.put("eventID", eventID); +signal.put("type", "hand-raised"); +signal.put("userID", currentUserID); +signal.put("sentAt", System.currentTimeMillis()); + +OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( + new OnBase() { + @Override + public void onSuccess(String result) { + markSignalSent(eventID); + } + + @Override + public void onError(int code, String error) { + showSignalError(code, error); + } + }, + roomID, + signal.toString() +); +``` + +成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。 + +## 接收信令 + +`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面: + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + if (info == null || !activeRoomID.equals(info.getRoomID())) { + return; + } + + CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); + String mergeID = info.getRoomID() + ":" + signal.getEventID(); + if (hasAppliedSignal(mergeID)) { + return; + } + applyCallSignal(signal); +} +``` + +本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。 + +`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 + +客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx new file mode 100644 index 0000000000..9d5b035e1f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,26 @@ +--- +title: '清空会话消息' +description: '使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' +--- + +产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。 + +```java +OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationClearFailure(code, error); + } + } +); +``` + +成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx new file mode 100644 index 0000000000..6989af75e3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,28 @@ +--- +title: '重置群聊 @ 状态' +description: '使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。 + +```java +OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( + new OnBase() { + @Override + public void onSuccess(String data) { + markGroupMentionStateReset(conversationID); + } + + @Override + public void onError(int code, String error) { + recordGroupMentionResetFailure(code, error); + } + }, + conversationID +); +``` + +本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。 + +成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx new file mode 100644 index 0000000000..9e9f3c5c36 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,29 @@ +--- +title: '删除会话及消息' +description: '使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。 + +```java +OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationDeleteFailure(code, error); + } + }, + conversationID +); +``` + +成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 + +后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx new file mode 100644 index 0000000000..c189d9265c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,28 @@ +--- +title: '获取消息总未读数' +description: '使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。 + +```java +OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( + new OnBase() { + @Override + public void onSuccess(String value) { + int totalUnread = Integer.parseInt(value); + updateApplicationBadge(totalUnread); + } + + @Override + public void onError(int code, String error) { + recordTotalUnreadFailure(code, error); + } + } +); +``` + +回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 + +本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx new file mode 100644 index 0000000000..488aa5fad4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,28 @@ +--- +title: '隐藏会话' +description: '使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 + +```java +OpenIMClient.getInstance().conversationManager.hideConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationHideFailure(code, error); + } + }, + conversationID +); +``` + +该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 + +成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx new file mode 100644 index 0000000000..a126331ecf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,28 @@ +--- +title: '标记会话已读' +description: '使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。' +sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' +--- + +用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。 + +```java +OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationReadSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMarkReadFailure(code, error); + } + } +); +``` + +成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。 + +对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx new file mode 100644 index 0000000000..310288bcfc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,27 @@ +--- +title: '置顶或取消置顶会话' +description: '使用 pinConversation() 设置 Android 指定会话的置顶状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +OpenIMClient.getInstance().conversationManager.pinConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markPinRequestSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordConversationPinFailure(code, error); + } + }, + conversationID, + true +); +``` + +最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。 + +成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx new file mode 100644 index 0000000000..db690ccb80 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,27 @@ +--- +title: '设置阅后即焚时长' +description: '使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( + new OnBase() { + @Override + public void onSuccess(String data) { + markBurnDurationSubmitted(conversationID, 30); + } + + @Override + public void onError(int code, String error) { + recordBurnDurationFailure(code, error); + } + }, + conversationID, + 30 +); +``` + +`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。 + +成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx new file mode 100644 index 0000000000..29b1051927 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话草稿' +description: '使用 setConversationDraft() 保存 Android 会话草稿。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 + +```java +OpenIMClient.getInstance().conversationManager.setConversationDraft( + new OnBase() { + @Override + public void onSuccess(String data) { + markDraftSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordDraftSaveFailure(code, error); + } + }, + conversationID, + editorValue +); +``` + +清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx new file mode 100644 index 0000000000..a04da9cd63 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话扩展字段' +description: '使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 + +```java +OpenIMClient.getInstance().conversationManager.setConversationEx( + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationExtensionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationExtensionFailure(code, error); + } + }, + conversationID, + mergedExtensionJSON +); +``` + +成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx new file mode 100644 index 0000000000..9b4cc1a3d4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,33 @@ +--- +title: '定期删除服务端消息' +description: '使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' +--- + +`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。 + +```java +ConversationReq request = new ConversationReq(); +request.setMsgDestruct(true); +request.setMsgDestructTime(3600); + +OpenIMClient.getInstance().conversationManager.setConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markMessageDestructSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMessageDestructFailure(code, error); + } + }, + conversationID, + request +); +``` + +`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。 + +成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx new file mode 100644 index 0000000000..df9fe47afe --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,31 @@ +--- +title: '设置会话消息接收方式' +description: '使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( + new OnBase() { + @Override + public void onSuccess(String data) { + markReceiveOptionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordReceiveOptionFailure(code, error); + } + }, + conversationID, + 2 +); +``` + +| 数值 | 含义 | +| ---- | ---------------------------- | +| `0` | 正常接收消息并允许通知。 | +| `1` | 不接收该会话消息,也不通知。 | +| `2` | 接收该会话消息,但不通知。 | + +账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx new file mode 100644 index 0000000000..8e6096e451 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,27 @@ +--- +title: '开启或关闭阅后即焚' +description: '使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( + new OnBase() { + @Override + public void onSuccess(String data) { + markPrivateChatSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordPrivateChatFailure(code, error); + } + }, + conversationID, + true +); +``` + +传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。 + +成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx new file mode 100644 index 0000000000..ab61713832 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,63 @@ +--- +title: '会话概览' +description: '了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。' +sourcePath: '/sdk/android/conversation/overview-conversation' +--- + +会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。 + +群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。 + +## 会话标识 + +| 标识 | 用途 | +| ---------------- | ----------------------------------------------------------------------------- | +| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | +| `userID` | 单聊对方的用户 ID。 | +| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 | +| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 | + +单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。 + +## ConversationInfo + +| 字段 | 说明 | +| ----------------------------------- | ------------------------------------ | +| `conversationID` | 会话 ID。 | +| `conversationType` | 会话类型。 | +| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 | +| `showName` / `faceURL` | 会话列表显示名称和头像。 | +| `unreadCount` | 当前会话未读数。 | +| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 | +| `recvMsgOpt` | 当前会话消息接收方式。 | +| `groupAtType` | 群聊 @ 提醒状态。 | +| `draftText` / `draftTextTime` | 会话草稿及更新时间。 | +| `isPinned` | 是否置顶。 | +| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 | +| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 | +| `ex` | 业务约定的会话扩展字符串。 | + +## 查询和设置 + +- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) +- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) +- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id) +- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) +- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation) +- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension) +- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft) +- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option) +- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions) +- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) +- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) +- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat) +- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct) + +## 状态更新 + +查询方法建立会话快照,事件负责合并后续增量: + +- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。 +- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。 + +`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx new file mode 100644 index 0000000000..dc69577130 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,29 @@ +--- +title: '查询指定会话' +description: '使用 getOneConversation() 按用户或群组获取一个 Android 会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。 + +```java +OpenIMClient.getInstance().conversationManager.getOneConversation( + new OnBase() { + @Override + public void onSuccess(ConversationInfo conversation) { + openChatPage(conversation); + } + + @Override + public void onError(int code, String error) { + recordConversationOpenFailure(code, error); + } + }, + targetUserID, + ConversationType.SINGLE_CHAT +); +``` + +参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 + +成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx new file mode 100644 index 0000000000..d71b5e879e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,19 @@ +--- +title: '生成会话 ID' +description: '使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。 + +```java +String conversationID = OpenIMClient.getInstance().conversationManager + .getConversationIDBySessionType( + targetUserID, + ConversationType.SINGLE_CHAT + ); +``` + +`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 + +该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx new file mode 100644 index 0000000000..c5230cbe99 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,30 @@ +--- +title: '按 ID 批量获取会话' +description: '使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。 + +```java +OpenIMClient.getInstance().conversationManager.getMultipleConversation( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + for (ConversationInfo item : conversations) { + conversationStore.put(item.getConversationID(), item); + } + } + + @Override + public void onError(int code, String error) { + recordConversationQueryFailure(code, error); + } + }, + conversationIDs +); +``` + +调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 + +查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx new file mode 100644 index 0000000000..1bc528f9b7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,52 @@ +--- +title: '获取会话列表' +description: '使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。 + +## 分页获取会话 + +```java +OpenIMClient.getInstance().conversationManager.getConversationListSplit( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onError(int code, String error) { + recordConversationListFailure(code, error); + } + }, + 0, + 50 +); +``` + +| 参数 | 类型 | 说明 | +| -------- | ------ | ------------------------------------------- | +| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 | +| `count` | `long` | 本页期望返回的会话数量。 | + +成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。 + +## 保持列表同步 + +`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`: + +```java +@Override +public void onNewConversation(List conversations) { + mergeConversations(conversations); +} + +@Override +public void onConversationChanged(List conversations) { + mergeConversations(conversations); +} +``` + +两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。 diff --git a/content/zh/docs/chat/sdk/android/events/overview-events.mdx b/content/zh/docs/chat/sdk/android/events/overview-events.mdx new file mode 100644 index 0000000000..fbb9e7a665 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,118 @@ +--- +title: '事件概览' +description: '集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。' +sourcePath: '/sdk/android/events/overview-events' +--- + +OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 + +连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 集中设置 listener + +下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 + +```java +public final class OpenIMEventCenter { + private final OpenIMClient client = OpenIMClient.getInstance(); + + private final OnUserListener userListener = buildUserListener(); + private final OnFriendshipListener friendshipListener = buildFriendshipListener(); + private final OnConversationListener conversationListener = buildConversationListener(); + private final OnGroupListener groupListener = buildGroupListener(); + private final OnAdvanceMsgListener messageListener = buildMessageListener(); + private final OnCustomBusinessListener businessListener = buildBusinessListener(); + private final OnSignalingListener signalingListener = buildSignalingListener(); + + public void registerBeforeLogin() { + client.userInfoManager.setOnUserListener(userListener); + client.friendshipManager.setOnFriendshipListener(friendshipListener); + client.conversationManager.setOnConversationListener(conversationListener); + client.groupManager.setOnGroupListener(groupListener); + client.messageManager.setAdvancedMsgListener(messageListener); + client.messageManager.setCustomBusinessListener(businessListener); + client.signalingManager.setSignalingListener(signalingListener); + } +} +``` + +Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 + +## 事件归属 + +| 事件范围 | 合并标识 | 完整处理页面 | +| --- | --- | --- | +| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | +| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | +| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | +| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) | +| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | +| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) | +| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | +| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | + +查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 + +## 监听初始化同步 + +同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: + +```java +private OnConversationListener buildConversationListener() { + return new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeNewConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeChangedConversations(conversations); + } + + @Override + public void onTotalUnreadMessageCountChanged(int total) { + updateTotalUnreadCount(total); + } + + @Override + public void onConversationUserInputStatusChanged(String payload) { + handleInputStatus(payload); + } + + @Override + public void onSyncServerStart(boolean reinstall) { + setSyncState("syncing", 0, reinstall); + } + + @Override + public void onSyncServerProgress(long progress) { + setSyncProgress(progress); + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + setSyncState("ready", 100, reinstall); + reloadVisibleSnapshots(); + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + setSyncState("failed", 0, reinstall); + } + }; +} +``` + +`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 + +本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx new file mode 100644 index 0000000000..5083948c6c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -0,0 +1,44 @@ +--- +title: '跟踪文件上传进度' +description: '使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。' +sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' +--- + +Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 + +```java +OnPutFileListener uploadListener = new OnPutFileListener() { + @Override + public void open(long size) { + initializeUploadProgress(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void uploadPartComplete(long partNumber, long partSize, String partHash) { + markPartComplete(uploadTaskID, partNumber, partSize, partHash); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } +}; + +OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); +``` + +`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 + +业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 + +完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx new file mode 100644 index 0000000000..b0e10e9ffd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,54 @@ +--- +title: '上传文件' +description: '使用 Android SDK 独立上传文件并获取远端资源地址。' +sourcePath: '/sdk/android/file-uploads/upload-file' +--- + +`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 | +| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | +| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 | +| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 | +| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 | + +```java +File file = new File(localPath); +PutArgs args = new PutArgs(file.getAbsolutePath()); +args.name = file.getName(); +args.cuase = "user-avatar"; + +OpenIMClient.getInstance().uploadFile( + new OnBase() { + @Override + public void onSuccess(String result) { + finishUploadRequest(result); + } + + @Override + public void onError(int code, String error) { + showUploadError(code, error); + } + }, + new OnPutFileListener() { + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } + }, + args +); +``` + +每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。 + +`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx new file mode 100644 index 0000000000..a0d74ec748 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,188 @@ +--- +title: '认证与管理登录会话' +description: '使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。' +sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' +--- + +OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。 + +完整流程如下: + +1. 在应用级会话组件中创建稳定的 `OnConnListener`。 +2. 调用 `initSDK()` 并确认返回 `true`。 +3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 +4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。 +5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。 +6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。 + +下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。 + +## 初始化并处理连接生命周期 + +在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 + +```java +import android.app.Application; + +import java.io.File; + +import io.openim.android.sdk.OpenIMClient; +import io.openim.android.sdk.enums.LogLevel; +import io.openim.android.sdk.listener.OnConnListener; +import io.openim.android.sdk.models.InitConfig; + +File dataDirectory = new File(application.getFilesDir(), "openim"); +if (!dataDirectory.exists() && !dataDirectory.mkdirs()) { + throw new IllegalStateException("Cannot create the OpenIM data directory."); +} + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = LogLevel.Info; +config.isLogStandardOutput = false; + +OnConnListener connectionListener = new OnConnListener() { + @Override + public void onConnecting() { + sessionState.setConnectionState("connecting"); + } + + @Override + public void onConnectSuccess() { + sessionState.setConnectionState("connected"); + sessionState.enableConnectedOperations(); + } + + @Override + public void onConnectFailed(long code, String error) { + sessionState.setConnectionState("failed"); + recordConnectionFailure(code, error); + } + + @Override + public void onKickedOffline() { + sessionState.clearCurrentAccount(); + showSignedInElsewhereScreen(); + } + + @Override + public void onUserTokenExpired() { + requestNewTokenAndRelogin(); + } + + @Override + public void onUserTokenInvalid(String reason) { + sessionState.clearCurrentAccount(); + showSignInScreen(reason); + } +}; + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); + +if (!initialized) { + throw new IllegalStateException("OpenIMClientSDK initialization failed."); +} +``` + +`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。 + +| 字段 | 类型 | 说明 | +| --------------------- | ------------- | ---------------------------------------------------------- | +| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 | +| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 | +| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 | +| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 | +| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 | +| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 | + +SDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 + +## 在登录前设置业务 listener + +SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 + +SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 + +## 登录当前用户 + +```java +OpenIMClient.getInstance().login(new OnBase() { + @Override + public void onError(int code, String error) { + sessionState.setLoginState("failed"); + recordLoginFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.setLoginState("logged"); + sessionState.setCurrentUserID(userID); + } +}, userID, token); +``` + +`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。 + +## 查询登录状态 + +```java +int loginStatus = OpenIMClient.getInstance().getLoginStatus(); + +if (loginStatus == LoginStatus.Logged) { + String currentUserID = OpenIMClient.getInstance().getLoginUserID(); + restoreSessionFor(currentUserID); +} +``` + +| 状态 | 说明 | +| --------------------- | ---------------------------------------------------- | +| `LoginStatus.Logout` | SDK 当前未登录。 | +| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 | +| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 | + +`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 + +## 处理 Token 和强制下线 + +收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 + +这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 + +## 主动退出与释放 SDK + +```java +OpenIMClient.getInstance().logout(new OnBase() { + @Override + public void onError(int code, String error) { + recordLogoutFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.clearCurrentAccount(); + } +}); +``` + +`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。 + +应用最终不再使用 SDK 时可以调用: + +```java +OpenIMClient.getInstance().unInit(); +``` + +`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。 + +## 下一步 + +- [开始之前](/sdk/android/getting-started/before-you-start) +- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation) +- [发送第一条消息](/sdk/android/getting-started/send-first-message) diff --git a/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx new file mode 100644 index 0000000000..6a015cdf88 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -0,0 +1,57 @@ +--- +title: '开始之前' +description: '准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。' +sourcePath: '/sdk/android/getting-started/before-you-start' +--- + +在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。 + +## 准备 OpenIMServer + +如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址: + +| 字段 | 说明 | +| --------- | ------------------------------------------------------ | +| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | +| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | + +不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: + +```bash +adb reverse tcp:10002 tcp:10002 +adb reverse tcp:10001 tcp:10001 +``` + +映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 + +## 准备用户和 Token + +`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 + +后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: + +| 数据 | 说明 | +| --- | --- | +| `userID` | 当前登录用户的 OpenIM 用户 ID。 | +| `token` | 与该用户对应的登录 Token。 | +| `apiAddr` | OpenIMServer HTTP API 地址。 | +| `wsAddr` | OpenIMServer WebSocket 地址。 | + +`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 + +## 准备 Android 工程 + +接入前,确认 Android 工程具备以下条件: + +- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。 +- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。 +- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 +- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。 +- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 +- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 + +具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 继续接入 + +准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx new file mode 100644 index 0000000000..3d27fc3bbe --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -0,0 +1,33 @@ +--- +title: '按 Android 环境接入' +description: '在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。' +sourcePath: '/sdk/android/getting-started/environment-specific-implementation' +--- + +本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 添加 SDK 依赖 + +在应用 module 的 `build.gradle` 中添加依赖: + +```groovy +dependencies { + implementation 'io.openim:android-sdk:latest@aar' + implementation 'io.openim:core-sdk:latest@aar' + implementation 'com.google.code.gson:gson:2.9.0' +} +``` + +## 配置 Manifest + +应用需要网络访问权限: + +```xml + + +``` + +## 下一步 + +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [发送第一条消息](/sdk/android/getting-started/send-first-message) diff --git a/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx new file mode 100644 index 0000000000..05af8e0166 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -0,0 +1,104 @@ +--- +title: '发送第一条消息' +description: '在 Android 应用中发送并验证第一条单聊文本消息。' +sourcePath: '/sdk/android/getting-started/send-first-message' +--- + +本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。 + +## 开始前准备 + +- 为发送方和接收方各准备一个测试账号。 +- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 +- 将示例中的 `user_b` 替换为接收方的真实 `userID`。 + +## 第 1 步:让接收方监听新消息 + +接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 + +```java +OpenIMClient.getInstance() + .messageManager + .setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + // 将 message 显示在聊天界面中。 + } + }); +``` + +## 第 2 步:确认可以发送 + +两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。 + +## 第 3 步:发送文本消息 + +### 发送单聊文本消息 + +先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。 + +```java +Message message = OpenIMClient.getInstance() + .messageManager + .createTextMessage("你好,OpenIMSDK"); + +OnMsgSendCallback sendCallback = new OnMsgSendCallback() { + @Override + public void onProgress(long progress) { + // 文本消息通常不需要处理进度。 + } + + @Override + public void onError(int code, String error) { + // 提示发送失败,并允许用户重试。 + } + + @Override + public void onSuccess(Message sentMessage) { + // 将 sentMessage 更新到发送方的聊天界面。 + } +}; + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + message, + "user_b", + "", + new OfflinePushInfo() +); +``` + +`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 + +`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 + +### 发送群聊文本消息 + +发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`: + +```java +Message groupMessage = OpenIMClient.getInstance() + .messageManager + .createTextMessage("大家好,OpenIMSDK"); + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + groupMessage, + "", + "group_123", + new OfflinePushInfo() +); +``` + +一次调用只能填写 `userID` 或 `groupID` 其中之一。 + +## 验证成功 + +- 发送方进入 `onSuccess()`。 +- 接收方进入 `onRecvNewMessage()`,并看到文本消息。 +- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。 + +## 下一步 + +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [OpenIM Android SDK 概览](/sdk/android/overview) diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx new file mode 100644 index 0000000000..92c5b37c37 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,16 @@ +--- +title: '设置全员禁言' +description: '使用 changeGroupMute 开启或关闭群组全员禁言。' +sourcePath: '/sdk/android/group/change-group-mute' +--- + +使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } + @Override public void onError(int code, String error) { showGroupMuteError(error); } +}, groupID, true); +``` + +群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。 diff --git a/content/zh/docs/chat/sdk/android/group/create-group.mdx b/content/zh/docs/chat/sdk/android/group/create-group.mdx new file mode 100644 index 0000000000..f233608aec --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,23 @@ +--- +title: '创建群组' +description: '使用 createGroup 创建群资料并指定初始成员、管理员和群主。' +sourcePath: '/sdk/android/group/create-group' +--- + +使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。 + +```java +GroupInfo info = new GroupInfo(); +info.setGroupName("项目讨论"); +info.setIntroduction("仅限项目成员"); + +OpenIMClient.getInstance().groupManager.createGroup( + memberUserIDs, adminUserIDs, info, ownerUserID, + new OnBase() { + @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } + @Override public void onError(int code, String error) { showCreateError(error); } + } +); +``` + +群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。 diff --git a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx new file mode 100644 index 0000000000..4224a10244 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,16 @@ +--- +title: '解散群组' +description: '使用 dismissGroup 解散当前用户有权限管理的群组。' +sourcePath: '/sdk/android/group/dismiss-group' +--- + +`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 + +```java +OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { + @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } + @Override public void onError(int code, String error) { showDismissError(error); } +}, groupID); +``` + +最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx new file mode 100644 index 0000000000..15ea849e77 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,16 @@ +--- +title: '同意群申请' +description: '使用 acceptGroupApplication 同意指定用户的入群申请。' +sourcePath: '/sdk/android/group/group-applications/accept-group-application' +--- + +调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。 + +```java +OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "欢迎加入"); +``` + +同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx new file mode 100644 index 0000000000..8393c7f2a2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,18 @@ +--- +title: '获取发出的群申请' +description: '使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +--- + +使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。 + +```java +GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); +OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeSentApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx new file mode 100644 index 0000000000..363217b817 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,18 @@ +--- +title: '获取收到的群申请' +description: '使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +--- + +使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。 + +```java +GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); +OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeReceivedApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx new file mode 100644 index 0000000000..879a6b5f7c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -0,0 +1,9 @@ +--- +title: '群申请概览' +description: '说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。' +sourcePath: '/sdk/android/group/group-applications/overview-group-applications' +--- + +群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。 + +Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx new file mode 100644 index 0000000000..da3929960b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,16 @@ +--- +title: '拒绝群申请' +description: '使用 refuseGroupApplication 拒绝指定用户的入群申请。' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +--- + +拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。 + +```java +OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "当前群组人数已满"); +``` + +成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。 diff --git a/content/zh/docs/chat/sdk/android/group/join-group.mdx b/content/zh/docs/chat/sdk/android/group/join-group.mdx new file mode 100644 index 0000000000..8df82e8c90 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,16 @@ +--- +title: '申请加入群组' +description: '使用 joinGroup 提交入群申请或加入请求。' +sourcePath: '/sdk/android/group/join-group' +--- + +使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。 + +```java +OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { + @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } + @Override public void onError(int code, String error) { showJoinError(error); } +}, groupID, "希望加入项目讨论", 3, "{\"from\":\"search\"}"); +``` + +验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx new file mode 100644 index 0000000000..b7f69cd49d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,16 @@ +--- +title: '禁言或解除禁言群成员' +description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +--- + +`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { + @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberMuteError(error); } +}, groupID, userID, 3600L); +``` + +在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx new file mode 100644 index 0000000000..789b2e2c37 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,16 @@ +--- +title: '邀请用户入群' +description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +--- + +传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 + +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } + @Override public void onError(int code, String error) { showInviteError(error); } +}, groupID, inviteeUserIDs, "邀请加入项目讨论"); +``` + +成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx new file mode 100644 index 0000000000..2c0746b445 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,16 @@ +--- +title: '移除群成员' +description: '使用 kickGroupMember 将指定成员移出群组。' +sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' +--- + +`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 + +```java +OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { + @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } + @Override public void onError(int code, String error) { showRemovalError(error); } +}, groupID, memberUserIDs, "已不再参与该项目"); +``` + +收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx new file mode 100644 index 0000000000..989825ed52 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群成员头像' +description: '使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +--- + +群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setFaceURL(avatarURL); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx new file mode 100644 index 0000000000..aed46f645a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,21 @@ +--- +title: '设置群成员扩展字段' +description: '使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +--- + +`SetGroupMemberInfo.ex` 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setEx("{\"duty\":\"reviewer\"}"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +不要将凭据、令牌或仅限本机的显示状态写入该字段。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx new file mode 100644 index 0000000000..b5644f4a58 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群昵称' +description: '使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +--- + +成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setNickname("小林"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +以 `onGroupMemberInfoChanged` 返回的 `GroupMembersInfo.nickname` 更新显示。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx new file mode 100644 index 0000000000..4c7276d677 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,21 @@ +--- +title: '管理群管理员' +description: '使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +--- + +`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setRoleLevel(GroupRole.ADMIN); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showRoleError(error); } +}); +``` + +实际角色变更和权限由服务端校验,以成员资料变化事件为准。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx new file mode 100644 index 0000000000..a8370f10c0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,16 @@ +--- +title: '转让群主' +description: '使用 transferGroupOwner 将群主身份转让给指定群成员。' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +--- + +目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。 + +```java +OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { + @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } + @Override public void onError(int code, String error) { showTransferError(error); } +}, groupID, newOwnerUserID); +``` + +`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。 diff --git a/content/zh/docs/chat/sdk/android/group/overview-group.mdx b/content/zh/docs/chat/sdk/android/group/overview-group.mdx new file mode 100644 index 0000000000..55b60c0f40 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,33 @@ +--- +title: '群组概览' +description: '了解 Android SDK 中群资料、成员、申请和群组事件的职责。' +sourcePath: '/sdk/android/group/overview-group' +--- + +群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 + +`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。 + +```java +OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { + @Override public void onGroupInfoChanged(GroupInfo group) { + groupStore.put(group.getGroupID(), group); + } + + @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { + memberStore.put(member.getGroupID() + member.getUserID(), member); + } +}); +``` + +群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 + +## 主要能力 + +- [群资料与设置](/sdk/android/group/create-group) +- [群权限](/sdk/android/group/set-group-join-verification) +- [加入与退出群组](/sdk/android/group/join-group) +- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info) +- [群申请](/sdk/android/group/group-applications/overview-group-applications) +- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group) diff --git a/content/zh/docs/chat/sdk/android/group/quit-group.mdx b/content/zh/docs/chat/sdk/android/group/quit-group.mdx new file mode 100644 index 0000000000..be4a35e7ce --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,16 @@ +--- +title: '退出群组' +description: '使用 quitGroup 让当前登录用户退出指定群组。' +sourcePath: '/sdk/android/group/quit-group' +--- + +`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。 + +```java +OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { + @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } + @Override public void onError(int code, String error) { showQuitError(error); } +}, groupID); +``` + +请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx new file mode 100644 index 0000000000..f364f78db8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群成员列表' +description: '使用 getGroupMemberList 按角色和分页条件读取群成员。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +--- + +`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberList( + new OnBase>() { + @Override public void onSuccess(List members) { appendMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, 0, offset, 50); +``` + +分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx new file mode 100644 index 0000000000..688906b0b2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群主和管理员' +description: '使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +--- + +使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( + new OnBase>() { + @Override public void onSuccess(List members) { showModerators(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID); +``` + +`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx new file mode 100644 index 0000000000..1b3a030a06 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群成员资料' +description: '使用 getGroupMembersInfo 批量读取指定成员在群内的资料。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +--- + +`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMembersInfo( + new OnBase>() { + @Override public void onSuccess(List members) { mergeMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, userIDs); +``` + +返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx new file mode 100644 index 0000000000..db3243966b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,16 @@ +--- +title: '检查用户是否在群内' +description: '使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +--- + +`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 + +```java +OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { + @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}, groupID, candidateUserIDs); +``` + +需要昵称、角色或禁言状态时,再调用“获取群成员资料”。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx new file mode 100644 index 0000000000..77b68f84ea --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -0,0 +1,9 @@ +--- +title: '群成员查询概览' +description: '说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。' +sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' +--- + +成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 + +成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx new file mode 100644 index 0000000000..b85d2d3f91 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: '搜索群成员' +description: '使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +--- + +指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 + +```java +OpenIMClient.getInstance().groupManager.searchGroupMembers( + new OnBase>() { + @Override public void onSuccess(List members) { showMemberSearch(members); } + @Override public void onError(int code, String error) { showSearchError(error); } + }, groupID, Collections.singletonList(keyword), true, true, 0, 20); +``` + +搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx new file mode 100644 index 0000000000..b5dce64676 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,16 @@ +--- +title: '分页获取已加入群组' +description: '使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +--- + +Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 + +```java +OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { + @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } + @Override public void onError(int code, String error) { showPageError(error); } +}, offset, 20); +``` + +使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx new file mode 100644 index 0000000000..97c8eaaff6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,16 @@ +--- +title: '获取群资料' +description: '使用 getGroupsInfo 批量查询指定群组的最新资料。' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +--- + +已持有一组 `groupID` 时,使用 `getGroupsInfo()` 查询群资料。结果是 `GroupInfo` 列表,不能依赖响应顺序与请求列表完全一致。 + +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onError(int code, String error) { showGroupQueryError(error); } +}, groupIDs); +``` + +先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx new file mode 100644 index 0000000000..a495b3e12c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,16 @@ +--- +title: '检查是否加入群组' +description: '使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +--- + +`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。 + +```java +OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { + @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}); +``` + +该结果不替代群资料查询,也不能用于判断其他用户是否在群内。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx new file mode 100644 index 0000000000..6c3d3472d7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,16 @@ +--- +title: '搜索群组' +description: '使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +--- + +`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 + +```java +OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { + @Override public void onSuccess(List groups) { showSearchResults(groups); } + @Override public void onError(int code, String error) { showSearchError(error); } +}, Collections.singletonList(keyword), true, true); +``` + +搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx new file mode 100644 index 0000000000..358f31067c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,20 @@ +--- +title: '发布群公告' +description: '通过 GroupInfo.notification 发布或更新群公告。' +sourcePath: '/sdk/android/group/set-group-announcement' +--- + +Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNotification("今晚 20:00 进行版本发布确认。"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } + @Override public void onError(int code, String error) { showAnnouncementError(error); } +}); +``` + +公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx new file mode 100644 index 0000000000..5a3f42d309 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,20 @@ +--- +title: '设置群扩展字段' +description: '通过 GroupInfo.ex 保存应用定义的群组扩展数据。' +sourcePath: '/sdk/android/group/set-group-extension' +--- + +`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } + @Override public void onError(int code, String error) { showExtensionError(error); } +}); +``` + +不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx new file mode 100644 index 0000000000..04c67d00a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,20 @@ +--- +title: '设置入群验证方式' +description: '通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。' +sourcePath: '/sdk/android/group/set-group-join-verification' +--- + +入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } + @Override public void onError(int code, String error) { showVerificationError(error); } +}); +``` + +该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx new file mode 100644 index 0000000000..595cc08ede --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,20 @@ +--- +title: '设置成员好友申请权限' +description: '通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +--- + +`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setApplyMemberFriend(0); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx new file mode 100644 index 0000000000..82a448d4b9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,20 @@ +--- +title: '设置成员资料查看权限' +description: '通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +--- + +`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setLookMemberInfo(1); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。 diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx new file mode 100644 index 0000000000..9ed87d5dfd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群资料' +description: '使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。' +sourcePath: '/sdk/android/group/update-group-profile' +--- + +使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setGroupName("移动端项目组"); +update.setIntroduction("Android 与 iOS 协作群"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } + @Override public void onError(int code, String error) { showGroupUpdateError(error); } +}); +``` + +最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。 diff --git a/content/zh/docs/chat/sdk/android/logger.mdx b/content/zh/docs/chat/sdk/android/logger.mdx new file mode 100644 index 0000000000..7e40da542f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/logger.mdx @@ -0,0 +1,112 @@ +--- +title: '日志' +description: '配置 Android SDK 日志、写入应用诊断信息并上传日志。' +sourcePath: '/sdk/android/logger' +--- + +OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 + +## 初始化日志配置 + +日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置: + +```java +File dataDirectory = new File(application.getFilesDir(), "openim"); +File logDirectory = new File(application.getFilesDir(), "openim-logs"); + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; +config.isLogStandardOutput = BuildConfig.DEBUG; +config.logFilePath = logDirectory.getAbsolutePath(); + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); +``` + +| 字段 | 说明 | +| --- | --- | +| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 | +| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | +| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | + +开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。 + +## 写入应用诊断日志 + +需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载: + +```java +OpenIMClient.getInstance().logs( + LogLevel.Error, + ChatRepository.class.getSimpleName(), + 184, + "send_message_failed", + errorMessage, + "conversationID", conversationID, + "clientMsgID", clientMsgID +); +``` + +`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。 + +旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。 + +## 上传诊断日志 + +只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。 + +```java +String uploadID = UUID.randomUUID().toString(); + +OpenIMClient.getInstance().uploadLogs( + new OnBase() { + @Override + public void onSuccess(String data) { + showLogUploadCompleted(); + } + + @Override + public void onError(int code, String error) { + showLogUploadError(code, error); + } + }, + Collections.emptyList(), + 2000, + uploadID, + "support-ticket-42", + new UploadLogProgress() { + @Override + public void onProgress(long current, long total) { + updateLogUploadProgress(current, total); + } + } +); +``` + +| 参数 | 说明 | +| --- | --- | +| `line` | 本次上传读取的日志行数配置。 | +| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 | +| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | +| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 | + +成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 + +## operationID 与业务追踪 + +Android Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 + +应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 + +## 相关页面 + +- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation) +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [发送消息](/sdk/android/message/sending-messages/send-message) diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx new file mode 100644 index 0000000000..373932fa94 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,33 @@ +--- +title: '更新输入状态' +description: '使用 typingStatusUpdate 提示单聊对方当前正在输入。' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +--- + +输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 + +```java +messageManager.typingStatusUpdate(callback, peerUserID, "typing"); +``` + +成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: + +```java +@Override +public void onConversationUserInputStatusChanged(String payload) { + InputStatesChangedData state = JsonUtil.toObj( + payload, + InputStatesChangedData.class + ); + if (state == null || state.getConversationID() == null) { + return; + } + updateTypingState( + state.getConversationID(), + state.getUserID(), + state.getPlatformIDs() + ); +} +``` + +输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx new file mode 100644 index 0000000000..09c8ceef54 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建名片消息' +description: '使用 createCardMessage 创建联系人名片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-card-message' +--- + +`CardElem` 保存名片用户的展示资料。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx new file mode 100644 index 0000000000..75470bcac6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建自定义消息' +description: '使用 createCustomMessage 承载业务定义的 JSON 消息。' +sourcePath: '/sdk/android/message/creating-messages/create-custom-message' +--- + +`data`、`extension` 和 `description` 由业务定义,接收端应按自己的协议解析。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createCustomMessage( + dataJson, extensionJson, description); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx new file mode 100644 index 0000000000..c803bbacc7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建表情消息' +description: '使用 createFaceMessage 创建自定义表情消息。' +sourcePath: '/sdk/android/message/creating-messages/create-face-message' +--- + +`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx new file mode 100644 index 0000000000..a08758fce1 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '从文件创建文件消息' +description: '使用相对路径或绝对路径创建文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +--- + +文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessageFromFullPath(filePath, fileName); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx new file mode 100644 index 0000000000..2ce7b0a895 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '从 URL 创建文件消息' +description: '使用 FileElem 创建已上传资源的文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +--- + +`FileElem` 应包含远端 URL、文件名和文件大小。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx new file mode 100644 index 0000000000..c7140fff6a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建转发消息' +description: '使用 createForwardMessage 创建转发消息。' +sourcePath: '/sdk/android/message/creating-messages/create-forward-message' +--- + +传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx new file mode 100644 index 0000000000..b01ed5ea73 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,11 @@ +--- +title: '从文件创建图片消息' +description: '使用相对路径或绝对路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +--- + +缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx new file mode 100644 index 0000000000..e789e2283f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,12 @@ +--- +title: '从 URL 创建图片消息' +description: '使用 createImageMessageByURL 创建已上传资源的图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +--- + +准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageByURL( + sourceURL, sourcePicture, bigPicture, snapshotPicture); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx new file mode 100644 index 0000000000..d4b9115a1e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建位置消息' +description: '使用 createLocationMessage 创建经纬度和描述位置消息。' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +--- + +经纬度使用十进制度数,描述用于地图或列表展示。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createLocationMessage(latitude, longitude, description); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx new file mode 100644 index 0000000000..a1526dfaed --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建合并消息' +description: '使用 createMergerMessage 将多条消息合并为一条摘要消息。' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +--- + +传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( + messages, title, summaries); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx new file mode 100644 index 0000000000..498b2717ce --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建引用消息' +description: '使用 createQuoteMessage 创建引用已有消息的回复。' +sourcePath: '/sdk/android/message/creating-messages/create-quote-message' +--- + +引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createQuoteMessage(replyText, quotedMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx new file mode 100644 index 0000000000..5c3ee21b12 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '从文件创建音频消息' +description: '使用相对路径或绝对路径创建音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +--- + +音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessageFromFullPath(soundPath, durationSeconds); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx new file mode 100644 index 0000000000..f647e57883 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '从 URL 创建音频消息' +description: '使用 SoundElem 创建已上传资源的音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +--- + +`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx new file mode 100644 index 0000000000..61732847ed --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建 @ 消息' +description: '使用 createTextAtMessage 创建带成员提醒的文本消息。' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +--- + +传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( + text, userIDs, atUserInfos, quoteMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx new file mode 100644 index 0000000000..080407ba62 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建文本消息' +description: '使用 createTextMessage 创建文本 Message。' +sourcePath: '/sdk/android/message/creating-messages/create-text-message' +--- + +`createTextMessage()` 只创建本地消息对象,不发送消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx new file mode 100644 index 0000000000..1de9a128c6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '从文件创建视频消息' +description: '使用相对路径或绝对路径创建视频消息及缩略图。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +--- + +视频方法需要 MIME 类型、时长和缩略图路径。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + videoPath, mimeType, durationSeconds, snapshotPath); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx new file mode 100644 index 0000000000..8f15837c33 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '从 URL 创建视频消息' +description: '使用 VideoElem 创建已上传资源的视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +--- + +将远端视频及缩略图信息填入 `VideoElem` 后创建消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx new file mode 100644 index 0000000000..8c35a9aea7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '清空全部本地消息' +description: '使用 deleteAllMsgFromLocal 清理当前设备的全部消息。' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +--- + +该操作只清理当前设备本地缓存,不删除服务端记录。 + +```java +messageManager.deleteAllMsgFromLocal(callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx new file mode 100644 index 0000000000..cdcb7102f0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '清空全部已保存消息' +description: '使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +--- + +这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。 + +```java +messageManager.deleteAllMsgFromLocalAndSvr(callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx new file mode 100644 index 0000000000..dd06859d57 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,11 @@ +--- +title: '删除本地消息' +description: '使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +--- + +该操作不影响其他设备和其他用户的消息记录。 + +```java +messageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx new file mode 100644 index 0000000000..846606b0cd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '删除已保存消息' +description: '使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +--- + +删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 + +```java +messageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx new file mode 100644 index 0000000000..faccb79cd4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,14 @@ +--- +title: '查看置顶消息' +description: '使用 getConversationPinnedMsgs 查询会话中的置顶消息。' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +--- + +查询结果是指定会话当前的置顶消息快照。 + +```java +messageManager.getConversationPinnedMsgs(new OnBase>() { + @Override public void onSuccess(List messages) { showPinned(messages); } + @Override public void onError(int code, String error) { showPinnedError(error); } +}, conversationID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx new file mode 100644 index 0000000000..fe438ba7c7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,11 @@ +--- +title: '插入本地群聊消息' +description: '使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +--- + +传入群 ID 与发送者 ID,消息不会同步到其他设备。 + +```java +messageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx new file mode 100644 index 0000000000..398f05f14a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,11 @@ +--- +title: '插入本地单聊消息' +description: '使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。' +sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' +--- + +该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。 + +```java +messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx new file mode 100644 index 0000000000..5faba1be23 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,11 @@ +--- +title: '修改消息' +description: '使用 ModifyMessageReq 修改支持修改的消息内容。' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +--- + +请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。 + +```java +messageManager.modifyMessage(callback, modifyRequest); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx new file mode 100644 index 0000000000..315f117125 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,11 @@ +--- +title: '撤回消息' +description: '使用 revokeMessageV2 撤回已发送消息。' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +--- + +Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。 + +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx new file mode 100644 index 0000000000..c991a22e6a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,11 @@ +--- +title: '设置消息本地扩展字段' +description: '使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +--- + +`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 + +```java +messageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx new file mode 100644 index 0000000000..308db6a098 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,11 @@ +--- +title: '置顶或取消置顶消息' +description: '使用 setConversationPinnedMsg 设置会话消息的置顶状态。' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +--- + +最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。 + +```java +messageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true); +``` diff --git a/content/zh/docs/chat/sdk/android/message/overview-message.mdx b/content/zh/docs/chat/sdk/android/message/overview-message.mdx new file mode 100644 index 0000000000..57abdea9ad --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/overview-message.mdx @@ -0,0 +1,15 @@ +--- +title: '消息概览' +description: '了解 Android SDK 的 Message 模型、消息生命周期和消息监听。' +sourcePath: '/sdk/android/message/overview-message' +--- + +Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 + +```java +OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +}); +``` + +查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx new file mode 100644 index 0000000000..f1154c2d43 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,17 @@ +--- +title: '接收自定义业务消息' +description: '使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +--- + +自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。 + +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } +}); +``` + +本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 + +`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx new file mode 100644 index 0000000000..aba5b08446 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,14 @@ +--- +title: '接收消息' +description: '使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。' +sourcePath: '/sdk/android/message/receiving-messages/receive-messages' +--- + +设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。 + +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } + @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } +}); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx new file mode 100644 index 0000000000..381f4ab42c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,14 @@ +--- +title: '按 ID 查询消息' +description: '使用 findMessageList 按 SearchParams 查询消息记录。' +sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' +--- + +构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 + +```java +messageManager.findMessageList(new OnBase() { + @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } + @Override public void onError(int code, String error) { showQueryError(error); } +}, searchParams); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx new file mode 100644 index 0000000000..8ae412f2cb --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '加载更新消息' +description: '使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。' +sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' +--- + +该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 + +```java +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx new file mode 100644 index 0000000000..7f6fa2a448 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '加载更早消息' +description: '使用 getAdvancedHistoryMessageList 分页加载会话历史消息。' +sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' +--- + +首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。 + +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL); +``` diff --git a/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx new file mode 100644 index 0000000000..df7132f4c3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,12 @@ +--- +title: '搜索消息' +description: '使用 searchLocalMessages 搜索当前账号已同步到本地的消息。' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +--- + +可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。 + +```java +messageManager.searchLocalMessages(callback, conversationID, keywords, 1, + senderIDs, messageTypes, 0, 0, 0, 20); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx new file mode 100644 index 0000000000..86bbd1a9fb --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,11 @@ +--- +title: '发送非 OSS 消息' +description: '使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +--- + +消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 + +```java +messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx new file mode 100644 index 0000000000..e14f1ddc5e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,14 @@ +--- +title: '发送消息' +description: '使用 sendMessage 将 Message 发送到单聊或群聊。' +sourcePath: '/sdk/android/message/sending-messages/send-message' +--- + +单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。 + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onSuccess(String id) { mergeSentMessage(message); } + @Override public void onError(int code, String error) { showSendError(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx new file mode 100644 index 0000000000..107d841dff --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,15 @@ +--- +title: '跟踪消息发送进度' +description: '通过 OnMsgSendCallback 的进度回调更新媒体发送进度。' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +--- + +Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。 + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onProgress(long progress) { updateProgress(progress); } + @Override public void onSuccess(String id) { finishProgress(); } + @Override public void onError(int code, String error) { failProgress(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/overview.mdx b/content/zh/docs/chat/sdk/android/overview.mdx new file mode 100644 index 0000000000..448e3fa4e4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/overview.mdx @@ -0,0 +1,21 @@ +--- +title: 'OpenIM Android SDK 概览' +description: '在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。' +sourcePath: '/sdk/android/overview' +--- + +OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。 + +## 文档导航 + +| 领域 | 内容 | +| --- | --- | +| [快速开始](/sdk/android/getting-started/environment-specific-implementation) | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 | +| [用户与关系链](/sdk/android/user/overview-user) | 用户资料、在线状态、好友、好友申请和黑名单。 | +| [会话](/sdk/android/conversation/overview-conversation) | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 | +| [群组](/sdk/android/group/overview-group) | 群资料、群成员、入群申请、权限、禁言和群组事件。 | +| [消息](/sdk/android/message/overview-message) | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 | +| [文件上传](/sdk/android/file-uploads/upload-file) | 独立文件上传和上传进度。 | +| [音视频通话](/sdk/android/calling/overview-calling) | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 | +| [事件](/sdk/android/events/overview-events) | 各 manager 的 listener、连接状态和数据事件。 | +| [日志](/sdk/android/logger) | SDK 日志配置和排查。 | diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx new file mode 100644 index 0000000000..ef8e11487b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -0,0 +1,36 @@ +--- +title: '拉黑用户' +description: '使用 addBlacklist() 将用户加入当前账号黑名单。' +sourcePath: '/sdk/android/user/blacklist/add-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRequestSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistAddFailure(code, error); + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 + +黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。 + +`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo user) { + blacklistStore.put(user.getUserID(), user); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx new file mode 100644 index 0000000000..19443fc3b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,50 @@ +--- +title: '获取黑名单列表' +description: '使用 getBlacklist() 获取当前用户的黑名单。' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 + +## 获取黑名单 + +完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 + +```java +OpenIMClient.getInstance().friendshipManager.getBlacklist( + new OnBase>() { + @Override + public void onSuccess(List users) { + blacklistStore.replace(users); + } + + @Override + public void onError(int code, String error) { + recordBlacklistFailure(code, error); + } + } +); +``` + +成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。 + +## 黑名单记录字段 + +`BlacklistInfo` 的常用字段如下: + +| 字段 | 说明 | +| ---------------- | ------------------------------------------------- | +| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | +| `nickname` | 目标用户昵称快照。 | +| `faceURL` | 目标用户头像地址。 | +| `gender` | 目标用户性别值。 | +| `operatorUserID` | 执行拉黑操作的用户 ID。 | +| `createTime` | 黑名单关系创建时间。 | +| `addSource` | 黑名单关系的添加来源。 | +| `ex` | 黑名单关系扩展字符串。 | + +如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。 + +黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。 + +首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。 diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx new file mode 100644 index 0000000000..f19628f9a3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -0,0 +1,33 @@ +--- +title: '取消拉黑用户' +description: '使用 removeBlacklist() 将用户移出当前账号黑名单。' +sourcePath: '/sdk/android/user/blacklist/remove-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.removeBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRemovalSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistRemovalFailure(code, error); + } + }, + targetUserID +); +``` + +成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。 + +`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + blacklistStore.remove(user.getUserID()); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx new file mode 100644 index 0000000000..a4d9c88512 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -0,0 +1,25 @@ +--- +title: '接受好友申请' +description: '使用 acceptFriendApplication() 接受好友申请。' +sourcePath: '/sdk/android/user/friend-applications/accept-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationAccepted(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationAcceptFailure(code, error); + } + }, + applicantUserID, + "已通过" +); +``` + +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx new file mode 100644 index 0000000000..e016f501dc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -0,0 +1,27 @@ +--- +title: '发送好友申请' +description: '使用 addFriend() 向指定用户发送好友申请。' +sourcePath: '/sdk/android/user/friend-applications/add-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendApplicationSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendApplicationFailure(code, error); + } + }, + "user_b", + "你好,我是 Alex" +); +``` + +第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 + +好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx new file mode 100644 index 0000000000..788d2bfee8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,68 @@ +--- +title: '获取收到的好友申请' +description: '使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。' +sourcePath: '/sdk/android/user/friend-applications/get-recv-friend-application-list' +--- + +```java +GetFriendApplicationListAsRecipientReq request = + new GetFriendApplicationListAsRecipientReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceReceivedApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordReceivedApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。 + +| 字段 | 说明 | +| --------------------------------------------- | ---------------------------------------------- | +| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 | +| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 | +| `reqMsg` | 申请附言。 | +| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 | +| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 | +| `handleMsg` | 处理附言。 | +| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 | +| `createTime` | 申请记录创建时间。 | +| `ex` | 申请记录扩展字符串。 | + +好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onFriendApplicationAdded(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationAccepted(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationRejected(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationDeleted(FriendApplicationInfo application) { + friendApplicationStore.remove( + application.getFromUserID(), + application.getToUserID() + ); +} +``` + +按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx new file mode 100644 index 0000000000..8379e69e7e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -0,0 +1,29 @@ +--- +title: '获取发出的好友申请' +description: '使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。' +sourcePath: '/sdk/android/user/friend-applications/get-send-friend-application-list' +--- + +```java +GetFriendApplicationListAsApplicantReq request = + new GetFriendApplicationListAsApplicantReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceSentApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordSentApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。 + +发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx new file mode 100644 index 0000000000..99dcfee3b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -0,0 +1,25 @@ +--- +title: '拒绝好友申请' +description: '使用 refuseFriendApplication() 拒绝好友申请。' +sourcePath: '/sdk/android/user/friend-applications/refuse-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationRejected(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationRejectFailure(code, error); + } + }, + applicantUserID, + "暂不添加" +); +``` + +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx new file mode 100644 index 0000000000..b9d5364cb8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -0,0 +1,26 @@ +--- +title: '检查好友关系' +description: '使用 checkFriend() 检查指定用户是否为当前用户的好友。' +sourcePath: '/sdk/android/user/friends/check-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.checkFriend( + new OnBase>() { + @Override + public void onSuccess(List relations) { + showFriendshipStates(relations); + } + + @Override + public void onError(int code, String error) { + recordFriendshipCheckFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b") +); +``` + +成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 + +该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx new file mode 100644 index 0000000000..f8325020e4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -0,0 +1,24 @@ +--- +title: '删除好友' +description: '使用 deleteFriend() 删除当前用户的一条好友关系。' +sourcePath: '/sdk/android/user/friends/delete-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.deleteFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendDeletionSubmitted(friendUserID); + } + + @Override + public void onError(int code, String error) { + recordFriendDeletionFailure(code, error); + } + }, + friendUserID +); +``` + +成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx new file mode 100644 index 0000000000..c804c69daa --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,66 @@ +--- +title: '分页获取好友列表' +description: '使用 getFriendListPage() 分页获取当前用户的好友列表。' +sourcePath: '/sdk/android/user/friends/get-friend-list-page' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendListPage( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendListFailure(code, error); + } + }, + 0, + 40, + true +); +``` + +参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。 + +只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。 + +## 好友资料字段 + +`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下: + +| 字段 | 说明 | +| ---------------- | ------------------------------------- | +| `userID` | 好友用户 ID,也是好友列表的稳定标识。 | +| `nickname` | 好友账号昵称。 | +| `faceURL` | 好友账号头像地址。 | +| `remark` | 当前账号设置的好友备注。 | +| `ex` | 好友关系扩展字符串。 | +| `addSource` | 好友关系添加来源。 | +| `operatorUserID` | 建立或更新关系的操作用户 ID。 | +| `createTime` | 好友关系创建时间。 | + +`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。 + +本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + friendStore.remove(friend.getUserID()); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx new file mode 100644 index 0000000000..7000e76a0e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -0,0 +1,31 @@ +--- +title: '查询指定好友资料' +description: '使用 getFriendsInfo() 查询指定用户的好友关系资料。' +sourcePath: '/sdk/android/user/friends/get-friends-info' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendsInfo( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendInfoFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b"), + true +); +``` + +第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。 + +当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。 + +该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx new file mode 100644 index 0000000000..c2906f3348 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -0,0 +1,29 @@ +--- +title: '搜索好友' +description: '使用 searchFriends() 搜索当前用户的好友。' +sourcePath: '/sdk/android/user/friends/search-friends' +--- + +```java +OpenIMClient.getInstance().friendshipManager.searchFriends( + new OnBase>() { + @Override + public void onSuccess(List results) { + showFriendSearchResults(results); + } + + @Override + public void onError(int code, String error) { + recordFriendSearchFailure(code, error); + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。 + +成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx new file mode 100644 index 0000000000..2e60882934 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -0,0 +1,37 @@ +--- +title: '更新好友资料' +description: '使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。' +sourcePath: '/sdk/android/user/friends/update-friends' +--- + +```java +UpdateFriendsReq request = new UpdateFriendsReq(); +request.setFriendUserIDs(new String[] { friendUserID }); +request.setRemark(remark.trim()); + +OpenIMClient.getInstance().friendshipManager.updateFriendsReq( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendUpdateFailure(code, error); + } + }, + request +); +``` + +`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。 + +| 字段 | 说明 | +| --------------- | ---------------------------------- | +| `friendUserIDs` | 待更新的好友 ID 数组。 | +| `remark` | 当前账号设置的好友备注。 | +| `isPinned` | 是否置顶好友。 | +| `ex` | 好友关系扩展字符串,按完整值覆盖。 | + +成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx new file mode 100644 index 0000000000..906c4b4045 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,25 @@ +--- +title: '查询已订阅用户状态' +description: '使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。' +sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusQueryFailure(code, error); + } + } +); +``` + +该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。 + +查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx new file mode 100644 index 0000000000..5e8e963d45 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -0,0 +1,45 @@ +--- +title: '订阅用户在线状态' +description: '使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。' +sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' +--- + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusSubscriptionFailure(code, error); + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。 + +## 状态字段 + +| 字段 | 说明 | +| ------------- | ------------------------------------------ | +| `userID` | 目标用户 ID。 | +| `status` | 在线状态值,具体枚举含义以服务端契约为准。 | +| `platformIDs` | 当前在线的平台 ID 列表。 | + +`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus status) { + onlineStatusStore.put(status.getUserID(), status); +} +``` + +订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx new file mode 100644 index 0000000000..cb4d3311f3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -0,0 +1,55 @@ +--- +title: '用户概览' +description: '了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。' +sourcePath: '/sdk/android/user/overview-user' +--- + +OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 + +群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 + +## 用户类型 + +Android SDK 会根据使用场景返回不同的用户对象: + +| 类型 | 适用场景 | 主要 API | +| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` | +| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` | +| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | +| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | +| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | +| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | +| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` | + +同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 + +所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。 + +## 功能入口 + +下表列出了用户相关的常见需求和对应页面: + +| 需求 | 推荐页面 | +| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) | +| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) | +| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) | +| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) | +| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | +| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | + +## 状态更新 + +用户相关事件由对应能力页负责监听和合并: + +- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 +- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 +- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 +- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。 +- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 + +Android SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx new file mode 100644 index 0000000000..ba1e47677b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,39 @@ +--- +title: '获取当前用户资料' +description: '使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。' +sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( + new OnBase() { + @Override + public void onSuccess(LocalUser user) { + currentUserStore.set(user); + } + + @Override + public void onError(int code, String error) { + recordSelfProfileFailure(code, error); + } + } +); +``` + +完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。 + +## 返回结果 + +| 字段 | 说明 | +| --------------------- | -------------------------------------------------------------- | +| `userID` | 当前登录用户 ID。 | +| `nickname` | 当前账号昵称。 | +| `faceURL` | 当前账号头像地址。 | +| `ex` | 当前账号扩展字符串。 | +| `attachedInfo` | SDK 附加信息,只按业务约定解析。 | +| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 | +| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 | + +查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 + +`getSelfUserInfo()` 已废弃,不作为推荐用法。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx new file mode 100644 index 0000000000..ecda2545f8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,48 @@ +--- +title: '获取指定用户资料' +description: '使用 getUsersInfo() 按 userID 批量查询用户公开资料。' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.getUsersInfo( + new OnBase>() { + @Override + public void onSuccess(List users) { + for (PublicUserInfo user : users) { + publicUserStore.put(user.getUserID(), user); + } + } + + @Override + public void onError(int code, String error) { + recordUserQueryFailure(code, error); + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。 + +## 返回结果 + +| 字段 | 说明 | +| ------------ | ---------------------------------------- | +| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 | +| `nickname` | 账号级公开昵称。 | +| `faceURL` | 账号级公开头像地址。 | +| `ex` | 账号级公开扩展字符串,格式由业务约定。 | +| `createTime` | 用户资料创建时间。 | + +`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。 + +按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。 + +## 资料刷新 + +查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx new file mode 100644 index 0000000000..6b8608767f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -0,0 +1,37 @@ +--- +title: '设置全局消息接收方式' +description: '通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。 + +```java +UserInfoReq request = new UserInfoReq(); +request.setGlobalRecvMsgOpt(2); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markGlobalReceiveOptionSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordGlobalReceiveOptionFailure(code, error); + } + }, + request +); +``` + +| 数值 | 含义 | +| ---- | ------------------------ | +| `0` | 正常接收消息并允许通知。 | +| `1` | 屏蔽消息。 | +| `2` | 接收消息但不提示。 | + +如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 + +成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx new file mode 100644 index 0000000000..0378abf4a0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,55 @@ +--- +title: '更新当前用户资料' +description: '使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。 + +```java +UserInfoReq request = new UserInfoReq(); +request.setNickname(displayName.trim()); +request.setFaceURL(avatarURL); +request.setEx(mergedExtra); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markProfileUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordProfileUpdateFailure(code, error); + } + }, + request +); +``` + +`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 + +成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。 + +## 更新字段 + +| 字段 | 说明 | +| --------------------- | ------------------ | +| `nickname` | 要更新的昵称。 | +| `faceURL` | 要更新的头像地址。 | +| `ex` | 完整扩展字符串。 | +| `addFriendPermission` | 添加好友权限值。 | + +一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 + +`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + currentUserStore.merge(info.getUserID(), info); +} +``` + +账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json new file mode 100644 index 0000000000..7705f7517e --- /dev/null +++ b/data/structure/android-content-audit.json @@ -0,0 +1,4520 @@ +{ + "schemaVersion": 1, + "sources": { + "openimDocs": { + "repository": "https://github.com/openimsdk/docs", + "commit": "efd0f251b288167e1ca617504b10dd73986429f0" + }, + "androidSdk": { + "repository": "https://github.com/openimsdk/open-im-sdk-android-enterprise", + "tag": "v3.8.4.0", + "commit": "f82b142c7d3b4b66ce20586adabc69de9cd61673" + } + }, + "pages": [ + { + "currentPath": "/sdk/android/group/overview-group", + "targetPath": "/sdk/android/group/overview-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setOnGroupListener"], + "sdkEvents": [ + "onGroupApplicationAccepted", + "onGroupApplicationAdded", + "onGroupApplicationDeleted", + "onGroupApplicationRejected", + "onGroupDismissed", + "onGroupInfoChanged", + "onGroupMemberAdded", + "onGroupMemberDeleted", + "onGroupMemberInfoChanged", + "onJoinedGroupAdded", + "onJoinedGroupDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/create-group", + "targetPath": "/sdk/android/group/create-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["createGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.createGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/update-group-profile", + "targetPath": "/sdk/android/group/update-group-profile", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-announcement", + "targetPath": "/sdk/android/group/set-group-announcement", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-extension", + "targetPath": "/sdk/android/group/set-group-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-join-verification", + "targetPath": "/sdk/android/group/set-group-join-verification", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupInfo.setNeedVerification"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-member-profile-access", + "targetPath": "/sdk/android/group/set-group-member-profile-access", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupInfo.setLookMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-member-friend-permission", + "targetPath": "/sdk/android/group/set-group-member-friend-permission", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupInfo.setApplyMemberFriend"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/change-group-mute", + "targetPath": "/sdk/android/group/change-group-mute", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["changeGroupMute"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.changeGroupMute"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/join-group", + "targetPath": "/sdk/android/group/join-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["joinGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.joinGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/quit-group", + "targetPath": "/sdk/android/group/quit-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["quitGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.quitGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/dismiss-group", + "targetPath": "/sdk/android/group/dismiss-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["dismissGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.dismissGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "targetPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupsInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupsInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "targetPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getJoinedGroupListPage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getJoinedGroupListPage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/is-join-group", + "targetPath": "/sdk/android/group/retrieving-groups/is-join-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["isJoinGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.isJoinGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/search-groups", + "targetPath": "/sdk/android/group/retrieving-groups/search-groups", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["searchGroups"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.searchGroups"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/overview-group-applications", + "targetPath": "/sdk/android/group/group-applications/overview-group-applications", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页仅说明申请状态和页面职责。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "targetPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getRecvGroupApplicationList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getRecvGroupApplicationList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "targetPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getSendGroupApplicationList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getSendGroupApplicationList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/accept-group-application", + "targetPath": "/sdk/android/group/group-applications/accept-group-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["acceptGroupApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.acceptGroupApplication"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/refuse-group-application", + "targetPath": "/sdk/android/group/group-applications/refuse-group-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["refuseGroupApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.refuseGroupApplication"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页仅说明成员查询的标识与返回模型。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "targetPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupMemberList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupMemberList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "targetPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupMembersInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupMembersInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "targetPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getUsersInGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getUsersInGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "targetPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupMemberOwnerAndAdmin"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupMemberOwnerAndAdmin"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["searchGroupMembers"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.searchGroupMembers"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "targetPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["inviteUserToGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.inviteUserToGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/kick-group-member", + "targetPath": "/sdk/android/group/managing-group-members/kick-group-member", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["kickGroupMember"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.kickGroupMember"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "targetPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["transferGroupOwner"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.transferGroupOwner"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "targetPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["changeGroupMemberMute"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.changeGroupMemberMute"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/overview", + "targetPath": "/sdk/android/overview", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/tree/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "sdkMethods": ["OpenIMClient.getInstance"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:基于 Android SDK v3.8.4.0 固定提交逐页核对客户端入口、manager 划分、状态合并标识和版本边界。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/before-you-start", + "targetPath": "/sdk/android/getting-started/before-you-start", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对服务地址、可信 Token 来源、Android 构建版本、数据目录和 ABI 准备项。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/environment-specific-implementation", + "targetPath": "/sdk/android/getting-started/environment-specific-implementation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "sdkMethods": ["initSDK", "networkChanged", "logout", "unInit"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对源码 module、Core AAR、Manifest、混淆、InitConfig 和应用生命周期边界;未沿用旧文档中不可验证的 latest@aar 坐标。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "targetPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "sdkMethods": ["initSDK", "login", "getLoginStatus", "getLoginUserID", "logout", "unInit"], + "sdkEvents": [ + "onConnecting", + "onConnectSuccess", + "onConnectFailed", + "onKickedOffline", + "onUserTokenExpired", + "onUserTokenInvalid" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对初始化、登录状态、连接 callback、Token 失效、强制下线、退出与释放边界。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/send-first-message", + "targetPath": "/sdk/android/getting-started/send-first-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/OfflinePushInfo.java" + ], + "sdkMethods": ["setAdvancedMsgListener", "login", "createTextMessage", "sendMessage"], + "sdkEvents": ["onRecvNewMessage"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对文本消息创建、单聊与群聊目标、离线推送信息、发送 callback、接收 listener 和 clientMsgID 合并规则。" + ] + }, + { + "currentPath": "/sdk/android/user/overview-user", + "targetPath": "/sdk/android/user/overview-user", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "The overview does not contain code examples." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/get-users-info", + "targetPath": "/sdk/android/user/user-profile/get-users-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["getUsersInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "targetPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["getSelfLocalUserInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-self-info", + "targetPath": "/sdk/android/user/user-profile/set-self-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "sdkMethods": ["setSelfInfo"], + "sdkEvents": ["onSelfInfoUpdated"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-global-message-reception", + "targetPath": "/sdk/android/user/user-profile/set-global-message-reception", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["setSelfInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/get-friend-list-page", + "targetPath": "/sdk/android/user/friends/get-friend-list-page", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["getFriendListPage"], + "sdkEvents": ["onFriendAdded", "onFriendInfoChanged", "onFriendDeleted"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/search-friends", + "targetPath": "/sdk/android/user/friends/search-friends", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["searchFriends"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/get-friends-info", + "targetPath": "/sdk/android/user/friends/get-friends-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["getFriendsInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/check-friend", + "targetPath": "/sdk/android/user/friends/check-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["checkFriend"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/update-friends", + "targetPath": "/sdk/android/user/friends/update-friends", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["updateFriendsReq"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/delete-friend", + "targetPath": "/sdk/android/user/friends/delete-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["deleteFriend"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/add-friend", + "targetPath": "/sdk/android/user/friend-applications/add-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["addFriend"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "targetPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["getRecvFriendApplicationList"], + "sdkEvents": [ + "onFriendApplicationAdded", + "onFriendApplicationAccepted", + "onFriendApplicationRejected", + "onFriendApplicationDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "targetPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["getSendFriendApplicationList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/accept-friend-application", + "targetPath": "/sdk/android/user/friend-applications/accept-friend-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["acceptFriendApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "targetPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["refuseFriendApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/get-blacklist", + "targetPath": "/sdk/android/user/blacklist/get-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["getBlacklist"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/add-blacklist", + "targetPath": "/sdk/android/user/blacklist/add-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["addBlacklist"], + "sdkEvents": ["onBlacklistAdded"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/remove-blacklist", + "targetPath": "/sdk/android/user/blacklist/remove-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["removeBlacklist"], + "sdkEvents": ["onBlacklistDeleted"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "targetPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "sdkMethods": ["subscribeUsersOnlineStatus"], + "sdkEvents": ["onUserStatusChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "targetPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["getSubscribeOnlineUsersStatus"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/overview-conversation", + "targetPath": "/sdk/android/conversation/overview-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/ConversationInfo.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "The overview does not contain code examples." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["getOneConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["getConversationIDBySessionType"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["getMultipleConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "targetPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" + ], + "sdkMethods": ["getConversationListSplit", "setOnConversationListener"], + "sdkEvents": ["onNewConversation", "onConversationChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "targetPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["pinConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "targetPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationEx"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "targetPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationDraft"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "targetPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationRecvMessageOpt"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "targetPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["resetConversationGroupAtType"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "targetPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": ["markConversationMessageAsRead", "setAdvancedMsgListener"], + "sdkEvents": ["onRecvC2CReadReceipt"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "targetPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" + ], + "sdkMethods": ["getTotalUnreadMsgCount"], + "sdkEvents": ["onTotalUnreadMessageCountChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "targetPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setOneConversationPrivateChat"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "targetPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationBurnDuration"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "targetPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "targetPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["hideConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "targetPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["deleteConversationAndDeleteAllMsg"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "targetPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["clearConversationAndDeleteAllMsg"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/overview-message", + "targetPath": "/sdk/android/message/overview-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["setAdvancedMsgListener"], + "sdkEvents": [ + "onRecvGroupMessageReadReceipt", + "onRecvMessageRevokedV2", + "onChangedPinnedMsg", + "onMsgDeleted", + "onMessageModified" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-message", + "targetPath": "/sdk/android/message/creating-messages/create-text-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createTextMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createTextMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", + "targetPath": "/sdk/android/message/creating-messages/create-text-at-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createTextAtMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createTextAtMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-custom-message", + "targetPath": "/sdk/android/message/creating-messages/create-custom-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createCustomMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createCustomMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createImageMessage", "createImageMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createImageMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createImageMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createImageMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createSoundMessage", "createSoundMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createSoundMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createSoundMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createSoundMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createVideoMessage", "createVideoMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createVideoMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createVideoMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createVideoMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createFileMessage", "createFileMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createFileMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createFileMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createFileMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-card-message", + "targetPath": "/sdk/android/message/creating-messages/create-card-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createCardMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createCardMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-location-message", + "targetPath": "/sdk/android/message/creating-messages/create-location-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createLocationMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createLocationMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-face-message", + "targetPath": "/sdk/android/message/creating-messages/create-face-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createFaceMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createFaceMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-quote-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createQuoteMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createQuoteMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-forward-message", + "targetPath": "/sdk/android/message/creating-messages/create-forward-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createForwardMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createForwardMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-merger-message", + "targetPath": "/sdk/android/message/creating-messages/create-merger-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createMergerMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createMergerMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/send-message", + "targetPath": "/sdk/android/message/sending-messages/send-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["sendMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.sendMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["sendMessageNotOss"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.sendMessageNotOss"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OnMsgSendCallback"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/receiving-messages/receive-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": [], + "sdkEvents": ["onRecvOfflineNewMessage", "onRecvOnlineOnlyMessage"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OnAdvanceMsgListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + ], + "sdkMethods": ["setCustomBusinessListener"], + "sdkEvents": ["onRecvCustomBusinessMessage"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["getAdvancedHistoryMessageList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.getAdvancedHistoryMessageList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["getAdvancedHistoryMessageListReverse"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.getAdvancedHistoryMessageListReverse"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["findMessageList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.findMessageList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/searching-messages/search-messages", + "targetPath": "/sdk/android/message/searching-messages/search-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["searchLocalMessages"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.searchLocalMessages"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/update-typing-status", + "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + ], + "sdkMethods": ["typingStatusUpdate"], + "sdkEvents": ["onConversationUserInputStatusChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.typingStatusUpdate", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-local-message", + "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteMessageFromLocalStorage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteMessageFromLocalStorage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteMessageFromLocalAndSvr"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteMessageFromLocalAndSvr"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", + "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["revokeMessageV2"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.revokeMessageV2"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/modify-a-message", + "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["modifyMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.modifyMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["getConversationPinnedMsgs"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.getConversationPinnedMsgs"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", + "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["setConversationPinnedMsg"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.setConversationPinnedMsg"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["insertSingleMessageToLocalStorage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.insertSingleMessageToLocalStorage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["insertGroupMessageToLocalStorage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.insertGroupMessageToLocalStorage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteAllMsgFromLocal"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteAllMsgFromLocal"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteAllMsgFromLocalAndSvr"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteAllMsgFromLocalAndSvr"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["setMessageLocalEx"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.setMessageLocalEx"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/file-uploads/track-file-upload-progress", + "targetPath": "/sdk/android/file-uploads/track-file-upload-progress", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/file-uploads/upload-file", + "targetPath": "/sdk/android/file-uploads/upload-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/PutArgs.java" + ], + "sdkMethods": ["uploadFile"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener", "PutArgs"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/overview-calling", + "targetPath": "/sdk/android/calling/overview-calling", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInfo.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/start-single-call", + "targetPath": "/sdk/android/calling/managing-calls/start-single-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" + ], + "sdkMethods": ["signalingInvite"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingInvite", "SignalingInvitationInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/start-group-call", + "targetPath": "/sdk/android/calling/managing-calls/start-group-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" + ], + "sdkMethods": ["signalingInviteInGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingInviteInGroup", "SignalingInvitationInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/accept-call", + "targetPath": "/sdk/android/calling/managing-calls/accept-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingAccept"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingAccept"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/reject-call", + "targetPath": "/sdk/android/calling/managing-calls/reject-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingReject"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingReject"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/cancel-call", + "targetPath": "/sdk/android/calling/managing-calls/cancel-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingCancel"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingCancel"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/hang-up-call", + "targetPath": "/sdk/android/calling/managing-calls/hang-up-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingHungUp"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingHungUp"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/handle-call-events", + "targetPath": "/sdk/android/calling/managing-calls/handle-call-events", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_SignalingListener.java" + ], + "sdkMethods": ["setSignalingListener"], + "sdkEvents": [ + "onHangup", + "onInvitationCancelled", + "onInvitationTimeout", + "onInviteeAccepted", + "onInviteeAcceptedByOtherDevice", + "onInviteeRejected", + "onInviteeRejectedByOtherDevice", + "onReceiveNewInvitation", + "onRoomParticipantConnected", + "onRoomParticipantDisconnected", + "onStreamChange" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.setSignalingListener", "_SignalingListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "targetPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["getSignalingInvitationInfoStartApp"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.getSignalingInvitationInfoStartApp"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "targetPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RoomCallingInfo.java" + ], + "sdkMethods": ["signalingGetRoomByGroupID"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingGetRoomByGroupID", "RoomCallingInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "targetPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" + ], + "sdkMethods": ["signalingGetTokenByRoomID"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingGetTokenByRoomID", "SignalingCertificate"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "targetPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/CustomSignalingInfo.java" + ], + "sdkMethods": ["signalingSendCustomSignal"], + "sdkEvents": ["onReceiveCustomSignal"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingSendCustomSignal", "OnSignalingListener.onReceiveCustomSignal"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/events/overview-events", + "targetPath": "/sdk/android/events/overview-events", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_ConversationListener.java" + ], + "sdkMethods": [], + "sdkEvents": [ + "onSyncServerStart", + "onSyncServerProgress", + "onSyncServerFinish", + "onSyncServerFailed" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["ConversationManager.setOnConversationListener", "OnConversationListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/logger", + "targetPath": "/sdk/android/logger", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LogLevel.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/utils/ParamsUtil.java" + ], + "sdkMethods": ["logs", "uploadLogs"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OpenIMClient.logs", "OpenIMClient.uploadLogs", "InitConfig", "LogLevel"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + } + ] +} diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json new file mode 100644 index 0000000000..49d8fbb708 --- /dev/null +++ b/data/structure/android-navigation-labels.json @@ -0,0 +1,377 @@ +{ + "OpenIM SDK for Android": "OpenIM Android SDK 概览", + "Overview": "概览", + "overview": "概览", + "Getting started": "快速开始", + "getting-started": "快速开始", + "Before you start": "开始之前", + "before-you-start": "开始之前", + "Integrate for Android": "按 Android 环境接入", + "Environment-specific implementation": "按 Android 环境接入", + "environment-specific-implementation": "按 Android 环境接入", + "Authenticate and manage a session": "认证与管理登录会话", + "authenticate-and-manage-session": "认证与管理登录会话", + "Send your first message": "发送第一条消息", + "send-first-message": "发送第一条消息", + "Users": "用户", + "User": "用户", + "user": "用户", + "User overview": "用户概览", + "overview-user": "用户概览", + "User profiles": "用户资料", + "User profile": "用户资料", + "user-profile": "用户资料", + "user/user-profile": "用户资料", + "Get specified user profiles": "获取指定用户资料", + "get-users-info": "获取指定用户资料", + "Get the current user profile": "获取当前用户资料", + "get-self-local-user-info": "获取当前用户资料", + "Update the current user profile": "更新当前用户资料", + "set-self-info": "更新当前用户资料", + "Set global message reception": "设置全局消息接收方式", + "set-global-message-reception": "设置全局消息接收方式", + "Relationships": "关系链", + "relationships": "关系链", + "Friends": "好友", + "friends": "好友", + "user/friends": "好友", + "Get the friend list by page": "分页获取好友列表", + "Get the friend list": "分页获取好友列表", + "get-friend-list-page": "分页获取好友列表", + "Search friends": "搜索好友", + "search-friends": "搜索好友", + "Get specified friend profiles": "查询指定好友资料", + "Get friend profiles": "查询指定好友资料", + "get-friends-info": "查询指定好友资料", + "Check friendship": "检查好友关系", + "Check friendship status": "检查好友关系", + "check-friend": "检查好友关系", + "Update friend profiles": "更新好友资料", + "Update friend information": "更新好友资料", + "update-friends": "更新好友资料", + "Delete a friend": "删除好友", + "delete-friend": "删除好友", + "Friend requests": "好友申请", + "Friend applications": "好友申请", + "friend-applications": "好友申请", + "user/friend-applications": "好友申请", + "Send a friend request": "发送好友申请", + "Send a friend application": "发送好友申请", + "add-friend": "发送好友申请", + "Get received friend requests": "获取收到的好友申请", + "Get received friend applications": "获取收到的好友申请", + "get-recv-friend-application-list": "获取收到的好友申请", + "Get sent friend requests": "获取发出的好友申请", + "Get sent friend applications": "获取发出的好友申请", + "get-send-friend-application-list": "获取发出的好友申请", + "Accept a friend request": "接受好友申请", + "Accept a friend application": "接受好友申请", + "accept-friend-application": "接受好友申请", + "Reject a friend request": "拒绝好友申请", + "Reject a friend application": "拒绝好友申请", + "refuse-friend-application": "拒绝好友申请", + "Blacklist": "黑名单", + "blacklist": "黑名单", + "user/blacklist": "黑名单", + "Get the blacklist": "获取黑名单列表", + "get-blacklist": "获取黑名单列表", + "Block a user": "拉黑用户", + "add-blacklist": "拉黑用户", + "Unblock a user": "取消拉黑用户", + "remove-blacklist": "取消拉黑用户", + "Online status": "在线状态", + "online-status": "在线状态", + "user/online-status": "在线状态", + "Subscribe to user online status": "订阅用户在线状态", + "Subscribe to user status": "订阅用户在线状态", + "subscribe-users-online-status": "订阅用户在线状态", + "Get subscribed user online status": "查询已订阅用户状态", + "Refresh subscribed user status": "查询已订阅用户状态", + "get-subscribe-online-users-status": "查询已订阅用户状态", + "Conversation": "会话", + "conversation": "会话", + "Conversation overview": "会话概览", + "overview-conversation": "会话概览", + "Retrieving conversations": "查询会话", + "retrieving-conversations": "查询会话", + "Open a conversation": "查询指定会话", + "get-conversation-by-target": "查询指定会话", + "Resolve a conversation ID": "生成会话 ID", + "get-conversation-id": "生成会话 ID", + "Get conversations by ID": "按 ID 批量获取会话", + "get-conversations-by-id": "按 ID 批量获取会话", + "Get the conversation list": "获取会话列表", + "retrieve-conversation-list": "获取会话列表", + "Conversation organization": "会话整理", + "conversation-list-and-drafts": "会话整理", + "Pin or unpin a conversation": "置顶或取消置顶会话", + "pin-conversation": "置顶或取消置顶会话", + "Set conversation extra data": "设置会话扩展字段", + "set-conversation-extension": "设置会话扩展字段", + "Set a conversation draft": "设置会话草稿", + "set-conversation-draft": "设置会话草稿", + "Unread status and notifications": "未读与消息提醒", + "message-reception-and-reminders": "未读与消息提醒", + "Set conversation message reception": "设置会话消息接收方式", + "set-message-receive-option": "设置会话消息接收方式", + "Reset group mention status": "重置群聊 @ 状态", + "clear-group-mentions": "重置群聊 @ 状态", + "Mark a conversation as read": "标记会话已读", + "mark-conversation-read": "标记会话已读", + "Track the total unread count": "获取消息总未读数", + "get-total-unread-count": "获取消息总未读数", + "Message retention and privacy": "消息保留与隐私", + "message-retention-and-privacy": "消息保留与隐私", + "Enable or disable burn after reading": "开启或关闭阅后即焚", + "set-private-chat": "开启或关闭阅后即焚", + "Set the burn duration": "设置阅后即焚时长", + "set-burn-duration": "设置阅后即焚时长", + "Schedule server message deletion": "定期删除服务端消息", + "set-message-destruct": "定期删除服务端消息", + "Hiding and deleting conversations": "隐藏与删除会话", + "hiding-and-deleting-conversations": "隐藏与删除会话", + "Hide a conversation": "隐藏会话", + "hide-a-conversation": "隐藏会话", + "Delete a conversation and its messages": "删除会话及消息", + "delete-conversation-with-messages": "删除会话及消息", + "Clear messages in a conversation": "清空会话消息", + "clear-conversation-messages": "清空会话消息", + "Group": "群组", + "group": "群组", + "Group overview": "群组概览", + "overview-group": "群组概览", + "Group profile and settings": "群资料与设置", + "profile-and-settings": "群资料与设置", + "Create a group": "创建群组", + "create-group": "创建群组", + "Update group profile": "更新群资料", + "update-group-profile": "更新群资料", + "Publish a group announcement": "发布群公告", + "set-group-announcement": "发布群公告", + "Set group extra data": "设置群扩展字段", + "set-group-extension": "设置群扩展字段", + "Group permissions": "群权限", + "permissions": "群权限", + "Set group join verification": "设置入群验证方式", + "set-group-join-verification": "设置入群验证方式", + "Set member profile access": "设置成员资料查看权限", + "set-group-member-profile-access": "设置成员资料查看权限", + "Set member friend request permission": "设置成员好友申请权限", + "set-group-member-friend-permission": "设置成员好友申请权限", + "Change group mute status": "设置全员禁言", + "change-group-mute": "设置全员禁言", + "Joining and leaving groups": "加入与退出群组", + "joining-and-leaving": "加入与退出群组", + "Apply to join a group": "申请加入群组", + "join-group": "申请加入群组", + "Leave a group": "退出群组", + "quit-group": "退出群组", + "Dismiss a group": "解散群组", + "dismiss-group": "解散群组", + "Retrieving groups": "查询群组", + "retrieving-groups": "查询群组", + "Get group information": "获取群资料", + "get-specified-groups-info": "获取群资料", + "Get joined groups by page": "分页获取已加入群组", + "get-joined-group-list-page": "分页获取已加入群组", + "Check group membership": "检查是否加入群组", + "is-join-group": "检查是否加入群组", + "Search groups": "搜索群组", + "search-groups": "搜索群组", + "Group applications": "群申请", + "group-applications": "群申请", + "Group applications overview": "群申请概览", + "overview-group-applications": "群申请概览", + "Get received group applications": "获取收到的群申请", + "get-group-application-list-as-recipient": "获取收到的群申请", + "Get sent group applications": "获取发出的群申请", + "get-group-application-list-as-applicant": "获取发出的群申请", + "Accept a group application": "同意群申请", + "accept-group-application": "同意群申请", + "Reject a group application": "拒绝群申请", + "refuse-group-application": "拒绝群申请", + "Retrieving group members": "查询群成员", + "retrieving-group-members": "查询群成员", + "Group member queries overview": "群成员查询概览", + "overview-retrieving-group-members": "群成员查询概览", + "Get group members": "获取群成员列表", + "get-group-member-list": "获取群成员列表", + "Get group member profiles": "获取群成员资料", + "get-specified-group-members-info": "获取群成员资料", + "Check users in a group": "检查用户是否在群内", + "get-users-in-group": "检查用户是否在群内", + "Get group owners and admins": "获取群主和管理员", + "get-group-member-owner-and-admin": "获取群主和管理员", + "Search group members": "搜索群成员", + "search-group-members": "搜索群成员", + "Managing group members": "管理群成员", + "managing-group-members": "管理群成员", + "Invite users to a group": "邀请用户入群", + "invite-user-to-group": "邀请用户入群", + "Remove group members": "移除群成员", + "kick-group-member": "移除群成员", + "Update a group nickname": "更新群昵称", + "set-group-member-nickname": "更新群昵称", + "Manage group administrators": "管理群管理员", + "set-group-member-role-level": "管理群管理员", + "Update a group member avatar": "更新群成员头像", + "set-group-member-avatar": "更新群成员头像", + "Set group member extra data": "设置群成员扩展字段", + "set-group-member-extension": "设置群成员扩展字段", + "Transfer group ownership": "转让群主", + "transfer-group-owner": "转让群主", + "Mute or unmute a group member": "禁言或解除禁言群成员", + "change-group-member-mute": "禁言或解除禁言群成员", + "Message": "消息", + "message": "消息", + "Message overview": "消息概览", + "overview-message": "消息概览", + "Creating messages": "创建消息", + "creating-messages": "创建消息", + "Create a text message": "创建文本消息", + "create-text-message": "创建文本消息", + "Create a mention message": "创建 @ 消息", + "create-text-at-message": "创建 @ 消息", + "Create a custom message": "创建自定义消息", + "create-custom-message": "创建自定义消息", + "Create an image message from a file": "从文件创建图片消息", + "create-image-message-by-file": "从文件创建图片消息", + "Create an image message from a URL": "从 URL 创建图片消息", + "create-image-message-by-url": "从 URL 创建图片消息", + "Create an audio message from a file": "从文件创建音频消息", + "create-sound-message-by-file": "从文件创建音频消息", + "Create an audio message from a URL": "从 URL 创建音频消息", + "create-sound-message-by-url": "从 URL 创建音频消息", + "Create a video message from a file": "从文件创建视频消息", + "create-video-message-by-file": "从文件创建视频消息", + "Create a video message from a URL": "从 URL 创建视频消息", + "create-video-message-by-url": "从 URL 创建视频消息", + "Create a file message from a file": "从文件创建文件消息", + "create-file-message-by-file": "从文件创建文件消息", + "Create a file message from a URL": "从 URL 创建文件消息", + "create-file-message-by-url": "从 URL 创建文件消息", + "Create a contact card message": "创建名片消息", + "create-card-message": "创建名片消息", + "Create a location message": "创建位置消息", + "create-location-message": "创建位置消息", + "Create an emoji message": "创建表情消息", + "create-face-message": "创建表情消息", + "Create a reply message": "创建引用消息", + "create-quote-message": "创建引用消息", + "Create a forwarded message": "创建转发消息", + "create-forward-message": "创建转发消息", + "Create a merged message": "创建合并消息", + "create-merger-message": "创建合并消息", + "Sending messages": "发送消息", + "sending-messages": "发送消息", + "Send a message": "发送消息", + "send-message": "发送消息", + "Send a message without OSS": "发送非 OSS 消息", + "send-message-not-oss": "发送非 OSS 消息", + "Track message sending progress": "跟踪消息发送进度", + "set-msg-send-progress-listener": "跟踪消息发送进度", + "Receiving messages": "接收消息", + "receiving-messages": "接收消息", + "Receive messages": "接收消息", + "receive-messages": "接收消息", + "Receive custom business messages": "接收自定义业务消息", + "receive-custom-business-messages": "接收自定义业务消息", + "Retrieving messages": "查询消息", + "retrieving-messages": "查询消息", + "Load older messages": "加载更早消息", + "load-older-messages": "加载更早消息", + "Load newer messages": "加载更新消息", + "load-newer-messages": "加载更新消息", + "Find messages by ID": "按 ID 查询消息", + "find-messages-by-id": "按 ID 查询消息", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Composing messages": "编辑消息", + "composing-messages": "编辑消息", + "Update typing status": "更新输入状态", + "update-typing-status": "更新输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "Delete saved messages": "删除已保存消息", + "delete-saved-messages": "删除已保存消息", + "Revoke a message": "撤回消息", + "revoke-a-message": "撤回消息", + "Modify a message": "修改消息", + "modify-a-message": "修改消息", + "View pinned messages": "查看置顶消息", + "get-pinned-messages": "查看置顶消息", + "Pin or unpin a message": "置顶或取消置顶消息", + "set-message-pinned": "置顶或取消置顶消息", + "Insert a local direct message": "插入本地单聊消息", + "insert-local-single-message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "insert-local-group-message": "插入本地群聊消息", + "Clear all local messages": "清空全部本地消息", + "clear-all-local-messages": "清空全部本地消息", + "Clear all saved messages": "清空全部已保存消息", + "clear-all-messages": "清空全部已保存消息", + "Set local message extensions": "设置消息本地扩展字段", + "set-message-local-ex": "设置消息本地扩展字段", + "Create an @ message": "创建 @ 消息", + "Create a video message from files": "从文件创建视频消息", + "Create a video message from URLs": "从 URL 创建视频消息", + "Create a merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送已上传媒体消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "逆序加载历史消息", + "Report typing status": "上报输入状态", + "Delete messages in a batch": "批量删除消息", + "Get pinned messages in a conversation": "获取会话置顶消息", + "Insert a local one-to-one message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "Clear local and server messages": "清空本地和服务端消息", + "Set a local message extension": "设置消息本地扩展字段", + "File uploads": "文件上传", + "file-uploads": "文件上传", + "Track file upload progress": "跟踪文件上传进度", + "track-file-upload-progress": "跟踪文件上传进度", + "Upload a file": "上传文件", + "upload-file": "上传文件", + "Calling": "音视频通话", + "calling": "音视频通话", + "Audio and video calling overview": "音视频通话概览", + "Calling overview": "音视频通话概览", + "overview-calling": "音视频通话概览", + "Managing calls": "管理通话", + "managing-calls": "管理通话", + "Start a one-to-one call": "发起单聊通话", + "start-single-call": "发起单聊通话", + "Start a group call": "发起群聊通话", + "start-group-call": "发起群聊通话", + "Accept a call": "接受通话", + "accept-call": "接受通话", + "Reject a call": "拒绝通话", + "reject-call": "拒绝通话", + "Cancel a call invitation": "取消通话邀请", + "cancel-call": "取消通话邀请", + "Hang up a call": "挂断通话", + "hang-up-call": "挂断通话", + "Handle call events": "处理通话事件", + "handle-call-events": "处理通话事件", + "Retrieving call information": "通话恢复与房间信息", + "retrieving-call-information": "通话恢复与房间信息", + "Restore a pending invitation": "恢复启动前收到的通话邀请", + "restore-pending-invitation": "恢复启动前收到的通话邀请", + "Get a group call room": "查询群组通话房间", + "get-room-by-group-id": "查询群组通话房间", + "Get room credentials": "获取通话房间 Token", + "get-token-by-room-id": "获取通话房间 Token", + "Sending custom signals": "发送自定义信令", + "sending-custom-signals": "发送自定义信令", + "Send a custom signal": "发送自定义信令", + "send-a-custom-signal": "发送自定义信令", + "Events": "事件", + "events": "事件", + "Events overview": "事件概览", + "overview-events": "事件概览", + "Logging": "日志", + "Logger": "日志", + "logger": "日志" +} diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json new file mode 100644 index 0000000000..004995928a --- /dev/null +++ b/data/structure/android-sidebar.json @@ -0,0 +1,550 @@ +{ + "sidebarExpansion": "active-path", + "nodes": [ + { + "path": "/sdk/android/overview", + "navigationTitle": "Overview" + }, + { + "id": "getting-started", + "title": "Getting started", + "children": [ + "/sdk/android/getting-started/before-you-start", + "/sdk/android/getting-started/environment-specific-implementation", + "/sdk/android/getting-started/authenticate-and-manage-session", + "/sdk/android/getting-started/send-first-message" + ] + }, + { + "id": "user", + "title": "User", + "children": [ + "/sdk/android/user/overview-user", + { + "id": "user/user-profile", + "title": "User profile", + "children": [ + "/sdk/android/user/user-profile/get-users-info", + "/sdk/android/user/user-profile/get-self-local-user-info", + "/sdk/android/user/user-profile/set-self-info" + ] + }, + { + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "navigationTitle": "Set global message reception" + }, + { + "id": "user/online-status", + "title": "Online status", + "children": [ + { + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "navigationTitle": "Subscribe to user status" + }, + { + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "navigationTitle": "Refresh subscribed user status" + } + ] + } + ] + }, + { + "id": "relationships", + "title": "Relationships", + "children": [ + { + "id": "user/friends", + "title": "Friends", + "children": [ + { + "path": "/sdk/android/user/friends/get-friend-list-page", + "navigationTitle": "Get the friend list" + }, + { + "path": "/sdk/android/user/friends/search-friends", + "navigationTitle": "Search friends" + }, + { + "path": "/sdk/android/user/friends/get-friends-info", + "navigationTitle": "Get friend profiles" + }, + { + "path": "/sdk/android/user/friends/check-friend", + "navigationTitle": "Check friendship status" + }, + { + "path": "/sdk/android/user/friends/update-friends", + "navigationTitle": "Update friend information" + }, + { + "path": "/sdk/android/user/friends/delete-friend", + "navigationTitle": "Delete a friend" + }, + { + "id": "user/friend-applications", + "title": "Friend applications", + "children": [ + { + "path": "/sdk/android/user/friend-applications/add-friend", + "navigationTitle": "Send a friend application" + }, + { + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "navigationTitle": "Get received friend applications" + }, + { + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "navigationTitle": "Get sent friend applications" + }, + { + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "navigationTitle": "Accept a friend application" + }, + { + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "navigationTitle": "Reject a friend application" + } + ] + } + ] + }, + { + "id": "user/blacklist", + "title": "Blacklist", + "children": [ + "/sdk/android/user/blacklist/get-blacklist", + { + "path": "/sdk/android/user/blacklist/add-blacklist", + "navigationTitle": "Block a user" + }, + { + "path": "/sdk/android/user/blacklist/remove-blacklist", + "navigationTitle": "Unblock a user" + } + ] + } + ] + }, + { + "id": "conversation", + "title": "Conversation", + "children": [ + "/sdk/android/conversation/overview-conversation", + { + "id": "conversation/retrieving-conversations", + "title": "Retrieving conversations", + "children": [ + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "navigationTitle": "Open a conversation" + }, + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "navigationTitle": "Resolve a conversation ID" + }, + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "navigationTitle": "Get conversations by ID" + }, + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list" + ] + }, + { + "id": "conversation/conversation-list-and-drafts", + "title": "Conversation organization", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "navigationTitle": "Pin or unpin a conversation" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "navigationTitle": "Set conversation extra data" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-draft" + ] + }, + { + "id": "conversation/message-reception-and-reminders", + "title": "Unread status and notifications", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "navigationTitle": "Set conversation message reception" + }, + { + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "navigationTitle": "Reset group mention status" + }, + { + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "navigationTitle": "Mark a conversation as read" + }, + { + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "navigationTitle": "Track the total unread count" + } + ] + }, + { + "id": "conversation/message-retention-and-privacy", + "title": "Message retention and privacy", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "navigationTitle": "Enable or disable burn after reading" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "navigationTitle": "Set the burn duration" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "navigationTitle": "Schedule server message deletion" + } + ] + }, + { + "id": "conversation/hiding-and-deleting-conversations", + "title": "Hiding and deleting conversations", + "children": [ + "/sdk/android/conversation/managing-conversations/hide-a-conversation", + { + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "navigationTitle": "Delete a conversation and its messages" + }, + { + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "navigationTitle": "Clear messages in a conversation" + } + ] + } + ] + }, + { + "id": "group", + "title": "Group", + "children": [ + { "path": "/sdk/android/group/overview-group", "navigationTitle": "Group overview" }, + { + "id": "group/profile-and-settings", + "title": "Group profile and settings", + "children": [ + { "path": "/sdk/android/group/create-group", "navigationTitle": "Create a group" }, + { + "path": "/sdk/android/group/update-group-profile", + "navigationTitle": "Update group profile" + }, + { + "path": "/sdk/android/group/set-group-announcement", + "navigationTitle": "Publish a group announcement" + }, + { + "path": "/sdk/android/group/set-group-extension", + "navigationTitle": "Set group extra data" + } + ] + }, + { + "id": "group/permissions", + "title": "Group permissions", + "children": [ + { + "path": "/sdk/android/group/set-group-join-verification", + "navigationTitle": "Set group join verification" + }, + { + "path": "/sdk/android/group/set-group-member-profile-access", + "navigationTitle": "Set member profile access" + }, + { + "path": "/sdk/android/group/set-group-member-friend-permission", + "navigationTitle": "Set member friend request permission" + }, + { + "path": "/sdk/android/group/change-group-mute", + "navigationTitle": "Change group mute status" + } + ] + }, + { + "id": "group/joining-and-leaving", + "title": "Joining and leaving groups", + "children": [ + { "path": "/sdk/android/group/join-group", "navigationTitle": "Apply to join a group" }, + { "path": "/sdk/android/group/quit-group", "navigationTitle": "Leave a group" }, + { "path": "/sdk/android/group/dismiss-group", "navigationTitle": "Dismiss a group" } + ] + }, + { + "id": "group/retrieving-groups", + "title": "Retrieving groups", + "children": [ + { + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "navigationTitle": "Get group information" + }, + { + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "navigationTitle": "Get joined groups by page" + }, + { + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "navigationTitle": "Check group membership" + }, + { + "path": "/sdk/android/group/retrieving-groups/search-groups", + "navigationTitle": "Search groups" + } + ] + }, + { + "id": "group/group-applications", + "title": "Group applications", + "children": [ + { + "path": "/sdk/android/group/group-applications/overview-group-applications", + "navigationTitle": "Group applications overview" + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "navigationTitle": "Get received group applications" + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "navigationTitle": "Get sent group applications" + }, + { + "path": "/sdk/android/group/group-applications/accept-group-application", + "navigationTitle": "Accept a group application" + }, + { + "path": "/sdk/android/group/group-applications/refuse-group-application", + "navigationTitle": "Reject a group application" + } + ] + }, + { + "id": "group/retrieving-group-members", + "title": "Retrieving group members", + "children": [ + { + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "navigationTitle": "Group member queries overview" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "navigationTitle": "Get group members" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "navigationTitle": "Get group member profiles" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "navigationTitle": "Check users in a group" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "navigationTitle": "Get group owners and admins" + }, + { + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "navigationTitle": "Search group members" + } + ] + }, + { + "id": "group/managing-group-members", + "title": "Managing group members", + "children": [ + { + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "navigationTitle": "Invite users to a group" + }, + { + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "navigationTitle": "Remove group members" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "navigationTitle": "Update a group nickname" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "navigationTitle": "Manage group administrators" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "navigationTitle": "Update a group member avatar" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "navigationTitle": "Set group member extra data" + }, + { + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "navigationTitle": "Transfer group ownership" + }, + { + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "navigationTitle": "Mute or unmute a group member" + } + ] + } + ] + }, + { + "id": "message", + "title": "Message", + "children": [ + "/sdk/android/message/overview-message", + { + "id": "message/creating-messages", + "title": "Creating messages", + "children": [ + "/sdk/android/message/creating-messages/create-text-message", + "/sdk/android/message/creating-messages/create-text-at-message", + "/sdk/android/message/creating-messages/create-custom-message", + "/sdk/android/message/creating-messages/create-image-message-by-file", + "/sdk/android/message/creating-messages/create-image-message-by-url", + "/sdk/android/message/creating-messages/create-sound-message-by-file", + "/sdk/android/message/creating-messages/create-sound-message-by-url", + "/sdk/android/message/creating-messages/create-video-message-by-file", + "/sdk/android/message/creating-messages/create-video-message-by-url", + "/sdk/android/message/creating-messages/create-file-message-by-file", + "/sdk/android/message/creating-messages/create-file-message-by-url", + "/sdk/android/message/creating-messages/create-card-message", + "/sdk/android/message/creating-messages/create-location-message", + "/sdk/android/message/creating-messages/create-face-message", + "/sdk/android/message/creating-messages/create-quote-message", + "/sdk/android/message/creating-messages/create-forward-message", + "/sdk/android/message/creating-messages/create-merger-message" + ] + }, + { + "id": "message/sending-messages", + "title": "Sending messages", + "children": [ + "/sdk/android/message/sending-messages/send-message", + "/sdk/android/message/sending-messages/send-message-not-oss", + { + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "navigationTitle": "Track message sending progress" + } + ] + }, + "/sdk/android/message/receiving-messages/receive-messages", + "/sdk/android/message/receiving-messages/receive-custom-business-messages", + { + "id": "message/retrieving-messages", + "title": "Retrieving messages", + "children": [ + "/sdk/android/message/retrieving-messages/load-older-messages", + "/sdk/android/message/retrieving-messages/load-newer-messages", + "/sdk/android/message/retrieving-messages/find-messages-by-id", + "/sdk/android/message/searching-messages/search-messages" + ] + }, + "/sdk/android/message/composing-messages/update-typing-status", + { + "id": "message/managing-messages", + "title": "Managing messages", + "children": [ + "/sdk/android/message/managing-messages/delete-local-message", + "/sdk/android/message/managing-messages/delete-saved-messages", + "/sdk/android/message/managing-messages/revoke-a-message", + "/sdk/android/message/managing-messages/modify-a-message", + "/sdk/android/message/managing-messages/get-pinned-messages", + "/sdk/android/message/managing-messages/set-message-pinned", + "/sdk/android/message/managing-messages/insert-local-single-message", + "/sdk/android/message/managing-messages/insert-local-group-message", + "/sdk/android/message/managing-messages/clear-all-local-messages", + "/sdk/android/message/managing-messages/clear-all-messages", + "/sdk/android/message/managing-messages/set-message-local-ex" + ] + } + ] + }, + { + "id": "file-uploads", + "title": "File uploads", + "children": [ + { + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "navigationTitle": "Track file upload progress" + }, + { + "path": "/sdk/android/file-uploads/upload-file", + "navigationTitle": "Upload a file" + } + ] + }, + { + "id": "calling", + "title": "Calling", + "children": [ + "/sdk/android/calling/overview-calling", + { + "id": "calling/managing-calls", + "title": "Managing calls", + "children": [ + { + "path": "/sdk/android/calling/managing-calls/start-single-call", + "navigationTitle": "Start a one-to-one call" + }, + { + "path": "/sdk/android/calling/managing-calls/start-group-call", + "navigationTitle": "Start a group call" + }, + { + "path": "/sdk/android/calling/managing-calls/accept-call", + "navigationTitle": "Accept a call" + }, + { + "path": "/sdk/android/calling/managing-calls/reject-call", + "navigationTitle": "Reject a call" + }, + { + "path": "/sdk/android/calling/managing-calls/cancel-call", + "navigationTitle": "Cancel a call invitation" + }, + { + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "navigationTitle": "Hang up a call" + }, + { + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "navigationTitle": "Handle call events" + } + ] + }, + { + "id": "calling/retrieving-call-information", + "title": "Retrieving call information", + "children": [ + { + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "navigationTitle": "Restore a pending invitation" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "navigationTitle": "Get a group call room" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "navigationTitle": "Get room credentials" + } + ] + }, + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal" + ] + }, + { + "path": "/sdk/android/events/overview-events", + "navigationTitle": "Events" + }, + "/sdk/android/logger" + ] +} diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index fb14be0834..2b10d016a0 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1312,20 +1312,36 @@ "contentFile": "content/docs/chat/sdk/ios/logger.mdx" }, { - "sourcePath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "openimPath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", + "sourcePath": "/sdk/android/overview", + "openimPath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", + "context": "chat/sdk/android", + "template": "overview", + "contentFile": "content/docs/chat/sdk/android/overview.mdx" + }, + { + "sourcePath": "/sdk/android/getting-started/before-you-start", + "openimPath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/android/channel/overview-channel", - "openimPath": "/sdk/android/channel/overview-channel", - "title": "Overview", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "openimPath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/overview-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" + }, + { + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" }, { "sourcePath": "/sdk/android/getting-started/send-first-message", @@ -1336,1004 +1352,1036 @@ "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "openimPath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", + "sourcePath": "/sdk/android/user/overview-user", + "openimPath": "/sdk/android/user/overview-user", + "title": "User overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "openimPath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "openimPath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "openimPath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "openimPath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "openimPath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/create-a-poll", - "openimPath": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/create-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" }, { - "sourcePath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "openimPath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "openimPath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "openimPath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", + "sourcePath": "/sdk/android/user/friends/search-friends", + "openimPath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/android/message/overview-message", - "openimPath": "/sdk/android/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "openimPath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", + "sourcePath": "/sdk/android/user/friends/check-friend", + "openimPath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "openimPath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", + "sourcePath": "/sdk/android/user/friends/update-friends", + "openimPath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "openimPath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "openimPath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/share-an-encrypted-file.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/smart-throttling", - "openimPath": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "openimPath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/smart-throttling.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/auto-translate-messages", - "openimPath": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/auto-translate-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "openimPath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translate-messages-on-demand.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "openimPath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/create-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/android/overview", - "openimPath": "/sdk/android/overview", - "title": "OpenIM SDK for Android", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", "context": "chat/sdk/android", - "template": "overview", - "contentFile": "content/docs/chat/sdk/android/overview.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "openimPath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "openimPath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-translation.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/overview-push-notifications", - "openimPath": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "openimPath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/overview-push-notifications.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" }, { - "sourcePath": "/sdk/android/report/overview-report", - "openimPath": "/sdk/android/report/overview-report", - "title": "Overview", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "openimPath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/report/overview-report.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "openimPath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/block-and-unblock-other-members.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "openimPath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/mute-and-unmute-a-user.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/android/application/authenticating-a-user/authentication", - "openimPath": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/authenticating-a-user/authentication.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/android/application/overview-application", - "openimPath": "/sdk/android/application/overview-application", - "title": "Overview", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/overview-application.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "openimPath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/understanding-rate-limits/rate-limits.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "openimPath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "openimPath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/creating-a-channel/create-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "openimPath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "openimPath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "openimPath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "openimPath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "openimPath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "openimPath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metadata/manage-channel-metadata.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/delete-a-channel", - "openimPath": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/delete-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "openimPath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "openimPath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", + "sourcePath": "/sdk/android/group/overview-group", + "openimPath": "/sdk/android/group/overview-group", + "title": "Group overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "openimPath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", + "sourcePath": "/sdk/android/group/create-group", + "openimPath": "/sdk/android/group/create-group", + "title": "Create a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-operators/register-and-remove-operators.mdx" + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" }, { - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "openimPath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", + "sourcePath": "/sdk/android/group/update-group-profile", + "openimPath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "openimPath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", + "sourcePath": "/sdk/android/group/set-group-announcement", + "openimPath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "openimPath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", + "sourcePath": "/sdk/android/group/set-group-extension", + "openimPath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "openimPath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "openimPath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "openimPath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "openimPath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/android/deprecated", - "openimPath": "/sdk/android/deprecated", - "title": "Deprecated", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "openimPath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/deprecated.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "openimPath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", + "sourcePath": "/sdk/android/group/change-group-mute", + "openimPath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "openimPath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", + "sourcePath": "/sdk/android/group/join-group", + "openimPath": "/sdk/android/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "openimPath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", + "sourcePath": "/sdk/android/group/quit-group", + "openimPath": "/sdk/android/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" }, { - "sourcePath": "/sdk/android/event-handler/overview-event-handler", - "openimPath": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", + "sourcePath": "/sdk/android/group/dismiss-group", + "openimPath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/overview-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/android/getting-started/collection-migration-guide", - "openimPath": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/collection-migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/android/getting-started/kotlin-extension", - "openimPath": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/kotlin-extension.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/android/getting-started/migration-guide", - "openimPath": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/android/local-caching/overview-local-caching", - "openimPath": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "openimPath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/overview-local-caching.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "openimPath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "openimPath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/using-group-channel-collection/group-channel-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/android/local-caching/using-message-collection/message-collection", - "openimPath": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/using-message-collection/message-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/android/logger", - "openimPath": "/sdk/android/logger", - "title": "Logger", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/logger.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "openimPath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "openimPath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "openimPath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "openimPath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/listing-changelogs/list-changelogs-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "openimPath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/copy-a-message", - "openimPath": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "List group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/copy-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/delete-a-message", - "openimPath": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get specified group member profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/delete-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "openimPath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/update-a-message", - "openimPath": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get the group owner and administrators", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/update-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/add-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/add-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "openimPath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a member’s group nickname", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/cast-or-cancel-a-vote.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/close-a-poll", - "openimPath": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/close-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll", - "openimPath": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member’s avatar", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set a group member extension", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "openimPath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/list-changelogs-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", + "sourcePath": "/sdk/android/message/overview-message", + "openimPath": "/sdk/android/message/overview-message", + "title": "Overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-voters.mdx" + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create an @ message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll", - "openimPath": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "openimPath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from files", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "openimPath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "openimPath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "openimPath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "openimPath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "openimPath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "openimPath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "openimPath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged forward message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "openimPath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send an uploaded media message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "openimPath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load message history", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "openimPath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load message history in reverse", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-a-message", - "openimPath": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "openimPath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "openimPath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-an-admin-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "openimPath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "openimPath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Report typing status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/spam-flood-protection.mdx" + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "openimPath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "openimPath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translation-engine", - "openimPath": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translation-engine.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "openimPath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/list-replies-in-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/android/migrating-to-sendbird", - "openimPath": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "openimPath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/migrating-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "Get pinned messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-tester.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local one-to-one message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "openimPath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "openimPath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear local and server messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "openimPath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set a local message extension", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "openimPath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/report/creating-a-report/report-a-message-user-or-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" }, { - "sourcePath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "openimPath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "openimPath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/managing-user-metadata/manage-user-metadata.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", + "sourcePath": "/sdk/android/calling/overview-calling", + "openimPath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "openimPath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "openimPath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/android/user/overview-user", - "openimPath": "/sdk/android/user/overview-user", - "title": "Overview", + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "openimPath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "openimPath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "openimPath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/update-user-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "openimPath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "End a call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-operators.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending call invitation", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" + }, + { + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "openimPath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get a call room token", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" + }, + { + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" + }, + { + "sourcePath": "/sdk/android/events/overview-events", + "openimPath": "/sdk/android/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" + }, + { + "sourcePath": "/sdk/android/logger", + "openimPath": "/sdk/android/logger", + "title": "Logger", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/logger.mdx" }, { "sourcePath": "/sdk/flutter/overview", diff --git a/package.json b/package.json index 5cfd03ac82..6c2f78b478 100644 --- a/package.json +++ b/package.json @@ -34,15 +34,15 @@ "content:metadata": "node scripts/sync-content-metadata.mjs", "sdk:zh": "node scripts/build-wasm-sdk-zh-content.mjs", "sdk:zh:check": "node scripts/check-localized-sdk-content.mjs", - "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs ios flutter", - "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs ios flutter", + "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs android ios flutter", + "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs android ios flutter", "sdk:native:structure:sync": "node scripts/sync-client-sdk-structure.mjs ios flutter", - "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs ios flutter && node scripts/sync-content-metadata.mjs", + "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs android ios flutter && node scripts/sync-content-metadata.mjs", "structure:sync": "node scripts/import-structure.mjs", "structure:report": "pnpm content:metadata && node scripts/structure-report.mjs && prettier --write docs/STRUCTURE_REPORT.md", "check": "eslint . && tsc --noEmit && pnpm test:audit && node scripts/check-content.mjs && node scripts/check-guides-content-audit.mjs && node scripts/check-wasm-content-audit.mjs && node scripts/check-localized-sdk-content.mjs && node scripts/check-client-sdk-content-audit.mjs && node scripts/check-wasm-sdk-examples.mjs && pnpm docsets-sync:lint-openapi && pnpm platform-api:test", "postbuild": "node scripts/prepare-standalone.mjs", - "content:sync": "node scripts/build-wasm-sdk-zh-content.mjs && node scripts/build-client-sdk-zh-content.mjs ios flutter && node scripts/build-search-index.mjs", + "content:sync": "node scripts/build-wasm-sdk-zh-content.mjs && node scripts/build-client-sdk-zh-content.mjs android ios flutter && node scripts/build-search-index.mjs", "guides:sync": "node scripts/import-openim-guides.mjs", "platform-api:sync": "node scripts/import-openim-platform-api.mjs && node scripts/sync-openim-user-api.mjs && node scripts/sync-openim-friend-api.mjs && node scripts/sync-openim-group-api.mjs && node scripts/sync-openim-auth-api.mjs && node scripts/sync-openim-third-api.mjs && node scripts/sync-openim-msg-api.mjs && node scripts/sync-openim-conversation-api.mjs && node scripts/sync-openim-platform-api-order.mjs && node scripts/sync-openim-platform-api-english.mjs && node scripts/build-search-index.mjs", "user-api:sync": "node scripts/sync-openim-user-api.mjs", diff --git a/scripts/__tests__/build-client-sdk-zh-content.test.mjs b/scripts/__tests__/build-client-sdk-zh-content.test.mjs index 4243c51ca2..39397033d7 100644 --- a/scripts/__tests__/build-client-sdk-zh-content.test.mjs +++ b/scripts/__tests__/build-client-sdk-zh-content.test.mjs @@ -52,6 +52,13 @@ test('resolves missing native route records from the reviewed WASM suffix baseli test('native audit seeds and generated packages retain the fixed structural contract', () => { const expected = { + android: { + context: 'chat/sdk/android', + root: 'content/zh/docs/chat/sdk/android', + sdkKey: 'androidSdk', + tag: 'v3.8.4.0', + commit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { context: 'chat/sdk/ios', root: 'content/zh/docs/chat/sdk/ios', diff --git a/scripts/__tests__/build-search-index.test.mjs b/scripts/__tests__/build-search-index.test.mjs index ff54affccb..1af5521546 100644 --- a/scripts/__tests__/build-search-index.test.mjs +++ b/scripts/__tests__/build-search-index.test.mjs @@ -28,23 +28,28 @@ function auditPage(path, zh, en) { }; } -test('omits unpublished WASM pages and indexes published manual Chinese content', () => { - const nonWasm = route('/sdk/android/overview'); +test('applies publication audits to Android and WASM search content', () => { + const android = route('/sdk/android/overview'); const pending = route('/sdk/wasm/pending', 'chat/sdk/wasm'); const published = route('/sdk/wasm/published', 'chat/sdk/wasm'); const result = buildSearchIndexes({ - routes: [nonWasm, pending, published], + routes: [android, pending, published], sourcePages: new Map([ - [nonWasm.path, { body: 'Android source body' }], + [android.path, { body: 'Android source body' }], [pending.path, { body: 'Pending source body' }], [published.path, { body: 'Published source body' }], ]), manualZhPages: new Map([ + [ + android.path, + { body: 'Android 中文正文', description: 'Android 描述', title: 'Android 标题' }, + ], [pending.path, { body: '待审核正文', description: '待审核', title: '待审核' }], [published.path, { body: '已发布中文正文', description: '中文描述', title: '中文标题' }], ]), auditPages: new Map([ + [android.path, auditPage(android.path, 'published', 'published')], [pending.path, auditPage(pending.path, 'written', 'deferred')], [published.path, auditPage(published.path, 'published', 'published')], ]), @@ -52,11 +57,11 @@ test('omits unpublished WASM pages and indexes published manual Chinese content' assert.deepEqual( result.en.map((record) => record.path), - [nonWasm.path, published.path], + [android.path, published.path], ); assert.deepEqual( result.zh.map((record) => record.path), - [nonWasm.path, published.path], + [android.path, published.path], ); assert.equal(result.zh.at(-1).title, '中文标题'); assert.equal(result.zh.at(-1).description, '中文描述'); diff --git a/scripts/__tests__/client-sdk-publication.test.mjs b/scripts/__tests__/client-sdk-publication.test.mjs index c015fe5d07..b84a523fe7 100644 --- a/scripts/__tests__/client-sdk-publication.test.mjs +++ b/scripts/__tests__/client-sdk-publication.test.mjs @@ -12,6 +12,7 @@ import { } from '../../src/lib/client-sdk-publication.ts'; test('detects all registered active SDK routes and excludes legacy native routes', () => { + assert.equal(getClientSdkPlatform('/sdk/android/overview'), 'android'); assert.equal(getClientSdkPlatform('/sdk/ios/overview'), 'ios'); assert.equal(getClientSdkPlatform('/sdk/flutter/overview/'), 'flutter'); assert.equal(getClientSdkPlatform('/sdk/wasm/overview'), 'wasm'); @@ -19,6 +20,7 @@ test('detects all registered active SDK routes and excludes legacy native routes }); test('reads locale publication state per platform audit', () => { + assert.deepEqual(getPublishedClientSdkLocales('/sdk/android/overview'), ['en', 'zh']); assert.equal(isClientSdkLocalePublished('/sdk/ios/overview', 'zh'), true); assert.deepEqual(getPublishedClientSdkLocales('/sdk/flutter/overview'), ['en', 'zh']); assert.equal(isClientSdkLocalePublished('/sdk/flutter/overview', 'en'), true); @@ -40,14 +42,12 @@ test('creates a platform-specific neutral pending body', () => { description: '审核状态说明', }); assert.match(pending?.body ?? '', /OpenIM Flutter SDK/); - assert.equal( - createClientSdkPendingReviewContent({ - path: '/sdk/android/overview', - title: 'Android', - description: 'Android', - }), - undefined, - ); + const androidPending = createClientSdkPendingReviewContent({ + path: '/sdk/android/overview', + title: 'Android', + description: 'Android', + }); + assert.match(androidPending?.body ?? '', /OpenIM Android SDK/); }); test('only selects manual client SDK content after its locale is published', () => { diff --git a/scripts/__tests__/client-sdk-sidebar.test.mjs b/scripts/__tests__/client-sdk-sidebar.test.mjs index 33ada39c22..c848b78925 100644 --- a/scripts/__tests__/client-sdk-sidebar.test.mjs +++ b/scripts/__tests__/client-sdk-sidebar.test.mjs @@ -12,7 +12,20 @@ import { const wasmSidebar = readJson('data/structure/wasm-sidebar.json'); test('registers the supported client SDK platforms and their structure paths', () => { - assert.deepEqual(clientSdkPlatformIds, ['ios', 'flutter', 'wasm']); + assert.deepEqual(clientSdkPlatformIds, ['android', 'ios', 'flutter', 'wasm']); + assert.deepEqual(getClientSdkPlatform('android'), { + id: 'android', + contextKey: 'chat/sdk/android', + routePrefix: '/sdk/android', + manualRoot: 'content/zh/docs/chat/sdk/android', + auditPath: 'data/structure/android-content-audit.json', + labelsPath: 'data/structure/android-navigation-labels.json', + sidebarPath: 'data/structure/android-sidebar.json', + localizedOutputPath: 'src/generated/android-sdk-zh-content.json', + sdkSourceKey: 'androidSdk', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }); assert.deepEqual(getClientSdkPlatform('ios'), { id: 'ios', contextKey: 'chat/sdk/ios', @@ -28,7 +41,7 @@ test('registers the supported client SDK platforms and their structure paths', ( }); assert.equal(getClientSdkPlatform('flutter').contextKey, 'chat/sdk/flutter'); assert.equal(getClientSdkPlatform('wasm').contextKey, 'chat/sdk/wasm'); - assert.throws(() => getClientSdkPlatform('android'), /Unknown client SDK platform: android/); + assert.throws(() => getClientSdkPlatform('unknown'), /Unknown client SDK platform: unknown/); }); test('native sidebars keep unique platform routes and may extend the WASM structure', () => { @@ -53,7 +66,7 @@ test('native sidebars keep unique platform routes and may extend the WASM struct test('keeps relationships beside users and account settings beside user profiles', () => { const navigation = readJson('src/generated/navigation.json'); - for (const platform of ['wasm', 'ios', 'flutter']) { + for (const platform of ['wasm', 'ios', 'flutter', 'android']) { const sidebar = readJson(`data/structure/${platform}-sidebar.json`); const user = sidebar.nodes.find((node) => node.id === 'user'); const relationships = sidebar.nodes.find((node) => node.id === 'relationships'); @@ -66,7 +79,9 @@ test('keeps relationships beside users and account settings beside user profiles const globalReceptionPath = platform === 'wasm' ? '/sdk/wasm/user/profile/set-global-message-reception' - : `/sdk/${platform}/user/retrieving-and-updating-user-information/set-global-message-reception`; + : platform === 'android' + ? '/sdk/android/user/user-profile/set-global-message-reception' + : `/sdk/${platform}/user/retrieving-and-updating-user-information/set-global-message-reception`; const onlineStatusPaths = platform === 'wasm' ? [ @@ -74,11 +89,16 @@ test('keeps relationships beside users and account settings beside user profiles '/sdk/wasm/user/online-status/get-subscribe-users-status', '/sdk/wasm/user/online-status/unsubscribe-users-status', ] - : [ - `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, - `/sdk/${platform}/user/retrieving-and-updating-user-information/get-subscribed-user-status`, - `/sdk/${platform}/user/retrieving-and-updating-user-information/unsubscribe-user-status`, - ]; + : platform === 'android' + ? [ + '/sdk/android/user/online-status/subscribe-users-online-status', + '/sdk/android/user/online-status/get-subscribe-online-users-status', + ] + : [ + `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, + `/sdk/${platform}/user/retrieving-and-updating-user-information/get-subscribed-user-status`, + `/sdk/${platform}/user/retrieving-and-updating-user-information/unsubscribe-user-status`, + ]; assert.ok(profile, platform); assert.ok(onlineStatus, platform); diff --git a/scripts/__tests__/search-index-contract.test.mjs b/scripts/__tests__/search-index-contract.test.mjs index 2f54a220ed..21336ca9f4 100644 --- a/scripts/__tests__/search-index-contract.test.mjs +++ b/scripts/__tests__/search-index-contract.test.mjs @@ -14,11 +14,12 @@ function page(path, en, zh) { } test('expects non-client routes and only locale-published client SDK routes', () => { - const nonWasm = { path: '/sdk/android/overview', contextKey: 'chat/sdk/android' }; + const android = { path: '/sdk/android/overview', contextKey: 'chat/sdk/android' }; const pending = { path: '/sdk/wasm/pending', contextKey: 'chat/sdk/wasm' }; const enOnly = { path: '/sdk/wasm/en', contextKey: 'chat/sdk/wasm' }; const zhOnly = { path: '/sdk/wasm/zh', contextKey: 'chat/sdk/wasm' }; const auditPages = new Map([ + [android.path, page(android.path, 'published', 'published')], [pending.path, page(pending.path, 'deferred', 'written')], [enOnly.path, page(enOnly.path, 'published', 'deferred')], [zhOnly.path, page(zhOnly.path, 'deferred', 'published')], @@ -26,11 +27,11 @@ test('expects non-client routes and only locale-published client SDK routes', () assert.deepEqual( validateSearchIndexPaths({ - routes: [nonWasm, pending, enOnly, zhOnly], + routes: [android, pending, enOnly, zhOnly], auditPages, indexes: { - en: [{ path: nonWasm.path }, { path: enOnly.path }], - zh: [{ path: nonWasm.path }, { path: zhOnly.path }], + en: [{ path: android.path }, { path: enOnly.path }], + zh: [{ path: android.path }, { path: zhOnly.path }], }, }), [], diff --git a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs index 90b591dfa3..8bd14b6654 100644 --- a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs +++ b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs @@ -63,12 +63,14 @@ test('replaces legacy platform route records with the reviewed active tree', () test('resolves every active native suffix against the current WASM routes', () => { const routes = readJson('src/generated/routes.json'); - for (const platformId of ['ios', 'flutter']) { + for (const platformId of ['android', 'ios', 'flutter']) { const sidebar = readJson(`data/structure/${platformId}-sidebar.json`); const resolved = resolveClientSdkSkeletonRoutes({ platformId, sidebar, routes }); assert.equal(resolved.length, getSidebarPathCount(sidebar)); assert.equal(resolved[0].path, `/sdk/${platformId}/overview`); - assert.equal(resolved[0].title, `OpenIM SDK for ${platformId === 'ios' ? 'iOS' : 'Flutter'}`); + const displayName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; + assert.equal(resolved[0].title, `OpenIM SDK for ${displayName}`); } }); @@ -93,6 +95,29 @@ test('uses each native SDK method name while preserving the shared WASM route su ); }); +test('supports reviewed Android extension routes outside the WASM tree', () => { + const routes = readJson('src/generated/routes.json'); + const sidebar = readJson('data/structure/android-sidebar.json'); + const resolved = resolveClientSdkSkeletonRoutes({ platformId: 'android', sidebar, routes }); + assert.ok( + resolved.some( + (route) => + route.path === '/sdk/android/user/user-profile/get-self-local-user-info' && + route.title === 'Get the current user profile', + ), + ); + + const next = replaceClientSdkRouteRecords({ platformId: 'android', sidebar, routes }); + const extension = next.find( + (route) => route.path === '/sdk/android/user/online-status/subscribe-users-online-status', + ); + assert.equal(extension?.template, 'guide'); + assert.equal( + extension?.contentFile, + 'content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx', + ); +}); + function getSidebarPathCount(sidebar) { const count = (nodes) => nodes.reduce( diff --git a/scripts/__tests__/wasm-commercial.test.mjs b/scripts/__tests__/wasm-commercial.test.mjs index 604bdccac4..dcb7db3613 100644 --- a/scripts/__tests__/wasm-commercial.test.mjs +++ b/scripts/__tests__/wasm-commercial.test.mjs @@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs'; import test from 'node:test'; const ownership = JSON.parse(readFileSync('data/structure/wasm-api-ownership.json', 'utf8')); +const androidAudit = JSON.parse(readFileSync('data/structure/android-content-audit.json', 'utf8')); const flutterAudit = JSON.parse(readFileSync('data/structure/flutter-content-audit.json', 'utf8')); const iosAudit = JSON.parse(readFileSync('data/structure/ios-content-audit.json', 'utf8')); @@ -82,6 +83,7 @@ const nonCommercialEvents = [ ]; const platformSymbolAliases = { + android: {}, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -141,6 +143,9 @@ const fullCommercialConceptPages = new Set([ '/sdk/ios/conversation/managing-conversations/set-message-destruct', '/sdk/ios/conversation/managing-conversations/set-message-destruct-time', '/sdk/ios/message/composing-messages/save-local-transcript', + '/sdk/android/conversation/managing-conversations/set-private-chat', + '/sdk/android/conversation/managing-conversations/set-burn-duration', + '/sdk/android/conversation/managing-conversations/set-message-destruct', ]); function applyCommercialConceptOverride(pagePath, info) { @@ -200,7 +205,7 @@ function getPageCommercialInfo(pagePath) { }; } - const match = pagePath.match(/^\/sdk\/(wasm|flutter|ios)(\/.*)$/); + const match = pagePath.match(/^\/sdk\/(android|wasm|flutter|ios)(\/.*)$/); if (!match) return { kind: 'none', methods: [], openSourceMethods: [], events: [] }; const platform = match[1]; @@ -209,7 +214,8 @@ function getPageCommercialInfo(pagePath) { return applyCommercialConceptOverride(pagePath, getWasmPageCommercialInfo(wasmPath)); } - const audit = platform === 'flutter' ? flutterAudit : iosAudit; + const audit = + platform === 'android' ? androidAudit : platform === 'flutter' ? flutterAudit : iosAudit; const page = audit.pages.find( (entry) => entry.currentPath === pagePath && entry.disposition !== 'omit', ); diff --git a/scripts/build-client-sdk-zh-content.mjs b/scripts/build-client-sdk-zh-content.mjs index 79331aea48..ab8744aca0 100644 --- a/scripts/build-client-sdk-zh-content.mjs +++ b/scripts/build-client-sdk-zh-content.mjs @@ -142,7 +142,7 @@ export function resolvePlatformRoutes({ platform, routesData, sidebar }) { suffix === 'overview' ? platform.id === 'wasm' ? structuralRoute.title - : `OpenIM SDK for ${platform.id === 'ios' ? 'iOS' : 'Flutter'}` + : `OpenIM SDK for ${platform.id === 'ios' ? 'iOS' : platform.id === 'android' ? 'Android' : 'Flutter'}` : structuralRoute.title, }; }); @@ -150,7 +150,7 @@ export function resolvePlatformRoutes({ platform, routesData, sidebar }) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter', 'wasm']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter', 'wasm']; for (const platformId of platformIds) { const output = await buildClientSdkLocalizedFile(platformId); console.log( diff --git a/scripts/check-client-sdk-content-audit.mjs b/scripts/check-client-sdk-content-audit.mjs index 22be4be8eb..c01690a538 100644 --- a/scripts/check-client-sdk-content-audit.mjs +++ b/scripts/check-client-sdk-content-audit.mjs @@ -169,6 +169,10 @@ function validateManualPage({ platform, page, path, source, errors }) { ) { errors.push(`${path}: content invents a Flutter listener removal API`); } + } else if (platform.id === 'android') { + if ((page.sdkMethods?.length ?? 0) > 0 && !source.includes('```java')) { + errors.push(`${path}: method page requires a Java example`); + } } } @@ -192,7 +196,7 @@ function extractDartCodeBlocks(source) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; let failed = false; for (const platformId of platformIds) { const platform = getClientSdkPlatform(platformId); diff --git a/scripts/lib/client-sdk-platforms.mjs b/scripts/lib/client-sdk-platforms.mjs index b326948cdb..724b7d4f2e 100644 --- a/scripts/lib/client-sdk-platforms.mjs +++ b/scripts/lib/client-sdk-platforms.mjs @@ -1,4 +1,17 @@ const clientSdkPlatforms = { + android: { + id: 'android', + contextKey: 'chat/sdk/android', + routePrefix: '/sdk/android', + manualRoot: 'content/zh/docs/chat/sdk/android', + auditPath: 'data/structure/android-content-audit.json', + labelsPath: 'data/structure/android-navigation-labels.json', + sidebarPath: 'data/structure/android-sidebar.json', + localizedOutputPath: 'src/generated/android-sdk-zh-content.json', + sdkSourceKey: 'androidSdk', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { id: 'ios', contextKey: 'chat/sdk/ios', diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index 3618d34c98..a611e3ac20 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -7,6 +7,35 @@ import { getClientSdkSidebarPaths } from './lib/client-sdk-sidebar.mjs'; const root = process.cwd(); +const androidRouteTitles = { + 'user/overview-user': 'User overview', + 'user/user-profile/get-users-info': 'Get specified user profiles', + 'user/user-profile/get-self-local-user-info': 'Get the current user profile', + 'user/user-profile/set-self-info': 'Update the current user profile', + 'user/user-profile/set-global-message-reception': 'Set global message reception', + 'user/friends/get-friend-list-page': 'Get the friend list by page', + 'user/friends/search-friends': 'Search friends', + 'user/friends/get-friends-info': 'Get specified friend profiles', + 'user/friends/check-friend': 'Check friendship', + 'user/friends/update-friends': 'Update friend profiles', + 'user/friends/delete-friend': 'Delete a friend', + 'user/friend-applications/add-friend': 'Send a friend request', + 'user/friend-applications/get-recv-friend-application-list': 'Get received friend requests', + 'user/friend-applications/get-send-friend-application-list': 'Get sent friend requests', + 'user/friend-applications/accept-friend-application': 'Accept a friend request', + 'user/friend-applications/refuse-friend-application': 'Reject a friend request', + 'user/blacklist/get-blacklist': 'Get the blacklist', + 'user/blacklist/add-blacklist': 'Block a user', + 'user/blacklist/remove-blacklist': 'Unblock a user', + 'user/online-status/subscribe-users-online-status': 'Subscribe to user online status', + 'user/online-status/get-subscribe-online-users-status': 'Get subscribed user online status', + 'group/group-applications/overview-group-applications': 'Group applications overview', + 'group/retrieving-group-members/overview-retrieving-group-members': + 'Group member queries overview', + 'message/sending-messages/set-msg-send-progress-listener': 'Track message sending progress', + 'file-uploads/track-file-upload-progress': 'Track file upload progress', +}; + const conversationGroupTitles = { ios: { 'conversation/managing-conversation-groups/overview-conversation-groups': @@ -55,13 +84,13 @@ const conversationGroupTitles = { }; export function resolveClientSdkRouteTitle({ platformId, suffix, baselineTitle }) { - if (suffix === 'overview') - return `OpenIM SDK for ${platformId === 'ios' ? 'iOS' : 'Flutter'}`; + if (suffix === 'overview') return `OpenIM SDK for ${getPlatformDisplayName(platformId)}`; + if (platformId === 'android' && androidRouteTitles[suffix]) return androidRouteTitles[suffix]; return conversationGroupTitles[platformId]?.[suffix] ?? baselineTitle; } export function buildClientSdkSkeleton({ path, platformId, title }) { - const platformName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const platformName = getPlatformDisplayName(platformId); const template = path === `/sdk/${platformId}/overview` ? 'overview' : 'guide'; return `--- title: '${escapeSingleQuote(title)}' @@ -87,8 +116,10 @@ export function isGeneratedClientSdkSkeleton(source) { return ( /generatedBy:\s*['"]sync-client-sdk-route-skeletons['"]/.test(source) || (/status:\s*['"]draft['"]/.test(source) && - /context:\s*['"]chat\/sdk\/(?:ios|flutter)['"]/.test(source) && - /The English version of this OpenIM (?:iOS|Flutter) SDK guide is deferred/.test(source)) + /context:\s*['"]chat\/sdk\/(?:android|ios|flutter)['"]/.test(source) && + /The English version of this OpenIM (?:Android|iOS|Flutter) SDK guide is deferred/.test( + source, + )) ); } @@ -103,14 +134,15 @@ export function resolveClientSdkSkeletonRoutes({ platformId, sidebar, routes }) const suffix = path.replace(`/sdk/${platformId}/`, ''); const baseline = wasmBySuffix.get(suffix); const existing = routeByPath.get(path); - if (!baseline && !existing) + const extensionTitle = platformId === 'android' ? androidRouteTitles[suffix] : undefined; + if (!baseline && !existing && !extensionTitle) throw new Error(`[${platformId}] missing WASM baseline or platform extension: ${suffix}`); return { path, title: resolveClientSdkRouteTitle({ platformId, suffix, - baselineTitle: existing?.title ?? baseline.title, + baselineTitle: existing?.title ?? baseline?.title ?? extensionTitle, }), }; }); @@ -125,7 +157,8 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { const otherRoutes = routes.filter((route) => route.contextKey !== platform.contextKey); const baseId = Math.max(...otherRoutes.map((route) => route.id)) + 1; const baseSourceIndex = Math.max(...otherRoutes.map((route) => route.sourceIndex)) + 1; - const contextTitle = `SDKs · ${platformId === 'ios' ? 'iOS' : 'Flutter'} · v4`; + const platformName = getPlatformDisplayName(platformId); + const contextTitle = `SDKs · ${platformName} · v4`; const wasmBySuffix = new Map( routes .filter((route) => route.contextKey === 'chat/sdk/wasm') @@ -136,12 +169,13 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { const suffix = path.replace(`${platform.routePrefix}/`, ''); const baseline = wasmBySuffix.get(suffix); const template = baseline ?? existingByPath.get(path); - if (!template) + const extensionTitle = platformId === 'android' ? androidRouteTitles[suffix] : undefined; + if (!template && !extensionTitle) throw new Error(`[${platformId}] missing WASM baseline or platform extension: ${suffix}`); const title = resolveClientSdkRouteTitle({ platformId, suffix, - baselineTitle: template.title, + baselineTitle: template?.title ?? extensionTitle, }); return { ...template, @@ -150,10 +184,14 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { relativePath: `sdk/${platformId}/${suffix}`, sourcePath: path, title, - description: `OpenIM ${platformId === 'ios' ? 'iOS' : 'Flutter'} SDK guide for ${title}.`, + description: `OpenIM ${platformName} SDK guide for ${title}.`, + product: 'sdk', + version: 'v4', platform: platformId, contextKey: platform.contextKey, contextTitle, + template: template?.template ?? 'guide', + status: template?.status ?? 'draft', sourceIndex: baseSourceIndex + index, contentFile: `content/docs/chat/sdk/${platformId}/${suffix}.mdx`, navOrder: baseNavOrder + index, @@ -167,7 +205,7 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; let routes = await readJson('src/generated/routes.json'); for (const platformId of platformIds) { @@ -242,6 +280,12 @@ async function readJson(relativePath) { return JSON.parse(await readFile(resolve(root, relativePath), 'utf8')); } +function getPlatformDisplayName(platformId) { + if (platformId === 'ios') return 'iOS'; + if (platformId === 'android') return 'Android'; + return 'Flutter'; +} + function escapeSingleQuote(value) { return value.replaceAll("'", "''"); } diff --git a/scripts/sync-content-metadata.mjs b/scripts/sync-content-metadata.mjs index 67a9b43679..a67ed1c988 100644 --- a/scripts/sync-content-metadata.mjs +++ b/scripts/sync-content-metadata.mjs @@ -10,6 +10,7 @@ import { const root = process.cwd(); const routesPath = resolve(root, 'src/generated/routes.json'); const navigationPath = resolve(root, 'src/generated/navigation.json'); +const structurePath = resolve(root, 'data/structure/chat-pages.json'); const routes = JSON.parse(await readFile(routesPath, 'utf8')); const navigation = JSON.parse(await readFile(navigationPath, 'utf8')); const clientSdkSidebars = new Map( @@ -92,7 +93,8 @@ for (const context of navigation.contexts) { for (const platformId of clientSdkPlatformIds) { if (sidebarDecisions.get(platformId).mode === 'skip') { const pageCount = getClientSdkSidebarPaths(clientSdkSidebars.get(platformId)).length; - const platformName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const platformName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; console.log( `Skipped ${platformName} client SDK sidebar sync: native route tree has not migrated to all ${pageCount} reviewed paths.`, ); @@ -102,6 +104,22 @@ for (const platformId of clientSdkPlatformIds) { await Promise.all([ writeFile(routesPath, `${JSON.stringify(routes, null, 2)}\n`, 'utf8'), writeFile(navigationPath, `${JSON.stringify(navigation, null, 2)}\n`, 'utf8'), + writeFile( + structurePath, + `${JSON.stringify( + routes.map((route) => ({ + sourcePath: route.sourcePath, + openimPath: route.path, + title: route.title, + context: route.contextKey, + template: route.template, + contentFile: route.contentFile, + })), + null, + 2, + )}\n`, + 'utf8', + ), ]); console.log(`Synchronized content metadata (${changed.toLocaleString()} changed fields).`); diff --git a/src/components/docs/documentation-page.tsx b/src/components/docs/documentation-page.tsx index 460333bc88..1e16f03ed2 100644 --- a/src/components/docs/documentation-page.tsx +++ b/src/components/docs/documentation-page.tsx @@ -291,6 +291,7 @@ export async function renderDocumentationPage( function getSdkOverviewPlatform(path: string): SdkOverviewPlatform | undefined { const overviewPaths: Record = { + '/sdk/android/overview': 'android', '/sdk/flutter/overview': 'flutter', '/sdk/ios/overview': 'ios', '/sdk/wasm/overview': 'wasm', diff --git a/src/components/docs/sdk-overview-page.tsx b/src/components/docs/sdk-overview-page.tsx index 8463905f94..f51dabfc25 100644 --- a/src/components/docs/sdk-overview-page.tsx +++ b/src/components/docs/sdk-overview-page.tsx @@ -24,7 +24,7 @@ type ResourceLink = { title: string; }; -export type SdkOverviewPlatform = 'flutter' | 'ios' | 'wasm'; +export type SdkOverviewPlatform = 'android' | 'flutter' | 'ios' | 'wasm'; type OverviewCopy = { eyebrow: string; @@ -211,6 +211,54 @@ const copy = { } satisfies Record; const mobileCopy = { + android: { + eyebrow: 'Version 4', + intro: + 'OpenIM Android SDK 为原生 Android 应用提供用户、会话、群组、消息、实时事件和本地存储能力。先完成 Android 工程配置与登录,再通过各 manager 的 API 和 listener 把业务数据接入应用状态。', + mostPopular: '热门主题', + recommended: '推荐功能', + resources: '资源', + popular: createMobilePopularCards('android'), + features: [ + { + title: '用户认证', + description: '使用后端签发的 Token 登录,并处理连接、过期和被踢下线事件。', + href: '/sdk/android/getting-started/authenticate-and-manage-session', + }, + { + title: '群组', + description: '管理群资料、群成员、入群申请、权限和群组事件。', + href: '/sdk/android/group/overview-group', + }, + { + title: '事件', + description: '注册各 manager 的 listener,并按稳定标识合并增量数据。', + href: '/sdk/android/events/overview-events', + }, + ], + links: [ + { + title: '发送第一条消息', + description: '完成接入、初始化、登录、选择目标并发送消息。', + href: '/sdk/android/getting-started/send-first-message', + }, + { + title: 'Android 环境接入', + description: '配置 Android 工程、SDK 初始化、网络权限和应用数据目录。', + href: '/sdk/android/getting-started/environment-specific-implementation', + }, + { + title: '日志与诊断', + description: '配置 SDK 日志,并保留错误码和错误信息用于诊断。', + href: '/sdk/android/logger', + }, + { + title: '客户端 SDK 错误码', + description: '查询通用客户端错误码,并按错误来源选择处理方式。', + href: '/sdk/error-codes', + }, + ], + }, flutter: { eyebrow: 'Version 4', intro: diff --git a/src/config/docs.ts b/src/config/docs.ts index afa31f2c3c..5910c84e39 100644 --- a/src/config/docs.ts +++ b/src/config/docs.ts @@ -26,7 +26,7 @@ export const platformLabels: Record = { export const webCompatibleSdkPlatforms = ['wasm', 'electron', 'miniprogram'] as const; /** Temporarily hidden from SDK nav, home cards, and platform switcher. Routes remain. */ -export const hiddenSdkPlatforms = ['android', 'uniapp', 'react-native'] as const; +export const hiddenSdkPlatforms = ['uniapp', 'react-native'] as const; export function isSdkPlatformVisible(platform?: string | null): boolean { if (!platform) return true; @@ -52,6 +52,7 @@ export const sdkPlatformSections: SdkPlatformSection[] = [ { items: [ { label: 'iOS', platform: 'ios', href: '/sdk/ios/overview' }, + { label: 'Android', platform: 'android', href: '/sdk/android/overview' }, { label: 'Flutter', platform: 'flutter', href: '/sdk/flutter/overview' }, ], }, diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json new file mode 100644 index 0000000000..93cc315043 --- /dev/null +++ b/src/generated/android-sdk-zh-content.json @@ -0,0 +1,1765 @@ +{ + "sourceContext": "chat/sdk/android", + "sourceRoot": "content/zh/docs/chat/sdk/android", + "pageCount": 134, + "manualPageCount": 134, + "pendingPaths": [], + "reviewStates": { + "/sdk/android/overview": "published", + "/sdk/android/getting-started/before-you-start": "published", + "/sdk/android/getting-started/environment-specific-implementation": "published", + "/sdk/android/getting-started/authenticate-and-manage-session": "published", + "/sdk/android/getting-started/send-first-message": "published", + "/sdk/android/user/overview-user": "published", + "/sdk/android/user/user-profile/get-users-info": "published", + "/sdk/android/user/user-profile/get-self-local-user-info": "published", + "/sdk/android/user/user-profile/set-self-info": "published", + "/sdk/android/user/user-profile/set-global-message-reception": "published", + "/sdk/android/user/online-status/subscribe-users-online-status": "published", + "/sdk/android/user/online-status/get-subscribe-online-users-status": "published", + "/sdk/android/user/friends/get-friend-list-page": "published", + "/sdk/android/user/friends/search-friends": "published", + "/sdk/android/user/friends/get-friends-info": "published", + "/sdk/android/user/friends/check-friend": "published", + "/sdk/android/user/friends/update-friends": "published", + "/sdk/android/user/friends/delete-friend": "published", + "/sdk/android/user/friend-applications/add-friend": "published", + "/sdk/android/user/friend-applications/get-recv-friend-application-list": "published", + "/sdk/android/user/friend-applications/get-send-friend-application-list": "published", + "/sdk/android/user/friend-applications/accept-friend-application": "published", + "/sdk/android/user/friend-applications/refuse-friend-application": "published", + "/sdk/android/user/blacklist/get-blacklist": "published", + "/sdk/android/user/blacklist/add-blacklist": "published", + "/sdk/android/user/blacklist/remove-blacklist": "published", + "/sdk/android/conversation/overview-conversation": "published", + "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target": "published", + "/sdk/android/conversation/retrieving-conversations/get-conversation-id": "published", + "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id": "published", + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list": "published", + "/sdk/android/conversation/managing-conversations/pin-conversation": "published", + "/sdk/android/conversation/managing-conversations/set-conversation-extension": "published", + "/sdk/android/conversation/managing-conversations/set-conversation-draft": "published", + "/sdk/android/conversation/managing-conversations/set-message-receive-option": "published", + "/sdk/android/conversation/managing-conversations/clear-group-mentions": "published", + "/sdk/android/conversation/managing-conversations/mark-conversation-read": "published", + "/sdk/android/conversation/managing-conversations/get-total-unread-count": "published", + "/sdk/android/conversation/managing-conversations/set-private-chat": "published", + "/sdk/android/conversation/managing-conversations/set-burn-duration": "published", + "/sdk/android/conversation/managing-conversations/set-message-destruct": "published", + "/sdk/android/conversation/managing-conversations/hide-a-conversation": "published", + "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages": "published", + "/sdk/android/conversation/managing-conversations/clear-conversation-messages": "published", + "/sdk/android/group/overview-group": "published", + "/sdk/android/group/create-group": "published", + "/sdk/android/group/update-group-profile": "published", + "/sdk/android/group/set-group-announcement": "published", + "/sdk/android/group/set-group-extension": "published", + "/sdk/android/group/set-group-join-verification": "published", + "/sdk/android/group/set-group-member-profile-access": "published", + "/sdk/android/group/set-group-member-friend-permission": "published", + "/sdk/android/group/change-group-mute": "published", + "/sdk/android/group/join-group": "published", + "/sdk/android/group/quit-group": "published", + "/sdk/android/group/dismiss-group": "published", + "/sdk/android/group/retrieving-groups/get-specified-groups-info": "published", + "/sdk/android/group/retrieving-groups/get-joined-group-list-page": "published", + "/sdk/android/group/retrieving-groups/is-join-group": "published", + "/sdk/android/group/retrieving-groups/search-groups": "published", + "/sdk/android/group/group-applications/overview-group-applications": "published", + "/sdk/android/group/group-applications/get-group-application-list-as-recipient": "published", + "/sdk/android/group/group-applications/get-group-application-list-as-applicant": "published", + "/sdk/android/group/group-applications/accept-group-application": "published", + "/sdk/android/group/group-applications/refuse-group-application": "published", + "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": "published", + "/sdk/android/group/retrieving-group-members/get-group-member-list": "published", + "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": "published", + "/sdk/android/group/retrieving-group-members/get-users-in-group": "published", + "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": "published", + "/sdk/android/group/retrieving-group-members/search-group-members": "published", + "/sdk/android/group/managing-group-members/invite-user-to-group": "published", + "/sdk/android/group/managing-group-members/kick-group-member": "published", + "/sdk/android/group/managing-group-members/set-group-member-nickname": "published", + "/sdk/android/group/managing-group-members/set-group-member-role-level": "published", + "/sdk/android/group/managing-group-members/set-group-member-avatar": "published", + "/sdk/android/group/managing-group-members/set-group-member-extension": "published", + "/sdk/android/group/managing-group-members/transfer-group-owner": "published", + "/sdk/android/group/managing-group-members/change-group-member-mute": "published", + "/sdk/android/message/overview-message": "published", + "/sdk/android/message/creating-messages/create-text-message": "published", + "/sdk/android/message/creating-messages/create-text-at-message": "published", + "/sdk/android/message/creating-messages/create-custom-message": "published", + "/sdk/android/message/creating-messages/create-image-message-by-file": "published", + "/sdk/android/message/creating-messages/create-image-message-by-url": "published", + "/sdk/android/message/creating-messages/create-sound-message-by-file": "published", + "/sdk/android/message/creating-messages/create-sound-message-by-url": "published", + "/sdk/android/message/creating-messages/create-video-message-by-file": "published", + "/sdk/android/message/creating-messages/create-video-message-by-url": "published", + "/sdk/android/message/creating-messages/create-file-message-by-file": "published", + "/sdk/android/message/creating-messages/create-file-message-by-url": "published", + "/sdk/android/message/creating-messages/create-card-message": "published", + "/sdk/android/message/creating-messages/create-location-message": "published", + "/sdk/android/message/creating-messages/create-face-message": "published", + "/sdk/android/message/creating-messages/create-quote-message": "published", + "/sdk/android/message/creating-messages/create-forward-message": "published", + "/sdk/android/message/creating-messages/create-merger-message": "published", + "/sdk/android/message/sending-messages/send-message": "published", + "/sdk/android/message/sending-messages/send-message-not-oss": "published", + "/sdk/android/message/sending-messages/set-msg-send-progress-listener": "published", + "/sdk/android/message/receiving-messages/receive-messages": "published", + "/sdk/android/message/receiving-messages/receive-custom-business-messages": "published", + "/sdk/android/message/retrieving-messages/load-older-messages": "published", + "/sdk/android/message/retrieving-messages/load-newer-messages": "published", + "/sdk/android/message/retrieving-messages/find-messages-by-id": "published", + "/sdk/android/message/searching-messages/search-messages": "published", + "/sdk/android/message/composing-messages/update-typing-status": "published", + "/sdk/android/message/managing-messages/delete-local-message": "published", + "/sdk/android/message/managing-messages/delete-saved-messages": "published", + "/sdk/android/message/managing-messages/revoke-a-message": "published", + "/sdk/android/message/managing-messages/modify-a-message": "published", + "/sdk/android/message/managing-messages/get-pinned-messages": "published", + "/sdk/android/message/managing-messages/set-message-pinned": "published", + "/sdk/android/message/managing-messages/insert-local-single-message": "published", + "/sdk/android/message/managing-messages/insert-local-group-message": "published", + "/sdk/android/message/managing-messages/clear-all-local-messages": "published", + "/sdk/android/message/managing-messages/clear-all-messages": "published", + "/sdk/android/message/managing-messages/set-message-local-ex": "published", + "/sdk/android/file-uploads/track-file-upload-progress": "published", + "/sdk/android/file-uploads/upload-file": "published", + "/sdk/android/calling/overview-calling": "published", + "/sdk/android/calling/managing-calls/start-single-call": "published", + "/sdk/android/calling/managing-calls/start-group-call": "published", + "/sdk/android/calling/managing-calls/accept-call": "published", + "/sdk/android/calling/managing-calls/reject-call": "published", + "/sdk/android/calling/managing-calls/cancel-call": "published", + "/sdk/android/calling/managing-calls/hang-up-call": "published", + "/sdk/android/calling/managing-calls/handle-call-events": "published", + "/sdk/android/calling/retrieving-call-information/restore-pending-invitation": "published", + "/sdk/android/calling/retrieving-call-information/get-room-by-group-id": "published", + "/sdk/android/calling/retrieving-call-information/get-token-by-room-id": "published", + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal": "published", + "/sdk/android/events/overview-events": "published", + "/sdk/android/logger": "published" + }, + "navigationLabels": { + "OpenIM SDK for Android": "OpenIM Android SDK 概览", + "Overview": "概览", + "overview": "概览", + "Getting started": "快速开始", + "getting-started": "快速开始", + "Before you start": "开始之前", + "before-you-start": "开始之前", + "Integrate for Android": "按 Android 环境接入", + "Environment-specific implementation": "按 Android 环境接入", + "environment-specific-implementation": "按 Android 环境接入", + "Authenticate and manage a session": "认证与管理登录会话", + "authenticate-and-manage-session": "认证与管理登录会话", + "Send your first message": "发送第一条消息", + "send-first-message": "发送第一条消息", + "Users": "用户", + "User": "用户", + "user": "用户", + "User overview": "用户概览", + "overview-user": "用户概览", + "User profiles": "用户资料", + "User profile": "用户资料", + "user-profile": "用户资料", + "user/user-profile": "用户资料", + "Get specified user profiles": "获取指定用户资料", + "get-users-info": "获取指定用户资料", + "Get the current user profile": "获取当前用户资料", + "get-self-local-user-info": "获取当前用户资料", + "Update the current user profile": "更新当前用户资料", + "set-self-info": "更新当前用户资料", + "Set global message reception": "设置全局消息接收方式", + "set-global-message-reception": "设置全局消息接收方式", + "Relationships": "关系链", + "relationships": "关系链", + "Friends": "好友", + "friends": "好友", + "user/friends": "好友", + "Get the friend list by page": "分页获取好友列表", + "Get the friend list": "分页获取好友列表", + "get-friend-list-page": "分页获取好友列表", + "Search friends": "搜索好友", + "search-friends": "搜索好友", + "Get specified friend profiles": "查询指定好友资料", + "Get friend profiles": "查询指定好友资料", + "get-friends-info": "查询指定好友资料", + "Check friendship": "检查好友关系", + "Check friendship status": "检查好友关系", + "check-friend": "检查好友关系", + "Update friend profiles": "更新好友资料", + "Update friend information": "更新好友资料", + "update-friends": "更新好友资料", + "Delete a friend": "删除好友", + "delete-friend": "删除好友", + "Friend requests": "好友申请", + "Friend applications": "好友申请", + "friend-applications": "好友申请", + "user/friend-applications": "好友申请", + "Send a friend request": "发送好友申请", + "Send a friend application": "发送好友申请", + "add-friend": "发送好友申请", + "Get received friend requests": "获取收到的好友申请", + "Get received friend applications": "获取收到的好友申请", + "get-recv-friend-application-list": "获取收到的好友申请", + "Get sent friend requests": "获取发出的好友申请", + "Get sent friend applications": "获取发出的好友申请", + "get-send-friend-application-list": "获取发出的好友申请", + "Accept a friend request": "接受好友申请", + "Accept a friend application": "接受好友申请", + "accept-friend-application": "接受好友申请", + "Reject a friend request": "拒绝好友申请", + "Reject a friend application": "拒绝好友申请", + "refuse-friend-application": "拒绝好友申请", + "Blacklist": "黑名单", + "blacklist": "黑名单", + "user/blacklist": "黑名单", + "Get the blacklist": "获取黑名单列表", + "get-blacklist": "获取黑名单列表", + "Block a user": "拉黑用户", + "add-blacklist": "拉黑用户", + "Unblock a user": "取消拉黑用户", + "remove-blacklist": "取消拉黑用户", + "Online status": "在线状态", + "online-status": "在线状态", + "user/online-status": "在线状态", + "Subscribe to user online status": "订阅用户在线状态", + "Subscribe to user status": "订阅用户在线状态", + "subscribe-users-online-status": "订阅用户在线状态", + "Get subscribed user online status": "查询已订阅用户状态", + "Refresh subscribed user status": "查询已订阅用户状态", + "get-subscribe-online-users-status": "查询已订阅用户状态", + "Conversation": "会话", + "conversation": "会话", + "Conversation overview": "会话概览", + "overview-conversation": "会话概览", + "Retrieving conversations": "查询会话", + "retrieving-conversations": "查询会话", + "Open a conversation": "查询指定会话", + "get-conversation-by-target": "查询指定会话", + "Resolve a conversation ID": "生成会话 ID", + "get-conversation-id": "生成会话 ID", + "Get conversations by ID": "按 ID 批量获取会话", + "get-conversations-by-id": "按 ID 批量获取会话", + "Get the conversation list": "获取会话列表", + "retrieve-conversation-list": "获取会话列表", + "Conversation organization": "会话整理", + "conversation-list-and-drafts": "会话整理", + "Pin or unpin a conversation": "置顶或取消置顶会话", + "pin-conversation": "置顶或取消置顶会话", + "Set conversation extra data": "设置会话扩展字段", + "set-conversation-extension": "设置会话扩展字段", + "Set a conversation draft": "设置会话草稿", + "set-conversation-draft": "设置会话草稿", + "Unread status and notifications": "未读与消息提醒", + "message-reception-and-reminders": "未读与消息提醒", + "Set conversation message reception": "设置会话消息接收方式", + "set-message-receive-option": "设置会话消息接收方式", + "Reset group mention status": "重置群聊 @ 状态", + "clear-group-mentions": "重置群聊 @ 状态", + "Mark a conversation as read": "标记会话已读", + "mark-conversation-read": "标记会话已读", + "Track the total unread count": "获取消息总未读数", + "get-total-unread-count": "获取消息总未读数", + "Message retention and privacy": "消息保留与隐私", + "message-retention-and-privacy": "消息保留与隐私", + "Enable or disable burn after reading": "开启或关闭阅后即焚", + "set-private-chat": "开启或关闭阅后即焚", + "Set the burn duration": "设置阅后即焚时长", + "set-burn-duration": "设置阅后即焚时长", + "Schedule server message deletion": "定期删除服务端消息", + "set-message-destruct": "定期删除服务端消息", + "Hiding and deleting conversations": "隐藏与删除会话", + "hiding-and-deleting-conversations": "隐藏与删除会话", + "Hide a conversation": "隐藏会话", + "hide-a-conversation": "隐藏会话", + "Delete a conversation and its messages": "删除会话及消息", + "delete-conversation-with-messages": "删除会话及消息", + "Clear messages in a conversation": "清空会话消息", + "clear-conversation-messages": "清空会话消息", + "Group": "群组", + "group": "群组", + "Group overview": "群组概览", + "overview-group": "群组概览", + "Group profile and settings": "群资料与设置", + "profile-and-settings": "群资料与设置", + "Create a group": "创建群组", + "create-group": "创建群组", + "Update group profile": "更新群资料", + "update-group-profile": "更新群资料", + "Publish a group announcement": "发布群公告", + "set-group-announcement": "发布群公告", + "Set group extra data": "设置群扩展字段", + "set-group-extension": "设置群扩展字段", + "Group permissions": "群权限", + "permissions": "群权限", + "Set group join verification": "设置入群验证方式", + "set-group-join-verification": "设置入群验证方式", + "Set member profile access": "设置成员资料查看权限", + "set-group-member-profile-access": "设置成员资料查看权限", + "Set member friend request permission": "设置成员好友申请权限", + "set-group-member-friend-permission": "设置成员好友申请权限", + "Change group mute status": "设置全员禁言", + "change-group-mute": "设置全员禁言", + "Joining and leaving groups": "加入与退出群组", + "joining-and-leaving": "加入与退出群组", + "Apply to join a group": "申请加入群组", + "join-group": "申请加入群组", + "Leave a group": "退出群组", + "quit-group": "退出群组", + "Dismiss a group": "解散群组", + "dismiss-group": "解散群组", + "Retrieving groups": "查询群组", + "retrieving-groups": "查询群组", + "Get group information": "获取群资料", + "get-specified-groups-info": "获取群资料", + "Get joined groups by page": "分页获取已加入群组", + "get-joined-group-list-page": "分页获取已加入群组", + "Check group membership": "检查是否加入群组", + "is-join-group": "检查是否加入群组", + "Search groups": "搜索群组", + "search-groups": "搜索群组", + "Group applications": "群申请", + "group-applications": "群申请", + "Group applications overview": "群申请概览", + "overview-group-applications": "群申请概览", + "Get received group applications": "获取收到的群申请", + "get-group-application-list-as-recipient": "获取收到的群申请", + "Get sent group applications": "获取发出的群申请", + "get-group-application-list-as-applicant": "获取发出的群申请", + "Accept a group application": "同意群申请", + "accept-group-application": "同意群申请", + "Reject a group application": "拒绝群申请", + "refuse-group-application": "拒绝群申请", + "Retrieving group members": "查询群成员", + "retrieving-group-members": "查询群成员", + "Group member queries overview": "群成员查询概览", + "overview-retrieving-group-members": "群成员查询概览", + "Get group members": "获取群成员列表", + "get-group-member-list": "获取群成员列表", + "Get group member profiles": "获取群成员资料", + "get-specified-group-members-info": "获取群成员资料", + "Check users in a group": "检查用户是否在群内", + "get-users-in-group": "检查用户是否在群内", + "Get group owners and admins": "获取群主和管理员", + "get-group-member-owner-and-admin": "获取群主和管理员", + "Search group members": "搜索群成员", + "search-group-members": "搜索群成员", + "Managing group members": "管理群成员", + "managing-group-members": "管理群成员", + "Invite users to a group": "邀请用户入群", + "invite-user-to-group": "邀请用户入群", + "Remove group members": "移除群成员", + "kick-group-member": "移除群成员", + "Update a group nickname": "更新群昵称", + "set-group-member-nickname": "更新群昵称", + "Manage group administrators": "管理群管理员", + "set-group-member-role-level": "管理群管理员", + "Update a group member avatar": "更新群成员头像", + "set-group-member-avatar": "更新群成员头像", + "Set group member extra data": "设置群成员扩展字段", + "set-group-member-extension": "设置群成员扩展字段", + "Transfer group ownership": "转让群主", + "transfer-group-owner": "转让群主", + "Mute or unmute a group member": "禁言或解除禁言群成员", + "change-group-member-mute": "禁言或解除禁言群成员", + "Message": "消息", + "message": "消息", + "Message overview": "消息概览", + "overview-message": "消息概览", + "Creating messages": "创建消息", + "creating-messages": "创建消息", + "Create a text message": "创建文本消息", + "create-text-message": "创建文本消息", + "Create a mention message": "创建 @ 消息", + "create-text-at-message": "创建 @ 消息", + "Create a custom message": "创建自定义消息", + "create-custom-message": "创建自定义消息", + "Create an image message from a file": "从文件创建图片消息", + "create-image-message-by-file": "从文件创建图片消息", + "Create an image message from a URL": "从 URL 创建图片消息", + "create-image-message-by-url": "从 URL 创建图片消息", + "Create an audio message from a file": "从文件创建音频消息", + "create-sound-message-by-file": "从文件创建音频消息", + "Create an audio message from a URL": "从 URL 创建音频消息", + "create-sound-message-by-url": "从 URL 创建音频消息", + "Create a video message from a file": "从文件创建视频消息", + "create-video-message-by-file": "从文件创建视频消息", + "Create a video message from a URL": "从 URL 创建视频消息", + "create-video-message-by-url": "从 URL 创建视频消息", + "Create a file message from a file": "从文件创建文件消息", + "create-file-message-by-file": "从文件创建文件消息", + "Create a file message from a URL": "从 URL 创建文件消息", + "create-file-message-by-url": "从 URL 创建文件消息", + "Create a contact card message": "创建名片消息", + "create-card-message": "创建名片消息", + "Create a location message": "创建位置消息", + "create-location-message": "创建位置消息", + "Create an emoji message": "创建表情消息", + "create-face-message": "创建表情消息", + "Create a reply message": "创建引用消息", + "create-quote-message": "创建引用消息", + "Create a forwarded message": "创建转发消息", + "create-forward-message": "创建转发消息", + "Create a merged message": "创建合并消息", + "create-merger-message": "创建合并消息", + "Sending messages": "发送消息", + "sending-messages": "发送消息", + "Send a message": "发送消息", + "send-message": "发送消息", + "Send a message without OSS": "发送非 OSS 消息", + "send-message-not-oss": "发送非 OSS 消息", + "Track message sending progress": "跟踪消息发送进度", + "set-msg-send-progress-listener": "跟踪消息发送进度", + "Receiving messages": "接收消息", + "receiving-messages": "接收消息", + "Receive messages": "接收消息", + "receive-messages": "接收消息", + "Receive custom business messages": "接收自定义业务消息", + "receive-custom-business-messages": "接收自定义业务消息", + "Retrieving messages": "查询消息", + "retrieving-messages": "查询消息", + "Load older messages": "加载更早消息", + "load-older-messages": "加载更早消息", + "Load newer messages": "加载更新消息", + "load-newer-messages": "加载更新消息", + "Find messages by ID": "按 ID 查询消息", + "find-messages-by-id": "按 ID 查询消息", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Composing messages": "编辑消息", + "composing-messages": "编辑消息", + "Update typing status": "更新输入状态", + "update-typing-status": "更新输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "Delete saved messages": "删除已保存消息", + "delete-saved-messages": "删除已保存消息", + "Revoke a message": "撤回消息", + "revoke-a-message": "撤回消息", + "Modify a message": "修改消息", + "modify-a-message": "修改消息", + "View pinned messages": "查看置顶消息", + "get-pinned-messages": "查看置顶消息", + "Pin or unpin a message": "置顶或取消置顶消息", + "set-message-pinned": "置顶或取消置顶消息", + "Insert a local direct message": "插入本地单聊消息", + "insert-local-single-message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "insert-local-group-message": "插入本地群聊消息", + "Clear all local messages": "清空全部本地消息", + "clear-all-local-messages": "清空全部本地消息", + "Clear all saved messages": "清空全部已保存消息", + "clear-all-messages": "清空全部已保存消息", + "Set local message extensions": "设置消息本地扩展字段", + "set-message-local-ex": "设置消息本地扩展字段", + "Create an @ message": "创建 @ 消息", + "Create a video message from files": "从文件创建视频消息", + "Create a video message from URLs": "从 URL 创建视频消息", + "Create a merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送已上传媒体消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "逆序加载历史消息", + "Report typing status": "上报输入状态", + "Delete messages in a batch": "批量删除消息", + "Get pinned messages in a conversation": "获取会话置顶消息", + "Insert a local one-to-one message": "插入本地单聊消息", + "Clear local and server messages": "清空本地和服务端消息", + "Set a local message extension": "设置消息本地扩展字段", + "File uploads": "文件上传", + "file-uploads": "文件上传", + "Track file upload progress": "跟踪文件上传进度", + "track-file-upload-progress": "跟踪文件上传进度", + "Upload a file": "上传文件", + "upload-file": "上传文件", + "Calling": "音视频通话", + "calling": "音视频通话", + "Audio and video calling overview": "音视频通话概览", + "Calling overview": "音视频通话概览", + "overview-calling": "音视频通话概览", + "Managing calls": "管理通话", + "managing-calls": "管理通话", + "Start a one-to-one call": "发起单聊通话", + "start-single-call": "发起单聊通话", + "Start a group call": "发起群聊通话", + "start-group-call": "发起群聊通话", + "Accept a call": "接受通话", + "accept-call": "接受通话", + "Reject a call": "拒绝通话", + "reject-call": "拒绝通话", + "Cancel a call invitation": "取消通话邀请", + "cancel-call": "取消通话邀请", + "Hang up a call": "挂断通话", + "hang-up-call": "挂断通话", + "Handle call events": "处理通话事件", + "handle-call-events": "处理通话事件", + "Retrieving call information": "通话恢复与房间信息", + "retrieving-call-information": "通话恢复与房间信息", + "Restore a pending invitation": "恢复启动前收到的通话邀请", + "restore-pending-invitation": "恢复启动前收到的通话邀请", + "Get a group call room": "查询群组通话房间", + "get-room-by-group-id": "查询群组通话房间", + "Get room credentials": "获取通话房间 Token", + "get-token-by-room-id": "获取通话房间 Token", + "Sending custom signals": "发送自定义信令", + "sending-custom-signals": "发送自定义信令", + "Send a custom signal": "发送自定义信令", + "send-a-custom-signal": "发送自定义信令", + "Events": "事件", + "events": "事件", + "Events overview": "事件概览", + "overview-events": "事件概览", + "Logging": "日志", + "Logger": "日志", + "logger": "日志" + }, + "pages": { + "/sdk/android/overview": { + "body": "OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。\n\n## 文档导航\n\n| 领域 | 内容 |\n| --- | --- |\n| [快速开始](/sdk/android/getting-started/environment-specific-implementation) | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 |\n| [用户与关系链](/sdk/android/user/overview-user) | 用户资料、在线状态、好友、好友申请和黑名单。 |\n| [会话](/sdk/android/conversation/overview-conversation) | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 |\n| [群组](/sdk/android/group/overview-group) | 群资料、群成员、入群申请、权限、禁言和群组事件。 |\n| [消息](/sdk/android/message/overview-message) | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 |\n| [文件上传](/sdk/android/file-uploads/upload-file) | 独立文件上传和上传进度。 |\n| [音视频通话](/sdk/android/calling/overview-calling) | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 |\n| [事件](/sdk/android/events/overview-events) | 各 manager 的 listener、连接状态和数据事件。 |\n| [日志](/sdk/android/logger) | SDK 日志配置和排查。 |", + "description": "在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。", + "headings": [ + { + "depth": 2, + "title": "文档导航", + "url": "#文档导航" + } + ], + "sourcePath": "/sdk/android/overview", + "title": "OpenIM Android SDK 概览" + }, + "/sdk/android/getting-started/before-you-start": { + "body": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。\n\n## 准备 OpenIMServer\n\n如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址:\n\n| 字段 | 说明 |\n| --------- | ------------------------------------------------------ |\n| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 |\n| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 |\n\n不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器:\n\n```bash\nadb reverse tcp:10002 tcp:10002\nadb reverse tcp:10001 tcp:10001\n```\n\n映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。\n\n## 准备用户和 Token\n\n`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。\n\n后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据:\n\n| 数据 | 说明 |\n| --- | --- |\n| `userID` | 当前登录用户的 OpenIM 用户 ID。 |\n| `token` | 与该用户对应的登录 Token。 |\n| `apiAddr` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | OpenIMServer WebSocket 地址。 |\n\n`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。\n\n## 准备 Android 工程\n\n接入前,确认 Android 工程具备以下条件:\n\n- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。\n- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。\n- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。\n- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。\n- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。\n- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。\n\n具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 继续接入\n\n准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。", + "description": "准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。", + "headings": [ + { + "depth": 2, + "title": "准备 OpenIMServer", + "url": "#准备-openimserver" + }, + { + "depth": 2, + "title": "准备用户和 Token", + "url": "#准备用户和-token" + }, + { + "depth": 2, + "title": "准备 Android 工程", + "url": "#准备-android-工程" + }, + { + "depth": 2, + "title": "继续接入", + "url": "#继续接入" + } + ], + "sourcePath": "/sdk/android/getting-started/before-you-start", + "title": "开始之前" + }, + "/sdk/android/getting-started/environment-specific-implementation": { + "body": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 添加 SDK 依赖\n\n在应用 module 的 `build.gradle` 中添加依赖:\n\n```groovy\ndependencies {\n implementation 'io.openim:android-sdk:latest@aar'\n implementation 'io.openim:core-sdk:latest@aar'\n implementation 'com.google.code.gson:gson:2.9.0'\n}\n```\n\n## 配置 Manifest\n\n应用需要网络访问权限:\n\n```xml\n\n\n```\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", + "description": "在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。", + "headings": [ + { + "depth": 2, + "title": "添加 SDK 依赖", + "url": "#添加-sdk-依赖" + }, + { + "depth": 2, + "title": "配置 Manifest", + "url": "#配置-manifest" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" + } + ], + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "按 Android 环境接入" + }, + "/sdk/android/getting-started/authenticate-and-manage-session": { + "body": "OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。\n\n完整流程如下:\n\n1. 在应用级会话组件中创建稳定的 `OnConnListener`。\n2. 调用 `initSDK()` 并确认返回 `true`。\n3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。\n4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。\n5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。\n6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。\n\n下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。\n\n## 初始化并处理连接生命周期\n\n在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。\n\n```java\nimport android.app.Application;\n\nimport java.io.File;\n\nimport io.openim.android.sdk.OpenIMClient;\nimport io.openim.android.sdk.enums.LogLevel;\nimport io.openim.android.sdk.listener.OnConnListener;\nimport io.openim.android.sdk.models.InitConfig;\n\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nif (!dataDirectory.exists() && !dataDirectory.mkdirs()) {\n throw new IllegalStateException(\"Cannot create the OpenIM data directory.\");\n}\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = LogLevel.Info;\nconfig.isLogStandardOutput = false;\n\nOnConnListener connectionListener = new OnConnListener() {\n @Override\n public void onConnecting() {\n sessionState.setConnectionState(\"connecting\");\n }\n\n @Override\n public void onConnectSuccess() {\n sessionState.setConnectionState(\"connected\");\n sessionState.enableConnectedOperations();\n }\n\n @Override\n public void onConnectFailed(long code, String error) {\n sessionState.setConnectionState(\"failed\");\n recordConnectionFailure(code, error);\n }\n\n @Override\n public void onKickedOffline() {\n sessionState.clearCurrentAccount();\n showSignedInElsewhereScreen();\n }\n\n @Override\n public void onUserTokenExpired() {\n requestNewTokenAndRelogin();\n }\n\n @Override\n public void onUserTokenInvalid(String reason) {\n sessionState.clearCurrentAccount();\n showSignInScreen(reason);\n }\n};\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n\nif (!initialized) {\n throw new IllegalStateException(\"OpenIMClientSDK initialization failed.\");\n}\n```\n\n`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。\n\n| 字段 | 类型 | 说明 |\n| --------------------- | ------------- | ---------------------------------------------------------- |\n| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 |\n| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 |\n| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 |\n| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 |\n| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 |\n\nSDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。\n\n## 在登录前设置业务 listener\n\nSDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。\n\nSDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。\n\n## 登录当前用户\n\n```java\nOpenIMClient.getInstance().login(new OnBase() {\n @Override\n public void onError(int code, String error) {\n sessionState.setLoginState(\"failed\");\n recordLoginFailure(code, error);\n }\n\n @Override\n public void onSuccess(String data) {\n sessionState.setLoginState(\"logged\");\n sessionState.setCurrentUserID(userID);\n }\n}, userID, token);\n```\n\n`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。\n\n## 查询登录状态\n\n```java\nint loginStatus = OpenIMClient.getInstance().getLoginStatus();\n\nif (loginStatus == LoginStatus.Logged) {\n String currentUserID = OpenIMClient.getInstance().getLoginUserID();\n restoreSessionFor(currentUserID);\n}\n```\n\n| 状态 | 说明 |\n| --------------------- | ---------------------------------------------------- |\n| `LoginStatus.Logout` | SDK 当前未登录。 |\n| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 |\n| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 |\n\n`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。\n\n## 处理 Token 和强制下线\n\n收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。\n\n这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。\n\n## 主动退出与释放 SDK\n\n```java\nOpenIMClient.getInstance().logout(new OnBase() {\n @Override\n public void onError(int code, String error) {\n recordLogoutFailure(code, error);\n }\n\n @Override\n public void onSuccess(String data) {\n sessionState.clearCurrentAccount();\n }\n});\n```\n\n`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。\n\n应用最终不再使用 SDK 时可以调用:\n\n```java\nOpenIMClient.getInstance().unInit();\n```\n\n`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。\n\n## 下一步\n\n- [开始之前](/sdk/android/getting-started/before-you-start)\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", + "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。", + "headings": [ + { + "depth": 2, + "title": "初始化并处理连接生命周期", + "url": "#初始化并处理连接生命周期" + }, + { + "depth": 2, + "title": "在登录前设置业务 listener", + "url": "#在登录前设置业务-listener" + }, + { + "depth": 2, + "title": "登录当前用户", + "url": "#登录当前用户" + }, + { + "depth": 2, + "title": "查询登录状态", + "url": "#查询登录状态" + }, + { + "depth": 2, + "title": "处理 Token 和强制下线", + "url": "#处理-token-和强制下线" + }, + { + "depth": 2, + "title": "主动退出与释放 SDK", + "url": "#主动退出与释放-sdk" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" + } + ], + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "认证与管理登录会话" + }, + "/sdk/android/getting-started/send-first-message": { + "body": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。\n\n## 开始前准备\n\n- 为发送方和接收方各准备一个测试账号。\n- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。\n- 将示例中的 `user_b` 替换为接收方的真实 `userID`。\n\n## 第 1 步:让接收方监听新消息\n\n接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。\n\n```java\nOpenIMClient.getInstance()\n .messageManager\n .setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n // 将 message 显示在聊天界面中。\n }\n });\n```\n\n## 第 2 步:确认可以发送\n\n两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。\n\n## 第 3 步:发送文本消息\n\n### 发送单聊文本消息\n\n先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。\n\n```java\nMessage message = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"你好,OpenIMSDK\");\n\nOnMsgSendCallback sendCallback = new OnMsgSendCallback() {\n @Override\n public void onProgress(long progress) {\n // 文本消息通常不需要处理进度。\n }\n\n @Override\n public void onError(int code, String error) {\n // 提示发送失败,并允许用户重试。\n }\n\n @Override\n public void onSuccess(Message sentMessage) {\n // 将 sentMessage 更新到发送方的聊天界面。\n }\n};\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n message,\n \"user_b\",\n \"\",\n new OfflinePushInfo()\n);\n```\n\n`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。\n\n`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。\n\n### 发送群聊文本消息\n\n发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`:\n\n```java\nMessage groupMessage = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"大家好,OpenIMSDK\");\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n groupMessage,\n \"\",\n \"group_123\",\n new OfflinePushInfo()\n);\n```\n\n一次调用只能填写 `userID` 或 `groupID` 其中之一。\n\n## 验证成功\n\n- 发送方进入 `onSuccess()`。\n- 接收方进入 `onRecvNewMessage()`,并看到文本消息。\n- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [OpenIM Android SDK 概览](/sdk/android/overview)", + "description": "在 Android 应用中发送并验证第一条单聊文本消息。", + "headings": [ + { + "depth": 2, + "title": "开始前准备", + "url": "#开始前准备" + }, + { + "depth": 2, + "title": "第 1 步:让接收方监听新消息", + "url": "#第-1-步-让接收方监听新消息" + }, + { + "depth": 2, + "title": "第 2 步:确认可以发送", + "url": "#第-2-步-确认可以发送" + }, + { + "depth": 2, + "title": "第 3 步:发送文本消息", + "url": "#第-3-步-发送文本消息" + }, + { + "depth": 3, + "title": "发送单聊文本消息", + "url": "#发送单聊文本消息" + }, + { + "depth": 3, + "title": "发送群聊文本消息", + "url": "#发送群聊文本消息" + }, + { + "depth": 2, + "title": "验证成功", + "url": "#验证成功" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" + } + ], + "sourcePath": "/sdk/android/getting-started/send-first-message", + "title": "发送第一条消息" + }, + "/sdk/android/user/overview-user": { + "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", + "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", + "headings": [ + { + "depth": 2, + "title": "用户类型", + "url": "#用户类型" + }, + { + "depth": 2, + "title": "功能入口", + "url": "#功能入口" + }, + { + "depth": 2, + "title": "状态更新", + "url": "#状态更新" + } + ], + "sourcePath": "/sdk/android/user/overview-user", + "title": "用户概览" + }, + "/sdk/android/user/user-profile/get-users-info": { + "body": "`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.getUsersInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n for (PublicUserInfo user : users) {\n publicUserStore.put(user.getUserID(), user);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordUserQueryFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。\n\n## 返回结果\n\n| 字段 | 说明 |\n| ------------ | ---------------------------------------- |\n| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 |\n| `nickname` | 账号级公开昵称。 |\n| `faceURL` | 账号级公开头像地址。 |\n| `ex` | 账号级公开扩展字符串,格式由业务约定。 |\n| `createTime` | 用户资料创建时间。 |\n\n`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。\n\n按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。\n\n## 资料刷新\n\n查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。", + "description": "使用 getUsersInfo() 按 userID 批量查询用户公开资料。", + "headings": [ + { + "depth": 2, + "title": "返回结果", + "url": "#返回结果" + }, + { + "depth": 2, + "title": "资料刷新", + "url": "#资料刷新" + } + ], + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "title": "获取指定用户资料" + }, + "/sdk/android/user/user-profile/get-self-local-user-info": { + "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo(\n new OnBase() {\n @Override\n public void onSuccess(LocalUser user) {\n currentUserStore.set(user);\n }\n\n @Override\n public void onError(int code, String error) {\n recordSelfProfileFailure(code, error);\n }\n }\n);\n```\n\n完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。\n\n## 返回结果\n\n| 字段 | 说明 |\n| --------------------- | -------------------------------------------------------------- |\n| `userID` | 当前登录用户 ID。 |\n| `nickname` | 当前账号昵称。 |\n| `faceURL` | 当前账号头像地址。 |\n| `ex` | 当前账号扩展字符串。 |\n| `attachedInfo` | SDK 附加信息,只按业务约定解析。 |\n| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 |\n| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 |\n\n查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。\n\n`getSelfUserInfo()` 已废弃,不作为推荐用法。", + "description": "使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。", + "headings": [ + { + "depth": 2, + "title": "返回结果", + "url": "#返回结果" + } + ], + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "获取当前用户资料" + }, + "/sdk/android/user/user-profile/set-self-info": { + "body": "使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setNickname(displayName.trim());\nrequest.setFaceURL(avatarURL);\nrequest.setEx(mergedExtra);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markProfileUpdateSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordProfileUpdateFailure(code, error);\n }\n },\n request\n);\n```\n\n`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。\n\n成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。\n\n## 更新字段\n\n| 字段 | 说明 |\n| --------------------- | ------------------ |\n| `nickname` | 要更新的昵称。 |\n| `faceURL` | 要更新的头像地址。 |\n| `ex` | 完整扩展字符串。 |\n| `addFriendPermission` | 添加好友权限值。 |\n\n一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。\n\n`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`:\n\n```java\n@Override\npublic void onSelfInfoUpdated(UserInfo info) {\n currentUserStore.merge(info.getUserID(), info);\n}\n```\n\n账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。", + "description": "使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。", + "headings": [ + { + "depth": 2, + "title": "更新字段", + "url": "#更新字段" + } + ], + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "title": "更新当前用户资料" + }, + "/sdk/android/user/user-profile/set-global-message-reception": { + "body": "使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setGlobalRecvMsgOpt(2);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGlobalReceiveOptionSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordGlobalReceiveOptionFailure(code, error);\n }\n },\n request\n);\n```\n\n| 数值 | 含义 |\n| ---- | ------------------------ |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 屏蔽消息。 |\n| `2` | 接收消息但不提示。 |\n\n如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。\n\n成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。", + "description": "通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。", + "headings": [], + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "设置全局消息接收方式" + }, + "/sdk/android/user/online-status/subscribe-users-online-status": { + "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。", + "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", + "headings": [ + { + "depth": 2, + "title": "状态字段", + "url": "#状态字段" + } + ], + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "订阅用户在线状态" + }, + "/sdk/android/user/online-status/get-subscribe-online-users-status": { + "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusQueryFailure(code, error);\n }\n }\n);\n```\n\n该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。\n\n查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。", + "headings": [], + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "查询已订阅用户状态" + }, + "/sdk/android/user/friends/get-friend-list-page": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendListFailure(code, error);\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。\n\n## 好友资料字段\n\n`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID,也是好友列表的稳定标识。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。\n\n本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n friendStore.remove(friend.getUserID());\n}\n```", + "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", + "headings": [ + { + "depth": 2, + "title": "好友资料字段", + "url": "#好友资料字段" + } + ], + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "title": "分页获取好友列表" + }, + "/sdk/android/user/friends/search-friends": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.searchFriends(\n new OnBase>() {\n @Override\n public void onSuccess(List results) {\n showFriendSearchResults(results);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendSearchFailure(code, error);\n }\n },\n Collections.singletonList(keyword.trim()),\n true,\n true,\n true\n);\n```\n\n`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。\n\n成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。", + "description": "使用 searchFriends() 搜索当前用户的好友。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/search-friends", + "title": "搜索好友" + }, + "/sdk/android/user/friends/get-friends-info": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendsInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendInfoFailure(code, error);\n }\n },\n Arrays.asList(\"user_a\", \"user_b\"),\n true\n);\n```\n\n第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。\n\n当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。\n\n该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。", + "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "title": "查询指定好友资料" + }, + "/sdk/android/user/friends/check-friend": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.checkFriend(\n new OnBase>() {\n @Override\n public void onSuccess(List relations) {\n showFriendshipStates(relations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendshipCheckFailure(code, error);\n }\n },\n Arrays.asList(\"user_a\", \"user_b\")\n);\n```\n\n成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。\n\n该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。", + "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/check-friend", + "title": "检查好友关系" + }, + "/sdk/android/user/friends/update-friends": { + "body": "```java\nUpdateFriendsReq request = new UpdateFriendsReq();\nrequest.setFriendUserIDs(new String[] { friendUserID });\nrequest.setRemark(remark.trim());\n\nOpenIMClient.getInstance().friendshipManager.updateFriendsReq(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendUpdateSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendUpdateFailure(code, error);\n }\n },\n request\n);\n```\n\n`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。\n\n| 字段 | 说明 |\n| --------------- | ---------------------------------- |\n| `friendUserIDs` | 待更新的好友 ID 数组。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `isPinned` | 是否置顶好友。 |\n| `ex` | 好友关系扩展字符串,按完整值覆盖。 |\n\n成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", + "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/update-friends", + "title": "更新好友资料" + }, + "/sdk/android/user/friends/delete-friend": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.deleteFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendDeletionSubmitted(friendUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendDeletionFailure(code, error);\n }\n },\n friendUserID\n);\n```\n\n成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", + "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/delete-friend", + "title": "删除好友" + }, + "/sdk/android/user/friend-applications/add-friend": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.addFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendApplicationSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendApplicationFailure(code, error);\n }\n },\n \"user_b\",\n \"你好,我是 Alex\"\n);\n```\n\n第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。\n\n好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。", + "description": "使用 addFriend() 向指定用户发送好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "title": "发送好友申请" + }, + "/sdk/android/user/friend-applications/get-recv-friend-application-list": { + "body": "```java\nGetFriendApplicationListAsRecipientReq request =\n new GetFriendApplicationListAsRecipientReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n replaceReceivedApplications(applications);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceivedApplicationFailure(code, error);\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。\n\n| 字段 | 说明 |\n| --------------------------------------------- | ---------------------------------------------- |\n| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 |\n| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 |\n| `reqMsg` | 申请附言。 |\n| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 |\n| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 |\n| `handleMsg` | 处理附言。 |\n| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 |\n| `createTime` | 申请记录创建时间。 |\n| `ex` | 申请记录扩展字符串。 |\n\n好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendApplicationAdded(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationAccepted(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationRejected(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationDeleted(FriendApplicationInfo application) {\n friendApplicationStore.remove(\n application.getFromUserID(),\n application.getToUserID()\n );\n}\n```\n\n按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。", + "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "获取收到的好友申请" + }, + "/sdk/android/user/friend-applications/get-send-friend-application-list": { + "body": "```java\nGetFriendApplicationListAsApplicantReq request =\n new GetFriendApplicationListAsApplicantReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n replaceSentApplications(applications);\n }\n\n @Override\n public void onError(int code, String error) {\n recordSentApplicationFailure(code, error);\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。\n\n发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。", + "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "获取发出的好友申请" + }, + "/sdk/android/user/friend-applications/accept-friend-application": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.acceptFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markApplicationAccepted(applicantUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordApplicationAcceptFailure(code, error);\n }\n },\n applicantUserID,\n \"已通过\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。", + "description": "使用 acceptFriendApplication() 接受好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "接受好友申请" + }, + "/sdk/android/user/friend-applications/refuse-friend-application": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.refuseFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markApplicationRejected(applicantUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordApplicationRejectFailure(code, error);\n }\n },\n applicantUserID,\n \"暂不添加\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。", + "description": "使用 refuseFriendApplication() 拒绝好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "拒绝好友申请" + }, + "/sdk/android/user/blacklist/get-blacklist": { + "body": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。\n\n## 获取黑名单\n\n完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。\n\n```java\nOpenIMClient.getInstance().friendshipManager.getBlacklist(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n blacklistStore.replace(users);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。\n\n## 黑名单记录字段\n\n`BlacklistInfo` 的常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------------------- |\n| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 |\n| `nickname` | 目标用户昵称快照。 |\n| `faceURL` | 目标用户头像地址。 |\n| `gender` | 目标用户性别值。 |\n| `operatorUserID` | 执行拉黑操作的用户 ID。 |\n| `createTime` | 黑名单关系创建时间。 |\n| `addSource` | 黑名单关系的添加来源。 |\n| `ex` | 黑名单关系扩展字符串。 |\n\n如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。\n\n黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。\n\n首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。", + "description": "使用 getBlacklist() 获取当前用户的黑名单。", + "headings": [ + { + "depth": 2, + "title": "获取黑名单", + "url": "#获取黑名单" + }, + { + "depth": 2, + "title": "黑名单记录字段", + "url": "#黑名单记录字段" + } + ], + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "title": "获取黑名单列表" + }, + "/sdk/android/user/blacklist/add-blacklist": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.addBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBlacklistRequestSubmitted(targetUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistAddFailure(code, error);\n }\n },\n targetUserID,\n \"{\\\"source\\\":\\\"profile-menu\\\"}\"\n);\n```\n\n第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。\n\n黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。\n\n`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onBlacklistAdded(BlacklistInfo user) {\n blacklistStore.put(user.getUserID(), user);\n}\n```", + "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", + "headings": [], + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "title": "拉黑用户" + }, + "/sdk/android/user/blacklist/remove-blacklist": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.removeBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBlacklistRemovalSubmitted(targetUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistRemovalFailure(code, error);\n }\n },\n targetUserID\n);\n```\n\n成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。\n\n`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录:\n\n```java\n@Override\npublic void onBlacklistDeleted(BlacklistInfo user) {\n blacklistStore.remove(user.getUserID());\n}\n```", + "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", + "headings": [], + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "取消拉黑用户" + }, + "/sdk/android/conversation/overview-conversation": { + "body": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。\n\n群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。\n\n## 会话标识\n\n| 标识 | 用途 |\n| ---------------- | ----------------------------------------------------------------------------- |\n| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 |\n| `userID` | 单聊对方的用户 ID。 |\n| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 |\n| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 |\n\n单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。\n\n## ConversationInfo\n\n| 字段 | 说明 |\n| ----------------------------------- | ------------------------------------ |\n| `conversationID` | 会话 ID。 |\n| `conversationType` | 会话类型。 |\n| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 |\n| `showName` / `faceURL` | 会话列表显示名称和头像。 |\n| `unreadCount` | 当前会话未读数。 |\n| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 |\n| `recvMsgOpt` | 当前会话消息接收方式。 |\n| `groupAtType` | 群聊 @ 提醒状态。 |\n| `draftText` / `draftTextTime` | 会话草稿及更新时间。 |\n| `isPinned` | 是否置顶。 |\n| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 |\n| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 |\n| `ex` | 业务约定的会话扩展字符串。 |\n\n## 查询和设置\n\n- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)\n- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id)\n- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id)\n- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)\n- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation)\n- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension)\n- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft)\n- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option)\n- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions)\n- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)\n- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)\n- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)\n- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct)\n\n## 状态更新\n\n查询方法建立会话快照,事件负责合并后续增量:\n\n- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。\n- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。\n\n`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。", + "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", + "headings": [ + { + "depth": 2, + "title": "会话标识", + "url": "#会话标识" + }, + { + "depth": 2, + "title": "ConversationInfo", + "url": "#conversationinfo" + }, + { + "depth": 2, + "title": "查询和设置", + "url": "#查询和设置" + }, + { + "depth": 2, + "title": "状态更新", + "url": "#状态更新" + } + ], + "sourcePath": "/sdk/android/conversation/overview-conversation", + "title": "会话概览" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target": { + "body": "从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。\n\n```java\nOpenIMClient.getInstance().conversationManager.getOneConversation(\n new OnBase() {\n @Override\n public void onSuccess(ConversationInfo conversation) {\n openChatPage(conversation);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationOpenFailure(code, error);\n }\n },\n targetUserID,\n ConversationType.SINGLE_CHAT\n);\n```\n\n参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。", + "description": "使用 getOneConversation() 按用户或群组获取一个 Android 会话。", + "headings": [], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "查询指定会话" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversation-id": { + "body": "只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。\n\n```java\nString conversationID = OpenIMClient.getInstance().conversationManager\n .getConversationIDBySessionType(\n targetUserID,\n ConversationType.SINGLE_CHAT\n );\n```\n\n`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。", + "headings": [], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "生成会话 ID" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id": { + "body": "已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。\n\n```java\nOpenIMClient.getInstance().conversationManager.getMultipleConversation(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n for (ConversationInfo item : conversations) {\n conversationStore.put(item.getConversationID(), item);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationQueryFailure(code, error);\n }\n },\n conversationIDs\n);\n```\n\n调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。\n\n查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。", + "headings": [], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "按 ID 批量获取会话" + }, + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list": { + "body": "会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。\n\n## 分页获取会话\n\n```java\nOpenIMClient.getInstance().conversationManager.getConversationListSplit(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationListFailure(code, error);\n }\n },\n 0,\n 50\n);\n```\n\n| 参数 | 类型 | 说明 |\n| -------- | ------ | ------------------------------------------- |\n| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 |\n| `count` | `long` | 本页期望返回的会话数量。 |\n\n成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。\n\n## 保持列表同步\n\n`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`:\n\n```java\n@Override\npublic void onNewConversation(List conversations) {\n mergeConversations(conversations);\n}\n\n@Override\npublic void onConversationChanged(List conversations) {\n mergeConversations(conversations);\n}\n```\n\n两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。", + "description": "使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。", + "headings": [ + { + "depth": 2, + "title": "分页获取会话", + "url": "#分页获取会话" + }, + { + "depth": 2, + "title": "保持列表同步", + "url": "#保持列表同步" + } + ], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "获取会话列表" + }, + "/sdk/android/conversation/managing-conversations/pin-conversation": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.pinConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPinRequestSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationPinFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。\n\n成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 pinConversation() 设置 Android 指定会话的置顶状态。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "置顶或取消置顶会话" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-extension": { + "body": "`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationEx(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationExtensionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationExtensionFailure(code, error);\n }\n },\n conversationID,\n mergedExtensionJSON\n);\n```\n\n成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "设置会话扩展字段" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-draft": { + "body": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationDraft(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markDraftSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordDraftSaveFailure(code, error);\n }\n },\n conversationID,\n editorValue\n);\n```\n\n清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。", + "description": "使用 setConversationDraft() 保存 Android 会话草稿。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "设置会话草稿" + }, + "/sdk/android/conversation/managing-conversations/set-message-receive-option": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markReceiveOptionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceiveOptionFailure(code, error);\n }\n },\n conversationID,\n 2\n);\n```\n\n| 数值 | 含义 |\n| ---- | ---------------------------- |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 不接收该会话消息,也不通知。 |\n| `2` | 接收该会话消息,但不通知。 |\n\n账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。", + "description": "使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "设置会话消息接收方式" + }, + "/sdk/android/conversation/managing-conversations/clear-group-mentions": { + "body": "用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。\n\n```java\nOpenIMClient.getInstance().conversationManager.resetConversationGroupAtType(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGroupMentionStateReset(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordGroupMentionResetFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。\n\n成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "重置群聊 @ 状态" + }, + "/sdk/android/conversation/managing-conversations/mark-conversation-read": { + "body": "用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。\n\n```java\nOpenIMClient.getInstance().messageManager.markConversationMessageAsRead(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationReadSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMarkReadFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。\n\n对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。", + "description": "使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "标记会话已读" + }, + "/sdk/android/conversation/managing-conversations/get-total-unread-count": { + "body": "`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。\n\n```java\nOpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount(\n new OnBase() {\n @Override\n public void onSuccess(String value) {\n int totalUnread = Integer.parseInt(value);\n updateApplicationBadge(totalUnread);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTotalUnreadFailure(code, error);\n }\n }\n);\n```\n\n回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。\n\n本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "获取消息总未读数" + }, + "/sdk/android/conversation/managing-conversations/set-private-chat": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPrivateChatSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordPrivateChatFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。\n\n成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "开启或关闭阅后即焚" + }, + "/sdk/android/conversation/managing-conversations/set-burn-duration": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationBurnDuration(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBurnDurationSubmitted(conversationID, 30);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBurnDurationFailure(code, error);\n }\n },\n conversationID,\n 30\n);\n```\n\n`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。\n\n成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "设置阅后即焚时长" + }, + "/sdk/android/conversation/managing-conversations/set-message-destruct": { + "body": "`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。\n\n```java\nConversationReq request = new ConversationReq();\nrequest.setMsgDestruct(true);\nrequest.setMsgDestructTime(3600);\n\nOpenIMClient.getInstance().conversationManager.setConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markMessageDestructSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMessageDestructFailure(code, error);\n }\n },\n conversationID,\n request\n);\n```\n\n`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。\n\n成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "定期删除服务端消息" + }, + "/sdk/android/conversation/managing-conversations/hide-a-conversation": { + "body": "`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。\n\n```java\nOpenIMClient.getInstance().conversationManager.hideConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationHideFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。\n\n成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "隐藏会话" + }, + "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages": { + "body": "产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。\n\n```java\nOpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationDeleteFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。\n\n后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "删除会话及消息" + }, + "/sdk/android/conversation/managing-conversations/clear-conversation-messages": { + "body": "产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。\n\n```java\nOpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationClearFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "清空会话消息" + }, + "/sdk/android/group/overview-group": { + "body": "群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。\n\n`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。\n\n```java\nOpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() {\n @Override public void onGroupInfoChanged(GroupInfo group) {\n groupStore.put(group.getGroupID(), group);\n }\n\n @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) {\n memberStore.put(member.getGroupID() + member.getUserID(), member);\n }\n});\n```\n\n群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。\n\n## 主要能力\n\n- [群资料与设置](/sdk/android/group/create-group)\n- [群权限](/sdk/android/group/set-group-join-verification)\n- [加入与退出群组](/sdk/android/group/join-group)\n- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info)\n- [群申请](/sdk/android/group/group-applications/overview-group-applications)\n- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members)\n- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group)", + "description": "了解 Android SDK 中群资料、成员、申请和群组事件的职责。", + "headings": [ + { + "depth": 2, + "title": "主要能力", + "url": "#主要能力" + } + ], + "sourcePath": "/sdk/android/group/overview-group", + "title": "群组概览" + }, + "/sdk/android/group/create-group": { + "body": "使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。\n\n```java\nGroupInfo info = new GroupInfo();\ninfo.setGroupName(\"项目讨论\");\ninfo.setIntroduction(\"仅限项目成员\");\n\nOpenIMClient.getInstance().groupManager.createGroup(\n memberUserIDs, adminUserIDs, info, ownerUserID,\n new OnBase() {\n @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); }\n @Override public void onError(int code, String error) { showCreateError(error); }\n }\n);\n```\n\n群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。", + "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", + "headings": [], + "sourcePath": "/sdk/android/group/create-group", + "title": "创建群组" + }, + "/sdk/android/group/update-group-profile": { + "body": "使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setGroupName(\"移动端项目组\");\nupdate.setIntroduction(\"Android 与 iOS 协作群\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); }\n @Override public void onError(int code, String error) { showGroupUpdateError(error); }\n});\n```\n\n最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。", + "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", + "headings": [], + "sourcePath": "/sdk/android/group/update-group-profile", + "title": "更新群资料" + }, + "/sdk/android/group/set-group-announcement": { + "body": "Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。", + "description": "通过 GroupInfo.notification 发布或更新群公告。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-announcement", + "title": "发布群公告" + }, + "/sdk/android/group/set-group-extension": { + "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```\n\n不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。", + "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-extension", + "title": "设置群扩展字段" + }, + "/sdk/android/group/set-group-join-verification": { + "body": "入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); }\n @Override public void onError(int code, String error) { showVerificationError(error); }\n});\n```\n\n该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。", + "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-join-verification", + "title": "设置入群验证方式" + }, + "/sdk/android/group/set-group-member-profile-access": { + "body": "`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setLookMemberInfo(1);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```\n\n此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。", + "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "title": "设置成员资料查看权限" + }, + "/sdk/android/group/set-group-member-friend-permission": { + "body": "`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setApplyMemberFriend(0);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```\n\n更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。", + "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "title": "设置成员好友申请权限" + }, + "/sdk/android/group/change-group-mute": { + "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```\n\n群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。", + "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", + "headings": [], + "sourcePath": "/sdk/android/group/change-group-mute", + "title": "设置全员禁言" + }, + "/sdk/android/group/join-group": { + "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。", + "description": "使用 joinGroup 提交入群申请或加入请求。", + "headings": [], + "sourcePath": "/sdk/android/group/join-group", + "title": "申请加入群组" + }, + "/sdk/android/group/quit-group": { + "body": "`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。\n\n```java\nOpenIMClient.getInstance().groupManager.quitGroup(new OnBase() {\n @Override public void onSuccess(String data) { removeJoinedGroup(groupID); }\n @Override public void onError(int code, String error) { showQuitError(error); }\n}, groupID);\n```\n\n请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。", + "description": "使用 quitGroup 让当前登录用户退出指定群组。", + "headings": [], + "sourcePath": "/sdk/android/group/quit-group", + "title": "退出群组" + }, + "/sdk/android/group/dismiss-group": { + "body": "`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。\n\n```java\nOpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() {\n @Override public void onSuccess(String data) { markDismissSubmitted(groupID); }\n @Override public void onError(int code, String error) { showDismissError(error); }\n}, groupID);\n```\n\n最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。", + "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", + "headings": [], + "sourcePath": "/sdk/android/group/dismiss-group", + "title": "解散群组" + }, + "/sdk/android/group/retrieving-groups/get-specified-groups-info": { + "body": "已持有一组 `groupID` 时,使用 `getGroupsInfo()` 查询群资料。结果是 `GroupInfo` 列表,不能依赖响应顺序与请求列表完全一致。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() {\n @Override public void onSuccess(List groups) { mergeGroups(groups); }\n @Override public void onError(int code, String error) { showGroupQueryError(error); }\n}, groupIDs);\n```\n\n先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。", + "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "获取群资料" + }, + "/sdk/android/group/retrieving-groups/get-joined-group-list-page": { + "body": "Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。", + "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "分页获取已加入群组" + }, + "/sdk/android/group/retrieving-groups/is-join-group": { + "body": "`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。\n\n```java\nOpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() {\n @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n});\n```\n\n该结果不替代群资料查询,也不能用于判断其他用户是否在群内。", + "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "检查是否加入群组" + }, + "/sdk/android/group/retrieving-groups/search-groups": { + "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。", + "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "搜索群组" + }, + "/sdk/android/group/group-applications/overview-group-applications": { + "body": "群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。\n\nAndroid SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。", + "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "群申请概览" + }, + "/sdk/android/group/group-applications/get-group-application-list-as-recipient": { + "body": "使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。", + "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "获取收到的群申请" + }, + "/sdk/android/group/group-applications/get-group-application-list-as-applicant": { + "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。", + "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "获取发出的群申请" + }, + "/sdk/android/group/group-applications/accept-group-application": { + "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。", + "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "title": "同意群申请" + }, + "/sdk/android/group/group-applications/refuse-group-application": { + "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。", + "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "拒绝群申请" + }, + "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": { + "body": "成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。\n\n成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。", + "description": "说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "群成员查询概览" + }, + "/sdk/android/group/retrieving-group-members/get-group-member-list": { + "body": "`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberList(\n new OnBase>() {\n @Override public void onSuccess(List members) { appendMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, 0, offset, 50);\n```\n\n分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。", + "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "获取群成员列表" + }, + "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": { + "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```\n\n返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。", + "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "获取群成员资料" + }, + "/sdk/android/group/retrieving-group-members/get-users-in-group": { + "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用“获取群成员资料”。", + "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "检查用户是否在群内" + }, + "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": { + "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。", + "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "获取群主和管理员" + }, + "/sdk/android/group/retrieving-group-members/search-group-members": { + "body": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroupMembers(\n new OnBase>() {\n @Override public void onSuccess(List members) { showMemberSearch(members); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n }, groupID, Collections.singletonList(keyword), true, true, 0, 20);\n```\n\n搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。", + "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "搜索群成员" + }, + "/sdk/android/group/managing-group-members/invite-user-to-group": { + "body": "传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。\n\n```java\nOpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() {\n @Override public void onSuccess(String data) { markInviteSubmitted(groupID); }\n @Override public void onError(int code, String error) { showInviteError(error); }\n}, groupID, inviteeUserIDs, \"邀请加入项目讨论\");\n```\n\n成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。", + "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "邀请用户入群" + }, + "/sdk/android/group/managing-group-members/kick-group-member": { + "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。", + "description": "使用 kickGroupMember 将指定成员移出群组。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "移除群成员" + }, + "/sdk/android/group/managing-group-members/set-group-member-nickname": { + "body": "成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setNickname(\"小林\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n以 `onGroupMemberInfoChanged` 返回的 `GroupMembersInfo.nickname` 更新显示。", + "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "更新群昵称" + }, + "/sdk/android/group/managing-group-members/set-group-member-role-level": { + "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n实际角色变更和权限由服务端校验,以成员资料变化事件为准。", + "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "管理群管理员" + }, + "/sdk/android/group/managing-group-members/set-group-member-avatar": { + "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。", + "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "更新群成员头像" + }, + "/sdk/android/group/managing-group-members/set-group-member-extension": { + "body": "`SetGroupMemberInfo.ex` 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setEx(\"{\\\"duty\\\":\\\"reviewer\\\"}\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n不要将凭据、令牌或仅限本机的显示状态写入该字段。", + "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "设置群成员扩展字段" + }, + "/sdk/android/group/managing-group-members/transfer-group-owner": { + "body": "目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() {\n @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); }\n @Override public void onError(int code, String error) { showTransferError(error); }\n}, groupID, newOwnerUserID);\n```\n\n`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。", + "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "转让群主" + }, + "/sdk/android/group/managing-group-members/change-group-member-mute": { + "body": "`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() {\n @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberMuteError(error); }\n}, groupID, userID, 3600L);\n```\n\n在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。", + "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "禁言或解除禁言群成员" + }, + "/sdk/android/message/overview-message": { + "body": "Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。\n\n```java\nOpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n});\n```\n\n查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。", + "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", + "headings": [], + "sourcePath": "/sdk/android/message/overview-message", + "title": "消息概览" + }, + "/sdk/android/message/creating-messages/create-text-message": { + "body": "`createTextMessage()` 只创建本地消息对象,不发送消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextMessage(text);\n```", + "description": "使用 createTextMessage 创建文本 Message。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "title": "创建文本消息" + }, + "/sdk/android/message/creating-messages/create-text-at-message": { + "body": "传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextAtMessage(\n text, userIDs, atUserInfos, quoteMessage);\n```", + "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "创建 @ 消息" + }, + "/sdk/android/message/creating-messages/create-custom-message": { + "body": "`data`、`extension` 和 `description` 由业务定义,接收端应按自己的协议解析。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createCustomMessage(\n dataJson, extensionJson, description);\n```", + "description": "使用 createCustomMessage 承载业务定义的 JSON 消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "创建自定义消息" + }, + "/sdk/android/message/creating-messages/create-image-message-by-file": { + "body": "缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath);\n```", + "description": "使用相对路径或绝对路径创建图片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "从文件创建图片消息" + }, + "/sdk/android/message/creating-messages/create-image-message-by-url": { + "body": "准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageByURL(\n sourceURL, sourcePicture, bigPicture, snapshotPicture);\n```", + "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "从 URL 创建图片消息" + }, + "/sdk/android/message/creating-messages/create-sound-message-by-file": { + "body": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessageFromFullPath(soundPath, durationSeconds);\n```", + "description": "使用相对路径或绝对路径创建音频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "从文件创建音频消息" + }, + "/sdk/android/message/creating-messages/create-sound-message-by-url": { + "body": "`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem);\n```", + "description": "使用 SoundElem 创建已上传资源的音频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "从 URL 创建音频消息" + }, + "/sdk/android/message/creating-messages/create-video-message-by-file": { + "body": "视频方法需要 MIME 类型、时长和缩略图路径。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath(\n videoPath, mimeType, durationSeconds, snapshotPath);\n```", + "description": "使用相对路径或绝对路径创建视频消息及缩略图。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "从文件创建视频消息" + }, + "/sdk/android/message/creating-messages/create-video-message-by-url": { + "body": "将远端视频及缩略图信息填入 `VideoElem` 后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem);\n```", + "description": "使用 VideoElem 创建已上传资源的视频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "从 URL 创建视频消息" + }, + "/sdk/android/message/creating-messages/create-file-message-by-file": { + "body": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessageFromFullPath(filePath, fileName);\n```", + "description": "使用相对路径或绝对路径创建文件消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "从文件创建文件消息" + }, + "/sdk/android/message/creating-messages/create-file-message-by-url": { + "body": "`FileElem` 应包含远端 URL、文件名和文件大小。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem);\n```", + "description": "使用 FileElem 创建已上传资源的文件消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "从 URL 创建文件消息" + }, + "/sdk/android/message/creating-messages/create-card-message": { + "body": "`CardElem` 保存名片用户的展示资料。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem);\n```", + "description": "使用 createCardMessage 创建联系人名片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "title": "创建名片消息" + }, + "/sdk/android/message/creating-messages/create-location-message": { + "body": "经纬度使用十进制度数,描述用于地图或列表展示。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createLocationMessage(latitude, longitude, description);\n```", + "description": "使用 createLocationMessage 创建经纬度和描述位置消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "title": "创建位置消息" + }, + "/sdk/android/message/creating-messages/create-face-message": { + "body": "`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson);\n```", + "description": "使用 createFaceMessage 创建自定义表情消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "title": "创建表情消息" + }, + "/sdk/android/message/creating-messages/create-quote-message": { + "body": "引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createQuoteMessage(replyText, quotedMessage);\n```", + "description": "使用 createQuoteMessage 创建引用已有消息的回复。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "创建引用消息" + }, + "/sdk/android/message/creating-messages/create-forward-message": { + "body": "传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage);\n```", + "description": "使用 createForwardMessage 创建转发消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "创建转发消息" + }, + "/sdk/android/message/creating-messages/create-merger-message": { + "body": "传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createMergerMessage(\n messages, title, summaries);\n```", + "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "创建合并消息" + }, + "/sdk/android/message/sending-messages/send-message": { + "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(String id) { mergeSentMessage(message); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", + "headings": [], + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "title": "发送消息" + }, + "/sdk/android/message/sending-messages/send-message-not-oss": { + "body": "消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。\n\n```java\nmessageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo);\n```", + "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", + "headings": [], + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "发送非 OSS 消息" + }, + "/sdk/android/message/sending-messages/set-msg-send-progress-listener": { + "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(String id) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", + "headings": [], + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "跟踪消息发送进度" + }, + "/sdk/android/message/receiving-messages/receive-messages": { + "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", + "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", + "headings": [], + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "接收消息" + }, + "/sdk/android/message/receiving-messages/receive-custom-business-messages": { + "body": "自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。\n\n```java\nmessageManager.setCustomBusinessListener(new OnCustomBusinessListener() {\n @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); }\n});\n```\n\n本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。\n\n`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。", + "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", + "headings": [], + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "接收自定义业务消息" + }, + "/sdk/android/message/retrieving-messages/load-older-messages": { + "body": "首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。\n\n```java\nmessageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", + "headings": [], + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "加载更早消息" + }, + "/sdk/android/message/retrieving-messages/load-newer-messages": { + "body": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。\n\n```java\nmessageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", + "headings": [], + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "加载更新消息" + }, + "/sdk/android/message/retrieving-messages/find-messages-by-id": { + "body": "构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", + "description": "使用 findMessageList 按 SearchParams 查询消息记录。", + "headings": [], + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "按 ID 查询消息" + }, + "/sdk/android/message/searching-messages/search-messages": { + "body": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。\n\n```java\nmessageManager.searchLocalMessages(callback, conversationID, keywords, 1,\n senderIDs, messageTypes, 0, 0, 0, 20);\n```", + "description": "使用 searchLocalMessages 搜索当前账号已同步到本地的消息。", + "headings": [], + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "title": "搜索消息" + }, + "/sdk/android/message/composing-messages/update-typing-status": { + "body": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。\n\n```java\nmessageManager.typingStatusUpdate(callback, peerUserID, \"typing\");\n```\n\n成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。", + "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", + "headings": [], + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "更新输入状态" + }, + "/sdk/android/message/managing-messages/delete-local-message": { + "body": "该操作不影响其他设备和其他用户的消息记录。\n\n```java\nmessageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback);\n```", + "description": "使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "删除本地消息" + }, + "/sdk/android/message/managing-messages/delete-saved-messages": { + "body": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。\n\n```java\nmessageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback);\n```", + "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "删除已保存消息" + }, + "/sdk/android/message/managing-messages/revoke-a-message": { + "body": "Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```", + "description": "使用 revokeMessageV2 撤回已发送消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "撤回消息" + }, + "/sdk/android/message/managing-messages/modify-a-message": { + "body": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```", + "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "修改消息" + }, + "/sdk/android/message/managing-messages/get-pinned-messages": { + "body": "查询结果是指定会话当前的置顶消息快照。\n\n```java\nmessageManager.getConversationPinnedMsgs(new OnBase>() {\n @Override public void onSuccess(List messages) { showPinned(messages); }\n @Override public void onError(int code, String error) { showPinnedError(error); }\n}, conversationID);\n```", + "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "查看置顶消息" + }, + "/sdk/android/message/managing-messages/set-message-pinned": { + "body": "最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。\n\n```java\nmessageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true);\n```", + "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "置顶或取消置顶消息" + }, + "/sdk/android/message/managing-messages/insert-local-single-message": { + "body": "该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。\n\n```java\nmessageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID);\n```", + "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "插入本地单聊消息" + }, + "/sdk/android/message/managing-messages/insert-local-group-message": { + "body": "传入群 ID 与发送者 ID,消息不会同步到其他设备。\n\n```java\nmessageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID);\n```", + "description": "使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "插入本地群聊消息" + }, + "/sdk/android/message/managing-messages/clear-all-local-messages": { + "body": "该操作只清理当前设备本地缓存,不删除服务端记录。\n\n```java\nmessageManager.deleteAllMsgFromLocal(callback);\n```", + "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "清空全部本地消息" + }, + "/sdk/android/message/managing-messages/clear-all-messages": { + "body": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。\n\n```java\nmessageManager.deleteAllMsgFromLocalAndSvr(callback);\n```", + "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "清空全部已保存消息" + }, + "/sdk/android/message/managing-messages/set-message-local-ex": { + "body": "`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。\n\n```java\nmessageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson);\n```", + "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "设置消息本地扩展字段" + }, + "/sdk/android/file-uploads/track-file-upload-progress": { + "body": "Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。\n\n```java\nOnPutFileListener uploadListener = new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUploadProgress(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void uploadPartComplete(long partNumber, long partSize, String partHash) {\n markPartComplete(uploadTaskID, partNumber, partSize, partHash);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n};\n\nOpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs);\n```\n\n`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。\n\n业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。\n\n完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。", + "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", + "headings": [], + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "跟踪文件上传进度" + }, + "/sdk/android/file-uploads/upload-file": { + "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", + "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/file-uploads/upload-file", + "title": "上传文件" + }, + "/sdk/android/calling/overview-calling": { + "body": "Android SDK 的 `SignalingManager` 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。\n\n应用需要把 SDK 返回的 `roomID`、`token` 和 `liveURL` 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。\n\n## 通话流程\n\n1. 调用 `signalingInvite()` 发起单聊通话,或调用 `signalingInviteInGroup()` 发起群聊通话。\n2. 被邀请方从 `onReceiveNewInvitation` 获取 `SignalingInfo`,选择接受或拒绝。\n3. 接受方调用 `signalingAccept()`,双方使用返回的房间凭据接入媒体引擎。\n4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。\n5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。\n\n## 核心数据\n\n| 数据 | 说明 |\n| --- | --- |\n| `SignalingInvitationInfo` | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 |\n| `SignalingInfo` | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 |\n| `SignalingCertificate` | OpenIMServer 返回的 `roomID`、`token`、`liveURL` 和忙线用户列表。 |\n| `RoomCallingInfo` | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 |\n\n`customData` 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。\n\n## 状态更新与事件归属\n\n发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。\n\n邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events);自定义信令见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。房间、凭据和待处理邀请查询只返回调用时的状态快照。\n\n概览页不设置 listener。通话状态以 `roomID` 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。\n\n## 按任务查找页面\n\n| 任务 | 页面 |\n| --- | --- |\n| 发起单聊或群聊通话 | [发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)、[发起群聊通话](/sdk/android/calling/managing-calls/start-group-call) |\n| 接受或拒绝邀请 | [接受通话](/sdk/android/calling/managing-calls/accept-call)、[拒绝通话](/sdk/android/calling/managing-calls/reject-call) |\n| 取消邀请或挂断通话 | [取消通话邀请](/sdk/android/calling/managing-calls/cancel-call)、[挂断通话](/sdk/android/calling/managing-calls/hang-up-call) |\n| 恢复房间或待处理邀请 | [查询群组通话房间](/sdk/android/calling/retrieving-call-information/get-room-by-group-id)、[获取通话房间 Token](/sdk/android/calling/retrieving-call-information/get-token-by-room-id)、[恢复启动前收到的通话邀请](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) |\n| 处理通话事件和业务协商 | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)、[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |", + "description": "了解 Android SDK 的音视频通话信令、房间信息和事件边界。", + "headings": [ + { + "depth": 2, + "title": "通话流程", + "url": "#通话流程" + }, + { + "depth": 2, + "title": "核心数据", + "url": "#核心数据" + }, + { + "depth": 2, + "title": "状态更新与事件归属", + "url": "#状态更新与事件归属" + }, + { + "depth": 2, + "title": "按任务查找页面", + "url": "#按任务查找页面" + } + ], + "sourcePath": "/sdk/android/calling/overview-calling", + "title": "音视频通话概览" + }, + "/sdk/android/calling/managing-calls/start-single-call": { + "body": "`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。\n\n## 参数说明\n\n| 字段 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 |\n| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 |\n| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 |\n| `groupID` | `String` | 是 | 单聊固定传空字符串。 |\n| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 |\n| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 |\n| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 |\n| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 |\n| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 |\n| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 |\n| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 |\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(Collections.singletonList(peerUserID));\ninvitation.setGroupID(\"\");\ninvitation.setRoomID(roomID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.SINGLE_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"contact-card\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setUserID(currentUserID);\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInvite(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。", + "description": "使用 Android SDK 发起单聊音视频通话。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "发起单聊通话" + }, + "/sdk/android/calling/managing-calls/start-group-call": { + "body": "`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(selectedGroupMemberIDs);\ninvitation.setGroupID(groupID);\ninvitation.setRoomID(groupID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.GROUP_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"group-call\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setUserID(currentUserID);\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInviteInGroup(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n startGroupCall(credentials);\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。\n\n成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。", + "description": "使用 Android SDK 发起群聊音视频通话。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "发起群聊通话" + }, + "/sdk/android/calling/managing-calls/accept-call": { + "body": "从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingAccept(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showAcceptError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。\n\n成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。", + "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "title": "接受通话" + }, + "/sdk/android/calling/managing-calls/reject-call": { + "body": "用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingReject(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n closeIncomingCallUI();\n }\n\n @Override\n public void onError(int code, String error) {\n showRejectError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "description": "使用 Android SDK 拒绝通话邀请。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "title": "拒绝通话" + }, + "/sdk/android/calling/managing-calls/cancel-call": { + "body": "邀请尚未接通时,发起方调用 `signalingCancel()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingCancel(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n stopWaitingForAnswer(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showCancelError(code, error);\n }\n },\n activeInfo\n);\n```\n\n必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。", + "description": "使用 Android SDK 取消尚未接通的通话邀请。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "取消通话邀请" + }, + "/sdk/android/calling/managing-calls/hang-up-call": { + "body": "通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingHungUp(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n releaseCallResources(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showHangUpError(code, error);\n }\n },\n activeInfo\n);\n```\n\n成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。", + "description": "使用 Android SDK 挂断已经建立的通话。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "挂断通话" + }, + "/sdk/android/calling/managing-calls/handle-call-events": { + "body": "通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。\n\n```java\nOpenIMClient.getInstance().signalingManager.setSignalingListener(\n new OnSignalingListener() {\n @Override\n public void onReceiveNewInvitation(SignalingInfo info) {\n upsertCall(info, \"ringing\");\n }\n\n @Override\n public void onInviteeAccepted(SignalingInfo info) {\n mergeCallEvent(\"accepted\", info);\n }\n\n @Override\n public void onInviteeRejected(SignalingInfo info) {\n mergeCallEvent(\"rejected\", info);\n }\n\n @Override\n public void onInvitationCancelled(SignalingInfo info) {\n mergeCallEvent(\"cancelled\", info);\n }\n\n @Override\n public void onInvitationTimeout(SignalingInfo info) {\n mergeCallEvent(\"timeout\", info);\n }\n\n @Override\n public void onInviteeAcceptedByOtherDevice(SignalingInfo info) {\n mergeCallEvent(\"accepted-by-other-device\", info);\n }\n\n @Override\n public void onInviteeRejectedByOtherDevice(SignalingInfo info) {\n mergeCallEvent(\"rejected-by-other-device\", info);\n }\n\n @Override\n public void onHangup(SignalingInfo info) {\n finishCall(info.getInvitation().getRoomID());\n }\n\n @Override\n public void onRoomParticipantConnected(RoomCallingInfo room) {\n mergeConnectedParticipants(room.getRoomID(), room.getParticipant());\n }\n\n @Override\n public void onRoomParticipantDisconnected(RoomCallingInfo room) {\n mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant());\n }\n\n @Override\n public void onStreamChange(String streamInfo) {\n mergeStreamChange(streamInfo);\n }\n }\n);\n```\n\n本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。\n\n邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。\n\n`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。", + "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "处理通话事件" + }, + "/sdk/android/calling/retrieving-call-information/restore-pending-invitation": { + "body": "`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照:\n\n```java\nOpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp(\n new OnBase() {\n @Override\n public void onSuccess(SignalingInfo info) {\n if (info != null\n && info.getInvitation() != null\n && info.getInvitation().getRoomID() != null\n && !info.getInvitation().getRoomID().isEmpty()) {\n restoreIncomingCall(info);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n clearExpiredIncomingCall();\n }\n }\n);\n```\n\n成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", + "headings": [], + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "恢复启动前收到的通话邀请" + }, + "/sdk/android/calling/retrieving-call-information/get-room-by-group-id": { + "body": "`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID(\n new OnBase() {\n @Override\n public void onSuccess(RoomCallingInfo room) {\n if (room.getRoomID() != null && !room.getRoomID().isEmpty()) {\n renderParticipants(room.getParticipant());\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showNoActiveGroupCall();\n }\n },\n groupID\n);\n```\n\n成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。\n\n没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。", + "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", + "headings": [], + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "查询群组通话房间" + }, + "/sdk/android/calling/retrieving-call-information/get-token-by-room-id": { + "body": "已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n if (credentials.getToken() != null\n && credentials.getRoomID() != null) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showCredentialError(code, error);\n }\n },\n roomID\n);\n```\n\n成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。\n\n房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。", + "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", + "headings": [], + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "获取通话房间 Token" + }, + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal": { + "body": "`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。\n\n## 发送信令\n\n`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。\n\n```java\nJSONObject signal = new JSONObject();\nsignal.put(\"version\", 1);\nsignal.put(\"eventID\", eventID);\nsignal.put(\"type\", \"hand-raised\");\nsignal.put(\"userID\", currentUserID);\nsignal.put(\"sentAt\", System.currentTimeMillis());\n\nOpenIMClient.getInstance().signalingManager.signalingSendCustomSignal(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n markSignalSent(eventID);\n }\n\n @Override\n public void onError(int code, String error) {\n showSignalError(code, error);\n }\n },\n roomID,\n signal.toString()\n);\n```\n\n成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。\n\n## 接收信令\n\n`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面:\n\n```java\n@Override\npublic void onReceiveCustomSignal(CustomSignalingInfo info) {\n if (info == null || !activeRoomID.equals(info.getRoomID())) {\n return;\n }\n\n CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo());\n String mergeID = info.getRoomID() + \":\" + signal.getEventID();\n if (hasAppliedSignal(mergeID)) {\n return;\n }\n applyCallSignal(signal);\n}\n```\n\n本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。\n\n`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。\n\n客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。", + "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", + "headings": [ + { + "depth": 2, + "title": "发送信令", + "url": "#发送信令" + }, + { + "depth": 2, + "title": "接收信令", + "url": "#接收信令" + } + ], + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "发送自定义信令" + }, + "/sdk/android/events/overview-events": { + "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | 合并标识 | 完整处理页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) |\n| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", + "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", + "headings": [ + { + "depth": 2, + "title": "集中设置 listener", + "url": "#集中设置-listener" + }, + { + "depth": 2, + "title": "事件归属", + "url": "#事件归属" + }, + { + "depth": 2, + "title": "监听初始化同步", + "url": "#监听初始化同步" + } + ], + "sourcePath": "/sdk/android/events/overview-events", + "title": "事件概览" + }, + "/sdk/android/logger": { + "body": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。\n\n## 初始化日志配置\n\n日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置:\n\n```java\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nFile logDirectory = new File(application.getFilesDir(), \"openim-logs\");\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn;\nconfig.isLogStandardOutput = BuildConfig.DEBUG;\nconfig.logFilePath = logDirectory.getAbsolutePath();\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n```\n\n| 字段 | 说明 |\n| --- | --- |\n| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 |\n| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 |\n| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 |\n\n开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。\n\n## 写入应用诊断日志\n\n需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载:\n\n```java\nOpenIMClient.getInstance().logs(\n LogLevel.Error,\n ChatRepository.class.getSimpleName(),\n 184,\n \"send_message_failed\",\n errorMessage,\n \"conversationID\", conversationID,\n \"clientMsgID\", clientMsgID\n);\n```\n\n`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。\n\n旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。\n\n## 上传诊断日志\n\n只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。\n\n```java\nString uploadID = UUID.randomUUID().toString();\n\nOpenIMClient.getInstance().uploadLogs(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n showLogUploadCompleted();\n }\n\n @Override\n public void onError(int code, String error) {\n showLogUploadError(code, error);\n }\n },\n Collections.emptyList(),\n 2000,\n uploadID,\n \"support-ticket-42\",\n new UploadLogProgress() {\n @Override\n public void onProgress(long current, long total) {\n updateLogUploadProgress(current, total);\n }\n }\n);\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `line` | 本次上传读取的日志行数配置。 |\n| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 |\n| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 |\n| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 |\n\n成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。\n\n## operationID 与业务追踪\n\nAndroid Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。\n\n应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。\n\n## 相关页面\n\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送消息](/sdk/android/message/sending-messages/send-message)", + "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", + "headings": [ + { + "depth": 2, + "title": "初始化日志配置", + "url": "#初始化日志配置" + }, + { + "depth": 2, + "title": "写入应用诊断日志", + "url": "#写入应用诊断日志" + }, + { + "depth": 2, + "title": "上传诊断日志", + "url": "#上传诊断日志" + }, + { + "depth": 2, + "title": "operationID 与业务追踪", + "url": "#operationid-与业务追踪" + }, + { + "depth": 2, + "title": "相关页面", + "url": "#相关页面" + } + ], + "sourcePath": "/sdk/android/logger", + "title": "日志" + } + } +} diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 9e4ea7305a..453dfc4b17 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -4302,6 +4302,16 @@ "version": "v4", "platform": "android", "nodes": [ + { + "id": "overview", + "segment": "overview", + "title": "OpenIM Android SDK overview", + "href": "/sdk/android/overview", + "type": "page", + "children": [], + "minIndex": 129, + "navigationTitle": "Overview" + }, { "id": "getting-started", "segment": "getting-started", @@ -4310,31 +4320,31 @@ "type": "folder", "children": [ { - "id": "getting-started/kotlin-extension", - "segment": "kotlin-extension", - "title": "Kotlin extension (KTX)", - "href": "/sdk/android/getting-started/kotlin-extension", + "id": "getting-started/before-you-start", + "segment": "before-you-start", + "title": "Before you start", + "href": "/sdk/android/getting-started/before-you-start", "type": "page", "children": [], - "minIndex": 186 + "minIndex": 130 }, { - "id": "getting-started/migration-guide", - "segment": "migration-guide", - "title": "Migration guide", - "href": "/sdk/android/getting-started/migration-guide", + "id": "getting-started/environment-specific-implementation", + "segment": "environment-specific-implementation", + "title": "Integrate for Android", + "href": "/sdk/android/getting-started/environment-specific-implementation", "type": "page", "children": [], - "minIndex": 187 + "minIndex": 131 }, { - "id": "getting-started/collection-migration-guide", - "segment": "collection-migration-guide", - "title": "Collection migration guide", - "href": "/sdk/android/getting-started/collection-migration-guide", + "id": "getting-started/authenticate-and-manage-session", + "segment": "authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "href": "/sdk/android/getting-started/authenticate-and-manage-session", "type": "page", "children": [], - "minIndex": 185 + "minIndex": 132 }, { "id": "getting-started/send-first-message", @@ -4343,10 +4353,10 @@ "href": "/sdk/android/getting-started/send-first-message", "type": "page", "children": [], - "minIndex": 131 + "minIndex": 133 } ], - "minIndex": 131 + "minIndex": 130 }, { "id": "user", @@ -4358,1613 +4368,1526 @@ { "id": "user/overview-user", "segment": "overview-user", - "title": "Overview", + "title": "User overview", "href": "/sdk/android/user/overview-user", "type": "page", "children": [], - "minIndex": 252 + "minIndex": 134 }, { - "id": "user/retrieving-users", - "segment": "retrieving-users", - "title": "Retrieving users", + "id": "user/user-profile", + "segment": "user-profile", + "title": "User profile", "href": null, "type": "folder", "children": [ { - "id": "user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "segment": "retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", + "id": "user/user-profile/get-users-info", + "segment": "get-users-info", + "title": "Get specified user profiles", + "href": "/sdk/android/user/user-profile/get-users-info", "type": "page", "children": [], - "minIndex": 258 + "minIndex": 135 }, { - "id": "user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "segment": "retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", + "id": "user/user-profile/get-self-local-user-info", + "segment": "get-self-local-user-info", + "title": "Get the current user profile", + "href": "/sdk/android/user/user-profile/get-self-local-user-info", "type": "page", "children": [], - "minIndex": 257 + "minIndex": 136 }, { - "id": "user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "segment": "retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", + "id": "user/user-profile/set-self-info", + "segment": "set-self-info", + "title": "Update the current user profile", + "href": "/sdk/android/user/user-profile/set-self-info", "type": "page", "children": [], - "minIndex": 255 - }, + "minIndex": 137 + } + ], + "minIndex": 135 + }, + { + "id": "user/user-profile/set-global-message-reception", + "segment": "set-global-message-reception", + "title": "Set global message reception", + "href": "/sdk/android/user/user-profile/set-global-message-reception", + "type": "page", + "children": [], + "minIndex": 138, + "navigationTitle": "Set global message reception" + }, + { + "id": "user/online-status", + "segment": "online-status", + "title": "Online status", + "href": null, + "type": "folder", + "children": [ { - "id": "user/retrieving-users/retrieve-members-who-have-read-a-message", - "segment": "retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "href": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", + "id": "user/online-status/subscribe-users-online-status", + "segment": "subscribe-users-online-status", + "title": "Subscribe to user online status", + "href": "/sdk/android/user/online-status/subscribe-users-online-status", "type": "page", "children": [], - "minIndex": 158 + "minIndex": 139, + "navigationTitle": "Subscribe to user status" }, { - "id": "user/retrieving-users/retrieve-a-list-of-operators", - "segment": "retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", + "id": "user/online-status/get-subscribe-online-users-status", + "segment": "get-subscribe-online-users-status", + "title": "Get subscribed user online status", + "href": "/sdk/android/user/online-status/get-subscribe-online-users-status", "type": "page", "children": [], - "minIndex": 256 + "minIndex": 140, + "navigationTitle": "Refresh subscribed user status" } ], - "minIndex": 158 - }, + "minIndex": 139 + } + ], + "minIndex": 134 + }, + { + "id": "relationships", + "segment": "relationships", + "title": "Relationships", + "href": null, + "type": "folder", + "children": [ { - "id": "user/moderating-a-user", - "segment": "moderating-a-user", - "title": "Moderating a user", + "id": "user/friends", + "segment": "friends", + "title": "Friends", "href": null, "type": "folder", "children": [ { - "id": "user/moderating-a-user/retrieve-a-list-of-blocked-users", - "segment": "retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "href": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "id": "user/friends/get-friend-list-page", + "segment": "get-friend-list-page", + "title": "Get the friend list by page", + "href": "/sdk/android/user/friends/get-friend-list-page", "type": "page", "children": [], - "minIndex": 250 + "minIndex": 141, + "navigationTitle": "Get the friend list" }, { - "id": "user/moderating-a-user/retrieve-a-list-of-muted-users", - "segment": "retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "href": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", + "id": "user/friends/search-friends", + "segment": "search-friends", + "title": "Search friends", + "href": "/sdk/android/user/friends/search-friends", "type": "page", "children": [], - "minIndex": 251 + "minIndex": 142, + "navigationTitle": "Search friends" }, { - "id": "user/moderating-a-user/block-and-unblock-other-members", - "segment": "block-and-unblock-other-members", - "title": "Block and unblock other members", - "href": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", + "id": "user/friends/get-friends-info", + "segment": "get-friends-info", + "title": "Get specified friend profiles", + "href": "/sdk/android/user/friends/get-friends-info", "type": "page", "children": [], - "minIndex": 155 + "minIndex": 143, + "navigationTitle": "Get friend profiles" }, { - "id": "user/moderating-a-user/mute-and-unmute-a-user", - "segment": "mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "href": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", + "id": "user/friends/check-friend", + "segment": "check-friend", + "title": "Check friendship", + "href": "/sdk/android/user/friends/check-friend", "type": "page", "children": [], - "minIndex": 156 - } - ], - "minIndex": 155 - }, - { - "id": "user/retrieving-and-updating-user-information", - "segment": "retrieving-and-updating-user-information", - "title": "Retrieving and updating user information", - "href": null, - "type": "folder", - "children": [ + "minIndex": 144, + "navigationTitle": "Check friendship status" + }, { - "id": "user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "segment": "retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "href": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", + "id": "user/friends/update-friends", + "segment": "update-friends", + "title": "Update friend profiles", + "href": "/sdk/android/user/friends/update-friends", "type": "page", "children": [], - "minIndex": 157 + "minIndex": 145, + "navigationTitle": "Update friend information" }, { - "id": "user/retrieving-and-updating-user-information/update-user-profile", - "segment": "update-user-profile", - "title": "Update user profile", - "href": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", + "id": "user/friends/delete-friend", + "segment": "delete-friend", + "title": "Delete a friend", + "href": "/sdk/android/user/friends/delete-friend", "type": "page", "children": [], - "minIndex": 254 + "minIndex": 146, + "navigationTitle": "Delete a friend" }, { - "id": "user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "segment": "retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "href": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "type": "page", - "children": [], - "minIndex": 253 + "id": "user/friend-applications", + "segment": "friend-applications", + "title": "Friend applications", + "href": null, + "type": "folder", + "children": [ + { + "id": "user/friend-applications/add-friend", + "segment": "add-friend", + "title": "Send a friend request", + "href": "/sdk/android/user/friend-applications/add-friend", + "type": "page", + "children": [], + "minIndex": 147, + "navigationTitle": "Send a friend application" + }, + { + "id": "user/friend-applications/get-recv-friend-application-list", + "segment": "get-recv-friend-application-list", + "title": "Get received friend requests", + "href": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "type": "page", + "children": [], + "minIndex": 148, + "navigationTitle": "Get received friend applications" + }, + { + "id": "user/friend-applications/get-send-friend-application-list", + "segment": "get-send-friend-application-list", + "title": "Get sent friend requests", + "href": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "type": "page", + "children": [], + "minIndex": 149, + "navigationTitle": "Get sent friend applications" + }, + { + "id": "user/friend-applications/accept-friend-application", + "segment": "accept-friend-application", + "title": "Accept a friend request", + "href": "/sdk/android/user/friend-applications/accept-friend-application", + "type": "page", + "children": [], + "minIndex": 150, + "navigationTitle": "Accept a friend application" + }, + { + "id": "user/friend-applications/refuse-friend-application", + "segment": "refuse-friend-application", + "title": "Reject a friend request", + "href": "/sdk/android/user/friend-applications/refuse-friend-application", + "type": "page", + "children": [], + "minIndex": 151, + "navigationTitle": "Reject a friend application" + } + ], + "minIndex": 147 } ], - "minIndex": 157 + "minIndex": 141 }, { - "id": "user/managing-user-metadata", - "segment": "managing-user-metadata", - "title": "Managing user metadata", + "id": "user/blacklist", + "segment": "blacklist", + "title": "Blacklist", "href": null, "type": "folder", "children": [ { - "id": "user/managing-user-metadata/manage-user-metadata", - "segment": "manage-user-metadata", - "title": "Manage user metadata", - "href": "/sdk/android/user/managing-user-metadata/manage-user-metadata", + "id": "user/blacklist/get-blacklist", + "segment": "get-blacklist", + "title": "Get the blacklist", + "href": "/sdk/android/user/blacklist/get-blacklist", + "type": "page", + "children": [], + "minIndex": 152 + }, + { + "id": "user/blacklist/add-blacklist", + "segment": "add-blacklist", + "title": "Block a user", + "href": "/sdk/android/user/blacklist/add-blacklist", + "type": "page", + "children": [], + "minIndex": 153, + "navigationTitle": "Block a user" + }, + { + "id": "user/blacklist/remove-blacklist", + "segment": "remove-blacklist", + "title": "Unblock a user", + "href": "/sdk/android/user/blacklist/remove-blacklist", "type": "page", "children": [], - "minIndex": 248 + "minIndex": 154, + "navigationTitle": "Unblock a user" } ], - "minIndex": 248 + "minIndex": 152 } ], - "minIndex": 155 + "minIndex": 141 }, { - "id": "channel", - "segment": "channel", - "title": "Channel", + "id": "conversation", + "segment": "conversation", + "title": "Conversation", "href": null, "type": "folder", "children": [ { - "id": "channel/overview-channel", - "segment": "overview-channel", - "title": "Overview", - "href": "/sdk/android/channel/overview-channel", + "id": "conversation/overview-conversation", + "segment": "overview-conversation", + "title": "Conversation overview", + "href": "/sdk/android/conversation/overview-conversation", "type": "page", "children": [], - "minIndex": 130 + "minIndex": 155 }, { - "id": "channel/creating-a-channel", - "segment": "creating-a-channel", - "title": "Creating a channel", + "id": "conversation/retrieving-conversations", + "segment": "retrieving-conversations", + "title": "Retrieving conversations", "href": null, "type": "folder", "children": [ { - "id": "channel/creating-a-channel/create-a-channel", - "segment": "create-a-channel", - "title": "Create a channel", - "href": "/sdk/android/channel/creating-a-channel/create-a-channel", + "id": "conversation/retrieving-conversations/get-conversation-by-target", + "segment": "get-conversation-by-target", + "title": "Open a conversation", + "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "type": "page", "children": [], - "minIndex": 163 - } - ], - "minIndex": 163 - }, - { - "id": "channel/managing-operators", - "segment": "managing-operators", - "title": "Managing operators", - "href": null, - "type": "folder", - "children": [ + "minIndex": 156, + "navigationTitle": "Open a conversation" + }, { - "id": "channel/managing-operators/register-and-remove-operators", - "segment": "register-and-remove-operators", - "title": "Register and remove operators", - "href": "/sdk/android/channel/managing-operators/register-and-remove-operators", + "id": "conversation/retrieving-conversations/get-conversation-id", + "segment": "get-conversation-id", + "title": "Resolve a conversation ID", + "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "type": "page", "children": [], - "minIndex": 173 - } - ], - "minIndex": 173 - }, - { - "id": "channel/joining-and-leaving-a-channel", - "segment": "joining-and-leaving-a-channel", - "title": "Joining and leaving a channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 157, + "navigationTitle": "Resolve a conversation ID" + }, { - "id": "channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "segment": "enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "href": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", + "id": "conversation/retrieving-conversations/get-conversations-by-id", + "segment": "get-conversations-by-id", + "title": "Get conversations by ID", + "href": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "type": "page", "children": [], - "minIndex": 166 + "minIndex": 158, + "navigationTitle": "Get conversations by ID" }, { - "id": "channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "segment": "join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "href": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", + "id": "conversation/retrieving-conversations/retrieve-conversation-list", + "segment": "retrieve-conversation-list", + "title": "Get the conversation list", + "href": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "type": "page", "children": [], - "minIndex": 167 + "minIndex": 159 } ], - "minIndex": 166 + "minIndex": 156 }, { - "id": "channel/retrieving-channels", - "segment": "retrieving-channels", - "title": "Retrieving channels", + "id": "conversation/conversation-list-and-drafts", + "segment": "conversation-list-and-drafts", + "title": "Conversation organization", "href": null, "type": "folder", "children": [ { - "id": "channel/retrieving-channels/retrieve-a-list-of-channels", - "segment": "retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "href": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", + "id": "conversation/managing-conversations/pin-conversation", + "segment": "pin-conversation", + "title": "Pin or unpin a conversation", + "href": "/sdk/android/conversation/managing-conversations/pin-conversation", "type": "page", "children": [], - "minIndex": 175 + "minIndex": 160, + "navigationTitle": "Pin or unpin a conversation" }, { - "id": "channel/retrieving-channels/retrieve-a-channel-by-url", - "segment": "retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "href": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "type": "page", - "children": [], - "minIndex": 174 - } - ], - "minIndex": 174 - }, - { - "id": "channel/inviting-users-to-a-group-channel", - "segment": "inviting-users-to-a-group-channel", - "title": "Inviting users to a group channel", - "href": null, - "type": "folder", - "children": [ - { - "id": "channel/inviting-users-to-a-group-channel/invite-users-as-members", - "segment": "invite-users-as-members", - "title": "Invite users as members", - "href": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", + "id": "conversation/managing-conversations/set-conversation-extension", + "segment": "set-conversation-extension", + "title": "Set conversation extra data", + "href": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "type": "page", "children": [], - "minIndex": 165 + "minIndex": 161, + "navigationTitle": "Set conversation extra data" }, { - "id": "channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "segment": "accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "href": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", + "id": "conversation/managing-conversations/set-conversation-draft", + "segment": "set-conversation-draft", + "title": "Set a conversation draft", + "href": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "type": "page", "children": [], - "minIndex": 164 + "minIndex": 162 } ], - "minIndex": 164 + "minIndex": 160 }, { - "id": "channel/searching-channels", - "segment": "searching-channels", - "title": "Searching channels", + "id": "conversation/message-reception-and-reminders", + "segment": "message-reception-and-reminders", + "title": "Unread status and notifications", "href": null, "type": "folder", "children": [ { - "id": "channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "segment": "search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "href": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", + "id": "conversation/managing-conversations/set-message-receive-option", + "segment": "set-message-receive-option", + "title": "Set conversation message reception", + "href": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "type": "page", "children": [], - "minIndex": 177 + "minIndex": 163, + "navigationTitle": "Set conversation message reception" }, { - "id": "channel/searching-channels/filter-group-channels-by-user-ids", - "segment": "filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "href": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "type": "page", - "children": [], - "minIndex": 176 + "id": "conversation/managing-conversations/clear-group-mentions", + "segment": "clear-group-mentions", + "title": "Reset group mention status", + "href": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "type": "page", + "children": [], + "minIndex": 164, + "navigationTitle": "Reset group mention status" }, { - "id": "channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "segment": "search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "href": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", + "id": "conversation/managing-conversations/mark-conversation-read", + "segment": "mark-conversation-read", + "title": "Mark a conversation as read", + "href": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "type": "page", "children": [], - "minIndex": 178 - } - ], - "minIndex": 176 - }, - { - "id": "channel/categorizing-channels", - "segment": "categorizing-channels", - "title": "Categorizing channels", - "href": null, - "type": "folder", - "children": [ + "minIndex": 165, + "navigationTitle": "Mark a conversation as read" + }, { - "id": "channel/categorizing-channels/categorize-channels-by-custom-type", - "segment": "categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "href": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", + "id": "conversation/managing-conversations/get-total-unread-count", + "segment": "get-total-unread-count", + "title": "Track the total unread count", + "href": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "type": "page", "children": [], - "minIndex": 162 + "minIndex": 166, + "navigationTitle": "Track the total unread count" } ], - "minIndex": 162 + "minIndex": 163 }, { - "id": "channel/managing-channels", - "segment": "managing-channels", - "title": "Managing channels", + "id": "conversation/message-retention-and-privacy", + "segment": "message-retention-and-privacy", + "title": "Message retention and privacy", "href": null, "type": "folder", "children": [ { - "id": "channel/managing-channels/delete-a-channel", - "segment": "delete-a-channel", - "title": "Delete a channel", - "href": "/sdk/android/channel/managing-channels/delete-a-channel", + "id": "conversation/managing-conversations/set-private-chat", + "segment": "set-private-chat", + "title": "Enable or disable burn after reading", + "href": "/sdk/android/conversation/managing-conversations/set-private-chat", "type": "page", "children": [], - "minIndex": 170 + "minIndex": 167, + "navigationTitle": "Enable or disable burn after reading" }, { - "id": "channel/managing-channels/hide-or-archive-a-group-channel", - "segment": "hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "href": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", + "id": "conversation/managing-conversations/set-burn-duration", + "segment": "set-burn-duration", + "title": "Set the burn duration", + "href": "/sdk/android/conversation/managing-conversations/set-burn-duration", "type": "page", "children": [], - "minIndex": 171 + "minIndex": 168, + "navigationTitle": "Set the burn duration" }, { - "id": "channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "segment": "refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "href": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", + "id": "conversation/managing-conversations/set-message-destruct", + "segment": "set-message-destruct", + "title": "Schedule server message deletion", + "href": "/sdk/android/conversation/managing-conversations/set-message-destruct", "type": "page", "children": [], - "minIndex": 172 + "minIndex": 169, + "navigationTitle": "Schedule server message deletion" } ], - "minIndex": 170 + "minIndex": 167 }, { - "id": "channel/moderating-a-channel", - "segment": "moderating-a-channel", - "title": "Moderating a channel", + "id": "conversation/hiding-and-deleting-conversations", + "segment": "hiding-and-deleting-conversations", + "title": "Hiding and deleting conversations", "href": null, "type": "folder", "children": [ { - "id": "channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "segment": "freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "href": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", + "id": "conversation/managing-conversations/hide-a-conversation", + "segment": "hide-a-conversation", + "title": "Hide a conversation", + "href": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "type": "page", "children": [], - "minIndex": 129 - } - ], - "minIndex": 129 - }, - { - "id": "channel/managing-channel-metadata", - "segment": "managing-channel-metadata", - "title": "Managing channel metadata", - "href": null, - "type": "folder", - "children": [ + "minIndex": 170 + }, { - "id": "channel/managing-channel-metadata/manage-channel-metadata", - "segment": "manage-channel-metadata", - "title": "Manage channel metadata", - "href": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", + "id": "conversation/managing-conversations/delete-conversation-with-messages", + "segment": "delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "href": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "type": "page", "children": [], - "minIndex": 169 - } - ], - "minIndex": 169 - }, - { - "id": "channel/managing-channel-metacounters", - "segment": "managing-channel-metacounters", - "title": "Managing channel metacounters", - "href": null, - "type": "folder", - "children": [ + "minIndex": 171, + "navigationTitle": "Delete a conversation and its messages" + }, { - "id": "channel/managing-channel-metacounters/manage-channel-metacounters", - "segment": "manage-channel-metacounters", - "title": "Manage channel metacounters", - "href": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", + "id": "conversation/managing-conversations/clear-conversation-messages", + "segment": "clear-conversation-messages", + "title": "Clear messages in a conversation", + "href": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "type": "page", "children": [], - "minIndex": 168 + "minIndex": 172, + "navigationTitle": "Clear messages in a conversation" } ], - "minIndex": 168 + "minIndex": 170 } ], - "minIndex": 129 + "minIndex": 155 }, { - "id": "message", - "segment": "message", - "title": "Message", + "id": "group", + "segment": "group", + "title": "Group", "href": null, "type": "folder", "children": [ { - "id": "message/overview-message", - "segment": "overview-message", - "title": "Overview", - "href": "/sdk/android/message/overview-message", + "id": "group/overview-group", + "segment": "overview-group", + "title": "Group overview", + "href": "/sdk/android/group/overview-group", "type": "page", "children": [], - "minIndex": 141 + "minIndex": 173, + "navigationTitle": "Group overview" }, { - "id": "message/sending-a-message", - "segment": "sending-a-message", - "title": "Sending a message", + "id": "group/profile-and-settings", + "segment": "profile-and-settings", + "title": "Group profile and settings", "href": null, "type": "folder", "children": [ { - "id": "message/sending-a-message/send-a-message", - "segment": "send-a-message", - "title": "Send a message", - "href": "/sdk/android/message/sending-a-message/send-a-message", - "type": "page", - "children": [], - "minIndex": 233 - }, - { - "id": "message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "segment": "send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "href": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "type": "page", - "children": [], - "minIndex": 232 - }, - { - "id": "message/sending-a-message/send-an-admin-message", - "segment": "send-an-admin-message", - "title": "Send an admin message", - "href": "/sdk/android/message/sending-a-message/send-an-admin-message", - "type": "page", - "children": [], - "minIndex": 234 - }, - { - "id": "message/sending-a-message/track-file-upload-progress-using-a-handler", - "segment": "track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "href": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "type": "page", - "children": [], - "minIndex": 236 - }, - { - "id": "message/sending-a-message/cancel-an-in-progress-file-upload", - "segment": "cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "href": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", + "id": "group/create-group", + "segment": "create-group", + "title": "Create a group", + "href": "/sdk/android/group/create-group", "type": "page", "children": [], - "minIndex": 231 + "minIndex": 174, + "navigationTitle": "Create a group" }, { - "id": "message/sending-a-message/share-an-encrypted-file", - "segment": "share-an-encrypted-file", - "title": "Share an encrypted file", - "href": "/sdk/android/message/sending-a-message/share-an-encrypted-file", + "id": "group/update-group-profile", + "segment": "update-group-profile", + "title": "Update group profile", + "href": "/sdk/android/group/update-group-profile", "type": "page", "children": [], - "minIndex": 144 + "minIndex": 175, + "navigationTitle": "Update group profile" }, { - "id": "message/sending-a-message/spam-flood-protection", - "segment": "spam-flood-protection", - "title": "Spam flood protection", - "href": "/sdk/android/message/sending-a-message/spam-flood-protection", + "id": "group/set-group-announcement", + "segment": "set-group-announcement", + "title": "Publish a group announcement", + "href": "/sdk/android/group/set-group-announcement", "type": "page", "children": [], - "minIndex": 235 + "minIndex": 176, + "navigationTitle": "Publish a group announcement" }, { - "id": "message/sending-a-message/smart-throttling", - "segment": "smart-throttling", - "title": "Smart throttling", - "href": "/sdk/android/message/sending-a-message/smart-throttling", + "id": "group/set-group-extension", + "segment": "set-group-extension", + "title": "Set group extra data", + "href": "/sdk/android/group/set-group-extension", "type": "page", "children": [], - "minIndex": 145 + "minIndex": 177, + "navigationTitle": "Set group extra data" } ], - "minIndex": 144 + "minIndex": 174 }, { - "id": "message/receiving-messages-through-event-handler", - "segment": "receiving-messages-through-event-handler", - "title": "Receiving messages through event handler", + "id": "group/permissions", + "segment": "permissions", + "title": "Group permissions", "href": null, "type": "folder", "children": [ { - "id": "message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "segment": "receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "href": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", + "id": "group/set-group-join-verification", + "segment": "set-group-join-verification", + "title": "Set group join verification", + "href": "/sdk/android/group/set-group-join-verification", "type": "page", "children": [], - "minIndex": 223 + "minIndex": 178, + "navigationTitle": "Set group join verification" }, { - "id": "message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "segment": "receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "href": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", + "id": "group/set-group-member-profile-access", + "segment": "set-group-member-profile-access", + "title": "Set member profile access", + "href": "/sdk/android/group/set-group-member-profile-access", "type": "page", "children": [], - "minIndex": 222 - } - ], - "minIndex": 222 - }, - { - "id": "message/using-message-threading", - "segment": "using-message-threading", - "title": "Using message threading", - "href": null, - "type": "folder", - "children": [ + "minIndex": 179, + "navigationTitle": "Set member profile access" + }, { - "id": "message/using-message-threading/create-a-message-thread", - "segment": "create-a-message-thread", - "title": "Create a message thread", - "href": "/sdk/android/message/using-message-threading/create-a-message-thread", + "id": "group/set-group-member-friend-permission", + "segment": "set-group-member-friend-permission", + "title": "Set member friend request permission", + "href": "/sdk/android/group/set-group-member-friend-permission", "type": "page", "children": [], - "minIndex": 148 + "minIndex": 180, + "navigationTitle": "Set member friend request permission" }, { - "id": "message/using-message-threading/list-replies-in-a-message-thread", - "segment": "list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "href": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", + "id": "group/change-group-mute", + "segment": "change-group-mute", + "title": "Change group mute status", + "href": "/sdk/android/group/change-group-mute", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 181, + "navigationTitle": "Change group mute status" } ], - "minIndex": 148 + "minIndex": 178 }, { - "id": "message/retrieving-messages", - "segment": "retrieving-messages", - "title": "Retrieving messages", + "id": "group/joining-and-leaving", + "segment": "joining-and-leaving", + "title": "Joining and leaving groups", "href": null, "type": "folder", "children": [ { - "id": "message/retrieving-messages/retrieve-a-list-of-messages", - "segment": "retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "href": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", + "id": "group/join-group", + "segment": "join-group", + "title": "Apply to join a group", + "href": "/sdk/android/group/join-group", "type": "page", "children": [], - "minIndex": 224 + "minIndex": 182, + "navigationTitle": "Apply to join a group" }, { - "id": "message/retrieving-messages/retrieve-a-message", - "segment": "retrieve-a-message", - "title": "Retrieve a message", - "href": "/sdk/android/message/retrieving-messages/retrieve-a-message", + "id": "group/quit-group", + "segment": "quit-group", + "title": "Leave a group", + "href": "/sdk/android/group/quit-group", "type": "page", "children": [], - "minIndex": 142 - } - ], - "minIndex": 142 - }, - { - "id": "message/searching-messages-in-a-group-channel", - "segment": "searching-messages-in-a-group-channel", - "title": "Searching messages in a group channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 183, + "navigationTitle": "Leave a group" + }, { - "id": "message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "segment": "search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "href": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", + "id": "group/dismiss-group", + "segment": "dismiss-group", + "title": "Dismiss a group", + "href": "/sdk/android/group/dismiss-group", "type": "page", "children": [], - "minIndex": 143 + "minIndex": 184, + "navigationTitle": "Dismiss a group" } ], - "minIndex": 143 + "minIndex": 182 }, { - "id": "message/managing-a-message", - "segment": "managing-a-message", - "title": "Managing a message", + "id": "group/retrieving-groups", + "segment": "retrieving-groups", + "title": "Retrieving groups", "href": null, "type": "folder", "children": [ { - "id": "message/managing-a-message/copy-a-message", - "segment": "copy-a-message", - "title": "Copy a message", - "href": "/sdk/android/message/managing-a-message/copy-a-message", + "id": "group/retrieving-groups/get-specified-groups-info", + "segment": "get-specified-groups-info", + "title": "Get group information", + "href": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "type": "page", "children": [], - "minIndex": 195 + "minIndex": 185, + "navigationTitle": "Get group information" }, { - "id": "message/managing-a-message/update-a-message", - "segment": "update-a-message", - "title": "Update a message", - "href": "/sdk/android/message/managing-a-message/update-a-message", + "id": "group/retrieving-groups/get-joined-group-list-page", + "segment": "get-joined-group-list-page", + "title": "Get joined groups by page", + "href": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "type": "page", "children": [], - "minIndex": 198 + "minIndex": 186, + "navigationTitle": "Get joined groups by page" }, { - "id": "message/managing-a-message/delete-a-message", - "segment": "delete-a-message", - "title": "Delete a message", - "href": "/sdk/android/message/managing-a-message/delete-a-message", + "id": "group/retrieving-groups/is-join-group", + "segment": "is-join-group", + "title": "Check group membership", + "href": "/sdk/android/group/retrieving-groups/is-join-group", "type": "page", "children": [], - "minIndex": 196 + "minIndex": 187, + "navigationTitle": "Check group membership" }, { - "id": "message/managing-a-message/react-to-a-message-in-a-group-channel", - "segment": "react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "href": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", + "id": "group/retrieving-groups/search-groups", + "segment": "search-groups", + "title": "Search groups", + "href": "/sdk/android/group/retrieving-groups/search-groups", + "type": "page", + "children": [], + "minIndex": 188, + "navigationTitle": "Search groups" + } + ], + "minIndex": 185 + }, + { + "id": "group/group-applications", + "segment": "group-applications", + "title": "Group applications", + "href": null, + "type": "folder", + "children": [ + { + "id": "group/group-applications/overview-group-applications", + "segment": "overview-group-applications", + "title": "Group applications overview", + "href": "/sdk/android/group/group-applications/overview-group-applications", "type": "page", "children": [], - "minIndex": 134 + "minIndex": 189, + "navigationTitle": "Group applications overview" }, { - "id": "message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "segment": "clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "href": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", + "id": "group/group-applications/get-group-application-list-as-recipient", + "segment": "get-group-application-list-as-recipient", + "title": "Get received group applications", + "href": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "type": "page", "children": [], - "minIndex": 194 + "minIndex": 190, + "navigationTitle": "Get received group applications" }, { - "id": "message/managing-a-message/send-typing-indicators-to-other-members", - "segment": "send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "href": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", + "id": "group/group-applications/get-group-application-list-as-applicant", + "segment": "get-group-application-list-as-applicant", + "title": "Get sent group applications", + "href": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "type": "page", "children": [], - "minIndex": 135 + "minIndex": 191, + "navigationTitle": "Get sent group applications" }, { - "id": "message/managing-a-message/display-open-graph-tags-in-a-message", - "segment": "display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "href": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", + "id": "group/group-applications/accept-group-application", + "segment": "accept-group-application", + "title": "Accept a group application", + "href": "/sdk/android/group/group-applications/accept-group-application", "type": "page", "children": [], - "minIndex": 197 + "minIndex": 192, + "navigationTitle": "Accept a group application" }, { - "id": "message/managing-a-message/generate-thumbnails-of-a-file-message", - "segment": "generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "href": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", + "id": "group/group-applications/refuse-group-application", + "segment": "refuse-group-application", + "title": "Reject a group application", + "href": "/sdk/android/group/group-applications/refuse-group-application", "type": "page", "children": [], - "minIndex": 133 + "minIndex": 193, + "navigationTitle": "Reject a group application" } ], - "minIndex": 133 + "minIndex": 189 }, { - "id": "message/managing-scheduled-messages-in-group-channel", - "segment": "managing-scheduled-messages-in-group-channel", - "title": "Managing scheduled messages in group channel", + "id": "group/retrieving-group-members", + "segment": "retrieving-group-members", + "title": "Retrieving group members", "href": null, "type": "folder", "children": [ { - "id": "message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "segment": "create-a-scheduled-message", - "title": "Create a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", + "id": "group/retrieving-group-members/overview-retrieving-group-members", + "segment": "overview-retrieving-group-members", + "title": "Group member queries overview", + "href": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "type": "page", "children": [], - "minIndex": 138 + "minIndex": 194, + "navigationTitle": "Group member queries overview" }, { - "id": "message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "segment": "retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "type": "page", - "children": [], - "minIndex": 218 - }, - { - "id": "message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "segment": "update-a-scheduled-message", - "title": "Update a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", + "id": "group/retrieving-group-members/get-group-member-list", + "segment": "get-group-member-list", + "title": "List group members", + "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 221 + "minIndex": 195, + "navigationTitle": "Get group members" }, { - "id": "message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "segment": "cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", + "id": "group/retrieving-group-members/get-specified-group-members-info", + "segment": "get-specified-group-members-info", + "title": "Get specified group member profiles", + "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 216 + "minIndex": 196, + "navigationTitle": "Get group member profiles" }, { - "id": "message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "segment": "list-all-scheduled-messages", - "title": "List all scheduled messages", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", + "id": "group/retrieving-group-members/get-users-in-group", + "segment": "get-users-in-group", + "title": "Check group membership", + "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 217 + "minIndex": 197, + "navigationTitle": "Check users in a group" }, { - "id": "message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "segment": "retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", + "id": "group/retrieving-group-members/get-group-member-owner-and-admin", + "segment": "get-group-member-owner-and-admin", + "title": "Get the group owner and administrators", + "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 219 + "minIndex": 198, + "navigationTitle": "Get group owners and admins" }, { - "id": "message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "segment": "send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", + "id": "group/retrieving-group-members/search-group-members", + "segment": "search-group-members", + "title": "Search group members", + "href": "/sdk/android/group/retrieving-group-members/search-group-members", "type": "page", "children": [], - "minIndex": 220 + "minIndex": 199, + "navigationTitle": "Search group members" } ], - "minIndex": 138 + "minIndex": 194 }, { - "id": "message/managing-pinned-messages-in-group-channels", - "segment": "managing-pinned-messages-in-group-channels", - "title": "Managing pinned messages in group channels", + "id": "group/managing-group-members", + "segment": "managing-group-members", + "title": "Managing group members", "href": null, "type": "folder", "children": [ { - "id": "message/managing-pinned-messages-in-group-channels/pin-a-message", - "segment": "pin-a-message", - "title": "Pin a message", - "href": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", + "id": "group/managing-group-members/invite-user-to-group", + "segment": "invite-user-to-group", + "title": "Invite users to a group", + "href": "/sdk/android/group/managing-group-members/invite-user-to-group", "type": "page", "children": [], - "minIndex": 136 + "minIndex": 200, + "navigationTitle": "Invite users to a group" }, { - "id": "message/managing-pinned-messages-in-group-channels/unpin-a-message", - "segment": "unpin-a-message", - "title": "Unpin a message", - "href": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", + "id": "group/managing-group-members/kick-group-member", + "segment": "kick-group-member", + "title": "Remove group members", + "href": "/sdk/android/group/managing-group-members/kick-group-member", "type": "page", "children": [], - "minIndex": 200 + "minIndex": 201, + "navigationTitle": "Remove group members" }, { - "id": "message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "segment": "list-pinned-messages", - "title": "List pinned messages", - "href": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", + "id": "group/managing-group-members/set-group-member-nickname", + "segment": "set-group-member-nickname", + "title": "Update a member’s group nickname", + "href": "/sdk/android/group/managing-group-members/set-group-member-nickname", "type": "page", "children": [], - "minIndex": 199 - } - ], - "minIndex": 136 - }, - { - "id": "message/listing-changelogs", - "segment": "listing-changelogs", - "title": "Listing changelogs", - "href": null, - "type": "folder", - "children": [ + "minIndex": 202, + "navigationTitle": "Update a group nickname" + }, { - "id": "message/listing-changelogs/list-changelogs-of-messages", - "segment": "list-changelogs-of-messages", - "title": "List changelogs of messages", - "href": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", + "id": "group/managing-group-members/set-group-member-role-level", + "segment": "set-group-member-role-level", + "title": "Manage group administrators", + "href": "/sdk/android/group/managing-group-members/set-group-member-role-level", "type": "page", "children": [], - "minIndex": 193 - } - ], - "minIndex": 193 - }, - { - "id": "message/managing-read-status-in-a-group-channel", - "segment": "managing-read-status-in-a-group-channel", - "title": "Managing read status in a group channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 203, + "navigationTitle": "Manage group administrators" + }, { - "id": "message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "segment": "mark-messages-as-read", - "title": "Mark messages as read", - "href": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", + "id": "group/managing-group-members/set-group-member-avatar", + "segment": "set-group-member-avatar", + "title": "Update a group member’s avatar", + "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 214 + "minIndex": 204, + "navigationTitle": "Update a group member avatar" }, { - "id": "message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "segment": "mark-messages-as-unread", - "title": "Mark messages as unread", - "href": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", + "id": "group/managing-group-members/set-group-member-extension", + "segment": "set-group-member-extension", + "title": "Set a group member extension", + "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 215 + "minIndex": 205, + "navigationTitle": "Set group member extra data" }, { - "id": "message/managing-read-status-in-a-group-channel/get-read-status", - "segment": "get-read-status", - "title": "Get read status of a message", - "href": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", + "id": "group/managing-group-members/transfer-group-owner", + "segment": "transfer-group-owner", + "title": "Transfer group ownership", + "href": "/sdk/android/group/managing-group-members/transfer-group-owner", "type": "page", "children": [], - "minIndex": 213 - } - ], - "minIndex": 213 - }, - { - "id": "message/marking-messages-as-delivered-in-a-group-channel", - "segment": "marking-messages-as-delivered-in-a-group-channel", - "title": "Marking messages as delivered in a group channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 206, + "navigationTitle": "Transfer group ownership" + }, { - "id": "message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "segment": "mark-messages-as-delivered", - "title": "Mark messages as delivered", - "href": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", + "id": "group/managing-group-members/change-group-member-mute", + "segment": "change-group-member-mute", + "title": "Mute or unmute a group member", + "href": "/sdk/android/group/managing-group-members/change-group-member-mute", "type": "page", "children": [], - "minIndex": 139 + "minIndex": 207, + "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 139 - }, + "minIndex": 200 + } + ], + "minIndex": 173 + }, + { + "id": "message", + "segment": "message", + "title": "Message", + "href": null, + "type": "folder", + "children": [ { - "id": "message/mentioning-other-users-in-a-message", - "segment": "mentioning-other-users-in-a-message", - "title": "Mentioning other users in a message", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "segment": "mention-other-users-in-a-message", - "title": "Mention other users in a message", - "href": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "type": "page", - "children": [], - "minIndex": 140 - } - ], - "minIndex": 140 + "id": "message/overview-message", + "segment": "overview-message", + "title": "Overview", + "href": "/sdk/android/message/overview-message", + "type": "page", + "children": [], + "minIndex": 208 }, { - "id": "message/managing-polls", - "segment": "managing-polls", - "title": "Managing polls", + "id": "message/creating-messages", + "segment": "creating-messages", + "title": "Creating messages", "href": null, "type": "folder", "children": [ { - "id": "message/managing-polls/create-a-poll", - "segment": "create-a-poll", - "title": "Create a poll", - "href": "/sdk/android/message/managing-polls/create-a-poll", - "type": "page", - "children": [], - "minIndex": 137 - }, - { - "id": "message/managing-polls/retrieve-a-poll", - "segment": "retrieve-a-poll", - "title": "Retrieve a poll", - "href": "/sdk/android/message/managing-polls/retrieve-a-poll", + "id": "message/creating-messages/create-text-message", + "segment": "create-text-message", + "title": "Create a text message", + "href": "/sdk/android/message/creating-messages/create-text-message", "type": "page", "children": [], "minIndex": 209 }, { - "id": "message/managing-polls/update-a-poll", - "segment": "update-a-poll", - "title": "Update a poll", - "href": "/sdk/android/message/managing-polls/update-a-poll", + "id": "message/creating-messages/create-text-at-message", + "segment": "create-text-at-message", + "title": "Create an @ message", + "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 210 }, { - "id": "message/managing-polls/delete-a-poll", - "segment": "delete-a-poll", - "title": "Delete a poll", - "href": "/sdk/android/message/managing-polls/delete-a-poll", + "id": "message/creating-messages/create-custom-message", + "segment": "create-custom-message", + "title": "Create a custom message", + "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 204 + "minIndex": 211 }, { - "id": "message/managing-polls/close-a-poll", - "segment": "close-a-poll", - "title": "Close a poll", - "href": "/sdk/android/message/managing-polls/close-a-poll", + "id": "message/creating-messages/create-image-message-by-file", + "segment": "create-image-message-by-file", + "title": "Create an image message from a file", + "href": "/sdk/android/message/creating-messages/create-image-message-by-file", "type": "page", "children": [], - "minIndex": 203 + "minIndex": 212 }, { - "id": "message/managing-polls/add-a-poll-option", - "segment": "add-a-poll-option", - "title": "Add a poll option", - "href": "/sdk/android/message/managing-polls/add-a-poll-option", + "id": "message/creating-messages/create-image-message-by-url", + "segment": "create-image-message-by-url", + "title": "Create an image message from a URL", + "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 201 + "minIndex": 213 }, { - "id": "message/managing-polls/retrieve-a-poll-option", - "segment": "retrieve-a-poll-option", - "title": "Retrieve a poll option", - "href": "/sdk/android/message/managing-polls/retrieve-a-poll-option", + "id": "message/creating-messages/create-sound-message-by-file", + "segment": "create-sound-message-by-file", + "title": "Create an audio message from a file", + "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 214 }, { - "id": "message/managing-polls/update-a-poll-option", - "segment": "update-a-poll-option", - "title": "Update a poll option", - "href": "/sdk/android/message/managing-polls/update-a-poll-option", + "id": "message/creating-messages/create-sound-message-by-url", + "segment": "create-sound-message-by-url", + "title": "Create an audio message from a URL", + "href": "/sdk/android/message/creating-messages/create-sound-message-by-url", "type": "page", "children": [], - "minIndex": 212 + "minIndex": 215 }, { - "id": "message/managing-polls/delete-a-poll-option", - "segment": "delete-a-poll-option", - "title": "Delete a poll option", - "href": "/sdk/android/message/managing-polls/delete-a-poll-option", + "id": "message/creating-messages/create-video-message-by-file", + "segment": "create-video-message-by-file", + "title": "Create a video message from files", + "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 205 + "minIndex": 216 }, { - "id": "message/managing-polls/cast-or-cancel-a-vote", - "segment": "cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "href": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", + "id": "message/creating-messages/create-video-message-by-url", + "segment": "create-video-message-by-url", + "title": "Create a video message from URLs", + "href": "/sdk/android/message/creating-messages/create-video-message-by-url", "type": "page", "children": [], - "minIndex": 202 + "minIndex": 217 }, { - "id": "message/managing-polls/retrieve-a-list-of-polls", - "segment": "retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "href": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", + "id": "message/creating-messages/create-file-message-by-file", + "segment": "create-file-message-by-file", + "title": "Create a file message from a file", + "href": "/sdk/android/message/creating-messages/create-file-message-by-file", "type": "page", "children": [], - "minIndex": 207 + "minIndex": 218 }, { - "id": "message/managing-polls/retrieve-a-list-of-voters", - "segment": "retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "href": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", + "id": "message/creating-messages/create-file-message-by-url", + "segment": "create-file-message-by-url", + "title": "Create a file message from a URL", + "href": "/sdk/android/message/creating-messages/create-file-message-by-url", "type": "page", "children": [], - "minIndex": 208 + "minIndex": 219 }, { - "id": "message/managing-polls/list-changelogs-of-polls", - "segment": "list-changelogs-of-polls", - "title": "List changelogs of polls", - "href": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "type": "page", - "children": [], - "minIndex": 206 - } - ], - "minIndex": 137 - }, - { - "id": "message/retrieving-unread-count-in-a-group-channel", - "segment": "retrieving-unread-count-in-a-group-channel", - "title": "Retrieving unread count in a group channel", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "segment": "members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", + "id": "message/creating-messages/create-card-message", + "segment": "create-card-message", + "title": "Create a contact card message", + "href": "/sdk/android/message/creating-messages/create-card-message", "type": "page", "children": [], - "minIndex": 225 + "minIndex": 220 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "segment": "members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", + "id": "message/creating-messages/create-location-message", + "segment": "create-location-message", + "title": "Create a location message", + "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], - "minIndex": 226 + "minIndex": 221 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-channels", - "segment": "unread-channels", - "title": "Retrieve number of channels with unread messages", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", + "id": "message/creating-messages/create-face-message", + "segment": "create-face-message", + "title": "Create an emoji message", + "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], - "minIndex": 227 + "minIndex": 222 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-items", - "segment": "unread-items", - "title": "Retrieve number of unread items", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", + "id": "message/creating-messages/create-quote-message", + "segment": "create-quote-message", + "title": "Create a reply message", + "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], - "minIndex": 228 + "minIndex": 223 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "segment": "unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", + "id": "message/creating-messages/create-forward-message", + "segment": "create-forward-message", + "title": "Create a forwarded message", + "href": "/sdk/android/message/creating-messages/create-forward-message", "type": "page", "children": [], - "minIndex": 229 + "minIndex": 224 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "segment": "unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "type": "page", - "children": [], - "minIndex": 230 - } - ], - "minIndex": 225 - }, - { - "id": "message/categorizing-messages", - "segment": "categorizing-messages", - "title": "Categorizing messages", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/categorizing-messages/categorize-messages-by-custom-type", - "segment": "categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "href": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "type": "page", - "children": [], - "minIndex": 192 - } - ], - "minIndex": 192 - }, - { - "id": "message/adding-extra-data-to-a-message", - "segment": "adding-extra-data-to-a-message", - "title": "Adding extra data to a message", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "segment": "add-extra-data-to-a-message", - "title": "Add extra data to a message", - "href": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", + "id": "message/creating-messages/create-merger-message", + "segment": "create-merger-message", + "title": "Create a merged forward message", + "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 132 + "minIndex": 225 } ], - "minIndex": 132 + "minIndex": 209 }, { - "id": "message/translating-messages", - "segment": "translating-messages", - "title": "Translating messages", + "id": "message/sending-messages", + "segment": "sending-messages", + "title": "Sending messages", "href": null, "type": "folder", "children": [ { - "id": "message/translating-messages/auto-translate-messages", - "segment": "auto-translate-messages", - "title": "Auto-translate messages", - "href": "/sdk/android/message/translating-messages/auto-translate-messages", + "id": "message/sending-messages/send-message", + "segment": "send-message", + "title": "Send a message", + "href": "/sdk/android/message/sending-messages/send-message", "type": "page", "children": [], - "minIndex": 146 + "minIndex": 226 }, { - "id": "message/translating-messages/translate-messages-on-demand", - "segment": "translate-messages-on-demand", - "title": "Translate messages on-demand", - "href": "/sdk/android/message/translating-messages/translate-messages-on-demand", + "id": "message/sending-messages/send-message-not-oss", + "segment": "send-message-not-oss", + "title": "Send an uploaded media message", + "href": "/sdk/android/message/sending-messages/send-message-not-oss", "type": "page", "children": [], - "minIndex": 147 + "minIndex": 227 }, { - "id": "message/translating-messages/translation-engine", - "segment": "translation-engine", - "title": "Translation engine", - "href": "/sdk/android/message/translating-messages/translation-engine", + "id": "message/sending-messages/set-msg-send-progress-listener", + "segment": "set-msg-send-progress-listener", + "title": "Track message sending progress", + "href": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "type": "page", "children": [], - "minIndex": 237 + "minIndex": 228, + "navigationTitle": "Track message sending progress" } ], - "minIndex": 146 + "minIndex": 226 }, { - "id": "message/marking-messages-as-read-in-a-group-channel", - "segment": "marking-messages-as-read-in-a-group-channel", - "title": "Marking messages as read in a group channel", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "segment": "mark-messages-as-read", - "title": "Mark messages as read", - "href": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "type": "page", - "children": [], - "minIndex": 259 - } - ], - "minIndex": 259 - } - ], - "minIndex": 132 - }, - { - "id": "application", - "segment": "application", - "title": "Application", - "href": null, - "type": "folder", - "children": [ - { - "id": "application/overview-application", - "segment": "overview-application", - "title": "Overview", - "href": "/sdk/android/application/overview-application", + "id": "message/receiving-messages/receive-messages", + "segment": "receive-messages", + "title": "Receive messages", + "href": "/sdk/android/message/receiving-messages/receive-messages", "type": "page", "children": [], - "minIndex": 160 + "minIndex": 229 }, { - "id": "application/authenticating-a-user", - "segment": "authenticating-a-user", - "title": "Authenticating a user", - "href": null, - "type": "folder", - "children": [ - { - "id": "application/authenticating-a-user/authentication", - "segment": "authentication", - "title": "Authentication", - "href": "/sdk/android/application/authenticating-a-user/authentication", - "type": "page", - "children": [], - "minIndex": 159 - } - ], - "minIndex": 159 + "id": "message/receiving-messages/receive-custom-business-messages", + "segment": "receive-custom-business-messages", + "title": "Receive custom business messages", + "href": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "type": "page", + "children": [], + "minIndex": 230 }, { - "id": "application/understanding-rate-limits", - "segment": "understanding-rate-limits", - "title": "Understanding rate limits", + "id": "message/retrieving-messages", + "segment": "retrieving-messages", + "title": "Retrieving messages", "href": null, "type": "folder", "children": [ { - "id": "application/understanding-rate-limits/rate-limits", - "segment": "rate-limits", - "title": "Rate limits", - "href": "/sdk/android/application/understanding-rate-limits/rate-limits", + "id": "message/retrieving-messages/load-older-messages", + "segment": "load-older-messages", + "title": "Load message history", + "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 161 - } - ], - "minIndex": 161 - } - ], - "minIndex": 159 - }, - { - "id": "event-handler", - "segment": "event-handler", - "title": "Event handler", - "href": null, - "type": "folder", - "children": [ - { - "id": "event-handler/overview-event-handler", - "segment": "overview-event-handler", - "title": "Event handler", - "href": "/sdk/android/event-handler/overview-event-handler", - "type": "page", - "children": [], - "minIndex": 184 - }, - { - "id": "event-handler/managing-channel-event-handlers", - "segment": "managing-channel-event-handlers", - "title": "Managing channel event handlers", - "href": null, - "type": "folder", - "children": [ + "minIndex": 231 + }, { - "id": "event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "segment": "add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "href": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", + "id": "message/retrieving-messages/load-newer-messages", + "segment": "load-newer-messages", + "title": "Load message history in reverse", + "href": "/sdk/android/message/retrieving-messages/load-newer-messages", "type": "page", "children": [], - "minIndex": 181 - } - ], - "minIndex": 181 - }, - { - "id": "event-handler/managing-connection-event-handlers", - "segment": "managing-connection-event-handlers", - "title": "Managing connection event handlers", - "href": null, - "type": "folder", - "children": [ + "minIndex": 232 + }, { - "id": "event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "segment": "add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "href": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", + "id": "message/retrieving-messages/find-messages-by-id", + "segment": "find-messages-by-id", + "title": "Find messages by ID", + "href": "/sdk/android/message/retrieving-messages/find-messages-by-id", "type": "page", "children": [], - "minIndex": 182 - } - ], - "minIndex": 182 - }, - { - "id": "event-handler/managing-user-event-handlers", - "segment": "managing-user-event-handlers", - "title": "Managing user event handlers", - "href": null, - "type": "folder", - "children": [ + "minIndex": 233 + }, { - "id": "event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "segment": "add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "href": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", + "id": "message/searching-messages/search-messages", + "segment": "search-messages", + "title": "Search messages", + "href": "/sdk/android/message/searching-messages/search-messages", "type": "page", "children": [], - "minIndex": 183 + "minIndex": 234 } ], - "minIndex": 183 - } - ], - "minIndex": 181 - }, - { - "id": "push-notifications", - "segment": "push-notifications", - "title": "Push notifications", - "href": null, - "type": "folder", - "children": [ + "minIndex": 231 + }, { - "id": "push-notifications/overview-push-notifications", - "segment": "overview-push-notifications", - "title": "Overview", - "href": "/sdk/android/push-notifications/overview-push-notifications", + "id": "message/composing-messages/update-typing-status", + "segment": "update-typing-status", + "title": "Report typing status", + "href": "/sdk/android/message/composing-messages/update-typing-status", "type": "page", "children": [], - "minIndex": 152 + "minIndex": 235 }, { - "id": "push-notifications/managing-push-notifications", - "segment": "managing-push-notifications", - "title": "Managing push notifications", + "id": "message/managing-messages", + "segment": "managing-messages", + "title": "Managing messages", "href": null, "type": "folder", "children": [ { - "id": "push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "segment": "set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "href": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", + "id": "message/managing-messages/delete-local-message", + "segment": "delete-local-message", + "title": "Delete a local message", + "href": "/sdk/android/message/managing-messages/delete-local-message", "type": "page", "children": [], - "minIndex": 242 + "minIndex": 236 }, { - "id": "push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "segment": "set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "href": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", + "id": "message/managing-messages/delete-saved-messages", + "segment": "delete-saved-messages", + "title": "Delete messages in a batch", + "href": "/sdk/android/message/managing-messages/delete-saved-messages", "type": "page", "children": [], - "minIndex": 243 + "minIndex": 237 + }, + { + "id": "message/managing-messages/revoke-a-message", + "segment": "revoke-a-message", + "title": "Revoke a message", + "href": "/sdk/android/message/managing-messages/revoke-a-message", + "type": "page", + "children": [], + "minIndex": 238 }, { - "id": "push-notifications/managing-push-notifications/configure-push-notification-preferences", - "segment": "configure-push-notification-preferences", - "title": "Configure push notification preferences", - "href": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", + "id": "message/managing-messages/modify-a-message", + "segment": "modify-a-message", + "title": "Modify a message", + "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 150 + "minIndex": 239 }, { - "id": "push-notifications/managing-push-notifications/push-notification-content-templates", - "segment": "push-notification-content-templates", - "title": "Push notification content templates", - "href": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", + "id": "message/managing-messages/get-pinned-messages", + "segment": "get-pinned-messages", + "title": "Get pinned messages in a conversation", + "href": "/sdk/android/message/managing-messages/get-pinned-messages", "type": "page", "children": [], "minIndex": 240 }, { - "id": "push-notifications/managing-push-notifications/push-notification-tester", - "segment": "push-notification-tester", - "title": "Push notification tester", - "href": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", + "id": "message/managing-messages/set-message-pinned", + "segment": "set-message-pinned", + "title": "Pin or unpin a message", + "href": "/sdk/android/message/managing-messages/set-message-pinned", "type": "page", "children": [], "minIndex": 241 }, { - "id": "push-notifications/managing-push-notifications/push-notification-translation", - "segment": "push-notification-translation", - "title": "Push notification translation", - "href": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", + "id": "message/managing-messages/insert-local-single-message", + "segment": "insert-local-single-message", + "title": "Insert a local one-to-one message", + "href": "/sdk/android/message/managing-messages/insert-local-single-message", "type": "page", "children": [], - "minIndex": 151 - } - ], - "minIndex": 150 - }, - { - "id": "push-notifications/marking-push-notifications-as-delivered", - "segment": "marking-push-notifications-as-delivered", - "title": "Marking push notifications as delivered", - "href": null, - "type": "folder", - "children": [ + "minIndex": 242 + }, { - "id": "push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "segment": "mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "href": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", + "id": "message/managing-messages/insert-local-group-message", + "segment": "insert-local-group-message", + "title": "Insert a local group message", + "href": "/sdk/android/message/managing-messages/insert-local-group-message", + "type": "page", + "children": [], + "minIndex": 243 + }, + { + "id": "message/managing-messages/clear-all-local-messages", + "segment": "clear-all-local-messages", + "title": "Clear all local messages", + "href": "/sdk/android/message/managing-messages/clear-all-local-messages", "type": "page", "children": [], "minIndex": 244 - } - ], - "minIndex": 244 - }, - { - "id": "push-notifications/multi-device-support", - "segment": "multi-device-support", - "title": "Multi device support", - "href": null, - "type": "folder", - "children": [ + }, { - "id": "push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "segment": "set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "href": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", + "id": "message/managing-messages/clear-all-messages", + "segment": "clear-all-messages", + "title": "Clear local and server messages", + "href": "/sdk/android/message/managing-messages/clear-all-messages", "type": "page", "children": [], "minIndex": 245 }, { - "id": "push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "segment": "set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "href": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", + "id": "message/managing-messages/set-message-local-ex", + "segment": "set-message-local-ex", + "title": "Set a local message extension", + "href": "/sdk/android/message/managing-messages/set-message-local-ex", "type": "page", "children": [], "minIndex": 246 } ], - "minIndex": 245 + "minIndex": 236 } ], - "minIndex": 150 + "minIndex": 208 }, { - "id": "report", - "segment": "report", - "title": "Report", + "id": "file-uploads", + "segment": "file-uploads", + "title": "File uploads", "href": null, "type": "folder", "children": [ { - "id": "report/overview-report", - "segment": "overview-report", - "title": "Overview", - "href": "/sdk/android/report/overview-report", + "id": "file-uploads/track-file-upload-progress", + "segment": "track-file-upload-progress", + "title": "Track file upload progress", + "href": "/sdk/android/file-uploads/track-file-upload-progress", "type": "page", "children": [], - "minIndex": 153 + "minIndex": 247, + "navigationTitle": "Track file upload progress" }, { - "id": "report/creating-a-report", - "segment": "creating-a-report", - "title": "Creating a report", - "href": null, - "type": "folder", - "children": [ - { - "id": "report/creating-a-report/report-a-message-user-or-channel", - "segment": "report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "href": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "type": "page", - "children": [], - "minIndex": 247 - } - ], - "minIndex": 247 + "id": "file-uploads/upload-file", + "segment": "upload-file", + "title": "Upload a file", + "href": "/sdk/android/file-uploads/upload-file", + "type": "page", + "children": [], + "minIndex": 248, + "navigationTitle": "Upload a file" } ], - "minIndex": 153 + "minIndex": 247 }, { - "id": "local-caching", - "segment": "local-caching", - "title": "Local caching", + "id": "calling", + "segment": "calling", + "title": "Calling", "href": null, "type": "folder", "children": [ { - "id": "local-caching/overview-local-caching", - "segment": "overview-local-caching", - "title": "Local caching", - "href": "/sdk/android/local-caching/overview-local-caching", + "id": "calling/overview-calling", + "segment": "overview-calling", + "title": "Audio and video calling overview", + "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 188 + "minIndex": 249 }, { - "id": "local-caching/using-group-channel-collection", - "segment": "using-group-channel-collection", - "title": "Using group channel collection", + "id": "calling/managing-calls", + "segment": "managing-calls", + "title": "Managing calls", "href": null, "type": "folder", "children": [ { - "id": "local-caching/using-group-channel-collection/group-channel-collection", - "segment": "group-channel-collection", - "title": "Group channel collection", - "href": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", + "id": "calling/managing-calls/start-single-call", + "segment": "start-single-call", + "title": "Start a one-to-one call", + "href": "/sdk/android/calling/managing-calls/start-single-call", + "type": "page", + "children": [], + "minIndex": 250, + "navigationTitle": "Start a one-to-one call" + }, + { + "id": "calling/managing-calls/start-group-call", + "segment": "start-group-call", + "title": "Start a group call", + "href": "/sdk/android/calling/managing-calls/start-group-call", + "type": "page", + "children": [], + "minIndex": 251, + "navigationTitle": "Start a group call" + }, + { + "id": "calling/managing-calls/accept-call", + "segment": "accept-call", + "title": "Accept a call", + "href": "/sdk/android/calling/managing-calls/accept-call", + "type": "page", + "children": [], + "minIndex": 252, + "navigationTitle": "Accept a call" + }, + { + "id": "calling/managing-calls/reject-call", + "segment": "reject-call", + "title": "Reject a call", + "href": "/sdk/android/calling/managing-calls/reject-call", + "type": "page", + "children": [], + "minIndex": 253, + "navigationTitle": "Reject a call" + }, + { + "id": "calling/managing-calls/cancel-call", + "segment": "cancel-call", + "title": "Cancel a call invitation", + "href": "/sdk/android/calling/managing-calls/cancel-call", + "type": "page", + "children": [], + "minIndex": 254, + "navigationTitle": "Cancel a call invitation" + }, + { + "id": "calling/managing-calls/hang-up-call", + "segment": "hang-up-call", + "title": "End a call", + "href": "/sdk/android/calling/managing-calls/hang-up-call", + "type": "page", + "children": [], + "minIndex": 255, + "navigationTitle": "Hang up a call" + }, + { + "id": "calling/managing-calls/handle-call-events", + "segment": "handle-call-events", + "title": "Handle call events", + "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 189 + "minIndex": 256, + "navigationTitle": "Handle call events" } ], - "minIndex": 189 + "minIndex": 250 }, { - "id": "local-caching/using-message-collection", - "segment": "using-message-collection", - "title": "Using message collection", + "id": "calling/retrieving-call-information", + "segment": "retrieving-call-information", + "title": "Retrieving call information", "href": null, "type": "folder", "children": [ { - "id": "local-caching/using-message-collection/message-collection", - "segment": "message-collection", - "title": "Message collection", - "href": "/sdk/android/local-caching/using-message-collection/message-collection", + "id": "calling/retrieving-call-information/restore-pending-invitation", + "segment": "restore-pending-invitation", + "title": "Restore a pending call invitation", + "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "type": "page", + "children": [], + "minIndex": 257, + "navigationTitle": "Restore a pending invitation" + }, + { + "id": "calling/retrieving-call-information/get-room-by-group-id", + "segment": "get-room-by-group-id", + "title": "Get a group call room", + "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "type": "page", + "children": [], + "minIndex": 258, + "navigationTitle": "Get a group call room" + }, + { + "id": "calling/retrieving-call-information/get-token-by-room-id", + "segment": "get-token-by-room-id", + "title": "Get a call room token", + "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 190 + "minIndex": 259, + "navigationTitle": "Get room credentials" } ], - "minIndex": 190 + "minIndex": 257 + }, + { + "id": "calling/sending-custom-signals/send-a-custom-signal", + "segment": "send-a-custom-signal", + "title": "Send a custom signal", + "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "type": "page", + "children": [], + "minIndex": 260 } ], - "minIndex": 188 + "minIndex": 249 }, { - "id": "migrating-to-openim", - "segment": "migrating-to-openim", - "title": "Migrating to OpenIM", - "href": "/sdk/android/migrating-to-openim", - "type": "page", - "children": [], - "minIndex": 239 - }, - { - "id": "deprecated", - "segment": "deprecated", - "title": "Deprecated", - "href": "/sdk/android/deprecated", + "id": "events/overview-events", + "segment": "overview-events", + "title": "Events overview", + "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 179 + "minIndex": 261, + "navigationTitle": "Events" }, { "id": "logger", @@ -5973,19 +5896,11 @@ "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 191 - }, - { - "id": "overview", - "segment": "overview", - "title": "OpenIM SDK for Android", - "href": "/sdk/android/overview", - "type": "page", - "children": [], - "minIndex": 149 + "minIndex": 262 } ], - "pageCount": 128 + "pageCount": 134, + "sidebarExpansion": "active-path" }, { "key": "chat/sdk/flutter", diff --git a/src/generated/routes.json b/src/generated/routes.json index 64e696d708..ce343ee212 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -4266,1398 +4266,1434 @@ "navOrder": 164 }, { - "id": 134, - "path": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "relativePath": "sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "sourcePath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Freeze and unfreeze a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1352, + "path": "/sdk/android/overview", + "relativePath": "sdk/android/overview", + "sourcePath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", + "description": "Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", - "template": "guide", - "status": "scaffold", - "sourceIndex": 129, - "contentFile": "content/docs/chat/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel.mdx", + "template": "overview", + "status": "published", + "sourceIndex": 2722, + "contentFile": "content/docs/chat/sdk/android/overview.mdx", "navOrder": 129 }, { - "id": 135, - "path": "/sdk/android/channel/overview-channel", - "relativePath": "sdk/android/channel/overview-channel", - "sourcePath": "/sdk/android/channel/overview-channel", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1353, + "path": "/sdk/android/getting-started/before-you-start", + "relativePath": "sdk/android/getting-started/before-you-start", + "sourcePath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", + "description": "Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 130, - "contentFile": "content/docs/chat/sdk/android/channel/overview-channel.mdx", + "status": "published", + "sourceIndex": 2723, + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx", "navOrder": 130 }, { - "id": 136, - "path": "/sdk/android/getting-started/send-first-message", - "relativePath": "sdk/android/getting-started/send-first-message", - "sourcePath": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1354, + "path": "/sdk/android/getting-started/environment-specific-implementation", + "relativePath": "sdk/android/getting-started/environment-specific-implementation", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", + "description": "Integrate, configure, and initialize OpenIM Android SDK while handling permissions, data storage, and application lifecycle boundaries.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 131, - "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx", + "status": "published", + "sourceIndex": 2724, + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx", "navOrder": 131 }, { - "id": 137, - "path": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "relativePath": "sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "sourcePath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add extra data to a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1355, + "path": "/sdk/android/getting-started/authenticate-and-manage-session", + "relativePath": "sdk/android/getting-started/authenticate-and-manage-session", + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "description": "Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 132, - "contentFile": "content/docs/chat/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message.mdx", + "status": "published", + "sourceIndex": 2725, + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx", "navOrder": 132 }, { - "id": 138, - "path": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "relativePath": "sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "sourcePath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Generate thumbnails of a file message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1356, + "path": "/sdk/android/getting-started/send-first-message", + "relativePath": "sdk/android/getting-started/send-first-message", + "sourcePath": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", + "description": "Verify the first one-to-one or group text-message send and receive flow in an Android application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 133, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message.mdx", + "status": "published", + "sourceIndex": 2726, + "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx", "navOrder": 133 }, { - "id": 139, - "path": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "relativePath": "sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "sourcePath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for React to a message in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1357, + "path": "/sdk/android/user/overview-user", + "relativePath": "sdk/android/user/overview-user", + "sourcePath": "/sdk/android/user/overview-user", + "title": "User overview", + "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 134, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2727, + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", "navOrder": 134 }, { - "id": 140, - "path": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "relativePath": "sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "sourcePath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send typing indicators to other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1358, + "path": "/sdk/android/user/user-profile/get-users-info", + "relativePath": "sdk/android/user/user-profile/get-users-info", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", + "description": "Use getUsersInfo() to query public profiles by userID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 135, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members.mdx", + "status": "published", + "sourceIndex": 2728, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx", "navOrder": 135 }, { - "id": 141, - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "relativePath": "sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Pin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1359, + "path": "/sdk/android/user/user-profile/get-self-local-user-info", + "relativePath": "sdk/android/user/user-profile/get-self-local-user-info", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", + "description": "Use getSelfLocalUserInfo() to retrieve the local profile for the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 136, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message.mdx", + "status": "published", + "sourceIndex": 2729, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx", "navOrder": 136 }, { - "id": 142, - "path": "/sdk/android/message/managing-polls/create-a-poll", - "relativePath": "sdk/android/message/managing-polls/create-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1360, + "path": "/sdk/android/user/user-profile/set-self-info", + "relativePath": "sdk/android/user/user-profile/set-self-info", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update the current user profile", + "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 137, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/create-a-poll.mdx", + "status": "published", + "sourceIndex": 2730, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx", "navOrder": 137 }, { - "id": 143, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1361, + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "relativePath": "sdk/android/user/user-profile/set-global-message-reception", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", + "description": "Use setSelfInfo() to set the account-wide message reception and notification policy.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 138, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message.mdx", + "status": "published", + "sourceIndex": 2731, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx", "navOrder": 138 }, { - "id": 144, - "path": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "relativePath": "sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "sourcePath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1362, + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "relativePath": "sdk/android/user/online-status/subscribe-users-online-status", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", + "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 139, - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered.mdx", + "status": "published", + "sourceIndex": 2732, + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx", "navOrder": 139 }, { - "id": 145, - "path": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "relativePath": "sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "sourcePath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mention other users in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1363, + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "relativePath": "sdk/android/user/online-status/get-subscribe-online-users-status", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", + "description": "Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 140, - "contentFile": "content/docs/chat/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx", + "status": "published", + "sourceIndex": 2733, + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx", "navOrder": 140 }, { - "id": 146, - "path": "/sdk/android/message/overview-message", - "relativePath": "sdk/android/message/overview-message", - "sourcePath": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1364, + "path": "/sdk/android/user/friends/get-friend-list-page", + "relativePath": "sdk/android/user/friends/get-friend-list-page", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", + "description": "Use getFriendListPage() to retrieve the current user friend list by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 141, - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", + "status": "published", + "sourceIndex": 2734, + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx", "navOrder": 141 }, { - "id": 147, - "path": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "relativePath": "sdk/android/message/retrieving-messages/retrieve-a-message", - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1365, + "path": "/sdk/android/user/friends/search-friends", + "relativePath": "sdk/android/user/friends/search-friends", + "sourcePath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", + "description": "Use searchFriends() to search the current user friend list.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 142, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-message.mdx", + "status": "published", + "sourceIndex": 2735, + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx", "navOrder": 142 }, { - "id": 148, - "path": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "relativePath": "sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "sourcePath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search messages by a keyword. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1366, + "path": "/sdk/android/user/friends/get-friends-info", + "relativePath": "sdk/android/user/friends/get-friends-info", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", + "description": "Use getFriendsInfo() to query friendship profiles for specified users.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 143, - "contentFile": "content/docs/chat/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword.mdx", + "status": "published", + "sourceIndex": 2736, + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx", "navOrder": 143 }, { - "id": 149, - "path": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "relativePath": "sdk/android/message/sending-a-message/share-an-encrypted-file", - "sourcePath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Share an encrypted file. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1367, + "path": "/sdk/android/user/friends/check-friend", + "relativePath": "sdk/android/user/friends/check-friend", + "sourcePath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", + "description": "Use checkFriend() to check whether specified users are friends of the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 144, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/share-an-encrypted-file.mdx", + "status": "published", + "sourceIndex": 2737, + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx", "navOrder": 144 }, { - "id": 150, - "path": "/sdk/android/message/sending-a-message/smart-throttling", - "relativePath": "sdk/android/message/sending-a-message/smart-throttling", - "sourcePath": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Smart throttling. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1368, + "path": "/sdk/android/user/friends/update-friends", + "relativePath": "sdk/android/user/friends/update-friends", + "sourcePath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", + "description": "Use updateFriendsReq() to update friend remarks, pinned state, or extension data.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 145, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/smart-throttling.mdx", + "status": "published", + "sourceIndex": 2738, + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx", "navOrder": 145 }, { - "id": 151, - "path": "/sdk/android/message/translating-messages/auto-translate-messages", - "relativePath": "sdk/android/message/translating-messages/auto-translate-messages", - "sourcePath": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Auto-translate messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1369, + "path": "/sdk/android/user/friends/delete-friend", + "relativePath": "sdk/android/user/friends/delete-friend", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", + "description": "Use deleteFriend() to remove one friendship from the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 146, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/auto-translate-messages.mdx", + "status": "published", + "sourceIndex": 2739, + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx", "navOrder": 146 }, { - "id": 152, - "path": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "relativePath": "sdk/android/message/translating-messages/translate-messages-on-demand", - "sourcePath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translate messages on-demand. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1370, + "path": "/sdk/android/user/friend-applications/add-friend", + "relativePath": "sdk/android/user/friend-applications/add-friend", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", + "description": "Use addFriend() to send a friend request to a specified user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 147, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translate-messages-on-demand.mdx", + "status": "published", + "sourceIndex": 2740, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx", "navOrder": 147 }, { - "id": 153, - "path": "/sdk/android/message/using-message-threading/create-a-message-thread", - "relativePath": "sdk/android/message/using-message-threading/create-a-message-thread", - "sourcePath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1371, + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "relativePath": "sdk/android/user/friend-applications/get-recv-friend-application-list", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", + "description": "Use getRecvFriendApplicationList() to query received friend requests by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 148, - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/create-a-message-thread.mdx", + "status": "published", + "sourceIndex": 2741, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx", "navOrder": 148 }, { - "id": 154, - "path": "/sdk/android/overview", - "relativePath": "sdk/android/overview", - "sourcePath": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1372, + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "relativePath": "sdk/android/user/friend-applications/get-send-friend-application-list", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", + "description": "Use getSendFriendApplicationList() to query sent friend requests by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", - "template": "overview", - "status": "scaffold", - "sourceIndex": 149, - "contentFile": "content/docs/chat/sdk/android/overview.mdx", + "template": "guide", + "status": "published", + "sourceIndex": 2742, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx", "navOrder": 149 }, { - "id": 155, - "path": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Configure push notification preferences. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1373, + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "relativePath": "sdk/android/user/friend-applications/accept-friend-application", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", + "description": "Use acceptFriendApplication() to accept a friend request.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 150, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx", + "status": "published", + "sourceIndex": 2743, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx", "navOrder": 150 }, { - "id": 156, - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification translation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1374, + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "relativePath": "sdk/android/user/friend-applications/refuse-friend-application", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", + "description": "Use refuseFriendApplication() to reject a friend request.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 151, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-translation.mdx", + "status": "published", + "sourceIndex": 2744, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", "navOrder": 151 }, { - "id": 157, - "path": "/sdk/android/push-notifications/overview-push-notifications", - "relativePath": "sdk/android/push-notifications/overview-push-notifications", - "sourcePath": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1375, + "path": "/sdk/android/user/blacklist/get-blacklist", + "relativePath": "sdk/android/user/blacklist/get-blacklist", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", + "description": "Use getBlacklist() to retrieve the current user blacklist.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 152, - "contentFile": "content/docs/chat/sdk/android/push-notifications/overview-push-notifications.mdx", + "status": "published", + "sourceIndex": 2745, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx", "navOrder": 152 }, { - "id": 158, - "path": "/sdk/android/report/overview-report", - "relativePath": "sdk/android/report/overview-report", - "sourcePath": "/sdk/android/report/overview-report", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1376, + "path": "/sdk/android/user/blacklist/add-blacklist", + "relativePath": "sdk/android/user/blacklist/add-blacklist", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", + "description": "Use addBlacklist() to add a user to the current account blacklist.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 153, - "contentFile": "content/docs/chat/sdk/android/report/overview-report.mdx", + "status": "published", + "sourceIndex": 2746, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx", "navOrder": 153 }, { - "id": 159, - "path": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "relativePath": "sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "sourcePath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Block and unblock other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1377, + "path": "/sdk/android/user/blacklist/remove-blacklist", + "relativePath": "sdk/android/user/blacklist/remove-blacklist", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", + "description": "Use removeBlacklist() to remove a user from the current account blacklist.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 155, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/block-and-unblock-other-members.mdx", + "status": "published", + "sourceIndex": 2747, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx", + "navOrder": 154 + }, + { + "id": 1378, + "path": "/sdk/android/conversation/overview-conversation", + "relativePath": "sdk/android/conversation/overview-conversation", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", + "description": "Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2748, + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx", "navOrder": 155 }, { - "id": 160, - "path": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "relativePath": "sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "sourcePath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mute and unmute a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1379, + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", + "description": "Use getOneConversation() to retrieve one Android conversation by user or group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 156, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/mute-and-unmute-a-user.mdx", + "status": "published", + "sourceIndex": 2749, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx", "navOrder": 156 }, { - "id": 161, - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "relativePath": "sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the online status of a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1380, + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-id", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", + "description": "Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 157, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx", + "status": "published", + "sourceIndex": 2750, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx", "navOrder": 157 }, { - "id": 162, - "path": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "relativePath": "sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve members who have read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1381, + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", + "description": "Use getMultipleConversation() to retrieve Android conversations by conversationID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 158, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx", + "status": "published", + "sourceIndex": 2751, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx", "navOrder": 158 }, { - "id": 163, - "path": "/sdk/android/application/authenticating-a-user/authentication", - "relativePath": "sdk/android/application/authenticating-a-user/authentication", - "sourcePath": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Authentication. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1382, + "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "relativePath": "sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", + "description": "Use getConversationListSplit() to retrieve the current Android account conversation list by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 159, - "contentFile": "content/docs/chat/sdk/android/application/authenticating-a-user/authentication.mdx", + "status": "published", + "sourceIndex": 2752, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx", "navOrder": 159 }, { - "id": 164, - "path": "/sdk/android/application/overview-application", - "relativePath": "sdk/android/application/overview-application", - "sourcePath": "/sdk/android/application/overview-application", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1383, + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "relativePath": "sdk/android/conversation/managing-conversations/pin-conversation", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", + "description": "Use pinConversation() to set the pinned state of an Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 160, - "contentFile": "content/docs/chat/sdk/android/application/overview-application.mdx", + "status": "published", + "sourceIndex": 2753, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx", "navOrder": 160 }, { - "id": 165, - "path": "/sdk/android/application/understanding-rate-limits/rate-limits", - "relativePath": "sdk/android/application/understanding-rate-limits/rate-limits", - "sourcePath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Rate limits. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1384, + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-extension", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", + "description": "Use setConversationEx() to set an Android conversation extension string.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 161, - "contentFile": "content/docs/chat/sdk/android/application/understanding-rate-limits/rate-limits.mdx", + "status": "published", + "sourceIndex": 2754, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx", "navOrder": 161 }, { - "id": 166, - "path": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "relativePath": "sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "sourcePath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize channels by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1385, + "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-draft", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", + "description": "Use setConversationDraft() to save an Android conversation draft.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 162, - "contentFile": "content/docs/chat/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type.mdx", + "status": "published", + "sourceIndex": 2755, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx", "navOrder": 162 }, { - "id": 167, - "path": "/sdk/android/channel/creating-a-channel/create-a-channel", - "relativePath": "sdk/android/channel/creating-a-channel/create-a-channel", - "sourcePath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1386, + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "relativePath": "sdk/android/conversation/managing-conversations/set-message-receive-option", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", + "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 163, - "contentFile": "content/docs/chat/sdk/android/channel/creating-a-channel/create-a-channel.mdx", + "status": "published", + "sourceIndex": 2756, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx", "navOrder": 163 }, { - "id": 168, - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "relativePath": "sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Accept or decline an invitation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1387, + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "relativePath": "sdk/android/conversation/managing-conversations/clear-group-mentions", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", + "description": "Use resetConversationGroupAtType() to reset an Android conversation group mention state.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 164, - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx", + "status": "published", + "sourceIndex": 2757, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx", "navOrder": 164 }, { - "id": 169, - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "relativePath": "sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Invite users as members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1388, + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "relativePath": "sdk/android/conversation/managing-conversations/mark-conversation-read", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", + "description": "Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 165, - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx", + "status": "published", + "sourceIndex": 2758, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx", "navOrder": 165 }, { - "id": 170, - "path": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "relativePath": "sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Enter and exit an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1389, + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "relativePath": "sdk/android/conversation/managing-conversations/get-total-unread-count", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", + "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 166, - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx", + "status": "published", + "sourceIndex": 2759, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx", "navOrder": 166 }, { - "id": 171, - "path": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "relativePath": "sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Join and leave a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1390, + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "relativePath": "sdk/android/conversation/managing-conversations/set-private-chat", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", + "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 167, - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2760, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx", "navOrder": 167 }, { - "id": 172, - "path": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "relativePath": "sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "sourcePath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metacounters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1391, + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "relativePath": "sdk/android/conversation/managing-conversations/set-burn-duration", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", + "description": "Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 168, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters.mdx", + "status": "published", + "sourceIndex": 2761, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx", "navOrder": 168 }, { - "id": 173, - "path": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "relativePath": "sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "sourcePath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1392, + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "relativePath": "sdk/android/conversation/managing-conversations/set-message-destruct", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", + "description": "Use setConversation() to configure scheduled server message deletion for an Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 169, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metadata/manage-channel-metadata.mdx", + "status": "published", + "sourceIndex": 2762, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx", "navOrder": 169 }, { - "id": 174, - "path": "/sdk/android/channel/managing-channels/delete-a-channel", - "relativePath": "sdk/android/channel/managing-channels/delete-a-channel", - "sourcePath": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1393, + "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "relativePath": "sdk/android/conversation/managing-conversations/hide-a-conversation", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", + "description": "Use hideConversation() to hide a conversation entry from the current Android account.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 170, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/delete-a-channel.mdx", + "status": "published", + "sourceIndex": 2763, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx", "navOrder": 170 }, { - "id": 175, - "path": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "relativePath": "sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "sourcePath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Hide or archive a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1394, + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "relativePath": "sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "description": "Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 171, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2764, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx", "navOrder": 171 }, { - "id": 176, - "path": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "relativePath": "sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "sourcePath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Refresh all data related to a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1395, + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "relativePath": "sdk/android/conversation/managing-conversations/clear-conversation-messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", + "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 172, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2765, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx", "navOrder": 172 }, { - "id": 177, - "path": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "relativePath": "sdk/android/channel/managing-operators/register-and-remove-operators", - "sourcePath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Register and remove operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1396, + "path": "/sdk/android/group/overview-group", + "relativePath": "sdk/android/group/overview-group", + "sourcePath": "/sdk/android/group/overview-group", + "title": "Group overview", + "description": "OpenIM Android SDK guide for Group overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 173, - "contentFile": "content/docs/chat/sdk/android/channel/managing-operators/register-and-remove-operators.mdx", + "status": "draft", + "sourceIndex": 2766, + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx", "navOrder": 173 }, { - "id": 178, - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "relativePath": "sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a channel by URL. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1397, + "path": "/sdk/android/group/create-group", + "relativePath": "sdk/android/group/create-group", + "sourcePath": "/sdk/android/group/create-group", + "title": "Create a group", + "description": "OpenIM Android SDK guide for Create a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 174, - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url.mdx", + "status": "draft", + "sourceIndex": 2767, + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx", "navOrder": 174 }, { - "id": 179, - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "relativePath": "sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1398, + "path": "/sdk/android/group/update-group-profile", + "relativePath": "sdk/android/group/update-group-profile", + "sourcePath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", + "description": "OpenIM Android SDK guide for Update group profile.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 175, - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels.mdx", + "status": "draft", + "sourceIndex": 2768, + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx", "navOrder": 175 }, { - "id": 180, - "path": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "relativePath": "sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "sourcePath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Filter group channels by user IDs. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1399, + "path": "/sdk/android/group/set-group-announcement", + "relativePath": "sdk/android/group/set-group-announcement", + "sourcePath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", + "description": "OpenIM Android SDK guide for Publish a group announcement.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 176, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids.mdx", + "status": "draft", + "sourceIndex": 2769, + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx", "navOrder": 176 }, { - "id": 181, - "path": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "relativePath": "sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "sourcePath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search group channels by name, URL, or other filters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1400, + "path": "/sdk/android/group/set-group-extension", + "relativePath": "sdk/android/group/set-group-extension", + "sourcePath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", + "description": "OpenIM Android SDK guide for Set group extra data.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 177, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters.mdx", + "status": "draft", + "sourceIndex": 2770, + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", "navOrder": 177 }, { - "id": 182, - "path": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "relativePath": "sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "sourcePath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search open channels by name, URL, or custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1401, + "path": "/sdk/android/group/set-group-join-verification", + "relativePath": "sdk/android/group/set-group-join-verification", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", + "description": "OpenIM Android SDK guide for Set group join verification.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 178, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx", + "status": "draft", + "sourceIndex": 2771, + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx", "navOrder": 178 }, { - "id": 183, - "path": "/sdk/android/deprecated", - "relativePath": "sdk/android/deprecated", - "sourcePath": "/sdk/android/deprecated", - "title": "Deprecated", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Deprecated. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1402, + "path": "/sdk/android/group/set-group-member-profile-access", + "relativePath": "sdk/android/group/set-group-member-profile-access", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", + "description": "OpenIM Android SDK guide for Set member profile access.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 179, - "contentFile": "content/docs/chat/sdk/android/deprecated.mdx", + "status": "draft", + "sourceIndex": 2772, + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx", "navOrder": 179 }, { - "id": 185, - "path": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "relativePath": "sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "sourcePath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a channel event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1403, + "path": "/sdk/android/group/set-group-member-friend-permission", + "relativePath": "sdk/android/group/set-group-member-friend-permission", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", + "description": "OpenIM Android SDK guide for Set member friend request permission.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 181, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler.mdx", + "status": "draft", + "sourceIndex": 2773, + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx", + "navOrder": 180 + }, + { + "id": 1404, + "path": "/sdk/android/group/change-group-mute", + "relativePath": "sdk/android/group/change-group-mute", + "sourcePath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", + "description": "OpenIM Android SDK guide for Change group mute status.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2774, + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx", "navOrder": 181 }, { - "id": 186, - "path": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "relativePath": "sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "sourcePath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a connection event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1405, + "path": "/sdk/android/group/join-group", + "relativePath": "sdk/android/group/join-group", + "sourcePath": "/sdk/android/group/join-group", + "title": "Apply to join a group", + "description": "OpenIM Android SDK guide for Apply to join a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 182, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx", + "status": "draft", + "sourceIndex": 2775, + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx", "navOrder": 182 }, { - "id": 187, - "path": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "relativePath": "sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "sourcePath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a user event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1406, + "path": "/sdk/android/group/quit-group", + "relativePath": "sdk/android/group/quit-group", + "sourcePath": "/sdk/android/group/quit-group", + "title": "Leave a group", + "description": "OpenIM Android SDK guide for Leave a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 183, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx", + "status": "draft", + "sourceIndex": 2776, + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx", "navOrder": 183 }, { - "id": 188, - "path": "/sdk/android/event-handler/overview-event-handler", - "relativePath": "sdk/android/event-handler/overview-event-handler", - "sourcePath": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1407, + "path": "/sdk/android/group/dismiss-group", + "relativePath": "sdk/android/group/dismiss-group", + "sourcePath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", + "description": "OpenIM Android SDK guide for Dismiss a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 184, - "contentFile": "content/docs/chat/sdk/android/event-handler/overview-event-handler.mdx", + "status": "draft", + "sourceIndex": 2777, + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx", "navOrder": 184 }, { - "id": 189, - "path": "/sdk/android/getting-started/collection-migration-guide", - "relativePath": "sdk/android/getting-started/collection-migration-guide", - "sourcePath": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Collection migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1408, + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "relativePath": "sdk/android/group/retrieving-groups/get-specified-groups-info", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", + "description": "OpenIM Android SDK guide for Get group information.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 185, - "contentFile": "content/docs/chat/sdk/android/getting-started/collection-migration-guide.mdx", + "status": "draft", + "sourceIndex": 2778, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx", "navOrder": 185 }, { - "id": 190, - "path": "/sdk/android/getting-started/kotlin-extension", - "relativePath": "sdk/android/getting-started/kotlin-extension", - "sourcePath": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Kotlin extension (KTX). Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1409, + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "relativePath": "sdk/android/group/retrieving-groups/get-joined-group-list-page", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", + "description": "OpenIM Android SDK guide for Get joined groups by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 186, - "contentFile": "content/docs/chat/sdk/android/getting-started/kotlin-extension.mdx", + "status": "draft", + "sourceIndex": 2779, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx", "navOrder": 186 }, { - "id": 191, - "path": "/sdk/android/getting-started/migration-guide", - "relativePath": "sdk/android/getting-started/migration-guide", - "sourcePath": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1410, + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "relativePath": "sdk/android/group/retrieving-groups/is-join-group", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", + "description": "OpenIM Android SDK guide for Check group membership.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 187, - "contentFile": "content/docs/chat/sdk/android/getting-started/migration-guide.mdx", + "status": "draft", + "sourceIndex": 2780, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx", "navOrder": 187 }, { - "id": 192, - "path": "/sdk/android/local-caching/overview-local-caching", - "relativePath": "sdk/android/local-caching/overview-local-caching", - "sourcePath": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Local caching. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1411, + "path": "/sdk/android/group/retrieving-groups/search-groups", + "relativePath": "sdk/android/group/retrieving-groups/search-groups", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", + "description": "OpenIM Android SDK guide for Search groups.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 188, - "contentFile": "content/docs/chat/sdk/android/local-caching/overview-local-caching.mdx", + "status": "draft", + "sourceIndex": 2781, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx", "navOrder": 188 }, { - "id": 193, - "path": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "relativePath": "sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "sourcePath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Group channel collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1412, + "path": "/sdk/android/group/group-applications/overview-group-applications", + "relativePath": "sdk/android/group/group-applications/overview-group-applications", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", + "description": "OpenIM Android SDK guide for Group applications overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 189, - "contentFile": "content/docs/chat/sdk/android/local-caching/using-group-channel-collection/group-channel-collection.mdx", + "status": "draft", + "sourceIndex": 2782, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx", "navOrder": 189 }, { - "id": 194, - "path": "/sdk/android/local-caching/using-message-collection/message-collection", - "relativePath": "sdk/android/local-caching/using-message-collection/message-collection", - "sourcePath": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Message collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1413, + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-recipient", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", + "description": "OpenIM Android SDK guide for Get received group applications.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 190, - "contentFile": "content/docs/chat/sdk/android/local-caching/using-message-collection/message-collection.mdx", + "status": "draft", + "sourceIndex": 2783, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx", "navOrder": 190 }, { - "id": 195, - "path": "/sdk/android/logger", - "relativePath": "sdk/android/logger", - "sourcePath": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1414, + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-applicant", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", + "description": "OpenIM Android SDK guide for Get sent group applications.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 191, - "contentFile": "content/docs/chat/sdk/android/logger.mdx", + "status": "draft", + "sourceIndex": 2784, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx", "navOrder": 191 }, { - "id": 196, - "path": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "relativePath": "sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "sourcePath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize messages by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1415, + "path": "/sdk/android/group/group-applications/accept-group-application", + "relativePath": "sdk/android/group/group-applications/accept-group-application", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", + "description": "OpenIM Android SDK guide for Accept a group application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 192, - "contentFile": "content/docs/chat/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type.mdx", + "status": "draft", + "sourceIndex": 2785, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx", "navOrder": 192 }, { - "id": 197, - "path": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "relativePath": "sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "sourcePath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1416, + "path": "/sdk/android/group/group-applications/refuse-group-application", + "relativePath": "sdk/android/group/group-applications/refuse-group-application", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", + "description": "OpenIM Android SDK guide for Reject a group application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 193, - "contentFile": "content/docs/chat/sdk/android/message/listing-changelogs/list-changelogs-of-messages.mdx", + "status": "draft", + "sourceIndex": 2786, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx", "navOrder": 193 }, { - "id": 198, - "path": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "relativePath": "sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "sourcePath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Clear the chat history in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1417, + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "relativePath": "sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", + "description": "OpenIM Android SDK guide for Group member queries overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 194, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx", + "status": "draft", + "sourceIndex": 2787, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx", "navOrder": 194 }, { - "id": 199, - "path": "/sdk/android/message/managing-a-message/copy-a-message", - "relativePath": "sdk/android/message/managing-a-message/copy-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Copy a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1418, + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-list", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "List group members", + "description": "OpenIM Android SDK guide for List group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 195, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/copy-a-message.mdx", + "status": "draft", + "sourceIndex": 2788, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx", "navOrder": 195 }, { - "id": 200, - "path": "/sdk/android/message/managing-a-message/delete-a-message", - "relativePath": "sdk/android/message/managing-a-message/delete-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1419, + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "relativePath": "sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get specified group member profiles", + "description": "OpenIM Android SDK guide for Get specified group member profiles.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 196, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/delete-a-message.mdx", + "status": "draft", + "sourceIndex": 2789, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx", "navOrder": 196 }, { - "id": 201, - "path": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "relativePath": "sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Display Open Graph tags in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1420, + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "relativePath": "sdk/android/group/retrieving-group-members/get-users-in-group", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check group membership", + "description": "OpenIM Android SDK guide for Check group membership.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 197, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message.mdx", + "status": "draft", + "sourceIndex": 2790, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx", "navOrder": 197 }, { - "id": 202, - "path": "/sdk/android/message/managing-a-message/update-a-message", - "relativePath": "sdk/android/message/managing-a-message/update-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1421, + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get the group owner and administrators", + "description": "OpenIM Android SDK guide for Get the group owner and administrators.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 198, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/update-a-message.mdx", + "status": "draft", + "sourceIndex": 2791, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", "navOrder": 198 }, { - "id": 203, - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "relativePath": "sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List pinned messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1422, + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "relativePath": "sdk/android/group/retrieving-group-members/search-group-members", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", + "description": "OpenIM Android SDK guide for Search group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 199, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx", + "status": "draft", + "sourceIndex": 2792, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx", "navOrder": 199 }, { - "id": 204, - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "relativePath": "sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Unpin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1423, + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "relativePath": "sdk/android/group/managing-group-members/invite-user-to-group", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", + "description": "OpenIM Android SDK guide for Invite users to a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 200, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message.mdx", + "status": "draft", + "sourceIndex": 2793, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx", "navOrder": 200 }, { - "id": 205, - "path": "/sdk/android/message/managing-polls/add-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/add-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1424, + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "relativePath": "sdk/android/group/managing-group-members/kick-group-member", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", + "description": "OpenIM Android SDK guide for Remove group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 201, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/add-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2794, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx", "navOrder": 201 }, { - "id": 206, - "path": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "relativePath": "sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "sourcePath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cast or cancel a vote. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1425, + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-nickname", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a member’s group nickname", + "description": "OpenIM Android SDK guide for Update a member’s group nickname.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 202, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/cast-or-cancel-a-vote.mdx", + "status": "draft", + "sourceIndex": 2795, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx", "navOrder": 202 }, { - "id": 207, - "path": "/sdk/android/message/managing-polls/close-a-poll", - "relativePath": "sdk/android/message/managing-polls/close-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Close a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1426, + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-role-level", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "description": "OpenIM Android SDK guide for Manage group administrators.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 203, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/close-a-poll.mdx", + "status": "draft", + "sourceIndex": 2796, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx", "navOrder": 203 }, { - "id": 208, - "path": "/sdk/android/message/managing-polls/delete-a-poll", - "relativePath": "sdk/android/message/managing-polls/delete-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1427, + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-avatar", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member’s avatar", + "description": "OpenIM Android SDK guide for Update a group member’s avatar.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 204, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll.mdx", + "status": "draft", + "sourceIndex": 2797, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx", "navOrder": 204 }, { - "id": 209, - "path": "/sdk/android/message/managing-polls/delete-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/delete-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1428, + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-extension", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set a group member extension", + "description": "OpenIM Android SDK guide for Set a group member extension.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 205, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2798, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx", "navOrder": 205 }, { - "id": 210, - "path": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "relativePath": "sdk/android/message/managing-polls/list-changelogs-of-polls", - "sourcePath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1429, + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "relativePath": "sdk/android/group/managing-group-members/transfer-group-owner", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "description": "OpenIM Android SDK guide for Transfer group ownership.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 206, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/list-changelogs-of-polls.mdx", + "status": "draft", + "sourceIndex": 2799, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx", "navOrder": 206 }, { - "id": 211, - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1430, + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "relativePath": "sdk/android/group/managing-group-members/change-group-member-mute", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "description": "OpenIM Android SDK guide for Mute or unmute a group member.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 207, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-polls.mdx", + "status": "draft", + "sourceIndex": 2800, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx", "navOrder": 207 }, { - "id": 212, - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of voters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1431, + "path": "/sdk/android/message/overview-message", + "relativePath": "sdk/android/message/overview-message", + "sourcePath": "/sdk/android/message/overview-message", + "title": "Overview", + "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", "product": "sdk", "version": "v4", "platform": "android", @@ -5665,910 +5701,982 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "scaffold", - "sourceIndex": 208, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-voters.mdx", + "sourceIndex": 2801, + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", "navOrder": 208 }, { - "id": 213, - "path": "/sdk/android/message/managing-polls/retrieve-a-poll", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1432, + "path": "/sdk/android/message/creating-messages/create-text-message", + "relativePath": "sdk/android/message/creating-messages/create-text-message", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "description": "OpenIM Android SDK guide for Create a text message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 209, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll.mdx", + "status": "draft", + "sourceIndex": 2802, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx", "navOrder": 209 }, { - "id": 214, - "path": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1433, + "path": "/sdk/android/message/creating-messages/create-text-at-message", + "relativePath": "sdk/android/message/creating-messages/create-text-at-message", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create an @ message", + "description": "OpenIM Android SDK guide for Create an @ message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 210, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2803, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx", "navOrder": 210 }, { - "id": 215, - "path": "/sdk/android/message/managing-polls/update-a-poll", - "relativePath": "sdk/android/message/managing-polls/update-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1434, + "path": "/sdk/android/message/creating-messages/create-custom-message", + "relativePath": "sdk/android/message/creating-messages/create-custom-message", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "description": "OpenIM Android SDK guide for Create a custom message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 211, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll.mdx", + "status": "draft", + "sourceIndex": 2804, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx", "navOrder": 211 }, { - "id": 216, - "path": "/sdk/android/message/managing-polls/update-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/update-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1435, + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-image-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", + "description": "OpenIM Android SDK guide for Create an image message from a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 212, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2805, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx", "navOrder": 212 }, { - "id": 217, - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "relativePath": "sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Get read status of a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1436, + "path": "/sdk/android/message/creating-messages/create-image-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-image-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "description": "OpenIM Android SDK guide for Create an image message from a URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 213, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status.mdx", + "status": "draft", + "sourceIndex": 2806, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx", "navOrder": 213 }, { - "id": 218, - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "relativePath": "sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1437, + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", + "description": "OpenIM Android SDK guide for Create an audio message from a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 214, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx", + "status": "draft", + "sourceIndex": 2807, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx", "navOrder": 214 }, { - "id": 219, - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "relativePath": "sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as unread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1438, + "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "description": "OpenIM Android SDK guide for Create an audio message from a URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 215, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx", + "status": "draft", + "sourceIndex": 2808, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx", "navOrder": 215 }, { - "id": 220, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1439, + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-video-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from files", + "description": "OpenIM Android SDK guide for Create a video message from files.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 216, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx", + "status": "draft", + "sourceIndex": 2809, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx", "navOrder": 216 }, { - "id": 221, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List all scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1440, + "path": "/sdk/android/message/creating-messages/create-video-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-video-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "description": "OpenIM Android SDK guide for Create a video message from URLs.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 217, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx", + "status": "draft", + "sourceIndex": 2810, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx", "navOrder": 217 }, { - "id": 222, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1441, + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-file-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", + "description": "OpenIM Android SDK guide for Create a file message from a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 218, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx", + "status": "draft", + "sourceIndex": 2811, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx", "navOrder": 218 }, { - "id": 223, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the total number of scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1442, + "path": "/sdk/android/message/creating-messages/create-file-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-file-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "description": "OpenIM Android SDK guide for Create a file message from a URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 219, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages.mdx", + "status": "draft", + "sourceIndex": 2812, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx", "navOrder": 219 }, { - "id": 224, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send scheduled message immediately. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1443, + "path": "/sdk/android/message/creating-messages/create-card-message", + "relativePath": "sdk/android/message/creating-messages/create-card-message", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "description": "OpenIM Android SDK guide for Create a contact card message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 220, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx", + "status": "draft", + "sourceIndex": 2813, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx", "navOrder": 220 }, { - "id": 225, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1444, + "path": "/sdk/android/message/creating-messages/create-location-message", + "relativePath": "sdk/android/message/creating-messages/create-location-message", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "description": "OpenIM Android SDK guide for Create a location message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 221, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx", + "status": "draft", + "sourceIndex": 2814, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx", "navOrder": 221 }, { - "id": 226, - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "relativePath": "sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1445, + "path": "/sdk/android/message/creating-messages/create-face-message", + "relativePath": "sdk/android/message/creating-messages/create-face-message", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "description": "OpenIM Android SDK guide for Create an emoji message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 222, - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx", + "status": "draft", + "sourceIndex": 2815, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx", "navOrder": 222 }, { - "id": 227, - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "relativePath": "sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1446, + "path": "/sdk/android/message/creating-messages/create-quote-message", + "relativePath": "sdk/android/message/creating-messages/create-quote-message", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "description": "OpenIM Android SDK guide for Create a reply message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 223, - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx", + "status": "draft", + "sourceIndex": 2816, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx", "navOrder": 223 }, { - "id": 228, - "path": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "relativePath": "sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1447, + "path": "/sdk/android/message/creating-messages/create-forward-message", + "relativePath": "sdk/android/message/creating-messages/create-forward-message", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "description": "OpenIM Android SDK guide for Create a forwarded message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 224, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages.mdx", + "status": "draft", + "sourceIndex": 2817, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx", "navOrder": 224 }, { - "id": 229, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1448, + "path": "/sdk/android/message/creating-messages/create-merger-message", + "relativePath": "sdk/android/message/creating-messages/create-merger-message", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged forward message", + "description": "OpenIM Android SDK guide for Create a merged forward message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 225, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message.mdx", + "status": "draft", + "sourceIndex": 2818, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx", "navOrder": 225 }, { - "id": 230, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't received a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1449, + "path": "/sdk/android/message/sending-messages/send-message", + "relativePath": "sdk/android/message/sending-messages/send-message", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "description": "OpenIM Android SDK guide for Send a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 226, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message.mdx", + "status": "draft", + "sourceIndex": 2819, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx", "navOrder": 226 }, { - "id": 231, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of channels with unread messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1450, + "path": "/sdk/android/message/sending-messages/send-message-not-oss", + "relativePath": "sdk/android/message/sending-messages/send-message-not-oss", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send an uploaded media message", + "description": "OpenIM Android SDK guide for Send an uploaded media message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 227, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels.mdx", + "status": "draft", + "sourceIndex": 2820, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx", "navOrder": 227 }, { - "id": 232, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread items. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1451, + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "relativePath": "sdk/android/message/sending-messages/set-msg-send-progress-listener", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "description": "OpenIM Android SDK guide for Track message sending progress.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 228, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items.mdx", + "status": "draft", + "sourceIndex": 2821, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx", "navOrder": 228 }, { - "id": 233, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1452, + "path": "/sdk/android/message/receiving-messages/receive-messages", + "relativePath": "sdk/android/message/receiving-messages/receive-messages", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "description": "OpenIM Android SDK guide for Receive messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 229, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx", + "status": "draft", + "sourceIndex": 2822, + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx", "navOrder": 229 }, { - "id": 234, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in all channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1453, + "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "relativePath": "sdk/android/message/receiving-messages/receive-custom-business-messages", + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "description": "OpenIM Android SDK guide for Receive custom business messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 230, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx", + "status": "draft", + "sourceIndex": 2823, + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx", "navOrder": 230 }, { - "id": 235, - "path": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "relativePath": "sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "sourcePath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel an in-progress file upload. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1454, + "path": "/sdk/android/message/retrieving-messages/load-older-messages", + "relativePath": "sdk/android/message/retrieving-messages/load-older-messages", + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load message history", + "description": "OpenIM Android SDK guide for Load message history.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 231, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload.mdx", + "status": "draft", + "sourceIndex": 2824, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx", "navOrder": 231 }, { - "id": 236, - "path": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "relativePath": "sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "sourcePath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a critical alert message to iOS device users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1455, + "path": "/sdk/android/message/retrieving-messages/load-newer-messages", + "relativePath": "sdk/android/message/retrieving-messages/load-newer-messages", + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load message history in reverse", + "description": "OpenIM Android SDK guide for Load message history in reverse.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 232, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx", + "status": "draft", + "sourceIndex": 2825, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx", "navOrder": 232 }, { - "id": 237, - "path": "/sdk/android/message/sending-a-message/send-a-message", - "relativePath": "sdk/android/message/sending-a-message/send-a-message", - "sourcePath": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1456, + "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "relativePath": "sdk/android/message/retrieving-messages/find-messages-by-id", + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "description": "OpenIM Android SDK guide for Find messages by ID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 233, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-message.mdx", + "status": "draft", + "sourceIndex": 2826, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx", "navOrder": 233 }, { - "id": 238, - "path": "/sdk/android/message/sending-a-message/send-an-admin-message", - "relativePath": "sdk/android/message/sending-a-message/send-an-admin-message", - "sourcePath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send an admin message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1457, + "path": "/sdk/android/message/searching-messages/search-messages", + "relativePath": "sdk/android/message/searching-messages/search-messages", + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "description": "OpenIM Android SDK guide for Search messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 234, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-an-admin-message.mdx", + "status": "draft", + "sourceIndex": 2827, + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx", "navOrder": 234 }, { - "id": 239, - "path": "/sdk/android/message/sending-a-message/spam-flood-protection", - "relativePath": "sdk/android/message/sending-a-message/spam-flood-protection", - "sourcePath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Spam flood protection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1458, + "path": "/sdk/android/message/composing-messages/update-typing-status", + "relativePath": "sdk/android/message/composing-messages/update-typing-status", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Report typing status", + "description": "OpenIM Android SDK guide for Report typing status.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 235, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/spam-flood-protection.mdx", + "status": "draft", + "sourceIndex": 2828, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", "navOrder": 235 }, { - "id": 240, - "path": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "relativePath": "sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "sourcePath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Track file upload progress using a handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1459, + "path": "/sdk/android/message/managing-messages/delete-local-message", + "relativePath": "sdk/android/message/managing-messages/delete-local-message", + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "description": "OpenIM Android SDK guide for Delete a local message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 236, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler.mdx", + "status": "draft", + "sourceIndex": 2829, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx", "navOrder": 236 }, { - "id": 241, - "path": "/sdk/android/message/translating-messages/translation-engine", - "relativePath": "sdk/android/message/translating-messages/translation-engine", - "sourcePath": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translation engine. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1460, + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "relativePath": "sdk/android/message/managing-messages/delete-saved-messages", + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "description": "OpenIM Android SDK guide for Delete messages in a batch.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 237, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translation-engine.mdx", + "status": "draft", + "sourceIndex": 2830, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx", "navOrder": 237 }, { - "id": 242, - "path": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "relativePath": "sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "sourcePath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List replies in a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1461, + "path": "/sdk/android/message/managing-messages/revoke-a-message", + "relativePath": "sdk/android/message/managing-messages/revoke-a-message", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "description": "OpenIM Android SDK guide for Revoke a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 238, - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/list-replies-in-a-message-thread.mdx", + "status": "draft", + "sourceIndex": 2831, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", "navOrder": 238 }, { - "id": 243, - "path": "/sdk/android/migrating-to-openim", - "relativePath": "sdk/android/migrating-to-openim", - "sourcePath": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migrating to OpenIM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1462, + "path": "/sdk/android/message/managing-messages/modify-a-message", + "relativePath": "sdk/android/message/managing-messages/modify-a-message", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "description": "OpenIM Android SDK guide for Modify a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 239, - "contentFile": "content/docs/chat/sdk/android/migrating-to-openim.mdx", + "status": "draft", + "sourceIndex": 2832, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx", "navOrder": 239 }, { - "id": 244, - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification content templates. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1463, + "path": "/sdk/android/message/managing-messages/get-pinned-messages", + "relativePath": "sdk/android/message/managing-messages/get-pinned-messages", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "Get pinned messages in a conversation", + "description": "OpenIM Android SDK guide for Get pinned messages in a conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 240, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates.mdx", + "status": "draft", + "sourceIndex": 2833, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx", "navOrder": 240 }, { - "id": 245, - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification tester. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1464, + "path": "/sdk/android/message/managing-messages/set-message-pinned", + "relativePath": "sdk/android/message/managing-messages/set-message-pinned", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "description": "OpenIM Android SDK guide for Pin or unpin a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 241, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-tester.mdx", + "status": "draft", + "sourceIndex": 2834, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx", "navOrder": 241 }, { - "id": 246, - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1465, + "path": "/sdk/android/message/managing-messages/insert-local-single-message", + "relativePath": "sdk/android/message/managing-messages/insert-local-single-message", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local one-to-one message", + "description": "OpenIM Android SDK guide for Insert a local one-to-one message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 242, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx", + "status": "draft", + "sourceIndex": 2835, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx", "navOrder": 242 }, { - "id": 247, - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1466, + "path": "/sdk/android/message/managing-messages/insert-local-group-message", + "relativePath": "sdk/android/message/managing-messages/insert-local-group-message", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "description": "OpenIM Android SDK guide for Insert a local group message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 243, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx", + "status": "draft", + "sourceIndex": 2836, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx", "navOrder": 243 }, { - "id": 248, - "path": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "relativePath": "sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "sourcePath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark push notifications as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1467, + "path": "/sdk/android/message/managing-messages/clear-all-local-messages", + "relativePath": "sdk/android/message/managing-messages/clear-all-local-messages", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "description": "OpenIM Android SDK guide for Clear all local messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 244, - "contentFile": "content/docs/chat/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx", + "status": "draft", + "sourceIndex": 2837, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx", "navOrder": 244 }, { - "id": 249, - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "relativePath": "sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1468, + "path": "/sdk/android/message/managing-messages/clear-all-messages", + "relativePath": "sdk/android/message/managing-messages/clear-all-messages", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear local and server messages", + "description": "OpenIM Android SDK guide for Clear local and server messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 245, - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx", + "status": "draft", + "sourceIndex": 2838, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx", "navOrder": 245 }, { - "id": 250, - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "relativePath": "sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1469, + "path": "/sdk/android/message/managing-messages/set-message-local-ex", + "relativePath": "sdk/android/message/managing-messages/set-message-local-ex", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set a local message extension", + "description": "OpenIM Android SDK guide for Set a local message extension.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 246, - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx", + "status": "draft", + "sourceIndex": 2839, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx", "navOrder": 246 }, { - "id": 251, - "path": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "relativePath": "sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "sourcePath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Report a message, user, or channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1470, + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "relativePath": "sdk/android/file-uploads/track-file-upload-progress", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "description": "OpenIM Android SDK guide for Track file upload progress.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 247, - "contentFile": "content/docs/chat/sdk/android/report/creating-a-report/report-a-message-user-or-channel.mdx", + "status": "draft", + "sourceIndex": 2840, + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx", "navOrder": 247 }, { - "id": 252, - "path": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "relativePath": "sdk/android/user/managing-user-metadata/manage-user-metadata", - "sourcePath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage user metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1471, + "path": "/sdk/android/file-uploads/upload-file", + "relativePath": "sdk/android/file-uploads/upload-file", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "description": "OpenIM Android SDK guide for Upload a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 248, - "contentFile": "content/docs/chat/sdk/android/user/managing-user-metadata/manage-user-metadata.mdx", + "status": "draft", + "sourceIndex": 2841, + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", "navOrder": 248 }, { - "id": 253, - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "relativePath": "sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of blocked users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1472, + "path": "/sdk/android/calling/overview-calling", + "relativePath": "sdk/android/calling/overview-calling", + "sourcePath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "description": "OpenIM Android SDK guide for Audio and video calling overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 250, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx", + "status": "draft", + "sourceIndex": 2842, + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", + "navOrder": 249 + }, + { + "id": 1473, + "path": "/sdk/android/calling/managing-calls/start-single-call", + "relativePath": "sdk/android/calling/managing-calls/start-single-call", + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "description": "OpenIM Android SDK guide for Start a one-to-one call.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2843, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", "navOrder": 250 }, { - "id": 254, - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "relativePath": "sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of muted users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1474, + "path": "/sdk/android/calling/managing-calls/start-group-call", + "relativePath": "sdk/android/calling/managing-calls/start-group-call", + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "description": "OpenIM Android SDK guide for Start a group call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 251, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx", + "status": "draft", + "sourceIndex": 2844, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", "navOrder": 251 }, { - "id": 255, - "path": "/sdk/android/user/overview-user", - "relativePath": "sdk/android/user/overview-user", - "sourcePath": "/sdk/android/user/overview-user", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1475, + "path": "/sdk/android/calling/managing-calls/accept-call", + "relativePath": "sdk/android/calling/managing-calls/accept-call", + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "description": "OpenIM Android SDK guide for Accept a call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 252, - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", + "status": "draft", + "sourceIndex": 2845, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", "navOrder": 252 }, { - "id": 256, - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "relativePath": "sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the latest information on participants. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1476, + "path": "/sdk/android/calling/managing-calls/reject-call", + "relativePath": "sdk/android/calling/managing-calls/reject-call", + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "description": "OpenIM Android SDK guide for Reject a call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 253, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx", + "status": "draft", + "sourceIndex": 2846, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", "navOrder": 253 }, { - "id": 257, - "path": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "relativePath": "sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update user profile. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1477, + "path": "/sdk/android/calling/managing-calls/cancel-call", + "relativePath": "sdk/android/calling/managing-calls/cancel-call", + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "description": "OpenIM Android SDK guide for Cancel a call invitation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 254, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/update-user-profile.mdx", + "status": "draft", + "sourceIndex": 2847, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", "navOrder": 254 }, { - "id": 258, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of members and operators in a specific order. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1478, + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "relativePath": "sdk/android/calling/managing-calls/hang-up-call", + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "End a call", + "description": "OpenIM Android SDK guide for End a call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 255, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order.mdx", + "status": "draft", + "sourceIndex": 2848, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", "navOrder": 255 }, { - "id": 259, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1479, + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "relativePath": "sdk/android/calling/managing-calls/handle-call-events", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "description": "OpenIM Android SDK guide for Handle call events.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 256, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-operators.mdx", + "status": "draft", + "sourceIndex": 2849, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", "navOrder": 256 }, { - "id": 260, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1480, + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "relativePath": "sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending call invitation", + "description": "OpenIM Android SDK guide for Restore a pending call invitation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 257, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx", + "status": "draft", + "sourceIndex": 2850, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", "navOrder": 257 }, { - "id": 261, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in an application. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1481, + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "relativePath": "sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "description": "OpenIM Android SDK guide for Get a group call room.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 258, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx", + "status": "draft", + "sourceIndex": 2851, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", "navOrder": 258 }, { - "id": 262, - "path": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "relativePath": "sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "sourcePath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1482, + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "relativePath": "sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get a call room token", + "description": "OpenIM Android SDK guide for Get a call room token.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 259, - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.mdx", + "status": "draft", + "sourceIndex": 2852, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", "navOrder": 259 }, + { + "id": 1483, + "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "relativePath": "sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "description": "OpenIM Android SDK guide for Send a custom signal.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2853, + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", + "navOrder": 260 + }, + { + "id": 1484, + "path": "/sdk/android/events/overview-events", + "relativePath": "sdk/android/events/overview-events", + "sourcePath": "/sdk/android/events/overview-events", + "title": "Events overview", + "description": "OpenIM Android SDK guide for Events overview.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2854, + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", + "navOrder": 261 + }, + { + "id": 1485, + "path": "/sdk/android/logger", + "relativePath": "sdk/android/logger", + "sourcePath": "/sdk/android/logger", + "title": "Logger", + "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "scaffold", + "sourceIndex": 2855, + "contentFile": "content/docs/chat/sdk/android/logger.mdx", + "navOrder": 262 + }, { "id": 864, "path": "/sdk/flutter/overview", diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index f34575b80c..49677848ed 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1896,1028 +1896,1076 @@ "content": "OpenIM iOS SDK 的日志用于定位初始化、连接和业务 API 调用问题。开发环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 token、消息正文、文件 URL 和用户隐私字段。 初始化日志配置 日志选项属于 OIMInitConfig ,必须在 initSDKWithConfig:... 前设置: OIMInitConfig config = OIMInitConfig new ; config.platform = iPhone; config.apiAddr = apiAddress; config.wsAddr = websocketAddress; config.dataDir = dataDirectory; config.logLevel = 4; config.isLogStandardOutput = YES; config.logFilePath = logDirectory; config.systemType = @\"ios\"; 参数说明 | 字段 | 类型 | 说明 | | | | | | logLevel | NSInteger | SDK 日志级别;默认值为 6 ,实际级别约定以当前 SDK 版本为准。 | | isLogStandardOutput | BOOL | 是否输出 SDK 标准日志。 | | logFilePath | NSString | 可选的日志文件目录。 | | systemType | NSString | 日志中的系统类型标识。 | 生产环境不要长期启用最详细日志。日志目录应位于应用可写范围,并纳入容量、保留期和隐私策略。 写入应用诊断日志 需要把应用业务上下文写入 SDK 日志时,可调用: OIMManager manager logs: NSString stringWithUTF8String: FILE .lastPathComponent line: LINE msgs:@\"send message failed\" err:errorMessage keyAndValues:@ @\"conversationID\", conversationID, @\"clientMsgID\", clientMsgID logLevel:2 ; keyAndValues 应只包含排查所需的非敏感标识。不要写入访问 token、完整消息内容或原始文件地址。 使用 operationID 定位调用 Objective C 公共业务 selector 不要求应用传入 operationID 。SDK 会为调用链生成标识;需要在应用诊断中取得新的链路 ID 时,可调用: NSString operationID = OIMManager manager operationId ; operationID 只用于日志关联,不是用户身份、权限凭据、业务幂等键、 conversationID 或 clientMsgID 。每条独立调用链使用新的值;多步骤业务流程另用应用自己的 trace ID 串联。 上传日志 用户明确同意提交诊断信息后,可以上传 SDK 日志: OIMManager manager uploadLogsWithProgress:^ NSInteger saveBytes, NSInteger currentBytes, NSInteger totalBytes self updateLogUploadCurrentBytes:currentBytes totalBytes:totalBytes ; line:2000 ex:@\"support ticket 42\" onSuccess:^ NSString Nullable data self showLogUploadCompleted ; onFailure:^ NSInteger code, NSString message self showLogUploadError:code message:message ; ; 上传进度 callback 依次提供已保存、当前处理和总字节数。上传前应说明收集范围,并遵守产品的隐私、用户同意和资料保留规范。" }, { - "path": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Freeze and unfreeze a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/overview", + "title": "OpenIM Android SDK 概览", + "description": "在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel moderating-a-channel freeze-and-unfreeze-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android overview", + "content": "OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。 文档导航 | 领域 | 内容 | | | | | 快速开始 /sdk/android/getting started/environment specific implementation | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 | | 用户与关系链 /sdk/android/user/overview user | 用户资料、在线状态、好友、好友申请和黑名单。 | | 会话 /sdk/android/conversation/overview conversation | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 | | 群组 /sdk/android/group/overview group | 群资料、群成员、入群申请、权限、禁言和群组事件。 | | 消息 /sdk/android/message/overview message | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 | | 文件上传 /sdk/android/file uploads/upload file | 独立文件上传和上传进度。 | | 音视频通话 /sdk/android/calling/overview calling | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 | | 事件 /sdk/android/events/overview events | 各 manager 的 listener、连接状态和数据事件。 | | 日志 /sdk/android/logger | SDK 日志配置和排查。 |" }, { - "path": "/sdk/android/channel/overview-channel", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/before-you-start", + "title": "开始之前", + "description": "准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel overview-channel", - "content": "" + "keywords": "sdk android v4 sdk android getting-started before-you-start", + "content": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 和 发送第一条消息 /sdk/android/getting started/send first message 。 准备 OpenIMServer 如果还没有可用的 OpenIMServer,先按 Docker 部署指南 /docs/guides/quick deployment/docker 完成部署,并确认 Android 真机和模拟器均可访问以下地址: | 字段 | 说明 | | | | | apiAddr | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | | wsAddr | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | 不要只在开发电脑上验证地址。Android 模拟器中的 localhost 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: adb reverse tcp:10002 tcp:10002 adb reverse tcp:10001 tcp:10001 映射后,模拟器中的应用可以使用 http://127.0.0.1:10002 作为 apiAddr ,使用 ws://127.0.0.1:10001 作为 wsAddr 。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 adb 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 准备用户和 Token userID 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 后端接入 OpenIMServer REST API 前,可阅读 准备使用 Platform API /platform api/prepare to use api 和 签发会话 Token /platform api/user/managing session tokens/issue a session token 。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: | 数据 | 说明 | | | | | userID | 当前登录用户的 OpenIM 用户 ID。 | | token | 与该用户对应的登录 Token。 | | apiAddr | OpenIMServer HTTP API 地址。 | | wsAddr | OpenIMServer WebSocket 地址。 | userID 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 准备 Android 工程 接入前,确认 Android 工程具备以下条件: 应用的 minSdk 不低于 21 ,使用 Java 8 编译选项,并将 compileSdk 设置为 36 或更高。 应用 Manifest 声明 android.permission.INTERNET ,并允许 SDK 读取网络状态。 已准备应用私有且可持久化的数据目录,例如 Application.getFilesDir 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 真机能够访问 apiAddr 、 wsAddr 以及消息媒体资源域名。 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 具体依赖和 Manifest 配置见 按 Android 环境接入 /sdk/android/getting started/environment specific implementation ;SDK 初始化和认证流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 继续接入 准备完成后,先完成 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。确认登录 callback 成功且 OnConnListener.onConnectSuccess 已到达,再按照 发送第一条消息 /sdk/android/getting started/send first message 验证消息链路。" + }, + { + "path": "/sdk/android/getting-started/environment-specific-implementation", + "title": "按 Android 环境接入", + "description": "在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android getting-started environment-specific-implementation", + "content": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 添加 SDK 依赖 在应用 module 的 build.gradle 中添加依赖: dependencies implementation 'io.openim:android sdk:latest@aar' implementation 'io.openim:core sdk:latest@aar' implementation 'com.google.code.gson:gson:2.9.0' 配置 Manifest 应用需要网络访问权限: 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送第一条消息 /sdk/android/getting started/send first message" + }, + { + "path": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "认证与管理登录会话", + "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android getting-started authenticate-and-manage-session", + "content": "OpenIM Android SDK 使用 initSDK 初始化本机运行环境,再使用 login 建立当前用户的登录会话。开始认证前,应先完成 开始之前 /sdk/android/getting started/before you start 列出的服务、用户和 Token 准备,并按 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 添加依赖和权限。 完整流程如下: 1. 在应用级会话组件中创建稳定的 OnConnListener 。 2. 调用 initSDK 并确认返回 true 。 3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 4. 从可信后端取得对应的 userID 与 Token,然后调用 login 。 5. 分别等待登录 callback 成功与 onConnectSuccess ,再开放依赖连接的业务操作。 6. 主动退出或切换账号时调用 logout ,完成后清理当前账号的应用状态。 下文中的 apiAddr 、 wsAddr 、 userID 和 token 均由可信后端提供。 初始化并处理连接生命周期 在 Application 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting sessionState.setConnectionState \"connecting\" ; @Override public void onConnectSuccess sessionState.setConnectionState \"connected\" ; sessionState.enableConnectedOperations ; @Override public void onConnectFailed long code, String error sessionState.setConnectionState \"failed\" ; recordConnectionFailure code, error ; @Override public void onKickedOffline sessionState.clearCurrentAccount ; showSignedInElsewhereScreen ; @Override public void onUserTokenExpired requestNewTokenAndRelogin ; @Override public void onUserTokenInvalid String reason sessionState.clearCurrentAccount ; showSignInScreen reason ; ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; initSDK 返回 true 表示 SDK 本地运行环境初始化成功。 OnConnListener 的连接 callback 在调用 login 后开始反映长连接状态。 | 字段 | 类型 | 说明 | | | | | | application | Application | 应用级 Context,用于持有 SDK 生命周期。 | | apiAddr | String | OpenIMServer HTTP API 地址。 | | wsAddr | String | OpenIMServer WebSocket 地址。 | | dataDirectory | File | SDK 数据库和日志使用的应用私有持久化目录。 | | config.logLevel | int | 使用 LogLevel 常量;正式环境应主动收敛日志级别。 | | isLogStandardOutput | boolean | 是否把 SDK Core 日志输出到标准日志流。 | SDK 只应在 Application 或应用级会话组件中初始化一次。当前 Java wrapper 公开 networkChanged ,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 在登录前设置业务 listener SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见 发送第一条消息 /sdk/android/getting started/send first message ;用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 登录当前用户 OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error sessionState.setLoginState \"failed\" ; recordLoginFailure code, error ; @Override public void onSuccess String data sessionState.setLoginState \"logged\" ; sessionState.setCurrentUserID userID ; , userID, token ; login 的成功 callback 表示当前登录调用完成; OnConnListener.onConnectSuccess 表示长连接可用。这两个阶段必须分别处理。不要并发调用 login ,也不要仅凭某一个 callback 同时推断登录与连接状态。 查询登录状态 int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; restoreSessionFor currentUserID ; | 状态 | 说明 | | | | | LoginStatus.Logout | SDK 当前未登录。 | | LoginStatus.Logging | 登录正在进行,不应再次发起并行登录。 | | LoginStatus.Logged | SDK 已登录;网络是否连接仍以 OnConnListener 为准。 | getLoginStatus 和 getLoginUserID 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 处理 Token 和强制下线 收到 onUserTokenExpired 或 onUserTokenInvalid 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 onKickedOffline 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 这些 callback 没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 主动退出与释放 SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error recordLogoutFailure code, error ; @Override public void onSuccess String data sessionState.clearCurrentAccount ; ; logout 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 login 。 应用最终不再使用 SDK 时可以调用: OpenIMClient.getInstance .unInit ; unInit 用于释放 SDK 运行环境,不是 logout 的替代品,也不应在普通页面销毁时调用。 下一步 开始之前 /sdk/android/getting started/before you start 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 发送第一条消息 /sdk/android/getting started/send first message" }, { "path": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "发送第一条消息", + "description": "在 Android 应用中发送并验证第一条单聊文本消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "" + "content": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化和登录。 开始前准备 为发送方和接收方各准备一个测试账号。 两个账号都需要按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 将示例中的 user b 替换为接收方的真实 userID 。 第 1 步:让接收方监听新消息 接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // 将 message 显示在聊天界面中。 ; 第 2 步:确认可以发送 两个账号登录后,发送方的登录 callback 成功且 OnConnListener.onConnectSuccess 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 login 。 第 3 步:发送文本消息 发送单聊文本消息 先创建消息,再发送它。第三个目标参数填写接收方 userID ,群组目标参数保持空字符串。 Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"你好,OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // 文本消息通常不需要处理进度。 @Override public void onError int code, String error // 提示发送失败,并允许用户重试。 @Override public void onSuccess Message sentMessage // 将 sentMessage 更新到发送方的聊天界面。 ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 onSuccess 表示发送方已成功发送消息;接收方的 onRecvNewMessage 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 发送群聊文本消息 发送群消息时,将接收方 userID 改为空字符串,并填写群组的 groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"大家好,OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; 一次调用只能填写 userID 或 groupID 其中之一。 验证成功 发送方进入 onSuccess 。 接收方进入 onRecvNewMessage ,并看到文本消息。 单聊只填写接收方 userID ;群聊只填写 groupID 。 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session OpenIM Android SDK 概览 /sdk/android/overview" }, { - "path": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add extra data to a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/overview-user", + "title": "用户概览", + "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message adding-extra-data-to-a-message add-extra-data-to-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user overview-user", + "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅和读取在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" }, { - "path": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Generate thumbnails of a file message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-users-info", + "title": "获取指定用户资料", + "description": "使用 getUsersInfo() 按 userID 批量查询用户公开资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message generate-thumbnails-of-a-file-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-users-info", + "content": "getUsersInfo 根据 userID 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users for PublicUserInfo user : users publicUserStore.put user.getUserID , user ; @Override public void onError int code, String error recordUserQueryFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 List ,主要字段包括 userID 、 nickname 、 faceURL 、 ex 和 createTime 。查询不会触发 OnUserListener ,需要刷新资料时应重新调用并按 userID 合并结果。 返回结果 | 字段 | 说明 | | | | | userID | OpenIM 用户 ID,也是本地缓存的稳定 key。 | | nickname | 账号级公开昵称。 | | faceURL | 账号级公开头像地址。 | | ex | 账号级公开扩展字符串,格式由业务约定。 | | createTime | 用户资料创建时间。 | PublicUserInfo 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 FriendInfo ,展示群成员时应使用群成员模型。 按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 userID 交给客户端查询公开资料。 资料刷新 查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。 OnUserListener.onSelfInfoUpdated 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。" }, { - "path": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for React to a message in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "获取当前用户资料", + "description": "使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message react-to-a-message-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-self-local-user-info", + "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user currentUserStore.set user ; @Override public void onError int code, String error recordSelfProfileFailure code, error ; ; 完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 LocalUser ,包含 userID 、 nickname 、 faceURL 、 ex 、 attachedInfo 、 globalRecvMsgOpt 和 addFriendPermission 等字段。 返回结果 | 字段 | 说明 | | | | | userID | 当前登录用户 ID。 | | nickname | 当前账号昵称。 | | faceURL | 当前账号头像地址。 | | ex | 当前账号扩展字符串。 | | attachedInfo | SDK 附加信息,只按业务约定解析。 | | globalRecvMsgOpt | 全局消息接收方式: 0 正常接收, 1 不接收, 2 接收但不提示。 | | addFriendPermission | 添加好友权限值,具体含义由服务端契约定义。 | 查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 getSelfUserInfo 已废弃,不作为推荐用法。" }, { - "path": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send typing indicators to other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-self-info", + "title": "更新当前用户资料", + "description": "使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message send-typing-indicators-to-other-members", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-self-info", + "content": "使用 UserInfoReq 只设置实际需要修改的字段。SDK 序列化请求时会忽略 null 字段。 UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx mergedExtra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markProfileUpdateSubmitted ; @Override public void onError int code, String error recordProfileUpdateFailure code, error ; , request ; UserInfoReq 支持 nickname 、 faceURL 、 ex 和 addFriendPermission 等字段。 ex 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 成功 callback 表示更新请求完成;当前账号资料的最终增量通过 onSelfInfoUpdated UserInfo info 到达,或重新调用 getSelfLocalUserInfo 校准。 更新字段 | 字段 | 说明 | | | | | nickname | 要更新的昵称。 | | faceURL | 要更新的头像地址。 | | ex | 完整扩展字符串。 | | addFriendPermission | 添加好友权限值。 | 一次请求只写入需要变更的字段。全局消息接收策略虽然也由 setSelfInfo 写入,但应使用独立入口,见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。 onSelfInfoUpdated 由本页归属,应组合进应用唯一的 OnUserListener : @Override public void onSelfInfoUpdated UserInfo info currentUserStore.merge info.getUserID , info ; 账号级消息接收策略也通过 UserInfoReq 更新,但应使用独立入口,见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。" }, { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Pin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "设置全局消息接收方式", + "description": "通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels pin-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", + "content": "使用独立的 UserInfoReq 写入 globalRecvMsgOpt ,避免在更新昵称或头像时意外覆盖账号级消息策略。 UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markGlobalReceiveOptionSubmitted ; @Override public void onError int code, String error recordGlobalReceiveOptionFailure code, error ; , request ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 屏蔽消息。 | | 2 | 接收消息但不提示。 | 如果产品只提供“全局免打扰”开关,通常在 0 和 2 之间切换; 1 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 成功 callback 表示请求完成。最终账号快照通过 onSelfInfoUpdated 或 getSelfLocalUserInfo 校准,事件处理见 更新当前用户资料 /sdk/android/user/user profile/set self info 。" }, { - "path": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "订阅用户在线状态", + "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls create-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "查询已订阅用户状态", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel create-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", + "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; 该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 List 状态快照,适合在重连或重新进入页面时按 userID 校准状态。 查询本身不会触发 onUserStatusChanged 。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。" }, { - "path": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friend-list-page", + "title": "分页获取好友列表", + "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-delivered-in-a-group-channel mark-messages-as-delivered", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friend-list-page", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendListFailure code, error ; , 0, 40, true ; 参数依次为 offset 、 count 和 filterBlack 。 offset 从 0 开始, count 是页大小, filterBlack 为 true 时过滤黑名单用户。成功 callback 返回当前页 List ,好友关系详情可通过 getFriendInfo 读取。继续加载下一页时按实际请求数量增加 offset ;返回数量小于 count 时通常表示到达末页。 只使用分页 API,不使用非分页的 getFriendList 。快照和增量都应按 userID 合并。 好友资料字段 UserInfo 是 Android wrapper 的组合对象。好友列表中的 getFriendInfo 返回 FriendInfo ,常用字段如下: | 字段 | 说明 | | | | | userID | 好友用户 ID,也是好友列表的稳定标识。 | | nickname | 好友账号昵称。 | | faceURL | 好友账号头像地址。 | | remark | 当前账号设置的好友备注。 | | ex | 好友关系扩展字符串。 | | addSource | 好友关系添加来源。 | | operatorUserID | 建立或更新关系的操作用户 ID。 | | createTime | 好友关系创建时间。 | nickname 和 faceURL 是账号资料, remark 和 ex 属于好友关系。 UpdateFriendsReq 支持提交 isPinned ,但当前 Android FriendInfo 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 PublicUserInfo ,也不要把好友备注写回账号昵称。 本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendInfoChanged FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendDeleted FriendInfo friend friendStore.remove friend.getUserID ;" }, { - "path": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mention other users in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/search-friends", + "title": "搜索好友", + "description": "使用 searchFriends() 搜索当前用户的好友。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message mentioning-other-users-in-a-message mention-other-users-in-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user friends search-friends", + "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results showFriendSearchResults results ; @Override public void onError int code, String error recordFriendSearchFailure code, error ; , Collections.singletonList keyword.trim , true, true, true ; keywordList 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 true ;不支持把多个关键词作为同一请求的独立搜索条件。 成功 callback 返回 List 。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。" }, { - "path": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friends-info", + "title": "查询指定好友资料", + "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message overview-message", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friends-info", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendInfoFailure code, error ; , Arrays.asList \"user a\", \"user b\" , true ; 第二个参数是目标用户 ID 列表, filterBlack 决定是否过滤黑名单用户。成功 callback 返回 List ;通过 getFriendInfo 读取好友备注和关系字段,并按 userID 合并。调用前应去除空值和重复 ID。 当目标用户不是好友,或目标用户因 filterBlack == true 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用 获取指定用户资料 /sdk/android/user/user profile/get users info ,并按 userID 合并两类数据。 该查询不会触发好友 listener。只需要判断好友关系时使用 checkFriend /sdk/android/user/friends/check friend 。" }, { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/check-friend", + "title": "检查好友关系", + "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user friends check-friend", + "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations showFriendshipStates relations ; @Override public void onError int code, String error recordFriendshipCheckFailure code, error ; , Arrays.asList \"user a\", \"user b\" ; 成功 callback 返回 List 。每项的 userID 标识目标用户, result == 1 表示目标是好友且不在黑名单中。 result 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 getFriendsInfo /sdk/android/user/friends/get friends info 。" }, { - "path": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search messages by a keyword. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/update-friends", + "title": "更新好友资料", + "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message searching-messages-in-a-group-channel search-messages-by-a-keyword", - "content": "" + "keywords": "sdk android v4 sdk android user friends update-friends", + "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data markFriendUpdateSubmitted ; @Override public void onError int code, String error recordFriendUpdateFailure code, error ; , request ; UpdateFriendsReq 可设置 friendUserIDs 、 remark 、 isPinned 和 ex 。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。 ex 是完整字符串。 | 字段 | 说明 | | | | | friendUserIDs | 待更新的好友 ID 数组。 | | remark | 当前账号设置的好友备注。 | | isPinned | 是否置顶好友。 | | ex | 好友关系扩展字符串,按完整值覆盖。 | 成功 callback 表示更新请求完成。好友资料增量通过 onFriendInfoChanged 合并,事件处理见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { - "path": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Share an encrypted file. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/delete-friend", + "title": "删除好友", + "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message share-an-encrypted-file", - "content": "" + "keywords": "sdk android v4 sdk android user friends delete-friend", + "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data markFriendDeletionSubmitted friendUserID ; @Override public void onError int code, String error recordFriendDeletionFailure code, error ; , friendUserID ; 成功 callback 表示删除请求完成。 onFriendDeleted 到达后再按 userID 从好友状态中移除记录,事件处理见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { - "path": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Smart throttling. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/add-friend", + "title": "发送好友申请", + "description": "使用 addFriend() 向指定用户发送好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message smart-throttling", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications add-friend", + "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data markFriendApplicationSubmitted ; @Override public void onError int code, String error recordFriendApplicationFailure code, error ; , \"user b\", \"你好,我是 Alex\" ; 第二个参数是申请接收方的 userID ,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 好友申请状态变化通过 OnFriendshipListener 合并,见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。" }, { - "path": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Auto-translate messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "获取收到的好友申请", + "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages auto-translate-messages", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-recv-friend-application-list", + "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications replaceReceivedApplications applications ; @Override public void onError int code, String error recordReceivedApplicationFailure code, error ; , request ; offset 从 0 开始, count 是页大小。需要筛选处理状态时可通过 setHandleResults int 设置服务端约定的状态值。成功 callback 返回当前页 List 。 | 字段 | 说明 | | | | | fromUserID / fromNickname / fromFaceURL | 申请发起人的 ID、昵称和头像快照。 | | toUserID / toNickname / toFaceURL | 申请接收人的 ID、昵称和头像快照。 | | reqMsg | 申请附言。 | | handleResult | 处理结果: 0 待处理, 1 已同意, 2 已拒绝。 | | handlerUserID | 执行处理的用户 ID,待处理时可能为空。 | | handleMsg | 处理附言。 | | handleTime | 处理时间,待处理时不应作为有效时间使用。 | | createTime | 申请记录创建时间。 | | ex | 申请记录扩展字符串。 | 好友申请使用 fromUserID:toUserID 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationAccepted FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationRejected FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationDeleted FriendApplicationInfo application friendApplicationStore.remove application.getFromUserID , application.getToUserID ; 按 toUserID 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由 分页获取好友列表 /sdk/android/user/friends/get friend list page 归属的 onFriendAdded 合并。" }, { - "path": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translate messages on-demand. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "获取发出的好友申请", + "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translate-messages-on-demand", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-send-friend-application-list", + "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications replaceSentApplications applications ; @Override public void onError int code, String error recordSentApplicationFailure code, error ; , request ; offset 从 0 开始, count 是页大小。成功 callback 返回当前页 List ;按 fromUserID:toUserID 合并。查询只建立快照,不触发好友申请事件。 发出的申请中,当前用户通常是 fromUserID 。列表字段和处理结果含义与 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 相同;申请处理状态使用 Android 服务端约定的 0 (待处理)、 1 (已同意)和 2 (已拒绝)。" }, { - "path": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "接受好友申请", + "description": "使用 acceptFriendApplication() 接受好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading create-a-message-thread", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications accept-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data markApplicationAccepted applicantUserID ; @Override public void onError int code, String error recordApplicationAcceptFailure code, error ; , applicantUserID, \"已通过\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 onFriendApplicationAccepted 更新,新好友关系由 onFriendAdded 更新。" }, { - "path": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "拒绝好友申请", + "description": "使用 refuseFriendApplication() 拒绝好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android overview", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications refuse-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data markApplicationRejected applicantUserID ; @Override public void onError int code, String error recordApplicationRejectFailure code, error ; , applicantUserID, \"暂不添加\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 handleResult == 2 表示已拒绝。" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Configure push notification preferences. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/get-blacklist", + "title": "获取黑名单列表", + "description": "使用 getBlacklist() 获取当前用户的黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications configure-push-notification-preferences", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist get-blacklist", + "content": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 获取黑名单 完成 SDK 初始化并登录后,调用 getBlacklist 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users blacklistStore.replace users ; @Override public void onError int code, String error recordBlacklistFailure code, error ; ; 成功 callback 返回 List ;通过 UserInfo.getBlackInfo 读取黑名单关系对象。 黑名单记录字段 BlacklistInfo 的常用字段如下: | 字段 | 说明 | | | | | userID | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | | nickname | 目标用户昵称快照。 | | faceURL | 目标用户头像地址。 | | gender | 目标用户性别值。 | | operatorUserID | 执行拉黑操作的用户 ID。 | | createTime | 黑名单关系创建时间。 | | addSource | 黑名单关系的添加来源。 | | ex | 黑名单关系扩展字符串。 | 如果页面还要展示好友备注或最新公开资料,应按 userID 额外合并 FriendInfo 或 PublicUserInfo ,不能把黑名单字段当作好友资料。 黑名单状态统一按 userID 合并。查询本身不会触发黑名单新增或删除事件。 首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由 拉黑用户 /sdk/android/user/blacklist/add blacklist 和 取消拉黑用户 /sdk/android/user/blacklist/remove blacklist 页面归属的 listener 处理。" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification translation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/add-blacklist", + "title": "拉黑用户", + "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-translation", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist add-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data markBlacklistRequestSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistAddFailure code, error ; , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; 第二个参数是目标 userID ,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 ex 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。 ex 是完整字符串,更新前应合并业务自己的扩展字段。 onBlacklistAdded 由本页归属,应组合进应用唯一的 OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user blacklistStore.put user.getUserID , user ;" }, { - "path": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/remove-blacklist", + "title": "取消拉黑用户", + "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications overview-push-notifications", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data markBlacklistRemovalSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistRemovalFailure code, error ; , targetUserID ; 成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 onBlacklistDeleted 到达后按 userID 删除;如果事件丢失,可重新调用 获取黑名单列表 /sdk/android/user/blacklist/get blacklist 校准。 onBlacklistDeleted 由本页归属,应按 userID 删除本地记录: @Override public void onBlacklistDeleted BlacklistInfo user blacklistStore.remove user.getUserID ;" }, { - "path": "/sdk/android/report/overview-report", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/overview-conversation", + "title": "会话概览", + "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report overview-report", - "content": "" + "keywords": "sdk android v4 sdk android conversation overview-conversation", + "content": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 ConversationInfo 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。 conversationID 用于定位当前账号的会话状态;单聊目标使用对方 userID ,群聊目标使用 groupID 。 群资料、成员关系和群权限属于群组能力。群聊页面使用 groupID 调用群组 API,使用 conversationID 处理会话设置、未读数、草稿和消息清理。 会话标识 | 标识 | 用途 | | | | | conversationID | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | | userID | 单聊对方的用户 ID。 | | groupID | 群聊对应的群组 ID,也是群组 API 的目标标识。 | | sourceId | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 userID ,群聊为 groupID 。 | 单聊使用 ConversationType.SINGLE CHAT 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT ;不要在应用层自行拼接 conversationID 。 ConversationInfo | 字段 | 说明 | | | | | conversationID | 会话 ID。 | | conversationType | 会话类型。 | | userID / groupID | 单聊目标用户或群聊目标群组。 | | showName / faceURL | 会话列表显示名称和头像。 | | unreadCount | 当前会话未读数。 | | latestMsg / latestMsgSendTime | 最后一条消息 JSON 字符串及发送时间。 | | recvMsgOpt | 当前会话消息接收方式。 | | groupAtType | 群聊 @ 提醒状态。 | | draftText / draftTextTime | 会话草稿及更新时间。 | | isPinned | 是否置顶。 | | isPrivateChat / burnDuration | 阅后即焚开关和保留时长。 | | isMsgDestruct / msgDestructTime | 服务端消息定期删除设置。 | | ex | 业务约定的会话扩展字符串。 | 查询和设置 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 生成会话 ID /sdk/android/conversation/retrieving conversations/get conversation id 按 ID 批量获取会话 /sdk/android/conversation/retrieving conversations/get conversations by id 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 置顶或取消置顶会话 /sdk/android/conversation/managing conversations/pin conversation 设置会话扩展字段 /sdk/android/conversation/managing conversations/set conversation extension 设置会话草稿 /sdk/android/conversation/managing conversations/set conversation draft 设置会话消息接收方式 /sdk/android/conversation/managing conversations/set message receive option 重置群聊 @ 状态 /sdk/android/conversation/managing conversations/clear group mentions 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 定期删除服务端消息 /sdk/android/conversation/managing conversations/set message destruct 状态更新 查询方法建立会话快照,事件负责合并后续增量: 新会话和会话属性变化由 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 归属的 onNewConversation 与 onConversationChanged 处理。 当前账号总未读数由 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 归属的 onTotalUnreadMessageCountChanged 处理。 ConversationManager 只保存一个 OnConversationListener , setOnConversationListener 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。" }, { - "path": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Block and unblock other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "查询指定会话", + "description": "使用 getOneConversation() 按用户或群组获取一个 Android 会话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user block-and-unblock-other-members", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", + "content": "从通讯录、用户资料或群资料进入聊天页时,使用 getOneConversation 。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 ConversationInfo 。 OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , targetUserID, ConversationType.SINGLE CHAT ; 参数 sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 成功 callback 返回 ConversationInfo 。查询本身不触发会话 listener;后续变化由 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 统一按 conversationID 合并。" }, { - "path": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mute and unmute a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "生成会话 ID", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user mute-and-unmute-a-user", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", + "content": "只需要会话 ID 时,调用 getConversationIDBySessionType ,不要在应用层自行拼接。 String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType targetUserID, ConversationType.SINGLE CHAT ; sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 该方法同步返回 String 类型的 conversationID ,不返回完整 ConversationInfo ,也不触发会话 listener。需要会话资料时调用 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 。" }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the online status of a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "按 ID 批量获取会话", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-online-status-of-a-user", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", + "content": "已经持有一组 conversationID 时,使用 getMultipleConversation 读取最新会话快照。 OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; 调用前去除空值和重复 ID。成功 callback 返回 List ;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 查询本身不触发会话 listener。会话列表的持续同步见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve members who have read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "获取会话列表", + "description": "使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-members-who-have-read-a-message", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", + "content": "会话列表属于当前登录用户。每条 ConversationInfo 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 getAllConversationList 。 分页获取会话 OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | 参数 | 类型 | 说明 | | | | | | offset | long | 从 0 开始的分页偏移量;刷新时重置为 0 。 | | count | long | 本页期望返回的会话数量。 | 成功 callback 返回当前页 List 。继续加载时按已经请求的条目数量推进 offset ,并按 conversationID 去重;返回数量小于 count 时通常表示到达末页。主动刷新时清空分页状态后从 0 重载。 保持列表同步 getConversationListSplit 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 OnConversationListener : @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; 两个事件都携带 List ,按 conversationID 幂等合并。 setOnConversationListener 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。" }, { - "path": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Authentication. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "置顶或取消置顶会话", + "description": "使用 pinConversation() 设置 Android 指定会话的置顶状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application authenticating-a-user authentication", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; 最后一个参数为 true 时置顶,传 false 时取消置顶。该状态只影响当前账号的会话列表。 成功 callback 不等于 onConversationChanged 已经到达。后续按 conversationID 合并最新会话,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/application/overview-application", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "设置会话扩展字段", + "description": "使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application overview-application", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", + "content": "ex 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, mergedExtensionJSON ; 成功 callback 表示设置请求完成。通过 onConversationChanged 按 conversationID 合并最新会话;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Rate limits. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "设置会话草稿", + "description": "使用 setConversationDraft() 保存 Android 会话草稿。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application understanding-rate-limits rate-limits", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", + "content": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 setConversationDraft 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; 清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 onConversationChanged 同步 draftText 和 draftTextTime ,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。" }, { - "path": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize channels by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "设置会话消息接收方式", + "description": "使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel categorizing-channels categorize-channels-by-custom-type", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 不接收该会话消息,也不通知。 | | 2 | 接收该会话消息,但不通知。 | 账号级默认策略见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。成功 callback 后通过 onConversationChanged 按 conversationID 合并最新会话。" }, { - "path": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "重置群聊 @ 状态", + "description": "使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel creating-a-channel create-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", + "content": "用户处理完群聊中的 @ 消息后,调用 resetConversationGroupAtType 将 groupAtType 重置为普通状态。 OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; 本操作只负责重置为普通状态,不应用于主动写入 atMe 、 atAll 等状态。群聊 @ 状态与消息已读状态不同。 成功 callback 后通过 onConversationChanged 按 conversationID 合并该会话;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Accept or decline an invitation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "标记会话已读", + "description": "使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel accept-or-decline-an-invitation", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", + "content": "用户打开会话并阅读完当前可见消息后,调用 messageManager.markConversationMessageAsRead 。不要在仅预览通知或后台收到消息时提前标记。 OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; 成功 callback 表示请求完成,不等于 onConversationChanged 已到达。随后按 conversationID 合并最新 ConversationInfo ;需要立即确认时重新查询该会话。 对于单聊,当前用户标记会话已读后,对端可通过 OnAdvanceMsgListener.onRecvC2CReadReceipt 收到已读回执。对每个 C2CReadReceiptInfo 先验证 sessionType == ConversationType.SINGLE CHAT 和非空 userID ,再按 msgIDList 更新对应消息的已读状态。 MessageManager 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。" }, { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Invite users as members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "获取消息总未读数", + "description": "使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel invite-users-as-members", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", + "content": "getTotalUnreadMsgCount 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 unreadCount 简单相加。 OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; 回调值是 String ,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 本页归属 OnConversationListener.onTotalUnreadMessageCountChanged int count 。在应用唯一的 OnConversationListener 中按该值更新应用角标;会话 listener 的集中设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Enter and exit an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "开启或关闭阅后即焚", + "description": "使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel enter-and-exit-an-open-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; 传入 false 关闭阅后即焚。具体保留时长由 burnDuration 单独设置,见 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 。该能力与定期删除服务端消息不同。 成功 callback 只表示设置请求完成;最新状态通过 onConversationChanged 按 conversationID 合并,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Join and leave a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "设置阅后即焚时长", + "description": "使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel join-and-leave-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration 的单位为秒。启用或关闭阅后即焚需要设置 isPrivateChat ,见 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 。不要把它与服务端消息定期删除周期 msgDestructTime 混用。 成功 callback 后,通过 onConversationChanged 合并最新 burnDuration ;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metacounters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "定期删除服务端消息", + "description": "使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metacounters manage-channel-metacounters", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", + "content": "isMsgDestruct 与 msgDestructTime 共同构成服务端消息定期删除设置,可以在一次 ConversationReq 中提交。 ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime 的单位为秒。关闭时只传 request.setMsgDestruct false ;该能力用于定期删除服务端消息,不是阅后即焚。 成功 callback 表示设置请求完成。最新开关和周期通过 onConversationChanged 按 conversationID 合并,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "隐藏会话", + "description": "使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metadata manage-channel-metadata", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", + "content": "hideConversation 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 conversationID 。后续收到 onConversationChanged 时仍应按 conversationID 幂等合并;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "删除会话及消息", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels delete-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", + "content": "产品语义为“删除此聊天”时,调用 deleteConversationAndDeleteAllMsg 。 OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; 成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 后续通过 onConversationChanged 或重新查询校准会话列表,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Hide or archive a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "清空会话消息", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels hide-or-archive-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", + "content": "产品语义为“清空聊天记录”时,调用 messageManager.clearConversationAndDeleteAllMsg 。 OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; 成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 onConversationChanged 或重新查询校准最后一条消息、摘要和未读状态。" }, { - "path": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Refresh all data related to a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/overview-group", + "title": "群组概览", + "description": "了解 Android SDK 中群资料、成员、申请和群组事件的职责。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels refresh-all-data-related-to-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android group overview-group", + "content": "群组由 GroupInfo 表示, groupID 是群资料、成员、申请和权限设置的唯一目标标识。 GroupMembersInfo 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 GroupManager 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 OnGroupListener 。在共享状态层设置一次 listener,并按 groupID 或 userID 合并事件。 OpenIMClient.getInstance .groupManager.setOnGroupListener new OnGroupListener @Override public void onGroupInfoChanged GroupInfo group groupStore.put group.getGroupID , group ; @Override public void onGroupMemberInfoChanged GroupMembersInfo member memberStore.put member.getGroupID + member.getUserID , member ; ; 群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 主要能力 群资料与设置 /sdk/android/group/create group 群权限 /sdk/android/group/set group join verification 加入与退出群组 /sdk/android/group/join group 查询群组 /sdk/android/group/retrieving groups/get specified groups info 群申请 /sdk/android/group/group applications/overview group applications 查询群成员 /sdk/android/group/retrieving group members/overview retrieving group members 管理群成员 /sdk/android/group/managing group members/invite user to group" }, { - "path": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Register and remove operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/create-group", + "title": "创建群组", + "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-operators register-and-remove-operators", - "content": "" + "keywords": "sdk android v4 sdk android group create-group", + "content": "使用 createGroup 创建群组。 GroupInfo 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 GroupInfo ,应保存服务端确定的 groupID 。 GroupInfo info = new GroupInfo ; info.setGroupName \"项目讨论\" ; info.setIntroduction \"仅限项目成员\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ; 群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。" }, { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a channel by URL. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/update-group-profile", + "title": "更新群资料", + "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-channel-by-url", - "content": "" + "keywords": "sdk android v4 sdk android group update-group-profile", + "content": "使用 setGroupInfo 更新群资料。请求对象至少应包含 groupID 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"移动端项目组\" ; update.setIntroduction \"Android 与 iOS 协作群\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; 最新群资料通过 onGroupInfoChanged 合并。群公告和扩展字段使用相同接口,分别见相关页面。" }, { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-announcement", + "title": "发布群公告", + "description": "通过 GroupInfo.notification 发布或更新群公告。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-list-of-channels", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-announcement", + "content": "Android SDK 没有独立的公告方法。构造包含 groupID 与 notification 的 GroupInfo ,再调用 setGroupInfo 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"今晚 20:00 进行版本发布确认。\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; 公告的更新时间和更新人由返回的 GroupInfo 中 notificationUpdateTime 、 notificationUserID 表示。权限由服务端校验。" }, { - "path": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Filter group channels by user IDs. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-extension", + "title": "设置群扩展字段", + "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels filter-group-channels-by-user-ids", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-extension", + "content": "GroupInfo.ex 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ; 不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。" }, { - "path": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search group channels by name, URL, or other filters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-join-verification", + "title": "设置入群验证方式", + "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-group-channels-by-name-url-or-other-filters", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-join-verification", + "content": "入群验证写入 GroupInfo.needVerification ,再调用 setGroupInfo 。可使用 GroupVerification 常量: APPLY NEED VERIFICATION INVITE DIRECTLY 、 ALL NEED VERIFICATION 和 DIRECTLY 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markVerificationSubmitted groupID ; @Override public void onError int code, String error showVerificationError error ; ; 该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。" }, { - "path": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search open channels by name, URL, or custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-member-profile-access", + "title": "设置成员资料查看权限", + "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-open-channels-by-name-url-or-custom-types", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-member-profile-access", + "content": "lookMemberInfo 使用整数开关: 0 关闭, 1 打开。更新时只提交该权限字段和 groupID 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markMemberInfoAccessSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; 此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。" }, { - "path": "/sdk/android/deprecated", - "title": "Deprecated", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Deprecated. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-member-friend-permission", + "title": "设置成员好友申请权限", + "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android deprecated", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", + "content": "applyMemberFriend 使用整数开关: 0 关闭, 1 打开。该规则只影响从该群成员关系入口发起的好友申请。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; 更新后以 onGroupInfoChanged 或重新读取的 GroupInfo 为准。" }, { - "path": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a channel event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/change-group-mute", + "title": "设置全员禁言", + "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-channel-event-handlers add-or-remove-a-channel-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group change-group-mute", + "content": "使用 changeGroupMute 切换全员禁言。 true 开启, false 关闭;成员级禁言见“禁言或解除禁言群成员”。 OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ; 群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。" }, { - "path": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a connection event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/join-group", + "title": "申请加入群组", + "description": "使用 joinGroup 提交入群申请或加入请求。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-connection-event-handlers add-or-remove-a-connection-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group join-group", + "content": "使用 joinGroup 提交入群请求。 joinSource 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。 OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"希望加入项目讨论\", 3, \" \\\"from\\\":\\\"search\\\" \" ; 验证方式决定请求是否立即加入。后续通过 onJoinedGroupAdded 或群申请事件更新本地状态。" }, { - "path": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a user event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/quit-group", + "title": "退出群组", + "description": "使用 quitGroup 让当前登录用户退出指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-user-event-handlers add-or-remove-a-user-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group quit-group", + "content": "quitGroup 仅作用于当前登录用户,不会解散群组或移除其他成员。 OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; 请求成功后仍应处理 onJoinedGroupDeleted ,并清理该群的成员列表、群会话入口等应用缓存。" }, { - "path": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/dismiss-group", + "title": "解散群组", + "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler overview-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group dismiss-group", + "content": "dismissGroup 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; 最终状态通过 onGroupDismissed 合并;收到事件后移除群资料、成员和群会话相关缓存。" }, { - "path": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Collection migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "获取群资料", + "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started collection-migration-guide", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", + "content": "已持有一组 groupID 时,使用 getGroupsInfo 查询群资料。结果是 GroupInfo 列表,不能依赖响应顺序与请求列表完全一致。 OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups mergeGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ; 先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。" }, { - "path": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Kotlin extension (KTX). Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "分页获取已加入群组", + "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started kotlin-extension", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", + "content": "Android SDK 仅提供分页版本。 offset 从 0 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; 使用 onJoinedGroupAdded 与 onJoinedGroupDeleted 合并增量,不要仅依赖已加载分页作为完整群列表。" }, { - "path": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "检查是否加入群组", + "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started migration-guide", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", + "content": "isJoinGroup 仅检查当前登录用户与目标 groupID 的成员关系。 OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ; 该结果不替代群资料查询,也不能用于判断其他用户是否在群内。" }, { - "path": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Local caching. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/search-groups", + "title": "搜索群组", + "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching overview-local-caching", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", + "content": "searchGroups 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; 搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。" }, { - "path": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Group channel collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/overview-group-applications", + "title": "群申请概览", + "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-group-channel-collection group-channel-collection", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", + "content": "群申请记录使用 GroupApplicationInfo 表示。收到的申请面向群管理者,发出的申请面向当前用户; handleResult 、 reqMsg 、 handledMsg 和处理时间用于展示申请状态。 Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由 群组概览 /sdk/android/group/overview group 的统一 listener 负责合并。" }, { - "path": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Message collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "获取收到的群申请", + "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-message-collection message-collection", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", + "content": "使用非废弃重载并传入 GetGroupApplicationListAsRecipientReq 。可设置 offset 、 count 、 groupIDs 和 handleResults 筛选条件。 GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 收到事件后按申请中的 groupID 和 userID 合并,不要把列表下标作为申请标识。" }, { - "path": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "获取发出的群申请", + "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android logger", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", + "content": "使用 GetGroupApplicationListAsApplicantReq 设置分页和筛选条件,再调用 getSendGroupApplicationList 。 GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 申请被同意后,群列表变化以 onJoinedGroupAdded 为准。" }, { - "path": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize messages by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/accept-group-application", + "title": "同意群申请", + "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message categorizing-messages categorize-messages-by-custom-type", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications accept-group-application", + "content": "调用时同时传入申请的 groupID 、申请人 userID 和处理说明。服务端负责校验当前用户是否有审批权限。 OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"欢迎加入\" ; 同意后通过群申请事件与 onGroupMemberAdded 更新申请列表和成员列表。" }, { - "path": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/refuse-group-application", + "title": "拒绝群申请", + "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message listing-changelogs list-changelogs-of-messages", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", + "content": "拒绝操作同样使用申请所属 groupID 、申请人 userID 和处理说明。 OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"当前群组人数已满\" ; 成功 callback 后不要直接删除本地申请记录;以 onGroupApplicationRejected 或重新查询结果更新。" }, { - "path": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Clear the chat history in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "群成员查询概览", + "description": "说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message clear-the-chat-history-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members overview-retrieving-group-members", + "content": "成员查询使用 groupID 限定范围,结果为 GroupMembersInfo 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 成员增删和资料变化由 群组概览 /sdk/android/group/overview group 归属的 OnGroupListener 统一合并。查询只建立快照,不能替代事件处理。" }, { - "path": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Copy a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "获取群成员列表", + "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message copy-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", + "content": "filter 传 0 查询全部成员, 1 普通成员, 2 群主, 3 管理员。 offset 与 count 控制分页。 OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ; 分页期间仍应接受成员事件,合并键使用 groupID 与 userID 。" }, { - "path": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "获取群成员资料", + "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message delete-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", + "content": "getGroupMembersInfo 接收一个 groupID 和目标用户 ID 列表,返回这些用户在群内的 GroupMembersInfo 。 OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ; 返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。" }, { - "path": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Display Open Graph tags in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "检查用户是否在群内", + "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message display-open-graph-tags-in-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", + "content": "getUsersInGroup 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; 需要昵称、角色或禁言状态时,再调用“获取群成员资料”。" }, { - "path": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "获取群主和管理员", + "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message update-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", + "content": "使用 getGroupMemberOwnerAndAdmin 获取需要展示或校验管理身份的成员记录。 OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; roleLevel 的群主、管理员和普通成员常量见 GroupRole ;实际操作权限仍由服务端决定。" }, { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List pinned messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "搜索群成员", + "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels list-pinned-messages", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members search-group-members", + "content": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members showMemberSearch members ; @Override public void onError int code, String error showSearchError error ; , groupID, Collections.singletonList keyword , true, true, 0, 20 ; 搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。" }, { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Unpin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "邀请用户入群", + "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels unpin-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", + "content": "传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"邀请加入项目讨论\" ; 成员实际加入后以 onGroupMemberAdded 合并,不能仅以提交成功显示为已加入。" }, { - "path": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "移除群成员", + "description": "使用 kickGroupMember 将指定成员移出群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls add-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", + "content": "kickGroupMember 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"已不再参与该项目\" ; 收到 onGroupMemberDeleted 后再从成员缓存中移除目标成员。" }, { - "path": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cast or cancel a vote. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "更新群昵称", + "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls cast-or-cancel-a-vote", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", + "content": "成员资料修改统一使用 setGroupMemberInfo 。请求中填写 groupID 、 userID 和 nickname 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"小林\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 以 onGroupMemberInfoChanged 返回的 GroupMembersInfo.nickname 更新显示。" }, { - "path": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Close a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "管理群管理员", + "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls close-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", + "content": "roleLevel 使用 GroupRole 常量: OWNER 、 ADMIN 和 MEMBER 。群主转让使用独立接口,不应通过本接口推测转让流程。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; 实际角色变更和权限由服务端校验,以成员资料变化事件为准。" }, { - "path": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "更新群成员头像", + "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", + "content": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。" }, { - "path": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "设置群成员扩展字段", + "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", + "content": "SetGroupMemberInfo.ex 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 不要将凭据、令牌或仅限本机的显示状态写入该字段。" }, { - "path": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "转让群主", + "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls list-changelogs-of-polls", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", + "content": "目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。 OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; onGroupMemberInfoChanged 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "禁言或解除禁言群成员", + "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-polls", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", + "content": "seconds 为禁言时长,单位为秒;传 0 解除成员禁言。该操作与全员禁言相互独立。 OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ; 在 onGroupMemberInfoChanged 中读取 muteEndTime 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of voters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/overview-message", + "title": "消息概览", + "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-voters", - "content": "" + "keywords": "sdk android v4 sdk android message overview-message", + "content": "Android 消息以 Message 表示,使用 clientMsgID 去重,使用 sessionType 、 recvID 和 groupID 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 OpenIMClient.getInstance .messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; ; 查询建立快照, OnAdvanceMsgListener 合并增量; MessageManager 的 listener 设置会替换当前 listener。" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-text-message", + "title": "创建文本消息", + "description": "使用 createTextMessage 创建文本 Message。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-text-message", + "content": "createTextMessage 只创建本地消息对象,不发送消息。 Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "创建 @ 消息", + "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-text-at-message", + "content": "传入文本、被提醒用户 ID、 AtUserInfo 列表和可选引用消息。 Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" }, { - "path": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-custom-message", + "title": "创建自定义消息", + "description": "使用 createCustomMessage 承载业务定义的 JSON 消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-custom-message", + "content": "data 、 extension 和 description 由业务定义,接收端应按自己的协议解析。 Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" }, { - "path": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "从文件创建图片消息", + "description": "使用相对路径或绝对路径创建图片消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", + "content": "缓存目录内使用 createImageMessage ,绝对路径使用 createImageMessageFromFullPath 。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageFromFullPath filePath ;" }, { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Get read status of a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "从 URL 创建图片消息", + "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel get-read-status", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-url", + "content": "准备 PictureInfo 的原图、大图和缩略图信息后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" }, { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "从文件创建音频消息", + "description": "使用相对路径或绝对路径创建音频消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-read", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-file", + "content": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath soundPath, durationSeconds ;" }, { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as unread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "从 URL 创建音频消息", + "description": "使用 SoundElem 创建已上传资源的音频消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-unread", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-url", + "content": "createSoundMessageByURL 接收已经包含 URL、时长和大小的 SoundElem 。 Message message = OpenIMClient.getInstance .messageManager.createSoundMessageByURL soundElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "从文件创建视频消息", + "description": "使用相对路径或绝对路径创建视频消息及缩略图。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel cancel-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-file", + "content": "视频方法需要 MIME 类型、时长和缩略图路径。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath videoPath, mimeType, durationSeconds, snapshotPath ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List all scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "从 URL 创建视频消息", + "description": "使用 VideoElem 创建已上传资源的视频消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel list-all-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-url", + "content": "将远端视频及缩略图信息填入 VideoElem 后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "从文件创建文件消息", + "description": "使用相对路径或绝对路径创建文件消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-file", + "content": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath filePath, fileName ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the total number of scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "从 URL 创建文件消息", + "description": "使用 FileElem 创建已上传资源的文件消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-the-total-number-of-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-url", + "content": "FileElem 应包含远端 URL、文件名和文件大小。 Message message = OpenIMClient.getInstance .messageManager.createFileMessageByURL fileElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send scheduled message immediately. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-card-message", + "title": "创建名片消息", + "description": "使用 createCardMessage 创建联系人名片消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel send-a-scheduled-message-immediately", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-card-message", + "content": "CardElem 保存名片用户的展示资料。 Message message = OpenIMClient.getInstance .messageManager.createCardMessage cardElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-location-message", + "title": "创建位置消息", + "description": "使用 createLocationMessage 创建经纬度和描述位置消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel update-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-location-message", + "content": "经纬度使用十进制度数,描述用于地图或列表展示。 Message message = OpenIMClient.getInstance .messageManager .createLocationMessage latitude, longitude, description ;" }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-face-message", + "title": "创建表情消息", + "description": "使用 createFaceMessage 创建自定义表情消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-face-message", + "content": "index 表示表情位置, data 保存表情 URL 等 JSON 数据。 Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-quote-message", + "title": "创建引用消息", + "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-an-open-channel", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", + "content": "引用消息保存被引用的完整 Message ,发送前应确保引用对象包含稳定的 clientMsgID 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-forward-message", + "title": "创建转发消息", + "description": "使用 createForwardMessage 创建转发消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-list-of-messages", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-forward-message", + "content": "传入待转发的 Message ,创建结果仍需通过发送方法投递到目标会话。 Message message = OpenIMClient.getInstance .messageManager.createForwardMessage sourceMessage ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-merger-message", + "title": "创建合并消息", + "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-read-a-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-merger-message", + "content": "传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't received a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/sending-messages/send-message", + "title": "发送消息", + "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-received-a-message", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages send-message", + "content": "单聊填写 recvUid ,群聊填写 recvGid ,另一个目标参数传 null 。 OnMsgSendCallback 同时承载成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess String id mergeSentMessage message ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of channels with unread messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "发送非 OSS 消息", + "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-channels", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", + "content": "消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread items. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "跟踪消息发送进度", + "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-items", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", + "content": "Android 没有独立的全局发送进度 listener;进度随每次 sendMessage 或 sendMessageNotOss 传入的 OnMsgSendCallback 返回。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess String id finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/receiving-messages/receive-messages", + "title": "接收消息", + "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", + "content": "设置 setAdvancedMsgListener 后, onRecvNewMessage 接收实时消息, onRecvOfflineNewMessage 接收离线批次, onRecvOnlineOnlyMessage 接收在线消息字符串。所有消息都按 clientMsgID 幂等合并。 messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in all channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "接收自定义业务消息", + "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-all-channels", - "content": "" + "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", + "content": "自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ; 本页是 onRecvCustomBusinessMessage 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 MessageManager 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。" }, { - "path": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel an in-progress file upload. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "加载更早消息", + "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message cancel-an-in-progress-file-upload", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", + "content": "首次查询传 startMsg 为 null ,后续将上一页边界消息作为起点。按返回的 clientMsgID 去重。 messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.NORMAL ;" }, { - "path": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a critical alert message to iOS device users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "加载更新消息", + "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-critical-alert-message-to-ios-device-users", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", + "content": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.NORMAL ;" }, { - "path": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "按 ID 查询消息", + "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-message", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", + "content": "构造 SearchParams 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" }, { - "path": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send an admin message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/searching-messages/search-messages", + "title": "搜索消息", + "description": "使用 searchLocalMessages 搜索当前账号已同步到本地的消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-an-admin-message", - "content": "" + "keywords": "sdk android v4 sdk android message searching-messages search-messages", + "content": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。 conversationID 传 null 表示全局搜索。 messageManager.searchLocalMessages callback, conversationID, keywords, 1, senderIDs, messageTypes, 0, 0, 0, 20 ;" }, { - "path": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Spam flood protection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/composing-messages/update-typing-status", + "title": "更新输入状态", + "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message spam-flood-protection", - "content": "" + "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", + "content": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 messageManager.typingStatusUpdate callback, peerUserID, \"typing\" ; 成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 OnConversationListener.onConversationUserInputStatusChanged 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。" }, { - "path": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Track file upload progress using a handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/delete-local-message", + "title": "删除本地消息", + "description": "使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message track-file-upload-progress-using-a-handler", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages delete-local-message", + "content": "该操作不影响其他设备和其他用户的消息记录。 messageManager.deleteMessageFromLocalStorage conversationID, clientMsgID, callback ;" }, { - "path": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translation engine. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "删除已保存消息", + "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translation-engine", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", + "content": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 messageManager.deleteMessageFromLocalAndSvr conversationID, clientMsgID, callback ;" }, { - "path": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List replies in a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "撤回消息", + "description": "使用 revokeMessageV2 撤回已发送消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading list-replies-in-a-message-thread", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", + "content": "Android 的撤回方法为 revokeMessageV2 ,撤回详情通过 onRecvMessageRevokedV2 返回。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ;" }, { - "path": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migrating to OpenIM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/modify-a-message", + "title": "修改消息", + "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android migrating-to-openim", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", + "content": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 onMessageModified 同步。 messageManager.modifyMessage callback, modifyRequest ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification content templates. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "查看置顶消息", + "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-content-templates", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", + "content": "查询结果是指定会话当前的置顶消息快照。 messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification tester. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "置顶或取消置顶消息", + "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-tester", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", + "content": "最后一个参数为 true 置顶, false 取消置顶;变化通过 onChangedPinnedMsg 同步。 messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "插入本地单聊消息", + "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages insert-local-single-message", + "content": "该方法不向服务器发送消息, receiver 和 sender 用于建立本地消息归属。 messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "插入本地群聊消息", + "description": "使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages insert-local-group-message", + "content": "传入群 ID 与发送者 ID,消息不会同步到其他设备。 messageManager.insertGroupMessageToLocalStorage callback, message, groupID, senderUserID ;" }, { - "path": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark push notifications as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "清空全部本地消息", + "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications marking-push-notifications-as-delivered mark-push-notifications-as-delivered", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages clear-all-local-messages", + "content": "该操作只清理当前设备本地缓存,不删除服务端记录。 messageManager.deleteAllMsgFromLocal callback ;" }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "清空全部已保存消息", + "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages clear-all-messages", + "content": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。 messageManager.deleteAllMsgFromLocalAndSvr callback ;" }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "设置消息本地扩展字段", + "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages set-message-local-ex", + "content": "localEx 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" }, { - "path": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Report a message, user, or channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "跟踪文件上传进度", + "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report creating-a-report report-a-message-user-or-channel", - "content": "" + "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", + "content": "Android SDK 不设置全局文件上传 listener。每次调用 uploadFile 时传入一个 OnPutFileListener ,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 OnPutFileListener uploadListener = new OnPutFileListener @Override public void open long size initializeUploadProgress uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void uploadPartComplete long partNumber, long partSize, String partHash markPartComplete uploadTaskID, partNumber, partSize, partHash ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; ; OpenIMClient.getInstance .uploadFile resultCallback, uploadListener, putArgs ; open 可用于初始化总大小, uploadID 返回 SDK 上传任务标识, uploadComplete 提供上传过程数据, uploadPartComplete 表示一个分片已经完成, complete 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 业务层仍应生成自己的稳定 uploadTaskID ,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 完整的参数构造和错误处理见 上传文件 /sdk/android/file uploads/upload file 。" }, { - "path": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage user metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/file-uploads/upload-file", + "title": "上传文件", + "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user managing-user-metadata manage-user-metadata", - "content": "" + "keywords": "sdk android v4 sdk android file-uploads upload-file", + "content": "uploadFile 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | base | OnBase | 是 | 接收上传请求的最终成功或失败结果。 | | listener | OnPutFileListener | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | | putArgs.filepath | String | 是 | Android 应用可读取的本地文件路径。 | | putArgs.name | String | 是 | 上传使用的文件名; PutArgs 默认使用传入路径,可按业务需要改为原始文件名。 | | putArgs.cuase | String | 否 | 业务约定的上传原因。字段名以 Android SDK 的 PutArgs 声明为准。 | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; 每次调用都传入独立的 OnPutFileListener ,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见 跟踪文件上传进度 /sdk/android/file uploads/track file upload progress 。 complete 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。" }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of blocked users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/overview-calling", + "title": "音视频通话概览", + "description": "了解 Android SDK 的音视频通话信令、房间信息和事件边界。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-blocked-users", - "content": "" + "keywords": "sdk android v4 sdk android calling overview-calling", + "content": "Android SDK 的 SignalingManager 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。 应用需要把 SDK 返回的 roomID 、 token 和 liveURL 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。 通话流程 1. 调用 signalingInvite 发起单聊通话,或调用 signalingInviteInGroup 发起群聊通话。 2. 被邀请方从 onReceiveNewInvitation 获取 SignalingInfo ,选择接受或拒绝。 3. 接受方调用 signalingAccept ,双方使用返回的房间凭据接入媒体引擎。 4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。 5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。 核心数据 | 数据 | 说明 | | | | | SignalingInvitationInfo | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 | | SignalingInfo | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 | | SignalingCertificate | OpenIMServer 返回的 roomID 、 token 、 liveURL 和忙线用户列表。 | | RoomCallingInfo | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 | customData 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。 状态更新与事件归属 发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。 邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见 处理通话事件 /sdk/android/calling/managing calls/handle call events ;自定义信令见 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal 。房间、凭据和待处理邀请查询只返回调用时的状态快照。 概览页不设置 listener。通话状态以 roomID 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。 按任务查找页面 | 任务 | 页面 | | | | | 发起单聊或群聊通话 | 发起单聊通话 /sdk/android/calling/managing calls/start single call 、 发起群聊通话 /sdk/android/calling/managing calls/start group call | | 接受或拒绝邀请 | 接受通话 /sdk/android/calling/managing calls/accept call 、 拒绝通话 /sdk/android/calling/managing calls/reject call | | 取消邀请或挂断通话 | 取消通话邀请 /sdk/android/calling/managing calls/cancel call 、 挂断通话 /sdk/android/calling/managing calls/hang up call | | 恢复房间或待处理邀请 | 查询群组通话房间 /sdk/android/calling/retrieving call information/get room by group id 、 获取通话房间 Token /sdk/android/calling/retrieving call information/get token by room id 、 恢复启动前收到的通话邀请 /sdk/android/calling/retrieving call information/restore pending invitation | | 处理通话事件和业务协商 | 处理通话事件 /sdk/android/calling/managing calls/handle call events 、 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal |" }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of muted users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/start-single-call", + "title": "发起单聊通话", + "description": "使用 Android SDK 发起单聊音视频通话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-muted-users", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", + "content": "signalingInvite 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 参数说明 | 字段 | 类型 | 是否必填 | 说明 | | | | | | | userID | String | 是 | 执行邀请操作的当前登录用户 ID。 | | inviterUserID | String | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | | inviteeUserIDList | List | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | | groupID | String | 是 | 单聊固定传空字符串。 | | roomID | String | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | | timeout | long | 是 | 邀请等待时长,单位为秒。 | | mediaType | String | 是 | 媒体类型,业务通常约定为 audio 或 video 。 | | sessionType | int | 是 | 单聊使用 ConversationType.SINGLE CHAT 。 | | platformID | int | 是 | Android 手机端使用 Platform.ANDROID 。 | | customData | String | 否 | 随邀请携带的业务扩展字符串。 | | offlinePushInfo | OfflinePushInfo | 否 | 被邀请人离线时使用的推送内容。 | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate 。其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由 处理通话事件 /sdk/android/calling/managing calls/handle call events 合并。" }, { - "path": "/sdk/android/user/overview-user", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/start-group-call", + "title": "发起群聊通话", + "description": "使用 Android SDK 发起群聊音视频通话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user overview-user", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", + "content": "signalingInviteInGroup 发起群聊通话,只邀请 inviteeUserIDList 明确列出的群成员,不会因为填写 groupID 自动邀请全群。 SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; groupID 不能为空, inviteeUserIDList 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 roomID ,所有参与端必须使用同一个值。 成功回调返回 SignalingCertificate ,字段含义见 发起单聊通话 /sdk/android/calling/managing calls/start single call 。 busyLineUserIDList 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。" }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the latest information on participants. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/accept-call", + "title": "接受通话", + "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-latest-information-on-participants", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls accept-call", + "content": "从 onReceiveNewInvitation 取得原始 SignalingInfo 后,使用 signalingAccept 接受邀请: OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; receivedInfo 必须保留收到的原始 roomID 、邀请人、被邀请人和会话类型,不能重新构造为只包含 roomID 的对象。 成功回调返回 SignalingCertificate 。取得有效的 token 和 roomID 后再连接媒体房间;远端状态由 处理通话事件 /sdk/android/calling/managing calls/handle call events 继续合并。" }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update user profile. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/reject-call", + "title": "拒绝通话", + "description": "使用 Android SDK 拒绝通话邀请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information update-user-profile", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls reject-call", + "content": "用户拒绝来电时,将收到的原始 SignalingInfo 交给 signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , receivedInfo ; 成功回调只表示拒绝信令请求完成。发起端随后通过 onInviteeRejected 更新界面;完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of members and operators in a specific order. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/cancel-call", + "title": "取消通话邀请", + "description": "使用 Android SDK 取消尚未接通的通话邀请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-members-and-operators-in-a-specific-order", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", + "content": "邀请尚未接通时,发起方调用 signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "挂断通话", + "description": "使用 Android SDK 挂断已经建立的通话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-operators", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", + "content": "通话已经建立后,参与者调用 signalingHungUp 。传入的 SignalingInfo 应保留本次通话的完整邀请信息,其中 roomID 必须与当前媒体房间一致。 OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , activeInfo ; 成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 roomID 幂等执行的清理流程。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "处理通话事件", + "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", + "content": "通话状态层应集中设置一次 OnSignalingListener ,并按 roomID 合并邀请生命周期、参与者连接状态和媒体流变化。 OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info upsertCall info, \"ringing\" ; @Override public void onInviteeAccepted SignalingInfo info mergeCallEvent \"accepted\", info ; @Override public void onInviteeRejected SignalingInfo info mergeCallEvent \"rejected\", info ; @Override public void onInvitationCancelled SignalingInfo info mergeCallEvent \"cancelled\", info ; @Override public void onInvitationTimeout SignalingInfo info mergeCallEvent \"timeout\", info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info mergeCallEvent \"accepted by other device\", info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info mergeCallEvent \"rejected by other device\", info ; @Override public void onHangup SignalingInfo info finishCall info.getInvitation .getRoomID ; @Override public void onRoomParticipantConnected RoomCallingInfo room mergeConnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room mergeDisconnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onStreamChange String streamInfo mergeStreamChange streamInfo ; ; 本页是除 onReceiveCustomSignal 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal 。 邀请事件使用 SignalingInfo.invitation.roomID 合并。参与者状态使用 RoomCallingInfo.roomID ,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。 onStreamChange 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 SignalingManager 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in an application. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "恢复启动前收到的通话邀请", + "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-an-application", - "content": "" + "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", + "content": "getSignalingInvitationInfoStartApp 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; 成功回调只表示取得当前快照,不会替代通话 listener。仅在 invitation 和 roomID 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { - "path": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "查询群组通话房间", + "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-read-in-a-group-channel mark-messages-as-read", - "content": "" + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", + "content": "signalingGetRoomByGroupID 的参数是群组 ID,不是自定义 roomID : OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; 成功回调返回 RoomCallingInfo 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 groupID 。" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "获取通话房间 Token", + "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", + "content": "已经知道 roomID 、但需要重新获取入会凭据时,调用 signalingGetTokenByRoomID : OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; 成功回调返回 SignalingCertificate ,字段含义见 发起单聊通话 /sdk/android/calling/managing calls/start single call 。只有取得有效的 token 和 roomID 后才能连接媒体引擎。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。" + }, + { + "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "发送自定义信令", + "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", + "content": "signalingSendCustomSignal 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 发送信令 roomID 与 customInfo 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; 成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 customInfo 。 接收信令 OnSignalingListener.onReceiveCustomSignal 返回 CustomSignalingInfo 。应用应先校验房间和自有业务协议,再更新界面: @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; 本页是 onReceiveCustomSignal 的完整处理归属页。 parseAndValidateCallSignal 应检查 JSON 结构、协议版本、 eventID 、 type 和业务字段。按 roomID:eventID 幂等处理,不要依赖事件顺序。 SignalingManager 只设置一个 listener。接收自定义信令的回调应合并到 处理通话事件 /sdk/android/calling/managing calls/handle call events 所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。" + }, + { + "path": "/sdk/android/events/overview-events", + "title": "事件概览", + "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android events overview-events", + "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | 合并标识 | 完整处理页面 | | | | | | 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | userID | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | userID | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | userID | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | fromUserID:toUserID | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | userID | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | conversationID | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | 当前登录用户 | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | conversationID:userID | 更新输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | groupID 或 groupID:userID | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | clientMsgID ,必要时结合 conversationID | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回、删除、修改和置顶 | clientMsgID ,必要时结合 conversationID | 消息概览 /sdk/android/message/overview message | | 单聊已读回执 | conversationID:clientMsgID | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | 业务协议中的幂等 ID | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | roomID ,参与者结合用户 ID | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | roomID:eventID | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" + }, + { + "path": "/sdk/android/logger", + "title": "日志", + "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android logger", + "content": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 初始化日志配置 日志选项属于 InitConfig ,必须在 initSDK 前设置: File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | 字段 | 说明 | | | | | logLevel | 使用 LogLevel 常量控制详细程度。可选值包括 DebugWithSQL 、 Debug 、 Info 、 Warn 、 Error 、 Panic 和 Fatal 。 | | isLogStandardOutput | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | | logFilePath | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | 开发诊断可以使用 Debug ;只有排查数据库问题时才临时启用 DebugWithSQL 。生产环境通常使用 Warn 或 Error ,并关闭不必要的标准输出。 写入应用诊断日志 需要把业务上下文写入 SDK 日志时,使用未废弃的 logs 重载: OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName 和 currentLineNum 用于定位调用位置, msgStr 是简短动作描述, errStr 是错误信息。 Warn 、 Error 、 Panic 和 Fatal 级别必须提供非空错误信息。末尾的 extra 按“键、值”成对传入;只记录排查所需的非敏感标识。 旧的带 OnBase 、 Map 参数的 logs 重载已经废弃,不应在新代码中使用。 上传诊断日志 只在用户明确同意提交诊断信息后调用 uploadLogs 。Android API 保留了 params 参数;没有额外参数时传空列表。 line 表示本次上传读取的日志行数配置。 String uploadID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , Collections.emptyList , 2000, uploadID, \"support ticket 42\", new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | 参数 | 说明 | | | | | line | 本次上传读取的日志行数配置。 | | cancelID | 本次上传的稳定标识,可使用业务生成的 UUID。 | | ex | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | UploadLogProgress | 提供当前进度和总量,用于更新上传界面。 | 成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 operationID 与业务追踪 Android Java wrapper 的公共业务方法不接收 operationID 。每次调用时,wrapper 会通过 ParamsUtil.buildOperationID 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 conversationID 、 clientMsgID 、 groupID 或 roomID 。应用 trace ID 用于串联多步骤业务流程;SDK 的 operationID 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 相关页面 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送消息 /sdk/android/message/sending messages/send message" }, { "path": "/sdk/flutter/overview", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index dbacd1f2f6..83e3d8cfbf 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1895,1029 +1895,357 @@ "keywords": "sdk ios v4 sdk ios logger", "content": "OpenIM iOS SDK logs help diagnose initialization, connection, and business API issues. Development builds can emit detailed information. Production builds should reduce log volume and must avoid recording tokens, message bodies, file URLs, or private user fields. Configure logging during initialization Logging options belong to OIMInitConfig and must be set before initSDKWithConfig:... : OIMInitConfig config = OIMInitConfig new ; config.platform = iPhone; config.apiAddr = apiAddress; config.wsAddr = websocketAddress; config.dataDir = dataDirectory; config.logLevel = 4; config.isLogStandardOutput = YES; config.logFilePath = logDirectory; config.systemType = @\"ios\"; Parameters | Field | Type | Description | | | | | | logLevel | NSInteger | The SDK log level. The default is 6 ; follow the conventions of the SDK version in use. | | isLogStandardOutput | BOOL | Whether to emit standard SDK logs. | | logFilePath | NSString | Optional directory for log files. | | systemType | NSString | System type label written into logs. | Do not leave the most verbose logging enabled indefinitely in production. Keep the log directory within an app writable location and manage its capacity, retention period, and privacy requirements. Write application diagnostic logs To include application context in SDK logs, call: OIMManager manager logs: NSString stringWithUTF8String: FILE .lastPathComponent line: LINE msgs:@\"send message failed\" err:errorMessage keyAndValues:@ @\"conversationID\", conversationID, @\"clientMsgID\", clientMsgID logLevel:2 ; Include only non sensitive identifiers needed for diagnosis in keyAndValues . Never record access tokens, complete message content, or raw file URLs. Trace a call with operationID Public Objective C business selectors do not require your app to pass an operationID . The SDK generates identifiers for call chains. To obtain a new chain ID for application diagnostics, call: NSString operationID = OIMManager manager operationId ; operationID is only for log correlation. It is not a user identity, authorization credential, business idempotency key, conversationID , or clientMsgID . Use a new value for each independent call chain. To correlate a multi step business flow, use a separate trace ID defined by your application. Upload logs After the user has explicitly agreed to submit diagnostic information, upload the SDK logs: OIMManager manager uploadLogsWithProgress:^ NSInteger saveBytes, NSInteger currentBytes, NSInteger totalBytes self updateLogUploadCurrentBytes:currentBytes totalBytes:totalBytes ; line:2000 ex:@\"support ticket 42\" onSuccess:^ NSString Nullable data self showLogUploadCompleted ; onFailure:^ NSInteger code, NSString message self showLogUploadError:code message:message ; ; The progress callback reports saved, currently processed, and total bytes in that order. Explain the collection scope before uploading, and follow your product's privacy, consent, and retention policies." }, - { - "path": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Freeze and unfreeze a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel moderating-a-channel freeze-and-unfreeze-a-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/overview-channel", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel overview-channel", - "content": "" - }, - { - "path": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "" - }, - { - "path": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add extra data to a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message adding-extra-data-to-a-message add-extra-data-to-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Generate thumbnails of a file message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message generate-thumbnails-of-a-file-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for React to a message in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message react-to-a-message-in-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send typing indicators to other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message send-typing-indicators-to-other-members", - "content": "" - }, - { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Pin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels pin-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls create-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel create-a-scheduled-message", - "content": "" - }, - { - "path": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-delivered-in-a-group-channel mark-messages-as-delivered", - "content": "" - }, - { - "path": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mention other users in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message mentioning-other-users-in-a-message mention-other-users-in-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message overview-message", - "content": "" - }, - { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search messages by a keyword. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message searching-messages-in-a-group-channel search-messages-by-a-keyword", - "content": "" - }, - { - "path": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Share an encrypted file. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message share-an-encrypted-file", - "content": "" - }, - { - "path": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Smart throttling. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message smart-throttling", - "content": "" - }, - { - "path": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Auto-translate messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages auto-translate-messages", - "content": "" - }, - { - "path": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translate messages on-demand. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translate-messages-on-demand", - "content": "" - }, - { - "path": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading create-a-message-thread", - "content": "" - }, { "path": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "OpenIM Android SDK overview", + "description": "Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android overview", - "content": "" - }, - { - "path": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Configure push notification preferences. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications configure-push-notification-preferences", - "content": "" - }, - { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification translation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-translation", - "content": "" - }, - { - "path": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications overview-push-notifications", - "content": "" - }, - { - "path": "/sdk/android/report/overview-report", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report overview-report", - "content": "" - }, - { - "path": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Block and unblock other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user block-and-unblock-other-members", - "content": "" - }, - { - "path": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mute and unmute a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user mute-and-unmute-a-user", - "content": "" - }, - { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the online status of a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-online-status-of-a-user", - "content": "" - }, - { - "path": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve members who have read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-members-who-have-read-a-message", - "content": "" - }, - { - "path": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Authentication. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application authenticating-a-user authentication", - "content": "" - }, - { - "path": "/sdk/android/application/overview-application", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application overview-application", - "content": "" - }, - { - "path": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Rate limits. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application understanding-rate-limits rate-limits", - "content": "" - }, - { - "path": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize channels by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel categorizing-channels categorize-channels-by-custom-type", - "content": "" - }, - { - "path": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel creating-a-channel create-a-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Accept or decline an invitation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel accept-or-decline-an-invitation", - "content": "" - }, - { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Invite users as members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel invite-users-as-members", - "content": "" - }, - { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Enter and exit an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel enter-and-exit-an-open-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Join and leave a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel join-and-leave-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metacounters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metacounters manage-channel-metacounters", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metadata manage-channel-metadata", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels delete-a-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Hide or archive a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels hide-or-archive-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Refresh all data related to a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels refresh-all-data-related-to-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Register and remove operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-operators register-and-remove-operators", - "content": "" - }, - { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a channel by URL. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-channel-by-url", - "content": "" - }, - { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-list-of-channels", - "content": "" - }, - { - "path": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Filter group channels by user IDs. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels filter-group-channels-by-user-ids", - "content": "" - }, - { - "path": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search group channels by name, URL, or other filters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-group-channels-by-name-url-or-other-filters", - "content": "" - }, - { - "path": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search open channels by name, URL, or custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-open-channels-by-name-url-or-custom-types", - "content": "" - }, - { - "path": "/sdk/android/deprecated", - "title": "Deprecated", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Deprecated. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android deprecated", - "content": "" - }, - { - "path": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a channel event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-channel-event-handlers add-or-remove-a-channel-event-handler", - "content": "" - }, - { - "path": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a connection event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-connection-event-handlers add-or-remove-a-connection-event-handler", - "content": "" - }, - { - "path": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a user event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-user-event-handlers add-or-remove-a-user-event-handler", - "content": "" - }, - { - "path": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler overview-event-handler", - "content": "" - }, - { - "path": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Collection migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started collection-migration-guide", - "content": "" - }, - { - "path": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Kotlin extension (KTX). Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started kotlin-extension", - "content": "" - }, - { - "path": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started migration-guide", - "content": "" - }, - { - "path": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Local caching. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching overview-local-caching", - "content": "" - }, - { - "path": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Group channel collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-group-channel-collection group-channel-collection", - "content": "" - }, - { - "path": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Message collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-message-collection message-collection", - "content": "" - }, - { - "path": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android logger", - "content": "" - }, - { - "path": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize messages by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message categorizing-messages categorize-messages-by-custom-type", - "content": "" - }, - { - "path": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message listing-changelogs list-changelogs-of-messages", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Clear the chat history in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message clear-the-chat-history-in-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Copy a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message copy-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message delete-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Display Open Graph tags in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message display-open-graph-tags-in-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message update-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List pinned messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels list-pinned-messages", - "content": "" - }, - { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Unpin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels unpin-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls add-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cast or cancel a vote. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls cast-or-cancel-a-vote", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Close a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls close-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls list-changelogs-of-polls", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-polls", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of voters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-voters", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll", - "content": "" + "content": "OpenIM Android SDK brings OpenIMSDK capabilities to native Android applications. Choose a domain below to open its documentation. Documentation navigation | Domain | Content | | | | | Getting started /sdk/android/getting started/environment specific implementation | Integrate the SDK, configure the Android project, authenticate, manage the connection lifecycle, and send the first message. | | Users and relationships /sdk/android/user/overview user | User profiles, online status, friends, friend applications, and blacklist. | | Conversations /sdk/android/conversation/overview conversation | Conversation queries, drafts, unread counts, receive options, burn after reading settings, hiding, and deletion. | | Groups /sdk/android/group/overview group | Group profiles, members, applications, permissions, mute settings, and group events. | | Messages /sdk/android/message/overview message | Message creation, sending, receiving, history, search, deletion, revocation, and read receipts. | | File uploads /sdk/android/file uploads/upload file | Standalone file uploads and upload progress. | | Audio and video calls /sdk/android/calling/overview calling | Invitations, acceptance, rejection, cancellation, hangup, room credentials, and custom signaling. | | Events /sdk/android/events/overview events | Manager listeners, connection state, and data events. | | Logging /sdk/android/logger | SDK logging configuration and troubleshooting. |" }, { - "path": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Get read status of a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel get-read-status", - "content": "" - }, - { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-read", - "content": "" - }, - { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as unread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-unread", - "content": "" - }, - { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", + "description": "Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel cancel-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android getting-started before-you-start", + "content": "Before integrating OpenIMClientSDK into a native Android application, prepare an accessible OpenIMServer deployment, a trusted user authentication flow, and an Android project that satisfies the SDK build requirements. These prerequisites apply to both Authenticate and manage a session /sdk/android/getting started/authenticate and manage session and Send your first message /sdk/android/getting started/send first message . Prepare OpenIMServer If OpenIMServer is not yet available, follow the Docker deployment guide /docs/guides/quick deployment/docker . Confirm that both physical devices and emulators can reach these endpoints: | Field | Description | | | | | apiAddr | OpenIMServer HTTP API endpoint used for login, synchronization, and resource requests. | | wsAddr | OpenIMServer WebSocket endpoint used for the persistent connection and real time events. | Do not validate the endpoints only from the development computer. localhost inside an Android emulator refers to the emulator itself, so it cannot directly access services running locally on the development computer. When OpenIMServer runs on the development computer, map the API and WebSocket ports to the emulator first: adb reverse tcp:10002 tcp:10002 adb reverse tcp:10001 tcp:10001 After mapping, the emulator can use http://127.0.0.1:10002 as apiAddr and ws://127.0.0.1:10001 as wsAddr . Replace the port numbers with the ports that the development computer actually listens on, and confirm that adb is connected to the target emulator before running the commands. Production applications should use HTTPS and WSS, with DNS, TLS certificates, firewalls, reverse proxies, and WebSocket upgrades verified from a physical device. Prepare the user and token userID identifies an OpenIMSDK user, while the token authenticates that user. A trusted backend must create or associate users, issue tokens, and enforce application permissions. The Android application must never store an administrator token, secret, or other server side credential. For the backend flow, see Prepare to use the Platform API /platform api/prepare to use api and Issue a session token /platform api/user/managing session tokens/issue a session token . After authenticating the application account, the backend should return only the following data needed for SDK login: | Data | Description | | | | | userID | The current user's OpenIM user ID. | | token | The login token associated with that user. | | apiAddr | The OpenIMServer HTTP API endpoint. | | wsAddr | The OpenIMServer WebSocket endpoint. | The userID must correspond to the token. The client must not accept an arbitrary user ID and then issue, assemble, or exchange an administrator token. Prepare the Android project Before integration, verify that the Android project meets the following requirements: The application uses minSdk 21 or later, Java 8 compiler options, and compileSdk 36 or later. The application manifest declares android.permission.INTERNET and permits the SDK to inspect network state. An application private persistent data directory is available, such as a dedicated directory under Application.getFilesDir . Do not store the SDK database in a temporary cache or shared storage. Physical devices can reach apiAddr , wsAddr , and message media domains. The release package covers the target device ABI; verify the native ABIs included in the actual delivery package. Product behavior is defined for network recovery, foreground and background transitions, token failure, forced logout, and multi device login. For dependencies and manifest entries, see Integrate for Android /sdk/android/getting started/environment specific implementation . For SDK initialization and authentication, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Continue the integration Complete Authenticate and manage a session /sdk/android/getting started/authenticate and manage session first. After the login callback succeeds and OnConnListener.onConnectSuccess arrives, verify the messaging path with Send your first message /sdk/android/getting started/send first message ." }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List all scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", + "description": "Add OpenIM Android SDK dependencies and network permissions to an Android project.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel list-all-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android getting-started environment-specific-implementation", + "content": "This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign in, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Add SDK dependencies Add the dependencies to the application module's build.gradle : dependencies implementation 'io.openim:android sdk:latest@aar' implementation 'io.openim:core sdk:latest@aar' implementation 'com.google.code.gson:gson:2.9.0' Configure the manifest The application needs network access: Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send your first message /sdk/android/getting started/send first message" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "description": "Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android getting-started authenticate-and-manage-session", + "content": "OpenIM Android SDK uses initSDK to initialize the local runtime and login to establish the current user's session. Complete the service, user, and token preparation in Before you start /sdk/android/getting started/before you start , then add dependencies and permissions as described in Integrate for Android /sdk/android/getting started/environment specific implementation . The complete flow is: 1. Create a stable OnConnListener in an application level session component. 2. Call initSDK and confirm that it returns true . 3. Register message, user, relationship, conversation, group, and call signaling listeners before login. 4. Obtain the matching userID and token from a trusted backend, then call login . 5. Wait separately for login success and onConnectSuccess before enabling operations that require the persistent connection. 6. On sign out or account switching, call logout and then clear application state owned by the current account. The apiAddr , wsAddr , userID , and token used below are all provided by a trusted backend. Initialize and handle the connection lifecycle During the Application lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting sessionState.setConnectionState \"connecting\" ; @Override public void onConnectSuccess sessionState.setConnectionState \"connected\" ; sessionState.enableConnectedOperations ; @Override public void onConnectFailed long code, String error sessionState.setConnectionState \"failed\" ; recordConnectionFailure code, error ; @Override public void onKickedOffline sessionState.clearCurrentAccount ; showSignedInElsewhereScreen ; @Override public void onUserTokenExpired requestNewTokenAndRelogin ; @Override public void onUserTokenInvalid String reason sessionState.clearCurrentAccount ; showSignInScreen reason ; ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; A true return value means that the local SDK runtime initialized successfully. OnConnListener starts reporting persistent connection state after login is called. | Field | Type | Description | | | | | | application | Application | Application level context that owns the SDK lifecycle. | | apiAddr | String | OpenIMServer HTTP API endpoint. | | wsAddr | String | OpenIMServer WebSocket endpoint. | | dataDirectory | File | Application private persistent directory for the SDK database and logs. | | config.logLevel | int | A LogLevel constant; reduce the logging level explicitly in production. | | isLogStandardOutput | boolean | Whether OpenIM Core logs are emitted to the standard log stream. | Initialize the SDK only once in Application or an application level session component. The Java wrapper exposes networkChanged to ask Core to re evaluate network connectivity; call it only when the application already has one centralized system network observer, not from multiple screens. Register business listeners before login Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application level event dispatcher and forward events to screen state. See Send your first message /sdk/android/getting started/send first message for the complete message listener registration and incremental merge example. User, relationship, conversation, group, and call signaling listeners follow the same ownership rule. The SDK does not expose remove or unset methods. During sign out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. Log in the current user OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error sessionState.setLoginState \"failed\" ; recordLoginFailure code, error ; @Override public void onSuccess String data sessionState.setLoginState \"logged\" ; sessionState.setCurrentUserID userID ; , userID, token ; The successful login callback means that the current login call completed. OnConnListener.onConnectSuccess means that the persistent connection is available. Handle these as separate stages. Do not call login concurrently or infer both states from only one callback. Inspect login state int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; restoreSessionFor currentUserID ; | State | Description | | | | | LoginStatus.Logout | The SDK is not logged in. | | LoginStatus.Logging | Login is in progress; do not start another login concurrently. | | LoginStatus.Logged | The SDK is logged in. Persistent connection state still comes from OnConnListener . | getLoginStatus and getLoginUserID return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. Handle token failure and forced logout After onUserTokenExpired or onUserTokenInvalid , obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign in flow according to product policy. After onKickedOffline , clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign out. These callbacks do not have a business entity merge key. Isolate them by the current OpenIMClient singleton and logged in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. Sign out and release the SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error recordLogoutFailure code, error ; @Override public void onSuccess String data sessionState.clearCurrentAccount ; ; Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling login for the next account. When the application will no longer use the SDK, release the runtime with: OpenIMClient.getInstance .unInit ; unInit is not a replacement for logout and must not run when an ordinary screen is destroyed. Next steps Before you start /sdk/android/getting started/before you start Integrate for Android /sdk/android/getting started/environment specific implementation Send your first message /sdk/android/getting started/send first message" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the total number of scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", + "description": "Send and verify the first one-to-one text message in an Android application.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-the-total-number-of-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android getting-started send-first-message", + "content": "Use one to one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign in in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Before you start Prepare a test account for the sender and another for the receiver. Initialize the SDK for both accounts as described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register the following listener on the receiver before it signs in. Replace user b in the example with the receiver's actual userID . Step 1: Listen for incoming messages on the receiver Register the message listener on the receiver before sign in. When a message arrives, add it to the chat list or refresh the UI. OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // Display message in the chat UI. ; Step 2: Confirm that sending is available After both accounts sign in, the sender can send only after its login callback succeeds and OnConnListener.onConnectSuccess arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling login again. Step 3: Send a text message Send a one to one text message Create the message, then send it. Put the receiver's userID in the user destination and leave the group destination empty. Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // Text messages usually do not need progress handling. @Override public void onError int code, String error // Tell the user that sending failed and allow a retry. @Override public void onSuccess Message sentMessage // Update the sender's chat UI with sentMessage. ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo configures offline push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. onSuccess means the sender has sent the message successfully. onRecvNewMessage on the receiver means the other side received it. Both callbacks should arrive before considering this one to one test complete. Send a group text message To send a group message, leave the receiver userID empty and provide the group's groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; Set either userID or groupID in a single call, never both. Verify success The sender enters onSuccess . The receiver enters onRecvNewMessage and sees the text message. A one to one message sets only the receiver's userID ; a group message sets only groupID . Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session OpenIM Android SDK overview /sdk/android/overview" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send scheduled message immediately. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/overview-user", + "title": "User overview", + "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel send-a-scheduled-message-immediately", - "content": "" + "keywords": "sdk android v4 sdk android user overview-user", + "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to and retrieve online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", + "description": "Use getUsersInfo() to query public profiles by userID.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel update-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-users-info", + "content": "getUsersInfo returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users for PublicUserInfo user : users publicUserStore.put user.getUserID , user ; @Override public void onError int code, String error recordUserQueryFailure code, error ; , userIDs ; Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns List with fields such as userID , nickname , faceURL , ex , and createTime . This query does not trigger OnUserListener ; query again and merge by userID when the profile snapshot must be refreshed. Returned fields | Field | Description | | | | | userID | OpenIM user ID and the stable local cache key. | | nickname | Account level public nickname. | | faceURL | Account level public avatar URL. | | ex | Account level public extension string defined by the application. | | createTime | User profile creation time. | Do not use PublicUserInfo to overwrite friend remarks, pinned state, or in group nicknames. Use FriendInfo for friends and the group member model for group members. Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. Refreshing profiles Replace or merge the public profile snapshot after a successful query. Re query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. OnUserListener.onSelfInfoUpdated only describes the signed in user's profile and is not a change event for other users." }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", + "description": "Use getSelfLocalUserInfo() to retrieve the local profile for the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-self-local-user-info", + "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user currentUserStore.set user ; @Override public void onError int code, String error recordSelfProfileFailure code, error ; ; After initialization and login, call this method to retrieve the current account's local profile. Success returns LocalUser with fields such as userID , nickname , faceURL , ex , attachedInfo , globalRecvMsgOpt , and addFriendPermission . Returned fields | Field | Description | | | | | userID | Signed in user ID. | | nickname | Current account nickname. | | faceURL | Current account avatar URL. | | ex | Current account extension string. | | attachedInfo | SDK attached data; parse only an application defined format. | | globalRecvMsgOpt | Global message reception: 0 receive, 1 do not receive, 2 receive without notification. | | addFriendPermission | Add friend permission value defined by the server contract. | The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. getSelfUserInfo is deprecated and is not the recommended API." }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-self-info", + "title": "Update the current user profile", + "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-an-open-channel", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-self-info", + "content": "Set only the fields that must change on UserInfoReq . The SDK omits null fields when serializing the request. UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx mergedExtra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markProfileUpdateSubmitted ; @Override public void onError int code, String error recordProfileUpdateFailure code, error ; , request ; UserInfoReq supports fields such as nickname , faceURL , ex , and addFriendPermission . ex is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. A successful callback means the update request completed. Merge the final profile increment from onSelfInfoUpdated UserInfo info , or query getSelfLocalUserInfo again. Updatable fields | Field | Description | | | | | nickname | New nickname. | | faceURL | New avatar URL. | | ex | Complete extension string. | | addFriendPermission | Add friend permission value. | Send only fields that should change. Although the global message reception setting is also written with setSelfInfo , use the dedicated Set global message reception /sdk/android/user/user profile/set global message reception entry point. This page owns onSelfInfoUpdated . Combine it into the application's single OnUserListener : @Override public void onSelfInfoUpdated UserInfo info currentUserStore.merge info.getUserID , info ;" }, { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", + "description": "Use setSelfInfo() to set the account-wide message reception and notification policy.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-list-of-messages", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", + "content": "Use a separate UserInfoReq for globalRecvMsgOpt so profile updates do not accidentally overwrite the account wide message policy. UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markGlobalReceiveOptionSubmitted ; @Override public void onError int code, String error recordGlobalReceiveOptionFailure code, error ; , request ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages. | | 2 | Receive messages without notifications. | If the product exposes only a global do not disturb switch, it usually toggles between 0 and 2 ; 1 stops message reception and should be presented as a separate option. Per conversation reception is managed by conversation APIs and is not replaced by this setting. A successful callback means the request completed. Reconcile the final account snapshot through onSelfInfoUpdated or getSelfLocalUserInfo . Event handling is documented in Update the current user profile /sdk/android/user/user profile/set self info ." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", + "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-read-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't received a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", + "description": "Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-received-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", + "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed user List snapshot, which can reconcile status by userID after reconnecting or reopening a screen. The query does not trigger onUserStatusChanged . Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of channels with unread messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", + "description": "Use getFriendListPage() to retrieve the current user friend list by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-channels", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friend-list-page", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendListFailure code, error ; , 0, 40, true ; The arguments after the callback are offset , count , and filterBlack . offset starts at 0 , count is the page size, and filterBlack removes blocked users when true . The callback returns the current page as List ; call getFriendInfo on each item for relationship details. Increase offset by the requested item count when loading another page; a page smaller than count normally marks the end. Use the paged API instead of getFriendList . Merge snapshots and increments by userID . Friend profile fields UserInfo is the Android wrapper object. getFriendInfo returns FriendInfo for a friend list item. Common fields are: | Field | Description | | | | | userID | Friend user ID and the stable friend list key. | | nickname | Account nickname of the friend. | | faceURL | Account avatar URL of the friend. | | remark | Friend remark set by the current account. | | ex | Friendship extension string. | | addSource | Source that created the friendship. | | operatorUserID | User ID that created or updated the relationship. | | createTime | Friendship creation time. | nickname and faceURL are account data, while remark and ex belong to the friendship. UpdateFriendsReq can submit isPinned , but the current Android FriendInfo model has no corresponding read field, so pinned state needs application owned storage. Do not use a friend object to overwrite a stranger's PublicUserInfo , or write a friend remark back to the account nickname. This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendInfoChanged FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendDeleted FriendInfo friend friendStore.remove friend.getUserID ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread items. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/search-friends", + "title": "Search friends", + "description": "Use searchFriends() to search the current user friend list.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-items", - "content": "" + "keywords": "sdk android v4 sdk android user friends search-friends", + "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results showFriendSearchResults results ; @Override public void onError int code, String error recordFriendSearchFailure code, error ; , Collections.singletonList keyword.trim , true, true, true ; Pass one non empty value in keywordList . The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. The callback returns List . Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", + "description": "Use getFriendsInfo() to query friendship profiles for specified users.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friends-info", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendInfoFailure code, error ; , Arrays.asList \"user a\", \"user b\" , true ; The second argument is the target user ID list. filterBlack controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns List ; use getFriendInfo for friend remarks and relationship fields, then merge by userID . The result can omit a target that is not a friend or is excluded by filterBlack == true . When the UI also needs account level public data, call Get specified user profiles /sdk/android/user/user profile/get users info and merge the two sources by userID . This query does not trigger friendship callbacks. Use checkFriend /sdk/android/user/friends/check friend when only the relationship state is needed." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in all channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", + "description": "Use checkFriend() to check whether specified users are friends of the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-all-channels", - "content": "" + "keywords": "sdk android v4 sdk android user friends check-friend", + "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations showFriendshipStates relations ; @Override public void onError int code, String error recordFriendshipCheckFailure code, error ; , Arrays.asList \"user a\", \"user b\" ; The callback returns List . Each item's userID identifies the target user. result == 1 means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client side states. This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use getFriendsInfo /sdk/android/user/friends/get friends info when nickname, avatar, or friend remark data is required." }, { - "path": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel an in-progress file upload. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", + "description": "Use updateFriendsReq() to update friend remarks, pinned state, or extension data.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message cancel-an-in-progress-file-upload", - "content": "" + "keywords": "sdk android v4 sdk android user friends update-friends", + "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data markFriendUpdateSubmitted ; @Override public void onError int code, String error recordFriendUpdateFailure code, error ; , request ; UpdateFriendsReq supports friendUserIDs , remark , isPinned , and ex . One call applies the same field value to every target friend. Use separate calls when friends need different values. ex is a complete string. | Field | Description | | | | | friendUserIDs | Friend ID array to update. | | remark | Friend remark for the current account. | | isPinned | Whether to pin the friend. | | ex | Friendship extension string, replaced as a complete value. | A successful callback means the update request completed. Merge the friend increment through onFriendInfoChanged , as documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { - "path": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a critical alert message to iOS device users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", + "description": "Use deleteFriend() to remove one friendship from the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-critical-alert-message-to-ios-device-users", - "content": "" + "keywords": "sdk android v4 sdk android user friends delete-friend", + "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data markFriendDeletionSubmitted friendUserID ; @Override public void onError int code, String error recordFriendDeletionFailure code, error ; , friendUserID ; A successful callback means the delete request completed. Remove the local record by userID after onFriendDeleted arrives. Event handling is documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { - "path": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", + "description": "Use addFriend() to send a friend request to a specified user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications add-friend", + "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data markFriendApplicationSubmitted ; @Override public void onError int code, String error recordFriendApplicationFailure code, error ; , \"user b\", \"Hello, I am Alex\" ; The second argument is the recipient's userID , and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. Merge friend request changes through OnFriendshipListener , as documented in Get received friend requests /sdk/android/user/friend applications/get recv friend application list ." }, { - "path": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send an admin message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", + "description": "Use getRecvFriendApplicationList() to query received friend requests by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-an-admin-message", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-recv-friend-application-list", + "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications replaceReceivedApplications applications ; @Override public void onError int code, String error recordReceivedApplicationFailure code, error ; , request ; offset starts at 0 , and count is the page size. To filter by handling state, use setHandleResults int with values defined by the server contract. The callback returns the current page as List . | Field | Description | | | | | fromUserID / fromNickname / fromFaceURL | Applicant ID, nickname, and avatar snapshot. | | toUserID / toNickname / toFaceURL | Recipient ID, nickname, and avatar snapshot. | | reqMsg | Friend request message. | | handleResult | Handling result: 0 pending, 1 accepted, 2 rejected. | | handlerUserID | User ID that handled the request; it can be empty while pending. | | handleMsg | Handling message. | | handleTime | Handling time; do not treat it as valid while pending. | | createTime | Request creation time. | | ex | Friend request extension string. | Use fromUserID:toUserID as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationAccepted FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationRejected FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationDeleted FriendApplicationInfo application friendApplicationStore.remove application.getFromUserID , application.getToUserID ; Use whether toUserID equals the signed in user ID to route a record to the received or sent list. After an application is accepted, onFriendAdded , owned by Get the friend list by page /sdk/android/user/friends/get friend list page , merges the new friendship." }, { - "path": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Spam flood protection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", + "description": "Use getSendFriendApplicationList() to query sent friend requests by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message spam-flood-protection", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-send-friend-application-list", + "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications replaceSentApplications applications ; @Override public void onError int code, String error recordSentApplicationFailure code, error ; , request ; offset starts at 0 , and count is the page size. The callback returns the current page as List . Merge items by fromUserID:toUserID . This query only establishes a snapshot and does not trigger friend request callbacks. For sent requests, the signed in user is normally fromUserID . The record fields and handling semantics are the same as Get received friend requests /sdk/android/user/friend applications/get recv friend application list : the Android server contract uses 0 for pending, 1 for accepted, and 2 for rejected." }, { - "path": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Track file upload progress using a handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", + "description": "Use acceptFriendApplication() to accept a friend request.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message track-file-upload-progress-using-a-handler", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications accept-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data markApplicationAccepted applicantUserID ; @Override public void onError int code, String error recordApplicationAcceptFailure code, error ; , applicantUserID, \"Accepted\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: onFriendApplicationAccepted updates the application and onFriendAdded updates the friendship." }, { - "path": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translation engine. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", + "description": "Use refuseFriendApplication() to reject a friend request.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translation-engine", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications refuse-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data markApplicationRejected applicantUserID ; @Override public void onError int code, String error recordApplicationRejectFailure code, error ; , applicantUserID, \"Not now\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is handleResult == 2 ." }, { - "path": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List replies in a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", + "description": "Use getBlacklist() to retrieve the current user blacklist.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading list-replies-in-a-message-thread", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist get-blacklist", + "content": "The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. Get the blacklist After SDK initialization and login, call getBlacklist to retrieve the full blacklist for the signed in account. An empty list means no users are blocked. OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users blacklistStore.replace users ; @Override public void onError int code, String error recordBlacklistFailure code, error ; ; The callback returns List ; call UserInfo.getBlackInfo to retrieve the blacklist relationship object. Blacklist record fields Common BlacklistInfo fields are: | Field | Description | | | | | userID | Target user ID blocked by the current user and the stable list key. | | nickname | Target user nickname snapshot. | | faceURL | Target user avatar URL. | | gender | Target user gender value. | | operatorUserID | User ID that performed the block operation. | | createTime | Blacklist relationship creation time. | | addSource | Source that added the blacklist relationship. | | ex | Blacklist relationship extension string. | When the screen also needs friend remarks or the latest public profile, separately merge FriendInfo or PublicUserInfo by userID . Do not treat blacklist fields as friend profile data. Merge blacklist state by userID . This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the Block a user /sdk/android/user/blacklist/add blacklist and Unblock a user /sdk/android/user/blacklist/remove blacklist listener pages." }, { - "path": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migrating to OpenIM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", + "description": "Use addBlacklist() to add a user to the current account blacklist.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android migrating-to-openim", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist add-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data markBlacklistRequestSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistAddFailure code, error ; , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; The second argument is the target userID , and the third argument is optional extension data. Use the overload without ex when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. The blacklist is one way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application level rule. ex is a complete string, so merge application owned fields before updating it. This page owns onBlacklistAdded . Combine it into the application's single OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user blacklistStore.put user.getUserID , user ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification content templates. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", + "description": "Use removeBlacklist() to remove a user from the current account blacklist.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-content-templates", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data markBlacklistRemovalSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistRemovalFailure code, error ; , targetUserID ; A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after onBlacklistDeleted ; if the event is missed, reconcile through Get the blacklist /sdk/android/user/blacklist/get blacklist . This page owns onBlacklistDeleted ; remove the local entry by userID : @Override public void onBlacklistDeleted BlacklistInfo user blacklistStore.remove user.getUserID ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification tester. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", + "description": "Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-tester", - "content": "" + "keywords": "sdk android v4 sdk android conversation overview-conversation", + "content": "A conversation is the chat list state maintained by the signed in account for a one to one or group chat. A ConversationInfo record contains unread count, latest message, pinning, draft, message reception, and extension data. conversationID identifies the account's conversation state; the chat target is the peer userID for a one to one chat or the groupID for a group chat. Group profile, membership, and permissions belong to Group APIs. Use groupID for group operations and conversationID for conversation settings, unread state, drafts, and message cleanup. Conversation identifiers | Identifier | Purpose | | | | | conversationID | Conversation record ID for settings, unread state, and message history. | | userID | Peer user ID in a one to one chat. | | groupID | Group ID for a group chat and Group API target. | | sourceId | Chat target passed to queries and ID resolution: userID for a one to one chat, groupID for a group chat. | Use ConversationType.SINGLE CHAT for one to one chats. For a group chat, use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT according to the group type. Do not construct a conversationID in application code. ConversationInfo | Field | Description | | | | | conversationID / conversationType | Conversation ID and type. | | userID / groupID | Peer user or target group. | | showName / faceURL | Conversation list display name and avatar. | | unreadCount | Unread count for the conversation. | | latestMsg / latestMsgSendTime | Latest message JSON and send time. | | recvMsgOpt / groupAtType | Reception option and group mention state. | | draftText / draftTextTime | Draft and draft update time. | | isPinned | Whether the conversation is pinned. | | isPrivateChat / burnDuration | Burn after reading setting and duration. | | isMsgDestruct / msgDestructTime | Server message destruction configuration. | | ex | Application defined conversation extension string. | State updates Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list owns onNewConversation and onConversationChanged . Track the total unread count /sdk/android/conversation/managing conversations/get total unread count owns onTotalUnreadMessageCountChanged . ConversationManager retains one OnConversationListener ; setOnConversationListener replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages." }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", + "description": "Use getOneConversation() to retrieve one Android conversation by user or group.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", + "content": "Use getOneConversation when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one to one chat and the group ID for a group chat; do not construct ConversationInfo locally when no messages exist yet. OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , targetUserID, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for a group according to its type. The callback returns ConversationInfo . This query does not trigger a conversation listener; Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list merges later changes by conversationID ." }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", + "description": "Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", + "content": "When only the conversation ID is needed, call getConversationIDBySessionType rather than constructing it in application code. String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType targetUserID, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use the group conversation type that matches the target group. This Android API synchronously returns a String conversationID . It does not return ConversationInfo or trigger a conversation listener. Use Open a conversation /sdk/android/conversation/retrieving conversations/get conversation by target when profile data is required." }, { - "path": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark push notifications as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", + "description": "Use getMultipleConversation() to retrieve Android conversations by conversationID.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications marking-push-notifications-as-delivered mark-push-notifications-as-delivered", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", + "content": "Use getMultipleConversation when a set of conversationID values is already available and the latest conversation snapshot is needed. OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; Remove empty and duplicate IDs before calling. The callback returns List . Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener." }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", + "description": "Use getConversationListSplit() to retrieve the current Android account conversation list by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", + "content": "The conversation list belongs to the signed in account. Each ConversationInfo contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non paged getAllConversationList . Retrieve a page OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | Parameter | Type | Description | | | | | | offset | long | Zero based paging offset; reset it to 0 on refresh. | | count | long | Requested number of conversations. | The callback returns the current List page. Advance offset by the requested item count and deduplicate by conversationID . A page smaller than count normally indicates the end; clear paging state and reload from 0 on refresh. Keep the list synchronized getConversationListSplit only creates a snapshot. Combine these callbacks in the application's single OnConversationListener : @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; Both callbacks carry List and must merge idempotently by conversationID . A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined group list for the conversation list." }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", + "description": "Use pinConversation() to set the pinned state of an Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; Pass true to pin and false to unpin. The setting affects only the current account's conversation list. A successful callback does not mean onConversationChanged has arrived; merge the later conversation increment by conversationID ." }, { - "path": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Report a message, user, or channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", + "description": "Use setConversationEx() to set an Android conversation extension string.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report creating-a-report report-a-message-user-or-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", + "content": "ex is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, mergedExtensionJSON ; Reconcile the result through onConversationChanged by conversationID ; listener ownership is documented in Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list ." }, { - "path": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage user metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", + "description": "Use setConversationDraft() to save an Android conversation draft.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user managing-user-metadata manage-user-metadata", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", + "content": "Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; Pass an empty string to clear the draft. Request completion and the later onConversationChanged update are separate; merge draftText and draftTextTime by conversationID , and clear in memory editor state after logout or an account switch." }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of blocked users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", + "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-blocked-users", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages from this conversation or notify. | | 2 | Receive messages from this conversation without notification. | The account default is documented in Set global message reception /sdk/android/user/user profile/set global message reception . Merge the later onConversationChanged result by conversationID ." }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of muted users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", + "description": "Use resetConversationGroupAtType() to reset an Android conversation group mention state.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-muted-users", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", + "content": "After handling group messages that mention the current user, call resetConversationGroupAtType to reset groupAtType to the normal state. OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; This operation only resets the state and must not be used to set atMe or atAll . Group mention state is distinct from message read state. Reconcile the conversation through onConversationChanged ." }, { - "path": "/sdk/android/user/overview-user", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", + "description": "Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user overview-user", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", + "content": "Call messageManager.markConversationMessageAsRead after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; Request completion does not guarantee onConversationChanged has arrived. Merge the current ConversationInfo by conversationID , or re query it when immediate confirmation is required. For one to one chats, the peer can receive OnAdvanceMsgListener.onRecvC2CReadReceipt . Validate sessionType == ConversationType.SINGLE CHAT and a non empty userID , then update message read state from msgIDList . MessageManager retains one advanced message listener and should be configured once in a shared message state layer." }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the latest information on participants. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", + "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-latest-information-on-participants", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", + "content": "getTotalUnreadMsgCount returns the complete unread snapshot for the signed in account. Do not sum unreadCount values from only the currently loaded conversation pages. OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; The callback value is a String ; handle parse failures as an application error rather than treating it as a partial list total. This page owns OnConversationListener.onTotalUnreadMessageCountChanged int count , which updates the application badge after the initial query." }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update user profile. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", + "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information update-user-profile", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; Pass false to disable burn after reading. Set the duration separately with burnDuration ; see Set the burn duration /sdk/android/conversation/managing conversations/set burn duration . This is distinct from scheduled server message deletion. Reconcile the final state through onConversationChanged ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of members and operators in a specific order. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", + "description": "Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-members-and-operators-in-a-specific-order", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration is measured in seconds. Enable or disable burn after reading with isPrivateChat ; do not confuse this value with the scheduled server deletion period msgDestructTime . Merge the updated duration from onConversationChanged ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", + "description": "Use setConversation() to configure scheduled server message deletion for an Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-operators", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", + "content": "isMsgDestruct and msgDestructTime together configure scheduled server message deletion and can be sent in one ConversationReq . ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime is measured in seconds. Set request.setMsgDestruct false to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through onConversationChanged ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", + "description": "Use hideConversation() to hide a conversation entry from the current Android account.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", + "content": "hideConversation hides only the current account's conversation entry. It does not delete a one to one relationship, leave a group, or affect another account. OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later onConversationChanged events idempotently by conversationID ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in an application. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "description": "Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-an-application", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", + "content": "Use deleteConversationAndDeleteAllMsg for a product action such as “delete this chat”. OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through onConversationChanged or a fresh query." }, { - "path": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", + "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-read-in-a-group-channel mark-messages-as-read", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", + "content": "Use messageManager.clearConversationAndDeleteAllMsg for a product action such as “clear chat history”. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from onConversationChanged or a fresh query." }, { "path": "/sdk/flutter/overview", diff --git a/src/lib/client-sdk-commercial.ts b/src/lib/client-sdk-commercial.ts index a748d94002..69f62d5703 100644 --- a/src/lib/client-sdk-commercial.ts +++ b/src/lib/client-sdk-commercial.ts @@ -1,5 +1,6 @@ import flutterAudit from '@/data/structure/flutter-content-audit.json'; import iosAudit from '@/data/structure/ios-content-audit.json'; +import androidAudit from '@/data/structure/android-content-audit.json'; import ownership from '@/data/structure/wasm-api-ownership.json'; type OwnershipEntry = { @@ -9,7 +10,7 @@ type OwnershipEntry = { commercial?: boolean; }; -type NativePlatform = 'flutter' | 'ios'; +type NativePlatform = 'android' | 'flutter' | 'ios'; type ClientSdkAuditPage = { currentPath: string; @@ -36,11 +37,16 @@ const commercialEventNames = new Set( events.filter((entry) => entry.commercial).map((entry) => entry.name), ); const nativeAudits: Record = { + android: androidAudit.pages as ClientSdkAuditPage[], flutter: flutterAudit.pages as ClientSdkAuditPage[], ios: iosAudit.pages as ClientSdkAuditPage[], }; const platformSymbolAliases: Record> = { + android: { + onHangup: 'OnHangUp', + onRecvGroupMessageReadReceipt: 'OnRecvGroupReadReceipt', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -102,6 +108,9 @@ const fullCommercialConceptPages = new Set([ '/sdk/ios/conversation/managing-conversations/set-message-destruct', '/sdk/ios/conversation/managing-conversations/set-message-destruct-time', '/sdk/ios/message/composing-messages/save-local-transcript', + '/sdk/android/conversation/managing-conversations/set-private-chat', + '/sdk/android/conversation/managing-conversations/set-burn-duration', + '/sdk/android/conversation/managing-conversations/set-message-destruct', ]); function applyCommercialConceptOverride( @@ -148,7 +157,7 @@ function parseClientSdkPath( | { platform: 'wasm'; wasmPath: string } | { platform: NativePlatform; wasmPath: string } | undefined { - const match = pagePath.match(/^\/sdk\/(wasm|flutter|ios)(\/.*)$/); + const match = pagePath.match(/^\/sdk\/(android|wasm|flutter|ios)(\/.*)$/); if (!match) return undefined; const platform = match[1] as 'wasm' | NativePlatform; diff --git a/src/lib/client-sdk-publication.ts b/src/lib/client-sdk-publication.ts index cac41c8253..83c31ee0fc 100644 --- a/src/lib/client-sdk-publication.ts +++ b/src/lib/client-sdk-publication.ts @@ -1,3 +1,5 @@ +import androidAuditData from '../../data/structure/android-content-audit.json' with { type: 'json' }; +import androidSidebarData from '../../data/structure/android-sidebar.json' with { type: 'json' }; import flutterAuditData from '../../data/structure/flutter-content-audit.json' with { type: 'json' }; import flutterSidebarData from '../../data/structure/flutter-sidebar.json' with { type: 'json' }; import iosAuditData from '../../data/structure/ios-content-audit.json' with { type: 'json' }; @@ -6,7 +8,7 @@ import wasmAuditData from '../../data/structure/wasm-content-audit.json' with { import wasmSidebarData from '../../data/structure/wasm-sidebar.json' with { type: 'json' }; export type ReviewLocale = 'en' | 'zh'; -export type ClientSdkPlatform = 'flutter' | 'ios' | 'wasm'; +export type ClientSdkPlatform = 'android' | 'flutter' | 'ios' | 'wasm'; type ReviewStatus = | 'deferred' @@ -69,6 +71,10 @@ export function createClientSdkPublicationLookup( } const publicationLookup = createClientSdkPublicationLookup({ + android: { + pages: androidAuditData.pages as ClientSdkAuditPage[], + activePaths: flattenSidebarPaths(androidSidebarData.nodes), + }, flutter: { pages: flutterAuditData.pages as ClientSdkAuditPage[], activePaths: flattenSidebarPaths(flutterSidebarData.nodes), @@ -84,6 +90,7 @@ const publicationLookup = createClientSdkPublicationLookup({ }); const platformNames: Record = { + android: 'Android', flutter: 'Flutter', ios: 'iOS', wasm: 'WASM', diff --git a/src/lib/localized-docs.ts b/src/lib/localized-docs.ts index 9cc312dacb..c2789920b2 100644 --- a/src/lib/localized-docs.ts +++ b/src/lib/localized-docs.ts @@ -2,6 +2,7 @@ import 'server-only'; import { existsSync, readFileSync } from 'node:fs'; import { resolve } from 'node:path'; +import androidSdkData from '@/src/generated/android-sdk-zh-content.json'; import flutterSdkData from '@/src/generated/flutter-sdk-zh-content.json'; import iosSdkData from '@/src/generated/ios-sdk-zh-content.json'; import wasmSdkData from '@/src/generated/wasm-sdk-zh-content.json'; @@ -29,6 +30,7 @@ type LocalizedSdkData = { }; const sdkZhByContext: Record = { + 'chat/sdk/android': androidSdkData as LocalizedSdkData, 'chat/sdk/flutter': flutterSdkData as LocalizedSdkData, 'chat/sdk/ios': iosSdkData as LocalizedSdkData, 'chat/sdk/wasm': wasmSdkData as LocalizedSdkData, From b8b50ed0aaf95921c30cf2fd31fd8e04f9d94240 Mon Sep 17 00:00:00 2001 From: bloomingg <1293499952@qq.com> Date: Mon, 10 Aug 2026 16:03:42 +0800 Subject: [PATCH 2/3] feat: add theme-aware homepage IM visual --- app/globals.css | 136 ++++++---------------- design-qa.md | 36 ++++++ public/brand/openimsdk-im-hero-dark.png | Bin 0 -> 1519663 bytes public/brand/openimsdk-im-hero-light.png | Bin 0 -> 1538017 bytes src/components/mdx/hero-product-image.tsx | 32 +++++ src/components/mdx/landing.tsx | 24 +--- 6 files changed, 107 insertions(+), 121 deletions(-) create mode 100644 design-qa.md create mode 100644 public/brand/openimsdk-im-hero-dark.png create mode 100644 public/brand/openimsdk-im-hero-light.png create mode 100644 src/components/mdx/hero-product-image.tsx diff --git a/app/globals.css b/app/globals.css index 69dc52a147..5611aed3e9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2999,103 +2999,46 @@ html.dark .chat-landing { } .chat-hero-visual { - min-height: 400px; -} - -.visual-window { - position: absolute; - top: 34px; - right: 0; - left: 0; - overflow: hidden; - border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--border)); - border-radius: 19px; - background: color-mix(in srgb, var(--surface) 96%, transparent); - box-shadow: var(--shadow-lg); - transform: perspective(1000px) rotateY(-6deg) rotateX(2deg); -} - -.visual-window-bar { display: flex; + min-height: 430px; align-items: center; - gap: 6px; - height: 39px; - padding: 0 14px; - border-bottom: 1px solid var(--border); - background: var(--surface-soft); -} - -.visual-window-bar i { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--border-strong); -} - -.visual-layout { - display: grid; - grid-template-columns: 112px 1fr; - min-height: 315px; -} - -.visual-sidebar { - display: grid; - align-content: start; - gap: 11px; - padding: 24px 16px; - border-right: 1px solid var(--border); - background: var(--surface-soft); -} - -.visual-sidebar span { - height: 8px; - border-radius: 4px; - background: var(--border-strong); -} - -.visual-sidebar span:nth-child(2) { - width: 70%; -} - -.visual-sidebar span:nth-child(3) { - width: 84%; - background: color-mix(in srgb, var(--accent) 45%, var(--border)); + justify-content: center; } -.visual-thread { - display: flex; - flex-direction: column; - gap: 14px; - padding: 34px 31px 25px; +.chat-hero-product-image { + display: block; + width: min(100%, 590px); + height: auto; + border-radius: 26px; + box-shadow: + 0 36px 90px rgb(52 57 125 / 0.18), + 0 12px 34px rgb(65 53 126 / 0.1); + transform: translateY(2px); + animation: hero-product-enter 700ms cubic-bezier(0.22, 1, 0.36, 1) both; } -.visual-message { - width: 78%; - height: 52px; - border: 1px solid var(--border); - border-radius: 5px 15px 15px 15px; - background: var(--surface-soft); +html.dark .chat-hero-product-image { + box-shadow: + 0 38px 100px rgb(0 0 0 / 0.36), + 0 12px 36px rgb(31 27 74 / 0.28); } -.visual-message.is-accent { - align-self: flex-end; - width: 65%; - border-color: color-mix(in srgb, var(--accent) 45%, var(--border)); - border-radius: 15px 5px 15px 15px; - background: var(--accent-soft); -} +@keyframes hero-product-enter { + from { + opacity: 0; + transform: translateY(20px) scale(0.985); + } -.visual-message.is-short { - width: 48%; - height: 43px; + to { + opacity: 1; + transform: translateY(2px) scale(1); + } } -.visual-composer { - height: 43px; - margin-top: auto; - border: 1px solid var(--border); - border-radius: 10px; - background: var(--surface); +@media (prefers-reduced-motion: reduce) { + .chat-hero-product-image { + animation: none; + } } .landing-section { @@ -4329,7 +4272,7 @@ html.dark .guide-markdown a { } .chat-hero-visual { - min-height: 350px; + min-height: 405px; } .docs-home-section { @@ -4494,16 +4437,11 @@ html.dark .guide-markdown a { } .chat-hero-visual { - min-height: 280px; - } - - .visual-layout { - grid-template-columns: 75px 1fr; - min-height: 245px; + min-height: 350px; } - .visual-thread { - padding: 22px 17px 17px; + .chat-hero-product-image { + width: min(100%, 560px); } .docs-home-section { @@ -4553,10 +4491,6 @@ html.dark .guide-markdown a { text-align: left; } - .visual-window { - top: 10px; - } - .landing-section { width: min(100% - 36px, 1180px); padding-top: 62px; @@ -4571,6 +4505,10 @@ html.dark .guide-markdown a { .primary-nav { display: none; } + + .chat-hero-visual { + min-height: 300px; + } } @media (prefers-reduced-motion: reduce) { diff --git a/design-qa.md b/design-qa.md new file mode 100644 index 0000000000..5fcb188c0d --- /dev/null +++ b/design-qa.md @@ -0,0 +1,36 @@ +# Homepage hero design QA + +## Source and implementation + +- Source reference: `/var/folders/xx/zjxj2dw143xfd4xd1jf152b40000gn/T/codex-clipboard-40387acb-99a5-4ffa-b2e4-295b6e04d5e1.png` +- Source dimensions: 1448 × 1086 px +- Final light asset: `/Volumes/workspace/work/openim-chat-docs-next/public/brand/openimsdk-im-hero-light.png` +- Final dark asset: `/Volumes/workspace/work/openim-chat-docs-next/public/brand/openimsdk-im-hero-dark.png` +- Final asset dimensions: 1448 × 1086 px each +- Light implementation screenshot: `/tmp/openim-home-theme-light-final.png` +- Dark implementation screenshot: `/tmp/openim-home-theme-dark.png` +- Verification viewport: 761 × 830 px for the responsive theme-switch check; the 1280 × 720 px desktop composition was retained from the prior comparison +- Verified state: Chinese homepage in both light and dark themes + +## Comparison + +The source and implementation were reviewed together at full-view and focused-view scales. Both theme assets preserve the same hierarchy: a dominant desktop IM client, an overlapping mobile client, a theme-appropriate product backdrop, and restrained capability labels. The images fit the existing hero slot without cropping and keep the heading and primary actions visually dominant. + +## Findings and iteration history + +1. Replaced the compact code-drawn chat window with a high-fidelity product image so message content remains legible and the composition reads as a real cross-platform IM product. +2. Matched the source's desktop/phone overlap, three-column desktop layout, conversation density, shared file, image message, voice message, read receipts, and cross-device sync cues. +3. Removed potentially misleading terminology from the generated visual: `Groups & Channels` became `Group Chats`, and `End-to-End Encryption` became `Rich Messages`. +4. Replaced the lock beside `Rich Messages` with a layered image-and-text content-card icon so the label no longer implies encryption. +5. Added a dedicated dark image with dark desktop and mobile clients, dark capability cards, a deep navy backdrop, and preserved content and geometry. The implementation switches source assets with the site theme instead of applying a brightness filter. +6. Kept both images face-on, centered, and padded rather than using the previous perspective tilt, which better matches the supplied marketing reference. +7. Confirmed there are no visible clipping, overflow, alignment, contrast, hydration, console, or loading issues when switching between themes. + +## Severity review + +- P0: none +- P1: none +- P2: none +- P3: small interface labels intentionally become secondary at the homepage display size; the desktop/mobile composition and capability cues remain clear. + +final result: passed diff --git a/public/brand/openimsdk-im-hero-dark.png b/public/brand/openimsdk-im-hero-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3150e71d592daa1f903f250f154e44a072a0d6d7 GIT binary patch literal 1519663 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%0D(j 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

=% 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Ɣ*2nT0<&zA}I9aKi$J()wg8tsexXPm?piWaJuH+nYH#~IB1d-1$%Qj5h@a>v?==F?r}2@-#IOfoCg+zi}>*Z zR!S*?OxWX&&nzb+C+auEn+C$J0Y2IO9BmQ zOd@A9=t@NHX?+QFus-h)=1(azXbR=tB|o<-&a}9;h~l9Os~JK$E}&#o>mlKN=aAG( zo_%-UexZL4brsRfbFp}@#xIl(#qYbgoMBTmvue*%uq;6+NuM`Lg=P_fRNlMUfvIX> z#UriTq?}QJn`joCI?Htc+Dq#sz|*HXCkMXw?)mN=yNl=G9MPPaIYhtg*14_w5aYV#H9VSFpU;Fm zjh+P2PTzTi*Imoi*tJ5qQXrj0-LtL?R9_VHlxs{7NexB%MuKR@lDW7OB1bydRc*!M z9bG9S&@U>-_KxAZyo|Wtl0z{kZA@_S4=(xDIeo0wtC!EUKOP=%(Hy^*RtiQgfS$1lJ6c+B8l5BUOt&brHk?Ip&A836}2FBS<9|x&dgyJo0Ix zWiLh;1<6wBCYk?`sr6%!cDEd7nilN${hYdKU5p7&zf>eHK6L z&ZIii2u+8CrtyuceV^+XJIEhLZ39^*jg*h%8z~rV%4f82K0Ai0Vq@q@a@7@_PwuQf znt-{biUP9AvP>HGuVY!+mpvjPCGqC|F%D!aRYjQvNr*~?T@Tk9Xv(hv^)9yeWp=rz z=PG)7(5^?7gXg*`TGr-EtHY%XK7bZyOQstEH%?xh@SGL6dnh3~vC;!=Zgya(_LxhS z-tRluE6Ktodc)%|+m`cs9GwN6#2FaH>vnzBsae*5<7mbjS>_5fk#khg((yC=j%t5b zcP@N$Cp)neP@83V{9Sk*kpvBg)=vI}LB)<7(_!qyn#-&`Br9f!jAE9}z;#cLVfO(< zXtjP;@G`jpr=8`Qpp3x`G$XZM6n;3y#V6eE?8Xe+i{)Q$(@E5hRxOl9plv`s^Y}9io{lF5WldBjy+TP z#QJAuQ;WOWe4WZx2D#vJpR}CGma$-r&9>Mc8TuvU*7?Y?r}a;WlNi}&8cLvXfQv|^)ry2Yq(43<5M0O6M0bM-5Ll>m=bw(<{G-pkQZ7T+wMbfz`t0m7$MYh9KChu@UtAsS(MrDHW3PyB6|UOrVAJ z3DQ$#@L}0j*_oiy=I4d_@NDi`#DIIbMrDvw6~%L@FEE?sFW)nP5jM*qj+yWL>@bPR z7%W{l79;^^j-BvmJ!W3(2~jKI>eRN!r6)$L=Yji^IYa(^zbP7bV(67zvHit1@u ztFYE%w0GP&R-{EaB{m~LFV?jc37XCMvhjoh0K%WXL@JmBr)y`q5}$v;cD0v1i=Dgl z7Yj-^ZA>8jp3CY-pqoq;D+^A+ZMC+y1Y(f53LgbGQ4<7j+8gDxT>b^C=qMfOCD3a> z(yR~Q#s9G$n#jmtx-OxyZK6x*IOJS;Q&7iSBI-uU+{};(C7y_;-yr-2^tYHp95Za``!iPjeYA8 zWA5;zT!aJEjwg&R`Kw-LPY#Pcdqa=35%imtIpuf>w?lR8JJU4!@EmQ9cudFriiAyQ ziX;`et|_9*2Q$0H4_+bfnpeC}6BwqjOsIPJQ&dYb>fK<(2jSk{eINg5I?a&*l1-?< zZDmkis$ zMc0`8c}MQ>>8bzAiHsxby*Yz~t8ayBF^{@snKGQR*&qhiYSP3A_P(%8b{uJs_pz$t zF}C|+VtUV}U*05ee@ZkfUgqdv^%AH)?!Y?uHQ)zD>)6x6^q9idpm`PGzv?_3F=qTi z8J+S*Y{Be>ud&bs=MG!FYx+2?36x=23ZD@y!=yv0jV2FBnT^`C|9aj9Qjk1pOk@G` zgPqNq2oI7cESAbtYh7!Exa4JF)r2zA2n}ev; zsBv{Nk1Oo7+90~5;@@CGvsIkdjy2EKtunDf@)by06ieQ5`pW}t$Pz%L`e^Js))HxDtKMtYgkNklEtNSAP`e@Ue3ZzLU~gXp@y+rlAi zGkw{rC)$c1&9GOSb=yOAE130<*=}J-T!-+&I{?3%<0)}6iqCp)t8hE1!3z~c7Fulw z(TF4u_<2=0ew0@Z9YkP@lYL4sc>1Kmkra@EjCMr@iTU_J*x?x#k<7!S7aJ5>v}yg_ zV|X(YaNaQp5?6VH5{b$5F@ujs>gyVC)1h8K^&+7krrWXu_41fjk*Xf+xoVC;71HE? z&eUWWfM07VE7BSK1$Vgv0MvbAq*Q)+J~*eh)sS8uqBHMX*eXc7R0ec3CxU$OeS{IMnSXO?Pg>GhY7ghZR+WgvNFsLKL~ zSY{2dyL}6$q4J`tc~yVu%mHxY^0KKxNDg44C6qDuL{H|eq&*GYdS=HFpU^YcPpCh0 zLytiwa>y|lT31%(4uaZ)x=l=^KwBt$P`s%+*RZW32BkuHYg1rWC-YR=&SkW zyaeYyy3lz{J6ekd`2?xa0+sY?mxS5?D&6uGh}4VpM~zNO8#&lmwj~~|xHy-H3t2!p zb><}}V_oj_EQfyY`cgIaZ{UYlT*@5S_eruWXI@3c0-mM;nM0qb5_wJ$RM~`xDLJbk zei$5D!Ams;LV4X})iuf(>JULPT;s$#->treJzBHNON07tEv?5~pqiU*J#)-c7VUHX+b(eP z&>-L?Y0y{MOTXrES3J!&9!2+GWiWI^WR$HSJlH(37;v&b zVxN)&K>n(|6Oa3OmfJ1J&*S#uo(Y4AXyxPWyPBInN_ths=3LEG15+EzVnY`gE1I=f zJRduWlv|p9TW}~p_E%;WNh3Uir9q9R_3uh*1hi$FpT~h6ZT0)AEH);pC1b0|v!<9A zqg?(|b{kj{HC1?~xudT@AkuBt!Dv%k-H^}veBhQFnewzZF zDOY;G=J%UZ_yXVA5h(Ir+6XDlVr016Mw4JDXRsbZ+5a8M=k>$Uzlf>TZdk*-tqsyA z^BL3(D$&#ewsIjkAKsbwnjltW$`sGru;45CH1W+O^^^?b;0mW|bX)G?hL#RA#}sYy zak9Wmh00Wh@SE1;QG_ z?&GM1OZ)HF4W|39rm+h)LK8fFax$lWo~3tbN_fR@aZ~jAGS+B*vOhLmPiq z1@lOZj-#-#f6bLo`P@-E(;9ICGw1A6v)q~d46p6A0pE}yaH#DTBq&QKo;Uw;790gn zn?-OPz~g&1=*2?0Kkk347&(COj3b%iFh9*6qXM~r46?Og%$w9}Y&7x3_94gA`0GoU zj)wXUhhs1<^dK9sUasDcT&kIGy(STy&V|=jSghmN5MJoeh{5~N!UVWNaUygqPEZQf zlWs+Nuvi$U55@wt&D64&@jg>5d$^u_;8*fGtc~6`1W-1$dcLA^BlnnMC17ojSDO#^ zu$Ji#OxUg*Q7{+n%r6w?5!7q>T9QoVWMo91_T`zJeUVvA zv$!Xm4JD{c3{JK@gXNL~T=Nkkj-vcU4eSURe=u7}EDSDtT$U61Nd-2W^e7UkymKP% z^?H{a^?Hgnw(Gg~Eyef~E7lSN18M{Q6%#L^M2pF49@xmQ76j1O+FORq>86YnXOPSM zmRT(8!j_>p{*CHwP|2}kU9F9kbq0Q6@iN4{MiW&iToNcB^!7waM{CZ!azlH1`ThwS z+bm~@jx$eEjD^OjJEWMkZM%HwOml=5J58M5!|)v!^jD=)iz!$kbab?0YO7f*@6p#D z*O22?-r<-N$|oG^JrDbq?b974d2mlM8w6N*E<%v}HPUMB@&a zcJG;nZE#eUNZ_6AsOIp(`FLojH!qn!TLGV;VOFq*L6i&F?-*Rr>mRgXaqbnwQX6$e zs;cr+uPf{jT6r!ATB9r@0--g{zGpwm8wih5slwu9ra*N&arPz`_Yo4}<4ArMyT%d` zInyyIk#8s#N&;@XuOUnS{Yd>q^2-?2iVCT%g@8)GDC%A zkc?Y0zZZ=3)+KkDgfyIPb^v;R&G@hu*kOY5$3_f9${Q)P3Nd6l{f+K3@s=}2f(jmC zo@J|_tYB-Ou8PoO7_*$2^h14${5jrpWi}Gx5ZW;UYh!u+(zXUr?@(<{uKk`T1F`bf zTL#3lWVi1>7QOQwkqMAIpO#`dRx`sK8jWrYbB&5NbO>qF=wY!}1{PN-qXCjdHO*?r zjhZa=zOl{v!3(EDW6~3;&RT5{OQ`N)8I*XffEe_^AP zlLM$mORc_2LXnnN8T*`w#S1gOI~-+{DgY1_F0Ub|eIw&k94Ehk)Os8O$g|SWpczT( zs1y&>S@A5jVdgcrHP;4Qm|Q?-^-vycjOKEb9CwPn`S+4oe>a8^9y7NyYFE zt2fh)Q4CC2-P{D*_+Kkv?I7aJ%3`*8+!y3kvY_ZV@_9c(YFg+th#{}?r&&#y(u>7n ziQBvX&6f(U?fUJI{=$qdik`(@fdTrjha&V!~ks z9C;4<^t6EtAjh{Pk(vj?&qdmJSCG;Ip+Jw?jVK5y+UBn5ewn?|LkYw6BELDL)SG{h+LY{*;TCN6+Bj? zZu5oL2w{BE!LMiH5`-qhKxh+<%ms3llR!<>pra?u_8sQNkG8oYHQxe$B{fJC9jl~t zCXS!-KQq*Uq%Jk;eXWGUD_g3%dDS);4cF58d0eaC%f7FbU23rl>?X$vB98?N)Vd^T zzEuPLyQBv<-eJ|C2S6mjsHmmyBB1mXsHxk)hElcUXp37f^eM6|rwB;7AO`=(%IvOYbAM3Sxc# zZb;ZaFJW$ufqg-(F+hpKj_1?D8Y+YNLmQGs$h}@SD3ub4JAq|4=_NVq8u*@kH699S zzmV_vg1mo=vxr*M`Z&S2nmC!j$n!S!f{gie2yCmp5o25oPHi@*FTE^n4S**&=$sU(A_hi`yQJcKn=!;px0x;G(EqI&gDrSeX^-fbGCqai z*+by==h1zQ)i`<#3hfHr3sWF(fyDz>;pZu!%<%G^$&iB>Rdc?Q?_3tC=9L_ke1No; zeZ+_7RufV;GRQVHyhUB&aRF?Uck8J2D}yxG;$6-V=gZqFG8|FOK=n@M!(`UU3&=EaBt8DU>pzL**7R;ALkClEAZ%s?x-Vj|Rh zx5pfhmM6gx3Ck%%aS`))5t8ek0%83iCbzw3COm0mKFz-XHh()eQKQ(=C26qrKKhIY zEqcPGmYVx3aM)AIE|Ir!TP)AeEDo+)JexaOC@;5BN=f&SlmoPSuGa0-y7h=UD3QDV z8}Gmb>b3+bsR;bQ7UEAP{%&>T=ZVZ@@3(blY~>}V?mU-=YS=J8SNWc}T zlY6cgNtm7N4z;I1%dUs?EcvX!9h;!e?`v5vlwM26qY*!~bf6eP@Z9^8kgoSER(zg4 z)Sb)eU}K)@T^u^;%}y*FPsGmn;9iegU-{sqinDAsN!c@tT6mbC=5)`t74)}m_hRI{SZf-M}Vy%AZ5~CE_X;D9MVyL&b#^PiF`W||r9KIC{ zB#bLj$M2BZmD`i(L@mhys`7rJV;Ix$yAY>s+DKG;*aFhEO}dCeZ%I)1(yiBXEahRE z62}TT@u|lswVu>UPIiP1V+q8VA3JVMP>k|zUvI3&Q1h)&EmM#mW;c`9l*P809Fa!>yG(fs}OyB#8v_DssH2mtu-!KpjuVe`0}%J8349l@^8 zSMJ@LzUzLp{`^7>W*{@i*;K#wILzKNYuDIjx>Y59jF(WFv*Sxrfrtg~F+yLm0#*B% zsYpJtaAdkQ1K58YH)dcq1i$eypAxLoT!ojvc|J#nl60#NugK7v!?ojj9?#?3u*ZMq z3ND=X^6Bgi%g z{a@#={o6}^&f(#?yt9v8Us>UWOc>^TZgidc0p^sN&k#W8%$IYC4O9ZsGO>)tJ>hd| zMC9GjnmJ~g2{&Vq9R&5!awh#%@p7n<%!LojQQu*fIr@)IZm&suZl5j0b6Dr|IqTFL zt}djp9DOiv&)s#r%rXfbB?t40C$hu{=PT*3voIMUD-?s^y@p}0G&0KnWqn4Iy^XJsWw5xLom@Q6=@9GiTnX%uez?HNm--RAY@qG z%8Vq3d)yhF58492TR$YK4tq0EEg5HZM99!jxZ^xF^W-qFFS!$THt`vNoxK*oYA}P( zF2uUGZK@>GLwc{CZi>ffZ)`rA;j*1|S(gk`onojL75p_E@-7V{$qMIjQTUcC7GlKu zHyS_Tl=ERe;NXr<9WI^iOIz|7v2L*TONq}^{vyHRIUjzmI#<;yd2u@t;T zmUK7wTS)IZm#Mze>!b+*u_qEes*cIe{x@Er(qq#u#Pt>AhF*^5T9KyK4OE8;bo3`xTo5$wZK;r{&|4joT1b~6wv$`XlMBk&jkA0# zGB$M+!erCsDxOYh>VbD>6H-x2yw@o*9Bi|cxI#JW7>>#VAF^>ML?YQ(-e=J(#Sb@Rbi--=$tgGy0ZmEJ& zP!--P(bRQh_zzdru&RJ#9kqN3*Ck-z9*apKZdoDf=l=B<&WE>d0Y8;^?yKkw=kSW*qK!St_JBbh96H` zf2#0JzD%>YRI@LS*js?tCjE2o=htuY=jV6*{QOW;zWjNg2#`L$N!!Ohxwq#%F*OO_ zR{L?z8ZkC5oGqNqUsZV>G3jiXQ{a7 zLZ18i`T48r#|(8fk%mKfRtc#uczC7l+Y!2m&Ilg>@ABCWU+4T>enPKc`?fRyD+ZKt>}td* z#XXGb-wez*v18^xe$LNA$~DQ;c>CI1zv`U z;~#(f+ut}Nk%LwBuJU>-&`U;IEr<_((TJ2Zvv5)Y830uu{;FysEc1TDM}Ml0JLUV? zUvszzjV_j&E4vuOp2-*t?MSVzc}+L+PiSV|s4P$G`BUSn1hhlkLbGjwTRz81%iyro zy+?upcvk}?E!?_QIOlUd=da)Yul{CEP}1NkQ+eG(H@<%m9Z7WotRZ%R;CGrlH^}|( zy9hV=d8*g7CA9Y~`x07w#<=;8_SLjZvYC>c#|0ZlBbg0A;&bZOFP?L7>;EXdlO{_Q z%vfc@3PHqVyKi~Jp}hyoJ*sbG@a)HAn#lUQ^+d~9zAczrtg-4PoyYuaP=h;+>2e0@ z@!AM{fjuYQ*1za~-MSy1L*DxD_vZ$*#^Eqyt_jqvdSP)(wNEqT!j6Y|uMB3QqFYk;?0mcP-Pu^vKEK9Aj2ed4*Co*Myk84TE z%-R8SEG24a0B2SGI_IEn{RfI^2(3(h{QpapnJzFVGrpC|0H?~uHNVPzhHgDXBu}lYr~A$BVHbFIp&@zxdmuvbStp-J^A&UHj5>Gn7$bBu{h$ypShRlyzTW1o=tbG z$poN51{B0JE2rC%?dX>r^H*pFF_+oaOPY zlKI9%t1{(E7@gZLch2W!63OUOR$-1E#@D|+{6+HK-~Acg5jub{<(UUw-l<{1)t=)s zKhBkzfM|wQHtv0=GsXlVQWjqv)IeELgh6*~Ph>j!i$C!_laaW!xl)H;S8ktpuivZdyvnG(c_v3xg zMvXFLSR*<+M=WCnvRYS5-Y`Qj>u2tqsKmU)HC+Qp{G7az2X*VO-}v?U@Bhbt{*V9u zpa0`O{{Hu0fBW_8SK?s_-+DJoeecPoF&37{xR~~1PftX#j@8Lq!1>kaK!99aZQU^; zB2@B;!m_gFVf^YF+7=Z)U4#DrA9khcw>vO6{ za81HUVdbFE+v7o7R^7kD-9azYFYhT|5SJ z9Sq7b?5|g*iZ2VD_Te=T$6aqXZw5ep;_$q!dG<9EtfRj zxm$w^rNxY9%=QCw6xo}l_*O<;uKV$?kNbMC^|5XUq&0Q!Ra*?V>T#{*rM~Z~jr{vR zDXDKfHI?E1cxRNlc?hcSbu)qyapawNvO*%pC{{6b&D$lxE5BQv+J9PLo;z>0=aK6> zZw!#sRu#qeoN?mOr&^{sBk-kt!F@psVlH#f+-oED$ky{+=CkV57L+J)sy{Z64JB2q zx&{7*9l?3&mc=sUFWaqI!ux+RB4Mt+v7_F<{dMih>Cl!zsAg)VG!^$vBdYJ!YzY~ZWZb#mAp!+>oN27hJr>8=;BbSd4p!E8zbahH}Mc8QbovR)fg(CkGb={ zrNIfAqhihyd&H>2bUDM2-gLv%7(GF6HoT;oiUHJy{C`vSZ?W2TYnl*r-Q%6}+x*+L zt6H_`>ejAqVz+b$8WL2DA+0D01cMPcM57516F4y*d7#D<)I(#42OOA?khlS3Akl~s zNYgYO0}?=X4R%$tdey46{Wsrk&Uf4%+}Cy8_ju?0SCz9?egB;A`#fXZ+w0zp@r+0N zBFm2J1s!|uoF*UzMx5$9qDc$9y9r2jG=Sb8QxY`w!F@YV;7(U~_9k7KqYX-ck$H!a zQ_GTREA(%fvyj_ZljFq$a(5eapn4y?Z*fb^$U8^5>zpHr+4?a0+V;A17dcA9ewtZ0 zQt45Q-z6qtXn5z~68|H!NXTl#fsrO2;KAH7g0}$H>7@DQO!@9qG>wDk+?&qJqet8%9czt|$`}J2J9zHyLc)0GZ z#^g;8g4u=5Gu-qYF=y_VZ<0FTFmh%IpBq{LAi6Dh$fOmW&&o{Gj~m-)#|QJmXTFGI z-jVOvFj7fXV6y1UTQ>?BLixZG8b>bg=-S`dRE_{VN6DvuL|+;DuAAX-{XRH^4B2B@ z&^MH}(PfBBk4Uj{6YOwA7kYJzR?bUN{PzybYBRbfBm(g#@v8TUf(W zom3Pl&jb$`^`^uPp}5hlEYEh7W3V`?U+)B-+A@hl7>B#f=*9bVjKZ0!IHdC0!&N;G z+PwdOpRrA2s<8Ft0ne%O_^-tlhav0RY)GdJ+8X=eHMGS78ROKQW8MRPCc+#Vl6g(o zYwy!~h5qV#_(aVkR>b+q4f;fRx8EliQ${BO+_VPjnrQ-brZCrY|O_hG_`@c>|NT_Vv`ixkgzOWvn~+|~I7S|3;q5u0_=f2>hc>gdKLyyzAFQiQd7B*!_wCbJdxmXR##sH|A;{A)1iF0M z?`Gn2QAcj#96!)SZj%x@I&tFi={OeP`KNE9&~850<`BQ@XUuX$!ie#gwj4c;5DIPe z4HZ*NbvLf9qoJsI3qeXA%*DanSW7RU>HJA%@eOhq|35r$I(*_}*1u}tW04|9x?3lI zap-xZMfh{g$Q-?0a&(tllzKdn>QM3D%CYcBa&QBo&!;+oY{fzyr4^UU{fn0`Ucdb0 z^I!koMtt#$FMs@#pS^wiz7B`ltVov^6m#>4)GChPMOr9Tg!>>Q$Y42Ejt8+ZYCPuh zzP@$qHCZ+zfYAu4u@-WJy?|M`P1o&6btJTl!l}LqudnkXMr`SYxVZTbdssrmf;skB0 zcds81ESUt5df(in#INpXTNBTasMT#Qy^DrB7}2VR-)vsYtXY7iG{pGRDB0FMn*~LD zCidR$OEn~FAoqA0UG)vdN3-MTx?HVI_2Im0EiIb>Ut{gt^&nx1dyf}Vc3Mz9L`!q@ zv`3dA-P=n=kupS`Mx&lcq7-hB1NFW$U)^Wnq$>-9rkX**Pp5Zq~tW9|+9!E2)m;At~u z1{&PlWU3n707XE$zhGcB`wrd%&KnJ%jHw$5iMO8&t`UP}eW*QmP3)BF&DHjsX+?vu zo6Cm|Ce6pCjxfId87eVten`bTep@iNqWK1ixxamLWe2}egx)eVD(VqA(elkFx7?EU zWbCl@KbbYgCD|h-peI}N%)1p!yV6GVlYTQM&6&plXAg05f`gg!u6Qc{j_bCo9G6e- zp0N9L_8XJF(PfY@_Ng}?zmG=7WW8_fxcQ7@oFj(g z)6LY+R@cu6L3BL(rNFBvd+w+0JO(2-RE3PGS74r_WpeQib<(pp^q78x_^AYLNLr_A zPRR}zN1NhPG2PJkjJieP)6aj2Z8m(IzW$U%sNm4`C%de!&BbhV9wQnqM_1rUG`KB( z{YPhz(@x|Y&%`1PoZ~NF-t?TmeZ$Y$Y@1ht=O zy60GH3_DW$GqUD!<*oJgP3PdZEh ztvdfAp<=mM$lUE5n2YZn!PVngemr4TI&gI}4BypN^kD<(e56jN&WO~bA1cR8L+E)c zgUjfBPQtW@0;*nJMut{)L%;b{?7^kNeMJb@>RKR_Y+H=BKX2$zzeD@FXxR0Z!ws#q zhfZdh17=bq?makJFmJZILzm*iMj>>9&Xwuj(OpT;FfS`*U7jgz}+`` zm_zS@Jp-rfVA)CUl5{qz;a!wOp^#dYDFs7jL{bA0>-DcgbyT;Ss4T5D*;C=#)yf`` zEeS(9jCa|LyVz%iYEh8|ZPdwOWbFqdhZvUQJW%E&zcrVwo(u$dvVDkD_$MMCA78%u z`>%ho_hYO(Aa%B_yR|(mk1EdI2%N}zjZJ3uJFdvNREV}$%hMJwD{{OsFqDHY z0?~ooWB>rx!sFxR#r^lc|Eu5o?Bo6L?#nNK{?%7synp{;Ywu0Wb-DwRp9TDLK44yR z1~;R5k25fA$~vFUbp{ceRO;`W>tX)Kt#Mp?%=IMX*?o^-_k@ti?`=MD8ss;mJbksB z;e%}Xk2A98Qx=hCtZZkS*9<0~ifdkfaPZtzGY1%5rEet6cg(A%Ksssprc&`7HimnQ zkxn86Cc5aL^Je*^N9j%_fZmLhWBAM)5e`0@gnUZh&5T3~U2Bk&dngMavtXzhUMeqxX`Stf`k7 z7!G$mtF?)wH^EHf+?wumrMV?x5GDv8!%P*Q|Ij`TD0!MQKl!=w==ek2TOS(Lk^b}W zU0?pRLVq&vlg6;9K}NGV zmOjV5CB%Hnmy`5U^*7KqP_YLdtoOYMXU4}gK&NEN2X4aHbI3W0>?Z{1&l`~+##g@| zXn6w@QzmC;>7eHc8E($pkaTic*Gv0j%x^HWi2%*Yt!jok#;W#VKF>rZ(vWk&gN9?m zTQ9Njp4!3)1To}*^Cym3=lw@%(`adwm{gv;pFB)*{Bz{~K!+ahK4}S#Vt8MHTBD7Z zFJ67}>8GE6{+&nM|K1OO{Ij2Z5o^U|o%Lt=9!v4eO?xs(X#C_WQ*8V{V36@4URj(m4SM(NIk2bn#vi`#LeO-4i z*WLZY+pl6>(9ixr>tND)rdG6thwAAFx8#F^{-OD)@9rMJqXAwcZ!ZHoHGvIO>aKX*X=v_p48VXsb-`Eu~~${W`slYWGu4@)k(5 zp?IeYYXcN4d|9iU#Z3U(*5#p@VTmfFk&iCdX8{%?B~Ax;f_wU~AeMPTYRS)#=O#N~b0-k=J z&whP;d=5M^o_KQU^H+XTW&Hf7&tLLQYui2DH;((v9f?C0(-D5jz(a*Wt#k zzVU)ze$DMqr{4L?KmP;g?TkB)&ySDJvA^->nWgz72#Bs0$TPg>u)XLZ^2z7^=;%v7 z`_ob7dHP23d}9sA4Y$I4!tc{;X@2wU%zro|`lUZlP~nMGzp=gdOtpD?GC3n;`;jP~w-scxM*} zJ?#O1Sc_7Q`*gBflX?zcztP*iak_6%)o|@w+P}Fk{X{I^=udI`@vTqXGJUKJ3<#Q1 zcy>YH5Bu}Y2=fPo(Zmy_=ionp33aD+9uoKi!uri@M}(dNxxM8XZT%A9>oI@HkN}+C zo1QKbaP!GG{QN=d8#rlyf{IP-`1!+N`Y*>*&GxKJZ~ALD6n+y4H&gxpVVEZ4m+Y_` zBmdH&^v|u6{qkTE&s;Dg^X>Eq|}O zm+Nx>@b2q~-e@EI+hYR-n&w80(U{SsU9OH6%rTCO(~-T8Lim7C$$9b0zE{%LIBSjR zXgZYMtWr%X5<3!EFAe0o2Gut4u&n1x_mDzmz_mvs?q0r*wLZN0D%M3dQ1YhP1&u!Z zgxx_*T^VZ>X=&B7n6-r4Hh_>FjKJG3KVjb@hcLq3rBg2)|4vzgpAXZUkie@(xPl68 z9%L}vY_PkF%lRPdjERJHaS9#X*pVF27$wcJbuggYZZ!8*v z%wcPiBB$gVQAgwUkGpeOPq8?d@W7GmOJaDm#Q`cYwG0#yY{<6ObvQxDOLUk@{bwy{ z!3v=ifXKZ+{nqDy?AN~^`@>Iv^!s0a^~Lpig}19|&-tA6A%ZQ*K| z)utFfNlrmzQ~Aw58s(Q~`rXqaZXe(R&pYzXF&ufcL5Q&N`E9}xw^F#F=^L`Xxcxq! zWq%0g7)c@HN%(%Q5cCJyc!U(Ne&fX_3P1fE&+i*JmM{J7;MBH3k;N0fpU?aHtI_`A zhXyBOmRuMkkmxv^%mEq*_(TkCy^FzKXNg7=Jm3t^Sl~?{%0;M?TFo=*7#k z`6tdANuP04Qgk~GPOm(jTk0BO58ZIM<=9M@gZLU@`O)7&ugol^86^ zm8}_I{u#)8-i+I2hPk#hp15Q@d$Z;kZSwiu6JA;@IbGmpv2sX+gEGV9mp3{;|DYmy zG?i|-`FUoIk}%vB-oQArh((@n%q&haNOjFC<}i@xC*upiR``Ah_x0NBRF9iozc+s-cwln1y>QhTbn z0q`3EjX)+t?O2aNZhg8mw45SNnAP(=@ELopUeAK!6)`0)Ut)8K%2WhhUM`{}%%Z+oQb&>J|^o z{S!OA@uBGdK8Kvm?%X=o}!1m9z!Jr+!wXan(#a5=ku?_dlSJ8W4XIk0TIRXZ8{iDh5)(DT9y8MN1_Q{6Ta4aGRF5cy4B#kC1~Ns5 zjdVP68O}#%oD0pTirR`stVr;T4_#B!kyOvX&yFWYT&t1+j+;K?GgxnDti}32LdW@{ zjf^&%0CMk;?x_w*{TAlBXQ5g>4UW@NdgcbBx-3+t*Z&rf-Iqf0e4xW14#O%F-x7sq zj{&_iGBi0d4>d=J=qYy{*kWZ0N`)tWtWg$eRtIsnHyQtkF#n*`UG5HiX^zec39R!|h|JzVA$}DD3>`iMk6=*lIE)L6X zXNeZ^n9@-T#^M$foLKlNJFESKKsA^lJEf}HLvAuTz~ou|n5s{ma!KwLw(ONATu?IM zSz-&3)=>UT4b1yg%@f2AFLx2W1 zhXKKOD5`cI(ZLRxvCuT!LI$z6i2pwXmZy=2MKccyOF|~=wk8*Xh|_VC|c-aK4;UcW>V}skY%HUR;DVe7;xUXqZ2HW zCS>a+52rDf%)soHg_lH1NYUO+frqX)A{lLn56tDxWnl+a z_Or)_hhO{k-~6M0?AL$ium1H950C5a4*S~S@rGhDv4<07cJSi$nc1BOvPJA|vyIRz zSe8wz*a~T~k)h*~7`1GX^&V3O)7{%l1`0*i3jdx)UnNZHh|?6IQB`L|WbX3Eez#UC zPmzv0e-Qi`dHfa2RpGWwZu60ajv*6WZ#R1Q-+Du-G_Upk6%AQ%6tnh%ufmm656iJ0 zWjB%1IA5u|o^5d`$qlTgGDIin&>BmCWhpt?5J{MuR>oigaviE=p}3`F&{` zduG=S@@-qA`YgM^cYvFx6bH`b5I$tY1tS9u@FG8`#6JBBF59FOS7q3uMJ(q zzRnZ`zh)#vYPRo1bgLN|v2t^VSRH{(BQ5;k3s&V2CCq*O==0Bh>(_qm`tHl$|IrWM zy?+9khiMzI*j=V$`Nhv}}%4nbB}rwH`~6huCq$0h|IUCIW|x%j`0nj?S@2+>m6W z@ZhNHmY$<$RU{f^_GCr$cOKJ8N_x)IPB@73!ZyxSlsP5ZO%|F*BiR|6$=e{m?=Fh- zMqh*WF_kmcA&bL>W?n1x4I0r?a?n_#*(*VXH$*nv1>_VIZ>L7l!aK!ja#MOS@@x2c z!;pGcr|nLD_o9>jkXZdV@lqw?i=xPy1sKbBqYFWH1V{sZJg+SeA1?Slphwu^!15$u8qfh(>8q6wWq4kAM>5R=3m&V86?EAXQrUIV`*!cD-utEKA!_pB% zhT>)X0{*j+%Ry{aC-4bdn!ua*MZ#K@TYev8Y-i8>k3wj$}y7jwjwxzZ{U{;)QP3TBM2NWDs%g76cCncn=v>4G7$Jp zykI#gs1^Ko$=Ts%pdW2rgfYZebQvmzJO7WV=*~j{Emd{emryws1Ybn$`qxtnnR_lx zgieqg5zmGZa2@2TGs59-*CPF@#zT#{6XRK=xrLUs#1h6yze49Qd(*-#G;R4|1s!}F zOUU!Pd+vd)KzWFKf*oMTj1pyP?@aDp9YPV{_GslxseX6%TtJ}C`vfYmNthK=;Y$bn ziO#Gr53my1vS&gAL!}!jxsl0?grd%nNejmVs1t+3;sf0J?Inq72c(i!`P6|cnTTYg zg-x%%EU?SphnUL9vj;SG1sY|NnS=QPF(`W-((6nXYCvxh}L|ZfZ?^p*)0Y z<>%zjHxB`gIU7pkpU=3u|- zd#xt>OuIKcBt?06bAA_C;{2F zJi5C?0f(913PH{5;nNmpX0~J%_zrcG0?ViL(%TSpYs!YLG1*wOd@Grr(jFHM%a~Bz zhPnIeF^Daa3K97Aq-=xAT8wwY1*VCLO~r*W?g%1k(pZ@$kJS7C{u4F_huy8%O}HG| zrgZBin~pvrhu~0nRfEXnyjOLk^A?$i>G(dN?}=i@Fa1|T|Cv^WGhX5F)b#Yei8_*c zi8O}QSQ=S^*Mu<)j1gHCLMPxtC;@(#Dx-foL`^X5j`o;kP+z1p>-9^v`;c^*i~>_z zg+{ZtOr#MVZlOyITH}+anP`;EXkDR{S>Qq-E?HIm7OgY!%U0TMb%+dOyvR%5hQX2A zDuwxF9-A)PV~+Sc78qm_1HAp`j8MZ=;+S>{*Ln-hHyrS=v=(?fEiAT%jNq=Q%nsA0 z=RgmkM#?AW$Z>eEr~+6IXXnEWHw_{k2^lF6-fD@nC8JV%-%P+tD;Sc`WXCJ@# z_22lFjE#+Txge2P8kn0kn32aqT*R7I;g9K7$0TJ@#gnnlK1@@hXS9BUdso9(g(RNR zzIv(?@MGQ^uCFE>)j!)sC{0lc-pD#Pa}S|)27}!&q#}IDW5>L7pM}9^sMTU23~!TP zvSic?G;=I*0GahBow+{bs1|{x!67dIeK_P80ujr7?=npEN>z9GV%J-5ssZ5w7M)WN zURvRxe0lh&=j|UZ;5Ux98XR1`@Gnuqv0m3`E=OPk{?5!+aUeoaDBfEdVrBxeiz7}T zd6N6P_M(IY7Y47W{STApU}cg6Vq!k#Wbl*5vvcQ4ES#z{I~gnIOq62<54p9m1frgc z(uRdpWwMsvpe>NE{BX4_6?W8E(!E}Qq}oYIbs4s1Mj$pL!V>N#5Y;e4Y8j$T6JtF% z0PpZ4eWHWiD;ER&B0;wk(pSo{z}<1wV_DSQ-R0N6|En+X_`@In;Qjk|o=2uXZ8P&} zdo_d%$4^^~qfKT$*|b52_5I^pZ?o3;jGl60T@*cNhN-eGi5A@fiv%5!Wl5-o?v_Cl z5(jZoODK3bQWt$QL60_`5Q`)Hq!u@7Vy*}`MdqHdpe5=>g3@sJsW@*aS%7cg$2q*f z)Z`HM5Y}0vdQ~F48Ag(HYzWC)-^V$kmDfTTUo}aCT^s=N^hb$|^btbRCs$D}#-1i3 z0-JlVV@Tsh?*d}~-ORK**gj(jwvg?{Y|2}~S{LQLE_y@#r(5>LFYFd4rFBb{L}7jO zPv25zl!9q%pAxC|pg7 zo9%c_p*JBC%|__$5Yktk5I4Nls-)b-8H}-lOA~Q!mGXwnwAlf8C^4;m+PPCK}-(XRv1UEJ^gTv@3V!G)yKgYQ_|M0_f!YO2P@g{yVaJj56zx?9&fBbvj`_}1_Cw>@qi22xJAvKKAb+u5EzN5 z?r5=xLcNw~bft;Ga z#9pK>7|Wc^iiZ$(+h(c{te`U%K$6GTnNTOk@1V zGgG&{U&GCrM)@Ph;3lHZ*kx(;yn~cpJ8P;5(>TKTV;C^}v249-aOpblZDbyge&|-yG4$8W6vni2;7GK?H zgkEqsr5`O7wnA!By)>9EYIVnGG%;A!BQm95H>GMM56f6WHml=jyJB*Z%7#j5o!HfT zbSS=H-!2mi`+MK}*0(;o|Iv?r@b>MSSja`16{$L?XD`&)gJOti1eeAXiQm z+(x1+%I2q?0H+gOMc~1(B*!&cSwRZBOua>oJ-;a>t!pwzS*s3BsPzY(pS#qp)d5 zj<5pz!i<6~YPzBgZfHqS1q5ygA>f9g2o%$gN=Ehd!wlB zQ=c=t=+B8H6-_7&HeXukwoGk^O?7}wg|;;&p(`=^UIsl6X--qygKZU=$}cAd3;^hrS%Z8WCht9> zPPgbXFdGnnO20F)lj_2Z3NCNtyi*J?BqT=5&VAGj>03^~@xxiK@KmE&bOv^uAlWu= zGoQc3NEWE^IQDKbl8~sWjVGwsiCZZK18pMH>VOgzsz@0MMM?8$PopcOD3I1iu;xS^ zHb#O=)9!>frx*r(wmVT1!|Z&+EFtUe;w!X`UwS{pJyBF-Qqy^&MCvIO8#&V{F-o;T zc(vlEKmEy9zxe6*zyIA&KYo4v@Zk~{d%;og3Ocemv#H1^()QHcD?OF=M7QY6rfjIv zVx-4rb|BPu5xdU}E3_hla&>F~Lf3mt%rWz1KF}TL5_d$&2rQ`&(ar@slsV_~ODDoHBHXQ{;5Z@Q4=C|B+t93xCTu{_nb+t! zOg!+`0Crjp+_xZQQYi0K7&xpoWHpM2CF*SY(M0gbdHWmk5LGy{@09DQ3#1Id+2 zLG5GB6|HM3ZTe_KlmEVv{_%wo-+&H`*c6tGH3{k~Fm!S|mlw*UHMC=$N^$YNM>f2z2N$o5rnEQI?Hk}LFy+i+IW75QN6;A39HR1{@iGV2(5L4zxUf+at zZ8?lIo7jS6{n=e+xkM@V9BzX>ZW1*NW187a<{mj9>;!`ZZ? z8;;9!qJjHKk3Qn*ZAYLbshVZTfpHD+l8xjecL;Z&2BenV^}dXd)i{Yno~mhaNEU7Z zS&p4WO%n>1+T&Su3ml@eA+9~Jy>38sdm1s#abR=;rx7M{MO-s~{L>%((T_j={`bH8 z=G_nW*fL*a8EjPthoVVs*k6c)iXj_%Rn$h*QHs^q)Y~0o1Mt#4UuKgq1Ejfmo~F@oE<;I@2YI(mSB5 z=vovQ#!v4Jp!ddV`LYl={DM*ER5woSTsLjMUE~g6w_DVmdr-m4viVp&Lj`&rJaPhY zSBDLT+FydTT%Z}{*&I*wwmc6Mde4hfkMt=drK&ZJN|;n;Ws`mq8r<)9bOGPms{UP4 z%K&m~Aa;-3$dXFX2k@rtTpbx{S{5dZO^4J3qD%+uUFnM&(AI{*o(AhCcLa~{&9;DQ zo@K0<0zzm%C@)}bV+*sH1GUE@bF=Nntd7zTktj`XWup0 zxGK}DuN{15n3)jEQ~>U9IZT)Q!Z0BLWERh0S9WN*EL=vP8NEw7v_G&!lxRm~ilKb2 zo7P=LhdPd-OT$J_k$2ub$ZTuNcKU7^8jYELxCbc4x= zB4An7%(@0?%svL-I;7?hT>#ovF&b*}QMycv$TrsIMpv_MG6LAT zIxL~%HhpZw6nRn()=Z~NrcujY*KTr7WVgq}9(!vFD8*ZQpnepl8#(L$J1tPu3&0QJ zt5KxFUH=T6kXcL4+>JAUq?3T?d;F6Ox3C{I^^Du2E|Q5HDo)3Z+v3Dx6ly65!d&E5 z_@>J2uJVU$lg5N?&pde4j+Ia}G(5-*($r5~OzE@$LfUj_R}`{aiPFYJ?GTaomt)K8 z%sd$TJBPC!Nk>jy!#ZOM)ENlW&Y-5dZVxScgakDrW;#-o*5Jy}6o{x$7;djjZ|G<& z;#4$3Ate7Cj;*v!Cdoz&0ZbPIUN}z+fHopD8wrIk?qgyEq`d$?Oj_pW$eNLxXWT%+ z7!!5|aVKIk~#D7FzI2 zMvb9whrU_dDo4WD8q~p+2s_xXCc;izb+lL& zlV2^2C%~gC2l&u7`qh?7TJ%4(o8$l^UEXaJ z)+P;?mdlK#jdBKQOPgCa*@4Q$<+9$td;8O${^-+BUVZyJpI;w8GPBv%!MQ$dalf^j-@btwj7czXLQi13UMP0K-xRj#)d>*+kkkIM>^_) zO_GTij2j}=H0?~Rut&f<)JjBAU4b23+!2v7ad}bdxXKv1OH)2lzNn)|l=LEkZ?37o zvL!3rNRd5maX!=2P`Zd%dS=Dk+EsG6A!cD!blwdsSCwcT%NGLG#Yu}f!h`1UT-LY> z;EjWJ-Vw8bOf0^3IuXquP@SL59vX4!eQR1sYgrMui3phTDF9zus0*zs$FQ>&NT>`B z8fB>vC1u9G26YF?+KgIP4TsvhM3LqE3nyQ@uPEUiL77u7k~H zSnTQbPm<%jp-FMY3p<`V0={6hC&n7CJSV2qC0Vsu4bifE%K!~!i8|QFw zU+)2JBAM!NF%?QoO;7Pu_Bv7=MNwsoYA76(4E%+>;E9w8R7geUvsjXqT4oL#hr1b1 zoOIu$ZAv=%&9)0IOGcyjFH%X$I0OMLUX9}d&5DQfp&r%5psce4o(DR9r&?xM0#bYaKPl2dKf!Aj3M zBlCntE?Zhk5Q0lK2ngH`7;u$Xh&t-EsWMf6<=(&tgCV&Eijj99Cda zlxL9-7S#v*7@3Cz)BK%VR}_F?KL!GMS@Go;zxe#~?|kn&-~QqkUp+oNuDiQr-gGS! zBW6VFt2nOeU#sSdE z%VZ}utp3wfs17=cGWl7Jyi%5$zPH*YWe*apvs)R6FAper9 zST^wv@=C&N+m)D19QmJuGCH0RMMPk?UQv#T zOFb%9Q}4T?YI7g zsp}wVMAZ)wh~CVm-c_elN<*A(awChtiHW(5R>l*}i=w0Lo+2)%7QeY7KL7O7y+3^U zi=USO4s5pB#7GJyBaEMZUG8^((!d^9Or-!O0l9*Cf#}qL2;Ajd*NsPRWCQ~9g zwA}$yQBM(<)WKNNFc3Byw;lv=43wUta7nO}QQOm~JNt#PVCdK4oaWJ?T85ZvISsXp z5{_yq=TvAuii~K(Qs5OmjMyJlx`$V3ixN~6`t&_=j5T-#8qxyuRa?u76-Y;vW*&D68akkLz z?O$8nF-T%`aLj?}myfi0q#|__*9K5S?qrU$8B3N;E*+$$#9HeJB>;%%6#IZ=K?TX0 z>?9TsV+2Jsft{8b;?vi) z3OuRtC}g_2YquV6`ETQGl`DmksMD5P%&dATCxiVWnA_-!A&DJ<@QWQV=k>y#0D4^G zARY7978?28jp>rlh>mjihP7tMW_v$`{W7kOGxpB8N3dKtXlihpDwH7-$1p`JrZ?n@{j{9BKq>my z<>B%17r*%VtCuf6|Ln89H$-Q|B~`pc=bZ`E$)=V2G|XH4UFs$>p;IWFMv^u6J`%`` z+FT%5osLe`D7YXx2hes}Xd*zTURd~%a;6kcN_Pl3Jl8Q}c9k$f@ z{+Db7!0wQ%pp$%-VR&(7B%22H85cIP14ifMG|@bg9=>$ci#;O&V@e%EO=;UEJM1u! z#m#ThzSedY7Q1~`Z=uS}J19_xe{1J#jmaf7da!-gzE0Wex0u|(E@3p0g^ysSEO$5+ z!+NJiLMozG(rp?;<)Lc*MQ`)&BuQ&18Q>8=a=8#uBY!GcQ9hB_3z77yAtD(j!wqCn zNa!`iR7^NKisSx-0=D^2wd-5fk(u`|Uwrz}M{mCV@x#MITrNSJ?TpA4(0_YC4pY(~ zzjA<^=rKq+XqXp`J4T}-(dCrkk@!v(0dsYLE&dyM`p%AP1BM4_f<=nLZW{9z-FR4p zd>p-y;@Y^*a6p^ESX8T$%X6Cck=eUV-|hAGuv;eOd}FyRA#3$5v`dS_`6MLVq1R*p za5HT(-K__lmLn$!DD;_~zI1keD>hen#Xti<+E4ioWc^mV#H%$J(K|QkK;SMhy0jc9 zarB}&gB3B6D^hyyC~K-^ZLK09+5A0j>?)eFS@@hL>O7-wQ{Xv))KC3nUpP_R@W_Ci zR`3A3HZ+6hfbr0%?N`(HMxriJg>^M7Bs_y-{~E?A!ySsT&AHK_VvH9K(T~s|)20Hm zaino>&f)LIMl2243+*>x$bf=p+YvbK>B>49EOJtn*q zp-RRG>7Yf+5GK1w7J4&B#0d<6!xRM(GX`gS7?pfzwsWi)AVD8Xpq?Xc->L~l0B9%c z#Kiz30GS>nI~WM*h$$C4%o4yb*H%X~smQk8oG9&$8v{2HT_nI}Kd=x+zW!)tzeS?M zpQK0Cnl5G9TL>~Fld`cCSR4S=>MMOl+e~8(i<}YC!!bHM$qm-$*tju1fIM`XyIgn} zsvur17sKvA`xF5JE3&r2I>OD2w;3+o-l1ABSK4IVH>Z$54)n>6$c-qLmD)xlVkud& zX%AA5aEZ|i4z7b>^4hIHRx}8IS9C>8!dw%8s-NN=P~Js_Yu|}h3|+>B7VEH+LlU>J zt8#B%G@x|saH5g7MVl0h)Sr8Z%$B2|HpXoA%NZ+&1x_WzxWK;Cwn*J{7?QNQY2X>d zvi1E`qCaz!QQd)&3dyslfNP2o);rD3PV!D@=0}OZ*I#}0oo|2m{PRzL_OoALZ(OF= zc)%t3XO*VQB8&h}FY6r?nW%FUp#_`U(ue#g-+(Hw=|v=#n3S1b2(3l}WgklILeiI! zi_JD_j$XH{s53$3U4olIgyo=qO2`_AL20!j#y(lJ8MFmRp`8fWCkMo|s|z|X_uEs? zdZb_^Sg3e|@CdSGU6O;N>5w77EnT5cBuq9f6Nn6~K|#f9l@K0zj|Ala!X+cbkh5p^ zr_=71izWL!4Y$02Gi-WItVW44O@3Lm$sW~334n!0aFs!APSGdz^ri-6Nqq&Dyb@SM zvdCmFs>4-xs}k(OY%8651aHaFU5-{zID$n7jy1n3d&;g%ZEnl~(@}wWUIS>v0=F1* zB(~uRU5k=3#Y|C>5ZzW(I}ht<-mqzQ@>{l5d&Ri0H6bOKDtAG_2m~Ww@ixVRei2E%6kG;hrW6r+%lCu?{g%K6 zGPxGr-^pjTASA@+j6zMqvzcI6k!D-zei-+kn9l?PS z1UMNB`-fT83>%#@3l>NL_7r7rM4%LZCb8QXm5|faJ*Q%)$EW$hx^x33v+tw$d-Xu$ z36WtRlVcZieju#xqA`RZ!(v<(w=YOuPlY6ffE(*bT6Yl=*xpwgYlTsW@;M6HHK!9M z46|$D%PdHCd8+rq__gcs_!N#i?ujhp*3+DIwR$WXA;a7!_+EIKr#5YA4i{-9D6eL; zw6*ECw4r+o>pJ)ocs+PpyqRMuP;%(Y2Fo)DlXx@E;FrRZHXzEd|IRU>ECjMBnHH02 z`Al0NgN_U>8C;GiKaDZd$Q6tSniuDD;1L3}=`y35I+D+9dk}RKmYfjU*$d}eznjA- zD(vmg%VD%4>p8s~H#TwYt*9qEs->cs!i?Ha6bZdvOztL)>teEB8#O#Ad~zAZoW1&m z`4f^&r&Ny2WhYT@wofc=#c|m$wZ^a5HW9dT(?GIeywZz(YuOJxkMzC?Q(l4f)nuI=k1BK%&~26InjrG)KG zCQ0n;Re-{s4QnAv;jHMus)tHojUjTA!lhHO#c_{a-7NJGKV@X{~U7*pO**Dy!-mi z7q4Hwc>Vg-^?KEom|`HNf2D{0(#XzR4IBfHV?braG$-N1wSXQI^B!5l+P zc4H&mov)`gOV&@)K_&;?H+A>NcoW0GJ7}ptRY<_nvA2fk;^cEQYBG8bDkkLdzC+dk zx>1eQS+k2*e>QeK@Sgy49QHb5k7lzn1$Cjq$Q@81A7lj6=wjAwk$MvdxYlPt>7}L? zRwY~^OE7c>Eb0hc*81ettH+Lt3FvV2&7px|I zC`&D&CF(#Huq+e>nwHGvAO~hTy}%>XIP!`?!Td3(^fq{hk;5{gf3YUZPF%c=)Y+1& zC|$VGHjrKm;Zx6vz9hlP`D<@7E zX)G4Lcr|CYG>(O%Bg`9Pha(12u_23b1w z;Sw6RdJ16dD|sRyo0J&<0*dLBH$C(qVBWw7x>`+?YNzGX{6c|!y0AsmR7>UphxT=A zMOff6#seN2nYXmgyEpno&2)to^78XCRhkJzHcvW$> z8U&tlDL6P6K<$G~!M_YlaU=8a8==$VM;DPg~7a%1jK3$K7y!2;wxhz_4&? zb~Jq%g@)cno4$Jcx++{Z^koAGUHcjtj<6bSFt+cJW;@_ALt_Iy0-4KCsv>&v32-oI zNSKS7jZU)p2$cGyidnEs1n<~nIknsk?y#BcO@D-krnBDcJ}!`g0v`boE#oF$sg$`5 z7gSqw1A&aFgDjMKM0Bm=yhuZaBP8m41N&iSV(+TQp|%$r^oK4rHQ*C*+cxM&MK4#9 z#-12&{eb#KsNTK1OQV893RBU|HrQ4txzwU@fqRy=XRxsHL#_-&$;YFa~lNDgnQdJOh`@dU3bjzkhqZ zUJ>DCWC`@PHgL?ePuC6#=^04G!i&50^8Rvvw=RpD9%dCytE8|tG9qIY{lLn7!M?x5 z{T=S^a$Pp`RHT1M%Q~UT)()(=T-N>F-TmF&ogSFC3o_>@>T$ERhaQ=+!q3gwaq1cz z&+CdSd%O1eVWYb@uwfMvW{ySrT&ud#T$)Qs2oc$ZG8t5qq|jpuVJz?-O&DUk5pu{% z@Yz?h-zdy#Uou|D%yN`}`;Qik-9hcMK~h9vh`_;~Wg?`obe|&ld9Q={VALdvL4}G zO7h^Te6&@{jD;r~yE-JhuL>>>A+e&DUz0{*zGzIlPbD}Va47BYV)hG`!+E7sj*fe- z+ymaaMotah0K5+ZbZBl~+g@dovCdl{_)+o#uRgY9(gUKipN5R&s^QsG^1T4~aAzA@ znL!96QmM`MDg7mN=aR`OVJp+qWfk8j)^)+7b>7e_!0DO{r7`klAcQuK^I4VOw# zMyQ^eC70SNw+uOCmQbQB(zJzbw5GIONil=|O1xGJq4hJdPpd@fI9ZGTU`gHRI&|UR zlsWAIl1FN6qiICSNy1_ClvL2lLvY}Yh?4Ni*0Qi&XHPb&w;$CxAEaovTJ|AdVXuvP z2yLK5%Jl{yr?Pzo8iIfr!ZL6Udz)T{Cb%0nbwJB9x({$xSwV3!#p0@EhtughE$5cd zM8UH~%P-a4k?r;|KDm!6y#1skgrbgQ#}>Fn=1O(=K^amY3Cb zQ@nrwHm{E#ee_z1bY$D?t*M~vuNERE{40uZ>QJefnSN>RY8aEO+#c$npj^R6N?;%f zphsz>ij5k-2GLth=mZ$!%b)kQkSFQZy}~V?Cc{WO%F@#cf%f!RY*1#s{Z{r%8?Cr( zf06M>ptf7=ZAk@oNjVNmoLmY6)V0|;SnCX|DFNz@!u)3EwwE5OP_ZIbi(~Hs6@vU~ zG09e|dL5r6)J`Be*mOIHlzpTaFHawl(9=1~?dyeo&Wi@b$v8579vp?#3mW<>M+4GyjTEUn zz2%#MmHu9NXN=7wnZaj)M%PfouGV2A4HqP7GVI5VmGGucF@uyr%{>*FYQczw5<~%k zPKda~SU0t}R>!9T_y~6d@9yu{iZ}1x0j+Fa8pnU(Y;cNMSuHYZ8_VVX0^sZS4 z882U~S9h00UbpObMLnd$T+RTfj`6yz1-$)meg6;vyn1=Le~Ih0Hh5p^Qi(odHj@#_ zmdDDxKD>K(yF^z^M=oNB%kh`UG#{{m<<#)-Cty72oBE6hn@X>negErg zy_r&p_%!kJCzW=1AB4OQcD^BxiI_)L=-mx*GqQHqSW9H^bc@zStF-f~P&~B9F`3go zLpd~Ichp5=*Tq;%>g}5fv)S@dZ>tscjGDlJIv6&~4XwOAr1fK{Xp3nnIw!OJ7(xz3 z-;Q?Jn=w{WW{Se!$3tb_1jqIGrH!azJ=heD?i1VF1e-&DoxYKO9}U+7;c}Q3OLO`D z6cvOpUIDNy4!zV(O3N(Ho8^ncU>jJ`m`#y^y8;s`54-=8q?pikII_VimB$Zwq?R)k z2%H!h9L8d5gNA52_GxCPi_@9v8h1^mm1sY`vi#@|r$|X5N#N!HQ9%c{CS%wRg_*;e zVp0(!z^YkM6is0EyScqV(i3CsQDk zNIEtNY^NvoWnxTwf_peV{gP>cz|A9>Wj8Et!dIMH@1TdiSoB8+HG^xwRyP2VWXUxx zrm334v@DqPo*e{V8yU61KjbM*n(ks>4I!0aDSy{xuh05hL)j)X%lMWP01#TQTM56Ub8gpJdE}Ct|X%@OWlQveu zW=-NL?4u&bBBTmN;WELiKcBg32ahmyJ-IJ0N!91vc0mW@sStvtUYdJ+e1CoX@an~@ z%iY~|9N)e>bErkTjTO5|VvUIKZiiCG<^)nu#H#(>WxECX9bJ$+;g+nM|Cm99ycaK< z^PCBB*Fe^q69$DMQdGZgE8E^ccvb*%$c{PGOk)u~A(IW?!;IYd9J?yxB4Iw$0y#okAVOUqeZIW%r+`mi z2(@wG4$}aI=&YhVGlcOn1l}Iesv_<~+aFT$X%92B41+<>jtDG<`_$9BCBw{xSnCoI zYa!Mmh-ytNoIYkOEU?=el2McjDce$;3JcfT65XDCN zhieWtVZF2qo5nJ3fQf5I~cYm=b|p_dk2He)8k}?gM`1)#E4k`>QYU^B+H6 zbFItbnIB~7NRMieySOai-Irf|{qF1Q_b&0j(m<2my5fbLyClWZ8Q$`IZ*N}rG^(jVxnESI=@N6hvf7l_Jc0yj8ly7}WyKIA*?ZYhtyC9T_~+c?Bb0%8l{Jx3TOP(iji=xCc7X70So zPMfGaB>=;t)1Dpa&u;~(I74F0RD)+3fV03XoT|qjI!`Ym6!jayBIQ6SY~8(*>`qg| z5(FdK&sH+6d{Yt&F8zhND>Q?h*tP9LDIm;Hl?<@1?Jg;NSKh&#?+LDl%!dJpK|Upc zR5m2Ml=(dY52Xh~{=9nB)V=$sFEH4qlwhS3Wt@5`OXRfT!2m8*)DTL2xz`s9<5s#V zY;vWoI)kV74ik-G@TgG&Mn}Bz51ho?C zSER8d3@c+(4fWu?0}U(8I-f-Rln0oHM#OTvn0L{}I{8pADzon;?d&n4WwKqQ36o`F z2l9?TLvZp0hL`r+Ovp^saba!GaKJTo;MgyO`D=I2@>I2HGXe{4oW`3B9q5pgCqE^W ziaD{`x+KopP?hDY+dw4NkTJv)@wl&#k00*u@9$r{sP*XxrR{-Od}9LEVs^uNZU`;= zH?Hez9}?^2SXfI*S@?c=x7?h2(sSf)rTlf{@6l-nV}W9?Z<#hlBjY^-0F~l!@Jf5M zDrS7-X&{PjZT%rPdv1zk*cEAFReJ7Vu{yrm>*vnGK9qU@>j|ZYul6pvVXkJX0=Lc; z0~l(;wwB1fvo?T`53{_+%FZa%VmUn_t68&cEYt>5v{JS8sQcKZ$^``C(v(-)K+Ij9 z0oyN5vYEK+(NEu0Tv|*mP&{*|6`i?`HkIA1g{R;K+_~gPO&Mz`MLZ%ILr(JevMrQ0 z_9#~h`FqGl)s9yp5)tF&f2AiQSh#;kkQjX+NVaO=MN0WapC7JatpY~{rprR_MKkUM zw?=PWv%_ToZl!w4$~#ITQ5_#&X**&gBear{&1_sEnFgBQ8I%;3I|@WZ+~3^+*T=`l zBd!iLouQyN}4VDzWD0hZ+(9G2mbuKzvWNmcR$bfSNz~dmw)kJTmSoi z`~Bta#p{Y{tx8>?H0SqscbM|h?G$>jeK-Bxaf<(p>-m@{g6@j6Y;z1#-pfV9W+R5e5Y*^&cQGFc(8pjJBqOdbY|= zZ&pP_rcx_3q)5tPv3+2ktb?X#vvo|GEP8GKw3Y@saG`6)aEmJd?Vxa*CWo96?B4}q ze42pqd8ori88#JIm7*$qcRSHo*5YMKlZaZSmuMeSq^IEtv}Wtc;xT?{Tba{@Atky3 zjfma9vEOy9XWL*>qR5?{_2w`yQ=qVx+dY7mn|x75XuKG#oM)O8Qq8x?jUZPeN(CW7 z$b*U!5;Od~oXz5r(8%G?urWe8h5;50=K59Y!>O526f=%yT9HF2C4Ty2R~ls3CBtF+ z9Wn-!!kdYr{6j0n^Gg%C=SP+v0=u?WyEihdFZ(1*jcMalylsRePZV6D32loW;kjzm zrDrjNi@b^;$V9Ci$UB8>?hZG*`qSPat2TIwYXvIfjPU$M^frV*XEYs2A?Ogr;-pfAXWU4XPGp<#PiTP{6P#@BwM~L_5RplMH=_8 z+%!4ixiYuG6-Z#0^NziCSs%f^?PzrXht@F|R)Z+aZJh)~2=Sq}t4%^j{nJvU?)RpZ z$sCbGO#xt|4uOBm&cg4s?DcbSdwyEEK~z2zWVi;mhlTZ3#ZMslKaCpEou z$-;-$$53^aDDFA}Nb$mZtEnSaKugW37*%^l#985M7Zc7T=#jCRighAuGTjF$u`Kpq zfVQdzAgJ{iIRqYh{y93VW~P%M`CON;UFKzRzL`-fQIlrn$M^-n>@uSeC#8 z;=|jwfA??x%Kz}c_&5G-zxw&>`)c59?ET;P&-}`N^*{a9f8sCvd;iK;?_R#T%j@Q5 zG#=DS3*ET?;?0-;%|Dg@gTMdl|MH()uU~`93>$yf-1IXprp~0K+(O{E;5QCnvtuWf~ zpp#C!@K^thLa2o>^%oR~qU+%ix(L_Zl#$C39?GEDb5h+B4Ia9;9xvssl8-9Agie}n z0c2-8E=?`jp=}$R;=7`!NokW{bv`;>PZ}pKIC?v{3^=hnYqis~iSmlMV`+FX;U;b2 z5S!ETjnG|V)$P1!=hV7XAv*e!kzOwhlNPHo$I&Ki7tvY9dq`X;i_A{d{iQE40+;C zJ&oZ}QYBrI=02MX9R>yojjJzx{ik{4f5FKl7)*`{`E?4?lmOsb~3K-Ch39-~QF_MEpbl;=lP<9y7ROUKh_(lm)Z+MV-$%kwmp;M63O#|;0 zaKQDt3KNSkZJ`xc?qF&hI275LJaso$hs~V`5E4aWyz5`vg-u2-=P$D}on)^`sW_>L zd2P)vTNfGx9S;}}FRFHt7UIZCQ%%`y_o)9W_eU?B4MP2?F%4>mG7In2g?Q@^*;TPT zcAH8$mh%ysn=GICfsesmYr&Dp@r{C2dtLytVtjQZp$Zp3uj;w)%-!ZA9~&mH74Vvc zdf1!lvETWpmJK$$GoGwMfVrQ3Gy6g9DO`^BKJ-qq69_M|mbaGpNB2#Fpcg9~IvwX{ z?m#IGGZK{4{RZ65EwJHwGh-OgEF>B%`1F$GaLUP4K&EQlh4*P;#Mf~jM^w;elmoNP z$tA^Phs2;lNkBWQSs2c24n!Z+c1nR^=VGd#|8{%QQqx1$c#O2vFKUr;M{~gPKGm5X0lb zi(+2FiG~U(Rl77KtL|VaPaE~>MD%b6!3-3Q^5qywzZ2QnlT&^ilHcaCh1UyVY=kLm z%ThkkUWxW@m1RU}>D^OmC(2H)!f+qK_8c}SijYXB2Uy=_9^F3zhD?sZhh=r& zBB5G?Fy(;N=z2heJ}JgrFEu&=7Wi6J-m(&C%188-!47(ChJo?Gg*p{9PYWh2Mut7E z*97={Pe0#Z>VRrlwtf_3ZP^2DTU3q5KrpLa5j-%2ndqbh(#s)I?ipyGeu(=^sXH^N7Gz~@LP(oH?EdW^cczhZj z+e2yLlz#~^6H%=$1r8uLUsegLxiwG~;VdK}&zu3USBEL4t;0x!9-|69A|f0Wrk+u$#_MTuG^ZA>HMN4#jWqD;}IINJ`P~k~H#h=*$@7na0=~ zdv87zB;oBqV68sUtxk5W`}OjUkzFwrP?i}EjS8F<31(OgzJeQ0+3HKZxFmv38!^-$ z!RJA1lx6W%7#dNv(@Q%> z-cESrX%W+DYSYH!V}5(#fAY8f@jv~o7hiwz<>h*PnRprN1>(iVe*f_GFTVP7zxCaJ z{7?On{r>Tqne_l!?!b=R5%}1a~_%1W+xDBVaIcyRPH?!d?Nmv}tfq@}86~zkw$KEg+ zRQ;Xyos{9H=dfD|$JwKGHzpHG*2ee_v@rRQY4(^CW5RTyO?R*?glu9azQ=H9@&rWW zlC4Jrw8qLN%GTBAN|*=1OZ}iQOwtuHN#y4*nR20e?_$fRDL+Kt^lQv{kMcSBTF|M3 z`dtBJtXK^0z`$%z#{ViAAdlSS&@J*=6_v7Omzk>2NBmKU5LKyc!3%9@g=R!*ano>= zDZoRz=!CRd&q(W7){!oZY?{4Shc60NsvgeKdy~iVhDT2Sp0{&Ah)Zr_5Q6@=y`Wxm zQjcr0=26G3g{zz-s&fkJHmz$10`bMocNT1_2SIsGn50Da5$^%`Ee(dA*|1Yh%P2+v zSD072oQW`E7?g&9hR9}n4<686G>amK{MG-Zr-h9zT1_;=oN})zWRivk+0<&<2HLjL zQgL~fjh0Rkw*BfYO+KFlQPk!i<4tgkqGN!iyDZ3-w&7H~Ppn+*1JMVQZzu z2ur02rasezn~rFOm3;zH2i2S30D2crw=Ijd==k5!!1A2vCtX^Yhu(2(2_0YOW!bf4 z_Ip~;Ayheo0t8R042D-v6Yf(wyuiD_ur&r<$6jVldmI4E1c_#${b5KHh0c0P^+utB zw&QV`^RPIlNn`SKcR_Gy0>i#(877n|Sisa;hJ!^!$gU|u)%8nViPpu|!e?vDj%$5w zTdO`9*g0gAEqs7)1hJ)bhBfzqDn&fpjlB52tsF6pPf7RJw_MeGt zfiQ~9|A`*Hb7l-8^J0P*8SW;|AlcC4dB&VEJ~sfOSF0WCwM)hbCS`HJojNR0WM}J3 zDrHFMWUVhA^2ut9weMvAH1b$YZHzgu_8VqI$4#Yy2(1I#K+^Ffv*T;ify6N{)461{ z7xFuo7|x_$l6xNrRfDFy{Of#N}ty)Y0jW*$@T_+g?Mhgs*E z-7yxZp@v8Wpr}uB#D*2YQb0W#zXz(^YMEBZTmUb^B@nAm>%AD4N`d zaqZNmoK&GV;hUYoaIB{hv8oBb_>MHl=c4mRiLcjtQj@5^#>7roeY%gKF4?2R4mpm0 zG9&tsi#W4C$=Wg9k_dEH{zyj#cm{t!hsZM496nGddkK9=1+lLz8woyVEZwfIIu+vu zL2U|zWs5BaDoH4$t`@7R>pU7xIkXLpTOhNeK{q$D&%yOOswG?0`_Y`34GSSVU7lLh zvhP$Gtw?qwXYyy{rxlBTN;qXC5v$&%T@Q=O{zFImbzlt#sR%4D!Bt}?GPD-YL6^KS zv{cfl%ag;VH7aiJ(|)=_59N4@g0v?=H($gyXpVwjTYVLps#2J6gre1OXKMj1qBRl~ z_K~A0w2RG{FEzG)G+(9WygoM@^4ds;gw957@Nlqa*Z`oNvX)gx`#fi@RfUyx9#(|& zXvWRXlJ*Y0!BmBF55 zw4q2Kc_f!GS#anc73#2TLtAt~SFfNH}8s+CoxBS1|=Wbg_ zhNsmO4(GL|6`)0R2KWlTpmN7mAQZN=fLNgqWC{sBn%u%o{DU93~_U6otD_*pAr(WTn=!Zo~i+xQVx{-D~+qb)=x0YG978 z+&qnJYG^BV1UA&h$<%(R<~KsAPB;~uFjs)q02fhjflz4_wWA+enOAJ&lnzqGr+QCa z9EMEVLd(qS&b@ckv67XjudKeDYm*4eM7cw3Fz#){j@U^3iH*?b*nu6fH5wv#eFUo| zezH&>&Z!YQ*T%ZW0@jWN&b4-|L~O(rxb`o(f%@bMTmzGy1nS#b488`gz%{{NpkG2a zM%2i=C`A348_`z+kHBN%ni?E&Etb)o?iIU4hq&tYz1EJp7(0+baZ$*DUFq|Ry`mY3 z*s*pj%QjRRGj^}uMB;dUg2tb<#n0R!R-l5XBZ-0+Q{?1(imT+1|3v?isLe(rZ%D(H{R~LN z>USHVFO5KLB&z*6z4lS(0`&GIR2SY`kqdT}qO->IGbQuR5e!@a`#R z#?0L~EC*MH=1Vhyb&vgD|BdhNRn=i1+yZb%W3IsC{`iyo|Jtv9_HX}3Kgw6a)&v53 zXRhm?|5H2GW8%Kk3TpY9i5K_z`0m4>{Syy=;`^`v_5URHT~`cit;Y|KFTVZy{!f4R z>;3M2W5wRFxjTmqoxNVfS6_Vj*`NLHPk;U6>(AcZG2h)zbHuQJWTLHZ2E#VLaf5PP z?g!_XjwMRs9WO_MrV7BLv^@g0In5=1l$F{X%bJy;$U3!KS>`&z*G!hohB^`HOS(5f z-%3%L1Dr5dJN-52uYcl((4G$bjcM1f%;ITJnn$mHfQWK@2 z;p8WLbSan&3`LZJ^ydDU+uO+eKfDK}2(xwsBpvBLk;E+hWEz$e|1k zIM^Gz^(CJWa_XM6?z0o;m~!fVfqhsK6Ltbh=cDJt~dWZ2c z?d}zcbZzO*@nW8kE3~VR&mqhY$pg_#1sN)9Luo)*wiCZ#8QIia;kB zV@8gNMf_#PmuY)>j0*rdKci7!vD=2tu1Fz}V;%onEC$Ol`!!%TM(}Ec#No}UR1%Z+ z7J^mdh3lZXNqz%!nhP`r3-@g+hr9|EPsO!?%@`N4Gegy*a+|y%+Yu_aoWngx1b1BwctT zh(r|;e2x|M2z4VlQ9_|-;-MvXNF1m6SLh_n@N4S?5zY^|mwkkS4n@&7`XL?zsjikMym)bc zxvUG%4Pgs#+Dv(TA_EJGzK+&Ii!!c|4nYv2akem053kssN-HH8rsA<@F>DzDR?NI7$Nk4{&r6f2*^pg9lW2+DaH(m!TFg$0(|zf@R?PtwIoj& zbOF$#aNXbSs7O<_F8DHlL=8 zZ_A4#ei4QkXq2HbNo5!e$QKm56oB0_Rf1Uh7}$uVgICsFmF)#ceWF#Yeg_hAMN}h` zxe3dA<$0k-XdRI{Sp|P1-eYhuy)+ZwL zUWq1B>{2myXlPd{O+BcMh5Loy`siiu%zC({9?gk5+DeF2s`)P zUH-k=^+VRCYi+V*`L* zEksOhn@Omn*W%NvgPSv8#Epa>Ek5du1NFBWd2lt_MP@*s+mBT~N$r|f0?r(z55Rph z5fH}Jb_Pdh&J73`h1_qxD~G6-XJGt&AGPBWDi;ky@tM zTL|>}iUOimY@1>rG4b0H;|VUb6~M6-I54fxGe6|d>qQ$n#nj)aJdt|j1&uTe8eV^N z!hzT=lTyB0^2w+D50e`vnW!gM1b3lSCE9>eR;&s=h3TcFdgWr}02|6hGkutwbr=q; z4H$&Q5~2=1f@*=vZ-Z)~wD_vaP$5wXA9qR&*{c{L!`)G=14xxzAXYuNEAz8iVkMaH z4{J|=kD<~BV(hRPrs=37o7=R38C;x-boZ&f2C8)XZ=g~<1^^B*t3$)!1d5RO)LkNa z)1%q7)!Q)w}mUTd32x7@nO%`jCXAmjwVfyR#j5@LHp7SUVP_7;d;j< zE6HiPy-RpvLmBxQ1f)6ayfB;?g+Q#xwIrkK#)rrK_Wi^AcOTxpeH4^rN-_a0GYE82 z0j}(1@#X1mC`9TJ6k%ew04n4;WxrWVuvhmL_2oijSv&4jRD{ke<#RY)L{&5@ur4Lc zZlizV{PX;AE|s};EU|(HkURNeX`duacc2)ga!BDyMJo$x<@t)Vd}#rS$*sn+HQOK! zLw0GIj&JCFSjHx>XG9!kRF{^SUVGD+=UUWpEH}gmEpR`0ytFxU2QGDF5CCm6JflYw zD`%Z4MX%l)#+DpXuw(`L^rVf5cwCFS_2=3WVk2JO1s*eFbL&gxn6qf#z`CqUO-iBg zIPlA5Kjwvf*n((h3>gUQ%fj9}E*I`)jax!xNH=2W8c=`_5pW0!vf9H68apC@emXd+ zF{AuK@QZ;BN`ySc{DuD=(Gj8AY)1BSv8FAR6zCQOlbOwrAL9&0+?f;{7=2u?s4?R+ zNN?;mSZEDle1W<4!no7xop4Rku%;d(t0lx&poOTFQS~=)H6nSguV8sPp zWWkJZ+y5_n8|HG%0+~S71-1Ka0C>000M}8?;*jR}i6`GwBff0J-*g1AA_ii2`VfrS zV}cTnADq*6fUaoBb=zB^`0CsloqdpoY^93I%p16YOeyq>xgFY|s2tRik+58YCx^ET zgX$eM3N1K{xL3h`8(oB?`yG@bWhu&1E9^Dhr{K}+?tESquVOjs>m8Qv;;IU$9r`` z#5IeCWMul_z?6@K1sAQmZVHgN37(c!oCet{=+u1pV+xOI%o=#xylcSrNlZ1h&PJG( zX&t80x1UAzXg)%g7C^nrxgrf_8lUu~+bKniv=g||8M;3N<4}#w2hKJ6crhfwC8BLq z!iI+G0Z;u^$0j>S3Q1%QGe|MJ5dgLl`AcUbX?eE7re;R$TyAW0M$y^glr=h} zp0MZrr#a1`v!4W}twPC6Uq1tcJf=qIK;t1Lh>;IOfofaLup)c9xQ}C`DHTmZ>`HX& zjXVdi<$)!sNH0GI+6fO70wVWD>{qYuKKbb7>lYUwuaA%Ku8-HpM?P5E5!75}P%t$hLD4#S(b~KCRtWMRG#~?bg;-hdoaZvN~u0i4wBR0pz! zwJz&&ce&hO?p}WK^6~Zko7WFtfBp9T`)kCiHTp!ymr+Xa@64^I8^%xS;g3M*7@F4A z>hO^K6)KIG;U8#YC?wkOQ5TjbifB6GG;^wkn=VFZNbrr7rlB;Nf@iPz6}1cnGeEeb zr|24EmCt%-AIJbr!=z8tqkilVyGr7=g^WP*uv>~qZ(^Cn%mS_fagPu=u9T*-+>O%a=%d#}I#_94~<`G^IbcdV3Q0a)1k67g5Qd>_>j*9jH?R$i{}_fNjM>{zik zRt7Q})G{-2$HpB#eDojv^hMTD&#K|}#=5(E_tQ6*pI+~Nhx#-pJtH zjtO|NU-Zdxm}N{N+9za(I)99tH;8W$P8u5Sgi&;fYG$T-r?F@vWh6^Y&NEIM6q?MY zr~4psqOrCx(9d-t#wzf|&uAV{I|hKeU|&uI>o+a#B|y+35^wF?YUJJIcET7&j?VQW(8 zvRyIcXRRgC3J40zTPhfW?I1!UL#R>pjJ_&8!H7kvWJEt(Af!!xCI3r@Oxj|boS9#( zQ|De4E5?rZT6GG_#j2m>H))pED^oZ@$*yPz*Fo`IMd@N$Im_4zga) zy#p2Hi*HhtdE;{-{jsk`{V`<6+=x<3`Vz7!c;XNA7@;Q+j5* z^c;tHR33*2Ah!4A&Sb`z=&_WOK=nC=kZPE~>7e9ZY%*F)4joGyi$)tS&A1Ity;wIt zz+I)C0aJ@MEuN|nit;VTdWmYPUc~MWNs3J{HY+u0{k3qj_cL=b0EJ@E)^+!By7AV@ zQy>uur9g0?*YKDDomR!u_q@7ReIP0xVh1iTPu8*qnZW<1J4 zr>V0lAG?>p9UQrYV{K=&atF#Y=-OaqRI&?&0*52}x-7-H#qy>iLFjJwci*Z&yzI#O zC`Vvr9m_3Dj^k2jdu{OHCW1kZj9{3~GDf>AMPECIctG#?>qYq*m7M2!k2fMmv;+d|7+-GBBBN5mA5RZ{-t+>0a z`}@03KfZhQ@{=#VeE;Un``plB7l85`0wDaNpUmc? z_OWs(=AH=23WV?DXRLogM zitLcgI6VUOC~L8-ct&rTRm%|X$<3h+DkPtL3M}9n@h|`0FXDnLE}40abzPV1y32LR zb;(%BSeNy)57)o&dta>=cY%eqHkP)=ZDjl(|BZEt7iE%r$Mw3d`|`N&9{1ffFAwkW z;`6(|{2#ym5B^$Q?$?UabWyS6?y|pr{PHjTf z{<}YU|HHRy>3G!a{{__IQS`RA9}a8w>D#W88AEi3?&@IXTeXy08n3aOf1mRlrYHoo zTR;=%&;S7d07*naRO{2Yxd}I}=k)EELFVtAO}U}~gw2IGrh~#sqnT+HY>w;3PdnXU zrsVDX7=rydc2Yti_iV1U`*8}+1&Ekz4hdln3uial=BvdT!=a-ltKXb!j`}CAV-p5 zoVW>xrKGvf@n)v}MynI5;OLJMCaP*WbzNaPC6{AbQS{WWAXO!l-`Z)L(6kpczG8Sn zj!R2Tfs;4|(|~F;2CT3gEoYZ@Wexil5=LblB8X8oBiY%BsT{E7nc>rUN1U0cFp2ht z1ramBNy_#2Tm2ku3fXA@3YnrbAKTI|+w46`oU zn}oi?0#FJOhx|H!bKf&fai)ddE;EfkPx+ib(c4eNs=L_fCg!j`gP0_rW2}xGEJ2;( zX`{2exT`j*Np0&BAsQ#cvpOftFiaI;Lf@xM9%4K`dtNMMF>Vw!Qy%9wD1wV-IS6R9 ztPAw#4YnB^W~e%8f!C%~g|`n;zD1xqkQ7)VZ9649^!(_&zMM_2nFnoBrDf19qS<+Q zDnLy4)P>X51m#azKCZg?NWV}HE-ugmRo|$r;Z$J_l{W#Zyi-r{B~%pj%$=5flflGj z3f)fWyd_i$5B0?j^Ktu2cJ~0NW8x=qfn5DE(ijVWO+FCg9BMAOM(fdn*)Lwi_rCM- z=byZ|K7RP(>#x3k`|k0|XA|@T{mT#Mzabedo&Pwm52v&IkQ>x>iGC5hF9$OH=SDcX zP=u}Vd$io?7bawh-nF8KK-B8F%#vC)YT0viWM-Y2C2TCc02(d6OvKWC`2>#|3BY{t}^~f~4Q! z0-3Xu1lb)%U}G4j*m>3trJ0GWmv#~UgRd@Zg|T``-k#)7EWq0k3*Q2(_*j8hYia#r zbsgBN0wV`WbTYX3mXruD1IKYDXwbgaQsP=e`*kpDMJ(jfP8FD1M)!W}0j<>pkw?-`#(>yZ>-^|FA9( zd+m(ZukQcp|L}+Z{?Fgvy{IFP7r=Ly?0vm|x&E2I{P>stjk}M(6<5TE$IFMu`}fxu z@Au1h`~KbgyX%X)%fqMttA8Fpe-kh7i>_5b2OzOuynOZh|L4CFzjJ;0=_ea29#`zk z+LyI2$h^MKyN_PttA`)`^Zzk^ns+bm^sXzR^7NjL)7;TqY?j@sn(bF|IHHubZl$KI zg_K4Is{jeU`e>=Hc|vVr-pyXG%sG`K6cv1?r*7k$8*JzZCHDl0ltxQ)Nfl7 z(0`9oA;$kp)CXd)rlgv5T`-%BfS;O}4!Gl3P0Pf#<#3asTk%IS|niKvJG zVlC~!qR4^T9yb&rurxU(Zh4zakrLrDpa&NTf~1D666}5v))D~r-g|4EO0{3bQffQ< zf3&F>Vc@32mz{2k?v2<*D$iEen|);-y4B+*pA$;;he7Ag(ZZn_w;Ymd!(PR&?_;!J ztO>sRhO$>>CkxGbKO!<#RCBsS$nn5Z%H+$_lW18wUr++RmQDbX^KJUGe0)Y&kx7SV z(lE{=NSQ(r;P>g&28!jy+mvnQ7V|=tMsOvOwEW!?5~z&yE(K`CcP*A=CU`2p;fcda zfthSxB~x%Dkb@(t%~J#Z9hp4PU%?NnA5Ve?WzRvMZ0O@C4H)%~HV2y^*hV2qEoiz( zz5<3dl{Wo`sL?96M`pOF*JQ=OZJIHJX1dX~T5O611hf@yR`@cQJwIv^2y3C&z0=go ze&rfWW=ox0?=c*qI_G3YDdQNE0qmWd?<)2}z4jFx6wxGxQ%i(S5(Pf#bGMu=k$R;% z$_YuBk}Q@6dS7p)+l%n0?#eJY@KvkjQ68-d__YvgBkF~EnUQ|3IgxuiA4|QdB@nCj zIM?S}pjBwRRAhwehQf$82uf^kJE^svQy$1LfU`7-UJY&I5l(={=2Z}9rR0|z{B4U? zNrYckbq4gns`f&Ko}uAX!hm`tfV=xBURE_Lk+~AL!4asOPH$tU`vgQrBC*w(PNO!M zIN90^#zolP`^9~H=kt#~dU^T!&6}^je)G7ur9S$ZoV;> zJ7>#bE5K=>mh~Z%sTmVel~|@}&th=Oq3+t)JGat{OkG*O?5+DXZ$Lc-zVgYCVv*SP z71L1W2mlX{`^}s849Yc3%+sF8#^Ispe)3q1 z?aRdiVJYmBN=Jh6yn_n^XwJX&SFp6Cymy=k#-#wsr1VooMXcIYv`JN^0;~%5c-19q zh3JQabtY6eSL0@b3KGHFtbzWZ2msiqQLy^PD+wP!oxqZgNtUS9rh|H<$DZ~m>{$yaOWioa~+-6g+xfA>H7XCD9c zfBXK^Z{NT8?CyHE9y1;jdBN*X_opvE`rrO@_y59QUhCD}<>D9lk%pbuyBGKS|NHe1 z{@4Gn`~UReqhI|jKY6hut~(#G+C8*{FFejwy38+XhyCnh4Crw$1|-%=(_ggr|a_SY7}XxDj(WM;<_PIL_d> zDHw|one#tr==ALo!)?wV`J55}jnfi3NXZ+Qt^bB2t{5q}vC?kLR5>@MCgq~45IO*A zK$X9^Z+9X*j%vlsyn(4?%qc*X=wUEqZd_!@)jXAvUCaJKE3&Ur1eGQ#XRaKqza4CL zDrWE$yyhuhYQb!rrIW7_DJ3g*X$x$Sw|dSezm3RN4D$EJ!aUT}H{!HjUg8G>hI`6& zQVn56Jx83w0o%Bbk@;pabsI#`08sNrU6{U#ZHUDbOeLcT8_)ZxaD$ z2%(9`6|)FG$c#etY@vlsJ*64Oe&Z2nIh`mn)=X1LrqM6itr-sdI<}6W{=cYgglW+#4~JVKdsbsrOmo=z>LdR!b63?PbIIT zBW|d*(NQ0hbu!sZXXV<4^gaThF&1j4QH6MDYS`3^x{$*bN?>l6#1OK0Jci{2>JhilW#*ataAI>^$j>c795#rLKv-|XbT=F9jI4$9iKo>O z(W}t2A3RN{hvmc}0iNzo)hxcZVr8D$itOwz_x|YBzw(p!|M>so-~C7b<`4gcKk}Vl z|K!D5fy@sduD|p3hkx}4Kl>;Cjo|MI(d zhfn_g-@gB|-@bhIDG-_0%bR`u_kaG2|LgC5@z4J5i+6YN0-4*AXXeoHXH*k_4#gSI zNANeE*Til#0(?H6&&#AT#6`4Hv4i=ytk$Ep@l=c{iz6f`Aqc`CA6L_+M6`NKwBZz{ z%wWV^+Z6xYG9iOo9bsk*7edWbKIL`Z;{B07*xvZ>~aRbK=W&8*PDn~iu+OV$AgyqdL7Eq0r5J_$!qcfcF5HFpy8G)(dV z#+IJ}DwPejTu0_t2A+Yy;>MG1=gY~{=NO*C_L*~`afg7;HX>aSeEz>9l;mA1TIqN8 zOy2;I`>5r$ba|<#JDXm)4xj_P!wYTc`pTz#gn?hOfn6*Th3zeQ=-dCmHp9%BYAEgm+&~PQZT}=HE}?UM z@3(kFKpBeJm*a|OZh%rr?^IRX8XX#xI&BU^w{NkX`9AEdkN1tnw;{P7=eZg*G5U(1W9WjVxa7oo=AEj^Pt^>QEhsA z6C;}>zuo=L)1#z!MkJKTWeN=Wunoj}!oriUFtXOrbOZo~tjg=^4bmFyV8JM zs!f3vd!ruQj9eM9-2KTmi0wzfCG!l##!lSb#kW3v_3|#h{QBz;k5^~~X?UV^sby(L zD8P0c4&>=AV?uGmYj( z3e1~gg$%@qo8#}a5e*0__jKSovbK70YPP+g&Jvj-qYQN{W^)`$`x~-#`jNfB4O6G; z+IZLOWYp8TWs0_i7VEB;kkrE~4uh()LZV8#_T|IF2Ht=2(d&oD{fl3`jm!OvEa3zt zopnbgQ0b&$Y|=+mS7mkF!_w=7iK{IVLV!?$4UHAF&2^_S48^6h4L>%_!lheXvO<-? z(<`6;glGy!hM7f=eI}G&csRmWK=r6{)?p!Gt5OqUd?ltP+(hi$?77kgnP&3;v37Ok z{fM>tj@ao9amMrx%V)xCd*a`8rPMK$bv&kWWq_-H-eL`PH2kV%Gcu{^ zj>DuRikJJ3KKd8Gc>DkUm;XP1=Wl%L&wc+}zy8Uq>)yZfi?{#g?|=3G{LvR*Wxo3O z<@NCjDDgx0RgiJHK79Joi@)^O^1uI2=0Eu79{=ob$9FzoEAZ2wU;e_sb@}K1y?t4C zFJIQFVtPqU133{)PYa7ys6eKmFT(?bUC8_x|%&*XzTF-~Gj#fA#kt z{+%yhTwbjEwYzVdYO$5^$k`2U6i8^YY}ZYH-ihy-fs9*aNgWP`hEtv=WE=N4AlZ!F z{~nr)oPj?25r3r^R8(j<>&IL5hWxYYvj1)7%YX}P{u%$*FL5ennXa$ zVsALv(Cw|_7Lp=(#bUSPQfc3qU%#HeNm2kZcDIuvM*1|f58m$c9r9q!A*AO? z<-NKlp@6Md9iLfiH?I&8KK4RskXH);@juzA6IB$ijbM`mtzLIrfx?LBr253wI( zFHDc^=hSYeo<|Jt0n>WWWDO>Qy+ZhG)u}p)$ua>@%nlw@zd<%uxVo*DprjPg4wRCP z!biwWZFPL2?%U-DWE;~ZW@=i=xuQ;{g_`Z>H5bvfk@x+F*LH)6yvt_1x)}wF6!PJC6hS!m8F=gLy>-qYumI=g6+Mp7*{MX08ofGSA4;?4Zg`_4 zGv*r-wa_fX9JJ_Ljw7RNIx9Ut^cA+`ba%ldwE5d08AjMRak zGg|>}$W5qJ6|5jomM_|((T2>+#d~&l8JrLRdO#}?-2mhx$$CT%$;BK>w42M*9E$Zo ze)j3hk6&KCdi(WKsNN}1Xj#wv-f@4xNp2yJ6ZH!Ir>ocWZk&-a14g=nB?{@Pp`(+%? z{pSClu}5b847xqXmk2rk-l#X9IX6Tgu_M-p$Lr<8`_Ddo_5Q=-ySG=Y3y?Z0I>s&^ zlVdm;J~EcQ6e##uNF5`s#;yH%KBgmrh76m*smM zq(x^G_6-@hgOK=~0=IkvNH4()->BkgF1|jbdQ#4)?8txwGO!Zxf!GmiU-zq5ukT*G zc=OeldA;JIZ8OX!u-MNEKGjZas+WLNw_T1G+&(q~#lHWkL(4 zdX71?VHL3gzxLhFUdP)X{qP4@pN33W8+~wZGt(-;K zic5-@`0)1K!`pZJ4(p>kAn|tJt^1cBz4nBmt2=3@F;=XqqqJmD6C+ecqM~OqKghOr z#TDUyx>v48p|fw*)XGOS+sOIKXdADUtj>s{K#;=smdFS>2O>3|%MrS~I%3If&JBly zT*B@dc+*R%jP#u#hWTg^b&OGdFd~GL2T!23t1IcD{?-4Ub?k*AcE9g{LCp90O z5_@Y`$SF4tK9`u_gvK8#awL!GvXK?vB1c6+N7fOmW~fNnsosGt66~j8*Pf9dOx7$4 zJaJ;1%@n_)$ROB@bK`(;DUqpO@~m=G{YLfQh^Z|m*=d}{m2Pfb^k4*SIF zmOE3p;ZJaxNtw1CYUMYk`bOHEF%l6$oj5C-XI4y+CeYsvd?F3OQAW`s>@p-x zUaAw&7*HQNc8AyQx+7}USmr87q$)C=YB70hux@5Mb;x#_mQ~rZ;`Sl$zbVk2IgZ7k zjYXu1SZbj58whw?$DOQYXHXrAW9coh)wQ(2ET>5o`J5$WgP)Tgn?kD(6ILSH7lQb1 zytOt)V3Mh1^G-BwcbzCFDYhF6TN^JAfb}vIM>|lfMl9mx-*!y}Xmd@!2$@C7!5iHa zotxgVCnRmsM*fjya*E_AvL(y5K5j&ELy%jfjSKA>rnn_#9MNvTZi@(Yi}cmooV}hW z?F>;nW(*Bl#|piW7t>_q@Wn$Tk2chG@jX;I!VHWyP7S2gVIEVSBitKc^)u|V?Y-BA zggKU}QWmIDr+M30a}Wfjh4rpYAw#ct1k#mDF7M8sqC{YzQ%pmVSfqoIUXE}+kerGJ z^L`!r3GopRkMIA;ul?3<{np?3@Bc@?`@K8jCwc%Ua2{3*XL{5rOV;sb|a<4Bfh{4P<^(C!3a#3 z(6Lddndvy{7(h@kde%x_Pb+%ti4EeNce=nix})i?vweR^wVg3Mv+r9GSh3>c*Dv?u z`r+^YV&}z1oJIo**$^b>B?|2kf*m#v+o7r(%x$$$u+zno=bgfk7_8cwL+@^oWn%HT zqoS^o7P3xg+cBQH7AZ|*ZDJX5Jo+V#SvzbCb%%9T5R}(<`-Ip)H&DLo$$Y+v$SCA! z(=TP(aDd?Run~OaYFP=T>Sgn?(g=Ny9x0ZmM+Bc$D4*hhOF+=(GK3Wz7Gfvd#9%DRpCU~l9`EXymHqqFSNtE=LO!EA%Tr0Re&AXml?3(9rS zxF!aju>FltorxJcMmC!E@rq0`=7x!9+Lz%CYuG@Phg$u=(Dg;!`<Vt?JNF6!pL%l^^N^-SQ%7HBoW= z;(eP_HDVtI-wDp5EDu6&5Mp*c9N-L1Hr!68C(FKySgro215I1>DARi05hm#DEL$y@3NJ%fvbMeiM+-2G|XCzsA! zkM7Ap9)*g)L?lnMpDS3xgEz>{fx|U}^$P4< zV|{f}+?|ZWE~e&WjPfB&^>oogsyEj;Bc47Bjl%rayaY z5{$Do&=Cu~C_Ad?6wON2J3zEURFUjOIZpAw3)BniTY0kQ!4x!nz)>8cZLEb-w} zfyrDguSNu7RtJ6%*_A?q+hJm3tBD|026E?G@ySQ`EAs7!hkbo&2UgEb5;~mVsHm+7 zre_pWnSu6+SePpDa176Hk3A4jSUFQ%40oXTwZJSdHgTjuEl?Xi>-Ey+0FN+qJtGla z6;{-g&p@O&6mpv4!S$#xJZFv)DUJ4?KcAtc$M9-EJWcpyjHDT_J z4<8;rdiDC_k6(THi?_JkoiOSuTz#4uT5BVv#E!A{c8XaF&_Z4J`iMjjprHrq^RHtcZ=T`#hxA`&$30Ljpb|8WxTOZayA!*H_BOl4z8*mdv z@hSp*I5ViI*z5oydq%1(Z!JW!tCK~+TK$Z!NS%;OAWLplwJP*B@rLQ-l8z>cxFq-z zi}ZuG4ZCenpp}J=+IeaK$|D_3C$Sa`<55u^*PYmVAzodOh`sZ1Un3%CEKk6;GJ{+! z#JcXhUa=zXFTD2QnhLiKbc1WPB(grv+*!vPT-GJ)bpSh~=jo^59A;Qir*|=Q*H9tb z2v1s;s~SeilA~gqV5gm*OD@5sQrh(lR!5cul|3rf9q^W{N1e{u3V523qIa{BjE?#= zQXebRDN8$R!ri;i$27fPsX*(=95=JGV?F#$Di(bS+1$ zwdy%V-|x`US#AJ2m5S|)ZbD-$l~Xmny4^NBh_-{5=y<6A$RJyvOkFY&xkd+B3NFD< ze!4cHVHnD}UAc>a32kGU%VIR)vDn9tLzvMUHK|vN2FQ)www_%9gd=uimfk{cMqw|SbXw4jgw9eLRQs1PDNQ;650hL! zQvqinOeTOf*tDl+`jLyyhFZHd*G<<$BHOD%MI$ibb;BOlQ~(#w{_S4$*DdV7%4E*B{_hzo^-t%B^w*5NnIod401Y{FL_< zT589Werj*2?I9xTt?D^$H!q6##ck9sup@1nn>dhY2Ges$~7#LWvaZ+qA0=UtG3EA z9L`!54bf{30@Z6elS4{yNr`C2sP{5mmo)5z_IC_-3FwH%6cuv7dQDOY3A<{X<|Hw! zHt$N0ZKU1(cOIfm#WEr1FaewgAjgW_*(RbDq%AT!vLwmaX+mXAh5tNn0&`wEkuAp= z44_lmhK7#)eF~JB(yYv@=v;|Cf`|asIfJ9Ea|F$7D~j>qum>}o%6KeY>3gjsr_-TK zX5EbOR)kjMBpBJJYHk^tsX{N<7uBnjFH5twk1$1z$tg#3JW!D&BC%iIuh%c{-hX)i z;qfulOP;6GB+oXL>y0pRgGsgpSG6t3jF<#Ew`Z73@EkEMTJmP4n<3Ymx^d=`p0VO7 z(8cEj4tIW^JEnSb)EAtHM&8CtDzcx!a?&WJ^}Q;jwSsw$k; zpmS~oL?)7_`gJVk%8ZH{brOT>QN7HpGN9M^bg4}Y%+3lVy@$u^V_rY`_|;cmy_JyV zm859*n?Q^LZS zS=9K^g&U&ccli+?qu?u)3s_2QsFQLjwB77t!+bDzs>r6-{z*2HYAA5Pc8svtgJIF- zfP|wCZ=kQ!1XPp$@wd^bnY>{o;+nW7#@3nY5KVc&l5#s4h)s62Zt|otFSNVMiJz?u1TLF~hGjxHK&<7^K{Tl;BJcJJf|v<~oP@oo&93Db`k$hX z-B{1bDq+E4!Y#K7MmYrLFH_{QW>T)>+`3M;9S|U;8s6O=+jY5 zm_}(R+S~gyLP`KOon!xwg*~iSk>_AHiLgp_+=1kvsf+i}ilc?GNZ4a2Jg3*5$8bpV zWwPzL_d{(NPjLqP^G~~WeR*U4hd%U$%v-|m>LV>i-AFTtxmr8M4vL7N*nRb3LZOio zZ93Dk&ZPvvbHzdXtPVmZJ%Uh(`BHuN;7nZK`)B#{2LlhFZkGst4v(sYLIC&s~_^rBRPoiI%s{q+fPHq!23 zsU@WyXoj6)RdS;vbhd3|Zl?(Qxi|$XpN^yJ(M}z}3^X~1pu&$xasJ4#=}yUj z#OtyxfJT|~#t1YtVSW|8vm^|Mp^UqeG(f4^$n+qsc1+>;>3L{op%YBJQJnQ7xImHcw4-XG_7rc0R->0gMpd3tn-As>ut$e0VZXekSOn}{8;mt89Y@9Oo zHq6kYr^O5>au6x^9uO8!(~qaA9Q6}{s)zH)$ZLNSWG985n`AKWF?{o->#Wuiz`9(jalUyv zZu6p9So+EWFG1BtqTbHfFT8e0(Ti*sUsN8B6KWZ!*-+r+>yfqa01St;I}P)6#?;XW zn5$M4rf|*IPAni86H6SagU=@1Dr#1uW^h-^|ZP zx>rhO2#uvhOoKY13c$juJAI};((hW&EDMq4YAItuiT;oSC9Otblywak8=Eu5omXz# z7TPGfm_5ojRU37@JJBbzUfd;U8)^#K>{3M2dmb<&suPUr{n>$(=JNuxlV=Yb{fjWk zVi6;msf|#2=%}q>YJH>5>pq92&qp+DS9~WAD}q&o0=Tj%_BUCJRFT25q(nC?Qbt95 zbqsW<=}aTi9e4U~9{bu1Zs@wBp>{e#=B|sEvVt7Mv_c(W0KWscEMMvNOo7z$vkJV? zlp#`~eF&MrbsWU4E0;hFK<3h()iOYh)*v)=AJB=<$pGfMaQqxLs}Gb~oj9cnj9+U_ zbXqqOE0kIs(%@``upAa^Sx;PyOlBv~m=j`^sipGEWcyYDlr)HkjyXlWbu`YPfsjZ6 zIlW5~F8q=xmdFF~wR^xef0OgT+Yl~P<`QCXpxPP0_ttFcv{BaIBS9X@bgsX^#o z`4Q$XgC`IZR!84)$?;$l%axrz{!G+#qLrX~CL`lQn^|V&=9@I)$rgzQa+PGzfgP%D zr)6i@nqoXKRVd&swiRHi7c8khiSm-y$VwC_xnPm%0LRW&{zOKZJjW z9l^ptZ}U?TVLm@nBpiY9Hb<&~_uh_`4DLE7IxFLsP22fvIcTl5)`Hha2Gs$Kb}Du% zb%NFa6irj=@9f~{rzcQ*E7CXh@t0r<^(1ylGqnm&P(#(!9nl6BycPn4M zxIFI1508)H{fIb6Mh%D<*;R2yGh+D@UZQ4zNLy)wIfD~projwM(om!UazXjNVpC5| zRrZ4z0FpkK))d7P$lQ)Za*Yt$3~5S?Sfih+fvoA2BN6O7tr{Mr^d3Nk0besB_JUW5 zM$;;D=`*D3Q7sRIqKn|D7hg4aIwwhOhEGT1!mCsW$&Ab>j@fHWqm(_SnNz%ae7pj9 z{p!A736rT(#W_t#AEHd(CK9o9$Pv{_`nQ0PG+V-rhoz zIb>wfyK2CkPM!%%mh!y0Qu51DhzRs0263aLRAg|X5^1<&7_7f4UP&Y@$?)utl4tfl zrbk-Z9o9PxNTD;|(qlI*v5_lPa;88dY+>xPUhM~(QL2*t7=T6^RdVFszd}j&!=)4c zao|zgh4nVbDb9-JZ37U*tAk;?dm^7HUiF02XVTp7D83>f+nL5 z@wmxa;HxLeIrzm?wfDylnw=N71k;Y*Y{wzZPJ)_dbjUe^y5KbcKAzK}lL3Vi!TFX4 zGt;JjyX6f-Ch&GjC5vSiel04|nP~Bp`KvyroS2rEIKu(~ z^YVidcmFM5OsDG?%%3V&rq0p>4Hg-z^f~m10nwtZgJmU%bTYG|y#kJ#QE#ws$4xn7 zryGu{p-ClvYQA?Qo**MZLDXq{3&eeOSH3cv1G3uwj(8dxl|^A8VRVRBm1hZ`0+;&Q zjpDFE}3;9m59^wRITM z0=LR+j8?!z3?TOi_X(`Hzh8F?A08fV(%^?hWhd({msQIhq|eKW$LXcr`0Q0->MmA!&HP&N}jst*7{x3WC%lmui z;n}hX{Ua|Odt$`Tctp?iRm&?fbBH2sB#o6$)f$2_5ph?a~giE8|`8-7U_abe9AhZ9YDld*jrYlmKh&AqF5LkvaCD+zH?hDNIiwowj!S|yNy6( zuDGn|;)x-*%~!Spt#vt@aYo*8XE;Icxf>d9uz8X&bO?)^(PqirLxdKJk4HE-h{&R? zc9-ag4UK$hgKW|#bxNWz+^3zk3@4=OK^`(!ukcBRC(xy@hb=ti6N%av!Z*`X{zG6+ z=|{&drp!AEE4|hr)vg)GZhV|HLeDrKyn(&xiB!=C@xcyfji_JiXrx4!HFDm z)Q}oUIv36T2B^-b<#R-O%eujF1L2_9A({XnUK*lGJ7?n(nvP@Y1Co(Vb9(Zep3^(E zG6T!$-r}n@Ff9{$W@2okndxxD9HnO?Q{%8dtfxIy4Rl7|KWk)iv)$NsVZ~aNM2~fL z;M{`l%98!YdOo@1)d3SELgoRNlbrtS(kS^lG-Cm*rPFY_^ulPZhojmkpy#6N`6$p# zHe-CIGMtJQjAgosF~$%7-f0~ARiA=-ebM>VXpu)mMD9(0QxhYpZL&`Rr^Xp=pd9%@ zTc&az(KpF%d!JS(7mJ&&ke0THlKn-GX_q@gb=<0BXnHxRf{@Y<-vPQ;1Cn2!b>8im z${?65OVkW^aF0w02@zCO$k}lWFZ`?PyB4Rm4jM|(BO&X2>kP}%grp5VoxrU&_Gr;K zv6{VLC1%NV2|QD*^N4KJ49mnQOVy-|$efnZo{y8jK-xaZ9L8Qutdoh1>qEMn64kxJ zl>?wkEG-7K$xw8&d@tG37$qO1hxEj%kdLRRv~DG?ZT?SO#=AT@c1&AwmUaNUMON3- z2vdkFW2E`>btHT;nL{tqx1m7kVSw#q=|vkEM}*p2H|WMJADi&`Y^?(Qxt9v&WhB16a6y&H}%ve&6v?fPodR166Hk;@h;NR}}V#sQMOo6UG?iR2iI^kKZ-TeHa_@b2cVEZ( zbp`>YQH)CNpPBj)2{TvCp4>e`+<}D;e zcl~Xdi6I94k%wf6<_)hy3?q2`B)F}`qW}Jq33m~$z*2@?XfRiq**l6@yl;F?J-5p%fC1pNI9R|1)G8&46 zg90t&6qiB_#0Pkl4>I)-W$izc1I3AmuPCpwq_KeNAo}+wqV~hNWc?<~3me#EB zaVE08PDt$!B$-rb_%ZrX5w-jc{SmFE&eZ0Z6n~E&eafd(|5T#^Skn>L#ilV$QLD_z(sH;;6gEY{w*uAC2!ta1 z$PEW$O1S;`lP2%zJvEJ;jE9s;FVPyWE@E?D{7#XytZw3|+Al*hwDkffTY zQfzl2!*K>sO5sOyPH;Fy>)+i{88T_tl$u6{JZJVoYY)!G+=v;zzVyvmCs>Y@Y~(6l zms-J@#>{D%3JOmDf+Tf*7)lNh5>QT`rrc&WGmG)j`!j}<;O;coVmwwmXbaA$*3VX@ zLDI8LYnrMN7BYX)d}G0KFn&0yKnxi6pLALWv-(N0VW)sE(ph_VzMTUov8JvHc-T=3l38<~lQFoX|?PUrwv)7&J@9(D$> zvtF|?f<#9{9N^}};MCm=vjZ$7Sf#mEm80kFYHN+2>u%lOT|T_8oo`y$au^Ibr@~7m zNj3{zt!_ZC54McmfODK|2OTzWhmlL(HeuX38jM@DYE5>0l6@-h^$L9Q!F@X;DM+7o zD_JUz4sB_rq|O(;pei3F3UPGN1fV7~icn3nPg@dLM+q@CWS2YL5l>l`fX~ZR?i#Y# z&$M5>BL})*%mS8K#o#{j2s>|+G*%X z_1B2=vU0Br4%bO>2QBK1dlc4t*03b}G^GEbChWZE3n?m0)#E76Mv_1n0kS2xjgHUHqQqdA1_{jRV&3ZSim8zv-^lNllAa6F)P$)6n9llDBRWvu4hq-| zx`|4u=&BqbKk4zh%Av%Ap3xL{xY_?9XU#3;%dNjUx1%v^gx zGuhIxbDy7!kM8T80)vRndBYr7dn1dOgpUlEf=asi$QA@boJ6r_$m*H74l#(hC$=#- zO%2^6YF$VJ^tI0jNWdx*+l%2|?kU+`02xjlYAb8NI0Wof5KJjFNuiZW6{NE3lsz$k zHNp&A$_{OoiR{SGrQKwqr^my#*{$%(_nhiCSV_J$=rS|2>J?3QXkDiT0|US4K^WZBvT@{Hn7b z%gWI((-GZ9J>@E*T;Hly=gb5G&YPWvcGj9oq7WZv+@PDrRDa83wh&pe8UW7Wa>~b; z+#od9;s$RG%9H(|F-QfYZ4Rk$svcDR>^#;*N`Qn!Ig{2AET-pL456jUaPDVRIGU~| zioSrKA zn3ML(IrWT=!&Q2V4V+5V|98?f^OP}WdXwN_*fzppXFW7bR6r#fV(wmTN1M}n8NBf-WYo5K7gGo;_m+L z?(VKYZ1Y7x;B95k+%aEUKcdcNT5E9@2qh0?DL?~x0f3dUGq2Zc6;XydW?t&`7gjb% z%jr5=Q7*@ZAWE__AzO^~T6F!P4C^a|k#QPcjd$m%OIbMaV1dgQuPJ84+7t+~u~xDcF*v{+=%&a4ix zJLBqgRzX2pzX;sXGRtIzC}r;>kt$mo*;$q4B(mL+=4I@%SsohDkW5K{sJG(;mZ)^r zF7ae5QYK5gT%-T!;3BMQ`354A?~*LyEBTE~@1~ED@kM50^@DtFqQGFQ+;=<{!1cf^ zy3i@o@ElzW32TZyb(9~u&|NW~X9{9Uq=hdd60;3tyjOY5)1RC5DVrb#PdhAY_ZT?Ftc9+q3goB_6l(#Y|RGV#v{J5ObOOgBw~q>jwP-^$mjx^i#uW>!8c9npKAV$l4A z&ZH6dmz1PT^l3OLD;##Y&+A6aLaQ>4p>TWCh^o^V#RQ9~esNsAK{3nH!;H#Uq(;HbfN;*Z zcBShnFX=%T(=X8{FgRfm`X4B4soqrV&x<;s>5iKjd_rUXA<`Q6bim&|O&{Uk$ z$`5XPvd}AMpQ2D$m>9WBLtlR`dZK{ZV(%sthm{KWy5EqjYIi2}gopy+XnEeE%E6w? zuhXVtTo6w_@dtt!3PS@28ti0yf{!uJQub~FZa|}v&8}k=L|;laJy<%@Q%``leAkK*Oqn-wSo^zE_u#iTECxGb!%sox?bqm z<~jL&@?-lc^@U=7C+1^v%j0GQPv4Zmm&Ps8wD$1t^*IgQ+4xgTP%>f6doDta-#kNm z#{jn4dCjItzh+k49x5o~La&{8q|D=(&6d(!{c;RweuwAc_FrkSC3j|ya1(|!Ao>1F zo1b|Z!D$Aj7S^DK@|_8!6j}c)FFcA-nN~^UXv4W|;|aIQT)OLVQu6$d1`!#F;9`>vI^1{Sz5bb#b|@%UWy2^}4qz^TE@&Lp%o5SSer`4c39ZTE8SAm3LJY*?W^E z=x>T396@<_3N^=cwMxiIGbh~6?46sY^aQ{px38(TMoK&#K02#n?%2c|!cXV0Dn?eoJ-V6kbgLtSS} z(buRMcErHLPkZ#I)7)Nkb3sZ301#USatx4X?9|g#`i@N!+2XQ}o;XA=4#2@jeWAx=`+hT%62ZnEOXL0(B*)&OQmd|qdbU<{-=}_qS*Iz3T zOoM3^1S+H~i?_Gb>@-{%RfFAS&J2@-bqhKi>d$baQs>h_>ZBR)V2KK7UJKR)NxP z95F;dlG;&nEFB3A0PnhpIriKN(Vx!}qs1<(Zeix$Gp+OQ8tbX5IgYHFjMO+2w1h~$ z9^5t}{nrSjly`TU5D4sz6*$Azvw$$rAi~=po*{eISOK@+AH`7kT)c2 zd)yxY947Ng_H?k&b6IjNsxXV^DL*iBPWbtT(J{ysnk8AA7NG5+(w7EN3dHObz02Kz z_e2&Gv|&Qkg(o9>rz(`WS3r_3685buZo&XYTz7;U3B*B~%S$v~-?%{dl#Bjk5P#}v z{-jN5tl70AhFxIPdQXIg+ff?`_ao&4mreQhtRB?E*gM!HDW!_O;kBw4w zy}RmAIoGT4;ng7LYPmIB8{*k?$T}erLlLRJi=nfq9c~@31G@UNqMS4ZaGBW%FCfd{nrGPBoSqOLe8;&t9bhGomQr z{SyusiPVJ6ziZ?PP-y#+D0a%=2J?=`-R0nx1QdFlsM4E7iFz_Xz}t?fO1NO>L`r!A zI^%-@hGrirGZ=24a_SRf+MXnePG9v)fG2S=7ZLqD#e?S^a@>&z%74_{357>4(#n5Q zkIou;67Zq-irT8Thu0;*T(6d9Qrl1JKiunK$8(f8x*h;GokWPuA&RhE!oVxpM-Xmx zLH3@LqB$y=FVQT-W@s?j9qH!~?-W0^z6Th?J^4%qwZ><+pvrZQy$sVj4R+%v`h}06 zQYGj}Z0#BtpZG=^bGoz@N+aPmy?(YEgQir|>luWJ(DKO;!%eWe?>QLn*qDR&@T47u zZ)2^(dQuXN4)x#gXMwHLtOupzf*x}a5r{}0;8gDk$qO#ig9x z`4cO(%|N;JLOeulS%#lZ6a0{ErP(35=8lXE>Z-&MJZUEkLz=;C2nZA&tPp7lDgC3y zEqP11nOn!rTe-dgH%aNW7}+^z@ge0T$eX=1S~jic6{D;^udBfODyBGm{3-mY%I&Ae5C zLt_F9^~$-3@o;D>urxeeu=_NSv2f&F$h|jYu9eXY)2(=^;FYo@W#N&rkI@Zru4l-{ z=3d=;%_R|!wqA2}K&dbxkW$(j3qWKZUe;sjCViJbT9ygumA}(N``P*Wdkt{g z3RyS4cteGPfA*_N`D0W`?^|stCk9G{%0OxYIkBgOUCaB>_LZMAaE?#JQ!vifK74XGZZyebz z`4GoRgV!3YEW0r&di;7(Eu|5Dt-XFUVmUA8-Pv;N2RrJ;!TXxGclT7it)iMy?p7FY z572Ey>&Tnz2M&yryN|j6&Un1ErRHq>|494qfLp5SejHwF&z$nq+bdjp6A;7-h`kr= zim}Cl5?icMqsByI!>C^?Ca9R$dyU3|QDQ|!ssTjGfvrju4k0C3_qyEVh;M_OzFlbNRUA=xJaY<3fVeI zE(;WP09M%SiRLh7Gd4Y$G5~?7ju=9^Rtx#2oKUiN3Eh4JHn|Z~uR&LXDO(IM$qK2i z)8ZT)8_goIS0L?Ws2P!oAom9m1iz6S8A*9S-tlD!7KMGUC*5|5 zEE@z(Y$dQW4O#2b!ng4yKQfv6q{v3WhWQ`Iqd^fjB}UOfrfd8_pyZo;4V|*d(THmd zq%8zF&*~L18O=BxIqqbX6*QBza4)6~+2SuYhs&g@4?}1qKg2{fWTGonnv#f^QSxM4 z-KG5YC3>3AP}C%H4Vdc5ADpp}n{%@*;*RjDcgN&gqu9Be-Df7`oT{O0`zEs$AM%?F zkock}FjrEOV-UT%7Md()3H;dtF{h}mU#mPg0;1M9E>>C$Xqt}kgBfGwfAUtOVB)cy z9M>8@j6$>{y>fF7tX@dauKv7&{2UH5(5ru$fuVO-)Y4218niri)}U4^?Nhh-nn^B) z6Wh&{(qyC6qk)o^$2-rL@?^Yd>&ov5akO}#@Ld(5NSKcHlT%(JKI)*-*g%IEA~-uT zC7Z6{P7SUs9P#ln89W3njNL-u3Jzm#?>fECbg;QsW&|49o|uH-*lb8pKS&E8EA13o zcz+{Uw&=MQdD`aFm2jU-CfU!q=XjIW{#hgSc3$NaVB|F>SdoGT(s>)k6@;9b zxv%B3VNmT-p)8+ylo-|?I%Q#lI+6gTiBwbSc48X05mzYx+Ag98*C@4Pv8XaGGx!oMeL0L=N-6ODd5m98YwA<~X2>o6! z5`{vZzX@X8vIq<#uaPxX$|MIGZ73(z0$~WDswx0zwaUR@2*w$)X^61V4ZyW4uj~R4 zgb>mqz32{NAuBXF@mlk`Z3g^HR!V3Ef(Y)h#0WqX<*_PcLJ*$^Ae#Yfy9WYjRj!kz z136xbtoRuD2*RtB>9Vtn)EVp^NNE;x`XC^Tp#6GsH@{=;AezScYtXd-J=Dw}+nsKw z-D;&-V&v<+v}XYnrBG+-5K!78r7^%HO>V+KSsT@vF6rgO4NZH38%WO#h{>bbr4KM@ zDoo2lH6oTpiL6L7$b|gdqcK#3MtjBB_HqOOqDY=w-zY#ZOJ`8v-!i;zqPmEXTXvom zLx#kIgbs_kVrx0EEc`rlBY177H<0fDi9MMZlxR+|T$e-0&eDhMH<6r*sF8+{i>H}D zyjdB-F$4!2)JXSAkx5+LsUxrWa+WB*;(m~soUi+H!HmF}Wjb!9L|0=Rf@?fsb9CV` zGg1&Knw5>}s`=8|Hz#_<7rB{Iy5ccjLxDh$%gh?G^|f+}c6A+F?RGsJM!60)0bP(d zp&JIsNiv3`c*Rq(!xP%^{n=3QxRoF;STMz(HogI)l ziYyMAX(gZJ0OHr@NQx$OUnyNE2qQemd&64CxcUmJOq?OD;3AHGgI_c{Boyk1-a-Kd zFa4z8C-jw#&ZUk(*}3l55kmbz)UbAsJo%YyQ{*W?(w+NmlZv-YA?=-)+=(xh6up&^nN!>!Kh{ajE{h)khO48x<*O+n1 za^d@E`R11!M(x<5h@;anrKF;;0zkTDR5T-_praW9z`;{~l@pVhIip*Z2pQ3+C`vN2 zn1{z}$(%F5VY(bwiC%Mcr7Cib=9ZolnPO;$p2{Tof9xgeoq8e{%c)0TcA0RpX^Xc0 zk$wsGi=SM|3hfv1xX71tgb)ITL4UBcytur)RM&L~@`Q)LkBrE5!lvPh8060&2P>@! z!lh8>l9Y0-0m#xXX!v5vS*_+)L?HL%0RRYPQMAiyFrcV6>mdn(S*Y-$v@%=CB;8Q# z(g0`mn!FL|g{uJ4`zTvw*(!&_VKW*y7OfFtD>dm~>i3q32tr8L85D>iw2HEb5T$p6 zjxcEq$(W98xr7ARK7a@zA~%Y#9#;M3#iG?|cgI|VQV$nXVZY$`tYsDv==KvA0U7R6 zqa+fmn^bE_D~TACr&Fs1NNX&|TQPsMTH8XQnuGbgU7|rITQ`Y(NTm<*8UuH!P$D;? zxP^vLo|Vb-3sI;|rJ!Y&HOfkssl>9BMYv#;nnP(p(6xbFODD}rdP#~d3{uqHoEA^T zj#;ZbKuGzB*`*8BE>5Smh`A`~?5S6hLWT61&{1mK$*j^p^ll(-O=%mXOH)Y$ewr@J zl3jZst!bqMpZ7zh*19W~_>JyFVkEFM2IYpW((efTS1=v@J)2BsVtDCejL<5}@rj96 zyFD0Iv-1l}iwncyFxHhRNu(|8=}4msAs)o#TeP3;SAzib$Btwwc?7i?FbjAnlxV!r zAc_cqAW|s16BCpD{!(2J%m-WrE-}(V4(6n|mv$mEiGY6Vm;nTz6d(Yk3p@1Y$tEQO z_IwD(qd2|}XaaWMxeqRajvlAV#q4{p#XRZt!ttVOyb!FnV@&v_f#TFCO_Bn*Y{HQP z5K+=%WC92}Qk7mf!2ZGEitG7y%&Guxib^#fAB*8u$~$DeuhtbQqs5 zaN8(@6~x@a(zt1(G;etj5&ZcZJA0aPS79<7NMch-!qiAo=4i@ajZqYmOjUWaA9Y-_ z>YNOBbUuFrj3Gau3Ehp48cg!ztXJKzf^2*b3d&U)r4iAa@RW__>2kNm&ErV6<5Gsn zyepf*(WLb_xuJFNQG3a{uUSAz7HijE$`lT#Z1SA*#wG&Kn(p~<_(xtu&6?dAWG;^p zXLD}Y2-c&q+t%0o@uO1rvhfq!h7WSTtJq!g#J} z?SFU~M@{z{u?}zS7CuLVFW$+#D{U@y&9Bj53Qf@{rCF~C@?!+)2>`8~lC|W->qpJW z&``6hj2M5CC%yqIO_TS(qTYZ)0#244nK6Zx3oW#IFT73O7OW;5i!kDf6C_mpFI z^XHYmFe$mLMxrqRAQqw9?oLgwnqDvuXPcQ%232Q)^)@n*ITNrQ~l~Y1|W@2XnZfi zwk_T0N_X{aZ7%@G#W$%EtgE^x%OVtYT{{ZV@^q;g$jBaKT#bZdzp! zAqH|*irE{KeZ2k`1NV^(FkkCgVN|_7H$zzq%+hc{pg-q3mR6Iyy>tpurc`AzmrL{F z3P-)ZGi=ebMm+#gEyJf*)EIk2B9=55tmJfwS+5X}j7V^y+93o`c8wKli`p6=NX>dKi=^-Lvoe_$6d2ta1T>*JHz<;)Tv^x%BXh0Pe8Z-;nw%p7 z@O{umi~{{}BZenHKr5XjI|Ib3EaMs_kdG(ObbTdS%?dQUVDEy(&7?+8Z@fl-b^R8NWf`d>v>3?$ zS>jCc=*C}Rv=uEsA5yN5l`%*A%xsXXUj1kDo$x>Y_R22ph z3oQD}OK*DjI}h8owTfY)+a2}>GjlVS{`S%z{NUpK2j|+IcJzCf(%tDP0>sowNVR*A znlYtTp1V}k1%beIPO5#2*J#yOu+a z0s!lJAnTe?FO`yZ3935KqB-(eX6aH%gF7_areil@LGc+?sBtUmCS_{+@U{^^zPX8MHjNVirQmX{oBX9Pn?-*D>W+2C#wQLO*uQY# zARuB0*lxv`97XqCd*1)Y*T@pSve_JmgbGLIN=5YlJh3g%=V^&{vXha-x~95G%bm<5 zVh4>a_PeG;{~LMODH6JbeILfiAF9X>8DD>Xw$Xr^onrCGw(5XcSY%4RE>tx5}WSikM7x)n&H$Ty-#%=x0fe$!1NL0r8z;9LA;ZnvNbx(9~&eoVmiR&>@HUa$P&#F4*oZ<|LF`FlryR4Y(u zVFEqm@N~3-OkgDeS|;j3OLJ;+|M#6%0LU7`D|_+(;;ZbJ2H5}EGcuW@ZAM)YucQm8 z{*t*G=EBKwO6$O^FkG4pSDw`brLoG_XDgxG${RUX{HF2apTTIJ zobAFyIubhnEJ8MCT+za)aex)Nh(%EbfD(Xk&+WG@%*`Eg=wSthg9i^{Q7G$D^Aa}h zT!^DPfY{bGAypkk=l+Q9>KnN}hCs?a79KC9^EL#>V2sph6+{&4S{bww(#lj+!SW}c zUyiZRU}La6JCVhxA^ z3It0rQ)joX>lQ@BR-`a2P1;WfB!u6P=E1How${NmYh{XzXy`p0Cm00e;_=1%_8BNK`FTCuE{Sc?=> zYa;_?M5KuNN|PjtxGBT^JY^enH;CGUC^*d(bL>QLpVQ&(R(pJ6a@Ve1{khrD?nVHj zNRdEydERMG_UF^(|1oOorYxV6qu7%Yyu!)2(&!_zIx+c@fPI8FvtYKf#5~`kl~7?p zBahJHj7>7hlwseyKDDut6qRwS7~_f-%*SoKvIJtKtkG5p?kqDwhFPQ7nrJ!w|I@1( z#l`e=xg_5pV0XMQvfTnL$1{&F$vcHli;y7x;>XN!$xp2j&6AlQoV`US2SZ_}O(m5N z0{7mIS9yBjCKdaOp}6I5m0>0%8$o21xrJ%UuK=vT+zP!L*S+^%fSy!0NZz${e7Qr7 z34NyyLWmyq$p5Y=oo|BDdC53+?B_lyKaT2_vV+JoyE0~FTxRCdU^k~{^lazqcXC*E zeCE-NPtN|**900|N5@1&_r0eL{kNb_(J=kSLHXEjtB{Sq(%~7JG5Y)7-JML}X>K}c zb}ONzW{WHhcSQ-ihOTBpC~10T6Urcna2d>Oua!F%8}E%@{StNek#pAOIL+_SjV|~9 z8nJeH-?)lqlq8Qx1mKg=hS9Ri>uQQ`f#*NuLJl_2z@3I{kdX(APgE2u;GQ@x3dM7YLuX$(VJi=>KJil)>aA6r^l+`03X zty>S9qBuJ{R~Cg_<}dqjMaM3p1&4oHx&c_BK?0jZTv&32>7ar4+e-;(kG2p_Y+ytv z0v4f28y|vRVyq4%wv!i_QI3)(j@)BZ7nt&p1R5QhDsZlnKC(&h?X0~{GL&(~f`Eu2 zKpA%4w)5yCwm$FN7ysvf{``>5n~pi^h}XRS)lYuh*}wVC?>_qBPZG3<;?i=DVg#xq z#WI9Ww}SwYAjZ1C)Q7%lK74oXL5ZV#kD%5d!-J_=B=G9NE=naStNmFdMaO42Jypm_-I8v88hAQ zQ|trLd5c0_4qt*a!8>14rq;Bx1EunYL`my;8J)_BFTSL3BeBvd3Y)R;@DGi0(02$XJ@ zXXERxinL3F_?j<%#F%upK+|#q8V(osOdWGlaR@@72pA-5(u9MoCnQXWNBIU-vQr6V z5|79k7V2CEqYOEDbOf6s%~BS{#KgqDef#?JbJ!W9SR33}dkUp1mxUKOt}!~f0^u{1ApiD|h(GGYw%hw?dM5vPTdUUL4t;D0at}U3d)!Ak?DJmop z(qzYOUYW<29G=X7K^mHRo<7qoiOYpI5VBkjohhBa6#uq_iQ}381G$sfj14tOPeN_B zlF|cS#nx)|geVk3s6iE{1zr(YGrl| zn#X|Ki#@g!e02=_3>D;`M-PE869u0cuSg8nXU`Nl2e zO_`ucg&Bzh0;#Rcf>96#rGKGqQBrj~X|PGFWb&{rZ;V=SU!xeL=}2tVsvC)$d4TkF zp6-icEoOdXpOgE5;<9h8N-`=doq{~P8kb?5rT2mo4M0oSLUOpnWEp_%A#VkUHOr;I zjnqX{W5Qqw=%vF_mb*kttwPd2zx~mOc5P^}1TPICkHuj8a(rUM(|T2pbTI%~C^C}z zyBMe{$+A?P#Ij?Rp;@u#Ljeo3GrW_U0sH*iMX00&0MwfXv(wtG2w15;#S+kz;(|0D zIcQ>c%Y#TF5X}@_5=;6p4+&Gq2FWW;K40N1K)}#_elZUk{l7i)I;782>rl+nYsE-7}8NXz-Vpt>V zE2LH^yG8UDMTx{w2#8Qee<2|Qo>;tyLlaE72Y>_}4NA7M>B<#SI~2`iNr?HB1_usM zc1gCqC*Uh1RA`6*0WbiD$%)CLD7N3WXK8Wf_T6~h^;hlQyX*Tu`1eOVww7$~^}T zb~~L=7QJ2{V!Z1~r`+Yl?Gj6biXb3G3`7P^8rC@d68(yaC1Z;& z@+Fhz3|7+;i&7HaI6|QahY&Fm1r=2a#l+M3kZUS~ysR`2;gty@&T}Bjeqe86>ePCV zP9oBME}AUrId<<+NghaDM)MZo$VV}Nk|n{37Xn&NARK9L!oFoH0g>;nW0%RfOhq7> z@9)W+dN=}exgd&Ev$F_BF(M#0e$whMD~E_UF~txlqb-f9N|UEJ@grlnTgFF*z%dsA zFaXrTtRetE3Rh~|G*NQ5^f4H>Dr@N`Njy);ydzVZdjbioqR!OanNA+ zk zHG= zfCE|o7nXA^2#pT!9r%-dsXo_alprI7a|u3x2yAU{q+DEq_l#pkC}axBNx_Iy!eqlq z(*ZS0%%*I}zyL`sOf4NGbCXNGghGu6c0GfzD)`}A7EXOAKr4{bRJY68fSRNO5Lc~E z1J;&9!4|_Rbp9eaP0qP)&+*_d6%X>5*68uCreCXoI5j0@*!j43MGFO{`GWg z_W(0$^!qskeE@X5L%%ojz5f|mTUWn?t)o#zv%}q{C zO-xVs2LrPHrMFwOK&>zXYFv6-HtCZg0AYXvknDNH|?ybA!I|LoUp zxN%2W7DZ8%p{$|G@kp1-(7yE|VC&IkGnSeppdv2oo=Y!7VmnWhpD2%TP6XTLGB9Cg+CA7)gUO$xJ(@Nn9jZFFBDAKTTD$0kHL%1V>D}(Hw$wJ-Aww=yjKq6>fY|0FuI3=3fsUs%-%!4%-h^*ijqi3>h`6LAi9x?AbNw`zAH;Javbu=Pp zNn(H5G0t4&dlFfIdZ=g{z)EJdd(>P&&eloE*j9mXJW@hH@~ zJ&#n*1{4F6uw|iI-CWHfo{^K*)2z4$@`G(ulMmmn#i)CF2 z2<(Ssg(@SJAX7leMo|q12#~nCLGe*!k2iNw(g097&=KrqEQ{KRc)-lMvFZM*15&w4 zU|_+CsC{k6riD)R87+LE%H9)}P9e+zOvWueGWpF%64O2_4DzwWZb*eXGJfOIW%hCuT;Wh7dQ2nef<2i^h%+i_TBS+6 zTNufp8bpmLq6_v;mrP_Daa?HTF5j^gIC&YYa0u58rcMq?Ox7co_6Ksp(@7(l~`y%z|DuG7lG79A3Q z%tge((>5%iBtkw(6kAvMqkJVsC3B*S#0Cu-WL@x4Ela&+2eLZYkzIL=oU4;x{AUYN z3kP*EGg;J36~xOFm?Q$}9t|#S!O^1T=Ftfi{fH@GI?Yp(q6y7dRh@1iBD)iV1s`An zIRGJAsbC@nHaYE0u)|trtBTCSu%Nn=q5VURP)>w7`(#2-zme|oF}!Co$U$m4R`~|a zfYaj!B%p6Os`Cy2ovvYfOf$Qrw!cxDbOz;?bEpozwnPpxy#7&ruwV`7 zNPJp7ltjszSeaI0f(Ss0b2BqV2;FYCjy0s`+LB?3%%&Sqc%@e-G@w-x84AgN7KqKG z%r}$;(V>((EF|5gWLb|YNZ}6q;)=~50#E=51OYU=TwHn$p6ZzBFD* zDw`*;zVk0tlyiOniDw?h`8X2O7i1L7Lvvn`+2k~ zY>&j-SBNOFCod+$r^b8=g4{GyzV-)8T2g9&%Bo>hx#_}#_X4viX}O|2ktU0|E(dT? zO~xgVoIvp)MFCqPNR9+buF=U9T6EM5PkPY;EExDPKgj2>0$Dz~hUR!zBSCps2j4E$ zwyCKR$X$_BV=Rc-h13GGeb=Z@9FVXW0WfU|6PV_GMegA>);vLe;4KD}S#qDCfY@%e zmX~|O#bs!iZh9x{$JFcL`L)QdoI*cUwfQ_~Sq zrqRe@WBJi3lNCcDnS_lg&M=f91IJu_d?XP`zU9Pd=)f?i@=d;n;(JcSIy9MCf;kdo zI~4U-M@>dw@~xBtm`uCIxDx zfwXSTc4@$<;*6@1?OK=}i!OfYi$rejGB*?iBwJO}?um?>bz#x{RWC+Sln6pr8yxBo zky)l$g8t*yD)fL{50DLS7Nf*a!xY7bJTxYus#^$LIAj7$qU3x-t2P&C8#IA8z%08E zWm+l6Cf3{sgC;zGeUrJbmc4eSVJa(5?8+E*88NLGkg1^#0f!t9HO6Jy7r+Nu^FnVp zI08BjaI}w)4$(7AZ$$X?qiDwcp3V^3IAd3I5lXciq9rfy>2|tM)b(g&y2hrM1S&G< za{U2kQfda0++>hvvO@Vilbvt5x&37MOI=h9l`?i3e2s9&USJ-I8Cz;~P2+cw)}}(u zi!3JiLm53Sa%nEK!roGW$AY}g*9?E1ZyL=`1dU2D*L8V${rDni4vQ(#_3|Yi7C78-FVikO& z0S1sj5n=_1goW=t*~E#CsFE0oz!|i#HwQ!nEXo1^F8JvC%Fu4N+lOu4G&4K%u}@y~ z#m{`UEL*Sp+t>95{Rchp;X7}?X<}mh+u#1u5l0^R^rt@IV;}kWzCF9nf7g3%xbc>o zuDfh{di=-V|K34iHr#RB*4MuFuVOuX$~k{|)$e`|7(V~$&wugrpL^Wn z9$rJGopD*vVIc(5Fe_0yRH9yWDE1PPsA^dYK(;GOl2D2uO(3)GtXgi4oqX-ZJ29nFbBs!BG zk$uGEUgmI=v1v7>cq{3@LT+Gj>h_@k89R2Mu*qea46ivPqhk`iLNF1eUE!&VVvh$V zQ@eCA(;z{i8ys5Dp7FY~$)TWuV? zEfPg0gI1!PTk9Ga@$71@pyTMjUP_XprXVWNW0|W;i)5>;7^5GVCBh8L4o)%_t#HbE zDdIBLSOIZbkp<>T_Ps(wT(U+0t4j#;^&!KA(XX{9I;pFZOP>RE_a+;M0<>vM`AHZe zPjeT{PjBoDZ|-WA+UC&P7f7-|F7fk#X!1xTq60ehQU78lWgFedHMQAW!|291nLDbk zo$JfSR1vP$3q~0Eu%uDfXMaYHUbt*W+MtOoGY0;MItyrgaR%miBo~t98@3rTBD_0g zazFuOtu5Wp${;{CshTUHtbVK6tDYUsj)Z&AE0#&+WA~6#*`~D$-$aloqKU8mYQF4h zTrE4DoW0X(vl7Jb)pprKP!n!J57o9OOeF)JB-S*DgE=ffkmA`RmgKNDucETWbPz;R z!i;HQP--oYm}*5Le-RRqHg2+{oJ12+4KU0~S|+H0av86Igo#{OG{fR7Mfej>lc|kI zH@j1xY1CCe)&X$DXP=D;jgSVsQvPx06~u3tb|KdRu0?+$0LtWPb8*!K5&_v;**(b} zpF@=saK;jebBMGuFn7MIsLn}}k>L(hs$_T>kWWL!TMHL*Vs0$SQ3a_CJ4_6GUKU6! zWkXB9JP7OVboN!HI&~8w=!NO2z4=>~_+TQeml+xFOL*$7WBxtue85fwVD zOa|Xvv>*vae3q(R5C&C+D74E84w4wWK$lamgrrn3U_GdYy?%FmA|Tc=79pfNefS2e zjDRX?5u}7It8XFN-9faGs2j$Gh{&|-x&>$ktLY-oPf?Io{9KX8ZB+x2q2`zkseuBo zLsk(wh5&#CRdroQM5w92K~c6VW0@@2vk3{(n?sx1sHvFzVyr6yfPK67ce|4(opAKx zV*R+sKjmka`~o1JdfL4=uUkEHVBc%r@Hd_ASgUB=vSa7*#~%#KKI$r?!57asnuJj)@|5z^MC)x zcYk>H*$?Y>+7#ts6zLuofZ)+dvv!eJ60}{ufx?l5Qf1WmOCMZV_1-5Ym~aY+_~E3A z5~3^%%?4l&X*E(A{-s=rpZVw8E7nxjC}S?lFh)Wf3r2$}=wuemq-7tY7VjDsN<)Q4 z5C?%6GAXOkxYeNKwBlD9zEm7(rw~d;zs*e$n?$+=otH>cC zoNYw=4#HbPbH3Mc>MqpE6(XhPf>I#b6syvh1d;#*KsExyPu57Gj)cM<2?$z!#2qYT z9g971D3`zdvlSttDg*#5%K{LV7ndLuX#%foOa-3U3QAN?b}wLMK&4(qARAbna&3Mz zfKo2yZN@rfzuRFtC1xf>A|I3 z(K{=+(x6I=iDIR_WQY#-u26yti;1Bp?oqqKY=VNY4X}YaxNK_H?5N)t}cK0TG!BnoLp4N zGBIkZ&=7c<*+oTZJSvXZJ3fmfb~$S`ymHMN1d9}MtU0S8oKv^JCaMQCYPyD2NX0EH zisTU~I|E(6Oao&;Vw;!k|+H7~ztsdSWQcKKTtBrBiJqG&rV-6NX4S zkF#3?Qy)4+w&Ic+SwLzrvLV!(l}DFZX$;mN!fBhSj|Z0skGNzrLJP7!-44tw0!IcEC&3(WuJC!%^b%mEen_87-M$QYpWhr-{ zm}r(yfB^xij#Vf^S(d}$&`1636@YO=cdvsca44!skwinOVKe3Ch=K3=;JgcM7!gVO z6GF%Ws;!Agq(WJI5_D;rp^vX3MF2o3(%A^1fH)ks;~|eMjyz0Vi(iqv6sK%^;i7%rx*Oo7hn9Mb51_tu9yD$cY}VfGuDkj zTMs$(>_cClX(##V1R#`5Od?pR#xw?caM3;{(|nbUz-ifi4lR1l<+v8SV^HW_4y z;dti`5ScCVEV>j0dB7DIkS1wP1OIEq1=mS{NRmXPe9Qy1)43rcvbM+?00;pz;uv`n z9MypARDjeSbM1u0WeExaKJ)g;q|bGv*`I)jkRTF2cP9nHC_tkA6B+D55e>P5Pb&o6 zJ0}T+%nw53T_l3_X-LIkiACDZW+ssUrBFA#aLAk3dpS749%e@ zxw_1!0TS5~og+;EUMg{GSeC)~7b+??a#A~j$4fSmxwi|h{*A^bAL}Sx`e>{|)Y#b= zG38VFo_$Y=97|^E+KALO&TQcn5%^-p)LRjw(!yNcpqQ_105&WVQ4x@ty@Y&m5G9ch z%mThCB4f(dzPLbe`)dq)Z2yIqf_z2|4S=G0@{=bdwzYQ~8hzW;a&-c)Aos1)mU@?R z=*vssg-L(BVjwC*8c>_0a+KwLG|qrEM(69>jx{eM@m$v=4LzRewiB&}UT%*vOHPI+WUrRxcwp0~5YlQPaOIq_{4di}WaJCd(kCdn8J2 zcu7vEVU>h8FFO}95M12UkDyBQ{T=~Y)d*v3GA^FLG6qoCwkeSDOoii7NfHv@QcPolD{%V z_b=Guty{ITMwa;<%h8&Ypi=PO$`*k#2z$LPvb)Hbn;a9D;k5Nz&9F5F{59>4@1lTW{(P)KE>qQbB@met~6p8q35)OoOIw9S7MAl0pNzZN;`! z0iGQ+k5nD#*twqi5DAR> zwvP$aCnF|gi+cPU0o8Sdhyeq|2+n302$5M6#{$PplDfjIn2SL$i<8Vmxfqf!2z2WQ zsTC;{^MAqaz(@L*9oh&cmnh_9N(`06R{Q)31d0|`!$Dac^_RW7zlCbTBVt%{zr|m@ zdJ1M;cp?E(X=gC-7>bJB0$Pm>NRc8zq#~`d2Pj+9?|9GK9{I>K-|?PzUHo4^yW!f) zZoO@1B>4F+E`8`j9v0(rXivq#JV3c_%TfDx?S9U4p7p{PJ@X5n``q(iaNc0J2mqh| z(zpKNX^#sb+<4;+Gc)r?9(QcJ)0&@KsA)C8a=S!?P*-)N6vjD}v;Rq0vw{NAfZe?SE9=sw0aUA9^n9zVklK)0A3qZa>2Z_3sVD&2RtuiUfG06xq@H1lU zP+KeIj!zzBdvQBWkHC}Rqt>@|jBf*h2@ z#l*4|pztM;GOcA3>eQ$q-(0{+%v8p`08(34O=EVpWQ-)BY&K@^1isy(E!rc>_3|H0 zBv}N>bV0%gd3CF_jcT{Vp$;Y^lSXb06c)W$tB`U*MjTL=$$bfc1CuIBWVVZ+0j0JN5iqIzdy<{u=C zlV>)|CB646_fEqmApIjpuwSRq*`LIxNUpN7ZxqRdMRIC!)&w~@7D{ZrtI;U}B8xxC z8#F7DxaVFRZv|hRNo08FkvH=imW$*z;PfVB5$C<6A~Zx3O@#oVfOH?F^fWs_0J~+H z`iXN=Ba-WVWY}}rOV({=Z4o#wGZujrC|)jy7&NDFo!)p*7LAd(sDLf1ORM(_{*xn2 zm{dCvr899Pf=%Pga3ijyAfyq&ct-(ZRf`vZJA#GP;u3M zL46O|znMnlCEFzBP>C|+k2fJWe-u~*#Rkz0h=Zd3mUt7>Mw4P@-6kf_#_~@eAR0x>0Uh7X<3pl z50E}Es*W61-3NL&%LuhBbjdes#bXpW346(dDA~@FZ%C6IYcsLg$aE4U z+aiz$onLS9@k+f8K6I#UNNF$3-A}wwiOPbZn8CfVb;fw$C8*=BnQ0&YA zSs=1Z4^6Z=TWYTzl6j#O-_V)@?sp zkaAa3U{OHPA9m^Z=T@ixUAeqaF7Jn3GxcGo(-BWv9y&`E(XbzR0XB?2a~~k0ND%@{ zxZhhYx|6rxc+>eG`q<<|>ou==<(k#&cWuAv+CSZL*8T2#pVQCicE?*KY}k6_yZ`BZ zpZerS4mou5@h2SHZMUwt;;L4wn3`O3%yD-+_Lw68pxq9Cxa#U_uD$*#kA2Jo9`eX` zflK@M9(BS!&ikw9PfWIFXXm7)U)%OO2NeWb;J8>ImI|EcX&}hlQe}}ESHLX~Ya7dO zD04dNV$hR&ej_-e<^P_NvsF{U}V8DmM8^ha1h324&y);f_aA35`qbP_mk3;+;y^PyV{ zWzK=OnMmU{q+nyiM}8Njb(>^Js;Bfj?|~r}zx=1I;-uHqw+7c;mqB9wgHvSQuP zuB9uN9`V&Q48{ON7z(huO~;f_A@C}SlDvT}IN4VO_e}5ng=$Ws+Vr)IlZP7lBMFN3 zp_68HMmKtMWOgU{iVT07$9ZnD0g>!C$-aDV&koK{76XG3|5u*@Vyp4_LxU*y4WoNT zu_cn8KOM{<$tG6vT$&{Z5m=6*2d+R?I$Kg<6~Soq^0|clcBgU8M)9pwJrlD}o;<@M z;~BH@wMroH+c?}S&&+eyScxR?f*_Oo z3hZ05rvGSTTSB(jyu0IHr1Ex~}S;Zjim}HV|5;-Lz+gg_Gp%XRd44idhj}>J5FVuS!IAo)RW_LNF_&ivRnX;wvbd2op;PRMcaAb9Hf4z?2e3v()h;!F{Zj# zyeF598KmFf=6?mV9{@=Ubb^ZxQUGN{@|MtIp;-VXGyy$Ysd`ryYdyzrWT_Ib~H#`stl z078*u%4!s4F>FX#i=J5kFJ%K}4-Aj>BSPo>k6R6R$PuvyUyzKj=Wfa&lfWZ{k zDVTO4u(?X%5M@C0o|1RDxQbM5n}BZ_ia8q@S4^FYYJd4uxrBjG95> z3nA^Y3_+j{K>ZTaGT_S?mOvA zF+Io~4O`oI@zm>?b{LHd#NkTHaewCGO`)||9_1RGisuL=Jo%RW}B0d|9I!K=#QjQw9+m? zm_S+HJ#yVIfRe(tW{02-bu4wH(hLFhoGCW2`V}FF-UPjzpcH+j%mc70|IS249ySF;DHoSbpz+m>rq!X}V5&c7 zIWLOLQBxT!H$5Mck_-Ks<(Q)U_=?^Dc8*?805*gjhSK#mWAe)wc_hw7M_@i@IgEx! za(v3a9GKeH1=mg8!XUFvBLL`}|__sDNq}CFd zx)orOf=|9jq;=>1G3{#08gFXsTQ^d(o-Q7W`C+TjEo+&`nvbGU5%?o0Xx1(>r^xYdWZ1 zvW%s|v5t}$7!&LRl4yif3m~wXDpyyBVhI@ZidENG}qV+XljL@ZL= zO=q?qG`U&Xc|3U*5k-D18)HI(g1$wLwYrxpnKZVDhC`^2J!f$De}MTuK&p)aS{N2~ z!k<20hDZ>2dBTAbdW38sC7WyZEfGP$+wa(S+|h>>WdT4%yMWonH^1f0#~tyB=REsa z-}>see)_}jKL5opd*AtQfAz~>906iofAE3;gg|@03*Y;}56>(wU-I)yU-`N>zwcdd zedQ}&MnIqX^cRLz_4IR|ykWx{YOVRgr$4{A)O-6|-uRb)`Sb#d-~9fv_kZ}4uX@Q} z4ePq9D+%;DRpfzNgAWOy1&3q|&=wy_jHtmgh?zQwQ;*|5gI+=71;-hJKwchK_0;?n z$t|_T=ug02zTwOXSNXsZI^=Va>CA`(pv|_VD+I`OIDB&34s9V zrYXic5CMkZTA`q#&lZA25E|ZnYC=G%$af&F5<#Itr!bfUz5W@PjEn}5h=K^bugASX zjCIu+nD07Wf!->$=I8tQE1=# z;0?Hf`bLgXZLRQfr~AakcL^N?`p5>>q6AP&wJ-=(RkXX~lhgg)LR}9L0+_Sda=C>~ z9aPEBpu4e(E1}E18Vp)LM{+V-73JIJYy3n1DU*&1kuEdLr_^Aq%To@}NxAf*b2)*g zEOMy*B@NhmvgKqAu8kL0ell4Kpp=~}(y<&vvo#0l8Rc?Dri)AlMt?&DLZ*i+4Wus5 zQ5!bI&v-PiU^Gpb`MiF15je!YgkZ*s5 z+-G%#2UyBNu+run*To?K%}p}$V~iU%9Wpz!f6(uTkejztfH|80rNa{Gal1uzbbKqa z#TcoMW!V~^9Ge`UXt#-!X{=keTVe0a?DpFZE)6l1CB#S+(|w~TMtL$`jFH1rD2jwCk$@;Bxw^DY zZ-wP;oy;844|0%&d=U_epKAE?-fGrDO@FMS|4k=BlhQFNW+`> zNLfX3S(?_k$d8p6n; zB8UiuCLpr~u~Aia9#++@K=Kg_rdqL^rhH$?M=kLDlBq0Vxu&QxkA)vZgmfbyF%xj= z@G4VP3LE?b-)+jKGy5_7Fr;?%DKnwIq5c8_WWL*A8kAGnR7hjAHxF0Hh>wc1%HDkU zLd8R}ttiHcnyVp_+drXmu6WAQ+<(GtXT#{ z6gn005^Y5YgZ}d5^y;^uiejwW9S(+7UAqnt zLsgoX*UO;>s(}K9B9WH*Gw2~Y2>=5Dlp#{Dst$i@?|vVSi$jQ!`#A_0XW*BwFAw~r z+X~U3HgN|45y&Yrz{>llHsBCH0zjqBEgR(s#U z1Bhk4G+%T&C*1X<4eQtK*m3Lj8*XWhO%$ze5yH~^fo+E!a{B3K?%H+x&wp}B1X{Ch zF*`dKLRy|rV$d+4YrfKo5FG($ zb7sIC_$2Tf$cPsLAj$ppT~d)EIX9UsaH9hWPSO@fi(vNaVXn(;(Qelv6P%ydPPKh<%qM1JlS%CG;(;( z^?;BljbldZ&|E$NLzNkvj2aYO4bC_~S$A11Kz9P7;iOqJYmuWzV0a2?%5^@CVa0J9RSw?A?>yv4dlbK~Aq8yo`ld>uU%gbq8 zH}A<$E=VZgx}J^vl%>BeMp;B|2EODxBE8%aP`=RcWmG0BGDDO%MyK77$VPGg2pS}E zDXjR?$y7P+Cu`*(LW~J&LnvCZ8z`wyEy5GY>*m^DRhARw;_o5R>TXkrCSjT0dnNxu z?jB2?RVM^Jn5Q+bFq|^FWe`o<<&U8}X5&YPHf~ZdX&A{4a~jE$Zyex=5Y4vym+l~c ziU=WZBw3Emav&3xGbxi`I#IOHU{C87?dZVBx(eEH-XHWYAyi7A8i^~Y4kmw0WeQ-` zdz#LQ5|Fq&Dp{q&Czn!kdlZ$%Ug9hHi{wb!70xr)Od!4&<|LLrWnvNI0l(6&WNMD4 z^5X_)+7>D3hBmPy$M(@{cf&%3bbBP)n1$#_C{&Q;kAQ;8jvEAm)4S*-yLX``Z;sL6DsR+XJ#a?iLFO*%WbBt*~9=z)X* zF`^LYJkTWsMiR(aLZ5{(w*$m^Snie$+gH)~b3F}CQjV^Kc%a<}6oc`3i+3A^63nV0 zV8J#53V87Jba=bcJWcZ+wIwYJ(RR!L$@NwSeQsdO19$}GR#f8aM{;Lyi62bF;1zFB zV2U7{TB@xS_eaE_q>ZKu1i*cJM4%{U=-82tXCq#tge*BXBU${PI6FaR$=R7kJpckI zAYvR0hEUJj9Y+P7eh;=Mmt$eS8x*w|b$}0fGhI4Y`hTMkABytj?HYG6LtkC;Iv`iTp&pFEz z$B}cILDhZ|q{VcPPH#&MjL%XX2@>RKJqy%%}{2V6Rk9H{*(Np zXyxf?Xw_gbvnZiZtzZPxeWTTaeud5Tv@IB zD6#z2U_!p3Na?9e{eHjS?~`4S=?Vw{u;djXCkPRs?p6IBwb$bMV*oo;_c0Cu0a5Rr zk!0X*Z-jwiFpWe6Pym!jL+I_Pdk3LfE?Q%uXmOn6s)0`gNfQMU3^J8Un?#ELUw_UscuqnYjZ8 z=ZAw~C9PiZ*tK>q$;Q($b9%tvvBmSl(HB!P;GlqPB+B9l zdjld+bSw5Ysctj?2TG`3ASSB`r!1eMDU?N^5D;{B4tlbMcF>%BD)4z zK|#sKbQ#R4hMftCHJhp+$(K=S5LqRS5C-J^IqV0TCnwj*{EO>y{cJmrI1Y7wS!qj%R+P?)NY~j5BrpI>Ye0kK%1#8SkXU?Tjv|s#5-IBXSIPK+f2s%n6UWm%XVdq*^(OD@NJxGpUL$QCDUVTc^mC?gL<0NUI@lL}`e zM5Otv7QDQt!PzJeMSy%MusS$61yXiA07$qqETLs%)2Ct_HD2u7oNg{d;b zZHPo=*&3UeD2p=Ib$`&0btK-r4rX(ru`Cg9BqPpU!~=3dM!9Od$Vkr)cmMdh0p0&i zPww|TfZF%DiXDgY2W3b{QD#i8Ym^V}o9Nlt-mfVW%E$w2g-vfqp12XAtn^ZTq%)^R zY|RxJ{7!7j{^5k%RdFkr=$*Z6|G%HWFZ;4qjC2d{>kK3(np zNvM~~vK0Xc5n@EDMMs&6j1w67+C<8^5$VN>d0>GQBWw>lh(BSn6RL*+Y16iClT*`U z-QwWhy*sz>C=pt%B345N;edPh?(0r;S52>;o|*)ty?YM~`uzY9Lvh4mhjrWKsi)la zz=6FtUHji#$6Lo7wz`Yusx{*WW|nT+y??11mYuPE2M!W7dn*@0 zkpC)^3rE`k7}6317Y>EHN+J`dt4F!CCrg~AJug<_QV^}o`0%&_^3hlUOJLSsU6RG zrzN2LMkz!wW;Yy&aVs)ulAtFNUzJNjO&Z8H+bB4Zs)ZVPK|^q&C1V{V3rWJ^g>KNr z9K8X6ohUV~`{56*Rj_;8KM13$j zNPsb@l4FTN$d`W2c(fm!o@48+tHBH_xjBf*(?OShuf%B}3|Jsgtf;DM2;2=pL?EQP zh8h6?15gACL=musp;ZO|gb0I(b)>YUpe&D&G(rew{J8#yI)cSx792u)YL5X`Lmos_ zl;ySn!9b z#G0U)d{md!MiiIV`AyTcnVa-T-YFrB2mq?89uBKcr#-!DYGH1EFc^j+$R;|;yJa3J z6%YaI!O~#jZg8LX)8w%YTa4G zL+(#|uBw0aLK@s&mSq(ADQp|l3S=aJOPUlyM!0}$E_4)gm&tg9m6mTgCj zPfQ_DwY0Q*_pY)isK0#lbm!@hxZmoD&KH05+e>%stBcO=-TT^|ZoAd)v^r~7ub!Km ztB3XU^yK*1IMnqKhi?7VFMrkP_g?jwdz|y6GgfUpr0k9@&d$u6D`h~g0x!JjHx4UX`dVH)KA;vnEWtd%<+q-)o4VNdoCDlk+E?4#T9d~Tq zylK_c%z56jjNcV>#a7Lz?Enn(l*kIDcA_PE$BFG94*1FY!p&-Rik~LKm zwkD=TKru?!L$)Hu2qEx77D9@Qy!fZ4O2~?!nzTHWziDInN zLvvhd7G3JY;^4(-N!cWq$ZW^sy*7+20U~u3!$TfQjZ6?!W07o9kW9nUJF+Mu{Ud=Q znMt~ldI&2;9hPh*98o`te*J>BdX>J_QiJK_S{$S!r6!|gq7Iegh5Sfz`3BRc-Ye>C ztokM!@F7pQ;&P4?Lcf;;t;OtLHb|yQmR>3bz*U<*o>|ZX;ak?;hy>5AS*l^5h}@1H zkkqu%fpG7=?U1LFduQ^U<*WW|l1;VRC-)Z%q@sTNJ_>o+LTpdgJ;(=jF>n8>FH?| zCU)%nM_FO<%V;(MfP~ttN#{LX?TyJM1GL6#1-&UA2`pwi7UVP`nMT~iM$u1N4H-@5 zm?#SwX?z7$&^*IBW~l!nV3dMN8mVMrC(`Fk!HA}K7>WGOnz+=?3=g>A&wxAmC?SQ| z8`Nz&@r7{e!-|wEy?>>fq`uKP$FrsympeQwzHKI<`G|Yk-fh@!;WFY{rGwF|d3Lrp4+Z+>h zZoZX(iA#w}*%kwr^Fu`Wk1a$GCxNrnm5_7QQ!>-mAZWNrVh0M~N+f`EIDiQJ<+-W( zq*H6aaU{ETHv^}dL`IN*nOsx>7B68=LO>OtKm%HIPL3*~lqkemlz~7pFw*{_YR5qs$X!i~2_u%M@|l5)qMa$AZ$>5JYCSf=Q8Va_y9)0|Tg0C%|=tvbVAs z>Cg&jW;kLsE51Yrd9d?CxGZ3W{6vvl&kG0$HB|i=DYT|r>rX1CPYzRu*X^x=LWzS_ zQ*q0huwgPxPhnZrvvZ3(cg)^$tI5g-D#!tkv-bd?B!F@~6 zO2$u=763KSnbl}|sKG5m8bksN7$Vjb7CW@=6gcZs@selO@c@KUHewH9{&0DukPp|IxhhrUBn47~`#X;|s_2X|j_v|wtc8_)k?t9W9 zum0dSF1dC8@)FF?&#hg%F2>kyw zOS6wYe$$igb;Q1f`t!fO`MQIBqH=b2uG{H!TJ25iHxS^Sz59}Oi70m=i8dAv6ZA#| zh*;FaVKrRlgE3$zLwmgFbW&D~Y&ME`B+02PCvmtZgqZT>8h{Aux`Jv6po8rWLgenA z)gHWLLmZ4y_AVilA*~Zpk95E(4i{#DDk1_16e}W-m4l+}wjsv!{4}*lU4QVG6>CjK zBL?E%a)uzFsFbtC2&P!G0M*FAP0ho4T-7Q?^En?ONG#P#HCNi9vY^(Uhh9+&ry@CP zMxBESJKW+WWZ_%;Utl%8bG$52@jelDF>D-50yC)JyM%z#IpphzB*z1gJ=boT(O)O6 z)Mk^JT(mc(7ARb5)B}Z$M!dBwQDoDIb|Of!ES^(0B@BJ#4X)|pTDJ;!AX^?3`7k(Z4-M3%-rV+4Q(UjL%t0tyKvP|^=lNt`e{t!5(=J6#XnNJ@ zd}qRsX$d5OB(>rm-jGq`qDMQ!Km)~Q&e5n_&^sh&?cyOij|`@^sar(M?4?*@N=bMp zK^Rr3qf_`06Hp`drY_E9t}VnRX#~vY%_mV13Y^xiysJxv&oU5Shro-jT(`0GlE;nl-DMghVR&9F2S(_~NpjCDP1t&N92rdV7C0;Gs_1-&xf=PzjDh^1dW zy#rONRYWAB(1u}uX;^Q4#NYv+p+y29XdzSp0dcYpm;E#R>0{lZh(s8GI}Sp%Ah%II zy5j?~d?lenvPN=0qW>cvAoh(MAZ=!;){hKLVBEe!YM^76|1utwAF>i%XQ&> z-7CLp*g&oS^-3#JU=w>58+U;YIgK#SLbq$lfe9ME^6<|0oX0EOfU*S{bGy>(T$~Rg zZ`4V@s$JWFDD@rNxpcz?V%&U8GL>?sAU>mr<|L5%9S~!BR7y&NNQI~+I|knK!I$Eg z!65fwELGr~g3_4jAu5QJuEa^>3)Bg>i8&V$NwXQ0ov;S)%CTyTV~^aO1%P4{vmy*w zgW80soHVpal*a&syhq06R^A$1HYd7E8K^dDIQpWhnb20q+@3j*+r=k^5Z`o`fIF;w zw8mX^8MBEjj;M|3%ZF{@S^ZkWXgV|iVAZSZx?F$i_({*fL(ht|o0(un zoI_9d4=EfWsthdtliHwMt3UuiktQal5V7Cysl+t9SYdiYLbq8d7p1)?L92Wa$+1Sh zR=#Wt*_{mTvaAe9SQMmk!X`}s(kb<#aiL$8-z3icyz)y@4T;?&8{xFNko96!oy#t5 zD0A_ZB2k2MM6cRsbwO}M=vZAIy2((17)i^YN zBjVmiw>>d2F>`Px6oo*VcT;{xRey+U!ig^khn!mMT7)*%5o;)uq4SB}z#->UltX}N zM}34)AtD#IRN}Dg#d^*0^(k+vfBUMklR>4tqb8W3^CgSwgnIRvwD4q?LnAhVTNM|_ zB#PB={rU~ltJl@$rcQOCl0!2^-DyFbY_-ZrG1eTn7iVUA^E0nL>-fKY>Ep(aKcpBA&iek9 zZ~xR!F1~GU&>!@By|O5XVB^|#)nK^);K8CS5g|SMJeQ%uTB@8Q0%0hsrG+iq4t?mu z9$H|z)UR6Ya{r!v*Ij?@t+(#%PEAJws%z5V1)6(B209|H1}PRuMIZpe8ixJ;X{Vq5 zj<^2ZcmMr6AN}x0#wJ%$91vg)7=d?l0Hix8rF)Gd@RNXmARqz8x*9AOp@ppu1PQ)X zEQ|U+4|>qLb*m{N1PX-RZl|gv42PFr@%umBcykd#fMGI%Iz4odonA}7#6u9b3fd}5 zWeJh)D3%zgF0VC%UPYy{wG~%DjRab*x!;{NX6I*~tp(Od%TJe{1sN>M1Rz60S7K)? za*mU%HY1W$O86z`IB4TQ2IS=M(O^;&vBrLcJYDA$2%YGRJJHWEPVnAor;?>+g8NIFEaq~sVC zda{0`8LZp2Em|Y9vylXZvN_Q=Raojma%MNqQc%*rOwL^AgO&qUl_Yv(S>Dq_ZU!OQ zjDmO?sRgv^vG%PvIH_Vtr09a3n5>tfPJ|96$Ta117h-v(vcpn%cRq`n#4?dEvZj=J zu^Y!QkO&8$Ik4$T7_^jV1ls^h7%tP^Kh_)1jQtwx5{OEw;xfdO&WsaZ@Bi%CP%XCF z01yYg;c)XKs)v4_7Wx>80zid8gwr)#_8Iu&N4h1%EJ1UkGDGk*u5kMs_9~W==P`em zt-$k%Vs&QyprFd8VPv={g6Vb}DjrW&+A$+5`r@3*lWuU6L{z_ZX*jUq$YvIDutj!? ze1$r&*{lR90)k);h&-pZLYP12q`HAd@Cqd>1QjX(L;^&LG2MMbdn-vAyhMZ{6Fb+! z5G9R_(!g_hqv?ZpUx5q40HsS#O?Qgh$m{}ypof?jih#7HXJ&%Tkpzr^{E(XVA#(Qt z(~||Q8<(C70}5!oz@Us10E8g6m2R7_px#4eg6jT`Q%Bdr?~=TdNfOB=Q*yN32IRsKaI6HALobK(G1xk}AIz|!;uDR>zv8;-xRVvWA4kK6N5<&h! z5!QyW#DU$Sk+x>B!8}gsBu|@61E9BxK;2?y-s(Qe8v$Q32`U{Dque@^cQBSiv&*3b z5#K1x$^ae5NlYGnfK^qs%2ub_?e}{j-T6svQe!PuPz_=8X>jzjaHbamAwa~E_%_-# zKy-%S=s_11NI@Sd)uNCtd4U#IA=II$U@#Vscof|5Z}r@jWh)2~Ifrf-s@=JL>e4j)cK-Xiq^M7x&HG z_wFY=?4;|r|N7d+rRCmIZ*p=Xr5+&!#6SUCW9_w@*KgV|eQN)-+TS|vtRJ2HK!iC zxND(?@?Q79>t8J_-u~&IU3GA=-%H%P_q+bz#JY7cU>sJ62q949oy-`D00mKu zbxkw`BA}Rjzi1VaB0xOqh{GTC@Q2;8V`n;m%sSA^;2Ceu&U}9sVoX0s_Xcn zkA3WKUiJF+)Odj<#&kcW2w0?S8Uu!+005#$F}2_zV1Wo2LI?#Q)K!fDP?iM(MIwqZ zMs;L$f3>~rM&4+toH-mwkRc7Wp?y{y z*K!Ebny_NK?zl0lmW&9s@OS00mN!7I@2LZrcx84*OL7BQn3h9jS%F7z9^vKfaw6~G zsHztuGT*yORMzVehSQi*U_I#TIKJ4A#ms^bLqJ$pGO3M zka7bxFn^EER2QJD4HRra^aS>cRW4;t6hK-avI;HrS~L|0BGA<;)3-Kz!5IpRMmR$R zyS|qs94CEnK7ycwbI7&e;dcC`mPZOvDEAY|f{^Y+OHicSvG@p*{Szd6Xk%FUCV(>i_U{Z%`e z-#1-RU&t6QK#Kra_hVfZM?Qb-;cpnO+B}FYD6mcSKmMNkKl7<~Iro(x+;i1uTIB*_zYJBRf*=qS5~}2{Nt1*Y&yai! z8lI`){I(F3p#;WQm#sDd5gVjnnGE5Vk028zsqebRoHKr*IO(3#Nli~PZ78Hz1~8&A ziI0-$V1_R%MHD{eVao0Hh-BT|t=1V%7Fj=@OV8>CPP2@`O1w#NDXg9{?&hRO2W zXCgwNSVbzzR;$%pUcy2ic&<`RC>HAo1+G0lc0!mPQc)5hrJL{Y^m_Yi5Op|$b-bot z6OyNmhJheb1S-0?`N4GHGH7+gbZN!Gtzk*ZpGZe--Xg3IH&8<=IhsN-@UN3w6ruaF&3O% zh9Vr8nIE58b@-M|xMRmj_dI6P?wRd3-|?qEY=_}+!+87XW7bbkwSV#ZUD&1W=1#w= zVyx5ZLb_81A}uU0)Ya0-C!Dfv!^Ym8Ihb7C>WpDEd)HGAzst5iT(;-d-e3^x8WH=0 zL8~lRubN)&^{Z+a$}(Na0(O}-=r(E)yGn-A@ApExyyK4B-uHoz?AqUg*oEd9ej{Cz<%J2&^rSN`?g?s~!n|MJhA9lU{>-WwEg#jr3J?i~FJ%$0D$SVD3pWaF#V7XAR#KA*ZmJabgOgAmxDNdR%>g4r$s12+3EJK>Hp$oc>hnq=B;s& zARr6@V->2B)}1(f;Ag6fpBLAk8XxlUSeG~)rhE25jA0t!@-NZ#9~o;=&FPIHq1lxg zpe8DcUv5=Rj`tm zi{R3*WE8xt!XZwJe<@CVPr=@*RTJ^EUF2BxB(Y3wJ4h9c@_qCbHl%vl3Bp`m&J~zW zHyuk|mXNMBk*O(0etrl=X_Po^v4J~5E41=+!2l6Un;z8EIYOzaaA(D-n9tE|Ey&xp zxCL)c>n$m=7Nd9_%Q~c;tLcuIe1)54!wB}Qd+xt5cQM0tF&gW$gk*iJL?R$S*|)-x zD4@!nU$Q?35n~d)ULO^dD?U3S8-*DND_M?{@zt!eT!b7tOOlIe`y4-Kf!nLZkA1PY z*KivrX=hdbtp`noQ&eqcG870U1c0hXFx`5<`FQ5T`h!*V5U>>sf=!dv7oRh6`e6Yg z^#%|DivkOxUwlB z!2H9KNi$8JtQicABQlPXmIyJlS|t(17=wFMm-Y2^WCbu%-J3`WfaLkq@~j%yztH$; zyC{8P>+sX*PcldgzlsH;Q4h0Z-nN{GZKw|#&JcsFq($;4JIMG0kkuwD%+Zm~|Ee`R z5s^7Wf-;f6Q;vbBewnvyP^plTNS7yxg$>Gn^2_^SsF?7z!hk9^2u&ssPz z_xnq)+A}lXDxjuV#~4BpiH21*Ha0dkHa0&u%R9_?`w#E!6CI>a2$%u^)Dg-eTzl=G zF8Jubl+gR?mp=8I%YO6G55E7=4|~ML-}}jijT`Q`Z5LF%u2`eJ~lN)aaa!rbxp_L^`3`q+4QSl{AT;k+W|NxZr-wOYW4J=ZoVl- zC_-!9hPCTfPv5$0&tOmkRn%WT>bT>!ZQitF*Ump)cT=Zq!*Fo&aVH=mVLamKV`rCo zu{T5rRYA-B>XR2)l~)f5fy$zI8Ib)8q(rUPIg zvSm+k8bv3N6w%T|N%eH^uS><{5G&}xk}l2Q5I}BuMsfsuu_lcY8a;P@-3c_E%>#+T zBG|~5M(U(~AyMb&=7tMR91XOZ&8P#54KluKK}g_BACfvnZ=h_U(-gSh9SahyJm71B z&sq{NSESJ(tJvp)h-f-ZuHl0#C?W!)bf-NN7n+#3B(T)Vc$P&Ml953LWjh}=+p)-} zB)elc{u|ILshW`smttrl0i95bA{jwMD(eP~$dwbX9Ssh$i8r$~9ln^*sJwI?Pt3h&lPR(K!O&_yFx|bVu3}p?Q%A8#MhBOtCIUu1ifE zxDmrlk(iB+Xrnq}G;qM3z7PTeA_QJ|b~%Y(R2IKb2?JTu=ect#0#KO)sH#!oSN2M^ z8=EK)5wt=ZJN>JAKR*xd_XXNC7UvNGVHmNfVJQsPoeB^CCbq_@XyGzJK#YMR;c5(5 ze=}bDzOhynxfh~1!p3hUur06|#iCK6JgFMdQeJk-l-^JXA%PCa0$n8M%7%cb^NSI= zG|I`11f$FZoj)WhLs8~!I2}iJG}sTEMS}Bo3nH19Ns=kuh@_c@{U`>ig*vBpv;bR> zcr6+rD_Wvtljykv5w_*292#UNEGS;fIHFN*!w^xr`G(a6ZpA{~jgw0Q8Qy|bved-r z2^{o0Nr~7AG4OMM5z`Y+h(vM>KmwZSBj2_?CH+Aw2U(^C0KyO;QnFA!K5f%bv1vhp zqH#g$wADpotrVGve0>y>JfoZt`SCP}!2v99T5~-j&gT&V=!On}7;W|5)S_F(ghB?_ z)J1Was7n@zvW9~wv>71s`e$_g6fqp-UHnnJOJqZuN}(+wncV!V@lmu33Zp6MsFoqD zDj)MzI^kp*)I~*DK!LFh@uH`X-FsV659^2_1SkR^Fu-cyNN)llVTeE>08s>p>sJ@w z{p=g=|G34Qe*I~}1;i*W%$9EOU||B>FOGWRjr`KB5NTyhJ8T9ZqJW4Ph{OoZ4?!N_ z;ibZm;c|i`egc3%fdVM*Iz>ChWZ3I{#bA!}5&-St8X49gBMx?!S>~ePp)IyT{%R(@ zqc0xX<6xG)DCxSKitathu4zC484V_l0kRn+yRqO!vi#z>;|sGBOmY4sCuv#Y#43_D zXo8edaQ~D@XC$SW%Wr3Q>35I97B9r=j7$q<#u{2w00eF0deV$+-$)>q10|PiGDAQZ zfhvkf!y!~aKs5yk146CbnnAgd*c_$Nin5?OLfRcyS4#`?f#Th_ZR{VI|I?0xYu8ToVrNx* zvbO|(+A+6g?QmnKg#c8=x<3qKoS)a#uxz#V>^}JEi@to$qt7~Y%a*;@-9CMn%{5dz zZrXGBVH;LYcl*71=k|lEyY00{9ojF)`pc0B5Cc)2fVjYN&>ysb?soDC$DOe4iYu;} zIWV~O`dwFCapR?zUfaU3Zmd1OJdnGAKppF{Y>kbNEiBAaj3EShE`8*F7bc;mdv^n2 zpilx}zyJVc5yrdS7|Z3k*&W+&BO;3No@d_oKY#Gmn{L`ZH@A52d!6#}fBCnUzv8^t zzV5Am|K`_Vfn`}0Uz2v3WTyX_ zTmSxn4?OenkAKRQSN-?c>h6nPaPBK#`n;F_^{YSk-H=RW&c&-ucazH#n(uNa@4PBvb2Cj&q|Tta9A(AZeF zrcP+JslW967ryBHcfEaTY66J1Z@>9|4>^19?Y9y2AMn6OeD*UJu35J>#yE3u|1+NT zqF?^}7oG0Z$3OlNtgET1)khwEBmms+jC)*v-Ayn1>zA)tyQ)7JeEVx(JMR^*o0(s3 zl_ddXTh_(uwCr>iEpRH=C;Lo~12IZ@Evr7nxq~)H$i|l33w2HqXVqfWzzP&=G@U_i z$I6(N<0x4g)_iO;Y$p95+RVBztpLp{E0#-18BQ)U^Tnz_Eg}L*1BjFcPG6`)LV(InrK=)x`m{Qu(Q`EpB1rPCt0^KPKrPYJyqwXoRpcWA0EW?|1H5h| zdjNNNfRJiMf!ZYikT&SjxNM5~94cM_z=E%*ijf)65NGjR8eb&ubq1L?1tJ#*7<#QE zjyf?vj1hs%#MO3v5|L6C0ynFsCfHPv#!Hv6Wn<|iE@walh!HXA)ubZRCkl|)4V9(@ zsdncO$ucAiC5m(vBw2|Z?5xf4*)Rdr`bFfar#8p2SeeGj%^5(mObgIVrneMZI*`zq zY5|)>mhQ+T<9OkF4!AS}Wt}+{)C3U_kX$~bZNZ#*QkF@QAq0fzc(W{pg{R#dA(p7s zY9lWGe(Aqngb%tPu3m-nfF(i|sTcwkus=Ly` zfN7JVq|5vskpTO>M*F93ic!LZ61f@)mT8%z&vaX6_u zRu4f50YpFn3qBy->>hY`311UqQ9?VvBS9EE#MqpSu?C)GKanD{f_HiwfuFKVvF>&s zcERAd`_S^Rgt~x$MW~nJ>mJuS^N4aVjD$rCp)90JBP}W)?GYgaO#5@v)p>PQZCKU* z%*S5;xF_%4chiqTF;9hdF@tRk6c5uSnhbr_;XqVn@XWGE1~8hjxP2WwhQgm6t=Cxd zL7_kl1y)sE$2#?6DaIJ16yl0y>Uf}STpdboo=oCKV3=(Pp?H!$c-Dn&G-p-k1%Bh> zsc^#wxImi}WzLw%Ntf){g#YX8Uf$kI4NlS%UL7v0>Ljm!u-0E$3RvWYGrA3^lvfjX_RxLv>2> zkx{lR%fVa_lkkb3TB(Kq_A;8CM98E}#N&F^16XbTyf1waR+fUtV5b-7d~~ z{JoFevi^!IZ|<&IzvieD#wWU`o^jHe&1)Y0CumTC?fvy z(%*Con3|k8{C0d9u6MlYk2l=#u?s$Z@4Mga+0T30$3OPZ zPyLH$-M(Y{i(dYUcfS4auD$MtPhRxd$35XOuYcpKhQnbf3jo-(an0K4sZOf}NM(o{ zH>_H-Zrxb7J<;vF{cUf4!3&=CyI=qMi(mfcV;=XISH0>LtEN|f|HnT$=BPs+_J{{x z``=ex^7G&R@;AQ?h>_AlL`s_@M4$+DjL-@|09F6l&wcI(-go}@zW1Fke*Vi_wjTDz zx4rS(-}v$a@Au$dFMjYt@9PhGuY2`t56mup@T2d&=;I$aB`2lC%=ZQ~#auHge`Qqn(`s1Jf&8uJWlylDc;#a=$t?zt4wA%y}>l$>ghoFW6 zf|Q09H6)oJ`(5qSBWDUF0tr%0<(Q^E;61_6Mz_FAYZwH;NeLoZj*@blWFxHrf#vQx zgX^vsT3LJ(2Li?*=>WM_k9eV01tKq0_QAx+8J0P!t~PzK+r?b>A7xXW%(qM-5QY7@@|Ih~4Wgd&t7q@Cq4 z0&m$SrJmHi$cA>-?4zs6%{V3Zm23EsYAF3w6h***1*CpAw*yFS?T0{sk)W={V^Fe` zWb%^gyUvZthg{;szRkp&p#oUVY&i0Aq z!UHv=W}5S7Us4(p0Q5i$zXU*8*5#co402-bpj$;z@|S#klmU~#w0icmO5Wpmv)x~S z5V34^X|nh8rJucw9`rft*06+FAPgfE1Q9XRh!j%MwXVRMeo0rnX{=bpR5Zz66{!s~ zzn97Qe{2#A0jVvbIjf;15z|RP0kJpeubNsFLNOdrYrF%)*dGk%XAc(LcDK_4A_zgj zoU=GnQzTCJ7^cMW3=C0f-9$hL={{EBZYQ3+Tn%oyeHT?V2Bb)`dzS>6tn99-uB*Dh zBAI27HjNA};xMm7k%4}N9tF&WgC1{z&8-4jV@+hIKZ@TWf{Qlnu?l}`?@57a2R=$u zR_JMD^}M~##YPP2sUxaf;zAz+U^M=D3@jmCFat6?DtH(>d~J+am*9N9W1PHP{4@d| z65;aL$Qv>8S}&avbjoyK5`+Q@_t3JijgAVDlHhCB+v9B+0(XKlC~?+Sg#8W=1%0b= zHK7qZVk;AXHfuns7?VZtNdO>^HA2u*(vd>k@iE!@$gGhaMqW|`3d}Zt_FSm?m?9*s zhgIj)*H))JmgWdUK@h642#a)|qwBvqquqiyl%$3LVkDNQ`jIk-fPf(YMSzGvRFp+E z7@l#rRp-9u#UFV6AA1YemE{nyA}S)dJ2-k7iI>^Xns5NCkhleA%13((Ij6j;rE5f* zyErpu`~!d@lt6K5VPVi;g0fwd-MYU7Rj)NM*&XXrT@gij@^vH1n=6syNpuV#cN(=> zZ3qo1Vi0VNDLUCXuGTjK8XCvkLZtqbCW6L(ca&~{RRf3I3sA%Xl0WE3nsta0kpd0t!Q65= zIgS`00_8hD($GmyL`X?lJVi~E_WO~YkO6Q0$_!D+m-wa^kdO*H5yFY6FHC>t26p z$L?Jx-SxERKkpfr{_^J!f7BDI!SWZs^!amN_@Wzcyz%Q_`P_{+-14wTJmlgZU-J6b zzoG1|ZjW^$4U?H6QG^&{Js1umQ49!Fby}ZLF4_j>Pq$GdO4V}IGb;^b3Ke&M;# zecj)_?!E8*@Jr5n$&EMOw6NG)T%3R8*=IlVX^%VX@WZaV?$%bjv-gf2k9yP-x8MB7 zd)@nfKm5Vh|G538H^1>8Z`<*wBM;yDmXrVfs3Q(53tmpZB2e_pP#%Q95Jn6Pw84o0 z9+7~ZlN43dBQ?OK;m!PY0a9uvLr7WviH&O>IT4cm2G%z40EN0wioFaue7RP=@hMpn zWOnOpno>yUca#wUU?@r&4wjbp z0+bNCo$>J^lyyBc1kc0@0D6rTiIyFd8$p~?kP@MxEK^b{AOjNhW)A`k;Z9#AKv}fA zWv5F(y2CsRk(d-9)dZ_Fn^;m#wIKEa5T2AWZK)Vvh}Oau(OPbqvJ$seBM22mE#w5~ zwU!bk$s3%^d0@iMF00u~VJkgcUDER{-P~bpiahce`NS-!f*e92!@}%Yr z?nAm_AG9^BD5TB~01;b7r|QoCbm_mIj}N$r#)hyMpd$%=#E3vcfOSQ<SPaF)ZPOFS{Js4Iu z-E`BN-uAA`F2AzdZbj}gK)RPCP+AHlk_B=JFX{jCs4~vFb&Wh-g#bm_TAJH;-0{bM z;3Mxn>4f8+@Pw!R^rydAy>Zj99&mQY3L_+-7@-Jt4WVdvJFTie7*=(9^eD<&Fz3Xn z&K3(zl5kcoP788Hl7o3YSaN;IU1cu@Mhz-@?;l_o_sA#N`|AS4uDE^Ukx47u>tmZ?)j)2bMj~HZLwu*((0E<`qmg_ zD?o{?j446PLrQ5jXcyG^4HDl|Jpck*AB1+t2+Euexj!wo06~_UY@7rI$nCCVVIX}DAwWdHSQH@?5UMvmthHtgV;zf-C{8zuW)B7pqaN}Q zkTA%@nJC17Fc=Kp@ces!?JJMF;io$S9gs^;B0-V!Al9W-xx?E=s3#xntu#&H#GTD& zx@PZ9N%tt7Zw(N@rz%6`Kw>qz2oNbRjWb~ z_>Mao5VJ)m4p{)M)nb;R1R_W-WXzyip>Ib5C^}?pWLOV^0s>Va#!qCr62CX&@O}+$ zK#Sb+qx9K{&DQk_y&g23usAPEE@Gc7ZSi(lN@dj0%3YQUjTJ!>i)y#2{Z68qKMJ(tX1~;5}fVSc^nRE1b-BIO`$eI|e1( z2L+!L2{GOI6e2+M)MXBW001EX)({~cd+hMx$G1N5<7(LJ#xeq-)Di@s`yJE%S7DWE z1frNWeMB)m@fZI>LuL`Dq*KbB^xd>fay5{REC~x?YM>h9w6wewW9$=LbNNl-;DM#Z z!BVvo>OmOv{&2}qQuUtYIu{gJ0`y5r{FzI}6bj6u?yB>(a8iP#zI&o37c+a0WNNVvS~ z<{NLj_SROX{ipV=dk@U2p7>esMErn~bZrYDaI05fAGixie7~dweX-qc@7urc@@uc( za>(JsnT4->{bL`$=-;a0JcI%OcJJCZH@63%vwFkEEgRNf{M{eyy5rXAbzA55@4DoN z|FQkn*PMR(J@0by@f$a;`OhEz=*DZWnOL=U-=6(HyX2>@dG$-Xoi0E~91#LwJ3>1~ zigg?g@r2`!D~jSvU-`zu{K2)Gw(Xmp`+pz!P*qiR6(ZIE&~CT;eHvRm(Hrz2)}pIa zgT!H7@kSx2C#F{&dgvk3tEPW)$xlL2BEt0KBqDCzvU$*3yxYC*@qrJ%?~p^cRxyr^ zbtuNksVNLtmaRQIckbQ0cQ7nx7nZB4+P7;@MMTs-FuMo{Xrj`+@%X>6Q`HeIq9Q-MAvB7Jmk++xuNODpTkfm&9#wyZ8iE+k= zKuNO96%9o#$p>+2P?DK4xlY8nCyNF_s())$tHGd7k$f2i!!@Wvx?8)16~SU;VuiVE z5kgcYRC9db1k%PwS-x^zAkd77j}j(DRJ=t3HTpUk8~BpMO2URz)f71Vsi5>XF*R4F zx}<=c4qR{Q>Llwngb>Q!+-$cy@$_fC;4h!~^b?Oiy4`IrFD+kr^>zRDxv%{Dx4$`9 zoa?Mw6XGz|#5pIALMq`jodBo_ha^`vNduXwAOK)M9L~>8PK>|yjc*`p=M#7&5m@dq@-NB5fun9#D2f724|f4z>`kAO9<^4 zYl2wUbwZaA5R0PQ=`1ZSUV7=J*IjpQyE}maxx!a|ZLfzW!@N5jqz@=LjpPKnB28KY zT86+PlP;OlJV@D=3DTH9*C`l&@IU z7}bIK0HG(HMWPPRN=lAXhs7m=N)&3#g@c+$J7K_On32kMr>42@_kZ?cIO{?fUxHqV zB|r@jFh&TgisII5;;&!Sg&7E~wo_9OZV+LxMkzI!;d-qK@Yy)*H1Y90grs_jW_NXpO_$mvMezm&=4qAg8@;5NC^o- z5y~QjA^?TDrmC(Hkuan#K+$fOMTvkEsjh|y(CLidvFnc6*@JiN+&MctM`Z~G1}dPg z0E?n1i73{Qs;Ul9mSt~Y-!q=~!hd@AKm6n0zw5$(xo~Rj+G;qA07Y380n<}a>R}zZ z_(zL^3AyYNC$lXPs!Q}0%E(TYSI21*_Z33gRPQHiZfPQP;wcI1348o0ijDUF=MH* z@yy$mh}n!tBp@-509x(#()|2*r}NHtod4LzJo>WBF8|f9e>d#+r>CdSKKrrHd+xK} zeg64h{^IAm6O-*u$_Y|82&vhp@ERb1^qj_m>IeY?BI)h5HISknE6$qnW!sB1=t_#3 z5QYMzySIiYe2FX_2)M*0eUgwb{wXPrEEQ_nBLiC7&ysB9WlY|@-5A^Lh}CTghPUda z)*4skNTy}koo<$PDS;5laNrS{fke908plbq;dGO5*R}+(HlsW&)c42`0S5gZ7NJ$P zlHG(5l5++uDb^{d#2C49pcq1^s^OrjTdfw8CyY4=B-bg%;4FwS4FDLXWQ`{h$M=wB za*8U5P!td&jo0y+XO-vOxBZ>Vmv6fbiUR8zh2LaLslJf57Db?1a;G{O7q|q+)_4^G z&89S;Vh2yA>)Ke}etp-B1j*zT0qTy_0(p7X4Czw;kWM|bqDU5AP=NqYwh97(qE%HjK%I6wb9_!!i8nuuogRR6Nr|nH zy`SrN4k9kLu>C6B@b~E)$wyo-&oZktmc(8SUDAZtI-gJHZ68vP`7j2S3!vO{U2)v- zURkwD9&@TCt5o1K!1fyr36dJMzo3g$A|$@*f$5Sw$3m2*SiXg?XryHoqnoJBZSHd! zTn67LQN+fTlv23UaYa02EQ0`vhEd);zt`kUW>=1bpPSXkJ+asBD{y65LU^^q&CI`36~ z^QPbY@{;jYYio!#)c|Oh^plCoTRupcX|d0zfhHad1rBCsk3Ht3f4%4vhaYv=6<6Qz zp7YN?>hPmp^M+T9ty&+7qONQ1Pmt#gtm^@`Nr6oU&8uYfLsV!IA!dLe1RVAT?XvUk zcl^^+pZ1j7ZrdFJTV+v{Ap{5z5L3$+5ooGAIf#RIzUSSa`ShnlXDR?;(F!5d)iB0d zG6c34$yl^4qLaG>!bBw}N(EqgmHa{FmP`Q~C!;k6ObarIxCg2oFbP78*r}}uBrO{m zk{r6p?=0;Et%(GRA`k>!uSy&BOc+EC781^Ir%JFyQ#W$q-sI6Bl(>tkAN3SOsG;3% z4QT(j`EK>~8UV1pdUAR-K&%M>L)mHf=H})X<^duUo$0mf zLQ$6E6U)8c)6aPZ5)7z4zG`~*z<#P@cWSyfH$%f&003xpr`NXHMLitGx_88(n>Vjp zd+@;Cs+wC~nrL;$2!`{svou%)0D$iF>NTyhH5m3Gpl)y`)vbmHf8~3wKCfLDIi+ux z@3%=uaa$y~#L|1a>WJf_Rue*ir9&y^YSJ#Na-jf?=b)A;7uQ5 zkc1XZ!G7VjGBji2f2@umX(*)B-X|ZB zxD7y}15N(Z7@TXQd&DAuJpfXs5JlN44gnV+>}+Bv9wR9|tX4yJx)u?o35zB&5r~Q= z^-^5m5~$MMOIiaU|50OdKm<~bkOH!x9s&5}kTivCH)7pU91e;t53Ucr2P_RB5J5n| zA|fr*v+vXCc1z|d@?2%fGEWaZr~%6s0;G$m2#GL+P6q*?u83lc1Tg|psH@= zHa(@t@ub1u?MIZ$7H#9X%FAzci3e+xO!*rNzVY^7zIuOV9Sh6Q z9UHIfHHU8)4#Li>Z|%=6oq7Kg|MQw%e>}JVp#UO;zzYN^Fh!!8LW{~0Lkn8#$L0yX z|Ers>zIAS)9@Yeh9J8+9#XtUO&yHJ$gt06G4I@TKd((;nTkU|Y)}I!8|9$(x&8rTD zs@%7GVfCts6HYs%H&<_C*^}<5GKOBsYx5~2Ul-;HI+2ODr4oMMw_iZ;__PgKS`}BJ}QJ{{A;(W2+zW;0MM?gFzpF_U=6}*6D8Euzs*` zd(}B?+op|mtm}Z+{^_O=!jm3%_P>4V3wv+Bee>o`Z+hb!`~BWq-}1JJ@$tH@5v!_N zIJkFrXm^lmk~l&D0CCXk*LAGx8X(Ni&fI$IZFf25$jg8GyKAn!t|-P%yXR@=z2G^Q z{pN}@&${2##Kha*_77kF@;9q0KI*ZL0f;~~7OhCJf~p!;Km&jniH5PNh7~}hItnB> z5sEi!BU>=fEK$>=tT(MT%*BZ{@+{L&_O8PS5=o9BXaoY6#8{1>yDPL|3K}B>^b$1k zA5PKq&O0PtF9o_b$I}-v%D!K>M5dbwH1867{7%{^x&s*MXVYcf9-WI;%GU z?^2Y-Cd(`GfMe=FF?Q)#q1H=!6d6eXv5o}|UiqrOeZrHT_@bA+{OYT(CW=tkp$M4% zhlphn5X)9MKC$N6&v?$e-ud=l{`&Vf-0;WF#KdrEp&l-_$5&%0QjKXzAfoMfvX|xo ztX-GI`OKP)Pt04YHOXFdGzsG1hjKp5ZX_9o6PT1t-jXE^(0FQr)nA^NJQMJ4EpRnEC~u+^%E* zBn$vll&z)Z!Tj?4;&Ra)53{o~pa0?)Uh>lCKjLAJc<=i@dfV<@OEa^lop!f}Jp7^4 zW0U`V?UmpB_wOxLb-U97#Qyx;*u<*GKl8cwy4T(7Ui{wozWb|7FD<&0<@i_&ac=+q zyPtaUIp;k2kS$w&`HNqF@vGlhTwEHPnr_G8Lm%+ysnt_I_|Hpr?cDW{2R)?I4nO+A z56?LBzE6MFQ^#Aa?|tw4-~0X#mlu0$*KR!XUZ+3g{`ZeiKj}$NKJ18NF8Rf;e}DOv z^{{`hd!F$Z&wl!GM;`ILfB*icKK04o;&5us>S{Pt+ZX7=R57Zu*?N-%`LUNKJyLnO zV2Ym>PqJN(;~=3loB3hTdul4rWEb%pe4iME`m#;g3Z+L8X-5Au7iUPlO+0ubQc;-F3;{ga@VX3<4XLQJx z;t8jOvcP(XRYX7>4&me@%WWs0amP*nNz{w!`ZtPT5UL!i9^?a>9S~Qu{xr4+7zxMD z&{Q9!=}d|TL{PSi{_;{a9KQB-uid)su-ConWmjEs`NX;{7@(j400-vgK6w7yVpYBH zug<&S#v3mE*^j5!Z=zwJduft$fLRDDAcSIhd3kbT;t5ZF>S?FlYtQYsfA_oJy8gQB z)~sJ&S3?3qED)itYe)-02tcX332B*Hnj;cWg&)pOkz!R*9Ut}hCr(a`fA-`5ylUfS zprJGx00fg*yqx`H`@GDlRg6TEHUe02F3AKj=m@hW zErX4t*_4&slGL)1i>=#VH70Ag$gWJ3M{9^_$Qq3Id#z{yB2iJ6Rj*$ShL3&x6CeHP zN6j7B_myva}Q{H((#}B!WX{vy&sem&VIthP+(EuFd~H_wYUNjQsgEFV`LPkLLQJsNSvTabz)&p6=N+aG5!>1qW3%h%D&NT z#+9`JpzaR`N#QZZSW#UM>pHeut?&Hzt#b#Lo_^osHij~^i{nn&cHHsn_YdhCf4p^f zuWGf5;jre+8xb%qk3toxj&-b{zud2TLmYN*xqbIddzb36H8#T=0RU`a zSO42Z7yjUfKfL$7&v@Vi&H{j~o3{W|7ys8UUjEYO{r#KYaN==ydE6r(d7rcHF*m=s zW%K4={p`QK@tyBK@$5%_|GQuR(GP$6fcxL~p$~iTCqMTYfTccBQ527U zy#9~Z0>HWFzObr_M?K+*_qylZ0HD=v4=57A6lglaZUG}C zMvKdtIXVy%Th!p3nWCY#Eoqof30i8>;o3Z!eoI1cyIBpM#kJL67%+XB=$0j=@hPBa z?v;mjt6Yf-Dmg~;JW^8hI%SWK4#~l7sgS9q!-DKe!Gdnl-eY$}XfXe|=uz$7H8qDw&1`DDL~ zuyrqxu^=^ns~qbu?7io`?)U!pz4ywiulcLl-jDv{JCC^X z@_+l+Pks2K?|<@>Z@d1QtGa8}5Boiq6FAMXb(xS|qsj?@tmy+G#26{Y$2|5i_q@kx z&wR$S|9JhS&|dYgAOG0Kb*oZ$iU zZTpSa_73h_vwrK5N8kPGYp$kh5Xu5bmWp{E%&AqAP+h7EYXL8Hv5Uff5l9OKQ>jj% zA5;+l#<&=m4a)J=X5s}2^$2F%t6Gk;nUox5LG_SU-=y`)2@TIKUX{3r0)Od#Uh+UX zbzn)kG-UuaiqY4|x0zEC08oT>*{Q<8?=D^ZWIXdjuvXM8*WmLdM=M?d+?7ruDUp80^))~$zs;$J@U(1+fCe!e$8KK|D)ecpxt`q_8B z>wWVB8Vr_R^Qzap`SmYby?PP=p7|F~e$A_1dhSbK`;&_=*|>4zD_-&9Bac4vs;jQN zt1)g_(zwVb-(+rUAqbpp8nJ)e()n7f79zjYllhVj_nu#-Q)o1EMG@dV@9wnoLmbK^+^7O5hq4p zTalWFcGqK+yIzDukOt+T^&&UVl08WfCAWg@>{WNL0Y56n1#Gd*X(Ixk7IL>O7VvM_9Dh4NRnSpcS;KV)rGNY}w<en`1jU=0y(9Zf z!0L*GV;ku3Gig`@AVEn`5|w~}HC_6%aOG{OgC5h}WZw6!#lLwweegr@;!iBxu^5X2 zUiXCqFMRpnHLs*+eq?FiB2gSX@dL|mJs-~doBH1`s{t`!h=h?s9dW7yM<0Jw(e74t z5uqd_mrRE%ygW;4C9(vh0%Fr_>;;iHkdMckwkSd^Y?_;t5Q@602E$%a79oTfD+qu^QN=i{ z2I=xBfEbFiFm^3-$t6)jPLd|7oq;U%Do}x>>{;yRZD8E3*I&|EsM-g)h{<1k===Br=)+>V`hJnr#N z+PqBpA-_JL#^czT|~3z2)Xx zuDI;d?&L&_6~U;Li#IE$dz-SGr^+ffo2MryUF-G-t>D3D4lTCK58Ac7dm z&mF-)*#p{C8<+8QkJR8mVV*a^`%_7$A-tKo75Kq zhS2Nv^=26q>J)m5BFrpRm)yMfm%qQ|jz8|j{?Z|bOjS$Od%yDQD{h}@waYYQJ*+|O zAwW?UIPCWp=9gw><|oFwr<{27UGIMEV;_0XXFcMSho5xV15ZEZxD&R`#`gYpaoF*P zA9u{Lo$>BcZ(&#sAP$KJ>(;F8_xrQ6vqdPbxqZ)dd-vb%)FaP2>-bfxy4PH@>pQ== zamVa301k%zYFH&x4@C$?s3}IG5K6)T7%;70hM?=Gnm`ce>o6P+>lll&6{|sA4SKzP zZ+WS|JOH4@<@sxFxMk-Zy8-C`W9+{JE-8xrak#2`=ENs#PO$7QIR}-bf&zjlh!{}O zYmV2P_3AZUjHp)x6PS^pC`oe8IqkA+VsqYoayrimGu`$3qr0kmp5?yp_lR(wbLRAP zSNPPYs>1+kt1Gu$fBjqE^&hQH{;h9({qvvs#EKW!p8x(2KmEirNv-RmpZ(;&zxVw^ z4>|a&U-`ICnt~uqD)Bo|0tB*YN&|m%f56#A8TI*_$4DTKo>K~o7#saAE@o@sxG2~V^?C$ID zSf$D}G1dSJ@{vb^h-MU~j-Zg_%ZFGR5}unHu{cH#xWv{_#R&$uv@wvQXuYrWB~zvn5KH#6^7#Jp3Hf&z;F+~-~$*_ zJ10;Hiy^WIL6c8V1jXL_xIslp`D zN+qRAsWx-|u5DYs@VU=ZmVN1qpEEYe+nG`cqb5nbl2POG+mQ(AT#EAgR~VdM&9}E0tQURIQh)^>VFVu632GUDdAcq}tnPHX0L+8NFTY z*5v7LIQPE0ZoTW)>%aYt|4y{BxnVaGnk{c)Cr4r-c!D02%p%{8^POVQn{v4zK=e$PSM+ZG64U{`3`4fbopbGZ_7&#`j2?0K{j-CWI1Bf`5T~Q8 zsn`WcuLS%eP@Mt};`Rh&G11ketM!O_;H_}m*=pHWEBQK&g1amo-)w=fG1C*EWvCJ= z%Sx9aiNi8zOV|7W01(L3t9a<)N9}*e5l0?<*J3<>F}eE zz4eZJzxe5ofBB1_%Z9dp;)5Uh{&&Cl@Pqfi_N3Pydiaqa{m2*Q%%1(zAAV>5CG$oH z`@8DZdL>070BcP)f8N}4-g3_MH{W{vt4=xN^mCqDy7H@E`t*B0@UdHOz4smO{P10O zKTs~E-@4$Zr=Izapa1+Z6!fB!3vKJ>Cb{Pk^bJ@@R_zrnW0A;K<1 zw;^0a7+`7&;udr(!VlodhR9JbwkBt$7z_d-kXAz8<0%$4#g4co3I>Cm6ZlfEm8+R6 zB7l1ab_6it`M3l?iTtEM6S#&A0B+@le;<)kAPBUSGYpW`Qv`sDD*(Ki88~IKJpV|N zP5C&4QfK8>T`{pJNUt{{A`6Z*O0glNXfEC;6(vGaT?i{DUFKL=WTVx zh~69HH6Sdasd@xJvVdCJFJgd`A4QSYS(@LSg@xMrOQcLR<-g%ijGoEHT11GpIv|kA zRri6mdmeNUNTX6je5#@WOSEuK$v=h>&=OsGw;t|JbscZKJwImO<|j^3fBT0Su63z$ zdc&Qg-+yQ6(dWmPF70j3OL3RE`EfeqNT|7G-+Y2}Z@mX~VhjQ)o~kJrThwD&okYCP zx{#}Sw~P0kfqWPm@$ugef~MR7fDo0<4N?AzZNj}*_bq$ zK|(BnPAk<)d2(W+-OekO>cnt=tz0fuYGY%K&ZNoOBc*b!H9n$BX{B1Vmc%T%bjl@g zHhhW=Yf5dH0;!26HhJPYoB$HkAn_G~m-6E9LOV>lL-R2;alYp3hQ#cO`7TgID^Uvh z0D>x_WsZCh3NyiI;iD%n{zzYY8xHl0dh`&qiY+0-#QwS<*?022}@DN~FIU zMFe0GbdF%%@k<3(Dve{@BXL(Oh$>i6V1iy@{53NYh$bXC9C=#iCKyz^)iQaeG1WS0 zcba*Y16cx62xD13JUl+yHw5ho(>Jtq-LAF$W4Q&Tkt`{Nolc7^p*xeA?A*Dt_StVy zrP_t06=eGzxL8wXUeC5^St>3+4XIkq~iEcE_&wu*Mn{K{s?%X*W zHf-LtW$Ukg{oCB+rLLKc4*lZ7pa1*1n<};1mW}J06OD^6`^#9PscW+~ZP@mWuYcor zm;Gts!ucbkqbruZFg}^3)t-q){=@J8{PI6vJ#)_NEnBy#a+k5j&C@slu&R9VFMoFV zU;eOd%T`RvmMlT}pI2S?@O=;Nd(Z(rJ>9EUuivB6ijg{d-TWa2~&Q^XVf3}`V=6FdMC&m!(C1Ss~)5M7mz8%V(hftQ|mS_s00Vy$ur^P~)9x-TFSFYWN1 zMB#*TA2t#nxsp&ru~gZj;-$y>5t$+YV3H(CDQiq_a<}yo0kuxF zR%A_Xa%+74pp@2HBT;5DSF4qzlX##p;{maBPAT{blJM&>30~?YOP##2A;{btOI8-A zvG)ffi6+c}1xpUk3z3mGFVb2UCFlEiJh2e zzy!b|h0e*E9U*(cl(}kw{B49yk-;&(dm#W71SO~k0H75p1i1Q&Ka`SWVq&6Ftr^OH z^7Ehn@%O)(HGAQQKKP!eo_yv@pZiKP8w0@Q&p&hI5l4OKWADE3hu`0S|3l7x!)cdY z_LmF3`@P9V3smya4}biQTW;#>A5F{EcfI4Rywm>Dm%sYr+EoDQsujzRIO32`f94~H z9dYQob?ZCrPG&M|4FDOi0PxkXeDjLG{eH5YKtBG7kALEy|G4rqpZesZ4?pt2eb=9U z`fE;q-D_T4w*0<3{-x8|bM~6s)m6o^G!&KF zy~75@FaUC7@ya2VD_denMx`Mpb%KiIah4(=;GpExsRXPgrU(}o0|E$Ze2^_ZSOCV6 ziN9p5mgwewp0G;=R}%&v1v57A!bNc?7JK0cCzUksy0R)P`gdr-?-xRrRA?t$UR>D~ zmtdk>#RV(?+3)1Ls01(cm}kAd&)rO0BF^nvvq78zZQANnupNlw!Dx#~WtP z;xAv~g>sdrEa1Yb1yEq}44^t==B$C;yN8BH(sIS-9k4`5N+}|=#+E8&P-$P^ZcsRX z{`@t|mnyCOvA)7Pirqtnh_;k~vS#TD<7p{tFoqZ+~m^mcnGt?3r(R>qkyJ>G*A%cHHpq>xPEr z5w(W}R?G`zy@W6mj5d@AIYz5U(q8Xlcoxq9`(4?PUfQ!b~SX0x|<&b!|IzQN(4%l~${(dBBnWKE8H zn0UB#antZVUt?yejq3H(Vw|^-xK&m}!ujb3xsvuQI|Ne8ikrKEhwtoDl< zt<5uIN?<1q4DAL?%fwIUV0{&(9@7pMcGPbOzZCu$+>L(;QH%+MDP~Vm1OY&un(a0MqSDN;V+H^q4A+(JtW}83#>DCuo&x}tmH{BQh>#Fi zr6A9nyLOHMC{?Pu6UUQM0;%4T_sheG>}mmC{;Um?Ap0)2Oxs3=t_?zg&Ky( zJC8o}6xa?}!cw~G`4=!PCuzEV)e8VtmAeRRZp^Z0p8-@@uA-hY z-mireyP!!$&*JdUZZBvM%B+RN90D~0E-?iAMDKdMM%JNSRCWmW72Y+)w4-`2NsR!- z&!hm$H$!1UoU4cZ^~f!GGn#UU68~}!RD>dOvS_0HKHM`;cj7H*K6!9gvFw9$`>^4f zau>u9%{Ro*n5TcC_7TDeM8rGpFi$#S*cj`y#_TT&SsuR#qG!#65Fv<6LK-X349}L) zrwX2m6Zbi~OEHxSvStB0>vV-Rcj<{IzKWE3_`wGNNTrodr-dp3P+(p1g(lC^dKDmf z{P8D0{E-j6^7vz)dgLAe>$#uxc}7%xQB3ZO!;lh)SOJl>HZ7&C$+4%Oe)1b%|F3tR z_qJdE>c5?_HL#M)vi zLZ}dIn(Cxf27nw=)3~5JFQd!Eg7p+(i$5C=m1npU0tYv$Rece$q6tG zfVA8-T_ISWU1hH<+&~x(Pec}=Are*iWRDKUxWl=H_dg0V@>14}?3M|I+ja-Wosv%E zAI=(zt6VHZ&SZnEif1~=?WdF^AXIo6XCprcZwrJPQc~DoYk0bnP{ z?wncGTJ7IAUEgRl64an*{$2}}Qb!(n^o=*(*>1OVqKODVb=A8D`}-e%_`%7>c+afG zopyP}3rnAR=GnKr<=n;lELy+rc}O$>l*(=~IZF>PMS0)cyr5uyWkHa?2Zz4Sg>-1{Ah{^;9dIwxB}B1#X!ZCphy z#A#lf4PL?C+>n<&_^O9*K+KFJ0QtW#l`NQn6FQ1Z4nD8rFFMe?orq3$ZYPfRlfJwg*`N zu36%Pvr7w~opup(;$P(x)7KmwFwqR0?xO~%@s0MJ-! z8%HR}5*Py)o?q@V`G$Ub{_DEmc$g-Ozx(j?|E`&mPQL!m`pi1a>gxK%$MSzXn4Nr( z{^*%HRb+C~imc?;CId1ai$P}NrVb$bvxsZK?n&U6p^2k*V- z-lv~=a%g0zTq>V+_FLX~);U*Q{)f@gu{WN3?gu{nk>CB|!dD#k`ZM2f_6>i(rf*>Q zt?z!<+s`}i55K+SkVB7p*N5MC(>2%LckhFnH*Pxqq*LF1-n;I-_pYIlk#pa6?l=GE zyBB=#$B5}6hadgyGcVkF%gu)z`id`p`Memq?ni98~$L+! z!g96M%zF-)@t>dkcu%eRt4n{IBi8C&S>96a2%^Y-yW_wBT@*5G8C zR+?Dbv2y3;vGI1x%vdm^lx_#dYp zwPwYNN?k3SH%qtI0RSRt1TZu@G=!MUoV{RlVzSlh=rpy#2STDACgveLpohRJO{l8q zR@#KgKMg=iDOIV1w*d5NF*T*5p7&DV20p zk*vE>QZHKqYcf!nrU{lxmH<^kh-8c-L5WVFmXJG$#2RoCMFuwdZz(^ z&2#YNHNa<(LeV+`s0M52pAcC>NGnU9d-~yr9{G>=yz7!*{*v<6fd?Nl)Hm?c3og!7 zR_>nGnrxs-+=JKy{}wUEMV}}ZdjcLAfpkOEh!Ox0-H(z)0cb$&{Y)e&5JMIaJDpsW zN{>CW>|5XX#*3>~0pyGJI}j4p%<{0rJ-U#K!OpGC>)jQZery*mI2AQI4Ft`D-0upP*d@}ms9&i=fNE*{9N#f z1S%y35aICZ6)FBY*PddC5MK&l++5~g{`k-5p1!xcqQCvEufOeW=iUF{1BjHCQ)_8( zWN_`)?Hbc^n)dA;>^!=3&Vt$NHtsmE$HoCgIlcdya zPp;d%J!@w@Jzd7=O`D!BCGh;RRY_V=Nn*Vc2mlFnsZ!IrZh=%61^r?hS8v)7fvh_>!N#{k*q)?Z3YJ z$-5OR$bX2@YB-i8Dq+lAP>*S}{5(8r6!_7V=rVLhiYy*D zY+#_v&Q=V!>5CMYlxn?7r+gvuPIe;j2YdvWm$?V)@>9~?1dS7Ap}^a`;?_=?9_E+TnDL_{RikakBaQotGl17J}>VvHV`umoT& z5MXX#(M>C6zksx`4v|-U=^Bz3vxRtAx zZ@%!wo!fU-dS|bE{)OX?ISimYG0_;cP9$ZOEdDdCIV&!c&{-vFzeY*!<_39HBF5GL?>KDt?dh?Fqj!BKtO56eu5=_>G z9YhA>9gT|@%twXD%3=W7X2LV7Twq0CU1rB85gvuW?3C>&ovh;(RR()5@Jr7)84F@N zz{ujASMuCjpx_jC?m%R70zUq~L^e@WEvH*HZrrkI_p}+a@~pFI^Tw{OF0GS|>(}-7 z_4m%4j;ItOS+nLjp+8Qcg8wk`kLv7qWOrR8T%wah4 zGImeOEmAK2RxXr)<~@yT?%a1Vq>yeDe3aEm(t_`XP7;%McJ18RnjCY-+!$lforObS z0DEWm$YqeX|(#Vh=>j0sxR?Bl1&O?opqmz>(BhAT)++<22f>sDhD*)&l8ts{0KWN{1 zyLRqwHF8T@10-4@Sx`xy=cA*e8R$F*0;RMDV*!zg0Ll{}fCA5pFfcA?v4s3ybl?-S z5K#eY_Xsdcq?AHX<~As%iMG}d5r77Th?+wfr@ds+7@!Q4$}MEMPgX6FibI=3?Ksio?o9O) z38@N!Ou1GY=->UhCSEtQwjgHo9RYWwg!5759W&~`tKHv~gu{1-3Xn`m#l^SECC!Ku8MZfsb(Z?LM zXz{{Ne&!21ckRw5hfg`>4L`i#dxsx>;1P!%{O&CqUR?bmW$lFv5B|{)zJL1ZC%@@U zXG}K6|9S0=R;5ZS>yJfbGY>wGA~*JuFjzs7;I7D%l~d7vrjDj^nZSo$Rug0IXO8xo*jAk@!Phn-neO#*6Oe$ zk9z8fCx~>KCVe}0ELyVvtm$(HcJ-UQvu^dKFMsy41A~3N)8>wi4>y~(Yub$F*hIBb z)>kW&VR!hr$7Ga!>$@7bM8~@hOyKOK$fIB>yxzG+fiIdm*^D* z1?R8~gwAA1DGjAkl9WV+eh(NRC=4M#xP^+qggsVh0GHunko6GVfNR2ndw(L@j5A?u~U%+C%{3kLdKN zh@*x8Xcb_b!XWW}IqNc3f4Z!7?VySL1Qi(rfTR%Pj)Srs76HgwWyv5VX+k#lM;?=C zUO9k`6A|~GH`BYPg?p)@)IKcbfDtmeT$_NvLcw|j{E3ja-jGX`l@HVH1t&mDK)FSPoSxg#h-A|iBh(uj&c1J3CJ03eIj*SlTq3ED`THgC>5lSu*u{#ZrHk35=r zt$PL%Uv=^+|GeUNMAMT}YI1`> zpjD|-8{V~T(W3dUIpvh)D_3mVxUs9d*BYzBQs=mo;4B+009r`O)uF+`>#z93y|-R} z-0`QK|DN}}x>!Gb5wiH zpFgy7n<~|^JR91zYizjBB37!ko@#aFie-@0dV1>v{exRK+|pC;R+R7Bv3YW0vS;>! zMzb|EJXopM44-%mjBMm1pX_dxE=$;Pe}zy?z~mAjn$1HAJz`Z5tu~e!2#9!(WWPKu z06bmBB%7EjfxCwz;K;1n-y&dO)G;v!Zle$?BNpyJ9RTBrL<+_iHo7o#1JFs*nru`n z_4mI2WBVU?SgX}svS`6qzWRm9iDpl|_S)CI_D$!U`{KIwfBWm7nj=HiYGrU>@OKye z>aZgY`NSta**CcR-`D-Ud-hzi9T2#QZJ2=v{C|ZN#VU&6p5o}>WP$()7NDeuTjdKc zYo(Z2t97D{#d@y3{UumD8-9F;-M&WYF3fX7Ms+MqPHHGAGEO)uV#v|I)wZ_^~sSIR0t(LK-Inmm+ZA+Z|7?C_!}VD|&> zoJb0gS8|dDkLH?nAGs=79~?tYYoR#l>Zjc)iU>?kV{4~?1D*y^#GtvUXm&otM0w*3 zl2HsIe#ica449Ho2fUGP_@4;3XY+N!4*`wKB~oGHMtRhpnXsQRkjZii0WQ8kXrH$S zPa4FGxUNBLM7|sG`AVWvkTNziLF5lG>Hr|{{HkNM@iGT#oXyk!kO&I9U6}raMF9fI z{v#jwd8IlJR7x9uGhGn7?`Igh4=7L&lRzpDkbLn*wy*e`vgrYWujUDog&}~SLv=#+ z_mz%K(Gz)_aJ$e608l3YI5^PP)7?9F?wr-iXjHro*4Hk{ErueiR5rb*w_2%=kB+ce zuvrsPm?x*~ad(REmTzbf12Yve+ zpBigS{OE_@=$*4qRxaC4b8>JHzyOr1Ju@gtP1Xj`p4~+pEaXqIOBDS)O5YtOC`5N6 z9ic)3O;U=rlTH$(II&9C%mb0L60{(JQJx2DbwM(x}OH zUis>ijyU3o=EV5fXPtTJpRd|^%gxqgr=9lNLk~N!({8=|m?QQ*;E)$rt+u9p#LHfB z+zBtwJDnLbroZ|%C*5?*?d{y8NePUV!w;EdgtwfO`rd}VM3?zkj~xGL$|XcDw0PL` z0`d<_WD7(9>z8S`8Ebcbxut+k7J$%NvP8-P==lC@SK_t|O%ds`)+RbZh5jM*!Krzq zp(PAOi^xEP7zoMmSx+?QDWyDSp#pc(M+6|1C?evO_$Uw*MGF)&A(pUft<&y|H74@B zT`JWZ!=qpO?ssmu>Q6uW@%Ns5^3fNUKlSjVkDq?VDQ`UctiS&Ga)1nV`NE(4;1x%o z_`wf-_^NCE{*^C(>PHuRbMuzX_uX+jfIa1u*Z=z0KY#e4r#|(mPd@R)Gw(d_EvKJx z<|V(qbYS3x#Y+zR@lU>f^btpX>N8(`^6@9~JkRpnS_6>exz$>I^Q&LnxwY^4=NfwhT z{^$qJ@9C}s8qU5vmI)P?d3zBWa=i+GAPy4%0i6ZtB0KdM%x#GJSltB1S(MivB9m1P z6){n_VB}^Xff5mTTcblX;(o4@cSp6b6UTVCt*d3_%J}4XR%?jCMaESrtn`E2GFxrM9N!0M3x}S zL2Iz2AXn5@plxEVT{`*ovwFKKXskQ&8L|vB0)?oM5FjCIJ46Vmm338n;>9xx(2|?D zFd3v}Ts4fFSH1wIrAuI}ah~X;9LL5$gF^BIep(7qp7jfRykc{pJwA`*<7XS3oL%js z+B<9M(@#9{_+#&S&-u?j{rLLT&)23cNRkAVBBH)68=-g_+`Yc$74$5t#~djH)w zcXiKbHk%_8jas#G{(C-{CV1W7|K7^-SDbjlk%t|cCMhVDXIYXYq_nYlr_-4}Vwzn#g{@EgI}>BC zJpJs~oOb#@ufBSGVsg=Y-}mSvPmK(ZzUAC=o_y-r@zL?K&OYbpmmhP_t?K~w_HEmT z2X;Sv-_`~D%s=amXRTVXeB=6c-P5OcI&D-cKw|+FF~B+h!7rNnCPoD7%HhJ2RI`&d z6(S}UOJE^al!HMao6~R;bb=;xNe+52007iXR}rEWr%{BAr`n4>XUHQ?OMJe}qmt|* zR$4J0#4_-Q0x1C0r6o)D-*4X~)4IBzdh)T+(NUFSqE(ud?%FUg>$<1j*RfALxA`~s zJU^6^R%&vxS*usO>UB%hYPZ^*%vfvk9Dyb##&&GnID7Afv*%7UHFMs(f4m#+dzQN)CzW#yXv9w$fc@hwUMNj@L%QCJz zun<^qe2rq}#(dU+q39xx)p1n!M8SrZR2B}l@VEDIE2K|x z%H;7h#-M;pz_BBWGGYoOCP|`nD8?Z2l_T&0E}%PyFu4kx<0}O~Pd@(S=RaRQ?)Ve# zyX#g2N)t4B2B^SVA|SFV0h49c+QW}LGA*UcSG?fbDaVlI?cpDiUUr|s!f(2u2 zxz;^A*!Q!a{q)~A-1Ohy`qn2t^!|%3ykPF^X+QkI*9M1&F8l4zEA{CF`U4;R+)2kB zd+S|yTzkzm)t;_2DRr_oMyCPhcSx)Q7r0vup)H@ATT6{3oMO7au&7a~f^<*~7` z_rCAE`yaS(&GQc@NhPzn1xnaH!Sh=HRKe|o3PcV;gd!6H1XLYMN!s8GCh z+T*YM=Z()k^|Y~&mU{kp#T73*{CUCkJOxT6NzbE?-2dx8T=kicd}zyt z4cA?FbEn-&Yc)&O=X!h46|rsb7euT13pT_2o@4-1UL5q16ap9n#u#hK7{PFcRhLUy z5AS4ruy>|S7Rb7JN(4)wog{g27Hfidd2GQu01%9|34lUnkPkQU|BkRG%8UhOgMpF+ ztvCmZYqApVgp^2t5DOsyNRlMWvIr|YIhXY#(FC54Dhl0Hf4cX=d9!A8>m=>8n?18; z-+jxizrO6xU;X^2uKL^MZ#w(UpZ)w-Z@%FlfBgNWU-tR zeD<#X!8`7~A4mfx)^t!pNl-=*H<4R=!6-L1XgKeT<~vynLiq~TC=trfMiAJXc#eZS zoO5&rMsO(P9TIAox5tzHSo}B0m;5P-zjJ7@iI1+RLa@hR+6YKtp(5LnXC=x#@deO7 z`Gs7NSDeErzmY`7;G0*b$KLnK-aN~-*4l!SHd$}Zm@ENVvhL}?#V#m<%v#jx{m+gLZhKCv98mj8Q-MDe z2E+dmitj#g{f~HKY*2f=D5^dO!TYa-JZQ>IsZwcAHZT44#ozqi_kQxTU;Or0zrOE* z2kpoR00QI(9(w41e)2PCp83W<{rOMNFJ0O_y+`ZBwPxtIvAV+m=4_-0<+|YhQcn@h6^e$xkoL z^H!?YNIJ+%vURf zO(I`k_#7g*B?(TfDsOYeb!vPWryJfrxG>G56^mtZ9eET&K|a!H6w&d2fGqWNPn#T@ zc<8=+>pj!^21b@W`}FR<-KW3)jGbFHKl;#pXPj}y!UYQeY@TI}@iA11u2ydR*T42& zu=l&p|BnkU`1WM8Rj!nClL>3x!*D|{;(1esO6x}^zob&XZBV z0#*S22y~1r!-JyuH2HspfIuL$LE<E>PBl>k87!2KAZ+ZC-iAIRxo_T2YcSN`D z6G>JR^A~(`k05*l!S9$h$t5v*#4nkW0*ZdfmKqHpL_fwAj0!5Ak;UTj$QI#{mmo5Y zD@e0&cM53c11qtN2m>Mt_Q_qHvI%5Q6VuA#_yp!6S%xZdLGQq88e45rZ}ZG$(juE}u4MK?lL)xd(Zz5}h`OcN}ow(I5QK2k*b{!N(qXC@uGp4BhlCjLHN zPw@i)0J6p^PR_UAuN+sX|JR3=RJ1 zd*8nKy6Z>BM%JueiKUbf+_HMn0eiY1zUMJ0h2}^qvE>BAgMvScl96@n{_AU%yr>jC z)CB{S)foIOM*)i4Cn>UUxFKSJx##Xk{B{A2D9`gmC&qSwm|1b;VuXaKeb;!TU^z}9 zf~81>@f!?2$rdIuOVZR@o98Bqj^U0JH6~JEOHoRz8*jd2%>f%GCmT9Z1eBDzfAZ6d zOiue9xNmjZ?2W5epZ^~pddGS1Jm=iA4m)PamJORe^2yKq>zeCYnd+Lo_suuoamwj$ z`t)Z%bHQ(pDhzVOvQP-JCV{| zr+|ZRsQoBFKhh1y7XZXZKY1as`(G35v^X#-g(&h!)@LUS9mT96xt0z<|S z=GK5kMAYBR~ODm8ttr-CJIRbXyuAwKyH<_e_E|yoe2ieRoIA<1SnA^x1^JQ z-~Q0Z;I>37B7c&DcoIx~6+U5LlB8EggJIYab15{$eg~pHCPvYuJDNPN_4W+(@BYd6 z{^uRW71wg1&wNiQfp$F&Ap8KBnzVFqqJgHjg>X_{2+ioI)f8Tn;Ti^DUUtV%? zZgW+t-Ez}S{X4eb`@jR|pZ~TCetgk*Bh#hw#?4!?oFYP6E$KAXNn-Ns?mKRp)-(NU z-}>I@@L!?KquJPK0uW*}hd5yig~14iqaN~7 zXNmek)2%gWrM_(0vJ+nUs?UA#OO{}F|F*ut!O_vN=T|H{>zp^8dg|+p={)h+V*ok_ zELAFy+O%A0PK;i8^_8Fd?B_rB$xmPQ`%AS+mD1r}SP;DM6QM&KLXf~BXrGG)N`leW z7;oYhG0PDNK>=Ay8CjJz8!%}qEt^?P^0u{P2#~Dv(fIjLt`QB0ympIons~l6L^pYP zS}S!m513G(JJDTYuZ*n1t4a}>>C=1mU$VHArdggVv@>VVUbxrX?kaUANAro+VZGfa zAGP?9gXc|5v>$k4&2ziP+eD|I_Nt?gIU?=qz3sNU9=iX5BrQ*y*<~$SvNLBT-P5Lb z+MS8f{@1+hptDbZW$&zBg}E7TEPML7tL}b!=a8*W>n)X&+@w&_NaXe`Yn{xT(YtuB zxswBfChN@9`uyV$e8cNsvG>7?9({1xmDfGAa&TgzogcW*{1ab&T=%qjV~w^8u>0&a zf9sAN+ji_u(hA!(Fe9$un68mJ_^OH5;=2U=uF(Q(_WS&;m zMEjuRe_yx|&;}O_;luaBQyn4jenc3!EV5Ap`w|8-704FTBY}7n9{}M+;l2FCH4*sh zOTS!>%yD^2$dM{V2n|$dO3D&`2n?N3+~JVRqGqW}OI*qYre?Cz3Vj{lNlj7%CpJl{ zdD29{Sqe+SRHPyt#4R`X$`bbC*-GHM(TGsAAKGB?(w-c`*_rqCUQ$cl@s0mGt5iFyDcG?tO{1_8))bed+JtFuT`gNPW^wn>E^g|yx?C3+j^PTVCaP75czWHt6{>qnn zr}e()KR#5dmlg84LP11a|18>UWKhUf7s;HwlOtF~1|*%1&6&utN#m829zZj-(C86>|78jBnkJ?ci4M<4_=#we|mB*{7% zCnrAk2eQp$z`%8a^!JoR_(jnjJxYWLFV8u(R$A+JyIqte6&peBRG~m@$dqb5Kl=U! zLx+e4V%rBf9`^e|V5@u8)=nfOP zVTLxA4HkMENC0r!60$Mj2~J2{PeOkDEO8}CDPQtbO1duVS5SxrdvV-`NQHHxqAXFc zgNYXeWa83AkQg|QOOb(jofc9Ia_nr1`T4sS%`(QSDf$CvTnUY@g=Qa^E>^N7G!`sc zV?jY#_ibpt^Y=S$_}o78>&fV3C)KK?b)u1(FNZF$M`1SqC;kOspZa2Cj)K}t{L~4fP2D zj%+d8ApkIz(o$)%)%?dbSFc*Ne9>O}j88OPShI5b_MNpEGghp8e%J2pha7xxT23}@ zShs22#-zLZ>1UrF9v@n?aIgN|{X4dA1C7R*`hgO{LOx|Gl>Z+G8rZ$FQmf{9MjREqP&n&mf*9O|BSH9p zZKpu0Jj3Ry1oA8bIzlb}N>aZFag*2|i(fDyjmpVBdtg)zoo8Z+T(abj$xS23jy)Gc zgZ^K{!}eX{|9C@Bd+)=Al(o#yMU9H#qcJIFY&wrjhXKq)mmRqY)3tuI7} z?W|HSb#?dj@7$G*jlK8Wlh69xCt+*^CI(=7_c{Hqp7_*{e{+yBfQmLMna%+ev z(Mg_Xy}46Ya%fI;XVZ5GjbCC?Kn6{pbZ)p-TB3C%bDoe7d>DPu4jHjDQVb)E4gyH>Co;MU&x?2q zPg}={gwG3+6U0z8Mu~vFI1kLF2q0dNEc!t)1K+x1Z32dS&cRKIvQdRvFx-E~_hhsc z4HTgjMe~x)Fg~DYE|NEE)m^|=5rI6vlbed|Ad{=8t}WDt1|vAQLHUB0%yJiPFVKx(NC*HX&r3aXpL+D6uYU2%KmW!5-g3*ofBeG> zZ@%>|nApu5(@LkD{+2I%`m-m$`c>E6e9O*VI~CZpRJN_mAb98oaYq(F6uhN>K`E?- z=sy5NWU^ANyEQuU?Qed0@A-4Dy!_I)zP<6>W4HYDC;zjvfBeHAdH=V*eZepP_afBz z+h6>A*S4J(Uv%MTKlkZNF8*1idq!?-H0VH9LyA-=qlvqRy91H6)M;gesNC_f z-TlWBXjQIPthGuh3vQu<1+A*}nwu3chJ2-zpj@vZSN9l*5g?dcFiL;dz;;-9p*j#m zR*0TBrEVfo6U7Rn%!7T?n>hua30}uHP=K!2LF{{gH78Qsn52?UhSmbLvq~vV)1=eM z{DHMoK-FP_4|=Wt|1? zLspmcWV1cd?3AiC1h>F8uUAX$cC#_oDOIZpK&`8uW!bjA0m^cfB(<)dBux!jv?fV( z@3d)?&57q%tN}|&x!gT%8i6%=hN$X2J)KT-)0UlJc7n!IwU(rstVMwS!G4WeX$1&* zmIFbpt2#C@`Q)-?w%sXLYxVAKB4dpKfKr+yx@)}I8XlW0l}c$jt#{QsoowC4jX7xis|A7Ne3`;&H$-k~ zE-o&_$m;@!MX@!{>J^5Ffkfn=>1m@t7YM&scOpv;0%k_=gux1tqZW5Xex!KyTEJ6Y zd`MBxUG0E7$7y|VfG~%_{|zYV$INb3WXQm?QH=2M#05y-1P6GWj-AIbk33qCkBE^W z2%c~kk%_vC*h84Br3y@oouMBa$3IKh(zAWZ{D0SQ*Iv#*yOcZ}J zrQi}IEx+@|2?hW_AvCw*z;c@L8fdjZqdWA-C_=J|a-}R(Y55Zq=U%k+e?K_?wTr5q zENitguqxFGl`Fw3B62&L+#}{Isn#VJZ)9jGwWt(~WVP@A;L?$`Pv|m|dyX0@?s$wp zdr;T#X@TB(w~N9E6bB!FzDJeaf9Q!F@A4o^09fy?b(*bZ&pf{Tg{8gS-H58uoNPBH z(rO)2{kK2;Rn)}(0(wA#95Js^}zWdO>v*6J0{mrAKl6G4Pv6A^9qe{qq4#e#b%!ee7p zBEfjJ1YYttD4z!g<{Ap!h<&aQ;Uw3Ri<#F&ZWR76K7fJ@5O_Q{0|8+879kIcX2T*q z`jV~%R8Xl^)~s2%W%EW<*zRO$DMgK=W25)neFqY?+pV-xR;bslT}cEVO_OS)jAyagMtjMubu`tm-c@`_!fZNvpKAT4NwTE`H9!$kHDlNVKD>>I=TMK z1D)r$H3#~&HHNGlr)j3tv{8^sxd+24F0`vcfA&ze@3BmnhmOZi=|AHMURF79Mci44 z0wB^#_4f288Z;6CXr%zPrEF+;sG7iuM=W{Sk@E(JTN6!710!Rj6TKC^_uSgf?OR62 zMkgl5jym$tXAeDS>y{m+lWPF7Chr(jSgR+tUU}w$#~02>U}SWBXn1IJvYaM)|7gt` z1e2tyR7zd7L2C_^my)DXspwMD%3Iym?lY&iyPS-Sj#<(@6O;93V@9fLDK=Z}$+oF? zB}(Ps9%hoLuC98TCY>zPTDwO=LL?p(JNNoUKvY_(B(Ztc8J|e2^|V|yc_!wFAy4zW zwYe6?)ph~^1Ef$#n)Q1Mc^95*jVpnGXe?xn27pbfT|n;X?<5XEVySKlU--97qPs_< z0T8lnN$3U1ho@qD{5J(#fR~5}IQ55n7@+K%3l00*3UP=^M z;lR%3KSuyrP#`xcj4gm8`eSHib(@gJD7vBFiOby;@Ra!$uHayVYrqpGp~fuyUiNMT zDl6?rQVF~x5~4&2EdD8R6Igl}0T1IT?_P;GCbHNZGBdS{CV|E3!oUMfgh=pF*mChG z+T*~Z^(qR535hT6KJJSttB)eJd$F=egUG_aDD+Zv7Kzn27$PhH02zZiQPu8i{&nrh z=)~u~_=QU@zUa$e-2B1|tNM2Cs#mH9AA0b?haPnMEw|r#`~6?|;>Uk^@y|c`sn1S~ zjMS#hG|i^tiQJ_C!P=YM|uV;BGGvYW5}$A5n63;(|M zPk;LLj~=}HhF!b+Ydzh))2EFO_5b_&tKR&kbKmo>w_g0qpHX~Jk;vQAso+2_)xSbd zj5Wxgq!2ShxD4j9w_!qAjIJ-RTz>hevu3kN_BHAIjSsV^NOBKn72#6LwZ zR}2opt7|>L5OlIEP1AC@l;_48zhp-WHslgu;6KZfcUN#4iEq&r6kch z%QBPatbkB7MJ}~WHAQI`!7W0lc6B3So@c(|VlAPqRBBiSV~h*p<#MT7ts*D{GS*m* z>^9Gp!fLHvt920(kj?YVPx9H!0;FlVG_B%_W0s6HIRGfYTCJWWy4h?el~Q+a_mU-x zdV70O>lrhqnNAJ>naRjKTocLW29>IJ)dA4vS#AviluBu(G6NB;b;r9Cq81B}hwFp` zQCXG*91F~vO9B!YBqm0*fIZEJQ3-S`W%o^yJ&I!}Aqeqm9`G#CO0fe&cevkC-U1v? zi9J?0SAnFa7(C5=B6LK`PNB*te8pAl3EVCS zZ|uGY3}V7yNIcLh%!}Kf$1b=Y>>AxJ3?RR#qCkVl1GjrvOjK4OVC--aBKkoP2ltm` zRSs*9MG8DdL0XLZiQtMUaWxecL`9GPrx%lw2o<6z@4Ck(4gf#~kkGbZ^%ZdP8DJ;C zJ%&UP7YWbW&RWNatg_cAs-*{j(=^?K`^+0AMLI)UlqjAVR89YXyK0u5T{e z-u}?BJpgumbYjko`nP^{`%^dm1=KhyGGxgr=~d`G298pEQ4n=xgbZv`yp?FrCW;b_ z@e`tR|JYKgTrH)QG|RHlu@L~&TGzU}bfQ70TEUIiUtX!z&O86zhaG;{BM;m^efC_F zS>XI!RO)(d$)cq+Npw9iCReD+i84fBNh@8i)vPf@q?9HEYx6WwX;QV;BBIjDS^|Is zbyBVR3K@nBiX}^AOQjMxOC&&rl}gpsQ{t)z$<{szsK5vk@mv{5!O1al zhN1@m#k?P*R>fNjdruf9K=OXBCHtUDyzM2V%?^FTjWNIx$K4P{r(7cpI4XO}>J{gv z!Vf6QoG^-$2td|oom48SleGa=TBw#7~xsBMb4riAdqfXVuDO7Hk4!0SJ^VA{JNh z$+0WGT0o1+;}HfO0PhWudVg@L_&rOWfwK@;r}zj?`5^(3RjE$PDJz3efwd;lNvk>8 zXqjhT*fGAdKLNY=;03Gh-*(T_n|61oQmc+NvR&JD9eUI;aI zym${$A?ViFgi?Ce?D<2(qn-A6y|*{dGmGHQ-5_=$^7C&*Uc_R+rGNCIS z=brm3{p62l{NBPjnhAAbX6b(@=>#I5gBvx@`iz?*YwrXJ_BefBfi2x88Ke=ultVG=BP%?_F9-|MQcd8yg&` zPMdD?4#Nj=_=t=-HV)rk`Iz+qp(_LkV64Sb_w=pXH+=kK|M9hN{?DI(f7x|!IPC{N z{n5HL&jFyS&YIl18S=3sUjEt>PB`LkfB6eQ2ef;TB7~`b48{ZDohVPb8cbCuI%`fm z^3X$PzVWmL`z+b9Wdi^J82*Lq<@CSWXTj`+3+L_Fu`SQ?q&{QC(kE9eeHs9CwXVGO zBE*wf7BQO$VMH3Sf~E##HeL5ya&ILLQ>a;3LfLf1!3}~zdtt}|`G6waQVeh*Fcf`r z>Kh2x5(^3etP3V&NjN_Ox@V0O`Dcm+kPWw_V%3$sgNKh^bb$j<0X)c9f=-r}lC+eX z+!$ktYL5V)Xffa1ZCc%RKOmuHGGIP}Z&%n3$;z4fjK zSG>4>*RDR5l(Kf)uP7&(T0#IMYsk9K!7YKXd2Z1#VuJz&ep);vHV%z|fFq2DY2nEZ z;fc5+!3LH z+xK0G!UDyUZhMRvKCNPs&xRc z)*_LM>PeD70$|;ro^D8lf$kl+e(1_o03Wpq( zebi$ySn`{42$Z$PWP8n?cHGRmHTj*-?3&+Qtapn$)U89ZZtleM8%K z_FE#IBo2agg5^|C=GpXGb-!ud2fX~ygHAfUIodqEvB)RMJE8j(wkO8+J^0WMedxn`Ett1yxLC8R@J9X>)710ZG{Sv zlv0?QtYb~Cl0+#qxuLv6&f0XEluC%22=Y89KvYU8r4SXO$unzAS}q}4GPW~0ktX`} zZ#-w-oEhK$?)TCpCA7vEGJf%fPIZ!&5y2Q^a*Ii#bP5O>6%pil2bC_BG+C2(GGj6f z#^hWzBBJ6_OlX4*M|cpI2mwM}R(>DoL;P{TNN<%HH-n*+5Yo=l=-pOFmJ;9g|Z=>uf3N8_j2f6~lkGTrv8X&NFu2Y>PT|0Je|JUFD{O=q7 zHGB5VdbQflvZ0}o@zG&St7*0L=gTf`HODTx_<#R!*~Opv?3eochDz0nv3Vp~lAZ}5 z$Ni3UP>^CYVy}{N_l&;&o&WXKPp@44!e>77>AP;b{m$F&y#1cLmoHteF**0#vp@Zr zkFQ+0`jSh2S*lGp#)P}P1Y;K{;vx5q? zQiv)|6RlKIN-dd6scfx%`H@FH{Nz)&+;}tU6c9`GZj)z9C6K7-5#3HPERte&K1Ho@ z&qD@GQ1B1_FmSENVPbX}$27%*C% z1MbWk%;m<&vRp~aSVjlp?LZ)Cg%e#Cu}h_<=Ou6Fr_Qb-MY_6PWiD(U^a^?GkWYZL3XRcTY2raJB9xfS%>i{rQ4J-*LOJ$+_U zud5`5+)!gOAL=)KL;05eoSIco>8&@n&)u~7!>{lD;K_5|eD(={-Ee>2>8OOPpF-p! zdW-@D5Q~6E8cc}wnkB~*MiRPwTk>z~lR!jgv4~0&S!=CWHM*l)fJ~m1 zs;p+aF=(ivi?;YIcn4Fn>QOVReR^ zat^?2A41J8-n#C;i?GLSZ4{J?hr|AW;=KMoack_UTq{Rj$c>0VZY^ab5wupE8v`Q_ zt6-E@w*MqBD+o&C76jEoa3X@(ei1RD@EAcx@X&3Z-F2T609Zte2~qCMNDemR-~>hj zmN*x~phD+(d@)3*Q zdCI;MLld{(x#DHVAG+_})4F?hOq<;`Yp*%?Ke6GSr8~4m)5(WNhg0vj?^eY}z=|-Ia8<^zB;LfB2yb7w$j*uC;wNoj{s2TcDLnv^Lf% z4POxAAMtOa?7j1GvvkpDvZ%52!1Bh^`yXznE-ovMbnQGAENchkwMC_#J)Zp zxp7b>^GAe2lI)>fD5$l7Snlbu#&p`P?OQkdD^*&qSF}z*rv$xM|Lsqx;P=1%&FJ?= zKmLhNn=DgWTWf^;y16>1Kp>aMQxt#{r2gA0BuTo_OMtUtY3n`?jQ3L2C(AQmPOE zxsx3zwu;zFqa{>85Ka3_iov9;;7Tkqb~Gn2Eb5bQB0-QmJo$2x_$%9z_ho^UthFxFl$2J4!hD-iB)T=l ztJRpYhJ2P2z=D1d`9_R)AuwT-?aJi^&qKK>NEuWpr$=3ts79j!gr!QA++(eISioBY z-BI02elCN08E$wi`U4DVSukAAONdCr!=%2cRWw~9|p~FP+X%01W=$g zDI~C#FsUX~O>HONHE4JBTYxs81++i}h9Cz}2#HeNhHQ=|d16hv_Vz#B_R9LAedbiV zDr1AAlqAB4rlMR#7Yct+^gd_}!?*FTrj8pK3Z~vmL>0&Bs91>XqmH#GRvsE_lSFm* z^ngE3&;w)$K~rKC6Q7V6`c)UixEJkKDEzP(3nE}bc2#*^K`SbC@8f_c%@rCK!4d@(6Zb;GB9mv=6Y>X97CaOAlW3kRL`@Hj7%B`?QXvwd001VC zR7r{KDRL5G9lA7(_X&Un%Qy@GWEsxHq!40_1zBfuMz$DVSl=_{<+3#CcPvH}KVtvb z1Dv9E2mwr9xkT8Vw?gN&yjq1tN{mRY{wT=Ja~ygjXJU`{oCBY}j_{IWK$s?&oy7dFrXB-1xw< z@yUG7{GPtihC5>qQ2|(`kbpY5Ql-kY*}e1U_iS6Y^?@hWA9KtS$ZB`o`TVnw)rUKc zq*ANY%2}RA{!i_!lN*a#vpqz<4B~!4N@Q9G9C+Zu1$+JM=Rbbp(fhV--+bXue|qK_ zr!RZz(Mr8;asr~RT2}%vbN1|gmn>TP%+lSvw;gcEF-sQhvwZpTo!d8Kxz{!((ypFY zzvi_HaLt-^J9iJ1t6ii_y{l{9+;wB7_OZ zDc~$O;Q)p4<-iaeqyZe`LCiw#Tj&==GuyKDGTtx~--W9leCv>WM6$!UQ;1xlcCw*B z&tuq+As!uxAY%Yfm8xC9^&AC2WO7SnI!UQYw&$wLujuNYQ7t6|ZY?NwZ28~+_U8i*I&9J6MOi0bv+9K>pM0`0K3VGN zGID+}v}C!rXr#04V01z82tMnOJ{5goN5QL_s%_lgvDL z6KCCo=t_X72nf*@XJ80W`7;+?K7#xZP_M}d&co&+`8-k&A}<|fjC3wck!i9L$v?A& z5YQ4HkVur2N50pf#wJ0F3+F03hiUbQv`g zT5|hhSgm9bb8D$JfgMnL?U!u2d1%>Ru3xru)`Gp7jR{OsOHr?4dy)}_Dx#AMdC+!< zZe?7B_y%m*p^6_Q<)-_hs4zt&ET}Mn=6%@v6-i;37aWmSF0f-tWvk!^@mCS~3=x3o znv4DZGe*EzN&yIbP%VI+Xj-BiUxeH}zBAY9LGFl=I%FFcv6=!1ut%a&AjlyG8ig6+ zTDrghAo-I55P=tR`x&YrmJnvbs5$=tPZzx&r5Y{VTCo>$HA8wHNCwImk#IzQEZis! zV#oH=dJ+0K=v9%fJ#WB5C@8FUfcWPe1S3oIBP5wR3))wHTu7iiV4(%%ika9RO43cf zJLD8Wv_$v*3`KbLU$C zzq8m{YdiVYD@#`L1mDhTwSM{!; zJV~@aPeq_WM`{)aat<3+ifuu zW9>wv)yb?%5^_ExumL>I$O1_z(A9P8*FLp$>3;hiw0+x-qmDUd*^1@&+;^WYS1cLI z+BVNlIqMy-KmB!UR;}9q;De7l@s(RPY}sq^Vx^K3Uw!foH{7`FnMW4xd-#8T`injF z^2q4G+uq)N>#cX*e#@Qbz2m&o&p7pk=^`*}}{`+75MrnKK(Xaf>=fBXH7%nHtD_(j0|6X{}^qyH? z``Q-<21gD&^sq-CyywYBANlxyetz)*iy_b7^rkmmaKQzmBLlizDJ(k=v?kCt2u@l+ zwqoL4d|981B6}!@R(~z0C@vO&WL6xkJ>)PT5|eilDjHilh6%ke5+VxoWdSZ^-YK}2 zzp+xDSH%~EN(>OVJ=uP4)_oJ;lH+>xY+;#>3%J3n`U>f61cMkkBl_jE921G$Lj+}d z5ikN3;G{wrpl?Vm~jYPd?(<( zMsjeOGgD|cYAaL6!3M(m%kY0mT8QsrBgXA-i{36|xDrwrjHSbVlFvsiF<-v~(z=y* z1OQ-s(MSgrxp(*`?)Df@uk~vex*R$fQC9E>VbxV-2fPpjikOL}Lc8IU>_h zIw?<^mA9L#RxDq&VyWK_2?%Mm+|zAL2J9nTTJRa5*Z@d^?Nk{|!pqcMsQ}%H-Q}KX zS-Z7u>qYPzHw&0gO0Tv93oAs2z zTdb3r!lFBX(3qHPfKouw-4I-$=EbO@GNunvP?btTOc;QeB889L%{bpzTw5pb6oO=n z0lD^l1hTHv{#hIT3{!>t&@svk8A`NPh~Yr)_|E7aW6b9z24Tu_Q{b&8Jdl`q7H~bd zFnMkBCyJ#KvwDxu4){3n3)yL~YfmqNs)W?aLc+KMOqJzc0rEXcfJ<5x$nFIG*4qHn zQIPtm_?z@E>}+tqWv~J!rf7^|w$BE_=HuN|a^Ywp0Re!uP9Q{%gZt{UQs^@m&Y}f? zfdXh3L?=>mB81=t?sKkX5zhfKit;HtN~v}yv(_q=Qjr7tkj7&qOG@!lovd}N!#^cG{RGYVIspeYIJBQBvAQ)(q@e3rP=ptuG7bDQ*cMmMwkQ>0~l8zM6bZ;2^e{E-00NF%aDq52xM{kcA_Fjh^S#?VV*52 zR0lIJeibT=!B?W+vn*rM#$FZCBN<@Chl&yx$`O7bx8Tc|$;Y2dDU$#q&X2Mg&AIb?tk#s`F733Mvn1DHpyD6cFGp7568~O+u8xY?qdP82w=!1XwRtR|Gv$@&&zi3M;g@M9m0nR_AvSvxp1+-_%y)&Pir)*7AC zw7vFT{mim?hjyQE%#zz~S<^q7A9mvY>z?2G!lwSwPIl^vCrqC+$C$iSE-S6AwI;Vp z0U_j;nz>0U)nyyEtlY5W)K~AfZQJ0DS3kaBpJ_`DT=MIG-M@V2=pjeV_mArU^3N}G z^&_P_x#{Wd9?8=OpILYO5lapR_~SKCn0EfE!{=_^wQCG<`d)J~V{C3vp(UFt)o8Yc zhDR+?;ufX5^OOA3zYC`8qbsVUT;IBJ{kj)7eDPDCIO~mPclC7r^8+9K z#CN{>g;G*(wmOeJbj!%d@S;Wgee@HbeDtwLHm}?8fe(J@jvH^h_udtgNc_#BnDjj5(oex!kGeGggYS??iGzJ{D{QYxbV!qiPnh_2eCkcrwj)}JKjYj z!O|2RvCqdCNd+-WNvn{j1dL{=D@^fm(WGcZK9tJzUZ69qfkI&f#X|V!0eL8nzd_0( zh?xCK=ZfY!wQC@10btTth}?x>B1Tc@nv)2J4r@$O(k8R5tfSLX^kD2bp@`v@|0~uO zrBb0^0EKm(!2-~l94#c}YFepVW89(?ou)+AnjAP`6IYQ@6-+jEa2aM4x;c0%Ah5=y zPE=P!kijhYXfqSkef8pNQNCaX@1#yIs956{b;n4%c;h_jdAgLO}ii}<~_4;U9 zOQN4=A2{Wg|Myfvq*FvuqQ^4?MPS*9z1y>y`Xoi>Z} z2fiQDTrY@PA_Blpr<0aSN^6s6fGCb3;Nk1#UheMU(z1NUSH)wq_b%sE z94_^C6G|lk@d`cSuaGAtWa`l=Omgr?2&mhwiwBPxX;}6$YPx53%Bsqf`A4bnfM1}4WmJ{AJd#MT#qgJo$VAI?ii2o?}? zpcG(alil@@(i*Mx#sOS~4{OR|a{-9-NnR@;`5uu#G`O?A;$C^Pv>XW#`v-$)fpTf-+SM^_CNSQRLW%8^l9CdO1YEU z#9DV?kI6EV<%nv;+NG;E9e4OXa~8~8bkNwbFF#`Wi@Tm!xy|S#CoqN(+!4cw06ADh zD3#MrMvWG!TJQ5qm+!M+?xMYCJhOb$+&Qzh?`k};Y~8Gb_MO?=+sTY3vV_*!QkwP+ z4D}84`v(}i@a}9y7B7W47%xrRY0qD{|KUd*^6*oSKXmWido9`T<;T4I#aEv8>{E|a zy1H^Q05~x=^1^dZtzP*!0PM5qp!s{xe}37+0Py14btj$l>Pl_)AqO2`+Km&AKfYR@ zx!?Z#@3U~P1@jjS4i2ne{od9;entV1@s;B# zao!G$fcy@G%yUb@{25C_dK!DDYqP*51EjhgwMr>rv~F@p&U{xWM^{MaBhZfsAj!}I z8DrpzSc41l&P9A3UUClKI$?Nxu^S~Z%>e|#(@;oddBozCasxnc&JcUTpMXHbPtRt| zk2s-ch9E&L&dKFu*a$ZiMraUK7?{qYNKtsH@`Xu}1h?-v7{y4dqD~UC0tt{{EqS3% zDQoz}0#dh@WKT%~NuKjl%s@Dxg%M&D(K#-K;RlpvkN`JQE0K=?$mB_q03`nLnG_8n zVo@?U>&iy_sDeN|#ZWvACc)^Cq9GtCA~0FzZ=n5tNII zhg^SjQP7RX8tb3K%JCXR#D0-D0VvUlzy?R?Fgzd60+8^$S5#jEUhLs*lp+UZJMm+% zfyzKs^>;xn3guFEaMog(uKN_7tN>pya?!iEB#(rwb;*6O9rySINAqF^NCniRfVpfC z;#h#L8;WsO0T@px2@sUAw%IY2x=OTaTN9k6$gw5XM}WbzR&jp8e_~L9Ffaim=4-N+ zjT|u%Rv6+zsJW2ugo+p3DL=g`y^1qg^k_~6Pmd&tg;5E21t9YBBG#q<0WrHHR1q9e z;TC=bdj>T0H|6DL>@J?kQ#4*Ko${c3Z^iHs`Q$dS!KgIjb?xb>d)i3kGXeGdN6KR# zkP^BlX6g{ti9N2H0YCy+N>gKKvf1&6!bZNrsICCf737q}3&|9`L>0RufGh8XiiYxN zgHE_UO>wl1=k_GTk#Yr<$dC|thl{HlL9jsLDd%*|qhA^(^O*BfMv`W(i;qT&$g&emU zN?JJpLUkX=n~=3ZE2?zCj0M;=3loK1bD-7>fRGvJWRPdj$so%i&nW9qr)~2V#*4Bou3R>KpvOzS>hHg~4JhH$_eD3|Dq0Up#kdO|3HPvHFEDR9k>OEDcSQJMtg#)q z_+(M3BuP8%wp%jb3o3%r=$9TL5+)^Vtb$dSfljGrsoer=fC$I{Sg_W=0Rz^8wPbBU zy#5~r{*fappaCIJPA0R7rKAO`FT&1Fg#=)Ly(B0lgzorNurVgvB0w(Y?{Ot-)vdK5 zOBS_iPBu1f+1kl+L&k#DTGH08fa|ZF+SO``z+pT z+KjGdqcJf)F=zJ7IdkR$qOrz;$~&EUIjNP?EH^DntGD$(yKJ3-&Z%b}t;*SxPcP3~ zt)!HUO}4;Tt->>d(L$<{O1Z2s8E%}%e7Zr zaYeJ)JnPIeY&HSbDlnj|P8C?I6ly)aTq(C2lS)-|GObqcnwV^sD%x7?8yF*~mMf*z zYuEhhH@}$}8?##F#wyj_Gi^q_r#{#}pj5r5XGW!~GCnb`v_fSm@1$vU-rjq6^>pp( z>+k9AEmh0A`uav18K%7|DP4QrKYn}Z@3q#=Rz5y4u60`Kp1yA7%I|&a8|7;E`S1Ja z4}W&y+}ZQM8n@7#Z9+VU{fj4;ybCh!0O!{<#k689<$OB0Yvhk?ZF_*oR7-VihQqJ? z7z-C8NMPU#1q7!yR={XvsE)JUsAm93ynvC1LedqAelcYj0@$$+QQ_YxL}HI_3fJJT z5x6?Sw-N{p7l%qj)QKoKM)wK{h76lw&w*DlxbGQ}D0G4VfH0C@i0UAbiSH3EnL>7A zIXYIzP{T&W@<6UFiJHaKIJCx!DUgGR2?CK{sux=U>=Dr+Oiv-F`C_(Fr1Y-g?9N(a zZ7wvmNJD)=$FOH{o_xf!cW{6@@2T#@YET{iX&JEyi0v2G7_%Pev8}kp0b{%8v*L2@r&0RcvTPQfG=S24y`Y0?#t=v*_7$$m5!S z)SfGWf>hLaV!}(CT(O4d4Ws_}IY8plMo^3NROT(Xb}f^%F*)IxQgC%C!AEWZksq@F zk&Q=gV!dx*44DXi?K3dMQMg`?J7K7C0fT^R)LgG4kcZ)NGr$Fyh_1+47VfeFBt^i< zeG`A1GLR_1`OSM`Z`_Xc+qJq5g<1`g8mJQFW3c@m+WiEy25|bZxcD6EUIJPJW?1Be3HkXstk10$nE`fBYkUkt}cejN}^hg8;JKD2mbX z;#qfrQZY7>3yeG~C1O>wodU7hoJ@3Axm0eoTL7SxtGyBKv1mUg2OtaIr*Jfsji>R& zeE0Z^|F>7bfp|TESHDcuIJcT|zn9Q_YyvSu#`vQ>@4m-}wCAM(ho?jb-x=>A{z)_P zt%U78u8gjU@5TFJyae{_cr@66Sw+&~@e6=wX(KtrYKr9+EpiKciwk-U%|H|-?f)Ug z_!SR0tbH=pAYi3hF}Z0?HkH<~cm)TXH7c;A5~Vx&j(^)14ur!$Ks`A$T96~S$10;m zusplOi0=F5cisUafChy?2xI^V&;n>c4T+&z4YY;jm*URrb(#X?zD(|XiFnTA|KEUv zol0zDcHk)iBW1kpnMFkepq1LPdE?9()A!qNF%gyPHRyB}E||C1u?ODxx2ra<-F*Lw zzV+kzvfbkoh)G&|e(m;yHg4Vfuwy5hljT$&c)-4oKmBaGlc};og8dgS9vc}M86ExS|M0tx_f$ix~7-QB?6de z;JkUWwv9G!dt&Y8;mM~~Y~484tklX|xAm3gj8C64Z?Z8)#wO+R=Iz_JY}=`|MgZc8 zD?rZhogCx|6oAa(Rkf?80Y-;L0ifM#=Xs}XS^y*%o|(Lp=hhM?h7_UF)&fFifvm;J z@kYDd9vd0E?z%q$)MhVObnLOO7-@`Vd8bX*+B`R%j%iy3)>3YonaK#j+B`{d@5PI< zthsB;np)4ilU{T3!;d`Nw{v?fEiZlQxy>7&15my5_g^@7R=eG3Og2aCEcyl{ zR|$%X!7#i-1UVp+r+kAQfnP>BW!BK0mB4ltsh)t)FJ(aXCI9>dj(3r!gh@+WK`am> zufgCcJVX#H4(1FY^veEcKQ~EX6M5jf(FrErOC(>BhJ33o6S3YKILoobw9?UvxZo$< zK?Q68yy}2m#`~jBQkd^Eyl^M{^uJ>K0)H?BSa!2$tpjH*ep@|?l`@18Ft`Z+2+^En z4xZuoz>eG%aysQFClM-C7D&`noLv(u_l}n3G||du)RI)2R+cjtV#jw~q@YYdB=Uzf zi0yzZd2q=cj|}`8Q=hU6ZIj;$((^mtKSp()absb~Qh%SX?ja<;707y0;G--28_)jy zk{qX90ticW{6(I;sA$y*A+OHxR%0EW5(dxmYXD^xg(xao3I-hGJiLQt`~w7+X98y) z*x@@a3hF5wl!3T>#e&FJhEshQSL2%!z#EL#&xNeE9pi{wwxBg_xE~oy?An zH(d(Mec*KuMDEcUTpIAJNvvN|%|HZxjYj}hx85eq?Sj{`K(+5DgA0losYHec@jXaZ z+oM}`OdC4PxK-4Co+wgVPWa(y%_;@mT`_)v!N zgLeO?Xnq{_e9=pO8h!nL{4NrQYeE44B`I|JVdrzuw;Wm7@N!O_FP`^5{>`=x<*`3{-&bnizfJg zG~rEVkBUI_dmG&f<+DP=RD8n(C5{FE52FPs9^y-0&t07Q6+5sGWo#@uJh zeWFko+TBB*F`9?vCm3H(vhI`*N)tH*ITgq7Qo`{N!4j3ey_8@Ie+cSJ_X^ipG60~p zs+23aF_Vo6Py*J#A)UjmLO>5(s4Gc6mcRH5YVF2@&!e6Lfu!(3MaemAaokA)B*)5^1}c8ve^+Oyw9haPeGwBGL1 zU;mnCm#$XgAsVD5bGrt%^*{R9^K<7^jyrDu$F>gTgzZLW zNB_vo8Plt!tesmjlvb zZ6BB@tvKo^-PKhCP&;<-TD5v@yVWUGD%RRSb^t;dkGyYs8?ja;2`IepuG14X3YcuB2y`+ix(|aau0eM89~7m*a(Z4G6Kc^ z%Zx=zA)abQ7fcO6%n{v70obV~>hnH-Ge(xE@5oS7Bs(ZqdSv%E3l1KNETM0b2gFGQ z#uIE)ki>sjz?PQ)?GO$M;tMj_L%=M_xLIV5NFgB0-+KT`;82{AdrrU%PC62eZ;w6{ zI>R}MXL%r1927be9X;TwLjkWMY&8a#KG{?gA$sOe0=WT^Rj8C>F%b3K1#lfS+MUC9=Ky0 zNOBlw3(-US8B zWd(_LIp3Euv^-uwkkj9wNDjrR!mS+svpFKjqKi@~RhW#9PukofrfePJNztT07*W9q zyss1agJ_6QmW@QS!cubwM6iTf2a*ugP+YqSL~`cHN}?#&WT7xu@Evu+BIh1g-m7J0f4D=D7<5KlwsjUv{M=Z;yz@?vj$l7{RIu z_Q(LarVHVxkI_7UrUU)=QQyOm zPJ>b}l)6E8gQ@}|m^S4N==4FWAIva74giqW0TND@rmm~;#o8&6)R{htMgzb^Q7hP| z6CxLjs2IE=_@S7IkkV*u-k6xE)#~L+$=W2(4awtZBXlWtt|&QWk?jhi0{YIwIJo_20?gJUJUP3Yk9y{Te!)T3;xfKW3$BYK~(tg z-J(ddQ-ediOi-Y3O2;vHVRY{Th5`{AiiN4KVn;!)oRX2n6SW~i2BH(0t3;53TZY0% z=%zc5R4c6$t+eWNI?d*!wI=Kl(T2oRI9&WG%VU)jOOaQ>@t#^I#vhz7s_ zuby%ayK_T=cHPF}*x-$YFbRpS>}=k=ZEU=8uPV7bqD~ITCx23 z(cyl;vP$&oHLF{lCa6@G%InsyRY;hqyYIdut(IPP>v{*k_Vtv++X-n)nTufG239UIqSxqQXt ze`vJdx$lyL5a^Ld?|drfX`z4MlV{yqSONwRU(@_+pEio*{*df%?;&nob?=Y`|V)E#E<8B^6Cr}yTM>65e zi&Z?u@W3Pt(ZBT*PA*ag;z1~X124bzgp!0f%HJT~DU#$N3%M3b#mQmh;mFk?aK%#$ z31KK~iBv$=oQQUbH;-^uDGJh5Yj9_^n0`iK5a5R9-{R00E;*>C2;t&Fi z=rtg=Q%o3(C!~^+B6F?~x8*uwc}5I5>I5Q^jpW4RvTUZVWmg&r>>#+v)GfeVZA7=8 z!B-_Bs)LazRkR1+YXUtna=Dcd61PSp+SWi22JPU%mwgK4K&I;bOnE^qu6xlbgyauJ z0|+a^*v#T(ryvH6(siOKr6%(KCUVf`!9p$&z7;)5FC@UuQV0l@Jl6#fFwb$kkxlPT ztEFVJonhRjEWQ9xN?9TxP;TXv_(Zsjg$6vIEmVNb-E${KR1#EV$cqrkb=W-zi>KcU z#4Dck6d}rog;EqT6!CDR;3Yodahts3Tdso$3WA~#hCHxx?qNB+OYDGn1;4DGkotzT zAn?MfK?JhaBcd zoiq!Orn*utPfX^Gi8i8^SzHdzgs6yjm$0R4cUS-5Lhne?siXeq{t1dwLSb(LAVPnt z3ldlaZ--umKB!d|3GlEYy<1|CksAmLmRNc!5)Mk_MTULfBjW5D{ds)6_=wkWxY!}k z#$9msN{GsHAyzMdB680ccOUv&T5rT0z@vRz?lCTG0}<5vrJ!i@tXk_*Y1*6^_a<9Z zKk}{EZMbmi&43?BOQ^i8+?F~ZuR=tnIa+F8T2mT9k#YqPBvQT^g+L0F=JZveQb5W8 zrrIu^p<#Uc_HCP^W$!?QwMtEE+_7boDpi9Q`o2d-T&S_hnWhjH=Mx|qGED#gU52y{ zSOQS~Y&xX?71<1I8*Bz{f2p+q?i>LN2!ILb6jb7$N$f+je-MmcDaH3egL0?3;f(-F0xoDm2nUFG3I-|;@HJqjY4y@K|^R=_!32G{);{L>`ZAp zj+3#o6#L-)okIkMON0CF*2U>>;k-Up#Y;H@qMWIXn+0!uPm+1e;orWlK z#^a7IDEtkfmk>1Wo0s$O#G+Y*G_~C@_IN~=qin>T5FN2_te7krYqBhBx0?Xq9??P} z;PI$^#>~q-d`}QSk!ewT1gHw-`4-E779eK|fxLSRfHa@zfdI-sL>*mMoX8abP~OIT z7eZ5&>Hvz!AMJsx!zf{e@T_$0mun^R7q71_$1J?2@m(;m~s4UbnG-0`0bm?4H#_TgE6$${j+& zWbgSir}xzQ`ujI+-8o~%9IdkL8(++gEtgB}R{QV;GcI}i%l56BExY@s_4Yp1mtA=8 zx^=^?aw*M>1v0be%&AtpM@Gg#rAHli+>B|{28TvQhDSDT-F(6<`1FbMdzINaKG8|_ z?nZXQQ`?@|I%%*(O3j)*qt$E;4h|=2ipoE=ofP=fX+72OIO9Sg57j-DK!G*c#3+F3 zo;huNbQJP-Qth>9!5RQXpvdH43Dc6&2>_5as8gjhSPPUBDr<~wHmA*=mFlFwuMYsr zweHMhL`LaUDUC!#29!pnfvmN;)}?m439Xi{mTT4Wcw+)OdD_)uEtuvw*kOcHK{4@HfMr}^d0Q62)oQ}B@=dlN0tf+=YkTffW#1(ZPRT|hz& z*C7h*lO@A!jXfpsKa9C(O#V4=1Z)#T_X#QjFem2tLDICW?F#G}yhk$u^bRc!>|NF) zqBH{{a_&$x1L^+eOj6V=0)*OT?{(UdRyQ zX|iDPapez#WP$r1)oFycg}O~l8zgEV?@-|=7eJ7?UNnA)MjjDcPZB5|EyogyWae22 zmnUNS<9mi-gID+fT=AqZ3hr`9XT=dDPLr^1t|fXd6q0s?+$rmr&f9`@qR<7ICH!xVLmVw-XEC676SjNL2=e_`B z$q4Bsun2C0nmftGT1$#dcU|??(pJ0O&T=;}a!<*P`y3Tn+%2q=BM+7HUgkeYQ93J$ zCR?s3pT{WB%1|Z3Cj{Sg^fR_Bj}|g$@m><}X5b;o`=X*V-_jce<0>j%d>xNDDnhUV z*;PX9;2;wlH@h`!C&(&lm#jtJ7#Q+dp%Q-Uv6As}-(^dn18d^yl2ZakeV|Z%1}=F6 zz?23>BhE1t0^?1ZsA{#6k&YzmrT zEEa19U&uy33a-2oQwWKGQ&LY7oC66m+=>{H{MY#>UnzEjGU3VBpew5RpQ76UgLJA@hJi^4f7I^uVQBe zmw(B)TB>*Xo@6ja)?1{h_lbg(1QVMxmfz2^u>5+-Mr56O?W;_X0qH1%|{&7hsbwNSU#@XeL&2 zS>T0oVRpt!z+e>M;F^}w;oZ9*eE6}ntaYlU&!7MNj`6403>{E~dbKn-+<2qpBx(jrIIA+>Z*cHA#d5-BuTPyaN^;$gYyoVK5u%x3F(9D zcWxPLVWM+m^E@x53F>5`lQnbGnw)(6;V0(rv#4CJW$moe)xD)LyuNSpuxUtnmbYQm zhLMc}86~xHrL0S(k@3mq#DuSUc-VK6vQB9bt$Ai)Spf9&;JG0MY4rY=I>^Zqa57>7kD%blf5eVfCrn9`MMkU3=R3o)Cf|^ zz~Eh0ID>bL&?b29Bybj^E6Ck^Fmyk$1U^jq?)!rkT<^()5b>txXrj;kiy=#L5Kd2+ zvla@Oo*%jp3O;>uX@;MTig-7GPfZa05?aTAP}Yv|y?E}9NveOsAcRJOia~_V#4Az< zg5(=v08yl5srxEbn7Q*K_ow)9y~n4#{71+VNvMIdYK3tS3=0!ch>0g7?(z^Hr3y|$ zq1lLm*E+FZMe&{^c?eA*j{u0Y%zbdGf>00yu2M*(3Uv(tX(zHx-iagiIkpJSGCbNx zydpAw;5bVRCE|>T(FB8gu;-4%cso|jr*O{~*cwCu- zkh}WS&Y7{V??lu=IwEq6DT|bXDEcQx(J3(Ld?vCee-41_wjY+uVki`U86YGDB|fmx z8a3WDI#J!#3Szt6$!xfbRq`+6&=Y5#I)>=}VeD~zGv-p9 zMUr2{z;#`zH3+lw#wA7rV!shQayhDK|L%J37D{kJP!y^$EISVhK6Ulk9$yodz;Rau zFs0X_>?jYWDSo98A&6WQ#pl3C5kj04{7D8*HGan3FE#REj<_oBKvJNHgKF(Uq!nQ=@17gT2B1(3^TB(=^?fc&I z3M^}}xJgIK5eYDqxDbkgnmDB>Vl$9P0FfCK3?leHtCoFNOpE-d;FIB~PoB28XWaV! zgo+mbSOHn|3s0k5Q&JKHK2(+S0j|;byGn_eLmmPsKm!cxJ~RP9Wbqucq*@Y)k{`4L zX=WIFYp@6!qSI5k38z>DL2RBOkOq8EbM{F==P(5keC+cT7Va1@k_JJ`7i=gPE7Cn| z5Pe+mm7eg3O9BXSm;#J(YsBkE_#XgQK&Zb|vW5!%(Uwyz-uV!P_6t2_wPO5B2=L?H zBbWU_jF8{OK+ed?^w@<>bks>FNCa6Y%ODH4m)0=qLY&gcRXiqDZbz16@SkJ z$perW9{*OxIVCjukK?@|eh^|Rkq^H_52Vi_@D`F)2=POh8&185-Jw{>3W|#q7U08^ zdZb9yVW{!X!=Huzgx|jOxc)!J-aO#8q^b{HtM(bb;ojS~N1E=21{48NMrED_oW&t1 z!Dx&cK}}5ZVg^m}o-ujxC3(q1sq5{ICoh$tc=V+$xV$UM{Z+nQNP&GE#_Yw(UrP4!GDq>ZKGMC}(nR|9lp4i#loz1uIICJjL zK6%%TkG=N3S8e_I?HAsE+tJ0H?d9pM?aMBkFP3{3F5Y>^9ktqWd&i_+yl{T^pty5QsnT_jlT#HDV6&1C1TgPlrE$w|72A$2Tjb@_5FwAB%-7%|m zT)9rxwa$j+;&Q2@)mrOVN-6W5rvFj~sU}62CofkWtk&AL^;%94fJ2mSWZR0St_e!V z>;KoZfHpCWwC)gI%Uk%Ej8=GL%tD()OhP zi6XyP2`9-Hm^(m=)Uzk3d%5S!^#7Hw3HqXL=|9o+BRXsTyf0F#^C8XVczl+SWk!*> zyB^;sR*6pcH1-9G-eE`2E|U_w5d-j&K!HTo`7o@>!{-rXr;eQ~HqcbCQ%RE^Gwy^< z2$FyrF1`*`H!pWQcg_=7Bvywxo9Tt&O|bwTHm1SJW4uA%F@IGQW1^^qfxYQzGqRk*CwNUPm{|Lq^tc?$5Y)a)e2buD5~!J z!c&mz?Vu9BQ7|hU)`P?>-9Xq%P108C+DPtM8|a%L1W@WBQ~|(5BulFuh7v#_;?je+ zf2#Nc5L@R#ZpLbofFBWkh4(n2$QBUkWrfuS-@#X z!lOhUSytLfj|nwk&v0b@Wg^l_dw!C%suoq{qhZoc$ZX@}N{ae6``vtPOw*2Qn4K8P z7M!~$d=~wc;>zLl)l7o>6JIEGF~V9aL+49m<1iNW6*dWp`AuVjtz^nMMR;pQZJ(4O z7=rL4$hU;L5p1!)@OWb4)ngHEGfd>A>9ouIk3S$hmSLdYlEl&e;lW8lE$|-;Fp2<9 z9T6|`6|$PT#0m3qnzpl1PzC5NXks^TI|(VNN~0YrS)&71)(Q93JQtHH`G)00E4WAf zHU+Te*p94D&U&iQS$l!*c_Ush4|;4#o5=olZNa44HO0)Nl$n;pi~C1M<8r6YPVBt% z?6~up{RiATyzP#|^IO}q-4kUP*6a0!vuE!;dv5RI1rG|eh?cwVxaXQ{uDI&D`)%KQ z@8162xH|gWxx=4%`)5uKdVZ`rpKtFjX2W88`^3o;+lQ-zd(NC&uiBm8Qi|@KJ9Bh! zuyy*1?NcXo>%@D`UHHRK99({K{>IzZcj)fo#B9AjJlH=tJUkSuif3}cKOwTNriI)P z3J^`{bc&hPu|51kcv6yzwrw`zPr)c6V&f=MwG=UtaWyvMF{$fyZ8tr^T5TL%eyTc- zRmK*J$XFrQ=E5sM5Ow+XJaVrQTbZG^;tMP)VluAQqH9csdr|{wXtAARjG~@5HfV@* zE@?(vIqYtf=e-}mOz|MO0%8nnFb!&;%G6YnV&V^+190(8EK?IdRRmddqp%rvo0|vg zd2_Uer!=Ag!xbFPj?E<4KhUX)Th1!%EDbaYGFB8 z1^4<3OO4^jxJSUV1y_xN5naSis6Vm@5jMRUwKnuT;=RB?F62S4{0it7Z<+Ng5GBDu zsEA0lDv`~$s9RLqom3GlcSQ;ps*#UAektNlD{iNBzV z{DyYVxZS6Us9+&1S+)}VMOqkd=sLxl{*cKk)B?rL)~T}sX~mO}2*A>6a7EDz)j&|> zC{9r^*dzf~!N9^5`|j14SrpnUW>!>ZvthBA&t~)egY~&{dq;<(l!2%saBJAjt3fXS znJ{l{%Oak7gOUQ-i6b~nh_@~~ZnjWjnMjWrGsdJQExz;!jbIlGHR6a#E3k|`%AZnU znlO~b4$mW*DCatz4&E!L6fQe3P}l>zS9dj4SSxXt(u@n+$_;ZCfHq)_^9eok+6Rec z+~cC8g;%VpBHqLbNO)|hIfdD+2PN!DToaLW#sCoxT_y*xd1NDBlc#+UFeDx>+cl8B zJ>a(TDpZWTr~-#VkOj4vcHIR>$MEaP&OGwVvNv@Ged3128HMjlNB%tZQ~hU#u1 z>uE@Q36()t5t>OFJ&P>$N&+Rpk7FaUtGEV^J+P9h88LP3>U(Xk02C5sdCuQ^Qm_i7 z(r6P$ET`ipwxPPmTJ44*peYPMiGS3p*o|ZuEn&Ta6yR@BH5*rl7tb9H%dOAo;+DJj zw}x89WIodi=hg@7aXeZd9*$MYFi6`>Xj+QaalGZ0+fQ9~YG>=j>FpD3tIm2ojN+J2Cy-t~k$H3%o(oJun5|K~igryb*W(v2XxJfg4@rD&s>~db??9j+# zGmwQ=BnKIfClf)fPz7466OoHZoN?1>0ckLJzO>z)@kZ7V7}q54=@4BLD=c5sP0=sN z8MOxq;aNM5X|Lz01dhbJi8GmQ+5!Q3aeu3~iBKlZWW$+FU`TUAJLab}v#2Nw6Oj!s z2coR`M`1N4Z4EL6yjWe^aI=Y0 zG9=iLe2!8*H|%AKW!wOQ*0HMDzRy*3Z{&}TjA}){;3jFhava!Z!wjOQq_K(8&q6CT zsq1lIzA;wEXihx0(KO9e`2i-ex{0f?U2-xLb_s;{^#J-hgzsTwQN}_)dGKx`(MYF1 ztkis=|Hw8cn_z_#MjC< zG`vsmit1>F`ioU(k`<9ErI^W?^Q)s(z3jx|SO%P^#hQuV zUe`XgbhvUyb`G3?a)i=WS2p;j$wuE~)qNO0wdVax;h(bnVXCNHni zd+FV|Q6-&kCn7V33F519B?Mz8MXUL}GzAf=wlg4NK^cuzVY=>`2=Jo*5bYf8RKxnH z%RN<{~~#o|Ifl1HTDp z306UUrR2?2BGSdazHg|CI$EXjX>zM@5b*RkH_@6a+A?d#3a_QRI#Ahxzy0ro(A6eF23U0=G9gmjG=l0;E6mq)I<@pJwxG8 z;x-}lBu!-P*3EFrJyk3+YYvhcHWb#CBrsJ12%-+-OA%}xHf!lRC9LJCSobG+^I)@J zA&wzp=is%k(5F8N;@x4DVrI5J*jGIorR8QdG)NhEl38GPFC1tqg-!z4y$y z3&X|baOMi<0YuCyc{ zgmq-UI;|eNS5Zdfsh*+9kF_2hb%a((xC|ija2efCw>!@f&mA9Tq(K=Humtqs8S;jK%!-;;GOL46Lk%v- z#-tmxwIkg8AU=;KJ=g6lhu=%Qplh|o&N2N4&lL={TD7U8)zr`%#r9o~sOhLeU-}YD z^>uv9b{g2lVuqy&z#Bv%f)<-*M6#oy)zEX33z}{ZNh-1wEQ?BB2}eG4g(3x9u%6`2rHHrR1tEx zU=gdr*Z5%2AVY|ej<*r)L1>OX?)V1aqyjc9imFO5XYiK{r|su*T`~R>EC5qVk`aZ* zrFvsF5W}Ns0}#hKd_$dde_dGrG6E%`OeXtvfh8$-RuvmA?AO)$@Z{EPdwagMoNdo- zUB|JG<5;WJ(d+N&ynKor`)_b(P-38nDju`d^an8sT>{Lba`RNDOJuzY;!`*JBt_-& zAZ6j#Hsqk8X4WR?6iXW23jt9^fPkU{cRHLett2D3q))*y5z?eYu}*m!2LlmEYd8&> zsjCmggCj95Wrp)#!b!mIt0=kH zI;H7pm~A*6r@zNHL2aQbkR#NH$pug-wtQ&yl;6cCBsSfnh zJ&%~;sWvbqDyW&5Z|`NQ=p?1U&ZUIK3KhoaF zmabNC*IfuvB);l|AZe<6t0L{3XTu#{U24>UTHC_^>Ij_=am44X${-Cf2w= z)2?S8XBH!8Rm3_KfOKjCG*)z%6w9JBbkSIm7hc$?Lwf=CX7Eal3|)2i6+1E6xuMn) z1sH@?y(0>?HRm4ngXAYIZpR}L;94#)_@#ZQrcj+`mvY7|mt&K&(3gCYnn zcqfK?YfYProDJ{-?cNM4MN27wawg_6tcjNSd{OIqe{XMpZ?BX=Rn2b^vgQ{{DZ^}L zW}&$zqH5Ls%P`DM&FVNWDrKlvRff0+)TIx*@X)cHWFGv_HHi+c$%;sl+N&t>nRYO_ zD&L$d1l_*TWOuj-Oevo5g)=lWG%={m*Cf^Lz$lEIJ|HH``j@zc5-cXB;B9cb1idT6 zC<0mwlHBglIiQCoqY;R}uOrn71rgC4@_1_1Iqp15O9z+|P!Vs0K`W$>RU(1=C*rsh zWyZ)Es0iX6#!@K*r?pZ6volqW1Q}xK-66t|>t=9ZmqZ*P3oY4`Ku<9Ni+ry`Ctx2a z?q43BV3~|+2O)9ud%GiHIT97S}bfE%7PZA-q!Etr#=4jRfcp{$j?r|xJ zlD@22V690Dq8QQY!rh%^un1otgw_?55#XKS->2Z7+ggn)QRc!i=hzGd# zW*9dv!ILSi9udvG!{9=X0jlAXl|Vp z6{*-7pH7DrDg~g9lgi)@!^Kj$AM_~+m{m$bR7g0VW8>}!LnVN0?TSj}ih&;pQ;*hl zZ~tij;OOXZJ+7-3l`^!NL?=ZUmbp3>s6Kp8nzr9hOL*I?wQhpQPFZ@lA7}*+9t9 z1~#)iM)0o#v(yeFfI#gp&Zo4g+rCe)QoDTQFh{mcq;X#4p>6Bm=-5fGtPEKonLwBAyMs^EU5@VfbS2_4uK@6@bF$If4)ZLt;%6$Dnfe~Pb|#frjsR1w$-8K&kg5)YnTb`7kr^CQvDAyT zWXnT*$)$$4nr_sxZ2DJ5g=S(gtlQ!AI${W53fv2h@?05Vw%HnW!wHn8!^lPaZ}uk4i~}G@ zE@JN=!&1mUm17BRT77nl;g1QqHCf#WW)yOLYedWl^45z6z&gE2}4?&1S?$S({ z`u1P97oILIMp<ZT|_`VhKvU=)&YU_vdFOv`gqpV{aU!+3B%A37rsY_n0J~!iBB$i0?(l?jH~+>{AS{h#YjFQRI>aVo+zVTuA!MPzEy#{ zHoH1VG8r=*HKSHH#6;6*7cuyXrGkm4=@=N(rI%$h`pv{fjOpW4h71Hzul@r3RE$}= ziI`v;rlju@TbuC^nnVS+M{?VgsE8Ka{Hw%SqXs!nf&Nik88k+|Fh# z+2O{no@U?f1Q=tqvPdx7kEdzjvTAKR_za!ocmUI){t8c6XlMc{&ctgs0!?t?i?(`2 zyK_8W3hl7=2v}ByR9k*-f*mX<+J@i|##KY_=%MYpG>A)>m9@inOv@lB_CivCOn5>+ zZx#pPwSlm$%-R7rNny-4Bvq4QLWkobDmaR$xY#4|Xbfl{3S4>vZtRyyFC&0)#xD)Q=uj?oSr*quVX7O#5Mnc6%XTR zi4C|EUAZYy)cKm|I#uAKSH~6{pvP$e{Jcssx#-gGHgGuxLTF=>gAMo24u;Gy4Z;?L zMjR(ilYt(6icTr&<8J8xhGssYjtzCwNd!NAS-?K*zvG z=g1v`kCh|Khe>l%0W3t)d}9|MB$AFLfT28Wke675J>*uGeIVtUAe(WmKTW*FLV~4| zl$hcE5AuoOQKQj`@m>rCNLD{0st&M-0vN>yo2GH+8iS#+W0G{HN=R-OQu7hGAJ9b z9HP?_CtD#zlB_{<Xy3qqJRa7*1+@@+KihGx#p(;4dK+N#q2|olx9kG)K z@_DzShlu#bLmi4rky?*dcCA)EHM0aZ13IW+7ObL% z1>eL~vCO21jBAmwfll-_^#%|TZO6!E71nM#G1f8q+|V-02mpZRH@xgj3~S)?MD)l5Cy!Q`U;zA+Y=*FMDdK7 ztl92(3%rh_%_Q#h{G1a(kqdr4+@q*!5{0B_uWehQvof((S`%pxwpVO@5`WmQwhsXE zP+OQ3Fllso4}m&-2$6IgZ2J~K};l|#r^-h4lzeC-$-WSQ^W*jnY93ya0K?qDX7&>7uoR3>YR!0j_Uc#SGe6x5K5H?~tRqC#7NT#H^^F2}H4~lg11^giO zj*S@Wc3f=(pc=#3=c{c)4(U${$)A8xJ|3(;Wm@CcPRB{2O&kmSDr5r45#{g)7 zkb=@&k0KFW1;0DWrv(v@wH5!{P`Q4HF0l__N{nUCXoPb*xZ0^H>XDF8R(Jq%VhEv6 zDdAA_^ssBjFdg^kFVqt2k#Izu&9K}J+hE#GU6xPSMx^j4d|IAL#4Jd(sD$`lv=dBJ z7XvDt(S8ziav!na7@;DG^grk(B8Uz)B+s7Sp|v<>2OcbK`kh!myNS`DqmIp%p{I(p zr_lxtHBC;U=F$~kQhk5Ed>U^0phogc?JG$QH?%B@2(zQk_gCNgtE z+Xh-zBHLnK zyErT^q+BFfI*4d=rz2*P5;+u@YiVd}a>@4`e& z?Dp5NSSkLyiOLW@s@+FgTK}##Uy~6#Ah(B7k>7TU6 z!f_*eghhB0rBJ?dPMYE?|Ao*zVMLEJ32X9@z=RM{S~)>55US3|uhXeX0-QT+s|P?e zF4K0c#WglLiD^)9T;JV$&Z6(!L;{W`5k9Js$hG5wK4fU0=q;e;BB)Im`wKT7(AQCF z(P1hHQMEXk2|vTavLu7TiB_U*C+e;ugc(ozp?{umFtK8y8+eQOLn9VB{-vE%og_2x zG7)8=S? zoXAxvxooT0YKxWXcOPAFXF#5c59NJ(}!;TEXy z=F`aw#$}0LDax|xl<=xlPOKFIpkc60W)bxiwh?EWyd%v(CUBw$ zG${o;EE>hAD@294r;HOttz5-(647>HBds)-)1*_%fU^Qikvh5zwY6}W3Sf&%yHZWW zN>M))m=kMRd=aZHpe?1;TBYUoKnb-tTPpHr#J|L)yf9=Dh;XLNpILB2ZcMHMid0N; z|G{oPaTczpJ(q(CwVP-tTWFQLcw~sk!zZGKM3}=0XvlM^>_6ejM69h1OFsriO?SRX z*e+aOI4e~T9Qllk*1yX%v6wMUu7?KQQ}RT7bMa;#ZL)mwxN4f?HgI#O~FwB68CkdxoK|0tw4tXR%X5 zM0nh560#$807;V}+1*%xhfufYN_5XSEIwuB{r#{@Rn%M>{Zx!l5feudl@#!A*r=pn zj@K5^B3jC9IJ$7JjEBSWgh)9$cbAARPhK{PN*&FyeiUa&I{+x)AKSiFq*%LwCjtmF zFGq+-S?!;bdNkWPT~yZx`%({OzCD}GOR25OXtf+2?n@hMSZa|LthTj;OU$i%r5{7- zs5Y0lLdC{ft4h1;hlOp3SA0q)+$hM4E9C*3t11mAs)J=2@Vv*27}P|<4r+_uvvK$? zx+M^Ke5o`d&M=RHXu{Da>29bI0whf?8eK(w2!N|O1)9D?q!GKaBoHON+I-VMFdvRW zM?{)>1~jFP@c}~dGx4Bd0t?gqg>%nH^!?{ zEZ(R3t&cA99N}}PAE@u#U3MH)B`8kDOJtCt3i;}(Nx|(V;CIi&s98Cvf#=Z1OTLWe zBpz52LqSfXx639YLe4JAdqXyaf52h~bBc!7c}_qz${{%PhwihF;NgQsLYg6tL~E;x zw7|H(^Bhea4Z751GDQqrNVY3#b88{)jexALLlFg1|CT0{#*1-tVzl`RJ585s$7Ts% zuhMlxku{KI5n3rR+5#K!+79S4Lc%%)Za>V>GCi>!DALkuU3sdL2dC^kqpQ#jL{t_S&vjb3vtP&1|+*NvtQ_hIFclh0tASkc+m=?1T={NTHPq3}jD!NWa zLF?)egFh)lN6rVPrrbM|f7)Oo&Nvh-45tP@H*g{w1dGqgD~Oq{PaW=XN(^d|j7Nxy z?%dLYBcxqf#-gI6zmknOfh+y87)d?0VBoOn5r%fAo%$jnS*{(H0E|2*`7#S zE>z7=o^s(-Zg=&wEL8=$G-{Z}eGNiY3Ak!JPxEO6wMXQ(*vlFSXKn29%17Y@DTk~c z;VmemDfDJj7eUZMu`)vM@_QBp60%2Lp;>;%$c1oe1X`Tu;4n9lxPo=1pJeKse5Q+F zWF^2LlnUZ|zBPQ0O42dpA3L9f%o{S|Al6ORFDX8&CT8<36eKnpddVW9X!t2+^370P z%M{B2YW`p+!EKBlS5)IuTXk^8&wN7(&VoW3&xqH3=SJn*F_C0OO&#ICd4VlLx2%lq z4~?|lho_<IPU-@ zuYiCZ+V)@g39=rIszVclHDC3>t!x&s8X6Jno9>Z|6_i@E;4CBaQB0Cp0z$!-%wW7v zalP@cmbMo|rKptE`FpRw{+e(6mT!LaqaIO5`S_sl3!jm3%zw7V&hBy4#J@?%GEzkev zFMQAgUivHl^S0aXST0m`Wo3DEaB$-Tzwmj_d)`eqz3pA^c$cXRt!(1PQL@vKjaR3^ zn?K9+Y8OM>xHW9+e0P{F4W%kkRVlI97*G5ZS}Pva4c%``&W#CHtsd6ZfvopcM$uAJ z04Sn3M=eM}0h;cWP@`@S-2CJ-NDrS*E?_e_VlpF=3KM3@w8MPRS;sf;yhyV-j9N&j zE2iLCYa-k+M8FEC1s7+8n6zc7N#&R&nKV&OsP_r+349B;wK*?*1uRYr4Dl~diZiZL za8oh|Z09s*{(2^(8-2_a?Jk|Y(6_6@=0cwS6QtCAUTIP@fv-)Q1+ zILT>*JzZ(bn|IyEWZvo~@T6)1^xNRJBZ_d*rZCBE!%w%d2^UF#M;AGy?Vq?5qE#|X z^DLZLcae&Z(L+|WlvEm!9iCg-8WFs6r+~>2)AM09_lKG|fh?`ep+uSPTPMdmF>u+R=?QY9pnemys!$pOQ2C(=%?O6*H_R2O!0+{-c&%#Bc!K@l)&!soVF_)S$gD>H$xGDZAzRvRkhv zVQUorV8O>QBK7R6mAMcCwWLREtmxf$U(o5M0oG%(O>N+{1Aa}BiRONSEzE*Z+R0;i zH<&p!L(>{u-yV@UrbI*9RGXM%&pGYim`Hv|eNqX-&TTb5EzdW+;6hYA;G){xnf4^d zz#T#xmXnrvMWsF6bOKX}BsQ)xRj$daLy)Fvy+KFPM(3i*Ilvm6&0=j28vBl#kcjfR zhwT@Q1uEjFi^|U^3+yrlIY|a>n4!$(^I6^?o(g~toz<*4F3$q}Q7b+*e2+_9WlCGy zGdI}ESu>mWV;LjZqnw(PYs#V4R)4GGhlz<5k9~`%O+yYa!Z{LMW-KYKB7@yp2(p^j zwAfrzT0STU?)))Q76B@PFt$gi4=EBcS`Dc4!1+bgP8DNUF#pmIVTQIG+eryNxPc&O z$OzX=#rKb-OS-Hmk-CX1mOds}@Ox2VmK_h0j=0`PFrP4^aNj<1iaM0JZEM6Vg1*qq z@4yn=?nG?n1mO)(zo#28WKG-|B{NY?(PQfg8wZjMpf^!R5PYKr*p|wBoCA*D02bqN zEGINaVdDL?cCCZBHq}))MTtZZ-GIVYhxCj!1L#CrvCok_;JGXjNkbp$YZ({^SfPFV z+X@=!SIw;Yai+o!6r(r+#zz@J8Qi|LgvE7+LCB|=toIJuf25*`ib*jQ8IKMg{_uzW z=l}HYzv5|6djCg0ygpie!`FY^x4+=||LBMR`Jevr@6Wa`7h9`{4l}d$>S(`|ndqQ4 zs#H-OhN2?lxDuV0GBYz%D@Dqz48t%U9f=Gxoezuo!QQ=p`-R`~-QWKF$3OLJ?!5iu zKltLm^UP;F^|m{1|J7glC6!@5FSXW#@!%i-!yo$lKlB6t`p5s>``-PIRePL}j75hC zFc}i{5YZ`ukg;xbM0`!wU}9n>!$KFA4a-wH+wwYOd(M)mAIZ~hMDkm)Tp^Kr3Tk>S z_o-%zy_F(T%eXHG=j!1ZTkWZ;g==r#twNWG>oLdMd`AP}M5tS~3 zPGcKnz^e=d;B%8Hg7S7X0F5++H1Z53rD0j1eRe@ofNqmOy}BFF(^zbbu0tYRV2%TWA3OfaJ8ypG>&QQD043; zwk~Mkpy{)S;2aZfeq^s$^Hnk}W%ig&MjjBu(SvuP0m{e%jnZTi>jX#^E6KfN)0n{8 zMz&ce{w^_wkU700d zE|WGY-4rb|F&LlX>BKyI%xN+h;Lf)nli(oX;(|396>*~nqYzquz>T)s4ZzYEh^k1x z=X;{k2tl>cm7(8GFE+exdT0E{C!G<@I<|w|7T+Z|(f6K=qbpHkEvK9225ri47%>W~ zOA;GM5~}pG^`UIDOS}j5uoV?as@}~Y(Uu%jM!zoXvc&(O5}78PK1Z?WMU{?P!mQd_ zET@$i)oLp4wx>ME(->yMY}O9ZKxrd$u8MhipwZ$>;fnM8z`jAGvXtPr{R2rQL<@(Z zB34C(rHD9LID|y&cJ3HD@+Lg(0ODd8893s1HYL~W&V(U_kBmf|ij}w!5wGXVA&D@i zRN@3agwPdBKAOI1eUpoUftUlPf;b9@rp^b?3=(qUdJvg!vYf`Ty|J5aY-kKJ073}Q zaylK=$821!gqOr&7Ke%8D^;Gqq-iu7F%Uq~-rEi@@i&8`3lloys|z*F7bn+xYfll|Ik2aGKvQ#cw&n8=&40DP$KXdZAQ4mU+4}+tlcGsNUzqm1xuvuv1;9* zN)%i6l-ip>(>1+S5DicfD_ybQzIZIH#gMz07iCOHr1-86@I$a2t1T6YiE)*-F|!Jc zP!P#6_R@H~OfSLD5!y0W!shH@6zNSCwL#8%ekdts+Rf;T5F7}p0P zQfAv)#-hXOa8E=;ipWYthON^ovfjTSWhQkcvxQWXD)YtFBEvoRoYNvwW+KBKcilaX z^@ZQ@ZLj>D-#&l-+}6&{;kkRSzy4ug|GaNltyUK<>}i?HI2N(~VCX#M_6Ftk<6dsq zbk$8etccX2T5FYIcXr|$neB>LwJLQjDq`*av4Ra+MRe#p6e43<{g0f~g99x(EcL{7 zW$W^K@fJHcTiOy`>;_-}5jZIQ#KQ_J@=vuuqgmc|f|)#7r*W zD310`x2Cw`WH}}Hl3A)zACn$0g*$I^2jZC$$eJ#zaSbDV*Hnd-8K#uIzNYy&Q=mmI z*4BX^cAeOw!ADLAGpN$Bz0qOP{)23c|DRNf#3FJ?a)*ATMZM573X`KI+{+pxfx`I} zK91i&UE^EYv37PCkw#9OdK-yQS2qF zHr^(<=<-!8QKHY(rtcHIIB=!OPoOKUO?JYAla(i1BtV{NiZb&K!Sfr>{vEH04N(|<1zstAH5K1Af&miMFVO%{rp98WJ-jSpRN+m7< zNRsNwHnCtgM@Dyw4M?f9m+z))U1$7oZ`D!?-%(-!72g#x)jM`=ur3QcJr;NJMbHtn zOqk4xTQh>BG>HEk5^B;n2MJA^PZa`eoyQ~baMq52AkVUm-ofv>O3Ng11q;WBW82ZL zUU=}1RPYVl4xNI+K{$&j8ZSFE5!y`278e+B)0HmvS%3*h!IAf+5n<`7!Y9l2kS|)) z)I?3Hpnike6~b(b!2~~JNR;1Dk&(3W?0Q52gaVof<`SD~ScGOEh5s7Z_kK zil%Ha)k02SCaS?LRZ(9c!i7jtO8ZCJjsTx1t<=1X)V}KDNbUZ_mz_2@vLT!1(wYX& z^x)gS^ZTFtBHXn=Qln1iO+i66CU^Z+duakzy3dNyX7{W?~F%#S6qJOSAWene8CqyMfBc$P zz5g#iBE#ZIPkTyTtuNa>^~9$?b-tXv@)f`L-uHh*M2^;W_Wb#^iO6ieT%Nh>&SyRK zXO%9#HjjvVTv?rCZAg zlhHu{m1+!-pfHrcr$ylERX~%1ilenB2uXE}1Pj^IdC_pmdBSi_mYW&t65OpRfU`_w ztnUKDIi3R0-Z@;}bTWw{ z$H7^A$Igy{Jm*{nSP?;Ft`lmLfn~p!rx}GrjXo!Ilf(eZ#2Scc%FkoI>81;k(RT($ zbgQ(vw%%3!`#7#&g3(iM!|!svBN`DMv$szINR~fcd^?UO7|xreZeqHkT^QWWar2{k zm>#J}K|HY`!I;}I6_rc9a;2}oD0tSuQY(&CiaA=kFC;*)Ym)PNk=&k$(Pe@n;zexc z;{u1QsdAkSlW{@3H&(*k7hqgfwW&HLwTb${hD1UVi0G0&^^GmR?R4AdKcgTJ2~URc z_*DY0GV=D5aHT?!ZB`o!B@m|Z(~Y1XZ8r-f1NL+fEX_w+H1rNBCR7nFAf)^Z9!a_; zp#~YBvOCWzWRrPs6mt>$SqPuQV+yoi4z6Ie|G(q8OJrj)t5uMqK%#0J5bdC*I;aHa zeg4=!@6SzST+*7ll4)zx*n@@i;s(Zh37qVl3pz6m0gm}YGh6O92IB%iAa}5&DSO&T zk}eU6fF`aLB!k(__jbgTN_FE0;(p%I#+ZtRAMj)R(_syzmOL39n|Ng=2iR%t0OQh9 zvN57>sFyebNNU{Pw@zu_9Z=*n1@)7d5De+1j243Ppt_67|{%3WD5d)OJPS zhfpd+f*@3);#1Y{Q1TOZSVC*+i-TJMQJzMzY)n~#=|#kNus~uy9Ym`Ysj=?BlR=zc zIDS~OzKN46U+y2HI|MV?yx#^83F1xPky4W~h?0ojKANsjp{Gb2F z-~YQ>wjcZGNB-(dU-Ifddi@R8UbP;_CqDW6AOEDs{{0vK(4BXlx%#SW|NX!Jk6-od z$KQPOZP(rJ0pIx@f8*P}{qKDEgCF=;Kk`o=^q>c>_Kz-HxOn3OAN0-N@SJaZ;rG7p zU3V@QTUFaqf?jpS6>s>{*IskKhy1-C`u>mp64|nf;jU!w5rBrFTS-O53^y#q)cL;YU}eMze-n!x-LQfR zDPNX*?Ies_r5a^;_IwKGyrYubP1kRHNu?(KHxrUlu(z+HDLUaM{Nz!AG_XqRJ+}jt z1MKnZz{k8g2e~<)W52ZNFVTbcLuWrS?SnUev1RBgfhBxSL?9Wdk_rh}W6{O|oQgBK zt^U}F|5ej(sFJVONsD7UKK}JrHcEqpy>?d}OU3kJeuSa)4UeZ@j%_;~^sk@ehMvS9 zy;QUG!EH`)zzKfuuC?ixmm-T(0$?OP+t|8uY5M%viIQh?J@&d|s6y#DX=Fl={(?H) zB=NuXvdwX|6JZQ?34u>6Hhq0OIT@)pyGW?4{Wr&reyIr`XQiCVwCbV9vi=gI*rac) z!-j}cIfOijD0oWEWc2?Hc)6q&ccP>lNO>gb@5pR$yivvsJv)Y)UiWnR#j)g11Zupp z>*$zy$#LIi{`FsD_eHOPmoPMA#vxN%(98*qFTGhcHL2C=SQGlHwE~joZRX1omhuAX zzg0h4vDWt7m)21_AxQv~Kx@Axsx|G=gIZ&=2QymL(jF0EPJ@XE4q|9su}+n1;-JJN zpZ0^D0+agSq@p1bNvt9fm^2`fhPtxbNWl^W2&q_ov9zte^V?Y55JbpeN}ENbtJLjM z#Jklrca*n05Jp#A9`ZrZNHx93J_hoz{aZ8%%||jxr~i>EVG5cU#U;~1Qdy$~7t@h` zQdCrBR2fiuQ}xOKZ(m|L2pVi&D=;e}R>Vu#h6)Bw%y9msuv|=}v;z}SY09aIV$Vvd zyrF<%!Eynsx!+M{&?0U=i77)Wz0S1|H)NC+C}Nl9dv~`zI7_s6wHyYo$E@JF1}4z!@DG<5cw|<`+48co zI8~*J;%Jowb{cQ0NWt(d7^C>rdNTu@2+-VwJK9Z)iq#_-mSy*vakZ!Zs2bkmK)lH3 zPAI6Qkf-6VB{_Te(A#XP{gNnvE;U9CswuIV#8|rnH2a*7D~kI^S}m(0aK(4Y}HT)E@K!$l}J=bjtz26B*vW}c4n=FLgWBI`lX7_TL_IuB|A0g-leWZ zr08O~rNhuMNZ_5Cu1#V+(aBqEv*|jPqJkcaR&z?p;<1tk#l+Ig7$}l| z)oW+#fS#mT#|WzBr8%^jPgpm$#kT?;OfHFjd*yNkQQ26h z4Q+82TViWCP015if(ifW8*yz_Hkc=H?WkV`n=I&{vbp^O!#cigF6|x52@#atGlSD& z33iKUcV*viAV?^RDwzpCmjc?2Oi-{vg>3A3bIfp;nindyeG?KF;tMUv>z!R+{kVxm zVJ8VtB#EVhhSYM>+c6_)dPfvY^X_+P6u)jofCN zytgD{cE?$Dh3wcGNW5Y5$sl`^_xQ>9aKcGJPcxL!fnf){3S+p)1`Pd}TNHf=2w^#Bu>A>1w$BI^n+`WZ0gw8Eg!W zbPDfc7_{gxTP(Lam|}R?@*-&kk63>2xWJcP5cCXfrYNig z=tx9Qg2iLZgHA=^GIIDOuvzgXIkQ%MX=E7?$uUY9YzzG_y-A!vAzDPow%0f2Sc)-F z%QSl@Sl-U7hwNWjPcf*r=Ln|VT0H3KMVZ3=z30zfJ_{bt?j6vwc3?S-EChoZ%PTI8F0vVsvqd5D+2a5-w&}DiphU*G$ zg-x%)sIU-LY~rR8?izx~`391*R3YQjjiYn|tMYjRBXEj5wxgHGPnpc+AYK<<;?ly#9iCQH~lP7yVCRf2n8aLPv$cd=#} z0m*`0A$63pE%Ot0bVka|%`;(y#;#fIY4EV4n+I=QV93JX4W|-BkaTZ`ykJ=w3OD`v9Bwngm~Y zH9Zl9`UEzf5ExPW@BktT2YwN8-1o^^h=AyyCk4PU;yjc;m%SR_JUhQsPLLeDhTn8B zGjfK#PUa5|=O`h?j%rrQFe}aXNEu_!_rYOYc}64QA@W*3O{?lGXC*Bk4& zFzwQ*PtV~9X@zwn@FU*h#I0N zOl9gi0F^Z28Xv>Kv27pHq<;ODu!fXEyKGhaFeIIdp|Y7zfLdUTNW3`Q(N6wM-nTDc z^ZiuAeNfGV!6_bq88Qe87G>t$NIW6KG+TFcCzudm$hdBqA`eSk-&l>9$RcE^;>(eiTS7(~;%w~1A#E@}!>p4n zpgRW7Zqx0u#!bV(fVo6p0Q<%?j*(QyC61hFpZ2}6*(3L=v?x~TNT($Tp{)Iz$>?sc zkZwuMe9qx?5SL5{>crCjLbplKiyk!Q?@O-Qpp@xgYZc}d{3#rQUX>|9RPkX^9iA%P zI*UUv?W8VE11eb9O^uO(J5BPke<4O!nVL*)6B|QmF5!uaPoHYymTtj!O?U#X2Eo>z zylqlSnT=%_2KBQ@vBoTcI-wna)Odoa|25&Q6^@E#+`VAkvXcoicYg$(hcyIhi|61f zl(fLPCoj~#ZvcRNFlrQHeqNFS>&-U{G$e9^Hars`G(ow7<%X@rH{!*xY>!)78|#|4 z8w$D=AI|(51~07MkYC|8n}0J>1%2mM1w~dFFt`Cgo<1Yn=cWQzrji($JteyZVmhZv z(3bvshg4rC(LMzVqx~DJ&S?d`*>=GP?v&}`j`ldjmWo(vk@nAI`{7+aR7dr_8;0ZN zFkub#;Ao-AL?D4G3v`q`pJ~g{=zN-5hyWs8(ZoHfiYSvgs1EP>QU-(6T{4!&hMgX2 zG(~M;mO6Uoy)Hq4CGmqKlq9i?*Vf((E!_RKQhPM0G4Xv`p%h&ECJcfkK(AU%NKzD_ zuDMlka|*6az^7oK|B6i_98qBa9y=;me|ZZG8iS6B-?EJim%}3!Zj)~hYCT#VyypWS ze&XXED^kYQL0QhMjCHkIjrNsa@yw%xy>UFhz1$VCGiT1t=9kS*T)sLQKmN(jKj;Au zJbC)E!@a#nJn|9$>R;Ta=y37;-X}lxiNAQ~c^%5`&WXc|=P$eLioNwr4@z~buIrF)%lC>JxMF==5QU#e77E* zG3YuS+c9yGh$OqU{$roxr8ZeXd64-uoJlB1hk<0Qy8u`Dc2o^g$y$wj(*kHZaR6{q z3kCu*6;OTBoCfw zN~Fo%#!_M&B16=+HDU!!U*qOj7mcuOo1M!Iso6vp)C={RI9FvP(ijC!ldbSwkd}IL z^cO>cw_#tJg(hZZ7cZVaJUl4OuBe0>?IsXLSy53!DtwG@3JsHa!}ZgOTb`2vfS09t zghM3}sS{-n#}MnZkU55%fpaX`jS}RWhtWPT!&`DnQ^wxm+h*azG>IroA=^xQlOG_O zXTry^V%Fs6Pg#NZu zOYzk`jeB23@N9sfv`yFIZPFx73=omD;>4ycl9PNZTKDSAEYUYf#`2(0_V8s>RYmL4 zu|je{2_5W<EE73XO>)8)c>_?O1$c{pAt?gsY8j z*q%tQhoBfEWg1cVz&D{+xl8Rkl_VJkNN@*9ZIdK7tqh8guo+t4;a8Rna@3?J9aTLL zY-lrZBsrs4M?ukQA?;~Dc~{?(%i_f73+Kloe^e-Qa+hZ9-5rUi?NIIuVl zM+jcjyyk*F8!DmF-+pM`K*djUq3R6xi-5Db_Dk!*WSV%T~HWo6BZHRfQ{)}JeAXmiXrbc9X*nse<|rtx?)tF9UYB7^Rq8`&8vRvJHPuyFa4$e zHXgZRJ?b$}{73)j`(EE?pm;dzde&J_+>dw3Ge9a%dT2+TK9Ip1vs)`9ulI!X3XXKw#w9wS51n$%S zsF+oe!DMh<4;{-XS*|xYA{8xdUz3Oy8_lYjn2fF3UBs&SO)MhfRXr0y@a3<DINCc)DNQBE{fS!Yipj5<0Zmp$gsdenGNgs$38YJs6ikUBU zuq`5DwdUbOw3MP|L@_{O8!HROfrAvg#h0S3TjLT`lyWEqhY+_xB0UVqz$Oz#HIi|F z&)B>u?iU-bh?~s-;f_?zUOTW+A{b|crRjv7T@WPH3yPfzZQ%=n?{E^>5o&Pf5T6Ha zkf1{kz?%!DgjDzay%>@c2&<7aij<+uX0s@KBy|u;jnh^9$=zYYGWYAn=bj(|ZYSJ} z{|kp>kgq0lNawrf5&iFU+ZB9*kCI>}BdmzwdF%zv@~kTgTq0r~Dd8k*pK#O6YEwIo z)LTW;_NQ=~p1+h(kttszUg$>a_;8FgI*gIYyL255j6a#C8%V8Vx4}J@?EJ#Vi4J^J zfeKbd1l7M1@o-Xu{08jT{8cVic2iH&&bOlZ)Kw*IvX)qeqmncdt+7?LaG6(SNTxbv zT^G8d+z<&n-mrxRo$;Hrjp6qGJsUPMJ<5n5`ET;bBS&rWw3*T43L(f|#nNM-w;@hND8Vf^IQnC2i`FrEt9y zhXX()Y?#bpf*wv=L((GZx+KltiI^{a%~BtkUrc)w0GpqMFF{@sBD;vaa*045T!dv! zLqWOU=++u}54GtwdN&dWIxSCm@*+|ufL5i`1X2fTlLVrBSG`nt!?>~3+}vBnR4o`- z!fZqgd2f=PcxKQ|0B+hRCnkJ|XGp}?En$kP>IVlDX5zliGrc$=fi&~>p z5~4``XY?4RQw4W!4T!L zbf92+mSLW!?)5HJh^sNH+Tz!!PeMV&fZ*Tm_w@CAy)`5pA-3r5Q9{x zaO1yf|0Q%JDov5X#STABy@O*SW;1FADh>{Z;+Sa23}c3d9YNYnwfC?9My2ed2Gi(s z$7$72-$_*&56wBKQ9&#Ub4>z+GbZ{c4Y&bG#FHfxw;mI$fO?4p%du*nrn-mh(~NWy zgjp%v&5Rbk>rYCc&O>Fv4BeV(A44!aR`0TpFrrqH+1;CWLO}-;w`U# z?N9#HfB&hU{E1;XfB&DqZM`mE^pFStm!JH9-u}vFaG$)KYqU(AMk_U`yIdhKVSBt z_q=^5a^*Fr%Pf~f&evI}!4G&YcohnwwHQT9 z5tXBT(^BR;Dn-<^+BmLN#+k}`ZB;}ERa9Esn-)JZ2)SD|DcXTW_VFcYh)WHm6kwKF6Gx<^WChB?E*1?n1P8Tv>Ug2XM|57awBLo}8B zS}0)mwx>oghM*uEZMtPW7euyh0Kl~W$yLXUh;dEQfD>XZf68QuZxetoK7Ihk+WZI= z>Zg#B!hVcQ1_hHU9aCl>J4>=Q4=Wk1@xN z)ssOtSiecvCJ~!g*pw&zAHBqInhDAZ)QvzpOm7&xZU}kOZJPcBG%OLM-6W2;GB)fc z+i8XQG_;4Uj<$YkoT^@G_>FH9fCtl>?JKIJmsZpCU2jAEIOydV$eQ-ui6*^jzQ73= z>8Hud(hVopD^n6*^ktLJQyZH6$_B@oR@a5~7sPPAMISR8P8VXDsdK;?LLctO$u!6E_k}!vXYhCYf)HMeI~~CYj+7 zMiu34D=pxq?GF=T}Z3YA?l zrfxloTbByzh{h!~i@s4TN5JSJ#0Jrbq&cbdZ3{Z1-p<->tDazimEpcpbg7Pma9Z5z z!PQpZak=GP%GlP^Hnt#o^*CNsut7!gCC2Gsha0&EMG;YKd$AzOqf?AzkyCW6NMj*> zH@t(mTGWow5=$*lc_!L-m(AMsx~lM)Lk76qGLb$ZN5U9IEb1wVa(}LGhsZTnYGI?f zOA-VMD^3G#-&a%?n4U#_%NXm^5U7#J1*;b&7|R^r@t<9Nm8xT?;JRk;%SeH+F z%4FEinD(T2SqFhsE-Zp}{>7jFmD$#1Kk*a);qusn34)HZi^Zjypg4$xk01u0`}?ANzO}UDq-c`_12c#Z}kb=Z$~-#)JJ)Wc}yw zdiTw@-qntJ8Lf!5ZJ-)*qta$4VFoYGP!wwlbTuZ)VpXJIlbf_6ZZOsDTufvT)pZ?b zSIKNCM`v^}GadEhc*B>-!Cm&b5891iHg0X#&%AY3FPbh)tZi^>07U^gTp5Jk34}8u zR5}6_mF1$0IvYn5t#wpckFI`NS#dP0t-@_WZBG?dD1srGXSRjmSR9q147$qCm+;qU1gQj&o4z|{Lf#B570avjS)c|tQR8@7o zT8Y)!d@d$S6)k0Kj({${VXJ`~)ml{~?ko%S;kZ<#C@m0X3Ei6F7*lijO(mKx2#Ie) z(BXT+##_0Bg#rK!nAg~h;N;kN3xFvIjGELeiX%zf7$bt05OD%sx<)bv^X9%h45xS`8DNNx+T*7=onl_g%Cpn{&GfR=k`~A9mqHcI z6J#x~!^iH|Tx`8G+c)JDolYFdrTU@$_iEvK?|_1IHWuLiI&w1KF8P{-eVddWdy(Wj zqEc7Kmr*V;L~z)qb>vG>a$G+h7Mdnq+>k2y@z-dgU6NzgD_hd)4E6!zF?Uvlfv*#$ zXHDb0QkX`j+~d0NrtOF_G9TIYp;fh@?=HTmn6GLU!guXb}j$B%|WeW9Hsp z0<=EX^2}o#Zv+?UKZ)RY1+TPM^LB=`L`=l0nbnRR++A-XJnY4%WWi0p3D0VK)`!s_ zakbwUBb=#ZFyCT>gotO~o`5=p;JF@bfaj8UjEWsdo?&T8kxhRCf#KlOc3xs)s2BAV z;x+XQ)6{9iw~ZkYXVJuc0Sk^sMUuziN})$&&<~{6P6e-30o#0%5)};CeyYDlT!5dk zktA*^EBWSg7ltQ}Fiev;e9!4@T30A5fV^*~MPBQIaqY8&D@qUSd}1vrSm#qnr464& zN!w^j7nJy>YHB1AmZN6x(D)u9lVH^n6vAvVtEO)BU|Mz_5O)kQy60Ikoi5;=rCFKp zuZ8K+6STsI^?J~{;IlkKSsaGURVu>q6bDBe<_QH(%xyqWVGtd>u*O6W^*vNTAg!ie zW_7vPDzn-C{+^j>Db#ZAfid5f;*$%Ov>w=}LQP%#3KVOCFCwC4P!(jwDxz8jFS(VW z-BzKhZG(VG(Na`~QFT_v2V7q2J)i#k&7bjefTW#stvfp>N?qS}^UX5fqOnk0$bSHx zsalb>4nrBoqr(gH)7L-yxnFT&XZr*1eeZ|f{dO(e+m~OtclT{C_^$7J$$$Q_Yp;LU z4G(_M)1LO!4}RdifA)sA%(r%Bv0cWa!;5!65u%S3_GHWt=+Av zb$xzM=38~Wy87Cy_Ag$%aQ5Q%sZ+Zrx9+;_4jJp|tFK;%IC+05J66}uB}aA7#?95zRA<9@RL7I{#2+lzTsywur{?#5&dRXbxv_rTkJWoV zCa?TS`T8HVD^8S`|C9N6PnmDEhuEvAloqxqayC^R?C{L`+^3->24~X&pxdhH(b3Vv zzxZKKdD0Vq{}2A~mYZ)L=F7!Up7^w<@85gxTmS4$%abR3KV*@*t{~V?Qa7_!HE(x< zhzxBfp@nsbRZ*!9$fc<0`snD9U-o6sdipbe=BNJa;ks%O#4E9JmazbU$WekhJmwO( z)^5#t_OqUQ;^fI!zv>l-M@MC*CSt4gRo7ns&CmOmH@)%oAN|;ehsC0lnTT4^TE~bE z%!;bjDpEyk9A#c~D5ci%;NZejpZS$v{P2hU{>y*smfP=GZ10MB%Q}uuY*E&3#k`h1 zXc2{-R;vIK7=Bm&0OlZU#?ClC1cYa3M4*(sFl+2ln6Fg`tzDo6sBWM54)m~y4ygAq zDHX_())K!c6md@_ycWvYd}4?=Z5c5Xa5tbU)~}nez{ZsKryDyXCWB^@Io&lWW1sjGkb%92SqiEm-Lp!4)(GI6>{Zk% z?~NiIg1AlNTKdykVe1hr7&Ro^3Q2_TCYHgW8^nmYaJbEsHg+EcszzoTe&1U|=Q78* z*w81!*}?k;U?)DDrbGzLo>y`$`4bhR+Rh%Oq*CCn+V(M+6t0o87~@kB{)-F6`tDPm$;MMQIUuTzbP z$Vh{pt|d{4P!?eajVPCcHll8-0lSZ4y|+~O%BE%%N90K1V1=3jgf_PnjITV@Ais>P zN?W%(l@MB!B>n@nH1kaWC-l7$$)F=kLQl?tUZu-lBs7l#R(DLX+0$>sDv3Yn7EU40 zH?evchNJz1-IJGHbyFYfzEw?UD?Ao|) zQz#*0Ys>l}R;m5~rG!~xwcR}A3%lOTf@*2tG$xjYHN<;bUqS{*sqxz7iJ#1291n&d zA`##b!>|X)9o>f&m}ol-cD-WC+5i|4Tf{a{OhSJ*uOqH~gtM$P>?xYY`018X(o!?9PP!C{2sxwuo>lJ28jEpvx zgSX}b!Gh#iL6&r!K?IWToZ~lH3vwMGj085ABNLZkptOjJ%!oafFj!(=L%a1JfK_XI zJc*fauyHy2wGlkQWnytVO~m}1TTHfUh@UZQf+Qp75l|fCBowaJFiJJtQia&wyLFEp zA#Vd3EG)ZDGE_-ngaF*Z5*i6H+eAx|0TPvnV}u4Q)I<@BBdx89464PdX=yQFaY4p0 zG>}T~1v>w;u{w~JM>Mfa%%sX7t6GP$JaN_f+-Hmb+J4DeKi?Q7LLCcegLQ z`l^q9;4eS=zCRZkc1~Qe(pg;{*?hir;+l`X=N%t;_uEUEZJoGkZCXcJ?OhaG+iY8` zN*V6F`Ln8nF18OYoINu7*UfutG zH$LwhzUfci@CLQ9j`h@K+kfL5zx8vU{P0_Edd>Q9Ikq!XOr*?)#g>YVtCiKU8PR-e z$LhG+KM=Drn=KYgQB|wsYP~)>60u>v7=~F>i`C(w9Uh8|_rLCePx$i3{I}|*JnPnJ z==&4@X-(i_no|4T)MOm(na}>JXFvBVZ@KmMx4rR?tn3V>jH`pEKKWTc{Lg>n&f9PQ z$cH|l^X0f+t&di<$YQ?K*-WLbS1YM?RjZ8Suv~0!Z(X?S)+c<$*WC9$*ZuJy{O z#cLQ5{dz9eB*`h!Us)`AG(d6HftzJpKG84SV}dvXauLFsAtQh@uG2W)uwP{!2&a#K zLA^r|E5q(DC7MMd69PjvAJa|J?-NBtkzEkr*EQT{F)1R&w&oIc5feiHxzYf77$xOE z12IWPgaGy&J8&r>W$Zb)4}Ru3isWVyzT~x;2v;r5-Uosjl(-faK#?u4dY*nPNu{NmU_~3GlSa?FG~>k0Se;Ufk0#a!F=D8~_4A1E zCWh=3mvReF^tqE4cBzf2sg_4SrWYv}T5f}xdS z41I&oh-0A@T~L-&3do}Q*)Uge*XyXRZY@wF1C%B0?bsXh>717WXHt{I0bmGpi3-6z z0l;c5JomiszJLk?yRpX$F@Bp=!fL>&L^qbJ9$~h~pCRJb7gl!Tm263q`HQ91i^c(C zR%xP=01#Iv#iPrUWP~WTrk%VLLR-O8=pHpETN(7-rw|om98|;0Gq(4@gds{1DBc4M=$vgQ*o)j>S12CboRR33+xNQt;E-j%`vt|38$ z3YMnAs6*mScv2yui9d=gl0hqV4RsWHme9HI2u)<6(j7hKN0LcMnb8Mqwwr|j1OQVk zM`J9Q2NT=8MWBs>Fg?^D)sf~!4;0`HAT`)-|h`|dJcRdu8c6^MBzg^5*UAz-DYyhArY3&iGe6)DS#f)zKAMHNmth&`KfTzwfLBU7yMSGeN zmMDCJZIhQO|DPc(K3MvXMk?voz-Vdr2uhJ!$JO3!YiDaVQx&VW9#^)qGT&B}vuDo! zI?Po>=L=a3Y9_;AWoFe> zaLgf8&GFBq`4x9S(0mdJD^V{?>u~1YdvE^yt!qlQCcXu*g0PM0nLRs^UZ{& zMPw{Df9`YdefN8x^VMJd?mvI?;mWG6b}zsGV;=kE?|A#$@45H%ak^7Q-M=bDdx@cke8@W}nP zAHJfLSy^r$?eAZG~>DKd~$`VUH#2?KqTraaao8FiX@4r~{O(VzL;7^*ncVG(hG zLz8c9mBer-xi3t>0pTj{c}XQJ@F_WJ(4p}uC4`Ni3?*WLj-eiTB+2y>R#V_b;6jUt z+G#@$)h=^fq=G%TzLynAaKMxXXvCf){zS&1NiH1aHbIQ@K|<+5FH;mK6eB%!P78(p znj8dUKt~Lam_spg5XJ)`If1GN^F=yKvDB*@B<{D0iFwqnv{H>(B(n_N(b(Q9(k;qJ z(pwQRZe0ytOlfvmU@@?Lgb3 z(a8pl;$F5BL>q!RE~B$dd=902Ot0`#C<5fn!fFJEl7|=KyrQOqiUUKdMl%phDUHr3 zxbQsTo=UWwh``yvg1=^_Ch&2QN*Yu`%E&VCWw5pNPKIiMe43VXk;$Q< zjWgW)aTftiCzfJQ4WK{q&B*_()seVRjo>s5S~JlPN+AU5ywR+D!QM!0+TYq(q)N!L z=uJ@kK}a0(hZkzxg40l8z5otVz150nJ7aZ}AUhd|YfA%`0t-r-!TIx?VN0Ht8&T0T zZQE!ESV+?h6|Ars=afh-FodKGzSR_!c2zB?oqN_A7?K=~t4k9gsAu-A8SukmMU6HC zX~bSR;EZc|kWHh@v5m5W+EySAOv%pC;EhMIIKYps7# zRL9_fdC2LWte=Rq2n`j(YS`VR2$hmGZS0`*7$BYX9==5-*hmq0o5rrj=j_MxOJ_s} zA+A{ffyJCPu|oWyU+fKTQ>4df6$fjl`xZ5e*oeszxKk)6VzN>98ec74qF|6&J1J7S zP?$i@VuTN>rE8G6j7-D_6A>{tKR=JBVO#6Z03Hd`6mZhCvihk!?nT;h4}h^)&(E=} zInXnPO+m7%nV*VGt#7^a>5i9v^~q`etO*50&4%?@$MHy9lxi}o>uP29jjw;xGr#uT z_uP4ph#mnVji*SO9v!R%TNj$surZ(DtaYraCOVjz)n;&|jup70Rt-mstBBNbgrZRg z15T%E9QAKRX;A*~MyWdqkW;r1Ec*x!Jcqt(nGNIK`Sqzs&A#Z%XF zq4n-hsxCwZ)#iSx=u(Ec=wLeF>5>$+&!C$|xW(kNodGJ@9cvlp3)JsKqzuEbUf0>| z)c3yV`!DPr%;t*+-FW@SKK9{X__<%0&E{YGysy9Sb=U2lI(6=zdw%-=`!A1v{Ntbh z{BPPC?3P<@`;C|X_N|}#?A6!a@3~+9wU7LghaDXpz3m-;@tWWN{nff&am6(+`1bF5 z+!Mb1UGIGVderUZPPIW~boj`Nr(FyX?8J`(T_>F4wO(I&`t)1h{H7;8<%!on;9;No z=tt}N;2F<+#%dh*_x6@sTOxA#l~+IS8=wE+2i~x|v-SF$-uk*%ziO2E-~7(MH5=wP z+;IJaZhX+|{^T{k_R?Q^+Sh!`gC6{ai^cH#zxiE1_p?8B)z$ZX=odfib${}jyY9IC zE1vuHU-?yExwF0e)F(dv^56c=Pk-#wU-X#AKKe0_-aU2tnrp7P?^Rd+&dY!EO|N_X zFx&p>uY2Azp7G4x-L2QY?vMZA_g`^%a8#D_rhDPO(j1ZFLPel&n4=~IgDj1XI=WN- zBF-@%0zo~Jtfid>4%uadPo+bIN_DA|yVngKMr_F|eQ7{ATS-$O-#qw>gf%e3+}DUm7o52@ z1ZisQ4SYlt6460uPX7&qAizQ5RxCmKM_%LUYQRMba2Wh3oLAx=;*^kp#@eQ^4dIs9D_* zihv9*>kI4<))#uoa$Cq^W4f6M{2A$Sh*z6}Qkd)r2_m%9HCYqu1t#0uUwS3f)+7az z6;+I+LZCilc^D*QMmZaxDcOwmH7up%rwrj(!5QxB*6iL}OAIO+vJqMYRHD%$VMc;) zB=wxfCZ9QZpbV5N1KvFaW`o|M}g66Y+!Fb$wg5(fW?y2|f4u962V(i%3LWrxu48$waINJXY+NrO3V z=yY3N3S11o#y+Vfof=cVAvx)dLZ~pbkz-iF05mxyI!b_nsz{3zW2zxImx~J>P(u|} z@#i162)2u}Jn?f>^(mrPH_lL}qzRl#ORFll&8toNq8`}Xe5fQQ8P%FRCOXpth}-&6O!~*-bQ2XWc^dt4$(q$X z1!2b_fu)URFFdG~wo9FWHxA{9bIOJ;#>v7#_bJ=GeuNN8c)?9`K8Ir zDktBRu^A-50auF>B+S7j;fK+Jg6~D0bYHP=TMFQ(jm$Kw z?eE|9`Onv?)vTJ0CZlQf(-vwqtuj;@suVMAL~}2@18eKwv`VQuR4Y}~w3w8}{VGzW zwCy&Q7C=N&(zjc|HY5a=fjsg`f*?OsK@^LFZ{wQUjB;bf9ngL z_~a*+@#qI$^ba5ZsK@@?Pyf`dw|?$nU-FREYE8@8RI1*+O=Lor#{8`LggP$g%Uf^$ z{D(jI;io_4sq>-E7AK$dSO3?`zW>GF z_q1m{>u~SzJ74(1FMrIV|Kzo={Cz4-6laNQM;eDq^q^mo7eWxw)2UiRz1{pDZwxcgmy!+3O9N|S!L z7fmw)$_Q05PgtpBs@8A%wg$y!1{9`u4o>Fa2|>Gvm^BRaypEM3Vz$p{5vxOTxz4cWD)9Ns$Nx5b8&7oF<7g=rdT|kkV~WM99>L zvKZOqI-CRt5?i!uDfCQAmhp7Q8C&qz%Ya~hDT57aXiaVJP^>fFhQ9U?A)RawvBDd(Y( zN&KxV_coG9(FkPPD`%AfvSEUu)E&ZwKDsNhG>c<;W{^u;ia5>)nJ6YYF{P+7rp&LY zWpG}0TnlCevByMuyize1S0;9f4?T`c=p9&Kk~8__OEq?6C;QIYOpM@QP&$}EG91=~ zgSDBgh^ZkWY^H@tL#=6(0dC=dqdrW%N;Jm4-k>;Zjljato}e1)pW9k+L^~~nMVldd zDl|y*LE>g#az@kti7BAUwV*TVmLQ~1Jf^3NOIhjegw-)bCcxNwn_#QZbj(~Q^Q80T z%yAOUz7`mcqtVvcJT8wi4xz&GcoFY|6@)d{2Tp4`>lAKABGb*KM{H3^mA-6!Q_eZp z!KfB0!Gtj}P#%Oc9B7=KfQCk3##*8OqFil@#JDGpX{k>z_ELkAU`ZnY2c@a1YBkrL zTE)z2dyRgAnwgq-dgHJ5lSvh;)$kk|b%69Q{ZY7{{$BN- z6KI=ntyZhqSZh0TPC$keB=NR-=k1GXVunGjQDsg*8>puLKwGWod#qNgv|mLGTgBWJ zv{|FE_>gUEb^5ECwCD7+odk+GwqJ#piKv;^N{kFrZBb;XJK{NmF?iG(^J(8m{O6v- zOxt3QfDFcl1t1UKD^!ip67hu!xI9G@>@#RhOVLtFA)M!ADtR|I&$wX+@jC~^7=ha= zvk36HFv&ts9P#KD;x#&jGpA$MzSb@6!JSRjs%krHP(@2SZP5)}H4r>XiQIK!j4~qn zG)uK&i2zU;YJjamciO^%Mw)M3Zo{Jk6=}C7IQGyNida;x%_WN&YYL`4dZY&quNuo( zEa~AY!>l8;U=Joz+F)j)Ma1T8X2uJzL01aU^?n-(D}mF ztB{rSnH?+n9u}buSa2L|k&;Yb5s>r+RJ!!!zWif$;nU6#bA~U2Vq{{vYn;cbMUL*Z z;XdVtht<8?Y`^GJg88?WnTr;60!C-Iu*& zzH{A+e&G8~Zq48L#p1;1_-N6CeJs|L=P)T--Z-pYo}Xe)NI& zzwzVOf8pbw_}CYI>$jf2_<4D=99~>~(>FXv>KgWi)hWEUZYpkrA!M^DNAYI0UTtsB zU-<`r_(MPVqTl|lQ(yE&Uo@z_{ie4)@43&}yLjR1Yp#FVlOOl8-~8=USDrq9;rz{? z`1qq9{_sEkqu1a3+0XpyOMm4}um2;F!>|6T=RV}2k9_SP{m$ne`tXxmC*Jzz*RJ<& z)p0y~&uwSUUi>@X^R=)3{g?mJ&;R5&uKwu{e($fp{P&;uglB#H(>MRcTi^E5pMS|M zpLyRaf9w1cpYVjsuej!5|K5*&;?plM(?Ja-twl^Fc94vNs>sb5Xqc@;fyK^%% zm^GtBs+>q@GEAM~2BtXHs9O-W#Wil`$SLd_SgV^h6*muyx6l-;am$*wbx-D$s8&mL z51`0i(O;C*Z-nQloJivl4HE*ss(5=P9-@hom)%;3urH4PHU zldsE}l5@#YL$Ba3Jy-F2ACw7w`<*?+yc}$awospNa*`w3v|&2ge3nQ+NH!vI?}g<}Z93pq(?Q$lmeym`aI zu0y~fR5BsRvnWMi&X9G=+yD~%4L%uoK6#;YLA-_1f_1}ZcVLi%QyGHuh6XH)XfT$k zvbu!p$;gLUb`fGCxY4RaEuHObY|Yt0xp)|9 zncbRQEXE3Q(in-BG{Hq?EYtDYVc$$PJ082n$RSO6#+O zs3|jgkU%GxWygvX$pg@|a45pr#I*^G z3Fb+X8B7#9PUgqtl4(gdMYpSsz%pN*eO2aI#ZT3l1frxRv@lslav;IlR zC`HVw6f^S#9T&BJvK#{CmFf{q$RQ;~p>RDuCFv^Tm}Z)twBvRux-yI4jr|l*)@bpk zD6~g-wBz~Pt_0(jFcI;?9sGD?5y2xI+CLgN6_g6RvyayH@XtySk##Kqe66OnT5YAI zcCaSd!+%Jyn{(b>s4!gh^|hv+ASyURWb?8e-D4YtKpy2ujUlXaYi6@Fg5L-=4N4eC zKncu5ib^$YS}Fz%?iMZQK&{k*lr5EFevN&x~r3F2!f2py)*MN20&^+G_Dz zj5?QJuouXu>5o}K(Fw*J=>ninU74Uze!r6U0!F8g&PKoU&97?(5|1z2#tl;)=p&HE zm*U?PR~wkkrSVP-6{8qDc`AODe$x2W0VOU$r{l_G1roYITqR&7i70#w`H-&?1OyaT zM-VABbk$F&`|J!Z?LUbM$T3_37Yw{_?=o}RWwo6$Fw@Zv_Qv}>$4)-<$Sw>|d(p5w zQMVR$c!k{Oi|e_2R97~r&6Y(=F)h}a5a;v$B>p$JrOD@VzrJk%od_$ zthK0)qs`}KtZP-ZYBr9g4D-dQwNyU_Mog>@!*KGl-R1U)<<8c({jC?AzUu0uql4GH z_Vp_%4|~L;pY@c-ojH5&TI`1Fu7Cf#-*x5H_qp@-TlV%Y?4G>l;9&3Uxw}U#!+bW5 zBUsvk_6&wu4KmT>wZ#r6ahA`P!`9BuN8bP5bzOhSmp zHTPN9`lXNf()-_Vy$tg+=P!KvGoRJ@Vm;dK*4A?Os@1`MEwjV*Mb-KC&d$#6eCM)L za@Y29YpWiOR_242J8!#X9B0c@R~+7Z=chjQiREm5>h#I=`e66ON!7A_>WYKaxVwAm zEpLAHZ~Xez-~Zz8dEs~etylc^D}VoYfBWpk^Rwj~xqUWakIaQ}sxVkIAjzZ_DLks3 zY|_LdM`Ip`f*1gSpfY5)@L?j7viIl{9dIF$K3a2{pRF{IR?MU=sHk*k3k&rT3r#(% zttA(pA^}OES11JZM3tZNaDnZ4a?!6lslHne!y>LmX2paVK9D;L06(D0;2@C*JiAG4G+Sx^7h-WOQ$iS~q>ogo_2lz}#vRFd69z|(MsV#WX{%>(1qYlFlQY%8k z92tYj5!i2(y~yzN7qHg3*lr3v@sZ(YQ!-^)qQ}h5p}92Sdz|Bo%rpfE zAgWFA7{ZNaLaIQnUQ7&wnSC`Y*6gJDNIyvxC4qyO(nX(P=?fFui4y&Knj!r7+!kRG zja%nX3>|~Z7Waf@ZPz3pNf`)D6;)#zXzR?!%nl23>}8?&TEU-oVZ?mOP4SWuTB4d8 z0twlQ*Yh-AM4g#HqR)f_dW-JPsf3L|eInwMe)U@Mc%ja+p3ofUMU?zqoZ*kGPwx;C5m81$%j-umiF58P? zIhVy;hvq6;Z}2q8af-wMi9mM0f^tH-lsaa|NpHf71n*h4^`>SJjTZ=NhO(l(>5bKA zR8GP|TW6^>AoSnibwpZe4@W-6O^ceGc=FrmR*2s4 zD&o)QAPQ=au>kMZrc7L5MtOeGSvpWc#mwd=VpfY5QyE8Ft;UP1@nC-(*L56AA4?{r zXv$FF12$e(RTZnEMNn?$<+&mbIBE-&rmB9TlZ5)%0g(n=|lO1TcnC zG7iy#!FR)dYH5m%!&O8|JzUpiz3xk8cSrAdkL=$up4+#r>+B&%8QU(z_cjitrdE_G=`PmP@x31Rrd+5Wj zz4qGIz3$cX#eA60t(02FaXd27GL#}Z%*v72IF9=lFWh$5o%{Ri|NCG6Td8|xzV)S# zdBPRfUi%f#`KrJCi`T#8=YD$U)HVO$AOEuxr%vB?=Xo_MbPb86iQNbn^yLq{`}SMD z_j|tQA&-3gzxuipz)r3$Vq{;21m~T(ep)`N>gv|Z&LOV z`i`vBwh{Doi4CGLI4Iu@7fjq3Lcy!3)&qdyq`PY)=XXvu5he^w%L7yOMjsS)i#!xK z!zVzy>LRA@KThSPsk;qoR2Wb?i{?^reR+wyGaR#;hKhN8q}siLb%pn2(R15 zr<#ccJuD@7m+_Nj`G@n%E3_e}?h65`XVxSqZmG5-R$>h_dGVCF_X|HhW*TaUIZ~GPu1Ntu!5niJG z=A|A5N$5smf+|%@VD=KGVF~9#CniZuM-$29Jq(Ie$~w4CX2^A51AI@J<}`sc%!-x7 z49_AIwNE+gGcrYNS`q1y1YW=}E^9QJMMYh5eF22!u#1al-c_hySMU|Fwz3@tB7#No z$TywvZdX?u8uldJ;DQ)B0;=vse;1A~J^}}Gi9Zt^^a!GlRxRb$7Ft!5PSk-g0gYs} z@~}IlAF0%pDn=|-B;U=+LO7Z=OoR?4Wl!NAQGF8-Bv{Ocp2wCQ3QZ*O$;Dq?C9pTg z!vjUEu_*gY8}_>^-+6N zf!{&mqK5CxIFhv(+C@}NMj4k`kUUuqQL!3Am<*6SBN8e4a?U>y7MEK1d&z^M$`9Yx zuBl==-MYw*=vY`_O}OL^I4AMQtvNX7lDn6dOtQ+!9!utr(T^fs^4%Ypvu3U&MnG>d zQ58H8Xc)>+%B&2_`LNuYk0%xf`|I-;#?{e!tfHj|0nwo!HSh=-49>y9iCa~|9ZJ>& zBMtPg0t@y*qH{<$N5>+f@l+Qv@%$VhWoD-4XX~aiDwLpgr|=@s%N8X8wKPyB^sBb@ zP>)P07Qk3AqHPs%E~q7s08*S9=!dzu!$Q4J!+5D`sFoiKpgwd_tp)l}5X^a+3XKai zZ!>GgT|{`6hZ6LpC<4*dlwsIvq|`2+WGkV{*?9V2 z9I8|Fk>Wz|eO}q^CUN zuDkEJ>CfJF)#)pDPo9`9<|3kMTZ>_Pd)J1=&Z$$|TT2l+Iy`*aO>g+xuXx6f{>VRj z(_7#6BseDp)_`@#o5_{$&vjK@CVNsoWxBj5De3wPdn^V{C_?tl6t zKlnx;R(O|eIc6S%cVZNBZ@%69&-tYdq zAN!Dx#(0}?*f8;k_`qDG|tG#n~ zoxST8QG^NM=)~8Eu;m}>Ee-|Q3POm?YH|DDuINDc@WxkIzg*Iu4YZ|&pEb}pmI%c5$ zn!r)-nm2iP3+o0VvJxf(d~@Hl047u^bjba6=?y7LE+snjS%=5pRJ17>`PJZ@$x`y5 z7)fDHDZWI{o+b;{Ed=ExDzHh)Q_M8i-NJ^1&c10yS{(3p9w1J%sQWkQ%6b=(NY>?K z-cF{){t2*{JlN0}43dJ0$Oq|SF+k>64$zTI$*I464$)dQ<|C&9i9+5rv}! z2y13=pj9deX6|%Kp1a(@lBC;Bceq6YRM9s>E!cU&Jz{c5Q78J>aV$_pq)NNT(1%E4 zhMA@p(TgODwUxm3hih`2F8xSvfgCGBFZJ+J!i6Q0bENL|rljM>22sZ2*?iRQ&iD9C zncQ=^i(#9Xqf_KKogPS@S_mVmCP1uQQKV9}_$qrn&D2=33qk2LdN6Vc%3ukxHZ>la*3+%@h(e!PHhb5>IqC42#8lcWZfKXL0W0 z;kkQ{#&N`E6rtWA!G{lR$2i~tJe@HMiv|Xn0z-I9Ml)F?cBI?gMrI6oYoa1Eor$Zsa08*Q#=<&+ublw|3+UmKG!hh*(x$ELP_g< z{*)OPG&BuCad=xOeiId@p~b5sL(faK(=;*F5q4gai(VDsOz0mcFS#c?)~%inc0=ssjgRhpI?3W zwR-gzNI56Bf6TU5q8HYmey3bP{MoBs`HJ=ag@cnP|MaFeeExHv5#3&o`hgF;Z!r`t z_Le_;<88NoMs!i; z(|P|H3;>ZzOeta;Kr_+6Ok_TP^IP8X@lSrN%KYeX|5so3zdrb(_a3a)TIPTJ`Zs>~ z;~$wV?7#i@pZ?b8zu+0qdFIyc&L6+_HSd1+yF~SkZ++|Sx8EWTZ@%fxul~bV zpTGC)ZFk=O%2&Pe&b#l{vRK#pyMOS?d(NEw=!ZV^l9&FEuYA_CFT3pWm%Z$zZ+`O| zbiNcZvoWF!!9oynWGWM#SwumuYy>^VRfTqw^G7ej8hpJ+7J0L@A~KXnbh@fXLxccM z^}D27b0A_Q>^Vz~`i_d`yT#MiLNgjDeHD-f(4In-3?Z39J=pFi!mMmb7q{FA+ z17QIfOL7*CC03iw0I6+E&M}9du_EQSj)sIgXQ3QPJ6Ac0KF~l?sVJr*kc~%ho!3iC z2u(24_y^&44&&f(yb3=pHFW;QzfN@#!jDn+phzKgd;~FM5!jn239d>O34hBQ`tt2G zX^!1HWfe$-l_>zIA7wqoJ&&`PAeV%QAP=Dw&}M?JZQ6}DNRtKWt^a6_ButJ> zuw8s$7k6BE?`%$FWnqYaQ}Wa18(8N6gsNirB!l=hTT_}~ z-q{fdM}Q5eMeQE-8^+cE2*v$GE-UwQ4Pptt9p998lfgW!3REe8-F1$wNOm?F&C>6k zMHpK5GLv?mW%o^zI5=Pxhi@1|nY1he*%9WAEnVt$XG>3?oXuq1KR7sCt;eyNA;@9A zmGu-7&Kezzf@%8fm2hniJp!_FZBGOuNU5&FwtEU(fi-L_WQELyeC9zpiz)cd&nWv^}3)wzIvp*tzHI{?S3TGK7clJ)7{vsbt(xy%((; zr}@1guzE8*p#YS5$ zw}$!bU~jKh)4{>1@NOu{BSQWCV^LJ$9kl(aJfb@Idnr6j#96JPT11MJ0ZLU=+lG%K z(w^v1+zV<^Eu-js7$0!C)_Xqv`I|rEvvv<%wzjrsw!ZcAH_Lom5b%W|BrA!@1c#z+ z@*DYkh2Eqe>7Am>RXB(T-?3#y34P=@7=e3>hNH1HlHED zkNqli96p|{b+$d6ywPS$tE={XNn@ypS)EB;jdHji1|4RzQj2QQA~uerjq{-_>rl<= zQtK#(N3twsG034vE210xypS5RDrIJeXUFrO(V+;}o3jjDp97h-6sh&-{8=#(or&3e zcUOklxH_!+ds2pBd)utm{XMZ!XG>cjh?Zezx0%zpe^Erra3lZd+Fc(V)}tdS zGg%*q4pN3;drQ`<@!+E9LTn{cWHz78w`5k_@1?l}i`uvJ&l1iAYXr=-+Punoe@|5B zJG-X3zPMM4&bGJAWOcAFR_D7X?C4;0KFI@{Tm zI<61)MMQNFFKGXTq_U{#2i7Z5{Y@H~Jt#Q4wqr);^&bAigYCT>&Ulz+U4C}qK zI^Q)ZG9J#iwygk#qsT}fKxh`hvU66cm?D!#pbVj~CRH?e-!@#pJe(^WZ0F5^`zeNE zoDe#c@iRgd_jncj`?2tcwRa`=Y;G({7XMPE-iHZkmGINePXvf^}U3dkARM^xS&dBVw&a_a`n z*=CBr69F!oUI92G_L7-U*CDPDJyX0q51r-fiEzzY2WK>{8MwRIeouu|*Xo3nr zrXxU#hoaRaeQI5+Y8i%Mm<_{FN`Vq`Xy>aW=NH4Lo+@ty%a>0=e{)rCi_ubwKXG1c z9P4Ve9>?|Q51z+Zv~kQ{lMX?{O>$)rSR|T2#gcv{>w}meme8$S_DUd4{4?A`kr)lE zrKP16(WFiU7y@B$8Wvv9L*beQ>sKG}b>={ui&xhP0 zj*Vg^WJhh!kPOw%iF0sOqDnxx7F=NDS8@?Sto2>DCLJHxK4(MP>4sYor%D8iKqLTb z$W}UJWjleSJ5ws99338UYyV8q^(+Ajq5Lc*rV_Nz(>9PogcmBw%ZpccWu4$siEG1tVqoKA(D=&&JR3X zxup_b5B58^RmW4i!|C1GcyzFTc(_`RhEy~24%4ia0-TN2@X_PAq)w*{sNo*lm#>a|DpjH@-p((`X&MBdP%bybs*~}y~ z5-cc*mE>T!B+LOb-5i1f(TRq4L&wOI5?%LFQL8eW>xrFh)y3WS9`5gr<}{*|MeZcj zU{ND@V5p1)ha&Rv$L9!{(fXl(;9h&i66TO1q9QZ2^j$<*aRFu#aJ%+29;nJ#wWtX; zbns4EYtL{Yt^npr)^SEz0TX>dA?+xT9Kn!FVK)Xzt7uV7m#SpkASGJJYqK~e${8tU zVt((EpkU|T7^Sn;W4DJu0Ue%Ecwcd-jwQOm_a^9em%+7-Lc0;OClLfs+7HTtN<(4qEckOHHeh9HOWM)6kW`V4q8P^Q7P+j z6y2R^mGRJ@%-cec@N}ffi0Zynka!Q=PH{=QrdCzizTzsw-7{6Hjq5Tivs0(cY8|VH z4JUSsnbj&=C(J}}g7sFP}J}oSVP0sR>NWh)=B^}V3Oyp*w37551qPC z9Fl89EavsLN1oF)_+VI_OYR)~h)K%nd~Tgp)5YXi-C+D_Ii0}mowP6`Hm|y(1P>Vx z=hab54hu|3cd6tu1d>Vd=sw0bkwj1D$Rl;?+lK)Q&53*s6w>iD4OB!4{_ zIuaQ6tk4>K?P(yUl;bU*Q()W2% z79@6n-XoGT$=|m<^MI-4axsqcaa^rdt6FQ)HZqM+hF`d3mqv*UK>#E8*0~))sKAt< zAp$c_cG_5)05A{bLT}ojL^ddtOdu{Ppir)n!*q;G#mIybjOG#8iU>})gMI+UFhmG0 zQJ?pSuFb}=z_+0w;yX4tcY-Xob2)uwsm+@2XV0Uv%f zb{`}i=mLuXRw}$^43f}PmL7a8PMK3kq|*Uqi(nk%J;TQf<43X!(x)mml}0`u^&X6J z>OnrfzPG0u9gE{~&~KfkxTYge9L+--+@dsTE05x=v;qX45f1qEOc z!$X%ote8rSnV41461{0MdD0zm6(LDxE>9XS5ue&dEo|QsJZcqfH`};mlQOzHPDf}& zPZ_v7t)!lssFYNu0Iq;6@7zlROkN%Mo8owMfC)DP6Bn9^7N4`hNZUT3wh^P1}l%~k`w(~_~Y zluE|cQD&aYu#V#LRy+b-ygq_ynzc4QM@Q+p>S7BKF{$enAS}K-MpmtjM>D->q`y!c zbp~~9>V>LWS4S{nQ*HMMnppLdsBLVI4i*!uM{w-EyR&GClfbG! z6w9iat-O?3tI61AG_J=ciCRYswNExc$CPKMS%o6V65wvfBq7*>dExm|=bHW%H*uB{ zvj@aq_W_yJHi1_9PLyO)|J*-}fS2o^96+_3iNd*A_^I@BM}ExANp-eZiUh`wd@D~R?Xx$s6g4Eupv|q9ES!Y|^OI;ik}<*< zzv&TCIX!BKk-5i+pywEwI+-Rpto?8ifu-&&_O5Akmcx?v1sr2smerbuu>t4F%}Hpx z|C<-bChDchT6u*+ufjpcf=Zacadw@#rYs_bjx{7lY=ikB=S;@qyp1>Q%LubUdo~;Q zT&#;_37V@3`TiWZZA{B~oW#t;dA-xp_PAgBFnsxqI? zXS4a?;lVhr8__xZ1~DR?K7yYpYGk!c^-!ljUx*BxxskfL>r}^p;?N(JAgZq?MRMhJ z$!?~~B9;44XPt@g5hDq|y#L6Pq0M~_H?OzxowhhGJOX5#=H`_bHel5&@sqBI`jh^J zQY7W-;B^C+xF;FKgwAWBVUJ*V$ zdI|ip#Px92<}f`eMTNZzCZrobCXdhZgPTQ+iP}eCX@Fw_tDZ3&igmY48>h)hnuj5V zU8X4JhzRmCGsU|iv8&%q%=epQ39IdFm(x4t=x}fUU^Pa(?F68>)_c3&J5UcB&=C`z z=TSd!UR-KdxC?6P0mEfP9EE^HB@`M?%WJ<>cmcHX!cd7U|Fi=mW}c@AtOQj~=fnwG zt(`?|!X=|7kP&rB-1|k4(c}bu9_S*wBte*z5gR3fKHpSBG}T9(;U1~xrmF2eqS5T) z-u~{6Tz=WsYCKr2L^?eHYzZn}nuVAMrOyQ0SjH7m(ZXBsjZo=d1mn;p=Vdcr5J5aB z+|ywJ4Rm#!VppV>06!RTiNd+Y>RNm`DJDA;SRPa12;2`TD%gu|E^Z?`1k=E?0UHnE zXc9VgU!H@BhD}r`o&?$LCjgd(_N&y|suOLiKyvjN2*E``3A^n|s14(Mo=HL`rc(To zF4fvYZo|<>u+5bh_a~04Np*-`0_e*s6_$}yEu1sxQR&(MjSvc0$_b>KHrgj8?`Vtk z!X~~$Qja}_iO2YIiu@bHhY-6cLyOcZbuB|bMpG_OT0|;qU~rHkCT4BBVBlxdX{m~% zq=ewF&};ZN8xPe1Zd&VfPz^`om~WG*qVyK5=>mWxHYF6|Lmm!|g0&G;(<=bkh}#jj zDWY2U>`8wnB4^r(?wK)!3k*-eYciEiH+K{FPRH8^Bp7bRwNS*M&o7=73Iw_taSLIP z0c&3fCWdgUus`q8Y7?*piUB{eAi2DiT$*b^&|yIZT%&NeS8Ny%>Mo+F&do-;Mn*KP z1`J`z+5DzFEbT==27!lIyTtT(dvx^1;B*x^2gphy)F4%|J=7#Tw4)HJHh{{+U7tRd z;-a4pVeo;T9eZNYG}lm=Xh6jbjEq9C5VIpyrtTvXPhJo4DCtjOkdGKnv2oJqmjH}L z`d9!;0#Lzz6FOEw8B}ATyA!3+8hpYj(X+@tMg069dir*47MW7=40CDyNoGNwV!=w# za~F`f^eObrYLAZ4Jr^z<)=bD$_{~J8BKWh2JuER)linKifZCC22S)Wvf^#>|yr}a& zh`*Bj#muynt*xzL7|d*<-rYYWq2NLfr2vWo0HKgYFlmvrQzpMct72UzK8VI6(1+}@#aWU-V<6$nhckL9|0(&&ti2(!Ec*^XG*RxKn{3*(Uf3mX z{Dd_DUL~F}W2ZL4u%I@OBhA*hPb4DYE@OccK>`w_S&|pNK&rqg49p536*_q5-;>7$k)bcX0(rtnB%sJhvDZC&<3;1g5MU!EhQ;P^Kl&6_Jk`?#)0w4^%qF%yjny7~s3qH)KBn!2P=%rTMS?XmwWxd)zI9gSlC1NOC3xi^~sLuCE z7XcAJr}=bvXM_2;uKLfRvKasw=ccGGYb<2jMH#^d{LV}$kOZ)hE10d*L{C6z+KHcP zui@T1d{12{)drusIE6R}$(l%8sZRsK+#r$e8WScsxgbrS1(OdPq0JG*5}Syzime`C zv51J)YI}Q!Cr%7koL=5}*M7B`2+ypIguo?T{o%mEv@(FGgnP225~^uwL~~#uh;5SR z5Y>?2j9#ZY7Q!x^cZFe}C9k6e8qhA`VWnXKAzE*i-Cz@0@qxVxfD2R45)b^=kf`{Q zhFaTW2^6E{tEhxsz)$-*r4Y9PEgk!cI%|rS$_4_&qJv8wgT^2tBBekvaDi$(Fq!_^ zdE>nH%~H+%tNI;VsxE-mv@~A$zmW(h{e<*c)QPnYG|<#Cfd=KI{TCTSW%9jEnvm7U zd<1s8sk(#e$(z2?*wJh1-?VG!#u{^LPAO1dsR$}&Dn+cycqsFeqD4%!4AKr^=&36H zT%oqLr?!f?=;*iA1in^0x20oN^Iq1r4T+czVk=u;^pG?lbaU<$Qg27Obr0^LWyf<; z;K4$zx`x@;xQJ0J&)}<*D;e>nDNp-Nz|*ruV4U8P&=~@=4S(vklKl@cf`Ls#N7YSw zFo20gT!@*$NkoAl=Bojw+Q7@dZh4kcS}Kx4hi2cAEA-qWkAn-0sJeEbFx-l_R{q9$ zPD~~=XM+>YaLwmv=28n|6F^pn9B_NVE9gO)3__#vBB6iX9OK5j}N) zF*VVdG)^Jp&NQZsi2;*6b@<%?x}AIP#dcT@dSiYoF<307Mw;SUP|<-Gvb!1daA{5e zd&N$!iK;LpKsX(77IW|PFOixw8)xkb7LZEy;82{Zv8Tk}2v53V7sg6J(>y92D-*mN z6lNd6DP#`#Pidqcwqn;SKQ`ehY*4cSfV3=AQjWPstN^ZP_?<{v#n7SRth#={AhwjU zwY61-p;jZClBs4Nl&5GdXh<+=@z!HiU?+Rf5K`*U`VkWRssKZ6K3mi(Yi`zqigw)6 zNP5HmTp^%IOz5NRMLI+@%m>p9(I?x8Y7^(zhYSg90IJEFyqrD3WiUQ$Iy;xiw7YMe zoCbukpBxZ?*fqs-Du69S?9xqw*1_imQaB~qeu$G^hL+wfTE%ceR1OhfO+Z*(K`P$* z=*W+HJNOPH2kzzaWf~s*qUg}8Uu!0s&Y^cc#mY?3+z6;OYJad5ERsi=C}NH?Yuo3kso+9bNS~w((GsP(Z*(eQzY2opkXpC&b#as=Epxpn5=BW+$OO*W$6^sZ5@o*x%LPZwT-P0&*4N%EhNMO>vANK4ZfDwb4O!_?dH zon_7AZ)VnNCr*26X#C|dD1a#oi;tA6jSH+)w^X8CyV=2uM6Ohvrh+Zb zKzD7>QR;6s=z#$^;5Sqxo%$lFa6r$ZNUKt$Fp+T*71#nFs6v_Ir2t@cEW^oL8`=%! zOK}(^=$eoWl*uvdO*KLQ>3$LCWDG-wCqF~_wTPGyB-DQ(YcE=!rO=b1>GT=U-2 zP6tslt)p6Xw_sHp584}P|HZrt`92J`zGz2#ii3{((1TMpMh}hCh}}$lAb*ld9!?=7 zq@AjwE)Y{>*kBMMPcq2;sJRfLfqP_erD?;u`iIviiZ?vWp&<-PVs>WW7@6dx#>>yI z?sXTJyZ)FcPQQU`c1oNNmeklX1Dy$C?cc=0PJi$s(&n`ZOG*Ou4Wn}M6kx34wu9K7 zxS~n-;HfAY3+81urVXeHPSEK)#?kW{WYE6s`k`DRr8HrNNlk79yP&`lsA{4;=1yo7 zT4xdvy|e=^)RKMErbVzP#XX8ghM8lHAsMWwbE$ui({fQ{!>cO{9fm}4DnL)vtnCjp zaK;d~g1bN>6B;YZ`f93O8bC@qmD3IZ*{!nyI+Myt)YSyY=dG|ESG-@tMh2>rIBOk-=u{<27U3{YB3mh$Pj&+U(0GsUfEN?T10K_&tkD0hFQhkiw&8f zom6;;j3kJ(NG_Rp@Cb5m@(R6z!gWZPF^y^@fQc|ttBb|FZA+mdQ5C(T0L<+5nuaNi zOH;f=`Drw^Bx0&M@GwRPYem$(nyVZg7JYmW;NQb8QV>S?3U$hgVH9$9G>KKDMPkiI zOe|`@P)4k#1(b^goOnY#pen2*!bSSw&?ibY<_w1C@W=(@$c;~C?kB-^YLd?sV#pF} z9k_8|drPx{FlSC#x2HsdFkz4#kMhis2Gmij=>sY>k9P-6_rnJYSPoJaf@FUq9{_5No8c88a0G^nV1 zHseH`!WI$iZk5GQ_YV)(>nfGtlG))-T!Wd^P=%3-xKDR=;?-okHLsZ*U;-&PFSrux zCWes81sR?zfhOc(7-*CkhZwvurzNYXk~zJs=Wq9BHZgCT3E@B-4n79xQ`f z|Hcv6)3dN)(A9?H{xT6Wt8wgXgkfYwns161IUk}~2n@pS_YAhCN2}Fpb#!89wwU|P z4q+vUzYamwNkm+PdRW4yOaXMjz_RYXeLyi;J@j6Yi{R-{_n0a1O49vAXqE+x749E1=&FmO|S zM6QmXftdUkE=#%0-wq%_VXYK(JZ*CK^B}b3+4_wAr~*x;>d3Yj^)!K%LGadHnvdFg z4o*vcH+gB_Lc4d3uafxkS9ap^gdHSz5-VGD?9r*_mYF2!j0a;uk2ECEU3LtikSWp+ zCxF33P=h&_p|1Az=$vj})p903dqsGjDbHS>i&mQx1>tAyazc=?=di(hnjfHy2YabBF}{X zD5h`-A7}z=C_qpI5xcwc(k{eZeA;f9*3v_Lt&>D+$Mri+)9WqRJe8#cVJ4m5kH3cb zW?mX1_3qVs8O8_^8TXKwtk3v2CApearZXFa9vWv5-i* z1TwWyzc4cwi9*4$(3J{~Y*|Ej)IoMw{wufv%e79Q8bO9LvmygmzuCfQ=&p`#Qf6Z9 zM7);jwE|wCQ}eZeU7xdc%yOroaK|kt$g{Pi-gL(ZU#VSTZK3&;8C-&E6&*Jn7*(3C zPdypMWj%&DN`);Xe1}?ESWGgNpb4{!B1Rx@G|C#)n^`|Qf>V^NHQ2^H2s##&Pdr{j zPj`r#C_xn?)H`JvsSBuyv2IR86Zb(e56joMX1DNDdQ}o|E5Ew9zy&EPTDx|U$7$-s zRHd3N=eo01YCT%5YpU!=eD97qMGi701MSie77TJCY@<oVdL9~!rpvYOpMwVz8qZg&qvd>ga%Xw>>Y&JAB2r2+Id1uZE+p4V^tMhH zCQ^xjTUE($@?XLmHvebELnA1js;Vz1OQ5jt8I!3Vq^g(!2Yj%+`X1zi0&91;h^kmk zwr6k~epgA`<)Y|b)l0&$4KD((HkP)t44e7+9u3tZ+?55aw_LfQs+seG)iCS42{;41 z5fLq=wb4>A0aqk*DY|`R)TaTqFGF={fkASY>I&I%lV#E3s0BrPS59cZaO@+X*-s z_qB5$xD?z>UlDF~no$P9ZqEFR-kLYg`!rC$wTALAW=~@_G$m0&^h_>_IGohe`fI_M zH2e5H8JZ>6tIlgoZ4j$l4T~t@uHZChNid}Yumr5Z4Pu)!*6fh51 z!=l8a1@llMQL0KLXJI1hnY7~+fePNLnb#XAu4vyh0b#Q1pKElIzq`aqHYf0m(OuT$ zpaa`{rq{YBHP=AC$$%V)q}gJkf=K5JomFi<8u15UNwF&fgSJ&Rmnr#1u?sdt&@2pS zz?n*eAn>%CV;fEx$@ky0pQO2=%L>M-_YZxJf5I8MeUrSTx281JTBZ@#?V9rT%oM!0gsNfb68@!#Xs6jAF6-*n#H>0u|Z4Cl#`FuinfmD!U zQ2PKJ$(q0fH4X8Fq=lL<^oSlkXmD4dL$E&QS6Cj^AVLCd@gMpET;!NZ=-%Rf05h^q z=m6ma$aC}X-eDf|Vs;7XdxO9Z4?LXyq#*#pM4JNtIYsx>2^oAZ34M)OHF8+G(q6K% zMrWg_wAm+f?7X{sAOBJb?+8J>XVkf43k(e2NJ!(gE#@*S_2B4ew2H(?5Yr{rbr=}) z|7%=8)d=R0bkme}hx6Sx>-?N|XTNFG&{N0I$6e$QTa~7d$suf!f8ZHUR@JCV>46DLZ zkz43p@wjS$USnNImw{kfw^P6Q#asHr>a;*V=>yvQ3r}GMKjICGHNkFSJuu;N7P3ex zXM64A_?BS}*8SDgk_Dr1eyFY6MA0pEuIZb=P>g43Ldt1{BmXO21aWW34A}r1<9Pm- zQrBhc3ejS9Z0YKR3BFR3tx=`;1S`E$=2-h%L}eI6v>shp@7-bR{Zf>;A%JA-JO#MG zX(AQ`mgq!6DK4YON+=iVlkAR+%$f)saMMCak;t-+3orzg5NxKaMGBch5ZpQIZqBNR z<|NK&N!Q032y8RdknTvQ%EF5ouJoHh5M;tK$vbzJa7Y>)1y_NVYo{nNnleR-N;g>+Q zIMv`lqkjs#t&tIGl9{ldsMKaBD&1sz#`q*>vw11A%CtbT^pmfwa(H++u2)j|bXzII zY_YSwST2mm4>r*l!gG<;Y8=<=*>YaAc&JChwBwkD2=d^u^6%G)iO765U$58ko%HOC zDQNe*C#AFkKoDYU=K)dx?S4ZzAKna5D-7kbGf*nExH_f1Y?(5NHB!u-YKm~H)rA|< z0(i2hCvm*ST+pGYF#1t6RSDY(R1as`n|BOl0(Pi~FzyYj6xEJE2G}ZOk!MP!h!LQm zf!X^Llr8H9^COs$dn}1I2@)&?<8ZSbhJ`A+#z!R!q^0T`XHmfTbu2H9Q=HXf~4BZDhX)uUi-*bmE(o%3k%OLML$1iCUSI|Q00_sV^y zS*8jZcFqe$Jy0Y-&m^_XPN+NDr;rLV!xGN`!wELFd!G7#4^>SQ^*3@xpFgpb+;kTfTte5BvV>invfjZ`u zQB^$lnb22jt5#&!sHL=fPt^ATa{0=jOW|YKn^Fdxd=t`WTD%k-Fa(uWEQ)#XT7k80 zO%1Ob6eM|Qh$K8FyjKVl2$FQwmm37dV(D-C!2@*)z%CZS;J^V=0ilhAIRC+r)wJ;d zAPO%{F>B=(H`<|-t>N%hCch`w?=eJp-mE&5MSQk=`38P;ae;s0&>^<2PjZ#DB}yTD z)p5Q(x>BHe@7g*-li$I@gJFCR56sr}{H=BWp0agCS)TOAr)t6DX|*Odj3?L?PPN^* z#0V()d%tnU*8Ah(nR<9pYb`}h^4>yA0mu~5-R5C6u8|E35CBG;=g~)FqR%lH-9>3( z{|qT6JWf$BRxW_DjZOuMBEt8AJ=q>W9P|gSBn2~)!Ipsu!sx;O(riuO@WLds;}?c; zP4uc+vEpYE0)93$3%AP!BBeSRHjbxU$T`L-fEG;_fS}7_Kxt^Fh}^5V6eI7IG%f7c z@f60xDfbbv*cbM{_ghB4-xYwf))>izP(F`}H`C}%KAv$7K# zJluc{txSTCb$5*-<;uv0x5y-}v6iX{*Rcm3AAC~G zAmvH-uaKOmpXqU#E)6VAaWv!w2NVxz!PeQfmMFZu15s%FF=It;>!adSI6JUgT2L5H zB4N2^K@%k{p$vl9ieW++PtKmuvP`OyQ?ZMz1Zgz$%iO&gmbM7ATy`Sz_HJhG{p|ew z13%=0KKWBV>HKW>#A8pc``t61ao_pb=@0zCzkl;ve)rlPckFgMcL!DhkF|E=#*^>! z!WVwt=YIb8eed`F<{RJmw0oYuu4`+Hq7$HXgZMZQh`_8skCqRN8x%Mj><$h!jbm7pY%*I{RmhB2d}u(TH5T8;ki5b|yhm^;m#dy4R^*Vv-m1O`&539* z)iUT5b1X5;OsdH^ff*F_OUSPl8-AUuCPkmL7MX<6cHo`{8z9vay0z5nGMZkUMN)7X zr-NYW{D9hJ3|Y{VyW=UuDpGg&ruor=-ELjiK7yZm5cAsv3XMe}1pP(C%msjPY!@Tv z((YuWQbw6!cnj|-I|TudZ-f+#oa@;>$Bg`(p+GIitNu4pVPIL>VR1g1pIpF7pO)Zo zcrL(7+;9bXv4@Y3DXJrxTo}-3qO}MTCvrC(L#~zu2*PbVmHC;a;SAu78?0xPXbpgyHzIh;$K!$-$nf0pWRPL7CR(pO#;`{- zA&SOrJvHKr!3#1u!{i$wPLgJbRBlpOplX#fb|rTfl}w)wnuntruC!Le2po1$24xoy z;i`_dtU||&I7Jk5sar$N6$s9H9NH`wcGxagt|w6lI7zAQ>+SW%yZVi0wxAi%ld6Su z@w=(@if4HMLu;6O@7`C8XNXM+`h}OQy?(~ML_%~gsHL<_a456eD7e}(g=ASMp->?tEitCJCtNvI05D(7g&J-eSOjclmQZMLYJK z&Im)(p~W_*^%1#6SPK}OfpK`+YJf#4nUeZT78mN0O@|F|GT9%;reG-xSm}1P;G%D; zp{20NzHF8}ALopr+0=aM3#8Qo5sU^8@FBI4P8@Rec{~Cc=E=o?bEaWs4)8I;b1ymB z!{|hNg)Ao;K~Ay*(>iUPRm5;P{bHiGnMzmzN|43wKhrw$o2gEv3W(ZyF=+Oo8IRHmdB z8SnUDvn=aw|N7Uwc6)T`lRxEC-}~SLzw)cUc6_vT_oK~bw>w+AFH7^@;CrC0j`P#A z_4NGSd!O-=m%bRjjvL&co}HW7(aFhnY5U#Y*LAx+8uIDh*LAA*!S?^Z=Hfzgb zeLa{_#o8HuGPX{8FteJW&^)CWhB11vhM0MYEHqXNP~9sVbahyR7ICfRP^%wk!CK3E zfE61rNGWw^=}y1HZl>Lb=^bVER^$EAfh4I~iB&{q!0y$_B67>|$i<>4A>Zc`9P-?B zsT_}lbASTn^MX4C+z4o+Q@Qf21vVgxkvut7*d(buEKQOM&VyWM(=1)~lZ}*vaz;Z3 z3Lc}En&~KjVL>fNMFFO)#`gt7s%%NAf}H}m2B1Y-Pk|*O1J_w&dL;@N+tZm&O6`^= z8tyhsZL?{HzF+qYM+rs9YPB%1RDaYe&5JwSfpIm4^N9f&=1qQ0O;Xq4m}%(~J+U<4 zO1c%T%InGAOqaYUSiMI|TuG`3x{&zr9d5d*ZA{JcGD*$gmkiQen_3g=-m{}H$Mj;3%6X0R0oh?iD;&IaSrupn(Y|YV z6IjtJ2Zk;=GWwu0jLL>6b%l|kdSB7^VC@-GL$kBf|H1;0NNGhPbm9iWI%VxjggDAd zO;U4?Q96UgPLNE9L_s5w4r|L5IcWHELZL|sV96W~RY_^EkhRm)JOyKUSmBPkv~nQP zD%j~ykv%_RUsH4l=`TQ2AW8iUnOHK$L>*S_g0-MHRj64I-u17gySQU;YF5@sH$?U% z4of-=t8nzFo)$-THRxk_k~P1n>qsi(PfSoj?|^*eNRkkZgC+zHi6E@K4+?)vF|N{- zAJ|qw6=HQ2DJG-RaS8?5c<#vXsXI-lxJkvg3i1*7rj}fi3SkrilGg;0nZ=T(=1Z65 z_Vf^o?9!NBhyF&2zz9ItIGDJ#I#ybdlP|T)sT`3!NTt!FUFt)kjp@B$SBnaHtZCR| z`nfVx;@U#~mYfS7pXrbm(owaSPK&Y}BD$n`JISmDn_jKa1uC;rOH6ryV6YPW@{rUu z1Fob-o-elYQYRZF6>d8}3iL z{=%80^~b?AvS4IWc!Be`~H23}J#@Aa@cl{BFs{-iI(#@-r@CuY=TIGqkn zqoHfW;2XRrX3+Hn%5aRUwx=X55l=B#wRRe_lrEblj>2;!B{&(959ADpt1GuC9VGj3 zD;b2j8oj6o-1<}qw8Su!9hm{LIvrD_pBa0Nh0tc~mV`+j%U&rjWV-dDIg)Lg`xi9Sq?zU`} z&GB+{Y~aNTDS-$r62J=~sMsgI<4Fb2YjqVlzgfh=2#FfHFfiW~1S=^GGO(&KUfQa7 zkP{KNdep&a%(V-Xghe6_8<%EO@1{_M$}%5uG@&Yky5c3FHF~bZ=4PaE$#p|X+2VEwmLp3k(8U}-D3dQmh!#vbRnqtAvrX(nR%Zu57(He&dsVCn^;q<6z%*K5; zCa6s)PhA?UX-4JJmxvEq*cPT2eK@XNLWE?hr*RZs!t$BD46ws#hus;^H{sIIw9;aY zU+7hwxBy8Yj!b&Uy?hJ7gH-_&)JyhpF#o9zjtq5NeyT%>?Gyau-%RntV!TXTstOe* zHis=mG$Vh}MAI0i*I_9nX@)Yi>7VPL#HVJ|Llu41vfOo?JoQXp3;bi+?P{lZmmHEg zm-@Bx*Tr5ghN>~ogJqs+?F0p}aVg+2% zWrK_b;)oI%=a52paeU|!vg!22*_&prmtd(11I?XDRK}w8HY3*6W-?Y%ZyA})9Wq|j z-#Lbf{FT{Fpq}$$Oh%EXkUhuuR649OtVdW8px2|tGdV=7`k(<7;+UGX+6d)1XU!U{ zN)munFP~&Rf-n){R0Le8bTZ)d_MC(Y@Jf0lj2g~La>A)tRA;;-cSwn+lqDZwr@}Jz zHyCaJpsXo^t&D(lpmb)OQJkaERbeY@l0qx$TySCpX2C0&@PN7{m>`wwQLGsa^fvZU z{E1SwiHHN)$7>r3(VvV$lw7Z4~1B zEWm^;#U`!U(ecT;UbCZ-5^??H7H?mpuOP!{7d`-*)%C_wM)SIM7#GL;PNrr7ArKo&a1; zh$f0C2RXql4wK0j1c^YII8hid>z4_`L8GPMDCap263lM;&1IVXCMSJ5f=KoQS@NI9^IYNw9u z^&Ni|LpwsxL7kVjRj>N7OmYfocIU3Sfg`zy(U@&j!>#cM2cIUO1-F5FPE?s`Q*~T#*thxX#?xSm~G9MfEZXSqf zPIDcD=i>!@+-T2_wp;hJ8&AITfd^iH^T`K%*=?^}?tKsMCh1BjY0Ad9EN3O0DT1Fg zm@$mJHNrV@HOUJ=F#u&e6Ra0oD!r7&B&|D(-jmBrgJ1_50G!py#5claF-u{SDg|=R z5e9NS!pVl53=^u!E)qJNH`_FH@7Azg+SysxJwU;gnNs=(9B9+(TDATOVbTdPcGh#} zw7v{!OVdLHo7(IQ?o%0vN|0!VE)RA+kdp?Ez!`CgoKmbgZuuU^k=1L(S-oe+md+WM zqcEs3NqmGleXyhPnjNZkjAtz4HFWO{OQsrnI{XvnL{;mB*D`64DRSy#-!lmvYcLhu6V4hZt^Xp9PPq^dijM< zD)CL9&7Vx?&2WwU=>pEuCB;d{l~)1DUK6h&fO{T>i-(eChFsNv1YR49@Rr>&BdKx}@p6oH%#l~ohvdtot5O!=DUrQfU_E7+ju1gw^$G7Zi&2P22qC;?pV1F^e^Nvx97%6W5AJW}nN!ku{~NV?1B zCuSKDx#{xe;=rT3u*rl~vF4b61uwIxiC}%nxLMji8{W9aUku_!tg(zyTSR6)H`~QJ^0vp*%wEm-p41XbE&cd2TJu7(AECQWQe( zj7sD^#q)$#HTFo=rixSXB_XelA@ATgLzr|2;|#~Zx%L(L()cjU0FJRHWKi}SLm5cN zECL|IDBKFm9;0dttl8Sv{mwR9>~1{!Sugu9|NNi-o!@-p-~8)e_P(!p)nEM5zi18L z{?EVV&;FUOx_0^ai~qzI-}9_z{*gcOxi5X`i+f+MTz}fDfBBbxpAz`_xjhq_Wj@YRWEzdOTOXX{k`qUWye~VoT4&nwayyCYu5T$ zDLy1w2|Ke)u>obrV7pj^BGG3GLBT2eJxA6oGqhRKjLRp9Jh#30r!&cLaK zyNWLWvL1n}`j%_6y1dV)HtTpKZRN7EiE{Zxy0KAZqq=c`0273##;0H=S)!O9byG+- zBw;c|o=Ywg%!(+z%$NsXZ#fOZ^{W8pkJ zj4O706zD7i3jGbR>Am;ykPGLWDaag{S!A9=3~iu+_4N#A>ocGJNiTT*7d+#cAGzHe z8tAaH4feu8c>j0+jPJaSkuDsakTCTE<~hvZHg0=L8#embXv7ekERvQ1X6~L&D+!jWWjcUwoQgx-^3y%> zf_{KtInk7t@z}T%PfHulQOMNg?2xFGl%%dX80sX03k`+ziLx}Q_rW@fr;rnw<)~Ur zMq4Ae5GI+`=11dYYTBkEK@dSpcb;PliKp7T8LZ(TCP=COesytQC7ZYC1zUn?&!z z%ZrW9U5^%=Gt9tO$4OF54`d5Ku#>LwZ0~0!t)EpFUg&WpRwzdkU!Lv03S; z*$WTvz0+Kvd=MAAVE|%Djbn*&vgUJ#6bzWiX!}CV-?`FK*fFESv);_rAVbruNIX&%iPk-Uu+>wpA3)myOMVLq#dJj zz-tJfVr(P&(gt>l;=;5gQKfPR!$)9-(Z%C*7J^HQHVriU%Jat}keRiyMRl{Zh7O!R z|M@RCK05yX@B7}feS7V%{POpI?=wE^!$0a}AMhb}-*@l7`i_5b`_?1xe7pVJPyfvG zpZnY^moELzZ@=l}@}Nj5hh7WkfE8hN& zx4-$f-gMW!&)BbLCJ&nIqdb^ym~S%p%}K;hIMpG5IUzKjA)1`PqQmLlS2_M zOx9KQ+%N_eH-m0efheQk8QA56nrp23&Q*_`AnRt4OvEYjWpz_lH*$g~vetqTJ;>p? z54nn>=KO~MYdL*>dU4o_`~^)B$%i%$;IZ()E8bHZrOvh#y4m4BcJmDQRV?z|9MITw^eNmrOqW+_B-I_R5vv547o<$)*)s~Hzx4Vh3y zOXl%P(u|pT)3z82Dq|cQX+tW^mAD(mGLMx77Gy5R_mPtt5LdRehV}gPs6FR{Kjg1G z=l)ObzU}L>?qYPkqj&T1=nxmW2Y(p%WV=;%7WjxOLY#fyU}&~%?CH;Y?&seB{EvI> z>%QfUzxl7)<+Ts7Id?%6D=hLUND^8(#NY&}tR{@Up#TPXy;a6B#TJY@MF#VUS7~`N zp@}1az!%4R-b&vFm5d&>PXBO%F8~6t;?6Bw<;nazcqtl z)CYs$T>*8e&ysC=Zckwp7iWbN^^mQ1=PH8@RkJ?>+`C{A>K7TZbJk*6nr754$F{4C zmL0lGgyS6yY2(2^Lm5#~Y7}>*TVWt0a}Oa)uo+0hMk#AdKr%=cF=B2p7@HI^bm89m zZofb8yR-f2?e+AupP!=l)*5UB+qf<9z+pLF{O@Dh==sqUb;KfcmmeXdRsZjjAH0|U z&?ysH%>ZfUw0#VPrYDzX72 z37UGlrm zh)>hw(`Z0qbd^5>+Ew(_YKlOxjL?zE4eAlbCyNH$DI?*oQ)Cx3 znyTa;y3ueN68R)D8uq0lZ3uQuS$RwXPO3m#G@@(CUEwbknE-b<;`)J{kNTadPom~n zX4$2Vrs99$_hQ3Fj89FbIz|mp3ph!`aZK-Uc=xAxy7uAhlHQ7_5HU{D$pQ3+k{yL< zWztrtgk2B;B)RGUUNzzBUSHRo_QI=}P}W9N)#F{zqwCQ_AFFK9>WBcmzZ=e3)5C7BPE8f`fP^mFlVK!XIC_^h>H98J=iCV$rlgeWr_F^s&`wF&%;a0H zZ%IOo!wuXM!C|0&uE2TVxqEyRrE4c;PB<_`k%Qxx6gBngY0=t!F_q6{r5EsXz#Xv( zwA+xyNX}^2b1iTKqdE$h;i1 zn+m50mmDV<p2$ZvYV^FMjrEq&k3cEHZDc1_8= z!Oc7_i)mc5Hs}AKYr5D+FZjp|$Kcnt?3c}%@Atmm`GK$e%2&Mn%Xhb}jk`Zk$#R71 zKOw(DCt-e24kyP#jBZT6`=Ana;EGi1KIM6Hwnvg3wt+HH54%+OP|&6xA7KyzTeun) z(+Sy3WLtccMC6!mm7ME$E(kG(V#aYIq({4ye$rTF>YW%PT68a}aJYB%$EeS9$_zyd zl#*M=oM^6*-m>80@vI<`schF>_xKQ(s4773MPYYhORk9KB)Kq4E|L(&`9zVhEz3Z_ zVdlM$l1*Kc%VNlQU`Nq6l~jh7AUz%h%)6(+#x*aocSEJ3_&MyN1!-xSC|d6gY$^a+ zs{{IcT(rW%Hvn^MEr?A;k3j?BJQ}LIx5P^B<04+a(bDhVubN5{CliP4U_F7+|M%o@6TTg)0-s~vGZA!Q&fW_lT?tNme?Rt-io2NNrv z^b~SIiE-3Awhq!cJvq8kutdE}wPG@x1Z|>KGJJw|mARD@_^!&H>p=mJ zDBHr*HVgga>nXi!`ooK79K;)wPg%;~U}O^+h!C%yYYL9N3sO8w`yviVS zl~`&wdJ1GnnTPG?ph}!Im4FYtpnO2J5a11UXq3@3>7YMnnS%gt1P;Pk;|Oi6#Jc1B z{A}$jfQKG@Pum{7-}}G(ZQuW0cRcMmullHuym{-%-~O#PZH|uK{{vqB#$W%r)}Qv$ z_kGEgYnS%jU-G^$dCxoF`EB3)4R>6B<}>fP_eC##>C*7#H@@-rUitFR`~1&-*SjD1 z)z`fC^0jN-4NdRVGU zlu^nEU1VlkWL(ntk(nHzYGs{7YsftO}$7gCZaTdC4C1>w4rAdTy!l#^!%>8%xzi%YRs!Rk%SJvpf)1eKml{8Zhu zMr5jWA=oiPR9;q=YV&*x4LIpem5UTLJ7qHkl1yZ!Fx`6hQ8eiLzS|wY z?0vuF#*N2*=Xbwlb24`9o1`u`RtR<=v{5Hw<`tXz&Ek%)X_RI?TBQ5~?J`|)pe+rf zxCB|geAT8{Ae}%Fcj8!eH`QKBZ*p28k+3DLnrjB^GHKbL0m6H1tzHc>EdhGRx36r3>< z;e{`S?_CG=zFH*o2Him*b;TZAgdYs@O=xYJXUjMMtXL#9u#0BR&13IT*~RF+Bc5+e zr5P#G41LUDw32#scc2?u$~y97jB6cLy^f9PMlKQAG!kvhtO4-uSmK8M{O4rnTrDuy`Nl%2x0 z^tkeQ+I^+}d|lk)oi55EA5FR$%sZO5HU!ewbzDB*nzij_giw9$>u_85MszAgv$g?RrO*W8?!o6S%l9&)Rhq~U33NW&~5CIR&W0pwQg@JOT#CMk! zNOV?J=_J;a`-USe*ul9gsII)qZLmkGJBB%xTKh=P=9T9Q)?Ex9|bMV@Lz{V^a{ z*222DhfI{f%Ly`y;VK_RCblE5X$bZdktex)LK~ZqCG9IrIz+-4yJQ9;om4l349YTN z{<5@61uK+P*E@mDZ@%$2f8>XL@H0N^)1LLLd!GB8_qlY()&J!m{g02o_gz2s<3IXG|Jdg~ z@7edBo~_S+@%yaa4a-~K{JS6ju^;n=f9k)!a`oB=e((ps?f2fYEba7c_uFrJ)2lx0 zLx1gufB5l-9=iJ(_pQ4#CEf+VDu9Qb_TF(Yr$ps+*x_|nPFHj}eQuVj4{u@7aRk1y zMI$i>h{{wzd!YN!Wh#SbZ^ch6DLBzFEIyMOOyI-y3&k7`c>*P(7<3vyEN>}P04Jld z70BZ_4HeAuy8|*B`_iWJP&viQPy=SE4o)*=4>6zY*@;w?2!p*$m;~L49>o&$@*Ge4 zNqp5!G^7|dNdZE4kJ4p9SGi(R6>V6hnZltJF~XMOa7A%OE6F`c1vaJt2n=@!r3rvF zN*YuYw=}L=udmTTlV62dS-J4X+?z1W=d+!=jC^*INOv0pVREdC$Qv~~4JDbEq8KMN zv%c>A{OGyQ`|M{w=i{Gz;>qP`a9EPjoJHIKYGOn{nKypO{Sx*CwYFfUrk39)e^KOnlvdj>rO;!P zV>_Q)l_)!`w1%k(sxiz7ODzJ3;`$^DvyB86R^W9e2E`w88oH_ipz@cDhj7TGa$q)x zYD^ZKcjL&sGoe{AW)P&#rB9f?Or3Tk06J{RprI#bw)Kk8STbBR_=I$NM8aDgeH`jH&bbR!j z%iCwP<*4_E_WQS-uD5o5*>1K+*4@2#x3Oonx%ZT8=aVLray8(B&?N?;$!Iz<$oN`r z6(9K65#l98Ly1ZNW`j!qj09oxflnzWT0r(HzAw8$A&XNeMtD&Os88nZQrA#u5_*)g zn?B2Y!aYyZOsAn|ziO^bKv7BfT*eY!tc&WHpkBjPf7wW`}}^V@nb`x>h{G#ual%;{(gI_MgyQ!$Ozser=U1hP=(hXC6CCb25Cwe@;~9RGjvpp zd#HB>3(4y_^@0W^>NLp&)45|LF5Q_4Jt&|FZcCUD!`AVVY!=a~TzMfvk_k;J#4T^4 z9H53PRHsqWW*9-1EG4I)b5-+!tRwnAEH|ra2E>!yz;$^h)v1k{8HAQLZY0>+fzL~W z5gePt;C)>;+wIwY{qZ0D(cgRfTQA*tUt8Lb{_qdJ<;}nSidTNnYv1s?U;6omS7U$|!=9WzY?$!|68c=W z7S@|)9Hx*3dcrUS0uu2d!mt>s?uU#eP?D*YA4S~6fQXxCvS1OeUg$(K&N`1etTK@E zMpnmKLoq&jcpTz#MNh9Gu+hwVa*9fOu+>MF2WS& zP;lV_{sXg$xs{-#z=Q->QA-iDW?aa-YS#^3Z(N$K^J`#ijVI_xZGvoP)uYV+;>&0@ zO3)%?^1kjapSB#N2nKv_C zUkNG={cJrtx&E@3{;8k)&%fsDYHgXYSH|sJoQ6eKXfVUN_uDsbt*7Vk71#hP;K2Um z+FeJ-o88*aZrpCZ-JjpsTs}G4E)KW2*r$ygZD^}CT)J|p_x1Ma=}0icjaZWKw5iIP z#a;3X;>B1f>aOF{U&2lzB0UJta&yTH3S~h@pO*pvaaukWW>rI&s!P?IN86-Y?Mo^! zLTpc8iP9VMDa#Iq09rtXMNaKrF1t4V=U$3?1<^NAJmY+1LMmihYz_i|am@(Z&Y)Nk zq&z#m95;;}X4O6KE$S%61+B#;v4z(u=YaK+fgt;p=EgJ(HXZ_(g{yGICXOJ-5y;%# zc%8Phei+j8WJq!nimCvIE#&D0InyJ6ht$R$Kq!10o*Sm&7TanJz(Uy>ymwz9r*svG zEM9p<)4=&Qsyz5EB)I<@iER+4z z#5^d%uwt`m>*nnC<1f5^<%{3}J_vE9uU;oaVfA5_)f9bYukB(aF z?yI@2L*j(~-m<4rM8@GuE}m1UU;4rHrthtq8$jFDzI7iJ6ZsBZor`|Vmbs#PFgh=h z3mCkV!5U;*V4G$Cg&C2e?lVkOSM6d7x(=o*v-bM2>iuLK*T+`6DF86_pQuO*WmlNy zI83`3M=sw*!s=Y6r^PPp;&pOCQT(qFG0z%-(%pU#r8ek2r(He z#X_j!8jPl!Fzb?%O=eM$N39c9t9bdHXUwV6h_sU2m3^fN5XYQmmS4FJ7&2mJk-$#m z%#lw@ca~Q@znqlDf<{mrw3d(blu%_oUAB-bs~I#9fa{@yU*MQq(O7Ag0OGdOB_H#Y z2Y0&&A+jPCjTKWt@^}sCGXyXu_BA(fsT(ED;6I%efK$sOdKX)1$odrVj4D&4BBx~5 zV5wOn6=-2aeylKpK|;wRGYPD&oVvF}vz%9aFQY2DtWg2~W)>9Zrn^_2l?bAAq-hLU zQKJ)tW?wBztHym&WXK7%OZ(jj6^60tI!~1Kh8Vo`MeZ8%zx)H<{HEV}_uJob{b_ga&d<%- zh1}U_(jr0Y-q+neT-j2MPEM5WRX(sx>oGwJH`@&$(eaGGEe%-_oAP{w54bDFg9F~f zk7#KHJ!o6;iOIY{OY`C!rsWOVjVl-7V#H)kvqh_pGz7)+PIYUGw9sLVJmH5}Mt*iv zL|tJ+bef)pj0^w}^omzzt`E4k7zSWE*M(G$krY%uRaP_8$#_?vNI@AD1;$y^86JW-C3eAxMSRQ%fohpggwtnQ*+h{jJI(D|;Xl{12v~|CO_iz8U|M|r)dCBL0?jQY)*T4SS-Pe8X4(n)T7ETv1$8`5T zo5FbQLKa>b@_C_?u~n2R5geP2g&7-HFYsIy>l7tUL52~^!O)G4V^yfm?NOx6$yaQrG~(`oetIASvM(BdK9lWY3zWZ87~!JfW?5ugpM_8BGNho z0IQfva&OI9dWe&`@Hg&0EQ_OvsLydBYl*SUlpa&>^x&Cp_y6b!1^uX6X@c6^qYe!4# zts5G$ykSF+re%^T6XP5+N-0)zz|Hf}EohX23QS>D-y#x%NH0!cBLo21hkBT9e-C9+ z3ViZ4Nv_Dy=m5zWY(t#{Te=oXr?p?!I*6PoQG?b%qEm%Rf?pgIgp0T_B^ohNZR0O& zbC7};8BSBfl=Bo0m?Xk+T093nb*aoMWtnp+24K`t?b>qSsKd*-vZ3ND<2$a#7QOJ_ zsLi6n1)c9;PHZBu<^Xv$gp@%Vl^XJjXa!}9S%x~MkS1kjlj^1eW(rjXLRrObiP4da zbbL2xnt)Lvkl0;aoO1XyGaOGSD#)8=SFii9)M%1vc#xvBlnm4grI&_Oh%Z{{BIwy9 zXHBFcQa}jAu0qYxap)RO7WaeTbI3(~GOy8*443Fa)kIn%Gqn=nl;L{-yP%-pZLUnn zYf=cMh-IWHiNrJyww#HNsk#TlxO|JeTau$XN(sX>q>>A%sT>_uPnTC&Cl8eqCqY-^ zffAYARZfL+p^DL+G$M3m^l%_B4y~qGW(Mrnb=y0i3u~+m$P%D#0Q0^st+k^gckjM7 zGc#+)M}1vKc;FbTDA*ity;-wnwxGe9EkHZodf&8W<~ZG*T{=Gg!Y}%w`|rR1pMUHB zd~|%-%x4>#4W*c|HCxYiMKT%5xFA)PPl{I-K2)k1dFska>X)7hJjrd#|a9%7U z+#vRt$XPfjk&I8|>V+3_#x*Tgr#y^y7$N-(t2COSW?5`eRXIc9Lz4kj)YCCek!I+} zbF*-h)`UPrGexc?m$8Clp`~XWjRb7v6t-w1N4hlcT=&v$M5#4~z^4feeId1jelv6n|vd)Dstq`tuKg zhFm`ZN5wmr_$+Q#a-pge&lkx%X9gz1>S11YS{0#EwnW)VwECnlZZ)N7+cGXWbiJt4 zDV8Xx6(1&as}DWbpEDUrrEuE8 zSC0RSzg5f`Dnqes`9qcBNL`MZ5(O zSvGy-4w4W|0lth0;`9od1fT;c*Xd~nI??hlXTLQrj-~sjTK}nmo#s=p-m(&WFr*Bp zEJaBh&23#{fI{wcvCNt$)g5w*kDVV3uBru6y@A#e!G+cv&-9)Idx-#SUaz-;nez z)Fk)LKQnSD08DO0d4B-q9K6qt%&JjYfn=L-*APnkiUg$k7|P_1r2q+s^FnkhMh zDn2pP2+!1^(5oQT7~51SMHL%8zW7ryIaTQr2U)^MA<6~xUf9ZHtmp(|J;GCLQ81sp zM6(r5g*Bn?_vh#5$0x_ybu#sc!^GIvUfT5$PcLl&yt};5(b^Iz#o(b~Y=*JBwD}g> z-u);4!%ysXy9eI&p5sf$>)PkB7I2p&7$xp@=TB*45tQaUOBH8Go^fi3H|x5LGb~La zjf&SKrfMXD0_K+3KHB$UAH#FgBFIMuQGY1``r!Dfen%vxY0|J6&XZBb_fg0qN{r*m z8Y*{RfT|HjSHLKxB6=fAa9fC)Y4#XSHRM!k-Eqgc$iDIv>Rl8Po{jJqr;ZExu})N! z9Hne+h7th@FiAULVlJjvuDRKv!Q8A`~NTHq? zfIZ?GTAF#>6KLc-ip9d_=~Y9HMcrhAAn91ajP>nFpJo`3SBJ&sf2$G7IKPiMFnM9M zW!l8qfOQrG`;M6u1ENN#tG=%L?a7^&ue|K`&2#v&?@MZR7qVLeQV0~^xm<9Rq1i|R_K`?4&TP^xU@ z<;849C27cew7z-l)-3>E_SIkW{onfoSFc>Te&?NE`WOD(pZVfH{x`nvEC0$@{EdJ2 z{XhKncf8|?#~yp~$tO=P9WBcO*sUj@+?}3c*_>Rtc5?md;+q>c`^{UY?$~TL@YDCc z<6Rv%xq8?3__+6d_i>L&Zb{;}xYk-$8?z)5?%H)(c5E=D`y9fswX~_MKNoKW;4N+l z(izQo77q+G{R_bZv4L(l%qrs6@L9J+4)K|y*a57_$UWl_L_TdJ^-jF#(dtw@1zSn$ z^cv_I0Bq<_^_2k-jbQZ6r-HM+a7NyZBKEuqhBASO+#OS9$DT%uakYmfZYO4C+8xK6 zNAPIo7h21A8hjM+O`=ZBQXota*ron zAHJdhS^$;wIds((<4-3Ip)K*ZJA8%j+#Q{TkK$A%$Fg}^I)F3I1S|9I49oQjKSH)& zxokiYR%;9PE7lwT^aGy#1@~>2hu*cnebb-utakS?o_NU4_PBh-pZ}bG*VX+y-f3@r z@7B&g|0U0Q^ZDEV!9!<{pIqLw{knEDW4=02aS%b$R2fn=3Vn#O{n6*I3tj7IsIHOa z#ypSyi{0q z+!8J;Zeau$$|*~B#nET0@?;vy?!XE&D)5+sKFi=g&Ms>=ns~7Kfu*4isrFOnHG4#f zr|GIrm`ZC;!&bzWt7Z|SSvFrh=nsAk>E`h)(tD8yh%x1y%8)XmI`BeTp}GjILw&{o zU{G(VLo@Tr)}b*l$TnTL0dg|RgtPTxh04L zPyJPcRQkk?qA}9k$zlN|MUpl6uu`ZEaSRhm>2s_kaVol^Xg!yFIEmaQbkSQvpKOyA zjwqa2x?EVcq89NyZOrN{z=BBDP=tycWk{gJ4~0aFDIM0Tra3Ws%tf!*%Ul78!3{A8 zyWMVCHb>h{4*+6}TCtrZGN>g8F}^c7N&-ym!B+XcB8YqM4RG&od)x21`*yo^y7lx=55vJOR@ctCN9d;{=lSUHB3cT4cwgKWuZ=K@D#fe8L~!Wa*bR;xll7p7ipYdsoxM<0mTf^ zA@0^V^ddo*igRjX1ymvPq&rBT!n1a%bXC@21?J?5yLh*wnas{>2By0oY7&ijJRzMI3)?e=-U zd`JKDe`f9j`hoSaICTi|`uwg7(Z*M9ARcf9@R${pu#`klY= z&Ub$7AO7gi_=L~?`n&$gJKpwNKlbqB`?DvHu3S30baHn4_UY-_M}PFkyy`<LU( zj3U+t2IqQdAI4*b4SV?A1r8`|K9{^DO~a;lCF=&s=%*cr~gdCeUV2E0V=@6PK zX8`QsYn1iIeN4Peqf2TwDBq_*%T_t@zx}+WfJ)1X%5qO7b==b$>r2(w)0u@ zx8+lo2gIqQ`G6X~a2|JPdmU|{x4M$d`NxIv&%-aN`#2+;LaKb4cs8yttJzH}z11!* zNNifDg6p98F=J$TQ-;X1%%&EY&iFjKx&^=w#-qX?4s8VtvoOuxh-NV61VtW`kmuoh z`g3{t9LAK-jW93wP8zJ@DQ!-Xal}ax00nm*^d;lZQ`5}Kx}H`}#JH^B%w9817%&$2 zC_$M3k2W^0!grOtr7F@;6Nm&)7I0;}hBHeZ8AdZDS7L8PkzNF?V0sL7+&ruym_@0J z1jn8zCFw1(At(W}k&R&oiw~Z0)cpuCuISiI5^^YOW&1vIJhv2w3{nm!LnxLqf_DNv zb*y6&)J#CgaRWJ{s57eal<`rX7@aa4@r*W@ALwJ*NQDF1NwO$=WWCp-x)YvS)>=a* zaa39A0^-@LNaPHWCJd6JbwfZOk!faV#SXVn+j7+guwWT|xex269v1{8JGHi}^ zy7ohXoErIIGZl9drWgYdJ}48M%E@SpUKEwaMlO(wHK}3MG*Pi}mH^mYel9Qq5LhDo zrB`;^6X^58cXybL4OU|fBoiVNIC_TBlaW?&W*~z3*{1RmOz99d z`@olPI3I}9nK_7MWoaf*CuJ1U#baW-5E+!EM=8**WD12!6js`B7 zi=3ryTJfk!TXb)L*`<>c07pkB$5*f2b@$zmz31%@J^c9D`T4TFwBJ4Q?B_iHyZ`lf z{?t$X%s2j{e{%EDN1ySmXZ?+@`DaI{ht5hd-gkDj*f1h z@4n>E{JBs3_>cLZSHAy~H*db~b-(qc|BwIY>t6TzYj<9UuVGfMX^GBABmsQ^1Tv9> zDq)y9p5jA@bwu!wd>Q+2tC0_G4~d&Qx*{%zkGo-v;)i>+ zvf?y+z$~%179R@qB5Dq!79S3fVM`wXp&LvX7)A)x&4LbUlrYR;;5J>G3oir3T2o1T z7?q7nP7yx|c!O}vc}hBhsqhxzB1LV5!CR^DhTH1{(Wco1%6lU>x9-Qh|%1LZ35{+m;!(G98|zg|7se8GKBzqa3)IQ<`5xZUdlYq@{T`6Aq*qMm|6eadk;GweaN*bsc=QJj%zQfP0JZ+_H1qp?CtZ#| z(qR9fQ;52dj-T?t3&{Kb!|On3cJM}%IPe&s23)?L{Ok8=9CSrXSGA~r7>csx$A8cy zCRP4_DV-{9FD=yfrK|bG|64uS+z1hO{*+08hmU)dSK`acnJJU-4=1xT*eU=%cp~C< zjoOlIknZCIDvWCcrORl6m_FXJjvE*@%2#Hr5EM~L?30IZQrUwQ_vbO;*R0T4 zx$40^#~OmkDv*ZmIsOu!Q6AY~qDCfWUZ*azpCMIkm(|6hO?5g_%tQxMb*X-0^lC=e zl%zxXkv<<#$P#kIqXp2)pE3OsE>TfzCw8~>V zrX>9f?O`O_f|oi zvXDdZ?)&}z%)9x{`)a4Bw(IMsd~*M=S8Y4S16`@y=B*8Qb%R@D%HZyfzVa@G@XJ^1 z(?9FVD?h9~{=~UqY?Ba&m~xNqqlysMLKw!vXcKb?-!yn??LdYGj0@>;>&C6K8}EJK zZNJmklfUz~|JEOR*-O6n2Y>LP_rCiD&wu_0zWn_@_!X}>vUR&X`Dg#rKmO7${o)__ z@t^#R&-!D3^pF3Uo43!u<(t3pGXP;gp1(iy(|6}jJoeb*$J@<+^B4d8e}46AKI`-U z#83XzFMZ@ke$dzawZC%TefQqHdAqeO#!XG+R(vzY%j_~pt;QWnU%`n5{*C_^bF;36;-#_qbd_vmWj& zS79UJ_j1kbcatXuOXp=?@rGfDb>z2W9L*TQMj&gg$vs3#adgAD=ee=$CcyHwk9)Wd zuydB9^hSaPT}8Hzvd%MHT0jce2Dl@qlt;P}u;p7WeJ}R{_T65%Gu1l4Ly!;fPWczq95KAA->TnR7s>P0mM< z7JV!U(WFZ8&LpP!S5_fYHnHu|zs~;jU-G9t$NJk(_v=SrIeymm);rG)Xg;1PHRjsgb&v z!&mw4_bX43!`X72X64;ec9FIQD1UwG?w_(}qh*0JkAnljoO-L7zSVh5tk2P>>!lo( z_oyXB;I#>^r%i25=k?mgq@=m690N`5KyVW&6opqa{C)IQZO{iO6J`@K?GI|@ps&Lr z30>Usw%b#hSu7>KD>9yBp(x6Ut^|`vN>knP94kxm2Nx{`$U9J$f2Fp}v8fgfLVQfP z8sOc@nu+A5%Wq0Sli_uMX#AkseLS_yWxio`G$_uPSIq?HqPAK;eE#cnw_8T&d$y_ zXNKj%3ZHwYg6HtkBB4*+8YG*KuaKz-?KSxl{dj@UQS ze`6sEJ+{87RvOakon|vc+}+0Y{4NCoX5(21HEQ9c6C;#G4;reeio3b{+IMZS4mZc? zIWC>p2fTmltM~4k#mvS{OcDGm=(VXsgQHsyu3NX8cHdpL?tJaBr(+n(m}qzOj_&Yo z6ZW_P%QPQu5RyM$m~KpO+>qc~zvUl4{N9I7&-$~U{frO#!1w>j|Mau}(>MK-{ceY) zo!-8EYj^hKlaGA%XMMqEe%dGf%kTW||Msi?>O&7c1o&^g`M3YdSA6*sPu_&@&rWYO zv%mSb|G~HXlYjW+lMlc4*I)m<=l}1Y|9St#Km31x^LyU)pKNy zg3^Oo0A;w&V!=qa9o$@L4C|X@Fwd6AV>CCFGRBQz$h=WbD!VNe2ORLDc1{35i&~?A zoCOQI0No?3xxsrrO(|_+Z2t&*EuOAwg(8qq{faZ?#hdD9knNKY;~BZJg-a}2iwigxb^Ijga1;Eh}T3;`2rBgaEC+WXK49GD34kX_Dk5Er;CTY)4#AkKeuPTz;Ha0somP|-PpZbYp2ayhk^M3 z!wjFMdN|37q~_koE~Ldq?aB}rH0peFNSm2evhYE|EEWZj-!IUGOsbBq>#0AyIb%Iy z8Vo-l7{&X@#PMX$bdms7>pHF%>+{ix2#lBlO;ylm`_SCVfv8R6jdwxpJ-Kk-5t5)gB-D% z%We6}_RT5|71F9XikyMze#n*iU|p#ZC@E@^2hj?+Ov7LxQHlix_LdfsD>u%iu$Z-{ zM5LlJBIP&Ah2kudCNCM#>4w8NgVKkG`4s~814xpf%-p@7o}KRYyQ8C{WwROKLJwa* zaA6Ic_wAiO&p)!_`1=v3?5MT?40wf^VZUE@r|0|qUV|urnK1!?C=^uu1{i9{t)vJ> zo8|B{j~KQcL?vacZcHl=f+ziRy)D|L!&WI3$Oju7IllsSGKXZw!!%x9=|JRT&Trbv zUUe9d!GciOj;{W**pDEK7pUfxRp=i*U#yfd?JKzDM3>~mO2>3?qQwG+I!o;P7;!dLy1u2O2t6;);!1QEu#0yG<=1P*=Yxz+-}tTmJkiDq!L zu@Xj;w@HcRx93hi%leQzfQ>vrUI>K|DzO`q9=LCi^&rH8Mq5gB$go0%$&rB>an+16 zl20gn8MVV0Ra8Ba`&=McLk(h9LpV9P%BOJs_Y5+9`pMa8lS9;}v70QZdtKyK;Ru4jf z^e#+&&26<(fF12n6t%EZaFoZCbmp*jJSk#2F^e_RR|N|o1$Z9Ni&GugZ|#?Jv&(s5fj8l8MZQ!*XZ4e{1*G!Gv5$#fJ+fYkC6WsrQ}l>5?^Hl`Htfhg~lA}!jLHl zDW#mzU|!vP5!@oSSogczeO)%orfoNyZ5w+<`QU>*%MszgK{J$n>dE-Kq_6Rd2QGR1 zFgNqw*S_xe``-JycK2?M>B&c_GHNL4w@lBb@Lp5U}b}5FPLcug1;%9&|k-9`P5t;KOX`OE(j?C%P=}SK>SogG3PG79z z6)m{nSyepQ27_k=YeRG8%t9tl9Y<@O$pP z=jLsH^wGy#yVT4ac5?ahV>fPWmkogJX46;f_dB!WwmAZpvwe5K;;F-Rk2N90DR4md zr{K4V)=ALrfK}4T`B0G_QRP(hmj7}u3{$f6= z15CT4|7z+3kcmy9MC#eoP-1KWRo%yR86Mk4Mv823-&k%?Hg}Jm34oiU=NgNQetg2& zTI_;0i-RN1Xc{%mZdiT7Q>_e@5*?BfO8CV&7bz3vc^(a7TrVWt*S61mehT?3=H?W4 zc&Zt>ix^sBK5h3fI3MHUuzJypgNymueAj>hvqlM}^4t^wGc*mMO=wB4RoswMnp{{= zoa|dE%*5XXhS^3f>|?gHxCQK}e>d$x1gWU3H>(*lXw%SmZJy}Z?>jnt?RM>owL9C% zCEwm@C&%rf$8VinJ^B0pVDm|zdi(3Y)c@@dE{=YD$#%Q_Q9lPd#uI8*xNgxrWa7mh z5)mlNFskj*$>!)}(M5#Na%GX6WJTaf(QpnE##2Z(n)Q}nO=SivCwm>dA7?llHspP~DM?OX~d2b$iXz*;Rv0LNx zOLB5>8mC2BPDPK4<1xVbXsY5`KEUKDqDSo;7@0?%^0ds`BxtAn8RFGzVm&r`%{nc4 z>EYT@sYUSE=h=v85Wmz_xb={wz-tOL0<`*EzitK}Bxp2ow zrly@tbM$h=@x}ED?}cNPXEu{-z1r^(Q8eegp1iDg9GZovEk*VNbz}^5WfBI6KKMx~ z4cA&h>@87HP}X2eM;dnxEwjC%?XoC13QKO*#!lD-G~yp&U`}Gvft1rT+$|{Ro@7zf zkeLd_J9(#0zlfA(r5)piAhq8i;oMAR++b3%JdRfoRyGUdG#MZrc(7#_l;|*=Ol~!U zr%vM(-Jf!tJg|7KW=kuiA!U9@3$Tz8Lz5Y$!(Z0({c8L3-Kn89%L8QR$qt>3Ja$z?pZx%*^4mOe zF)jmosiim#joEAl;huw_)6>8vk2uIuat177@VgL^MF>v+s}VKb!^UOfbgE+eW#LRV zT|Av{qcl!;j?YtQdAuq2n(DGKS4y1m)o|9Rw4kWWv{5|E!O@Tx+R$~B94LXvT+6Ey z&yK`P{yTY>DOWrw*=rS+o;QRqOa#iDEJrf3EvajMnJ{PiEXLX?)3S@d^yj@3H~OF} zmYEJ-g#B_YAsK97MQd#{GMmNvVr^sCZqN*Uj&#Q9i{sJv_+9r|@vjO~gD1NC0@&Jp zx5o;%219ScZUR+EfweU^8=F3cLUYE*1(K+!3L``Cec5gSyyNX}``zDt*EfE{H+=jj zeBu}U(a-*0zw48K`e%Q};O%&0)|Tx8>~G(?eSCyF@3{xw+h*&1J$>Tg?aAHCrtR?9 zZr!^9OLJd)?`Xa`+8EIL9t>#U&dv5jLpVe60SfUXa_tol6CI+m!p0L9$_y!2h~L7B z(m-b84Lr1j++v#o<2+J47h}tCD-R4eE=waB*pp|Gp^Z7THd*GtR>&V9It{1KHGX*( z-PU+>T?o|aHC_8{=%xb%9iERK5^)qr4lye4DCiK6cgYw)-*@H`;?W%2hZSZ(U+=G1Gys&QUIXQ%-S}oSwXm)mv3T9P z9^qvDX$=CdX5!$HnB;1a7TSn!P@7K)N=bLAi!lvj^vv{j?7=+96J*|bJkk(KzXk^4 zF~O2cr(aYxWWvm1RRWt1&CP0FjB(Eang~ySw+b z!`GT#&qWsgoJ)Hw{0;B6y!N>iZ`}>nO+K@RqOz(O$=FB)i?3CGn3p4~o(sxn6e2LU zv>;C#03D>{hJsFc>y*8xptZCcXT$2)JI`vp)<2%YK9J)FyF|rz%8c(jPW!jK^1@MAHDRsi2 zmx;1tV%qR*1TB=4_?J0hqP;27xNe? z)?#h5jNKm%i(y%?-M|{!l6dQm)^L8-|J8S${qk?%tG|5vg6C~~T-&k&?or>ROh>=# z9{ato)@`+B@CKN-rb+++ACHnT*w~cD@mhLDa369b`%VA&8$aSBKkn?tLuhbAw{~=N^rJui6MyXUKmD(N^;i6nUwrlL$KDCx z13vH%f7Ac?x4-}U|NTGyroVT3dV0RDeO<#|9p-kv_VcszX)t88(1}WoV2NKSR6t+! z8}3u%2yN4PmxJKA+u2cV|Xyf$Ho?dY)nR71Oz6x7M?Q36wxf9*)Z-E;=BhN zCpdOKaO$RpGax0i6ISR|88noUWcA1t;26=N=_rKuh?AyTRDKpmTCI8vhH|t9xA9D9 z*Eqo{h|x@BFA)tHSTHWJ2jYK@i__%<7!5!HQk>$6*3r)x^-@C(5D0)aiWBTaMIc2K zeqcqMS;(=WE#~{151*et0l3*RMoLo`kT){P__SGbJ3d}6-{~t>plvsAc( z4Sv4IcC+rzw^uJO$D93oAF>aB)%NqgaJ_o{_(MN&`Jj)*(@swRyT7u2|Br09N58&r zzjxMPdtl9t(IcX4X=fBi8ZiJ^+a6uo9G!Ugkpo!DqL#U6u@lvJd@kQL;X<6^nSd1J zoUlhc>XWK7>-W@2AwQbaJe_P(-*~DjS=lj-fU+r51f9;|Wmgmzs5Mxmfg>DZM%{_y zV;I?9jQ|y7Fr45ihrJWrH7Tv9?8KQcw z9|%mJC|^zk5u-AKc&a5Z&Bfid#beSG@^4d^phAXP%nc;QAcH|T+=qYUh0w!O21Uk| zzs0#t5qui6Ptr!+dcfIc#GU(QU5eI6s!0hj^04{N0%Gl2^y4S#r{&1#G_{{o0?h!$ zJ;g`~#dS#{xnA(@laFu!u@yi0Pm6DiNf}&Rgx9nLHa~5F$h^WFddff!xgdfufhobf z)KuzwT7g&fVq$>{??V|A&gJ5~bG1UIP$2z60ks5bQ!fsdqT@#i%px+*l+Mc-bX@p@(v!|C)L|9Cgt>X13=wftU6cb9oYEw`)EO|X^d{#pMwV=m zz#~*;c+b>x-hU%CskSDy(FdIqWE#MdsHY$*?1!nAM_^`_rC_%NxCvJBIGP@XTcS(W zjYv8~LWk*Dy8@81)@zoqO9QW9CMF#pc2N&w8v|nfcsdJaB`T#}1Qtfz6NoZ4o{av50a(?DQr8drgfL{G5|WSsC# zC_Oz>XqSa-iD!;!nobelaEVM<=D@hqU{FjrdtO zAP$4li>wxVG&QC<>U<(4i&?<98-L*@x3G-EFofhX%@iH+w4wd}$w!Z#`9UY|`%&JG ze1DGJP49c4uWN^|-dFgZKG59Emt)(UEY{B6^6LG2et9`L*)EGO+lO!5{P71)KH!-r zCugVLTDx@l*7to^`w##2_{ke~=iRrzUNOA3w0 zIeX*bY+~*RjAY`2TvZCzO=&2wd`eIwcY{)*u=9<;F)>s6@D!-zm0<~|FytBIaL8xW zzF`*e0WcgU$VKWG^9Wj-{`RUup^8*6P`lbt9R>}@O6%e=tA9}D7hV~!PemGEds{X~ zCzsA{-{d?G8le9uz?d-cqNo5?iw+F|Vg0p(LsFFYCB=nfa0#Ng4EZlZUNDd?)0QE) z{K~!ZKxroxq;)&4i6oBHaY>lDM0i0cjOAsZIl?mB!)UyKkb@gRDzO#mW^u60!ui%E z<{SrCOxR<%BEWr=TBzrEI9t|u$_z7jm_4CrT3wBU6v>fia_ow3Nc|i@%wU{X^7sP= zuR)tSK2TkZDZwE{FQsM}?d6=Tca(_+G({uTKNJv*1}E2=(wk_s7|jH9zwhgS6Ar_q zLw2lCk%Q-WLZp^X21hEP$OOp|mXW7rP+dx&h2p$8wLw)6E!;#5=j{I5!$|Y(f@)V`O;4&67iF&l3w#8gJA_N~-;zu82 z)-f@ZAIGz{H7@3II%1&;r8+5`YPpQ4iX{_w6SkQI z%x2FP^0x{%*&Gr#(n`coZeyQAJZnl&s9ZNai&v)Fb+4LjViS=^fU)gF3qJwI=E-?{nSx9`k+-TP+Kj_&~A>uO!s z-ofDJ9p167*t?I|Y`a}zT;sy}7Pn1Z7NC!(0L61aIA2FR?ZauKL%EGL)((fS8=yb% zz=IDza%+FS@7COL<&L|*;eY(5m%sn}f5NAH;xnH4J`X+k&?ArEe(&RtcO2c?+1GyU z*S+Ppf9vbM_N)K!M}IhgU;g#iefH=5$)EV)p8zgD{^YH9z31V*Ijr>#`1Vqbqm@dzhG1!E%4{;oKm&qzCi22d}C%;T0H&e})p!;YKr zi_JX0}^;z4$Y){IRcV zSD%UAeciXdL-%gJ+UmWd?;We7506>B!Hx_YY>&5RPxPPs*Xz&!!*+CYdwjVsn}7Pw z8y|JKee9LiZ=EjNOZ)HtVc+i>%zy7)`+xZ_o1eGyo6Fkvz3tEUSMNFcv75Jl{E@zT zw`ThuvZ{H$nQ;eAwPCn>Yi+wZE^*R00Z^fefkBC?$cLg4#a#t!4#HDYIFmVfRy#5o z@YH4?kt&|DoC`ZDr5kc!4oHq(K?l=uiqn+E$!#ZMPP-^r8l7bMRQpOvMj`6ReP~KG zG7LL*fr>)NDHI#n%cBzGr(@J_U1<_Bmi5>u-W7~eMLaPVT&%$Kl2{_7$wg(=LOdk~ zB1M*tKnXzUxw^+e^N)$q#HwTR_w<=nxnux3&7x{#iiwBua~Bj21SC^96p@+t zzS$n{_vh>G+z*8J6kVqPl6|4#AGMfccchur%Aj^_a(#(qpTiD|eP!#Ef6Y;Hy)g3( zj=*GDWIqTg%uPAAB8K!U&49z}1Ot zal#)nWTjHH6rZ$Ea~m%zfPj&+Q%?nx6HzHCF3yC@TUE=2Q&gd#m6VN|#_P1gW9UX% znN3v9wnc3KPZhy27GqN->@{VKawl!|PY*IK)SEt{*3tv!bqEd45tnFZ>H8^aY9_Z8 zpTte<#KDscCnqq%M_zza%_VYVllC+TfWI|AV#1%qEhOC3B zzn*%9Auc**YZg1ql5~o+dKVOi*6XV5n18*GYRP(2a%Nh1DAf={+}@=oT0EwxcuJ+S zmgOS3Ik+Oogd|y#;DA|t3OgAc^I5H_gaQsBw{R2rpR^h2eeBB!T_2Ewm*r`3Zta1u z;trN!ymGvnzoo z&2Q+Hg~Obw!ze$Dse4;|S+Hr?Zm{sye0`Njtu_CVA73w>Y})r`vGwjdH~ZVW z@BfjrwO{_EPsg>(c78qv*TC6z_qCe=t@-M}>TSdMH<+OrFu3S1_&yTNN{X74|fB#Sa;WxhHUGF)$c6IH0&cqv`=qw)CJ-S23R&?=h9rbC&6nvC$_vye&f&%rk76RjU$Yt2hb0v}2A`EfE{@X) zvbp^V11{2=C15U?FX^a;88soD#9A%FZpn zytZwSL&!P;j8HG5Im$kWA<>V7$^a<m-LRx8GVQ4f*7;I_EJ#$vlZ}8%@`~f8BSw!+H*N_n zJ4GI;?HGvgY>;wq4eRYE@U)lR@kM{@_O%z_^cGfhKLUa zDBlVplwoGv>TfPJ5JY_sSQZ8 z$~Zt0D5-J4aM-|P!{is6pt4RllL0EDN~+2*^_Rm2)LEP{DW}f9B34K~_chkz=$6HC zhDGMclOa^tQyVV2H(1UpS*MPKjFbFcyJn?{cuMM(gvQc?E@CQ)Y0do0Tm;Uw2pA~n zY!U&^RKW!GgVdP?2|Q6dDt@jE1SzTu0*|R&;(imecK#yjK+AV|OVHI*zrx|AiM|GEtjSk5E6Z|JfoX@50 zj58=72H_qzf6d8?M9T6bJJIy(%B1T}*3{gC^Pl*MqqB8=&2R3${4br{an;r}48OzoK=-JC_;^Z; zW9{8~TehV5F{-g{F#y-yy~D?50N%esa-HCGb+gs6Y?n9x?(g>9?$WjEo6XkYecfNW za^-j5{*E`l>Fmn&JFMYXU;A3KcKPxNykEWJ+WG0N*Z$gTU;8V+I>dHz^{OxM?r-^> z-$7qDm#=NMN8ZQUEqOIcm` zqjkdE*}(Newh&HK2wOg@>OP@RkE(S?tplq^T z?AA7|09iiYC_RmDHd&#N&u8l5O!z5Q0t9_Yk$I)-7@08&ukmH9CDrh4yvAdsTZ7X8 zYb;|5e=Xw|rRo5Tg~Y7h6A2@%OR$VL*+z?zgxm^HM;0Z93k_ zDO`~@hc_Ghw8ptc1RRLnvMi#?uGhaf4IVy(%!IfKpW%jL@|vcPQ?y<)dU!YMgx@rliW1@ zR3PW4Id<*Vk?vsDmt||4#p9Y?kwTSuVwI#Ivrh@?b1Q}s=`a_uQEDole+6RKRSl%m zq#=mrqUW$JrOnZvm!st62ccj|a%bhFK}?^Uu-5t2tfZp$BL4g_h`yHiXUXOHS@j@Q z8i7Sp(cF>CG8t@G_EDBStkgHt@J8DSoiRNZr2xvc4y#9?OxaM89p_lJEdaKj+G+?c>Xs1lkju!_={pNJ)5K*^!r6rc!X|{;8O%qNNW0^I{ zVrBL9#nk%uu_J&0tx^%~Bb5$@(K$pSty!s`j{eF9L*vRZIA&DQm9VfvYso2VWh4i# z0!QFL0lIV!1^qx)USx!zj9pY^1thbg<=j7p2wV#m`r&41cE<@arsL6R3e*^oPfiEY zfD6wEK1Y)UoF%dp&zNBqKnGB3O(H@D?B?i3y3Ar6Lq_#Bm8~<7LZAUX_27n0(`&dA zYtZ40ZUPF$VDjH8E{<3SjzVV{RuULyKc&nv$cFF=iGHQ)1QIsQ{UaW0rjmizqs9y+ zNs&%iwK$NFQ)8nduZnreHnoI;3Y}IA=7QAA%Ym_6>r$@smLUUUWPijd8n4j;_{L%G z=3`TOdW}Z!+8(1?*a(yjQHu=RYt|tKw9OXYtu6Tee|P))erSLF+VR>unqh}u_=Wa{ zUtQn(p5v3vc3u0=|16HSx4!zzF2mftn=NZc@8-=My)|nKHjA}}WwB*}HHVv5q z_qAi)pB$Z>oE)#a{lL%O*WOnHuH13m%zE$c9caF;SFT;PrS)|!2|V{!G`V7A_*vvM zhAGP13U);!!6;=>i)fffQUJ;j6Rkxkv}zi!+V=??imCTU zEpF61;&VxG4qT&*&d_~`jf~Pn`vf!}hC>y!q}-`c10NL^0%op@NN28+Utb_c^K>q! z^K+XT%E&fiQ0)^-Qn!@RXd^Akavac~Wd@9@Gm;Kq*K;i6GebH( z$4R~``3Au}QY@7i0(-L$t}D<%45j)b`G8d-B$uVCIlRcUy&hws&UD&fUxVA#gs?LA7zOwTZ!AGZs-04NSRrG9$l5{lg7-Q;w*HO&Hou|AUorF zK=DkYh?FOC=wUTQ$utfwv(tTiENvI#;sia08jECfsl=J0(lI5KsDSitijK5a(YjcJ zjL7-KS(TzRoIv8@HFP{0Om@!gco1vKEJsbwlI=}XGtjkDg+e_R?vTZiTJ%iw$aJ2i z9>olvcAnNJvz*=te%pfg5kCxhs!KFDClu4MAImBNLHZBE?TROVKJABP61I^qP`;i~G z{hi-~JMTR1d*8dQj<&J0Q+wAFN5{>MkFBGf@3%kl!?$1j{M(=Rc_;fb09boFJ-3s+ z1I^*9!@4hvHDK?)-Pp3lx{qg&tlj(GecO9K2fAb2Mzqgr8}gp@NmZ@;Jzd*I#T?yw zcQ->bbK9>@&H;Q>K*lHD*A7MmeO=kixZ$JqwPWpq4b)c1g)Y2RGQy*swKzp>B~T_o zIEYWV=Amp}E&$X~q>-B(OxEXNP>LRdIVO0FXZ=7>%F@5EvNST9ZG1zQ;oUzut4dvA z@Zln!avRtmeKa$Sr@swRE7&2dCQX%BT7t? z1~7azFB1XhA$5=XP;+;)9?X)TOCp2nND}7G+jWZV)ZVa3U(*AEC&!>YHfS{EGy>12 zccW*A0lg_Ul0jNpi84ovYF1LHBW^WhS{+V-j++-#B?$Wtnj7OaDPqg{J^YXph27vwjt4Hs8_-u20PkZSf z-M#1MvD;(QHkaD(?d{v%yZ+4MXD>SHFFWba+_nwy=x+bk)AfzF{kM0^@X$m{#i{{re4zPG1Q~9ca38-JXZ*eymqadJC=nOm6x^j( zjzfDT;Db3yu5&AOh=oBjAV|DZlb*E;3am7ddYpF#vChe#O^TXP(N_LIw0AzhqVogF!%aJoWn%nO+rkYws>(Z#5>R+1`R5V1u} zu1JYiRf4_?XUCZ(&bTlSR>LL7z&WeEUuaH)4}4*TI%CHo3NGI@TYw$s1wC#(X~GWr z;rcxHQ(-nFF5wB>*mNa`7Wc|(-uMih@#;xj1BshOA;R?-Zp+qc&y|CG`mBCQ2?%hC zNf0hBsH?iDGoymS_pEyBFoD1p|)(jC+Z!`ra zTT=m|>4d1l3zm}vt)h@RiP?<5BKeL=2Q#j2N?274pw~<++lu#uidjdNgw2f}F$wtM z^(Jwlfm{J@nC_(pagDTF5lNilu$C~-LI|Bum&S@}OEprSVL;Rk~_UIa0)qv+jD-+f2K*nlL z#41!n7`{z@QPgZK6f&5V@HttEgy+V8(+FdTvHKJ8_$ba)YKC~%HKE>vL)3dIH)IGx zh#4xLqGlqSmj+UIsfpafkyoQx$4roC63Ghvm~l+$#=@6M}&Z`%tWfYO3R`umUsd!NE*u<+uabkzq>x zN>~0jYX*$X732Pm`;L7_JP_3!z^}jh{5!wPE?wE4Y<+hg(tqqxU-$dg{K;Dli(%*H zhSTLoe{%n6pV79>yxS9xH8kItciY=y8?)mhvvu8U_UHTcu^Zmn@f}yT>)yIyUA?b; z(|zCf?%mh1-J>fnof)-gN0=cTl4}AOseLbb_Arbni6P>nSk!l?j}6EuO;M@pK@T8R zd#2`SmQ;9zkAy9#IG9z!5=oekC7I4}Zq&0pst#c}Q3ayESBId^t(a{PS7mo7v^#)& zFv+EL+VJ(b*=Jgyqnwp~QR-~b+(KX+7g)$o9Yrvicp+SULwOgM^GV?lk~X%+!c&Q* z0{_zfE5p}_td0ruoa`$hJphgxXF&2!C^+#A_(bOlR zSW)<+Pce`-s#K7Q?mE1Ul66c>iBOEG(Ro?{>`^K2ah(o@3qELOSaMCZC|*6Kwm^Sn zOc_m3ev;5|ASPQXrOkEQINg?|t+!4uzw9&Hi(hg62s)12X7j`;77Ry$o40XM&SZ^n z__|`}Sa;ZN{OH)smt{F>>%KkbeRs$A*x7rq!mV#NeO>)c=XleZ{n!n^w4N`(dGEK; zU<;aU7r3t-&8=ypM+SCOh-v7RQABebl};|z02q{O4H1ovdeiDfNGxP3{Qw@7VzR!< zf);;5X`U1lp?>O#n~DT+u8Pb&9cpK)`Gp0R$NO1vn8Dgi%6sU{Zt9VV3 zT&1ll^pwoZLz9D1jt-D%rdPo;pS~;9L{^&}xL6x164zEHB?-;6k1}FW$Y-ARVKh!@7}Go zX0}<(-P}77am=ld*kO3X^t19?gwH7kKhVx-v-s;Q_c5n(S4_|{MW2VKP&XIU#_{HA zfI3L4N&=W0EU|Q$V`&S$-%{hrQ*`g;92U4X5eLhkm^Y*EPgqSm7L^I2mo3)hZji; zhnjhSWks1EiUP$`L!jMIeVK=7?*^2Uo0an~{i51FmQAc<873X{3?XmKnrtf+8`cM98f8??4)0h6pt-fqG zyS?4G;V*l|`URi6*`4?O&X#RMcXZpGpDb6#o;PeZ_@Y1FKI=1aa=f4|)@%W`M~3dp zw%P>DP_A91$bh%a<9HUkWP_{ug5kYH^)ECvmRgIFxX;mQ3sOn31aD7>JT~_poa%Gy2miA@j zAZ;oJ7-Qp8ToP@?Dk|q%{`pS^595$Dr936AR4->`ip?hvJF0Sb!8S9`l}#0 z-n2F#*v$e=JUGk8{Zw2oT%=m9%~@%vE4xF#p=Nh9V@Y|~;^?c7N48Y10eswdSY>#3 zx3Pw4#}t8-h00>uD&yCX016eo(^NK>WZOy!jOtt$le47B);&WaqC*6D~w>GOXuSa$wbNx z!9;|SKFkA+uoT3UF-=G`xI4U$t`@^rec>QZFY6EW{bbc~M!gF=-#SAgMvlq;HH!`L z1SnKKn|dhL;(6Q@1XOl(*{K@zDod#VEF@@y!$FQ#N8~!OewFZBj#Ct>n!&+D@cYd) z!zBRVqmc(0ba!Han6j*?34vtgp{QJkySug49e%#+@Xhh| z^7iEDXzLvf)|$1}md#=Y@8<67x}NR#r>AG<=eyp0vt3$K5_@5al5*Kr>M@=I%b7Mm z)ys1}PxX@h$Fang!-GI+ftXZ$hh!S)#l&jdEvv)pmZdVL@QOwb9rNY-9;ox7O%?;V zjfy~)k)874=!7{$?_@*PK2T26uoz3pdpT4NG)$b=^SXK{-NO1B{arlUbq0f5?|_;{>Gf?R~bsF_lX+EShDDl zKPr49C!bA4l;>i_j5Q}NslQ8dS}us-Aqv91RHwjg`JwVspJfDU9@}@oRJ%ldQertl z)3)Ftqo0qMYv?w}yfy2+Osaamp$;VgsX$i0SC|0P6DzWe0KkX6CyKWO&$7lcG`sNST)ONXW(=QdWR4u8VkIZw z4r6HJ@{s7YIFq1fjHN@{Urec;^{$;KJxn446=T4F#)nlF&mOZJH_C8AVT<_b0P}!8 zz*zd{?5K;9Cud1tIklp)$SB8MDTGMlGeU(y>}UWQtc~?|2l|S2g*$dTnDy4$y1F&r zcieHWJ@2@8->>k~)8*80@BRBP`P0iEdP&P=c5)Vgv-1^hM-3nT5hGhN?T+9p_M+eS zEPUP9J@MqD+mjQltHal|``UN#9yd2_8f}_dI1CM_Le0T3@{L5-jKxY!Rj7ppvMTn; zJ90Z;k7j!kbe~{J=TPn1Y^Gdz@MddLb%5?L-PVdb1j-oiRgkrZfjG4;SlMJE>Eg9k zeiBj(Q6XuH2wjQE)P>wUV~i|`PRNkHQ$?MTrO^k|6*lAiC}|&r01%A?Z$u0<#?i>u zEu$S)z+kPpGc)u~*oij11Vi9HWXdU?xNIV@gSApXQb5$4xGm4+bG9chxgvxHa;H83yB64 zb-pMkD|3#IYhG*t@DA;X3?vF|l@^DUr9l*t(66O$MQ?S1g~Jf3WrS#wKF1k2--M7n;tn4_>H9kWME= zlHL?vlxFf!tG}n*s*rGCqin8ZuZ&}$WNYfC;C1~aViO`~&Pt1|>q`>>s%=W>pi9LM zl_BZS2WK1mQ$>f33}-OSFRszx96wlj(&2yxpaJd>G*hi)XsO^M`^R$ z+V{3u+S2yt`^TPm;_)Y++?}5<+f7@n_sFWpUT~l<9NC#Y>opBH1nLsuF%26!UfURL-qS zf5W7FEQwW2b=LS&3_;Jt-ZCl1P9EaVa@8n)4KWSt8ZJ2+PM-;*y&%#d(=>dAsp;^n zMdnUxy+j_`PvJb0h(*}ruxfTuQD~?~qb3a)je`tM0tHyumTQ}th)R_Xi@I~U%EKKh zVOjA-0$d5@AcxixBn~kWwe6 zK|a~}n!A&llulOwy zic?nA44Il&!Kv0{gxe4^27-#g|JePN+3gzLHZGKkN%@pd}2JV z^3r<4DFjpoGwUump-ZU{9cT21+TiR^sSH!yZvbp?*}3 zJ*sG|N(5F#?k(}eWOO0pGDb-^gSlmzAHY_b&Bp!#Aq!O$VFyYU$=<=m;dG~A=h|i% zN>nu{2&|#O%y4$Y(cGG2BO6~9`-L~2|8KwIf9_*9FTcO7JAB74^rv6*PyT@A(#C$} zH}}8wn19*_Z0@{d?!I>G+IM1$wG)qO*YJquSUS){!z0WvSaZrUD`gqWRk$|*S>4vQ z4OXdYX*Ye22Oc&?ub8mYEZKI?J{T1VU+S2PP)nz^!b7YotePd*so_R`<ojLo1bMQNDxKL!*g5&1;nG(VRNYh$vM!OqGGlyJx#bKSDa!WG7| zw&k<9Dn?eN@>lm7-Su@??sfn8Biip97+7V><+(6l*e<{sUOgpltU0;*W!jk&IT_<9%_hrs+BsOtF@i$sWQ?H%HPLWv+2FI;RHrKAVLd2`1jJ~H z8i;#0>Kma@Z0F!szapzNjFG*#Rf{P-)i9H}ft1Rf=pl-DGiK4W$8T!TCcttUp7JM# zC2=6o0CVf^Yj^8?+<6NRKZ0NUrQIL-tV@qQzCYUdv+l+6ETLfB!s+bXHw)a+Ve8J^ zV=;FfOB4-@!OYrn2$S0__Is=yZq~cM@O_SYzrF7c$HEFsHPlj_W2UW$b{K?*h%2my zX&S~|Zo+Ni0SVwv+=`o%Vy52{v?{mF!&{cTTg8mS>IsUnLCZHqo*tJ2WT;Up znQee2XMME^aF7yMWS-PuNj^?+8G2AOBe;tuvZ@+REGUb3gIpZl3PKsuWj&l2W@s$4 z+T+w(l1q(m=NU^^B!~Qz_>i7Y{*7|D**1@#$Kfs-!#tM zRIqUGh9$(EiO4i+X5JYF#57xM2TU&sZu0{y80Sr&(00|ZLs#uHe7<+~WfnFkmx-aVi+a5DUcD!V ztolcG7IP_M60T^F^Yrad5RPIMih0Yw0}1;K{Fd>MY_F0tB%lEvDiI2b%XqE0g$H4e z;e?MLtToX%7;h&a(a$wRLXENUN$@PND|q2)V^q^jkXE2oAAaRlzb-mL7U-m7m3o1! zTf~<$xkfuvSe#!@zCh5JqF*p19bGA=$%^VU^SR^lnZqz1pYF4x=IU!8uutDjV`E6o zkq&Zg*4+EuIeGBGhi~6L-E6mJ z&0RZ_3%NkPGvRFjK4m_vc@!m$n(E#yCvg~@M4MKdR{MUasu7&zp_XjP-)3AxO(l+) zyjo~h&oXHvh{Rjur1^LPAz6G*w%j4$Pa}l(MBtk7g(qgaUXMv zBeA~>Vsw*@rMS{VWffu#nsk=3Xcxu5r1~(9@w-r$&6}czr0cp=F&~arRVqfJEJKh9 z60234sv4^ba#9C_$6C7LPNMWMnZ4!IQs=@}B9em*((pBAGS-~IW|*7GatSLl1qa|g z4Kg*CiLSOHF@%KYr~?urW=^l8wXpUT zH?%U%G1eBnraBIj4+gHIYvzVF@jBgcjExPl&MNbiMp6Zp%rR~i3S-@F*iugpC?azO z6ef0}gLtBI&{_Hbk(Z4ygQagp!Ye0rl>=K*K`?GqjZ%bAr|{UvQQWO+ES#2w`%cJX z$dHu;hR1*#Y!iPQr!zbuH$Ir<%0h|PqpVJ?2-xCqlL(-?W=pOt#K5vyi872ZO*0rh zjc3h-qXeB;tg|GV=!bG@C3XxaAe$J0zz7Y1K5h}4uFYWpb(0DK3!R!Un60Uv@sAFl;}yXBXU`kH$6UGy>Jn0NDlOM z?QnQApbh!V$|-bcNH>B)4#<|rhcy+P5sw?x=Fd6R!_1d+Ih^BoQ&^0^bs!Ep4nNOl z!9#)|N91{ZSWoPm7(&mBcP}K*>}x95$}BsH{=#X(w>-YQ)soZ!S6U+VWIhB+7@DCw zjJM)Y3{a1c6voPxdKlO#LaAM<8x6Rap}x;4Ua(JfApmC}Voz~a^$1OlQYqg*r78#? zrnn#v4+frn$fzM%_wVmsMPry-K_)=Kn#L2%mc{q`j(*=WpK;~NwX<8dp8Kr(-tQ&P z`}mJ|x%b;Y`a?hVE3f{I)7!V7e&^*oubez`>+GQ?pS-vgud7j2}uAOZ<0G$qPU? z4hAYa5J>>;E%YK#12PSZf_JS#)h11MAINkUN*oUXxX9BaZ|P;su@}WpB9L+o;I{qg zkfN5bR>{KwEp>5Tgn2`*!6}6Y32d%+@R&(4IWThHQ_j=NFcXGY|&Y!>kvl>C3m%XO>tP3GQDuUkS&wMywHMf zY*lv5N)q%%*%(h{vW!e?6p(%~jxP4?{LqNflvNseW&syi#Un|YoJ|ER=wcJ{d~Kr* zPb(|w21C!iXO>`Wj3SUGD>aoZEx9`@bvR`K|!SO31$u>+lGUihD zRu$Tg1W*oa7gnne0Q{hVY0Tlv$q%`2rNJOmbOSo~&bZ8l7T_7fl#V)^8BYkIeOXY> zXt~+AE2PD~kn!XSKRIb{f9v+||AVv7{*2wz?(xmm+jtOI$9}imx`FF=`Nw_iX5G6P z&iDA~AN5~(4X#{5uzse)y+qi>Ik5#ceROxAft=QAY_gpwo4M73`WQqc>@#Q8m?@?J`-6+Qw z8Uv>Y9TvR~G>)vDs7IeI^+A>&JiMBhUnFU0$4t0w77CocDsj}vDhz;HxIkDFVnp4| zwK*x-i?VVX52p>%ZDY+do|>34rBMK}Zo>=Qtgu?q9}(8HQO4b|i~^X$4NEc`B=-s1 z8hqTtv?7v+)x}MZ0wm**1_aw-dYSCFq--h)5W&3jdDo5+IJpB@8UXy+PdNU_SFX>! z>+*KNOJ8vEjeiZcKYH3_1Mt;#``+Q+ zdRvxdyD{(X@U{Eu`=zyIX$tVQcqU`B5NkJ}U{29E2bNjC@E}1XF;LrzRb(}FOCvAw znDILkwpc{42ly*0;U$Z~gVB-oyV6>9)8b5eeJec6txE&W&l)b2qERbr{?>2)x-h&M8Zay}m)>MDI(N>zogHRD%q7Xn|I_%$0qhM zHA|DV9P+%1-pDMYsh*^e1VI!vBMX{jEh7}+whSp*>Z$X0*UBbq7CPM8$SN3@xA4T0 z6j-y2Sp!pwD>|VsHY^ZplXYSwx|JO5R8BB@V?2>8rQ`(3jd7f1A7J`d7UgKT(?Z~w z7q@tzNIM8LY$1ILDdiqdcUD{xS)i4NGE`(suL%PJG{4cAEJvI1=1`Gno)8=|Xy7In zS`ob>9h1@<_S_EE*a76FFI7zeTp3@dTLH1FX9&!7vf9;kVX7&}{3;6mJ}=h~(U;5~ z3|oZ2#;3jWnP*aYgz23~O3XEy!tXPdBu^S#+t}r+N5A!(_B+43yL#0Pt)ao!)_i|z zPd?@!_R;wGPq6jeH(Ts>_}~Ba`M>#he*gXE%Wk_^TdZwivfX~-F<=L~baM5Man(pFu{D@I z`rh|qe|~cPp5seL-n&&_QZ^_-AiQP#7%n7Tg_8;DaUa!`=s44NYv zj~#`o5QCUt%pPUI3~`gpiUX0H2CDNR?;eMZ6^+VMtRqK=LrQdJlyYLB7z}Y4;sQh%cYMTV#byjM6hIO+X?~Vvqeg?HwJ=1P0)hl@V35d2(|UIjWmvE^ z4xZP5h=EZpift+kjS+P84y`a5NO|mrm>tJ*%DX zadwVw*ss9a;qD!6-_dV*-~lqwVp!?t#9vWplh)yWhHT!(f*$U)gLn+wH~x?|pl;S=!Q9-}ipL zJG*`RbY1smO__YvSc$~a9m|#p1_;u%(G<9(;ibv6Le_73@5bAIXR2=i8k)mxS(dge z>u&EOb>T{mwaKzZe3Bp@$=PVr@-qShCE2Z*PuvCBym!M`1n72nH||h(iy=p>6B!)1 z93p|4dUWQhT39hBhDFuK9fz;OHL}7;(@{Q27}cbhCe|H5qorZ1Lh=jU7uUNuvbnYJ zWG!1cJ1!(Sokr;3d;$S5&@7n}00LEGF!7x^Z&GB4t5_X*owr|8jER^B!Y2Nh8IPF zDd7Cm4t~(z<`Xr#oWtC9?VxTtFw8jQng?ob2l;2o^HoPsslsUtCCg0<d<;0! zaxxeircw$Zu&G?7iR&tN7Ueuo$mqHnaj$YRPzH33B0Snw9FoU^)DucdjpeF>~W)2PMiA(2$r1fj7k6dd6+2m$tcm;LV0-tyMBZO4NxLj@fe4^SKFrNtUlq3g(V ze7xK(jtj^0r+J`y(eE5|=@CO1U&LxR-Sl<|LyX@Za3=3wvp_Fzy52hAV;`G3wn!q&c@ETzymj0_c^Kdwy_@gg-MFvB9joK?w)c+B z2HOPy`W^t50ZrX^9Wbm8xUZ{wUx3AY-RvIo^Y^;1tY&!%+bENakgccygy^ccI%>vm z`O~@YfGP?f4YPH5E$Fi7-r?PwwM$1QH*P(7cI);Xcipw!F3tVsty|~kr_a6r{_9t- zJ^awayZvr4+;RQ-$)%&y+o$l>mbR|F_p9eu&Trhhd47IwW_`b|y>~>^UQ|~g0}OI5 zEY1P8S(>#LAZReR-T7|q`|-elzzfeUIf@BKoxR0liH2BPYi-@FH*eg$eEDh{yHcW3 znpHCiPtai&-?q5iaqV1}Ft@f@j*hmYOx8W0va~zft?M2(p2sDF9}iKo)~tIoL$6jI z!9l=7Qg9k+g@#aTR*y|~lLf|cd~1=~N6eN<6stoz)7*QanD9YOGKMKx0~1>-7Tb84 z)cAgwTU~)nyB;Iu)Y!>n;(#?h7x}=7ucqx$rb5R~F!~@*g$c@^t%V*zz|MAiBotIBO;SYc4`@QIW z9(nlT?e$CF`@{d?S6=s9Czp;PmX$rQ_?@uRZeklmF-U{rf-vC0}&&R^J>Seb%RZ^wX~2@%=ykQ{C+D`|f@3 zd)~XQ-kK#ODaYmzo$NQjYjIoGeZTXA@ygG^9=?NJbHCTxTOaDL`O#(b+U2PEZrt}_ zZ)RrAv34|DHlr@y%opo$bc46Wur#>)xdV$W-8 z4yGv4R*%SvsZ!ilz$_EV%+I;7XOxPJx@4(j$GWFJqXP%Vqw8|H$u&nxFm+^{I`1V| z;tUE^0H%<`C8Y>;VrDkU&rHpils>(&I#~j#=m*^2VN!v6N`-kkF*!7ot3yoXnd6|; zs8mo#S`heG)X(E{t)ly6G$9!t9Yyf+U5pKuz{4@*5_-u@Goci#uMrDYa$0?fYAQ@(aK4Q$PI^KlRf;_2+)(7vBEv_inf5-n-e! z(aFunAA9)+yy9#A+rRui&wchAe*Lw-`5SN8Uc1tot=?NRv!$5uqMdDbNWoa82;tWM@0AOut24C0SeT`BmZ@F)JPrm%}hZD@D%X{}(QJ1h_RI&9!zS&a6d2qP+sI zZ0q9tVcA362P><^U|?o#rYj;8V3crO z=K>kvX4Ql0h>BF?7CkXB2*ymO7sr!e#fyUHah*@x`e^i7FP$OP#mn5+zS_{;Sg(dT zI&a)yc_T7QT=WsTnvKM;_ug!*uEYBZv$&W|p(GlbyY<*Gv_=^?Ho!ENBLh!HAG}$@ zKpswYL;{Loi-s+>bv2ARNFJnx5FX`FpwuxsN8953v87!;Z@18}wH^<-VSwA+_g%sm zH$P>)Va3`zU~RMPZHtbRJFo42<=gtLcVcP0QBaJ^cq3I>0uF9UpB@su8Gr^`;j|7X zK>^%EWaU&&i@MVh5saeu72d7cV-G*EY?sZl*=(0}U48AhZ=SBc zZnxWIvy9tPXLpsQG%m-a1A|#xSAX>3NBs0ApHkkjZ11@Hp0;fE`<+?qy<=n`qGYd* zHf}0!2ChL_TbBOpd+)hI#!zA;;hJONyV28i69UvLeDqK8 zakV9RMz}#i-25i-oz9|F;lo$P#!Og}_SwFJcfZcP=Xw?EtS`D!rDO-tme$<8qqo-j zx++Sfvdm!1X4Cti#%6|Q&6@3ldLjQnP=uim1~quMO>1bqyPIowe_NvN5Q2sxUE|TXtus_des^larHcmySQ><3IAHFS`Gc_dasv z>g6}T=}rIX=U#2yTeJOsy>avOBcFHAU-+z#{J4*J|9hTs&+g1`-MszT?|Ja&e)Tv0 z*$@2UuRU}VZP{**e)<=G<&!`DBVX|Rm%QiUC)eKp@Q1zf%9Z1P{k=bC+vBI*efPuf zeK-a!b=F#Cj+$>qZR`9d*1i4qPvSSe+b`Y5=2>SqZs4&u`q|#k-ecYNIND%o$LGE~ zUwi9V+IDkva)SN3+uip44lu{D9W}GQ?#_E}ux7`bc6`;=^M3nr^zK-I)wY{RzJ6=-GgegvBmxffHbCN~I|iXbD%=Ah7gsE>*FMM)4cIvDX-&9Um?W&Jt6)204l z%i^^1hxSvmLZG4YkNm}94U<(r6vs%QxeK?{HOh=cg-`KfC1J|WlYz^O3mIRud@yh^ zi2)WNOc6V0Fjq>LSPiB!|4bK=O&eXWSB4^Uc+ZMBQ1S z8tC|`J`2r{ItWxVL0twx07^kqd1?xwiO|(<(Bho%>B+;6;_qC#oF_qhRDLM%^^!pq z+|W~vsThSi1w6zxg>XeEDH_f>D-OtJ!^_I2W9M>L&8OCbA~q^HX$oreYD~I0`$Alr zwyIH5Q=!uoTHT9PT$1%KQx-6Ln=?|X)SF(Q;)^h2Cd?!`0R`vdsU`}ca6Kn!5sgOL z=EXq>9vJ01vRk#nQZfJkF!tW@niWO*cvYWs-gNW5bMGXEG~^rwiINm>6+z6dIjz|h zT`}&OUEM{%HGR!lQ9y|*AVG2*W`<#M4mZd5zVCa^>8{@&-BsP^o$Rl#o2j8?^70H#HxrN$YY_R+ngR zIdbz<@FmG#Sm6n5v<4Uf*u&Am*kcBG-*5y{Xiv8VLtr!+H<3z4gV96=Q4u1c3Px`q zA3+=h;FJq1p{#nc)s?6~kphfRC5Vxm)Ip|b1mHu{PNB(T{g*6y(FN!I z^5?%aCQ=F%DkN&v=l#c>qrJhK616qgV&OQil$2s)OrtRu$E8xKtn)0_IWM&3F$L#> zokZN^CkB4W0TvM`_HMJ3os4WJrxoLXcrcV zl8VlRPC;fz0Fe)B#8{QeXmfGEiTJ?OY)IV>O?Ivv18qZaVJZfcAt>Z4P)Vy}%yffK zfo`x0OP>_VAKmwYfOcyDIgB=R5S;i?%J+*LFLRspAlSovA{8mbIEkY;2AlSf5)knM z3Sv85>T)!0EuK5fDR5bUcB>HN<7R-#Ju|SQ3bYHfAgw zukDhp%`o@YMk*-6j6Wkaf*+X)i?iVVq5r8C-yccl_b(_6J z;bt-x;fgs&p)esGL(FxKWJ;9;jBd*2s}>kg8DycHbc@2aF<>XE_>k@ry4y{@A0YXX^`k`=_U;SFB$7 z;G>ULsvS|B=sYJPL|N8B0BHADHHIt-0}((3KvA5SJdKb(_@VcnaO9y^UHyfTiK#d) zmtVSgXmGyOs!z{m z+JG?~mC{}J-Mf3wXemi3aJs+@Kq-X^wI*H;<2bO2B88~)+@=xZ2uT}l@}eUo@C!GX zJRr}%Su`!H{|i zg%?s9YJR{n5F7K2#{4`eOp>Idv%?r2EL*gX$Jyx_j8wJSVdo6z>-8*4J9@ehh)?FV zaHX`)>a#PIYAr66h_nJVKUdeSth2Y*Mh=LPQmRp(%XQw_)$PGqp<6QQM$y(?%HLf{ zu$9z4XrV*jU<^alup(4KXresNd;0sjdwNO=FMQD%2Oqd}a(vQ|u9oqhd;dN)J*{E| zhUVs5r!MOL_-oEP`;6loxf+|&aU3VLuKf?FEE?+Tt5!ev%e$YOX_U&9xklrOC!bli z?7*(B+I%C+($N>3a8%Yxe}CKE*x8};Y-(~EZI<4I&9aWosgz%cV8_j9D#b9m8g~4I z000sV3e^Hw_FB_(FwNA}K}W>hN&ffSGZU*9o`*!{+1vEaJF#|9e&|c7JfHw^(Gu9c zGGG4~9Dcky;Y=8tqNi@gnFkGZ>)uP@m>0)GgS2y7{_G#)=F?H7Ln|b0u|lfly-bla zb8ZUSu>ut6D~R3Nf$@$zAQ1$Bd>$w8{4gJD4%RIb4=VY|5_X3YBQa${;u=iR3S&qq z6~K1@@W|B4Q78rqc2g7%k2NqhYw&YNz*!h)*W5I3!0rMhN7^}96`f!3{LFUA~tmFyg7#lai{$wi%S$N>P53E8+o{+kd9+FoB*hK|I zwgB1wU?=JQaLdALZoC&*-~jCE1UCXgmsqC&0Nf&K*9&w{136tKU|Yof4gdiF07*na zRI@%!7tATP*7 z>xZ46Vd87}ey;^{^deJT_k zIeoC5BHr;ts$bcrzv5-HtILstA>(b8I>MICNVrgNPB_0apOVRZ_T25E8MA z2oS|tw_!UWyZ<)W9YeI?JqbzZA0ilZT-RBy^&@tmB1MtXQH*G!wa?)bE1|2?a$_U- zMTT+%T4S1l$sx~x47}(<+;5TBSQ|VkyK?|302N^b7}+9y07APK#z#cnsiWjG0RZA$ z>r#>c&^zDtwmWXWeR681R*j=r%}tLTdGv8FdGYz$=u)XX*JzN|q*R{ga}y%~5kzIs zQyABJ`g_S}qg1Z-%;;!Tsa49=$6qZWO<~Tsy(bJ=%$e@~? zo`$>yaSaIO^?13nw_L60JXdj?HXG^OBtQj{Qd%DdC|R2;b@wHe5+csb%uu5aaTN?T zr$?enPghTGmbCz*sflq&=i^F$Yj&;Pik?;01_$%Q3R3QDb`UE1ay-~PH{!S*>Ogmm2;c`d`0VK5;JYKczK4P>wN);noKx*UTmR^+N=Nk*!O&o4y%i zj3&qoWyUmG)XKBJt;i;tU2%79{^9FkehZc=l6VxJ8G28jf{^&t6}e0@zlfnFIjZ#3CACOc6IQR@ux-b#lTSJB)vvy6sIRvg$K4&Z zHP1iyt6%?S^{VG}Ihkv;?8e2iC@*XvXYQ1hR-*V-AGpkh+0N67! z`t@&q=i2MO-__e!t}3I+02r-xo&rX35*w{GQ4}X+jL|u&2od5WCNPGuQm(w=^;a(6 zZ}F!;`=3Chq6oCztK0Dv(8drcrQ#@VrK!&Ia+09RO%9bx<-;HOm$Vt|)j`T8B(?}(}ug9=qdM(0@$5vV9qkxJ91 zQc+SW+a0wK<0w`tj&z>uJdct@sR)2ttrh}AamnPFam!Zyv`>)8VuKK-F1i)68S?7V zHUuF|Ix7zuY;b)*IvlqPvupNyA&LRyf@CQPK&&`;YQQPoJPD97^Yb%{h8CXw(u?z4 zuXyI!UBi279UWv0pwcEsK+>f1=JJCNOiGotYu6=7QlFg}T(oGQuXp>-osq&o?Nz4p za*~{P-g%q0Y~HGTxuaUG#g&+}nICVo8g$m_C%$9P)R%63crwco@zJMO zpMU;^-95c=91-Ej=-64OpExo$_P57Ybar<&8;wRYMa6(hzBgQ-wv}~aMq`A z@u1o>4a<7;Tn0N=R0euYZO9zot(G0#`soL7!3iCg{U>zj*2uQf8868XIw!y7qnNH# zBzYl`Gf0(0aIKI`$(>W%EB0!R5G1SW1c61M17zk2 z;3Hda%+9WT7Kg)OkXVvqX~)Y0p6>>*@Z>@xy(3KsBVQ30PX0SZ7DSxR97mY-p%615EyIvJ9XeD;A@ zxXkJhiY#~}m^X2P!!^n_iC7O@R)X9=#E)oGwUEA{W9$fp%l5WPRzW}HATAo%`Vj2Q zFa}y7a`Ez!@_gV76<2>r$m{FC#Ow;wa$YUT>q%S61i4uSjrJimiK2v~-_|#_ZZ<<% zC*Owj`v86b092q9s#rxa8hfg&eUb}miO7Z>R&czvr($6s*x*(bhp_-H7I=lM*bF8B zXfh_#2*%jd2stZ|(+n&?0)cXC@JWHv0H74c3i2Fo{DZmf*Lc`sGKOq|T_cbI4X6#| zhH?#LAWLz42L7{~-t=<6vkw?MuV!2&s!_JCLb;tEbpZy8x<=ARKmdqTk|goY;fXU( zJ^r*aUUI%4u8>&k63Y z&K${Sp}|J80XtNoH6cJ0MHm697|@;*r@#fyat#W2gZC#CDYuiOAyT}u1~_$V8xkCw zN8B)U$v7TUGHA%ed9wj%*Fw3fqkz`({+$J%Yuo6z8$lr*eApf#@~(#VE(RLMCJHbo zt`=S9!kLyr@#J7($2kNMiA&dzv+$rj96`Esy+I)_GZo4Mh*1FJXpE^;tB|NP%kA_i z@s>guuAm`;2oT)fzQn@}K%`LlR0ty4Y$_+IIW;3W4?x9DvUwi&0|46k6jaJ?Tgt;} zZ`VM+f>o@Oq_(Bqf`L`m{!S2D`96u5Z5Sc}8dOoOHyeFEzyCX3=X_~odSGleofw_` z+|PDARqr3@HKdIy6Dm|lNCr?7kp@f&G(lz{%~~*B!v%e%JzMf^e^I5_L}fHlv91if zO?htZ{S!dIhEZln+5pR04>4D0cL$vG7p6i0h{})wqR!6FGPZV(3?EQduY2h^%MU*I zu18ni{`ksUZoR2oseSe9U)*om(&6FZ8~=DqbGH7G*S+GO&OaP={i$a+-f;KI$Jg(f zo*V}i8;lM={K!v#>f?tWxHtjq?y5ce^wWEGY@C@IPV3XYD zgET!d48}%8dED7wtCi6hLpZT#7w8BeuFp)a-LR>@v!+d6pPrqat9NvFm6DPHnwg%| zt+c0qAWD)vYmE<&K&nBhhRM1XEt;Dc?K@!q&wuJ;*MIA~zxd&In)$NMo*LyQDkU2? zZn^rCpKnZ!zw$M&x#Yz!`uDMxR`>Eg~Ytv4opRK| zl_Xh~&CbqUbnfX}w(nfGeYC5)yOmD3!;FcTW=g50#d{0QKxogbtw0mh(&I}9ADQ)c zk%G$owS4DwX+DQNgwOpsz2~R-;w#k4-;UcK$bb1cGjK+7*%$G!^YaJqS4k7*9)^3q zuS@&G`R|TSIFRo6O1|P5^P{ND+o#@0MYP{ zC+=a!ZQdS~nK;|_VIQ+GdvF+YB?cZJaPtUIhzT53iP#07yf+C_R)J{+U!fel&3P*p zen1L<8CQU|G=O^wj(Bj6nCJU=X%%^`ca<{WB52okp9PQ| zBDmqac0~$u0sUHYYcg)Ooo$X271A#IvD;D@!_!D!Vj=w&_7s?sw#C18(ufGaSEGX6eh%zu*T&h9HyE-Xs}+brx?msd8o)jf6;W=C(K(o0 zgA5R$&u?K*^`f&cjQ#{k1XJiiw# z=-sq=+iR}8>=l3X9v-+J|HuIL}^|JJoXXw_Q^ zOK*SsTfX$A&-8UyckLRx=p`??_{A?7TF~Fw-8sB-&!6wO@#quJ`N|hR`?5>V-?4L- zg7~$szWl^fPrmx&pB&p!8h@x#P3GgT9YMag8S@3 z7{5e3bk*!K0X!@ATWPR+5OT~SG0sm|e-_+|fTqCBjg_o5IpWi5dB1ETKs1K5HcFX1 z&yCg)DKebh333X|INT~2A^_f$1PmD03G027OT0M1R49oL1mr`N2!PKp2E{oo`%<@L z+BztEXf|j`CP5qb0mX%DZX(h+mqSFhZqOJqN z_pP2Nee|Z0-5YnWnlC5iY;rC)h?wQzs^#p4kVp{OMGC0ms8o%55~@U|wG$#mSOOIR zsUo>#3dU*}+JSsQY=A+i1;DE4Z(}_sAP4jX74~`o1Q3Bv^Nwn*r<&~9wX>qL55M}w z|MJ?Glm`bdIPH-1>-C!+Ut6svdDhI**4FJipWm?YjH3_!z@;Y)^yaO(?7WvAzF!ru z{_*(iA(Z`+p=xzqW=CH{&2&mKJm$s;aw$w6jVo}xp>(@UELic zBV(D-k&22V=(^xohq5j}8Dp>%)#n>O{`s#~KlK1W`SHh|y5+{7U3&3(E1!A%vMXP+ zdBgfc4>@FTXz2Uj|Iyf%^#)l`8BxvTeh+z6&tZ zGqmX9i_X3F+V8A==3#&`Kz7{8=U(=*OS?KcHf~z`vtQq=36M;8XXh1fdh1EYADdLv zO*h~A=X>vusN>jUk2(3oqc^YLbk1344J};o+Z%3Pzjo8B-~G;$PdH|BdivVyzPDq~ z?rNoC6JKr|$peCqy`k`f`!xWaKMLFHK*#nB7TJZoT}@0xF3V=#HmYhQErnP>mz*S}qU$iZ2j4v$ahRCm-Wmt6YN zB#GzhbwIUr$)aP9KVGNVz`_N#bi!`Wfrz=ulPEg;$fI}f*>m6l2X=J#Hd}d;Bw21| zW@b)4`P6M&wgD-l>EOecFI=#2+qP{tLXtn= zd?6s9(OIQd?Wk3evQv&fM(3?O%fL{%6wS`eu6k~5E6t)fPSfnbo{o!8IUG$(Q{35I z&6P4uLx!SQl{;&tu4*(j+ud0`|M){5+%`I=RGwzfJiGd&6HhFc%c;&Q<#K(#xo~0M zxu>7JefX}NOto5`t2Z&2Rq(s)BJgQ1!6(zu0kq|=bi?m;r4y<{G_e+83b7u|06p{9 zZ0qeRULMWrbk%)k$KNom;nV~s2F(0mg8g2gN(=N8H<{_pwEYS^^7L{~ zT7UM*xpGf@(&d#(Cv_j3ZErwQl8DpOgCMuf!gc!WVl&RGf#f6HWnt9d7plk;Yy|{s zrSsC_fWk)?^nk)&yrBj;4q`4WBp|3MVayKGAMR&{_CSN&FU7=!`@z3LZs6-kXjLJQ z;Xf6763B<&9iq1?`WZ$CeznZ{KsaL|*SHjp3q*_e7T@EdDuF7Z@L8U5`a-mz{cfVa z5EOGf=i(g!R1UY?OQdi794U4{0^;x<_WA@xBVyr&h@9(ve00PEMIt5p=imZ+++4xQtrv$8or5(sRj69LG-uome`XH&-2ug89YgvE7 z2)m%_p*|CjpML-Z!@;daM+JFgfz4MO6Gtg*j}-h0UJpf<;b8gh$e6Muybt9%lfr93 zpey_kQ$7lNUa%T)>tO)wE`H*^ITsWd9(cAbOn^XgdTzj>4FG*Bf&mD}BFwTC{^lYY z64k;&e_5>Lf8ZH(yFN=0&Ed7b*FrMxi$@e_4U3A%?x$fBA2x(!$g`)y5ZO)Q$ON!% zg<&{7XLyTHg*LW;5F1&cjA2FQV0Z5 zgfG7wFT4mc1qhKlY!}>d3r0h(Az;gi#p_=G#`7<@U|_*u{%rk>7oB(fF-Ko_?X|zY z;rI1=>oZqh{fU45z;mlN+;-D1|LO9#e(4KWkM7>_(GPv&si&Vle0MI}RL?M}rw9U)H37F{vMV`vdT zfSL@E29o{HdG4QN2RQ(6OREC7B_jhvU}v2|_YTf%3CL|k;Q@nyOVDgSS^-iFDzYgP z;%o4R zJIT3KIYWhP?g9MM>;W|PP#K;ya9y)G0)q$;slZB*_u$|KH7rkV6WVq&>f3asZ2<3x z>MytdxFiT5$}%U5%)ac!-D#iWQlLmmq4BE5&vnmGzz6TTQ)>t{0f8|qqB7^_CWQp~*`oHM*sAh9+}~4eF`jM56x80;N_(gJMFl2W9UUGe2}VJ=tYe1O-F0>HWiUXcx;1F;|+{)Zp-jVw6; zLrD~Ob=1(bW@cw!dibK(zv>)_&CXS;4?6bXOHVoM_Q#&D)jA`Lb3+8Quz%pNhJNz) z``2&UoRsoq`wh(LEb1u*DWMaXP$l5e_!*J1C}kC935SHz`ra%;;2tv{W+7- ze}4PF-}jDJZ{5BNHC%Z9d2e~gd++<}J+FDiRUiGxJGSl|u9eG677m<#>WRCDCoX=; zx!bnvJn+D!OBW5k>jPKKH}Y~RHl)K*wyGS&B=$>c$3`D%An-ZbAi`$`1mJUnMV8_z zj<>&X5*NrGtQF$DT`q11*J84;Kgp>BF!2uvtw zj9`E;&CSq)!9|PryY|}aFS_8|lTSJM{(JsX?qAf*@>Q$W9C*Ni2OW6u_MO{nwd(OF zoV5D6HKjNP1Y>dov7IMUUaEm*+1?T|W`d)`&Xl>rxKQZD6NECgK>iOvrnjdzZ8eTN zVtG$zwK3m7g(lP0&f5A7>vs*07-P^FGUnJNi_*FIl`GfQI=T)$T6Hg22oNXbIF8lq z#Q2_((ebgV{=V*G58ZEJcXeiJULmgAxM_N7dcn}bbUp)wBuQqb>&F~*#6eH2TDf6! zrBZG*TK3!_aub!ZLw-BoQ~+S6Oc`j$-}Uo90RRKg1f`%?MFt5lswtIVcb_o|azGVh zM=zC)$>#xb07In;svd8_E*gN|%k>&pAdqAOz2rmM@u$|WBo*Q z+g!3Rk>fr)Y%CYP+;!LLq@b|>FpUMzuvJ*igy5k(&{^S+z|h9CI}pUAej^5Clyj9d z#KHt}v(3i21IrGL)CC2s#$}Z_R0V@^9w=$|!DDLOj6M>4J zNYp?iZ?ETbB3xi&@xc&Dh$6dbfG@F>%$wwqe9;3LzAX;`UfvRHSyKQkCnf2U>|_+4y}$?~YCtYrvX3AV1aR3z zTM=SeKa#C`M8{+RfQ&;EF+Gx9 zWxGc@D7y&R6<@hwXA^Z({B~3fIR5YQP+*icvDS9_)m6|F5z5YMikq!4jxcMfdcz+7 z2U?TX2#Pv;KylqXiC6IsfLu3;bPhTPLzo+?Mo@2nHb|&!UdOINK+gzSAwaV54&@Qh z9w-k83M1g~FH-8Kzxd7D-gw!07rf~CHESA%-uQ-Bk4@MAe8-*t^6qyvQ!@>(_tr-#_)GuYA3;voq-!yzRD|@4Wf9YuBzsRVCBB@sGE? z>eZJYefS}_LG+p{UREx}SAXKuH{Sd^09di&@m;%i-FU-qrlx0}TeJ48GcS1gCFkAr zhd=!EXTR*Ib=Dj8@Bip$=U;H)8(wqex3B-!=;$^8D8;40zJaHoc<}rSFFonlBLSl% zj&+_{TwsPr%w7?I_ymf5XDY?V5jzfQkXMfDYP z9Al46;VBBm6>vdDTa+2d6HfvJij|Lmg?k5=h`|ZKhh|L1vLPz^80UVh3o!0gj`;g4 z0*B_Qft^hR2P>8yS(tNMivdqB06(9CqZ9bQ&R;4{bGM1YFdtxMV4WBlBV}FoA8VOG z_k!H5%n-PtmC<)^a40Q9Z#BadAK;iHDC2e`cUzhufU%2e7-PH}l3f%%Ov%5BDFh%F zbQnZKWRR0&uCwkR@^>S86$JlebfvpVnghmZX~`07X)`;A5klOhl1@}9n4F9z%6a3% zNTE{oalQV2Q`ga<=hDDIrf&gMmzw$(jJ$gig#ekel+=>vf<-UX#{5`MNXRT-)IPx+ z+$-rT1gKT3)mnLSVmdNr|AC&}&#m2*nX!rbGpjePUbC|UlkSd6oW%3;&8*VXQ>)YM9yN7pf`Q}I8{O-42 z0CO|7`T6Ir`@{U)Y=SV@*PW*6=u{n436u$-*e5@%YXks5N?U1XXUB)$|E@J>pL@ay zN5AS-uekf}d;WOi4X=I8o62##{`pNm`01ygd~(GLUU>ROoBrz?U+L@XeEsX*G&wVS@g*0(=Us0dAD?Kp^2zbhJlCZpA|fI^ zSD(vUX{*&d|Lhn1*VjIE!|#9pm9PAFQm%dSlUKd!m6w0?$vb5FJz2LfUel<3&^Ut|(&2wws_1^bg^Nla8 zc(;r(#ty%rpzg_jw2k-qeG6z9$Q&1CxCW`ENY)VEwJOgKAgM_VmvI^fS-p8 zGzU3e@t1~L1|WDwfs$hIL-@0J4P+(te+--L;+9gW)Mz%=tzUofi!VI&g)iB%ZO2I` zo|x%0%~~5aZJwT-MlgpRe&~^hAN}i}|8oCj2M-SQQ?ouYHa0glcEkxMm|TvdA^MiK14T_4SsHKl;!OTeoXXr6g{&G8M(7 zP1te|oE}R7U;>+U7(7AsT}TF?XGy6;nGFx?nGwh`jbuy)h^hpjaxl3811eY0%)uyV zkxFxe1hGM)5-C+OMo}D7JV*6z^`gs?162LvpG)T()ys~Dk_MC81x38a2YJOSld*ki_d-a38e2 zGwh8wxX{>x?#bE{ap;U06dEb9_1b0y^w{=|lc3I#qre0QT^vM_@GhQECMJ3WR**r> zha^(%vqZ)mz@j`StPO#nVXh5c=7hrW3VI=6*Pi8(aLzBVaMiWajPQkyMX^#?8s=u? z`Q=ck^pH_R3j4@^Ao61bz`>vsh*VyLfFJDaDR~q3gCt1;8Y{!=t=N%8t^)Q=^;Upn zTgEbTZ$~NWmVu<;&bDqB6wgK(4oocTomu3^@Pt7w9O?!b)lX?T16=&&bU4Z+@LnA3ZX@E%7Nkw3ghl7*KJ_Y>n=`g*$nV6Hv~P+hoi5CH!BoB!QvW*z0~p3yx= z9DXPOoO0?Zzx>q=H~i_&kALLdx7~KzefK~7@WT)P_V+jK8lFhA^zM5f`q2B{e$!2V zxcjbq?|<~CCMKu$TRLQn$y>r)&ox67Lu2m`!MMoWd7yuoA(up_z>E=a)i<`~nY<>2m6ON8l zbl$n={rPYA+7?5l0OEG*_FNHUt2Xtfp~G;XGj>zAc!zCNc&h1K|GW z_q}#|xcXNIX9M`GxInXsYSh`GN*#Lhll0uZP@hDF*wKr%E>){gR7Q+!Y8NyC0_AnR z>A`%Pas=_0(#u zbki-jeD$l>%uLTD)w0&+n(M!N>mPsF(X;pySAQa+)>T)1^1%o1!=!Wl$FIKl!WX^u z&2N0>=~XW{{e)|;|IV*}^K*dY&fD)e;l$&QJme76dUARyiulZ9m1LS)X{K}YrZ>KB zd}8Vy@A}}(>>Q}%ZSVTfK}#2}c;<=OMy8@@<*GIJ{q3&W!2acO+33ujYX}5ja;<^L zkfFSJ@~NjBv3&ohSFAYq%+t<0_w2(CJvdhC10Q(bA8!8B?|%KuqmMZJb+5a!)Y++X zefVL^OG$NVW}1Mmx%S)ZR<8j_Kliz-wrtw=z3={{*%*H6>6Nd#;^OX(PDjBl(X^v1 zdBNh$6$bjvGjQY!mbtjhUBDC>*m?;#PGCZdtb4_KIKM`~r^p067QqK}jGxqg3`eN7 zlFTG>XVI%Ti6437!T!G9OD?;7bado^1NZ;!4Zj00t5!dkP7Nxny!;?75ZC z9DCgHgA4on7A#OnVtRX`ND|H^J9Dk=n>v$daZkCkmXvyiP^rn; z+1)#L_w?se8Y0|Ke6w(Ewmlg)$;F4FE)y2mrDM0jW}~(kzFZAb}W_GN6f|45eDs+XIQtwyv$uTmb*{ z`6#XBhaXQ_j6DNH5x5nSz;2qD9!hNLlpe(UNf6$qcVWmSoY-w~2NKi)^AmQ`-a*;g z3hyopghK|p@W(dWEJpl{*Ahhl`gb!sVCurn2nd$nIgj@}kcKD>lRE_|NFD;vodFJv z7*L4An3FJvaQ?~2Bu?;r4n=%!2ieOLNb)GiJA}3)7~x$6PlkhdOqQdBY%b;x5?F5N zU2JGa8{0vT<23Y{C(h+?@=1as`$&dU9?>uv5=0Mfn%G5J=<6Ar3bD2zxY`_7+!8DT z0f(Q#uoZ?7>}gqy3V zoDyPCdhE)j>_!_rb;j%G&|wabPEj|!0w|wsaUCR%_6-4$obpI)M$U67rNHj>Z|_#X zd$1rNC;~!PSzx!i!?pnmlHKG=IKXSQ)GH~cNY+C9awthdxe-JJTa;lRNcKp&GfCp!4A3(b&5KXH+Zz*_mhVgWF65T!zWX z%g8=8ft{*CEC+UW8xZXhc?9cchyc+TMlE7GA&O1pGEnvaQTJsVn?Q2=ZaeK{G&CHy zXgPg|pJ{cF8M(C#0%IFQB=he8;L1kaFdJ~W6A)WKBmkpLOPfragaA+x0HSfHU%K*g zgQ%23V}KB#RK}Uv=$Aj8{_ux-t5pR6l?oI(wy%!?v`3>Fa+UP+^Ki=@`k@C^97CP~ zA}G>iNSoAk&CzTL1i}=n*KH)UXKSiB0swtB2Czr1Vpn&)@#+BG{pI$ceaQq^juqq|Ef)jQBv>*&_`4ug@_85xXK5|>L!QZ84@ zL^L`)^4Qa>26}rss+Anz$tRxNGd!|>Mhk$P zXBJTgZj<3z7Me176E78PNEY$~KeZu&3d%6JxS5zGN`{G9qH)p*tRPT-@z>6SBO=MM ze-45Q40QM= zs+DrJR@GqY^UdQI^P8o@lnbR5H?$_q*Sif`o<>H%0YO< zk%K!&o9TS3qk`MgnWU_G`v#PXnvMBttuoh`HwqW@bd7J{vvb#;tP&l)c<7u{j~ID! z$9$vFS*vt))VjM`!_BD(;!xql8iBx&Au?o497U7UvmgD~XV$NOzS7ydb?dg7nYnW3 z;ylj@$bd!wU~Ms@l^%y?e*HjXS!#yZ76FQI@6~Hg8Vi%7O!r zoZ7Q(&#ti}4qa|Ym&#>rC?lhk%JZz%%Az<$(svgJ8MBfEA??A}wZ zEjsw1jPlAOHMU zPdvWj$U}~}?%Uru`sgDzY}}f+8bd>U8#e9Gn)0;)a_?zIpNEwEV#_iaw_GB5UU^? zP@CuWELM28n->!g657>`b;q@EVuYc@;2M3q#SFM(_o}QlG zzJ-H>i-!8%{=WAvSvWW_xZt$2&UxgKhjgxu(Ux8*6)B|*K(5Weg296hK4f%!^t_9& z$nw_o-2Ab}9rwun4;ZayXQ#JsS+{%7@FkaAylBai`yRNjR;y^rjn+s+rZ8LL`v*L$ zD6)2^H3zs{AiOLE8I|B!0AR?FF_mh?Xmh~QMM^>5%;F@{sV>#Zt*kXQIZfo2bsw{M zL2pNS>r4}pxWA*iV|co|cdpjeU#@j7Ub1wmxqH*_%-Go0GUZ1ey!god7gbkmYoY>x zv5Cn%%cDr?G$%!oQjJD)u)lZz#S3@rnTX?(Qb@+QMa>0*WY1hAvZX01hWRbD`ep(G z1JJ2p_oj4W64GfHUTyCG5e{!usuRYZg$KR|+gB@9HM3jN`@f?$twNloCw@-(E<}ac zpv`}VnE{xYP*It-{9WI>8}sM!xlP$^wfLyRVR&BIWZI4+o7c$f2X zK`6nG=Yc{l%jU~M))BObeWIflV!Xxou(u2_4kXQrJVou?ro71)N3gpNsUn3g5IF6^ zLblPW5V6A@=LIl>^{3PBI>io}6Lp@Sayyf%3kM{L~wPd=X@#S`+Z1VIFIUkwdh0wUjiZi^(I}fSGrSzl2R#JZpw?g~c8vxA%n49| zGO%q2{qbg+nTes&ff>V$C?Tt4-_v}+dpost=DU|@ydVN+K^W`sod2Vh}p0s%XBf(%#?_fFB zKl#D8fAWLx_75HSxle!cgCBU?EB@)l+c$3+=#pnS8~oRgeCXdlbJa^P zI&XaU=#^K#;?IA*^U5nziNx);Hns zV^06i|NQDZ-uC(j9=P`xKmT!OPfwO*#aN5Sm0fg@TM+ia+(A?cyx{_fVR$~k?AL0L zN8O@#0q}W=;u!ICkMrBkf;dUfF9DeY@DBt+h$WvAQuzRWt-qt7>2jH$FEtiK42XBc zP%!p>K4{9NNRVFy4t)ex+-f~bI;rrapzpj^4FF`lVo@#x21wbndif6lm2Z{-SBLP4YNZon{@2zYdEV5OrrI5aRh zK265tS`$JJ)TlRBJhSSxm%r?#FMs*>ue%nYbnNj*A9eWh`yY5@*YKXCR660rQ?oqX zz2Ui~%a$E>=<-Ihnd!V%Z4%%&RD>_H@mTjUb|m(d70hTtrj=D$P=D_n3n6uH8GkI;*$ce9OQ8 z`x@%h_ojFK=I1|Iw0PO0k3C>hyIGbQW14BJUZ1U$ z%UWv<*lf;g-OO5PtJO;LJV-HkXk{;67;?+;g@y*E8mL7ZIrXdstS;FViG~d0Z@^M` zvM$(@$?eGO7^Qo$Ap>?6&j{Bvgl(Y3uMTs=wpNhHR61$^x)fu5ZvLT19*RrVIF8Ra z^UR)}?i+q{!yj+{(@7^E*J{+~=BkSpFWIqUyD@-DMN!h#(OD{&nk`UKl%;94QakIc zGe?K_-14UzI%?g+dv?Cy%=6AX>+BWJuB=t73;O%AwDs4&-1CtSz5lj5Z(p-=)xk#| z*3;9Cic5qk*lw>)k_9Uhe1$>;fK0MP+yZ+tZw6$vj-x1!<4U=*ctJmDjf(Otv)r$h zwwkRL03a$w<`t(c?0;*GKNxcgR5Ru_qkWJ+z?K(-T!IkFMOXV#T_?MMEba zc}UN~p#zsp4s?`uHMByQo}SIME=7r*gF?boXOU6|>^JoIv+J9=j+IKYTw%mXaqFoK zFc}3vA{~{gdi;L#w}&w|0D!7QDhA4xN+HGkulGj~N2MOU>mI%No=7Q7`e<@x{_x`w zL{Spu4_}KAMR8fFrg`pHT4NlSRJoL|`E7G$9+yf{Li+K~>PM<7N@FumP=dIsDizSV zAQ=IX+e@1q26|WxhKK-o`6h6JodTorS$hl?HMH3Ya@-PFjytd*jAw!o4lNA*yQFr} zaUEw_z#bOmV)u6!P>VzJ3vk8#aeBf9?Y^{~97{m*k_ndZwz*SBE&R29XL#FWNumS$ z9FjWU;7mOk2F@rs(um?|gS837ZY*Gx#G^vNS3=0phw>oggz1&9(O|dff)*B`4J6!D zynly<%rFZR%+Uww4T<^vKqE6pPg(^xfm73Vn1l8S1r<$Xsd5SfnJa|oVGQ|L+x61c zm4$O<#Tqj=Y&?agzy@MI7v(F3l=5NAh%+aa!RVDgRN3Zx4YjVNss6$c1RAq-1V z)DrC(3NAXd>TG*r`4jijjWD@t1t>(N)<^L?6Cn%7a5vEaZ#4nn_N;KjicUUU6X2A} z$hLb0wp(Q1HX`6nDuS#5x7nGw4_&zXVdl=R{kFR4s!sxNAu)!a#F7`vp`^?TqULUf z*=(!&?mre0xB!s_>F1fPZc4}{byXOSr9hZ~B-#UFY|W8FUT(BZk@J6jO_#Kt9Gy_U zRp=0Sm9#C7u#c{`2RovNs{Dw*Ux{Ibyl*-LjU5QdA9JYlg`2X1AQB4hGA z*E&sVJx@LO*dK5G%bQ>K3a!oezWx2#CICdn7&0abW<(@l7wk?B(x&&pWRD*0+E5gYWIwvTkBxB-19#a(AwYH4|k-65zLl%my5nZFm4vVpMZor3_2iSkTWswu6p zgDqPox^H4|2~MZ^==lXYpftAD!*Do&yn}gx&ho6K*d50S#ILrq3KG*hZ|ryj+SOkm zUYOWac}7=Ij~NEKTn>YochxcjjGpH(0bt)r0O&SzwE{u27i;5YJD4M6Kk57eTDC{P z8?l5+!uNY-$E%J6SczYtgn)7%l&y0QIUp+q`B@B46>Kvsig79#q^DG9kOw*xe+0$B z^nD;AAeEHN)Vjt!k70~h8!$Qp&O8IgpwR6tBJm;+7yzxE05HQ!FPNO>H)C9}8^QYW zB3pGSDVIQk{2Q{Y7{iNH31tkWC$@vZ6tyUw$7p~!j!`K@(0L9-nK2`~Mt9u5bIVv` zx@Afx-akEfE`_)hA(%AF0MmhifmRl8TQ||)TkY*j8kriNGwUX1X1bCX4I;GCRx3-Z zQKIrVZ{=M*YI@&T=beB4i6=&JL z#T9RuZOj2ctz3H5D_?ouMK9iO$--)FE{YP2W2F>CNTdl(e@|z3U#9{BpuXOYa=9GE zk>=EcSLr}-B&4MH=Wx!2K=?ZVc%DSeFNmk47&m?Bfc#TIv7BW}3_z0FB!7v&#}giC zqsSq4h_g`usxd#mU~uTJRn3x!O;;EU3AAgh@qo<#H zNlv)x=_h)I7ON=ISvEd7sUii4pkiaP?w+niix=K|&tEn?_cSIwl(kkq`^=F?AJyO6 zJ2JcnPy^y~t5-ht?22brJY{sA=h^hslr1x+wt1eQZ-Lnr5Y#hTEZ*mdYA`-z{Sz3Y zlS&1NdOK^~9Tk&hQ3RRRQ4#@=(Yeku05AZ3u{!O@1C}jbJWd@c;DHOf^vq00X9q^L zOvfEvT`#}%%vX0U*#Gb&I;*An&UF=~2WzF#W;0T1Y;j>;ZHy#N#m&^e+aI#5L6@ z6_p&K+sQeZ=Oor!EUE;#dAuO*+M6u%q;`P!%=S5!2(`ua&MTGUIzBEBBd4}<7f(@q za)RX&1jFQ%PY}W9R-6^PEA~++CSI)IxWpFtA|Em%vw|>f5ZoOK%(+Pb4zP$f+5jN` zJMazyj4H%KWBcuXcl?K(qjZM?J6=UX*nsE4Ls}U0)QvQcKw-qJ*aEzhDSkKQ55Pfj z`|a{~?l6d6lb>zkagl6KVO)Ha4T8QXx07RYu$Rz_>=zJ&fwtLmzlcdxLQ*#@Sg+Nh zY6$Xh1YiUeQ!4bWSZKilEGV~aYXF}7XC}N(WyG@uoT*?h67=)E0p9~zF3Qn)pju3{ zxGq~V8le?C-zV8}UYhElKA3YPei9of=Pe2*Aj6JUb{>C$YpqzBsL(G6#?fc&9nMHN zz(5&rV_B2tW|GCS<(UE&0V>+|DUU3CJrz14VM2f#``{SC-k6 z(Gz>*fc=vRCX$Ql=CngGu=q!~Y?^gffuKZnj0YYWH9|}b)Tbu?vS`T_NvR`m8N`VE z?4DF`JK5P@7@|1B!JbmqB42K=6d)<&6bYg2wozaVY6AvIYtZ(5gb2Gj34pYw2n=Ot z3_*t)-gy(?9AWG-qc&l~HY4N9hQkm>1jbZ5s&O1gQ4ENsa_L7u{?R2Dox6J7+UHh3 zuPPlTt;b1%O2wrZF!}M1e|Y%e2Y>i|?>X!2bDm!L^ihW&aoF+$9(eGfXI8A3n4B>x zf9KoZbn%7f-E_-KuYA=jc8`wVdFS10)~;QZ5e|_J({&3?B&po&H_!CYnmrJPdsAG@m?%)5$U;lLJk_Df>`V+tS$@jA? z*G515*rRCf_9l$RAzVptGu2Vc1eAai{7dI{J) zU>35QKmd|03)NoSn_O&n2>}760-a!;b4g%7%js9HAQ@sOLX3WZM6tZvjkv>2CL5f8 zr4XhC067H>;7?x{S@=D1+;$Q^MPWtdiH;Mk=VR<@2y8;aJsw%iybB@n!b{+j!xbMc z3k3dvU)u{;wQ18oO16e3dxi;$>GMiBa6+_+cbl&TlvBKs2;53eS&~;EMs`aN0but6 z51Z&0aCo@@B7$N;Bi}-F0N^vHY!?Fx7IF&KZpXu1zwDo#Un2vc z6zICDl>s87n;vO_fZVZB_IjtLqNA?2NG3;ASndMKg&PGOu^B!)Wva+O#I`>ux(?I; zyen}p3}Y_;m4v%I!D#?cA>|askuA0(ouh)`+17^L(*vD7Lr_~j)VX-c!iUz6KDlYf z{xfwj21w^=qqACys~t_HmMD4{hI+;x$3!F|8noLB@5$HvVPt3*M0v-Z+h)(&OZCBZCke8 zd+!5-ix%|_46bY6OghlfYM_rssR?4>XM(trHh z>Q&FKUb(7L>Bx2N#ycuaj*maPdhN*Ycw8;dHRj*@;eY+=7eD{CZ+xv>DmCi!zx~}G zwr$<=-{1V^VTT`d-M79OV|35G_uqBzg9jb7JW47flam{_?3kOYBLM0A+0|=yk4+c? zfMnOm$m-`eXhX7}ywe(+q85bqjD%SfiXmH*B)QTPY>?=NRf!>#;}y~NAiv65S5!>* z0=FZGR? zq0Tbu>e#w%>&_ipy9WkT4$x6+SthO?{4^QD^24#A_55ZbtpJHEcB-M zougkA8al882!@VBBLsj_sRRf;ofV}>DP^=Sl@enpiXw_Yxg-^JR^qIwmn~cR!GGRg zRVtV^o_%U%I^Tf2na!H!^z6dk-bIHVQtIiM9vhz?pQ%L9RgDvbauV;{y>t7HZRJX- zF`p%sauUbdmQWPg$NCh(a4Zv51&jYhe zM0y|1^nh=&zmhm9CX4*uf<1a&;C3@_LMG@;EDAm}xK`H4a6l=&A_C{`$Ujqt48R|@ zf=qx6yV{^Ll21Y4qOH)4d79@tER#kA?Buy^0L7bqU4hIkK>?mbtqSt;A&9&ag8}C6 z6?=4?|HQBJsf)exx-9l^i1`+7OEDirC{5txi*OZaR|iiz0R7S`as7O` z3%T6AiW|zaY4Sia#%@8uA(Ld&Y^S)sM$lcNO-pH*+4)W8Av`Ta+Kz4z5jm#?0CLJY zdkW4!aUVt6p|N1d-~iDdlHzp2jVS0C>9(f;OS~vZ-)?5R{DwF;G0tpA;Nj01~zj?r2RJ_aL<)*2L*pKbz}D%^8Ja z+u*K?8iw%S{;}ie`Hp)RLlYn6!tfBh0ho;#rp^W+3ZIQ(ToL#OH%0(pB8;MXW7Y7U zoA%%DJyXpYg$XLINepDh3Je592DBkCr0hu#7TDe1C$jgA5&7sC9KAEHD7T#o*~)m=0ZHG>Fo{s}Jc}#kyY9Xh@@#Z?Q~^Y_&J|Cu z{_pF*_wJ^WCutFnFDR#ocC)7Hm7`tkJ}HoxK(|8&T~hs@2*eC-?8 z{l}NS(x|thQu$r){m}Y<{m|KGpZW63Ubbb+j_besgFEi}Tb9G8KK+H=JNKM-{y8ss z$xAkG+V-9A|LC?q|5=riZ(MU-mNqYa$;GFge%kfde(TAno__P&-n?!5j<{5b%jN6; z>+6p_`sCZ*`o;qfKImsZ`r*9~JaXd=zwPhusW)3m*W$n2bMNlA?|JXr-gMk?$8=XK zH{E*M*Z=F6MQt#x+v=p7OP1`fCAh2yLD7&9#^jwT@=hnM@ zngm_}WJfT>+QB4O+xwMIQA#G+RvHQ_~`FPL@Dmz>JJE(kFnGMK#`X(02sS+#N!?!8B;D-q9kcGn#S1eSiqHp z1OtOkKEiSv~AeW*sHn@&(u2L!Hj*)Apia;RRGE`KcBKesB02DyPzeb75mvpww z^w!-wwxQUsiV=)Xv3|@|`owp^=p2;Gn9SnMZ>9NXKqc-}7f#o?R4x{@$_b5_7h@2t z2^Aqt;-63`67d=UPBciKSnfv7(t8hz5Gtg5nqNFA8q%)Y!3R}j=IfpPgMEVwM|W;& zwdUivBqK$nqoh=>blGPrCCWyqlp?Bi)@q#{{asxn!@GBE+Z<=Di}ve#$Hm7iT-rZ9 z-JCJWuO3`?<0C6y{<6zI|Ao(yQhBCpmFTD6y7rM9Z{Ba9ryj#BsmZzKv{t(&=MFpS zm`{J^)BQsW_w3qp&;k4Z{&&Co#Wi1k#od<+noEH~O5eBl0FJ>9FHU(;%)r6?f;P)g_2-`hR3XmDg? zY;GOE0`AN}^|;UNtv6cf^s0KDTaTmgDr~*pY`Xf8m)g$Xn?nk3F(> z^@i?&p*+t3%?n>}Vn;{i@yDN@nw~F}EB1JJrJ&Wy7xecmSv0tM?Ro@^lG60lXsud3 z_v|zK`+J6W?z;EEhpV;TToKDcOb(a?h3!^5+4bySh!^s8TX;1z~{4yg}>m$ZL8UkO-@ zBg_PThSd!WaZuz4nGn$Smq<|K72UUsg6;G$C~s$63gSQnfGEq-EC8NBVZX~dIy(W# zZQg+j33Q$jhW$YgDM3&DlIlgXqFmNSK9-_nR0W zP1Bb0n|l-E3a}{c{EKJY0FdX|f(3(JJw3-9a=@7<9~H%sPV;Igeh`<=hkIXY-NWBfB>5S$fC;OAkM2 zYS-lGhILzaZN2Uwgqmi^(5hqmn;uFuWP z&dx=#td!pOAd3s&AclbDBNk1lydy89>D-4?>sGdWSS?9dWrGum%R-(XqNs<>f-V=s z+0X`pRD&qGf0RRb3^}?qfPme0ShnDI4z z&I?4kfby@9u5hgk1Z2#aDTUXAQ^!!a1p(Ukc;60Gc;G&!UU(8O6eRG_h?0dJ_j7K+ zH+~HGv4KtogHe!Ako;glaa?U>=f{iFZL;KBULSxNKRfIlghKOA_YYx0M7*ZQm!`NY zO;IlVOCfK$E){i=)tP1+d3q+B()dHwp2H5(5`Wh7hN2`;DK|q`x+k@p&wN@ofL{Y2NpmYx7Qc^C(8xi5M7>8GE1({F#V?)g<#D6f0N+kW_i z??3#|gKv7r2PbFh-Q8WoyLVBm*}rJ8+ELy;JYrg=tGCY}K%UpfM*v`8=`uh)zGni=b8A{!V;zcE*we~aa0hGWEBCCOmQKgA*zIuKJ3q(7uT&Ibqq^zQ(>i?TtNJw}kFo8Vg$It>3R00S7wll*+Q%P-gz zz6s8O;eL6fK>s4=eKF{ny}FRUrEr?U(+C+2@NC$PToAwU@D;?&7$t&ajJI##8KeRW z^i2>y=~b12hWVZbBj9fiw3`5sj5gIuSw&HVSV_=iEtBUts@3E5^}A+<25Q}%9Z#>= z_58*?ag;pw{OXPC*PV0DIdk*PXI4D3dE3?_PB^66QC;!))*WNh9i36{VE2M3+O%cE zV~;&{=}TYU-_rw{hWG58G1*L%oPW~ta#h{6dU*5b6k=3wHYR54OP4LHx5nqQ6qVvl zf5~^#%Ek~z3K3U6`z+|R)YV@uMTRtjLZYOcj807M+_}5f(OvDR<#`&%N$OtgQ_UB&BlR(l_650{|u+eQ~99 z|KA_!>h393%Kd|b>(*|3?&-$>43_$O2M4vu;sn!{zWerD0ZgfDQMIE+WOrgmB2%fB zhsP#%Y~Iw_zko>VwAtIgu+^yF@yDA0GJwv$rTc?Q5~W5)CVuqoZv$Y*z|!I2v2E+u zbqp@vwsps*RV!-)3*sm;akOg1vj9}>>8W2f)#R;ziQ zlRYPk2uT}v&{srcK@JHlq`rQ$4Nv++4j$Nwn^n=Uequl~l7a zGc~-kvudXIj454Tvvp+KcwGZk5@i~=e*LCH4?4I~?QCYLU7TV7AyNwLX$u5sETao} zQs94FcVyEH@GgKWH2HeNF2a)rcHxdv2Y^YAo`O3{(0N4n4gv^*hOkXe#^~L$Lt`Ii zz&_MdiZ-o+`%DUJJV^PI$6J!|^C2RSp}75mVTIq2A8xM!!nwUlcy7uqb7Tm_{j@zf z{P^%l{z`=}eAZIB8otptu^+~JAtPldDvh0|6t;)MP@5s>*l*FL8i1VFMj$BD=_nmEm4$G~?*SdeI! z&3qE;Q&8pX<70;%w&$*eoDKVr4fq!IL!g(ccMs_<2Bge*hjWQ4t zVIB?-s95;c?o`Tl$cs&aJ4wceiV_ZNF}N0}*a2TD&ZBPstD>Zqx3+BD^!dXN`(mx* z*eo-s4Wa=JfMC$rsKp*}OF-mJ5CG8Ckqf-}j=4Q*>={v3#LA8=AsIrzs8lgZ<@u^D zoByjmdw)_(NV}NT?rch=oM!rSH_1n}M8MaTN+m-EP-)|)A9@!qGDhcl3J8e0R7s%J zjY^R*I&CGDTBWD2IWx6m<66MD);ju7+Uv*cNwj;PqUl9)w4@921b@)C2mdo5vmOR&v3UBuC&TDf> zzz4%?{9jm15WJW8JO8s&-SB#z&2o;t(8D%GLn~BiAd4l;%K$r9=0!GwEE-DCI3yP# z1k;%4b6y^keMnnSID+EC-5a=))AbsSHVDwy*P9tKS>Bqj&(F@7ELX7_X|$f-IdRaE z?xY9Sk57&_TGfu~maW?!dE}83jy-zy+O@y<#jnRkCeOX}#HIUnbS>(8cHPLX$(fnC zw5!%JF)?$;?ROl1!bv9_f86hX_xr!xc1tTYTc_*Gk6fHoVf2}8Ihr^s<#}^*e5~GT z%{Cg%X0z7OL8Jp1K=3mIWQY)GVBsQEDr>d0$(aZu=)AMDBkJwfTIV`fs7U9UbWd;p zz=9z})LN&_Mw(`b%4F$+p`j>VOeW9L%#c<+J$aTY-D*@S zmF|O&LX3=oJWsVwQAZu!U44Tm06^Mm5}5A({#LWm+0`BO^<=G-w2r{^4-El8mZg+u zUEQ7Wf_|N*xt8Os3ZqY6cs3PT0K{;vn6(az)=;y)Gn2+x!?~DNuwbpsAEs&A64xjk(&LbIZNau)=!v;fnnj-T;L;wS6vxx|H z7a`ltG;JZGwuAr`0GdpLa&6LC1_%fWtW3PTh(%jua>d~Q7Lss8U~us=DA=+~3M;#6 z5fL=Rk zH+v+zOOcY^1#=zf%9yQ>a<0v<3jmY}YVy4cN7y+-R6s$-*gnjy<$-{pddYin+sQ_+ zZ~?Lt`Lz{3M&0|<{uf4}VoI@1rGwkUzj@mKzkFP57SbhtT6^0UbBzeHtUA2%x{*(Nc3CIzhb!F;)c@i1}a28bBC!OLJ+A8ImrPGl6hz}Qv2TBZ`Yf-2!No##kO{%0=M-CMW~cP$Z2$T_KDrwudO$pELSVqxVZWOq!Z3vyDz$^Qf@a)q^TB zMrW-C0w@(_X%kUZy1FYp{YL9NYatPWGOdP+RrlahGDc_3tWn1(B4f&(1Ao5l)_1(; z{h#^t)!(}2zipGpCMLi3U*G!quWwLF8Dn&wXL*VWOSM|1qr+&OHd{zWArk1kRga>m zdtd<&X`Q8M%jPCzZoz9B6*P#E#hV5|s0fI_2f%t-EDYD0H|sxm!Fv|SE<#?#K#BpX z04o~_+6(;hfm!w`!7lM}kf$)PO8_G*Pg1!YoZF@XLC|qv zOF~B(*eE0TY7cw0>3195$Wcg(I82z=T$i9i6XVYtO6zzZo|A_@hlK+@9$ zz>|F-o#3~FAwoIPT;yi|?gr7IoD+lSe5C>+P_iJ#Q2=N1;C={a-N4=M3d!vGvFP>_ z3N4pgA4U-b5j!&FWWY)mNG&Ah{F}?l+qZ<@ghK!_Cr-iWd4I`HGN3q|`SJ-cl)($x zq4caUHz*JA5bp&k|MO1)H-zCA3Lz&G$8m3OPczNyGgBjbhU>FaNkRlB&-3Y-nX%#N zJ)1^XZrq_`Rf*#)&F=imUpH^vynW}+$?@sK4qUe4`H?4{tf#sKlx6d2eY!EQs4_U% zvwiEPr=NU$WY4Z|U-$K~k=+2WZG7gAzpiY}&)xg@CLnvl2h7e)Y}m4ScCM+=AZS0K z5e_QTB|vDUO`djEOuz^Lvoy=I98sa-G`^vRw=gNRvjTl!|n& zbv_5~^dli9hKy;|(-r`cac~6yM48F#LEnf9RV+#j0Enn{o@Xfl$gcQVn&xQ=h=59| z$SQZrLe7#0ZGOp&|KH( zBH0fji9o@bn^+zou`NM6H}vh2YtR5ge5i+EliZ8ZhpB~213zQmWCD^c|4KK|?=y`4 zZk}NFRk%im&52am4O3W#@^8@0eI~ZSyFdQLf+!ZR34WA@F%%TKjev+sMb-tNUHG9Q zW%7LObI-4MYDGj^MW_@carE@I;jy{-!S2pId#3C4MzfhNJ!rq)-UU4idZvbl*F3wb zJ~Os(LH8*~AH8XOa`nh;iWnnhxj}@f`uxP?_`tw`HrkLuA{7A{B3={j{^4cXAy~0k z*h5?2?Dr=M7hzH8tlJ1`r~zIEc3ba)Mui{4yO`h-FAA0yyr=Dbd)0*eUz!+P&j06ZK%mOOZ2`y%Cx!ruc$|c16&AM8 zKWLbJukE9cD*cRPFf$jRH!B{Is3OWlnAALhpbETX>|xd`!?E&+j>}E$`wU zqqumka$zqkRr~Dlg}QoQB!Wg;LV>_LN+PerWNao2mn2rfYc*JMVIRHk5~}S8cd?ei zI#9z#=ZUi$1ncPRF$jg!nJqPkHU}X(6d(hGsvlHmqXl*vXb~u1SinLC|16OyfQwW( zxxmT>JQRT(0{&x*+eJG}Fh_zwBw>+#kzcjPbF0$l_B0KGG~B1lJ#8lU-XPR+qH-N@ zRK$ytn*`xk#&IAPuTu~^IqQ;T#>?9N2|%YQV9Iu;0LWH$lZIS33GLL90z}dV6cU-dl?QXj91-X|&vPO| zBt%78YsiyQ1$!6$@cTb`e&gmhy!w^P_FFnRHFd*{x7>Eiolz85YSpaORCd419Ce;+ z5DRo!E+R0wHo10Y!Lck;Tdz*yM-fma+XU791;wvfTZ0TK@Cm^@WA60dT@w_=xo71Ul;rvepoW@ zU$5F?%?M;7r4XaeS_$*!uF<(>W4=^UO$`eayyE=hFTdi9mFxFBv}a~==kDIFj#5(E zyk+y2tvi-3S+f61IAYVRWw3tcePu1gEFwAjZC)?k663^yckbM|bZmmCI?X zm1i1NdB4S-eLbV2W78HlTh001J9c1Pi6UjR-QB~8Mh9JzG*M(T=>TClgUynO=?CK= z0Pcl=V6$Kr>g}nPBq@~eW#BigweVp#TePTcVGNZmt>OU#KOcZ@{zr&I*jC^-pfyTX z8dLx#0&otOh(G}v<>)4m)J?VNj~mqD-$K|TPfJBB#8)HRe*j_Nu!9|hz21b61d$m( z17)vz{*IsKf_&l`2AT0f0Y}cO20V_R!G^;I5hNcyN&z=Akb@9Le+>m1;m|2awMc@P z8;61$=+v5i*G!$mK{y_qIPWkuM&o=%e{oPj!1MkOX z9fakDONk%0@16>?lvKFwxP7(Z7Fd@70WhMl@^*PT012cLZd_A%x!X2A=&3u4+b?Vl zWZ+$fs}Qr{uPsyzvkG9 z&0*LKU@|TfyyTwe!-$}%ZUjB~4TKW*QYKje+!A-W6PyEZ*sIpem~B*4jd0?OTT>_Udcx0!vE zYn8ZmKtv=`Nwt@BYjo`TiLu{xb(~tR9H^2G0?;PsL&fd(%yy>^Ly!|0GDM^aG*C{U z!7hj~EK%nrGoT!xO3BOin*O}rd(~Sg!zK|gx*js`aj-TsR zz+p&q*yXd8$<0)j#myUH3eA z*X;lifB`7idis=7S>B4cancBxmj^xw#452xch+7(i@>3=j6_k;4J*q|unvQ^i!GwN zUPX%BRHEg}f=wRIIDNqoZhw`eHgYbiAV~`Jn8zhZxN!I?@C1n9CTxT0_5wZd&Ktn9 zZUIcrnK8R(I|v>iW+qQ$+i)2nS6V`haEg$WzuReogCRz8*D#da9R$+wxj=A0?^AiU z3&h8;C?^lzCm29VD{NfAjtZspn|m*v@|uO>l7rR@WwB`y8*eDVLku=|!Qdum6_p{!C@fsUrJ%d9)AT-W_lY?bhDcF|GVDt5@ z0VTL4}=Hny+ zk;I?Dl?7b}>8%475C#Tqot4Xj*vWef?;Ow%qMwy)vvCC0rLeq+NtU%z*;-#J94ui9 zq}(1rA{5pk*eg9#=RSG4?nC+l0uHv6(#9CT`Bs|dx*RLYbrfL~sa<n3=0*Is=TrMr#VwJk2rutgL5$)!iXw%IiwgtB z+%~X?Vd8`TNZ@ZGKakEr%apNK0Hz@BD_MTyU*Z*}DEYnNp?zfb{b7^^VSWB}|J#kO zQKF>k<^z)zqOtkiTmpAPoqzoMNK0XX&fuHknZt*rp z80^p7s$##KmxQ+aBm*nv^$*iq`)F;kA?*gq*Z2$x0U!Oa4-o}@0nuRs(k9O{t@GTt ziE$=r?V22V4ZfD-vCMk-LC729q2p`f9a%JCcpO9uw!lAtNwy$g z$qyk7wh!P;1wW5`c7TyO82TV7!+Iuw1F|6>QvmTHe%AwTzH>O7obbMhywE}y0|4v; z+~l|GF#xhj`-~6E9$mp>sBRoVhTfRjffHbGsUKJ>gn3?5gR~}c&<&P_lMJyW1;Xc| ztAY&C)Xk@c8@`}d9XI0Q7=xDB7YAPvq9QUf?aV{L{#zPOawCQ%0Q^4NVM2Zx3%JuZeagrKTPSC`h!iRNETy@h;S8UeY;1rRX;7rR-p+iaHxvOAQJJ2}nW$P|>6 zQ(aI9sFG4rt18uNv__M0Vwhzm5o-WA7A)E+iJ*a4uy7x;dct#l=)27Z#Ap&sHMQHI z*KqG=_-{V#;c|0@fkms3WTTAZYlp3D7>>mg&3)bG-z#5Hh&0Ajcf`==&Z}}aY;y6ios%%d^ejC zAs{H_dMoWIz_PnJmfU39Q#h`2tzlo~?j>@g$Z-fG2nH!kvio<4@9$lw@RTfy2%K~C$qtuy<1@B=P6z-1$r!gKtT9AdnudTb%M)y@6-0gr zi1wf-i=Ec{7VInVHO3G|+!kct3P5C!sUkmw-XB^uP!uqPfT9pL73B-Ci3;~$X^KLO zmh}OB_oAquVK?s*A3%0>pHaMbtnq1GK2_5DS9zou4uPy2v@-WY$VxzMv-YeY zULve5EZ89WB4Fco?S&xnGzI7CQtZfD0g&Z+b3R+RaPh!`zKxr=OpT4~X_@cc@^*ngvtspgS*tNUJ3BYmpxl(JNx53l z88sUjlIrT|n;ai+&dsPOo@``yKE82mY-;!Lw0&c_qpNRdzuD>OJk3hAn$boihCv>Q zWoU7Z8D6Ld1R@4cio7IQSWvtkIG^J9iL*9xWer4re*us2fhP-^z+OSL4GMVE_96dY zmrY|&;o2N{2nJd|XD7-~$f&vhAlC#1FP6pCBAwv2Vz`8yA(m&exE;y`9)a8FW?lrt zyb!$H-T%FQaw4ZVN90_(8+jCWU zet{@aVZgmSirw*}O>LBd3Ri<~JOS8503zAi&e{1^qt!~HN}gpvD$UKv#6-Q3Rm+G- zxq&>_3UTXn^Tvl)^>tQ`I%L^JXH{3O-L_%%^IfH=uebZ8^UoYwI856<=)yW4(H)#etpD7UmTvTEw5?7do|J5(%GufTeIW1%oc1zV7R zu5Q_cdF4wT4JAPRfojLjzmLQ!*MWMwLlQ~VTD0Vw|zUA1sh ziT&Ci)7E`}!if2g*L}yKg+%}WAJS8JS9o*ry*%`?l&R1RD$EImfb6bmYg%AhxVNPC zo%m?$7%7x$GDb^zmjeynSKY?PB~_vdnk6zI|kIr2Wjv1R{&j zh!9Lv0ivWCoZByKB4VG6g(p!M4OwEsIbxJr0|1`p#eh!&KoCP>!N*_$!`Y-o!@+AG zh8O$fzZW++=I2y6n0?!q-xs$>2zGI|w=+*JEd3Kk&3*SC*EvC8|J6oWJyekcuHY$t z21|%6vOAD|IKCmtj!+rgG`AZ^^f8V!z>TnNyT2q<8%KB~x|3NAkT#35DOLkd)B|Pl z_$F-Les9RXEC^)^G>1K{xKtiQmL~+O85=*^WM=9R}^X4TQD4YGNL zc*e}CP?;-gurH@7gU;`gJfz1533S_rIWh#TG_~T&jW#)-nQHuTP$Bt}E`}cjvb()m zQK>>t*s$HJd1V$`pF>AvTyg;hh;Km$EJ~q@RFrF-Wg1l6rmd1}59ERz!LzF&0!zS{ zdyDl64iiVuqCYl=jdDl}I-HM14A#>4rJ`5>?j#b{A^t^x`o1q48@ z_$ZiqFaV-&#y!a%d~1^+PU)4-b0UoxVO+8&4%6A6 zP_Zo(Ocb!O@zWTd*{B$tsMswO4sPdp3h|@pkGshbfKdREf?7w%vc(53=o@(Wk%wkx zrvJKm^soPOcLdN`sj4`cpU+s5$tXfg3bmm!Fsg_H% zlF4*quG!I5iz_9gbvcO_FIl{Ed){g^>$>@+U)_UX7nNb9)_K$kr|);b0Z%>p;O^Zc z6=#q#s}^wPfM8QlE9$u%5F;=DrRc!?N7x6o=?r>p@sE`e1mINbUVI(>52BqyAcQjU zNO`;Sh~!%(FXML#oD_5%gMSNs@CgpDF8mnwYQ>wv947yl_{9J|LUg8kaZv^C6FEzn;Iw%cLZ&^$eJx7X*9;E1S(L9 zm*k+NVOdIhf4mA>boUE?+98L1n7_?~y2n+-R@yRPX6NSXjb>M^Ohjp#&1cP-xj79c z)o2hff@V$%DT<=Uwv8=#a7C8pC!TQ3@*|Hiu~K9@yQztJGi?_rtJ*h1pt9|1(+kA+A;{^H%rUPusV zIzh1wds|xAwYDyX%fQ+%ZEs6^`hf}!;Ro_>g=mi(6zHFC0ly-c)od4O!6z3QC>)7k z@7wnN!rxDOzp6be+$M;9K5Xyd4JTy(|3}|HVz2)GZ+C`pj{u-Bj^a2eb$53)n$5=i zeE19&t_Nq2vOYopK}83YJTNHm<@@CgGel`A#g@k+6u2^ay8xk`=w2NF7Ke8Hs&Hi7 z)SOG?7xOy|aP9E!2@AVz??l)?dPhWT*!E8-j;9?d3Skk6%DWI>_yY@;9j9>T(4(;= zIEi4Ll$|znM&sx4#K9Cy93eC!%U_C92%HiZT$4Mf%_jyEquxgYaOO(h%wZ@ez1)~M zU}YM^Q6#%yX$iEYUL>{;K&d@9M;sLb`%9NFXv^fu5#zf!THB2T+z6XvHK?c_;g>efoa}60`Vly8+q-^#SJY0%n{j+U< zoxvMTuKUJz(>okngoy&zAWoE%J*Lo5_Z?ico>i@F!5IC`W;7+LYz-CGN4qrm%H?WqdgX7XyyzE=>I~%xC9K5 z0E}0Tdj(9%=RE-dC=L-Dy&CaN>`RC{Do6%EEEO)j;>>CRwgQYJAU@#9X^P$O0>Rcd zg_+vG0U!XEVL2Yo@0V0!APa|goOt!a>0)!@mm|m$7qIyyveLKtq@rb$gaB;kTyuzs zvaM6dcO*;3%H$Q0wb39%!0N~V=4OZm(}B|;-lrAW36b53$>E^aLzneHzikX?+ZlPM z2Rm2Y$Qd%5^)QAIL1(7f0Dve-becj-tIjH+f_lT0VwIEuh|?cV*3OBL>!{9BjFbzs ztYH2AG>l;sreHXIDC>@j)T?bxqez4;Be-1tCT@lZh_u$m7?bOAtpZUpHqltNWa-W& zi&o7{m&!?$Byp@1#xqm1=bm@ro8R`1dL!MvbL53*ykO(TjT2)#0gxz75^U7x(=6}l z?WP=&AVy`3nXfk&EnL#m**ib6#iP>lb=JB0)A7lq_#TZ@8Z4G6@we>kUud$$5$@A%!@mgMt!R;8`Y5X?ar{22S} z5FdjN0;eolYA6y9I6{!@3VO`h_@Iq@cTGC(@IRm*fxtNTf}D=mO~{*Q03b$;01cRw zK!Hj~l}O+^G|u3u((|I6JR50mU*Vb{eDQvc6h>Jq)w!O}X<~AEVP7{PXk%uk=jP@b zV5pUXNss`vAx)qaWf5)~p1AA5XGW*zPCo7U0}eU}OtfpquJx;)d-R!S)@+&5&NYED z5FsTBAcq*B)oNsED~?o38lwnMjZV%O0z*2_4X6k)vQ8$7;!-IwMrUa*6F;`$i*+LK^dL9@=9QB^gC=0_1>~)W{I$SjoQ3H4(O!%!{DjPIU-kmP z3nf8zxaAgv)3yOs@xy2XB6NGe`fbuc+0?#bA8lt5l^g&Zl0ynQF9s1b*F%|@nS3SQ zKa`t)tO%hU%|tyt*CGOpIDi5I-ebilm9W@Weg}rAV*P5^83Z7dG7j?Xlu@%A8nvZ* zM9_*0Z{3O(;Ux0Ngz&ZI?E%Xk|;(h(aw%NDL1)qr{zq0S|aor=n@+?WCP&W+lIPW4!H!`wMhz|J%kFY6*mVg zD<8LWd4oBsVVCVx7CstFptC0+WaZ$g; zKqDcZ+x*qt#tnDv5&mrbmY+)SKe(rJ+{!p5ZKb`iFdSsytwa6zhcO4ZoSwx($_X1O zb(fp{;6GRc0`UNO!b1Mv zcKXB;4mC?~ofDDrzMxaU_k%Yyagv;+K`cDm2ig*lin)gB9W*BNISvB(51jHbq9w?_ zSQr>N$aU(Ai0DN1LHVR08pRLP(=i8RkhD3fiPBH z{>xB~7}%bdxfQNqNyyl7yv?BqV>Pw)S59?Na?py$XmJrN4@)`N1_L3wKRfRjj1P)L z`C&!2!QJ=sXe}jX$*s$(TH{U!qHQ(FUAIFgbRjySCmBIMHrTd+6 z>e3Is?!?kS9}G|Z@P@yC_;}cCvK_Msw z3ZWxWkU*N7EX~qpBLYwgJ8G4Bqd7h?Ll|Y5)vkzkS*~#y`BMctI4!d8W0l*E%|MZko+Tm@0B%yPLT}@J`;bJHf~R zz?e_5Alx4~0}tVUiZ~VIKHNk7M_3(GIKsU_Eg*gz@^CoK=+16~Tj#hNgrqSfGi{L! z_gucUY{l|ELoRP?8!LR+haZx`VDiV2gCLLVqVW++u#ntN?a8}^fG`~uHX;PYGf3fS zPMkt89cA#+WS8Z?l&y<^aWGhAkHIaHXbBo9^SzD$IW-E_*Nc2Z{Sfh?I7*pqWOiZc zN-+@|PNfFl+884UDg8Bpo(XFRtk{>CaKmj=(f{g1C9iZYn8GiMAGx9MSMrpI*D`?T z2;zuB0_rYsYGjC-Idzt>oJ6_F<(V$V;OF?!D;Sa2246OKpMpB2KaLopu zGJ#uD;G~R!8Q5EhfXEO;p55CUlpAMJlYqpAL&acZ91z-+vul>Ef{EAz``L0LyFk|7 zBH0i_Jjucs$VMsy!@cDMD*x&f(V-8zWQ5m^0FNmENpeHzdTGbdC`f0{JpYn^zxwJp ziDqVImLGh`#TQ-l`7eBR&9hH@{*xd7-S2O{{<-I}v>7E;h+_Lfowq1!VH8JkLOR!k zuYC2Dci;85snJoabyA+`Rtlh0sp_LpWQ_%z1-FnOz4u+0@%LDW2!VzZ=Zn}e7e54K zOdKa^+8P@kUb1*egmIqhIF2U9C-#g^9@$-e)fq>1_tzd>v*WI3cPv@B-{8>Tu05k; zd&U>^^*#Q?s)rtaJc;AiUUJc=KK0?A#Y<=QY{^Eq{NRSWOiw?NveipOFqfrG%vV3L z{dYTeo_+RV9i@_)Ze-0?nr2;{-P-7+TNH|Fh zwa&r>ndCu5&&Hp^uLx*7kNO9a6u%KVX?{$Q33d+@qQQj6Kco1A{LGvUiGWWPVCq94 z7$Vn;;YzzeawrsR)lp~%f59G@7`X$h!lDHB@+9stMIY@U!Zt-dRH(I?pKsJ^wMeNbib_eGXBq&bSfyE} zwFyotF@c9h@0dcpW{dSxK|z+2+6NB6!-Rb6DfU0eN`%+@2}I)QTWN^+=eEbVk@U*O z8V54N*d8>74G!iXJm2*nK>(t*uYyL9%(GCT4dJv$fwa*-&^viR$ls*b0YO6M3mhk7 z@BryEcmeXa7HYg4!ohGXGXMt^z~O+4XO|6+^LifzquPe~?H??H zi1WdMob4C8c&YGZ5F8U3r6NPrn4j&&7eHeI}tAm=i{8r z+dAfhjzZ)28UyJy6|(y5ItorUoZywjGl38}C_umc)e={300-036@EUsoH7!a;9Zs_ za-8H#WZ5x`pCy(l1ah=*z<^wl%*5LChpj~sgTWw`!0PS$WnHIju`jP?)=#2n0cPP| z3MIJyg<&Fz*Q8jh!8fYi72N5Xe(cw-> zP)+O$sqnCZ#|ReMw7*T1(u>bSA~&N@;e~9Hp_2~!!oG;r3MG5UZznO8z^;62MPq}X z1AmJ_;!M6SdZ0i=;N7G>dr=Z%UK;IqCo0Xz$zO_AiIKk?h$y#cEGH$DmaAf>oLYOPzz6TpSIn#6)9J^n@UB-Im zEgXy?rI_A$bpZd3r0{HJM#jk+J21IW;w>Q{E>aNVWG1q8R2$tGFhq(!W4~c*V_dsA zLl6wB|A$}hvqS-QArXoPD%ycP57|kO!ywr#*t-*kb&;hdP_{{mUyL??qTEi#(gP<> z1;j^7V}V))78D+?$*lkkPjj)IBX_Dx!Qr+U(q11cQ$mbQWBT}0Py6lv`|kBW{L$CG z@hwQl2bUi7yI=k6-#&5GTi)=7`TF$mp3zclN@bjxor*g8F^=-t=}MCI_SPmQrc&Ld zfQAMKzW#-Od)3-?&ra>h(k5iHLqh|3)|!|c$7(k!MQ9LMp@Z_ZLe{WQA}P)@K(x>q z2g>DD%XiO#T62EhfQh06D342tHhE*de#yB-@woa4rw!AT*igVfFNhR3y&&6-LV%my*N;Q)jOj zoUsG1&E$N%7ZSJ>EBiS&@^6gfH9|<5qnu?~EXHSp*<)r8H2&N-r~JmmYr* zKsN9X;sLMhLC_&XBNie9!wD3cy66G?-Uw8+^$GlZgk2A(w}IWpN1m?DQYo+i52VX@Ipu;8}|6A$c% z031Ofn>4h%gDH*oX50+{H78SfkKOOI&~h7OqkuK%2Z|jRtr7&}U)$>lB(Lp=oJZgS z8U*fzGY&>6MPziIb#!#h&dgYM?4L;xJjczkJ4s@IsKoFH?Vr#bLch;$rMN`GjlWn9 ziemc+IhbiLx+CxOK;jbw3XtEKm0iA#GQn1u<_ak^$*8iX*;a^G3nEqY&u4703s#WR z4=l7$v%I^q>-CXM6&WjBJKe8AQjq;8imkJ)xa5evK$e=YY`p2B)9k>+!Y2j*#jW(R z4lFoOGZJCifZX+jO{C2Xi>b*l&l?n{$_k<)arDT<<{sY2*5LKg`$fmkSkM&Ah`8Z| zVC|8_6NOR{i?IsPZWg7y`4^HPPMU2@*lTL=Rd9uGjz~FBNoQ}u{bWrUf+1CJ>RO`8 zrBc?+fPhcewjCFH4xSxCnAapf?&2kEyu-cX*R#U2tMPwp>#i8OyHCQ(K=8r!#IN)X z#ZX1LOF`TuZ3BOo|4PzjlE`*K3tvpZ>K>0~EP}$7B#stkKGb(0#B$H3DEO1-gq%e! z^p|98yb@R~ckWaH@S9n8Wm*>44HE+hSnLs5JH57tipDWiD&=NM^?C{_VGrj-X6r+| zvLZ5WFaQPWOr%{QhDTSiO&Kvi1Pr*WgFZUJSVV7cfIvXry*c42Zy1O`#-5tPGWLmW z`(K{H5D|blHn4sw&@u4rr0wnKrxJ;k0wu%B4QBZAVB~zEB{~XxtYZM(;Yng%U>&jt zSl4JEQnrr}XtTs9h(KVpQHuSvSh-hG^x8n0AOeTN6!<+d#$`x2p=HI*_d3rEs|5i-_O77$`_q`b}1>{a@(KoyZ1h=%b*k?xze6MgPk$3myqa< zHKBk+?Cc>VeBnR@_c{WkjUfVzz@$3Yx&@d-l}#hFzx%_3vr}Um_snHEHJYh53RG+i z0OLR$zhy10P?gJ-gBEu$sFij;w{f~rr-kWI1$)ZzWFxIr$`K+NqmZbjM|X_wzo>HT zF$W%WP{+=VV{`RZBQ;?K|iYo>9!%4ui520WT9`pArO1PNN;8 zw$ETT%nDv0#DU>B7(kaSAZz377I`d)ZO=W|7;uLWIou0S)*ar=&+tAU*?1ivZKECT zCq+b{P#Ytw@tA2yHip<+7d69ke>O zormJ8N4^VDN^1bf7{-<$4)M9%!Ux$@y-${;4*Lpmj6A4-fS@4FTBf!5QuD&kx2g-& za5IXcC_#!88B_=n<=ARzgIV7R`H5f6pZOY%{i2$HMid&uIu+=w@E4&Adwp=PAAo%o z%2H=1LPTw*#zz+p4z5_W{(y!3J9ck-^6AxSrU8Hq`zmfgHNl9m6jw^6aye2RmDr?t zq$tZYLP=);hQLsyP#J>}&dul3v#muvl`4{{&zSmjZ%^O4UBlxO^MG+$KJC=%_|foaZ@F%1Q)|i90xFsHI@2xvgvre)d(!35W!IUVpDopmX7W1Tc{2 zfaR^?3XAuPb7Y#q-%xl}A$8(Wg4>J1qx=LZ2#Q$i2C4e+{u)Du5sbVSUEoZuwV}7O zFm(eym*y~~O<-(L#D2wdi;%(=sc^t31NRwF;b4$a+7=4 z%Vnj|m>{)5oS&9_hj{1UZ9Ij<3LS7X*J$ZacsEPc_TFy7CO%Zu060O1fzA;}!+_Ek z&lW|R$T>j@d4+q6G>v0r=Cxr9_YseU^X3phqLn3jTLO6-h(`IY6g0#pQUZ%^y95z! zd4Z%Ct%!(cbVK+Gu#Lxq(aU+Gbf-Bbr+f9A|CB zfBGl!Pu>KISSOuyRvD-cgCMts2g&CM*uDDLe6R83sfn;F(Q9ef%%r1g4NG0`Yr>orL{YhlNR})a0m&?3b3S`=eACQyegEjL>YlUs`+R;!+&%lgGdi_Hf(34-Thj$8qO z9v?95rMGpZoNyE`qqrv`pb{~1Kf&Eq{6PdnchDOWa_H!+mgFB!!pc5ahzkL5p-dt1 zOkBwp5D^3=AKBp2-pdOHGggy;1x_q4D-8ogZs0I;H1_e%Od*KcL>N{P5DWqVDrmJk z<}6vg*Q(!N`PV3_CSBbs&P!dhq0xBY&YOWS((u-^PI>t&j@f7B%0K+($7}ZAr#&_J zk@vjk<%b{n!gJ5O>%H%~=&PTbx1eYC>{)4=E?B&1R%dzN0}i|5w?BOT$tNa8cYpr# zpP0XJzG*g;u<_S(>)fwpQ90(`q)G%|@1IuBXAY7H1h*gpT$(roy2C&*O_IzfH85 zcGm1U3XZ+l=q?;-Db%PTGt_G2dDCQBj>_l~s2CC2kd$e^kF~0Yjt+qUC6+}bq9{owM~70AHAr7`^FOb-@viB5BWy{5Qz!ta#JUn=wOZ=y z>*?z0taa3?9o2HB*3r{hs+4jflY>Ge19610!kl2FneQHNw%U2C-l&fcPuIscZSFTw zsg-5TW(#%1v{5Jz=}4t%JInJZ(ryX}*ef{)C8_`r{?3*hj9Pr9HBMq0DxW(*cHU0h zr+u)fqTl=~P078iAVgruRT>gmEp!hQR!!jRqxYSRHz)fd?hQGB}>kA2){>g8aqR6g(`)71em21 zD1%H&aG^jDvr>OALpOPlkY>DjJCb3);W-dtgxzG!^mI$SiPZUGVQxYv7-|;dsk9x4 zLVgi5mG0T16(DiiC_Fyk=0r*2c6SG~4fs0piY8VeC@;bSZw_^*K^SPq6-ke3Vt zgxAju(ZL5g=rcylAcd82IkRie>4YD(h(V&sumvdEkCTV9YAa_SYg@8sQ?Q(VF4PSo zQ&Fd$!leR?V1Wb5lfhc9WBuG5%=}?AaZO4P;ut9UDX}(R^ zSU5qEh;1ZDLC85E?i-L^26M(8LkN0Ue4Z5Lc&i5R3p}EY!7!19f{0;o#5fpCn{Tgx zd@@Fve!htya0CwLQBcl{RGvCh0NmA?w(s%FTAgc#(3Q>mrpT$36P8B%%1zMIEo!8u zQc99og-$?Fh1EMyNIL)-4SO!&K+a8Bi2M*t68mBBPeXA)JSRcx9^Cw;Y)H}#xyAp@ z_NV-CyfY1@3Jg(R^BCsEQ~Ewg5B)E;=d3(zwQRLU>>=778q1Y5!mH5K>i~5K{8~m0c34MxQ!u3Om$Kuzj0J|)A0Uu9dv0pLQLmxj$1MZ1{UfDRW z=9*;KBLH7Y3H%Z!Ulry}#J&^-5Xcx%4k+E@J@{#cZ`iUK7HZ&pa0^;AN;_l9(dr^ z_r33ek->HQ9rm&v0|NsCmKX5Q zNH`P^91#JG$pMf6<0z_6P0pL!d-`d|rcXUJx^r;#0rPfDx1Yaz%S#SDXyvMHZzv%N9rDsd?<~btk=Q<+8b*_idQqhog=nFqDmr*L5~n>DoNI zcXzY3Wh}*v03%W=Qt{OE_}Ij_PGT1c0>8nAI6eUq-`myE)!o@!DkT7rwcG719U2*= zJV(WE1#+@+1}p9z5dk#oxw1BAh?l>dooTBD3IT}R>kO>A7&q&PAZao?)ykELNTwJ7w8oq$%hP2` zm*rVDI5b2+TKtWjN1Hr#)~}R36_bEWj;?z~>OcXEadKs3Aa~{if-)|guuE@BD}?|i zH*@C9);iw3vtLDO-~IMqw0OyebuVn)vb|I;qKvvKwCeoEV~4R;!)nd78DR8)=&5pfJx2CYnqR2+fSPji$9o4^2+Dp4yrW(?~N0 zttTcYvOHHhA~NW)(P4IOvR0!}>*%yaAE*?O5r^u-Tyj!yzD0pMEXrcNoSP-1MlN$_ zxym1bn3<>mvPC;(6T!~(1&)yk)N`Z$Wj*#QBObn>H?nXf(+lhixvhc<`ulBi#mDGD zFy;|Fj9R#Hc>x)V5T&>sAoOd~OgBgl|lp8W8iV|ZQN`sfJb5nt={E(O>lGh=x-Q>s=gh0qLajcSj zF^h2CfIbG}U`fadlcXyd@_3$tspR=Xf9NI&xd10CZ&a>X3@@j!*+8)bN-4w?@YI|b zV^~nGKPZy%j}X)d$dm_C`+p2LIjf2@C>ajZc-Lq2XJ;UY35d;+pFvNv*(!l+e2Dfq zERttJ6hRagrSJgdhN8Gahsmq6=x5W5gJVM1Z3ytePgAIm=yeD~6>>e0#c|06N?t86 zF=SpQIwvZJE@>{-#26&S0Mbu1WE>606;0sjT)QIb(gM{lj&9~ONk2guO2U5RX!tj*ioNw3_b#1?;l(&tV}f4i_|CV zhy^agMm7KjBH1IrmgU-Wb#@H=-Y2orgx144$WT}Wcx9P7I* zRt7SH0FzjM*jiZ*tY8dxAjdKw3({W0saw{zKswyKGsK|a0QS5R{r~-ZA|jQ`Nx4)R zpKOhfO`}Q-0gw?NIwR^QaLEKaEL7r)od&xDJ_G>mthrh(7LafQ50}B`0cqe@*nxm1 zO8UgE2O&C*;taG^DIg+3ckHMW0($4+Wn^bXNo~`Nnl6WQs5s4r0%J&=Z*Wx>=;)JM zOR=2;j~8Sd`gTZO`Azv- zDeJxo2o(?+BvdZ{A@}kG`0jAUCfg5st+QGK!0UTpwaq6N$f2Q|P5#TP4md50@vCT?46^O>h0^%YWA~_KKk`<{O~hh`uJb2yX}-yPXbEG5Nn2%p@I#J zZ9zehOm&V9MMJzmFpyUPi^Pf@o;Z(zQ52xIsWdg+ghqQwPxXL(W@*gV zZ`{?tF^K!>7BcGO-xKC<&tq)3oHSWCSV8{cs9*S__g^FDIH$3FX+FMsXg_q^x50FW6&fQG;jfKq^H$QVPYv|X7u1jay? z=L8B-=Z3O8HwNv_4nvsdCT+FzEJLtP(Ga^#8*Z2^ee-Fjo&1J3G#d>S#U?i$wT@4H z{KCZx7qwcc0mz85%$O{9d;owDGh@iW^yJt}Uw+KTKl-r3?|t$twP!0DNeIY0UAR@WQ;Ln@+`B} zmc~Gq=6RMQ|0tylk;!w)0bLQ5Q=7D%r8#}@L+79ThBstsmZiBt%jUghyG)=QS zcg3j+3}Bw+d72Wru-y7TLnhC2GA_eHT+?CS1r2~{o*82hlv1cH?Imc`o9(oH%BiQF zamMKrL)+%hU+~WNoO|-gZ`y0Gy$qThfKNE`yw|HdKtbmjnZ=$N+e3&zKn0NJq-ep* z%;Mv5vVl>AIhiJPCiw+tsjEI6|MuPbiVx}I4gk~E6d?j>Wt7se@W8z5P-9ZR#1Nue zA>Zrqjf+DD>bZ^Oh}}yLf4mlr&;VLq$VJMMcUT&0Rv6 zU5R@uNeQ7AtKQy@?(VKirQF%oQAy%1fL17!+PRuj>)K2{JRFA%akX@tW+Y1hrP0aQBJswiKEDh;6;`#E;c@_~bNK`NZQ ziI5*j@z@anj@r@k0A5^`9ixtKN;C!1FdK-ADOgwRXO4~s48^q&7_YQtskn=boPL0u z+J;gfz}gSI`0upVD`DUa5CIew)Wazr2h=`L1AaOO6`sIL_dud?3E@z}3DKn>sf3O& zfJ8xo>>$`u$BWRcgWM)dR=_qCyZa&g9K~na1drjKaQ8eYk&j0R5f$>@F7kqOSiqC# zM(yU=x9LoVY`hrGt;0+2srfeG+XAf(6~n@UTU)lX>>DAM1C<1hv#-KY=7LxY(1k_>%A2k4z5lUyD8w|!;mJHTx~p6+Cy@=^L_{7+JYJ&LH1wJi5{Ixq zGQR@*JQbqxVPOQzGC({p1Z3QG%>*_2-rqS<+gpfhD7hjhoPFPkK!m}T2mf3*I~)O% z#|QFr0TLkFA^`HOGAerEIM6}Kd;k(xr#MlQa=x3aI|Y=nhjMTQSx$Ea-2uaKIkAL* z51^D%e*7#M?kkHEwZdw(R4LcSr_$l!X~dWq*b8JZNc{)%Nvyd(ZDDPhjm_&Q@RWJh zOC+l!fo-rOV{4GNy2t{vpF9q>nJ5&Unfr!?!2HP-bjbX27d+^qZIC!i7Y>atw=ZEq z0aKDv3wrLxq7eXsf?$_0DrM8{0K{1g*ANhpVh&(4FT#8w z14w}skO9cSl2LJF#6S=RO?C)GP)f|iz#sndmk+=DUDsZB=$Z#g3^K6La>|H#u z$i;BwST6fwmx;;AIoaGO(Y12Cb8vj^c0+AL)01OOdibe=R8%wdI`v&iaNWxUwD4)H!l8irPk5W z*+IFnVR^gViXx3jU?L)l5YjY7U8+=)EKl2wwo*}~RXaDRV{KBcRjb+3aiX+pwwjdY zC9ShOZN*Ww6z3+No|>+dJCbtZARD7*vz4YP0H8vpwT_}%M@OqeVquq*74wp)3YD;8E7sp767_|5?)dY_2m4gcR3Scn}xL&Jm96QihH5<4KX>_lDt0X6FNB#EOaYBih4o5mgW3Q9Oh z7ATOAlsf>})gdZ&vN?E;DKQnv=I}sxmLh?>o<#+G4*=NxEbR9oNQD)b2AvZ|<{R7q z$|NEPa=N)7Lq;ntLt?7w9H;zBMZz&7gq4LgHy94%k$1d+5N06ufIND3li>f)Blno^ zogddfkQ+V z_^E!~5>ZM9t~Z%r*Imws+(ejc1D2 z`GE5ntleyN#iE;F&RH8hL<5LDh0^pBWE(P}o%$!T9`hIIsj8@uaXKXQl!&Y@Nk1`s zZ~_0U2*T-R;3o(I2M*Kub2emFAaWBXE6GHFwi+?erJ?{BfC~PE;gUJFmnBaafh!>p zl_ri+9VS?-CxSqKP;8c0P7w;4<>JQRNE(?R$wIiVkZ%Ft*Gi(#K}pJKhTKIJ!}ezm z-4o)_ygjVhiD!UEL?Q!(PJjI6d=Dbnoy)FL4>oWNJ$fY6*u0Mcf z;;`Onqm`L)Gek4Q4ghWw1G2$$qDwpwfKnK1U8y9X;?eQe*jNKdlRMcG1Py>^&O?H; zDFw<#pyB**pGiuqJid6~kUi!ONQteC%Xt*%2N0tfT^HmG+&`eQMQ+MyrtQ?^OF3Xdc?_oBXu zrwh@JF`1Q0gyk+Jvdj4LA6I1uS=){{&dd=YA$YF;Z`q@uj@QwfZ&O^6eyY|TsAhm5bFoX}_JeP+J;HjL+sQec* zX~Lc&lz$KbC{#&Yo|u>%pO~u7=~ak2ilMJ}>9TnPkG00fr#ct(jnz8Jv$~^_Zck*0 z8kNrSw6m+$J$KHw!QBTgfLFd^`R;-GgU^o)wenI&jS%8E86TVInA>~7#b26p%(0i; zdeg-4`0g!3Q_bmjp7PRneBxcp-+baPzWUS0ue-HWsbn#lJV#VOIV&w-aVSKfv}(1R z8=qfWAKlTO>>l2pfsQJj-TSOsy=d`bokZoNym8&SvGMW44m%XdJpAZmyN8Bn_x7$j zV0o>(wq)6|=bnD{xo4k0=9pLPwR+Vf4?Xnn#~yFB^@2IGjymGVMT-}V4-ek_&$|Z( zhI>0}$GrTA=QnH^7#i-VRr8#P0OJVBpw0E_2()gdY1+=`%$mDu?^RJ0&7M0a(fa-e z9@w#aD2a8V;D}?7S-xtoZCke`k#4rydD~Q~di6p3EnT^^l9V5N;)!RUe(s<{58iM8 zm1Dy_$G_^td+vMCWZ8lH?YGaqtHGFu{{7gF{$Zt6tmx>Yk38_;gPwhU{oFZytyY@l z1_%^FqtRTjV19RJhcWb$!(Z~R2mkf_b1%H)@WT%{^nkS0zW<*4w)78_;&QoEI^@6u zSFhe@dUE`}2Ok`rm_n2FbaWnf%rUiU?cRqT86O)P*u7h6wa@a^bLPxiv}6eqJ#g=X zdyhF_m$RbAS1Z@ z4iNxU($lW3fwltVW67$xc0Il2OO$Mf15Uy`f(O@;0R><*2n{JwZJAvJBw?UMX3qYA z;6K?SJ7pK70l2q^Fd$Kgo&x^_h&Z@?dmJsFyJ!XFG&#I8%UekfB@GHOBT6%v(^ETQ z&C;x$N3m8qF4w9GRck6WChP91tv+D&69bQ=Fq|5b14M{Kn70iXh-=l_!liNN+|kj| z@u5LO=-#SsQw9vHvN}otN-1NqJkKMg-TQ{vhcb>yRAT`Li73xA9mOir00>GWK-z8- zQ4(u$iggs1Vk4ZF6CE6H*fj$8?hixMY&Eskm81&5 zZ%&nH(1-1oE;v|10Aoy}*{D`JbQA$dQKP-gzA}Qq7)zBsWky*a2vQ=RPNMJ*007zVc5m7iW zPmhTgn&n$JWj-L2r9#db`AL=ZQGi-Ok*_0WUdxz@xNI$_C)_X#;`K8@Jn85~?yW}* z5~u*4Vw{DrL9!ei3(uHSPL4P^SQ6rsAYodAgv+pQIu$}z9WPLjsb$M1B0lL;cFG0G z7Z<^ZbXiN>M@o`PoW}D#<3?0q+Qe;gr#Tf9h}#c16d|upvow7$U*v1{T7I`TxQv5j zvYb#j;bNyC*fJ*b3hXaUIvQ5lq9xj15%~=O5Z)5n0vkNr4J$ndQGlWvuHV*8 z@aj0X?y(fvW5^&exF2}#P`Ok%5*P_oc{P-T8M@}Z;@Ch*NiBiPzq6czhlK>fHgCiT zB;Y0VJ+kKo`nhzy^_^2nrI{HV&AMx&7JeJ zVRq5w>9Fu*@gLp?vL9rPV{P(A8V=Z7SD1b9Sq+-m&J1Yc&jU&D=dNq4AQA=oPI&iM zY~O1n%H}brp}}JbW;Dq&C?gACg_R1!eYA3Ka39;g`%u`Jd`|K-C%WKw-vx05_6el5 zilV5L#Br3QnHe3Pnx1YW#CBEQ-vWV+c$uR3eD-Q=d%?R+oz6%fY_cvy9`6x+F2mA2l+^}{o%T7%NI(WaBicuyF@#E7oP#%pdu13(Nz(knGXM|_qVdyices!NFhC|K zHWr8m1H$c#1dkLLQgMu}=GpK6*vHO4@1y6v2N0X>^yE|De*gWq#XWo9aLZj=H*Yt_ zfKINx<&G_zcHDCN{lEI%HJ|#gkB^Q|KKb;zU;g&0@p=l__}VwW|DFH-RHfGW{U841 zZ`ZE)!1?c)xA05X-gNz)x84rAga|}AczHSPko?A;nIKVb1(=5zOP&lkr*1gwD{RMY zw#TGgZnc`b2L?JjYPD)tPfzEDEo1+lG|^CFJU38^w{F_CW6Q3E3znu?4vKUVO^i1* zs!FZ;!rGD9CO_`z`JKJxv9z7$5FtiM(rC1sKo_2W{;CsBIQx4)7#g4Y#eseT)6P8(@)#HVT)1O(#4Bk|Jv7n@Z+CaxM<0Dzx%B_ z@4Oo#ecaJU4-JmwxiNY6v5#N)t6%=|j$3X%5|WV;=+%8^up@= zMgQ})uYLCOU)a8N8+LR8WC##PahhdL*tTv`VXM`cJA2M&Kl9n`J9eyn=9vWx<{bah zV=w;txBGYOJp1f-yy}%F?AWzq;ez=qmak|wTLiFT*^2kP`<%xfe>~0VpSO#RN@=BA&HDap*1Yv?XRUkgh2Ea-hadX)@yEaX-S2+aa~q!T>FIv;t55jR zkALyVefORG*0YZ~?wDtuTYJ<|M=xBo=+fW(+GO;h_kVcq?7q?Q!2=IFaKF9x{@Kqq z8dC2&_uO)&{N&@0uUft8u!9e)Pd9h(?tkgA$1hyG^n2g_#^MF5-g^2whQ@{?m7n{b zcmMb&Ki;}=+ebfgL1$Oz%{SdVcTV4HUVFk{uKL^6f4`|brxrytGBUc~ngh;!%jxT$ zTfc3`&ZCYv`tZY#`0jVU-JEQkbI$u0FI}>E%lcKXf6eTk+1s{lo}3LloHSi~x?C~S8S^NZm!PxO?&OtbafT$Gcs)_pm2oxeI&;}7)C%jPUvfe2%RJ21@>R2o%TnJJ{dKeB1xCG(FwXqAqW9AYO2r7E4>i&pQwzJKJw z4FjnGKxpTNB86#A03F>uy^B{QwOK?uncWrNVkXVDb@^p9t;r?fTgdvr+sVKS9zSAThu6OW0wt zKFBp}4_X5uf)ET+JgH~^u}AXZyGwvFX?ATpj)qcN6d*%TOtXhs2}+?Dk5u~DF>wCY zFU?VlW~CyWmOk z6f8)S6F`zj;BGthCs}?Y&P{_~YxapDR-a-vT)G9`bMWjq4}vTKu1jNm1+hhW7VsduqCzl;XtXX_lHi z&vJVNTkhi5P_O;;FvL@+ojxHUbIR8Q*-amL0fJ_Q4%%e>2oNK*RnDt=a29lzq7=DW zgP{+W-7x5P?J?J&hJQrngLS$F2z6rheY*qWrDAI78?Z(e_eohl1U5#J&Rn z2n_)lGPc%3PCOEq>*gy+LAf@ZvgH|-%erlT@V#&U;CnxWQW;uf0HCY$^VZ}CKXd`; zk}h{^t-t@BAEDAo()snTfA{PEdkFwSdlDc~l}=Tjd&}RhI_UZvAV)OQKl#BofAaHr zrOsMwWB{TPmSb`!Q_hs=45+dndXVAt)r*+B1s3OQ*p<4^5G=Vy1i(_MJU%|LV@H2S zxtxNTn5++VRaY%s@XY;BjSfttgio%0_UNOI>g(<59~i<|1DaA4)hcn^sRr`awRf){ zna*}KRi(2Ar6h{f*woZMM<4%^*T3${TW{F0dHw0{J$p_%e*d<|UwYO{r-|#lol zzx~#^v*w&}=9@43-R1wf`>saYeD?F7Ir&W|sq5giC%y99mt69|9d`juy#3uDJme*Z zMoEnAwo(dpw5xx2J2Thb_>U(Z{@2RYtIz%5d6)nG@>_4b8S?ZS-~HxkZ+gR)ZQFM2 z+WM0p-nVu0y2YyxIOn``dwRN#KJIvk=__CP;y{0YwQt@<|NZ%%*>i}HfNs9+_Ur%r z%ef2J{O`BEe)Cgz{rR`wJ^aX5pLXV3SMRs~Q2)R$fBEBW+jbbjPkr{2tM*>AVe^hg zYx?GEZ~yD%zXoWZde(c7J?6NFA9`|Nc&KmIEHI#S^!$bwF8TiV`?qXZuw>OoKmO5| z9e@0;{(;#G=X~RTzPfGmlhy7OAN}YBjb`(vzyF?$)^YWJzIIU@K~G;#E6W3n^$gjY zZfMC+&~t#9?t%>+k&qwTr$>E*# zW<5cJfVD_JGn#+?Pj_7~nV$CACrOQWQ7bZ}^RXu#w->L@3_Bi@eDISDUa9<&vz3f3Z>uR#th5y>Rw^62h?V~;!T z-S0T-|Ni#(+wZ=A?)>?qqvM^`rn zfRP><9DdzNum0{gzx>mm{q`q6{z0|2q}k4t6R$mNiV#(rW=W}h&|!z}-nM<)#^?4~ zb>y|zUG;~{{_tNHezb4)>gjp|PyrGe1ptI3$1qq}CL&O}K3zX(&AxZta@~91d;Vot z{IR3EyOpNo4z?j6lVzsXQQdpry|!=L-l{hd+(uOL#Eys*kXxEo7y*Dn)yiqfvZZ<2 z9v&W#m3G-a%QmdiA{gg7L2-qUAyfto0FhBj+l326FvL~tZl|O+d1mtL?^pflzPs*z z|M{P68PZ7!Ob$rCteSEJG)U;y0bFoPWE7X(0-}H4JQ0F2#&}vl#DvCgFlO};^F#>t z&TyrW&zx~Xp-nO84~r@s<6}zal0T9$B1bKZ=Z{Rh&~C8eHKl-^BiP-)RtLcUkF%^C zU%JJ1l9j5vGk(DX(HbZ_0`dHUTXN(Z?BmFP%a?j2!Gyn%_1rczL0$dO**@i%91Ry&W zl!OX?q>P@NHgMTw35Oj;RDNoM2*9g`WF{myV7ZW&8-$Z8IjB%#09?_)HwQx|pHCCh zlaK~nOX%jpQ$iO~AX{6(h6?Eg>$tcv@`YnQDz=Q>YgQO2xG7^%0s6cKy3l}}b@L)I z$2-6(>Z8koEdZkOMuF(Z=$;#nN??I)65WH`_LQQLSuF^NGyw21G74;co`}a!qCJC~ z!Irhum+nh83qb)I02d~;+ceNllLTrdU5=Ad1Q_SY*%(gP6n;XDb^s~v#Q2sk6(&zmHjpyXEI5bYZy*4-(C7RZ*e!@Q{Y}PYejQbjy)h8@1~(STYcWk>W+k2y zc`B4p0jH4;RTbFG5%|QjeXNA?k_nYDq5CgH7e8YZ9&XCMg)b2o!QR2^w^i=UKm<|O ze8}3AWmua~6;AXMe@Y{)Y}1nea+X_^CNQO|s6O_L_jJ%D}C ztfwQpbkboIx>ZV)#1nY0i$d-S1`ryG`-;SN#cK!oIg|n(@b20MT1siiM@NR9%hGa3 z$LnABinpI|Kzr@IrRkxA%;Kw`*?Hr&*T3wTBaeIOaYF+m?N+{E$%4kn(1vx}#z)5I zsm}4K>5*pMiaRnzs%=yPd7I|Uoj*~=$6najwS4K@58DSeJ-_yWXO>UK`@Q+K53XJX z+tyF27A@#4Wi52`5`wZd8bxRT+-p#jQaPBLZ@Kx$-}+j)yH6`!pRUjD>#a8$qhsSr z_jYvmjg3uh+_X{aIZ>%&nzc_os}MSR=A^mF(ll?3cg;HZ zob%qN6HNfq%@hr^nyrmnwE6xUDK1}iYE5k|9~yqcdUKg5zIXs!?dB^-^IqL0Ow?%Pj&aA$jn>P;(4kz79D8hQZjsU1sQcilhD)Z;f z8XX&BU=-z^@fUgeS2THE#9+{I*e#c!0i?8!%^~QSi)}+>P!T9BEu(H_Ha&nB+=ajW z7QXKob@5*bCcz}6+}os#YK4{dWt&~b)+}_4d|KI)ht?z%=8;{$2*@Akb)ju-z&qvo? ze#?Uc^;D8Ch^XVJclO-A*$a(PyLWD%m>2^<)SAEqk{2%{@dAG*?1BnA0t!UTbsDse zz|@y6UikhGym#C7?YG}@v(n4*b~7%=uXyRpMu!JmjWp>{?X=yTY67Bm#iH7f$Vu77mhmYI7+jqT*|XFZKqjg2r-VMB#Hot z5L?YQWvPlvrAkR7v_|?b`Qzmy16$5L=Od*#3k(_{1xi7l<)*DsXL+8bS*cnvNLku8 zsR00mki-!JDpYxvrCFBeIRZs-q!lQ@oT%Ao0~jRK0BNf|IXXecWMovkk!3jv)vBhbBlh^Kgwfj^H^yq2RK69tIV-D9GY7 zu?q50Vuh3fxRMAW)?3#ZHRTUpx9_&p8EzF*Q$f(I4nslrM0kW_Gw zGMdoTfaxU$Xpb&|MY43}ueK4qd-<%9$}EZ`aX=0~1xdV#l5Y`1xaTQBNg)&x^LF3} z5_W<@G~VpPb{tB`&BO`-oF(y)?i?e-ElOHl{2%)%+X{jl)DtAgk?XjT9|X?ET*^Z* zhnJheF7oF*U_`Vp-F15{iHAl+piuLBUQoGYEGvM>3qYYeF&F*OcV31l2W+JQO#{EDph&1pyKnGLULTx)d2AV^RPOfVs&Kl`WIZbDQuo#*nh_ zk)t-Bb7Uy1V~k)3ObV1^q7`&dp^N-v3cEx+Ht(0%9f!u@*n_8_?8;aLy_Cf!tU4P* zI?~NX13J4u`SJ5!{mNr@KYHKz&cWr&W~*v-cdDMfYwZ2Md&^L(g4Sqq2hOwvNb)~)7KS6abs%Y?00-<`I5!o`Q~?O9p$fHeDSO~b12V% zKqnEAnW|6a1P|Q**v9qiOXa9kuGFU+Dk;Aqsl;)4db*xZkJoA)DS<(a_T?xl(osZ2 zN}-|h*!WaOwc6b`d;8A*=G5ehm3!$VYEgFn2hSZH8vf-^f4*wJec$=cx0P!h)6GVA zXAeg4&_I7&t<0N0Z)9XNH+fPnL#&NS6>3xpKpB%Mt5fp84~8`+7%5hR7ID&`#4@&M^> zXIvmKfSR(p8hIL)?+ays%%7bK{bI$A~~mVV<>y2X@w{J7@Lw_AOZ2u1}1O zj7-<-xycC;HC*-R#+x47xVW#|kl8glJ?$#MZIuBgrE;yKyJyy{IIc`iO^uEWH=Au# zkeY%;p z+j%2Tbi8u;@>#Ry?AX3-cw|^9tdz>NzVhh6P;YPdf~6}qtY0@WF|hxB`*wHtZr-|e zaA+7H-#t9Ear@4psWAYkRcb3%tR5Q~>>ubi5JwuwWNEuyt#-WRkV7JER;*sx)zv#O zJ~1)fn4FsI?Cd<`fCIPf+`N59e@9PmyVY#f>s=kSIZO7Qo*p0Ay|qayNmOp~NGAY_ zP@`74CICw7^(Bku@3nIE_FY@nuV0@j?CGk$=9S0xb=4O3&EGb(B?D}x?P^q7zIbuF zmG0`_FlDNha?-5Vdu!bq_N{oRtrwE|0 zw|in>*X)ko*(;W9>EAUzHd#%gTT2~21bXH zQc1;FpRD(G&pLR`KF#UIQ){1SW$h;AX_i&1m55C5y!lI)FWosjv~lgzbLPxH^w2|x zhX)^j{K+(qwbp5?v3TLaWy_Wh4-IYFw%ufy#CrbhIU@tRw2lsZ$zjvulh3bTXOz)N zk{JMUl|;;UnTiEUUtFvZ2JGFI(=s+~2pN%G03|`%z763>0Fc*gBvxRmfQaq16)V*@ zx35`mOioPba!Dy9$`LTnGfjH-tl6zrYjS)tsa5iSPrB;?I)Cvr$xVy8r*=S_#OvkYSV{+13RjSo`V_GSB8QmUh6l^i>zu?_rUO=2G z;LQWTHbmfRt{gQBQxC#}1DoYDP*_TqVAxm#`5*~kWMLu%B35C3C@W_?1`2SE)3}bK zdd@9Ekb8aiILsqkW`H2FaI3KtoX}_EK62~(u7?1Ue_)}x%PDw(%RC_PUI+xRXYnva z!Y~(u1r0Bak{RW1Q5}^FAf3h+uLNpSsJlZO5olwWo;b`Azytm(fej%kT`3b$ohy1*oXdk+IB);cagD7a!ouw{wzK`>+v z=GcBM4M0Pg#~&{kSq2a2l+{Li?jdnMo!%NZo8)JeJ4ez{)<9xAl1Md}ToiqxV491L zp%_*dGpzn|?-hJd9HiX?83j})tgm1>hsT7lNpXm3y@P?mN!94$G705CwuGU(9l=Gl z43cbURyWY=zgP`;+yFqkn=i;wf}|@72>|r6M7~Z`h68i=3J>--j1j~D?1}{#0VzNf zaqPs8WU!ba(g0kIpH5p->@1A@mD*rkqeB$xqu!1CpJhV9gKQ=5DZwcE(dc1Y<<8U26bjKSg&mD%qA15dHf@!IdDo zjI7}qLj*+UJtgh5$B*Qx2?>y-VmO?RP?&Z?-5_})ZEi)f9w0hx(O(&`IH+B}fQ_7p z--JrGM!*mmK;se;K!EPZ0#tx8xsw~YaUl|{EUZ1^Y7s=l1seu`W7uVG+fSswlvo(< z2MDs-qReDktE7~GvML2}DYjaoN-9aBYPH1}u*tyUmQM@GjEJn(=e%T^5T9Ne{i*Wv~9rpAYN?cA|q<;vBo z_uamA^JKk#&>@G^%JJN#D~~+ph+4I3h>uUSacre(2;z>u#~**R*=oP$^(S@JDl1kj zf8$9fzVQ4Dje2{*yxGsMUq3mxu`w}GsZ?UXhaY(8z(Wr{_|OAOk$TOEuQ~9L0~%>P z%}l9Mj^YSFfg)XsbgTgY6e$g;u(!8kbbNI4hIQj3qvdjG-u&610JYj{pM93^vwGf= zV%~XA=fHbNcZ2Ge*VvmSFP0FIW4~Cp7tkx-2zQ{YRHhufMUdnej2zlieoal1rPzk z|74Kf{RdW!G7>~FKVGv6q1S)O-hq99LL!=;9N)2X$I$2`CLQw@EnBjD=TO!Bd9kMdC;*?K&6yR(g7$$O)5fVq9|`pj_Yg^^H!^EAl3lQo{p}I zzIM?=|GMLWdv5sGeYc!(`l;iC{V#jz%l~xcWk34ak8Zj7hRc5S{rR){&O7(Ke?M~X zowr~2*dzCx{f;x0PPgwE`PF5Ae)yrs_uBiQzu$2EV-Mf@$Rl@s_`@H}rl#YlYBH0x zviE-Qqu>4hHzCI#e)roy_~Fl6nXZXP&zE2S5C-GC3KHqZoitDTNvlGk^%;th3&F>+LuE{pw2}dhpIKeCAVm zqw(SMKY8wX@2pm<53RlL@+<$8*IRuZJ%9eoRsVkM&b4drzx21i?xQg`Pid(oO9+Webrev-E#BX*|U#4@`%TudHV1pj+h=Eja8gC+TFFz8~*<1pZ@$u z58i+Ky?5NWu%~;Uz4yNA>c2kr=pFand&~9LU%7JG(pICD)|+R&?H%{rb<-1%-}(IW zkDPPvd$J6h&GzC2OK-mMnp7V!B@uw^Qwq)_Lv8l-ntH1i?&oBS|rPu%MFL&O0 z?LYr<&D-Ak_P_n*uh(C5<%9R#asEd>tTJqljGTVj8F$@r^NrVDb>BUAe)6LqrFPcS zG5gYA|MF+Q_|>2Pa@93|`|H0Ry7SW?{U{p94Mp0%7mwE@teO%-x_d8sNRpY3Nhst< zHG%AsVOzHzP*Nen!8`>IVnnS}tJ&%-*WUJyw}1J+zw)t|3`_K|Lwpt_$0H0PL0};Bp&++!#qD%r$gEyvP)jOox|@oiG$>pk zFCyp&l}4pNYfurW2vCDkU_Vp}lm@h4$uE(+0JXbU@dcm&6<`Et+tGmBCThSKFlfhK zgYvDi)dzr@?5P6on#ld){}}^Dgb^Ztf)S!dm4J!>H0lUcgi6~(Ef6Eb7*V5&WyFG#{M$~ z+hG+WYDDeYS22KQJhN_UV2H}C=47*R z^P|vLg5_OkQ1uT$W{4!)N}>QfVa}r{tr2t-#V>osE9TCfljvyfym^m4^zWbk@)v1N z%~l&w8ADU`>8a^yKurb)2L~r6CNPQyMn(t$&`eHF?;aWiL^Aor9rdY1#6#sc4B&Z_N=)ly!z#jKly08-KunSP@X5H^4hge|K-a6d*A!s)xUFB zZ||)28#eyo@+%OqR;x`+OdN5{VaLDh*yT%?-}~VGci;I>h4|~sEM0S6q^*;#w~@h8W} zC)Ymymf?>hT!Pd@eBlTWN28l5(%Mn=c#^*U6V*s``9Nx`sItiyl(xbJk2(3*pS2tqF%Ce(HUTxs*0YAlK3M6#B$v=Oz#Roy8Ii72y#Ls%=PHMV8eZI&~cbfLxvHm zEG}Jh16*^5fs%nSgBU|%s7)Awfe5lm^}-)w8ic4~Pk<&5F*ARPwA=L&gKvYCR)D}* znNs6h(*i+bQwTU4`Tlc0@ZiJ$zT}6O{NM-QeCnxZ(^lh%gAQ3V zd*RKu-F4}2fAh-Mobc`c{p#mF`}sR=yYqj)^S|Ht#zot9?z-XX8@6oO2zmRLzx`ES zADKJ%RbT!3*Umia^uJzxWB<-=wQ7gb+3zp^L%Ui3@sGa!yFXp^#f!gD)1^3y=g#WA z^tXTf!ym7>^DE&d*y*gz5G?T-g))4S6=)LO>?FuHqe{=${t``*RZ|NX|#efo3feCUIp{oIAS`-iT%{+j*vUG>`6z5EMb z`s!r85y#Q*ul&=3*&VNa|G$KQMMv1cBB@UFjI zeb@f`u6obA-?w4w_V=CpzG^v1+qp^2K6|Y=aR1d`{rcAje>(cP&wujr%YJ_Cjkg^C z@-JTa=?lL7zhAxUj@vhH*#5cCe)^uf@A~ZLzWDBQ-uLy3zVO1j4LASej&iKta@y;D z@{8Y|_knXS_{c}T@ZbM6GBxqTpZubur$;Hw4X^K#066$4N|P6OTOEY-T;(ad%JOvBw;H)Act^*QXI+>5AotAAZcEk30}32@xq* z0m}4I04m52_6mAP94XsaP~v2val+Mj zi5tTC5aBx-$NeW_$Iz9s`%Zzb&k;B#n9j$IC? zFo0lCf$A4}h(3Oil!WadA0miYNHvCYLoc40hd@C%L1WK1AwNs@?ZWomZf-b=Pu})( z%Tr^uz-o!JAJ!czJ~+@(RBVl2e}o+Xf^5cdi5>qiZrP>e_$gRygv7H4`sunPVj)g7 zi(n+81O%|}Rpo?TAXs5#Uh0AA2Aapex(Wv<)bfOV;|_!_gMh0loE!pk30O&Zz5MQ| z76SMa(+Rl#Mg?8eMJb6^xg|GLKf$(3R{GvI5TfGTivj>t#8$ycAf9iVaAAot zA|jgHB&CXuqgJy;#waH&R4CPY3IzM?-AXhF5&0Y(o_KT~ma)w7V`Y;#0Cw(`RZyE< zMq5l_r^yVXT&XfNn!(8QMA+jpS6`c5eXV^TG}?S~v>Xoj(ISUsLZd>1MPDgRVs~kvVqBtp)Ivi1OGs4j76xsb-sVGe;QfhHusT!xF zaE)Wn^VnYh*kh7=qnnG?~Gi4xH7kcI~E1{!kvCD3vRjF=9L(?$}d0yD+M! zyE7@56ku+0lc%j_I$fWxcGNOs>Ql`)ijqo_HXDs*JJykkRlCvDNmMRZrYENWbrQv> zO=GeVB_*9`Ls@e=1)vpsuZj$9*}O@W6Ql^qpoTopqNrpU8Y&G+HzvkXi1PoDUOH>_E+|0Q4l`oV`Co{@R}g|$&sQc>KlPxZ{|oil6p(7=E}YSink zR!TW7ShBdUv#Wpij)|!$AZ-k#S!>qp-g&d;ZrQ$LdU~1^u2{Yt$ZXlTE+?#Zb~UH! zon75~@3YUy(7=|Bo9E1%+i13OW9;sFK%_i#=^+)h+YODda^=b_Z*ShXS?O{V$J33; z#fult?VG)8=k}cg{c%)A!l}l@f_V$Nd%Cx8-==kpx|F9`saDF-q3 ztHvGG@|LYTUw_KUv-)P;@b~MMFIzS|GQ4HSmU5}8lxjAn7cN{lf9|{u8`m2{aXA?p z80hNmPLfh%x}N8`QYwf6LYs5;!r&>jYhr9{6hS`C9~H(oP`g!64pOhW40~!g4v;H@ z3S-0^p+Te}C!jWwCeR9_9CqHR*PdUCB0~m9i+S4i6k@YEouzHh;s5}^ZN13zjWxr$__?`e+vq3;|*sCrOgTaT3Lm){#@uXJ@vF- z{rm^0XlMUm5=UrYsxf`=!E3(#-5*|j(IxlYd-K+98_#~{`;BRx{+2T@`|VFIyzp~R zKK=al*I#-5`#*f??|!vp={~>w)vp#W>OJMuGk5RWdfY2sckSQ)^v6H{`F-zxmoCp< zFn`wNf4&0S*=eV~wVqBTrS4Kvp01B+tx@U8!5yzS;l#gO^_RDw_4ZqDzUJV=UUB`6 zSN;Cimwx_>p8_nu^&Rj2-ghoO{^8{Z{R@aqA`x`j8_I`M*D3aoMGpfBb^;F8KIY zKKtnpFIqGgAUfg1)2_YtcW1rj?RVaFZ>iGx)r&5E``ccB@S2xD`qbTj`}5yE^V!d1 zRLP;%YPR!q*JF?W>#o}${N$%TTJBk-BCV9lGXq(+{<#OQx$ee~oPR;H+4%B*U;O1S zTzK%|$3FY?6Ny$(?%lp=?f1X;lgs|_r@U>ZrYE#c`sU7g_`zG>{?_-V?bbEdUisFy zo^!+XS1N@R^=?}C#I@Jo^wAGr_|!B1zVDuUKKC z8;GKKYI1DRq9td&{asHz_VA6@T(NYoBi{Osw>|mTqfb5Y*jwIu*7Y~s*uQ;8XJ^Oo zK>zABhpahx|9kGZ|9$73^Xv<2uloJZmaSa#wzJQ9Bf(7%> zc*|LjKl5f`&Hm4?edd~L z|AsnN2*#4)8Bww^Ns=g~MuvxU6oni?QlCC#3ZjAFpDa*%QMhnzg~sSp4>kxXoW9^B z8~_Z{ASS?`i;(|IuHlHNFq8m1UMv>j78MVg_>>kqjpRdR7g2+dSN_E|Y>NVA-&63r zs1vvaHjoyi-g+k?e&D?+;ip2G_IT zfv29FYIsEvtqXo(ucfqZH(MQ@U9;ydm>eH(H0p5_8JA9ioX8lnV%gq(b5}pRX?S>i zvQ$ne&w-D>aqkl#!+o@khwJmky+{jfVUEq~8JFd;o>xeQ1w9XaM9ll$VEihlA6sBb zBC=wvQC#{D{tVy4TyyJMgUW?CgHuD=ORMH2*OTD7%R{S%I?Z= z027RiSZ9%CElt_(`D{2(ET=pKC|sM8x**5HmMkI|-&YVfAg#MWyG$2jlp9RpY#Zy%1sH1Zsy^=#WUKV2z>BY-8^I!Fir5g#@r;tku;Sb@t8ejB81) z0MtKPsoBcpp~&C4lGn|0I9o|~u}(50RZ6-SjyrCjN1oy-GzfsnkOEMcMp^*eOaD@9GUBThr!-ZP)ZTv(CDajIm#{% zq0(_YRj(tdDABpe>QikpCXSS$ENdAZDP!`f$#Jb?L}+DAXq%`U1DJLzCzDocC6lX7 zFT9`>B&8}C0A)a7Zb(ImRXk!lBiPc&`LuqZq}!JIyyRfd)7Yx z9GSdSsRAO9sdV;CjMYa6*MZUiq$7-z*br>rvUO|P)=3=2S}B7X6I~h|9vj%Xt5m6$ zD!npx$cKIyzddX0u+`TBAau zJgkNaA{^0PA%#dqI}~s0*=i89qkX$+T&}d&wjTa3bL1taT-J4^vRtJA3NQwfBIRIE z5o(N5)qfYh@WqO@0bNk*%0NKK*yF5N_-Fn&2{~&xeBr^)FWLe! zMFh}J+iANk309ZdAR;cSMnF)YwGMcPLm`p~ll$fo#uM3@lxt6n6u1G-W`ljB0T~^u zI4*tROJDiPPrj{7v+~wNr8?&yH(lM^+uPaQ(QMS;aMDT7tbJIchAbWI?;ji->+PF6 zv}0^=*O*e3+4GksaeTm<18%wf`m9Z*QVFO%JUl|sQS0p4wx$1LAOF;M|M%-7!6+qn4)iX<>iAxCpqK4*FW2k>OqOSDJ1BB_RdPjF{`SO*0 zeY0-9{ibrML>a{qzOZh6S7+zQ__)#$D(#Nl&YF<7&wTrt?|Ro+Q;^lw=I zzypsSc<@0(-~0CeeC?a(op<)+^kl1<^>ugVL~9N?w3XrJjn7wWy|wPX!Ckwjr=}GG zK-(D8oNgg@Adb~r*}&G_8q0{~N_S7%Y+;n|-nHR<@Bi8b=bw|3nHZa#J*ziOvp7oP zIN7~@S7ub-{Jlo{cW&Oi^N2$a?dj^+-oINbm7_A0dvb1_6?qR_&~MQb5Y9;w-Le^p z%M2rdncC(GjT8`4l$0hXrzR&xmMvcz$6a&g%}tW%xpgnZFEIit#zvfq|}n-%hAw3Z@sOvJ#g)l z_m|40w4MI@Uk|_j^{=_+@7Hy8b+6uMpGO~lWbvYT;7$SnW-0%PYKK3>^p^+8X$K}f zf?z>J5pYn?BLk!4B4xMcgsxFuDrE*lMC6Gl(|S*uP>6}=F2M%#0*i87Ruy~WxGICv z4CLf#_Glwe9ZG~)Qy9c4&4p|WsA=`2TUel&KnIR5975O)To>mx}Sb|C=d zR$XI-;8nk|6S9U|c}|I08Tx>Q=&u!?$|>g)*w%}3=;#j2_Y#6G0C4CBq56+JYFmn=1I>&!1 zUt|E`q98B!^Bf`qMWU!=j6InXy{v(Z0mZ2oJ7f`cZ*VCfqTK5-zyK*?9A-sU_S6n^`}4#@N!!5HG-#Cw zfqb3w~Kct}x7%%N3!5GYW+l%t+#M;*ebh%y^trTMfyzi5 zqAbnpQ;kNJrN(H)k}kuh&5e!gv06jGC~uiY6S52tD^Z-3yA7q1y9Dv!fNp({g>Ln_ zR4N6Gm;i{#L@FX8TP~}#w%JUDsI&$^1;%dJMu1pr`xZ$8iepViks+l_t*Zk`0g^rU zm;iL7`4P4{*CB7DRovA9gp_AQxsIaU{R8*hdoO8-OEE%XU)zp|CT}OD2r4n}}YgNP=kjYKP^I_s7DOW0ao`Er1si@ki5GXffGKC6^i6WhJb&?@tQeG-^2iRy= zM8{6sWRb$8tHT&DCU@k*-Bo0U9OeKC#FiJG7)H{wZb%Qw$jEs-}UZKef$HT`_e_%{q35; z@ri#uaDS;96OqX?9V;-VH8I|xywzyD@inK6wbR+N<_?VvRjbvhH2?GOFaOi;|L}&B zPX7G=eC5hN|N4a2zxCcbZ?9I$Ce~TjqC5veV+>Gk@*EXm66FR=o=r?lE?PLR+R?Fd zY@%dxl_YD{tiJN7eedf6r zQkX!<;v}xO8UQ&W7zIQb5yeq#BAw+;qGqL>^!0U3O^=`Z{tsXL<^THm&whEykAA#r z#eP@)_41^oQN>8A+|iknnwp*@LmeHpENiD}YMSFyqouf9RtoGgSb>BJC&XYQqpVO_ zt#kahU@NZV&qrm%sw~`E9)duS=UJ&-nV6cq?bci0`ObHK{;OZhGa4Hi*|~jtmZ!hF z>{mdfOXZ#0cK!XjYfm`gl?xWki#y7h$pH}{wdkbd7|0+(p64Bv>YDxb%}l#%-rTs9 zEMBx2qHb&c8#ZieG#Ur2SreDbxk=YP_4M9*uSoMW(GmL&W~l*`x!-)mGSj>zKmdlU zAZi3}vp&Y+Pnk5@|J$fX@FEN&{iB(K`#>U~qu}0h7(_&VMj2(qTT9A{AIC!^S+NOt ziETnTy3Ru;cXS1KO#xxCj@dFtX29o+1o#EcK=Xt)voDYZdc`zbLIWbQ?w=!bCmhCM z@~H#x!*tG6cp>^kpVe5ApZ(N_HK9I)qVs-?r`YK}a+@Ht39=r@v67JFVDv#41{?)Q zJ_8^~hlSe2U2rSVGw7mMXbRPlKlh0wrtSrU=d6jFWA=iQupzljs$iTaVttjV55))M z`$fpH1(4g@ApGC>=)iWv(QR}`5cup65GaJ4|EYlA_GG(_e99q6=}NI!hNqsV)tOTe zMzC@DkDa>ukd6Jjgc*W+RwM1WeG@Vv1WXx(XZV$W&lFq$7-W|u*X30;Xp_}qkD6Q| zVI&+QXbK9}3IO)NRPwhnZR2Ss8LtFFL7WScs)CRX?ZHyQOcSywaK=U67DE2RA`%Sq z&ddKP{V9wTL`1;qYWvKy>mLaK0E%ZopfemAgk!fV<4hQx9*7|Z2_@T#h)yh#dw_gu zzi-`she5K0cn=37B8f}^Q6VaSG3zm+Qh;C=Zd_m8eck~ea-uq@&cL7}AxME;nRmG^ zelL$)rwVO~Hv7r7J4FB~_*hH=LEB^K011`r7pE0Clj5I0{L$byYtgisJf6Yc})oC!UZwtHLRY}}Ys#RKfwbkx4*j?)A?&$5T^~6azgWRx#a+*Niwj9!UkA`Fn znVd{+&y6K}f-dDmIoO3Odjhe=M6!sWfIxKF%2K(CGEk@hkPO)ttPUU{8iRf+3BUm5 zWHK@tWo^paKn9Gdl;SO$H~sUD+wv?2V@#fL$8yMXG8ttlm<&yh0y30Sp4#^dASgbq z#^yLUn?OaP2csKa)hU$ur6g z7z4(bELC9QSlxNYEqC92SGiO%S(}U{5M*+qJSUTzJOeTaau}2~a;L#|_I*lQyn0{; zY(5V09rc%Ji=c>p&fy~fVwxdfIVxvs^~3Lv?)@CCd%!fdXE>QA&8*xsdJJ|yg8%+Z zwBgGg@g%B>fe78ng>Iv)H{YU_c_2V4>`V)Zi|0MkJI~*2Mqt5*%K!lY07*naR3ylR z2=3ZkF9f8oKv>;%=+eq0Hz0rR_N`k_fQ11#iHl$b?vdTo9)uzI;n}g>G9d-A(n!;+ zm1dyPn7rL?=2@fBnx1MlYvt1DVE>j)8OzchbdcRQ_POc}KR zU|?YPQ%^myXyL+Hy?qZZt|6194J4^vJ^o2K&GD^@}!c*?8)yr!HF92POr8 z(aDiYrE#LvJd)cDf?z#Qk_n-HVTdw)^ zr@lZ$hrVP#pjNH3I&XGQq8hE{7%EU;5N-0KjoRdB8&&e#_xU9HS$3<83#$riWLqT7eo@ELnKVt+#LAw(T=t`26hI^C8XO_Kx>1 zSg@ekYyzMmlOx&nFRc|OPAOV>S}CE)(xPhj8#LkJqEwIZ63JQ|^%Gq+F2QKec1XlcwVl}e*N1w_W=X`U`zymyFyeh(`7A?0=q$PKY-Tn7x=q(sbJqk=@h_C zsXT|{4U`~JAu42*=9#tEEA;QNbn%b<*qapc@v0$C$Y8xB1O4+@fc`V30KMqBqoD$@ zpnUi2#94DwP9K0L2GA}m+VK_^ahy7`(Cmpn_B*A-q5;I9c>NkcWCMTnuPXq^82b> zipP)BX(9m`00UrrEj$S-vgw3V9fBV)GehuKdad#6%X_enAXywv0jJ`;^kv-6kntp9Rt*2!CN`!7C0#pa2wsQ5qCrZYXP|&aDD~ zQi?NYtgk8uKp+)q0BsP!rO2%r1erTx$+7x~eL3VI*Yglhm{{@j1rrub7V^gkAmop6 z)d>gr5{7JN#!e|@y8IG^0Z^au#MM8(bH-%`0VzIssE07hD2XUL^E?P~%9c*vdxrkdNw;YiJVp6U|CL6oHHGB)` z9*Fx;RS{Ci$0IYEM0pffavKkjH30)aVKyV^c+unme9vg+$cbkWS??Jt-I@m#TbBVd zGWhikS;yT&xHBJZuV%L-%Iy2ZNKOE}911|?*Rc|a87?*spO{<-I)I8Kt}xu>6bodtLsU z-|V$=>Hl5zhjr`MuUxUB*{FZzqQ51TG63c#r`!;t0b??}?$#`2rDDYh3_wmS$N_gb@J5QPjvXYn}@A zbeeb6dj9Xv|M$LkpZR}(xpGJUKpdBesFj+eRH`=`FFpG3+x~g&uFV7c?X%ZC|N7T= zzw-l1CqDX#^UrwWt6%ZT*KFOmwX$GAD{pzO8}JrcpJrVpbNq-OQa>zdWO_Sxqq26t9_=Dqazm(8C&_sT1;c=fAJ?48y3wg1_?Y~^0v z-5u+nTQ_h}|B*)>b;Aue?0?{)bLY;w^s+}P-LvZTMzvf%=GbF4Zrc3wAN{Cj)~qyb zzV+;P9&zMRci(egPfu@7^x*yXz3w%y9vIsFt6%-%l_#F4l~!^PAh6?hW>)O8cMmci zsfF=~??i!~3KkN(A}9YyCs!fEE+S`#PeK|!-aGLV7j?^$FCsDG>6McM4iY1CaatzksQGCCsIpHOzsGM2Yu&6 zydmW#N7DFnDDo!p&pb`UPvk35sv0;05$>%BwzSAq(is*mg0$%aEa_WN!NGwOPq%jq zLC7pE_$xh`60wNF$bEhmfS93#YUvw6_8Q)TT~}FOkq6*3kHumc8Tl#$EOdy6?!J`- zg$SCwfUN?!Fwp6w;<_A#2pWjc?N;IQ6~x22iVine%F&jw12aAdXGt-;4P{KM)xm~( zuT5_J$Z{j_w+EvYT}0nCPeEK@AGD-tFWIa1dD~SobBLP~iGjcWnw&52$Vw*^lbGa$ z>S3RYSXn7v*+HW?Dvw>Fbp-@RnGml-A#`#jy3_>*1!)XSE;~r_rd!*jywO9l016o& zluVM%@len?CkeJl1VtdQgWxyn0Z2C2USTLMm2{l6n+-C?1z?EEZByqToj+y z0nWV;0V<`~XS*%|0D|UW+629JzXK}Em{Egk-~M7NJQONLpmM+%)5V=lGq!p6j-80I zGY1vskm>q9pGXh+AdZb!n9^{q;ekTHUr5ILY`ks z0d#obVKDIy_*{oEd*481u0%!rNz4-aXB z{kAwkSom88E?_9q3iym`84*A#;A8+!6S%X=kI>GkTbA_(;toGo!cl`>dwRpS`>q18 zZWnqWkPX0mh$q-PIQK1YxNw|F8b?tYm%HW90JsD{w*@abqE=BEl`^h6h8%s8^0A_~ z1jJTzGD}ko#{ocw<}X}4JT%yDw-`b_od!SC6!ctbupI>n2N$X!dr{66qfizS2jD3y zhe&K61^W?ZBy!_flj-w&-er8b$vZo{qR1U?>J3x~4J%0;CsUJ?ix(}~cb|QpeSYos z?K{dz(rTp`C429^JZm@Bt>2NR+4AM{&U)M1=P#Ih=Rf{&_gxRv+q8Ve^7-?6*RFlG z-fWjjmC5muassbA`Lu%$S@ZbA|GM?&Tc)O3)y{5(D$UZg-8}x~uXycAuU-GbbJt&c z{n$jK($Q(s6cqvC^z`JSg>&9=`dc<`+AQt7Fm9`5V@4 zt~ZRzCysvk38%f~&6}QEd-Y%bIygL0?di?a6o`nhqoZU0efN6$$!A8#rkC!$?2OY+ zNmFz8KX0#3H4ZxTz&~B_=Oii5nLq2OqmELD*Ia#Vo;D9T;)oO9cyivDzV(Ld);_x~ zsdSTRA948MZ$9JHp@IJ2{Pxn(k*TQG1?kiYC!Dy?>b-Bi`G)78+gz?x^33FE`=!Sn zv#WpC3+pzQDpgWZYhq~W%4MgVdP+}c*9|vb^XNnWPC90{Thoh|EPKmYZz-3OtN!@M zaz`gBeEP|?^|9UiA9T=ZXTHtk*>8XG%ayBEjgF2!|LnSBk2`u-fB&xj-HoZnA%`6r z#rVSW>soD?J%9H6`Lp|X>>AoVwC{my-tyMdDa)?<)1PL|n!9z!j){r!2kyP~&sSV| z!!38c>zwy&+q&szKl{SS_ePbQ_<7=vNP7zGw)Vxp(}0go3% zk_b1z=>P%PY+MLtwO6S;H|;ciE{Y{}9auDiawr{|5Q zyy>VT4<8*F{p;WU{_p!9n7wfED_?u!5idD(WO(@c>#ke({Q7EFZE|9ww|mxWU;mnC z*FO30`yZ`#b+j9e!;d<0>9Xbb-}kSx&p!J%zx_pheEfAMzjhbrs%f{Xh2j-5lK@VM*@G55rppld$q0y$6Cx1^2j?t}7Z%R|lWMQj?3VZx z0OCDI0XQQDv&-SWn1)Y<_})9B$DQb)?6afGuejzHAGKV9TVEO|Kx03_%Mr!H`S zKDM%QFkU14_8jIf6n;*Cpp+|m&OxboXjZTuuVijDqTVnHDo zIqcG9J!~V03W7vRK;&2fys~kEM|r^npU6K2>=^=(6_0{j1bIO6w&WO{H!CCna2u6D z+7nfVqCELoVq74pwOLIqYwx|DMaUH02F6!?bVX?Pz3gU*JynbC}q!| zj38aq)q>GYyLawHK)3jah?GMXP4D~3?2z-+*f_=|QWJFJc{KF|>BQF6hpG_#c(>~H z*#CqKBKS5m4Q4Gf?ws)mZVmS60qyaWaIW@f#3L`EQq-tdduH{`UpTyDW2;qATA8P zDLgrds|(*?aFO3@=sPHCAIzUXL*bFq5Zf{MUxgP+e#p7ypu^xhDDKUx8&i-#N*Fw$ zz!T6f-_6h;VF|%Bc-8ciza4tOeO+db!U^GZbF zQ)TKM4di4>=xzW2AkXs7E}!^-8CJu;C|j``CGBRjIXzjbR^m9xvs9tVNHr%%(3nzJ zuZoj)qnXzy5Gg9v%C$}%$Ibe5+Gr$|s*V(88AfqCZ8yhSH34N(rz8Xt$Op{pI`QrQ?ofQD3K zd`!i0wNeEjPzsc8wHu}}1;${KRBBzh0aB_pT{q2fGC8Oc5rN4|)eeC z`|`Z4wMr_Tt?6+UMLH>Ij9bkH5R|KxC{9vi+EbIIay71XG{?vD<~X7PRgTN$tXZ#i z*8cUt?SK5!U;q1yUqDo-qPSAir7|g<)~8IGmOHw1q=^iQPKE1N!9fE7G6=f`z#v8} zru;}Y%J>t|_EBWO*q13hn zTEkODEM(;019`Kt%7GdLUYGn&XnFxVkx{c52VE7Fa{)%MV6jK;#y^F-L=XsEW=$?o zTG_=Rw(CapE&)%$qpi>vIfLftWVrSf#r!_xJ+?K7AFh~oUJcVCvQyNl)1DAfQXMx z1fFy7vQwxPWtmuCp(Lun8C+A~j;jzw5x4*V`~K!IIF)5#^7g=Yk$ete3-;9{Hd+M& zvSVj02r4NQ3e9lpTGW2FP$ru}Z+L}>_1-BM2pQr&fp<_Im-&ACG^J3X$&6QhF#|yF zn-F=A0--Mp@OH#m66UZ%<~%O3QiQqw0-ZB6O~ws^Zv%NK@KbySDiVnCjFdR_Vj)6e zB;HHnJh73Zfxs8Bxt1lC)%@wWn@kk1b{{a0i0~J=?_sPJLSxS(eXM} zKxgiVa-4vG-}-7>me;Y6OQ0iiI+o>R>vI_8NZJD=ci_BLD-}e62w?Z=fNWy3=nJmc zT?4ry7-I;Pl%go7adMV6htHC1v~y!kjElp-%LUNQF(T@e$~y0XXBuFD6rM*iBOOvqpC|Hk4)1r%kH zCZ7sDCSYD1$N&Sm7PeFn;f&tQ?0FzkMi83WPoTmuxuq9T3RW1VhjOWtwVyPL6vep_ zdkruz?5@N9fN<=gd&q7sVGT-v1rAtaeC`pv&juI7D!a9j zvUXC6lBAEw7-N*uKt`jfb@w{`Gg-NksMs zXmVSfObQjCA|g$BrBczgn%zffjB&5ICjufQDkll`&9!D9RcqGSC;(k5W4Qu|U<@Kw zd-~kwZ+jT9$j#)DR=T?n0Zg8j%L$ZcA)qmaC^uw~2q>#o5~|Dr0wM!>TB+4k)CGiq z8j#2sjS$spSnB`)V<^uvyEUlN*{M_)88RlbBt}tI>*@ehHk$xIV6sxFgr%}|`o>ty zFy(4V)#iaAlV>K+9ev5tO09~z#x;>KA`)elj!vicm{)2Qd(se@JW?v^>;?eSZY9+U z)T(yXC5m-h>2{t^)f)y4mOIPkS`200lprAlIQ8X6o%1?6guAdh23 zCYhR;K!tGV*D6IhrmC~pQAvc-HjjLA`CjBBv;URX$ zkF#8+bKy;FTOJYo^m%#;sMfmiy$%Y+4tK@v=o z3G4$ot%Wm26D&ld&8OSw#NQh#ga4fAT;PmUP%sdPjvbR*krhGv5YELc_9Ovvhf0Xd ztW;Re1zohiDT!vik)UuE#SagWhRGuVf&xW$HQHEWYm*(s!6kySr$ke@gP22Hw*clh z;W!V+azq#N3TnCj*@aK0SRjk)_lK3ci1ox^DpVyWtu{~5M!sqF;!?KK5g~3C>cd*!LKngPE z?f?h^(h>EjFffwLF$Rj(0l|ADlc$tRr`eJVqkHQ5y z$UK<&rGu6*>5k-bE+J@=>o*{fVLTOOV1QH-LZk3fgaBKCgI*R}A@e2knzm^Q_M}SjStW4l|3ZZD4m!z8kyH-p7X)`^W z^rX0+=D7lR2H=F@H4ucR_{?kw#YH*sI(@j-xH z3|$}p5`xT3@dvqJ;a-R!l80c^EaQ_KE6R+y4tpdA07;jIBX#np8AA$r1^1X3G6Bff zH_L=GM!G)I%x-$rk~YcvY>TM;C7T2JJKeusSIJ+4{z~godHR6OBglmXJuV16_yg_! zH;czbaRo))T!|srPI3`)%^Y~#_e#Sxk-&;4&H8B%^dr2_JtnAmB4<6}WQm<|BZcvj z*8_)g1tdaVVDUODtWh%BqD1@&calP678=jn4m{d%FPYJLhZ3ThH*R}dA)pNhG~-k9 z)(ZqiDVyU5lN%8$03s;_V+;YHJy?(o8Ojljvo#{JXZM0=5!h|l>}G6#*<=g><+(8| zA*stDYY!}MOFWgREXuS1+S6#rkT>&SWs=-kz=!}~3^=iyUq21ZEkJ057_7HYa6W`hftkJY z`aUKPDi8}xrzoxkL!cC$L$vQ~w#KDhD+&}SAW|AC)d~?2{*02-5v_fY;A zQKxGN7)1&IqbPE+RIav)P;1Q|vADG8v7`WAVxKO>C|(o;I_J%a>k&j1B_d+#1%NJd z2ZEz6gM+euMl)-|Aw(Ns4G!;hCLs9eDk+NCz@7Je57-5812&8>oEq?08#-|YE?EVT z{#5W-a7^fZ7C)Lp6bT|E&~R7y3P;yY0n8=V5J?wOB!TPXV+bVA!RaSY3w-G3hD9vK zP&a%$5=JG0u+mlE5O>ryB;J&}>tkJJt;HB8P+oCy6n^IZmgock$Od0>s$m!q309#@ z5h0=>!{zQdCpb)is0@kDr?{7I5&$X$L+)GvCkMy10cBjy-k1;gxLoQ3g4t&&iQ=+^ zEh>4bT5{&Wdke4B*sFUT7-Xz=Ps{FjHDV2Ot#7h>?{E`t;*yJ4X94$Otc;3nvj{eaK(a=l~KW`=9$2La_R z#V#?1N^v%kIT*46yNMRI=AAwP@3gmQ=Cs?(`P#7^a6{w1_Sp&3inll1Sb+nLreEO&^i`C zUiW&4*M8%c811^7*rqzoFP;Kw2MoQ2KXbZiOH?;4IT-4BJ_7<@Dd zg}^Zg?>ttsu@!;=3Zj@mhrtpee&rAkB^ z2FdoKz#=j9*__Q47;u-kC<};ZC+Mc{lj3DeaNAA5$38q*hq=x?cm>Ca*v+y)9}7t| z&2~zKA}4aewpR#e+kUAg9J1o5P(;p4J2S?^nQ>xjBZ3d$m<1CWH--unTpCD#LIsvo zm?!Amioj(N`8f9hGk^SCa5x!Qz5@iOoYFJ0u&N`&0Dk!k2j<#Nu5#xp z1fEy13L%2RKqJ}y#g<%j4P29gQUl`NgTuXnkk?_LpDtn+|H!eS>_!k30${ZfR|x{B z#QkyFYM+Cm8Upen4&Grobh1V z^LLj#1)q_TF$8xP4J7D|-#6zh)7iSiH@VmMis9S~2Hh$TZ^Yq1jU{UP2HrKYr!3Sp z6r(}$H~y=j3$kopSVjXzs^Tn>RCbbdQRrI10tyL}0QFtJW|*X(1S~ohxxuyRE3m{b z0fU)yo6J5@{w;rp90^1e2H3HnThtBa6n(v$|Gc1qdkmCjs(7$YW&bunN~8viQRH;k ztuMNNITp-TSZvw34i_*KdP5>e27?*B3B~L2Cx}sHaz%VW5YEis*`IT_1t|f{>=1?u zg&q;yZGqPd3Xc511*B%^If#ZA0Fk2~j{%-dF(Y6p0uP8;0T6)+gaP6lya>PmV5PIu zlIa;x!(^raO}tJ8g=2{v-n)^>B9C-MG$ZJ%I4!Ad4>*PFOq9MtK%ZFLg#lLE7| z(vka+jml{~D>g?2yqYDcH(p)yLJjejkvSBRa7Dq}Hi z$G3zUMI@@>1PyYfxC4jpq5>$7VCgsrDCnc>zbL&+o%$w%s06$^c}o%e6`BuD{DDM? zfY7~I1qh@VA#mk>;+<+(A&?gej|VtgrNT#WcPzl!*qw|(6xZ_D!4}z0h@Ao1vFqWx>`Z9R-t4n$F8Vh=VDC^0JOm(kGzjQ1;>`F77}CtA z`S`YYJ)>aol_exjTl~|2oseWe?Kg~zER~?s95efeBDWCqrzjHsf|y+v2Zx0r6dfS| zM=M^@J%^m}oT4;D*rKlhd>TWLp(@Nb1s{Z7*I!W}qHLFZH^VLlHx^n8o{9WK0(h}Y z3Rf3&vT&FV?5Q{2qXe^E7>8eAmgoAUjDUH;ZxwXR;bd4X>1ic|w-v|CPcMGK#5Ek_ z3~3++XzvlM*tqinGKZn5Fj&p#ojf@VA`4%67-uH5he`1ypE3>x5_C2o z^uYszr}{=QxX^#IXEzIpEC9B5&I=UHfu}w+edjBRbwIx3RCq?wkA+>taCjg=k<&Bkv9pNL+h3q=DArNF*3gckX2&)#^( z$2KNylJ6pGoCq@Pt-qeUEkNOCPcKrGuh_CIV)<|PT%6eRFTq*h2uLh*kFE*>VJ?Nh zMjlE;*1LSeT-y@P2iqXNi2Dt?$#d)}pHq*SniL8LWhKmW`XV+56^?#d3bcvQHN+dy zI{)YyZXBFQWIzHXP{?t)$9V<_f#h9u9WI}s$24M)!w^jiT>zc}0VMW-7AjGs=11!N zBeJ0e88i7-7`=OVFw^X%IKX484(yK6>BW>eNXj`;F}n~G5nTzu{zY9F3kw0GaljP5DE>8|0lP^2)t+)+zvv*XJ$*exW+#cJ=tS*2>dFdd@S*g zOqs`=fEkJc&4eQHPw1t>2FXD^vvDFmZo_-Vz=T)}Sj|Gy6%n{=B%S0%92PPJ>1gy7 z0^pw~8cQ#NSyl-45<`APkGB~bukh{{#i?yVu!j@V3_##`S@w|;?;Q->HgcLsCJqqD z*zAWBvRfx2;Ovf*3zy{EMnvN!8iH_Igr6|FiXwrl9 zozMdrvZ`=)2)w)DJOYbaZeSfD)+&Fm4bgeM(BX>I^{{FpuN``QcCOfNb)jHnjO;Ud z2!=gxn5$yNwL0c}uH9&B2$VZog7Y+FU$er!V(db2hu^R}Dx^OF1u==o!s#*K33ELy zEIGUUh~hEv8*`EDaZgtL$fd-kb|OF&cNGD;)2p1J8F#7}FmR&ad*BQNb?jO10=3S- zf?5xmIXAb#oD=&b{zg13I#^;wcNLRX-DQ5o1&a%DJrRco1qJXw=;sc+R{;t=Qoyae ztFyo$>pxWZnAszL=u9ExM}f~`w&zRC2xNh%*jtw`@^*;Q#!R0s&08?!3(=!8i7k?K zOl-&D^L!h?9p%g;h%o{oan-eipAsQhs|e-6l14WHvJ3*D*k)w3yc3ol3LdywV%-Cp z(O4kNK=6A!Y|rmRapbvj56WUr;QVKb-N`{bwe&k^caI;>1Tc_6nB?FtdZIvaZ5Gs{o7BAr^=TiJdQzj3B@ukbkkX zF>n@va6CT^Vu%^WAZR;d`P!57VpB85D9Yn}6QP_l=fhTD8YrxX^@o5dm-{C|$P0W; z5Q~!MoL!Bd27j-WbwJ!$(hi&ohAuty5}NrmF@Aq)Zs?*|Rj_Ci#YCTUyzm%rA<|EB zLqP%anVk(6io*feXNFSuqei(^6cg$THjQlYEl)kykB!M{R|?zz29VsV)% zFRKSKF5*7=`SSoQVsS3YC&m~jF_0N|AdneR*sxdABIfx?WL5Rt#a-$Y7uh>YO6bKv z!2J*h$r4!uNn1{_1th#7%bYNH@M~0 z9>mOGX>E``;YNuV+?W88f2*alSLYi&91{TYB31#??I-*|;AtARLcF+h}60S?^!raO|iW-aF@-SHu z?1D6M;jP5G#P5RU=|JQ+fs%iZ1W1a6&jk5@?EQC~ zWmj=8j#jOGPUoIHqmf1u3J4@25Fm0e*@&Do7)%BeF2-aq$(UrofDPDyO-{xH8)JeA zHU?~>gajy~teMfIp6PVLUiJH9)winF?iSp8-@EU<&->g1>gnER?-eS1E38^;Cr$jA z{gRNJaVUsYUscerR*_W#6B+rKm0k%EC>cr>I(eOoSXqsLb|gkIiyZK4Qvzo@5Y^;R zb7rhb!*WJAl$VrT?&*{P;FYDSOpHNgm_Q*;Qnr?uxik%h8fqYquEnxfNd?trJ-p35 za3awPoU)V39M~eV%#_Rdt^)gso>)(RA{Z;!W90C-9NuB{4Zp-RGwv|Vw~PoZmijPE zi8MLM#3;Oqc%ehKSErjaYONHTTV&ML19eRX%sXMW+#P=mUUb_Q6dkg59zY-4Z`)UzO>kPk1`o~i_Ow<|J5tb$s? z1!4Ly+Z8>WUIkk5OT z@Q>%QUD^zr4Bm_s!W9<+&nr?^UEoG|Oxg|yvta}X)9p|YBda8O9b;ycuZmjYheJDd zPgop?X3OskLxrmz$H*K+LAnZnrI-?u=kCm+DC)3~YgB`#bSXY&uz2j>k=@NywP&f* zs;QtVkpVse=@5^7GX8J(9={>9T2GbzhA@CGf^(Hkl}H|T;q(MSXfXsz00pm&GSIHI zTZNXX!`fi@uw2bfL}K?6Jo6QjS6np#m&)PA)WW7k)~N=VoZ7_5-;r*sI0MrOFgV&Rqo^IYNy zr5EPhgh_N3R;cD^H7Nsir#QPqh^&W7CZq()$ezYA7aK$-2Vav%BCq*%VOBAy6H=9? zyTo#&Be4$(GmF%GaGe)C0aE^qr0J?^?BK1;$FHjJ4` zTB)W+mfFT#SfpiQUFz1gT~QSjDHRHw1eGIPAC4rYGw$dPkg4z@eB(?I%l2|PWGY*( z)2UXtnyHj~P%I2E`U|qTf-(^jJ=2sdJFMYz5fdWN2L)?IyjY2VdJG(?L+oclX%0t6 zUi2KE5EJaaN^Mz`H=)y!T5iRpi{0rrG700jd@KWUN+h;T32zd$H=V*@1x+>>XJ$%T zGNZ)v+n~ik-IxM`>F+|=lW2s`2B&VF0dB@~Jj?j2WT7IR;I^eCxy2q4v4RYrn-H<| z2nY6tE<*alTv(1aM|GkcyoD5VE*D;PBqA1r@mb19UD0v5AX3F}8WmKSP!M;k9n?Fm30k;)H zAtxe5x1eXpOck!%vsp?_84|NFgDenRgm<8oC|}6_Z{k=xMR4Z~{(`a)nL@gmiJpxA z=Fh7QGgu_-DT&lMMgPEiP@1YZ?eYw=;Hs`i!dR6)(Os8aSTNSal>v7?wC1GJb?LAM?h8be$kkTI z%wgy?Syd`RpuuWcu;@ToQZZLWJyHFS$=1l2Tth9_7+C1THGi=voe|QR$?ViH{$h;c z)(A=)an7;;?xe=mc6AG!5kY>SU6`#+)!c6%z64O#=*T6Y(k?9h8LoPV+MR&4iuI(0 zs~t%rxu1uzgZL5}aoy?qCW04YfTxh7I^r_53a~_&sPe#R zh}AaD9WcJa5{^1&jIct?^9UVsloo;nV`-608Y1to!L3wj(=j^UZG&c1fEF2$Z?iWt}l$?%LpR_F*O3<_h2g!LSP8)K0Z2OWly zC3iK6YoQ1zS)m1y`+r2fCKLy%LK3NiB~9|?$#AI)(}Ko4{HlBspp-q}jRykR&Wa%L z23a9z>DQ$iqe(kljA%#$?TKsAAxz4}+hNj}?ITzJoxqOh!V+2Wx)_%`SziWz20ueU z6oy`Ke56t)gH<(H&^-*wO|Cbj&wxxiIf70h8026Nf|BWjFutZUwkjDGlU0^t9+hxO zEe2QY(8p4&fgp+&wKDqELu|sw-YVOC1wn~f0$nvmkqe0q3{H5`_4$Y}Op?Wq7@k}bQcJ5UkpaWiB5EuMa2Le4Ak{R?jP@7Ss;ot%WSsp4T`q4;aA3z841!;0) zQERCMqega@93T|zX}MFS(uBse!=PG~mb|ARW;NiJELHRa-G2}l749;tgi3_L=rGWq z;eyV{Fbvv5U^#9~T*6?5E<+<@t0|mPkwstQ<=&f+FgKB*Qeci+DPfGxpE=p<$t#4{ zPFQ1Zpt#ly03@)|;TRw!sQRaJyfMSb3drRnCuSjrKWf=70{K}qPR?jebZd-cUF>FJ zw{(sVdJh+3D)_3ap{G}1t}3}E_O-*78lN7yc;Fy(5|Wfsv7^jH)Tmo42rE^A!V63l zdJ<7v0#EHSh6XThl(Wf_Vpqw#2q2*hRD231(rO$n(_1V6DSGHgyv7;OM@TLuUhCvW z$ah6hSg;Xl9U16}6ai!aX*KsfNTdhI08iYps8OPze%Uva0(a{gP2C=(+SjR0RDmW% zX~G_`07Qx(A;DQBK!>I%T=X4<7pB|E2t-hF9geWSekEzioKA{3OdQh$bW%BUmCGT< z;RKV?1&0STmy#uO$!VFXqwrx@d25ejcCbjKi+-^-vBQA(VeX8+%#$JeML>}1a9zI8MTCQ8jC>r%zg(r&{S$41^~N$lx~w5+g<8w83=Y0J2o% z_d%^0PrNC35z*HGL?91W)X;Ns(FbuK9`Z{rwPu4OD}4-}q^Fp&6u_h3ER|ky)na&9 zjkzG!a=)6${C@ObY!X&=s)?pbo$#d)R$N7#E>I&F@lnnUG?zgMK zh=%F87F07dM4=7`B#_Ylbs-5T5g%InIK>HZm&R-`5dl07+vmyQFMpnqzbKFSY6HhX z0D^t^E+bt-N~RhCngYe~BU}N?*Q11YAA^dupI{B#6j_+33|zw%Q(adJ)lLpRF>;{5 zC8>>Ht$^ieFO3eXF=*XGzc@c&t)iI~#0QgBi%>mX)uzy2hn(V3cZlJEPGAb2cNnh# zUGS4baSNt|{G%@NI=}?23bY{d{1-W+2)5oQSRy=vTx&uB$_;B0Et8;Iw!T3p>nXC_ z!m3Kag*^J|AbeSNH5bm(B>;6x=lI+p3mn!&t-wd0wbYdc>2a8(wj2R5u~vMt;wif+ zv?0O3A))5Nh@y3>92GXg1&P)~K@=<)K7a^B%at!`pW!>%`^JD-_Mc_h;&5!SrWoi# z?W`vPBq|xr)aXVJeO#mTtWsG@Kq4gzAc$8znxW9ee9z{WX<~K69O2Ryht|qVU@Y!q z^IcV@ImHmKERdA&y|LOG;2c|e1*~j{?d(cdWFQjhc^@KfrxJy8SIRg`T2fz9iNY96 zgG#O;DM2zYzl?9 z3@ni^!n3Ct*?|<{tDrHYP=HHh$zCFqhbxK|5|({5f;|n4Fxhh1g>w-Hz(V~U1t2Ma zeGzrBRI5HmV%|0YS0dMB*=0V~b6Lb=)rPI>)@sa|Nn8U4fDflAd@v2=>sWST_ z*-V6sP@!fn#BqM<;05ukNV%zqn!w2}Ll+F#ES5@!(MI71A&`49NdGw0D2WP$Gn2hX zri@?LO&tjIxm@5!%6sTYh_fqnOJAECZPO zztBL2{DT*U7e<(11lNvT<;rYeAhgtfhiA>xY=?u~=Gdk)wUd_u&>L(57*$0DiWdZ+ zNH<&)(}6H44)k>zLuHNRj&Br6jPR~&|o02 z6-54xu#YkLWex-4ARnfv;}$p#N?$@1XUQW7)Isnx_)+dgK^I!ARtj7TIuSz2mxiL= zFasg~O7JImW{!ZxS8OK7CS#aIjkJ5Jw)|FoyWI;#qHzN=|ZiY8NeW#|#s% zjT~$SJjfyim<7ZJbaG=Pfxxg%MGiqXS_fG%2`iZEegTr+AQ_~h;yUE1srfrT;8PHi z_$7}a#^TPhO$@dY?DCly z(7A^ie-`_0Q*et=(O=>;3Cr2!*2-9;dIt@zz#u^)2!uBA zD^gPJ{9rdW0^tas&P%vEI*P17;g#uX@FZsF=ulvgozWE z_i3g^TP{B}50Z2eDUsHO=oKl*VUKe|l%)KU5;1eB!XW0RVfz#J3n!uSvh74Ev2`Ja z*a<;=;c_BQIzmoF2?CR%mCH!#39+Q4SsMn+N;}4LN>q+MB_VbiI?YS|A~j{coD!$T z-7g`wG)zjMSV=b79PM7SLPbFgVA- zfT)}|3hA=jdT}I-_?^7uFC_SatF6gYEEGL!;~$lXivysT1|=))Ik}ED6EEK0Rg))gTV{E!O|57 zQ=dh+?7Fj|#&P+C3Ue}Xwryw_sm;h8kB;jZ4Tni!ESKNA=)HB-rGhR)0biQWW}sc@HEfTA)dwaK+YyN4qfRxJq% z3;L@k%y0?!h5?ADfW1v*y#VfMT_(-9d7ztvVl}UmBR|e~jK9TPivl(=m5=FbK z`%X;;t@J|TG#(Ax(YPXw4xnlQUx27OBfP+;xYt%oO0ou|0;=gcOm{p5I+Z@`1NV{z zufi1u_&N<(z3&K<`dEbT_z3_OElGvECZi&x>o0=#Wt}!}po=w^J72^&jslB({6dx& zHEUTZS0riuBbbOxR0@~t(OHh^cYX|hg_M&Rk_sS4s)hjs_aShNx)(9oif2|U@6Sk_ zoa2)9DfqTKSBX!GGuy$m9$wZu`VM)@^lSbL)|w^Sg0R!V8nrkyK#!<_!dz`+xxil+ z=Ik+}l;U{+6>|MiUl2B+oKaF@7Pd&)@-N;fhTEZy6Co_y+GDD@N>j^y1SpCm@xI{4 z#T_5@?ZFi>#}%m$Gi7Wh*%(977IeK6Pmi)KJKF@*B5`=sJqD20y~~1NTCxr!YbqPG zKtiFd1kP60$(+M-DLGOWU&7U%h%EJFm;86@A>f23w#OK6<@Muj`R^MJknRX|G?u%6IsLnmPR7;5{Pg))Hz4T zht1}fOh$G#;hoKF|B@7$W-2)h6IGK-hTXN_lUjDjuY3M5Lf9KAnt`s&9!1wlT#BUn z3zL-~JHj4{RYGZ4BNfwvw2-lasD8G3Yz+{S0f?FBwN97y=<3$Jb{?3vczPbKHj41+G z`(dGFuAjph8C~X9%&BBaWbN42Jlm0=*xtIrrC-4vz%ynx*WSMl6@a_ZPB1R7GwNzU zZnxGFj=Ll6-qMk>?$`COYXS7IsEZUNdHr`T|~Ad7=w^{dp7(As|v=xS)izyLx{9et&F=gt^=yl^<`XQKVwot3`jzl z>JCfzMeldQ>7^{0T1knUelI1|SHf;a@){SoZed;eM|SCq{F|WS)rZ%+tP>EazOEdT z&PeMgJ2wc>xEt4dvqa`#`oMe`>kggB9N=o$_6?r*embp4^$)sTZ!&eSH{8T}L~%1K z>s{=0<-Yz6_8Mkw+=a;!+v#Hl&>~Y`5b2QZw_B|sgcRBB3hA;^Ti=z5x zuqt8|@#U;eMiILebeE}OZBDd8kEM3IONPy6WEJ-Uns-=My6=!ku?Pl5V}2M2-Mw!X zhgip~PHq`XGW=rgG!x>_j)E}uB5LppzeW2F>3KMg*_L_zLbQBB>Rh(Em&mDUPX7(y@aR>!F({@ zK%6WWC&Y}x5Xczm3p&J;@uq$TXs9+(29S^*UdbM4U_DP+2)RPgl~PSVldcwsV|gov zXjMrm(*m7p*|HIq989fyEXUY`;$0qYL#23qI{fMDeUlCw=0#tTbSxXtNYyg*nxc2IE$3fj)= zY9B%%!Gk^$r=nkgJ77=vt?<6e{$-}gnW>5Xq}gh_drdk)XRJrZ1&<5ODl5&^(b?IM z;!?H4rcIova#4Ib+?5upc&1FZc`Av-ALsSWQKy?S3!w^Xy=Su+wH8LytXYA~qb+lZ zlfM2qe)w;dvFk*WE_xNI%VT9@YZY=MUd}^N3byW+YaVw`m|DYnG zld}5CqYLso`7Tn3PNID}AY%~Z>{LQcchNR`=vVl_Y-+6e4Y!2UIs zjXO_;_F3Pj3CG!D_u`0?sNm^bF)70oK!AxJv*?RWS#u&L2Byr=AGhMgwFSflBKbOM z|a)homyW2{`|SP0`>>yU(CE15Kob`g~-!1MGwZ zgGEHzdk{ACg#rX3ukp44+b&C%E&#BFc^<;BolY3p0s%4nWg-jpVEM`h4x(~kL|}Dd%RP82ii(;Z_5r4gO9aG0NbKzl%MrefMz)2w z%KXB#%#xV3Qh>`N#zkQ*tW-EQwBt~+W5grpN6yrgWQk=N8EL{IzvY};VJR<8w#-4a zy8($*CPb4}q0?ZB*L>E!Xk77M(L`+6CKtNsTKc-h@}FfkeI?f~besjoq`2y?o3ZqlMR8wAwmJx&x8wPZVYJ20Ix#gF8_T-q78y;ZeWN z_PAqvo#uCk2nx#fNTgUvdPd6qb`fR7o9NU=E7e`$H~+)v#`SF#sFpi9P`P%)txNlf zZSI&{V?Z61wQN28%gb~dk71|LF);%roK zAP47M5)2bOZ6t*KoN#74_3F0U)4< zC!U#|BchenRY>UX{_tA)S^HRkjq;yQ`nR;~+^WV}WhvL|6k@c-!w63V+*3o2FQp=$ zwHY&8>oseQJ4ZsS)7AI5?1Moo2#5}cRJdR?G9;u6~opippxQ>f-#~g#XbdHS` z0b&-flkvA6D|A&|3lEzVMj&;ObI)1pA=7HF+Qg5 z(KfNNPxpN=NoJIUcm|eCxiaAuuaE@@brj1ORI1Yl*b4xX5@#c+G9`IF6Gy9JEg8IL zW@gE`)KCbdg-k!Z0;SOiS5e1Bi~);AvaG&Uh5n+&{;U~dW)>>NBiNZB(Qtxa1lD^X z#*Q3>7sOiLu$-7$-fR*!7C3fMMhz4ILHQN%ikXU=L&`e?dA zc?7Kh7wwzP91Vz@TIXF)-*j2+;M^5aIdSd_wpG9qb zt4~;4R2xRRhfz^hSG&Azk39mx2!ch7d@e`Q1&60v`76F4dvj~%Q-2wI_J5qWk;|Qr zwVKzv*qM*A(MF2@oFx^^1_21|`HVsjl5^X(}n!Y&XiJ`otbGRudJ*D z07pQ$zqk(sux_KpGD4`US@qu)l66GvhPY6Alr<{VeK=%4@wF*W6(_sxmhfLawBp)! zCKg<0syNbVHZ-nFz$Roi4XeaOoMl9DU&$K!9cosMLfit_jKUwCaJmGwzUb;iPy>Ut z_Z#Yqj4YkoKt?xyz6d7ZD04QI^t}mAL2+#|H58o&M93w>3wy+HCfUV6Tq+nq|Bh1s}B1Zg0wmKYdM0DuvKV) zNEX|x#4w9wrV@M`f$)s}-wZnIDIq1cr;Nz8q(01Qk;O74vLOr2#KJUD@lkovGB)y6 zL`aXN*adkll)ye;ZZ{Y(@f{%wO^CB?1A~s2=-_?8X8zX5+SiTN#UUO1}rTM#mk7Y$aixwk=B){kTI&RfZC*+2@3=Y_Qu-Q zAu@0=^C|j{+*Hs3?{smo)NG-SGXbQGV5(|55sN44WgthzTHMXzRE~xHQvsokI<(}f zj=|dB<_J{xbq66pP+DgMaVVfNi9-#Fz?4in`|)@*9*;ZLsxB$PA;T)<@r0N1)6I|% zDpjw8&_*PFQXhOFM)$M#uFcBJ-z|MAk~2HW4!JA$ueuDPopM zL!Fd>$G}Lc)dbSZ_NcAlDMG?5x!{NsqdUnp`4AX)^@LCw>2z~%pc;_VQ9?`R6Hu4a zzIjTjxxnJE78AQ)wH`nbcNDoYmxf}Nv#87l*T2|<9MUD`WBC18T7tHh(It~nf*;~( z9_S>(8C$MLy@0V*byt{ZG#bg0%+Af_wjGbh2qBDdHY0(sMbl7>doa_=N|LHlpi&zT ziM{?S@+C67lj{?RhH*JSd#6Uj+6UASoU|xMnvlb72Doq@*&q(r@r4y~GfNH&a6Zvc zm8QMH;|;zpAz(HM@V#&)>86<@fLh2PPSuoZ>c+4x(HBGJc2vEuxkQbLD#1Awt{|ieK>@lGV zvIs#td|AhONEMzl1))PEkzCj?5D`&oy0jb6F%y;JM~PYA52B*PI^+_haaMGKe!*Y~ zktBt@QtED6mVp`>(!{XLjiV*R(Lld2leI7%!eCS5LaA(Va&*lgw8Y6uk(dCi(R*GK z@q%wUW@EB$vC+(gn9OoYO?l0VW~imi9#z3HXCC+uNr6_UhAf@OB$5-bQQuaZQt6nG zgc4H1nz_`?2ENKh$g=2I;8C#!;^g+HY^q>na&@bVC;iJ@)R2}GgoWlzI3fpGkCFxw z5$2Q?ECN6mfmRf=yaQgfLs}_ACBRpcs478{HJu~`;y?`mUm>Ag06*$Gd9TDwIjc~y zvAeWULSto;C;fe0O(jRb03l(KUa$&~MGg?jNKTg@rQ;m!L8z1n{sx3ab)YbTkg$M^ z8H6&~fltxLanF_Fr{kcg>`?g2tf(rentU#0U?M3c*a*$2hAkGJ3lv7-q5)CYGa?5A zUjhm+8|kWi10bOX5)*VgfV#Ij6CDL3S1MX;_kV1A5MX6ip4z2DIE_Fx5%hoWr-GM|>U$U?2 zu!z?R0Yy){^K>;J6Cm*?y=i}dDH=ek`-?+01zxwo>JbyRbq8K|XHU5RV+QdyzoGM> zk6-*bH#Vk zRuik%Bfp|b14p_;6m#tHAb{KNseJty3+f}I(P%gv&dkmoS~%ErvjS}42j76oNFclT znzy^I6cU2)IT7p|wWKDju^#+dDEqA-}l}G}&nS8Qjkp)@uxvRINh4)>+RB4G$da$U%mNWB- zI6x>*3X)?%o7As$a05`2e~gVLft3~ny?~4Z+uVD%G^yUEYmiR1YH5=qP1L${l^v~> zF|6wbhu(GAXt9DyTp=G~(Ey3CE}ZOrO2!q|Ph#D-0p+1oHag&yugdl!I+~`CoC9V! zmxRg@5uD4rS8OA&2&8}@J%#c1jyBjZWfcjDzG+oGN7l7na|m;pno+?d!R-U0M52&p zVssJgh+Z!Yi%}|(qy$0{#^B+Z1aK6~j70hKjb3`@ju1DYTMLKeh}uGun-rn4xYT$IML-)xqo3jM+p=&bTV^onVre@yFwF$2-a zSKB%sjXxdN7(?%!#zVs15{K)IL;@-We?z+culb9^PZ*5|oJ3(z5?T;8SyHZm%-#0a zSii3Qww04O_4-B$KNXMs3-^tp1+MTP_z;YCxP491M#4><@m7!3f5zU8o-vxWewqD` zz>C7f|wV_K@a_<+QD4Cfj zCMI&*jz=wyb5{=q$?clDBBdtLY=evM8j>30Ab7q^8ia`5f$^m?3mOB&!2VVv5(t8& zhkaQfSOP|2ul)()fp`7@0Lp_z&$l9`^xk6%1Cy;n%SdrN0vQdtvtS7AatFCZ{9*P; z+Z*#9d@eN)BHaQxBqU!|bddpYyJidT)qV|dLt&y*jR-k2`Nq$+7FdLAi7^HYb#}sL ztmM+}0&2x*q%K1c5=xu~D}$+xll@+AJR0jOBqKG*aU2W!YBSd-` zSp*fYQ1%m?EpRgPAJcph@GAHOv#{_U3PzH;vQdgX)WGu&iE$!<h$WCk!`)t!(};YK$;B$k$ml5o#VCUMzVQ+&yiDPuh@SGjFD zutc00lt`3pc_|n@(f}R_f=G!Du{BP%z)KS(D%C_@h30b&w6-{g%sw-PV>mP%1edhY znkjk_hK_O7dnp*9gwVqW#1+>2CH1p36OzSg5>yr=vE)@nJQJB<(Qvmh+Cq1Z0trM3 zI+loltwr3bUBAz(Pdm_ZVN8sMH4_?@W67N+y(JnsxH51Q`xe zfP{?z4}l0~U<$>F0b!Po=4xeMoD`v7+`y*fQmWTHY&F`hM;bd3ZhN!E7&L?gIBxP^)trTWA5 zW7TX7G~8y?H`)*T-e@K^$13cp^iglwL^7kNa*)TMIJPteUA(%WfeMS2DMb=;_MLI=hYnq_WdJrNm8YM`Lgn z4!D7+J?uU_3Kg9M&r30@f3X5bokIvH&d z*@lb>E32GmJ{j~A98u3^`1*q9Fl$I)CvzEW`8K&9>nR2}H%68y7fcjFC=Ztly#$;W ztZnN^;p8*uiRu^?GYAO4(3kx}0*)gAkl?UjhA>n{Mz4|sa}P*o0E*d~Ujh6Q1NfAU z&qnQX!I9N*z$gt8f{sowvh{v|w=um+PN-k5ZKcRM=cO5R&Ck{lYFQ+FV~Co;Ny3d*ZU9A?31>RQ5S^4fx=E{O zf52|nM71I~fUeT>Dt%_HdKRF*p6X;?VKlR4(~GDewXWxP3Q?lOj2%+OqjJOri#3Hp zhSD`>5`FKsk|RYBfx*f4z8Fh+rHbK}M>F%rh+5H%uaOc_D(^E@_{`zaK#72{>Z_2x zCfL6hqZxI_4D~0HoJn*IP$)^0sV#B62;SkePx8*RoaKFDje085s1 zEy4~A1?EIUl!a0%6E9B_vDjOkaXCm2Oi&gaHd82|3Bt(o05t}8jB)yO2u#8)EcMz? znNb$4yi#Z~ngOh-T!+&Dry1QLe@dDvGlN+mxV-f?BPWApAAMMl*cBHnC@HHOYu$@v zD(@eH6Ktt{g&rZpf-;??z7Tl!+o)*^#X(!LP;Uw1Bs6(pE}NC9W8ZHmiS8Hr6(wXeA2 zp_0?6L?)P~EYbWkhndDf>6UAKN}&98iq|E@256dSm(hqq6J!RX=!h|)fVez^2_itj zFShLL9-{|QLFy!Q)SxR?!hej&fO#FEX9^1GWC7Dv z<>QPoFe?IZ&{0G-GZg(Hc1}T-BGtr))PiV9@cWT454dZl(K0%O~V&fC^)qrs3c2G={6 zWKW&=P=TuuPxspukr5D7M!}R^^%=RIGV}5{h^*;KC%9295VkNJ2oa)X@@J*)h)k&& zQ>!j{1L`TUAXsD)NjeD)lC{Ic+Pl88!2$x(m1iH7%4i8~5+SjuW>}MzA=MY8%ilCx zVLKotHNjOWofM%IAqb(cK=c&tF4Qs1i-cmueCd~q+(77Ec->|e zxi78iYqZ_&+t>&=TpCV#!l=p$oYg|Iu#wF}G)-s3)j}pCgSinUg-Zcc{pHvg54aM- zCYS*2G%{8%nNtwDa#{t!Rx4e6*19RQZIEr6AGCyYzl#cW=+G28_8q?To8lt@`Mn3Q zow^_KhQc)?x|{ndR*W)RFVzK)ZEX&_^Jv{8q$W@qJka8@q70^qkr2w?x^eeK(4KD` z@^`kvAhECXinn05XysmTrp&&Ym9tzy^vaB8(7j-|jYDqcIwXqB@nr$azQC;ucZKmo zdmObtm^QAiXLC2Z~kb28vZuw}q+lP8V^D;8t`I&`rH_gfHXvH{|isT&KNIiQzm zoF6gJMImDdcf`ODCn!`$j=IQbm&4?NzFJF-jUMqash$PafneZ2RU@-!*bp~340dA> zqUv$hy|1Q4#lo3M3W^gXpS=N$hkYw)+^fK_EWZ8ml~iLWu@rmj!ZA)`R<3}ylgE2Sb^GA42}L>|5|7DLMvxSB$wQk=LG z5DFHAM`;Hy!;qAM38rv0SRn#Cz-u=T)@_h&V;}4^n@+gJBjf`>w>Sb%^w%P1{Be?( zuf%@0-Wd~@xcxm{sOiE<{^ zpt2Noq+$Pe6$p~cr$7LlhfL)-Pn|w%m5hTI?2njrEewrfz(_4= zMBNZkS=%<57Kl)EKMOJ40W>jFtV%>lC~H=NaMlU#ad(03qH#YFSRq8IN#(Uqr8>nK zzzt~;L%APs{?dhXRg)Y{bbto3{!L3P(TBrLIK1qraYZOzf{z2Ku2?1>l~wO4i&R@Yk1ps%^EqD1Qg$}!ak6L&ZY%mM(~b55K*Mf| z3O*z4NJMyPxq~RV4`sUw^3axQKG2bhF>=0 zHCMym9H<6|$AJP9^cCE$kF)0E;dShYW1F3!g|T6_^$alUXq0eM$aon2khN1Z<^QR1 z|JErHB6;xD&_Cj_qb!GMaGYuwy9#Ih71z_}@Gn#6B1RG&!ayJn1cPTr>$Cwg<9&tU zhC1UeNvc0B@(r`DX5q%n#VE=|_#G|+G!9<`zbYgXL}60rY75gr=A@#(^Q4+fun3AN zdY8b|Q8;qN789+Wr8H}U6dONv`g8dA0Y&HB%!HGfV;hR3K^wW_bA``3$;A5m8~h7G zzka*xd<^>iaUG_t85I){QNm0yCtWsVJGa8(Uvf<}s0S*03>bCLw(FWjb?vRlOQe;{ zU4-fU5s{Jr;+Oynm0i*e_nMTLB$F^vqZT)1mMoItYv$~ZJ`?x2X?jdKx15P6mDl;P zv%-`NE=O00YUm~>iEB5c8aHyqr7j>DWt4nTL}8;j_#&k07^xQJ$CQHC_EOPWgWC$> z48+!Ck$t2-h$^jGt%?SH3`*)PV8C2mi}VyCX1s5a-3kf0Ki6%#DiE-sPO%IL`~qTR zUMjfB1}Q zO^n5rw{AHeDbXQTIHUGZ{mrO*~oGZ+#F5U>_OOModuBPI*-^nnB_Q;89TQAo^HD+=SHsfI!< z#6E%sae4)Z6Z#+m*ji&eP9>HH^-@z=a5l|k%#n@DHAazJ^n3oNfM=G_~N|7D}94m1IG+YOSG?o7Jj!n z8^T0A_`~4_nZmIoCU#7kIufCB_y%fFi1mF$Oe6_ID^Lk3(l^*p)@>6~WJF~mvE-6f zX-I@bI5m`Wc`GZIBU-q;^_Z=qA($1XLV)i=DScN9TNXWHY%X8fX*+88%~c~acqV`P z1Q{+E^(~QL!bQj}!mmN9Kp;Y7xLg22!eCtOd!E%P=Bz-O$%Vl%Yy^e;H)H2=nSw!K zARNOgG=`^anqeVbd8ty9%FA?-HIpLCDm@gEheZn=;iEWlsXU^J8=gsnmmHEZrkI*8 zwPkes2We0-N6Ruzq<~X_sy3}JX%^A!F9~Y}3(ho+5*3xl&4}9`#)N|?`XHDxLk8Vl zSR03jFfTmqL-2pOT6S`?XSgC#sd60{LvX6`y0u?t24T29WvV{iA^VM0u)9te$K7A5 zrol|b9A7392_`$hfz8R2CHkij+-|hVW{-u;!7*DM@B?n7g({YJq_wl|#0*CCDzt#% zf=;?2D>Mu3y3VQt*YzgDB9DhR9B8(d>}&%F_j7!#Ba$``2d)D5R?=LtfXH3QPV^wE zzgn*wD2BnFq!VU@$s94$#%S-z|~i5xLXJ4nQq0uSPYCO*`iGH&r7_4ul< z2$E)ogTja?ESyD?QGFPmGJ)e_cd~i~&eUp39rcBq;!XQZV{Q-8R)CWZC8D(YJRMY+ z!lJiX9D7sIernL+&0Hbua{)JJYHQ&O-kHQZnElD zDL^gOHIroKMz~4T5D`lnjmG1Cn%%gmZF6pgxX}}?mD!QX;8^tY2!9vbXx~&67oP_^ zyhlx~ydwtaGdK`hf=GHo$rVMBG5Y?cLH8jjXfdzbCPCW~Np)?BHD1M>zM2GgM>_)> z(V;l>_$nSmu#lI7|J3QU1Q!~JR2EKCr#>knTX_o6Qx`1EI{<72TE-PJ1QnhJ^ngaG zQ8_}@0L#RqECtnta5TyTZiiU+r12VlsAr}PDaZqm$u_&Wp&)Z)179FcF7YNC zYwN$bCS~wted${wcz9Dbaa|VF=fOIVPJ8sT0j#BHnoZR_-(dcM37kI_HvYLWQJ5sG zuDQ@S;ha!5eZyDJJ(${hL0k+`D00s0ddWOpjtcLB0&o^bDi#f<>;W;3`1%(Y{+GG~#?w`{3Sotm41qv9 zz=Rx=cRKVU(lyH{F>|jGNkZ9Vtc(G9MXE%{z6HUUIBUX}h=lAh?ZKeMF+qq}5)qLt zm`9Nmv|H{KY=IM^)>0tM%#?`h6pM)9P!D1fDW~UBIrp|4G{M9T1UC_@l<4j&X3`B# zr2W`DKm+io%mQ&PLS;ac{lY}$fDtz9?Lnj{T$n;YT|KTR=yd>}V9N-=lT|*8@Urjt zz}?B<(##6GheAvwJ#z$UEsg+vM2|s<3pSedH&O*|#AnIyRGZFO!a#LC1^#SROWkWt z>4g+%V2i7U!<*$tLXc5%ND3)7=A!@RhzK%A5^cK~6O4yFE@HD9!E*RI2z)oU)x?JE}31SeOA-$^;s98JSfnPUj z#4urfs>UW`4u|W5Q9{WVkSxI62?qk+SJ{Zt-@mMCDw4^xI=f#3D^E zal=H?E}k;KG{64`KmNg&Hg7$qN z6#y{az4liI3*P|aMg#RG_@JnrY-tIM6u`w*#=iCHT%){^+YOIV772E8mnP_|P?QP_ zPD5`Up{jIQ#GFdxr9%`LHNRSplUQmKzJdr9541`FNXcGuutcc5fY`8;K;s+&S8eF# zqX#4nSY3q9$h-%l-T{N#I&ht7 zSP(wO6 zLqslZ#9_3RhMNFXAYDn1{;#~1bv#%duFkA3Ee=9G=+sS6OrW9j$33(B#Thag8F^Z974xQtvG1gONd~t9nXtS z!+@$fc|z6OVyxm@0#ZQn%&=fmY9|WUL?~yXM4WWCsYy+0QlciMo*IChv)Rp(^$-y) z`Y0-%^zAKxCg!HmEijx)4vCp_wvn0+2@we+vlVQ!skzC3qE*q*l(H>$;ejB`fd-rB&na zQL1jq$XW0PUkMl~x(N|XCaZWJr<8pyL?Fh$3pqzMVF+3XD zwDBc!p{XGhFrnSchX zW;c6xuI&{QqO0u-a@E2kKXrm943Mv!stW+d$!F{q0Vcd5$5{r~7(G+K;u?ZW}>SgOhV)qvIgBf)|R>6fFXMtbWJFYj>F-q4=BO6fl#71K7;*bp>&cytL)J9euoE{S!_VMG6bKi!EgD zhY!opVa}Dp`D%uKQ~Z+{o`Ud9%ndhraBwhl=IA!BlH>0r!@f#lkq&c&%0v=zQn#nq zqv2pYe+obRlzSXmICB0u-#+^I6UHk`a6kf=G{r(XcxR_)|Dd@hRuCeMgE`0+lM~nJ zR6g;zdM8$dI)UDS8Ezo$CST;}w$vegwMbM+e$1zsrqrfQs_&Hq!P@CikeV?l@Tk?M z(7^=nL>14t@7Bv&)j@y~L3M0XMLhbA$Y2+)RUEKNHG^;BDsiSbpavrbvMD4 z8B5-ZQnV%&C_u0}d)y&OXAmHV`3H=uLD$DR-DU#b?VvJWOhIcgWWpj-X(Ny#ju^VZ zP?l<#!K{}bR_bpVRrkw%Xu5!ohq-RLx8F@kCk(TP&<~f0v|y-|*<>N2tT$xO43$r6n5gWdNvgXHI%o2<8py=}DR-Wm5 zDaU8m^b!RCPXy=E=caeBw>nclOl0;k_=k1hE`~m?=n1*nVMOcpSGVcky3b*xzCoAJ z^S|~doc?0Xi|7P(VVwc;GTm0=&`r{9^b#nu?o>b#_@mu#e4gr#2WIJgg{g5#IjkUY zytDePQXqd)_a@X_s2{A8X3SKjX5oR6sh#0qalOY%yVuqnAS{ZZ%XZD9^+lKiy`s@yqobX^Z?M7oYXjyYRhF!Z zvv6dx1c=_jU^IMub<`}V2yz8pn1a-cgiL`{;SW? zzSQG(nflxF&7Ueay1N`+rFKbk8&uql(o7;Q1t1M2;f7N~iJ1oN!a+LW#wWhu6|eZS zR~)$JieGHob^OZmQZXJxt&)xew3JQ_TqoOQXeS6>-9CdX3h&A( zHBqd1A3I>#NH4IV;0o7Z7FiXrihWhGf*2E=4wlxb99#EWi#C<+;rseoP@`T1b@>YD z>9}Riq#=kRj(}h!l~7S>zphd4r`4R3|p!tE}B3k6k!Ti5$?6)VU{eMcxG~X z!`$4~tsCa%=C^Ozym|A+)a#AMZAn)&O-h`IcsLrhx^Bniv^>hB?^>yZ1k@KUQIwAy z<6vg3oKmL{d07>y^#k?lmC@qraM&`Zey`u__Z!K%ZCe0j5^gCY(ai3x7AG^SfNP}{ zWKfWoCMGT$Yfyt-ZkD7YB$aV-(nCG~$0?Q9Y$@0V>!#L7h*HuQ%@{>RD8&jdPY?hW za^$zCPXw;LI}WCx(yLg^fqh^&Bc0|+7@v&$5c*JMfP{!sN;*rGPp^n0z#n7fS&Fxl zNmbM!88BLWO`8A{6;3HgD$X;RbRmKUelrnM&a4ON!`#^Wn>1;pfNkATDTRVB#YDR2 zP2Fx+4K@TOK$fXP850~FPDu}*VO76!29B)pJuv|GKHMHfg4cg@eFd(hL9TZIPV0?0 ziVZU`rmBU)pNZRX&iSUN-})A}yv??)+lYC2uzdb6&j0C;e#p7yUPIEF$;M=iHo@64 zQyh$%i&Dp(=**byE3{*m>=CCNhEsaBNYxb=;gF%G6Vr(r79s`ZUwXgjQbim(1k)Xw z=$RIxScvX50vNNIg?I^#M>oLY28|wYdo%~JP0tzHI4}z=2ntx{wCCzCn4ThEi6iP6 zO{~-lpk(6-iveXMb%~i3RGJUXem5&8fCb=ra0<0?HT0n~sCrBgDz;Yn-DG)4s{`uyNb%nW z&csZKD3$u(lu}822#HKfUfI92_4pe<{l%~OySKmks;e*9w)6Ov0>?4+gH^ICDAv^!M4~K|B0NTxF&vNJ`Dk~R z)$#l;BtliB8XDHC#9RtBa@FYKl!-|6)rlZtF_8>m0ASj)s^4Or+C-`mTZ38yoQZ5J zH!E9Q2ia)i5mqEn=tngvYcuXL)Z!fQ5Wk=e*9Xhrh?Ndeus%2ZsW5ZhkAXeve+e!7 zQI}*ge42-?B&xUDf0Ok}}3VxQIcV_I!VN&9ftP>YgOAi{Dj zvy>7AD%%}2gFy;5i6~2(vt$Z;8>;Ckv?ZTI8HleKE9nyx6R?VyHH+X5h7!=cWXy>1 zN=?0-DXX7m-VP(}DgiU0;HI>kSeRXk!-R+#XLFE9dACG@{Zn5Nn#o*Pkr3;ZWJDG! zuiP#9CX)j}0L$=!x!5sgPLvX34?f0Iri?+w^qtR+Ia%pxN-32Zq?8h|WtWSydH9nyFA7 zie({E5#GeaD6WaJY&ivn9~DirL9HiKm5pv`%_Y(70MI}bMJ=@*fQaGmv+28~2+X&X za%QNQN{WeTu(>?|tkqTl92xkWk{KJw1_z)sJEWOrZNXStoF1*-vsQzbEY=7-qh$0@ zT$C{O=+jsZxj=?tt^y@0SWCLf-JP;oCzu8jArTa-3+5;SgHR@@cHf|l0dAhbuN(_? z=PYj{D2SJG3@-@@wq0fBq-kFL9X3p`iAr2v96ro46Rrah@TtCnG+}b&fP-Vw ziH2)}c0W?h*c>?WNtn^MHe-eZk9y}6fYTo=f7AsG1q)Ob%4h%!K7no~BRXJuo6do| zgsQ0Ez5;;1@Kz#S;>sw-XqF~4!{$ts0ZI6dFq%q^@RWdsY;>;L4{|8>(@>`(R-k}S zNvcLHr|98qwesct`#LK7B&jl;Re#~0Fv1W3RJRlr#)3mlPiDf3l*F*ALpTb^sCZ_% zNVkDb$Ift-q*aM>kXH6ytjieMvf9>Khtyh&>jGGSxUWM7JjZ^)Y56-p!T6XVGI6k3 zDC#>^OF1 zby2r77taBNAkCXw%A27Vdc#D2YBU<<+?GM~Qfm5>?P$=dJP5I#gQi^4g={9Grk8sC z{%|nVVJBieh@LPKt!D(tV|RcKjBJ+@2~A8+q(sBjRY?^yiK*Y8NJ&?i@;Hx1BW;{? z#RMLL2`4nsS43Q5ntrd>G~>ar&8mw*36c1v(zJ6F+}67o=7Bxy;s#q4NuubKAGzGx z@AsRO%0zm-ey=}8MC0M0&6z-_GIC@!;RrASjUe`xo%K0Ghg@n!2dy)xfJfy^k)r!S zm|^xJkfbs^@fjj!&c>Sc8fA0yh{*Dowl--QU--@;Gi#05E*QAMmabislO={YAfk-9 zw$PMPT%842ekAECqEG;+k`xhTmZ!L&-sUxH*JgW_6nYV^E3pG@4U0@vi)^G7!e{EkbaeatR~?K9EnrX|4p078fGQprnW-PRP1PpPT&2_$*0z)gvq$9zzia z=<22cVU$J4#u=FOXqztOH^cO7@!(K|P9-n?z=hNjmi=9R(fa4=X}TpkQp zS5{X?tHa@FJRXmRqw#n=9*zc<$0<}5e~}_+6xNu9gUfSL7J9g zV28qWB2CGduL1;NOqRrDnwcrFA8tn2BVySj{f{&egTxSI0cj3G0;G6eQg$4bERE!{ zXGY3a7%d+O={oI$m44+ZELm!Xqii}U<1ZPZ#0@bwNwY*mBIPg;Ari`zsT41q zGreuw%+zdua-z+7X>oDi_1Ev&vv=?H`xlp%hvR(AwoS_`<2?sfj;szT^;6TddF&QM z*_+_<5tkS1Dnor83NQ*-v1LuQXu`}Ht5YQY9R!$}1AZ%DAYHAYeKBbk<_BN~D8N$9BDLI83baK@JxtQoZQed5ouG%teQ?=(}^&qX431+fc{hK_y;@kzgQ&V9~&0 z(lRKtYZI_}MOP*)7=;|FuSe)pY(iu>Vs;)7&9*JsGOI+Ci5gzl5Mmf5d101=VU}z_ zBE-pC6oN$*d_b;p@C1CewG(DUE*j=|SQE%YR9F>LVVLiV4nfdCMT|p5R;u(xv7JI*_D4dx zSxTtmlEK`Fo04ep{1)LlnG|+x1p{qQsB%DgYE|-JQ;Z?XU(W}L2Tiq;Q&ZHP8dI{0 zIxua)o)M`NfdK{L)@dLk2(ypehQP!T7RijB&WKrG+NSpiX6^&B+Ixx48Bol2#B@GU zpa`${4)YQwD*NNimy#5e*3AGZQeZ5ET)CNzj{gpkgN|6>#eqZ76$XhI^D|FF>FZ@E z=6WC;2^ysSfZ>^$@UV4&V}aTletOQFj6phm8+I&i^q@lhU_%k+#Ol0g$W+`Mz=fIQ zz^%HVE)o+_X62g)XsnZGpz@k)F2+%siAW`+h+8AWRceQn<|&W#RfCyO`CC?;8XrR; zSSBf<5z|D|%WZSjbxX(H^p1bhi(8hc|6MinxIT zBPbK+hI_q!Z#*38v&`(3G7N*wlt{8rY7QSdFd7XvZP{vGWtmGBK6G%Q9k0qb6X*W) z-28_5cHHK+P4y7~LPA`QMG+$6gqn@Oq?CGtmBHb`((LSfYI-&bw-cVB1lU3jx_SK4 zZ_;>`ikOC_A8kYhs8C)+q-lCfM;1nd!OZ-I{>0?U^5W{@gG6b1)3%ApzGNw$R;e&A zuumHFSAl{mAP$C59CQ0_>@WA3j+K0oX_=0k5UrbvRt-hjcO#`LRVVJ8!5rB|MHBKRZZ!A|tCd8Q4GIOR2W>LsF@l*UH^ysn(PmDZZUARfwD2Y!H!BA6 zMr8E|M7;=0`iRjOR#U_FjA4zWw{I-?#6`!jZ#Ajw~%NEiJE%N2Bp* zlylDItc8*V&~rT2I2pAp7`0*mMo}$m#bMHAT`mi$szgkddq7-bnFY;rf~jm4sn9Z$ z2xVzCc8=x8q&|%U24vayq>#NP87JdFnDCE5-P~(*$s@&RaGUTsKc;pyI!yo zmte1vqcp18c!XHDgV?<;=k`p=y2kLJvdt16wKXfYG7cijW=!4pRK4>mB{x0hU1{BJ znHRi$%j<}Dtqf6}MjlOICle8;)TES}rfGUjzdzBRn4FuN-@IwdQ9F;?e$W99kR__nV1kJRawfrVleq65ShAUSovw zXEeJ+5faJlpL%xYR#N!HBiKltI>3v8SP1gVsWOHzu;Ah?CoZW$(Lmdwjjcm?{p@iU@CYDJ{Vjs^w4p4*0-fWYx3v#yX8(&6~n(nUdaDV4~k zsOsIIwAV!1$;e`+#7ewbn37p6(S$#1TZAlap=g*6m?)ui7AucNIQzsfCup4^kqI3c zNP7F|4N@!ZaBkz4yWQm;t>op!A+O&?19U2j+66Y~_S{XJ@{#Tz&7c%}hO1G{zICPwsuAO;hG zDB@!Q#tZ4Ywaq;+6?A;9sT$Y$yoYG1*O1-BE$9Rh8HnOJ_0=8orQ0Bffz@JeIW*v$ z)Xz(oNZz6iuTU2YQEn}&R8xtajY57GSYs=n_&s4CF?qZa=Ix>eEscpcBZEq7t=(m8 zAY)1WD(~&-Af|3WYTEipm?#rVS!2m9F;gyqdak&R1)1_^F;>NjQs%M9>ZlQ#kal?W z?&a+_z1w4+_4-f0`%m`oyKZjFj?riUyTbv6*!Sib{z_`|cy@aF^qbuHn%(;r7LN3K z&1jT2ZQ8i`_+8iS-rJ7arXk71DM`i(MM2CYOq|<%%+W`kez&{-_$NPJ9SWzEGnJPk zG$Kqq8V(L0yne%m&6JvQOsmF9T0NDdv@4W|1}lSIyN)_;*Kz0l@&d4)iHJqU zLSc6ps9QKyoCWa|sR1+a^sJewuUF#& zMnJkBqP(!yyB79D3a6Cxke70RDx&Dh_2No2V4i)bStPgP;dq!A$GOc}vb3%A`n~?- z>WyP*wT@7R^Z%5Gr7>q3l zw7#Ae>{nG{?4yC0r<4Tmut65sVn}BElPvLcAHGN))>7( zJX7Sq&!uD@-5WG9O$pTnZU+mAEQ2UQx}w2>OlCrf$V$|>GPF9hELu+irzlc8Y1g{6 z6$*~Ia?ptg!7W5j6*ud|EME%Nau5ja&`I0TnNoO1eCgd|hceY7D=hw~^UFDFq=Qx( za|@6Wl|nyKq-9^+3tHI~$NCf82&ouRy?zYs1#qal2vr_bs_e7~wtTDJHZi0FQ0q-w zHYdsf=?+t?dQs$3RMwUvh((geN!DK~l$0~-vlPS>rn0Gl&@sqb?uR(Prt{bp7EMb{?#iN5A2=WzH_*|S}3dJ)%7PFn}->vl$MuPZ+^3z zzW+Uc`TQ5W0)+@ENAy;5@H)mS zv<@D0pdo;p{fY#n(Ob+9@fk9vujs6Wx4nV#x5Jtm^0 zXM|?SBxN@SiRQP6m>A)LZl#Av*A7aZ_$bv#^sJKyP! zPxyn!h_t`_)dk=B){nmPy`TQ_;;Ro2WNyQT$*KNeG!{)-2vH)=th7ue`5|p4mc)r9 zXG(_N*ZyAbqh#dR0~i$Yzs&3+cg9G(9yIM3W=tx7rPS;7d&~{9uw-eoNJ~V;T^3>y$+?xBMNpc>CV*Hh=?tB9F;e`J zON(V&bg;0ufCu$dM3-75D6RWB9s4EWM?`DOtDAYW;e{uI?-oW}_uqk#Z2}313!;ASs(tH)vM;~;q)1}in5SF9q!^L7iDzX)) zxzPhI#Ja^l<$BgAgHov!P;R88BvD>i%vZk8T)cB)A{h&hGG*enWlp_38eX$^<><2> z^oXY~efDqPxVV4s#?3nhqanFPGjX>al|&>drJQAIa{6YcpEfnor`$4=wE3u`cHHiE zXAMVrWpQC;xJ1L{^0Ju8`J<<%`s49fQt!|;R}rlcHB%F_H@eZTK|7*}W@&k0aqm8& zL4W?}&D%F0xbEtswr+m!yZ_=|zjvSAd#>4j;!Vb*;qEIgr|~io&FwgDVsc_M9tov| z%P%F$L@RSMbEltv;~u9~k)$k=l(-$P-r^Rg9k=tSx4!2+i!00byYB;E`?^(u;9;BvsF(cvnNdr;RZ%=$NZ4 zN;xE$Znh)@g`v3r2aJuecWEbiQ8CgJY^sVW5?sxQmU;op_DYqorsqp0LM3rbn2>g& z#h$=42K6jL3~Soxzam#)h-itvvECrIN}s^5uCuz3^3h>+zb3Jkj`5@WbF=S#1K zq(>v!tjm>96K4lL%xCH`biiPK$`Psu!u6lQT{C+g7$Vhd*ZH^$ z5R@ePB{%rwnz14Au?80W!__~2SrdivK|O7_qLkm??Y&}eB#{%XllWM-;W!@BFqBxA zwM7q-HTJN!RGO10I&3rLaG|Vzb4enW%tyn$rb($uP3kwjrb%=2v!r_{XfPaJckNZb zx$M$!efzsNI{rp?xx?)r@W8Y0eeb*7>z?=g$xqJt=C{80jeq;$PkwRPlJsXcZXA!s zqqgNzd6^PrCje_nMVUoPcKB_GPmTT}QcjamMU@t4hzU602y1;NW{h<MYAq|jGqUo!crFlo(!6RH)t z9At;&y1M9U-$NV=+gurTMm&I)*TSr8W=bqL=A4-*rNqmFRZcxjL_{cOJ$^_e=iIIi zM`o)D>jS{8S+ooJghZHqF-pjqu0o2G&pi_ zJX{KC>*~XldJ{7f)3el{XtU&TNsH(jt1c(`S&QV(VKoz}r_J?ur02p|{frRVQhe1K zUJqf5BgS0Ixq9Q;QqV;mfVv{6D~Mwi+edAl2~4Z(cd61(IFx&4Hp%1&;Qo0hAF*L zs;IV-7@Pw96K)D*(ZPhAAsA&GC_Xe1l}vd>NblX0K$~&1Km@>0^Jd95a1|?)WSCvK z<8Xbmgq{PzwO3tybRWn^U_qK%IAeR|E$H`UOSZO=)M8o`qMDtcfrPk%V;eE^Dda4+ zVMrybVLC;OJE}ozojEW!IIKx=m6;_aqK3#$HZ`#-bk3AB@t8$~8p<-xc`!($mGP); zvy4S#I9$Er+QE%)fB(mhk9^|8e|d2K-i=$fkJ=V{7Cf;I=`Yks-1G*+(Y}2LhiyyT zFfnm67>@QGJlM8!+8MW+-MC@AvV5<5-h0n=*L><9J}+&~Jsuz2d#khVaM!!s;k@(D zpJ`s6HZhM>0eCp%ZU%&6j(h?=k z!!dIbk|e}UpE6y4aN*j^uYSv){~1yK&<8(t>BZ-q{lEu(^($XlKCp0`+u!Z??t16J zkt3h~@;~oCd}wxl)8e7)Prb=a?)H0kY;yb6uYLErg9|hB)BAT{eXBFi{Da3m_9s94 z;r?s)EUyj^E*v@bxLv2;;>@KZhi`M6TQ&XW(;xrrQ70e&@P|J1ipwwm+!w#NygV2W zm#1fD?{vQhow#eq4}b8}UtMP*n7VRM@k%okDvMy6aw9}1D69cE z>w1-29%vvZF&P&FGU@`brAUG;0%;h&iTQOD^BLv&gxo>GY>*KFaSTOYC} zZR2U1|EnK!`~SC|UC%uH-_QTtr|U2Kr~N(9+hZ`rgl3#|@^*Iaq|M=!YWU;g#0cfIqS9`T5WKlI@byv^;; zdcfIt`{EbA_Sr9e_rk08PS09IE0@@;oLK#}2MS1@V z#6v&=d&(1(Itp82M^9Q{necjP0?~;v^Jp2|yLtDU~9my^xBjt+^0+|JrW#4dR&E;8{GqK~?1Uh`8@GjYXLSCu{Lt>kii zWAU%s@wnehM^=^(AJ|h0VM23|a+jRAN^6XcvJ|F=-aCPYXbq->DWIKjg~Jy{k@_ow z8^ejXH!;yL50?)wt{x_8rgt5?^G3Jca`dh(+jh)t*f=pc$s|jM5AEN5^}g$_-FNLZ zN3OnZw6KRLP0nwbn4Zg-+R+#t=E5}yG){HybWVXwK3t9Q&HK}L# z){$j@C`c6BEyDGKb;mYsSC=ql@-Z{HKCa_BaNSkNvsZOF0;@x|+fvwm5gRwq-LlKw z!H4B9wg4c^4fz_&bp&z56x6`OkXWJ?Bd*0>Q)_`zu9b`xg>^ub8%oSMapIg3r38H_ z_1y80h4NqV(}l+4hGgr;-gu>18nX!Hwk6?}(V$1o??3v9+jngH)ZhH&?uFgc^IO_> ztm+bgu!x`#QzA*!o9NF@PiJN<50t~?Q@__d;$aVe^kW`09>~7KM|N)8eAm0(>DkYJ zK~I|JJm-&I`tlb~PEB2K(Iq>N+AeMG_a<+5+gtwSyWhHHt6aNFWkTX z&_vUJ>=PdOychq;dFPz_v_Jf#*S`Lbr>ABp=f^(o*Drk0D}HwFj~@5vC%ok?uRs3S zqknzz+2g@rdTL@};qck_xz9^q{-UMj^f%qJ@0(ynT_-Fb6Zb7@wijZxXG(u z^_tU8zxCVR{-%>pIbn5a@XTi}y!@4~{?G6K{Q1v$&KaklJT)^XnNPXtiT8Wp{h#~X z7hZP7wa4r{=J3G-n>K8C)*n9QUiK$18x2OUf8%Q(|D?zD zC#UXlulwBiV zjP|77X3;fWq_gS)vA01pTtIEjRHV3E!NCb;&N>SV4(hG=kB|A!z2<326zy7gK8xUVk%n&Z`QTNNN?E&RM@>fqzCbkFr)z47`Ypkn1?b_ zh`RkGwyLM*&65{SKCA`S4nPnf_x)g%SZgXG3&7mca<6H|!{Kz(-2Z;}dCF6s_@D>h zZ{NWK?|k=rKl$-b|Khy!h4PlIn|AKl+VuK^)s=-q3oFBw@pwEQkK48_FXSkx@=|P* zC`7F5x*+R**7sI^`zJUDYNK2`*Snd5rhs?x49 z^_t245E@_;uD{6_WjSk#hEuh>#Q?A z{E07q^}FY^JUu%%GaQX_7Tso}t5Le;xKw*ofniY^9ea|HgQkF2@bwki&1EcT7kn_7 zDR?BFOhh6C{#ZbWLJrC?Nlm)luADid7*Dc}P76t5?h!}0wgfzvf&wEuzM`@X(2w+F zBHcYw*8EG^O@@u}Lv}RYFqQ-OiUX!Oej<|0L{bhqRi|2yMafA$V6{g~sl0`_Jd2DC z!O`^J5p$3oU_+c4`3W;x`pzX%{3Rl?cUdXkBMj0P4H~0kQ z;My3IG9Dnvc4Q!zHHRvjpf*z~rK+?iXd0Q6C$RZsW*9W&(-Ig zfBtQ6bGyBJ_l(Xtm7u>-! z(WycRa*9_FMCw@SJn(?{gTAyxMEVBl%)MT}={3V62Umtm6UUr*<{ch%=Iw8L;%TRC zIrg~Ot=lK(=6d~!a!5=&94s#_Ebc$BaQ&X$S6y@E1;75~fB)B&KRsu#_nMjct^MiQ zc086mCT5cI;zhxJYDjA=p;s{p5~Q+`v8<%?*UVx0I`B|RpCCN;6*J<5^9K2B5o3qP-1G6AscHzn4>c#*$}?hyXwH`?|!tLmt~yV z#I3ZMM5vhi#OZc?LmylnhToJD%6pNQvX zCvJYToBZ+rc*Vbb?aQ}0>vn(p!4Lh{kAC=X|N4!$z4=Z5{4Zbl#3w&BJ2&^Vr$1-s z_AMLcHZ&6xpZU~hzV_uW?>oHsu}^&T4R3tS6Q1D&MO&42sBkDPh?+x_#GKlRnG{_6$jUHXRCz5La$`LpkQ_iHyf<&>Ad{1wbS zecdZ%=zL2}I&x(3tXrP(ws*Ye>MO2%%wryN`0&yv|NcW~-0Zf0{^nPG^6x+Sp$~m< ze#7iX{{AC>@#Z%@>>&@Dou2ro&wlX>|MaDUhmZW%5C8MN_r3d7S6uM+xBl6=KmXbD zpZ`22`5!NQF%yl(ZEEwr|^b`#aqBPhb7ofBN!2pL)g_ zAO7$M{@{s^`_tFIc{o^^o|rsx_{iMU6x6> zw`HyRBr-EkWKivuWkT*rx*RJ``T5N3UuPmt&Fb>fri~k3@{*SyJhcC{uX@eYj-$ry zs1g)b`Db4+V_OWg4vT)8Zo^Tf3b|{G4f6s=Rp0XKOGN}VCNcnzC%lOkt|2}yv@qA8 z7?X_65riHSMwKOpIJ-_C1;?CG_TdJFf}_YHnm_UchMsWeG%S!-PGK%XdcEGn^wjk1%=FyM?5<;W9&^mjy?YLP;R|2>_wW7ZBOm$j z=e^*04}92zPP_T3H~qWMeB={f+jH>H{Duu9$yqXUB83_e(!(2ykEQ*UbrQ=DgrVWx zy`s& zQ%`)=)`BO6|HMh>!AxRrVI)#$Q~#X25Rc5^wj_t<@r8(zAv^goeqx@cz#@cz3k!-M z0TE;E!bOO^n6r?ngj?n$mvD^T_z;p(iAl;k`QTXyk&tBK29&iOIe1@}HBb^MdIl=$ zIM^*dSg+e)k|k_V0ZE8H2&cPvd{$6i&665`CPZcAj|UJpqO4Ukzd3%z^)KCzRPA>x zJ~d3=`_5N4ZQOL?i6^eEt_%l*UN22e&h{qyzc}xgKmV`qX5!S85~-x8Lxq8d#auVU zVaT1)uDv0CQONG{$-kqt(^Hux)de#A$M3=IG-#o^bL_Z*`Y691M3~aoKtQ{iE-F?Q0i& z>pQe>&-B)9#C;l%CE5GnOHv@)B-zfV@^RW$d?DsueP~8)kWt?>xH8dQskI;OG-wG>e9;h zzVnTCdEr5idcc;=JLV@RcI@1`XZP-Z{D&|8>C0dInNNM@(o28!&UgRa>~wS7iO0X{ zH7}>8=@H%U?0et()_2*x`|7v7^^K|5`|*E&f9I}~UjEV-Bo-D;g{rk~+tF||k@&86 zz2_bN_-5B!z4vL)c{f#;Ff`@B@E&-p>y&FOOTf z;FrJr#W_FSbkt4y{eEs+^Ak|+VezfR1R_IZiCsBs4OLUIj*2ACIVX|RPd#;Uc_EKS z#jTaHqz3i#q9%@}8bj#1A%t#C@S`quvoJ19-aqWhtmsZx=uP{Ayj-}pm>snWnw$4;e+7m^0z@eJHi8@*k*tl z7Tr}H$O}v-TZtr}kwK$%Cy~9zL6;}H3KJYw&ZtwhZ6d%BP{pf9*HqMR5?ZU#s;^N`e)xmf? z(w;3gQl}vY#!&9g_5bsqID-Gx(X1=u|M&C%`yW~J%kQ|~)S~l5%r@qn2ZP~YFdVE7 z7MGR|Pc3d(ncK8se%CQOj@r59iYu>u&tHAur$77Ui(mA-hdlIwZ+z`bPS|zKyZ`2M z7hJw?cEctSmMm0CJm4p5#@sM9dh>APq`W62sfw#tX{8Jzx@Ezfb)m9@HM+8ll__TS z-S`&AVCHH9%Z#(<7%(2h&ZX5g^fj~+$vq7l%VoX_b5mkwO32L$ zmvX$sIkVRF<9SJI6kLQ;Bgny6b&Zs>&!tJB7oA0i@sH7*HBqNH^kZl1bk7@@H` zwzjW`iOOLktc!|On4sQx$YoPV^Qiln%ZW8UX4|t$#dsHd&u(Oea(O*7j2kBuI}+)` zwnihwN!(Rk8)mp4a04G%bC)fT1Zy8$b-`9kx4v-q8J-E{G4-0o{k#9=i=VvJ9q)Fd z6K*^^JJ+`3L;Ln#e(9w@`QdklD~Gu^MMS!+Xm0~9jd_TcARAJR(gsjXF3ONk&VQHS za1m%4M56f6nnz>%PPv^@)0^n8EF5Sl-|E4SI{WEQzx7@2v2A02b#ZWD@4>;SZH04U zVa`NtrkrJ%$18&YiAbh~X>PK2+;JzIaO$bIyx-YB`uf+t@!`L_?k7K;n%hK^6YX$S zLZYo4PeHjX!I$xs9!r^aa)Ft6OEN)o?9g* zUC&_>8ZNF3^IoE<$@xuLT4u@+)RM+aIB%}VD$>8%qCKWeB+Q9>y}{uF0~!%=n%X!y zHQkQK<%LG>Svu3ghUfs{4x$|AT{>rIpK$6e?!SVF)AY8cNtS4Ee=n4GbzJ}GA*&!% zCrGe6+(a%tE;G9JREUHnsx4l)u|9S1+kA&IzYG-K~o?s{^x)+#1$h&bo5RaUURZ#?U}OUorS1X#iBLaT>V z>n}eE*b4(eR(0p$c*l?~R$gyBc%Jb^lyP@#vHfG=D9%7|z&Uz*a za}=^v<+{@%yH(KxN0YPH3tEs^Y)q-zQGrVhr5=~H$fRbWz!Qrk$;3j^l4Py+z;cSn zh>-{gWkeEnrvq#=y1+0N!D~?Rw58_N-W^)a5U^qPH)(- zX*f7MIlZ$vIBbY|y+kCNHf~xStP;_-T_-IZ*mK2ISDkk1DctlImzGvXdGq$;2g4CH z&2TszjaUE2pS<9ifB2N&T=tv(RBy+zJ4dU_8|G$r9d&H4X-+!%#C-?%AAO@^mzGzC z!||r0wy&-%fA}Mx{rbOs@An_@$m{m*o0yu}as2VuU2*xf*X|vUMx6DZ@FKK=23__T-I|Ln`Jx{8Um9&_}8g9{>~oyVSV=+O1Qyx^joY0K8F4}Z)f z|KN#_zVwo-_U+%dY191b>S%VurXx!$Ey-~w-1NZyg9i^CCL)sY+}vzC9&X;Usn_dm z*|vT0$m;CmWYaV|jyh^~vKfw+?{%-czwWuN*mrP>H+p5Ht(H8CEKr{`w2Y?@m* zc(6Y;fAlH0yzZ*2#(A9jJiB4TQ9E|d&ri*6m~EQb$;tlm^3X6!C?jP`_Ct@+SLsZ_ zFR&$r;3-ETw&D>q#!b_NP|QWL_VWb zg$x8xnTOaZrK4r>YnuxSTD6>bau6QJZ~< zp8Ol4P_Y|q|E>1r;1TH?DL_TYDh!W(U}*UT2P85VqIIH{_Nbs z!9Cyo>OUTR{Eaql*xa_GLkACBf8Dj*P;YXB8s*HI`v@l6J2ywoLp>T&oc>8O3lP%e{uir>1{ji|E%ZT|7p+IdCcbJLrYg*dqjl$y=G#vX+_4u zx>b}(IB~K~JIo@>M~n>RfC5B}gLx4zBi-~Ha7|HJ3{qm|z5=60|uK3*nn zu=z#hok~;+)n#VMd7|NyPCsROX8Q2r>O^m1X>s+M-Pf-i+&4M5scD*aJffn(>KYL; zrueU9MkMDfC!BKf@7?AWKmGZ+7hZB@Z*nq=`@kAAm&zm6I6}IYscg9~y(E_0jt(E# zzWtb!Z+zp?%JApsU$AoM(A4~fEUoD4Iaw*I?Q239@BA)O*Xq0xw`;FqNv51*G#-u~ z`iRFf^EdzP-&a;wQ?H37DO@MGg4Ze`|Eu41pm&WJMezx`;)`IS@D*e(CY}KaRiltH zviihzKO7%*x6+nb8zLSqucVavlhflo(o>+oWhQAy10@+r9=C1IDK$dOO^?eF5~Rhx z#5^7irOnO6Bynb@oZCDaHcc;aLkJ3zkhEhW;-={w>+29wQ4=`8U}Iwm8P;t zQ0&%S^_75C9q-jbMCsyL(${`zb$syVm8-xJ*cRBt&Sb(xLg>J2Cu>q(G1LdkLWwvL z6SYOxpuSAplU@mbvXBsEkiKk{l=24HR95E4!;(ak@*X-F6Zd+}#FR)+v|1$F;yssQ z%#?Db#94Cc^?G}DUwhTn*Sz4lPyOcCzkJQ*znY%i_P_`J{{H=k_V3?EO>?7@k2&`E zldt~Gxm&mFeDH(r|MPQxasK(|9kpZYii>ZrHNS6_L> zHDCJTKR)5(e|58)-~8u4{?FdT+}ZcNN7M9(WO8aU^_VHME`agZ?gCG8=KYzoUh?Y(|X;(WQ4~L_i^GZ7&49DYfd*I;y zR$3uy+nh-<)AC^WlIK3Nm*|lXd)V$hSH9={AHMfJ?%bd1k4J+o+qX{7%v}Dfb2e_= zam!oY>bzf`w{T?f_wV=M%PzV2+THtlz22@9j+>mCI2hZc@J z>>&?1{)7|0^UW`B+;QS9Z*lYG<)y)Jg=Dg)mrxTDL_ zNim;(tyWql$3kg%ok)TbS&mg=-GmhyRDA{$!GIo1qgt>2lzZJ;nJXlTJ5v_&DQNRB zvhY8xaXm=i;7+r_qPYzrA*;EL69_&dV3jq6-Wfymv&y42s73mklez}u)H9cO`XIx$ z+Oa0(PBAxIr@*%CN7zIkhf*lSOw1x}qIT2VhEq;B{@Ks`!`t2I4)1x-U%ltA-hbI8 zm+joSee>pxgW>A_eft*|m)c^gf~D~FHTWe~AnVI2WAmfW(Jyxe zyyIt6U=G7HSj}^CJ@1N5_!wh(&9!y;X6}UgD;0cjeY;<`+x5F3PP(F%>t|vz4(@gc zG%7U>@}%C7)wix4ijV&W2-3OP#~PMULzo;tQcr9>()!dw)DSex|90}%8Y11`KZa_OsH z^^(Uv?m-h%({K69kDq(Nwf*T?YACnG`eaQ93mB(wqlI`dW0{GGB$q-eq@gjM=nI?Q z6>z>_nVB+WSy|c?eaUvRF$52~WSX%xQmvk9QQ6r-wjAk93f1SmuCZYonN8RlR>OiX zSo87h32ctt2s0<)n1LtH-IJXvgp@r8Z4e^nq&p&6?XwDirA5@<*}`119o=qJN+LvK zD?Mrx{{z)BRshQKAmE&IXpF5iDBW?RE(j(#8Fv)omCxAe!)5JMU(Q}q-{mP}Y4oMx zC5xhGmIz1@)rC0;b7F1-@47%6FURlL*n`#_c^uB;_h4&glfT3?ZpVXFqA?K@jjp@m z!s}wMZ8L5chG#p%h`Lz@MiK%|SpO`Y|mY5{vlJ}r2oVhH; z>bb=YbJL`znPkd)uRquvSh(p;Zu;D}{P|~g9sljW`P+Q(z{I94?Qk`xa(;~z95EYN z8_7f@P19Q)EN|a3|Kb-s|ExRQp%vb~b<2SR3%|bb!q0u~^I!bJmnUZ?`wdAu;$ELp zPbd*dZpYG&iF?FNZ=zp>c05{bSC(#n+gpG1;~)Od|M-u)-tF%F$?g4#ero!}P0np% z=9I>5%bYkhB;%&(OU^>=crYC2p$?TXmnmr(RDewd1zmpAeC@9a9!&>h*fL9p&MWm{ZeFO(LS4b2}OW z9&>6YQm>zc#>2r|-u&mi9{=85@3DAfu{Y6g%PD0B_d=*v0E(#E>hizdEJU`3Z`f;) z%0ciHj1?B*ZbO$eFwVUz_!rUWJ7kk3pAlQTe8oJD;^03WYN(ff-8pz0i}y)&PP} zMPw-^wloJkI@oUo>0VlC&g=MoC6Qk|~!Q zZAMm}b-h!FgoQb`d1`8A_x1bU{ugim+xNZmi(mM{_y6Pjx4+XJZ*$hIUi{*hQ69C! z@%C-o-~FEVUUuPyH^2GmH#_a*KYYe>_FQ-MH@@}#5B<%1k3a61O4}eR+wt;p z{_b~vaOTZVd)@0^w{geO_rCk@P4%a9)7!mg_sSr@@)dt_%E>qRukZZey!-zCr#|zs zuYK(s+qP{#`+@g=^rN2qZ~yYepa1gtpZ(0ozxq#KIr_Nc9`N7?9NNEsb!lm3btUyD zNLrCRHMJ_TxNZB^rIp3$naz1{jY$(eZ~nVXy2e$4j%^emCAj8^C8C%13e`I8@?cgNe_@)a+C z(cXP~ANlYHjfblf6VpqJ%QwF9$!~l6o6r5(xp%zdUFJ7z`pb8}=Y$ha`iIYc?Co!T z>s#OX!9#}*-|y`Eyz`xZe)%PrJ>?G`f7x$-^Odjs>+HM2sLdb+GU>Ts!>^y{qaLPR~ajDEJ zf8tEBCg%=#Wf4-l%_jN=T(Vxo=NF`wd&ZoCLJ-@!ygQpfbqy-KX3Fb6d|rZ~1W?yF zTtGwUBXk{0h)N(-im0btTv{U<2XD#J*2NcBM4|$1Fhqt&r4Bfpl4o@+9I(gpx(Q}S zh{(>+1D>!28xat3#ECbgv%&FG`c_J^^~I1oW|WX|fs|}10|_)0xJzMjii=bmR$|?+ zE!dVWV7)rHo(fSvOvlU#uc^@@A}}O`lUk+)!$W6AHlV($Crg$FeVbKhS$YdGCzflzCHza8gMNbR&yLI98&@GS6q;}*3~#luXtDJcn&R&q;ap;2iC}01uN1U( zEH4QmCX${h91+>x8%P|4m7xim5G)>?kpeY@R@9Q9JxjMz4^uFt49ojy&+Bs)#+|)*=P_I*CEKAi>?<_X)r{)R&2%< z&f`2Djra*YEXvIZK=KaAkS8y1crwva+&z@ZbV1FZQPAsp(11 z;!U^J?7VlWCTw*6pFk|e%>7=er&Pt4kq@aiF|l;u`pqZY=<#oU$DJN{|2=!IAFr-X zPfZBX>Uca(JVi|!OONu*^iG$6}j3JOl$k%LP_L`hBZ@i#i*%rkHPm4EryU;XM=NAKM6 zpaXE-PoICz z`5*t}XZG#gn^Ip=URhko!$qRWW@=MAUL}^9Ejw11m)gZ6lN&ZH9^Ol`O4Og;xHx9IW_D@c9^y2yaSJz`N5kcXYk6|6KQ+yiR~HXcyHa@3pV^q0a+Z|R;K=n5 zzUe$3q^4h`oFmE--h<~SmxeFJO))G9*Ah=I>+ar!(<;@oi|1F$dP2!ebwE&i&FllO zj5BQ7+7DAHOCF7=&3C!WUGM$-zkhgP;orXX?O*)#C)1lYwLIp;qrpgq%cq=ni?i-< zr|*618`oTU>CwmC*y^Zxg| zx8I*?+wt7o+`}LF=yQMelb`+Q2U8n1x9zAM3^s3=f5-zK{)7Me!G)JxFgZQb%6OeI zRv!thS$o|S(QGHE7*@`T87(TIw{W#8SkXOZCOCLF^#~MDbm80UzC^5jB=%t}J6z~a z#QH>4C>6^Tx{GsF--U5SGUYLqcf$&o{At01OnKXOIeI29x74;x9`Ptsn@hzdr9@If zW69I~;nGSzaD!qowfB3?e8kVO%`H7Ew z+@n?&kG%M0ulm?0Kf8J3d~dQ@T3q_gB^Tf34tJQFoqoZKU-I++{?YW-P0xDn3tso9 zFT2NmXUInRE^6Q23JZ-4#Y-tzYM zu8w)r=FP8t?HeX1ntR^s-ship{>MJ{=`(M2=JM+3*B4y;cOUuW^#>26{@mqPT=iG) z|LA2`T$LtfFT3pWzx~*!4;)_n@ZW#(_!E!0!`<$&clVxu{_;Qn@`8&N7ZzscXLs-3 zeemGn({FKBGu3tBEF&wqN`JKgj9|MkP`uDz~p^GNd5S6;Qaxb%=mKJxm52mkc7 zZ@lWdy`1(x{kboC@r$1O(h}TQto=G_CNm%vAN47>g ztaGma=1NJ60+~+Kv7CKf!HFhH7`~fllLgOJ z>at2*c0q1yYC5@9%4Nq{akrfgY7(LeE7g{#A9{ zoQ_Z^l8CJb8!Cn^alniWjQv7hNN1@iDb_mdSq7o21Q-{r7EZizX7;4xk9pi<9)8?O zH+u7%-}a4fd}C&IW`65Np?u`u=U< z8z*8ive=Y;RCPzy!$u5zWu_V`M_w^gO%3|mK@zj0b=>BPSd+9Gi)I7;L9s%FBCl0L zw6@U@#p?BS3&q#`Qh(=4Q{5JVx%Hb%fk{PJtdUaY)uTi>+%Jm==Qih& z!Xlh3LKt0XRD=?-sMF{f8UG0L%#D%gfPZPkM&PW1S(-?ROo~b(xd3_6_e>y(FY0G= z5~QjKO$T_>B{%`jXzimO;gKxmV96s<(g$UZ=>#H>*vJ4WEGzAabtne;CAZSbGiAC*JgoV~*anar5S>$*F$7m$+dRbmTU-IS*F`D}$9id-wk4l8Y|8Y-h# zh$izwJTWyjIDBws)5gcW^)K%D@Q3feZg(EF(~}da=vqTP?oEtkGxOZ0`SXX1=kB|9 zu0M6-`K?>Imogn14i-ka*XtAKMsg#RgcA!V&crJ#gQGUiZr-)&10VSNue|KFQzSAm zncE=|Q*J4XknWqQ`NG89@ArnQ%NwRAKJfm(zTNH4y6e5}f7KzJeWT)XGLfBe%lIhT7qT3x=y8E2ez)-Cs6zwd`X z`pJRC#hIz;o8IKc7hQPq;^H7TqYcyZce>MU#x4Emzs}jQbKC4p|JT2{=ICuZjz4DG zFV6kNsi)oa#1oF&eeHGs@xveYC#OV@`k?m6!Pmd;EiZfd^Pcj=r+@nMAD^1s^sMK- z=)QNq{oq!HY>Lij5)$w)F;PM_iL7RY6- z6jPzhCNfMN<>~ojZ^D z=qEq&>vPY`($aWkdVbSwZgAdwB1jxlLPk?%cL_@1Dbp zE1S1$$;08>-~MM0z2AL~J^r+9J9Y@A>-Jo?Vf#_i@2?y>FkT&O-nwP5y0m=cNHaM# zH90#R4Rg*@lg-kR1sX2V#LUFhY}21uIech-!$wZBx;h#ThLrO$#~(W$uI{~V_w?p% zz3KVI1N*pXc5K~t=ATh_2h*Cc>PcX}1d8I$mq}~J(j|MA~lhcDdmT|jr zZfa%u$nv2hy}7yZk-eY%{1g@u(?{^Ps< z`s?$4_Kau0^yE`+w!FHyd-pXPwru65Ikb1r^!)4z#~yv@O zbJN2DGz%3!7G-NizUwF(C8fq$LXEBHhGW$%u^&a8Q);;B_501@!orpf8$a~nk6d%z zwa<9UCl1w zsn?5dJiszl6~1WZ6RW-Kds0x-Ct)d-Oq@w<$2cSTgNk0me{)Si(NJ{B);`d^kWkz% zXy=w9HBSkv{LYzpP6w;6OPWn$n->NiJ#MA3J1{yOQMo8yl&<~}6KAo9jbd;|nTRNp zlrx{oC~*{s+AC%!0&>BG&K%VVB4kF;N)w~kX7h6CEFIzfYt|61z~&Zbxm3U8-1O4y z^z6yU?0oW*9(~HGH+lOz-}9f}{oa;soB9*I@nE>Tvb=EkaND+OCfP*WKgpH zdaLa?kB5>+lH2vjq@R9&@~9o#cOAWRWjH?nmzUh)7B~CA``>x{+uz}HpZx5*-uJol zFWpDI$#HqXX^GdQEpS6bsn;;`Xt3&_1vp~X8bSDhMUjOF>xE^7h{#s^v%R0YAS&_? zs5>imO^A||B4mI?fNTY0bfW}R&{TvDb-rk`XX*j z^~$ahA$wt%c5ERCyjYbYIHCa+J!fpPioBs@!3(auh6TyyOnCL97Qk1je)i5-Zy?*| zr_(1!{SIgfU=cxzikOl5((x-Eh|ylXU7vC}{>sjIVM$mA@{ElRf{y*>pK!-I>e>Aih9=5mY1`9pdFR{R_6|Fa+CFaE!EiJjj+T~JHTfl!Qc6wJ z>-Xm7=eBLzdh&@U-r{Cw{@0KH`$s?g9<}47TZ@5GVgF$mnfNshLx{j`-RZ&uqNe{MOCX92yL{*DGq;P;RrZG$ifDiQe++;F4>umwVoQ z>PZh9{@us={RyU&b2jS)<6psT@FG&b-%qL6G!qjObEDDl8{hcSt6nqvJy)S z)(igRm|e%eJ~rw#pxGc z^s9Hjpkw)U0?m0S3c|^_a&nD|Mf?99evdG`>*H5k09yT{Ei`V0-8(8E*70NM-#H> z5m`#sjJ}qbd9<9n4FnG2kD!z0Lxt6dVAC8)Ld}Sz#KWbPjT^Vz=`Q!Y9o_paAZ zZanElFL>TVANb&le|_ow?tk``SN`V0U;S#srtSX^WA7dJ$Wf$^S9Q;5B)xj$?!KF& z(_$OroDG;@lhcvzfFtK<;4)m~xFh=j6O9Q5j$ptBj1Aa0;GEMs?XK<3`OSJI%}jUw z{^+ji9_`-u^Ap(CD~)ElD?Ig7b=taZn=$2lw^yqV4Ggv}`{_^qboI{x03c0Uqfi<$ z7L>L{ktjU&_!AH8+xO6hM_zQ^^S|}=uho)N>vY?;?MbbE+=-_>aL=ttJzKC~{LHhS zb=ST3f#x}lvFpTs%Yh>hq)?x(zEDV5l?swq03LKX#|{?}1i(pLH{Z zrZ+#arCzU(FIiIL1rU(|LrH67czSl;0FEtLWzpE87#UlX=e@bvsU%5<7cL=dl)^M? zblUA+XFkj7>EMtBQm6o7U}U5{GmAit!NJDRP>~nAcJ5NBh8M2_1X~oNix&5~z5NF! z8m;E=>V>m2(-YIvn>Ia~=S8=ZW1?HFMp5><`Fz%FDW$C~R4qeeW~XNwje(H`3%l*k z=0_g}GR?6?3ec8$Yw^Cx>BVyj`rCHV*UC^7Id+LcNYR$pHg$wguPp7ps zg)%o`m{v<`E3BJ;ywYO$Nd^q5tQ!90R1grPZ3jOXX)%l7=xqH#oxqzR$O za{xkwUbokqo`ia<)oOt)9fzsfz7Vqi`^Cw0*@I>wG5_lIz#LDW&p)o?DK2CNTpMMxmKucM3B9b=0= zE8zT@s~-NgZm`V)@WyC9Jw>j0_--m*#qA{kTuT5ydrgwp3iU$-K4Fn~UAb?bzc$RB zby|x=5Y1q#s3{chi2`?x=GL+8O2G($_r>Em+Hx5J03=!u4m8&+UHXRCzxwzSkN@w_ zeesr?Zdtr^9Kc#*=H}Wnvon_GfQu7^ZYr&G4U-yR3JTqF0N%V+AQ5B+f>>nu69N3< z_^^Sws~J`{+N<(c7267fZukiK5MLQ#L`j2rv?g9t8sFTT7jL0mVT=BPxRmccis$tB zo5)Y)L83+I|D^B5@=-kJp1>U~;iMFPqkN$C(V4f$tOQqyixr&fbGN{d_#(cOaC`p| z3Xkr~8YBp#zeb)#OfEPr56fE)y1(!?kmps{zuDBdVBWnwZ^PizU=8wKjOiM9=zbA|L~oQ zzwsBZd)3s;)Hg2q?Z&OssB54UQ5hK`$aE5(qZ2b^5`N~01uv#>OBgIeoQn1B)q%WZ zj{qvJMToAjV1uB-S}x1^zQ`k1Ni}2u7YA7O2{1T?a1=^-{$5IEOR~sgloihoZhhcrha{X|1jDWaoF)r#^ z2OU;IRtSV)))_}dSKI(DL2-0+ov`5RP#oDfs(G{Uo#j3TYY$Ui_}|iFfkTuT6uv|f z!Ix`Hj2EG!)mMl-5tMq%;Yl2#`hZ5^Z_ux{GJeDYs_p9(x}LgHDU!mX97v#OWVcW5zw*Jy_K(&F|Kj}K zhKGxr?@outz;-E!7g-b@_+=WA^I2m^Yn`SF0f$FNCieCoe)#^$>DlG0RzlMF`%nDc zhd=nPOTY8o`yRUgX~&%K+0Xp@^!)6ve}2X1KmUb+X7Sdyz5VQGp7We%KWEKhN6ydA zJ@cH?heihe<)8lM!yo?On_mCQA71*u6LT}iKjY+Qo_SKY*BfrN@?Q6-Bi1fkw(vJs z{BGx-18;fLU;g)}{`In7{ARA*(Ha1ZO4DCnaoKt2KmYIk@#D{a-t({g?Nv8i_xl@f zx&ct1e$I2he$oHTOzyep!i$!zT>01Udh41ci*C97&Z3teb@Y*gjZC95MKRbKJ?Vt? z4?prWQ|9Nt===pE!$0`eH#a}E{elZV@;_hr%=4c2l8K4#7r*rRbIv;X;)}mGJu~~l zm%U=~;_=Pfwpc?ISw*HGm2x4GV$Lq^@gy)g^aDs}9vem_q68@5QO}Ak#e_I;6JS^g z88iS-9Ft&)6ca*-U|Jf@n5+QF+N|E7w7&824FFaXZQZ_Q$)bf?nN{l!tG62W-hRiG zzqoA4%H{9X8d`JKnYFBuD!lEsTlVeSlh!m@qd*r$F+95Pn4^yQ(;xrz z_{PoedFR_k$5%`r*xhI}yWP(1H{bG{=RWVgyKhH=V~#s@u06YT+s7K&&eENs@GQ(P9K$mL(aZlrniQtEJ7x7+KpZx=FM7@WT(j<&AFz zDuIj>Z#J@MaBQJ14OpX9Le?~z1I^Z;$#c`~)@n&(*$PWkcDt5J08K@2aBP9ri_4-Q zYnrVAGS+t5StDx=ud>EiQ#6|mYY7O_hPGtM+FFt*t*mP{V%n^ev9{Z()sjYIAsAcQ zyzCW8Hu~G&UcF$!@Lb-jkB((o&6t9$O_Zt+GirOTP@<)_(Fv$@Acg2 znKqvvXbrT6hD?!LYZ~>swHC=X>UAQr)<87*I~rUjK?}|>c+`g+&EUP9DR8Z5{w@Ll zxJAc+d66$$v26A7)ek@4jnbaHurKuaUxv zZ*i3{0^!JsBhQF^=1{LN8<`il#i@wL^S;c7EnOk;nST5XLs16AJFkrd~5{wk%EwKCWk7j;=$fm=#FhvO0PsR@jfB&*Ct zTzpq9R`^MD#QSfD@ohhOIp8d^5F_jIe<{CR9R~9wRyYLVl8Xb;Tn|5#B?6R$-qBYg znH~~ir?=906KfzMt#D|txnl9czkJ=Ro_pSNKmFgIx$fHQ7cX7}U`%1Are|hmW?W+d zsBb?gREbV%D$PKpL}0A}W1|vS9Ic}nQEWSrej}+w>^Y7cv510ht9p(+fQLq9kVbw= zkyU|k2>DTT0ZOD~`;4A}l}97TPzjMdn0>G(V)YS{J9;ysxGV04(IgWqhDeDqI7bqW2lEB!qSM6zAkbKHr>c?%F#uFGR5jF@ExJ_ZLZZKm3k6@BH}R{?oU<@zvM9{xA0JoA}A)w>-IXwloS;ZA}?a2x5zk zchdtt^+TZ97Y8eL6SOGGhfwtud13UtFlr;qI4su|eBup=JTX#`)uEHetJr=7Y7&fS zZ2wCpv_S}YeVuTt>%Ak}FzW+E-C>_PXJ^Fc6-sP}P{fu;$l!(_cy~8Mu~NivnGFCD z?PbVF8ey5YU_a4P$rYhj?0=P_TpY6GCJYb|YPKs^CObeiW^~Dl%c{&7sdG$K+#*ldMMb$qKbsf6x$$?!BH>%GvZPw(2%OfzGRTQ7dv9HK{35FD?e=Q5lt^J-wi24JrC0CSe(l!B^Mq7s z+XF+%%U)PK@UZF5sx-5nrS1@;+2Pe;N5TA z^vI(ZeeD~2_U=Am%ij0C^UeSGu@BvN%?-`5ti5mQkqr<3_IKB;S#$A$JyU}tLuF|m zd3ZxsA9?%R-gw9DcfIMa{|W$Fqbshs;%CRMKVo{Oy=(hcW6XCi`Ob$wbOC_M(%Spq z_qMfb*WQ26JxMboTPC&S$;Tgl^IQM=z3=AK$oWPkbQw|(oP&+pl@&-6M|Q!{%G>@(J=q&7Q0JvZ0gwR2A`&A#*P zum9%q%SvPFjcn7Vr=EN68LejXgp*!+_E{%>=}Z6f@sD2s0Kfj-pDz2!CAB0WYuo`f z0OUtMqKTVG!^iXzPQm-h6v-a6sz>l`@1yS=1Z# zMT-`!JM5^#*B|w@3%^j7d7{DE5-coOx}sHY-0-IxYmIbzcK-Mij=k>po0BB9WpUq~ z_nv*m8Ov6zo|@Qm(g`PBcio>3TX%GnS5VZoa1u&IYVP0O8xM(5kpL+Y0Ua8JVtECw zf`_{C|LaNe5lS?sfY@$Hs05%0g5r-VrWSS0edl67x6TJB9x0N$TTAHn^spt^f|Q&3 zfz~3C0*$jXc*(Eml9WfMEdaUWSr8O}2JH`nq8eGsF{dO+0gXFuPTHga5R^uxz`C5r zN^}d&<-S+|vS@o97rB%|LQVNu{rQ0Xe7?)LQOO{IO7ps!B zMd_ljF{LdFM=%YQ+0gK1KmRFMst*oog?X>1+|kwqo%uF`F7o_8KJ{5l(vhKI+v}8W z0zX(F0gr+QA91Hw0n4APHri~FUVHgy_z!v3i6zfF*gG!^NUZ?xC zqmTK|Pkrj5|M|*yzxCBd})Cc+Y!2@h^Y(fe(K8uA6UC!=qFd@m6FN zFXg>>4&k`WgT-HkO~!7+2mVC^Lj*E|J}&z(GlqDZWl1X>dF~qwa^LVQ^2)edl!C}m zkmr!@w>&q%EgOoe9@Vb8x#lDl69gc?s2aG4;La!KXu{=#a3>EHJjmxJLm))CN<`hk zvrWqr4x>40SRK$)JSSS7DmNo92c}jCku)U-kU};UJ3?V~eJ_F<|ytB?jaoO9Y@)qO%t1+>~81xyJ#8;FB|Dt(lmdOcK3h z>5{__Tl2@O|M-bd{M&^We)i=rf5EO@6ZZCv8=u&xv8fcg$>~Hv<`Ia8KYX#q108^` zi;9S%X2&tW*GYp{c{1flr(a;<#p0*Qi$@cHKQlX^w4VY;{ZzXO1-!Xw1exw}p%B5K z$!g<;8Wc>#n<6q&xU|jB3y~6r3=p{AaoLB$QwYGt3d;~FZX&o4Zti<)eehz0QWeYw z={%3p`UNV!aEE+<_Y-akitTf!T^oFoji{_8K&_%;8*2-BzB9`%EZI?B450m;6qi6N zWiM6^is;}Vui(~zU$N=*9M~osSp8bMhARoDf9Y9Rf?-C{-r$DrnK(Ae3VbYnkU-I<8AN_Cp)G$krZQez{-MUgLFy0D(< z;gR7_fBv)e=IDxL3#VshHgDRxfA{Wx`{cj;^C$k{w%c#L{jPhy`qi)Ackgc&Em@W% zdV2qX!QqjS!R8&e+@2(Aczn(L#GcKMZaVSlM|a!Zte$GEpL$|Tk_^UWilfBp+D_|OMG`>B7v@>f@nFJ8QJ&*UvP-@b6+ z>bY)lY377r&yLHA~xzZW6g?{Yd`skkFQ#L#O~euj#+=0F$NTz zdFp8h>aw5xyxth94-DOO)Ajog92jgil_Ic)0Kj?=roQDS9*d&!|0?wL<*!motrj?< z`Ju!GNq=8t3l&%;Mt{DB0FeX)C?eeq(6VYKw8K9>TJ7$^k&H^yveUisPggHqyy%s$ zeM7g?MTFb$yi4hUsl9tZtJZL<+taF6Hvp*9US9t4SC{SEvy1Y{@#TlVH zzTv8DXhGTOskC;~kw>gvz3kb~eO7ItH8?bM_}X>XL9H}-3N$@);HjscIQ@*X{&dYB zTFvx^1dQ1~dyH59QN zh?omi)#P=B>~^s+L<0>B7yc=I(96YZf$JcPD#Hr^CV#MnkhMfPP!43l7)ac9PL@!U z20$E236(WQSwGxPZgwMC@Wa2xLSamyu%XF&i zyNhErey7%m^dS#>5CEXkoYAsg9J{RO2c$^uBp?mvlpMhkEJkGM1i4tvm$ZgQ$VWd5 z!oq=bV1SVYix7Z}A#nRWmEfd=Qj6-rf9vz@p0T_VlmGLVSF_85mxJy=Q0*p%xBgX0(uSb-qi}G;fxp84@5?Sp*!au=UiuT2iOheim z{uYZwPkf~=BL>7_E^1CJLk^AHBJgMYAOxB&cwI^RJedNi;jk^r^FxBi^cMig@=Oqh zUpCiDdO`?bsh%}PTCHcEb^5#B{m!5M>=)m-=vxaGjOkS6z24O1)ZE;h)|z~x13=2n zKv6nLY6FmD0BEd1;sdmtulMEn?%8Y@QA507`b{*1GO5Xd$cRVix!F{E)4JE2r!Xp@|U) z^)&*Z>g$0NL_8Du%D%NP(I=6DiE%!8F-zh~6LW{?QLT^PH0>rsn56`BU2u)LSiydWx6fVetEkRZ2_Z zPq-}Qn<(5|02+XZ=XGKXLEJ5tPX)#go|}Lmi#CK#c*+{o#=w~b=s}ifi0^C=Y=c0Hyr4AUvd3!5i5P(J>e|GVMXoKSBv@mNy=U6@vltt>Uw1 zkmomeH;8DtfML|Ts#dVlPx&yW_5@*`3OIx%Kmb%j!=t$|N}=DLD_$Z+RReH_L)H=* z1B5g+JGW~2(t8tSdIe$v(L5-5YSj<{B0sOXS9k`*r$E#W# zn&}ypHLY7g?O6p%i{1ap7nZ0rCeQQTd-uaAhF7k^n{=vQX-ha;7XZ*!0UUBL7E}5Er!^X!q6A=(tD8a(Y zHLJ?f9@zN=fL=5{Zj9*`Il1XbIyJWF^yYirl88W~TLIrzBLD#a07*naR8VF}nX>!l zx4n1W+SUL0@Bgy(smH(b&Bu#8{pQy{eataO?cBcmsKeJRSu+0A)-3?A_^9FNo{6k&YD?cRuK{;wpMTaqlPKAzXQ(SCh_yUNMIiiY*$CjiNR!k8QyxYk-I|Wk7tI!nm zK1GZebFeY6H}3)9fxX-J?A<>yG6VpG%2*g09Xev|x`#Jy zTC!}(T)Vqz^X4_H)}@0B=G(LNdfl4dpZ|Q*>t6dBMe5Fb@9yPoQc#)_m}f>GX!ZZ)kHN-c=_%eQKcmylAA48F= z=iCYKrCyF4|Hq44=4V4#17H9wfI$F_fEvnzbOz5mgI;okB?E@YS}+DJfd*0tWB@E! zAVW}Z;2oRnkFP7UObdzdfe|f&MbLl>P`jN8z!F!S#Z=vT?MNmR{vd0tbsL5ey0hyD z0}W(;Ab>5~&N{{T%iYcao^Wt{4dgmz(r)nI?TKX!@R8MiAOxbL{)neNIi7^mWH zMkNs_>13bYW6MFy4FK>HbBO%D@lFQBB#RJ8qXJaM8Y1Pkz=*cvw@3umTCT_uvE+kk z#mxW~WEh@z-KtJ=WJ&})$O&8)kunPLejEgmj>FI=Y9yk1qq%jKY!tipa1M< zKK0daetULis;2RTlh6IvfBWPwuejn9|MbahaHuwrA%G%nN+V7W1imjZD?1dDg^2+| zOCp{Yk9$Qp4$RV+R3OMCc-I5@nlmi7*c+Kci2A{;!jA6gr{+c}iP$=~*_YuU`jE>C z7~fvaf-C zd*8b^ZGPfEKlSN)J*zjeZm%;vIn7lMLUdTBz!DMaG)=M=sMJ{Nx6Va$sflw5P;tXS zG9`z^fFcSTHpc;R)mRY}e&b*U5`Rl=^&ni z-efGIQni-SHPf57rqBqeBnic$$oK8tuQ3@PUoba6`<1U;w0g~|^PczY#~*)Uwp;9< zp6ayQNme&h`qF!}872U_1CF?P4CY}zP=tH2^kk7lMX1y#mTHlRsvnC|tw$ANgCu{5 zF9P@><%o)lJtq|Twt%A_P31dz>H3X%$XA;X1k>1500?-f##1FmPv@aTJa;1sKZ?Sk zp3bXfVigBW0-jBw1Z0UfNb-${%J;!yn2S;rxcs|**Wx;%zdwTXpTU~I0)bzA$>`~k zL;+Y}>f}V~&W{QE<^ckcJD`_KSQN)g2!$R%4p9D|km9)tN`$b{EAklrF7Q}9)EDko zqCTvOg#XR=RazmCRayrq1t79QB*0bI3E6C1LZE7Cnl)+&1Ym#^Q`pd=7zq2j;k17U zu;5}+1hJe}Mm+;IeE^KLnOGvXAFAd*tzrYBiBFY{1p%GqAOGR^zVqLo{?9F2cK-N>-#+Ek;~(AdI3kWN7@eKicik=bz5JCgeaGA1ziHFs zM;v|Zsi&UU?RJPtt&oT)0kU0d>O=+sbfWweI;#{EC!BoJ2j21ex!I|o|NIxNf!cY` zJHwQA%eHO5x$5_Ce8WpW_OT0oaOscgjn>=V_NJ_sDy;zQo?Uy6ecEBqeD)dLcKhY8 zdQ~H<=_FY^zI1%i==Z*J#sB``drv#=*u#%lYprcH2mbKK>;L5wfAjwLy>I{ieKS+j z&w2ifRxMw8?;{VC*1A+i2w<=lpM!f!;~7?PD+147*-G4RVkrYBcn`k|-XxXyWYc@am^NGZ1fFp zeB({mUHALn{#w5W{m*&nOJDN7_rD{n z>E_T-W1zw3Pe+rJJYvMGuirfnc32N5K^7sl@sMehqLR2cPz40zaT1XdXL-Tz5rM*h zFDs0{3tPd(lWQY2RAvnx>P6r)AO%eaNB{!--UihDUeWJ z*9o33fWGuYM1D~e0QyeFkBn@afJ!2bO4{u&@dY5_YY|YkVz0g!v?M0@Rxy;2#0m<* z5ivUQo9!OFn_{=y>&><61I=2aJ~T44`KhNq`7i(c`OkdzKmYBYpM2`c6|2{N;d5X3 z!?oA`&ENg~!0?D}WO=VkrbJL_z3%oemrexwR2`m(+8+&#S432OQJ)P&D9U&nNOefx ztM?Fw#*~cWA#uO@9g!y{@E!SC(gv2Sv;~En`fdX%1(qjSc$pKATuNimw}C$cCVL1G zb&F3Y5Xp+pVrBbFymKNio^cDsglmO@N99hzxPn+KdK4lmF)kE2x~FmM!V#ovF#` zc6&}~?W@LK#6X~QR!_14OGw55@;yC31(0+7K~X5W;ARiT>f)5#*V_li;#jsBg>UegvSBML=tur1%alEN%%A|I5kH7 z#o&{DFJhEItO_J5{0P5cH$#rgB!NlNIZvPDzX2xVhcdC3vH8BKPyVryWGb~MA_Aqr z67m3Zz@uo@LRG*afE@z2<<=DuRhdQnwZNI|XxZ08N!g`qQT!8GRg^EE0rSeT1HB=0PV)%3q z-#>96P1AwafFD!}B_$uz{PGuPYnIR-|7^+HX0y5L(YcXn?rOUoRfEWx3dHHZM+9u3y@$;X*%Z?HvM)iP_XglabNP*8PfSmwo|g$uuZ z(U-~K!bM|gn*R9bzxdaG`s94C-R@?8`|-c|-=AE1+nskm`uO9goOBXG@w(T(<*~gF zpKs}=k2`Mt-hF$ox%zsY)_bL0yKY@k(8vD%Z@=@k3%`BwS7&DDwTAim z`PtbnST)dSX;fsCdw#uM*GW>VrQj=j#$fGBpZnChmE)iK)F)o`>Q@f823M|L`mKw< z_xQ$5TXt;!(Pig-;6v~E%fEVctz91*{qKCssi&V(bWKuERV~FN z(@70@=Qg2d!KnZN{1`9z_ry#i5G^0=_!ew?{%b)Crp{5K8vM&+6|tKkmqVhFZIWsH zY{yYJ3a|ewa`KG<6evqnbbE&#bK z8|T{d^V3rgKl;!~r=7O;sHcrD9QpMXzuLcRZ+&#A=yubz-WX^;@X$R}%+?2ojH#8y z+_l&J{*;qX>-IXg-1=vwiKu(+^?#h0*flr3uihNowP)Mh+zf!S5)k6nOGxW)ylBZG zO*HCTArB%?i$d#U6|T6rh*Y9&#A)P03H>NA9@=xTZ2hGYvSVfR{eb!!?z$d0$w5D& z@C4xDRSY&D**5Z&du2%>Da^22!tWoT%u>-Ir4(2&C6pFQi=`!Nu`Iw8kP~IYbkk!N zQeA>YvPc#PEddZHYuyA72Pj;-!-F~#Nlo>^F0)0!Q&$%Z!;P*2Kpg9%SXO=K6ew99 z$HhQgS{PEV5*WY;41t0q8(AWrQ%)31#oz-etmd`O{hU6c2@!*kUi3Lv)T6M?GgHn!J<1O;HYOID1LROQ3WP1pR**R(kx5yh8PPKl z2rQED55Af5rM1Ye0sM~o2!4N4jMAy7o{sWgX?>(J$so|T*-z95S5N@pJ!=sacbT`b z!zx6gL({&>O4QL%rHpvEvuZc1$sOL#Y(MnRTM_T;SkaNrv$IK?W z1rMSEB}uKBrq6lKvz~YUc^CZ6KRoonJu6nNv$mX>nVFlNL8XXfLqFf~q&}c(17zLO zyf9$EWrB(~v61k)o=6Zr+{^9+?92VJU*J0w&p>9b_q}*pmRv}EJwKQZR3cL_%RZKl zB2^IN!SDv6tAl6u(Pmu+A&+>*6 z|CXW&p>cTTvDM0Ryg)F>K6+SGX^;TSyH+WHc%CQ#E0xPCqJrRcRCy`{xu9Iaz7wQ_ z@r6*aLzH+JX`DN+BuH^-N<2F>7|4Yxl!ab^PM+41(zT?KnBFWEU5!?`b6imYs!q4F zci;Xbt*u?R=HU$wU-;#3{P%zS^D~ZHe_(2U@0w+spWIO&UI4}tfwiD@WF6=Yh#?aI zNH*b;LW!UU2UFiYifTQ9GYcM4P=SL%sk1PlL=5vpxIRKWh7)3|6kK9eH4pc{a62+# zuwx=XgYEV=XfCkGqON|Jl6A;S5k~{Uz2nL!ENx0 z7~2Q4lQ5&hGd{!sy@*hcCDY6AsPVbziTXqRreWh$Dk0&g$u=} zS}6A)>e+x+NDk(?&eT6#UJrkRgyL_TCu8BCB@qG+9d0`dMe6lhtZvX;CRT&c=duHDkx~$n9)L zKtyD$TNX}a?%#0#%>MnL6tBHRMki$d5BYy+v>=9nMO3m?O54ud@c8QC@#XurKi2EE zlO(AYO%X!f&iz9GCQXyM1MPRbcIAJ6bZyJd1!+vYwU6GVTZ^pC5fMmp%}e{r7ot*ViagW$#pj>*%(GAL z7DXe~dnYFE+pyuPtFG$JPS=JP7iCWExxUTzmn}cHu&prF}#f!%8xbxQc zy!{;~opRjjHOC)w%+ucT_P_eUr9Zmwu6t0`&OZB$^Ugo_lJ8&o#A6$=Rs*ttDRrkt z7cTw4hdy-L$;anK`P(b6{{E$xQelXU9%y{<9q%~%>@#=m+Ij0ucYpocU;5z>e|EtI zf0s0xAN$A$jyiJPzMZ?T`_uL3Jpb9h|NWn?`NP#mAARfxKJwmU)*rp$!3Tf+tKYo- zjeq&WpI>p)b$^5;d-uEE_QK~q7s!792R|Aa8>=^)-~IL_Q`56LOF3U=Ck^J}gEYk~ zg~zWXtVn(lRYUlk!Z_prdzTDM0AQ3u5(S#w;%;4aVPIR~117B$OEwq-j(yhV4yvV!Vu2zYgKFQ5S;*x6SsePMp;e}Ni@yoa?E6NOrX(uNWssA*FJ0Haa>W3eDG1`3W>768x!6kse^ z4T?09R&ERyO`}fJ52e?wM8 z4Jr`*5@7H;v%*ElZ8Yd>MGo`%etvs)R1pgolb`_L6$h4)MA5$gEpkAS+NRi~conh< z1xn2 z%QJmw4^AyOwU{-WqL^j0Ih)*qMDkT z&^n3vxVs>$WrQ$wV82chjJ`tdt>lrCQ6d29Ko!46%vcaS!gPpm*a;|%7>G&m$e}lT zacrj0AX*2AJ`#DNm~d2AijC3#JSZUFjFT!&@iDhC;(wGWMlFg=M zY}=z@MIh00IRj_GN6!os69B@Jb0R`s0qXMzj0RGCDFcG&t9unK*DD2*H6400Ac1fUXak((oPueprx* z6r%N$OuYUvQj7;Wc2F?@mJ*ZjfO@fd*gVOCM>L9Tle-&J)+&0j4e|wX$qam;1OOye zMFZ#)eu#fgl#=Xo`bhB`R+pC~?}Z_Kl1z37AV?260VlRsAv=LT1q|@s6?_WC z>!VCc99ixupEEIIj7A@?Iiw2~fea1@YvgMJ*9ub!A}0+`MsJ$FwSg~6n(b1jpqW5N zB?NFJ;(J9F2C~v4vcr(p5Qk=eX)sUfe<=4U&>sL$;_WWBx|sw-q_hUG)SXe~yt~{e zBv95`L^U!pwsh&@sfnrGyLSJ>C;s7u=e^*^|9kmUJNDmj%l++knGOt`4!Pt;^U=ks4?Vw5|B#g|1 z{#bzmU+7}@CIF>e;RC!36$=wlY0uhSaYZSPE1s(vz(m`_7HB)MdFz%Z z*+!haRij>4igs_?f@!l_b_F3KC@${(hoY~7^9M!yA1g!+#!xvAprfrfrGgt1LHW1* z-vE>V86-6T>p>!dyy)o|9viXlIEJtV190JEXz}Wi@#XurKc4s6I!VBLU}zXczyw67 z0SL>v?pHo}^!r{n+&i#8Eoh=ho-BtRGmG~REZdlk{jwb2T@GmD_mxnnAkmPhqF4Us z(Wky{$v?9I~7!CmCP#esK7edkNP3;7%0rh0_ zc9o5&G-WW2No>W)#bksqut`;GACZOo-v{7^fLh@#iV0O|fpaK|cmm^SXpMJ;h?n|N zyxLLMBWvx_Wh*Bq z4)k2%BfgBPLJ#r@Lr+XoB3>3KRyA8ehCn9Mk!r}NA^>;qd#g&)3ITk9+rbnf0xGRFdGU($U7BLu&CeUA|O6?RXIAxRwF9VW`N{l&i{ zrsLB~fSBqsv-0G~eF;J(;&M#XRB!6cB?t(UL{IMBd-@sYeDfP$`SSl<_?>TE)EZma z?R8P10$rB*@bHK+W_oJ6(HboBE^1ZG&8}Fz?()li_VE38|MlD6v}nZ<-ELdZNz_N& z%m4p{5AJ{LR4h&u-JraUiVgz2q6%ax!+jUni1L-t6tBKtirKW%kX9mvS+EWlv>CM^-VnFV%Ya!qE@D_Z=^L`HNrp;#Y2ZV$+hvi%rqn zvwxo{OLXT1@&K~|Ows|}7<4C3$FL^ia8M&HkNU+}Oawrl)i_x4>s=$5q_(;T_hDNZ`Z1#PLXM0{Sn()&)uBO-eWjxDyz5Xfzc0$1osz*FE* zADZeP7RsuX8XScI75zK&8=^rZ)qoK)*}@0LU1VrrG%7@sXjSO`Er_T(#n} zpZ?V3*Rld4f2GXsGQ*G4RXPcX<;O4cQ-)tOI?78U}ZGZbu6lS$d_U>&N-qc%9S9d zBb768haeW`%wlZ;#K}i^anVZKWFa9x%C|wWRVg-2M9)i@EQED20H_d&!1}}7BPvM3 zePdxb*34dsp%5-o@wV=5%z=VHKLG$J#ro%Nf$zSG+6nxj7pdaAMZm+a&}z9L`kGOp zZ)h39iaAzQV33iY6JrUHg(TJ47%23c1N(bN(vFwmxgF`O0dkW*$Xa8Kkw%3$g=_$o z?gb|gHL}n`i6O+l;+A@-@DT1(9}wdNu!M=u=k3zb^vG3pNYw<6-KUmZUt4_Z@Z!g7 z<9m}Kf(%Qm<~nx1R79Y)2NbO#!QbxLdeq3safcsaW+tB;(3fw2^2u(Qsb=L4h$)O$%LC&oF}Sgy_cD0;Ly#wFnk0S)#JYjp-pG zSYwM`eRz>pX`XkL)=4cZ^O8*7XpP{=LYwyhNa?gF3Z10&B`YcK%+5{k+5W_rKKmc< zf8V?ReDm#RpMB=kh?9x|RBS(l}*T3N^8{1KEY<4-RWrWBb zJSZAgsdyXnbFnSr@+X4<138k@EHHnfXl&a-q|g)}Fpx))f#YM=Y!IR;3XbDst&s|} z(n_UGOV(Pe6l8A{ucAX^gKG!f023;&n`jMW^tB9*gb9X0fe^-dFqnvE904U{ z^#@|~eBpu+zp(lT+PFd7v3`IJE#ba0IYU4K1*idC5m`BIssP9UqIu~#_@+}}x=neh z$buotb0{s;v^~(lpWI4!KM1-;2v#XWq%0{QFhnYtq5(2MmeBfBzc>_tOL_!O5eQH# zAVM5V|Yi2`z!JIjo$Ra(cRkU&%#qqJsrs}MmcG=|VE=Ok+pttGOgG$NrtlsyQK zSptS_g?rJVGbUm?BOwlA%xokOV*~*zbOT@f zIa^npiTROcF)wfY?jiz)DGx|&iLN8S1FiC0#t#hLbco@>Lq=+NgafS2JM;5o&CtkD zYoOVzXDUf*X)Q_6^kxZ?q1H-61T=^U-6S0v7}!5KF*!8_p!}8u+@64h|9@YVGDncJ zs6$AsFlz3aa83y3f$@wlj|Y8W0D?p)$brp`S$52&S(n1g<<61SdDVrQ7S|wvTMqJT za(?3@JO4DqrT}o#`M4HVslWPkQJUfu;X7ja#4TB;>01*wJqX6buJj}})9{17O$Qhx z{g}FBkKoN!(q!^t;WH+rbEq|q{#IPnWoaz18VqpSeF7czN=o-(ZS^Onqh4-M? zkUV1Y=gt60%#f=bB9Bn|k-Kx2n<~1hhx92F(tXnbfRJnnN~_vH*_{I_!21dyVo~%C zOdQCvZ0WMan>Rmo`IWzWBf!`&wC;%vsS|sTORPMNW z$0NOuu`5NkRZ$8e11kc6D9DOubD;KqgECOZR8{(hAnQT7*XZ!d|Ec0ZBXki55ko}d z(wp2KgF*1OY|e}|3T2oR^(nTM}uc|`A=hSy`^u9vx1Y0anX^jP|yy8GbH4BK0m7_M0t9k@a)(UL( zS<)m7*5~*{Xjue6g0fNXQ63z%S!&DynjC_ASrxriO9n?*jX#W|7k7q#Szo`UwEz?) zd0FcLqA|uAOt6V$3Lr9W@{Us2%I?hP-}~r2N?}*wjgLLpp6`*hS|eGYo`J4QNfAl{ z0ebqE-l46g>bWYx3@VlIYUbF8tgVcWm4Fp7*_N?V6Q0{`tnweddd| z-*Ss?j@W!YXMYDIQx=8_WIJSHLuFnfmWYY~O_383fVKc-ZcW+6G&7*@yKlpfe*B}G zZoA8(h9Wlw5E59+s7OR$^8ye6lqq`zfT+n0Mp@I#JE)W)LwSy59o;$@`%ymaH)%l% zHVpTrC2=9P3T75!OHwTZ4=z=wIK(U3JuyaYKyXX)Ac|b!syH@AD+|I1ql~E_DpMMX zuMCauSsE1p88Q}8At*A&m=YK*Fe;mxqHs|kx!piyZ3&1xCZqv?P{_Lla5La4P*M@G zw7OqBm5U=C06<*z@VfIBFS8eeD|trQsqaYT;{ z{YxseA^`c1Zw^N;soTbkoiCNudIZSp@*J}zuK!gr&^6I|2Ff5r5eV3rwQ;M0uP_|S z*HH~66x7&h;?YgyY=sN?9$Twp;~1hLA^>Gswqo)43tsrbUN8Ud_kT1n&}ufax%TXQ zM<%*@9a;-Y>!jYYMDEa>7}I@H=F1FHV&pju!S7@DMnZ*%y}4lDH4 z1gfpeGoyJ4uDb|IE3Ju)DU2mUmQbPA2`RLu^ovC-p&!jfx6hO*jR#71IJ@QC#)GVN zgc<-`8B`~kQd+9wBB@YnwWM@S*BYi<0vYKABIcd$)YR0HB}+#~hOWK#`ZG^I`xz%3 zx8=&Kk65*Q&(8fO@1|K(3Xvijifj3Z;m9u;M2yO7Ad56O>+yh#JYW^aMr6C>Ii?Ov zB50DJ8$yBYvn&TlDC3F%L`m?7xO5#Got)1Mu@}i;h>TVM2q3deCD zST|-8`s^z=VecyRXd6aSqUxFl7;oC1!E@vjIAI6ms$`gP;W`u#1OWl4YIH{c@<>P` zP4W>JxU9kp?V{fz`Aot)f}bP7^-skXqU1RdF8~T%mpV;MD@6T)0>pv9YoF2Ee;!>8 z0X+HJ2xTGw2ft-}A94^spE&YS+!6`z&dlXhztC6rr?^h#gJ6n*)rQ|i?&WYxMz`XT zlc*;i3<2iLk>xiwo_=j->6NNkONItIxh)GMuxO34)`uSpS~*JqA^?LrfkthAr$>1X zjRbO1S`nbhE%Zw0m0$_Tf*}9|LI4Y3Q6;1_PR!U%Tj0P1jxMBu0cvD8KaY?~;E7d8 zJmDuQaR-G5;qiYHw2NB~NJP#ud%KMNyZrXM(npoc~1fieOgzx)*mNiju<3^MXdh%|(3o5BPA#7i05 zqEHIR>;Q5_0j?P|D#zCgD#^R+x(aIPj&4`G)~U?x>h40RS1wnvLx{c3$$mOP_o0vzLu8 z?Dk3oDD%8$Ivde#)4Ud_!1RjHl2EF2!x5O~R z1Xz61mdbzQ?}Y~jALQZ=%YmT-BKU!d5P~jv__aC!=$sTQzZSHwTKn`nrw=s%h+wTOlZgP0 z8Cxv6=nciX3h98DXa$7XTS#siFPmUmLfkvH9ATP702+Zn0gMc`j(yrur=4=r_kQ@J zEnBv%Sh36+Gd(#eDGk$X06?9!NNF-|qZ}e`cc^->+Bi)J>hx-c5FXq#xng!=$&#hZ zR;&bDZrZeQW@bh=8mJIaBLa~DzYO1Y+tW)IEowFgcJ19?5GiGPQxl-n;fEbDIXycu zJ?(0UoR2tRa>NqA;qTqIV(JiL4aQdnyZ4;Kk9;5#9d84yBQFNd#>kr|alic~m68fc z8<3mqtq^5eP%r^*j(6IFrc)7l=MoOYGi@;7F1N=6bDT^$IEh%2Obuasr{J^lC+FB4 z2mG_xwxui$94tiEVkV&t5KPtQnF!vliIY=w@xlTUkv4e&Wfy=TZ6>vhE4CU4RH{m2 zdb9ITl#r+d5f$d00<3{Ftv55UU~K6(t^`mBWszI5S(2evguJstz&&?RyqgR{h?r5Da1sU%ZrVS00-V*s#ZXJ==JheyU2jcwVw``YWTd(Ep}H9k7B zXL5e!s-;hD+L<+4hWePKHxJ<8EoKu1NQj=|7_vi7>yd;BEU;3YKQrQmpMXr17E1#p zvT~>a`@C47{{gqqKPn;SxUT*r_QxS-61eQ)<8*+ z6XYeJg#>{VPzhxTWJwbyH7p3W?zNk@fU!^?CY3_1MzuQ3&H65du22w@-`0|gaR%g$f;*+l7S6z zoq)e(Mga&2HmPT|#u7tlNdjbSfkKSLcq$4Ly6V*CI~rX`0cOEl8b+d`s*Qv|=42=Z z1O(3gL)H(GTEaL(bUUov*6YSMj{hU=im-(n>i-CyR`Knia=vq*7}BzXOq^97;cL_n zs8%FJxRHo_N5rI}Dv;DRy;uWL>zhLnwTBqrq0%s^u7u_RhCBO91W_=8`@UyL#1(SS z(gbdqfExo!XoE0#u|eV+07lAYo*|8uh*f!U(<@)Guv`pe_d$i2g4U=|DMST?+5*@@ zfmWS1efj6*mz4oRNVIn=1pt&LCex}nr?duZ5Kxml4Bl5L7%s>lSOfxVh^$}T4M+~a zeJ8wd%Dkx8YH#}MH=KFaSsNbN@SNv9@2K_bzkA7dtV+>MqXkq-=bi3gJ$uXB-`VT7 zZ@&2!Kt;9$pd!y#EM4~TkAM727yi!`mtWCXJYJe!-nB~?FZsmZ{o^G+{NIP~yYuHlJ^Exa{-kP7eHv#~3tg{V!kManl0YDFzry9jl_?uxQe;WoSMi@H z;THnKMW1SzH`ZoZ)-8*#UHr|jUHr{36BAK{41nH{P=Q7OtTtcN1D zBqr`H&sW1ECyZlKMXFBK!S}-5L`dxWis@H$$4a&+Pm3PL-^dRuQ8tJVtABBTk^C%t z(syU@#WlXvr~M)u*|8*Um~hQQ;tqqP{L2k3C`J{OZbWTxSD}zRH((ZV+Bo8{lS#%L zS{KCvk&;lr5I&uTh}{aSb}C^eOoe9Xj6!4Nxn#4fwtRfy>1Uoc*Piw&=TLnSK~k$@Qn$tiNC%DqkwBzjo=Hlbzrv9al+p_Fxv4YGJnNr6`H!cbaT*$R z`L8ekIg_HeeNhy4 z9wYb;?1dq=lSqR&pvb)_;85sMB;GKn=qtRwDZwSZ?0nO;qC}xWHQ&h>ELw8r87B`6 z4%~F}Z9BH^NK>~l4FW>9GYfgSdiC=4M;vwJQHKu=jp$VE*}dn%2OoUsp@(Otr;~bJ zr`jzDMMPr>fsRsZ`;Fu>+!O20*@&Hpg0ETDd(f~q zvc$(J1Sx)z5JcBZ#kD$+@+}`iO6@|g&5yo03amm&NOo+e22I^tl(yi^Le}+ z`goiH5O@y}_G%$KEHukSga8TvfandKf}{Gho%|?kA8N(`7E>AG0Lm9vvZ^@7@t5AI zz0N^AEdYW1gaE>{Nj~Kvup*i1B_fZo5h%EV^jnJ275nB+Rom*{po_%(v8yBU_3oa2 zBM1l3ex=xqO3|b?HvqXsBxOLk>aFsiZk6v9fzp}n6+jl7Ej!!Ab`R1TSOoi zrK3g!{uQg7LuAC!qUi4Q7THi3KEdcFp#(=Dlur=NAqxlN5C)iyg?S$kf|?9FFrQ#b z$#n#*XpSTTvmFZxal46ePip2o&dC@YK{Rm+7AmVGHD`=8DTc%TNaVMN6bdL6BxgN5 z_``%d2oU;85dKZ@E|EHO{Gf|UUJ*?J5t)eg18)u${m@<~AXa6pWDFs~k@skdwSOu_ z=H(kr@t9bIga-pA<9Z-y{B@=ISos-&p93hD_TiRqg8~Z2xDzT~!-(#bmJ&3Pa-NnH zT0w#epaWQ-2Xa$trOKi#^Zfi*yncLq@jZ9mhG}ZZ z000pwr6;GRH$3|2u}2?s?KRi-Iz6QkO!oyZIG=#pb2Cb%#@Z{dy5_52_%{Ii=C@z) zmN&oop1bcOK*WT=h{dzmgr-rHGC8qDiH9+RgOH_K zlGH~>3RAkh38LgRpgI#XMst;@RGHGE;>m0lc+AEJ)Jo~3g6-8xQAqDa)+o2(aKi!& z3y7HN1z?3rS{BtjLOWub7ZJXQPePwaxr7>*9>V9Lj1y5!cN0I#?CE=WTHvMNgLcRs z3EhBgMd2ht%v+8XGYz03BVs-=qwohezLKeW0_0o5K`QVF9`}?`z>09cuyNgAf);QR zf<7+Ec$VX)!8_O@1mUA^5Xlgb85a@V?!DvqXPokx&wl3YGf!!@ znooP$QH^@q&JDULIZ}RQ90EQiSf~b@83PXoKH#WL3~_8xPN~H63t0f{!eZV$@xqCk z;fOaH6L<2I$a5QxpOGmFL1I{nSd~oFir|qS>Y0*wiVyDb#qunSV=gh%VM*|`rpWaw zl!H|sqpk?qa|>ii0#`ec%@zE7mMRd7*?Cb0EAqsH+;E^pz|PzhqBf>@$qSx$(O17X z&}_Wt{U843*S>|ArkN%%?e_eF;ns^@{?hk;=$&VraTZiw#karn<4Z2SS%$zB?g+?~M(bpHdP*re?67rLUwzHS z%}+FjhKtewB9c_J z@?}f5?U-x~kCuLma=`&-Szfym6eUWt$-1_9pkWLS4HEIo$~3Oc1tbr*@;@OlbpKHD zHDv@hfQ;fb;VB4-M|sJXLbPJG;EbnwsI6}yyDeBi1!Uc}47Z}_sP410P0WhcqczO%p3sH`hB_K-(gi3RG zAe8-bojY;pKmtEU!;vTz-!e#)$%MO~@|YlfB6p^(yE_tBP=YeVX~7#%6cmVSHoSxe z1f7DlKx~E_k>Z!@7C)}?RluM?O(GMan9Tt35hf7L*mO*$^4P$FF#0EMQ2Y-22NvX| zqW46sUlvyII{+^GyN|l0poeA8Vrdnk(ppMdK0LVDQ>9gDT~E!K?N4RPR_eys{H`5j zG>+7u(<36#2-bo%Fw=pZ`*Ft}G!~CIg4VC5UI%vWw;Q)Wy9f0_v=(gXEf}#XW!4^> zrz~*^6bvLJI{)!TNWoi#JCX=Y_!%I&8kNK<0JNob=UgJ6z}%+~zV9Io16kB6YNG3! z@-<3Jz9LM@IhKoKv4$yF7V;barFSYpy3n9Fa%0f9bXKkpBU_;>zV%UGWPk!gf!ci> z94Sha1S>-@45F5PxqmxA<53YWBdqk@MFRqgZ-*7Etx#NMKwbtxYQbeJn{q{6JdPCf zM?PY3xm}(vhUP(mn;rErT5N<-L*zwph!;v$Lx~qe(>UV#rH5=oL zmOO3!(Rbc`*I;Yd5YG3y?e^U0*pgOjcx1uY#?2d5l2~8U3+$YQz>0}Bb@ z466Qwp$B=yi0MHXFd_&68rYuM&Wtr075SaiDSje@xAHPneh)rtEMnAu1WwWWULjD0 zAl(0b;4My(><&Sq{dWx^kB7Xx^;W7IhbGGI>3 zb^=?I-#Kk^+1`pOqh}w~YxhH}{2e|A;E8b+pyU1fqr$g%iocMJGg_(>$tEa4>?$;n zr5DJ5+&_^lB7itWpK?MM6_{qDzIfr-GmbwlN%R%JzN*ov)w6VJYPQ?$`ulr(Ljp>& zCZJ~jBo=@qxM564I&er!1h>+YAl0fnKlzvMf9KLA3%>T1i#~9{hX5eY%L_j8zOQ}$ z>zg(`cEiore)p2^f9xY4D0*$c@{3>oLTf?m2jBhv8~^%EXe}VT>5Xrmo|*i@7r*@B z54{hSJ2RXuJ4XH>ix8xO*ka}&-3sDGP8=fqs%U|@get?mk}3u3aV8O?s;H3qv>DJ? z9>qF~FbCL8e9NMmYaG-00*vNy%2T9c(W8Ah2%O&!GI5ybLkVB(hzCIUrVye-gy@I@ zks$tnT(|ShsGSHRa)l9eK_L=+q-|?x4wPJ$jHcw zWy>}`{-7MCs( z5dHDs0lXwNiur(lpZNDt5ez6;gEuw|e<6l$NSPOi&(nzkh9IOYOj#o7`^HH!!NZ_| zlwc+9hfFSv-?D30(iMLb4v^A9W>}~Krv-GPLJJ05Ud96T=av&c0o)uUrCgOEj$Agx z)v%AW@F4GCoT0fTVW8a(aO5Xf@R=^in+VDv6*D3P086A4A9V%+CnJqkKbEb1DY_$z zG-d!nZociY`S^E%Ww3T7qM0+0;&N7+w^?*3Y#n>;$l(b%W-5@#7H_=DJH#P%uNA?|W$ zJ_dftq(Z`hitT*2wHpM1?AK ztEhMsQ$kRD4{ks5y<+MSX5cVL2B_y|vKAnOAVN_`fWdgG4mTo7KYVy~KwTM@_n(C} zR(L*2qn)O_%V3z-O5C`p#1p?F>O>HReC7KJ-bSwN?FI=n`Jy#(2VFV}3{<%2L*70oWJ6{59QP_n}7~9vm69 zK&VxBuDyEMvX{Q>WtU%eS&`eNOBPvED&0iuPT)hO)O@FR_nmh=^I7NKc*D(|+37Q0 z{PO!BdbF6ItJgAPO0xFYe@ceg48P&Chq5t%1@Q!4WZN4v`Rz?*-TP z`jV-Itm{}muIl554Y{{Yy}}bXFe0&;L=F@z!C4yeTnCi34Dz{9BgT_>h?x^I>(ND6 z4V$zNlH|%r0zUCpUZIcz;0A0JUkP#Ngl|9qe-W-CZ~e|Hyh(%*z>XMT%8??!3yYr; zz^aG?arELxMxad#1O94Nnv39d%~9`|Ef3?cd)de9`oicou( z+r?VuE0ND!WbH>ug>N=Lh{Aoa!u=#}Nh0em0}09iK15^CuFp)-+Q@|b#0AgMnKQe= z1_S`N=NDrX*UJ1^&1}YuwjfZC;#%BPwvA9}in_+`8}L+;P)DsL;-kbb07S5c60H}H zFI>1_!STl*fAzIDY}&Ya+0sSUlyh^lD9JegQtO&Z>Qc!C@1#=V5vPj)UKApfpIMOm zx0AuZ$Vi&j?!5PIg_)(^y?5W$%ky)eea@CAHvafWKf2?#n*lS^n|kBh-}8po{l!Nv z_#12On{<+wB|!7r-@W+JhwnM-?B`$b(GTfV`B07sq%iCa>NSr+oZe*O*#^=P=>;O2 zF$Di)bc#5hjCQlQL&_OZ1quityBBg$kd-F>5i$iMs1EpXahQqjFLpz~AWYu2*_2(T z22p#YR3h{NeVhg{S?M$TtbAU{YJqR=@m!1p0@wyS<@qVW*4fO3J_LI_GV`Q zFsbR~OP754qAxw~+-IJB)^j#(-fAsnS=Q-w2@o+s(!HYd!H>N61ur`Pw^v^I^{;>H zw!7|0l6tE#hzc+H&QAx@^zH9`QkHDHJ=g8#!$U)R_Uw6V(_`z_9+o9EI@)Ru4fT2jYE4BU;8)?Ad}|W; zSANNfKbl5BKbTE?6F=Z9;3L)&8M2RIehoes#5^w#Y%la!?AQ|q!bH{T3Kd9+jM#QP zgfY_ja$b}yyO}=X3MiJxcX9p?;FpqmTx1`M9_C#}p$D|64d_9{6H)-l(2H2~-|bxkKEcY!NLV7Nn6)BpfPS?Ym2^TNYF#6lC? zLja|eLWSfRwHy_$0bMwA|JGh^fZ)#9K&6z`T3N)X>>FNj*cHR6T*Ith3ic7Cd2zGU zB4uz;7gP?MD|$&xWZVl)@{$UTi$kUSw9=94-ASfE2;xK39IAXGrq`m@J`~bwT1!z2PP?RMlxKJ+R z!fwE&pn3skezrH1et|{ws1ko6@_I)J*#6>J$=^CTM}`B`C&)Uq@kK4NgnyG4m4_ILETRNqL;qpq!Ui~ug`y`rnOE}Qy5eB z2AkQ-Uj7#wA9?uJ8?Qa{IWNvj+o(4YH7Y_2N~v0{MnretdC%#mo$>UiAAA43cb{>_ z85e%}tLL5jtaf*v$Y>(dE3|_B`*$}7>t~;F_Kt14%d+Iu3$a31{1~82UJ+l5Nwfd1 zYCJqZ?YaqqDhR>)QKtF_3znr|B2RA%L2LekDk8@@fnc$}AhHk&G%v1U3-}AmLPT5n zCOlMb9Y%+w#UPJ6$f>+xP-UVlKvWfS&65(J0G%|SaVC!i|F>Mi}BV`Geb2LGLJ6uYB&C9kNXwjov%?M}Yq zZEpqurLxx0l285Xzy9`jSAF@yuYC05A4^iz%X6UawjDc?v^F+2s@#|XY8g2{R6+<* zg-e2`45LU{HV9g@AZ}j`k*z__t3+b4dgRn%wj9MhoID#=Vf z9}T1GyxW_do*o??v(`Mmar3HGtA~dN%c<`2B?~q^xwk&h$X)L0cj*!&V-sQPLah*y zv}ZWz&BN2?xTt|a)|LANRv;!8IGqogED2KFPvjUU3ifK``gxLQ4X6R!IfxO+OR5?O zgjgDhaTB-7?W7_TP-T3QO*nOahcA1i>1Sxq%mr8=NE}x9x^PF5Vz; zfrG#wY|iP4Ka`Oa=V{I&c;$&grIc~C4g|OFoEuDI7-!RSd)D|+t^jxufx^fZK%sB8 z4=ggC?iT{^zy$)hsU*q=MWvK?GbB*t&(8Hb;V~!(nB!4i}ODGNygtrj$!VA}49U=3K~qqf#yEtDlB2_U+S z#UpW5oK2)n5i&WOiHZ=F;if<_fM-PoL2{Nw5;kfJGZsi+o%C zI)?9g1+n{U zkA3dRVu*o*Fxg`()x{zJ|!;bvObxTyNK_HEg>3n3eAqP zed#i1%#yWA`io)EyT6i7T-CrZW5SDr=M15^Xh=nvmIz`)C?f@I5rIciCjgLH2|@v+ zxJUhEb_`P|IM9UJdO&HBez)6ty#GL*7MQ z0A}7I*MpE7CAcAoUfm(?A$Tzo$_Ntofg~=*7A7Vk38$OSV2Kz5#Ktf*iM+1ExR#f6 zuy7d&z*t!T;3qmuX6Uc6#M!2VL?Vz4mVH~$8c4KSxM%?Z9DU5u8=u_x(ESe%4h|b* z+Vk^eS@>Yd28uexG_%$Qr}cM|Cx}{6urVNa2>-wkU(EBCM3A24G_{#=gl7C-!J!js+q93fGr1H$RAN8%5gzB{(<(!)X9c zK(T!x6XH$~p-trSVXTV{RxS=2B(kRH^nd`gUO2Y!lJ9=wq~niy!3$ow@4)1Ir@a72 z0Z}PWgY%*U0EJ+|)S3gg+;|gE@2}qQ)*t@xJDqm>_B-#JotYUQU$kn~s&9SkE2p1v z`n%u#?y_j7twp-tG@uX=P%8i;tCVtyrE&8nko@@`o%N)I{bk5T}^g1IV<+mO`d^A-7KqC?oV<>+fO=t?nE_w(-Qj!7; zmjf{K4`zws%J?bKLxLv=^e6ynK62#o!Hld;vwBji_41yz)(4u${gV|Zo3ms%bS%O6{#`Zd@UW3Bgxp~^X7pLc7!D6*= z(e{TnY`^~zY}S<_yLk&}g#G)W1YEKZ_D@k>Kw0`BmZF449a0UZ1XqT1b56A;1VX~J zjs-zcVv+=ffj1uSbqu?a`^DaYT%|$|6aXNzk>yqp-@{vjpUy+!=u=;AQ7EXw@slU+ z^vRg3V~)IW8Bdt*A(i0cGgiMq0OA>nB)<&}ju$FOM2-BKLsn!pTnPxGl(I}DmH=E_ zVZi8T)uCmseT1QC;wDfmXn@GLom(LL2J(dY%C!;l$&ZO?NeCg}X-E91sF&nhkDhhJ z&xpk2u@3;ynzDy9d^R5bW<26dJKQW)jVxMHfC{=Z>Zu#e#>;5$T`A3~r0EEVjO_J$ zoG9*KK$0hdpR*OR7wo?Yvd}`qoq~i#`Rf9J#A;_DG3ZK0E8qFMGri(3Jn5?Z$6Ind z6IUKXu~b=O(*1ygqOE|*j*>ZsTq8`WB-wjh`U_Nff;YM-V+`YU6n77m0&tr$Ck~2~ z*H>JfBFUx*h%8Yr&yPRx#8FQ<6x*gM*ng8{#uQ=@R zwQE-DqA=s*3zx50e%BqhDm7qjNrXvSYt$Qv_TGE$ef{fS`?8n5jSq05}&Zux#-=vNFD%uiW;EbEF-@I8ov)I;b1kSSwT zr*+@N1I!qG2(i&o^`}UYNmsf7AoEkn--`V_?3PFJ%P3Wb*w{q9p@zzzQ=jz%*Ct4O z3D`MhREoldebgZ4P41f5pe5$^Azq~%4}CvAgup`Ut4;`&u5gYM$8hvd5fAtO4%7qv z5BW-n|E@e-?hqGZSdY;HCKgzHONiz+^j93@3F5-Ma>|JU*aE``-bBPeeKmr7iK9}2 zcfF*jeBNg!Ty_ac3CJbsf*>hZjiZp|KOnxI8|ON!M6aRC$ek6M$4};uMYqcPqJpxd zX1&&GHCxT*`lqe`;iW&AZ%;2-yr|dfbmluT(z*L3X~SD%oI|)4vloa`Bux;tj8mU@Y9r?5*S>YpzCC;Mp8nd`zqNO2&%56I)-%pJ zsnu$H^keVexd78ZEWhJbXP$O)S@hohp0^LQhHky(HlQL+QbgplW-yeK*p!4Y3DC3c z5z9R;s8zckGD(u52Mib&k0gnO_-ctKD*fP8eIuI`h0h`?B)AuQvPicAKB37T{(OBY zfFwv2ho@~K1YX0qUX2U9CJ8wYVO+(~FJCZ>VzhSzc}J1OMwTJLBnrXI%8I0CrXeEc$|QG}5EGT8wlLmQ z5CEXt>CAWLngjI%le1g5?KpP*(X~_!wz8~|6uk}*k}WM-qN~#Lc2& zTHl}tf939Mqh65Q#|P&aUZZcT+(JG<1WW)~h(sVy_U`A*!7?3ppCJ&TQZfO9oa~fL zW%FCtGvISx!H58WMAog(0Rc)klfnCkip(&?9E_(qxw#lb$oGj}GS1~sOyP&~bqf6i zYK1_qvIYdGlu~Z8h0=&}7)@{#&MgE8kWXvz{Q~KMlZ{eQV*pSIad8`|dJN$BEg?wM ziBSc~7tRnMT3m|39JtzmoS(Ti_X#H=PT>b0s+F;p$O3B68r)taVFtHLmfh2c3o7K_ z26kWp5XlvKluwM^dw!fp>PW3bejNx$0t($Gs8-E@|0W*D<`%^!&JBtNsiH)gKxK8B zo`XFH@ThfUEtnEC_q0>miCLI0pzK15v}gqK(ppf59YyV&x^tv@uxBr%2^b5t6q+f_ zC14Gd25JakfGpHBBA@}4){rb%1AYe-0#!#{!){K6!CL0SRX_cAR%au@Mo}FUpaP{3 z6#1ff0$_Y~%`LvWYJyA}T+^z)@2u zxma+_S0qw15fSJNEf>oc$#B&2uEwCmDvqXlcvA;4F@9X=nD7mb*6w2E&Hy9hpG4AT z-&hYMUKEjg5J)VSj)tcD&LK~WW=ieH^blpJlUFB5&-kBT%M7IfVFc@GgB#Finad=$Ue;5sT zqHly?ya={pQwV4)8b=gs4bS%Nbj44L>RrJ{LKNrW6#gmJ=As@Ls}jV*Z9t6oiIZ}F1xcYNq?=jWy#eemG} z6O$i&-v_Vy!_}An{Ibm(AMW*fRCZ21#PBb*(V~0Lq;bPmm@mOVTY*JhA1; zCr&u=#0T!VSL-?@V2rU;T1C$|@kC3waD2h3r=EJt?Kf}Sw6RvptTn*YQe@d=<#5GiH>?7xyussCbZA+aX?2EulJUC9~*4{Xps{K|7+2fGWYR*xC8Rpo@M% z^M7RaL#(_AlS3;c8p!Mwrdy2uPRkswLdGxE4N;#j1oqDv5yeVduv!h{MM3_@!Ej?! z@u(Egje;q7Wpa|nvB{6UiHf+tK`D+65QlD#bVz(`q9nT9yhvqMjK$s8otG)MrLc=l z2(a!pghAlG&;OS>i3G%IBTM~H7RQb(OW1&Tl{7un)V;ruR!P~O9b2>RfBxm4e|`BcFTC(`TG2&c z`KH#%J$K%d)tk$gFN9i|X0_Yzxbw8rPCD)6Q`*OL6Q$ep?U%gpg%50a^u`;n2SA;s zpp=_C+@rbZci5Ef~ri|*VJ>(^iSg-<{K+2?-b!ykRbI?0a^E8lfA+$!yx^s;0aHS) zk!H2BC z%X+JswuY@S!IRvf4Zdp}Ifwu?CK(kye?SQVBIbEMH#;{rw!q}Y)-7AstzO-zXN_99 zXr#4$$3)T?Fb+ojrj{-c6BDcmx5$@o<+&ag-FYYoJO!1fY&-FDAohCp`%EFatubBl zB3>WP@eCmE%?pvNMJ{l-jnV)piB{$V4@?IvizBP-O(FtAf1`+gMH?*S0mxTgg1ScizvYc7f(uCwm97R9l`6FrsmgY$eZFB~7HeMkC4j@7>2-XF7BE{BX7?QAJd_l%x>sF^IvLyhbQUnNK zWMGmQ%pznCEk|VVB#YM3_K*T(`F5vyl1%G}MV1p!XG3rIC_A$%@D)UkziV}~|S0Vr^ik?yl zDh<`9difo+aF?fULPQFkkdXDjyfD}#5Fw`&7%W}FFbsS?v4TjBRBTCZ! z{8$+*AzJ{fc$Gfqi-l6K&jJoWLR1F;LW58!C=|>TkZE=Hdu_VbKJozty_mB3heYsG zB~d74)o6-O?AqMsNC;3Fog!cY#i;J_txx_@e!~Hm(Iu2Fg0{ROBx@3dV*F23O^SU% zo+xGR_|8$#KonzRSeC4UfB*_eEKYC0nTPGdQ*pinC6Tf|ILn~AAUX+kls+Ks(J#k>~ZMWXqD|)I1f4KIKx8HdOL5WG@ z&f9N3aNq!{^iMb5aLh65mo6R8^YVw6UV85X_bQbLe+5~E!6GBzi4c(k_o=aBQ9>(% zC^-Cz$$?l}KnSK7k^^J7ug3`hpvt_Bz(g>#03;gu9>f(143}YuqGFrA?Myd-eMvr| zAQ|v>7u9hhaa4uG-H7vyD2EUBDpK_v$T}qk#l5YT(cbd^7M2 zG{*H{cHSDD>qP_XzPyD1$ODNA%)*7EOBXFT=j=1LZrl3Qmd(S1g9ge@w`WWV)tAzB z2s?#Jgd~rPBqc%lx@r*;XXRJiTm(w9Y}f7`hp$_H#V`JM^XARX;nq-V_&@*aGY>rY zV7J8Az3IKZyiM5n#@8EKo6Xy)z4Kh^5fJp>98DB+Q-9-;#9wDl(Apw%zpS=J2Lrys@ z^rDOAiTC9gAbw7keOe$t9OO1$iZek z59vf9BBAwT_6SO$QYukODP^odfT`)J-Fx@0JM8c+Pd+g>H(?T;BuQD8pb#v9)cu8B zfH*v%N-;^P%%f02o%uOCJX~)i2M+Ape_;QDu|5WSq^-9|>h|f0}uizU9ibzSG9TAA!Nw|RE>)+`00T{6Zj@lAJ*s*=Iv0ly20TqYi5YSvn!B20AVkm*z z6a;uaiIjLm0uf?*cV_oQ0KYwJR9K7uTd9m!%Tf?7mc+n7=2dk(sIK zJMXw{@4kJymbvqU0g*@%S@2^EE_4AP7|WV24L}dD2FlNS?b)XjXP-K04U^2fy5i~%TKr#Km=f^)f!5)nx1Xz zr0zC)AwvpbY^c#GKqHI}4bFFaMQJ<-Vu$ielPHWK6G5gRNwh*$6eS`iNm>-9XOe+N zt<#&wBn9?)wn*fl;@GPqP_kVPB7jxRL|Y5Sk|0PNIoO0fhWO@rZ?vw<9J48eGp|iP zXBW|rfq;whU@ZU`wsP=OvRuOny@v(cM?}TtXe$W``Z*ZZ@%?6+T1$nsfQm=RB9HN$ zo>x1A;I`z_To(>RGD@nr}itROt+zv1`@W~jcK!eM}iKv?@2;E-_%0LbRK z895%#{FH%2%~+e(Akm;K6a=LugP=5ML;@@=wn?4xT$+DhvE?&Ktzjf+dh6=Po*?V~ z4}62UGKJ!*OnRg*%*m>Qv4KW22Lu^_je~eKgFzLdmk;vp=E9VHD5*9z>VoZ`#C~uO zWgwNLXM6?rSrGrn>SQ2kKU_Teb93TqTG)gR`ekRFO_4$w@pI@E<<(phl+1_#2n{Ac zh$+C--Sp@c3ITNj*1C+-^VcxI?%S2svWWxxF8le9fe^@1c1&A?wXE^e|NUX3HPmPh z%(Z8fQl!=68y|i2u?GfP!vH|m64^A>`}gnJzGF*TOKZ(+dS+_>zFm!03k==z=j)YD z>Vw1g+z}jSBxK?Y-P0T8lWVPm_8y@@PpRU`q>4_w1q0)eQ)21h{{{0{Cy8D4%X_R(n zbywnB-1guR6r@(c`QU*80OC~41z&V$L4`?30fJEAF9=dbs6|i6>rg1ImE+ z3f?O=&3Yh-g#pZ@#)!f91cRkt;dAMoqXaAzwo-l@Cf~WbR~RD_;dw&IYsLUL?h!jx zn5-8w3(-zwPBv+@ZoBRFD}Hn3QAZqp%We0}OwZo`z=M-h6Zb#x@SYueAA01`yzFk@ zxqtiiJr6wia9*@`?A`;YEQ`*CiM;G3_0jA9@Y{dF+=Fg)iN9<4tL6jDTcT zf*Vc-R7%5Rk8KcgmN zMOhHnLId-p5PYOgfJ!S}Gi4sJ6zKKxyvVa!ZDMkI&)z)?7A#Da9cX17PL#iw6-!l& z9%0T=MB&`!-hYX#OD#P1DnItXKXLUUsNTU9lQ=G;OYp@wq{vG?!w(wmi|>G{b%bzH zwuitT1L8BeK=cVkoLNV6Hd;}QFLtKg3B*kuq2*ew$ia8?sa%L28xme-u?Xx2R z7B^;VEypdTs>bYBO7TyWC92i3Bu#p~o~wjZ7!A0R4e)@ZJe}PY6z6x&0bOlCdC_ox zi7Q>6iK5%3hJWei2KdVrpdwT*TSKJ)lm$#R9kw8$1CMXn`lPki$7Tc~Rj=0*q+Q## zKw5XYuf%(HV%9Z;w6@GoJ?-@OyyKly)3c9m+_-M-nt^)rzrOVO-8;6cY`~hrl-80} zS_4^t(%KTqQdu}bgVIpu&9U(nOP4Xk`4QA)@X;0IKuNu_(QDbArtX^^0*x+b0**n|0ZQuUe+tWpJ zL3-=MbKkzWoSRZQ13$iDebs~F6)U>zb?Y_tw)edM@WYSz_{Tn`Na;qaEOJv6&w9?Y zU;B!e|I;V_dBMU3fB#RP_|`>Vx$};jn+wLvUP(ZJmW=fPWf92$DpQncmcH<%uUNZw zO)aSx`Fwk>Gcr2*)aFfpzU9`}z512k|NeI;r>1N5x|L9b3dLL;E+_@4J%`hX0H)V_ z+dJO&)Z>p`cinY5t6OUUl?MrH(XGlMAkJ;sXDwI@1Vn|K$;pZ$a@V6$N;3!nx{*3W z35SlZl3QEkf(N}NgX#y> zA2|%|lr#pXeV&ebrP|lVdTJmcjYDJhgmrf9Anluj8y-pLrcfuOlvQADEwP;``|I;k zyURcVU=(5jB7Y?^}wL2Bo8zg(4bodm;NkW5^gV0GNVK z2^CI1sh;{#GV@?P%d8~?aAiJk9{wFCG|XJJ*5n)v5tXvm5K*G*mdNcv0*C-ssRR++ zaeCgBc|^sS(pakz5wR>wvPNkQMAnu{CrW8_&I`&IL*R?x(mBpwB2JBdj4dtx2hEb{+DFWMDm`wZ;(iE zd49Sx{BSdG|53b)`X7N)U(=ZCL4TWBj?s?=fBQly%f^kJHJeR^YIqL?a!Rai^ z2yklRfKC!=jL&%@Z3H26niEphkcK%+79B^OMCa|{W>m3r0G|p+geVeSrF(p<=(*9e zf@wuFpaTqxTz%-^W=JH7>^)>A0*oXo1}FGx?uZbYUj<1B>JC%EEq6Iq8^zt>xdLpl z9M>qiBb&KDteu0DWDBA9oJB>^-sWKmusMkRUKtkV{E*l0aGJ^9KL`K!K_^ zhes@-AxLyW1jdwzq?AIigeq^(+FlN+PST9XfJ#l#gM0?Co(v566prIhr2SwOtZ}Yu z1s4nMCu1AT8JIT(xhlSA7%z!EH&ht8=W#)VJt~SD8Nt`xXoWgC3aJ>SweP|q5oBW_cVkmkh0jfOj=|o#g zloyyJNve%CR9dBU)~H*evX>hRX_hJlMYkYc{w?K04-rZib8`R%U{-4mqCyLPYZ&Q@ z0tBs!?%deu*pkJI6<|^1er%slkq00^1*kMCH(0Dt_wszl_U+xmWCJZ*6ueuy4I&Aq z56n`Xl(j8;Wp_Gq5Ku}j9v^QFws!8?yY}!S&p7SOZl|+#_sk8qJ&~veDInvveGH6( z(_*TA7@>-9h`(6AB0dy^Yt}&4hTzYr=Sx4qra5YQDiTL&#@Ns>iKmpr=H$!}0mxcZ z=t7!1E`_XhvoMIOA6!sp>=vivc0*`jR40jikitBAr&Hx37b1WqpTIEw#+dHQF@9Qy zdt9JAfB>Le$%9{>!^X6Lh^(LZ;l^!zg~`N0dL&^DQp4N5fOjAGti~PH?snbM1Q}ROBEUk3<3FwnYU3P>Jp3N337} zkAM4jKfC<$OTYg^paN9(umAS1FMsJPzxnkGO;KpdhlW~YirLwAK`AP&%N)?w>H|rl z=jZ25sdR!bKL5qXJ^kp34j9& z#$Ny0SO4axzu39uu^uYZ>ns=^K}C}j6Go+|L-{R`Ti-M3yffSAP^CWfi$E7|1(?eUZJ_4hoWO}e;iuT=)$E=0b%Ly`=??6%d zwpj&aFhRAjMfG*mEp4V3(9}DgckWxBentyyX$k~NG`*e6` z3e-TBXA7b~kTRk!3iaYeOV2p_>=RBn@$TDhstqpab=spt1F!#!R~>)+)0?e9Q_}Wr zTX*i*rm{w-)240#fRN}kQD9A3lu(k+YCwj7sIYTWQ@eKTCPT0IiXhjFBDiyl%zGCrha30AS5bHL3s{Dpj48kWzm7Wr|Sc#06>{e50f;hB}Gv<4TI8I zy`~V0qO=x}tXA4ss}hB%0hKLt(=Bu@BWrE9=a0}%YH5}LKw0EuNGYJwKvGNUb%%0! zo2%2>OQiR7JcjDe{yMS`QL7*5z0^;?D{5Y696lD(sXp+wHu7ZVUCI~n|@3KU8R z@x25oz4)I6BJS&Kec2HsE%NMQsoc0$MH@FTS@NtU2%Z1WU=3KA(n--}k#Hn)L;xZS zplTY`#2<@2zXP`)yj<<)^QkZ|5roDf_`)cEVhO+kY5+~3K|!sSs9F{+iAO}1rxXXG z{EYxgw;7xC5EY^-%C0Mf0JBJIidc`V1s{dlqg8%@^8cW7kBc~7%XapdNQ;YxOCCN`L9AUl(|29g%55^i<3gAV@0@P)bc=XqjVv#{+Pc<&J);gsIZXq8G{Dm@jR{rBBCrc z3wpyKWURV-P?C^x;MK>{5g@T@>!`Aqx^jH2R^2C!`*R)o>Znw`C zfdDZfRDMW2jHUKDw!eEo1qyFb{uOu9cYqKPY?-7g8(ZvDX%WlP0HOlz5YO%WWlaf0 z1f{Ok6P;K<0s{nKi&~Z?t))a%loojY7BB)uPJ$G2^{6co;`x6B2oU1yfinYVer)P4 zzwv*N2#5O~bmmQzCsaZ}JwB^dFc!p+136(c;p{VRJIXk}G@9S``5sTWl&TO$k8;zP zI4C$@5TE47`5y>G`wJO4x$9wOr-aauSG$TmL$voh6hjK3k_doon$`#?QI_hdn~<(i zshT2GMbRT7R4PfdH6;~RDQ(3UiQ&zw$u>tuTvv^;GVOr-NeF0xz}TeLoSd53zjq%X z0x7rUUnqJzZ*oV#C~!?egfy#Xjk+yM^3!tw0Nw5$QRU1pnDLy)JAy_`hzik^wYJmg z3=It>NisDtHQ#PG>vcrRYH86ksI`P>Ru=h0)vv>F`Lbdd7SIoh;OJ{zE&yC&;7A>t zqAnvz4O-3{`Y5X zS!&FN2AWHbSea<`#1ormXJ?W$Z6-Qt*5(TRzYj*t=)%{>drOX_lx)tFd(1(lkl7 zZQC|A)1eag@82^uGi!`(DpB+n`9}GX%3GKG+X=j?QNv#@^wdKNxEmpmZ?rxE7htu zhKI%$Em@p*yS-j__wL=@qDO?aT64wPBX;lJIXg9Z*pW|Lxq8)seS02%8L?V~nLKWKd`o5k~~ML~g@j0wcKr@jZpi1!5U0BVk}Fv^L^i z{s$O>Q^Z*-@Lkm%RvJRiKoE5{h;^ydAQ8&xV+wc#5CLS4F#&<)1*Jl*IG;x(mupx9 z$fcCnbgBz?qNGN2NuH=ti2kC3z+Dazge1%=&I}cYIEXreEU##$Y3ND6xZ&&)y&-Jgl%_WMY6)Qt)|3@cUS)L9Rl0cFyT_F*wYNt{NfGC3opBhN!Cfy7-5GV_PCVa9o4I}_$ zC~bJk&+sLB4pnYqdq5y}LNK^_#mIIp3XmxQ4ibSP$MZe)N)v02bV@G!U$oF}5rKfj|*z0(1v<^4(**CLjwM!4g_OiJPn`3)dPY zauuZU>Ls?S@L{kDpy(MGI~!Dc<8VL56LulzAQ3J(6n3#A+$^-IqRxQFA}ODSRRW0r zC0|9sW~+?}rp6A!&y8%{_aq1wxgY_Re*-|CJm56 z3CmsPkP(p8h=iJ~0U)Im09hg+>rRd*Ysna;6lg_cxx^*%431%pVPwJokF);{l;o)H zhT(Ind(urCrCsHmNdhG@7>s!^Ia?$H4>s5YW1>yQL}N0>*nmwiAQOy00U;zrR7N?h z@=BY--QBx4&P;cm?~gjEdamr}dk3_4rn|c8)Cs>6s=C|Q<(Q`)wrqD=ogPrCv3gsR zh`>uHNhHR)t|VlF=2bRPCV?QW_5fhOP*5EDhQq3=>)0yG#l?li#l^{qi2_5n+v+ba zwXm#_RHHQyCIZAj06@{kMYU5fdJtLhg1jJ>K|b@0;*Z#(^s%Joccd`}l$#TSnz>Z# zg&_z?P=Xcrq&keKi$w`+Fog6V46yrc(AkyXJJ%s}cVZCc%hFDoNP1}|KiUBD%Cws^ znCv+1jnRCd@{!%Qggoh%O_ZR~p{_EB)Rs9WFb6^&EK%<|SEX_8opf&M093nyyr|fD z5v3hX$^W?EQopcVgECN~dVcLrVyRRj4OeB%{L{!AlI#_I001dQ3hmxuhaCEiZ+*Kc zI#dR%=R?45J>0(eJ^*;y|9SDVpYe=ue)rq0vUtsFUa|UswO{|*zx~P6o_@dqtABdI z1^cJ>J^%U7scZV(RoCBj$9=~fd-USMA`a`rk3Qk~&wKI4d+xgJ{=47&#y5TDbDzEO zy5GOdFLN>+!25CSFiu<=lv{O2tjF5SKD?@xW%- z7UL0AtH)-C_|kDr>^z58`#m_(E%ro2V*2;;As;=Mrk&kV@^N!y5_|l*Th;Mk~n~yl` z&`*Ejvr|VM{eS=B)hj1@C!BE1IY0dIxBvZX6$U_}LDec-FFE^_r=EUluf*x;J^%R0 zPo8<^AN}!D9{14?zh~diF==C9v=;_=6<94mJ1nf}rjzIgB5 zn_mCUH$D6zC%1c@3x4#IQy=lDYi_#k;){MhvuoQKPkPF;pZ9{#ed=Q;9(T$c-u%}2 zrF|=>R{Z9-zxwvqzTRz*z2)8STz|lUyLatA<>Zs@z2}}UeD3oP+_T}-GoSd}7yQ}E zsj-Q%))iM>@$GN?TRRkEWrrdrpQNar7AjHVS_Vr5lxLJW$%;kYYe6i+0$s8ISrvT(}e03_9yx z8T$hmL)eot#I(OGM(Fe?^dRmhzIQ00x@}0u=`mb9?&LcXTmXBt^1=_MQpxuG2 z^#}%{yB>8U%`n_}6eS+heA6e(7NCNC^Zo#GIRd*6lE_RHKxUn%8Kl=5d`FV#EQu`u z)c}xg-)>}Tsgfm{;Q~P2w_r&nI;U$R`Y1`6<M`Mn}~M1+9jsnSd1qTzaq4;$?2igLU0U zk|P68LRz<&{4K;tf`YRj9)z~!mBo~BsJY!OQ##{_T~oObz<)iR>X z(IVJ)<*H0WCgSQTwghPPCyObKwj`M-&l%?_lR5;x#S@Yql26A;LdTSV%hE3Ty==+u zh3y(bg9XA?ZZe3q#Yd8j*hKuyBcF0`Y-`+8!coCjZjS+uJY#Hky1lX9)T&kY+`DmR zc6QaOsj8~#s`eVkLJKA7qZuKCbFZYiQ1mW!cHW|O1{xAa>-vQxMzU*LG88nHfE$W$ z(5i7{!NLt*41IIuc`v_gUT& zK`(dwMy`mFAeES?!!dzZo&Y5e#*6|`%}7!Ses2`Z6Up@iwY(yTr*jcB zk{=u<$WA3tQq#;)ePATumz)wvEfP_p3PA>mUxXkjoH}WVUS%o;AQ6VF;}XQWMy!~* zsvo{9wJ9HpsVCKHTe=kF=7ZF`UV#vSLI@a2$Ujw8)pcFAT61$tb93_ttzTClblL?} zl`O!JZBf_R0|LcVHxNkEQ-t2#kOtSbAI16Hq)ZW1D*}Q(o5)o?G6(JbE;?+}4`K=G zD#Vcxr5CsmMMDsUU4JpkkdE1UHuyv6*qrhOa0bJbIko~MB8UV9iX#-GwMd32hc@n6 zaDiL8)P>vVZT>PA=qA6kR;79;>5v5CUlHvz*vtLy)##jvk)r43P5{ZQs6aa8YsGNsrvSXJ+@#>1{i9 zUUJ#*@4EGh$yJ99ATA8z4cA}&o6CO(K%qM(T4Qg$0O4I@+N11XGa_BQMO#=_KE_x~ zOx1VZMc3Yl&-@b_&eN~2fvvN+`anugLM}pj+p#_)CLDMuEbOl?-vGxi(g}ygZo43a z01zW0)Pp6Q8hg^Qr|jDMzy){wwtL{3(>?-$0jDPxcs+of7|Q36I1Vg@B82SH*b3PJKnZyde`pV zn;|ZRFqR-MR#mKOq8cDVz*tuyARSB+@SNv7`!lzF;;B!0%8u<@-}!+L6P923$`_yi+~<7ZlOHZ2bj#wgk9*1) zr#|9?ANt^Z8*h8p2R}Ysn0wQ^-nM@Ip+}!^WYL?fhW!G=U@-f_m%ZVX6OMcD-@IvI zap4uOd&4VU{p!muy|g#})FY2O`G#vQ8(VYOamOC^jjw$EMK3vf^H6!hDO$bP zzwr&<{P%zT^(8;TvGxD??f=-deb>1^y72g;jy(U|pM3AzUjbP0t#khK;g5Xej$QlS z^u{+_a>04uJ?E2x*nAmv%;lkS^X){Vav`e&M{niG`y*`y&Sg_JJ=4BKzgK89=DSLep7n$`h(+OB z!$RyD7nuX-Q|A*S?G*-0IkM`yM^;*VtX3+k-ymE5#AY<;*Yrzu%n@tKNPa#l6b<+} zC~@vi!W521v&}MQ2re?$uw4<5Af&aP*zI&DCnqN+CU#8kqI%HncIvvSYc6~+(L{hH z7QwMs3pkqMco6i$GAmdP3XG!Ef{1k2xt4m>52!EDvg`7G#UqC!Nm4pug>}MZD*&Gg z8c-R63-W>1d1YQ)HdP1^*VbeNg6{kfD{pYk|IThsaj+)FDN-g+H=)~GVhLK(Hgiv+ zgHGANO^9hD(O1$A_;y0oXHPQf?hKX2GX9fHr5j2iX|pA4<}BEvT+P-=+rhi7$EaU- zurB?n%CX~;NJIj)jAm3d(SsgSAalaPIQN#oq^bm(9H;0_^(cXg)F-hhIoOgK&uSxvP@4)h&Bu<*JOSH8dVxJ-!1Nu6!?fB6*XkvpK3!?A(+j3-7^eI zPEG8?dt)uZuw#*DeDE+_fY6_W7$`=ELvF|f!D$x;$Qw@5M1sCs0wrjbwYT&j)*uUg zAuZRFj4l(wRM+7dq=_^3Sm$hkpb8+6t^SWUi3rP8htm6uQ~k?1iX@0g5up%C$>tZS z2O+3$l^DVW^~@vDSc}nIm5a;YfI+SUK%xj3iu5yZy;=6#r+@^3B0<_i)QCkTCXxDx zKgHF3)4o(!l^lzz`CU8rJmO&|-*Wx0tGX8<)Pu!#ySHl1`o+Ppzi%HcEVg>9Lc23J zJ2O4Kx7Qm3LW)&cj>kAy7z`H%O8{lN-I<)~wA(8d7Z=taxa!Ye{_4qz_U0Ws9`=w& zopoz`Tp?5tQnJGcMbpZxea&wTnTUVZj= zzw@0de*b#{eklXnG^q%|f-i+31muDhvO14)X@q426pAuHQUCHcbie_yNU(JetXLOA z8!$kD&@P}=LMR{v2n0kF5nBaL56V04FG5`%y{6x7L9bT=m4JiUedA-3ha7O=&VAb# z_w0JqNvFK!h)1lM-*ZN1-4Uzt)jO`mcKh~wues;(C;jmg&b+GyAW*`r5MU zZ{K>~Ew|jV?!W^#ZQOY64c9*E%+n_(C)XXY7Hh&#?%cBN%B!yoKmhUQ7hQVN$;Tpw z={*f7DTb|M%~`{r20--o!;0od2$Oz4a~c{`+73{Guy=cR93rMS)aT(3yDD zsi*JSwdtwPdd}Fy)M1CLU$t`8owwimtKVP!=qEh-hHHNLyyw2?$}4}rG^oxv{q)US z?|bUAo)bdZ>y58kv0}{uYqxCLdev3eFV4-4uRQ#Bm;e6HU;WBe2dtl5bJTIi9`&Ph z{_BiKowecC+i$)8vZAww7PtTMg7c3*>Zo;xtlPA4)25C0g)k0KKd@=ju-`xZw9`XT zu0Hsn7ry+j*Q{E5*g*%Zm|E59jg`H2C=sAWySXe6ahfJaW@V`6CJ=9nYM`qxj76Hc zCM z!Tn~`%`J5qjC`vsLd>|8b)f8&pf#ITE<_81ojQ{{uOXyLF#j~FEdHoa%=_>y9KU(M*fcztl{azv>mSYbft)07!fjH&n1K z7x!=0m->}OKf?vkvW(_R*>ayq3?*ukXjag`S)H4va78fR)Q~sSxV;aGA1=0%MOu(0 ze7|}uB@aEtQ?tO^sfuRB36JC^mlVcIjXga~$AAJ6l>>R$W5A-02TUb|1EZ0W`URpON8I|XDf(F_TF-n zEZBt#hb3J$xyU}WoH-;G>W;b}c8Nl`Ah}mt1Go%zb!a_73NNC@0KV#>s4&u*hgrV6 zUsOoYz+wRrV4fm+u$QU(aKaGHhEK}vry#W(5?+zS=)zz!0?>PQ-r$17TV+A>Ua==c zFz4kt0m8jeUX!Z@=|BcMnjfOF+S9LW(Q7SAu=(g748bQ=EU~Pn+&!I;G*gc*`?on+ zcV4!#tI+|d5oWE$fkDDC)=WQAPNpEKT!~mB2BI2yO8~_>R>P`nwJFBMg@ssCyDZBh z00P7sk#syLYyRqTaX!qg~t2u97{QyG}ls}d1E4Ajh$Ydx%aVkD}V z5RlTl4)~Ew1Vp9Nk3^aDC%dp*r31|1W&5#RjF28E$e^RH-{S}Z0AaxN%v4sLKq&dT zu2q-{h}*;T9&fug@fD;tsFLI`+c{AuY_{3tk$FppKtA=-uYb3F(;YE}Zg=YJSG_7==WAd6a!qv9vB&Pb<~Ovk|ENU(^KL`N#+;{iWp7OZyi52^| zZ7y4r4}IiW4{W?|@9w?By6)Fie`dP3a?R}~u0C z)g{0DOk0E1zg0?ZIz+yAe4lG%62GQ zWvc~at*~;%+EX5J+7nJZ^6*1f-o3Qvd$-+k)%0ds)5Ea|s6!YlI%Qal6%7}c=J&Sa z;Mj8FhW@q-XYPWy1fA}5Ki)O7bF9|}0Dy=Hl%BdQsAYDA0RTf0dgDEawEcm5ht<+E zpZBbzjymd+OMlVp0F)udIz1X@X<_cH$36a|AASG%=bgWG$8I`0%8XqBA~QcH9- zu)<>`qM|GclqU`btcKOZcyC`lXm`hYy@_F5TzAMpZ+YVzZ@cx@d+)nzap}+&1cGXQ ze*fgeM5G!KTAfZ+*MMQH*O}h4XY=^ji6@+KuL?$|BYU-7qZ+xfcJy!yQ#{?LE_ z_m6-0y>qBeZ|a5NaImmAnBFt9efQq|Gkdph*+Rp8*IaSM8~^6@tJWX)@KYcDZ~yWy z!$H*>AKS5g&z3FQC#ELOKmUTw4{YAPa~Bk4yDTD5(Qf0+&g=hh-6;<}?x@4pP4C&W zckk|^#4;d3s~+wLfwx7Q3ibXMPkre#?O!#ak(`l?=%FG(FCB3H~Ms`k;B42ZIvD*o5@ zsOpMA^NVhwaQ1*eK%oSxVR1XO3m`(EP!N<<59yR+tB*au^{+S6N4^=?tPHbDKoKD# zZ%-*AEbfJBPM*0#S#+R77*7yq9uvq6jI1>&9^nbszq5obsU>3v<&%(H+!I6Dl@D}!SvS>UNW)31^O zf%plXGC7|o0k&j)I`up=XAW9?=;KNY^O}&0j-$#sM-Hgxc20;yuSq6=x;jP1J?(?E zl&6ELw`8_Uu4^NhJT;sn4H9(oMl;Be3G*)vvzFN`B>g)|OuI>UW9fDw3!H?i^q)H_ z{jo)$IHyDcav4*-xGWzwdQgD~JJAhlLS;s3g08cp{4N4n(l^dXRFem40IApk05R4Q zNQpB8bXVuZn(k#GIXTJ&FlE=2s;UqnBq7;lOqw1*t`~5uNUn_rw~kl2R7~5nq~`I# zI|R26MMD+eKP90A;6=lP_?%p!$V{oow3!cT*(EZeqF^MuFzh{sN{ADLOkQ+I#&LBJ za`Hy&NqB9o1T{%9R&mtosX<^sR`3B3AOsv6>rGBh63_#iHeo2*t#WB0y1DZwlr8jJ z7X#r+5rJ{qT%;~TnuZfd6%HCZYbDsNJZ> z8p_Gs%=tO=(s58u>L@BXw=gWo*Vrs?^ERp+3S|)JorDOQ5asTm1Xj+WdMF?*9ikwz z4CWwTEl@z42WuF*&6Eo#BokJB138vegH%tQUor>;JEIKOKR#(kCpO@Es0{7=o&^}9 za~ZZcW6MHF($k4O>gtKdLMfbrU;u(ZeZMi!$uLm}V`39M(X`a;#XE+O9`jMlvK>T< zRW)pPIw8Q)(qdiJt!}FV4wsCLs(3Q%hK$9xbB!1n6J-?J#CJ5=d zAqWT%Yrv402x*fB$a75Og;VG~Bk^vQv_46~gtUo1UCp=OD8NO6paZ)VW4-`^DAhhR z%+(Sy3r9SZY8iOI0uYZu412BdKV1ErA0Kq!2j2Ux^Dg}P&K-N6_}C|$_>dDn^O?^; zz4+f3{`6I^d|BD+ZrQT!wJ(3w&wg>~;{4vpsa1RCW)f@5R=d^hgrdEB&%Sks9eL{M zPrUZJ>u2`PbjP{}9JszWwd$B-4&AqF)4g~6VfU^-eeM5!!+GbO_ppbbcKk`led!CI zg?f6=zL{q{?WwbKv%T@vuYKj&=l}HFn{L13fh{|i`b%7&6E_Cl&a)5sud)(Enw|;* zt60#rrWB79y$PDxAMf7KIceQPPki_(t@Z&_u55M2TJ5pP72^}#6_cG+Q|+nA_R8_G zRjXHxPmIO7s_N=Vlj~mo#N)nj>lOdB;rFxaD_Fl`cCOyCd*-m-ICQ$V+;iu5R^If8 z6P|ki{yQ(5-T(n9)}3xKvoN>q{!IX7BqA+C=5t}Whmb63d}8c@`|rK#iYwp#wm1Lb z`Wt?J!9~X$b7WcIU^r}*WvkmMdcB7}>=D;rd(G$m=_6wkE8E@ir##^?0G)#lJ-*wf zd+xcjXtmQzUJ*l$1VjOfvMdlWU;zQkb~&U9>WYX$34>Ul_1MR>5Wf6{&yS5y9DLYO z#~yP8#i~E3D-O&3IlX;LwXkjTmMsXywU=MAFu(Y)(;s`pQAh6Dy{nF~iWDPN!@6jXpL_lV zfAQMap8U9@zj4kFcJJPO{Vg{<{n>x=h%=w~+e3 z0E-d}guCzD02nsjb=z-#eNiY^JnGEH9I$rv<}KTRBW%ZWvRivI0=AuQnEeXZVIAqECwDr=m+gW?ccU5LCJIa};T4=)*? zNPL;IRfz+1jv8iVtn=x%RoOL)A;t!Eu$)hDsGy8-cJJ6oK3EcuK;S{bhrE`s`pGqa zCFesFspb-P7LJ1!P(-k4+F88i(JXgXAUIBr;V!7-XhOq2)e32-A+d|?-1XKQj?504 z7f5X9vW}c_)VM@x#;g<3Pn4(C|Dxz{?ol~CYWcePyf z&GS|5Cd-)p;-5$!pd&{lLIP)2jF!&G#Z&+U9#{c{8;)R3lVw(tjS3`dvD~NU%x{t= zpnPBgEy>Qqg5~3$1h(oSbyCJZW1ccUgB8_Ux8H!6gKDAKRgL12@Hf;{_#0asQ9oFcREvg)tOREE!#4TagJZ|Q50*B+}=2+83Q z1|Z()5+v%dB^K$?!yn0GLy{B{;sggA!6+1p#o$o6?4D*t;uJE}ZOp^zvi)A>b}JyD zhy?(4fAZt+-?ZV5XFucVr#$S`jT<+9Kl;%V&U)m_U-hzce)yxCufG<`4)OLRXS4=B%0y*W7Eej2#0*sL(&Pd|Vr);W z7|!e(Tz&ELAN$z9dCv0}H_g%j%U&zggh-(zDhLXw3+nG%nBP51RUH7J4y_fvx1aKu z;{lKeLI`D1%$W>z@Z3Lr^V{Fi>y90M&&KKLJ+q4k-+J9OQ1tG; z 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

gFE{YolAAI=tW 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%0DjF*>|jvqg#aouFtt`+P)hmlcn!} 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 &CkY`D-b_!7vf=_~Km@$o^427yj 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

=odYn&8USOd)$T9j zm;d=qAN|F@8Hde7Zikc+u~E z_}(|XvZ;HQBd*a9yRR z_ep1;xOx9{JFzwa^k;PXua5-;zffdS4?^MVSNUN8003hF4Y`bf5Dg$uo`dW7tApJc zgMi?21OQBYkr2Yu4klI-2*DUh^MJsTF$OxF46HTQ0uf=3&H<Li&D174Ta`2XvOO0fxbD~hr~s@ldFV-Nw1L1S$0T&>ZZnx4s8ZSS1E zJ>)5c@e?5?2$W@6mSwz|hJ6AEft+hM>W$XeBs7{yyEh>?_Q<8feLd5SY-VzDWT>~2 zIoHapOX^cuVqi(%z{<5la6A$w^~s6ew1i{;4dp<&b6HO0$Zz%_=Ntt?BCyt?O?i60 z=7%UkW*!BzIE@HfCRKQc*Qx=EB`Mi`;e8FsfB}mDkZ0NS)P%9t+O$4(aNo{NWD;l7 zB(+(V=NTD;i3MYcyy!ZeJnI0EG1eH5ZRDhy0U0z-ad3hiz(IIe-$YhN~aLDCa422>I6X90n zmBkqaO=>~$T=<6sU;;oWRVw9j#Tv}BtkY?eUmD~{svG|6TPZ+TV;3C`AL&ud)lT7x zxw%06L{+BsO>CH~nl{H+i*2awX2oXznrzwr0YCt4 zjvi>%JB6<0a}`&C+f;Muz72|jxof;?Dx!Vr`asFM%fSnu%^q>#bx4yaNR+w;Hrt{O zEj~>XW{*OidzFQNS%WCvcnEvIIj)&QnumI^9Y^4Rf;bC3s|)7pHol>_PI07j7#JSP z(sA~L6zwWrTkIay5ay^h7VA%QxE^%hGKW#=@DGeuT~+B|ppgK^fEb3MHUxD!v2MRG zMTrDqs(f!@O%7BIUCWTDKwXS6Ns^RGrL3H{>h(^R@z!^VfnC4*%!Imh{x_gJTqD#; zy@fnfBI0ls7cIhbprovX8IekDLcH?}(i{)NTj5!1KKF}eS!EEmc5n3ON(e{-s}JJ8 z!D&frM=sEz6cNxMA{awtA(n6nkVl+3z~sEMj=$vD=WN}v^B33L+pcGMZOYjSmdZ3f zW-Ei()02&llTDz6Fg6KU2htuhZyr{Grt4H|Ks&bs^X;O(yf%ST9Uz01G7k3Toi)>p+q^n}DMgD;J)0@>-a# zCG&=}EF+>UYrFlE&?M*`hTe1_n|RA>U$_3TM>hQB_bXSv;FvWF#wR9B16rm;&HZ-q z;-p&6+bu9ApKN544IsiwIa#wR>rC$4yrq3$!kN^RdbaOBaPgZzy>GPT(AM`)03_hr zkd)G)KA;w*>DcK0=e_CQ9=!gcCth;NKfdlsm)&~fbgOI!hRNjs2|xm9C~tLI9dKmQ zN^4i^DX)Lii(Yd6n_l&~nfk!lPds7Uo_&A0eLaCQCUM}%7$gG-1l9o&l%Uo`*D<9E zl*@$vD_x0zz@%BDj)Yh#k;`1GMUA?tRBbt-yiG(75OYWMI;JHorI6*WIfdmirU?OL zttMufsrG^`p>tpjnS{7dml%^|S*zK}2Nzodrao#+*2#>6vNau~j`Mj%cml%k<1jw& zbOBZnflRTIUo>eQk&#I%N@9YkbcLr4w>{4A0iQ+ z5h0Ragy?b>BP=XzJCnD7PZx>f41!LbN5q4`m`)UNNGcra(-8Bem?NRb7$T}o z*X#90S}OOHOO;Y;lcb#5Sk%-3p!h139aw$=SVaFU-r3tIip0l%0dGJa1B`(b}}9>>ZGh$bYAq^L0BQBIm#wGzJrE z=At7=dJaK`b6n=-f|4W$VpcFA3gQdt7K+d%@E}?XL`aS@YFS@lr3|u8J97YFi~$Gj z%;hc@6EemIbLPWov76u{a0)I2ne_1o@jA7IEo|e|nL)65R-QI1(W^ies`kV%=O7y# zd3CG4cV(_j$W@ETBmp!h(7;K~0c1&~Ix|!I%Qe3TB7(%0s@D21A2({?G7v3~;zzOk zA=OeII+sVG2wCxr;KGxKg27d-ZuA8BLFjmg~$<=M}AjpaqTT`ONpb<4+Sug>)MJYanar)p;Qy!N8;^VFD@X@H4tg%Z`hzhi2~K+K@_1`v5104bhXK;O>C6H(-ja! zM3CosyWO!ClO(D3^IJr80vdf zI2FXK>@FUh74GKhN-=ckn9g`2dpl$M@h}w$n6m9tt5^YgcytHU<$wxA;`%WmFGR{p z0|MmER!n2hfn$$ab>2BA9@x9@#AA+p(#dP@e0clCmt63`J)3vzJaF;z&e^>F;C&nR zJmWcM?b$oFXV3n(z3T<%o_@@AH{SZ6-@AHhs`uiH&wTkM=gdsZ{LgQ0yz1t4r=EKB zdtdjQ74rta`-^M7_lp}A%scFv7ao4z>1&1u7F>1pjipNZ$`?QT_g7#4)$d+sKuFrh+SCw>NV4%0&0Vt&=NugA&wX=*%|HCXN7udSBi|Vwn*Xl%zu*a{9&zuz8$bW; z{~ensnZ7F2r%yP3z{VY@kjpZN1uPw zKmFJJ_wTR+{bUjY)=*aMOs^T7IDU2S$npi7J14&F%}?69e&bWlJK>{GKITa$EPdZ+ zez<+-eykWU0F(e)@C7MH2FvZ*)H$avKjEmAo44)1vSTf|lqazp>GDH*mC5c^i!y5*8^KL{0yzvA8)q#p}9Rz{Me+4R$cnC(8j^f)G zx-#e^I!X_#K&2;?XQPU?ERnU;>8909OISLoElG zz8Dn2hB?S8qV{rQiKyLZwwrBZ5RJ9g8l(57s1*_o`9TC;V+BYJ@}{5_HH8>RIVlYt zcxCBFMUhiz0w8dTexSM_3Intl3nE252c7~d@(`7!7PsTg1mwS`I*Oa^4bT8lPnssi z)mu#yh7&qV(=^ZWnVD(dfy+7}zcR+#81Eb6k{A}2jL5kx%b}Dw=U8G2;+?w zrsnV?SJc|gHrlM=j44%nOsCb_zkhUS;XFg=T%MG0&v>ntw}*#@8V6^lM(c!by4LIv zl&gI?Kqt$bb2+)(pY1_m%ZIN6ItL+950BdLe_b&gnJFS+fu9tjH3(55m8o~F`jEa% z3TobRjZgpbJj-=!0N@;W$45keiZS`}uPh3vU5&&eQjr!_2Hw5NL&nuL3&oA83rpe` zPjLA%*nf9vu)sl)1;ZVORGICciq${jXN|eh0_T-M`vK_>`I9_JEu@2J3^@lxj$ADE z#$Keh6Dx=O9xIsVOUhm;4omaS2z-SxEBgm^A~eL4gThXnaCkHVQP?km%t*wW)VK?L zHa5j+L?~_&AR6*d?Fyy|SgSQ@9f#EKa;R094w4WzmH{G9T$q~LkP@`XAxf2y0>=7T z%HSy;D-!m8L^RO|2?QJ+)r(kYbJddp5c>Q35lypRFPMVPyMjq7x5YxgvtC&ENmMXY z#t$|VJ=D2+2W~`KM7dbE%OPX-91A1CxjrbyuVTMi^|6y#qV%Cd>>7fcNNy}%ugtYD z3jV8@!|E|amn;0OX}lih9IqH$MKwjS9OAyhC4coAgzkCGYF=X@LgCsu)KqwBlasmd zX9cm$7DjXroI||b#n#z6Yv*gh2_Be<1^^25%{>m%5 z(xJMeA_C}cC1?3N8spg(I4=RTI~~lja;1!jjb;-~h>M;|5D^-`HV!U4?oUL(-_kMH z1U(DnRZftIA5jee^wv-wRiWx30S*AvPM$a&()UQ#qBg29nTZ`xG*eXfM%WZqR}8-r zg+&vxwyh0PnQS=UUL7BR0n1(B6$a25sMRic_8F!_$2{#_AAZj(&pGF$^}ELY@hz8q z<#Rv0wORYzC*J;v4}WF*wmt8C!}IUB{~?0v87qgs^1a`^_3baC9Iv}`+vh&?x|?sj zwK_EKY3H4=Ve5|1eel&OWY^yP@TdOq@{tPs`L3N``QR0I-uKWW`^Mk##!DL0jjOJ| z^;u6pd+EXj@BEiZ`BA_m2McJ?7%(&4E;-v6dEk3I71KmPrTU-Z=Bp`n>p^6-P(wvX0+eD!VHAKTfPnLP2SXI}CAv%mPw zpPh8_$uD@`v;OnHe(CD8aJcWgpMTe*_uY43+FWqKnOEPuAvJbrWZ`Z1KKA^J&UsI> z{*Pb1?)`6m>u-PY=d;dw>W5$Rq%VB)*X!HnoB#gS%ij9goA2CjdxtQ0A9=?mANufD z{&>wTCobxH>py*K$Ij_Wepq+F^`&YX3^s!Pv5`R2zqpL^yhGp+mXeqiIk z&_J8)^!@{DS1*3?g=f|p?XUmGug^Q>sAJZwXp()(d1qXG%^iCuI_W?!v=5$g+R+z2 z^|ZV0U-z>g-L`B^&!rbV@n=`wy8qTqP&Q9G>!d|PJ)73;gdEUX^pCoLK}-zgo#{HB z@_hUBOWTj$2OBn+(vfiH%V6oM{PyprdCgX;8TsdBIM0bsv><}>57YZ3u#gxi+x4G^ zw>()SL;x2PZ-`XXsD0VNN)@aJ0_vaK31k(FqM)AChoMHE!JJbq z)PYGxm7pMZa8bq#aZfo5C$tk2F+@f*jG<0dPcTX%%8>y4moR~I4jg5j4(L|_Q5ih+ zc+^9Ep=%ZCBIQy!lx{lYY$A(DD-ew#z;L#0;1C+xk6&V-}F3i63q?OfJww@qKg z=XK-&3k4Z4#&*)`w$bV1k65;M=k89HmrDs*7@KN7{P?!%>E=1BmJRgwKJ?g@$;rmX zU6Z%px9z+WAWgB0bqt8zQ}%7!rp!1(9*O}qsFz)CEH7#(%Xg@O&n zkr~uul%O8p&}kZPx4My!k}NM0(iX)=2#{~ssC4)}k$ zfjvZMD39oG-1+yJ)!+GIw$a^am)IjZ@t#Nt?f-Y*kk{XPpDK^c)(%&R{!W?99g2SY+1 zgmADTDTc`|8S)j3zf6o|Sm75UaFMhiI3ThX+S3h~KmV9xSB@VT9oxRAU9Xv*bS7`@ z+Oxm9XlU_~%Z95-)|;$8bi~Uwp~`o7%o-+vXiFd&W7t_uqKm#_jL@$Tv1^-1*sWek$F){uA&0 zr>*b)(5s$t;uB9e)^j~AKX7RGd}h7C!TW0y<44gS&oqSM}#barObgpt3IO> zPCx#Ympu7{pZNNt+jrOMotIql)Jxv{`SZ>``JS5}*m&Ka`%gTxowueZ$8C~s+p_)3 z-}&F9va;Mi*lgx`QgWt!!!7sx;HsOJtU0OFGr!qte&ApJ`=J|d+P(iBuX_5?)M>YB z)6F&w&l~u|@2~yLXMaYWPLkmJUVg#tw|)=pVBTttkJleqx4pl;=<%)l9=iRZ&dB1l zQb9*RIe;UZ>~FTm+sV!ccHi;%u6=vYy5e1{7OWcipa1;b7k+cs)`=OaSPRxC>WCJ? zSsiF?3eCoOXCC>N2OhcVM>jNHMr&6uEgN^(s#Q1Kct>TV`jm4{_{*(#EuJ@$4D_!! zV#z&^Z@TBk$6xol3lBSN@!qLjo$>J{%NEU>H}sop?_9NX(UMgQI@E5~W)?0Qg1mFY z(#8FKc5-T*fB*=cqbxJ2u{J?8orwuN@|pCcOS5|)fIt2QD50}2!NXR$+kTX6yDRPM zA!8N2j5Ey?l*&Qo;3_i0K3t3ZwD+XaMAF=a5#(<~@N*B(#Va)_oDf zLBhsx*M#-!auhv^PJnWu#JCbNEQ3-aL4qF;VNRI^m@1z`%5^ z*3NQAu9G?cWDSJ_J{&m$q)w~T>9lz=Iv8Uxqgm7v92MUnttIv(rethRQi@Yvghic& zm;a6lE*UD8TSz~3q+;zBqCBXw1xbDzS2W~qj+0zf?D|l8;$ST4a_CDOB<9f4fa;XD zuR)C7h`cI-dN46siBY1ljZ}g3!lUuy#dWao>cZtW?BXwj!t2wF(J? zh&yOCIB^sJs3*MSf|v+L*^!cN7_-D5UBQ)FOqepsHbMz`+9Qb6I19{D+bMxkD>`!J zQn^$vHyd^NTD@R4#5#(#qN48yu_H!&^%BMSJ6m(Xb;U<#;X~nlcEg|vHXt=wLnEfib~Fn%$FDrjQy@@Q;ck{%d5+6YtN43HHS+UIZ1P=goQauf^q5PyjVMPz|M z3Y2#<-BLn}Sj#|HbTXXvrdoF^+>F4mfU>bI;+ry>VCqz`PxcWusQ`!kJH>lhgCTmT z>MigLIR1$qWgyH>CC;(Z35uii8ekZYiLW?Qgye zmS>AAmA=u5nStSvq5i(Zm#XE~(b) zZPzoDg4@1hU*6yEn)Kkt@u#g>0-d%ams?w#o+;Zh+MYabrUQLhnzqLeV5!$sdR>;; z{+?U5cK+eNCQpRy?2FDhSnYh`b61{K*}3cbzwF;r%K9q_CO`;~gE5{F0RR{z=b)$m z?uWKqeEum1#_LNK3>-Kx`RL}o4{zEtIy&~k3(tLE!{&*)J^HAT%3x2c)ylFYD_82R zR!_BJP2#4Tyq z8XSbqv~4vzwNbO^Y&`eU_M;EbAAg4JHk^DB9Dba8;J0S`T}fYs_yCQt?SD=`<7g5> zMR1JhFXFW(e6I}qum9n?mWYJ!sHK|V2;spPe;WXh6G-7TKjMuW3N1oI6@0Dg| zA*@7`*lxC^XKq41FXagomnP6|iNR4RMARS~jO(LB;0XCRR~2$ax)i0#7Nf!vcfj=@ zl5~X=&ah!2h#f=T&bI^xg2=e16vuIh>5fvlfN7{6gj@JPJ>PhglG-+b5Q`Qbz7Y{f z4^`xc(Uc-0>WoF?p@>^7?(#KY0%tNxvQcqD_q{MN2oLxd549+zaX%pfKrrAOjE;@_ zx)NGr{9zl`7;B8RfQVort?n-k|9v9IUnm%3x_{;50XCvJBj~sER1FpoHHCyf&|D_2~G#XJ6u&m zmM_JyOQHgfrz-VjZ3cSEe472%dl?noP|^tbFIc?viQ#t&DOr~b$BJ19x5%XgKLv~} zGfPFD0+M$ec1vI)L;kr7`47C^vci;RL_8Epkj`$|*H|tPWWk;r@=geCdHExvRw&m; znLSW^Q@b;}l&VE~k{GI9l5a%QAvqbre?$dz5I5KKJ{Y4=ChjWEtw_we@;p)ujYmSU z993+nNaTRcI*KbYHbv|e9z{u#z$-+1jdeifT!(r|0X|}5=m{&;o;=SKebLfkXuhfPiQh zW8)YlpoXk~ix|}f&_a-i;oPT#T>*#T8SPvF7H|v*hUXLsQ>anqg8TKWV za*oRXdB89D0dUnt^CFgiaSTL-Q3-Anl?z|L`IKTv8CZ19B zd!D)i6ct?9Qw6n&JM96bTZ&(9|Fxg_uPaB%9(TstP1|># z^rSca_J;MZxcGvOYYi@#KiF$&dh~(|pE}f^-?4t1EvK!#WfCBZnacp1mAVe&dt|DWCDk4T2ZjL1Sj?vnHm7GCnOd#6bE5I- z&wlsv7rgZwKfif!!C=|xYx z`mRkbColvC%c&jgEo~c}T)b*=VrzM$b=(Q77R^tw-7=6NfU|v@W=#3;#mi4!`RGG` zx#!nE-g4cwrP{uvb@zhJ0x?1}|1xbW1~E9SKt ztx`|V`c3<4wboP4J88+h!QBU&jU22+aM;NQ2cPPat}*<0xhK7}rPWxGD%ZnzT~ zy>P-sc;e}_{(4w{qb*rN$T?48<28r|)iDpkR|6lK%jGl_kh(wxLIs)t@&H1Nl95K3 z$bd;XBOoyN_(Cvhw~D=ms(0ia(Upw$EDmPK+=7uG0K$$BM1OchWITcnd?am{7!jDb zjOgPTIpQ)uB4Ri|Bd+>L<&{rYW>&<)^1X0$4E!5BnUoSMqAAo~qd=To4ou;RJ0|i= zCJqF13ksK_s{=sicg?GuFkY&7Qdeb|SaYg;fhsvs>tL)PATEh!3}5dbH# zw9d8DnVChC^-8sDAXzkj(fs-Iw(r{CH#l$JGLux3TW;IX>a?rnQmdVhPSnSzJBwGZ z%)!(f4dcMM5_gtbZI0>JK0sJtVpL$r-15Py~ zkpP*EQnB!744II6p&m)WiPVF#F*;N6-k=EFVqrznPc=J~VT56;zA*TR3^fQckZcds6yXR_ ziJwcGN79QzRkIzJGKtVDdxu}w&bh!G=eiG0N z)$%@D^4t`4PBJO__ToyDB(bK^Xt6JL-KE7|uE8ib(da-!T(uFQge z72nq{u|^ckQG#YD4p+vLTO?qEV{t@f%4~haAO;F?CW^5_+$>zF0H!d$xkMebMX`Lt zC|3|YgIcK96DiE$LI`srV5*_+q}Maq&2bCoF750Qk{AZr=~ZG1*Yt4gk=5 zVnl?v)1IP@07ml*>e0rgKq?L?qI2xcd$!srB<>c-gvTt&otfdfV;%7pWixwI2P&-SsZEaZcxG2vM zBXlx{RS3t?yUPV4mJ@JXja8WFXT^D;;|2c+)LvL>ZFLT(WK+UIZ5nxsajvU)!*lOaF5Cdq?$j0VbRAsK0n7*1E7DwkL%Ho@K zDThkAPP>V01C6l9b{L5dsOveMDUMv}U;LDxF%APor5Pnct#$R{vM^UYI6yn19FuZ= ze5Sg1$#JI~_orKKyZidP?b5@q`tcu5SbNxUN35=mUH#Alj~{c`;N*k5w>+@%-p95z z>gny*-}Q~3{QhJA`2XJhuGg$QV#Sxf_Va_A5B$d`-@bM0=J|_;?t5VK*S>r8(Q6O8 z-S~LVa38{S+1MwXdc>{Q|6u;o1-0qMdp`WVuYT)yU;gCV zcD(Jf`O6l5@vFa{-nsX>oA3R%cV5yvZ^fto<9CfVP^MXkB{tqU=e%)3@w8=*ov#YcON3D1;1|C}b_@>s|lY z=H{8lJh)}Y-fd$~yx@dmj#>8G-`w&0-`~A*#k`gCs|$w*YEyL!cHHQs3V zhhP?Bh#sT3ln}THanxpB00Dx6gZPhJC@oVcN+Xd&gVA-B6DyPokO6`FNi+wLUkZ%f z4={X5i^m%AaSGv&01!>jaz4IMygCHbh-Xn;1tCP})9&xTTvs7Y7-rnK0&*{E;L?F# z1i(NfeKVs&;R=j~1|r08IU)4q817==D|X@cP?#`(e-?{}Sz|)PRZT_~Nd8N#l}OYm zL*av&CC8Vrg6@aPkJ7M6j3z8fuR$Ax0M%-_lF-cb6bMg6M1r(bBIjl%#=w*V=nCS) ztY5lt7m=JRm(%B7{H&h79+&4vs?p$M6as=VV2v>d4q!n(dB#BJ@I@n!KE9ive8QQl zOTE>eq2bQd)b`C=ulnQdWN_`OC8bhw%e@;m>>5A+dCzV442)0I^Q_&3# z#ZC@}1_y4r>%j-_zt3R`Hc6+dR>8H84=GB9s=(c+2yyIQS!k|dgVaq);HsQ6hy zTOwfjTi}hib4u@Oi#R7HP)IQ`vI2~4GkxRKH?$s%l^YL~G(^v?@iFNLKjJ=TWGW?_ z!h;pDs|eLXwoTPijOlFHq^yOQ93g{aNJ@?b7!7P!+~FGW@qFA8d6 zPmCa_dRFsNqKuu1Dj7+`TM;=(^&Tmy=s+Y8cw#JY6-UHbM-*&PqaebOGKtbifMo@| zMXLc;h8`Bt>h1V9}E0W1|N;?H1~@t4TK+ z#!{_T%auyA(a(k|01T0(R*5pIyytN^W>2Z2^; zCQcx_C@H7I!j;m4%4D2Ki9l(Jl(JC3Al6j;@EMT_q!`m(fMaQB!71;H;}gMmeX3=VOB(884&G4JF?J^$yxO9JF599Q?Fq#LFpi)UPR3grW3 z^de9yHWEJ51`s25@seny{7IZ=EOtO#Bj7j~vjbv5$qY2U5X%O^fGL&InR+dET=)P4 z0Aq}Eu43)wuYAQZ$Eo$db*+=IP@zj zz)ObXbyviM*abo0bHTF_HUHD@Q>;(QEeX-t)lS_hjh^A?5YP!lk`uoOVimdgAVT z9-SDk9=^6`e9!1)qtx4%%pd97w`X$M%Hb{B_W#>QUenyO>l?p&bm`KO4UgY9(MXa? z1=?-2l|>^oxo^4#0~OnT;@QV--ZGxI_BEP$tf>HHRN|!m5!Q?|5MUf!5NM{mU2i zuUkJ>Z{(0Smo6PzvS{FuNB3t*=P75bUbb+-4R_wPVSB^1%<7{SRC;K`<72H_UaI8B zuU))y+5Ed7+Ocy_?dcb+-L-A!)`M{3G4r=>+_HDVR4QqwiMaHc={XnY1FrMOAJf*& z=A?_@sMBfto%GOe(tO;O423)c4Xn9SRaSbry1 zt@bQmzM@u}X*62Td+zg2Iqi(A{&@Yh*WLt(kR<+_Fxa|Pav!Sl(TRw{p{KIA61|Yn zpYbnY3k}4?Sz@kt&QN?I|MdvGIQxM}MGEW)5fIT-mn)(Py!a6ID*{QViV%*x ztwYvBxZY0`p8O_oF7iB%D3KHD#3@2`>@0{ZqJ@e-0a+2iZ`9D>>lYJb(ZB!z6-I(g zCOJy0r4KX~0Q@6H;FmslkGkS8pjergiDrkA^q{P($Qvs0!Vu-qkbYpeNIQgzC{Yst z^z>A!3C&DT5%1pd{iSK@@_c4|4AQbtZidn#tBykom!aQTkhh-n3_)Df*_!`cLh ztTjFlH;BfduYec}j%W~?t6^f1afh#7HC=0&O44e$Mau`rcJIIQwukqPk1bg`e`IL* z{*Ak?x?|l~t@->HKCd!=>2#x+=j~3O`)5_rKPl(PWw~=Xg6Zw){mmc#yl>AQOiEyk zmsQN~K+OvP(NMcp85|j2uw>%E&Q?1Nn+lnB)LM}md7(O`O^{dx08}u=n6YU3%T^k* zY_+n-WHDweT&F-Lcxs0N@jvWpg(Y}B@jweDi4x0ai&P{<%m~3dCSMQ(H)@HB!Eg^U z3+_cO=wgIQ3W7k2Dyds|D2xUmX&$HKVY(`vDEPQiYViz|*o)@MEIdW0BWmfpwaG;G zhfGTYR0G7dN8NRBEA}d$7MqI#Ky@^Oh=7fX%`yrEW6c&>keqtSqI75$l+>fWMe;{_ zVquo?8Zov&!(^O641Qk0cv)LK7~L$8gT+ghkBuE@x7#LuK}12j{)cna+uNI_rDn4k zMq0=`qH75>I!Azssq~x50Dft-L-??HT}qF+fT%#R7*2pFfm} zhw$zqyfCZ;FqLG6oq86knqEC>Jd~HEa#MN-2?9 zhzbfZPkp4vAm~brGcvgND;2P4Rxv_AuKOBs?ymU?v^zleyd`oDl|$E z)Z_tWNedB;|MEKma^#%T2BSyk{|TPS_S2=2!1AH^74WfReuF~1H)xEt##$gEqTD%h zx##x~3T#2C#fVE(>{Mwg>QyZO06>(s!VP5X2y#F~axTj<5Kb-&HoD*F`~~pzW>_wj zYxR1TXU4DX1sg{qs#yD~%P&9n*tPfHchC2~^R2^I9iF?tQuy%S#3}QjF3d!=+S3i< zz*>kL%qvbY1msPaqT0wRy0%9Ju|;?n^Z*7hHh)1~g(3{@^5m<6VNRh$X>u`NWE4k}XecGmFD3|h99SLl? znzb5`k?rftbAp);W_7BRlfHg(Hg8PZO0O+ffC!Q#r#x@8{pvotEbZyfleAN>+fK`& zNvkDe5=VKv*|Aw8>FGCU973z@Y<K>CJ07Q0v=Yd&}tP)cZgBKTu5&J88L0c?Mt|QJ&}4BsMW^hftd_m8yf>TAL(Q zA~M#NG3hgVnwiN<^D@AtFnN4!+m>u-UElIHmW(3+LUP{hLV?p5?>t$%HPk=Qu20k* zfGty}g?R@{WpbE-10Ya8j$$)X4%vopCgj$Y> zY=1(TGmdQ4AVA)6O=IS*CQCTF2|F{c)R*@xGFj7h#?caQdN;moCwKz@#-{n`Iyb(~ zrWFDJa0uknWCY3@6M3hJh=B!?t5$oKEnhJ+Gt+D|FL~bcPI|E%Ia)S?RvS2U@PD z5QOJR{4XwGF{&H5MauY1G@B_wC;Jz~0gQqltwTi{}ju3_Q4X?;q}7 zzo*u2=Wg%8gG+}NX5=zQgvMBGwOj2*jj}9FE7eM+R7z7!MyF5@pAKhGJ{aJDytCp7hc2T!ze7_*D*~G_Y1v3e$+vY z9D!!>W>w_?S(BG>N5cc1Uyw2x)Bp&)Y6_xEV1_E2;-k1?D$I(3FmjfzBpA#msYnnd zkBwuEwxf%Zhkj`gR9_^2HM!jkP> z=sel*%OlYPZ_WdOgnxt*KP1X}Ju}b+T-h zO1KLN@GLl)G-^$E_YSi7;6-e$O_LTUA!`yKXw>U@yPZ}mrBW%+Ga%=qHHldVWr`QEb8)!B z07O)X+DPhcDv+bye#WP>Kua7#tL%MH^yp5f6FEAs~pq zBPMblL?}Wr%$gA^U642C9djAk9K!P(7=b8GA0f}tm{M;KI3ky$L2{X`RIyY6a5gC; zRskJai)jxa0OW~5s3xvDQnJ<<1Jp@+OIfvy2r1+QxlIjWg`6uJB+3z;>+3NNkn*Hl zA|i5~q+Es)0d-Pqpg%D%jMkDthhY1M0TB@h4LGuhwx=pb)gUlWDy{>*x#EX7-JlDTz{Vzfk_aP5<w!8w1T3?ig9@n_4F6LbUpNX}pa;D9<{j00!@HL@XV5M3unv(*jlO)Ab- zGi!|V-lEXeE5cVM2~3hqPEC?Em{^3I(v(bMkicY!2+l#8T7#A-2Xusq|B_eiPy*JK z&;TKoj3IJ4q{ae5?&Sw2%N>F#BN_(?)?mfC$@M@vCKgLQhC0;RX~04P4jcdhs3Ro! zt2xkPg#Ypilu$%$n%WQv!7%7XmkOm61YX(E%#PSYOpIt4Nv3iv4ILQbkAOfJ6Zs0P z#3=C_0Wfkdw9iX49`U>nk&BT7<0>`)QNq*ZV!RXjz~LbVbrR433=i$-N(g`!8>)hf zxGCyrrI@sju28sCu0RCRd4npEazh^EVt&sejzKUq0#oJUIHN&pyk<3zO~0PjK% zFl7iR9DTu~B0YD1V2UKo3SU`}Tws={iM)qJa1f*N#jX%J_%YF7NEVu`;)3F9JkF>d zg~9~rfE2? zBNxuh)XF8>XtyRN>i2HhbIpAl_tl!1SR$y+)H|(KmgSHnwbsn^_+-V{`Sa)X^bK^{ z&3!v}IfUa*IN{z6TkG`(+Qb4mKnI>b6^k8y>Lf81$e(sjn$t4loP!zxUm84!2!J=4 ziY4pHK8f>0mJ=l^M1!=&f~X|&6B%B7q6PG|#0%5O*o=~SfIF`XB;sd>jI__8aTr!ysu?f*s9RgJFpu8L>@5b)d=Bh zjG)+mA%3$R=$ok^i+H($B;t@PJSG4ehgnI}yGetrkpgf{j)N4TmODx#BtQWi=7QyS zX(+fzp-PJYL`L>{L>mx$3ljI)GOse}4IQY5!mNBAe{lsia5R&g99xrFZdOIOcU+u&w2&w4bv13M=2t8_cdiJbO`J@oK0-zF; zX2DmEiUp_uB_HVCs>8b=mC@@OR?tZhhbxsT&bjgZ2dL9B)xP18d6jax)o30Zn}F72 z+S}hdFi3fpbvhKs)Aig>G{3kZp*VL$1m+nY{QMRMlNf8$R--YsZ$F@2uzba`Ws9kk z?b@^d;O<=j)HiQlTCU`sHc`&*<(KPN-i$B`hea(!@5XN}FWj_kQovtow|W)?97jnvO5kaM0^mfB-9a9#nsY7y0fb1~EwF!e zu?~GJB65lmeNm!3GNVHPOd#kLKz3T9^9dCCuM(y(3IhgQp1T}?5WpZSi<}`M1Y;aI zFF}J4zAiL0WxN5nm{l2K`bxY!=|{(OB7(~Z2#65!V3>LFdDE<(R;}jR2 zgI4eyW45a<49s5>Jh5he(n9Av!Ipi&B7k;av&8VEuwJMs;th-3Z)Wx5FlI`pjQGmK{#EOK!g&QL-;Ngt^|b%#F9+zj^DnBMx8K*V|WX zw)T%t-?x6(T^sitm}%QIK}WsTnsyC4Ei~nW2loy1^j-SOSDyRCb4CV6&{*d>t@`9` zci;NiPk-aSyY7Odl-NKsVnmHYmw#mf4jdKJ5faM*`4PMeB6H$Ms?E zP`0mzuayhig8VpLkfBb6>?I;ztEZA?lcl&B>ek`abz z0~($%q(+5oRG!-@h*t4VHSNF~f@zCuC=F>0ivrQPR-7g0B0PTO=^!wo>;Vf+qcDTW zS@8qzQ-|ktq*Yg1mMBC=cH*P{2kkNKmJF@-c`K z0ycoYssKf#aki zW}<2w6dg0xUSxo=R-mP&aHAlx@JpauYT_iL=gKn5=b@kzbDJ2%z12m`6jAH(_zO{5 z_U@%fh5YN0Cys>$3-X{4imL{T#{vSgXqDmxl}P5pf=AU)oJ9fh3&_Qj=H@w^1vCZH zR$a6yfP%6iZVlo2dV^*Z_HV?;>e!j$kcze_bCmXDRvHU1>gfSBCV@mIvcx7~_p^9NEkY?jkx1Yeu18U-j@iO2+r?>+K(S@he{S{7YZ3cJ=DsYRMqBvesjd zulvO>ul&t#emy?EcW~i69`s1^qV4m{lkPJUek=jqU`1u&NJVnrhmWjCdKm_Q*CVT`(4*WTi>|`W{L99`|!o#x&>4c91VbvS} z2%NyOS4xmUD9xY`uo(5qSLOgl0wDRz!xtt}$d|%^h)s&*Qj9b_Y$A>|50Y6GUR_Rr z0P#Rf0IA0acdd@V+SC!GTey*=pxwZxVhF`Ena}v(!KDWtxQaV!w>et z29ftA0uh1%0H;7$za(<4ymiE3YbNhpw_-{EDJQKqk8R()d+)2oH72Kb*7iN=%u`=+`D^>;_x<* z>E}Q9g)h7N_B->W55o>J%af6zs|twhw&En4Q4%;1cL!9ja;EN)F-8r^Mh0KBd`?E;+fi#_|;nP)i0Sq(lbHssW`Lr*lDK1!`t39uyftoPID(h-U0#4Hm8x zook#80&+ygmWRodfO5sB5d8BmXhPfr<8o&R!0gkz#P9M9%R|^{P-mRK-yXz) zr6PdLp(wCbSjTi6(bO2LjXS~;^Ta9QDEd31PGq%k)0zoNNs@ts7rYe!$bGH z0N7DuM3Ox$GEuQ2j7u}9ES!an%AJL)g#2I1F+A*92FaGJTfAi6Q{^ZQ){=VT6qz+I{Wa5}H>YZ2Y`;N--_F>BWT`{%yU+t>5u|M<^? z`^PT0;DV2T{A2Ux&;R-tKHE1k&j96OZP7=Sx3KxgTn*U*WB3mSp>V`+04YX{L%$?= zsXvu*Xiq1Y!{x>6{VxSR5W_bX9V^l{*_(@6&IJCLWA-G1SV!iPp&oD?4zXH9C<2l&oSp%_v00O^<|Y``y%laDeX;F+)w2LQkk5U*AX2)i&u#idvg z$TBd&;3HFtyo-GmV{8kogPm6JQP@?uz(2LYw=v_8>JD-3hNVb=gcdn~d%r_j-r&*m zX$b|Q!6*Kq12T+A;6g=*2P_uL5|VQyNeZBTLO`-N#1Dg;006@%QjoOp0UfYOshDk^ zqJ@BifUB$~4aOYM{g-rrHAoJ!I^;Q68J>D@ZO&H+jxn_k6$U^DB=GB#Tkcb(<%nRy z1IGa9_nHG2B0~@ItO>=;Cj1&Aph~X8I|jlAB#6EcQZhb7Q194Rk<_2@ftpyv0Yxe# zuFjPko*HXfuhd3j$6N%_@4@FVT7V>RiEt~kPqEMfT@G*YZyKHyf+2$cww~b8Az|lx znRmt~3%O8&=&O+7TU~%zYOp^5@cW~}n2Ep?0zn+G8jy$=Mx^vXwy(7c!38x*sWXb$TH*ViMIyo`jm}<2RxV}n~IWUNj z5 zyTlk9P?_SJ;Y#s~n4ao)I7YVQ$RXF3SJjIVS zxCiyAq(Vav5%89(C}0*!2wC8eB8B3lfV!w2i$YBv#SK+CSGtWtRf8sNrNv45;Lk@{ zsCOVPp2pk>p|JQyoR5Lv53fgIP%&}6gWu+v#N~roFAQ4o^NH@DrVxe7B1VxgOF%^= zllDN`L*$U3cn9FBd+=D7ps9CCd0s8sW@4I!5fM)j!sWJiB%f(f*1)*sl_#eHTI41o zz=B(=3B>A?3Q8RD;yZ;OvGx}iJ)}bcE3YaLL||~oVuKMBMZ;lQs_-v4p^m$Unwg5% znwIfqG?{7mMLazsp``CI<_j*X%mbNekbFp_*3~#Zia?1~Q&3A6(#T>APlpNuR56zY ziqWS04g8J_8oLab^p(Xhp(;VdU8#gU*rMp6z@)rEvAYSlP#C3XnVXAAmIjD8+UUq~ zDhKZi(Uc(SJ_0z(G=s$ouqa9g0xdxZq=8qxf-P{P3XAlm$lenzIcP%TgH+Ge?W75H zcqbg7=EzkmeFt}Kzu^3*eCyj^n`$)P`JNBlbi<9~oYxNd&TQsvuM%$7ro>qTQ@wGgZbl?KiU1BkG%1US6_4G zm76v_J}^9-b(*}fj*DUlvhWd+ll#Ep@B|BqK(+#ecc4pM1uKZQrxgla&L5^JRZa#U zjL;;S;zpStKqPM>F--%)=psdvu;A|{JvxpSQX-J?NfL*g<3Mm=*&$QBA%X&eG1NK$ z`Qe!KxV#aT+UH%B2|VBMko@B#X<50OpXh7qG$@ZhaTj@ zSKI>lWFiCuh=GBEy&}Xqq6~$kd=@Ss)^f}MQRWP2fQ(eZ5HNf$9 zQAEFq2>q9d5PHZ77x>*TXow(;R^%Cb7X-s#cp^mI7n`T=Ay})-Jpcj_AR$WzQLNNh ze_)PsC}o`xAfZ4ayzp3U-8T{-gdi(FQ1p4X+sPU(lP(t0sd7h!v0~vDNSBe%;FjnI7)@)%E{tDDizCW&bIE&YYGGhT&e?mmKc&;GD(nTg~ zD68s>;SvK-ZS;{C1ff(>T)dI+Twu2x59PX8f%cv0CbXLnPk?`em{!I>5{4fGI)VHe zy5m8!=+)DA!jicV9OzLPTEGf!z(bg7FbooX*{N6MbLAWPtFmE>PlJke(_;s`T39i*faDE}m#{u%5?@Pp#f$hOkKQNnDF7L4+ zgew29PZR;sCN?Q0NhwKeVy(4_O%rQvcs4I?K@-}<8VCsGU4WA_V$+n>4pO@Csee$9 zO6LOJff$!>-M<~7UT)y`*g3>kxl!MZio9X65aYF=Z)|~r`LVk*Ld&Fpm8ij5sb9}P z1Qxqi_92Bs2G~G8g0GPn3hHSyGKC!p4C}~qK!Jvcl^Ta)C=O%bI>H>WH(rKeM1_k4 zQbmPKdz4C9{KSaCn&jytL=)r5Xp>dF#cm*!I6}2U7j>kd9nhH@Rp1t6tpFnM96o15 zkuWc6i0?Cgps+*TT>&~Zl8-Bp}{7k_v}zLb{oR=Yk^``qU~`@+j!_>OnI|NZ~)jtB0)x8BLq-hsZ6 z;r`*_q^COF${x7q-go@JSAFp-|MAg}{?qeb@S>T~{b&+nO#Ffam`i$5ilog#Kt5PF zIsT8pL9@|Zx@76`C!GA}>;AIok-Mt{L)HHN>8Yu!ue`F=%8xpBExB5F$bYV`3IoBQ z76!K%*#o>IiP3UMR?+8>^U>4Q4jQYZfH4$`Mi5otlW2+(rHZwhBHo0iIJJUM@RPvF z7#NsAT+G)zDzu`5D8He56KpMvM}8qNN$MKoRNHG43)T`)I1>WVfPwH|l$VbW1^`t) z9ClBT6W7B~gNmNU;EMaE?pOL|dN*9|0^^Ov)1Wp794_GO_$6-voOxohJiKJ2yvj7U~3W5Wu_(Zq{ zr}ii!k_Qp^L73xm<<3L6UdyY5Ds@m4&<3(ZO08AVwAQ&|M3&7BX-XRV;<{dx?#-Ct{Jdq&M z;LCECm!5nPQFQ0yH)BjNh!(NS>A3}N_N3ub;W|g6-x#e4p&Ah z>4Ls;$4f zaJ#Xf)M}QQoXn_*2hsQb1Vjb+MtkzhlmffSsqgAvu5CK#) zsH<5LBPqVL(3K>#w0(Hv(1k@YORO)nL-E(>H0lz*L&l8VyJch8mar+~6YdwuRX{+* zFr45A#2Y2l6azqGd7mPiwWbPxiWdWb zu_d%+HaIn<7)z0`)M*ngdxAT4VK%ZLCrgC>BxXR*4LAyTFb6WFeq+lK3?VwS_=<{3 z2EjCD>eFMBQ)81eQ#1AHW^KAQGgE6c8qRMZbTQTB#teHa0))y7iy;ItepodGZqdT3`3$rLFj9LkQdiW~dD zKog^U!sluebu?0%Wg94pX8?{y(AAHCHj0Z8TQR$eIuZqBRJX41NfPShS;u|(%U|BH zZ{of0eD}JI+eQ{H8k{%3r*|MpN&o=XRLbf6q3X!Ok==W?{lC|}_Q1sWr#}1H`HPp< zr|Slj*-+KRQ)AH%k-uP@eE3h2bo#*V*Ix0)OJ8`|hu{B^?|tK&dD>GQ7^(F3ciNqq z{rjd59&m)^-o8q2-^6(9GynRLKU{O|yWjiX)kmLDpBS@A2_^C?)%k8i)Q!|mc(fN6 zsj3GNISBPvm*-R|_YvW?9XkN5NfU#FSZ;SZwR*F^Z$Lpe*9Hq}BqapN-GV#C{3a+# zIeFwk5-q!A8wqfPM6yu-W*VmV!CLcw|zQB(Z77!mkA8IupGtY4MMfKqti=cv6v zf;lT#n+WLN{Qx|t4&TrxlGC~}MJ;JCEv|`aoMv+b(1R<^9J=1ua#y00BqX%&kI;^t zg^tLP>kyzR^|_gS+2l53jciXWzG85h^%)|7%2f0x9M6Kw6soSi7vv)g15}An;?grg zILDGYh=#%rU&Exve?lB?G)T!pDq`$G^o1^9 zDf&~50eOoK@@lNtPB@qqV-q2nLJ0eHg$6M$6B3vZ_>uJ^^Yf;_!wUoDx{~I52yxRD zk4hXzaEh-4zPrd`f*C=$UEYhB%!2|jKuBqCeSGrjKi%}wOD>ui-A`nWJNC3Q&OG(V zRfi3Y%p=0dnRdB%XkxNcZ*>xDje$-MGgFODn+%$SOi!ika;SA&Z)%?X)HA;Di(C83 zgO@)4!rM1J`oO`*VL=6r%c(;t8ZUgvT-K~Em_PdP#_QKVaPcJ<{^Td$-?ewlBqc{q zIktjLSx@$btNf2*~Rk$ZK@k1Y{E01%qUKUxHa( zFQL+E%rY+_!fM|suwb=xSeF1G2Ma?iLm=-?k?jl~8rjRlqPburn^cK)#_fx8;xLq` zXGv7%MZhP$$jzX@L9rGF6P`A4ge5@Ph$pBR%#GV61SwvGdmvhfFgFp4w&jSa(E-@P z85cwQAvo|3e*HqOo~Tb1Zx&Btj8vKnf)JgCF(L>bpb)S$VinD);B-Zy0-2-&Ch-vM z2=w5InHPZ}N4At;M$jQ3185v3h&dmICc5SnKCR}qOq2_v0(415VhB?1(3pjb7xna1 zfNa+8G+S+71<3MFz1eiR^FD@>l?4L@B)>nEpAJG~&lDKZdkH+)6L???+6h?)Gi+sZ za>hKD@MPp51P(ajfOc9QB#N4aK?Lk@j4OtK`21#HQW4vTK@LLP50F(5rFRFf0|i3_ z!8CxEeUwW9U#`7cCV^sUL3aG?ZES=PAUss8!aEOEgMWlA-&+80b{P(-;)Cp_aZvwzfg>RTMSjKlU|}%VR1e}&d^jz18Mo1d!O3MHHX@)W zy%A%&cSAJ}76GcMv;RP}T?z{iK`oT?4zwo7pA9?h5|MTBJ|L>pp!H<6Sf)~B$(;xq* zEX$3x;Ts&i5i5c+8&f%U%U=?TeW^7AK$inhPUKwfa>@Z*p6AZxL^%K%#3W6<7pOVT zp_8cF@CnKfMbW{pjsU|tqTgOUXF!-E7(}s(oiINE_GvG46--EMAecP+At-x|WGwc` z_oDn0x(p5aCm>Xzhdqx)pvn!=JqokvB3FWZG3JXa7?V;y-P!kGY4J%(-@;C-4z3em z7@6rh$89@xQfMS-6wb~B00iW7Ptg!5i3EI;ySYs@dX8cuD92$31?xy@Fak95kZ>u+ zmVGscLT;^KQDiQ67lkM)V;l6(Sz>%H%qJOs2MjorP$&%%_ZVgx|71NNfIrA1R5>{0 z@%RI%2JwNcZ}IpPloz6+qTR)48K*}mkCQkRn4(I2Hx5HY_f~*0Mv%c$uT9JO%#LjI z5zL!ttlu}`QMx-y&-L<97wV71-s?Xz>^P*V9>Jm5?I3a-42g}G5`h%QU3e;1y7b@q zqGO5^iE;agdOGo`?9NJ1(A5hcK-C3zx>4<}*$=orTQCSnb$5+0X#2zh4< zvlCE6hesYh4>-g#<3g7ovthat_QSB%3-=4P7$7N5FzJvfA;`ft%E-Wz%1{;zNiTo@ zFZURNDLj9Pm7blOH~->y*L~y5pI^IXWvS9Tf8qSB+3Mt3E6XUY zELy&%k(Vb9)K@N@R~w)5^@}|Brf14z(!u_{>vz23`A^$D(YkNj?lr4VSu}6>kGI~@ zv^k`Pz(ESRAu{NQz#$MA1ne)}yJPd4k2!C6aA?=A{QxPDUre|7xaXi)}oDGMYM^FmSOGt_e|coWL>mFmPDW!@+uPtmVvAW`4~ zxtx$dw5Omit|_p5*-%(!(YO&nQW{^jhLF;bnoeBRDR2~(%us(n%-m-np}sYfSE(>tz0mDk*jih-i}} zH5Lf6tmEVh?L){$W2{fr(Accqae2q4NoqKK(^S<^H@oSApsH0u||OL)%ymk@qD_^AoY*f2gBi3RiEYcwb7A>bJ?<)B$gNZG~gJtX?Di+QYAryOIyhQ@E zkmsEo>}y~9nrp88%e{BpUg_zpmP+S5;mmSR-+lMqwSWKKQes=}c295rD_;J(UHkUm zbn{=*-o+2z^_Oe@cb_`)lHcjdM%o6@uo(eaVyp}uMSxr4IWmQd)~EoYyw=4kpJM@-@o+vm)6>y?|!Sg zW&J~U+%%J;4U6E@p z6XPl*#&=K^5IIoQ%!e8affXk5;HReln_tdK_b}f1IKNt%=U~W3ILfsfET$g$GnD`r9uL zsKiI8`kPUT9kPfU859$iz-M$z0kl~+Qo)o2ImVvc`G+Lb`{FMYqIJ-_m}%U4?+3&N z5aL_{3M7cw;Kj4ia0ycxY?vV-U_6U8#OIKspq3~y07N?Chb}5(Uc)9HaS7BlAoNM& zgeR+fBl<6`7Fy2C$CDJ{3PDU-5BwV1y30yaT0nVD?od2Wpx z8thxQe#?1ho_N?%YyR~!KWt=4({&oHb`3f?I`FyQNvL8g9D+kL zVql^=S=ZujLz@(k54dRskQ~S)i(ns!@a`qRu^pofg(Ps9gZuPjkq8N4J4t-fHQJgW zpa@*yGh-ca>c=AB0tu@33Q<)#3`9yoacM`;g5oVPY9J_Z5{@Fa!=^72KlWDh~yFnI>zi0PH?KO6|O;7WLBZtOO|5BI|+#gf==mo1@o@F-SxPk*sq`mV!kG zn3%Mbq$zbQx(uSlk!KKo@Px)1lQ@|+@zfO)pZE7xrpBlC?%A7^lAOs$vtBbc0RTcul2UVe#^qVHuQyFgdEP-lYi+C9nw*}t ziLLhaS!1&-Q;R5QY}#rxnp5Lo)4su>G%aOW2f5JWh}x}sl9U^@TDvw=9U3WDs?FL= zvo?ci($m{-4CO9Q66-qo^ufJ=&@(h_k|gi6j7?juPW#}PDV2K%htOc2=bd&oeefU} z>>D0QOKF~G#-#0bt2Hrct?3;YFfPmU+$J{9-PHI55%vrYxK6t^Hqq1HZxGSi>6sZ< zYd|R-7#YSa^WOoelNuG$*>W_@OI@w&a^VJit11x6y|RcGz6K^Fz^aT~aLO1$q#edJ zO$OEOGd(oFu_q3P-vWUK)sLPI2F&uQzP~l1r38QAQUH4~@$=+y8p7foQJfir zyw_cbikvJtqOwhACMJ$P;p8<(9Pyp+e6Q8c05DC{fBeXMk6pd&^4GuX55M15E%&!- zV;4T_c_04J+k5(Zp84#TJb3^80LdTzaLt9!e%7fcpR{$u21jH};#ie3Zx*c!dKTLz z0sv!7r_}^_bj%BTOwSUMMa8xM6>);i`jrMrfZA<{fs<|(1 z5bDOreS$+r4_57T+g`9hlC84DUKXRih8_;}6dUAH5=3{T*qL$#5bvfqQ;Ax_Afy?^ zZDgZ>ig=`!Y9sqO>0bMwKh6u@lAt2{+zYV}iE+d=g zNW?Dnh?to0xVqALE$(i0$yCrE9I4g}eD8+0FGu|1zIdq}W!Wcuw+cku@Q&oaNrDLY zQO$rBY}FK2?+F3Gg!8=oQJewo{759u0D{A?Mi!cqr?WT`d%cLp4KE22KgfoPeEQ$R zmkawhU7)I>S;09m9%7#*WidQ&7M8d)*A+4BX4EZ!0RljO9;8LIK%Klj1ML~e>jsH4 zdQ^9LLg!Gv;6nB7f67<45EN7^KEbmIQ$u5zyQ0=DNHpTVWtDEOXc9Jngx0vo0xG!q zKn9K<{^j{Zf~=@QoGxIZ0g5XY9zRX2qzXk5rT9;fGX&02ghNEQQoYGXz*h%2Mu2cq zECO#Xkwz7auSJjxVQjuJCe;Blj*Zh=mMxCBJK$j!*d3t&)KFaX2o z8a`ma4x9KW21p>1gw^+DBFO>pZosT0h?ujk@O{9>fkFSZF5tu&L+TxzT*Z-Y<70^h z9YUWy_QgH>rObnw7|gX0rNFIv-! zd9c5+#KI^EB;#eS!%QLqWT5^|G*DO2ZA|cfi5ZS#P-6C0(D_B;dw#!N-s|zfny>jYa+qh00F@{il`T+=%8So zalp|c)Ye*u4kT+s)+Mr9l~}`W4`RO0$q_fx>2b#7kfmwaR8lh5KQYI;wtzOA?i4jhpyUQfp=e?Z0X_Q2LoRon+Qh`zm~+_! z_uSK-9$&fo=*3Hx>>oXtXPGrgJMZ-N_F7ERQtDhbF+RC+#fpLc{*4>g&or9-LxXvz zJvlMa*V}i}DW^+*wPJU2t+;Iby^z!eY0&I42eUl&6r^e+1V_OSV07Z?`O8B_#sLLF5+YGn z0)oEgd!f5Xh=RCV6``hi_*k3If<|L~4KUUSvI{`319jSc`jeE*|QI_Iob zXURhkJPgJ{UL7AFOKdVSJP&{n4S-eYwAifT3@W}vxTTOK5;?zS)@)^`oPOr%r=IcC zpZ<5JQzt@_!~XyP&>$LXt+fE@amPOajD7UcdlO6(!}$gxM4w`9N0pJn`4}qWHlsqU zn2U0WdPDPtut|{u=l~P_uV4oZ1|ViAaSOS0$gOrqB0&IVP)sXAA37818nskEs8}qa zSf&Y)D8wT%7gt z$O1x8-iiXD`mR{B)j#+XA36z?WC55PMSUqgB=0B=sDCQxisVfJis*@16a*^kQ@4=q zv2=Nr!@uM6dY{qr@umDMLF^he>iQudYZbkBancqU9YxbdC2#?C48JpxAB+$h8PT{c(2_+o1 ziG>j-31QNK;%c*ycKn<<=yQ0AJ}=t#ed#^qi7wx;1R@BL9<(VunkD-?Q29K`HX9iS z8gP!MsvRVHAVN6x6Bq#n>Xa2QykjBmAtD#$cvEc95P}hb3R?+s5X~{lNp&_@Wbu8` zWY9rKV1t=)RRjRhKLZ^cg~Xg>7F^HqMG=YjV&}k8i1q=zCTxs9$-idL2}1qOp2cs+ZQ)wN zILGp6P>LiSQjijKP~M}Tf+a3F=q|dSxhO3CF`9(#{0>OuNF_U?)$k+)5tj*}@Oii` z_?RRWz@lT$9|slQ_2|!k$3jmC!Nl`}cx*zjF(CpXU@n;n@l%gF$GTPAh#RG)G*n=% z1#{B16^KJ-Qxb=WkQi@;uxm=8pXyiw-JC(TOVnPuzJlZTraIr9A;7HWD#umMf4&_U zDnr^y6KrJJ%C-Ay1m|2fy!IUEwA)#pr%xo`Hi>Sme|rW zpK-zD%v4(HJ8Jc+J^OZj^~+z~xns9U@a!j^cj*gX43sSx8Ct)7-8a7RjfsiLp1yt{ zBA2(C&1XLI!pmOr;;G58zW)Ao>(+hk>)-6OvU0gZK_5ANG@ z#HwRo`})`S4fa)1+_huJ7ryw_Qd)i4t6p~8iEBp3$DVib#ozwscSaBFf9BIKeEy3s zZMNHGL-*bHz&F10-w7lGef{rx+j|Z_^04u#(Tgs8=B{1)*Br6(Uq11vR=s}Fv!8e2 zbDl9Zad4=&@6J2#`N=PTUMf|9m%rFP7!(<3Vktz~oH7iK$O0jHKdJYbn7YVLt+;9f zj0U01Pt4C47T6_Y7mAjJQ85S?tX3|QDjF6|T2>pF(S=aKHJAW1u_U8=K$S`rduHH6 z{t|c9ExR2B4~)yW+7U5EvZBN3bD2}d)t-`HZkq2 zWy_WO?z`*FZ+(Z$+PimdE0?NS)6GoR8qH?4x5ruwh-fY5AWv9(0O8aJ0*doU0G!Vz z@@8%R(iN#K?b~+%z)_yNZ05x;d0}GcTVMZrV`h42`H{8p$;71Pa%um8gX0sU#v0c_ zmpdRx5(~ifUo=_+GGP^3MZj7u6ozU{r`4t`zwlWXUVQPzzx?@69Ch-XY?4}Awn++( zOj0UUdu*Dv+bw{~6|a5mu}2^N!WX@CrqQhSl=D0f1PR51Fj^LHL?RApk;wB(6j8`T zNXXkbdP~?bQL{<9=YvUUyM|axEJK4kS|uL zl%Rl^F>6grtk^Yi%l>cYz!-qs5&BKvo;HUD1gh^EL zqVT@v@t1gi!yI};;6)T8#usFOARJG1LGrbz6hH6_97PZ)^cQCyM;KqcbZ;U<(q;h? z3Je!7DTbA>qR-aHMH3D}08m`>17L7t$*MK9!bRQmNsmkR0LB4xaZlz-T0{lI31dfb zLjVA09XGw z??*)}_{d;Tkv^!MTa}y&0eCAo*L;l1#E=ESk`i8T{Db|-H3~NC07xOR4i4)l#1$VA zF93ui`q?^>fY2dgD9C~dP-lWz3){zdI)0-EB9~@Rd`a!SBOh0!-i5%s#Sk$Z)>H5) zDJvo4gSMbKBa4_mgI&n+5dd=l1TvHxgGtZ8?p@nH^RNH-m+SxX_P4&}lrzs>edN-6 z9^SO4=8ii330T>?Vdv=B=v2MaTsG3zoN7*uO}y%(AGrOtJ3jxdpDtanV*b!jxm3;< zFZ%h9fB1$sy!6fIUH-mbexh_@rKfKMrW?-X9m=4mWNXd(zRAzO`d{F{^q;Q&ZJy;O zwRxTcp+A$C0Oyx?^VlFH>LAfv`B|u!Nv$Ck7o-ysy#nVL$`W;*B2q`S*^Vb3(&n() zfrRY<$k|22;GwsLM@2>O0jViQUq|UBtQ4s2s5&oa<7RWkSmhN=!!U89HiZdsiO$Yp zC9KEBMJSL#hFf?G9U}@rIM^o$Dnv$xoRH0_9YsDRBjkyDnh0DeL)CtKc2cg8goucb zAku~%kU5mWiI2{d2oWQS+@*26z(+wQ$oCVFvIiaLWvwktToD;Id)*EHl+YB zFkt1Shya$rAzA<+a3-A9lY82*4vPnHG4T&9!h7dBM%;kUpN#(&u9)8Xx7oT?8>FXce z0PWh@PrPK&;zbYLcmFx(o_E~ICtdlw-`()%-=yWz>)-JDx4-o*A9&vfPC4oHm%ri_ z*I)O?n{T*g)v9Bj|Kb;2dg*h&^`GAXM`I2+_kaHLpPq5v zxffmd>>F>mx!r2M{N=A0-@E&}-}r2$GIZ&SU;g43z38i7_|h{ky2!N~pa0}14?ptw zv(Gtu$Ff`E@WYj=z36$*UA=bg)YSBfl`F2f>Z)6Ax_-&h6|Z>BYc6=w zxi?*R-4$U3$a5Q?g z+b+pK-0Y+zY115*9h&8#6QIB|aIt{d0Pqezab4hrw6JlNiCc7rC_Nr%5J}gb zUKRI5im~n;9h5tuFdkl*j=;;Z(DNmB1ZH>f%mblEJO+x=ymK z);_-B@lBhzVA@B{t7&HjRdhRRWr9fHA zF;eV~?jkBeAY%~ntX}K1+myMiR;$(O^@Sq~^1PiGoAmU~j86>?4)yg`cJJF;u2vQ- zoL@;xwOT8!mIx5h2*(kR(|lW11$?TbYac-w6c^$Ei-AdA$eCx9E5v3B7AIE31fyWN z3Iw7*P~r1vq8NQt((D+h1unFyOC!K$sU_Y$D_)sm`XE_#FkoavWJ_Wmz$-a{@EBuE z1PljY2m!%3c1?fYMl8oLtzdaUm!MDySw(UL@TV2VA_EsT!u1YS8$lj1KdNM=ANj4yUc@~MO> z))&i94Vc?Bde$+=*7#VMi0%{sOt2@Cv3VZnymxrp3K6MG4u=qrpQXRak#piF5_&n% zG3s-qGvVA!y{^gPq(EwkXH`g*B)DLVOx`Vx0YaTWaMTu@XK!&Tx}a_r6W>+{>V*dZ z!gnmFg$}j|wVcRe7a!+k)!>-~Xo_PY@XR#~$w1*7cncbkHpA}>Ih<6)oJ%T9l9>6w zqpA53pn9APK=OW7=|N@|+-D#Ufof1;g#L3A7NN;MX2Jl45RD5JnL&htE>w|=4G}Sv z_5-Z@IR=2lSi)p~3(KK%S*yZMxr6O4UZuQPv8-@oo|Cajb+FZH+dqk!w$W z&U2r0{?nfM0^Jm^6nMO2YdUIsl8JhH|##^X=hn%{_Cf{d-$?7$E{se zN=vp}!OGB`58m~@5B|#+KL5{IR{PMezSthw+rM<4O_DrujeYxJwDZ~Le)zIep7N^K zyngfM4Yu4v)Zvm8OIAiDzlCA*3Dpvkr0xiD#tP8AQVI{1K@rQiqgW^l_NexHgnK0R zv6quCZv}aB98e|)#nP1Kh17+KQnJypg|V5-CjkfIP&wvG+-9Uvl8`wI>x{PrqZHPz zoiRX=P)&>ko7;_`736}Vt?0!93{uk!Jd!o1d!?x0xSFUC0AvYR;I#nk0g(z^B^D+z z4h?u=N1kY*P%1;NYe3h2T^1OZz&ILoB@Ze#bJD?5609MyInDJD5XcdjXpB5tulEoM z!nK545&{{P>O53!gcV?yJ)rzh$rXkG5ibLYb22@ME(9@DgPv^RrS(%Rdb5wn8oU<= zGXO+Kl%~C%i3i4i^jUBYG7BcnXWHhtmsFm-qH)usd+xsq(hN&IP%4?e1UKK2Bsq`; z=K{tP0h0eNcu4{UP(UoTV9Fp{^8Ggn=6R>oJ219$%e{Bqx%Pw;<}dtxV z@80o)8~TTzvuWeT-~Qs~`}dD#&H7J!%U8Vq^{1b4+7U;r85r!@w{PFV#YY^R{Qnqx z??79!s!n*VU3JopFZS#AUgroj2z1lXM9CmQzyVZ59mg@?D9$(rBo2yzqKFB@fC!S2 z(9j^U>89JxIlc}r=XBrA_nvdA_WJ(VEA2YBo$o6B?mee!@3mL>t*}?^T3lTnKKHpV z`0Cfbu`s{T?zTI<@nJ=u{?|`ZjME#>UX8`Dil=WmJ%t=Z5MvBwF}EJt!KYZ~;7saXySibPZFJ4$$SX%C%an=Q= z=H^?yv6sB)h4n=#u#W@e;!wNgdQb~?1!We$RE3fClXmDUr1sHRx7JBJS+J2khk zY12lcqV5j?LZo==#Oz?uZ}qyZPKSoelbz1G>GgZ|?InO#x3@AsbKZI9t}HL_+_Mkc z;~Ig;PtquI5Po2F)czOYPZ@0ntyP|13x$R3zt6a={H>SjeGCA?{z=<@_+l{ z^X|LrW&oO+I{lY^@#hy7=5M_2)~(ylShs$|b^meOaCL5M{r2HtfKmWse+uHWyo{T2 z^g9{e$!9L3@ncHrG?UGl;}b&Igqk{5120G}+;Wa6D@|t#t{tAPsE2SFt?Fw9y2BZhXLW?!D{}CcE*T z6*70uB_G{a2d3H(Hr;O1pq|T1x^5G(E2%g+`yiY-U!bf~s!rx0T?vB(Zh&`Qjo4hj z97-n?r1YjE9?yAqBM$%|HFc;yL@pU6Az-FbGPWufM?siBC2N|*>=k~B3R^lW_?DoU z6Ec}whFcp9?7t)|cHRSdTbo1&lJ=%SYY0dPHDRdAP8VW0a%kU?L%Z*~<%j2d;-k-a z{wvSjzUfC_z2?-Bxl5mR?mAl9+U{()@XXi#{Hwlm!~Okm#*bb4jLG$I^ysO5yASU@ zw0}9mKmEgBQ@!+ozx>meKj|4C`QB%~_sA{t!^L(hJo~I?{IA#l{3{-J#oOQc?$3Ps zlMvcPL3JGo3Suv+8_uH;M--EDk}haynvHrgZvyhMxG9Q&g6|DZS`prSk8O4E2cY_i zs_^#MK$1YxVd<1ax48hIcIc;3ltMe%LD${XIq$7(P!YWbmt3H9GdRBFOhz@{%pu8K zXvJ8Il|_r1vXVeU_6k+49bk>HObnjgqvi|R0J%U$zh|zKxQdSVR&FrG%Ms|O2B{fe zIe=+68&Fmnr6V{a)4Q6Ei`*@zQhy+IUdLCBM+J{GPUEU`+vAljZ83`p#WYA%=D<#QNl^ zV#5nCoEdgMKsWz;*&c?ns38JEyF=J6DH2hQYUWhOSVN4ei_RLwO!9gRU?_?J7y^V= z*$Nn1MHxF2H{N*5)2?{-nde+I98{q!Z@KAaL>L-jG&i(b1|PEU>BamO7Y6rpSZgisXy!RoV~{lb^M;uZV$AFS(Ya@~fN zl|Gb3j5Ptp7()>v(em;#Vk?Y|0m8}SC!rdKa{qkGh@*9udd(#SZ0cwEG@4Wr(Z+Xiv{jdM^hfAx=P}fhs z?D8t&BM&_q35&8tbvj;9Um{JSIppM>u_V^9)9WqI9@)F^z_}M(ux{hj+{p!im4io) zTz=_gQ&Ss{AG!a;{A{N;{raDI)8ik1#*H`KI9Og>S=e{}x=|Ih(eg_KtV|pShV`FMZiBUv$pdfBeTEz_QD4NMxnW&n*Yp@J2mi z$Gm{WNGjHq+&lA(^+rV{u_Nfm39sYdSUl{X~GOCGW4Wm50Rh_X0^ z<8u_y(1#@ye%Mb+h-W#26&zjV-F8ykk3~&DkPbT_!Jf27NB|HKfeHi)`hHCzQvRa| z!~7HI6OwqWymie(Lqj-O*5+trcdd8ol*}v3s67iT=HlsGRFTyMn2Xl3>(U`1%T4Ey zQdjL)VKf@YEqF&yye-yIBmER)WJ%s88#v8&BvN2CW~EP=-@z)+=A{fPp)piOI!JrR zsBP)Rh|WS9pdk!UPbdCE+?N$T5v0bJKeX|OR%Lncvr6@h>ygHORqLwU66|LS+;`QY&DSAXp??K~Ym9BWTJbX`>hJXb8 zCM_>@LX?M8B_GlTSc(y3r?;_tuOT?OnL*WqoH(<>DOm1mE<72ZOKaUMdYeLvMI#~t zK$KSpBj_ir;y%@M3I_m)Zo412*nz_NJWY`VOH4>nN)=&5Su;N)z+hfOt`s|CT1YP@ z{r-FI>5Y$7E354gK6cyQ&E3{T+ggJ@-uAKY-?ro6 z;pOF%xBdrUe`#@kacQNhW7+Ku2tNAve|P@__x-`|zw;k|`MtBNbIbi@1l%+|_0Zi9 z{Op^5?hBv&JcY8=Zc(fSrb8|fpSC8ssAR3PMzq%+QV^RZEhv)k5wz;)wTv`)a={=F z`r3M`%AlR+iL6v0rj)sBH8R}>l(_(%uDZ=llN6g_vU@F18DRRLE6H8j%H5)}Sj2?_ zsI!Vncx@7@a-7YuS|8OxZF^xtG$cYHD@T4ON?n(tqt35!j_w?@(WwELjMZj9aiy_Y zK}w*CKI4oFWn_G^zg2Jo`g#K@znvWkiHiO5X-h5S766 ztYVB6h7igk*7f-G#=Vd3d1S}K&-w8e0LA<7zi;QR-9+u0>LJ1E^2)GSU0LaGJ?*rj zZ0$R6=&4VA>d6!HpZUZ;6)+?$2Q@)a469*!dF1lK!V6#e^4GoLjoLp7ZS2yzX@e4<5ef-n*~){xv)AfAEsaE_>SLPwz~O zUGv=^yz(c0;>s((`p82M^asNiz4Ema-PYp#{II5}>GeBz+_}2C++SMlO^g?<0uYL_ zegB87Trba#O>HXLE!{gZ z9VE34;%G{YnAHI-^v&Wy7lEnvqLdyasTXYK8kbt64<)QQ-^#brLd6IMC}e6>qcDw1 z9D&4hkTxYW=q1bR(?E$Hg4D_+(H@`#5Uw_p8JhlUALY#4dXQH?`D9@*qgA z;(3sH!5>;&rNEm-F3I4T-_F*_kW?$I!d?#tnm{^{NkW0TEhJ>we(}G4`y1a_Sy&vbuKdkk|J7gq#fLxpnNNJ~vtPLH-iJ1A-0;TN|Ktl_ z{DSwt|07p^`D~bf{{Q&RUpaE()IWawE3bU{ z3*Yt5-@Wyg+urq#cdy3&$3F3iqT6n_TdOOpfWfrDB2g7KX}l*<1?6f9grSbqn_PEr z@9s~3>XYyLllQ;sjlX==7yseizxUg3`o&*)(vzPQptx(tj?e$mdv3V;s`DTJwBP=% z-@5UJn{U41y0PgEbyWfHc9>Zu`8AYAtQGY`0Px;PpDzdYGtHO)n#!2}_;3ZSFy@mF zHVqUASHnPbzQ@Pr&bG2#L42_bBZb0jw~@=6s+N`v>8c%@L|st1=4fn;Ed1m*CZGiW z#zTVxg`=!&pDywo*BiuW%%ZbxB?)4|h$T0Tu#{AY7PIJL%s#EV)^862g0Wm~7hD!2 z%emoT2LbJ2NVQ2)0L*{XYP|94|C(B-fq8~bemILfQM?8@*6@E_Eywds#*qIqNnzn%n=e0QZQ3Rh!ouxuR1j^2F&*oDY09b zLj1U|vp{l}+hA!x@#wrfQEJITgtwS&&B?w+f`*1G210?3#G!_5TE1)4xp6^@zLIjG zi^H7OxT6R7P%jdPfl@+~XU9;o;3$Xe2scILnFPU8grqoPys{hFL1{s(tle(6)rzu<9`)6;{MB3-CssP4N^&vVS zW!fgyQS!@no|zEN8uphRKBDW8A`ioF`p zOB}4-E><>DZn*U_p{^F-P>@kfOfR=RrIm7E5s38lh4f1VN3io6(dr29i4Rae#^QFx zeUzZwmd&KfUEb~hF<6{qu1R0-?pK(^5VI<=oyq=jUL`4|HMQcYC0YUl>6 zBT=Lfs7I!0X?}n6M0lelIDT+PqPOsDJU{MgncDEgY zuKUsTzy6lDtgOs`>zh|rbq%4nytKT1`?jY)^O?8bbVIk@e%(*KuH9|lf5$EBrzT$Z z(wAIt?zuns-q+4N?+I^y(=Q%4bnpwG`|RYpbpfCr4%V;VP?p7YKfHS1?uTCT>Zfkq zdfEf`51|M^1QdZNKp3BxTv}cPtT95nT}({$VkC$VC{9jHw2NZjqYu}^;ftR4<6r;A zmDB6izv`7gIRyI7cfbF?e)BgDAKLe+PkeM{e(q&2dD;36QZ4d3) z_2f&R^0>FwQpR7A-?XX-*oiYv0HAw z<#|8;g0d`by7`u^Tem&$nXkX`#_NxsoCyU#Fz$`l3Eu;jWdCM{uAh@NU9RvAQ=)ht zjX;ap(G@tf28uGanX#xnviT&`bYHV&Nr_hh)CHRk4ApMbJ%G4tn=APPsk&uxfiZ?( zw+OmMiCGjRQxsN1Z@37))M4+ zZ!C(zPZ`)y#?K^n@2<6p8UWMNRT#?F`~U1C-~aYkfBF}G>Ej>%vsSlr`}NoT>aYIV zul(w-zV3}b{qw&tUbb6v3p2m-yYKkY=f2qP_2!NrebK94d--Kgea}1IapL%i?!sK_~5!;_tT&H*LVNH?@VvpTp-MxI0jJu z`14=+`)~WhRtWET-yerE6s=Iz!!>-35|RGn${j+8FNr075ZezkuDPkggd)mDiMl#} zMdnN!)W}w@n6*_uK)j8FgAQ;kIaK#6{B#11tbi`Mz;p&zp08?zz@s6cgeHK%af;ct z9`WfGtH=O=Y^bd62!V)?TLCWfF|~qY2t_)NMuI_E1c^wDbuJEJW(n^UGn|sC3l~mn zbDafNydBsqz36P{a9F++W@x%X87k|AZnTVW`IMYraOl=ts@uC0N}6+M$l?y2$Y)Yj z6KOlWmeE3rg@S67^{z79k-4b!Q7~;agfu;D5@R5!6DPVvwR2R;c!v22xFbKJ?tv9S z%5^Bdl2=~H4Klmzv02v1;b_#2M;HGGqzKkFo^DNmio%P;1j1wukwwTxYc}e!p}`|W zgwh1-)FkmfXj?Uaq%-b9G*z+9)AXWch@9KY>?n;4^0-f;DX1=LfZ-y21`FnjEeRCR zW%9=q7rDy;9GfNX35Z?hn8)KxqmE#j$G>vWtYr=q+;H@|QnxZk%SNEL3wnr_T8KiK!jtT^sSe0c(y-Eq z6B=T)aYTc_pnmkn;aK|HLLK4+Y6Rdt-_yv|0H|g*xB?4MI##WS5Fi$z9u}=0PEu7= zfd&QDjNO`~Dz3%|7@+P`Jz$2Ly{LYW3ei}A7$ZS}1TY*7kqARU6x(BChmRhqhJ!D#)KW1slve_CB$x#{K`*PpiWHE;Zx7ryLe z8#ZnpR>NzqyB0zLfK`m$vEKF9{qU@F&U)KB-}}g;yCTFRhmUkR<3+0+R#lQf5pYlq zR|f;2B4I**Fd(V`sIID`$B)Gr5A50XnJ;|tHLrc`^Iq~|h*XyCuYCFQOQ%j9K6>Q2 zFMQ$okGpu|<_$OBe%tN0-o9z$md<$ZeINRZh1r?0iLo#I>lY6lI(Ew)cl`c4-gWrs z@rm&XsD_7*90}O^)W<*ebHDJ5zxF?Vr{7;WeDvu4eY+k9eW>rXkvW&CtmTY+wZ>fhHI{V<`vIA?etC8UVZiY3odxm&;IQ0J&znb za;#H!x!nc?SOH8^LEIt>+nK*;jXGa%pqS~a29E-yf^=G{&=J_T6I+4CEhs??x*jQU zFiroi2rUni5UJB=Ge^Y8A(EJM7OKgkD3(OpRJ?2jE1OS#^S;k{B_fxdF%Xcdwn2w1 z+%p|4ek+?R#M8n;gj66|`=QBPoNk%TvCKs8wH zuG@0ge|+cf{{A1{`}Vi)-?`(vSAMb88ryN_9q)eIA6#_Ngr?SrZ{en=83^`R*Zax0cS2HB|v(JYOz1-5M)-c?(`@d^>-#6)Lvq`D^>?Xm)C z+D36%$hwM#1j3IzMi4SI0OHAHefdI}Zx+-5gk;H>-g-iSoJ_goS*}Y&2llnrV8T=i zv8>Xd^Z*g3>B2^fm9v#JWvBox?ozo&?sJqbdyDBT6;^mx{)#G*xCxSxJ3nkEbEH7RHfbkR{~uJVo;9M5$dx^FUSD2&v@4JEuY2L>3sJvOTfW3P!fl zhW@ANrNi9PPlynJu;!r(0EB=LT0v+K9;UEX>T;=7xEjU~%CU(8$6&A$t07+ko&R)gE&Mn30 z9{QczQl<;TMH2ow8$_{xqlZ6;;^u=ZS~+G3UAE(-vX?CzZz2t~ahh*HJ@Vr@pd_yu z2(0mgMvr#_Ry)j6FR>PzyIu`c0Z0=WSLHA*k01h+L_-V}E$+qLm*Vm=6hjO^0g>|r z5SpPDT@?T2?C9ao|Leaz>)Fp)SzWpR?t1~CGuCUj+cnid(C&0r2mLR9 z@$W+Wq>tDa)uG=rX@L~*b%dNM}Ev_uD9{lqUe(;G;dSb8JdF0VY9=QLZR=fAv z&wlnPPkBnaD2^RIa`@1}VXV4io$ln+KYrq4k3aWDsAN@;tvR(F)YLA->En1m;`inUbO0anJCEPPcj!oiL6^M)-53|<;y z8Ip_OeEtdi9z8Xtn3dz#f|$%>k)j!=usV@*aKctsZ$c?F3%gv~b*w{Kw#TPG^uG6Q z+jjcjee}a`pPu^Cr#=O+x->Vu^VTB(X~!}^yEk`y`AL^v_R+up%a!HDKmC&roLXEM zo0^QVf|%y9%_>(O2O$mFowB3>Aw-A(&|A0V%U}5HC6_$@z3+Nkx7+@Qzx-Q(r6c?H z9@)1KLRpTFjZIDtS67Z6JvuY9Fz7EqQBSQ~4+ycURBKrdo`FOf(FuavcPPGH{SyEn zVWc=VIkC8~@TY(F!CP;-;Tg|-_T!)M#FxGFsLvD;L9)zbk+uD3*L~|(sAi10LOQ<<{`qBN8Weau%qQs9F5c!?j-s;Rg0f9Il zO(!p+>;T8;YWIlIuCxE5V)621B{hD2;3=@!~MVdLor>83%5|2z85tLjG z0MQ=_FF=>7!&zoy3X4P-LVCrG`ba&LAwx3+0Ep%@Rrsz*>5`}BFQASwsfu)GqSaIo zndxHqP9FjSU=5~D!VXM)CgN+9E&rU4?!gd8Z}SX!$iaB(JmKN35hD};g~kk-4LiVu(RdFf3dvbd8f#hrt=45L1g(}CB7wV@Cs0FY z-0?oy7-hZF(vBdz;$Rq`{vzgM+7XmS2T)5&`wvzIMF8sw0#Q}Aamno2h)E2R%xlY& zS^6ij5tCFr>^vR$CBuFTL>;&iNmM13MGehe70g)+$}LtOab4`7eMy=XIaj4HE4%@% z4uU*)#@`0EGw@*x3r4T!U_rnSged@^Z^KfLVxF1Dk05S}L`KeFtOv}rQM3W%oMUpe z5Eng==mywPcE(jv16wsytpc+PNJVVU)r*)NtDvTjABnqoWLBr_T3;8TI$w&4&A^ee z!327*Vg^peTv-W83;-Aks{7EN51sXqARRZwGqGEZ05#QAj*SiO{kLlOUB%+TvLty0 zxWJlfFA+ci7~^mOAXQqOlJhD=&lNwp--;qqSrmKs?xsk+UbielRSh7(tAFw}5aXS9 z+*-EV1PBp3Wp{FXY~TL958QJXj!jS;j*U%Vz;35C=+oV|-G2A&cK}3ewa2<$iWQ~Z zIe>1jcl5}SFMa8YMHym6fK(LN>GqPqiz3vq+P8OKK*+qMVqR#4^Oe;DH^FJowN~pt@+adShdCRUbWm;=p&l z7XnhO$0o*!==jXccdzS}Cad}Vp@mRoM>j87Kr z!Y2zT9@)niA_{A$%yB;Dwi3=s2Zsp}Sor!cBbc}a(uXWW_8i$~0L9UTZiaXb5tl7? zm+;9Q2LNXBjwC%p#7%_u{IlV_ZegeOf@^rTDyJ5S)PLkZYQG5wP}JH(8ah^+!RUyj zi?(dR(neoZ0#7x1$nxW;jXQTO#YPwP2qHjM`I3tTXzWIYL+4?J@@smd+pEs^v~=+wD&#l zeAgq7JldU{j4@K=$4pZE=7}+iWO!)j~V~hcdv{xqr(;gc!0*xE_jhtkXO+3+%I;lrcP5IA%WN7gv-f*%G0E;>#H858A zx}~#d%s$s$V(}HWD%}DF!4b1*XC}OxB|cG7VGBAXo&Z3i2t+^>Tdh`%^~y>g>KbAl z+U-uKq*%omGt~|VSnwux2m~lk7N^I=Qsxx^Az%QEbzMUwXS{)hfa1-Gun0)89uDi8 zpspiD#1M)C5ecj`Z6zoR30);X>=xAo!Biu$PqhP-Z^}Fm>JAMWK<*gsw%Q!>31Dd@ z-96)Hgs`I#qY$w)wq1-y4NdstCT!(btJY+lqo5mbz)`U+&urOPOL~cOd8R-9BdJKS z`vmn0?z9Z>GRh>8i6Z|=+zIwU06+|ZUs4MUam+{00CSy|fjRl1u*Z2Yb5g))%`Ayg zU9F-GI+Z~Rgg`;x*$MziUOQ|WcGFmfvV|D<*(3H{CVk&H;0Ac|Mu0LCX5ueBKTObQy8SyqTf}TH3M5#U+gY&^a zeB8gv8O89~@GLkW;Af74q_VdEoNfz z8uQufQ1+vucX^2WcEpUE-?_O&K>~=0>6nDUDG`~;YSL*Xc#ISxNC61s@h~kf8$IIG za)LZ;nB9p^1tpj1(Y+?O9)<-9pe;YnH1!YnT!Tb$2#^TpUxhyMMF~YeAC`#~Xzf+O z4l`TjFAc#ZyhHVzdBlKjY1tQSz&;XJ({+O&GbHN#s_DisM6gK1h7zuj`YU(p=QwA!J%^MF#lQd><` z3yut(i8+U!2MV4CD6zP5oZL)JMDf31{((^x`*YZuj4=cZ2vpZKNN!hG zh@m^ytLq8~ieAZcYXJ=a5ymIRfr#ol5_UUX?Dk@eK-4bFZo5M<#<~ijn3!Il(v>ol zkz%X{tybCYbn3cBgn%K|!+4nN#u^a=BE@=TW$E5KZh88p zm%iS_o?Q&W==sj7!#V?9Kw z>)39U-A$Wf#SymF=^)kJ^x+0qs?HM3WU}gcqD$)XHhlH+pzaR=06iKf^TE-Zh0k)6 zTGiT464Yb>GFz829tf7Ga>;YfWWI^i_xoxH7!Y|(C6ByB`J>TlHfo%XDE^Mz^M#;J zOO)Q$nFjy>^2jg%Nhm)WlQ`seu2dn{mR!q{)vwt zIRP&*qXZo;uCTIlA{ezor1e`wq^jyoOf1dKfAG)$?BPdtzV4^r`0oGn zp4k&8cI|xV(2=86e{kN}XaCrfp0NGQ?bqLY%ZU>w2#dNJQj8Ky2*)dw-rJh4yyV2rMZ>mVNHM`RYMS{ zC`v$zbu~UdF)=Y#7C2n(&(AL`_XiO$gp}Gj=WqWdbB-iOH93~EnkwwBEm*F8Hn70U zPSqn4rM`ON#Jfl)H-J2zAhwU;i3Ju9ndu)00o_QWZKuQHX45+=2 zh!7)$kREB^b;^?nN;UdP*pWF%&#G$4Q$_-U2pA9u^>`~`6!A@gSw>Q+K+xxDQxOtM ziZvl3)QAKT$u`q?i^b01CG%A*MnQd^kRV!-)!Bxx27qr~A`>wv3XzPhvPlM}+pCby zixBL^NC?3g%Br0do<~n6qnJ%G##9Xk&RIn{!5 zQ$`T!Dtqk*O%Oh6%M)HPrz{YOEO7*I6~$aLY?jAHPQDneYHR;wlw#(>svQZAtJT(U$PF8Ts6hzrs7sSQ77#lWD`EBhQ%UKbu#ha_w$sAWiG4sJf}H(sF$sya%m4tO{*1%^memaRhv_W$GG{nd^KALw+u2vF5kcVhg;8-H~3 zO*B8d*eXk^>qrqO$r&Tn2w0?7o^l(gxaE{wrIW-9jCBR<<3Pzn;F=3y2&_5sSPuZi z8YFCmY5)NdLtPJ301~STuu9QPOed!R)HLMaq$Z+>fK=CrPzH=K)^!A+PN%zP*Y3ag zvp;?6(=YFKTR*z`2Y1|hOI1T>tQG4D5F&(76m^6Mbwb!!4cRlqNI)t0sjCVR0)>p< zmi{yhR*+h}jEG%u!>9Dxhp5P6LpXaDXRa=sNRXa8tgsk4#a zNI{-7L+4QlzC@md0?&AIQK5(Y98pr zAMmdmP$`KFZM3u~ccl=d@qsbVfxpiN_&dx7AR-7T+j?Y;nN~$Ir$Yn~tNz5g>E-45 z|NHlU^TTVeea>@#{Arh7dfK+_lM~}H4(Dc$U4PwwTyxE}x7>C+B2BEDj#N{uMG;8k z1zu&d%CO2Ik6IG*hJ)3y$%)m~<2+;cCu=#nR2RsakJ%Xi&( z-yi?!hi<$5w$tiQp zr#GydIW|=kVX#^u7HUfxStuT60VCxLw!b*!(!YsuHE`IFYsDH=s_L?8WB!GNP!d^? zV}&CM#lUSXXy5aPnaU{viG}9g<-ckdQb*FuZKo}%C2?q_10rB=Y@*ffEYHtB?!0p@ zd*a2%jvYIC;@H&0^kuJl`9pj6-*DUA^{{G}Es7CC0io3{dlz4D&eZye6DLph7w6jD zvGdM8|rZ5N-hadvigW^o}x3^=}JEyOgC*4lOZnw%zDQR(R3iq`@Mt$=CxAQ7@Ct+W(LysdD>Qy`>Lf@q^u_uTn!Bs)?v zyte5ffF#M>k_0I(Mg$9p4VyAV@QI24CBs|i7+Bv^TTrs;WIGl~VzAHiq>j>(I84pL zT3xwgFz@=a5~iUdE1Q(&0FoRDBx)m2OA`wwLV#FOT{H2Hp2R&lPKzKQ@bfmLkPs<7 z{w0d)-m#?vIW%+cJeQo!oNns!U{*4ukYJpq?%a@_#r+Tn2?M0+4RUun*@GO3W+Y0F z*;vynzh4G}ZsVm#mxy8%BR6lER2`68>(T8HqP)wLgzu@%jG&GYAOb}(Rqm|^0thv6 z^@bT289@2i52*&}Hnuq0RB%H?z}PfPeyGois2*nwLqwB3;G_8_`|)9e{iunHSooU9 zF5ROARyssp+h~yD=n!=rrNcQdu#wYR^XZv`%930)wemtrto2~{ZzQge2nrGS817VD z;7d6+Byi^J;#uIkC7hQ6gn4R@5UA_)QF;bZD7Kw=Y><|`fv!pqesODe=xse;%16os zot%;c;ZpJxQ$`U+E+uEG8Iv>FG=e3GBytr&Ka_UfWS#Ka1%SBz4(DSd zSGR`4L95+uZEhVub^PmJ{@hjH{QB0@PunoPz9@=Qvom`S9EQPC=!~^{J)oK(BJfl7 zpnAt{z*Z^2vg?!L3nkh?1v>I8zsHR3_JUrlwC zNDF+#pwX2l{Q~Vp9yvBZfNpQR)#{W1U-QOSzwy;C{l?e7ar@nOuB^todi3;dTmSHF zzx}nVzVpdXe<{{=yVWj=GPJv|dHIXZTtEJmZ+&a${zGLbLQ!0N@kLL(=-hy~_rT#0 zin46QNS8nLNpJee7uShsdLXc>*DjyZnestyAD9C%Cf9h2WM|T z{a4=nQ^j!cpFa87orjMh(e&iH3op3vsZV_T)c!*c?>)G>v{JMRXV?IUoJR*h!VsVu zt_CPTG$ly~z_Jb`)ieN9j1Ry);+mBT2T27C02qjh7>6r!7}}vdM#&t63_uj!CN%(N zxuR19`7oL|5g@&~4*+5vfU5bKP;`sVSnc)7DUY-8>5A|DBnnhAC81=xhAU8>cMAHB2e_6 zLU9ZE5E25CSdHZd7QI<>wA&o!aTu93e&Yk5Ni;#7JLgE;Wl#!8XwM!7UjijC?68;& z05ngE7=rFGqJ$NZ2!ptFbx27~)rDFk86f}!#>C`qQN+P903ZBkg?p3?6$ML)0Gt&` zY_Bu`ad5%a8{MmxZSbH=R)!=S;^RM919VSS^@m+efB>PufT`Z$9s=dqPIbt!J=vYU zN>VOxi46hCW-(bzAuGr&l$yHh`WCVn(F&`h_U(!USy1JsQkSa~iV4~vx*W6BQ3sd# zKON3fBc@^n^wDuhKo$)^1p`yc@1eojvH?z#VNmw6D%)-zrRsr{GXYZVjQmiD{Pr5T zGNFYGDau7MBZGp)FBX@}h?yUGfCCMX_7jlGrd4Uo3pvQtfeiN1 z4ast845gJOfe(cgYyVLcmz6LUGAA^5;4u}|(U`?hN*LTTS?M#h)PcR0v?Hmy@Ov7> z;VEi~+>B$4pV}4Th2n*mxSu{HM}u)p4NZ8LTcopl(FPSVpvgopW6x>A8$k|MmRPUM z1T2g8gl}gN!U&yHCoPjB8w~(rQ2^BS$_x#c0E4dtIa(SE$;-%)0f*Kc$HvDoOcKRd z*GU;7)!l9v5$mc3alrrtfzYrONURHFOGf8Vs6cO!0wks^ge=FEzqx1`JNvG8896%$1eByvXdAqk&~!y{qoS> z>V;FF0u;t7TTq|SajBr<9yd3VARssk^$&>|gfVCGancOh1mfkuz$lTSbIiU3K<3TZ z#+&)2NzH)HoR@MLIoM-9xN8_W34DRfG{l)il4y_$BVdeGD9WkLo2jn)gZ|9S(MS;i z%T{-C-MX?>)^$Co29Uai6BgQgR9LP=BoTslQ)rm0h!&$V2?1g~3>c=?ZHN&2%gYD% z?>)F@CjbDJt?}{R^cEl()w<1lW=nhweek!Szt`mvq^YiHfQ$PE2KlRpM|E0UG z{pOdy{Ix?fGh?mk<>B1-uKvNV{Myg`!SDV0uAMu7c-<}CvGKXt`5%Agb6@|;7hd(5 ze|h+U2LiwnKn?Kd!|}&1I{zsbpL6)|VGIRT^%-Yvf9qTS`_|s@Lw|I2H8b&phqoGfqEz@aUjFtXBtTY&-KEZ~xs(FFySbfA0@=?b?0G8CwpYoI85_ zP^&w3-Z^Jpbmq1g;gLOi2Fv}T(~(MaAaNf7LP7O#X(@(oXq7+%z(QV*5q;AQ07S7> z)=`dciu9BOUy_W|&NSm&0})bDtiK3`i!fNkcAKC;25(HKxryx4j1e)tTQo9~iM+h$ z6tyJ)2uSrX*6S|^Scatop}-mn(E7XEy#cl-CrgqA39zPh@}uyYbUTBvzc?p%g=KltfKs5HTf9KW~xlt<`$YMYh96@QlSAhPBxfHJklpcyS zzIWRQ@=SVGLDGE+k%9Ux5S8O6C7swb)3RHE3~ut(Nh)TTlZ&6j9xLFOs`K$DXay+= z8^}h|C*3Vp5K+mWE^y#W5ik@1LL{JATeiif=`$#=C^D&wIdn^1YdfH*N(2a9bWQfFnm||^@oLH#so6PsOxVqM6J^s zf-O{f9Z=jjN(d%xX_-pN$G#|o*<2jgvBgNWq7e+ZBRHIeWj~UV`F;e6@_j%lR^!Aa zG`YSuA-0iQgYr$=*<~^jqe6Fsvm-H!BZ^Z40DVX;$w2;KM088?Jd}G?xyT0Bbj8Fk zx@aS4I!rcT21~p^2PH204H~OysVCj8L%T}1GD|&G#$Kt-%P68WBjSDx5aQL!&a~4N zm+oOe1c-H9Ie`#Edm6ALszswQDCfAc1VHkv3j$ynFc7U)t0!qN57L+C=t83xy878Il7&COjktu8zE3*NZJb0@EJ8RPz!ktv&vWi8h9!?fhU!0 zuI92`k|T)1{K{84GFQ$!$Ur?I2qvatCUjTd)N(awi3|kcEiNAAsQXKhisVX=(VL`^ zQh{zDZtpen@^};+I~udgn2sz(f}C$_=yB6Ba=O;g_caX4z8K}atLOzlqF7hM5Q^UT z1WrtHU7M(`;$Sdv-E(TifPN9i9Cd%$#{^vO$d`rUtf{I7h}i9o^~NTc;s|xDs;Xk0 z4Qidv$Fbabmk$9TB%C9uydh|j#+aW=*jA+HvJoOqtzQoab*y6@ksG4P$-;Ifgsf~^ z#;sCKj6mHj%7IzHjnc^qa0DBaRl;zy9fxC$%1MsW02TuJ>y)3#S7%ven#FcQ^UKrs z!A%crqA~($Z$qZr=*cCDh|nrRAbjQPUj5r|eM_gm{KV z-~GY$-~8Iw|LFbi{;600#J%@CJiE}}e*Q&o{`oha-1Fdx9rt|bciz19yt5YP7Vdd) z=fC~?jZ3FaopuYT#e z|9jP~p{^#o3;vq!@s(z@k8k zF+mnZpt=G;J`@5Xh5}=(i4coWAW=jtC_=0&#H99!5CJG4(QuX4KW_c6ez^F-zaG2g zbFFTNLV*w`A10A0Oo=e4D8G~&_$puhIoq?B=bTD zQ46va0lkVC^B1!w51weZ8>9)$LE(dtn;yOd>MJx!_?0RW2@#5xY=tNtk%E(4|jTwn4he9S0x{B`8A6m#3u zT@YTUp7kb3mk*^5J%dgQdUQUtwcrSQRp9(GjY z)mlln&On~51ik|$Af_OP9+CSBQBm7*M*WyutwIyW4dORRZ*t6Yr~-yg4O>&MtkM_> zY1quAg-y;;aB&_vO)^)m$#*&%B-X>2O)gWSP-fL+p+o`}bbOX6cvW07kn%q&uFE3W zo7Cw^F>?P4(*KM~J{j-)zwB=L=``L>K~F!BUM)c}utK^z0tf9-*LAurgaGo^vh+}b z|3Upn)P(&*R`3{cTAJczeK*eB9Sg-#lML=B z0~0#hFM5?|wmJ|t0j~gD@?Ga_y5Z*gs#tH{Fge+4@19*c?}-;)e%X_k=8iph?}M~FoQg|ZrjTN} z0arGUcgCm3huFptR#%oUy!et=yyB&cCl6lx!)rHAOg!iOO5bEL5V!7pt(_izB<%2h1HEfObhENg~0jnY| z)Jt;vFTX%hs(<#uk$Sn zEV0D)I(Wjf=-Pjyx~^B|sh{3<6I;`pTSaR~h)@>QYQ1`j>S0|EW2@cnPSuMis$rG1 zxIHmRfc463HLT^6^%09m70sU-)D&U3e*FcZbq7h!ko*CJ7A%2=4bn-aZj2QtYKt`o zkQy=wh@pb03mMo{T}=etMvk})Qeb6Uu#Dc9C;@eLh96Zw8#$%<2Gah=`(U0;s10n4 zm;lGDk(=Oo<=jowWvg7Im&KZiY;lPv zrEMTsK&@-l5G9La(pP9PD|5rI!YG!^SzS@$R0v4X`dbkA0aHYq792-Wx(ao7)VD+E z5)9kYC195%A!k%K;EnrPLk_bO2b7xJ6i=Ov5|#)`mggVO^w#y)(Ea$bmd4D)5$MXo6KmU z>>A(d(eUKpcs@$TNFFPKO&9ZP!JN{A@;C$pl1jbYI64Igpr{TIX@@8^S;})qKKg26j%K)u8d(ELBs+nQhzqqD`7Z+?J+Fc041@ZLI_;> zL@sI9)L)L(VjM0~RfS-UwGMJYY|aJnOoS|Lq`=(3FP|s-ft2(Syvu$(Ze|MLODby( zAYRd5um)0~|Hxp)nOIJMXclH)r+1g7Ct?X8fVRz$nqN+;IdK=EdGcjC&S8O7)&Yg= ze^67?2(sK(V+=ivEOWAap=y*F5$Yn@S{#^r)}TD7<(at#)?^y%2XVY`a>&?Zx1_3r z^GjmxsN7!5k=rNUr4!h0q*8`WhGwHFSV%n*Z1y#Sg%MC^&tlrP<}D+iXQDU5u!eTM zP)h8!4ua;GDy@*U-(<*+`Fc`*o>yu8=($x$5+Qez^HBCO^61$u3dwwy(UA1)A3fTM zFK@70m!0}bJ?nUO4ca|~iT-D(uJD0DOidUDBpJKnWNyLe$C6Fn5TK6f7)nn@_7j^< z^|5eKZ)O$J+19|g>_ahkE86-C)#3U$O>+sEs_`&DG9ssuBOZ&#&eT!Mj=+&gSrk;o z$3O9s>2>Rut9tLD1HBGja`winKKaRizw*k{C-J<~HtaZh>YfL7oPO^4Q`6H$cVcX6 zasV_oF>!pk|AoK*~9x%Bl(z8#j(`7;kq%C|l=VbbbuD>%h_Vr*BzVUH#@~ zzP0~>J7KWAbH~hi+qQ;Iry3F>g|g`Mx`1)do?WNrW+!{Cy|>=_@b`ak{K)a~jgybt zx)D0XhRxGq&(RXY`swMFuJrBp$tvmDln&RS)8|uS%V!yL^;8a*xiO`MZ6Y;_q_RhPwKJn1tuFtn( zzujurRZaC6KJGQcI^d>t8{_er|M*%p{fhBtJsXO8<*siHkKT<$Rr|8e(|)|1Ue|y4 z=HcP%k+2%}@Z6Vn&%LmJc;>{xg*ZQ#;7;rRYv`^izbQg9m1l8_Dr!`rz4hTdx+NcTu7%)9k!bx;mjmGGh`!D%Jo33OlI#pm~#|0%BRQq>>002PgWEb>Za=M|# zq=)p(44@o-uO|uyIkh$G|HO2OyxxXv+fw&}hyXAUr6AQ8G&GoY-QyNf`5y$3F@XRB z5vAAMD9elydOwL1Aqm7BL8i9I>_mXnFO>8LQ@I0xl`RrK*uvAe`f?gYHmkLq>?0kE z(Zp3HS!oswDg;uaiLy;b{JNZUY^y1J&Lg*O^TmE^UIdn1z5|A9y`i7FnwI&A5mO?Ysa*ZOIhJ!o)mg5^%VBNj;wPD!^<7C zUoHD_JEc|y(jbxa_e|)_HR&18AS)xc|lDrWQ|mVHCXnq(FF^~v~>q$Lo)ynM5|s)bC5`!R2~LF zuIeNuDd4A4m>MgCa=MS`dCWItNv%F&C`%9NIb1;CH&_VQNb*dTta=gNr%eSxMgEM_ z`V;-Fuid z8d;dc)0M(gr`9|z>mjRwTUG7>8zomk0me<|bRhCee@HyO5Qg%4XT=*G(|d6M?s7z- z&#eK4vP49VJc61k@5CVOI+8W2)g;o{(>RquKzSdQ6hAI526 zsWdn^f6G?Q!;ui3GaeN2Ot?e}Z-xwLo(UY=G8yQRO<=l_Mv~^QkaWB`;om&nZ#+3^UG)}x7D~3vZ6CfF^D|LkE0KU z;K+Xjtl7080%>Cjm@Hh4NI0xYqa4=%Xi}1|8iVM7sJ9b}M&IC39$dS-@B>A7Y86?z zT;`V>)EW>#a|)?$X*&m@V4wB93MI}N0Rke15QbGnL}$=)EvcHC9W6ADxYk0UZ2L~X_+J{Y4f4QI_WlrXHiN0D@LSPw0qMV zH^hkZi>s$*=Gy@4CyJ_CIrPB(@$DNnPfy-=czERKY`c4`9#mzgy}G#4@5j@(pV2pubQ}qV{!eG!peCY5btW+!g^G=(*ddA_WMPT8gUGSoOk_-?;L`pQ!iUJNEM5T7Bs1{-NtzV`D8E#zDW{_RO)L z{ve!Ogi|xEOgb)WXSmCwE}E>t+^LcaxLPiXzr2aEADVRm2pvggK$ zGpZXt)UNBI9t?0p`JCS^w`}b6m*KX5j#JM*?X|zZc>G~%O;7yfGgdzRmf=F!__{x; zaB;X8yRUc^e)l~K58v2+_S-s_JO@|zh1McXZmeM(LIF^zqNu0ORkIoHfQ#hNG{c7l ztV>!4CYLZa>d(HCBFVEDyq$a@_1QEwd0!HA9B@T*K}6{)kwuWE)c^qi07*naR9b^9 zXDw?aKFcF*@CI&8NyA0+C~6U!ndH1d&3RJh3_M{Tv z2HMzt$pTdV6p={Ycq?$5O1}203U@ikdL?vr;?^s9qt~5 zr_1g)DOuzaiNb6Id9|ch$Beb=-_=i23Lmsp2c)dUFP#AhHXI;eSmV90${EL2QvGh& zZT_*`DsS2J(T&p?;kpPymqdW#kxkHzzKMLB1x=JXxeG2miC%Y{xhg9&-C{{=aZPtp z*3fX-6O$kp2_nf`lpJeB*OW$Ookot7#Z9_EvgF1+MwlOvMoh{YKME+agd`e$0wmXI z4R1{Bl&2{vYs(-HO}fS*RFEN|j-=uzb`D@b>u5C6IegUMJBK8VoxpN%3uk2I%@~=j zLFl#m1ByZ=TND?8hz+IFSt)^nJbA}4Ix!X?t|1W~SKAyN+tCB#TKC!GBWMK$5M9-k zQCgk=ssn5jjp$J7mRMT*o2J_UPqroio=cqrM{y+BTVt+mkmyqfr z6oFr%6%}vE4erL3*+8VrU6zQR{dy^a+7Pi>FoQJ>bsTJ9zsSi&Xkng2og z=do2yQ8fo=^8z|Mc}`Hy8xtYe#blCqJORioOjv{fO&Se1SUcJ2H3cJ=r*zqwx=d%2 zk$%@uSwVHLSR~~!oh+FOWw$Ah1%4c_W#vr{=!zZjLaLZDf|NP=dWAp7HQ|unEhfW3 zN;aXaK#0oiOyN24P%t2)GgHm1c#Pm_Lms6u|ENT)c9M~pU!ITSt}#_|R2tYfkkA~l z7AHv*ONa9bxP!|E1K4cIn_jli23DZI*qL)t&Lz&?9tN$n2;3$odUU@(eTCK8OBE;cv5R0-Z z%GN~pS(jb#Q$KOVrB6P$H{R-uw}1x6j~!katdyN%(C^3Cn%uPcq9>gHyyrjdInR2+ zv!DL>3(nuRetmDtX&d?#Ei5ik9Gp6Na(sGS7+*KO<@Cot<$~>7dfT^doS2;Gj(1iE zgLWshT38SJomSEBFYe#7r`>9eb<5K>jcq=CqEq6!iQbXfr6aRT)6?S=FtiW=%2q3c zBAwNV00AQo`f>6+xa3vCg?+`*hr;{8qW~irzDRroZ<`$G-ZTN5A<#>YlOg z8ULj&x^VG@)z0tFeEomVe*OKi+|qm6YoH!NQBn=zj2DMzJw5LK!SYofUVY@Y@t6Jg zV%^z;iXapbVr&g*<i_It|L48oYG`$VkYD!FbVCx?QYKph^08r#W(3k( z>w!cb^3$L}^&}hGye?9vZl>;-xo#bbfa~RYqgVTe-TPo*^rtan4CY-Ujjv4!_KWSEWSrPdbhR z0bEU)y#Yo!-8x1LLXSJnHhoBP7-p<1fOddT1D~nu>h}P-hPp;Q)tZJqYark*Xx?J# zK%*|hQLu*fG(D@Ew+Rq@wGJg6IBO4)MJ!sHk5CDN9AERg* z2nbSObX5TrW=w?<0&52moB=t9SgKV#pl%AO9vQpH%?jEffY$q(9gByaPIrI8ZMM6l zv#7yIW3H$&$Mjf`#Z|&em#>n87m$t=V%`FON7lNPtzBnU8E10z5v7x$jw3*!m|$YG zg>mc>g?Vn%SlJ3{p9aO&N0NIxYe|u|n>-HZrIVM2qMWx+1ii@GYBJVHnN_(fQwUhF z_6R)*;xdZehJYn?2ta&d7>CPJ;^EdIk&(O+eMDrSGpnF@zg1{-uPk5NTQ-4(?F2*U z_xs&$uhZ$Q^j8ZxY(RD}$lsP0WGP_EtO^irpc@$UQ)W6vEA*xB5J0*kOtny6bp+s! z>ktAm3lkA!O!Dlr=)k5$ry`zG0QX2Li64<~(x=wvql?V_n(ipEW~i2%f`F=&S{uht zdP#J4C~Q_76dSh@uqkSX+MZ{E22MG37SyjZNF()EYozG%SV{sRLqt&l0@8O<1EkP| zN!R+VUdU~5NhO3XBG>+r`l76>OC&-19%@@MvjG7}jS3`wvzJ+s8dU~?nXn8bS`cMx%6)ZyXIh4VWqOub22eW?$c3g%h`aRMhzO>LvP(zSiGb>B`7Bw?X7Er;1CW=#F7Qbxe`S-D#N2A4F6Kl&!)2<$ZSY zS<37Y_;t9dLj};5C;igtQWM43LUjOVB07Z_KKe#4-YwomPK!HP%&% z)!mfIy+%L?7*gC1KtQpv-97RnA`!vi8VjKeMm!q`B$Tw1{s=9A2cpzBO7cn)5wecS zQIM*#L=b*si|k7Pm5Fc;G(Z4|soQ1HUkPzo5cI|;2HlArd*?Ue;msS`hfgf;-9OXo zmaP^XIDBkwVF?2sJ9=bpacSL_GfwR&cRqAvVQ#ix!Oj!Q_3B{L<_(8V%p9Lxzycq< z|H0$OPn>_@c}M5Buk^O={?Wa?_2p`RxbL20i_4u2lfBhp6(AM`o;Y!A$3qW2{l_lY zdd9ZdBRlW9{}2!im+G4z*xj#SvV+yI-)bWbY7EGZ36nppp^mWbEL^v-xbYu{w|=2| z`0mb6zXzZGhWM5Lh}{kr0kB;i?N^Un11tB`dnQ&M`ib5}mn|RIJ9~0Ao_109%*R*N z;{3uCo^jdA%F)%EzKwK>PTjq9<82$yc^uq+&EUjhwf}}t@1`Rw)vdRVpL;fxEi3|c zC!l-I;OI=4K7H&pZw>9TKDs-Galj7ZfFi+gsowW+b^m7oH^!~!oH*WZzxWNYT3J4F zxHG+-;texLW_!>3MU36S;@nbAu=&ZuFc|E(D)f(1bu`S*1}IX^OhZ>yAk9K8c3azy zFj)s_T&;Vqrp>Ass^a-BaU-fA&`{69NeT0mQjHHI+R+;tHWPP;S??J58Plm}*$+BJ zR*xWym-2%}8tT?ZoMDQr)kkY3RbN`8r=+tlM?`)W&bJV zH5k&tksy@~-D*KFCE)^#C?yNoqM)=GcE`ag!BRs~MaAIs7!gBJgt81}5kjCyG1ify zT$^?Q1Lc~L=;C3CAU&?h#jFHde9WX-S7wX)ImQ3Xm0C@3f#~tx`z+|CC z61=CuM)#Ua@}(w)iuH*;-RL2`Idv`w1CnVfbO>o+p3E}sWaYq$AYCNcn$RnjmK2HQ zsCGeGdMBBL95V?ZS5D!A(U%fJ9!r!;1wHyhq`K#dt)lKg#wIpHLZ^WWi)`O~Q`Wkm zauQMvGGtATIE?_hAIK!C-Cg-{gjRx8Hn%2_HYQHM+&9aSW}@&C2|kD}LZ0EQsX z8nh3@Q^*Z!n{KCDZb6?vdC-RJ7u4FnXp;V@bHxUc!U7P!MSMg9`jMMHM>B%P z^*PnnW=B;WYpUl?ovQo&I>Pwabfos4qbtxJ+pvD(#Hpp@#}}u&y~$4Z#Ic2y#qRvVV6{K&4+bZX&m1^%tks)5|NIN~9G<)5?t>Scv+0a8C+8Li z5zA^&SF5W?5D9C7nh1-)7D5120|um4xp)d-A0GQrIB^Uodr;SWKzplKm91Eh0RR-6 zTk9r@!D8&sg|Usae5&4mZFR@j7H_{6mQM|;sdDQD6lcYUS) zkB`xwonuuW!p8Qq{tI?C#65S@iQ`x!V28p)F?9hAilRKL>U1a$M2OL>8~`ks0|05X z2IBG=WtXblEn-56Ta&sqBPjz12cl~v3GxNgLe37L5gAJs1EzdUuevr6+cH5IVIPP$ zC)7VkDgs%!E(L9^k3jUXD5Zw41X`-43>qXQTeJvV z>lOUpQcaSBUW%BRw`^0ntcKrhM?fJROu`#*5TkNUc`ulfpoBPkM;43JQDq^dAQbG3 z7rov`8U}A!lI-S|O=@H}pA(ko!EA-3ZwXFi5Cno)SNsBY2vV2faa?Gjy-ZmU2DU@Q zkrV%6)bjR-#yYl2u@fSYC#e|4t11G9vQ_r``YbI%s)Z$==G?Xdvxx)bh_LiuGI0w9 z-dg+^KH$e(#tr+Uk-_q4pyB11l_|Bes-QX-gp4e)JXDrtW}8Y7EMYE2BBYa+^-`zg zx`9jp>0$TidB$I)BrC-gWP8rune*((&?9lB!U3O=&Vhw2C^+HBFNo4BB^%19O!wPq z?07}B($`kbMR%}{Dy=-{o_7DZSR!o#+*=_>9RTVi_G=&m4FCi#2)Z_MRg?59pW_4B zk%hpvXCh&$l?}x8BX2U8K@kARyPW|dMc%g&E~c$neu0hfGJP%uQn6u7$87-QVGlD| zNYI-=4Li961x?3l`J8(e%qNgU5A3=uawDP;_>nxsM0w_XQP>(OqLfk`Pf-*`k5aO- zGIJCY&`KYKylFuESw5cw;q)<|c4s)s1dyv$pf9wzA4H(E$r?glvL{5W>w0l<_>%G@lCW(vT-???tP9dJz* zYB^x1|A0dh9a)G(^?QPSLM_jc_^zcJ15!VB)-lR5MHyN=x{Tl4OcwMtVe%araOwM6 zNSN(;6;K7K*E61469KA(Wy$_;zJgF1P&hou{4H7AuGqJ!reBh*0^}rMl6|{obwGT9 z+Lhkuyl*xxuiw~ct+q^dUYqcPS$vf{e8*F#m@B=bt z(FBx96MusBJUNX*b7W?c!V1qF7pxFuHs%|h1-B6VHBRH?wS}N9K&gD9ACBDNe}enk z|0Hjr1Un@VR;#o~9`6U>z^EvSvfZwR!`0;_FlHbDNh5R6wMnUjkvSLj=#SHgq#+s< z>Pl3m=?_*jzC{@X!0tS=3Vz5mSr}<8E6CdIm4kA75H_b%4#nSq0~%eHCLa`1^cBjg zs$xAna_Hz_b+uK*AA9oSU;N_dK78v9I~P_L4h$cfAIwL(@SM}1aLL*C?L1h+AVMUh z<)!7iP20}dTEpz&{d>nwo1k8+v#y1m?#%35-Ct^NT(`8adUEbm91bQ*+H(HJR&nNz zT?ZfDJ3Ra8XI*&qwq5%N$4;JHSYB?m3#b8$R%dMd-1ED4qr{1*X;@O3zeY4B4 z-P?A-mb1@azw5xkI2Q-QNRf(G!5xzrpbT*QVcPd->(bZPZHMs0H*_~`sn2==Y+5(?&Xu&fQqKJ~(JI@v%%M3f_%)Rx?h z=J-;QBDsgS0Le7~(y_8YdXGEL5P=W_aX{%_<3Nob4g!A;q8N`{yr$hzgs7KEHI&5Y z6qYU8&4x=Bu1%;M8l?M?_-qZE3^+Px5jX%L1d7riA_Terg`Jh$Yq^77ix+kXtMCdM|18MR5oz+P|y0{fmB4sw@kp4i`wa?#g_sa z8^Cmi8k7^Oy?r|hp<3C(A98KEw7Kw&$dDJn>z3qs>0bI`Sq^En+H zX7ac4z)Kn(9XZOzhADbAPpaxR0eKV!XW@Q+uL`R1Bi<_ntcHW7MH=gM+nshKs;fF3 z9j*DPGe80<8>d0sHZ(bYWU?nSF^3|fz|s^)1N8;rFuOHtW_6#BmVtcY<~}1GxBPg?Kmw8L|#Hj7HI0wD1#F=`3n-vqUe*1iSocyqLjBRkkjF;L>9Fs zmnEq3xQtj83Yy3&dA4ZpCll5=NqPmAZf7a(2_`TJMCmEorrb&41*D=#01%}#-mq_{ zYF?F4%jel;i2;%cvu$fpLibY0-z9bRyq=;6OMXtd2i=|nfd$xtTNao2`_@QgTv(GS zxB3mtJ_gACTC;ki&EjBcnNJFk(i3N<=KcKsjTb*?ebfVZmW?R1XF^nFBYQwGpnN4_ zC%mpS7X&Oq8L%jTXgCC?`}t4*_6@fmedKU)Zdn3t*}moQLA?EzhfnT4@bJ-vJu7&! zyZ%`dlRtLpW!GPS!~D`xC_7Nc$zHkcywg`;@58su-F)w{YaSY&HGJ^w#Xhw*EHC$o zXxJZ&jZdF{-Z|^1CnLc85Fb6Y^6BqBu>aV?gU9=WUhnYC!rAAno9GpT!OFtIQUF8@ z1T{h+D6rEDD?5ib{sms~=GNuEhV8g?!^h~}Z-=pQiYpYWIwB1R(3)yJ{Woa>``3M( zc78v!dMn@kXz$4{FHYZDPhfoD>-F-(aMK5H>UUeud~4aAS-tiX{YSqKr@t7ME0{dJ zIO}J_wzH}SuZg#P1v(SMhwm(g3v~3F`rH3pKKqsB_9vCF+~4{AxOA{Upt{Dm5RcwX z$M1%?TC`|*-`@__m+j}j6?=VHdGzF-8wfWI9=^BtxTlx(B||#3dSV|`yX)_Kq*IL+I*+X?i?|rY4lVRK~m&un1j*>V1XOq_Za(5g;HU#cEj9!UjyJDoYY0Yfm?hHf#2niHX?2fBIszhQ(@??}Ko{^N8=ia`^ zFD=x>z@w5AwRKAqKhMmEiE4e1ynQA>#H8U`J0S5}wn^%XEjFbLsWz|1%Yx?r=UFA~ zMUHp1QpCr&L<~3_3>NFE)9IG2R@rJHl%gsgRvajTsi}gJxcp|Jg@7mufd_#a}HWoHY3rB5Mbb;(X2i$Dx>2C&Y;2H^uK;&YtrUWK_Y1`x&f^w!&Hiq3B#Ngax zF!@^eg6v)!RXw~fd?kqBnb| z0Xj#*N=**fE1`SK2>M6%0l*$wCgHjj&8?P&kl-`xfzvUAGc$JBqj;e8V||OFal@kt z`X((7h}Eur7?3pri5%H~16Xn&n5vXpG!hqQ%>)GIu#kXaUHAL_su}>NF#sT`PzE*( zC+WDQsC;-#OZ7jx`3V4Il0qRitvPa%7t_;bN&|1gV~kNK6h-lA!H8c_()4%%dnlA4 z43o<=>F{v8FloVc*c3v)zj}Q3Ffp(o2?)ANu6it_=rgUiHiij?T>Ab>GaxM_2B- z?}4BEFR$Hm@W_`w`Ki;+IrFloK56^u>%RV(Z(j42E6=FsF2DS&@iSH)+&y>K4fk(* z{1ex2+;GtoE_~#HhadOEOJ4HQ=kI*@!7IQ1?V~eu8@H@Gc5H5Gc42zFm|Gou_v*WM z?>ex4x;wwLG(R_2mH`M;K1~n+%d%6~r>-6T`+e2c3#mU#M|YOJHpO17t58#Hby_f2 zU;F1vlQp%vwEy~6r$p=zANbp)z1I|zW7Xn8m_1mwTeN&rb>&;*nNMF`Jx)g+XqVNn zC|YGv@A=;Hk8Xm~F2tkv6vZ4;U48qHsei21J{2GO>+0}z^@a_r^ZW7Gy`cmsT9F80 zesKK<Y5TjuPajrh`nfj_b z2UAn=)Sg)NLbq3hTKk$+BP5zZ2QNgd&Eg3`-Y=yu(qc2Swr){&-53`&OQ8wolO{CD z$NTqZu1ce*i@QaUB#=7ELBt0@9U_Wb2kr0|> zvlZoBLNlm75hSKzR?3UHI4)G5=aMV+kLrC% z;vFO)h#CVCL_P3k^y0IKV{)9DmtyRPi8O7ZCOhj}{} zgf*h8OlfW3+^@wGWgwt~lMU`Np{7UqfB%qDsQ;qv0VZ}uPmTLk10AV$YAp$x+W?kQ zseS`MR(B#>ChFTaeAQNV>iCI2LpcQ%axBou(;BrTs!U9i$N|)&iqUBMfoLV0OwvXR zGctxasrX#1fqaskVlFMTE(*0yrO5F+gIthZOQ%Z4O9268s_l|$dDdtXXmt`)d09@M zTEm#3l4*mjMQOA24<%-@rHHRm`T>9_qCezPI$x#Qh6WNG7aP~5fzGW{9?~L?M_s|e zmaIqRX|0}18L~8`Q`nP4ub(5hugEb_KuH#jQsywNg%Le+0lgrc^8)}3YhY$KuVs18)xQ3A{%`DwovY*;p&l+SB0yfrxq;*@qj#o0hf#fGkbF&fOEa zKM*7OHHdbhu_0S6^CwXye#x&803f0#5tShsDO}O_DkS4LFV$qY{J2H31A_cIZ?k-@ zeUgnSS4#b5#4FS>*0HXts;+8CCwDaHk&OmQ#u9)Vx}%FH*TS$Sz4;m&iv{QT#Cfx} zX`Gam6!~Vfdy#Vu`2&oF1lk$wz`YUvWn*LZyK_){aV&~Z4F_{4Pu_Ru9pC!WXCK|O z3jkhs#l>&=g=Y=sPCfkgFFf?*u7^EAyB=#xVU52zMHPP>Z<>^^Np9E z`P?hc3~?|seB_Zkj{NX@Kb)AFuBsZSsQQCr$4`F$>Kp#*A3k&7fd}9F^Oyh18_(Xq z^Vk=Dc>H^N>!s!SsSWGSf851K4xi{vOx%3q4Od_J)$6XiZaJ2xZRoxItuFu^eC%_# z{P_QxB`M(`oL^PyO zhc4jw!QuX!AoN0a46qxKLP4}}XFW$)cGE2w0IIoq=aty%mSf{ZT@PWF=1zvOA)WXk z%-#&0PH49P=JC`m5nHWRiMRqMz72;fC_7V=tD~t-3{pbGq+2M5H2`3&MQn#tJe}#0Dz%xiqH-HpTAmd(k{Jh*GZ%zi|0U8Gtr}@kDYMZQin(uKe79ypP zjGB0ZnO^q8TPTqf2%JX%4eKGXFzYyo%m~iPEoH=LCt`b1fizK3bg!a;#JIq3o)UBu z;)E(8!c0vjU;?#WKqNz2n^qfA{*oV7dt@YtO=pWrg@Q;Bz}__jAWb0pgK~Dd5406X2AC{rodjs}Q*VQ8nYgH6 z8fso$vBz&0r|M2XqB!WU4hDTEBGa!%MHurB&C_H*ZV*)h65*P}m2(Mv*_rum<+VyH z4L;aPq4_Jv1M;Wjt7a6Yst7>YL%LxUokk$mFP@rgAo0cav3PC$+RVz2Vp$JnH=7#B zz83l~iHX5%u`cU0=n>#_$|7&MK+`0U;H?3WCIEyWrCM~FyEd<+j>ledB)7BMP>mZ9 zk?bLZ%fp%41VC!l@Ztc!~1r8X>zL^7{EDK9)8O~k=VEB$Kq zJb9Yj`VqhoH0zO2QK>s17h9O>Wmav-D4?p4=HLwt?a=sO-cptYxNMMk0Q}i%!s_WsM&V z$1|4#AZL5{qBAdqL#>b>ETsf0cb!rIm*-^(vR$D7D8q=0G`-ff`ZZ<#DDjSpvRs{? z-?exD^!kn4V?23k?!E)3{`#{wZ0^E|rJ4eC$9q%jHb1iO#LD7q(Jt@5;l@8XJ{O18 z)M;CeFIV6Hk4MkgFcu?io*G}J`rp3z^&=-vloP$VQ^)`6FaCD(8D}q2x&6X(kIt@M z^SwuQ?>V*SFkm@B0LPBb&d#5Tb-3q_dv@ISz+h>9Y~AL1wSRPGcE`RWz3JZJ`N47x z)0?NK*H4~YSe%=iFUxKezN0+CN69&MCd=MBiUd^0SVL;f40Swk!{CSAFkB5|8=y5# zRllMd003KI^7ItK5Y>?gAYi8#x*GuiVqL`wmUa!V{s_+P!^tgJlt@FO3IMS;g|V)v zLMm{4Gw=V^H9^h#9*WRg2NbEU0YeQ~w5E&B2EqdBs-ikzJM<>P7!v2rv5pl2g|XAZ z7*VVtm3iw*giqW;z)FCkfe!QK3y)xYRwkK86#q(K_KA5>QnvcRX%{fB$#%d@r7bfh zsV{nS$U+GRA(Ek^z&7|FD4`N5X>L&@ zN2L>7Z68foTsTD^UCCOB3&uoB$p6 znrE}3t}L(C6vxNM78e&wHY2R-x~i(F$*HANv;Oo!@uKQ|Mcrf$y+FT~A67}*#BO|` zW~0?E{?-=~(;fMPDQx4(1*Sq2J6hLoq;SLuu4Z>S8M;K-hRZy%6PEPaH8|w# zQ7lxqCdv9!Ko0zr|H}9zt8|J$84Hw&!ij8l@ZI=iv?&RS0J;wvrsBsiwFQQva8}0UEmSe$iaaDDq95r#FRl;EnOG- zWTkvB%B2cm381aCIaOBLV(u6}o%$$SWyx{^QyRooM}&_yfDO~wuoqip2^$uNvP`~8 z7OaJjRNZoXP6uvBm(OEkrN$ow@P`B1cj;IumJ`S067>Mu<7edBe`KXDyEAn8mhXdhhyR({+anB(&0EJnyF?IQ*u!lj`n+5EPF^J`KhX|j0i4?9~ zWmHsFE&;<~u7OI~UP*;ibmFkk${%S1&J`xq2GVGvflZZjgdpQi(o)iB4hYpBWX{Zc zFXkxbdXSjt%m?xx=OTf1-1a|G=_f#Xpb~APROd9e!d{cW%!CLKLo#7Sdbt*C9C>1c z?{bSkuN~lgQvfNSu!UzAxZulup{EXWkfyOJK)xrddpCdp5%eq;KtPOXpVozv{^i?B zgp0O7+94$@;d`h~g%1D-d^q}J{NzF->+8}q!?`DMq@qG(JT)B89D=MQtE7{<2GX^z zfxHSQZ2Gc2VVD7+00&ahOALwx0bA|%z5|E1owa>x%eK&+Tw0j_>(Ac~Sk>+EO{Z-r z#>XLy&CbsD2Q>s-nLoL2$Ag>CId5{~`n`*@pT70v7#&)IVi{V)dbl(g4u-1`V_6jY zcRzY^Zt1k`rw=;4Yj-W){>buh5SPpDYNuZAuO2>p{N(W?R1G7+*!1+~GtX-gP4$U$pV};P_gabFlJvY{6 zJG281R}j(zm`DUr4`p8+d8a2<09E2)C_3eEroQu2)M`UnBMnocghW`aioHdMm5I@} zFIu#acwR#t0fwN?weCk1kMt!#UCC2dfEHb)(Yd?9D+^ed;M|5&E9V?XJW3O6HGnne zK^peCo%>7!4G{?%uMFU?383+OG=GDRVrq~ML=9R2cmtd-M8T_ULqU>O=O^6(%Hqu& z73OyXKqTi)Tmv=m67rilkB{EqA9g1b$d{5b_7VlH47HfO2?2zCd+cY8n8Lp80Z{RF3N|^Dr_}(THM9-GS_( z0tXy};c&G-9P5o2MUl>uO;)tJ+F!SBUD@fxdI-TEcCJqXfM|pH`#e$MI+N$G{G;TH zPLPvd;o4$nhD3UbAlKe$hOQO`d(34&A=s`?7nh0$wEoG>RO4E@X z5J;*p{xTy`dFvgl69M<~iTDttV8s4Re4(CV=<6dSL(68boT9@52%>o!sVTLe(iBeX^ijj6<^Wn$)vA-Nq;1xm!28 z*j{7x&1G2|6Zq~LBg`+#TS4}T6=<@{Mkn*Xh$k2^39F&FTbst0@rkm3GwSm7lP!tz z>*RA!A~rO0Eur&IBkbT2sCk}DgG5yiAAdKL*k9LJQ@S$B*&zNVRx--(B5}_emBa=L zG(#%NhR}JXF_{1``@&e^IH@E#RwpOxL4tAy;bT}LHvZPn0RRKHYQ~t}W~qGyqvOB` z{=pg&H@D^%F)D4B9J`%Nu?D~W15*Db`NXGTpzVb0b}aanKtyWgl3)-tAdaK2NTDbo zRtNVUm|C}fa&ls9-6o{z7-K77jJUF}GBrm#In;ahf8xu_6--td-HAVg`$n29>n>jx!L)prMY>aDijzf_7~?5 z5Bg)hvGHEFoZh^*9#UO*rY8D?vokaEb2C*PL(u}NM}(X-nltafeY9L~sza;j0s~V4lz(=iUX2$FQfCv$Z1J9yR zDk!GINMxM|^70m@rxeDJS*1*z?MMSl1-U&tnSBzCbmmdMjSGAUA|M6>OdcobzBmUE z7>J^;_aGC;-Z#%YLCJ`UI{Zs^2tvSsA*m-uiWFl?J+)YCdo{uInMp(Tj*^5Dg#hU^ zO(tQD?Gi*JLXcfG%drz`GHv#-J^F(cNL?OquZ<5g<@!3-bBjycH%|3>-KFK#QrJ5j z4hMt5rY&2J?A?u>u{>09K;RMpazKs08t>gqQL}&j_o{znc0rKmRU^d>n^V!j-M+?U z08-p)MuKds(D2>KfK6@KGIiO+-;jWeD?I=j*HixH`W%suyCva=POJUa;xd&Ukub2< zfWJ@!Whu_+2+lzYQh4w~yEKzV?s&a?MR7cKqA^e>l1(1g22jFD>M@2#%-fMO{M_{> zY6WRhCJWiB)R>{O+^f4JpmCHB-KEh&K39}QMI753YABhghsB}V>7>Ol!M03E!~{u| zM-hw~q9J#>vV4usW!^ zI;ZiT9s-VM(6IyUc@P)en9e%=^x!IrLEfrt5d9G<-GCyTOn<%0Q06FG-72)Y=h{8& zE_L51i$;|;`Ffv0y>N^e7Ww;Ru3D=Ub27&uVpPUx@L^h{D{`(-TU3ZNFOo@hc(r?D zglIS0CNENE(MVFosmKn3HS&}n82R7^5yjB<8OM5Mv8~L>)U?TCGKg9TPvn?rvVJa< z^Ai;;%$Wd#67Lz2V|cE^naa6cZQ+MGod%E?t%xY?LXFd)j6dGLD||J65pgN~xkt|F zWtgsO1d zvMjKG0z)LI>#DAXRZXENLQxPvUDts9;lf~cX^H(Grd#JTi*Xf;IL)QW9R;BhAudiV;I#FKAULraiSWWzLD5rxc}R#OILD%tz#x9>)o6 zIpXzs!O4`p#wSt4g!m8w7NLMp00B`QYZ8YY08oM|vBN}x(_}DJK|tMJwb};rD|1G~ z(lDoHDo*lzM3N<`n?^QN2}F`E1Sw9Tz7s<;z%<6<;$pRaYHDg~r9Ti)is|!>8#j!t z->^J47up@->A>MVK|{keF>;?fE1*WtZUbf1UCY%YEEF!d9BKr1vOmqE`^Y|9KM0o8 z1Z)m5o6ztB(nDEbwym_P4r>1<-@%?qQwYn+q<01=0P>kM(A<|nO^3}klm*&0i{c<< zd^H4_-O6EXebJJdbZ)t`UxPiALWVi@42vzsRmYr0K(Q#z2~)!>fIM^oNqa5xF;@dZ zhxmY8ur7r~caOP01rl3}7`@|(a#*BcR>p*LzLZFlU|7G`=>?=X%wYs}A-Jbez9oQk zvWovwk`c1G67w`s1k{9G7p>wYa08kxA_CbVPzJrdq zaBNA}n(Udmv{n>D0Nng#oI?GY8I*EaadJ$GqO+-xaZ)E@Tg+<&4Qmn>xmo}heH&}C ztCdVJ`I>hUl*a7)EKV``X^q+;08@~8ZWK*b#E`(9Z*#SbG?)f%j&l~Zt16-~6VUjn zdM*CWNgI-S06_%crbrgDtiUDUvilA$iziT(Wra2k&=}Y)-2O2W`s?HVjbb$-zKF}BW>*^7;d6}lkA5G0E@bJ0kJSqaKL2CFd` zpxa_i2QzITn7T7+LT%FukQX&EXOJ01fJ~L?Nj{&`jvi18m z+iV%;Ki25eB0J5}=(BQ=caFJ_GH*!2dIat?(b75b`&6Z1?+{-w*7kzE{-lE|P{~lB zt!fBV10n{%fQaerj+pwDFg2AU06>hT$d*7ML3BFNL?TXJn<|)X80Nhp0sLROC7HMe zTuEipWt&F|+hR$?cV-*@3Lz*%S-=GRm@)=L3|JJY`~xwjng;;LBQOBKRR;o)b4;5i z2O=Io-qWl)3`&g8K2=-u>g+c}+x#k+L{f|cqhaEm#AGyne zzFDG-G-_!&lN-YFXgBPLpP^(8z)2c2SO62U0j#|WBqPwO2XQ4qwtUd9O{N1`hN`IZ zYuH$r)oooi4lYcAj2)^Mocr+lg$RRUjpPXIu^_iHL;CF50-0D=tBG`4kIv>al#So* z*=a$@Vi&86s>AW?B33?7edfRcOiDtITw?KyHsi@wn`{wzveDo$-x`$&q)|fA4{X1Q zq(Ok4ysK4%^Dk)kVg^TA`X_UE;2zBZ&7F98Rv7^lBrDFHcK571E?hbVH;HZV|44 zmCuGc8EOk5n6qW`~(AiqXAeRec&O6Ic5gJMc1nh;pszA14 zQyZ@{Hf(dPI3hCwfk3|!Nda7uNKiq-HPYr^StPkA8WfRu0%NHzRLctBjK^t6)&mQf zN(d*2#j1Q(#0D=8t4NElwpXBhR1uJpW&&ucaMR3Pg#~oV zOn>YY40U5Nm3U__dev(4z9I@+wHmZKJ1$1Dy$d1`ug{ff z8K+^{Yco%*64^S0c-7k+Bgi;z5x3}M7H#-|TyY?aA~H{*qRZ7$C)c$)0>CM%pi;`j zSRcwzq}ih`iug)Q6sBirFr=g{LgcVM0AjGPi2%~x3?U*G2#_9l4v_Y6V?>ZsWl7?Q zfMwA94+)TBL}_hP4QMpbax!FS25!y94)2}at?I)q2GuXMu5WCWJwv@2(%Kt7SK?+K zH8Z&^At0w4^67{U=CLy>X%_ea=%$DYSXJC3F(~DjaS`=;tA%7Fz+;+6HZ)(X3|DuH zAoOO=1s&Rs#tw~v71Pnz@x=(`Tl27aPaNYb$L(xcXksKq8#NOmo68RipsvS~HeP`^ zN`eTnrVzLwNB~5fA&LM>$-G4ig#{5Pq{z@@;)+WS2LYsV;Vu)WfpW2bnj;5##a>yw zm_EvQuCS8$r14_2pG5z1u#|>5%JmU>3j~dC&rqBR=Y#WUJJ)MBhuA~HQgT> zm895jDxmh|eTn*-)F$K58kyxjoUu?xwhDOx9RAl4PR`72m>S=(Vg2DFM@8=l0GC%* ziULnRoF$!IFMbKxO8u5Xm-L3=MS4s&&LCz#d#Ex;3HG|+<`b- z(qJTMk!XbzUfPln?xFW(s)UG;-ckZu9wi_-DsD8{5WpaCjW#}wv76u7EHyjZwMmeg}wAa4WxKlM&S;8dA%um4<(e8hg57Q0fn_BqsT^t znT+;;6N}!&ZE+7!0=H~OQl9WIGNjQ?Czs!oa7;1SL?i+s+n7S;E)qdNj0u3fv8H!d z37RTjj1oRsMivZ}B)$Z)l}`YK1psmOkpuz;q#1WXdUg2E+ z<}j*&;0GDwn%odHA0e8A4_V=?q5Roh@~t`tMJcVWXXf;nLpecV1}I?4sM_dA+oJFFMp>ojbV-wid5GzgcO}(D3E}IH^7pJ0C{&Ct@NNC zS=i@dJ8?38c`7~EEs{Qvr-KAz-Hsw;XrziKh$TpAy!5VD6ONGHPm3WG7-EcdRZA=d zfB}f#3jhF^4hl`?tuX+J(!2f=B1-RSk*}0okVYGG7qSku7(sbij`t-_Hd2Tta7S8l z@&{b;Ql`rE;1aCG00U`101(YFoaY! zGyQ4)uGLYuE)8Ey+wB_RP_W9X;+zf2MvY=h?0(2&B4NS;Js}9#0D^X(fh6~Whw1l7 z1PB4W6G5*AKB-9driq+*$Y3%P_n2kJqNXa#BqTk|$ZD-<5H03Ofc#P{R#Ht@(W#aT z;sKD~D#h$dUvL0HYTFV*am`-X2zpw(See4AmM_$tRDVeSHF=Zs@~Tc=J5)WG2bxuh z>(It*sa%=&$lSX!LZM9XM5xpSXB9f7N0wsOYocf4t1qxZq{BORjWa6yM(`NjrWQYP z=t$zgD_fmvw5#nR=TnTLs<4h4 z5kq?Mq@jlvtr59DR?8eB01~7UlN939Bz;bixq`q4+DpHI zdQ>oFb%rWbxC%WgX=^B#19rYzL7PkfvM>aoXnN^X%A7l!8H$S{H?8QEMdJI@qdzx*G=aef8U4<;fXI>)r^H2X(XK>*&G9p?d+QweQM5$V z<*V5`PG=LCPXl?a?#LQl0KiJ4#XDB;=KB#?JJh4`%Md{m1Qu)%5#+UX>+|xFyki4f zCAoVoW&nGuuyRv1CL2Eu=2RF}e3kp&FW8HU8Df&qicA(|GS5)c6YUy9^n_(-VZXVdG6F?{e32yY z;6=fOO}*Yo6>rRatDHpxPcv#z&7Uk%5td2Ro;Qt}dz0~{>Jc=%NucFoQ6CWSO<)_e zCJ^NY8wDcRoHAf~M@5W;z*T~x03fQNL_u@El)$w>+2#!>h~OGG)`BV-$zKMlVqQy8 z9^3FKkbI+0Oksn^HVptFhN1|eNL-~lR#XEo5)gxIrf9^$g=a(n-J|eo3yid>drQ5x zHWRDGi&Icv@74t(OMUws>nG19@t+f<0ThD8l>~Y^BR38y+c~d`7*3sUsbg(l~hb5%|)h6nP$1`nOpz4eXRK% zx&JYr;XgApY6?cl$Pg3|A-%CBG7po*x#?J#6amu9nvrC~%Ib<*FKMnqvKe|Tf|WnU zHM4l|Wo0SxVR}OaW4MHu=0S`I5_a=nqMPo(VEF& z1FDFVT>&<=T!3_F6$n^IdzHJ^p`^=;4{egy6!XKXvP4SYAmIf`ZkDE!YN4}R1+$QS zX1}O;r~t`1K98s1M;7BD8!^g2N&G=Vj%-`gmqBO=<+nXWhO7%_umA*Tub~RkpQyOR&viR309iDNbC$pr@(I~3YT=J; z;4G8`XKjv|(S5C?!+-WOVuBvTHATkYRRTPy8ngL318%S#@kS7lRd&I4=?J7m?q1F2 zjY&9RL)zXOiu)$<%fYE9nQo4dBjY4v4H>81#3VMDLV0(J05b>OrJ0?vgCc^OVvK(1 zksp^9B$agBRlx|vxE=sR3qhFkR_@Wn#Feecjm@!oT7)aiCk;folQiK=Ps4kI^*M)d zMSoMER+j1FGsi`K4MwnNGBwp%6x9Fi)YSfINL;+S_gfhxWvYfs00}zL>t9;&qB81w7@9?E0C~6SWdRNBndE~lt}gII-vaRR>mpLph4J$ z7XP7n9NF+gQ3%k5uC>u3n`>4ObxD!PR47j0XJeofX0{c>qjQBIQJ990ky3vMA|jN| zK71!s;trzK)D)d<(@6j)qbCoHtU1=;nuyy|lGLMZ)7kDki_r~)DD7BC7_bPTC;%|V z2z5=h^n#%ln;Z*yW&#R~NWzVDiD;GZDd={o!MCIej^)QX9erBNUiY*HQ9FA!l3^UNkz&acU>hKtfWa@v_gZr{hR zso}^RdG?8rfJndxREd{o%@R)l033OOFS8*lCwi3=hif>IPfuF>cjDsf9ZxW)codKH zM*VXwo{xHw>?$JX=`dq6HakGh0j6nw-61h7gwzsh%rSsL|t~D}c|EyI`P!3@Bfeoh&w;-+IN^J9+^aE1e7~SplBQ<_9yp*XjG9d*r<{!|l zz#GdcvOsORF59kKnAKRXp?3+ zfQT41LhyE$eInY07E6GNmf309#`3focs94g$LPv$H_)J8vLmB>Ee4^D;Yz$Y z_;K}#0DxkQRL5Ay80$Kf$N?xzB;4AlDF@PTT$_x)B@t>Vs`3QUB}o>z0!nb7K0)6} zfD$E`{iEFt*8KyyHaAGp!jL_^2g-e=TWx?x838KfSzJ=qm{9s1y!Z4vrps`%j@lEi zSt^qq3(utxWt4tvgzhZxBJ?q9-B(MP0blXOeBZ08BL3M0n+D(86s5AQ!z;QeEbs zm}BBq2x>YdK&q*0`x?qBEVWQf5blzB`@}810;TfG&5itSULc-<f(XfT zF~EAA#0FBC<0W&jk`lMzSE$M(6+Kt`Q&D(f^Dl%U3|9Ml4<0$^%xzmXZ$5tfcr_dX z@)JfO1ghiQ++0}{W8-7%*RQMVSl4wOYpNrtF^pv1Sv2C_LE-}!X+WW9e9=3YaOt>G zC9v>U=iLOPsr%j3+3>C5kM?`L8)ODHp{nycd zn$;LpH*>vg_#@2GV@s4Q%6XNCH4TTP1xW;ZfDGj}bS&}JNYe#%sGunBcE^#V+0e6- zl)VuMQ-25J6^KKXoEm_DB2XDZF*zZPomwrn5Zqx-enym@T*a4@UL|Ca_SfgECHK1@ z-+v5pP9ZoE=jtrhu*L``XZvC#@IqN8IichdlzI4QqUJPwp`<)Q3|Yq(+PsDcYBlDv zo9e1~>6frp&XIGZ$se~`e`O;`8>!}KSr(0ZE>bhgS7+C_--1K+5iUh{^vMJJ8F7xX zhRFqEoG@F5Ukg@p{8Ue!@x>f_gM=JHc_C!ll9&(@{UZsXf1bxv*Z7wggj)5Eat28w zJ5>nC2qnjb5z1Xi$b}8chfo@);HhCu0581ffdjNsNPu8JjYUc3<{HGizogPx+s zDs{E;Y393x4VeODmew{^{}pM5I^$&=SMh+S&MkXO0}@S z*Xm9!a5`^g4wetOhvs~$!-CQ17)^gr`-t52AcLmMY#$+Cf-nY5A2TZ((N9ZN6fzuA z5Tr7gX}AX>5%vg@%B_06dTCZKG~!5uCbS8}CA-38H-3G!$NI5Cqh-zH@Y*X-6F zN|V-yqsZ(PBHh4Fmq0247P~kVh>?ge1YH=i z)kF_DKwL37fE9Tr))&7I|9H>q<%*mXPaehvdhxn zA>i`d;(k1O<{4YIoQB6voanEvCJUulha$9!vaaL&!U6)c+U-_ZmZ89+^ns-|aJs&H zfg`6y9zT6vFOD*K?Yx+Q-qhtDU;pqyjB1O3uh%PMxaeqBfCf|$5hr0d-e~&PMey*E zADL(vOCdNPtb2+_jXE~Z*YJNb?}+0wy#f;~!zsv~N&|v&pO)Jk3WK-+9aM$_%QjQ>vK+`%9X$Q3A#6h@DW!1nYu?^~3yE5vz+{b8@ zX*KH5@+u^?2e~{SJ&~-uFkQzW{s2>LMbIeMYNx?qF`|9ws(=#2`={ubMWm1~3Z%WK zfZAiv&lp(M+Vs~7kGUqOp1Z9LSuJMZ02<ZMF z9xmG`D7(q>jk!=tk2r~GG^dnx_@OBmk^4;_{8jBRf+dp6I;)yL2!Xjy2#p>$b-==K z_8Q>2;bc!lOP*kokx8|`$J_=761JR76LSyKU{U~zUTf4W(*0ZsYrr0|JIz0T3^-{p z$W|lHsHvnvj;7e@e-f1@?k3E3D;8j}{{!YR_${+F@JA&JHildymf{)YSHmA`SmNYK z(c!SqXVYUdt}hji}kBd8Lf0lIAvmE z&?*2ax=pflBfkkMr@QIxRC{?}4*-B){Azs24o+O#23<9f1R5K26Pj0++OUfUN&jj1 zKW;6+wI>D?&mb%kf@PvayKd`b_oA_g0A!&E0K5w&X;)%W(klccd9k7R7glzu0@xD* z))gi|X)Z~HV!R4QrN&qmS;VB-R0AMEED#8=uH$f64XZkm6dM8km}@Rqd90quFxv@2 z@t2851bv{}fFzw^W`L50NxCR9cD){~{*uKBZPW-FO>_Jj#5aQ)e`YFLk{XRrn^-EV zHPk`ph(>&=w}R|PfxP`x{ zmX+&`_K8&(2+-C0(ud~rC6CXt=NMHcC4g1by(IzyMbf^6rgqrXX@Lmf5J9j<5`NTF z#}&z>XPgzBwA6)Q6hpv(1ps0QM6nvy6e9vcKnwrUoGF4P&-vu2*`{=rKoLVQKbHIj zhBUp{Sqk5q=d^45kuoQUvepQIsRU)5l1l}jtb`1J#By@+r?%FcyTmLLMllQ$x>+Rx z&YhaAsXlAlmebRLrb~-;U1JF8aEGES3MgWXRaFfKgT(xFyta1taQFaV3gsXqvBez| z>y9N4z%M!gK)~p4qY=Hz4d0SL5gv_R|U)|i3dW(HvtOSG<7ai5CT0rGo{h&8WNx?o(r-$3LSY~y(KIL*XAhx zQT&M5ky`GET;zVwRB?TYW>F;$fVhN^L8Q_ur4qEMIbKo(6lP|(X6l#Ln+5jSb#7kO zLosf}cXw5md^V&c_Ld}oJ_`2LL!HTglqr(oE~v$83`7wj9kou~PLKHYlCmOJCCmpK z@zrM7>S#zQbC4_&Qzw7`7Dwp`NNUuBDF3f8q-bHL z>zU4WOA7o_H?SUfP4MJ%=X^OgmU20WUT7VGoCM6h$Ors>umsMf>=&hSNZ@1m<;XDU z*zmaSR6r(@FvX&qBom3eRTY912Ne`tJyjOL8UTnzkzP<8WA*&YW2t9rd~E zq_XaDs*9@l8Q>lxl$&?<1y=eO@DLSJ7HtB77UKBPkU#YpvC+1Le64zYUP?88+A^q7APKOW_1d z!4m$VSca&9WdgfS_sqAj*L7%4NjzE=1tnnPy0r{71{|?EH&ML>#LXoS>BI*_!Cy{J zPP51~rP>CdIo~FT0vi#Wg2w%j7)Om2YPAbsN7gYH3nd~JD~?`83ei+;_UXF8?kjgiBo4%; zr$;$z(-FINHo8jT2=gB0*dj)?g-PZ6;xCiN_!R{>>(mk`0kwxJ3P ztaBN;h{Um-3Ni$PNlL~~F$y>!DI&y&BMk3Sc1aGmg$Wf|n#J1}%fgdX6(nQTa1c(V zL#Wp)s(WzIi2xfkjb-Tp)=QY03xCK%DV`d4u<4}8suGTL=99q*ljH4I(1!AaD2A#Z zu`J<+)F3}id?=C_>UFBHbY4^ulZkh7y#5dn4A);?^ zM@GI`EE>@)T$cL)2X)6QdQYOu8r7!(F}9Tq%o>gKu5$*ehzj18a5OG2-%CmA3n4VlVeApLsj62x^**IE*3Tv zDvQY%NsaJ^MwM=Q5GOr>L_~>8Lj>tk$jx$Qg4BuuqQR!Zo%xR?+Ej>%{`Ycp%Emy3 zCCB+IXoWe9Sj3yNF;z#l9J7oXAJ4GU%W<(ZUAUaxr&}`qlZ{&u8+#q3bzD2fVd-!Q zE^_EPM4e^I3cywJOwVJ4WCsn_cRm(@nv`X-XcBO(KsUzSsGhZo&iy#xdf)@wz}5xtEyk-F}KGnWQw zX%1dsgYk$LM`5qNTcng4S)ny2)9My5m7I)`#bRr>2$wY*GL`?N5tD_yVjwe_>GH8E zYzews-Ndg!Q}>f1{D4Ynt%)`h?R_@uI!!t)(H(}aB3&?fD1tS(s-A>sVP4e$!86VU z&O}NSRi>*P^YNHQ=rIOSc%;`|D-$%_$N5OSmelRz=jt_d)L(NAG_U zul-%drpv|ArNf&(aqBf#Uvc%7S6sWlf8p%;OP4Mj9UaZNYc@d7hyl~`>} z;L|NuCzT>g<_RW9KcEw4d7^lY{{0cRr*4?+GLd)#v}dzDtpGJFDU>*tWAxiK`6f&iJl1rx?L1x%RlB&ScTt}aMC$HKhrCTHaj|Hy$n`9$2+-bE z>9k;$sb<8G+8feVvQA;42m)!Y+TB`JMf`Kdr=qcK}iJH20si;nVdYZ4lOAB=n?OhNVSk1)fN)XFa0t!fn+SAs8S0=eOEq!F# zi7;p?g&mHO0BD6&`dkg@6fM98g7ZFpO1Pj}4m?N)oP)sE7<*F7p3A)~za~lmJ0zS^ zw**p>2<<{s2_A8s91C?P!YHp)Esa79)vv@Q0~ZY9s~k1dSvK5b4!E=gz=UfhBE^U| zyM?MIoy6agVMd!wQ;9-Ml)zHT%Z3(QRl13=@=He$j+sIM@m6Mx-vbLMXGH@l3CCp&(7J(#WoR@;wqCXXutVr1SW&qGBB3dPXf`lA z6D4Ca<511#GfAbD%6@3sPWrjMj^V!!)GJ!PjT_m@{3~{8UX- z)hVQlk}4Usp@&hv#d43BV5SIkP`22~V}U20Zb+>4uqsiGp`59rqCC;QNkBvJ)-yXZ zSwxN~nEoZyORlU&dzG^}c`jNDIH8=hM-zxPo^R+Xt)+=rYoe{GO4IHsMHkbqI<;w0 zuxFG|3w!kLCJm@-&kxl_t%A$SPveu%ASlsDFWPbci(*>AKbWYW=BOK6U2I*{iR< z>eT7er%s*B zN`^ke{jy<&R(w$epK4`3*@6bke!)ZUruy_~c9!l5p^BMxlc}kR^w|X9(z}TE5JE8? zGm%Ko)w*=)>Wuajp=sl!H#C5xiqz8}!u>l-dz`8(!oVTKErK;yG0dzSu~8A02@uG^ zSpsc)M0LSN156mB0Wq<7gT>faH_L4yXpqIJCPLaMGGs8?=f>gbiGD>#Q7?7vtWvDbEiI1zI#_i3bVo`R%jF!b+#uHwUT{MYm%gnI^ zX-&0@_1+cLiPTE7Ilw?gq|Z1|nU>`i+dHkmW-|=OU-9V}W4#lpv)<-~1C~6BR)^>_ zwdblh}hg=OUTAV2Nf0Vb0=$kR+YxW+-Oe%A(^y{J0)nu&`huIk;CN$_2eSSb*e!uHKARl^|kRp+~|o z`63+fEmhc{A3Ca*5fuY~Ermx{%dJo0yj+xFzkz!a_j{1q`y9u-^)z`AnLF0jcEY96 zhei+Fu$D67526~!uxksHBP&uR6xu?-?;H=VSFZs+!{^3Nwa}?#d-$c$xj~dr8bC?r z%!I1q-v`|SSBQR*)g%oHRTU8||F_%^Hkw1nYu-aHjCptzM|tEj{DFEfCQx()O;zk;WxXK!LdXD1&%hu++k6kK+eiVu=)oAYX{rsLWj0VIyclZ6 zcZep6T&Y3?QgFyD!!u_!McCtAi-^+I#AH3si@E#D9Akh5<1Y6>;+a(oel>=XRc*-4 z2s3h6^`-%jhg~k2HlTH?v86&&`HAPHuk4Hw$WY`eV+MfK5wqnAwF!gqmz6(@G5F8} zG<*e9a?TwV7{o`JvXEEQ9k45(M3 z8%ob|d^H4_tQ!o(;yTG227VV=uoy(uvth8MF2l9wd8g)pGxk6y0|}Ufq}$4fT&2PXdF~xi?u>wqA-Qyg#hK8gXcmS%TczN zew2nZ+%d96T)}dZ->*%@XBkx$yGk^Kpx|@?YO}?B>AdK~(N-O$*`ObVg{0#8(g}B* zsWuvHD4Z`ft}0r;tu>K0EtY21Z9VtdE6inWMHz@hbz%_NAY2hMY2vRYE}j?CZa#L; z?urrWB$3s`q-Y7+270qoLYBg*^3>_QU0bhLN2~R`TCLV|pL_4jE{f&WXuEg< zI+rjUQ`g7>fyKE7VpWTlC@h7>6v@GsM+Aqa253P$O{=uQG%?}H;;Ah}HgD0mVf6v2^e!M8003|4bvR0w zLT7y$r>X3VHB~bikfoGheAskVH6qWOiy{N7^9nP6UPjZMt*6^8+T$aR5K{#~4HXDF zDJ(gWSJX1DI#;G!6KNB5}#qLpiCpZ+E}4XZR6k;$x<7kJ5?v)SBL#k5IVs7~rW z4Z^l=rY6?AS))&fcsF>X^mGLnAR84}t%VB-!PCNz`HyV5u#ap6eraC7ZyDK|#4Z>t z{wtPxna@D>@Ug=7qEMIyGZYp?YGj=Zk@`H93#P=MS!n_?AxRrKkQPakJjSj1kb+Qy zeR`EvQ5s5Aj3ZddzzinpKOpxq{bm`YkeUq9RGXp>B0$R_uqUfR^#YMZ(&$yC>^U07 zZ6ap9EJ|)^m*wrs8*#<4feuJ(u68CZ{u}>GHn}wql9r^lFv*IhBoF=lsp9x%5wZ9) zXp&qu^7Q+L**Jn3KQy!ZQht%KV~|CIp9wjEO1XSH4yc$ z!EZo41m1^?)Z$LZPB&1c{tDPYxlskNO=hU66z~ML*?tJryEwM#jo|KlBgaVl%BnfE;@q)vbNq@ zL{VKojhv3H09~oVWIr^E!rGDqZy*DPr?{&WL&%~H3O7VnI%4A}vKjnV4j|;h(QM9l zCzA%iE`=#jr}+bfwh06&{=opsnx;_)86gdMGJm&nlMS*IWLT(cD&uReXbG{Ha2a>f zSu*Y_5vW1TPcxz{d0QE9&1P|bv2;BKtXXl0`Z_9{=?Uhw^=>{v9vNZ}r7;xK-Q#4@ zyn`z(`I8u8gL_YPJmwpn6fa(Q3&sm_s9U(sGfGP92)(D+2 zZfUWFq0g0hYF%=rQ}88E4M31hOB<~h#uoR-42Us6LuwKCW^58%N1$I8-K5j>p|x^j z0YT!iFhqp>hc42m;yVR_i8Y`;{_!Q=bnrvCSYC;e(R_6PBWKc)Ca(xgGG0w#4!@9h zA~||Ur)xMVl`@EArOC0T#PJWqZq+SneQ2OfW7d-OB&aRtYS?)Nw=&9VZK4u6*YL8k zQlu0MEsU$)KHOEZz7&xtv9LX4&HPE(g_!RP>v64{S~Km|=Dw}kwx*RVC)G)P%a`;% zdmXlS>COteK|qeeri?|(xLEiYe#ByOqWMBT_0@g?%&=qWXR?ucfLRhRi#1VS;!(Ey zhe@lb_^Hcu|2XZpm>t?L$Y``^-V7X!GI`ZqFJQTeDH16l$EH42HHaaVpH%aVc8#OD zJB$EYn5#MBU%uqK=!2@3Y6+&DG?_!rnr~2z#&TPzgq(z_VGg&zIQwuB1nL}oO`>t-kWDx%BAIE?K3S+tzknL ze5YkA1zTWDfa{^pfdf@6sbO^P9mDL%hU-FAE0?>$HHkA_80d{$1>S5#HHkt4)?0l{ z7@-9Ah+tx)`jwPe)~o%;mYL=TO(ETmHwdD_4P{ky9ZNz6cf?U^B6Q|R$#ok@N`CoR z)KV?E^9cK=tXpiAgyS~p4w@S4C8st`;;S*s61I(3T5S$G$u9+`&6OUdY9t7$c}z?J z4J;3$lPf+w{YStvJ*o!)sF!K>>Rs13qcYu}#TDis)f{MjRTjn2H?=+u{+Ka?p13iq zd*wgJxLUmip3Mc$9MpIl$1&=tZITNwk!YY+38|3EZ|S2h-xk7B-(1;CpzB$Yo zxRDR>>0EGGeLX)haj~`ZJPCTKFA#v$tGCQl=ghiE#c4DvSaVBrvzoqlNW4s)07ESw9U4XglJQ7@RCO~(6VOa<4jpgkb+zuK zYLR0s(FU;H8zmlW{Jg=C`bdCrDZ_6#Eo(aIH0iXk-q-83tk%+Mrdr1pk5sftU|@Yn zqa+cYIFIc!HdoeaDi_)*Bf^veM}~I+7Eh$!lak88XsWBpm2$3WHG*U!1CkgEMl^+| ztJ^MC5$&t^Mq#l&dkst*PZkhuOAc((67=_Ko1q-P6nr%LNj!@TGE>8!l)P~=`_Oy zXf3ya|0Y%r80IvKp#q=n^C`vYYJ&X3AP~)s>(wWgF2NlJ(Wz9f;8wEG!qqUF(3j$K zORa!-g}PJJpbQq8z&X;!AMkRonr7L^U`Ge>GuxDTlHv~1fGBdTvqV@@a9gFkUo^)X zGh(dgW)UeCsH4^NAwN)ww^dhZ!#0De_|Kr07TRCRNW zp2X~MfrjLpNO4%=!b`O@ntA4aydl*igkC&&@DYyL)xnz2-)K{5)1=K-YrXQ~i3j(^ z>E%7|T3)(I7GkncnMHazKS!b*7`}m>a_wTgU=7`-$OIsam;rmA5{#hPbuvHEgVLqc zaF0T;WyfmtHTbv)1$+tD0RR3Na_)kd3O826FbIRSFZFR%%A83X(Jy^TdP-tJ1$=l_ z=)|C-3W+A_5zQ*!s6#oEyHW1pxpRm!jYP$JtA=K3CQycjcqWcd6Popy9Ts+3tkrXE z39}rBu%XQ&IQwbnx{OqM0G&F5*4(bq5Mv8gge|DGMZsEFFJ+8^8t6iL-&(W>Kkxz4 zGzz5dymOXQ2bzXe*_gV?%Up4Uhl``DM~)MBjGTzZxkwgHTgKYeP^~CFm{KF$gaT~v zwTiFK+GRdNdSNbrBgKg8Yf7b9TxqTFh+oOj4VzGKip<@B*8veq>sBx%jrwwBck(-P>`^E#pwt){gn6)_uQ+xfRKWg3(by_cvLNiy*4DBZSuF?6E~Ele#xyEsH~}9Fp-C3MD-;M@ zWfo4P1UXu;5FSW{l!}Nc4;S?I z(}dN!Z#zdxf-c)f5xNuWl{BRobET^4?=6q`NRc#_WHX}L@MD-(R32D}yb|0TvUX1z z7fnTNo~?J_HKH<&bNu2|gXL0HWS;x#@Ngw@!kIy}hL~dTG70=F3RPs!V56ALMh3Cr zCi212iiUu>O8?mBGJXe?r}J$2D<&85&jzGRxxa59U;I&^C$7+*3CLt-{<}fvh(kIu z$1Xcoz1$Bu^)3QrOl&FF>kmU_YQwYDE9bL?{=qEmGGDcP`ApDx+0Ph=XDl|RS`~C~ zUuK~3dtGNB9J+osJ|xBTg@qnkUS8PDQ3k=0MqQ0mA@A-|7o-1PXhX+8GUpY75_*0Y>`kX-%nw);7D@!j^R8)dPR^SxFX z&S#Gs)G<}NY!pTF&&mCvRtWck#tmG};cDRk+RW~c+dDvAWPB;7|JpZ2FhmAr0LLYD z+_*0D>}R*Yg58@U%d10c8<4f}otILFH(>U&!@+Sqsr0GHG50Z8gq^dGulqN#U`Xynq+~GfqyB`GQO2I;%MZ1%t)N6*Ejl9Gq)LWz6`BnDuyxO62Ecw~2_U>LN$yEM#)6*q4_oRv{-6YH+XshYm#X{s6gYp>68( zdVO>d=8dd|sDyn!Q3Zg!bCxERu~rj;=ApVOnvzzEJ<(E2T|)}K$221r4#uzSr5LqK z86}md7e|?8oHIdbThx3#G|N`vRRtDD%u87X-?NwCRMSZ(vu=GYIWYppxvW`U^G5w0 zm2DCeou)Fig;9t_Ii{i~b7S1ELmBnm6 z_*3Vr3LBHo!I%2;EvA&S{lZ(Y{djJlk{f0LGG&fiF#9?@D;uolcOAyX14TpC!!R}| zAJAi@ZWuo3p`DkxT*eZ$kiCf#Dxw4EZhkg6aqOmo9y-dU@J7V2C8W#`qJmmO3N>vo z{7JN_YFmp<`&}nd(dCxz>`OZmSsLF`l){hheBCBARz+$OQw|cu?MW*g0ho8Z-pXIH z-$Ancoyxy~#sb+TYDo0T2d#?o*e6Aw^sAO`HdXkuD0bC3UMT-7CYGITe7(G4i}Pn# zEh=TCrlPqPWo)a+Xv6txSceX}CE`nY9NAFw4W~hitd7>tqwB>PG3yTB8{`in#*9E3 zHdti{QO4^=&G&9S&PkjH%&Wu}N4HSa8(>TPfAJWssrS~qOubEQu@IA~sk+S|4FIXx z71V}5cx;`b+lYcbt4|yR5C7=xnuv<|`p!Itr)@q)#jI>QjyXuUyyZOLFCL49sh20v z`A>~TMiJs*E7XH4<_RIaA~B2D-XY0jEmhUA#6vg0zgl;Jbvz#qq?G$VlliC!-jZf!Je=M{ zV!H$kCh}evX{aphxr#jJYEdgFF*Uu5<D#b zQ-vz1O6Qsq*l;-hJU|g?STM1*#^vjZ^XPPH+L~$;ZR>fK)yg52t2ZIXB-&~bSP9cC z9hq+&8gm${e$>n|JB5rjj0PM3SmyADEo)TBnoNXmw=vc;P`ol{zhF6FyeV@eDQa+d z*?QQdC||1?n9q#^$VO6ene#hpv?i+7yY(3su7>mD0&(hzs-a2YQ`6XMh#8MY?SqV;8&udcvVgcv3T)yN_D^B#CO#Iu2CF z-|~lzG&YA{k1i)z4Aj?w*T-q3!QC=xP@U+2Kdj4Xl2qYMtMOp z%ap`*1M7>ttjMzu94qX~Xp-EeBG3S>jykkDFA=!`UL#4z`_(~dQawg>-56$lPYHjv zaV&#Yuvw~9e&1*vbW%YEE|wcB7d8|Z&@r&LXoZeymafr^nx?j?lN@I@Ql8zsr{Gf1 zu7lo;3zN%thg?-t=_0l#vTy6P%(G2hOe{8vTj|qA3emm|?dR%K+qjkE$oL^kDuX6$ zFj>ai)nf8syp5K-seaYU1Qc>CA+P$h2z)=+_+>XNp(?z#ZQO6i0IIZE;T)U=dFIu9 zTGKGToYxdhRWzv_%npw+vdU40eT9XCiEM+I&`Dm`c$|4ps_5~k)6myv0PqoOBo~Sf z?j)~hOSzbc!Ex6SdU3wt)ju-Hys-6bv#F^xoIiINByn>tXchs_fC_~(n;#QH?xM-M z&5ss=Zdzy=HD2+)*+)Sw86U?G?3nr?RxPi!OAr}kaOTFa6zj4yLtUz4 zFAqvNk)0V;{;K3=+^riZ)*K0AwRQ1igyhZ8p|oJBUK_T{xBnF3UDia=VAw@bmpTM1 zL|4~mc}9*A-9@t~Iq1$tryL7MdKtoSo>KJ-itg(#8=W*Vkn5IQUD#16R+h-c^E@<` zx!PbEypunuxW^u`4Rj5z)qn6^Vy3J>){zXOlC*`F00RJfG4C{R_Scvi4OOp((gquF9;;ZrvP-@*& zS?b|Py0)fm(l&`o@3XCsA^|F|IUb5#!lgBdss}2mIG?Kcb!1{7gt=c z7P=Ga5U-${1`fn%sDVX`3@783{)%CTZh2|f0)1R}W2F{{rtmNj6PgKZrt?Hz0Sgxy zhc=3=q{L|7xbDmHelQ#NNF3pA7z|)L&eg@-Q9i3l8&t0Li|c~W3ba|Gl?;5NQ52vX zcoO%ZuSm71mOP%psJb|`CD~iVI zI_Sf&#S|(kpds%EM~|UL0@Vf@Koy66A*M7>#T;*3_Xq$fM=K^khsi;ia+QaP&*+N3 zg-yEl$#fE(Wxgm!cggx55iyz6d~FiEm|`}xIB2IfEV1#0bg;e-6~Ye|XL}{W6#i3X z%jA$YuL@8`MJ1pis#vKCwd}`G4jK{y2FMr7O7+tsGDi=EBTJgCj4Sx<$2FCR&VZt! zAxNPF^ka;1#Ug)A^cYu%QB`d0SE@J=8x$ui#WbMOHp+$U9bf6~&`-xL74RFsS0oV+ z;4sE!N;N3HJ7VP0uXSj#lA;`PqbLEGP>Hkx=0he!7>4*HX7LcHtEjYwS6D^*$T-Br z0Duz5OiO05vCBFaKlEdmmqa6al(f$SQNL#3&SH8p9|G>J}N?x5%>k8E%V ziHVki5~lmDi>ax$c&%)oC3Po;P}XjMYldhYF_>aYOF#$kQea<7(%i;i?3V8;fp(Z$ zGdjm(g4Kl;mI`uur;m|CO~0wuI^szEM1RwwO$$+-=atN{s1IaW&`7Ps7|N1B_$?7Q zV`1hNoC-pLoAeP8mqaIEvsf;N*+N`l-n_6qOUL&g)RLhLTB4RE=6a)9*!^=HjT@RU!bse}vLFhn9 z1&`4Vv?7dOIhjF#`mZ5!q<=xNpg2 zxdV!ovR3t0^>NCeRIux9z@liUUQ8RNlP=xF{Q_$o{dHw~UZd!G!Qa0~l`xs;C zWnd;Z7AvyK>0xEca-dp{pNRQFJ^%WIJgZ3F#6wry;JgO5wLrw8Oz2@(JsEen=TzeBPi z4i&C3tn6T48~hs50Y?euLgn(PmWkY2&F`3+51*1m)_ZIav51rtxQ~6xc=G~9SsHP! zj>EzuBO+wi)L}ur$^Rd7DDH8j)PluKy0(SQ=j2nbm9{PY9uIkp;zN&^`zpdve^sr| zkJRLIRILq~z1uXYS1X9Ge!5<+kSI9<`LWfdiWCh%4=0#o#;?w7D zWQ8?)!d{HDlyo%2BWfkaV%gVF6W=t$V;+Zu*l?Y2>SWOwvD-uyqDP@;VCFIRTc3^p z9`B;yo0x##Zy6?(f5TTQ96n{>TtFdZbn7$V=H)(h961BPx!+A1M|Tj1DEsHwidVAXGKc{jgJ{CSOv?S< zS7VI9fsXVjf^L&sm{35v_=RepmnBK+4WtJoSsNFF;Jz@d!uyS34;!s_=h8XVe4M?ZEg z*_Db4@mk!`#k7m4wn-NYnR~p^E^~04Ul9+0S5mS<4?2O>Oxx)`2Ao8R#D6m@3j~dr z9IOA28`C1}9rbZR0uF7CL`x%*HdTKWE|h#=QVgdp7b26Y_Ib9x4p$7K6l*(?zzX$4 zmGD|ZE9w>k$I<@?UQw71^m4Y9b1dOmRU~I!oJGY6HOpy#RHhO?NT-OZcJBQ*spOh) zM~+ISf5WUMizfvu>TrSy+7@Eg*GC@Urp4urm`|$yV^~!p7;N?G&iPJ^=SRt?Fs6`y zD3+o`B2ayDoJh$%Sd_6wB#qWe=E=bQ_!m+Hh1|?5u)PJwsriUnKx?|z`=^bA_`75PB9o`%>gB7j3Q!%IpzMUR1hrvhF{MW-6hjQ zo4MzRezS~y^ODqdsALgjR0(2~sTM#(y0;qMDB`!oeRv?tn^Su-$rn@}-FN4Xwqe{P zU8K4nP0ww#8)Ka)6@-fCloU1=Yb{?JmoJGGB5HYFH$_%pS_j@p3bimKqz^rYjLL|O zknT}R%q$iq&fYd0vO=zu|8T9?T2+$ZxkirU`JpsX6=~9%^dmX*ev>0zu6-T?RUyk# zrBWwT8H%?ET1Ly|L?ZQEiVYXFkrBIKH{+Co4$3^Rpy0I+v-hNvAQLePR|pN8R_kqP zMK#Nf8&Y9JfSwdRte~>UDq+LNk{ihix1EA8Lc|bHeV}8-?G*Bzk}^L}brr#SlbZBl zLL!GK7$;A68rh!iOc0C|R#EYx8%eNG4H$tK1M}KG?FcSW%8xXZ0B#En0CNTon`qP7 z*0wIu#=lCP;*;8z2v~l$Hk6 zMBtaaC68!p5GeUM+M41DsjjdF98`RVl&!4la(f9`7wawZ^1*8*pK4i7bt~!(h%}I$ zHyrnv<=Mn5zwD=VR{m6MJZAMKCS65*WvZ1nDW)Y;A9E zEtXrYEt-~_P0T8lT69&a9&LOg-Sz-wP=$@ph)#6XhAuX7r1Vh#usYQE^r3ZO>jL%F z`rBnY83L8#pCOjjdfkR!Yj-&^KA3FWkmE*I0F>gLYo{YYbiu>0HGgH~v-!j^M%Z9~ zTAr<)k9d_}bU7Yk-ngvS7zZ+l9X^m_v~JyI^yk(@?_>FY5y-d#ca_#!YtvLPUsM|8 zQ@YoBi6;YD@BQfLaD8+%wWiw4gr{+)Hw^DuARR;YqC)qfKqvgW1zuy7W$$95Qxln@ zv}q!`xhl$wB*`>nD9(z4VaZ#D=YfdGAlQl@mMjPh8DnV4)?+*>i!@tC8=Ym{=&8mQ z&fGc+5f0f*{SCFPiAe8rU(Y2hsM$~#1Q2yr)-lthtaY)CzJf0%D%Q({zh~s-bRRf! zIx|Q4!NRb1S8|&XC<#6rR3aE`BGRql=!z&fr6b66Ez3NVoTnu5Iy;r*YQ8>(54Z|N zU2ke4Dt)$IkA>d|)na6-Sk3~jx&%JE|ur&RZjUO42v}o65L}pKdMA=ftX9 zXn32C_6R}L8C=qt}kzl7<;;PNg(pIbUiTm)rKJK90MDp_s+R!SJh8C#>16c@~jX6r(xQ#Xb2(o>jdV-#6NR6@Ek3b3w10oa}jSZNSN z;ZSSpWmfw#iRuVwwrqBE=2eAoO!gXX4r-80z?~+kl$N%PV&OOyk=2Nb zGh@FYIGj$UDZ8vuR$rj7WDa&iECgLGJQPg?05qupL@iux*|t+4u|`OUZMeU)fYX@g zLaT*|6t}koLsD7=Rp=9N4}ZZ+?urT(l+NJ6b2=4M>0PvoH4GF1V{|@@ORNx8uM5k0 zAuA~A1`4GjYFcjkjt$r@$+L(yY#S~~cHC{S+|k7qLP=g}I=|DUY_u@u)j)3z`avz! z#t<_|c_NiibA+g@l`ayavROVn!dE&w=kh4=jI6W~I%wz#CUu<2XIP>V=gSzOnMq9= zE9-&qbR+BH3Gh$}W$EbC#|arxq{QJB2B+&u+_Q~H$z`L(ZNL@AuM|4-mM|8J%7@Qj zAJ@*If$U6NLe~4-=Xq;)Z+myobD(ZA8{P{~&etZv1g=7fu@SE%p;WqvmLra5ZFjHO4&R#+D&BJ8wHn^OXhC zVcYo_ok>&<^A)>h0M3o+(4pHFYU8$;;oWBom9@3jwAr*?9UUDWTAww%EkMt`n8oq8 zBGTGov0P5eMMLziLZ~Lw#}E?qs>v*3CQWr(EcO;#tF6_+#S4bBI5Af);Yw_yr80Ok z5%Z)`0k`0k#p7LN0uIjDU(=eu!`(EeY@G8_JOC%`RB}5eg&WMtBRgQ(32`{74CG2m zPip|<7u96p1{DAn`L2lwH>jFRFyPShC(5eNbm3X7E?neDU z6H(FnlJzW()R+N`mm0Rn@U5V;hprK(jEgj(@{11ZHpBnBt zT;B*rEv=6rlEY_f#F!e8kSox~RGgwL^~rR7t))|_!_mQir2t!SkD>5*xJ61j> z3RUwoE8-p}`O|Ho>F5#CxIF3}6NJYPX|2VyAsmI2DZsHg(u44zab z#L$N1G{O(798P1QC0c>vkb9SYDD8w?`#5R)cK5sF=u>b~8aj|so8&s|V1LHkp~fZ} zN5dfA5|Lcs1L*+Bm}eQFk`cwoc1ehJZ!y3!XsC!_afa z2Mo!~Heon9Pf{Vu9IiCeS;d#z8?}1FQ-)CtS0ZJxZq{d;*W0^$Tf2KA+Gq2$Ekd(8 zZcHC07D5}4Q*hMvw-`tcZYVO3OHw2$&Dc{mKO5>ii2L&Q9{+&Rx_RZZK3PM7Lgh$G z@eRiwD4i6L)bZZWL=y0UHIL2Sb>q%TXI!cVbUAwd|NlV9M1=H=)EcWOQE4iUT?i5* zrGrKt8==gzoD$JgM5K$A$q7+u%!mOsHv6fR zO(!pZ1Z7HZYT*K-fLxV94O2NB3NeVT4HHS}M+3^dLWYtaCC}t>;l^wQ8MPbo4fo9+}o-UT<%ZuqtMs`!i3am0-re3_N1 zS?=Yy6NX&^XsGPS6A4l^zk(P5wqY!YYM_0L73c>rcS;Q-=tBam#|_+oaYR^Chd>W( z<-7ll$aS0r4BkP13fkpT6AgA)=}rJJW{i?E#5CM5+zCs&88l@Y8j?8BBPu@MrBZX>#TSpE6Pzr+~f*Of5Ryx zit=CYqHXMX)RJs#@U)>o*=LcZUGXT{zgF8>`|wA^W;9!~Q@VxxGGx>mgEERokb7ix zB3J|OXrnq+*aknVg+uH`h^68&7!(`_L5I~4N5Y7>T3U^0N^`&wO+^5$W!wX8gZTpkr{d#^#?e}d0oi+j4lP3TC_{(FD->vQ-#CQu zs=NqIra~N-OFU!Qg^?r!>vR~7z?X6`5P{L$I5eZ0XfvHJ+TQ2Lbx)FMS1#Qw2e-kO#_ zr68aQDGC}Y5`u{(|4FS9)c&+SM=v6c zOR%#6_|9-#>FN|bOm~6`6ggFY_piD0j69a1jq$%y+~kI|E|U_V!O!r^M#F{dW9a!= zp0y1sH^aIO)Vo}_3f^5#ZkHh;wea%y>SeFWpv!P#<@e*1f7TD-n`jgAENLULK}kS) zc9Yi4Fg7iPKOUz+%xt|{wbr(Gc1-%w(NSw+7Uw#($zRT(JNx^sE!OjTc-t^TykiS7 zH@YnP7GvpReYKhv%kACWg9{g$h)xYJ1J%pDjpi8b#1V$Un}Z9ePAK&^!+LTxVR{?* z4{RME)BrUFNHm)_f~aOC1*nM{ab)D-A-Y&A>SrdZx#B}2!b!DbOmK{w<`tu9xfGqu zdS9=s&tNh`KuW@5CKG!d;(IqQJ7r21V>UC(IkC)?3bDwXAq_#UrRgA*#%^4(;JRsK zt&)jFOGHEx8Dj{le#BI(h7-f2;wyc$#iXfPF2KvA1X)&9UXV65ZIkqFeT`6{Je;Rk zsS01{fzU0I&qkL8ovv#i6u8Sg8#qR9jU-OEt+*jAbk?@UH5!PGB!@$Wv<&Iedj{<) zb+6NAOhZRLw#m#{^;kfI;-RK`7;Oc{gF*GdXJu%BIVIC#i| zNJZ*Onp2mQ-IcIXB%_w1mIB5>|Ecq=&=o%cwa?;0^oNvhjQ=E5!mzj8vKz%LC~0s5 zs{tri5jdkPSf`PE9tUH$59|iSsFSP|8CcLV14m)IluNwd#x&1Hk)hd!{%}2#SF&M{ za$-RBEnr9w`f#dLg*kRT#->;^Qh?nH>9Y*C9sC6Qg^odBMoFBrlPV8G>b|bON|PhU^1L;+W~quF|i{#e@PejvbGRA z@&zNByX1VNESHd;bOa*tZt`6FT0{&%Dv-aR4ctjM+=gaV^9H&<@eK>qjcgwuzrP7= z4=hq72B^1gAi&TREnVZiU3_pOoKaj1?c+jg^qXN9*g5pd@BGrJW(@jSo50#J@GA`= z_)WE>?G~DcTqspqz<%eCVhE8MDG-$=?~S$WE(4Pa&oGJ{iyEDRROT1Yl0wlW(kvc(8QM=nF#juQcDdBl$?~7)#|~Kk^dBXg$BetV`fm+iv`Xo$Pbets*)2Z zX9#Rs%G6>6%IRcN$N0TOU1?g7Wr-_r4YxPQrbHbUYdzAvAh0Q*P^{UT7Lhuop;(ZG z!O}=_;tfkLC`!)p#LFW+zTgRfKnKNZ@dQ~v;~y*hj~b1qBt@oKJff}TVx?h#5CL

Z31JeRMB31|C8Gu~o6W-sfx7N0IPVkCIU|25)EhTzXsvV?~P794H zN@JQK7Q7`|OWslS;-BbL2#m?8+5TLvbHc)D&A~hk^dZzRVNs%3OUw&Mzzx* zu&#=VHW3?1-8;kxo;R@tu*;+%njknb13nptgjOK|Cw632`c43Vd)OR1Y?I_L#pCt` zPzwSO|HHOe46AN7s>EeM0TOb_ajE2kFlWYv$!&O2jL417b#-TF*Q~EsD{ZPx%zE!) zbKluJIV~6Kqjk65fT@+G)Yc;L3QAHs59jT8(bw~0T5fG`9~~XFu6eT-1>N}AWmQ%r zHX#MSSj8_MIViK~|J zTcTQ{n2Ilo$O21i(_*1*GPAxq#Cnp3`hqC6CX_iF2yO2Sl1wpWVS+7n&=vM=z7?fV zK?Q<#YPsTNrg9}fu*cC11)rj|E*bTLo@771QN=aw9GXE#0-Zo3rv5@9ZjP#&RQ0KM znWpCDo_UVlk5Y^?YrC7fnPM#H1^Ft%MiV-@ct(?rr5C7F;1a+1sC^T7*uNDH(|MG5 z1(lVo%u#&9w}A{TIK&UzwCY$)bn>DYQA$|+fu2T3opRi$EHLvgzDLvI;BpKC1$hO+ zIo$Xz&;+AqE%?Z~fOAI18`$T{b$$D$Ow4Z~f=ZrQpWfklgR8}PMenB1l zyFZxmK}kDGy@&G3)m6ZJ4re1Vu!y7r99lqY@%kdPkT%p7A$Ev@>gDI>Me!EMpb&ad zhVlS;7QXb6!)u&G@ZoHUV=`+cc94^;aVZ3XHXF)b(Tzq zDFv^5wW&)3V=03Iih|l)&mVlio0yBCr4AVPADQUz%6S~KB}r1La;Ea3u&Y^WAVzWc zjqVA~1yxZkh!?)UC<-hzk+ejW13iLX;tE_7Y$zyd&8Jc@&4HB|2@a_=$v5(+IEYeB zDJ0k7V7%jfY=0@Tl=-5}N8T=Uu`~#hV3d~A{)H@2!8!YQVJcs27Z~mh6uE1mNbAgj z2$n)5rMdy0Y?;kRc4}laK8{xeqF`z|*7WIxM^>&Ey~RB+{30fF#!h)x(3-+z@)uRB z4Bm3BYY+>aj`^<$J1y%b22F6lpyN{-dq8e2IYIw9#$v@aie>rRQfxVvgjPr?#Du9P z3j$+#jCuS@2Z4RvU_taiD`hb|uRC_-R92xsU=7-s?;9G0D0Lj_oJ31K-nYVmh)NOR z_^GjuiHHv8Im10|gKTr%ah9 zP=OJ+Lgh=Gglb7HN*g?PstHFVR;BLukf#+ZkY5ygDIYSQBdzuWOQa9UzEwAK8IYmK z$Tnty19wzaO~FCGPGeC~&io|?huKxs&rrl7kYS$4J2W{sc;XWO4m?!kpvmbmiioIy zTutjv(yTHWH8T<9iM3o5Hd4Yi#jw0oQ<}wybY9QX_Hwb@TCLUqd+mK*Zf!5Ow$`gs z^+3l`YT>Ge*Qnd3HWUWdoJdr=bunFRZLe2r>$6S^FjmF%cuSk@LI~ysMB=$13bJx9 zj#3Wk`+HuTgFeI8al}uNPR#%ji$&~UL*s*+Kp<=~kWjPKY+OYaQo{ejCFmdo6+WX) zZCW^<&PRt{ZT4JUq9Knm;W}B0pgnm04Bbecv0u7igOSu4l338_VL&$(%u0!*!NX3N zmZ*qmb4f)~GfGnf3*#u3;>^$<*TFWJKnWAF4r;NqhvG3TtIL2y!Rb=hnidNYwcgEU zV24I-&u&PQi?cW?E7v{wV~nrZdJ5>FzJwYwQUuMan_U_Y9C6tw3R*g@>PMalc{F7l z3BT_XcU{Jx5Ml`8voh%v@Wvskv}WC7cTUU+k-frX`7;I)7;M6g5~1k|TvZ;cke{&( zBskm%>PAPn8I^WXUo9glCaqQXAc8UWWF2dc8hi*ZVkTHB0T;`tz@T1a0P(QCMlPI% zlx^75Z{l=|*+lqqUvK0;E4T5x2@E*^!(ScP8%>GV70@h*3MkJ*Nwl@_(PayU2QOk4 z%bkK-lEVlbjHo01jA8?!_m};0$`mdVZNkMn?6hOB+%OH;qb1SEb3H(E`o@gcOvOyw zBrweQ34*ZJVw6mpl_|uqEQmE7fS!eEJF3wT`Jf0aH@sxD1WYomzM2mLMv4~zxbqJp zh)-ZrSRyL1x}-dvA8pbPEW?jo0O#@FmmU) zv1J%Qf$lOi{#_yn(wNsXg%c4$0zyke*KmPsLSt5z8I(e|F~#2iL>cT+_cI}hnp%*J zj#b6FMMWa`8T1C1CKxehPrB?7O$|8_ zA>f8KNSq?|^WIR#H4&Yr;0KdaEEx;_XA8KBzN-6_e7-^)76%#1EAd1Z39B^~kx3Uj zI&InN4w+Zh79st#g-+yfve0KLU1}hINMNaDIAcvSY*0%fBbQ?FHJ<>|kS|kz*l!zh zk`g09Fu5`!VgW%cm0<|h-BAC_Q;`g(PNVhpYISgUaOvVj zQPGCrs%jAROhqi?gEG7bF$`i&RU6cLGE^$-AK;Y6f=@1P zHDVNIci9p=1{%{0I0%PBM`>PRT#SB+GGL$}{SlZ9RSuCWyBxX9PU;T>mo9fP**i4A zABzXc1ys4XPX(*ZaTDMQqj9rL!A66Mr$=F-FXqAZ)224}zFcmv7Dw~EMiAMyc6QB| zgyhgGvK7=-pit>D??B&`P8E@EZ80sjwvG-Dvw5y4EW&Q%I2^l%ky!y-vr4egA7&O4 zm=>7drU;39XR{oqXfg~0nP5FpvI0Yl+Jp1Z^D8WjkVIHol`WFi!A}&UGmj{iZMp2d z$JwQZimtb5%pWRFjF}P1?})OQW8)E2>^L;|HAsdcaROr26ohGIb(shzwUME5W)bG$xAi)Fq=H2q3>vDn z_$Gl|+T3;+$^f-N5IuzDe}pX;g`s$j+LB14CU`r2*%1IHmmwqJPXmg+vLqe`pppI; zmC&lZifMwP0Gw)zFfHY;*cVVIHBo%54#QF*Q{0wPi=YmmFT+iEFRX?;E{1DTeME5E zq;Lryg9=RVIk>ZAm!(+QEdMMhjR&Oi#G(XH=@%^vxg)G8M3PTNMh%zoOYA5ih3s*3 zX9r3oVG*Xyc&Wt+h<CKkH8XY3N+?eOD@RF!o zxCGV_$BT1(J57&ujF_ae z)B;k?k`EeOPAPDo$foBKC}p%{B^D0^$h9Zc%UcQwz9rmQ%24_G_6yO5n2DtU34o)U(I}^CYc|iqIr9?cLfh(puqejyN@O-` z(?Z)cuUDbo%zs3?$zqyLoIJI+w>K>o*15uFM1!5({rwY1CyvfvICt^Fg*LTf+LDVR zsP2U*r9v_j5$IEDz7b0JBmM)W%2=Yb;Vm%uE_Mo^L3LG96!bvKtd-Uo3(#PxAY^m2 z;ObN_6-Gp2Sv*lJ1VfX;5<^zsh3yjAaL0yc0k5hmqSiRv2Tms$gAi^tF zDIT*FF2N8nY)mU#R)~-@u#ri5afJG0t1OR7d0>1>;6DqyP%Z6JetC6azZJHKa zBC0r8WlbsSMv3!k$iEB zQ^HbmHs=Dt8LnlG%}r7CaM732K3I*PiwzDwK6A7dORhGkK+L2#v!SpBD;8Bmn)tC# zISy6ejO!zH1tm7s5so2xr?Sol^Egoj&B0n6Z=5ToiaJ3M9+-wH#2=^(n;`L{Yb8Fj zfZfY1C5WF?8483EP0?bb>T176TFp|U`g!Am2)VJb*g7wd-kgzT!5%vD;D zV2E2#qczj6TWYtxO8SvnZ`<2_F_|@qeL%q-6)rYFcRU`I5~AW&vsKm>kdQ*e#Z~~K z4GVUJcmgr;^`))$&In<2zeW#FqY&W&>O>6WSFDdo({iwj*FM}uS!fZ4R>6uLh03|m zpgAF{DV$zd7$_XwkhBG@8)`tW3TFzP)Edww%Ll@!L=t@FdX0vC1z=saQ%GtX>@{=* zHLxf&K!eBPxL*-reg_*VnxlYRabN2hY=eq|p1P7nbP#uJ$`e(!9;#}-PH}tR&VIPR z_hUM3X`5xS1;r569uAneg!F)2m>P1$^x;qy38BDkgJWE;Ases)t5;zSj$?%9a$GNQ zR4M5QAIJ9wYl#F3;)@=1aH$DP&U24zIFFd7?dw3(ys3m?#ZHh2kaj~?5laKlW2c^q z;2rJ?om7db2>)#~3g{72c4wzD&&(s$oQ@D8lT($5CmjhsMwVlDa8Y!}!f#KyD%$ zSpl93mu-}0#CXkI)`;*uoipa)X={R^bQ@Z-<<=Jbaj7kcN|)`ett+m)YI|pAp8Gs^ zXE*gi7=xLq%FfQt&hGBHopWc;++%%i(-cZk_TU)2WT7eNctIk=z!LM|r_i8yAcJfE zCqcYGAY3L2qhP8h+SK;!9({+W4Kq#}U;;+hSAOJl)W#=xMiXVPnl*VPcN7vL0E3{o zkcCl7C2@c^2g7mz1Fz_0!_*DzrEY?A;)_|~xa4wUEb=L!g--&mYGF9G8`vv}y8Px_zFP+dHEEW{-Mfp0#2E6cq4rYLaOkCYW?BxDpR5iPmz}i5tEBy%JH6J&*nZ{`SxQfyrV(8VGKW1x>aHkknYBrnhk;tx$4r@qT$iz_|LRR=+GxBpz@v4iIW(5JV#RR9 z7=Xv&WQ%gqa#>BA7t`Up(5l1N|auT;} zP1)jZ@I*=oZcs;Jc<{kx(IUc(Y{$vWofQ%TD*AwQMX=RNtq|dgXYt|>&w{&e&nc$~ z^q%$*UN*KjDQ6KgzO1QRXTXOL6)NY1JDJ!uQF6%Yy>O3eKv+I2B5eUMbl7Qdz-8U9 zHdLBh#8sg%al*Q@BIm?HSPT_mNwgDGf3cT4*x*qTcA2S63ZqOv%d#4+q z)4{3-;|6u01dw*Yxi%Vosj9!_y1IW(h2hNAq$d)vaGEefMO{_6G$8OjB4xAgRS$UR zv`^_KI+e%?v=BnT-i*Z%CrPOagf2PV6zcW;CYoKcYd7A-lK-APS_FG`H z4|U#bEcW}*g|&<^yg|eEH!BW~E4iqRjA9&5oS~{*k47<;c7~7@exGYGAn6vHx!i*a zi)EmR?T6u0RoJdd@(N)_AYLhhgUF$7oBl~+P{jDOn(Bm8orJ*Xaf)FikH!*9-*#ZUskenfHcHZ{|=$Sg8-nW$Z;Lc|*c@x^dRoB^w= z;%Ql>9^5ZhOz(rdCk9&sgh4H12*EfYk5xtu+C6*#e!@%`UYQY708lQ1NP1kVmIftk zM+1I=MX90!$KjE5tMP+3ZedR_(Oge4s7-K}u>rU%h!>=O=bW6<{UKd7+k>EA2u4>e5CQT+7cV&vS=+T!S zLff?rDYP-f)QZ;l+BBnLQmYeRfZKxRip5pcDh16j3>Uf$EoTSp*FeQ*Nt?fJSxV>Z6*4QonW2u_L83ZdhAX!J} zKQy7@eoUokiW6Q;aRWWQmuNuoNcc1h4ITxl0baKaEBVI?M;Q4o(&fOEO_(Tv3(Ay8Pd4aCF#jO)^*4FO+a%*Yxnlb?zgc^CT^E^*&F}2Cdh>OKS zRjhZ4%3tx9Q9$}lJ-Bdg(H7U-``SyF4)3|+wymA*t=%2zbIk&3O#iqJ>(*Lp(^BH~v~%yX6PkujO)F!}(+&KG9@84|V?pxN1_MU`t102gy4Z~}hbfDZ^f1~C+3D>L2G#KV+c z|3ZwBLbS#JvxHV6hG;*N69RjaSqzNV;p`8=8V5r-)Hp?{4F|+(t_v%k2rFs5I);oR zWvg0lF7`r<6cI5+L8m|l6eb*|giDHLp~fPG!f$#CVIm?evg|mnH+m=n4Q*lBDGW74 zZ&}Kd=vOwx<;vcWq2b?%u|XEYN`%cKW^vX%xDiIdWgQe~OyHMiofGk1j+Ww#AK);Q zWtCKkvdpA(QRNYuffEWFZkDiDGm$pI1EYAO0a@bdqQ?CQf?K@%W0D*)s2s>hg@W7k zOOb&#X%b6&SS>^8(P*%S*XyuB71kOD_R=l8z!=9Q%ty;M%W5^-bgy>e{&IMu$VE{T zS%6)hITr`W$Ccx?Y6WnTQBA;L(_}A$a(My;+KKB^X%o;t2)FsVu3!p}?#m)d4}io@ z4c9dD!ME^Z!<@K^aKXGOme>G1`Hr&?pQ@Q{Y%edGm~2r5gRF5k_s%UB!=>4d4n*OL zEIY|YL?RdMT_%k-MOeDGCUHE1%b+E@=we01-;|^rFN4~`cZFY8&Num(xOH`!FdYv) z2QCmo@RNzCbc^bwLRe;T@=AU(;0(J5qlk)urYa&fsoH9mt!w+%z5As*biR|XM)C)| zN#HL0r23}WmX*@X9t0MO5Z_^>#nKLGEfBG3sXGVlP8i~dl7%YJ#Eb}?`EO-)4WeK{ zc$HF9Mw!Au#J_jZaRr@l@0XuNg0bUyhsGhoAUJFO?Us=J8d|0vV-A8EQWt8$m3UFW zf!M;kW~S(#mxvm@VW5o;Q&M4ip2P$-i@LcO%Ln1k{Le6UQ^D^BBZwbqgp8`(Uzngi z?)^Y3ye8r+OojcKNz5(5wL07BPz1$}dh8Xt&X|GG2x10*v~jXAGm8`TbKl+Fz4GdN z-Eqh5h-GV-m4sQElVa7Cpn|0(qrV*eaVDBSA|wm9QZb>@K)}iyt3hCK^Mqsxbip4a zNb|Nbr0NlgaRKyh$R$rTMh|fVyH#N+BcLe#3kJqEu`+tgaqZmmsQO(!~CB@jfPI4fRtYSY=f z?s)8@AM-?{Jogseo6lzPni9CD6j|`fIyO2m2MiqSf~9C!EM_8t`(sAj0)<+NM}+0qERX|1 zL)82)0~}#ve!VZ|qf4=fym!&o7E760Umf*68+M3jYyQS;D|Jq@L_m&B%OC?%fw1aR zd7ZJW3=1NvCJtdDbT7tSZUfdLg)ht%IYx#jo!l=YP%2+X4|@1 zv3z*WxW`Nozl&g{UsB{tY9hZaQ%{mEp+;=5NVP$dLe>}Zu`9T8p5wAj-VK#QtE)AI z`>j&UNe?D-YPE{t(ddMv2XC~N&6G+-{R-rTztJkt+<&#Xg{sIDvSy}`P4- zaew1FH}a+gMkA^QJ%xKhw;BhL8axvm3;zO~x^Bj{FE$;Q2k79@5?1Q;NFY?q`jPD3 zzkU8c(vuIccmFpz^Ea|=VpAfvluh;FVrUnwjG09?^p12irAOt;&_$ybPb@FP@tn50 zveX2X&9(?D8J?S1!xK>hDkv5CU`$`rSEiiGslbpW=5M3OTT-}65_)HrE3j%8eR@-L zmE0C^8<+qN2w|oMf@HM>t9=ci@x&0J=9V6d$`qR^$1C8+Qh>&kKD}aNh#miWeOcL{ zgg}iH=9wMUF|oUrIZtQ~XP7fo!}LN0D}`35G?Bg%+p_zAb$jI3$VdOOfAAIB&x`Ne zb|&_8K@L5!=p*6Wt+uBG%eGJfMo`Q!@IZr*six|{pOmTxp0VVOMGRb18;$oy(H12p znX&!?1P73*8cv(U+g>(BRQT`j z1ei#^Eo*SfG$Jfzs!@m6{w%c5sI(9fhMhB`ne=g#wX?Ik?p@V4h$_oX-K=TTrgM+lgPUFzM$<)Vk^R0jPNfoGO5IiE`{ zE>e)uYNevikwhF3#kjgXT#^mM%UqIzf!0{QhG9S>jFa#O_zw&v;-{wvm_q`o4n^BE zmOj;<>4!}PYw?uG4vj-wZlObr&E?Ttkc-}8J+_Kyn${(M>C&Zt`TQ6B*8lpo#qQ4b-fr*fh=qgb06@QJqSj*y zAW=BMkmFS`+uGW``_9|G;89=j8^8YFrRk6S;~zho?I-@(kGK_#`wpWr$Ch_Dz%Oy&p(on@Y9 zZIi0@+1I4>)C7Q#uy*WpW1YCboQPMjcfs&%;mbW+YtwS8O$+PR*DLEi4lLj+3>1hJ z08nZi*t(mqWXJTBzbS=P9~H5z-DoWKGKB5@WAb0npY7eG^X#VwJ<2X%f<%VleAUeDIop--h3 zx@vl(Sj#9-UyeN?&SL(s7d1U zb%xOxdm&pw{G_hIGgLRD@S4$Sxxst_nQNFK9%>Zcz7$x>RZ+>(4rcJ zetze^w*R@dKBZTGX+L{?lcTOpWCDfoiPGur##G9OhOs!P)PS$PF(Kns{OK#hyGi5f zovfCLAzSmkZ(8P{s0Mi^Xa|^w?r%&{P~+%KL{wsu-wJaGN99ALA*Mu{FrKawI1nq& z2F}y!6+kC*3~kWrm@=?VcKM8T@g&Zc&~J3FPGSgemX9h?AK1@G|Aw&T;dkTa>GJW2+t43`YdDk-`Qyl5>0*JKpZ zPHHtNaaeXCD!jJWAb291FWZDEnNOlbk*qOJ6Ks))A*TY>F@*F`-feW3x>m@@m!FSse+4T}+6VBpKuS zlD_*;p&V6;Zx7Y$k75^kTZ8i!gUph{>NkqRr!qFiEf{O--~MJWq& z=sHHzPp(|U zs;EjcjRj$42X1~*5m`*l=CxfqdhUzg zBZ@j>J-9biPObQah%6FmHPkGDKtkMDM zMX`gumNF8Y9iVjkNFM`}0|YoAEX;;ZCbx~Wxq3{fdL-r~l7wFIV2g@`0xcEzhBnE? z+w|gDSslsgN6K_xo3})lqLauZI!T+LFioIBi7Fr&xuu9s$aotHRsR33LJoZ`{`95< z)KUqB_jpGWYSS7mXeQgSFho@SHkgluZ8$$wtcf=BX3hI;CM|d?Edz0luEUrEW?>!S z!TrZ3<|_#3I1E;=Zd|d;23kRsaPDhcKof!|K#xFO5vLQw^kP!RFT1p zTFhd$(tArVait2s-bOt^>XM;>yEVGZ1~iDSksC|{WQiBB6w4RrH~`$hlXNKL0}03? zg`$c>?2;hHOy;Kh50d4*^vvyY_eW&Dm|L#GeFv*en(xw4iZWD75g0V8J!|kFRZ83g z$0rztgujC$fZiy83+zP_90mnjD2NnI3Et}M))#1FaJ%tqIxHfsayU__)5)y*)<$2z z9y6A(bZY6a@aw;s+8LR%eJ8 z&b&etFYroU0m+5DNdxg(2Ex1;l=Ut>UcMKxN=P1FQV=Le>H>DdDV&IcrAlLIK3Y5~ z2t|^!R3z#3z2yzyIZ5T(oIk_1Fa?(TJJ#ZtHn&ZQ9-0?LOlh zeMIQXKSXt&`-O8CFP=SraBz5Zu)28u()sfj)-zVXCg+UnQ|iZug5QK_Q*|5NX7DAn zUXPl*0v5qoG$v>Sv0^4eVXY-Uwd^RfLYKB-7)~yx%>@YsqPAG1QwGIm$OEc;hztNO zaJJMVTDl;>w!%%oO3Brg?b8~9NGb@>WK*?<#S0b;0*BDKmfNVN0llp?v3~BZ+kfpv z|MMH4`Hf%s_22UEe)eD8b=RG3|KxK2ip9>pEtWUm{KBe(IBc^}qh7 z(cfBXs@LA{{ttTK=iYC1@qB9&nuiu}b%mIS_&M9TRD)bV^jvi^9gZZ8s-m&g z1=*b8(0~{Vr;ve5CA;OY3^47BN3s+k(#`tZ%|xd~n-+-NLg8b94DwZBxi-~M3(*=n zFCrp~HZ7#f+EzBNV>Ad)Jt$VpjVodfWOh;B)O0E`gwDaPn6^yCQDMpYDJ7UJS1O*5cbhliHurFx-Bb(<rxkh?S z1ba6v&XB@zx`^mBsV;i&Hm@Zfictss9AOmPp%9=gt||w@Swu^x6D`A9g$lI#oTKDFF@-k|LbC>)6m z#~Npf3Y;J%8sS&xUIPq2rr;E|34&`v+_+X*y~)AraWix#=Go`S>!M)g6bNvUB^5G& zMxNshUZB{AUE%^SPNo<1PcLv80swECoUe8iXP`=H+?6e8F3PFl1vvJo`~b%l2A3%0 z0+0xBC9lRHdFrj=-_!<59TSPUrv;EeJw(^(cpKT24kTDlfi^@Ifqm=|hjJK}azf(a zJA8jQxmnZ|K%_+|0_g4;j5Jn<>dpc>3TTxVa+h0jaI4(?0lDIoE%x-vhuWQYmO~Z{ zFP1m=(NcncZwIP{H71@CKp(VWnmdFE`Q%a&HrA3)0fSBeDvyZ;j%+z$7~&Aoc*k}I zb_4qH{xlP^5rYZ@kT@xtPqy*a7>j0D2X_Eptl54GJEgC4F-3J!d6Wqn#{HNX<_k5P zr5YC1VtG{PE4A8?G{s6Q!g48C&_AU_8oUF+oa9$i|g*B9IzG$~@Vh zDs?X273`Mc)4jt8FA*WAII4&JasEHFz+dZQ`5RRV@Ejo$)?b&D*jWR#+6b#?S4UaJ$;DWnsVRTgnWhzwY1%-jH-F%Cft>%XfADu8Bw+E7<9UoszS+*NQ` zQA*LbYcT$iYJD!(wb&h0N9Kx=}HYN zOaP@)TP}C*zU9X6|A8NQ*0(z?uKH^25(d)M4oY!XwmZq}!TwrSCJ9`O3t{NCSt z&hBr&_(k9Oo!{{*FZ{LTYCSER^~jKuSqkenYd8c5MNK%Z0$F{wE3Q1XSS;_n=iJ(+ z#k3=BDYAXf+4HOQdTV=!buS8NNU{uHv;0J`yPUlh?F(vhSp(5Dm z?ImWTL(g=ZS%AiOe{rg|)}~2BY&L%lB1K)G5ZL7^9<7&x7(R=>ULnR2Y;nw=HQqU2 z^haxng~*3R76E3+>f`n>T#?u<5t!rcBQxIs>Ii#`Sb)?iO4JouKoJDZ$cJ(P`DJAo z_NgJv%MwPwXv!1|1mK!Q%F-RL*L%Dqrv7?#f{SRI7NR<@SI~AXGKkv*{K68 zFh(sQNdTXsiUeVk+r{LwKQr^$gs3X`K>^CsbPE?NI1*32oj9%ux*g$4$enuv&CE}b zDH05GGq_%QcPTKceA$8D!?&L>2NNb&xGvD*U{)4!uq>O_)qE*ZL!|*vS7sBQ3vqFD zdISqbBXH>vsqpqnQm%aCVC)4*h4-0SD~Lp_h@TsmW29sA+Zo3w<20&!M;#W6s%X>6 zuG(_wRe~I>tOTqcM3$#uybz$3!{n%Z6ntD8OI$+ytRlwXpxMHH2}U&M&{k|oh`u_T z7IMbi(V22xbQqOFv%pwRf)%_MH9zUay(|deerz*mDKcg#b{zNMFAOTa8ZIJCX5@;p z;9+?MN|9>d;Sgii%m+jwmf6_lX~~edEBi%tRO4wvWvE9f+|cF4dlvFe)of>c)mbuB zOij0Cao%oyeY^ix*|e~&UE#Vg5r40WWwcVh#L~)|OY?=P3OCxSIXE$97DZcE0X&mh zn12~h94~j7#2ye7k<-cr?uy_{F!L7UEomfjBV!j)=}4N=v#@c-KPFyTPB|hAY7*d| zJ`~lH29M)S1v85@3mT}3|E~ZniVg``!nj05Ezj*L^m7yd75e88nO{`Y{_3=|i3Ax? zKKgN{RauYAk3j>96$8l`S4Hc53k+#ShxPlQ_HI6^O}ZT2Ea%=Q^BHNA zMFN}JkH|u#L}HAoT)B&SQw@AkB-9`b-tx4d(3}jY1P&_`QgPmdV;vBKv6f{aHf}Z> zSqFmCv=t%1D8v#_AvmN-I!Tt-S+Ydcrg((ne%y+OWvZsi!{gXR5+Hehx?T9Hh_Q%x zf@n2r2e4BwMOuuxhDJ#$PB!Vjqy^jGL{MA-;)gpn*t_*^IW#b_gwPUS8g&O+ZSZ3) zgcx1I-5EJoUjW6hgC43_6KfLT;;=T~4E|A*lYT$gP%PYOEN+x=7gk_qU9oS!n8)S^ z$f0=$+@OoQwaMS}B57w)9#R!;)7El%;ljac?z6>P8hRuj{y%pssaB5g7=owVsBz2ji)ie${p({sWv zhOda9E#!_^TLd|6mg=D&h@+(qz0RQb1mep{W`d zM|e{fuq-NO(_(RW>C)ETRX_eO{^<)|@GEb8?VoL(yt1|3-R-?g=g+PCN=4R3hdbM+ zW^LOi@Be47e93RW>>Ho+4}S2KuX^oAZ@A&qRVO`+u$*dDIKo)VTa1DR3=D6wn3}3= zEw?6Z2S;lkkCVGPI9jb|FHGPaQVGAo?r7Kmye7%iz_tvDiU)=)1uyP3tMe%cNo4dU zfs}wToX=I_OCU*bp8=_-&qk0mn`cv1Z8|lT)@L30 zl)`-~cDSI>1No+svcfB};TJW#O#x;!kjz)KQld4Ek6evm=P5KflKczGNPUgyNU%Ui zD##0c9-;(PQF{ge&;u=`TSfv@k zIUkYwlz8BWJSVDMMe}j9g_Gj89TEvfswU^j4Wx3TmJ zXkL6#o)qr>u|YJjUAR=S$D#w~iXAyWvg1|%Bv zs#k(oL{z4EW+F08Qxjb-7NXNM>C|+&Tuw)`sEam` z=_1X#Z!BnwX=`_PYkT|P;`!CVL2Ju-btH>v=fufA9~|CuR{BcB7ALM~({yzHte8q) z@0>cl+}k~W?yRh=O^deF-ThrPxpZ)Fc=oI#$=2S^?%w`-KDu=FY+sv*ESAgNQztzz zC2E(|5b2KdwE#eUYGVyQ^IxszZsi81Hw=RW3SHHs=<^2H8@!<+8d4P&Zz>?z&>C&B zY9ISm5ffW1x6Xe0rtkc|AL{e;(*OOE)p~j2)ZPnz?q7e!lb`gXKl*?D)f?U@eRb;8 z6)*YiUq3up{qS>t>=Wlc@yq|=g@5|>U-RWpdcsHE|G{~+Zmo5gB?@p1NRe}8Y7jwz znzU(g@!Z*iyYE@84i?wmcd=Y9wPbg<}ai(u?rW@+%1dkHZ`*zOSCpdZOKj( zaY*wBEderd8N&7&TYXJ*0U_L;SZu@7(S*t-+)66v;)TeTvu*)vZv`M7rv1;3^Q45wcKW!l7-d-VvRD1eq)bGbBRg z2^HoL4dQSLE33%5c`_u1C#!gug8$CS=BnOqe$!a^^~S{-lTG8vdr0~~ts@e-V2RHGuz!qEa;233t= zsc_Y$vfnHv_AcN$S1u@5?L$LAUMbDHoiqIof(>Vd1SJL}gUG_?MoAe}6B8AiH7aWe zld61UA}t)d#~Oh@>Y**74vZZoNvLA913iv;0*Tk_nZ?0=Lqry<{4vZ9w1M$wM54d~ z7@dKz+FseC1krG|5X>cTAugc!BpB4px`eQTz;N+ZRWdkBg8{z^E4umeoFuzI3Zy_t z9H;E6s*heL%zS`|B&6i|XkUxu2zHt_Ura_sI#r0-RIngR4esf}+M{~HNRD2e0?R4r zs@0aEFIY4%llui>zR)Qsu(ZTxr4vSd3E2oCD8m7$3U-JK<}Fat$yF^XCb68sJP(04 zgSkQ+J{I%&RS3F;pv5@ksz`%$i7?i>PP**&sn<;NdTk4vuGX!lP0f$YFe<;5hz3?1 zkwcX<+^Lv#uMNevKB%0gfpA++uDt@Rv3+QH@Hfvci8tAns2IS)r+i6W1aFr6+?<)h zlB8tWC4k&LP|e8&P|kQk%NOvLi&H}MJ*~ASMR+BOgR64t-W5wxp*E_bgS_b!Z|1Iw z5wcclai%?P*;1@nVLk(s!M>G3VZj=toq1cSgo7 zsjD<7<)V-57t^csP2u0+KXsqoK8BERwbXgn;HJl3PBiNvNgdf*h`i(E)x$ zeWL&a9>ED>iTR8wBQ8P2iZ{k-xmoarf>2siA?VbNEMi~-BNN4Zj;i=N?%-kS9hxOc zib{kx)f5pHo(-r9#m>mwG<7)@oes{Z7s)Q4ujvtfVuFi5=0_z9-%;;WRcY!4BlA@$ zUCcw-CL+C?$$ZzR?y}W-u~^)7+wF_RvfF&;?RVdK=G+xmoH{r>oNayel~+c5;JO%x zjuo4&=piN|(=;7ky0E%*@%*{l=XpMR?#!n?`SEM-bN{b@`nSIEO@H&>6q+u!-xZ~Eq^e8rRRy#3afzTyu*^xk*x zpT71P-}y~n{*_j{tjtN-(V{^XDU_}r&&`=T#>^0z(f z8Apc~U;L7nz5j-fPK)IOA8_5@`G-HS++N=G={s+@;UjN(`+NG~`Uy{Z(${|N*B+cX z^Qzar<{j^Tc!B{swJWPV5y1@aSg_cD(8M?dHWAZN0xBENWKxoT z#MqK@?lM#9p`4uvL!IAHy@G%&_IjsBU;UJ?dgnXe^{G$ayuH1%I$ZDVZr|^|_uk&! z7M0%nHP>A8u!lc*KI~hIg-oYE@SeYU%ip}~(O>Ymy}kc^ba1e{w`aYFbw>{2ov^AN zS_n_3BC@r;eb=Wy{bgVFrC;{suXxG-{`K|2rKL>PMa(qz)y1ZS!-In>uDI?&4}0Vd zAHHFAxZ2uY_TJUnz#d?wli=YgpBxU-OQ}dI!(U$rO#`@GOnUZjA~ND6asIGP2nzA#3<231U-@}C@L}4 zFXp=LZAI{?gM1dCdXOk={vRQ+_h zxKM83rxo5}H+V=3Au`y+N77tX`BhZ3wR|e)Tk7;I+G(hyg;1oCo;b_BRZrBM8nLfL{VAs3v_>g_;TBfCKR@vy<)Vom{EhyEzww6HA{$j8~@ zD8%tx!*W1uIk(SRJVgQmeG$!|(TUR_X;v}d47`Nep7w*|Fd5gXrq5P9*qVfV6=nh@ za5}B4Hoou;$ddX11BM}@7&rVsKh2M0gjzOD93Y2X6+`q8Ukm{vu{4Q1pG-MS{uC|y z$a9B_if>sj7Qz2Ta)ApHN7Dr{f+NE?bQl^y(k9PH)v4CnJ`3e- zXq+0`G|rxoh3T^Got#Bv|FP|1-*1ciN^dH&h`;}f`UCx^5L9E2v}-$+!F%)>iKc}c zKAdv0rYe>aILfr>!fmGkLs|{rKcuT^-Wr4xRNvl3s6_F-wN=P&hr<%F*k;3Oz zMx6-WvPV%EIN&$s0%BstQw+^qku=WH1PJ??rY%^PP}U-GX)O&TU^wrIJ6R@6OAkb~ z3PC(Dg(*zYabTXeL#}Q}-@!TY0T##S6DLi5E;>#+ERvP{6Lw@R)Ib{#a1ACa4%vq? zR6P`HYSP=JDqZBHEk0+hr+b?srsFvMKLy{=0?1498_ztBcwM~+5P>5Ad{gbUO%wu3 zPnku#0|XWs5D}>6riy)56;9&F4+0M0RI~7yidq4R2!+eAj*4v}lJ&R-*ikXZL&zck zK7pSdF(^uuDo2zmu#N@-IK)IwvPF$U022tr2uNGJPb==M=fp!r$gaXNfdq3STjFY1 zlah}7Qiyjxw?R0?2G!SusHEYTC!WpKiCjunvx7VT*5kh5OTX;P?z!vy_kZ8_e$6+0%`0E| z>W|<2sh@oQKmVKuTzk!Z?)yVO^!MNY&UgI63x4_0kAC!%zU;}X!=riK4=-N0?%wx% z`ZqlN1MmId8{hoaZ~xA3fBa(}ed*lUt?jM#xwBvV#b5lir#joY@D)$_s%Jj^>wfz;e(T1MfAX82 z@y(y}fCrpAbI)SA&^TzunD2$ipb?h!%2FHg3@UHT-%+wmSqHC)ni+MbJ!Ye+6?H90 zP?)<_q%5{BDmGYy6kSeysX!9Ywvx{Ew|lzczD#+Oyp<(?Js}b)1Up;x4nH@ zPFuVCAN#~7zww)%{q%4AmQR2BlP9mZO6=hJ4}S2gmyN1Y zK*(aTu+_x}-0uPZ2HCQ13SUSBTn#$Hql+;e^feJex^dY_-KQ-l%|3yvo|LHWuiy@TxiV z$3!qe>XAE2e4-nIncA0t}?)L^G>Fq2z=Ngcdkk1>05~6Gr<-jO0 zfgRDWlT}O#K?ADaI4G0`7Ri$N>P69H5nuXkBAOYjaq(%CJ~`N~rqlM)Oy~8=dT)5G zZ>*W81jbUOD%QHFSnulfeGDz)3|}G}OTtjkjK+jKgt3s}jm0|F>RAlKSqN)G4rK(_nx6JTP9UPxUeYQn9m_eL4uDY0z++TZL(;vEGCDBfn%I>%CW@m{TL4n zyl5s_k_KAd+bANQoMWQYb-bqLP`OfPN%e`*vpmrAg0Qt*iJAxOl8uxmCzeaRfVyQ2 zu+H^3dSk8((p4&4lAXi?j6|K(76(a2oJ03hXUGw)2&^w7I}s7#7IZVP9$mz4z@MTZ0%nd{0yyRx7QqfO^jZL+<<>rUMemADF!A+QLXsld@!UzIE^ zsFF=VpOknScQACUz2p*}0`Efh#&5v4h~vV&^Z^V*d|_fD4E4(TO=oGwJ`8!%iB(v) zqE0G&h;aa=M?+xyIxN<6>EvRC8Vx~R>-|LU%x`juO125N8wH8>I=&ixML;arm{d5QO}mzb-KL!~2-rXw zx7B8;GYy!ig)rBq=3qYezFOOAHH)dASyTWdKNt`@MHz&du=#O47E{+vMfC8}rH_B? zqYrw>Lz~*!3m31rc&MUxpS^JL(!uKR@VW=w=V)H3w$>&;hThCtn^4;_Au>?$@UM#R zMv!@4uZ|8E%e^~4b<>SE-Sp6hJ@k!#zI^=S|JGmr)f;Yj{|C1BPrmGBFMIDh-t?jC z-};Epd&m=>^rW^}wnf|8JGHZa>h$TW|MpjW<@N8m{`R}?*gbXnwma{9;fsF#>MO6@ z+u7;s^}X+NU+eE^-Nf3w?(e<+hPS=>|Lks``0_9R^0&VAZSQ=`Yu^62$1a!4FMh%k z9`eu!-*x954|(XrOs5Aw=%G*ek|*DN{@k_K-S>(suKMlY{+-p)`bl5@EEj_TMRTwdKtX^~X5Ii~t~TRJ2s5!J(pRh1 zdfiRt+4@4ZKlHx$PK&MWQ~TP~X47f9{(bM74=%{o$=&^JQ9ZbHFt2+H$Ho6IqX_qx zanA5@L~6^A-~7q*=MS#9;+lKzIeYHxUH7{BUfWY^&6;WN?SY^3xo7UY^Um8oeZT9j zJGsBNUe7t%M;BgU8~tR0bQu#A6PtVQXlw4h_ukE#@OV3zY4J+*%O1g6MIk8;CH6C? z3kt+Y?ilW@n>B=P)cS1JRj0PKwBBvKHYJ>CA&~8e`aA7v3~8iMMTAP1>67wmXs;$f z0NmA==+G}SNP^eTM6WJpPQ+(d66=PVajxcR@Jh1k+Z)xC}<=<;m@mkp}ek z;6vlkqfzT((iY3MSoHP0?yHPMv$x`AhycPtb95f!78nq*+!!1qK_pysRToAI|)l>ooBUM}ULB*CaUMI8gq93Wz=yW&nLe*?BMScDYQ z>>{;;tPthoAJK4xhm3ABN3e9)756nuMWHu1aWh_{fRPWo>4m>Rk3~dldN%M-p*E-u zv1Y;;v9dejOXQV^au9JA9VzV?OE|?80~1;c5rtuCr4yz`+_Fk~Bxk5{vICDnz2>W^ zW+I5M+Ae_CLK?=L2Y@hJ@m2kecQA7sNPRu7orz0<1QLqCA9i=rTU)@xL4udvJ!T4yuLOY}%Fdh;dmOyjFc+OIDogROu zs{peMDC+f?;tG_aDtOM0+*j8kK?$4iKQls#W@WY-bHEy>e#vFsVAy&xPl zR*)kqN(&0{bw)S{o618-NPe$;uk*Q z%b)PXmA0#|zVg)Rt9N$xZocWJgH=0m<>^aD^My<6lc!HFm)mpK$3FfE_rCV@2R`(n z_q_N0(_*<^9jVIU(cxmTP}TL}k+#+rQ|}!i(-7BbO3>gxHI!u2R-wV11kWdnWJQE= zd+}yNxvW@!K~bsK#w%Q&TK)&!AD@xvYic5^JMXyjURPhewX<{n%!Sie?tR_Ye9hb5 z@%Gzpy>##W%d^&42N_*QnTiue<;G3+FFgJZ#hCgR-GNwK8ru zuo7CTsPx{a<<^Hka?{=C?tbXQ9@^)-|ME?5{r>O!&Zm9#*ZQhHY zN3E%KHLXEjqM{TP$UuWrn1P0u!RmB;o0oTaOiY?K@|e{$Bbayt)*%=nItOh?Z46OY z{A7q(#mxLjY_ioUHxZGJ_pyt^SV*^oR7M}*&tkmFpGrAI>8|`yj>4p?wrRN~ZCbBZ z>v^p#=UW+ni3_5nLQWI1!M(WMhv~~>f_5;F^A9BwaEv{by zDW+VyD-oe3?19r7#UK+CwT^H+9>_pHs(w&iij~&kv>9w0H30>tC{5hD^^Of(&~QLT z%ON7{fgYf1nh8P}7jbkAdNucR1>{udflLS`+}{cYmbx6RvcW(Y!DNC!t3y?pPqzM+CH@I@8pj6`#JXwN>RiuBC$jcG7qg#8Q5attF%&fVL_5Y$;e)% z_QjMIy}*YFQ8UZ9Uan8Cpqkn!U_40_06GI#gQbo=zw>`i{bIkkmivFb?%vP0 z-y0Lu;6?i7pe1%9LRCbxHAB`H393rOvVlFt-DbG26k@cg*>akym3O5J1t3M+nzRPZeXdwm#gJ%JtW$0Zj z3SkBT-~ERc{I}Zv7@uTO*(3)Z$P=g%3T|e-ld*)<8qlTc!V4=GtWlIeY2HtjBFM+h zDnc+IFW?ZpprG(8%5@)6xFJoLOp@r=TMH@!lA9lN5&;Cgm2ncrB6>GNuw!735qm-{ zs{$i{%E6mRk0V#ZFG$60@;^r5R%#M2D-$nL&}7T%xD;_?y&pC761@+llVVN$GmK8! z+Vt#&OP7vjotC0YT`UKH$&UeQis@U1df_1eSimduMBBXL;E5@bF-@nr*$> z-rHI3?6tO-+QQ?sFl%Y5sIsZz-_mQSj{n_6WPNzJn6&qK`{b1$eE<7D^nnjP``fa68_j`8sPX7B}`1x17^ko+=UfMsgqy9E|mGyeH?rUjHCXv=%*4sPV zUHa{}-!ZTH+u!=u7yXxC{EgrIt-pTD+qbsmArF4&d*Ai;pZzyKb?MyvWnc0oSKj;H zAHVU&pZbaCefY+kzy6z^{?PyUk^{>m?H@9v!Y^o{3kzvcX$AN}Fy zKJWkee|}`4y1sPR*8cq-{isI(i$HY0T>tKOojrH3+}ZJE9f)HXJ|^WVQQTLg1|l-A zkM>Vr@#$MW^zL_G|Fp0F<_A3J5kLPkFL>+UyywL)`IX;!#VcO)>%aGkm;ctg-tn&g z_#b}pDNp^n$9=)ydiASbcmA%s_pdlP_pUmHH^!&(51?opK3*iNLVoaNTP)6>zi|7f zZ(Fa{s#C|)0mp$a-R&_#!qzmG;6-zINtRVAj7!fL`r>-*IO)|DAoLY6zTUyi`rPNa z_udwZX|d!v9^r{2TohGVP&+gFhx;{)g##$7I6++S5mdT!^7>7gG%&b+*DNzm{)^yU zXewM(BB%$4YxlMHjJgtP6G`0N#6Nq$af(@45S2t)< zOuRU+utWf3j>X)HO&6H<)MTS(WSh*=R2Yd~^Q&~hk#EDI+yoD!Vg!+GvFLM$#s|Tp z4+T>gLNkD5l#4^-8NX>^r3vPL`BQ{G&G8ZMpbg<9xJE1fB@W&jz?;}_fdVcq&)wpj zL5Z~$2z4SPO6K^fX|c^Ebre0B)tsNKKK{jEa0EB3)5&MUmc!EvgGDWpLTtoJnNfT= z7~jf@3_;8x#bg9aax67LlZFgrQiaN3LQ24d2<+SPw9rPkmE#?`1)P(?03I7|~pW0=Js>>RNY__xywph_TB3yw@snT#cLZOqj zN;V~;(wxKlTNmKiCQm)$G>yZkq!Ch?sDt|QR^zyCRkq46CaT-pa`yWE;g{;8{=V&B zBfD42rBCQ&$d@PyZ=;PM4r>jD_?T1#Z&pTH5fbREe>>tCcoq5y;mKvX7_Mv4s=kjh(y7SOn-f`%mfXyA~&qYYN~0E zsBVOwSFKj%>0bUPj)|!jY0gG}$BH1q)+Vd9F0O13_)0tZK)dZ7cFSLgot4F|*jnJN z^R=%g79nqdMoO?~IJq%G8ISPR`jb$m5yej;!u?uMEe-mWz9FwOajl;Kju--n;rh*{ zexNm3R$Rv$jm5aY!Esz!Tr)^FahQ_Ug6X3+N$ouW zHfuV(;=C%pOvoR$Bsl_9A|OQD>?N@X~7c#6o6!=Ci)>^B(!Y``zcd z{r%k!yz`xBFI@V^|M*9L;2-|*g|inP^3aF<-XHwIO*ejYXJ=QY?Kl1P-#q1SKl$(f z{U6-k*}wLxtB($k)L;D3b^pYP?X9i8Ua8p0(2UvmRoMQ{{uf) z)<<{WcF$kE{te&utZ(?g{@G98`#$$+eg2jI`fK0#E#LfwpZ|Hk^b7ytN1pe*+iw2o zOJ4knfAz0^`UCHO%YXgV|9-_a*R0m7loleM4NY)i!3k3*JfkF zbmnLO-7o!*7yi=Uy#CMr)35%|58m+MZ+YgoeA~0X|imq4d<<5@i^ouX}`QQ1Sm;B7n{ql3Z^E;mP zjAuOepZwFOKJ}~bb?xG3f8iJZ^Dq6!E3UlnFaE;Mf8c%BzxX9D-@D=@s_FzjVq`HV zL3}d6;>PGr;$2f>eJ#zjsjQQADYJ5PAbRgQI2w4drq;XSJy6VVqxO_Rf5-)3SVqHw z0EZNlAJ%)AkPl0(%z30}Dpy(1QW&z!^huU}I@RP*n)^v|KrfIe~OS7EK^9 zD`k$z&D0p*w=fAO$y@6FE(R!P){RWGnQxJZXwSprK7fA7Oi*6R;acxeI_V`s3-28R zO=p6vsV%oebe`AN`{tPs+$5Pz06WE4!GZP#%Yd&+j`9#eL*GeM${sIPh_t`?9%D{n zAs83Pj?Wg&i+M;%F>SakKV~FC;m}QwZff?6-O++`H(ZM8T!mSPO4BB)9mnTb)CzHn zGU^4QS}LTOiN$7Yq;SZOt*akk3DpX|MdX(U<$Ho;2HuK^<-C@_2=QtS&m66cfe}?a z;tvQmt5~cAROAd9QBbkEi16?pt)ePcZNXfQ1v*HiAM(Kn^(oL2dx3jBUl`yDVx+&g z|CUi~;QnVsmXdFnHlbH&mKwVi0t*JD@ zQ@~Mjg~-GHnGl2-X8aqt0qckhh~@*DOt{FvjX4}X9w#1BV+llb9>6Qs05jkc*dg^U zScE$QDe|?HYP}ra5OOZ;r59<6M8$>KsnzfhqFlsBbP^a%(H{X^TJI`~tklQC6M{J+ z?b6!G6Z6MkGM(DfX(4CcJ#DvDUt`HPR1T`n^-I-x`;QiN4uhQu6{q${34&OlhnjTq z8eg&@+7h(O7k3$I$#5xwV$rvH%SL-KW0@76yjpQoupHRw?CBbXLMn*_kkVsCXn0H^ zXjPOzHp}uK0|-H}TZ)Yoc#~{rP)Q^btY{RAz{|5KsJsDB=X+aZ(oz)qdX`O!4G z#7uw7cr=3!<0UB?o+W@Bh!N(W8?dN)gVIw$oCc5&`%p5)F!`Id%1NW5TJ$(DCCg9> zY}Y7gQK5rHSbSwHuec6q%V-D-d>GLc$iFMZZ$(z_Yh#fV?>nftsq^+&5*6Z!S{>$%%(vqnrN%1KY{eLg%mkg8H;XyN_DM0B3#{VT5c!&m;{ zrHdC$`_^*%;OyOt#q{p?fAFS{endC1lW!yoy;*3O>2qTlbn_xb2wzwzDgc%RAgfBdii z{_uxA{Px>F^^Ui^;oRM4ZFS-IUjDL&J>nrMTOauFC%)*5AG_R{{^~FO?Cga*ANhz! zee@GIUH`uK-g@h8AHCtmi}&1d@#4kTyyi8NuGj0;AN%oJR#8JeYI0)A*llJLButE0o+(^uW| z$q)Y4Z~o?w|I>f`=YRS7o3DS@D}Vpx-*oG3|M0m#{QW=l!)A8pU3dM!5B%_JUiF%b z=RSS<>WBV|fBFx8_YZ#OeeeI^_Q{i?DqLTk`Czc9LTm%Q-O_gkO) zBhUTMFZ`9){pG8F{Gb2S&;9hz{nF3>lByi``Dssm>VNzXzi{Tvo&Vxr{Nz3N+;!^e zt5&NcZIkrw6})bnnjPbekWwj%>W{6Pm|E|%#@Q~)mw^Ny-A1)WvD#F^5fG^`ajh7w z`sx8;5E6HWz9328Oj;RES78mQsP%5MX>VTsus-+oTGSWBiK=Sby zHu0C5hNLL^;^wgPq%9V$E#~!XwvH-=MK)fBfDnVJTUlh7;ZFv=!HRkvv23bTaEk-a zA6c-GIHePD8{SAq+sf(J2$D+ILf^(hK|L$31ZVj%oP7X7Kp0$n#%d-=HMKQqYIB!v zWvN%HQ`kHYE(MW=o;ZOPRU|bL>9eSa&v6wxLjsI1dsYETnp$9$g7eCN=IDe8OUg3w zJYy*Tk1tysua~Y9a5-d1AZ1)L2b9N-*&%HS%2%QggoaI}9HL?+-V@v}a8zEsHS!6Q zJg`;7HU_MTvH51=L?MyvAY4L@0*zY1kd5Ggu0_fdp;%e8 zfVd%-azx7pP*?BB^lXd?F#Z%N;$R?eqy%1n6b2bE)Eay=5tC-Ro@L%rS++|b@9j$4 zIxTXpZD}{f8lnOFt63Di8pJK4JjIhkisx7&AI5Far_JWm*f+b4;bj{+=j+=o5tI$Q zt!PnZxr-JR2Ug=byzMpGLr4~2mnKS%NP4-93@Q{!_6F3cp=D*p7;+}y(CutEIQB#9 zMnt;N@7QLbONof_lY_sS^||~sY6Koc*P>Fkd;*ILrxj<`Vk)8(m!f6bk#<$J_1xF% z?Vatmx^T3b`u4TbFPI$2H2Dy7Wn@%;jQo+(#h?a^aMNr-F`Be+L$0@e%#{^i@6zZp z>Yxw7N`HgkGd5xUIi#u)8*n;{!oeLIGROsj5(T?fEf;O3La2zZ=}3F6v6BgXhX}$4 zlo5(k%QiZ>tytoQp*QhlylTM0YGDB}wF2nDqlgxoY=Fco_{+l=b@gM$SU$3va>gwk`?;ri{ zOJDZhcfWgkfA^@*i{-X9IkW$ zn)*>US#Ixk)uW4-7Pd0c*+kaoAN}|*`>yZ#?svTTFW&sN4}SOeeUHqCFZj7%SZ?q1 zZjU&>v)s^?!+SxsO=B`_B`Q-ZWP)|GdE|K#@e*3r=s*i~l#V)Mmx?(W;4_(fmz<3IVYpY((;y6MJ`e&|Ct z?CRz;*+7fhJVeOfMClS>ya%=3(e zc%s@w`ufs6^XedCITh=DcW3uL*Ijr1;w3ftvL}Dp10VE|4}9n&fBxrhJY3DX+`uDOe`52-d^bn$fmI0{6rXk7f&=5`e){tfWcCs3QaRIFvF|iMK7xqk;TH=`_+% z&6GIx1Bz?GL#L!Q^H!rnn3yY}k7;h!7Sh+PuXX!6x%w%3??=nW|Dd0LU)x!9nS4_t zw2e&=dkkJjtXue34d<7k52AcAFaPCqkSMe%MvTcIxE9N+G-n1+4Qk3+M2F=b)-SoZ z0(M6rrzT07yQDdLdMk8A%6^seG>IjSF|JyDpfrlh#Tp`l$oS8!TkIg=Mej14GHSJ& zT@tN~ULn;f*VOQUM)wiabOc85Vu4FYmM~tWUkW7W`3O?D05mget=Yjjv;B7Jv8(g9O!LKQTeROk>r!-qpsQyH*h{~n7|CV?l@Lle zVc3O1IwMWGV2MgN@>mIzF^U7-ka7nVSylj?x+s_@kLyIrUdR}N`%BBfV~9!oxuyiw zFh)=GSp)F`k6+*>cqfC$CNI(xpp>tHbT(cHkXAT+HS^pEz;y`VZakuJ^rfZ+~xE zOlGsiA|GZdI-8t1bN4*YTF|K)f&pdFv+eBeh{x^tp@3_B5#q_LRzU(QIngr`G&E;&G^-S#MKQU5csL z+@?5LX}MfVmu|9{mTjl?d9kf~Z8@pR?#`n3ZnJGo%@0{z?oRW1t4&jD(ydSXdwrf& z+V(z zc=A*J{V)CWiIXS4@B4n}#*cq;|B934gohlUB2`7{+Tck?KAMP$^;w$iUvcG|-|?Ow zc+Ph{;`1N<9pCxA-}=mF-gx7O|KwGF@t*hof3JPbYj3~vo)cGGG559gIm1`HqDF*U z*}_bG2FwFL+4w*Rs!h6evr{KdU3cGWZ~EBHD8d)E!qBC};X=d<@WA`95RG#UAVcJw zparUl&?6I$I%Jx8T!e!rdBq9p-5b<4O66Xp_tjW@!$>Wsrxk(c$GCVq(@5zOmFzEd8FU zv}viWS?_(GMS7ejNH>>k5ff>~bIVG6TbHze^b!bCZ@@XNHVs8&sz+yTWz_D()G|NJ z2chQ?zzVh^NF_-sho#V`LQ1o8i4vP}21OuXPCK~E^lQGurL{iKl7yBzXbwKY)SALV z`aT*8%1MXYRu;WLt12>tT;MIL{{CR04}?w_0_|ebLe)dFf^FMCVt_$xiO)YJGG`$J zHK`Lp(-}=}HjP0r~DD+lc^PdKkC8HZtxXb~l;d#Vk+A6z)M=4rc zrl%0#DZc^l1tTuWSPnp`m4Zku*h^{BB-pX4Wc3neNR>7&@JabQ_238^FP4_>myH|w z3ZjiSN1uV=`J$4{_zb?ceiFWnSV$2Ty)j0ya0_WR(vTakNb{(X3-w?KzY{-WOb8nSvQe3 zA=ejSd=GPmx?&<6_Ff<{^(ag=Jq0uQf}(JGB?h6-q8yd?2WFX?&xo3OfURL-o)5&j zMK&NZE@ugNPIU#hm}(GEEY~Pm5C@D<@`184gCNuwyJa$wgX1e@a)9I5%U>bw#AWt` zK522H5^H0*X1^5CLi&-+7n*Wl7@wF}Q;pLid#@z1GKSG=*7Xs~7JJt*OaRrBGS`J- zNWAIXY+5v3ot1Ud2Ry6a=PUK_o$HVNo*dkvTU#>s7*dQ&2*cSU2O>ZO;on_j>(?>?#nuwh{ zdv@#UYgGJ24z4wT4(;2!%dM?NnWJX|lgwse+D2M4eCy_Z|>+k3mJVzUW?$!WO=N1df6q$kr9=dBn* z3hR-g`ubDv(U1RE_5Dw+wZ&q)TNmlRhiEZ1nVP@n!Y5+e_ENfa>uNGhIxUuBBHeVc zwOX(L>Mvh^{kz_|f9lj-x8HH@{Dr*}C)Y=ZD$|FF&@zJw zed_d8AOHBrzU#Zc^B?@skNn)v{p|C8>_^}9S8x8%2XE+ozVEg7`I0An$>SgYm^Z%l zE&uLkpLhNHKe&7PRKyLM`IovQ9z3f8tBS7Szs|DW*KKMiPVQY?&42xWUi$iy%T%0t^DK%El*}+CNYCs;YmTqF+&uU)>Os%yk0C8dwcuS zG>Oekg-MlLzab7E9)#6S;$K!zuG$PDIgX3dZD z5nW`2lS_gXjfPnwY%+!`aPUwjL-9w&gj>oB7m=q(l<7^had%j>$;k?rOQ3~G52n&l zB~{wsd$ju&LBy{Nt2Vwg0x@zk)3Cb+=NdJq7>~KH(za-eNxIGJ73MJ-%MDr~Ae~UL zWGhlHS|Ns_MI_-^XcLi{f?b+EpYAMr3&T;CKb&vzMY)gBC0Ly^T zfGr6jBy5jsH(Qu<}FmNN{X6M1QJ87LAft>l@vqjM~H;X5~Oa%wHl!}Rz8bf#etyqZ)bF6 zmPvN*!8SWnVJg!`u7aGkG|g0AR|5{gtssM%lG9C+cj&fg%3N@6x#sCc=My57N->Uz zkxIbn?QlNh(Vj1hSE)Hd02$T-d^fNPGW-rrr#dy4aQN61T2-i&h5H-H;WH~uP3sxB zIEb~{v=%Lk>8}#=LP5=zN{?MzgZML<&92stIVCQ|ZiF5RCDd{+gHEq~sJ;3s&fnYn zlk(=@(SPB4Wq%>#sFY-N*MXL7R_NHna~8iC;t6GUVqIzz{HDA&U70;YVTU>*KW01D zsDk6Y@dC3cRmVsahq4 zm)C)IpG|~D_-CG`BzefxMnt9>x=p(XPU+W#(%F_?io~Z_kIf81m02;{0$TPdS!_Hw zgPLM#f%uu36-bQ7d?H(#^z zUn`0Yyy-K-Tarpv7Q+%SYs=VvI9prP1+wBS)GrZ`;ZRrA4((+J=)?p;UaQ(UfG|iO z+As{)*Ejd?-MjU~ZRtHXGVt-Kv?eR#kJLf{(mODYAZiUxAw%7r|*5=J5Fw$+`qR! zIX&KQx3m({vlyR?rSSdowYbJDKUGMCK5nfw;}l%(F)rP*tIBK$X)8Idp=a6L+FSJ~ z$)_I?k2|p@M`z85?<7!yFAHl_(jSl;Yo9u#L)w_BWlcUzg{UQ*2i$vME)#VD8Mx{VK1={Mlu@3B)DV#u5+crLpO^{VKh zV>#!`#TfWOUJ(E(?rR%Df_WL-8&K>q*M!{A$?u>9xMGBDahr1Bal1{4+GSDl9ViFU=J2 z@_;t_V%I2(b+f5h%(3_(7U?wrsrX5=h$5DFU1edUwfXwmmJoL>4)KIzVn2b2$mTX0 z11lbnreP!EuwNW9^iOFuIuS4~tRaYuqK_Dah;{HMiKTF0H_r??* z;+g;6IIia62|W;Tr8af4BiSO_Hu*FF{`!?FnJ$kwP=M!>x9mAjWATv{#p_A%N*4u% z=Ljo!6oB?94UM@mO0QrtezBuSS6gmXKxZXjN+dX3x5cxw;eSA$T46LgcPQ3{8Xstj z_`N*Uf{td11-^S+5EA~Ru5hL*|1G`qZ>ToTEr!*6dA)hZZ`QM~)#JAe*B|OH`~bEu z%eVq&AbEQ%g9Qb#5QHI9LKWeXLOAFE5H%j^{4dakUMV_Rbeo@4RPqyU!+s{ETmKLUTUyn5jqH$ zQQ;5n2Q<(^HQL9beJ$Eiau&rf>C2rfMgkv%Y^I6|j@r9#fN$)*U{Z+n2Fv6cGd2F* zJl+W2C>jSCX)!_7ZU^(Js%N;U4Twu}U>vP$K@eC3na9#uOCuG?oMY&byC`X)oe`r{ zRd8iw_shZ0t~cyi{u|CnrO7l+>-AU+MJ==O@Zw=dKRY`ghGCv2U(>QBR7H=uQ&>u- zi3~$~c=6!D{ReguVMY`2-`rweiY;vis~EtCga!3x8U; zYyld=h(ytB5}{}$yAgIBfg)ifq{eG$`$aOcxNKo}nc;9{rMXab7Y`tC_~jiqzkRyB zy8hQc{3Ad8Z$9w+^Ut5(dP;zc%LlLCxpVKq#kg9X-M$5jA{V^1@`>^kAuA~>ni0Y! zI-x@`?RVq)=!skBfAUZMH(lp(wb~pV&-;Cy!Ybl|P$UJaQXWp2dvx4EoK*!gRP6{+ zoBKl09ll9ZQ`)JvWgY_^5`XgeE){UM?9v~H6-3l0g!pg=_GrzqE{sK*0m3{+ul)Q8 z#LWvEaN&nI!u@g#%tr`Eo;=E=>4b?z4Q7x2DtPH!VKXuPeC;!zCjk5y7ic+6n%z)7 zycnT4i?l&@_6y>c3sSZSD!MA#YAw=q?%JnJ%!BsgeUFu14R0KF6b_Z37JQw6Cl=bq zD14L(rKd!$MU**8+7HAbcNr$#CdB{8nOFhH6ng>r%AvWtj;i*aa&Pu#Ov< zpNp^9^8_6Gp34 zs#}1j;}x6c@>iKiMcJo5*80LaGX?3bm99pZc}QbJcKrg9HiSoa(pbDh@kz3iN00bj7b!Xy zhCP=Di>6A~oLq6QNkHtc);4R|eSH4#pTKj!0nfa%_3M>lx_ThPs%?%sR4q%Toq$dG zrGrJ`LCfT^PdC+!ghK0LXJ2XCGkOf@#GvxbHytJSa` z+t@HR83u$<<6Q>2Zu>C184S&f1H)Pq7JPtc+>C@1t7RT?GQc=J#JZrv+7-LG?|1Wd z(ryci&Ieq!pa%*c%o#~<0cm-R1&Zi3SPcB)N<3hDJaDWoVoFOPGWa(1i&dOLM|8iVq$0Y@6l>TQA#eO(V#e-m)IsVQ*OITKL|}d4DnFV zTt$z~{3JeB0DN~no=>5Kv@>;8gK(0VB8l{r6hE1vcv=t4thwn}0s)Pu?TAS4#9`yw zG5;P`5hz&{l{AL^pi~1DoT61uRXw#AH1(b{V(yJ>*T02AR9utG=#a1)WSal=CDn$$ z-|g0`jfixQ3t)Dust+DM+-|q$XJ<#7BkelRvvMlJquTo;!`SxIbpOHqtE($^pm6d) zqymnb9ISpsqT1u?g$9%XXf#ZXI%uBDSH2%Zl}DA%LbsEN#x+q(;e2|5rT`jiaSUA| zJ?GsB-X87@d<@OG3@-IJMi4(#ERd@%7evEFg^o!y14*@83_gCBdXK~k3j!}V!nh=# z7B0r7$|u`+RH3^;NBPtue@dk5yg5DDoStlNu72UupGN;AT9eksaeaDr+Q!yzkYJ|Ng%Rk)z|yFb?xPI~-AtnfXbRH$imt zdd!QjBqaj!y;}(fUZfwthB_L87{a(OQl(W%geKO3U?FL3nSSDgfC8}P7K_(>2DWu3R7;X_c2FeWnnrI15MrpA>gBqpKiDO8_w zKZl}HKYv_gMG(!!=W1^Qa)YJlpj&TR=)zWo&Rn&%VHij4eV**JT9O3eK2BLdRx+WU znD^g-*vryI!6m|AH(7^_g1Tl_&dSYyu>D2FMSBkt45N1=rU3|+qf}w0B$SwYn z(-eK@;)C_A3ezOWrM67W31k?ds&nkdU!e0~UKov}k&uyPltH&qR5b22M!v7A}40(vF&U*A!9}@g|xJOQczctGbu-nq1)o z3-yWrF-+~E5q?(K%Cx40E^(4#t_hHj85iZ_GwHh$&>AR{oG}_vnWj)m|JG2b`ifM* z*zvJDvMd+8q~20_u_}rL#rV5MQiJ#{)%bu|2+{~GqIN?g97(?~gfc{cnR@2dxqJKy{0aCVF~b_jF; z6yWa22);sn^G1nN(NAJ;`n52T8gym|x@Z&tt2h9)oLV0G0Mw*sHNrBFrp2m5!+Ish zn_)8!gJ_d3=(e4imN&b_oq=61tZ|+=SWQf7i~*kJkOl+Ck1n&Hl(v% ziYfdIZx^CgMPc+d3a0IRe=BEiZ5U;Kpr8L2di7er|3bU@gdT6~y^B!(a0!{5m6#}$ zJRqM=6JnRNK*?dKM5N-^0XvypQl)NcDc99}G*#U?tiFQnUr7z6IER`yA<}#ztWuF; zWUOIESR~u54boHR3@2`Z{z76SV_J=)m@aBnkk2Yoa?b-NTU;W{_tT`ZmO=nfOAHN| zqh`(56C4bPsaaMN%4R>k`-V4rfKfI zw?X=353wj-MbNr#Z?32P?)d2V`1oYKS~sy8x1=;8nC9u?^5W|1a=)JrA4m12+{=tE zeqvm%Zov+h%skpmkYezk*|EqN5Qq~WybZ;2qO%JgPom(+VW$)O?4Q_RfYVWBkX1i+ zgD2=KVNSTk;@Kc2r$|atjg3Vc)VngAcm!*~G_@s~qCjGVx@Z=_n7w)0~MifFOVWF=KgS0l!bDt*F zjy5<;@*dl>dWttA6J6##b6g1i$Z;-=f;mymE-?m+ucFBiQMF$eP=(ukE|G|LD148r z$RsM)xK!xGauC!ucGrQ3|F}a&uC$khD-lQ=RCxxWjVFQ621yd;A7`QD0wN`pR1j-5 zDG&+ub*s|M8kLXJOv}iHyMbsL6-6U)uxW7E?nfQWwusS~hNx~r6|DgxbJc}9J{`Hp9%mP~ACE=m}v-}$?3e~1Q|qYn%3A`BoE$$bNW zxYojcQt34AwW09(f*HYhlm~LJk z{$v5_GzQb&geuoO`${#xNjK9CPxS1#ovqtyP?4$6`)TgeJO!S`d)YDbQmw{Ay6nty zW)EF!a1ce|SH4pfC_vgNlL5?wa}5a!v6o#$1mif2tsM=+@oBrI?ecoQxas@7%Fr~$ zCQK`Yj7z6IRf^hEcL1q2B#8%3Tnsa*e8eBixTcXUnr;gLxsRoLaHm7N0|v}`dDZ9J z!yA6Re9<@I=JWH1|37m1iN5>1YR9-%+o#MMT#x`a1cAL^uS(}a=;1sr3JK{Hm~S%k zcbM%8Thk{GvX-L-3C<&2X^e4gpTR8d%QB`-5|B5sN~jjA?p z)64%`FoR?j0U>;PAuBc*7SE__LU4J@HVWT(%Gu^>6uKbZ{mO^s1qJIDa$5K~!K~S% znfT_PD1VoL0&rRZV9qc}LV`jc8@-zIi6qN01qrPzM)IMlh}i!EmqmtXM|+Qmv`n05 zb=bV}ku~AYDseCqt+hYiOlEvsOVyFh-%h7yRYdJ70%>BzLqrtPq_s9!7UYqr(wd?8 zs0Jc(v%NVvIhm%dh1VWtD*&|C=H4$ZE^cnFSF6otwQl3knkTyE-sfq)-d^u_TLr`` z_RHgv6Nb7dn7i_6l+!2_Myn*xMpJ=&$ik=x@v3$%EwJaXfqlK8(xiYa_8kaIAv zQa?}8E&Cc*L~=>0%M*-s1<3d z;j_}eP{qnDYUb`2e#pDLfNJ-IuFwTjsSW}4A|fN&;IFk8{jen(Ux}1}Fs{AV_}qmc z9F&<;1Aq=0;GR{u{7}40L5^4kgqSi#-qKbUhlDVO%T=F7Z)A#*2gd^f;G&^P+cK8lfEXK-y ziZ8==)oDL%=RQr^XO-3+n8a=OghlC#VYpU! z_QL%xD|$twt`DTobm4G)PoQCiB32OL&c$>)Y(G${zj-SsR_k8k_m z;`XnchiB#KTm9@Az4s!skP$e>5zh!O#z-~EbeS_>B9Rd0MFK>KW$+St>PhL zJb3qtED-)*2Ecbt&D5>f*-TyMjwY*>48u4!D~F8$)_qWDekB7X#0eCYP>68<$ce1w zio_bTGCJtg(WUYDz0~*exX4b_3@pNoK;r8ebiRx+HiKwDy+P~##|ey0jG18IYKI%!R0P??HzE&{6) z(%OE%@4c^9tKD{IZ-*rjRviS|WS-|~y54TLlH^G4%vIRaxcO}4OvI{8z~OIM#Vty$NwXevON z19uP=x=Y@xf-30MHN9U_#pGJc&PhpKWmn2tNhO;g`WKf>qvr<_{nIL~7%1m3{bG56 zdeJi=SdxvvA5d|EnwKPyce^O^mAa%zfOZ{31TsxK^OZwu^E}Oc9>-yxyK>ipSlf%8 z@Cp_Qw1?p1(K)lFz`#Ci!!XbDe%deNkqV-Zk%T=^#Wn$G&Lka2OVH_s8!e}SEQ^6J zG#*wwfgCuD0R^_qiVmSc*k5gEbs3bnHm~wuiN`Rzg#grK8 z7E853@r^CI>4HDxHL>Jh|80>)S#-m?B|>4?Ol#R&b~%g~N8~AZ-fxoQg5xPza8|1J z$3d|$p1-8A={Ku$^?@#YKc$l|!V=qKcoYvo3UzE5Zu^*g>O;g#PN-Xe2Z#_=jC03+ z-?zJdy_>iD+4UY4@G9DntYT;qpkRF*39a$p#9?t6g)*5xZcOPi0h@HHHK=X2Iw-o> zpP*XA+HeeAB7Ny4dfJVC%W|UFXOZM53e-Yzjj5S*p2yY6{KP4m#vMf)uKdB5M!t6@6cte&~OIo|d=7rQ=ZQeJ%w zKBUD;O_ij?JD4?S)kHyy(mK$ZAN}ae%Cwn7%!~;Df0GVYrevDtfdTs=KJ_xlfZlH& z^!a++9QB*s>RsQCH+;*y-?aXqfAsI^!%t#dV^*%y`)gyW4Xq2BFV8su*sFIuZ=~=dbzLsCwuS6 z3(znYUN;mezL4l=3Z>MD(dF<(tD>_BGS*snvgnRyo$`^{Lyg-RnAHHi{ux@TlvLIQ z`#vDEVmHmZ-F$t$-|lCiH4%l_uBdHj&M=zIjz|+faRGe))F0ezBs_l_&3uI4Yx)pC z$h@Mxbl4(yxL9Zl&49&d7C>umUtn1_X|aBu!}q1YAV!R>FE208&(GHz%Y7W=gCMXi zq6J*+4viREQ%H1iA!GIVRgvrj98;@?Ar+-)T=_*}l|kzbWCOu5T#Zsl!A_TY6f|hz zW%91<+A>41X!ziHS_hTi`s>Cq!!fP}mn}e15*)?hl{&D@T0{gNEGU~i7+7_+1x+65 zK}q!s>Nx7yQQQg2Rs_sI{NnfO@|k4?#r`UH1bfIkm;x-|8jDk1MKG>byPMs-pT*b2 zAi(w2^~veUYBlb5dt~8liXsS$F2%wmraSV?j@j4R0j$<*Ro!iGuvpA~#33(QwqHF9 zGwTe|p$)3DIV4b^)}S;9k4Sajtdsw7-^fijBjqzf+T6-hhi21V4y(i z`U3_TrO_XlpCK`K4dv1+j2T;~s1kspAtfQ$o4#1s+dEkGhuEvjTa=;~!r7o@ z+cqoB{Aeo00-2&0t_!a zI>Bcdj?Qd{DLDna_!bAb`JU+q74*p#zR@x3yjl(CCnra%q4`3~yxY&y)VmE$xv3MHg~)EPd$!lR#|0)F`}g+cqUeml%Hg-7X^LI{kTB#GblqWnilhENiX zIW#vg8wKrDsGDSLX_oz zmjmEm30}grS0PU2_=?lXd%AjrO>U+xc;y3{0!^AoYeQ?pW^5;$)vdn1-cAp%cQ?DK zNdsDNHTA0c#Ucsqp4>aQ0{wa-FSrK43%sXh2vY9Wyv1%xQRn+ap?q}3*|xazFMV=x zIf@Xji3CN~3fRFRqQlVU2mQnUy?*{@@%-2Jc8$x|hN;U_U#I8q!owH(ogbHRht07{ zlQsa8>VzKXt!{*li)6i=h(Ise*8TKPo zX?wZdPqQWH%rZjO9Dh$OjP1?EJgNAwdL0ALVNG=u2Qv@O?flY+47@x<0DHSr;Tsc5 z5GaDQ6wDE*?Pm){&a*05_0_`;l{p?a3CGC%+O2>-->VCKrVE|* zIFPi)WKOT{ziFWt-nsxP68>BS(sf!7a&~fbyct#k5lqv5dp%h-t8d82NGoiRj?r_L zC11*#A}XhwLM1j!QNWMZa%|v7xx4`8RstKC4v+v`qJv6)=SqB7K}0b?5S!vh!(l7b zHRL}W3Q%S%$Gu4O)2~Hj!T!Oy2)DCHaa4yJq9}f)co<_OLgk0o4BC5PITXLV4I;zP z+AwZb!|{53ezLm0nJ%ujH{02;jyj_*EvS*7@UhIYA~QLOmcGloUl>{}%|8hVghJ9w zhc|?(R2}h~=H3-{^z7v5_-MPm={-}mPy`a%s@nlI&>pS_ zm1N`qwam`43#A+N=a76X=GQMtHl1qpNJAhMDiWGq>q^q12*4I z22~NE2c5CRA6jeUxSFSFx4ltSp7M^?n)ZHkeRFhtyk4*8d75WCGAwN<7lvyGOr7FP zMY_w9FqGAL4Z-&MdYFbIHonnjoub9QGS+yXTS7rC&c%DB=o zfhV?h0-(nA$Vzagjm=y&4O25~Tq?B*KumXr)TM|>0O+Xmo(0uf+zbkLrl>1UNRhVh zE+>)p0HC6+4|Ms9XV!$U^;iR5gC%4YmWZEuQBI!E8Bao%5GI9ch{QXcUT3N0ty>?F zN*jh@K%b}muIp@}opzS&a5Ik(1*8KG{kh!YLf42vH5afE3l$aE0C;^by)hpWdaZ1d z!{h-nYW?!l6U?7;encX#5ncE6(+sG;P6o9d<0$O_Fl#f8VRxm2&Wv+(ITH%@Kk>!t zomv}IC*R6D^-2)kjjlpMlN?JUq$cxIQQyAYyC(F;ZcJcKJ(Sd0Bt+HL_`FROW*WQ} zrjf8|j8UvleHOv3)1&j#_1G{^({8)l&-2`SpSvo{O+pY=3^aT1T{WN3^fJvU(qL?i zZ++BN{~zNx#ixqDr$$lu!n6~Nac15kFPHL(EV@}ARXlmlEHY>!q-qYgEaMWv4tQr& zhxxi?Z3v>i%)4BWJHWIIW+{hsig^4VwH8qSG5<3 zVuF|g$P=~8*bH3-lL&@k9EV}ETHQJsPc}#QZ*~tZcIZ|<;ZJZhbT4k*)9_sRSo>lT zAcbl{kf{faErjfv?rr%N20o|8fa^Sl?&#ux4hyz(#?>)LRr57TmwHg@oQOR62oTJQ zwpq*mZomJpaQ$(`Zjih4w3RRZ_5I0Tp%_D~=;>HQETJ%8>{Mpdam63JrcgVsQ^%$99k0ozNy@I{S{9;g_ZJ=dU& z{;av9=@X~x^OMbhS#{d&_WS)b&GXcIVZ)S1bw*`_Yg-UeU$J9{EATu0NrSa?xa7W| zc9KNFdd7vt8RfA2!SQ?{+qxy#noYHGt5cn|@M-%Ye+j*Q8G$aWL6$iq2juAa@| zH4<_3Y>|qwwISvgIR=fzo0@G|1h(TY{WM=ZygWTUIX*t_bD#E8SM9zx62wc(RC;cDQ`?8@IV3~d z;^%YnIo4<(P(nq_}v`6oytLkgYzM%l}QAs+NomZIZt z9zih;?hs&29>=lS@ytE8@GwYwq^Btf z_9{R`+Ay@%+SL2*=DPREOEYQ{&V}ljqMAmyzRkku0kRc>3}sCq;yOvnKoCiDw+tC&ka#gu7B!|pk^n1t z2*N~P(_*T)DRb;%}NyFyi4i)shg9!@ERWV-@3 zTZme3fCfRn}CYziq;^&+^6-}Zr?gRI~x0bcYU+lP18Jg zwXCs-w_d2zfYs2YA9-dDOxG~i60ZGYJ#FH;V{!@W)a2`XpkPsvycjSAs<=# zVMn6gOQK7VNWJo@S|-9-kv|5uM-(9~*smd^G|AODN<3DcLK5(HX^pldJI~X8-tVW? z*p4=&vlXadxhVF?a8sVTh7F$q-6Si*~!|!TrnI=V#A8dHmwN zo7uL6(lO5^^UXCq5h2nP9XdnBNs@PT5ScCP_DqM3t_=Vn6FTMQQ!x@sC<=QOc^D9@ zP`+;$M0YanbeePzv^EZd?vC(Pe^AfAPPen%KGl=sK6V+dL@yN$n+=+nl2~xMIV ze6#h32YZnPqF_vDzooju1VIn!JWCh?z|EEvT?D~S&14TW&N1)Xo;)>sGFODiNFcde%`hHY8;L>t0!+Atykl{``6Pv`$iaa z3L>ohECtu(e%cakvezy>2L-F{b-7CNpIjAiJP(Y8z<99usHL^eYRC{&#wJXSK`TKD z$L#pCpXQ5;i`8nq*{oLUl~4MC>TvFAHnhSm7Y<0%G_%4*Wi=mv@Us9=)S{fS0!3rW zCUp5{HdU2-(f%*~_<<9MpgYlhsiXu7-OPGCxSJRZ^C8 z*$KM3xQ}l(g|wW*CM^hTE_)F%e*@o{7F^tm9tsy(=-V|WL;$rEQ+O;&XP_|cshUXv z;X$o@jPqWA^P>DyMVbs_*WUXqp&EfS;WIVZ74v5j`2zT9awKZ>(AI|*jvC>!vuiY= zPD|qIlYl{*2zs~e5rQE3d~J$BOu535g2ar zu7!WmG!r)@YTx3Y(lV`Mxr*&Ps(4dZKL#g0`t-)GVaivRqd)NdB>cW#)XgL+xUG3K z&>1#6_?il(pY3kQ3v(!5jlq1pgW^#sq)9K?;;ikF0t=dY!Ih@S=%c8h?-wUIj|xR> z5=C>Vu{vAO&`ekipuG!3MAVs_<8Gj0ugjg*L#7V1+u+nGAej3+@8)=SV6{4V?cU9H zKT8`Z4-TA=QPx5ahMV-7dqg1;eN+QMDv@Qi8XWEPzSa|eKdvHc{v72P-KiUBex02!gP=w5UZv2?%AGa$C* z$JBJz29=e{pj{vhGGpF}?$KwcwDpPYJJYvwpP$0fn^tf6a#`#A3qPp4J36hU-<5|S z?mzlt`q~f6h(4SMM%a|i3P1*6b~PssxtXiy3k(&=d1TP!21~Xq?jZC)?PCk!G*7dV z!SUZxFhq?|18cbVzTUK_Z=W6wxW2yJ?zYq16-sK2sHc<@q_@s@Eq|Pg+zsEzE&m@-2*>#;6l<5$u}T^>IK0(Bs4|C ziISYrt%?9mhCVA4ZBdh0RVAdYY71-mq5m@s(iJy1H@p3QXsy`^dQ$ipV@Z*6A2lhO z_bWI}fp=+Wh+)~ksZ5k$?XxRZMp{MtOBWUppUr4|uy6{?#6wc~g;=YuhXkeyWPC^ zjo^~#KAMFpLsH}ftJ-Ugz4zYGgz3{q#I_J;3Zd9clh(WLraA1%iCt?^Y~TP)*yL*( z&P$0f{-S$^d&y_WG0H>)NJg4Epoh%16e9u?RI04DxnK7eHr=7AD${>fLRH2EZa6A-7#u|8?}gCE&k;c;=wtwh@SIuuBQ!|t*aYHE z0aOD~HtT8AK2JwST;A;VwmXRkdO44d@2QG{m0bmrs!#Fum!+H0CD4+~ zR3G{y=FuoQ@Noj=I|+V_U2#Vtoyda}UP;4==cHHabpK8C1DNZ%Z0DfNt?OIh9gv5PX+v=}Gj3dMluvIS7}iEGtra?+}zlFa@L$ z;@mrO{6q^nKhNfx@_Fb<3Qor0A-%iI!X!jQX4T86S$y?#uaS7o)f`{DT2b^8!YFxxM1lR!K!!~ zCmaXNU^FJ$+AU=SU{)s*yN2GtURCB{Bh%-n5C2v9g{Ng4Tf3Rs3de8IC*Gl_=W_df zZT)ra$M3bz{C(ZLLEii|x_yZ4{k8(GUzPo94ZB&66t_j2V(7XZ`nBrRAoD!xekB-G zHfSotZop2^`z$)2w6<2LV%ORPJA+{Am>YD1VXe{y*8{d9(sy&8*BDQZkNfTQPWM;a z{REYcId~+Xy(kRbt{po-sGyk+6fdL^Q@R=@c?xk2El4p z0DbCvNMFGhIQDHlV%TGz`*ubjW^K^kRx+*!h4xwd&90+C2B5c1TdhTPp7#@`jSSDo zxKSCfyR#m5yX)=vMc+0)|BX|BV)){>wDC@V`RCf@EAz+ximr~@?lrl3QCrv5M$vRu zY4F8)Ko#0FcW6CWq@vXq!d6u}Ffe$9gkTcqeo zMMY#7y6U{&`$YOQk<~SKU|RAk@h`Q;=Rb;dLla9%tOzY;rD|-tzi{qQ+I&8hnw0;G zezQ@jA4LZ$Ln=7|jkZI50)>9DpYrq)d>jrl*%JQ_F3m^E@{ao3;-}yfKd38kzx2&W z0Hakvvg75}<(P$&!k+)4?eh_(V&!o|l7l-A9=MpOU-Vfbc7{>wU4e=A82TR=>RQsf zYM;9A0!X~)4jmk4_D^chi2b(hz(K#n z#z!-W5s>J-+kB;E+k9QL26q5rlP{u}0LuMJ5D5X-z7`99@m38GF(U_GOoJK&b^|&p zS6<3x;qN#uZk%Q+O2Qoe$tCQ%MRO@xg75)afriG*M}>o<&tvw81=ZG1mKuZ3J2GvK zo6agYbpk}*RaF(O4Q&|F(WjmAK))J4n7)w=$O1&%_N`=r;g5E0%{KB1FmkUu!h*hYb{O2HKo{_ zGq^SkBCXG}y#=~3qI8nN3{NEUir+IML{L3zxVv^r%K%I1eKqnUv|DOW%9$z#0pe8} zZun>3n&T9mrqw7<-98Y_d8%^1n$RfMKG&&yI7P^e(1I|qc7~C1zPznb58R02Ovsyhr zTd<48Eim*{foSIekC7WLocK^4rMYZZmm_2kmu}O?R_9Y=a47j-Ue}Ulh+i#fV8Pfl zX^O>%M21@83yu0PK%q@qyV*^>U!9+wKJ&!!ORrtpy93Z5;hFP8lpTm@9;@sORFmL3 zxeEVbm{vF!37fr(!Oks|#E61G(bzI1^iYNrV+QsnmZprg&E2L-c+YYoymA6ezBn7` zT}3wM=)1oA9Q34(qa2;`iZ8%evhNqk6-znb32*uzA`?4CLjKv zr=R{G;=biEqnN!Wri_|y-|%RdgR<=OYIp8xmd z;R~k^e{7iU-)y&*FfEH5Id7yXVVxAXm}e!SFxN}vTv#_Pnm$Jk5QRA6#EL)`>#`Ln zl1FFk?%gOxWi%rpl+WbnH#hsS-JBjh^Wf-R)A^TTI8rnj(O&#vy!zv#?B;$pzU`aG z(>J!Qj56x!=H{c{kNZD~VbY`buD|@ZNk5W4%h9@j{zrD7_=n?qH&3Tef8}>>Hcw5L zyZx$NedUN}f8q z_pkqaf8~euYCpX0eVezueR%1`-6#La{^8GHdI_fu`xoSDi`K9?QaQ3iVA0^`RMD@) zg{Z}KCZreua{FJ&dqJ0(=`4y?nNJW$N<6>tx;f#l^*T znrZBbPKd%BcbZ^jf3a-3OE>(`y>O;@1b)-u6-7oy)Kzbaf}3`ECD8IG@IN(k;SWQx ziFu@&g@%To79u!eq1hoZ^HM>tUHXe?%Wu`_QK`zxlEadZh#eHO{|97GRkeAsvyZqW z-5qf2!gj>-{sfOKtSu@Cbw)&X+ezoE)05*TZympK?{dHI634rQQAYt_d}P0|q-C*i z7u}?q6r~a2+n14tDdbMGVL)e{``r87hG7_oY1*}RIQ_z$V48J488txU-K zvX!!APs0-*MU2W5P+ayEUI6&PoOvIzF^!6K<+O=YMDIlHOWsWK6J6R*lV!GB5PVJlSDU+G=y&iB@OT;kn69h~kdLszKkL2M zQ^{f+3P0_IosA@q?Qswx>Z9V1ekY6K-;x(aDTe1PD;X4r(8aI-OMFO!Vi<<~w7+<8 z;rOj{R&{yzO*JF36C}Y_s7iyqYe1#~h9RY<%mi<~CT1xfBE=Di6g1a5Zgkb=YbNn( zOhJ2$@U7yzh_vF#xDYHpize2r8u4dIlJS6C7GOpGD`ZVdhDD-ej?W9ABSw=@(s7&Ed1PHgF z@KYI8dSa7Lrw8-7Jf7xP0y!U1E|U-{T$J5~Kn@Y4B@B(Q>pl0qPbFgwOT$sW($)6f zIlo;a7w#GxfW>x1x|=9`Yh2YfjMAFUvvQq0d9z6_7#tPal2|Q-p+Y9@6)foLwKe8| z-D9CzSC~-vXtizO0-V%!*O4VtiJ=0b9V%TQI?uz1C!RRojJUYG-cEB~lRPif65&?L z+Mh#7*8>Lx&kssMt+QTANe-{|-zx|oIG0FXm{zDCTOFw$ha$wTL!@LCMeVJimL&yC0|jbR*T6hjje*YIZ^McRBNUH5>lL4sLgKJDW{_=#18~DFmo3g zkppLuQ&stc@+=IY5b37i?zwXY5eljVbBAQld0XyugQFt=z0Ykp#{M(Ii+@|?pZDQ* zKe@f{uML}V#%p->XU8Yr(~gd%jk>=C#{DGi_Iuk~zOFxbh+F3k7y7v$#e-ky`(1zH zOUL*A+I|Ba&`!}`{aL*7!M@+M*L~Iaj{kUn=Z+j7wWEE1@CkkJf=)Mb>s`a!zZui4 zZ6|t1U;a?nbCt94xvyQl@jb(*KR#Ss?56F$dkhVd1a+<<3d>~m&~HD#fnJR|M5hM8 zw`bE3Oq|*pDoPb5igZuq$A-1;jF^idOAj&+dJK4f*?c3EhtFDU@?x6QbXIJ4H|ut} zzO~vt`L@13Lm%a6l*>=_R|L?GVSN2puHN`7#)~#c!>!f!&d*JEJ}7<06R%&r{TtEG zWVdT4<0O0i)c-P1H+}uY>h0ffyng+Bc{QJm*AHKrU;0Vi&F!gooxblkZZ2Ef&3Iz{ z@Rb*K4?i_e7wzfyuHO39a?wR+Ia8dT?eB=34Es<1o%wTrA6Iwhn>+LV4pti(N0mXw zGZpAO2ZrR36yS+BN3*} z*PEN`>(->|o$h$POzO#PU}bHS7u<#?4@Pz?wu^NV=< zI5o=1%Yh8JWaAp5rViX0gM!p)9CBrf!~>8hzHlH0uTpw6FG*m>{0ri^gE=W zDXbJsXo}c^lg%BE^N4bAH9YqVm-kZ(`C)5=K)Rx}Hcx$fbK}=`Wwo|KnWv*Z8L()H zfF!Mikl`!>V9qhA^)l~NopF9%h`w7>JV73jG~ebkQIDKJ3cs$k=A$^REVXdR3^$;P zNL{;S#9~F@OVl0k6Dp8flFN(^#KZDT+BF`HMqQ^)ho^SH$WA-d^cjLSu38(>wfDWw zlXcaGZ~mRIK)OJ(iTE&p04m&dzr3AF( zl7OZg4AD9I_>@Kyyn4Y<+);5P@uZybs&V4eEP!eoM?iF%6kVF|iI2dO6g5G-1fkXK zs$(}{N$E{0AqdpUCCcbFodh!+>bHbb@o`g)N}35!)w7eMTSx2b>+9WaFN!Xz5pwal zfe(R>8rqwU9f(xRp9g*!9CK|ueIY^h;Es5bBA4cA%yfHs~pi9cv{rHd}vSm9dqb}+R;j!)+T^q#Mc`mCOUNry`v*4}c$^1 zVfPqip{Ja(^jV=M)Yl-&3w!b|`6EQRqgU%Xw)JhSXY5}Sz0c_vg=`j>4lU{!ctGVl-^6<3}{N)GjDV@8nbo<(e>ra5#4^z7v5Y%|_mKfKxP zRD}m@RCNgbGs{g~^2AnH91$&VFH4xDVa1ysIEm77^_Q+LJw;J8CuJ+F>_XmHfLhff zcAEprhrp?cYQ&l1vAq3&SWba6fJ_^NutcKk@xFB?cxgb3F}j7NQ`O$~RmiKK{x zxZq?9)v6C%kVA=w@{u&;yp1Fjo)k?fR@Ub#LU+3G07x9kyh>F-`pwj^v^$9&f&+Es zmV9n}Ri3$27LLBqiBdI_YAzlsyEqoH1X+Sd1=$_{ty+1N-4Z#pjxMYc(egnX%lkNn z1y0LjMw9SS+j9l4ZWQcI5xdtrq^X*u{J zHwqv%SX(+GNJ(Ofe zFDqlxm+^OVg+^EhL!)_Z)M4uPfIx4yyUlw2#M$QZdds~DmxsSrqQMEHsaq|T zRo`h5J+0miNE{ahT=Z&a>gp@pl+`WK5y@p!i+$1p2g&L&h$J`T*qDKe z<~-_f@a?_zHppu2*4F1PB5jY|C+C|_KnIl-29Y-4xa++i>9745+DftNP#LB+4rq#p zKcV+Ns5+>wv_adpjS89joqyF|{@2o0szb-z+75%FX@B@Ldhh3;YqSRJTkATY=|jEy zug0s>&6!MnKM_5ZyI8fFfObS^iwMpCXFKOooE=y!5v9rt*(^;_LmO*Eo8fZN=1BR$ z5Bd|tc1r+IUWjn*Y?hl0>q=TjdongN1Jks-HNSHE^0j;SZ&U_>YTIML3{h^ z50L@pgNM1bjyB5vv-2nZPRD3vv1pSFDl(uy*nRTv?{ozjAi$t)P#g_-_>t>7FUWAD zG6G%3E~Cgs`h%aEUz>d$TokJfhNe1THOl(LW!Sr5W|pTr;aX@PRXp4V!1WvW+5@Kr zLQoK(hvw752p+=O6jc%K8d5+{c&p|1%)ZnX?43fz@|`I9(Plh5Su-WxYY57_N&Hq_N+-^Dk*Ls)isB)G%OV&|ZM z6w-gM0|3Fi1on=)^h#DbQAg=R>nw|sl$$T3l*m`8@oMJaWJT#v+}NZnuu*Z)0JXuu zI7|-}h^?d@8Z9AN#3uB@63F0W2`x6HlIURH@AvaG-a0wDzS-?|-A_Nv{!x68g|7#+ zM?F}rM@FvK_P9MBY1Br0@Rm%KiVLt~zn{B8dOtoon&ughq1n-qqKghp8bQC&+8!aO zKh82Yg*18IOh|7{ZZZ3e(L+5W)`=+IPd{e=eRd#0z#JECGEBWm?}d7qPLK}@S7?v1 zNQDa^+0P(pY#mI(WUGXK(+jGVi<#5O;Lf&^;+B2@8uw3DYEw5pS7cuq0vlcMDl&~6 zVUei`+|O(mNUhU}BxUhzejf+G7JKQ+a)gnG2uX2{;}IEVaGv=Hn^UbPXDL{tuW_;4 zn}RPF$MgCjw~lcm?_2b_#|%>kO#qsOW5~I-{Qh)4={L&^lWjY0H^K6t z1o)j%X`fjfZ^z4H%*dOj4-Dn<%#H+Nc(+Z$bc`hF%ZM@Lk2bD{ah&@!@299d40{jL zWA4Ly9uovQUACy;&SN!KQglkF-AYHywO{+7W$5Gg^q!}n1@37 z%|0x_nA5{?@^jjn)}C>e(tj(5MaRQ=7gyT_O(7Ryb{CKPsrIpO&K#)gy_=&v=Fa5` zT{y7E-oZ4Mi7J(Q`8c-PO>H~^sgVb}g+&Xz^Uy6;JK$HYt%XI_XNSlRhQL2H%t?aX zn)4zF;G-p<9bl63Q)q1Uk&6Y7o0T*l4|5dK=H9PwwkIb?=cns?_pRt7?r4R9F~Q_2 zs^Xd1x}YfzJL!weHZ=eQkSx3KyUMsqFoLWOU@H-VqsWj$^jvLZ+`XTKVtWD~mHx+3 zf|DF!oS2l%Dn-$BCYexGS;^58E<$MUb|n2MqG%JO1Cxj-hOP=Uj9rGw78`ACxuZb@ zqsTBrC#c01(yjX=WS9iALV&?B6@6H@vcAh&AGv}!a#O@GFr3ZE;5DZ|ED|)<< z74R#FL+x-MoTooXxs)19adCT|?4^ib=ERU|C*fWEvdjQ-zPq%x>+>{i&yUvkZ+6<7 zy`0f~);roP8xiceZr}W1kk*DHC?=pm8`|L8z&4Tf4BZR%+6G`yh{}LfYb$~71ryM; zwcb^r7^Dp&ECHm=17cN(y<-qs9jOQn?qOqV25mNVu_kRgT9&6`E(s5ssnh~K3K9;^ ztV=cYSz((Bdwv746$h600-`FA4%OZo&Q8Wv>lc?db9cApCRr;9Je$=~cpAu1BQo^l zxzb^q;z>R_Q7=?8kyk>b1(V4mxemC1aq_IxSED_85YQr)S-BEbdyqE+%a06l0*Fw5 zgoK136p!*>667mslOP6x=Fyju{tt4xFvLXyD#NK1fE@M`>|mrW%bHEOwz?GWbr+!b zeto??KO1kK9ld<#(%voRcw+QPHbVHOMwPL7uy0VoX^l+)d58npTG|G3`KJN8+s~?f zR$Xt7_}a@V?u!xiJ`GrW%uGigK1K7zKy0nyA&8xooAgPNeM-75h~aTYNQ!axFnNdA`%@+Mh+wotDFwzBxO zIgR{;NkJ@ROjZP@G0z+eIK^S%`3uuk2!SrUj-mt6LjAsU0So~aZDxms z{_zlj>KG4Yg)&J@iTu(x$-&stcSs0`uv9%pT0&Km;=OwJS7{kgH<4i&v}>RHYQ1Vh z>)LO2yPMq}t%+^(fpBCrMP@vs=TYS$9F9$*xTEm|bfhX61;ms9&^(~PyqN31kTG`h zmUuPNdel?d`L^1KbZM|HB(#&lc8`2R#F0C1{JexG@dvM`MsO+x$i+qm^wKTySx_L# z83KIcjfFs9@wnVAprqey0Sl@stqtpq$S_a4K2OvS_!5c=TB@k97N*4uej;k?sTvgy z8B@~pX^UvesRL9cHmRjQixiWAFXP*ML$t>nXvmXyQ5T?GD-7|bCNmsWK|`}mB=dsu=JO(hd|K#(&Vq1eJs?wNcjH|sv967=nwH?XLIsqMTqLS|;Tp*?o$Q5EjTA;?3C4pz@t zS;0?jIwZ7MVjzXBMn)0CK3q`Vz$7J1BgAvyl1W~kHp6vO*E|bt zBW@r1)Ex&}Lz+jkA`5liD%!0iYP3UD70e51R~dl8qgY||Xv1qO$jaeN!Tn&{xLU79 z=ziPh4z#Er_5D#i)9Nz>5;qeOhv+Uoc$oiQ^^RL+Y2XsHR3oK%`V_h zI>MTU@W53B#FE+v{-uh@R2~pVHt7`2f!WqzWzjINjdU&O4U3xzv&(foQ4b;N=yDUV$gzSH}m0VoK^FDy^pN2K&k zd1#AuKi=@qEMSI(ky(g!wa1t_LiFE9a(5eKLk32duN$U%+4eg7IinS~sbx5#^y)Qqc&!8fOX{G;NG_4hq zeFfQdPL(l?F0liTdgjzm2~ZXQn0w#t_v_Vga=g}gUJ#fBFm?O2Y-}cE4K={&c7a8f zorB`5b_QLbgIbz@;8m4-H9TTC6QzDr!HMVtjXgw^)5_oIS*V!;Tfa^XWR-+MV?LE( z?ISlk$aYiAuG}$1(PvoO+M((tp}nK`Gz?A%hX?JZ^gSrhIAA5yJnj6r;^d3WJTVUx z4W<$^x>@L{h@zo2k%s*LLE4~bOlC^-i|GT9(+0j!jWZmNbZq)rN8iW9B0bap;Pe&1 zP@=2)sQZ4Jq|d9>2(t+%ea!+7?O+N+N{jXeqp0x&v%NM*YpUX7Ptz7i^9iy5t9Mm9 zHdwXK<=w9CdsGUKVK;@fd*k_ZUkF!WXO9KUNqkEe3XWndlDRP#sPY>-9{y(4=2dcLcRPn-ux!(ysBFiqO6q1$`Xkmbz{`* z%uj@4tT}%tiILt20mKCO@8f+({6uZ_g5dx{i;EMG<;wwXyh(3M0+cm-I z$;Keg;~rb%Wrw^JxRf)Sp*0$sR5`hE2v0*Pa#BYS(W)&Dp{m&LcEd3Axu2b$4C6RW z)6wx!nHcxoz0c^&^xc8B)u9W*=}V%?!mbKV0Y%@WI4?kB+C#{PR5Usuhkptk;DL2$ z+JE|xm_l&Ye7?kCo8%!>E1Z7F~5rkMg1L1JIRSo}O${rcIgP+5^$^lHdS?18_ za2DXPytB+m^ik-b+;JV4;A1{Xn5OmmMqPEDQ ziw58ldZkNM6jt z^M&%1QTOd7V64>XsCAnzKt$TGmbUI)=iRpVNd}>*J73}qd5r9)CIF;+#eEaBCRPa2 z;L=Vbc0+Bg`}&u&AA67)fKs7QNQ6%&!)OAxG@;#84-$S_V}_(zrAojCC)sxC1#>Og zm`|rYrMV6n5C`?`-ZAYq9L+v^ov^(TW9%E~U0Q2x=<{SLvs7Jb3nf4+w6+xfmU`$L zJPAYH@VBvY&BCSH8NZ0&a9jjy_MBSIh1T9}W!Zbx!!~;FcDR)F?0B92 zsi1}G$VyFS@;Kqa2Lq_;Zodcm@p=W!N(tB=G$yGGH(W`b*9xqT(cXK=^HWf02Z#qT zwLZTwA1wBWLk&Ea5WY(b`S5O#?V3<}ylzZKW7f`^INC_&ryW9lEyDV*f;4aE1qKn8 zq-svbZ4#x17oun;{GN#*1<=J)CCXoBRX=%70Ff@uDw5PevPCM3T+MsfRt=bU(>zCh zHavjlmDCe~>7z7CB~E}*(KfVUCBq8M{Iy7HkO8fs4ayWi#93YJ{~OwXVeA40I{!bH zk*bmaEIcdj+lD7-O=1>%Z6fqW0HE8{I=Y%Br~rMQ`?NnA4nsU(Kr2Zc??ZEpXvH8C zk(yZ9jtUyBMjez=Tb(~UQW4&Wszw@2yCeMp=6RSsGSdmiSZIhfwE#tj&d_lCQS}X| z>PS`Ac}e=9CUr$vSg|btK==2xy#IX|hoj9n_j#ITchICmv>y_*1>V7YdrXR@ zv>Ua<>bHdavSnkOi^rbv5>BXm;9UqVl`IrwzFZ+GwY#~{f(QxS)%Z20ik;a^jlQQ} zMyN$FE&HDhuf?#a4&glc1m0uWrv|OpgM3Xy8q~KVyg4Ps|Vg&k@@v`?=f9_^;tsQ*1vf)z!= zV4#*8&4M9M{PmE90@u6U*amc*o}O$rN4xFrXmd1M;DigO9yZ&FFp*l$@r0g{5ig0WB^B4S;@UdZ#Y9gpP`0KOA~DLH*64y3^e z5O-BMSi{lX9a|ks_(kycmc^ zcBA|lk>juK$ATaLa6pg0RDaW>adA+}9x9bxWHHO`RLM`+U-JSn%0=P>09M1WUXAlK z4Kf@Z9f|5Z_lK7kKu2qQmPaqtF^MEa&a~xDZ5-CI-dV*PU2^;_rsTNmaw`#So}h>- zYB#4QA`IIBKx`RXS@J6*I|hSFiFI8QzrXI8q|Ka@qB?`66-D}mzJzlcS8&QSrX)V3 zj_~Hl;>41rLgOH`L&v1rhOvz+K<53v>*O28xi6vEd~f1r4LAzc^VIDHmXNQDHn5P3 zhiN|i31bZ*Wzo1IUA(gN#^8(_Z3rtTeKuKgs{SsNcqO5)ysLI;qFq&3=NYxTPNKrE zW(q~TLduWmwCNGFlAkd86@wOzn{{id!#F~Qd7e~f3n6@HP*!wF&Y%HxNFg4hW%C{= zMC=?~<$DYnUM1?gQDtN(z8cR%Tp=iRmJ~)xB4*ilmh=JY+}qHO*5f?Q(=<6yxuz*y zo3us)q;nO@Hw~odHOU^MI~GsU2K)vsjj@Sh&stW7gcDk{QRx7djw#@vlWGH{`0&6e zqv*S;wQDbpTEl5cj8V!*^zBlf9-lFN#^1%NY%34p4W0{Fq64&6l@NER*6~e9{~*Mx z!NsB1kq}HthH%~KQGxmZI5sUZq^u~#MP?>7e=*hO8d5QdAtAbg{g~%I@8`{WXk+Vh z2e*SV^>V$meMSXt<__WrrWRc_q}Dixqo8j7x2S;=kLo|uKLLz066iQ4@$7bn0?9xm zyOstWVOnhF>GoY~`eO|=shSUPWdM=dlf6?u5p@q5S)WzqH{Kgq%VSHWZX(OwGw|s?Bi7EZe=p9(_)i~prg zqYuF|NAc=z*49exy!&w$3uH)v*ggz_t}JHvHx8mjd#-kcuE(|-hTZOZ?i9M_6I;m? zh_CWH(#aCKT|TLr^}{OpQXuZK=D?iy#n{tXrFs!53s>>pfX*OjXdrOeW4fL10^)eyd*AQ(tJQk79=130Fb-r_>}d=)$5uRh;AC}i8u;OJnD2ZY zMhDg>%dWKt4=+T}T3c_%latfS%ZInlpW19T)73=%vH$fx?S^sP$@xY3VC%XR7R7D{ zFFBag1v4R*RWDDumPAV_Eb@B;DBvD1eRv^PoLbF>T&X2oW%|MB3vb5ahn?1J%h91k z3rG#Im1$3g{q{*cCmOwuaSKLQ!CfGo!DcvSdByzGrnQL0pd9Ab&z>Qnc~__h37 zA7=_rMis%CbE<$UO({wm@A4`2<7Jnek+KhX93uIXim9_J(X~+9+Hw(c@xfIM{ckR; z=Q9hB3^X_#2zy&RxdykEY)*Qgdf!)>D=?0$aUA#ayjra{>rE4M)%y?bn-i~tcdr>b zQendMzU8}l$>cd_RHJY!Lahmrg0;&X(v+Er!u**QCNKm`z3t6`A+e&2f;5frMeS=eTcssdax5AjHvJWqjDh%^a;s{*vtt}H`JFA@y3cxWjC zrV6z1Ac1>Y{e`V{l{sBVD~{y}PNONI>I37Wimwbw{f2Z#5u%{}1n>c9E%ZUc2MGcs z^KlewKn6dlM7}J()QRT(W%(k^t-xtCn?e4P6(~V7#uj2QmZ7y#!?h*VYT?rZ)CzX> z$RsAQrl@l;o{M7IL3^L~^Ss)OtD$YD-q6g_azB(s|4D)s>2PZL3E=x4r1wDVfPllF za9G;x6aoLZ$D?v9`9!v&->^bHU9v`V3aaHreWJDLXHOzgBMLCzN>xz>)K4K50I_?0 z>TrT|fUF&rq5L+lw;(y5MMW1!AC`z`Qru@v{QZpHb6a`^V%^jyOo1-8u@^Ir4jBTq zJw2Q5FZ=G{ym`y??EB@(FT!}FeJ_0v0ql$v?a&F`i%?X%NEZw;%((wa`NB`&;`77t zljCqY>+E4KO(-^}ckGlhl0ehYlt@W0^@8UWa~>%UkJ+Tzu~%d3+`Xqjo)AzI?xcCl z>GL1F#@!XO2`HqYZvl%D}jjJ=31s8n_v% zcR$|b2VsJuD%f7IMQ#6FOBEVx#A5J4kQ!D)6ZHLlZ@OAKRsr&0(mW4eKOs0WpmnHc zXqjFigB^97mL^Radbbi8c_h3Fe0XG`Q;NPU`x=nDOcdJ0Yw>mQpF9RY;04PmQ+E=T z+e+wtmD#~Bw*Okh@=Nt!q6*hE=){$d!bjzKCPIE$Vkl$x&W3i1ooj>y(i+#eRyP*D z2>hg#{4xik^E|JQ+Il^1Zzh99-}ywfhB2XK#alXDv(ND|vVCc1@dSDZG*14-64e1H zhVk;^;pNrMFb>kj^Ru&8@4klCj*pKoudWZe-lyG=M{L&ALRgQ41I<_~rjR~Wt7Aoi zHg!GcK~VVc!cDpOLmz7g=ApJt;~TxtyD~LW$oaS(tl}+QY1k7$05=6N%oX@ zR`PV1s2~u&TC5WX;^RSsTxuq>>wx1j?S%YQ-ZXd+25`H43oU<2jkPfQ! ztN`F)Z<(2dM3+o>2DvOXrYuGXIN?+*>&Jg!(~)9?uTwd)ybejfzbe4 zp>gJ^t1Dkn;YwXV2YrewP}$1TZI`iYOqjT4NG9kJI`1RuJ!)IYiy5L*QK2n_nV_XA zsxpi+tVGbKS#3Y0CSA2218W_2OpbQiqKn|Bht#HIPmwsK0U;N)mINjdGodqpC;dl6 ziJCCgxnmWQm8dARWg#!`a-No^C#`9!+QCAA8AEe`bz2UH?4%dYiuhb;25|C(g;z=OV0>VShmM|aCv0Nok7HIk5Mx8Q*`iokGgj_0#G#0II5z~k; z;&h%A8K+?o5zMpKp%m1XXup*A9{S3K3WyyUHe-8<`C4_#bE53c9tAM7Qyc+@EbeNVv2C|=^eb%4&(aiH89Uc#8fMnfd(97}PgJ&$)2ibW{;QQ`Lg*Q065@e8lLyw`J?~7*K{@ZhYZW zL;3-*0zf($Vs|o?D&NcS8thnA#OA6NZ}uEri4f}AfRFa%;JNk2uqlQ*qrMyJY!Z-r}~(p_MY{i!Y};bf%wwR z5fUXGReHaYFQh4JdEVos=YsGD2_WE3a7(+>SlYE~Ew8NFL|5bBmwIKHIi~I@*N{*N z$RYtrl_>?%PAS9nwtQrrWJyC1Y14N9>Z`B4>GiLhcGJ^OKmE~9{K9^kPEXHXeeF(_ zC4fHf(C237Gzm%sxTFe{b`e%+1Ic`q-twZvx==K!BUHMcnxjicXk=c)`#l1vCOnA( z@PZ1J3guAhBXUmo2S;|0E~#u1CEFC2yL+wloSle1D4b@PNVOou(pl1qqA97ZMOSoT z@8klSJtzVQG$)thBp=RfjEk)vEIx3a4<^FYx)wE|Ad6k%<2fJ(dA$ve3cXM!4TaR@ z*mWtKB^m*El=W0Ca&Lf$nE8~b9y-YGEmc>Rw5_V|qW68uSV#cX*4pv$u_~thbar;S z-fWt*oBjUc{$*PqYcER&2T_~hSQf6*hf2%5&=NrTf`rt5l}wW-PYb5L<`#Xn zIJbn7vVI@)!bq<7J`7_Uhk3t`lN5@8HC2b<<-x)jQ)s?lR_}|L(eRGC=*7@}0$-&k zBC4|&PPosHl$H(6_iPXKE9ZnzBGE5fD=}}}nzW{>$m%E8StV7ZK*PGc4NDls=M7D# zt3K`I=y{yJskalIx4<54=xuQGz-(C~0^yo-%&AXeHO zk|8MXXK*Ci1Jz=r^!UodlrsZagq&6!T{O31NmADxWi3nwTnSGaOoJIrguGSkBwRv3 zPkvS=y4mKDa57ChB{((Y^$}F74>fq@lu8-#wyM`6_TqO# zf&2uh;!6wTWM!NzR`)@d%zS^ zovt75PTno=`EI=RH_P$qI4N%SO6XRN{ce=C4{9WU-UnS?-{0`N=na!aAlT=j6>wD#Q@(p=SDnTJr6mpioPnBcJiy_7v7)m+>b zRl!UUe_vjAuySZx3q%zj5wQ$`lhWBc;=yb`j z1?NGTVa;#+2KB!UNV^t{PCufQ9A8pa_`%vZ=$V-8WDywCoD^f8Z$plxiIYxdy(Fqu z%n5;oQYH=y(Xvoto0UwLxO_!yE4pdc&%ONWTi*EG)#cSQ&%Uk+t}ky+j*rH1n5Ice zQ95+$)2^+Ld{}|TYVBJ81>!Y+>0isw@@*Eb3bZ)F!U0ZG6=UTfWALT8aSjJGEI@_*uAyR|?8wATCVC!dy| z)i@p>9q*^PcfECXzS(RbxVX5OcbBX4r{_M2@>Dequ_ofM%MDhe$J{GZ3f^n2?>rJY z#8U}niINo6q6UI$P(>*#LZqWT_x00~9sw{i0}1V2n4xjIGs4q*>}cnL@_)O?uuzi{ zvG5VWq9STCzmJG3)p{qH=IgzC*yb+B8M8XE5)+mktT?RJ0Oonp*=u8ziFx6l))7CZ zmylN=5Ne0D6$+Pll^Y+BrUOv$@KPzMi8T9&3kr;7jYIR-=JN^QyrP(MsQ7{`lvscm zVFd)rfU_f@O3~018m9{7>MPsN|MJLNuk!Us%p*7`hH(@b=KVxeRdO-Oyl@mTML?2h zQsf{uqSSLvv^AT?;}Z^Oh81DW@J8IPI6H{HLnZBc$=TDEQ)?8#r56Se5+rnLbX-&R zbw$Odt|@d7k=?_a_VoOYZ2v`C8;P z=ohz$=8U5d6otA^R|q^NCJ(V!JpYTiRpAl zs?6^oshoCOOdwJe&B*42b54Mgi0%+pU1lVNBnzEa&3K|Hiqr=c<&;vSqH#VXeR+Q6 zGo=`$4Wjea#rD=O*Z2S5+Vk&k+j)I`ZO6KGNN4Gwwx+(>U|Eru4&nC7bI0^RSLb-= zcjD=<-2U``jTisnc>2sd&(b1*D#KX1FrhKWY)js8uu7gfll+6W9lwL1=HsRz(8UT< z1L5n~fD%9$+$L8%Xa~xE`XS8T7cc&W_S{%15h*#5<` z!Uyf|rq$&x)vC0D$UrD_9r>yZr^G-oGu*jhRzj~c0qs3}Zkgy@<|2$p(gYWLQ$GZ~ zp>>c|4{c~&_2zosUGHxn@89_)!#90>d*=4^gFoDV>}S{a?zi@;Q~>#Qlq>8tp!Y(J?LVmL+@rMr4>_%ENU*Yk2D7LA&yPPB7_pa_S-1I zFyQMoLHiZD*iXgk6f@M7-iDW7du==KXVtUQliTOF9zJ|<`_^+OCnpc?-=~6lbA7rV z)<;srrW*6Fhk3>W{*c|zC5s|+p?ve39N}B>V~I8wiNc^vzDGb+(1pu*to0srR~1FVY5jV5DI3rO zuW>M?5ja0aMnzBgXOUOt@A#ZWzbO&UX~1Q+i-Sp&<=semK29W})uYyN9dPOxUM7FN zSfQ*^W;nd_kG$Oh+}iKS+7?Q9$v54o3mTD#$gbVS6_Y2 zo7Uc?Nj%Rbq#%ow;(zg&$;u>GfSqklN9ZuC>cTn^Zzk2SbB#qpCQU-kN@N1~E4fSy zj0c$}Lod2pd-fcu+;llHx7KA}Hi-nV;kLg$=u=ucm$~9dPsMLBE2>bdmLcR+zXTmt z>!FPbo%TBr+5@^{rkiI?mIkhw-0j`>zII=;SclZ`LX6z)cU$And{3@G=h~{Mc7bTu z5>|yD>40y&n%1R|)_mg(2Y!=0PyG&kb%JQ1-!dU=DK6FetOn0~ge+t1ns3=@pg)~S z_UA0Zh(Ix4E6$Z%cVB_xoYpj=NXK?`Kf+p7yJ8@^iBsD{ubU_uX5e2p-Cb?hZ`yy! zAL;M@UD}##J?5X(5908;9x1-d`sl%%SQsFY_KC!Ls=tVK%|Tp?t2!b_@Zn!d}xn0QGC2WgiEiyi*&=$AWzvVdkN#;L@X+ za3kZ$jgy^DFGnbDMV0nQZ7Oxw^amOS85fz*T&CSy;5C)5q-PQ=&`Hw;* z^608W8y{M?0AZm#q>-d^f=pJLNG87_9_jp!XKRJjul#PyKTJ%0IsSk$ZCQ$A-=ASsljNBlDBCw~Is= zBUU|T83iJ;R}e*0!DRbij zqY4cuJ6lnMoT|0Z|L|RW+fjMY2K8C!Hq%ejof;06x4|`@ zY~u_kuBfoQ*xzwTYbUmmOhksv|MocwU*+O+pfZmoEFtiLM~=kFY)aQFi9~vtTN8|T zjNJqxffB21>`55=f`F+p4b9#Py*O!kdLbh=ZM?X+ynFxQ`RTECeZ%vw|CtZ{bXT06 zp54Fq;2?J}PrGs6OIwxMbDIqcRX9oEG2tx9X3Zw(UQ4(pE_ro5@GESIlhdC~)6fIa zik#UYsa>Jk2Z|QeJkUxu9dUV5bda*pk76OH@C4LY@oX=M=5BJOwgsBXu;_wcPu>=! zjJAe_oELMDXcB;=@o8o?NXSy)l2S?{l^v_U6|?2vq-l8{Eg-3SPRUYml7d)Bf%gc7 z4wQc9cpvTTQZz1xBs5$y1D4byl6Sd=7MZ(%MK)yf=>TxBpG-_V79uHEu#^wx)f=@JPx7|oO=v2eYmLy_K zjuFUEVB%TQ>%z1fZ8`k$+U;$7xOiSp`tFlL`qj-CDayeMiUJlUWL)* zYYjG{dO)eFoy?N zwDkBiZvn$6$u*WxJI&-s;5iVnJ$MWKjRI&Y0fk=AE_UMN;&iyCq&s56cW2^>7N;#P z@h+`FeA7Ku^L^AKuVe`W4M_8f47GY)pGSIB2bxAy%+!gAau`<-nfE(Im)00WhMtia zFW`|gums1@T_X*A*+uK@BrfNBQ=a*NSyT)yR8E1iw=Oc>ROS&;iyfxTFOe5?dq zdkQ3~McI$6r1OW9Au6rMWG^bskKS#7pf`wUpQpAPj`Z!{h^z13{p26rtT;bpG?M%3 zCI1eD78hwa_r{d8@ivh~bzyWnXhbR%2_m_i(ERYo&(fd6Rje7dOF)4VQbBs|fDlcm{TSORwpfbzB6@L*Cr?@+$Qio&;`-z8j zFQ1Q^Ef1&M@F`;opI13?QibpkYoEu+oGQIpIe@8gq%G_eEE-lOdc=UUbyCl}!XJ%R!wcNCL z;(K^rq=OFRi&YxoRJhy{YV98iGuVcGma9Ane_c!lP|_`7Y;!QZ;X|10h})f-$iWRc zJ|c*(ev#Dq$x3#cpG+$JglUoTzPSo_=gDNIaGsg|p(J)16=6Ynu^PKHeI;os zpV`SgYm98LBMN~uJ7s)O=-hR;>o-@befR7W^Sj@OuY8|=*}MDgGh9E!7rubwVZL?T zzvXM>{qO5P^3(hO^(WfDd13w1eQl7_<6$*u8!Y{y%JZS^z}KQ!N=`|nDBtViA0q() zD9I9ei8wB}u@K2>LUi$DV7aWw_d&cx36-d>O^S{zbSeAD%u`0@2g;WN>@NNKq0gi) zGP89Rf-ybldih{v(UT`?*y-SHOF%An61pPujb*&1w^+?QTly4bVRCuEyiri|hs`Bs-M?WrQA{ zr^=iFnIa}6MI%ML{3SbOIeluH#Mzc0on3$lD5!IUDo$Nzsn%q3~g^r4KRW5v8nw`M<Z`Ag$G24=<7hA2!ba^R zA!B`sj4VJtK?y8O&tttBXd|G?yB;YYib!+)+rU5P+1VVk9u8;39{|9p<>NqkdxUb8 zIDs!iX?M^50IHiri8B$Qd!QB*E8dhrm+)P_jC%q$Xd~|UeS&2e+G+*GwA;cK|GN@l zxqQtOokTKTb&)-h%+%Nxx$2x&xwEkfgFjCahtdGCWa80`X_+Zp6f4BFNo5vO&Ky}- zprFnyr$1~nvk?*ALs$WkuS9YnJ~0%k8BWHiy=yCrqat1n5_;L(WvdJ;h|JT@2Xx^2 z!m12bY*2iMCDOMR1vF{gBVA#uTQ*fWM#s=1DBp-g`6gK8w$eW&eO$n8y84s^{8gZ| zM?Om&5+cg9$i`E>t!eHP5*|G=0O5&c-d#`6{~Emgx8i2suJ`R|t!N!Hw4FR?AD-H2JDOS{elWo-t%;&{Z-DQ5QQH#Wp=xCjQ0^FA zh!gvo&d%*bb4X+#!h}pM@?_02-B^KVXAusLo~4OZHOU^+YOJAn|3qDf(KMH)7mjzC zYlwAWN9{Zj!xAN;tPJQL_zBlJxf}7qN2K3}NQ+~evfyMfif~&dmXaG{Un!g5F$4jV zeB&%j=G!79=OavB3tncvgUh+rxT3}~%nJ!KzQU<%KrdVw@vx#GR#c!IskDaqW;c)1 zdw++#^=oneMr72cQ}^AF>q{DGSO{4)b^&g|owCOOY1nps`YZZ-zH|4}-*bF=+!HC| zrsq)5LO;{UtGX6TagWm^bqv8D{6>ds zQYdyQr9>)3_14Jn6veP%Qpe&-yRbF%*hUHnNI>d9jZ0|b(ZN#gB(z#aXi6Nk`bU1{ zy)zdZ$|?3Tizs(;rcEg83_$Y_%;<6AwGERFKa{++Cc_}D8IbGLb-UBuUi&mIr_8CPp_lJh+IHp%X~mO+-yu(-u) z&hR1_mC#-1HDU4#YcXu-8k;4T92QuQCbAk=XsyrFG|eV_=aX@aR3dxzbP?((byqfX(5-OahfKzQ0S>zY_}wAmbOjviiItkt=|aj$W$O&Y7Un~3Ps+C1Ek+6vOc;f_88+NBwdX6SGK8YIp1@6XxiZ4MPAy~bF zi;4~zL7Ei;G;w|7+cAL_k#=!bA)!~svT1#)^Ni`_tr(veuP)mLDmrQF>lIc}>``nv z(QWag;iaT}-enuPd(KJ^m*p%Q~r`w`VSlH5`ZF>innG#aCfTZa1$|@uSw7I ze0A?0bT%Q%`snQZY_%EzTs*v-Zf=fl-(HPlpE+3)l+m-&B26LMyY?=_sC~M;_W=7n zpsTa9^?Kd=3@*4@2cy!Bf?_XOZC$(?iC&NO6ct(MZD=Z!#f2zD7Q!-JUIAwbbyi%M z_NbJ|UIWJjeCM;*2=noA>O5P-gCkahf z?$?-*4OkY+(KH}1icfd1-My`{ts~rhmXvaO2*f+f)P!8{iL`j4BH+8m`X;G1!!$5I z)Jnov6gMrfbJ>wLSh#2RPy96>-lLdrF80rUlfL~o>ux*ry{<&N^wttK(`(T<4x&4k zfTsA!GqmrupXwKX)BMrD(RZJd^)cqIu6-gRosAVP$K1XVmHgZ@voJR&&EcZh2BlQg zA`FD!>e?z2UK+k#OPmUX&r(KX5@ji_O4i4$_~#HhohEOO^5UEy zWZK359oitX%5ICf3pxaSJx))Y?qBzMee-j8$6N58FY0f6P8;yr1H5zrZ8$o{IAh%~ z0P7X{fXglJU+CE}{-dw%U;mZzkfCAD^ABkJf#f;s|i{3`7i!I_i+OV2mgM$NKoImfz?j zEgVeXqZb@DLc)B|=0XmvrzJWsS8Z{4Z)mw7Oxr#x&QzfE(A91^-8Q=#w-nCPTI40oT#j^`Xe;7VO*(Tp7v?;To;R6xr;QaPSpR5HP9F>k_hHNedr>b zIt!XhItFg2{&)9ufGYTkl(`=lbR{X^lXK{FRD86x>hGJxvW{o|13P0SimEG5@eB>3tl_4 zd-xUOF+zoiTLtr8rft9d6?oz~>}TkV*554y4-C;eL!rSy(k<&1Y z+wJz|=KAF1Y#2ric3y-2+OPkH_y3At{_?9Y|G+=`M|bbMx;i@QIzt9@fefBWlEz@y zor&3`Z*N0AAU`zXZv9Rq%siDNnUN=MF~Ved^B1iTyfr90KvlRIfeVoICRY;-36+y3VzQTrn!~xcIIgUh`M7AG96nthfbuvrMC~SU~bY z5xfXj*lE&2?NFkyX*5E$3<}igq2pEKDg+{jyI?M<{}gOc4Y<`V(^drYI9x(eeVuC8 zIE&g4*s5jPfax0TR)6cSna|$b?%maKt*U*f^uQm)r2>XHA<43wNvnxs#*P{2J8W*_ zxv!c&{x^p8S=TAHpgxQ!at*IKjxy^pbJdrXmrlsEJRIX^k?k(1E(DswK#1U>k?JXa zb=E|W7+9=`Bu&glPKwkC<1`g*OhNfK%B9h8dq5;F3dJ*REMTRa8HcxA2;q9YyE#J* zYsa_oa`WjLm1bNLC<2nyR_|LLH51(^Glxaj$O_VERM8CAt}i=!zkP=DbG?1LKl^ll z^RxQJZ|ZM+PM?3KZ&tXv!kq`$%@ANc0u6n_3K$xi!y|?x$bgGIUVBMbqVIaMeCZdp z-*^un`@;O;&rBcxw0`RI?Unm-_i}i6B`WRoxQ(Nge(>Fl1&gd>qv`;HL5BUb-#)l{ z_KnZK^^I@bZg2kW&wuRXpoBI#XPfsMWZ=fb{c>b!C<5S^t5h>+b zglia$yaq(cBP1dW>)B^k-!Wd%0jD#v@F9XB2D(& z`7@t;>8bZV@$kXbd%onoANK0Y~l>D4=T zUVeFX{&b&rt)Z*xJZo#M4FYKIs&mY|d;hFOuwRmlA)RT-Ko~uPTY-pp0tE=<)bN2} zXF&y9&Z>FWnPxNVe|g6hBA~oA!)Y2sL;Q?OObmmd;o5!>s^$ zJx3{4C=b;hZ*oh~I5!vD`j5%F@H|VM&x{=3E+G_2!9jP|Zk0*3sYpcaLqzdSZUv$5 z&e~%Jq7US$mcY*zvgMts>c+++}1 z8=89_N?&3;;k->|ab|_DvMW(g1L9KCC|rptG3DuMx=sr%SpY8YCJ9*LF!_ji*m+Rx zqHXB-_}|6P{pr>1H|c%^u7Q1UJWiJ{ANw&b7)pLp%7R2I;gq35k6LCI0*wqXqCK|x zO7=~@?7y6EeGBHDow{oaM9?{qaiQyiVEc@IQn#+}U%d6rZ~6oO>39CF-|<_YdGg8i z$?<1C_38iOPy9E3^{@T)lUujP)y5&OHE5rvJ*kzs6OgP_k{ zXDi=8Yl93;d++n!Yr9-;RH3WY`ugF$_kH;<|C4{}kA2ZQ-qv)`39r2T*?;g)e(?Lg z?|*#pGe7@b-|;=){%ybcn}6fCefE=|dGeX3x`?#q`zFoPFvxDVf9qS{@`l$x|B;{n z$b$zL$7g4+y!hg`{g!Y2-aqrFo_+R-pZL)ae((c7@zUo$adLJH9Uw#RZJJfP%Fu?v zwpi0)7+D7P&w-RAX3Rf&sA=EUAwn62?&90xEPfwA_Eun5(j0G|%d{d(-{ z4(JRy(&Oj5POWzy1FK07k-F-wGfqxC@C*1ZugwQs{c@!Rj3ULn0W-Pcj^0(#MZ+hS zM!gG`Mi+^FWR(2T{kvVv9Da2O)I-N{cbRq)PVhe(7_GAQA<$lP2Nj$4UYC&aAA ztMu*9$BpdGD48^#sd3ez4h z-UE6+-RM`m6JPZua&s*&-O*oosekGV^Jl(*k9}TV_{>`8VO-CFbZ+UQ3N+;|Ot}DJ zN6%|lnWo?VJAeD{`;OoJ&Ue0R-roF~@BItk_kG_t?{}+lqg;>_sLt~|Pnn!+t+k=q z&U-rdxdRx-Q6PPqJP+5JVCa1k5s`+zS3#3ipC_GXX(GeeYgZ~_tu)7md7kzc zm*4iSzva9Bv;Xw<&prQ7|H(i5Z@>4?e&SP~IXgd5%!UQTt&EV{V!D!bq*gbQKu0IS zytv9+l}u96Ms!qY2cr*7`V{)(8_#Jv9OqEL+&Vvx#7C;M>a=~hI(f3ZLRg+d;Yn0C z@VgcTT2A^zB=`5F$;yIt$2}%Qmuo&YF?`{gg%gS*Sx^8A@IPpWcOMLT!CL)uDa}+2 z^AAcw8G(GEOF;4S;V>5&pyktl(f*~!K>6*FpTcJzX(I8-|6F8e@F>52v?KMB@MDkb zNAA8eB*{Xe=W)J{I}qGBx` zB%BLepwYk9MCbjy-?btvXFdi5~s@Gu;;vn4>3=w>A97Wq%`d+SyaiRuAeZR1!AZ)`50npLzuaX~%(87_zJwJ|=AO?YUmmLqbh^0ax5 zm^Ihp`?qFj=F5j_IQc6mjhUB0dEVVY;(qDz)L z@t)6IDQQr-7QNf%4RjWCJAM;tY5_r)IvbgWJN!{#S#KUWk(gspZ&g$~nrdshQ$0a{ zh}{hAfCd@e5>opqYuD?eiwF0#&&Q{?+G^O}+}vDVVBX0vo}Ar+Nbl1y ztadlo+p7!od3AQaIXc$9Z*8@`x!GOZ2j=zhtzkV%pH(r4>7EV^=vQxi{`s%^%CG$7 zr#|^3|Kdm1N9!+s$2;3BN zsfYLP&$}C77&m8|lXDE{z|G~uVHn5t>fzm&hjFt$+FW1UZ$lHoe0_yB9^bkR!Og?F zy4$zS(dpT_G)12^JzLc;mvRjnIlBiTU{Qkj*OPTo`+#!b5$TSnFwzRbR+6egRU09J z3Lh^gIz-u@&Fw4fU;R}Z5z)@P2eTe&WwaDcwOvp|-#>dXI!)A~D2%12+ipY+*kw;oXa{hwhcm@bil^NY4vvF2!I(zsE)+kXV zlFqocQp$w{bb?Ib5k&lAUyzLbHreUqJqS+2G+ga}XuHA_*F;~N9%(6VYLR9j=SO%h zoO?_j7~kbvXoYg7l9Jg-#)IJ=s=>`=+n@l0Ht55tlc(y2Aat*zTZ! z3|Ot)SP+g67z9u+_lS2WWHznFFnGG?dXI;%LT6pA^!yxO`8xU9UnczqpS{z6;9p(; z-F(^bENaWt8du4y}6pFowVWP_;eVWqHk}m1Z}li znYHcr+iBXaH^-`de{;RrZ2G+4U0)5us;$=wOgER)emk^rb#w}WsO3Hs+E?r22d};S z4ZrG}{`{Z&(|2Ee<;Q>g$NtcF|L!-xgweDWZLfle|J~4d%BIv>uYq0 zmd0x6-h&7&8G=tN^+w!m!kH9E$U78?jS^yadK~U5-gqf*9r;=r&B`r4%t)1QO=eK7 z5UZ~BH`G-JX*XBbFTVKl+u!=8hZk30`~LTTmrz1{C>BnY5S+j)06 ztWSH_C{b}sX9$xXM(OEf;W!Xoa#EQ2MxhW0T|zF!#oK&O&4b-COJ#kEk8qFopL$}N=F7|Lx4!j@ zkB^VntD}1l9)9#AFSO0+JWuu#1o2p)bDw7!21`|_%vsaTD%yzm#b-@L)XRs7c_AE2 zU{GXAeoLodzcbI^p|{_dLJ7&aH*`>Sxs1xmW6Z>khWJWP4;XrAMw(R;HF2sds-6Kt z@Or<%Qr)Qo{_eV{D7p%y4Q&_{GVguS7(tX=>8LhFj|7TF$j*2boFShkaTaBwKoez! zrR8>f0ak*e*jj2Z5#ji3#SUUi*{1Da1wn9(uuVcUCxxIZ1i;Q*Ov+G$St{~41Ez=Q z6!Q=Mr*0=uOe)NUV*q!X1Jp8LGK?!#o##CSUX5fMKLU!rT$U!Wautp9kQ`b3eH+${ z6wI`;d7gdX4upeVO=6Qo8()lx7;p8x7|pL==Q_hEGc ztnR*Y=V-I~@-P4L^ONI`eC!wQUtDyZpL_24um6=_{qA?X?S1ci?(#6Haulx_c z_MPv3+u!={|ECXp@PmCAZl=D!-am2sspp=30JK0$ze*LK``jy+4;~&r@x(k&Pd|No z-s!!&cfaJ_@8}pm``MS?^rqKe+<&;c*}d&czwGjQ`^is!8uRq}H@yD!&p-R(7hZem z)z?nWkJ`{|U)ylv3yvXy4@}o`p?{$Oj@-dmi7v$s7K_0Q$Nk34>8WrDy7VL9xxfS+ zJzM8WwLgVU+<`pMO!+v2PB1&K8cUGr5_u9;q%M=`g>AOX?5YO6FV>gwJ?+(72p-}l z8i2VVqXEJNL`@nkLXcQNT=J|M?Yr9$Wm2RCl6mSRDlEWY25MWB^qt~VPT#2G3fFcs z-G*&QLriT0Ecq{rJjqx54kHCHn&U#Z&}z1*qiGjWV0MVm4uNRPad8zU)Il6_vBaT?)51&JEv{LyONePp zsr&cAB~SDe5z|ygKsd4)|#r?vN6>o2w6B7O<6^(OS)^{vn~nDX@u;_ zwTcr|>R-`+Fy+#75rF+5>@-X_+oRR^TYf|TruX-M`_tI0fDx@@HR5=UQLx`Z6|>qF zYzbr5TC-O(8!({xHf?AE+v07U0KquQdZl)3{KX~a2MWbe!<%o7f8@7LAN}n1CqI0A zbUq_;g`rfa$u(CgL7(SgwfVpN-~Z^xKK|)%_=aEi;)|agkDmH_-~Tti`fI-S_~>W{ zy}5dDb+LQu>C@x&`75tIxZLi~Zry4PeVQKLy?b;tJoDu3{dWJ_-Mgn}=flx>yk5`K z)VmI=HgD(6dUbNNzS(YjpPR_V-B+RW(aBj`jZ>d?5AU{N^V~Df-hcS;=D~yU^lY;l z`rNgv*sBbE`x}1CZ@m5F?O*+M-}uu%|5MLC_s_rXSANx--|)Jh`PrWzp1eIzlP^Z5 zdf4dVFk^QGgkB}ugjkZJn+E%h_J=`!9>}hMM9r|zpa;*TBr26dVGG8RhQ_=|2J_S+ zO-m60H#`hrl(6L_iYn63Rfg8lKKtSq-ulKjTwGqf@7-^I+ZVs{bD#b6+u!<@+qZAM z{OW6uQk&`Kq75qyYuf;w_5@EgqBxQ;0h)hEJHEofCx|tz>OJeSr34Kl+AO&mvnnML z^1kIW7lT?dAeQG0I%X&FvUE+Gt}l#g!Tjm^5vsNL-OcNho9+VKP_=m zucrKHD_TC0WYvoz4zQlm3X;M>1?1Ik9}JcUWgR>>YP{2vFMCK-$70qbSXVBvgzW?z zrt`_4_V_u-E-9h}I9XXdKHQ?@_#!Mvyr_nN{`AS&d>Jy_Sh&#?sPtVWJ zUVZJ(>Dl?~UiYksoZY(hqaXOGd3&?E{lqlyA!EG6A__>8rs&!+%h*Il)mb%iMCHMV zMdC0f6cdsR+kNr3hD0H#>4?q!cuB#+7wwPL7SV^>!Q3cT?C38x_DnG zNue8|_NxqzfC|jOYJjdWTc^73DG)YL+V=()E1vmv%jf;OesZ2Ww5fMxkD+5fLmEsn zGIPV#m}JEPubg=!ne>xb9xde4{rp5OV~|J+~vzQ6Fj|J~{9-nKbC5p54&`P_GW z*B|-PFZzx7*APi}wa z6CeGv|J`5uhyUmwY)+4!K0W)6@A?DZ@@@Z{XPHdA&%W;Y7eDhe z|3CKrGu)D+Iva-XRo%VQ$rF{c5F$umgh@h(oU_OX5a5Soz+j?Hv7Flm$#c$p!2J*1u=xk)eedo6_^!(@zv|6zd)rf= zau$dB@80?D)6YErhd=nySx-A_(}uYRJ>tO+c+?}l{kS$qM<~)ihQIacIRY8DiCr+{? zfmqJ0aWdL5^=gcw01!|->e}%TvD=EMAexYM!^)WSa7D5u(glKsGKq+T9t$1qo2>h^ z_*`tt0R#svE{+TAS?lhg)=za7F(IvxRDYOZWv@~d!fGikrjbkzNNTVp4jJuC8om?% zmQ=Z#(h?G@fX5DKIkzaUbeCi$R3SylGxf-9^O|iR*A`E+&yGSJT-SH!(j*e>k7)P; z2pA1f5LX=vVAAy+;yK4xds9b5D&XJ%cmyCcf`5r z=8xCh(&=@_D+>=e^L~$e!XuAA@#OLH;y1tX?XQ0A+p7yJZ+z41hD)m-`p}1b-K;F^ zd(zXN{($@6@9*FIdUETYdCoI0`}NNb-MsmJ4|(XvKk=yx&im%Q?tTBKo&B5>PQ2sJ z9b3*l_oF}g$=eQKD3q@3eD|CGb;i9qr z1!XA?Q0C1PtpNg#{H5Y7R53?BW9kf_#Gh?Kk`yN_?}XDLDz-eCL@1&WAw+aV$t{ac zts@td+16swSeZpE8M543QI>rJ81O#0qMYBquw&QmBQ~!;Fu!o-nfLp|Cq6O1v^+CC zbzos}JkGXV)aRPvVmVkJ0i;$gE19%>jL5=3rsngqJ<%AXpqQ-t8N5w!I>A4EB0+sk z%d4Mu@LXssDhD>Tnb>kxyOnj+aHYaA0zj^C zqWFMDti7BvzXY|(ePu^F~`!3Mt;HeNBmnk!VLkM|J zl-s-tz*dToDN_xU3#!we8*EDt%UvzTBI7@#cnNbNhy*nBFHTVeO>TR=#4Jqeu7^;NkHR7I;$)E-ft|*8ocprQn8OUm` zHG3$4Mi0x)99tt=W;hc}GD8tN6hH;*Jpe#@VuGq6$`p5tk+QmzL_bOcOcqBsDr;*c zA*>#PnOy0E-z8K}LMV^8q>0x)%ewt6WdOo1a++Ifo|%aXS1{PuH2|lZ(28;n`mDZ< zl%T{dIcK6&PD2iqfiTjkiBXJ{Fif4*5Q$JEoylfaLl_4#KiUkdB$#;T)+gC2Dfr3& zmMNO#9k#WpC7dki4y8awbJirZTn>;BR+QW*q^t>HAr;g}nFda}QCv<_jbv1hw@PpF zPFwe~t}(y}fs4$Q(tlY@J)59&_7pSJ1z`}JbMUJVIP-qK9-aHC&-JD@y0WvpxKt1g z)@{CJ>yGQLz8<`A<{9^T#mio}ZQGvx3;Tcdn@f7#&YR!zrWd~8ob!Ho(N#MxzvtcW z_ND*$)I%Qm_@AHutyjM8?eBQ|-+b`j&RrQV{Ka#hv+clvx4!XmnZcgE8Dhi z?{zy=QaxJfcFVti*W2!Lr{ll+)vq;8{ru;jGq+*(uV3+|J$rU+*>daL%=C5FT;ap& zx{b3tx8J(Bv@)3N-@JAEA1?mY;fEjbk&k`g#1oJD@_&4@sLCfi;nAnx=d`Ci?d;1g zx%ysryX*b$fA4MEcHMB}^%ws5M~5E1;h_&WV{Ufl{0n~ivkQN8#skm%=tn-V|G?tS zTWvkTRZB~Hz@1qv+kmI_SbxMai2Y|X3z$jH?~TV{Jl1QyEYjF@Dh)I!oa zvWS%9{>?rR6%0bK?M$MnB)AgZL(XE4VMP~fjEUixi^g+Vg+NR$5V(lF2oyBSVCo`5 zzgRcpN^}Q-s(6|>h@#hnG=H{pOYFWQwU4gqjP~#Q>es*hs=s{Rzkm2cpZ?gnmtFD4 zn{K*x|L(0*>yIMuU;BpF{`JdW^y^>!YVUztANRON-t+X+&VJ^LufFPrhdt`SpZvtX zPju*_UtW5|k%xZbxm#y(V!nm)}cuX5F8y^~LV1SM2KUBa1cnE(IA=(DN(0A2zfPU zIybIT}hZ-N3oAlKvkQ6HyC+_NUcqGRaw2T3@UsP|n1F zqKLJJF&fMfCXDK8O`kb`0I6G)nfts0N^*hFYSXK#!;V5chL2O7Ms7y3*0ci&_~gCL z$=90PR{ELq+p=d`v|Q7qe4*uB6vA2K`>`95uPZUKBJiB zG!lSNyv+&Mv|_%1{+0hD9Xt+|>a z4ctP!z_?(^N=xD|E|DIh?`1w)&Bp(u2981K zBc*ibR8l3K*)CRzm2R^zyw%MT#q{TK#~$l_SeTz@7fA{*S)>umAGyd*1DbcRB5D z2Ns4Oc>f3gc+GD<@v$$Sc=GXZ6VH9&b9U_5_O`eF{qDUxzWVj=b-HeD-G*nJ^Xy}e zJ~DU?zUlY-@B8O}TUcCKTwHwCGtRp6old5}r{3x0lTSYW?eF>5UE8kj5Bj6VuMCI% z{-*DI_j@mY=?|{E`f^~YH#PUd=RW<=Ll60fcfMuArbEwu>XTpezg~Ln^_K&fTX*z> z9&o>(Ty)V3|Ki2K%11u=g*)Bp#HT#PivT|LxkrBe%b$PUYhQczvtGP?+qV7l zi?4aZ-+k_rp8}RnKl5QLE2}^M1Ff zPk-{Mce>pL7ygjuW?Q%?%`KA>+<+qK5>eR#KAj_UuHo zVq#TFNg$ANM+n4B6r7``p^l@6p2lb0i+8QyW9R#8Zlqoxp<(hM0t&~4V+Q;xg%xT> z)YQZ^g&JHlH{eyc()nc?U+;|oF}v}SJBa^Hpc_NlGWYsb`a)_oin1Tc`8xL4UgiMh~6`p2_!1jA)289A?AJLHEBC{Cr zyI_(l*!{5oF1( zBe=j0)ajsLJr^dKvgALDMl={oVD`+t!NkA(^ZPcf-|(o1-~X|XeAw?Vzvk=T{Q6hE z^3^|Fdf5}6__V)%`HMdJ@lQPW`OgRVxMNPa@~Ypy{H1^Kx37QOJKywC8^F zTiuy617-Me1>>R12rSHJ7_ zrY^qtqU}4j-tRsSgkNy|!!P;mPu}^qH$LI&XK&lOb8>bXR5io#%*?v?{?j{-J@WAG zRMlB@-}ve`_wV0%#BnF^Xt>mb5ZC;9;X&gs8NJRIMZKLt7=>)CxSR!uF*Cs>xk|Dm zn43uuk!b9=@GaVSRy$zq5r9JN1!oCG2D!KfMqEbL+7LqWMB*z_{KdqUpk|K2F*3*@ zFlf)7eLMCaIA-&Pz5Dh*>fsN$;hJmqA6S@~nOa$1URYYfK_6c)JLjl7r8}e~0b#8_ zlT30(hm`*mGF!|WrjN3CQ^fGBSU%bZc~09jSv6dSEEHk`H&q8@h~FCE>^J$Vt?Hx| zA`aZFt`MQ$=}Lh@Tt{lw-exMc%ptXJa72V7cUD=Asb!V2jE-UoZCIS{w%a9|lazGwD%R$lBW{LE zO*5qQavAXC#MHWV>xRS8!otd3{_Nyqjy-yIYIg6Q13$g!!lE;PuQ@c(H39mdyjlkX zfY=8PjDnmi!5n<8R1z#}_%0ZcG&(QiAT}RZ;!|c!!3-KTxYffCcipVv-R%ukBCJ`VjhBD0vhI5fJg(w$LnpSaj0+B4VlS5exHBT{n z1CH}AlnSX*QEm~*Rxq8TAlYTmptc}&h-s5%VuzJMQs$8Low+5*KN7!OqlhyRfpWSi zDC4R)4Nev;5VKaF+e2PwCA$bD*k_;=x*|b?8F9`tZj-{ifHy@;|@wt*?FkYv20Tx30hb53`$Y_tYmo`u4Xwb~GG~>M?=7@Yyd8 zYhvd0GZUxY@kAoGyt4d;H@)*iANn*=Q*1Wm%4fp)B0&#*^=M*Smi8Yu`NYyzfuX z9x)gUe)7ZbeCBii`ItvN?5LxUaHYHQs_Vb`wQtOAJY;FLX&N332G`wibG_PhyS?G+ z>Vc*D7eBkWpmEt*zqqnMRzUSlC=eVmP!`@j@}6|=In{JQ0PeUxJo$sQUoN>q!v#8^0&cj2_Fh-+ zzqnkw(T#VzdXfAp`yoOTc;tAV>H_G%kElP%j)HFxR>ee;3&N!Ys)&l{CdnDH28**8 zR`ME@%E_ME#W=A9S;T^*>3NdJK%r+573`nGaH11@fB||x@QzioPWx67*#WAa~16cTrZrwfBN*{ zqbmGnX>Y$*GQge#k&m$t=6LRa=5iTDA-SlcKuMs2T!+dMaTQNI<%X@Bi4sVL7QuU0 zmfN>(efHUBpK<>)&wAqH?{V6xZ~mLtJn+mjANG)kKKfA)Z@k}h$e|zjw~rK5ZQpTA z@)*m(=jt7H@<)wvy5Tj}1(HLdP zjPbahotu5vKfUL|^Uo*L4|&MLCwskx1AAWj(iil4v&-YfqU3wr{T?TueDb!NZzWe% zWwo$p%S&GO`g5N7gm=B`y*J;wY3^qZdduy)s)=(OOx}#*W&2 zs>@N>N{VDslr58{xO$MmfjPiA@A=BBuD;#TNABLa=gxON`QG=u=Z`PEaB6C5!@Akw za6E3toVN{Pa6MWon2O$j(;1x!rwWN$iEwjvSrKF|2c$ZMMba}m=bn>tq1M{(ntpx1wcQ$F z>#?L0b(#YM9E1vjz~jgYS2!1!F*>5EtQh>o|M>DBuDr&TagBelq36n0gDD4TcjL2U ze6qo$PY#LbHt(=6BB2aOB@)|XW`NnOpoGC=e|5wrjvzuaTyDlI)?M?2`~Cj9b#rA^ z?%K6?Ffn<;?T$a@m?MLyuYdE~!{x>9%ptxRJJ~(}O7eEVRQpbZxY#B5+PTtI6}*>P zNGGORz0)KD5mAwY#>q1w0Jx9z!(ny?; zku3wB8Vi*qxy8yLUcNzO5=;a}+~TqJ7>|bH&1S>S{>?2z+MSLq1`XYPIX<8f zga`zjEHhS)joN~o$u%3jo7)*zCmLqxdlZ3aZVtQ_7m;#5uHG4B5ha3TN?Df9l^}Lh-MZt}<>k=n z^uPbzFTdm^?%B_K&OPpa%JZJ}l{dWUpZ?{&fA@|zzh+^6{@Kqs>+jzFmRG*|6|a5M z+rM<~=N|XOryX|Wk*iBf%fpr7u-=ko&IbCG~=CvZjY$&KETmv6smrY8AVwH zu0~^DPyu)!yxJ|cbxbxlEc}y)-c>0>MMU{GGs6mIO!!65lgL`0Skjfx8bxb4?y8p< z#yOdBmFR+aP(j32SuQ~sN^EM;e>FL}6fF}@fU}4RDF#aG4ir9^U~+;q+6~q)L^Kyh zSqbZC+Zuk%qcRrp zT|^B^ihTqVu_Ir)u(FJqb;V=vT~0gNb)cCYxZ{s-r=IG5_HFJQUicD@=8LVrDYt%s zcVEV%-2lN=jFPBeie7f((1fO@W;G7e!L#etJVB@(LXc!kAg*1r08mj5Je3I&w7^wv zuSknngr6+oz=@zv9Sh^tkbTcF+(xSLb3hj7otZfu{EGBZ3rmPQb0i>@`p9C7ZPAq$ zdyr166x}jwrAuHPaiLRftl}b?HVv#|L@EK9(N~WQ>QHe|?P^34l0y6t@h>fpt9S#f zzbKDIQsibYSzC1wG9nB2E3=Y_Ek#=(oJ-K6fR_1V0PNrb1voO$l3)I6d0W3zI^r<_g=08`fWk?lFTx%!#v$${Hg+Kh(g+Kh3>&(3E?eBd3t6p^GnGfy{CY+=7haR=*$Rp=wW=o=9 z|N2*#{O+p$+@}8IjPcDho$gU0U%TMC2$0 zFd>vv8^iLx>6tkOPQA;Y9evD6lau`d;nrKWocH4`3rpjoGeKp+?BS|MJ?cT%Tz$hw zKk|v|uD{~A6L0@lFL~~kn{Ii`V;=-xhq{4tN_iP4DUT@tOey?K!BF-?)WMqhWlq^; zj#`SGafL}?#w5`<73HrSp%9axI@6>-slj$+A^y;E_mb=zW2;58TbT8fBPMth#qJ&3 zFTd`FQ*VF54L9EOpa(zTlHXspW7nP|58JeU{oKyoyMvzOm{=O@$BRU8-GSu5(yQBq zF!x39l)}(tv|8{hH&kq5l5nG@16YHwd98w}xlAhMwF>muN)aFkAhSLh)@;ogs(ie8MErlB|ErG?lK$i^_q*SH9{;3g?%K29$|4b;GAPAsAIaoZn{P$8 zg!?$T4GE*$gc}>Q5Mc7O(pybGn8+g;7FdGT#4-6$YL@(Pxfv~`4w4+cT2S6jF5(B``4*D4^Oe0=G5{UHHJA_O~%gyUdUQO0dYBl46^83Cn@GSgl93WGD6C#RMIwJ@qB z;k7(o(R0kJ#6nORp$@?!Q<8KHAVSgU5WA)x2VW}*Q%Qm`M$$gAJloI~KxDJbdD;~A zx}>-iGzSGDDJYSN2N~z6!jG1OnY{(kR6nV4PUI2_voeZPy0L8BZ3e)s)|x5EaJeEC1iqWI{)e((eD{fCoJxzD%1{`q&j`IQ%*_g}Z( zx^2(Cc}FOVVlXw?=?@AXgB#y)MWO0qZg$QU8$cy6^6Yzq>cHaii(m4hd!2U5>Gyf? z&wljRI~9@W!FRjG>Uivj^WOEVZl@>NoXMX`qwxzF?_|sj1+N+8irZ2+QH?4ax<)M%UJaK-peKEzT(w1GYC#Q! z1yM0-PAvD^+oNpREF?+O?^NP5r#1UN;=>4@qaM>fa=Z0JKd`OjFucypsWeXsZ1`0v zBJVMqC0Cg3?Mb_~r_j0`GOx{iA@$444MatjLbq*$Xq3 zaf+?x6l8ZLHc%W!sgtapdb-U?VWTiddZF}^g%P#bHL_mHp$PjY62z@9GL~tvWM*PA z5Z%gW5D}aMIWb{&^peg&%qD@ET!D(bN8=b}xvn?)(4$ZN$em6ZFda9T{?EIe{;bP> zaq-fv^F^SJLrDb3p&$>SV5f;6sX!zY@i>?O$8ZG^8IQGGPy2}W2@W(KjW%sQge0w@vcAr=`TjZAqOliE)B;u7_%GJfxU0WfqFiKapOZh z4guS?-8wrr^^fm(*WbPMo&C9))rG~0nRT=4rWO}Ry{Sn6Wm$pUc`v&|<&8>!gC99a{TSv|J*7x2 zGkfV-HFUW?Gcv=}j#w3;6Wg5Xt8ywEne^){Wf6;-iI`ncgnD$?AtxSp;_(1h7MH3{ zl_}Qv0$oC2!)Xti?XQ-BwMH^jn}6L>v3Xm$iEhz4{TkA33bBP8rgGD(v(Au?p4)BO zeqslIWOVYM&J<^Z)@~=7abR-Z`+l!;_tQ?DTfct$j(tU0w3=T7E}$?+kOSrBr9~dI zgklPAgI zVrn?BMOwvDTGWFSsu9fVWZO}Ibrm*isT!MBvC?T$E)YtIFKq7t161ZAiFjFKF%U0P zUF{TZP~~X))xuSIC@8%T`fTC>VNF*!=Sna&<6+36L~IBjS;#_}%F4R(?g0R4C?$o( zEjSKQTDb>_7;V*Iqymk^pH?%P^cRv$!H7=z*E(PNd)7k>UTCOZBRmDbs6B^>#BtoAQWbRH#;?IbwsgW*L^+^gKoXzDC*+8myee-o!XflSH>1-mQW zq|p|EhZGaGAPI7WkT^uyG-Bqs*S7qx(XoixWpy-=buSa&6s^mm#K>Y0HXZTHB;;TV z4z@a#G$w;Qk!Mh>Ng*mgB@q86i-@(}f|PrM%1BjqhKu`O^{Q9@#}_~S#V>vKZ{GCx zJ8s@OIXUsT$3EgEFF5B@=YDp$va<2eLpr5%Wz~4!9ZY=w^Iv%GGoSpv_r3SkuX*$S zoqJBX>nV?Y!o&ad!=GMS*!I@9{oR>o+~+;-dH)~(@YB`#rM>gZ`}Xbm$VWfa>vi7y z&+ps5^_uym)dLIrhNDq;dfi}Z!ZDLWx7%CZcc9bl5BmM0-w8$G3WrdSN6Ve=B+$63 z)9ses%I!HY58#wL-?47yPrv`;&wlok1^WTJ_UzrbZt|=rJ>{??kN*9ozpGL7`@O1g zMb#ND?fcNjKJ|roTH;X}4mECSfj!af7pO(S5AcRCfZQ4_$j*`qO_hyp|6{y6D zx@<{(JabD`n&Mw+RYKw%lLR#fIf{fCAyuUDC)P48R{2!Kj4Wyo)sv*JM*f)aGi%P- zc+ScBT&+qHOFU+p%3y1x4rNtl)*qpRNSO+U{G^rx86u4YX(i_=5nOF@mhxl>>SA#$ zB(!0>nx6`TOArkQDMC3zHlC&x_Nx&3FU$L@R1)j*Z;n#4t4d; z8>>s+Q{3`pUrjVKclVo~gv}4|2Ifc8WQL z=B*u7~31rx+_A`-MMWl@dit1Zi%t9X@6;)Sk3EJ%b95ht55R`CW$H`qB{>f$KY za_BjIG85qVUS?wU9?a;txpMNj^@qOjn3JA=$T8kG&H*7D-Wz=9?)QJg^?&%@uIp}f zqxq&rK}dW2NB+~oooLw_pjm|vph9>0Zv#v~MKpF^(tPaeL9ck$)1L6Chdu0h&wt^q zTW*}3I{tNUc+Ge`y7ZDuFT4Dzm%rqkcfRAT|MrQG&L5aR@s4+X!|PxDU*}!)#=m{j z4=?!Hi(l{;zq{np-~8&*nYoQ`c=KzSrfTp0sJh zx~8cYmzNcNXS@#h(IT-gIup*7A$k7UJ2C{QMj^L@(7b0}eQCc z$x>*7?}d}K>4eJ?TFWqA>LzrkQVdczb$@#H%B!yY_(wlJH}&#~sea>SOQTp0!(a|M zX{;Fn)Z&UXsq+HmHhnvRGSL$XDw({qD6N#Gz5h-2)?GGq_T|3 zK(U+R%p?s+N-y*O67++ZT^(w|Q3^^$43hbi9;&t1Jj}mLITk=)_b+3^;`i zf^CRM4tN%R4w5&aoGlZuHXcrpgH$01Lt0Kg@@bZ`$h3?|5LurUnx)Z61NL(^_M`+d z;|CQS?GAGyi#)3wnBo#r8smxzL`^-Wth>_FB!Ow*$D$Pn&)FU zP+=xF!bKn;mI`o)2mL8)B@NY@ZDXfghYJ}pi85+PUlQ?E&^T^9sdaG#CaExv&J`7M z%p^S7fb<7qSiye`>wvj8v*E`VUig9+zxqvYdCfP!ccG^*3$t%m}_aHMwoumKVJ6um0tI|M0c1e(u2j#j3(*KJ&$YddIt6Ir#AfKRx60 zKmVt9y=C9x>fBuKJ@0w{u3cNc{jL9c^IKp2rO$uDgLduP{gzk0YyW|j?!;icI&=V- z9Xrnrz}McmWzT_m4xwq7C@{Ma7zit?t2f=erQfSQeeUNU`rrrs)BE4Oyfm6Wu;-eq zt~=`JBg$?MRDSz=-@V5@PkG&|Ur5D^9{uR2{NP8w{NvTv?O#}|xpBRXU;omVUOY4P z_kZ)6Z+znmL~dnu=@qYfz+Z zw{9PgYfuNEo%{FSvTa8Ig9_Ow3E63^YiBmeT4E6Um(%QLljKaXW?yGO4{MzwB&JjT z(I|Ke0JkisiFlMZ`9g$MF(1@i=ej-vVXvaJANnwso;RsyE0a<4~ z3d8_$KiqN)p83J%QTM`@1MZSvQ_(N#`90+o=XP%VQc?BB>mJ~be6DuiXK7YUBIAOQ6$Mk{c&jh6|&DCn4n7e_vruKPfJ{U@u@7T29=Kwehn zgruF6F6m!ok~|KZJ1Yh^GUH_|VyrF`mMmJl*9lJ2kbn``)S{@}#E|WReYqiF95pvB zb;|hw1=qGBZ*3FSqJwc+^cP#Qoou2avDi>R$Q~rf?!wHXF0%3vqnc@bu}az7vzrrj zGR%<375^cL(t`*^fkMaPL9Ad5D2mPz{r={vf8^|jhiyFaiH99B=gN^E!=X>9pq=M{x<=y>Ji?g0gKtQOk?dDu2WYZO zX26H0+v{I{-3`w?`?>FW_dopThhM+;x|=o~ve|L-j(>RX)z{syI6wcdA3XPEe|gSB z9{b>Z`xlNs_Q)+;w_Sb36@wnX`K@o;yy-ok{^UolyMD{M_3N8@`OR;Ak0Uzw+|QhO z`n^8&+0P!BU!9#AY~Q(aWo4;9IXAx$cJA6)`vBie&aPWLu=91Vebc{w;Ju&!@|PDD z7LPgn(D?)V-}u&lIIwqL+35yP?iUyR z;;_RH`>Vfx`5$k%@y8ebbb5N)5rwpYv;j7S+{ivjb0t9`u(ejBh4#x7@cQV3aY3}Skk@k;Pb)t_>%Vt{qK!;F0S z?-JHYe!7_t`((nziqA;pFxfPbZpNA_T?iab&apL5YNoPy0O_}?Qd#Cs0<<7FW@hI) zz1~MZ@yYXle8G`N9yShv$#L)@cn%?O;E+H=HXP@ueYU51|59=jKaqc=qA~l=Mdl!K zlvW8v{Y84DBS45}*-Ml)^034&Ek0tT5EGZ>2P6z3UnfnPsJVq*n5W`0GXmsuMHVTok3`QG+WrZZ1W2obbo7F z(gn`i5SdJo5>?{K1Vd3!OtLZ{i#I`p&@{uP(5yKbS}LTbr>E!UW}R~j3ybp$OJ_dd zf%m)L8C9?Miwl2w{&_#Bx>HO6>;b1TAYm5OGbA`n{Gw!TGYQe~PVgLN5^bgVfBaDKgUO6GojHRL{PcA7j?VpSx zag68(i>JuEFdU8b;TLr)&ZuqK;fRZ5Vcw<+cHKqQ$+6D`s*cDO+icgz9OwVQ^5({@( zc{!y;F>F4$xld$EMnqg<9Ds|ma;~WBu}D(tXKr;>U==fQ+yE<)hKzHvK)A`Mh0HSS zW@Ss}tfaVR3XoHJOM-*KYzE>IW>tM_F36fNVGMkvg_Kq;rqbq$Fd9wIOm5z^ZgFXG zX=TM3M`<)Y@^`Y0DF!Cn=Q~$;D#ycBf5JBX#+xVRHVi|!(}~Aco$?QVyuK((uABa#cg(Rz?Ax<{*WLr(`1O3k~MjoG?JaNzk$pA;BK8Oqyu5u9Jpa z3E)6L2w~6(8>d`79xbno5G|2fw4kJyBO(P4mIywK!}yffHg|p@7MD;Ka-f4O@c}#> zm}=*j94eH3G@YW@`lJ3OuPRoyG@Bk&-|5Zc**m*tRFbO-f@6+HGY|>{Ca#04U5CSR zdFA_Y^?QqIHk|aj@zKx2@;qE6Rq#fW5u@v9y5HGyzQ6ddJM~s{r#+LCh^g5BL{7yN zqy&_iat=i6rYBKO+_HPbt`OemKni~e83TlnDK}0&gmPgE)Ii#RNlVgRtTqSsY->W> z#!GI?3z|5+T}6f?VAkYnvM&}sYZ)4q2_%|89j+X1v26DkyY9>hO_Hy9Y6I>e3UW!< zyl%2zhTR9|gPa?dJW?c3YBpL$o&dN&M6SZ98EzbeS3I3hI~n^HP{tV!iQQ z&8FV;=kE3J`wk{Mt|Uesn!vnRls{bB_vwANY%Z!-9eUF3s-7Q@du0Jv0QlX?{z@3?$KK-}ce~~0TfX$=uU>h{?~1{kUpa8kGavZ4$37Tv-~Pt8wr<<| zh=-l=?eCnobI=!S& z__E2_4Mkab?+K{7JwI9;t*$=psZTxYtjBhG#gBh{(T6_t>5ZEYd)=#E^ow8o@>8Gt zl5?)Asvs-pRk5n3RSrO6g*6U?=DxvaRsr8(2}P6su=QHi8Zxb24FES6%mvvz}1FPpzMunVxy~ zyWi!5KmNF*Myta;d-u;T%zN*1NSw)+tGW}e(+4?bO(7!nQ~R372BesUjNGcI)#iw& zpj}qlDiTv@mJ!1=P(pOj#SxVAu)3;d-dYc4dPzTyoGTn-G+gqdRV~QkYe4|3mu9D?rZ#Te(Cv0shof7!Y&+==cRJ_!&%51mC;t56KYZlF zA3Csed(oc`e#D4-0@^{J2|JqqLh*R^mR}+rvHmI~bdDT37lKEKwl5heZ5Pae$laDR zWFU}|tBOdr6bK_^No#eQ&Gn|Df0)c@_5ciID&9+mUxm5N2)Pba23W&^j97Hyipse% zgeEkNy{Q5mseJx(G(ak zQ5~n^la;0sk%NQtRE>utf5KlDcYAezIA4bGxa^Ng-~9Gnbj81Prq**)BPI8oBTBu> zK#B=7+cW}NvXK((2P^bsRS^_c5O@sk`MduMAN^R2Mkp&(J-B`J%_n#3YsvM%J_bJQ zookF=CiO%_&bhMF9WF1e9M}yW1Fq~&Pp{kHLkNLK!&N_Ass>ZeQ3Q5HSq+yL{qO() zpc>3>3e3URMW<1zWA(Uk`TpiXc z^PRy|+37;gv?FF;RK1mj17SSwPfd3xr&bpatj_NOe9_%db-TmG1D(N4chIM@SY2GI zmv#Z6JGG(c_E+}r1{M9OX@rIf=Zb1&em;!n0Ti9NiJ6(W0sU}!o}18}nstsHmA+|4 zD+`@&uj=&yG<7ptS}1zm-k=YU;c&TLS?x?tcRC#o4NNnnle%@fG`^rxtW2Dud!_(r zdZIr$(ciXbX>noXs?zWoGn$FQWqM2~Y zNn|gL8aZQZ5~1hJv;nq_0$biL!NuIVh+L;0<#~9Gjswoz28cIqKqV=ks6m9u^N=^& zQ>-CJQ*-uS!vRd-5W++!Y?yN6@n~gbglHQ~7nv%x9?BGyVf8?L^wXQW|05HlW;g7Kz~qPu#~cDxG~C<&!+W~d{i~n8{qT-&9v|^&49CuOog=4n8r5$B&jcS_?J5qd z)wTc5e|$&TS=XHS`ufOousn~VQh=DOJ_5j=rh4Vhi~TR3*Tn%;17>yI9%uJ`N>2CnKd9CKBapWb`J zvoATXs49#a8aM2lPRcB)Td3p9LaVqgNnudDnjJex3CKZ$CQKAS zMOax}w`s%k&wlEG`2)utee|w9dq4Ey4|aQN(&9JJt- z9;o3!Wm!agE?e+(NUkMr6C7p<+BJhg`#PC{%Ddgp@a7L?AUJC`OLgau<#fnjb1;39 z=bzM-8R)Dj);^ek#9#y6R!n3~KU!30hWB1~6|g#hMAnQVt)`*8e9%O)H_qIIx4_{|uU%)^h42WYcPqk*uo%H5r0YK!NqtOKOqZ zOgvFqOs#X0@=xZ`$wIFbP)Y-~-;5tiRkg$%Vxo*?)ij_>U7$&iWVB^{4iF^0W}rg8 zauz0_#934nWeIXkJ>npHi)JuT;Hu`*Y#kj_qMmF9p`LuI)&jF0oQt?}DRm|S2t&6K zQbkIpfVaUDl`ls?w)8mICa8g9utq2YofQg6-I*gE=Seja7;L8lB&t#(sf4bT+PU+i z&8n9XUqM7H4!o&r3I-GtFUho0S%I9d$JROJkTlnzc)mJpX>c4MM^5nZCJEEwC>;1j@Jc>npYe$jbtAJsNfTgTeHP zM2<{{GYSIxkO=#*ma3B!ZtKF%oiE=%NLh!!v z%z+%HHy>7(9SUfgx^8Nc*dnD=8Z5qj|?LNlD4nITs;Ur;Bh?;emt{&12Z>u!{j({;CgCqws7mgZtUy2 z83B%%CMT!K6-_hdKtNpkLWiUYk`Mh9ZR17%upq;55` ze%L%&S4B)XU`=grh%iH>BFNSh%*^rNPd(*|IjDDG0bBsKXpzAbP?T=RMQ+#m{+Nej zv;vA~BP6pO_W<2I^Hp$w0#nT*NcX9N1Chtq?#Q064e` z6apBolyNJgh-y#_0xEcE+-$y!JLNs2-@IU=LtgbDv8qnBbSVs!ED@OFX|b^mJE)Z> zVPQ5C#B5nsXbM5O3r-K0)lyS9tx6DuB~zJLM&Y59CC6#gT&?D9)T|^SlkEsNOP2`q zIWRK^a)l%InQGN^jDU3$Z#MCY^R6rgjc1s|s48HJ0~B*e(g!6NC#DpN>l@8@nkZ7l zN=zh6E3>zWTqBE5>4()6P&@=r6HS0~V{*Ie`iM?%p=mBy+V}Ity+7Ww<&TS7D{!~d z4UR6`v*jrVwm~U25(Z0z5>>$f0;67Co|v7js!aqCIUl%g8o&k5u4pzKew;uJ@9U-+*JA?0Xw>QT z21lF#=HMG&kH_^G%+w60Hf$;jN8qLj0ZeYrj~iw`z437GLkPi<0~Pgn*q@k~oLlF} z!H32-b=|}o9H>x)@tBHo{ozMDa&b?Mx~@CD?$q1{Uytj094~6{GnH`W^O31poq5d^ z8G|OpPRw8@Iz4ZSQ&Wip(}X9xAVEVRH&GGGnw%8SC77DeM5eh(QK>z5N|edd}JBeEi%`Y~Q*2@WVE5-n6mP>FnCI zYdo%#g)|NBT=4a1d0bYjMR(v_&pF4jqFfcdbypsV+SkyXDiI)McLk%_a%2Nw8HHOv zs%6*qb@*oYZBp&A^nRGMvr$snyR!X*)Aq6zqYsS2Q4j>vjOY($r}-1kX$Eq zS)^NZf;j|_!nvXVm+Tv}T@p>upaP3KpMs|fN3{Tg z!4#sg;~+fGi9KPpF`~iZakde~3Eq*SwM=;_vDRFX*ITWD@wY_;Ufij~O zzF251bqCgRim@q}BMo!GcA%h4!DcX=wPYi@%gX5Lo#mfQX=MY_(Fh3DXjEoA+1BXl z+m%)952P|YXyDC4o9UI5erl=ow!|4uT64D<=z~8hVa~x7GB0s9i6|MxSQu*D#0IUA zy-WX=OU-y(k4I3)+rl%xuAAtIvZ*d=>IUO62*i$v961U1Hok6#!s0{)m0&c(aYHpk z4iy9B))WYJ7}qO=fsPBy7|OD)Xflx((QcXy>H@{w~%sQiv!36CbeW0 z872-o?}ko@h(SIE(u5Kug{;wFtDwkykj%8K_)8oWW0*k`(ShJpQ3{E3lW#SDrY!X} z3I+VqiWCvyy8kbnWGd#M;4Ih456`X;vw5qg25W*;I;FrZyZ1-Q9oXsKAhByq6b}k5XtYGb?L~Kn*5BFp)?;~5_FY%hRFD)BM*;jL$n_k6nQ^#gRb2H`f={DyGb!HS4EFyc~Sr9cKd z5jdJCv4Fa6OW8r1g%~j>l<*^P%?v8KOhs}l%r3RrNo=76vLT2q12e{1(q#h+%CCed zYQYSSiixdGWoD+RZ{wuKWC%IcJ;ne=Zi>5oLLg1d8)^PU(WFM(Evv`O#2n?C%=~Nf ziiBY_jeJX)7_l9c3y#GX9?IXwq^dlE=it1jq9|Q)YrXP}D}ITkThXaHMZtmn>MA=b zi-NiN+KrcfZ8(1Tp|}6isShu~OHG57F~D3m)Wl6KikK77BaH(%u=gB1BgEK;hQ?sZ zG9_L`mBue!Gamc8c5qCN$Wc*)IHEgd4u0&%fjPu(m?~<9qlQA92?;nj zB2YaV6OnTcE?I2^9(O$N_-f zrHb9ClAAx(vAQ3sQZ2EFjaM5WfF%K|kwJ!T->V@=Xt0G9k_xPnwSGbbF<40OFtB>{ zmON6~%*GhMiAu392Gdtu{)cZ)Pe0+&kGl4%YwvcqQ-`BxeEy4{-M)hk*}QSXy17nO z?cB9%Wo3nv(G=|(&2>|cn|fT9UDxST*&!EArvKr{;&U-oLcnTGDmUFDBYt2 z6W=9^o@cN{A#@VJtm7@&RqiH8jT^7gwyf62A%qm~P>m+-o0>AsZ@oz9I`NDtxE46o z4rS2=v-gW%`p*l#|E=y|eFHEDP$5w@r+p-~jfrbaHwT4t zLU(mq?fn3sCep5c2$}QPuJ2}NUOJ}sU%w0xV(e|YYrYf>H z|C+cb%9V1Wc;u_(jdOBy$k>LUt6R#dVsgG7h0w@p?XlsYuVBfgr63C=q7#^j<05t@ zauH2}ELH}II51?fP~5ChJ=VzlvE0CPuJlrHubHl>q0Jpsr<&~nnF;MoihPGywg4cI z2DI``Wr-!*26;1NAqn(Ow8<###%PRq)6tg@A4)o<;~#maF@*84uJ90O zt*VH{xe^nc37FB2C5V=>uIBvWE1;x{)h%Z4VhVsmv|$Wxt&ue0Qud1))``=^!aK;C zQ*tX6p(3T{ZR+nLeSpdW%o=2VKc!aIw48m^OvIxKqfhKi!MAk3l=8&b04w_^>zdvZ z`xd}yd?AZ2Wj6+9jSxr34G`csfdUB@D7a_!axx>pN>4CgdrN6HRs)R5o(V6B8CD?4nfI60>c)<^jJ;D7R=UJ_hhpQw?lEPk zq-IvO4}mE#;K>zW2U6>&x>Fm;;4X;+M~FwI1V$B0+8mrRyLYI%g!Oz|M8-OQ${4T-!)iNcBTRR!2@sUM1Y zf1@jh=yaG1jx!$D8tB|`QdKrCbzdyK3fRk{XGOAl$VX$uA;bg(Cufob<+F+{rCcL9 zxN1=D_yJ#ka=7D5z^;wn;xiPYkTN*bA=IHeN7KgwB~UWCxUs5o6J!LGaw+5}P=Vkb z6H_6lJW!#2lT8H0BRCuZ+;B7L?(o9qC*SUbm1rQdfTNPZ)P>>$LqE(MLO^KXREF17 z8<<~bYCO_N7Q8rh(hGncJdZ~x=g`}TW|dcWlB-db97t#>I|)-Nv|-i5MhMy2%&!U6Y9E&pBLu1V;2;G}-lJ(y2Br`tG0WyzHN82S z2{Nc=iwE&Kz)9+n6JcfO$&?snM4z$7lt9YwQ2qs^iaVl8t)+#;;gosV>;V( zkD23Sug$oyaV0o07OUhlKpH?pIK@g{T&saraHzYErZ!+#s zeJsfhb97>-vo-Y^0laWugW-S&HGu7L(A|% zyqHS)(nN@y*%gD)R-3GJ*4Ypy*L6ou!wDz0!P5QN#0;x1- zA8P+d%xm7}1cP$mz{K8gTVMTR)thcy$$ktJ2ozOE;w;-ZLv^u|-#juP=t4zgUs-rjaY0fH-ovqT zMIf-}xPpOznBKM=Y$8IYuQLB#lp(W(aqU-wvr+yCR2old05iEMBGhfyksN8gs(Rk4 zaFI}xs%~&mlvI>~In+ZbddXuA`K)B(K_r$>VY5WRVOlo}k!15q8ch%~sp*tm=*^I_ z-Iw&SLd$}oy)b$*}|!S=5}s}!HqA55P0 z1yP$a7%{8K0gyyTfOW!#Bk_ANg2u0zlcf{`vaM5+%M|A(RiJR|5#zRaF^2buVpT$> z%9*&~2tAo~VT}?+6h!*4avbYuffOrADlSvm5?e4f5I>yk=OmPrUrFz@KS|Ou%bv+- zdO+J~QAP%{#$9eHt<-?^wk4eD_1Ps(g3`AC$yT>6wyj&TlcWP9H3xtC!wg5L5Gstx zFPF_~0N}b{W-8frm3`#x4+}fphTQ6^=t7M+ku&F?HZduaylXu}mc= z2T;h$A);V8PBy||iRptVMTs#a^{$+esFHXgNVhX(E5wRXMJASTl_>Cp?O|~mQelf> zohGaf>F6i8KYs<*AL>?@o8N!Y|MAmqG*8_=qiUlnWXpmmma!R@k_8vCUph=rM=q6L zIgnHdFdxL8aU7yUP1FcP2pnA1E1MzT@`YyZgmA>eFkhN0-**s6yqVz_|lAds$3@WF?1e0^XwcQ^6+}sXUkq+HDORIWUQ|N>jXVJQ2IV_K_`ZnME9p{!& zlpHs5bzn>CM%_<@5Z6`&8DK0Ja!&X?NRb*GY1D)>Txf~mi3_ysDspy2L=VOLnL^#KF*^SA9xZp}0l*Ahs-1G@09Nb@+Mj zqn68jLK5`rQn#g_(F~L15)yKdM>!`DXG%5R8?_5DIN?^MeS9u~4@mCHW+UO`G#ZU9 zrSK>#a97Mp=_RmsR;g>o=^!394Ffu8i(hu?hT%@29-1EwY?Klzz+Z@ls5BMv{b z)9)X3)I51t9*2s9yhgmLf;k#JeA!?A#dFVDTv++w$It!GFMPH$mQaV$;FMgv48#gQN^0C7oidjw z)r9n{RDwYW-h(|+>0ET3QX=2Rq4q4ATy<1MsU^iJxe`rdwUvwfRzg~`xQKLB^qqCh zK#Z7$q&KtVyui+gJNbes?C zx*-`5Q`*AQl!;d5kXqJ6M&06+bfIRNl)zL~1T^EJ@{NTZ1RyGZgOQRcY>Z1_W)86e zH!)HiyXjMAmdLk^B|aT8V-QO}DA~xC%>Z8(`kKCTi2kfhBSypS|gPFKoVF^%C?bVGus)!4RaOTdM;)gw?rI3U3MLS!OM<9 z;L?c9%y6I(0P6H-JH7QqXKGkCTrWA)^>|2ueLV_gKr?m}9EhW5LbfevoD7Gce8q@0 zBSHnEjWI&(x({+rtCN@xqljui?>6e1Ul$2Ss&*Yx^dLh1s1)+@mMDgbrNvwlvj>QZ z!Y}TmLmo|MygInquyY@EN_XaqLbnRP`*-IXD!X8Ylp>g!m5Cs#m_VV4dw7V33vp2Z znFj`D3SPbri~wQ>jU~1uTRB$Q$XqERxWK`6COYG7bmjX)XH&iLv~n~q2!W_!IjX=p zIkf;N0#%`?xac6p1d<{Es}cp`xwVjRP!X!Ksa+kYc14W>nIei&4pU7`OyoQTrU2#% zY<^&~?K2fQF}}#+bQFo?Y1T)q=*sl`-e9hTe%}g;=FlAu^9B5kl}p9w;=q z!xW1XMXd$EGZ)|(9SiUTa)C-vaA7PjQXQ$zj01rKIT}-_J@o<)h?xs8mq5Wq4+S}1 zA|A1;3`j=tp(1Y1;scy_Gt3427#JgXa1A)XQSgpDGZzJwLUGkn3Mth7TF{uyU`8|| zTTqdQ_wWI}fp6ezj2)QJ)EEcy9zHMvnugst1O^a1H^XrV4aaplv7xwgnFAV+X59F3 zT$J04YK%OH$jjm>P|&3=3@`%0djzjtWewmdxJlYY|4s>y=+3(s^=swQTD#A(@FXiH z! zYu6aMw8>0v!6T&3gO`ltA+XlxT5wN@`e1RUkcDtkPk7hCmlaPz70H80Y^tQo34 znj1T`xcfHS|5Lx;#&Zd>9`v<2%qF?qrjn7LvtQd#aP2@0g^>QD*w#?3)~6VL&bt-R zo+<)jb=pDiJcydYf{-*4BlsY={osyr`&STAx6_%Po}QTK$8%EZaoDwc_tfO%U;Wj~ z&p!K^+js1K_rLu6SHASc-eAD4Kr;jiDS}r@lj;{WDyj;SD-@wRlR6O^m>{riZI_gGsN29?HB2 z^PSvGcBjUL!Eml{Mahh2Gz94q6=)DpnwK+Eq~Dyi<^)11J6Z6>cuw9gZ#4HM!sZlS zvCe0@#%2a7@?_%NTFox(P8tK!4rCHX&Ngnza3IO!8V6wwz>wX$MqAmU2lI=RZ3R24 zsTYD#R?;HiKU*FWxg$oJT-70huZPMssboL;3W>u>N;%c@N^maHKE(VmfV8s-vYzvHA;ye zAci^XJTy6>6UqXS9oU0CLw56H$kuSAdD^Io6`a`ot%XR|ejbOiWg?MYYhC-?Cc*fR z;2a#mmCArofqE@Y;nuq~a%;clq-%*QXMqXBa9LYxrsUvANA^A2fYT6CrwHmBr5VfT z2$^nZ#qE(IYzd1PwJZUpgtPbOf#wV`h=Nt>vbCEj8tsvhE1MA}%|LU4=`ACtDzE(^ ziG3hyfAVz`rkazUiX$IW_#KX&=aQ-}hI_)V-y8N`PMuQw%!oje3L32I9CF8M(>*)4 zyZ3mpuAHNKg;!RJey<)4*)24ef6d?Wb5|CsC(Uj$stM|CVAfyF`*p(y)=CamtmXg_g-#uLrC)1DjL23}q+$_|ea_ATS2N8siQc>krS;`%Qy zGfEVzAed`VA5({->~Yh?qzVzCp68Vv#5G(YBIz8QXY^1_p*Ia?rWIeU&}cR12H_?m ztl670A&Vc|=jvNYNLOlMlVmClhh?!@BmxRE^__4SF zS{~-$5K8tQ>>L-eA%cWN$&r=xGeCjj{{$fJOgeQeiW%l%OqrgdN(To5mUe+hASX*B0l;A}#pnP9`4wK?(>d`W-*mS;j6Cr z{e}(eHg4W9IW^Ji_xB%|-@AX`>hf~%-au*cQB6}B+GhrQ3R}f|110JuCQt;Qe_FIX z$kHdW>J*7;&J!5_2Ok4|$cXj-ef}>$ITc$J{U3Zol8uA-1b^Zyxp*+=v?H=ekaaCK zREOKZguT?{5oJ+MO-{|sPM2i?Fb6Cxt?t{m|G49hd-bbd`MAeC>WZtbefzuLciwlu z+nbp1aNIPqS%gWg_MTyFMO-H>x~uO$4N97;jB`fVJ!b7cuo@J;ZZwB#u% zYSnc*c0~V43LK&;&E}ZJVz>Gtv?m=Ai|u0#$c`$30kVWG}=j8l5D-A`3|*v_MDak~jpay3RS@ zjKqO~4VgHzTFiFj3bYO-(MH4nY|)&A9gO?b+95!f;90UsgHUE+;uuw6HC+)@R4i>s zhOG3Xs|Ljwk<^`Q+=qzLL4%5Nvd|2{3K268He-xPob*&PjOVSiC!^LV_Bs)N-bW~R{ZU||_Y6vcQk z-1KXWn;Qj~8B`3oyOCw!gusCUibaf<(#hSFt4m^TP)%U+DEP6g0%?4Jr*h0;9}2TL z%DWtx9m;8RrWn9*kv&s6gQBa|?2dzH=in9*?3mK1wjJ1^Gvn5u#MOjzb(p`I_t&l& z^2+XF>UPaw6MN@SxDeooM+lv1?#u$E=upjrOS+H%AJ8eent|&Q8V1381`x)P0!&(2 z#{@WZCNX^kr~-Q~2O(^?f@{^Y6-nwy3!kV z0q`J?B1qW76owcJLU8a747k89$XbmW>3L{ zFg%zhK>gsCDV|jUJ>fX}w6(RyBLf18;Huyo6s2xJUZR`?m0$-~fC#SOVn3RiVk{== zrJ{@826kPz5-a=RdVX*;heA$`EjqkfxT!hnZ{*dj)#PUMrX4l#BSIK0FZtoJP}~i; zS_g9A2FwV7T+MDD#fsjd(m;C?yl%qb0QM**c;YB@rojzRA$XJng#DPm4!lRrB!kML zJ6p^hF?L<_dQ^|Gu!Yg#**oHpQ{czk>7XpYK(}HSaKo{@{ntcg^!Wp`a~)JY27thx zd2j@dy$7$~#KVT;COmb6K^ca-`Nk_9UE>B5r3=A1u7l2gEJFgpc7;%zqF$eA6B1cv zp+*xhs!LC5xgN(gkb%90io>8 zTzJ6`SC*Gw`hw@}+`gmVAN=Dx-u&6me(Bra`PPB!ZrQwXZgys7{rYuNQ9fg+SOpyq$`;XnDy|G?)q z_;Kx*|08d`EhzUt*7*O)+t>Vn|IN_iU%J#5j339RMAZ@Wzf zP&zjlOw7#94*GonA%wba_U=7U*Udv7^3a#P>_vCI%c;Nk&2QiN?)U%Vq6;Sm6CR9E zhgeuDd%APJl8Q(-Rn!5;jwopjgqy5K^_qb~SlnREAXB*kMFkNWa?ZJeLv*RkzYtuS zwQYm8x`dXXvUVxqS)wve!>;X+j?88tNB7a_a9aNZfT<{)D*^asj9_|Pr_ajUv0FlEiO5Msk z%a1XVK#7TU37+sswoXD*Nl1P#89&GF#EZ%8(de33CVi`tQD#BeLB)fKspvQ&-;Bg3 zOzyF*L(z$ATgePZX!WAex%*({% zfP&?ihKMQ)fGK8Sn^ECcu=`dlHYmHq4n+@s%zlY>uJFEFQO4DXnKFnQe+G|cg+Os5 zRc3&E^i*~70-K21k#M1*(Yz=)b{v-#u#YFLWK)SWZ+=9+0(<5W2nee{L(a*Pnb@&V zw~P{Lh7N78TZ?BpST{E($`)A#SM~qU=KrfEfW1BO|8RYR}CGp-#J_5yKBb zWejsLlbqj18m>PFIfv0+EN%sR)IC%cN(b~1RuPs#9Yz6(^)s_aQ-djx2Qiuv_HIL66E|=~ z?1{&`+Qt4GF@FQe*S2AZTY6P?IYZ^pivNdS}&S7D0OH+Y=c}(TI2asA8vEQ|HUI&^Z!S0`hWNH-*)MLu)ha4_5UU@{{N8hYd?v>Zo9Km zo0hPm@^D+g)5WqV`u)Mo%*&p!L?$3EtWb{Bu`}aheKGYR{Z01(YN|4qTAz@( zX+#g+vtx3OP{3PuHnnV(1QJ@wECy#c;*%} z$F(qR+m4E=8SQ(&P0Sj!M0Z609laFd05fdNIhPmjQP54Fp`HY zv%zN-ux32t5ACAGSP&f1NN}>CTo&X3F@8#N*d!FytHZ1k#Hp-_h4Q&3jD%Og$#_S) zoh!zOY~r#CQcV-U9-)DAKmiVfxGx>&ttmn5vbHSoq&QcihA93X&yv?N3IbSRmDa&! z$vJJxdYcha;-Z|;Nd_q+WVhwJS*}d`3}a)cb}|G7(STYmWb&;F1g*9*S_-#EEGs%$ zqTa?CLK|qfBMZ`!fj(QPWL>iNxmIL7BL!va$fDv33`f;~mb+Jfa(MZ7P&pz7b>K^G zMm)Tn%92AZg?=%s7XNOBMHOZb=?w<++vn#UbA8=4eDfmem9Vs*n%%s5gTv4k6O$EP zgScM8;!TO+rTQ!u^qJ8UGbAG89O?tS=aLv3(7^`vERd~)7I`EDt`G2df7FD;gl197 zJ&YX)2xE{J9*q;s4Cmk%{hlk~N+w3rpkVJkbtc2o4!Y*Mbnl~iV%9I!C>T>czUq9; zUr!X+H^~x7ue4+JA{MR%oVazuehs0PT5uvph{v09vyAyIt~=#@aFs76e8XVKX&w-@ zrY3%E@DC!wLj{`{{(HHjK%N>{>x5KskhfOl|Z5_)IKDL_`dgoaT>C7@$V zwpslxys(|gA;4pV3iVCr6%(hr znUgpaAaWBf{PEiuZl|*FqXX;_L^%km5i?ZJbGgR(+VfCl6m ztZw0M$s9ya!*dhho47!gm}$?&;rus%`jLD=fMafkGQu7&2MyG-+;-9zz4q`Vf4kD&i zFOmd7K+FY^aUI7UYY{6MlQ|Xp8hJX1$s;xTigr}7A@lJi!az>7H<2xXaIxls)La|1 z4yqG#t&-5axc3p|Fv*58tZb$IG!Ppbmke4$4A2fnq@gE}CBFbE^g%Y=@zG%YYl&#v zosx@+2_wED*y%0CSDFHVKCI>sx?dYxfRt4v<0i+t?}!9eA{;gAulIsEcwhF`@7%ui zwQqXsi~i!Ad*A&Yzx>&+*R7j-?W_Ol;!7_6;rD-d&9&FhFD(rQ{psn6b+dCb)6>hV zt1C;(%gZa{@vv?hUK5JS+{SFKGT<6}mMn4(`4aunYQw0X>B9Vzc_vv4ITA>da!|8; zTTivY8{gKwx6#{!y0G?<+v?;0L{BtlZZ}Y4FhARIJ`EPTg{+n0a#=KZV z|GV*Lytn46p&k-5O)=il?RL7o{^aCjztTd*$|#r$R}@94YdP9hL1`kg3{ZXhSb3rM#KEM9fg0_!iDTp;M|#+M z+UP`+0}0x*RrM>ajq4}|deXSfY^DJwvZ(j~nt^GV5^7m-BvG{)uv-YN!DJuflvbDW zUs=6aBuR@Rq|!z*qE3xNP}Z}&Cz-lhyDE)R`K<-Sm0i~`SvGVQN^1PV z_UT|9u|2!y@Ko)Ms+Xi%h?olphjQgwEc}*=UOY^j1A$5u4n?UzGWInPIdXt+im-V6 z@%`E9)yYo7Vda)9E?&Orw^TXjJ;=xKTws=cxDuNa5a371#WJ#p%gtCExRErfrCQ@g zdM>HRm&!Wy)~LHeqizv_1GpB7MRg&uR?GCVDtz6Ik~{|wkS;R=Gh;Br*MHg-1>fb_ zVK9e+apn2=-A7UHLAPS|(Q8xn7yA|ilL28>Ax5rH2reC(4rV5XBMJ=<_oJzSibBVc zOFKZxAysHS6& z@b^8Q53Jyq*Sfv?2%TinqU^UL`Pkk2w>vI2LuODy`NTh0fCKZ%ml~mP=E_!4slaBm7ujwRVJ32EXgO8 z)wq`>Lf`|7hzCHa5@e!4;{Bp1_BAW#Ui4IN0AS!zPWaBKlQsPOE@PL9~Srkv4bm1X22EXoR-L0(FLiP5Sd_# zLL|hU8` zkEJl<_zjAK1J|xM6~?O{{P%ymv%^SMjIt|hN680YYqfA2pS3i+ zjV`pFql3Qw?_cq!=Ole8$m&ma?N2q5) zjcdp`2U(d=Rz+2HJDpCi*XwjU-EOBSst~vyk4MAd>gww1aMU04&wRjxo_y95?{>FS zJ7wpF8*l#TCqMhOuYMIA22<0GABR8zh3v_#GA?-96p2-KXc}9>8X5bFBF+jfm~}CM z=@d=lXFz(br!Pd7y@uoIw!sypE33eseaPzkl+np%Bbo;lCMRXW5wIF8F^DX;#c^ew zCJiniIqm}CDJl==DpyvXeW+_vd>ZK`;S8mp;8bUg%J^fXL!Hs2+C{BObj!xsDw~l} znImnBWh~01VR+8Q01ddvJ}#CbiX*qMlm(=1fsB(FL?m;3MO5l$0HZ)$zc#Y&vDvox zI(Y+ItV%IJ=91jJ zt?Ckj3k%19Ns7C~KARtpUoJ;Ac2 zYt#&Ori`#o(BwR;R#N*7qwbmyCCd+s2dL2K3DQ7Vin zMCO@eW(*u3ii;E^Cqv9Ez9Q=kr<50?6$a2g-p^p@Rs<=Z zlvAcH{P7*N4;9f#C*Qf(>+amWZ`-ylK5$ja3BJj4OTZ(cRgDU$_RCA=gtRRFc822f zJ}G|Ci9qW+(rBI89Ak6QdRDW+!ll_8G|kxJ0}E{BdvNGdE*+AE$ED~cnE>SIZcT9w zB`Vt~QK~H3ESQipfk1)X2;E^hgUW@Xf>b9;nNf-+h|-Tbg_>sU7nk-OSeTj|l-<>p z;mT;>xHI5_$u%I3$2Vk0{1727$aca4CP>o#w4Dy5bPL%8xva(ov2G#-K!Xu6nZ5W{ zPWiG{@ET$sNPIxb=xGNSilw&gLkS*m6*?|l{$bpFJ~rJ0OZ%|*cT|p06<}|93)K_x zO?E=Ki`EGSYAtaZp@7XTTugnSBoFeeDPjO|!v#WSEz~5Mb#ig}3L^wAE3PI`06lV5 zgKN$YSG=>VZ|;^wv*TCwwh#Ma6L$|OI?K*C?0sm)Aa>-5VsxO(wLAK#`rppxN8Yu& zbq~Mozs4Uszl1LWH}^bs{Lg3gj-Bgo+3UaX+tG)A)LmJ2$7~88c^;o}QVHOfSB7VP z%x}N7K&3|)#Q6xSR9FhgRXMP+bmDG8#0U}-CoB1ZAPkia3DdX~5!1;eW}k#XWIM1Y zbSfTS-(2|~>drAb;8m(zjAVomNR-DKX<}Vo5%prqpC^No!kzg-xl**Xc&8*AY{v$I zj$NQ%ie57GAdR9!0OXinQl20VjNnCchej=^gp)iITnC*Bst%<)Q5`Td5C|U52XX~x zT1%a8Rc;Z03Cf7JT$mRD%tWp#U1Z(72-LZ!rbzpg6|KbWbgwSLu{ou%rhND9d-Lz@brWJ3QlNLvOB^Cf;2K-%h=2`Tl$UE0Fg{J zEM`uc0ZT^7tR{d!h=+?O$gKCps~W&HQB6uW84UxPS+{|;J=VUGS{yNhY91{i1V~M> zoB$Xy-w4^eqC=rO%_-eT^`+P%UsG9D)!Z+BanY4mUGu7!zvy1~`16Y{`swc7duHdR z?|IL=pL~atZo2;F8*kpSZ~p-we81c4RAtqv`V)gLddzYAfZ)9!kH<~ZG`?X*2!WY> z%qMfQMQN}}3+3Dhw5Bk}5;mpkkeTJoA8xmuf9T+QvP)zw$|SX3nzbqzF1`0)a1oOP zt-iIp$VfLF+<$8yd6&?l2IDrq|5I(W@ei%}cTM}kn+NqR*Bg{y%Lw-;W>LPojbZ*b z{aE|$!EgAJulf@o3n;pRVo2Dz!nHqDr>e@ba79s;j))X)pp=qcnoGStd!D~MaG-hGdki`vx z#R8z3nTSwkm_JRGx{`WD9A9V**Z?bBQ94)pX3W7WGPWeNRjjt=GwN?rA11jIF`z)1 ztB~Uw3VJ;5lJvbFihbcEG1NP1p7DmOWzBqUi#Ny7lv ziuDyptfjq@C&Z1=xmhCs=6WS&O5vMKvk?_##oi~VL@m`oiK^zdE2}$afr{8*ye^Ap z>D;47Lz~Zr%o>K#Yp3!+h`fa$?Sfo^-+$0N@(} z7@pLZaPq4+9BYffRTK&0h%pdim@(2;c6n7s2vh_NfQIV>Ty8|M9x*2zEVdHBI=w38 zYE_K`gyHOB@S#KW_P4$L+0T9|m`0=VM?dzdx4iAGbsdVb$QXd6w?w)*B>-nJ4nRVY zq;*^Aj7-B_$h;E*EWDL-v`B$QT(rO-X{wwfg@IIH3?0VtNf|*)z38KB>?9?X%uohn zXWh%=%WSzaQ)U2Zy^n5%W9hzJ(w%e0i>3)EM%DtuMbJ(Kb+rk z^;OMyw6eUgcgxm#|1RbL&&(1$5rVkLSyAOX*(Wi{5hbG&qd9gWRb>B=5shU^M2rps zX>8QBfKgP>y0xX470yTiSv{!QEU3wn;%aCYISz&y zUoCe0M^&v96BRsHB^4Yz?`+09i-sIG+;|Q(TyW&caUkMVDuAb+;U0O{a^JqC!v>vK zJ+k-vJ^q(J2%C=yuXu2IkK?M9)zRHf=p3?%e)Pxs(u=F(@5yJJRE!#5xp0p=RBw44 zpZ#u3&!Az8b(o1{b)>Uw#6e1w?0=C;A}#0;hDp#z?y~@dD7)a*M5otie2P$YsU(C| zxG@zaLXc89B3bVcrOccdvXX~vLNbi4;p{9Bn}7&edx~4K)>7GNWKE51D_)8_--9`B zej$4r2$GD$i4}rDQ~`55KF?F&{Rb^S{>hX-F2V*{OA90#pQ9QIi1R=CPG@z41aDxn)9EZ9*zvTd|K;1? z`i2KS@X;6k^cOQ5H^gvlSylUYY<>Rop81wHzxi2DfA%-N@txTX8v;uNATX1xxG^hc z+?H^I@-ih{PNMOm4dFKW)mck(yGGpN0-m&1Ty>A>C$Z+7I7IEEL0(m(&XFYN9M<$Z zK~RQ;Lqw5jxGF;pWOy&`-)tuskN^NZg1|6VW_c6M@)gJI(Ukq!#f1ZJe9K$Uyzl)V z|Coobtgc>i$)($O?CcLFPCDtN+nspAu06YNyy=$RyLZpeFETs@)a$ zqG|kaST{{Q9*;&NUlhgE?954bxbvOvbjRb5KYC_r25>jrc+*cV+V+DV{N(q)znHWm-QJ0)$)+Kh)8By#= z1on;R!W9KM3Qdy)QfV9COfCk`HOCn;ZcwQ%6&SQKHWLP4ym08IdE)mY`kSbZ3r677a zhDh{s;Gh%;vI&KC!$c@zDG&%D1W1yq1)DOHCc0ioYFuE-taT`QmZ;*EMo~*cnL@U@ zVFpl?ofy(iAU-x~DNIX@E6{`?1U&{(m5G`gamk_!!8xI%&n)H)Mk}$_ksFiARyY?y zpXLK~yF2NIh8tlSfVOuoj~jC)^_?hZQIEvEiM7bMS>7(y&J3_@K~G8`R%MlpicV=h zF}aM#%4O%k1&0D-k7J({j(_5?C=p6A1RS>wY_!D2%P9>|CeF@U0Tm+pw$#PPfd{0r zbC!vVp*&`$0&aldQ4diMxthQ#z=f`Mi2|6+j7_;JdA1SSz=>QvTKb#Uz4m#}d&UR; z{lk}Ee)UtH^rTn5;sw`jx#5%l{y{f2>k^J)af}^8@KssKA=SY%lPg^aOjLjX3Lykv z*UlAA!+)7+$iu@4ahUyvs!E9@#z7==m)DkoKp{EI%5A~cktv4b#7Rl$BVN^sSI0?1 zm;jIrgZe)94JbqLW@qCNR03NHkYZ4EjV+at5OHua*VcPgm4dfKnxu&k*by}gD_8&I z`fGjxZs5nDAc~Qh0~4|IGPBE^=r0xZNbDnBrW96J*EA{<30|;zl~JQcw$MbhqqH1P z9Z!G}QV_}Jn^VX@I+kD*>Hbyh5Q6GBsAv;7pfib1l#)8v%<|$ijCY+qw9$!p}RiY_%$`YyqMT11=#*uRz z!-7_rpn|TfD`+s%fov%aMUf>ixIx_SM#NWuLG+;F7SwhqkX(ShE1{RTc#-9v?34Sb zP##NBoea1F1m|2)x}Ed5b}QZM4m_HNQ?6zPD98aiWic_hacR$^zW<+Jd&m=SS4~W# z_?u(z_`)MkykPInKJ$Y&AJJh(2-NL;{ni_v@VoP?PBZpBY9d{n+9(1Tr9%OKO6;u=@ z$`ZhEWf@I9(eD7L>&7`pD66VO!1}3~ep!rGhw+dl#~gx3gh^oH+B9cIZc!4gsY-wX zqODVU#ZpTdH`xRyi!J3KG1)5WTCNM>;)c{~#53m(5s)YsL2Ri;F7$;7UfHur1&f_b zcr2<=F|#QaX`QxCn9FGfGHQUph@~R1H&aAt!Fj5Bh3i~!(FH&M&BYIU!0Gq7&%G8_ zR{wbA)i>U}wOdu|H?F(yQAdx5qdoig?%2L#=gwVAON&cOD^UX!r6Y1hRaQk=l!YS~ zok{1M`hJ`&i&5K*Skhk#mDZ3Yg@-aKx2Lv>|CPNPY*ZCbTa^J7DkG8C zEQw~LOZEs!W~8^A{e92_=J8vnl3LGPFyrnPJZ+7wP1MBUN|XdDkl>!)OUa(Vga@Hv zq~A42=R*jMZ-V!piCuqUV&fr)AAQtO#~gF)VMiS~(H|`CKd^PnwyT$K*tTQW6<1z! z>y{gRGcG$lDvHMYz|3)VA|rF`Wdp|)kR@lGCX>K?Zw@1kNoaItUG$Dk*vSY&*>oEg zhi#Hz@j{(I5k|F+68|fGRVTMr}YB?#cUzZCgr98^*_- zD>@x!7wU$&q4cs87C|IbJj^r2hvffY2hA$~kxjm7<~0QlBy7r((@Sv&jXgw|Z|c{) zuLvHTB>4r!inF1wkfEx-!lX%0J#Hq4xpDU7sF;8d_ZxHqYgFe@YTpo9{EbsjGadr; z?do=_ip`Fe6ca*3aOu2W<&scT9dHP~N!OKv5Q zaFkQi3V=AoA{dR(C-G3v2C5sxs55E6$f9S8@e;cx$5V@>fq3#jDxTMf9$+9cA>Nj( z#+A{T4{GX@0ojFs6HLiPh*WGju~|#eGr`BoB?ig)7Qw;wnZaJO{IMf}z!gVJZY^Z_ zXF#@30}7S{FAEOQ2TPpD(R~&3l0^&w#7#Xq6^cT%Lexdh!#6;c`R6j$WK1#(W=PD} z^~B7~v!3^?3orQjYybLX06zEmFMRIvpLzJhANHA#e#9>?Hl0ql*C%2hD2!H%qC>7z zpoT*;u1n%h*&UBoMvdzZ1|fI`nw6D)w>LdCyD-0Rb=>p@J+N02L>DrJO)2|XO@V1M zkWO?Y2PN)J-zqB_iAeUfNQ+>EIZY4}r`SKX;?3kcxv<6#tXbmhal=rmFil%#w`#Ql z^6T1nVN!Akptx9%&3H(El97rMY!JW`FTg_uHyM5i*9%!ioK=b?@viid44;{lHTW<7 z;$ojtFvD0WLP#P_?u%e1P%n{tN`1>DPA*WQ6^P>+uK0aW9ZG-$JX`UR~ z1K1E$qBST=Mw2#Uh;b(%M3!J87V5TwNX7wX@1jma-0Paa1P+0mD|=xS>Kh$7DqK8I z#pnhwAvoD5mV_4y$8ey6QKBGJ<##T|6F)cnt226+?ep*bPP1!U>E>vD#l7`Ev3+Uv zfw${?=I71lzDvE(ZGanZq?doW`PPd%{ch)rzYeeaCi)I_6Zepnj)H)|R9BPf+5O9duH?55@gtw6+}g(NxujnuiQHoBRtbxXY#0GFk`)XE00a&aN3gxjWMmpipxe(1)F%bu@!hET^1fFnErff_~`7$vIG z6=k^a;(`k@t1AE&+Iv;F>hMGXh!%FGS>3j6_k$nskcEX^puvM4^w2MV`O|;(moI(E zi(j%@H&|JA)Wk5CuO?<@XMk!jnCz5AIWd59k9zD`^~w-MNoBdZxY#Ls>n5j163>eXI<0!1|%*Kj~lp)8xw3>TLjh~Vn+s_&HDPS

BcwT{NDGz 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

Ly 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%0DQf3`G?nV&DKw5-}uMj6O;=H$t`$Vulu@?y958 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 |9oTnZZg%lyFMrO? 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

;xX!Fya9|9@yLbZ|1NiFs#|Bgv7*ciK5! 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 () => {}; + +export function HeroProductImage() { + const { resolvedTheme } = useTheme(); + const hydrated = useSyncExternalStore( + subscribeToHydration, + () => true, + () => false, + ); + const source = + hydrated && resolvedTheme === 'dark' + ? '/brand/openimsdk-im-hero-dark.png' + : '/brand/openimsdk-im-hero-light.png'; + + return ( + + ); +} diff --git a/src/components/mdx/landing.tsx b/src/components/mdx/landing.tsx index aec07a8154..bb0f9e64bc 100644 --- a/src/components/mdx/landing.tsx +++ b/src/components/mdx/landing.tsx @@ -1,5 +1,6 @@ import Link from 'next/link'; import type { ReactNode } from 'react'; +import { HeroProductImage } from '@/src/components/mdx/hero-product-image'; import { CodeIcon, LayoutIcon, ServerIcon } from '@/src/components/ui/icons'; import type { Locale } from '@/src/lib/i18n'; import { toLocalizedPath } from '@/src/lib/i18n'; @@ -838,7 +839,6 @@ export function ChatHero({ secondaryHref, } : { eyebrow, title, description, primaryLabel, primaryHref, secondaryLabel, secondaryHref }; - return (

); From d0ab81566e8d6359f5167614b4600d037fc9c2f0 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Mon, 10 Aug 2026 18:43:36 +0800 Subject: [PATCH 3/3] docs: publish Android SDK documentation - Add reviewed English Android SDK pages for groups, messages, calling, events, and uploads - Expand Chinese Android documentation and add missing capability pages --- .../calling/managing-calls/accept-call.mdx | 34 +- .../calling/managing-calls/cancel-call.mdx | 28 +- .../managing-calls/handle-call-events.mdx | 76 +- .../calling/managing-calls/hang-up-call.mdx | 30 +- .../calling/managing-calls/reject-call.mdx | 28 +- .../managing-calls/start-group-call.mdx | 46 +- .../managing-calls/start-single-call.mdx | 66 +- .../sdk/android/calling/overview-calling.mdx | 48 +- .../get-room-by-group-id.mdx | 32 +- .../get-token-by-room-id.mdx | 39 +- .../restore-pending-invitation.mdx | 34 +- .../send-a-custom-signal.mdx | 66 +- .../sdk/android/events/overview-events.mdx | 123 +- .../track-file-upload-progress.mdx | 46 +- .../sdk/android/file-uploads/upload-file.mdx | 56 +- .../sdk/android/group/change-group-mute.mdx | 18 +- .../chat/sdk/android/group/create-group.mdx | 25 +- .../chat/sdk/android/group/dismiss-group.mdx | 18 +- .../accept-group-application.mdx | 18 +- ...et-group-application-list-as-applicant.mdx | 20 +- ...et-group-application-list-as-recipient.mdx | 20 +- .../overview-group-applications.mdx | 11 +- .../refuse-group-application.mdx | 18 +- .../chat/sdk/android/group/join-group.mdx | 18 +- .../change-group-member-mute.mdx | 18 +- .../invite-user-to-group.mdx | 18 +- .../kick-group-member.mdx | 18 +- .../set-group-member-avatar.mdx | 25 +- .../set-group-member-extension.mdx | 25 +- .../set-group-member-nickname.mdx | 25 +- .../set-group-member-role-level.mdx | 23 +- .../transfer-group-owner.mdx | 18 +- .../chat/sdk/android/group/overview-group.mdx | 35 +- .../chat/sdk/android/group/quit-group.mdx | 18 +- .../get-group-member-list.mdx | 21 +- .../get-group-member-owner-and-admin.mdx | 21 +- .../get-specified-group-members-info.mdx | 21 +- .../get-users-in-group.mdx | 20 +- .../overview-retrieving-group-members.mdx | 11 +- .../search-group-members.mdx | 19 +- .../get-joined-group-list-page.mdx | 18 +- .../get-specified-groups-info.mdx | 18 +- .../group/retrieving-groups/is-join-group.mdx | 18 +- .../group/retrieving-groups/search-groups.mdx | 18 +- .../android/group/set-group-announcement.mdx | 22 +- .../sdk/android/group/set-group-extension.mdx | 22 +- .../group/set-group-join-verification.mdx | 22 +- .../set-group-member-friend-permission.mdx | 22 +- .../group/set-group-member-profile-access.mdx | 22 +- .../android/group/update-group-profile.mdx | 23 +- content/docs/chat/sdk/android/logger.mdx | 119 +- .../composing-messages/get-typing-status.mdx | 35 + .../update-typing-status.mdx | 61 +- .../create-advanced-quote-message.mdx | 30 + .../create-advanced-text-message.mdx | 30 + .../creating-messages/create-card-message.mdx | 13 +- .../create-custom-message.mdx | 14 +- .../creating-messages/create-face-message.mdx | 13 +- .../create-file-message-by-file.mdx | 16 +- .../create-file-message-by-url.mdx | 13 +- .../creating-messages/create-file-message.mdx | 19 + .../create-forward-message.mdx | 13 +- .../create-image-message-by-file.mdx | 16 +- .../create-image-message-by-url.mdx | 16 +- .../create-image-message.mdx | 19 + .../create-location-message.mdx | 14 +- .../create-merger-message.mdx | 16 +- .../create-quote-message.mdx | 14 +- .../create-sound-message-by-file.mdx | 16 +- .../create-sound-message-by-url.mdx | 13 +- .../create-sound-message.mdx | 19 + .../create-text-at-message.mdx | 16 +- .../creating-messages/create-text-message.mdx | 13 +- .../create-video-message-by-file.mdx | 20 +- .../create-video-message-by-url.mdx | 13 +- .../create-video-message.mdx | 23 + .../clear-all-local-messages.mdx | 13 +- .../managing-messages/clear-all-messages.mdx | 15 +- .../delete-local-message.mdx | 13 +- .../delete-saved-messages.mdx | 50 +- .../delete-user-messages.mdx | 43 + .../managing-messages/get-pinned-messages.mdx | 18 +- .../insert-local-group-message.mdx | 13 +- .../insert-local-single-message.mdx | 15 +- .../managing-messages/modify-a-message.mdx | 30 +- .../managing-messages/revoke-a-message.mdx | 33 +- .../set-message-local-ex.mdx | 15 +- .../managing-messages/set-message-pinned.mdx | 31 +- .../get-group-message-readers.mdx | 45 + .../send-group-read-receipts.mdx | 43 + .../sdk/android/message/overview-message.mdx | 22 +- .../receive-custom-business-messages.mdx | 19 +- .../receiving-messages/receive-messages.mdx | 16 +- .../find-messages-by-id.mdx | 16 +- .../load-message-context.mdx | 50 + .../load-newer-messages.mdx | 15 +- .../load-older-messages.mdx | 15 +- .../searching-messages/search-messages.mdx | 14 +- .../sending-messages/send-message-not-oss.mdx | 15 +- .../message/sending-messages/send-message.mdx | 16 +- .../set-msg-send-progress-listener.mdx | 17 +- .../subscribe-users-online-status.mdx | 4 +- .../unsubscribe-users-online-status.mdx | 39 + .../chat/sdk/android/user/overview-user.mdx | 6 +- .../user/user-profile/set-self-info.mdx | 4 +- .../sdk/android/events/overview-events.mdx | 39 +- .../track-file-upload-progress.mdx | 2 +- .../sdk/android/group/change-group-mute.mdx | 2 +- .../accept-group-application.mdx | 2 +- ...et-group-application-list-as-applicant.mdx | 2 +- ...et-group-application-list-as-recipient.mdx | 2 +- .../overview-group-applications.mdx | 2 +- .../refuse-group-application.mdx | 2 +- .../change-group-member-mute.mdx | 2 +- .../invite-user-to-group.mdx | 2 +- .../set-group-member-nickname.mdx | 2 +- .../set-group-member-role-level.mdx | 2 +- .../get-group-member-list.mdx | 2 +- .../get-specified-group-members-info.mdx | 2 +- .../get-users-in-group.mdx | 2 +- .../get-specified-groups-info.mdx | 2 +- .../group/retrieving-groups/is-join-group.mdx | 2 +- .../android/group/set-group-announcement.mdx | 2 +- .../sdk/android/group/set-group-extension.mdx | 2 +- .../set-group-member-friend-permission.mdx | 2 +- .../android/group/update-group-profile.mdx | 2 +- .../composing-messages/get-typing-status.mdx | 28 + .../update-typing-status.mdx | 36 +- .../create-advanced-quote-message.mdx | 23 + .../create-advanced-text-message.mdx | 23 + .../create-file-message-by-file.mdx | 10 +- .../create-file-message-by-url.mdx | 2 +- .../creating-messages/create-file-message.mdx | 12 + .../create-image-message-by-file.mdx | 11 +- .../create-image-message-by-url.mdx | 2 +- .../create-image-message.mdx | 12 + .../create-quote-message.mdx | 2 +- .../create-sound-message-by-file.mdx | 10 +- .../create-sound-message-by-url.mdx | 2 +- .../create-sound-message.mdx | 12 + .../create-video-message-by-file.mdx | 14 +- .../create-video-message-by-url.mdx | 2 +- .../create-video-message.mdx | 16 + .../clear-all-local-messages.mdx | 2 +- .../managing-messages/clear-all-messages.mdx | 2 +- .../delete-saved-messages.mdx | 45 +- .../delete-user-messages.mdx | 36 + .../managing-messages/get-pinned-messages.mdx | 2 +- .../managing-messages/modify-a-message.mdx | 21 +- .../managing-messages/revoke-a-message.mdx | 24 +- .../set-message-local-ex.mdx | 2 +- .../managing-messages/set-message-pinned.mdx | 24 +- .../get-group-message-readers.mdx | 38 + .../send-group-read-receipts.mdx | 36 + .../find-messages-by-id.mdx | 2 +- .../load-message-context.mdx | 43 + .../load-newer-messages.mdx | 6 +- .../load-older-messages.mdx | 6 +- .../sending-messages/send-message-not-oss.mdx | 2 +- .../message/sending-messages/send-message.mdx | 2 +- .../set-msg-send-progress-listener.mdx | 4 +- .../subscribe-users-online-status.mdx | 2 +- .../unsubscribe-users-online-status.mdx | 32 + .../chat/sdk/android/user/overview-user.mdx | 4 +- data/structure/android-content-audit.json | 3030 +++++-- data/structure/android-navigation-labels.json | 226 +- data/structure/android-sidebar.json | 90 +- data/structure/chat-pages.json | 7780 +++++++++-------- scripts/__tests__/client-sdk-sidebar.test.mjs | 1 + .../sync-client-sdk-route-skeletons.test.mjs | 47 + scripts/__tests__/wasm-commercial.test.mjs | 38 +- .../wasm-full-capability-structure.test.mjs | 5 +- scripts/sync-client-sdk-route-skeletons.mjs | 25 + src/components/docs/documentation-page.tsx | 4 +- src/components/docs/sdk-overview-page.tsx | 103 +- src/generated/android-sdk-zh-content.json | 476 +- src/generated/navigation.json | 512 +- src/generated/routes.json | 1374 +-- src/generated/search-index-zh.json | 218 +- src/generated/search-index.json | 822 +- src/lib/client-sdk-commercial.ts | 6 + 181 files changed, 11735 insertions(+), 6361 deletions(-) create mode 100644 content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx create mode 100644 content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx index dab1418694..3c0b57557a 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -1,17 +1,39 @@ --- title: 'Accept a call' -description: 'OpenIM Android SDK guide for Accept a call.' +description: 'Accept a call invitation with the Android SDK and retrieve room credentials.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/accept-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +After receiving the original `SignalingInfo` from `onReceiveNewInvitation`, pass it to `signalingAccept()`: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingAccept( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showAcceptError(code, error); + } + }, + receivedInfo +); +``` + +Preserve the original `roomID`, inviter, invitees, and session type in `receivedInfo`. Do not rebuild it as an object that contains only `roomID`. + +The success callback returns `SignalingCertificate`. Connect the media room only after receiving a valid `token` and `roomID`, then keep merging remote state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx index cfe818d79a..c7bdb66974 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -1,17 +1,33 @@ --- title: 'Cancel a call invitation' -description: 'OpenIM Android SDK guide for Cancel a call invitation.' +description: 'Cancel a call invitation before it is accepted with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/cancel-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Before an invitation is accepted, the inviter can call `signalingCancel()`: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingCancel( + new OnBase() { + @Override + public void onSuccess(String result) { + stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showCancelError(code, error); + } + }, + activeInfo +); +``` + +Pass the complete `SignalingInfo` saved when the call was started, not a new object containing only `roomID`. A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through `onInvitationCancelled`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx index 5e00226229..51eff77695 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -1,17 +1,81 @@ --- title: 'Handle call events' -description: 'OpenIM Android SDK guide for Handle call events.' +description: 'Register Android SDK invitation, participant, and media-stream callbacks in one call listener.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Register `OnSignalingListener` once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by `roomID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.setSignalingListener( + new OnSignalingListener() { + @Override + public void onReceiveNewInvitation(SignalingInfo info) { + upsertCall(info, "ringing"); + } + + @Override + public void onInviteeAccepted(SignalingInfo info) { + mergeCallEvent("accepted", info); + } + + @Override + public void onInviteeRejected(SignalingInfo info) { + mergeCallEvent("rejected", info); + } + + @Override + public void onInvitationCancelled(SignalingInfo info) { + mergeCallEvent("cancelled", info); + } + + @Override + public void onInvitationTimeout(SignalingInfo info) { + mergeCallEvent("timeout", info); + } + + @Override + public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { + mergeCallEvent("accepted-by-other-device", info); + } + + @Override + public void onInviteeRejectedByOtherDevice(SignalingInfo info) { + mergeCallEvent("rejected-by-other-device", info); + } + + @Override + public void onHangup(SignalingInfo info) { + finishCall(info.getInvitation().getRoomID()); + } + + @Override + public void onRoomParticipantConnected(RoomCallingInfo room) { + mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onRoomParticipantDisconnected(RoomCallingInfo room) { + mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onStreamChange(String streamInfo) { + mergeStreamChange(streamInfo); + } + } +); +``` + +This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than `onReceiveCustomSignal`. Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). + +Merge invitation events with `SignalingInfo.invitation.roomID`. Merge participant state with `RoomCallingInfo.roomID` plus the participant user ID. Do not merge by event order, display name, or array position. `onStreamChange` currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. + +`SignalingManager` retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application-level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx index a8f59457c7..85e4b0d993 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -1,17 +1,33 @@ --- -title: 'End a call' -description: 'OpenIM Android SDK guide for End a call.' +title: 'Hang up a call' +description: 'Hang up an established call with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +After a call is established, a participant can call `signalingHungUp()`. The supplied `SignalingInfo` should preserve the complete invitation, and its `roomID` must match the active media room. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingHungUp( + new OnBase() { + @Override + public void onSuccess(String result) { + releaseCallResources(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showHangUpError(code, error); + } + }, + activeInfo +); +``` + +The success callback only means that the hang-up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang-up should all enter one idempotent cleanup flow keyed by `roomID`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx index 1ab2de057c..974b545897 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -1,17 +1,33 @@ --- title: 'Reject a call' -description: 'OpenIM Android SDK guide for Reject a call.' +description: 'Reject a call invitation with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/reject-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +When the user declines an incoming call, pass the original `SignalingInfo` to `signalingReject()`: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingReject( + new OnBase() { + @Override + public void onSuccess(String result) { + closeIncomingCallUI(); + } + + @Override + public void onError(int code, String error) { + showRejectError(code, error); + } + }, + receivedInfo +); +``` + +The success callback only means that the reject signaling request completed. The inviter later updates its interface through `onInviteeRejected`; see [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx index 0b701cf118..44e5b0163d 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -1,17 +1,51 @@ --- title: 'Start a group call' -description: 'OpenIM Android SDK guide for Start a group call.' +description: 'Start a group audio or video call with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/start-group-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingInviteInGroup()` starts a group call. It invites only the members explicitly listed in `inviteeUserIDList`; setting `groupID` does not automatically invite every group member. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(selectedGroupMemberIDs); +invitation.setGroupID(groupID); +invitation.setRoomID(groupID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.GROUP_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"group-call\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + startGroupCall(credentials); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +`groupID` must not be empty. Remove the current user, empty IDs, and duplicates from `inviteeUserIDList`. The example reuses the group ID as the room ID. If your application generates another `roomID`, every participant must use the same value. + +The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. `busyLineUserIDList` only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx index 09e21d3939..1c89908027 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -1,17 +1,71 @@ --- title: 'Start a one-to-one call' -description: 'OpenIM Android SDK guide for Start a one-to-one call.' +description: 'Start a one-to-one audio or video call with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/start-single-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingInvite()` starts a one-to-one call. The Android SDK handles call signaling; your application must connect a real-time audio/video engine with the returned room credentials. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +## Parameters + +| Field | Type | Required | Description | +| ------------------- | ----------------- | -------- | --------------------------------------------------------------------------- | +| `userID` | `String` | Yes | The current signed-in user performing the invite operation. | +| `inviterUserID` | `String` | Yes | The inviter, normally the current signed-in user. | +| `inviteeUserIDList` | `List` | Yes | The invitees; for a one-to-one call, include only the other user. | +| `groupID` | `String` | Yes | Use an empty string for a one-to-one call. | +| `roomID` | `String` | Yes | The call's unique room identifier and the primary key for subsequent state. | +| `timeout` | `long` | Yes | Invitation timeout in seconds. | +| `mediaType` | `String` | Yes | The application-defined media type, typically `audio` or `video`. | +| `sessionType` | `int` | Yes | Use `ConversationType.SINGLE_CHAT`. | +| `platformID` | `int` | Yes | Use `Platform.ANDROID` for an Android phone client. | +| `customData` | `String` | No | Application extra data carried with the invitation. | +| `offlinePushInfo` | `OfflinePushInfo` | No | Push content used when the invitee is offline. | + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(Collections.singletonList(peerUserID)); +invitation.setGroupID(""); +invitation.setRoomID(roomID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.SINGLE_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"contact-card\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInvite( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +The success callback returns `SignalingCertificate`. `roomID` identifies the media room, `token` is a short-lived join credential, `liveURL` is the media service address, and `busyLineUserIDList` contains busy users. + +Connect the media engine only after receiving a valid `token` and `roomID`. API success does not mean the invitee accepted; merge subsequent state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/overview-calling.mdx b/content/docs/chat/sdk/android/calling/overview-calling.mdx index 1893a85cc9..e0dc94ef3f 100644 --- a/content/docs/chat/sdk/android/calling/overview-calling.mdx +++ b/content/docs/chat/sdk/android/calling/overview-calling.mdx @@ -1,17 +1,53 @@ --- title: 'Audio and video calling overview' -description: 'OpenIM Android SDK guide for Audio and video calling overview.' +description: 'Learn about Android SDK call signaling, room information, and event boundaries.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/overview-calling' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK `SignalingManager` provides the signaling APIs needed to invite, accept, reject, cancel, hang up, query rooms, and synchronize call state. It coordinates participants, room information, and the call lifecycle. It does not capture camera video, play remote media, or render a call interface. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +Pass the returned `roomID`, `token`, and `liveURL` to your chosen real-time audio/video engine. Your application remains responsible for Android permissions, devices, media tracks, poor-network behavior, and UI state. The signaling APIs are not a complete real-time media SDK. + +## Call flow + +1. Call `signalingInvite()` for a one-to-one call or `signalingInviteInGroup()` for a group call. +2. The invitee receives `SignalingInfo` through `onReceiveNewInvitation` and chooses to accept or reject. +3. The invitee calls `signalingAccept()`, and both parties connect their media engine with the returned room credentials. +4. During the call, update local state from participant, media stream, and custom signaling callbacks. +5. The inviter can cancel a pending invitation; any participant can hang up an established call. + +## Core data + +| Data | Description | +| ------------------------- | --------------------------------------------------------------------------------------------------------- | +| `SignalingInvitationInfo` | Inviter, invitees, group, room, media type, timeout, session type, and application extra data. | +| `SignalingInfo` | Current operation user, original invitation, participant profiles, and optional offline push information. | +| `SignalingCertificate` | The `roomID`, `token`, `liveURL`, and busy user list returned by OpenIMServer. | +| `RoomCallingInfo` | A snapshot of a group's room, invitation, participants, group, and join credentials. | + +Use `customData` and custom signaling only for application negotiation data. Do not place long-lived credentials, administrator secrets, or other sensitive data in these fields. + +## State updates and event ownership + +For invite, accept, reject, cancel, and hang-up operations, handle both the API callback and the call listener. The API success callback means that the current signaling request completed. The listener represents incremental state observed by inviters, invitees, other devices, or room participants. They are not the same completion signal. + +The complete invitation lifecycle, participant, hang-up, and stream listener belongs to [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). Room, credential, and pending-invitation queries only return snapshots. + +This overview does not register a listener. Use `roomID` as the call-state key and combine it with user ID for participant state. Query again when the current room needs to be restored or reconciled. + +## Find a page by task + +| Task | Page | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Start a one-to-one or group call | [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call), [Start a group call](/sdk/android/calling/managing-calls/start-group-call) | +| Accept or reject an invitation | [Accept a call](/sdk/android/calling/managing-calls/accept-call), [Reject a call](/sdk/android/calling/managing-calls/reject-call) | +| Cancel an invitation or hang up | [Cancel a call invitation](/sdk/android/calling/managing-calls/cancel-call), [Hang up a call](/sdk/android/calling/managing-calls/hang-up-call) | +| Restore a room or pending invitation | [Get a group call room](/sdk/android/calling/retrieving-call-information/get-room-by-group-id), [Get room credentials](/sdk/android/calling/retrieving-call-information/get-token-by-room-id), [Restore a pending invitation](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) | +| Handle call events and negotiation | [Handle call events](/sdk/android/calling/managing-calls/handle-call-events), [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx index bbff58ad19..5beee147ca 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -1,17 +1,37 @@ --- title: 'Get a group call room' -description: 'OpenIM Android SDK guide for Get a group call room.' +description: 'Use the Android SDK to retrieve an active call room by group ID.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingGetRoomByGroupID()` takes a group ID, not a custom `roomID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( + new OnBase() { + @Override + public void onSuccess(RoomCallingInfo room) { + if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { + renderParticipants(room.getParticipant()); + } + } + + @Override + public void onError(int code, String error) { + showNoActiveGroupCall(); + } + }, + groupID +); +``` + +The success callback returns a `RoomCallingInfo` snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. + +If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives `groupID`. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx index a4642bd62a..655d317e4a 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -1,17 +1,42 @@ --- -title: 'Get a call room token' -description: 'OpenIM Android SDK guide for Get a call room token.' +title: 'Get room credentials' +description: 'Use the Android SDK to retrieve fresh join credentials for a known room ID.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +When you know the `roomID` but need new join credentials, call `signalingGetTokenByRoomID()`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + if (credentials.getToken() != null + && credentials.getRoomID() != null) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + } + + @Override + public void onError(int code, String error) { + showCredentialError(code, error); + } + }, + roomID +); +``` + +The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. Connect the media engine only after receiving a valid `token` and `roomID`. + +A room token is a short-lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx index 46f22f6153..f42fb5e22c 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -1,17 +1,37 @@ --- -title: 'Restore a pending call invitation' -description: 'OpenIM Android SDK guide for Restore a pending call invitation.' +title: 'Restore a pending invitation' +description: 'Restore a call invitation that was received before the Android application started or resumed.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`getSignalingInvitationInfoStartApp()` takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( + new OnBase() { + @Override + public void onSuccess(SignalingInfo info) { + if (info != null + && info.getInvitation() != null + && info.getInvitation().getRoomID() != null + && !info.getInvitation().getRoomID().isEmpty()) { + restoreIncomingCall(info); + } + } + + @Override + public void onError(int code, String error) { + clearExpiredIncomingCall(); + } + } +); +``` + +Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming-call interface only when both `invitation` and `roomID` are valid. Continue handling cancellation, timeout, acceptance, and hang-up through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx index 98d59a1877..6ba5f79847 100644 --- a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -1,17 +1,71 @@ --- title: 'Send a custom signal' -description: 'OpenIM Android SDK guide for Send a custom signal.' +description: 'Send and receive custom signaling data in an Android SDK call room.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingSendCustomSignal()` sends lightweight application negotiation data to a call room, such as a raised-hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +## Send a signal + +Both `roomID` and `customInfo` are required strings. Define a stable schema and serialize structured data as JSON. + +```java +JSONObject signal = new JSONObject(); +signal.put("version", 1); +signal.put("eventID", eventID); +signal.put("type", "hand-raised"); +signal.put("userID", currentUserID); +signal.put("sentAt", System.currentTimeMillis()); + +OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( + new OnBase() { + @Override + public void onSuccess(String result) { + markSignalSent(eventID); + } + + @Override + public void onError(int code, String error) { + showSignalError(code, error); + } + }, + roomID, + signal.toString() +); +``` + +The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long-lived state, or sensitive credentials in `customInfo`. + +## Receive a signal + +`OnSignalingListener.onReceiveCustomSignal` returns `CustomSignalingInfo`. Validate the room and your application protocol before updating the interface. + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + if (info == null || !activeRoomID.equals(info.getRoomID())) { + return; + } + + CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); + String mergeID = info.getRoomID() + ":" + signal.getEventID(); + if (hasAppliedSignal(mergeID)) { + return; + } + applyCallSignal(signal); +} +``` + +This page owns the complete handling contract for `onReceiveCustomSignal`. `parseAndValidateCallSignal()` should check the JSON structure, protocol version, `eventID`, `type`, and application fields. Process signals idempotently by `roomID:eventID` and do not depend on event order. + +`SignalingManager` retains only one listener. Add the custom signal callback to the application-level listener shown in [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Registering another listener from this feature would replace all other call callbacks. + +Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long-lived state through a room query or the application backend. diff --git a/content/docs/chat/sdk/android/events/overview-events.mdx b/content/docs/chat/sdk/android/events/overview-events.mdx index 7b89f87bab..897d4e2c50 100644 --- a/content/docs/chat/sdk/android/events/overview-events.mdx +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -1,17 +1,128 @@ --- title: 'Events overview' -description: 'OpenIM Android SDK guide for Events overview.' +description: 'Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/events/overview-events' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application-level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The connection listener is the exception. `OnConnListener` is passed to `initSDK()`; its complete handling contract is described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Register listeners centrally + +The following entry point uses stable application-level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. + +```java +public final class OpenIMEventCenter { + private final OpenIMClient client = OpenIMClient.getInstance(); + + private final OnUserListener userListener = buildUserListener(); + private final OnFriendshipListener friendshipListener = buildFriendshipListener(); + private final OnConversationListener conversationListener = buildConversationListener(); + private final OnGroupListener groupListener = buildGroupListener(); + private final OnAdvanceMsgListener messageListener = buildMessageListener(); + private final OnCustomBusinessListener businessListener = buildBusinessListener(); + private final OnSignalingListener signalingListener = buildSignalingListener(); + + public void registerBeforeLogin() { + client.userInfoManager.setOnUserListener(userListener); + client.friendshipManager.setOnFriendshipListener(friendshipListener); + client.conversationManager.setOnConversationListener(conversationListener); + client.groupManager.setOnGroupListener(groupListener); + client.messageManager.setAdvancedMsgListener(messageListener); + client.messageManager.setCustomBusinessListener(businessListener); + client.signalingManager.setSignalingListener(signalingListener); + } +} +``` + +The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. + +## Event ownership + +| Event scope | Listener | Corresponding page | +| --- | --- | --- | +| Connection, token, and forced logout | `OnConnListener` | [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) | +| Current user profile | `OnUserListener` | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Online status | `OnUserListener` | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | +| Friend relationships and profiles | `OnFriendshipListener` | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | +| Friend applications | `OnFriendshipListener` | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| Blacklist | `OnFriendshipListener` | [Block a user](/sdk/android/user/blacklist/add-blacklist), [Remove a user from the blacklist](/sdk/android/user/blacklist/remove-blacklist) | +| Conversation list | `OnConversationListener` | [Retrieve the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| Total unread count | `OnConversationListener` | [Get the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| Typing state | `OnConversationListener` | [Update typing status](/sdk/android/message/composing-messages/update-typing-status) | +| Group profiles, members, and applications | `OnGroupListener` | [Group overview](/sdk/android/group/overview-group) | +| New, offline, and online-only messages | `OnAdvanceMsgListener` | [Receive messages](/sdk/android/message/receiving-messages/receive-messages) | +| Message revocation | `OnAdvanceMsgListener` | [Revoke a message](/sdk/android/message/managing-messages/revoke-a-message) | +| Message deletion | `OnAdvanceMsgListener` | [Delete messages in a batch](/sdk/android/message/managing-messages/delete-saved-messages) | +| Message modification | `OnAdvanceMsgListener` | [Modify a message](/sdk/android/message/managing-messages/modify-a-message) | +| Pinned messages | `OnAdvanceMsgListener` | [Pin or unpin a message](/sdk/android/message/managing-messages/set-message-pinned) | +| One-to-one read receipts | `OnAdvanceMsgListener` | [Mark a conversation as read](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| Custom business messages | `OnCustomBusinessListener` | [Receive custom business messages](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| Calls | `OnSignalingListener` | [Handle call events](/sdk/android/calling/managing-calls/handle-call-events) | +| Custom call signaling | `OnSignalingListener` | [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK data synchronization | `OnConversationListener` | [Handle initial synchronization](#handle-initial-synchronization) | + +Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. + +## Handle initial synchronization + +The synchronization lifecycle belongs to the application-level `OnConversationListener`. That listener must also include conversation-list, unread-count, and typing-status callbacks. The following example only highlights synchronization logic owned by this page. + +```java +private OnConversationListener buildConversationListener() { + return new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeNewConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeChangedConversations(conversations); + } + + @Override + public void onTotalUnreadMessageCountChanged(int total) { + updateTotalUnreadCount(total); + } + + @Override + public void onConversationUserInputStatusChanged(String payload) { + handleInputStatus(payload); + } + + @Override + public void onSyncServerStart(boolean reinstall) { + setSyncState("syncing", 0, reinstall); + } + + @Override + public void onSyncServerProgress(long progress) { + setSyncProgress(progress); + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + setSyncState("ready", 100, reinstall); + reloadVisibleSnapshots(); + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + setSyncState("failed", 0, reinstall); + } + }; +} +``` + +When `reinstall` is `true`, treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. `onSyncServerProgress` reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. + +This page owns the complete handling contract for `onSyncServerStart`, `onSyncServerProgress`, `onSyncServerFinish`, and `onSyncServerFailed`. Synchronization state has no business entity key; isolate it by the current `OpenIMClient` singleton and signed-in user. diff --git a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx index b140b51680..79f9e2b579 100644 --- a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx +++ b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -1,17 +1,51 @@ --- title: 'Track file upload progress' -description: 'OpenIM Android SDK guide for Track file upload progress.' +description: 'Use OnPutFileListener to track an individual Android SDK file upload.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK does not use a global file-upload listener. Pass an `OnPutFileListener` to each `uploadFile()` call. That listener receives progress, part completion, and final result callbacks for the current task. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OnPutFileListener uploadListener = new OnPutFileListener() { + @Override + public void open(long size) { + initializeUploadProgress(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void uploadPartComplete(long partNumber, long partSize, String partHash) { + markPartComplete(uploadTaskID, partNumber, partSize, partHash); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } +}; + +OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); +``` + +Use `open()` to initialize the total size, `uploadID()` to receive the SDK upload identifier, `uploadComplete()` for in-progress byte counts, `uploadPartComplete()` when one part finishes, and `complete()` for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. + +Generate a stable application-level `uploadTaskID` and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. + +For complete argument construction and error handling, see [Upload a file](/sdk/android/file-uploads/upload-file). diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx index d42e494ae4..2a71ae182a 100644 --- a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -1,17 +1,61 @@ --- title: 'Upload a file' -description: 'OpenIM Android SDK guide for Upload a file.' +description: 'Upload a standalone file with the Android SDK and retrieve its remote resource URL.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/file-uploads/upload-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`uploadFile()` uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +## Parameters + +| Parameter | Type | Required | Description | +| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | +| `base` | `OnBase` | Yes | Receives the final success or failure result for the upload request. | +| `listener` | `OnPutFileListener` | Yes | Receives progress, part completion, and final file information for this task. | +| `putArgs.filepath` | `String` | Yes | A local file path readable by the Android application. | +| `putArgs.name` | `String` | Yes | The upload file name. `PutArgs` initially uses the supplied path; replace it with the original file name when appropriate. | +| `putArgs.cuase` | `String` | No | An application-defined upload reason. The spelling follows the Android SDK `PutArgs` declaration. | + +```java +File file = new File(localPath); +PutArgs args = new PutArgs(file.getAbsolutePath()); +args.name = file.getName(); +args.cuase = "user-avatar"; + +OpenIMClient.getInstance().uploadFile( + new OnBase() { + @Override + public void onSuccess(String result) { + finishUploadRequest(result); + } + + @Override + public void onError(int code, String error) { + showUploadError(code, error); + } + }, + new OnPutFileListener() { + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } + }, + args +); +``` + +Each call receives its own `OnPutFileListener`, so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See [Track file upload progress](/sdk/android/file-uploads/track-file-upload-progress) for callback responsibilities. + +The URL returned by `complete()` can be used later to update an avatar, store an attachment address, or create a URL-based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls. diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx index 9c15b73f1b..3e2048532f 100644 --- a/content/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -1,17 +1,23 @@ --- title: 'Change group mute status' -description: 'OpenIM Android SDK guide for Change group mute status.' +description: 'Use changeGroupMute to enable or disable mute-all mode for a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/change-group-mute' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `changeGroupMute()` to toggle mute-all mode. Pass `true` to enable it or `false` to disable it. To mute one member, see [Mute or unmute a group member](/sdk/android/group/managing-group-members/change-group-member-mute). -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } + @Override public void onError(int code, String error) { showGroupMuteError(error); } +}, groupID, true); +``` + +The effective speaking permissions for the owner and administrators, as well as server-side permission checks, depend on the deployment policy. diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx index 69c7b84bab..464e171ce8 100644 --- a/content/docs/chat/sdk/android/group/create-group.mdx +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -1,17 +1,30 @@ --- title: 'Create a group' -description: 'OpenIM Android SDK guide for Create a group.' +description: 'Use createGroup to create a group profile and specify its initial members, administrators, and owner.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/create-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `createGroup()` to create a group. Set the group profile in `GroupInfo`, and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete `GroupInfo` created by the server. Store the server-assigned `groupID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo info = new GroupInfo(); +info.setGroupName("Project discussion"); +info.setIntroduction("For project members only"); + +OpenIMClient.getInstance().groupManager.createGroup( + memberUserIDs, adminUserIDs, info, ownerUserID, + new OnBase() { + @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } + @Override public void onError(int code, String error) { showCreateError(error); } + } +); +``` + +Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list. diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx index 470891a2b7..cab2a028c0 100644 --- a/content/docs/chat/sdk/android/group/dismiss-group.mdx +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -1,17 +1,23 @@ --- title: 'Dismiss a group' -description: 'OpenIM Android SDK guide for Dismiss a group.' +description: 'Use dismissGroup to dismiss a group that the current user is allowed to manage.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/dismiss-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`dismissGroup()` dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { + @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } + @Override public void onError(int code, String error) { showDismissError(error); } +}, groupID); +``` + +Merge the final state from `onGroupDismissed`. After receiving the event, remove cached group profile, member, and conversation-related data. diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index 002afef04a..ee851a9f89 100644 --- a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -1,17 +1,23 @@ --- title: 'Accept a group application' -description: 'OpenIM Android SDK guide for Accept a group application.' +description: 'Use acceptGroupApplication to accept a user’s application to join a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/accept-group-application' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the application's `groupID`, the applicant's `userID`, and a handling message. The server checks whether the current user has permission to approve the application. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "Welcome to the group"); +``` + +After acceptance, update the application and member lists through the group application event and `onGroupMemberAdded`. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index 7f5554b186..0a1acdbd6e 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -1,17 +1,25 @@ --- title: 'Get sent group applications' -description: 'OpenIM Android SDK guide for Get sent group applications.' +description: 'Use getSendGroupApplicationList to retrieve group applications sent by the current user.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Configure pagination and filters in `GetGroupApplicationListAsApplicantReq`, then call `getSendGroupApplicationList()`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); +OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeSentApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +After an application is accepted, use `onJoinedGroupAdded` as the source of truth for the joined-group list. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 6dfb5603ad..1cfaefc554 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -1,17 +1,25 @@ --- title: 'Get received group applications' -description: 'OpenIM Android SDK guide for Get received group applications.' +description: 'Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use the non-deprecated overload with `GetGroupApplicationListAsRecipientReq`. The request can filter by `offset`, `count`, `groupIDs`, and `handleResults`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); +OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeReceivedApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +Merge application events by their `groupID` and `userID`. Do not use a list index as an application identifier. diff --git a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx index 09014ab0b3..48e09a40af 100644 --- a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -1,17 +1,16 @@ --- title: 'Group applications overview' -description: 'OpenIM Android SDK guide for Group applications overview.' +description: 'Understand received and sent group applications, handling results, and state events in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/overview-group-applications' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Group applications are represented by `GroupApplicationInfo`. Received applications are intended for group administrators, while sent applications belong to the current user. Use `handleResult`, `reqMsg`, `handledMsg`, and the handling time to display application state. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending-application count API found in the Flutter menu. Merge application-added, accepted, rejected, and deleted events through the shared listener described in [Group overview](/sdk/android/group/overview-group). diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index e1096ebbe8..40f3ddd672 100644 --- a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -1,17 +1,23 @@ --- title: 'Reject a group application' -description: 'OpenIM Android SDK guide for Reject a group application.' +description: 'Use refuseGroupApplication to reject a user’s application to join a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/refuse-group-application' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The reject operation also takes the application's `groupID`, the applicant's `userID`, and a handling message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "The group is currently full"); +``` + +Do not delete the local record immediately after the success callback. Update it from `onGroupApplicationRejected` or a fresh query. diff --git a/content/docs/chat/sdk/android/group/join-group.mdx b/content/docs/chat/sdk/android/group/join-group.mdx index 6d8cf63d19..c86b7d4027 100644 --- a/content/docs/chat/sdk/android/group/join-group.mdx +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -1,17 +1,23 @@ --- title: 'Apply to join a group' -description: 'OpenIM Android SDK guide for Apply to join a group.' +description: 'Use joinGroup to submit a group application or join request.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/join-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `joinGroup()` to submit a request to join a group. Set `joinSource` to the source of the request, such as an invitation, search result, or QR code. Use the five-parameter overload when attaching extra data. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { + @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } + @Override public void onError(int code, String error) { showJoinError(error); } +}, groupID, "I would like to join the project discussion", 3, "{\"from\":\"search\"}"); +``` + +The verification mode determines whether the user joins immediately. Update local state later through `onJoinedGroupAdded` or the relevant group application event. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index 1cfdf22d93..5f09604e8b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -1,17 +1,23 @@ --- title: 'Mute or unmute a group member' -description: 'OpenIM Android SDK guide for Mute or unmute a group member.' +description: 'Use changeGroupMemberMute to set the mute duration for a specified group member.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`seconds` is the mute duration in seconds. Pass `0` to unmute the member. Member-level mute state is independent from the group's mute-all setting. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { + @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberMuteError(error); } +}, groupID, userID, 3600L); +``` + +Read `muteEndTime` from `onGroupMemberInfoChanged` to update the member state. Do not keep deriving the final mute state from local time and the submitted duration. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 4a92ebecde..68c8355266 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -1,17 +1,23 @@ --- title: 'Invite users to a group' -description: 'OpenIM Android SDK guide for Invite users to a group.' +description: 'Use inviteUserToGroup to invite a list of users to a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } + @Override public void onError(int code, String error) { showInviteError(error); } +}, groupID, inviteeUserIDs, "Join the project discussion"); +``` + +Merge users into the member list only after `onGroupMemberAdded` confirms that they joined. A successful submission alone does not mean that they are already members. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx index b26abd5092..461fae5b14 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -1,17 +1,23 @@ --- title: 'Remove group members' -description: 'OpenIM Android SDK guide for Remove group members.' +description: 'Use kickGroupMember to remove specified members from a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`kickGroupMember()` accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { + @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } + @Override public void onError(int code, String error) { showRemovalError(error); } +}, groupID, memberUserIDs, "No longer participating in this project"); +``` + +Remove targets from the member cache after receiving `onGroupMemberDeleted`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx index 2eed4eff78..a741d1aa65 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -1,17 +1,28 @@ --- -title: 'Update a group member’s avatar' -description: 'OpenIM Android SDK guide for Update a group member’s avatar.' +title: 'Update a group member avatar' +description: 'Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +A group member avatar is a group-specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setFaceURL(avatarURL); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Keep the previous avatar or an optimistic local state until the event arrives, then reconcile it with the latest member profile. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx index eb98faea13..b3c9e2b3f4 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -1,17 +1,28 @@ --- -title: 'Set a group member extension' -description: 'OpenIM Android SDK guide for Set a group member extension.' +title: 'Set group member extra data' +description: 'Store application-defined group member data in SetGroupMemberInfo.ex.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`SetGroupMemberInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read and merge the existing value while preserving the other namespaces. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setEx("{\"duty\":\"reviewer\"}"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Do not store credentials, tokens, or device-only display state in this field. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx index fdad13ad63..21e64a2c7b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -1,17 +1,28 @@ --- -title: 'Update a member’s group nickname' -description: 'OpenIM Android SDK guide for Update a member’s group nickname.' +title: 'Update a group nickname' +description: 'Use SetGroupMemberInfo.nickname to update a member’s display name in a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +All group member profile changes use `setGroupMemberInfo()`. Set the `groupID`, `userID`, and `nickname` in the request. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setNickname("Lin"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Update the displayed name from `GroupMembersInfo.nickname` received by `onGroupMemberInfoChanged`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx index 33d54640cb..07242afff6 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -1,17 +1,28 @@ --- title: 'Manage group administrators' -description: 'OpenIM Android SDK guide for Manage group administrators.' +description: 'Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set `roleLevel` with a `GroupRole` constant: `OWNER`, `ADMIN`, or `MEMBER`. Use the separate ownership-transfer API when changing the group owner; do not infer an ownership-transfer flow from this API. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setRoleLevel(GroupRole.ADMIN); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showRoleError(error); } +}); +``` + +The server validates the role change and its permissions. Use the member profile change event as the source of truth. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx index d93b0ea0c7..f4cc863381 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -1,17 +1,23 @@ --- title: 'Transfer group ownership' -description: 'OpenIM Android SDK guide for Transfer group ownership.' +description: 'Use transferGroupOwner to transfer group ownership to a specified member.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The target user must already be a group member. Require explicit confirmation before transferring ownership, then retrieve the owner and administrator profiles again after completion. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { + @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } + @Override public void onError(int code, String error) { showTransferError(error); } +}, groupID, newOwnerUserID); +``` + +`onGroupMemberInfoChanged` and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback. diff --git a/content/docs/chat/sdk/android/group/overview-group.mdx b/content/docs/chat/sdk/android/group/overview-group.mdx index 067715a67d..0931a93b3f 100644 --- a/content/docs/chat/sdk/android/group/overview-group.mdx +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -1,17 +1,40 @@ --- title: 'Group overview' -description: 'OpenIM Android SDK guide for Group overview.' +description: 'Learn how group profiles, members, applications, and group events are organized in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/overview-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +A group is represented by `GroupInfo`. Its `groupID` is the unique target identifier for profile, member, application, and permission operations. `GroupMembersInfo` represents a member's group-specific nickname, role, mute expiration time, and extra data. One-to-one relationships and conversation unread counts do not belong to the group APIs. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +`GroupManager` delivers group profile changes, member changes, application handling, and joined-group changes through one `OnGroupListener`. Set the listener once in a shared state layer and merge events by `groupID` or `userID`. + +```java +OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { + @Override public void onGroupInfoChanged(GroupInfo group) { + groupStore.put(group.getGroupID(), group); + } + + @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { + memberStore.put(member.getGroupID() + member.getUserID(), member); + } +}); +``` + +A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. + +## Main capabilities + +- [Group profile and settings](/sdk/android/group/create-group) +- [Group permissions](/sdk/android/group/set-group-join-verification) +- [Joining and leaving groups](/sdk/android/group/join-group) +- [Retrieving groups](/sdk/android/group/retrieving-groups/get-specified-groups-info) +- [Group applications](/sdk/android/group/group-applications/overview-group-applications) +- [Retrieving group members](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [Managing group members](/sdk/android/group/managing-group-members/invite-user-to-group) diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx index ee871c76e6..cb62fc3059 100644 --- a/content/docs/chat/sdk/android/group/quit-group.mdx +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -1,17 +1,23 @@ --- title: 'Leave a group' -description: 'OpenIM Android SDK guide for Leave a group.' +description: 'Use quitGroup to remove the current signed-in user from a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/quit-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`quitGroup()` only removes the current signed-in user. It does not dismiss the group or remove other members. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { + @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } + @Override public void onError(int code, String error) { showQuitError(error); } +}, groupID); +``` + +Even after the request succeeds, handle `onJoinedGroupDeleted` and clear application caches for the group's member list, conversation entry, and related data. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index fd056bb831..957432832e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -1,17 +1,24 @@ --- -title: 'List group members' -description: 'OpenIM Android SDK guide for List group members.' +title: 'Get group members' +description: 'Use getGroupMemberList to retrieve group members by role and page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set `filter` to `0` for all members, `1` for regular members, `2` for the owner, or `3` for administrators. Use `offset` and `count` for pagination. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupMemberList( + new OnBase>() { + @Override public void onSuccess(List members) { appendMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, 0, offset, 50); +``` + +Continue accepting member events while paging. Use the combination of `groupID` and `userID` as the merge key. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx index d758141c79..966aeb38c7 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -1,17 +1,24 @@ --- -title: 'Get the group owner and administrators' -description: 'OpenIM Android SDK guide for Get the group owner and administrators.' +title: 'Get group owners and admins' +description: 'Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `getGroupMemberOwnerAndAdmin()` when you need to display or check members with management roles. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( + new OnBase>() { + @Override public void onSuccess(List members) { showModerators(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID); +``` + +The owner, administrator, and regular-member `roleLevel` constants are defined in `GroupRole`. The server still determines whether a particular operation is permitted. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index 8faea3fba3..48353fdec3 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -1,17 +1,24 @@ --- -title: 'Get specified group member profiles' -description: 'OpenIM Android SDK guide for Get specified group member profiles.' +title: 'Get group member profiles' +description: 'Use getGroupMembersInfo to retrieve specified users’ profiles within a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`getGroupMembersInfo()` accepts one `groupID` and a list of target user IDs. It returns the users' `GroupMembersInfo` profiles within that group. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupMembersInfo( + new OnBase>() { + @Override public void onSuccess(List members) { mergeMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, userIDs); +``` + +An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index 3b19bb1eef..9a97cecd0e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -1,17 +1,23 @@ --- -title: 'Check group membership' -description: 'OpenIM Android SDK guide for Check group membership.' +title: 'Check users in a group' +description: 'Use getUsersInGroup to select the users who are currently members of a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`getUsersInGroup()` returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { + @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}, groupID, candidateUserIDs); +``` + +To retrieve nicknames, roles, or mute state, call [Get group member profiles](/sdk/android/group/retrieving-group-members/get-specified-group-members-info) afterward. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx index 09f43f4f5f..e287f72d45 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -1,17 +1,16 @@ --- title: 'Group member queries overview' -description: 'OpenIM Android SDK guide for Group member queries overview.' +description: 'Understand group member lists, specified member profiles, and membership queries in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Group member queries are scoped by `groupID` and return either `GroupMembersInfo` objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +Merge member additions, removals, and profile changes through the `OnGroupListener` owned by [Group overview](/sdk/android/group/overview-group). A query provides a snapshot and does not replace event handling. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx index 261b3b6b1d..73a100ac9e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -1,17 +1,24 @@ --- title: 'Search group members' -description: 'OpenIM Android SDK guide for Search group members.' +description: 'Use searchGroupMembers to search group members by user ID or group nickname.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.searchGroupMembers( + new OnBase>() { + @Override public void onSuccess(List members) { showMemberSearch(members); } + @Override public void onError(int code, String error) { showSearchError(error); } + }, groupID, Collections.singletonList(keyword), true, true, 0, 20); +``` + +The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx index 9260220b44..25c1aba8ff 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -1,17 +1,23 @@ --- title: 'Get joined groups by page' -description: 'OpenIM Android SDK guide for Get joined groups by page.' +description: 'Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK provides the paginated API. Start `offset` at `0`, then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { + @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } + @Override public void onError(int code, String error) { showPageError(error); } +}, offset, 20); +``` + +Merge incremental changes from `onJoinedGroupAdded` and `onJoinedGroupDeleted`. Do not treat the pages loaded so far as the complete joined-group list. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx index 3efd2eec6f..9baaff97c0 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -1,17 +1,23 @@ --- title: 'Get group information' -description: 'OpenIM Android SDK guide for Get group information.' +description: 'Use getGroupsInfo to retrieve the latest profiles for specified groups.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +When you already have a set of `groupID` values, use `getGroupsInfo()` to retrieve their profiles. The result is a list of `GroupInfo` objects. Do not assume that its order exactly matches the request list. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onError(int code, String error) { showGroupQueryError(error); } +}, groupIDs); +``` + +Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index 6c1a41ea33..4e8903d73e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -1,17 +1,23 @@ --- title: 'Check group membership' -description: 'OpenIM Android SDK guide for Check group membership.' +description: 'Use isJoinGroup to determine whether the current signed-in user has joined a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`isJoinGroup()` only checks the membership relationship between the current signed-in user and the specified `groupID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { + @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}); +``` + +This result does not replace a group profile query and cannot determine whether another user is in the group. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx index 28f5870b58..da44d05239 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -1,17 +1,23 @@ --- title: 'Search groups' -description: 'OpenIM Android SDK guide for Search groups.' +description: 'Use searchGroups to search locally available groups by group ID or name.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/search-groups' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`searchGroups()` accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { + @Override public void onSuccess(List groups) { showSearchResults(groups); } + @Override public void onError(int code, String error) { showSearchError(error); } +}, Collections.singletonList(keyword), true, true); +``` + +A search result does not prove membership. Before opening the group, call [Check group membership](/sdk/android/group/retrieving-groups/is-join-group) when the current state matters. diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx index 21b94105d2..d7f1e14f75 100644 --- a/content/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -1,17 +1,27 @@ --- title: 'Publish a group announcement' -description: 'OpenIM Android SDK guide for Publish a group announcement.' +description: 'Publish or update a group announcement through GroupInfo.notification.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-announcement' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK does not provide a separate announcement method. Create a `GroupInfo` containing the `groupID` and `notification`, then call `setGroupInfo()`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNotification("Release review starts at 20:00 tonight."); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } + @Override public void onError(int code, String error) { showAnnouncementError(error); } +}); +``` + +The returned `GroupInfo` exposes the update time and author through `notificationUpdateTime` and `notificationUserID`. The server validates whether the current user has permission to publish the announcement. diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx index 2ff7858f49..fe2d81c83d 100644 --- a/content/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -1,17 +1,27 @@ --- title: 'Set group extra data' -description: 'OpenIM Android SDK guide for Set group extra data.' +description: 'Store application-defined group data in GroupInfo.ex.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-extension' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`GroupInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } + @Override public void onError(int code, String error) { showExtensionError(error); } +}); +``` + +Do not store access tokens, secrets, or device-only UI state in group extra data. diff --git a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx index dbb80b7c6a..6a55069a17 100644 --- a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -1,17 +1,27 @@ --- title: 'Set group join verification' -description: 'OpenIM Android SDK guide for Set group join verification.' +description: 'Configure verification rules for group applications and invitations through GroupInfo.needVerification.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-join-verification' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set the verification mode in `GroupInfo.needVerification`, then call `setGroupInfo()`. Use one of the `GroupVerification` constants: `APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`, `ALL_NEED_VERIFICATION`, or `DIRECTLY`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } + @Override public void onError(int code, String error) { showVerificationError(error); } +}); +``` + +This setting applies to subsequent join requests. It does not accept or reject existing applications. diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 6d04505804..81326ef42c 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -1,17 +1,27 @@ --- title: 'Set member friend request permission' -description: 'OpenIM Android SDK guide for Set member friend request permission.' +description: 'Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-member-friend-permission' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`applyMemberFriend` is an integer switch: `0` disables friend requests and `1` enables them. This rule only affects requests initiated through the member relationship in this group. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setApplyMemberFriend(0); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +After the update, use `onGroupInfoChanged` or a newly retrieved `GroupInfo` as the source of truth. diff --git a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx index dd5387bdca..76fabb39e8 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -1,17 +1,27 @@ --- title: 'Set member profile access' -description: 'OpenIM Android SDK guide for Set member profile access.' +description: 'Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-member-profile-access' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`lookMemberInfo` is an integer switch: `0` disables access and `1` enables it. Submit only the `groupID` and this permission field when changing the setting. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setLookMemberInfo(1); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +This switch controls profile access through the group. It does not change user profile data that a member already possesses. diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx index dcd2399ee6..794b40d4c4 100644 --- a/content/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -1,17 +1,28 @@ --- title: 'Update group profile' -description: 'OpenIM Android SDK guide for Update group profile.' +description: 'Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/update-group-profile' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `setGroupInfo()` to update a group profile. The request object should contain at least the `groupID` and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setGroupName("Mobile project team"); +update.setIntroduction("Android and iOS collaboration group"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } + @Override public void onError(int code, String error) { showGroupUpdateError(error); } +}); +``` + +Merge the latest profile from `onGroupInfoChanged`. Group announcements and extra data use the same API and are covered on their respective pages. diff --git a/content/docs/chat/sdk/android/logger.mdx b/content/docs/chat/sdk/android/logger.mdx index 71d8632250..467929c2d8 100644 --- a/content/docs/chat/sdk/android/logger.mdx +++ b/content/docs/chat/sdk/android/logger.mdx @@ -1,18 +1,119 @@ --- -title: 'Logger' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'Logging' +description: 'Configure Android SDK logging, write application diagnostics, and upload logs.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/logger' --- - +OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. + +## Configure logging during initialization + +Logging options belong to `InitConfig` and must be set before `initSDK()`. + +```java +File dataDirectory = new File(application.getFilesDir(), "openim"); +File logDirectory = new File(application.getFilesDir(), "openim-logs"); + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; +config.isLogStandardOutput = BuildConfig.DEBUG; +config.logFilePath = logDirectory.getAbsolutePath(); + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); +``` + +| Field | Description | +| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `logLevel` | Controls verbosity with a `LogLevel` constant. Available values include `DebugWithSQL`, `Debug`, `Info`, `Warn`, `Error`, `Panic`, and `Fatal`. | +| `isLogStandardOutput` | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | +| `logFilePath` | Optional log directory. Keep it within application-writable storage and manage its size and retention. | + +Use `Debug` for ordinary development diagnostics. Enable `DebugWithSQL` temporarily and only when diagnosing database problems. Production builds normally use `Warn` or `Error` and disable unnecessary standard output. + +## Write application diagnostic logs + +Use the non-deprecated `logs()` overload to add application context to SDK logs. + +```java +OpenIMClient.getInstance().logs( + LogLevel.Error, + ChatRepository.class.getSimpleName(), + 184, + "send_message_failed", + errorMessage, + "conversationID", conversationID, + "clientMsgID", clientMsgID +); +``` + +`currentClassName` and `currentLineNum` identify the call site. `msgStr` is a short action description, and `errStr` is the error information. `Warn`, `Error`, `Panic`, and `Fatal` require a non-empty error string. Pass trailing `extra` values as key-value pairs and include only non-sensitive identifiers needed for diagnosis. + +The older `logs()` overload with `OnBase` and `Map` parameters is deprecated and should not be used in new code. + +## Upload diagnostic logs + +Call `uploadLogs()` only after the user explicitly agrees to submit diagnostic information. The Android API retains the `params` argument; pass an empty list when no additional parameters are needed. `line` configures how many log lines are read for the upload. + +```java +String uploadID = UUID.randomUUID().toString(); + +OpenIMClient.getInstance().uploadLogs( + new OnBase() { + @Override + public void onSuccess(String data) { + showLogUploadCompleted(); + } + + @Override + public void onError(int code, String error) { + showLogUploadError(code, error); + } + }, + Collections.emptyList(), + 2000, + uploadID, + "support-ticket-42", + new UploadLogProgress() { + @Override + public void onProgress(long current, long total) { + updateLogUploadProgress(current, total); + } + } +); +``` + +| Parameter | Description | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `line` | Number of log lines configured for this upload. | +| `cancelID` | Stable identifier for this upload, such as an application-generated UUID. | +| `ex` | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | +| `UploadLogProgress` | Reports current progress and total work for the upload interface. | + +The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business-domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. + +## operationID and application tracing + +Public methods in the Android Java wrapper do not accept `operationID`. The wrapper generates one with `ParamsUtil.buildOperationID()` for each call and passes it to Core, so applications normally do not create or supply this value. + +Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required `conversationID`, `clientMsgID`, `groupID`, or `roomID`. The application trace ID links a multi-step business flow, while the SDK `operationID` links one SDK call. Neither is an identity credential or a business idempotency key. + +## Related pages + +- [Implement for the Android environment](/sdk/android/getting-started/environment-specific-implementation) +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [Send a message](/sdk/android/message/sending-messages/send-message) diff --git a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx new file mode 100644 index 0000000000..531230a50c --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -0,0 +1,35 @@ +--- +title: 'Retrieve typing status' +description: 'Use getInputState to retrieve a specified user’s current typing status in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. + +```java +OpenIMClient.getInstance().conversationManager.getInputState( + new OnBase>() { + @Override + public void onSuccess(List platformIDs) { + boolean typing = platformIDs != null && !platformIDs.isEmpty(); + updateTypingState(conversationID, userID, typing); + } + + @Override + public void onError(int code, String error) { + recordTypingStatusQueryFailure(code, error); + } + }, + conversationID, + userID +); +``` + +The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing-status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by [Report typing status](/sdk/android/message/composing-messages/update-typing-status). diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index de5209df08..8499b1c100 100644 --- a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -1,17 +1,64 @@ --- -title: 'Report typing status' -description: 'OpenIM Android SDK guide for Report typing status.' +title: 'Update typing status' +description: 'Report the current conversation typing state with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/composing-messages/update-typing-status' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set `focus` to `true` when typing starts. Set it to `false` when typing ends, the input field loses focus, or the conversation screen closes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // The typing state has been reported + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + }, + conversationID, + true +); +``` + +Clear the state promptly when typing ends: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +Coalesce consecutive focus changes and attempt to report `false` before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. + +Other clients receive typing-state changes through `OnConversationListener.onConversationUserInputStatusChanged`. The Android SDK returns the event payload as a string, so validate the JSON before parsing it: + +```java +@Override +public void onConversationUserInputStatusChanged(String payload) { + InputStatesChangedData state = JsonUtil.toObj( + payload, + InputStatesChangedData.class + ); + if (state == null || state.getConversationID() == null) { + return; + } + updateTypingState( + state.getConversationID(), + state.getUserID(), + state.getPlatformIDs() + ); +} +``` + +Merge typing states by `conversationID:userID` and clear them after an application-defined timeout. `ConversationManager` retains only one conversation listener, so combine this callback with conversation-list, total-unread, and synchronization events in one listener. + +When opening a conversation or restoring a connection, use [Get typing status](/sdk/android/message/composing-messages/get-typing-status) to retrieve the current snapshot. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx new file mode 100644 index 0000000000..83c301d6e4 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a rich-text reply' +description: 'Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-quote-message' +--- + +A rich-text reply stores the reply text, the quoted message, and the `RichMessage` entity ranges in the reply text. + +```java +RichMessage mention = new RichMessage(); +mention.setType("mention"); +mention.setOffset(0); +mention.setLength(6); +mention.setInfo("{\"userID\":\"user_a\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage( + "OpenIM agreed", + originalMessage, + Collections.singletonList(mention) +); +``` + +The quoted `originalMessage` should contain a stable `clientMsgID`, and every entity range must match the final reply text. Use the same application protocol for `type`, `url`, and `info` as described in [Create a rich-text message](/sdk/android/message/creating-messages/create-advanced-text-message). This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx new file mode 100644 index 0000000000..5123acfc35 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a rich-text message' +description: 'Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-text-message' +--- + +`RichMessage` marks a range in the text with `offset` and `length`, while `type`, `url`, and `info` carry application-defined entity data. + +```java +RichMessage link = new RichMessage(); +link.setType("link"); +link.setOffset(0); +link.setLength(6); +link.setUrl("https://docs.openim.io"); +link.setInfo("{\"title\":\"OpenIM documentation\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage( + "OpenIM docs", + Collections.singletonList(link) +); +``` + +Every entity range must match an actual range in the final text. Validate the ranges, URLs, and `info` values before sending, and make sure receiving clients use the same `type` and `info` protocol. This method only creates a `Message`; send it through [Send a message](/sdk/android/message/sending-messages/send-message). diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx index 1580e92d0b..6bbbf011e0 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create a contact card message' -description: 'OpenIM Android SDK guide for Create a contact card message.' +description: 'Use createCardMessage to create a contact card message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-card-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`CardElem` stores the display profile for the user represented by the card. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx index e673b56096..a3e337a2e2 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -1,17 +1,19 @@ --- title: 'Create a custom message' -description: 'OpenIM Android SDK guide for Create a custom message.' +description: 'Use createCustomMessage to carry application-defined JSON content.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-custom-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Your application defines `data`, `extension`, and `description`. Receiving clients must parse them according to the same application protocol. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createCustomMessage( + dataJson, extensionJson, description); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx index 4101251733..86147d2552 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create an emoji message' -description: 'OpenIM Android SDK guide for Create an emoji message.' +description: 'Use createFaceMessage to create a custom emoji message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-face-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`index` identifies the emoji position, while `data` stores JSON such as an emoji URL. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx index 4996020871..247642e42a 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -1,17 +1,19 @@ --- -title: 'Create a file message from a file' -description: 'OpenIM Android SDK guide for Create a file message from a file.' +title: 'Create a file message from a local path' +description: 'Create a file message from an absolute path.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessageFromFullPath(absolutePath, fileName); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute path must be readable. Pass the file name and path separately. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx index 3fa9cce541..0009ae6dc1 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -1,17 +1,18 @@ --- title: 'Create a file message from a URL' -description: 'OpenIM Android SDK guide for Create a file message from a URL.' +description: 'Use FileElem to create a file message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`FileElem` should contain the remote URL, file name, and file size. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx new file mode 100644 index 0000000000..90be38a522 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a file message' +description: 'Create a file message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessage(filePath, fileName); +``` + +The file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory; `fileName` is displayed to recipients. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx index e5868d7827..4f3094d8d8 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create a forwarded message' -description: 'OpenIM Android SDK guide for Create a forwarded message.' +description: 'Use createForwardMessage to create a forwarded copy of a message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-forward-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the source `Message`. The returned message must still be delivered to the target conversation through a send API. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx index 204f98e23a..c7aef18986 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an image message from a file' -description: 'OpenIM Android SDK guide for Create an image message from a file.' +title: 'Create an image message from a local path' +description: 'Create an image message from an absolute path.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessageFromFullPath(absolutePath); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute path must be readable. This method only creates an object waiting to be sent; the regular send flow uploads the image. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx index 09ff19a178..d021cddb3d 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an image message from a URL' -description: 'OpenIM Android SDK guide for Create an image message from a URL.' +title: 'Create an image message from URLs' +description: 'Use createImageMessageByURL to create an image message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Prepare the original, large, and thumbnail `PictureInfo` values before creating the message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageByURL( + sourceURL, sourcePicture, bigPicture, snapshotPicture); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx new file mode 100644 index 0000000000..dd58ab9cf3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an image message' +description: 'Create an image message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessage(imagePath); +``` + +The image file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory. This method only creates an object waiting to be sent; the regular send flow uploads the image. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx index 1cb0f5805f..91ecdcb675 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -1,17 +1,19 @@ --- title: 'Create a location message' -description: 'OpenIM Android SDK guide for Create a location message.' +description: 'Use createLocationMessage to create a message with coordinates and a location description.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-location-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use decimal degrees for latitude and longitude. The description is displayed in a map view or message list. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager + .createLocationMessage(latitude, longitude, description); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx index a7d9803089..639286caf4 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -1,17 +1,19 @@ --- -title: 'Create a merged forward message' -description: 'OpenIM Android SDK guide for Create a merged forward message.' +title: 'Create a merged message' +description: 'Use createMergerMessage to combine multiple messages into one summary message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-merger-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( + messages, title, summaries); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx index 41a9694cb6..331231460d 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -1,17 +1,19 @@ --- title: 'Create a reply message' -description: 'OpenIM Android SDK guide for Create a reply message.' +description: 'Use createQuoteMessage to reply while quoting an existing message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-quote-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +A quote message stores the complete quoted `Message`. Before sending, make sure the quoted object has a stable `clientMsgID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager + .createQuoteMessage(replyText, quotedMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx index c4b8965e56..838d8707db 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an audio message from a file' -description: 'OpenIM Android SDK guide for Create an audio message from a file.' +title: 'Create an audio message from a local path' +description: 'Create an audio message from an absolute path.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessageFromFullPath(absolutePath, durationSeconds); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute path must be readable, and the audio duration is measured in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx index da093ce0e0..eec46a25b8 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -1,17 +1,18 @@ --- title: 'Create an audio message from a URL' -description: 'OpenIM Android SDK guide for Create an audio message from a URL.' +description: 'Use SoundElem to create an audio message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`createSoundMessageByURL()` accepts a `SoundElem` that already contains the remote URL, duration, and file size. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx new file mode 100644 index 0000000000..b633c83ef5 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an audio message' +description: 'Create an audio message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessage(soundPath, durationSeconds); +``` + +The audio file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx index e17e180fd3..0277086122 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an @ message' -description: 'OpenIM Android SDK guide for Create an @ message.' +title: 'Create a mention message' +description: 'Use createTextAtMessage to create a text message that mentions group members.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the text, mentioned user IDs, the `AtUserInfo` list, and an optional quoted message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( + text, userIDs, atUserInfos, quoteMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx index 9c71b67d46..af34a3229f 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create a text message' -description: 'OpenIM Android SDK guide for Create a text message.' +description: 'Use createTextMessage to create a text Message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-text-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`createTextMessage()` only creates a local message object. It does not send the message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx index 7960d05813..d75a82d83c 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -1,17 +1,23 @@ --- -title: 'Create a video message from files' -description: 'OpenIM Android SDK guide for Create a video message from files.' +title: 'Create a video message from local paths' +description: 'Create a video message from absolute video and thumbnail paths.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + absoluteVideoPath, + mimeType, + durationSeconds, + absoluteSnapshotPath +); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute video and thumbnail paths must be readable, and the duration is measured in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx index 6777dc8506..b3383c24e6 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -1,17 +1,18 @@ --- title: 'Create a video message from URLs' -description: 'OpenIM Android SDK guide for Create a video message from URLs.' +description: 'Use VideoElem to create a video message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Populate `VideoElem` with the remote video and thumbnail information, then create the message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx new file mode 100644 index 0000000000..d5152c2a0c --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx @@ -0,0 +1,23 @@ +--- +title: 'Create a video message' +description: 'Create a video message from paths relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessage( + videoPath, + mimeType, + durationSeconds, + snapshotPath +); +``` + +The video and snapshot files must be stored under the data directory configured during SDK initialization. Pass both paths relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx index 2cb99cd5e6..8ba10115dd 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -1,17 +1,18 @@ --- title: 'Clear all local messages' -description: 'OpenIM Android SDK guide for Clear all local messages.' +description: 'Use deleteAllMsgFromLocal to clear all messages stored on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This operation only clears the current device's local cache. It does not delete server records. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.deleteAllMsgFromLocal(callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx index 1030a9cb05..b9b3dff3e5 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -1,17 +1,18 @@ --- -title: 'Clear local and server messages' -description: 'OpenIM Android SDK guide for Clear local and server messages.' +title: 'Clear all saved messages' +description: 'Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This is a high-impact operation. Ask for confirmation before calling it, then clear the local conversation display after it completes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.deleteAllMsgFromLocalAndSvr(callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx index f026d8cd54..1056e39c5c 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -1,17 +1,18 @@ --- title: 'Delete a local message' -description: 'OpenIM Android SDK guide for Delete a local message.' +description: 'Use deleteMessageFromLocalStorage to delete only the message copy on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/delete-local-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This operation does not affect message records on other devices or for other users. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 7649e1dfbe..37bd744399 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -1,17 +1,55 @@ --- title: 'Delete messages in a batch' -description: 'OpenIM Android SDK guide for Delete messages in a batch.' +description: 'Delete multiple messages from one conversation for the current account with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +## Parameters -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the conversation containing the messages to delete. | +| `clientMsgIDs` | `String[]` | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | +| `isSync` | `boolean` | Yes | Whether to synchronize the deletion to the current account's other clients. | + +```java +DeleteMessagesReq request = new DeleteMessagesReq( + true, + conversationID, + selectedClientMsgIDs.toArray(new String[0]) +); + +messageManager.deleteMessages(request, new OnBase() { + @Override + public void onSuccess(String data) { + // The deletion request has completed + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } +}); +``` + +With `isSync` set to `false`, the operation deletes the current device's copy and the current account's server-side record. With `true`, it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. + +The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. + +This page owns `OnAdvanceMsgListener.onMsgDeleted`. Determine the conversation from the message routing fields, then remove the message idempotently by `clientMsgID`. + +```java +@Override +public void onMsgDeleted(Message message) { + removeMessage(resolveConversationID(message), message.getClientMsgID()); +} +``` + +To reconcile the current message snapshot, query the corresponding conversation history again. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx new file mode 100644 index 0000000000..1f99329d66 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,43 @@ +--- +title: 'Delete all messages from a user in a group chat' +description: 'Delete every message sent by a specified user in a group chat with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' +--- + +```java +messageManager.deleteUserAllMessagesInConv( + conversationID, + targetUserID, + new OnBase() { + @Override + public void onSuccess(String data) { + // The deletion request has completed + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high-impact group moderation action and should not appear in an ordinary single-message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. + +This page owns `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv`. When the event arrives, use its `conversationID` and `userID` to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + removeMessagesBySender(event.getConversationID(), event.getUserID()); +} +``` + +Callback completion, event arrival, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index 969069c18b..c9ba3d657c 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -1,17 +1,21 @@ --- -title: 'Get pinned messages in a conversation' -description: 'OpenIM Android SDK guide for Get pinned messages in a conversation.' +title: 'View pinned messages' +description: 'Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The result is a snapshot of the messages currently pinned in the specified conversation. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.getConversationPinnedMsgs(new OnBase>() { + @Override public void onSuccess(List messages) { showPinned(messages); } + @Override public void onError(int code, String error) { showPinnedError(error); } +}, conversationID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx index f3543c748b..9a286488a3 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -1,17 +1,18 @@ --- title: 'Insert a local group message' -description: 'OpenIM Android SDK guide for Insert a local group message.' +description: 'Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the group ID and sender ID. The message is not synchronized to other devices. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx index ccaf2bcc05..c776d12b79 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -1,17 +1,18 @@ --- -title: 'Insert a local one-to-one message' -description: 'OpenIM Android SDK guide for Insert a local one-to-one message.' +title: 'Insert a local direct message' +description: 'Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This method does not send the message to the server. `receiver` and `sender` determine how the local message is associated with the conversation. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index 57f100501a..ebee0737f3 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -1,17 +1,35 @@ --- title: 'Modify a message' -description: 'OpenIM Android SDK guide for Modify a message.' +description: 'Modify supported message content and handle modification events received by other clients.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/modify-a-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `modifyMessage` to change an existing message in a conversation. Preserve the original conversation ID, `clientMsgID`, routing fields, sender, and other message data in the request, and update only the supported content. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.modifyMessage(callback, modifyRequest); +``` + +The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified `Message` through `OnAdvanceMsgListener.onMessageModified`. + +This page is the complete owner of `onMessageModified`. Resolve the `conversationID` from the message routing fields, then replace the original message by `conversationID:clientMsgID`. Do not match by array position or displayed text: + +```java +@Override +public void onMessageModified(Message message) { + String conversationID = resolveConversationID(message); + if (conversationID == null) { + return; + } + replaceMessage(conversationID, message.getClientMsgID(), message); +} +``` + +Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index c47af6dbb7..eb3fb3e856 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -1,17 +1,38 @@ --- title: 'Revoke a message' -description: 'OpenIM Android SDK guide for Revoke a message.' +description: 'Revoke a sent message and handle revocation notifications received by other clients.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` + +The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through `OnAdvanceMsgListener.onRecvMessageRevokedV2`. + +This page is the complete owner of `onRecvMessageRevokedV2`. `RevokedInfo` contains the `clientMsgID`, revoker, and revocation time, but not the `conversationID`. Resolve the owning conversation from the current account's message index, then update by `conversationID:clientMsgID`: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + String clientMsgID = info.getClientMsgID(); + String conversationID = findConversationIDByClientMsgID(clientMsgID); + if (conversationID == null) { + return; + } + markMessageRevoked(conversationID, clientMsgID, info); +} +``` + +Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. + +Callback completion, event delivery, and a new history query are three independent stages. Re-query the corresponding conversation history when reconciliation is required. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx index 628339da08..ddd254244d 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -1,17 +1,18 @@ --- -title: 'Set a local message extension' -description: 'OpenIM Android SDK guide for Set a local message extension.' +title: 'Set local message extensions' +description: 'Use setMessageLocalEx to store message data used only on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`localEx` is suitable for local information such as a download path or playback state. It is not synchronized to other users. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index 7491a448cd..a7eef200b6 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -1,17 +1,36 @@ --- title: 'Pin or unpin a message' -description: 'OpenIM Android SDK guide for Pin or unpin a message.' +description: 'Change a conversation message’s pinned state and handle pinned-message change events.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass `true` as the final argument to pin the message or `false` to unpin it: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); +``` + +The success callback means that the request completed; it does not mean that the pinned-message event has arrived. + +This page owns `OnAdvanceMsgListener.onChangedPinnedMsg`. `ChangedPinnedMsg` contains the `conversationID` and current pinned-message collection. Replace the collection for that conversation, then deduplicate its messages by `clientMsgID`: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + replacePinnedMessages(event.getConversationID(), event.getMsgs()); +} +``` + +Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and the snapshot from [View pinned messages](/sdk/android/message/managing-messages/get-pinned-messages) are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx new file mode 100644 index 0000000000..91c5e8f5fc --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -0,0 +1,45 @@ +--- +title: 'Get members who read a group message' +description: 'Retrieve members who have or have not read a group message using pagination.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' +--- + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the group conversation. | +| `clientMsgID` | `String` | Yes | ID of the message whose reader list to query. | +| `filter` | `int` | Yes | Pass `0` for members who have read the message or `1` for members who have not read it. | +| `offset` | `int` | Yes | Pagination offset. Pass `0` for the first page. | +| `count` | `int` | Yes | Maximum number of members to retrieve. | + +```java +messageManager.getGroupMessageReaderList( + conversationID, + clientMsgID, + 0, + 0, + 50, + new OnBase>() { + @Override + public void onSuccess(List members) { + renderMembers(members); + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +The success callback returns the current page of `GroupMembersInfo` objects. For field descriptions, see [List group members](/sdk/android/group/retrieving-group-members/get-group-member-list). Deduplicate by `groupID:userID`. The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx new file mode 100644 index 0000000000..0ff04b682a --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -0,0 +1,43 @@ +--- +title: 'Report group messages as read' +description: 'Report group-message read receipts with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' +--- + +```java +messageManager.sendGroupMessageReadReceipt( + conversationID, + visibleClientMsgIDs, + new OnBase() { + @Override + public void onSuccess(String data) { + // The read receipts have been reported + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through `markConversationMessageAsRead`. + +Other clients receive member-level group read changes through `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt`. This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's `conversationID` and message IDs. + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + mergeGroupReadReceipt(receipt); +} +``` + +The report callback, the group receipt event, and the member snapshot from [Get members who read a group message](/sdk/android/message/managing-read-status/get-group-message-readers) are three independent stages. diff --git a/content/docs/chat/sdk/android/message/overview-message.mdx b/content/docs/chat/sdk/android/message/overview-message.mdx index 66a452f77f..5173f3fd3b 100644 --- a/content/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/docs/chat/sdk/android/message/overview-message.mdx @@ -1,18 +1,22 @@ --- -title: 'Overview' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'Message overview' +description: 'Learn about the Android SDK Message model, message lifecycle, and message listener.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/overview-message' --- - +Android messages are represented by `Message`. Use `clientMsgID` for deduplication, and use `sessionType`, `recvID`, and `groupID` to distinguish one-to-one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. + +```java +OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +}); +``` + +Queries establish a snapshot, while `OnAdvanceMsgListener` merges incremental changes. Setting a listener on `MessageManager` replaces the current listener, so register it once in a shared state layer. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx index eb318b59c8..596a219233 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -1,17 +1,24 @@ --- title: 'Receive custom business messages' -description: 'OpenIM Android SDK guide for Receive custom business messages.' +description: 'Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a `Message`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } +}); +``` + +This page owns the complete handling contract for `onRecvCustomBusinessMessage`. Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client-side permissions. + +`MessageManager` retains only one custom business listener; setting another replaces the previous one. Register it once in an application-level event center, and stop dispatching into the previous account's state when signing out or switching accounts. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx index ccaaaf7102..309676bb92 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -1,17 +1,21 @@ --- title: 'Receive messages' -description: 'OpenIM Android SDK guide for Receive messages.' +description: 'Use OnAdvanceMsgListener to receive new, offline, and online-only messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/receiving-messages/receive-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +After calling `setAdvancedMsgListener()`, `onRecvNewMessage` receives real-time messages, `onRecvOfflineNewMessage` receives offline batches, and `onRecvOnlineOnlyMessage` receives online-only message strings. Merge all messages idempotently by `clientMsgID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } + @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } +}); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index f606fc6ddc..f4cba4da2e 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -1,17 +1,21 @@ --- title: 'Find messages by ID' -description: 'OpenIM Android SDK guide for Find messages by ID.' +description: 'Use findMessageList to retrieve message records with SearchParams.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Create a list of `SearchParams` for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.findMessageList(new OnBase() { + @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } + @Override public void onError(int code, String error) { showQueryError(error); } +}, searchParams); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx new file mode 100644 index 0000000000..d9437e7ece --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -0,0 +1,50 @@ +--- +title: 'Load message context' +description: 'Retrieve messages before and after a specified message with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' +--- + +When navigating from a search result or referenced message into its chat context, use the `Message` already retrieved as the anchor. + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the conversation containing the anchor message. | +| `startMsg` | `Message` | Yes | Previously retrieved anchor message. | +| `type` | `ViewType` | Yes | Context type. Use `ViewType.History` for a referenced message and `ViewType.Search` for a search result. | +| `before` | `int` | Yes | Maximum number of messages to retrieve before the anchor. | +| `after` | `int` | Yes | Maximum number of messages to retrieve after the anchor. | + +```java +messageManager.fetchSurroundingMessages( + new OnBase() { + @Override + public void onSuccess(Messages messages) { + List surrounding = messages.getData(); + renderMessages(surrounding); + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + }, + conversationID, + targetMessage, + ViewType.Search, + 20, + 20 +); +``` + +In the success callback, `messages.getData()` is the list retrieved before and after the anchor. For message fields, see [Message overview](/sdk/android/message/overview-message). + +`before` and `after` independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by `conversationID:clientMsgID`; do not rely on fixed array positions. If the message must first be located, see [Find messages by ID](/sdk/android/message/retrieving-messages/find-messages-by-id). diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx index d582a57fdc..a5825c8d54 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -1,17 +1,18 @@ --- -title: 'Load message history in reverse' -description: 'OpenIM Android SDK guide for Load message history in reverse.' +title: 'Load newer messages' +description: 'Use getAdvancedHistoryMessageListReverse to load messages after a starting point.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use this method to read forward from a message anchor when loading the following page of history. Use `ViewType.History` for this directional history paging. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx index af547c4b35..fbd73af2c6 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -1,17 +1,18 @@ --- -title: 'Load message history' -description: 'OpenIM Android SDK guide for Load message history.' +title: 'Load older messages' +description: 'Use getAdvancedHistoryMessageList to load conversation history by page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass `null` for `startMsg` on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Use `ViewType.History` for ordinary history loading and deduplicate returned messages by `clientMsgID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx index aa0346051e..e781838770 100644 --- a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx +++ b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -1,17 +1,19 @@ --- title: 'Search messages' -description: 'OpenIM Android SDK guide for Search messages.' +description: 'Use searchLocalMessages to search messages synchronized to the current account’s local storage.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/searching-messages/search-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Search by conversation, keywords, senders, message types, time range, and pagination parameters. Pass `null` for `conversationID` to search across all local conversations. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.searchLocalMessages(callback, conversationID, keywords, 1, + senderIDs, messageTypes, 0, 0, 0, 20); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx index 173ae35cee..70819a9e5c 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -1,17 +1,18 @@ --- -title: 'Send an uploaded media message' -description: 'OpenIM Android SDK guide for Send an uploaded media message.' +title: 'Send a message without OSS' +description: 'Use sendMessageNotOss to send a media message whose resources were uploaded by your application.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built-in upload flow again. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx index 3764812cef..470ee3532e 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -1,17 +1,21 @@ --- title: 'Send a message' -description: 'OpenIM Android SDK guide for Send a message.' +description: 'Use sendMessage to send a Message to a one-to-one or group conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/sending-messages/send-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +For a one-to-one message, set `recvUid` and pass `null` for the group target. For a group message, set `recvGid` and pass `null` for the user target. `OnMsgSendCallback` reports success, failure, and media upload progress. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } + @Override public void onError(int code, String error) { showSendError(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 9cfa3ba752..a9048f9032 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -1,17 +1,22 @@ --- title: 'Track message sending progress' -description: 'OpenIM Android SDK guide for Track message sending progress.' +description: 'Use the progress callback on OnMsgSendCallback to update media sending progress.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Android does not provide a separate global send-progress listener. Each call to `sendMessage()` or `sendMessageNotOss()` reports progress through its own `OnMsgSendCallback`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onProgress(long progress) { updateProgress(progress); } + @Override public void onSuccess(Message sentMessage) { finishProgress(); } + @Override public void onError(int code, String error) { failProgress(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx index d0d5962638..64258f4353 100644 --- a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx +++ b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' @@ -49,4 +49,4 @@ public void onUserStatusChanged(UsersOnlineStatus status) { } ``` -Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one. +Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status). diff --git a/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx new file mode 100644 index 0000000000..86256bcdd4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,39 @@ +--- +title: 'Unsubscribe from user status' +description: 'Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' +--- + +Cancel online-status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( + new OnBase() { + @Override + public void onSuccess(String data) { + for (String userID : userIDs) { + presenceByUserID.remove(userID); + } + } + + @Override + public void onError(int code, String error) { + recordStatusUnsubscribeFailure(code, error); + } + }, + userIDs +); +``` + +A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. + +Call [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) when those users need to be tracked again. diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index a4e83af60a..713b18a418 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' @@ -27,7 +27,7 @@ Android SDK returns different user objects for different scenarios: | `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | | `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | -| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()` | +| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()`, `unsubscribeOnlineUsersStatus()` | The same `userID` can appear in public profile, friend, blocklist, and group member data. Prefer `UserInfo.getFriendInfo()` when displaying a contact, `PublicUserInfo` when only a public account profile is needed, and `UserInfo.getBlackInfo()` on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. @@ -45,7 +45,7 @@ Use `userID` as the stable key for user lists and events. A friend request conta | View and maintain the current user's blocklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist) | | Read or update the current user's nickname, avatar, and extension data | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | | Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | -| Subscribe to and retrieve online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | +| Subscribe to, retrieve, and unsubscribe from online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status), [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status) | ## State updates diff --git a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx index 1994106aca..7a80357bd7 100644 --- a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -1,11 +1,11 @@ --- -title: 'Update the current user profile' +title: 'Update your profile' description: 'Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/user-profile/set-self-info' diff --git a/content/zh/docs/chat/sdk/android/events/overview-events.mdx b/content/zh/docs/chat/sdk/android/events/overview-events.mdx index fbb9e7a665..7ba0c0f9e2 100644 --- a/content/zh/docs/chat/sdk/android/events/overview-events.mdx +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -40,25 +40,28 @@ Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账 ## 事件归属 -| 事件范围 | 合并标识 | 完整处理页面 | +| 事件范围 | Listener | 对应页面 | | --- | --- | --- | -| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | -| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | -| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | -| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | -| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | -| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | -| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | -| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | -| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | -| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) | -| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | -| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) | -| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | -| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | -| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | -| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | -| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | +| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | +| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | +| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) | +| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) | +| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | +| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) | +| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) | +| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) | +| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) | +| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | +| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx index 5083948c6c..984a0e57b7 100644 --- a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx +++ b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -1,5 +1,5 @@ --- -title: '跟踪文件上传进度' +title: '监听文件上传进度' description: '使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。' sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' --- diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx index 92c5b37c37..157837178b 100644 --- a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -1,5 +1,5 @@ --- -title: '设置全员禁言' +title: '设置群组全员禁言' description: '使用 changeGroupMute 开启或关闭群组全员禁言。' sourcePath: '/sdk/android/group/change-group-mute' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index 15ea849e77..8838f4dd75 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -1,5 +1,5 @@ --- -title: '同意群申请' +title: '接受入群申请' description: '使用 acceptGroupApplication 同意指定用户的入群申请。' sourcePath: '/sdk/android/group/group-applications/accept-group-application' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index 8393c7f2a2..ed061725ee 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -1,5 +1,5 @@ --- -title: '获取发出的群申请' +title: '获取发出的入群申请' description: '使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 363217b817..0f981e7d0f 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -1,5 +1,5 @@ --- -title: '获取收到的群申请' +title: '获取收到的入群申请' description: '使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx index 879a6b5f7c..2d8c85ba01 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -1,5 +1,5 @@ --- -title: '群申请概览' +title: '入群申请概览' description: '说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。' sourcePath: '/sdk/android/group/group-applications/overview-group-applications' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index da3929960b..fb4d329b32 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -1,5 +1,5 @@ --- -title: '拒绝群申请' +title: '拒绝入群申请' description: '使用 refuseGroupApplication 拒绝指定用户的入群申请。' sourcePath: '/sdk/android/group/group-applications/refuse-group-application' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index b7f69cd49d..c7ad6aad04 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -1,5 +1,5 @@ --- -title: '禁言或解除禁言群成员' +title: '设置群成员禁言' description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 789b2e2c37..0943cf2601 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -1,5 +1,5 @@ --- -title: '邀请用户入群' +title: '邀请用户加入群组' description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx index b5644f4a58..1854d25a2c 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -1,5 +1,5 @@ --- -title: '更新群昵称' +title: '修改群内昵称' description: '使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx index 4c7276d677..88c908c115 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -1,5 +1,5 @@ --- -title: '管理群管理员' +title: '设置管理员' description: '使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index f364f78db8..4da60e1a14 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -1,5 +1,5 @@ --- -title: '获取群成员列表' +title: '分页查询群成员' description: '使用 getGroupMemberList 按角色和分页条件读取群成员。' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index 1b3a030a06..c15b5f4ce6 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -1,5 +1,5 @@ --- -title: '获取群成员资料' +title: '查询指定群成员资料' description: '使用 getGroupMembersInfo 批量读取指定成员在群内的资料。' sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index db3243966b..17e80ec6f1 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -1,5 +1,5 @@ --- -title: '检查用户是否在群内' +title: '查询用户入群状态' description: '使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。' sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx index 97c8eaaff6..dd7a3f5d80 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -1,5 +1,5 @@ --- -title: '获取群资料' +title: '查询指定群组资料' description: '使用 getGroupsInfo 批量查询指定群组的最新资料。' sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index a495b3e12c..24ef248c64 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -1,5 +1,5 @@ --- -title: '检查是否加入群组' +title: '检查是否已加入群组' description: '使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。' sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' --- diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx index 358f31067c..b592ee761b 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -1,5 +1,5 @@ --- -title: '发布群公告' +title: '发布或更新群公告' description: '通过 GroupInfo.notification 发布或更新群公告。' sourcePath: '/sdk/android/group/set-group-announcement' --- diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx index 5a3f42d309..2b08a36203 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -1,5 +1,5 @@ --- -title: '设置群扩展字段' +title: '设置群组扩展字段' description: '通过 GroupInfo.ex 保存应用定义的群组扩展数据。' sourcePath: '/sdk/android/group/set-group-extension' --- diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 595cc08ede..c923b533e5 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -1,5 +1,5 @@ --- -title: '设置成员好友申请权限' +title: '设置群内添加好友权限' description: '通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。' sourcePath: '/sdk/android/group/set-group-member-friend-permission' --- diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx index 9ed87d5dfd..1b64245029 100644 --- a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -1,5 +1,5 @@ --- -title: '更新群资料' +title: '更新群名称、简介和头像' description: '使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。' sourcePath: '/sdk/android/group/update-group-profile' --- diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx new file mode 100644 index 0000000000..279f782485 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -0,0 +1,28 @@ +--- +title: '查询输入状态' +description: '使用 getInputState 查询指定用户在会话中的当前输入状态。' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 + +```java +OpenIMClient.getInstance().conversationManager.getInputState( + new OnBase>() { + @Override + public void onSuccess(List platformIDs) { + boolean typing = platformIDs != null && !platformIDs.isEmpty(); + updateTypingState(conversationID, userID, typing); + } + + @Override + public void onError(int code, String error) { + recordTypingStatusQueryFailure(code, error); + } + }, + conversationID, + userID +); +``` + +成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。 diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index 373932fa94..83c36e8052 100644 --- a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -1,16 +1,38 @@ --- -title: '更新输入状态' -description: '使用 typingStatusUpdate 提示单聊对方当前正在输入。' +title: '上报输入状态' +description: '使用 Android SDK 上报当前会话的输入状态。' sourcePath: '/sdk/android/message/composing-messages/update-typing-status' --- -输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 +进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。 ```java -messageManager.typingStatusUpdate(callback, peerUserID, "typing"); +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // 输入状态已上报 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + }, + conversationID, + true +); ``` -成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: +输入结束时及时清除状态: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 + +其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: ```java @Override @@ -30,4 +52,6 @@ public void onConversationUserInputStatusChanged(String payload) { } ``` -输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。 +输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 + +进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx new file mode 100644 index 0000000000..e9375d42cf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -0,0 +1,23 @@ +--- +title: '创建富文本回复' +description: '使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-quote-message' +--- + +富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。 + +```java +RichMessage mention = new RichMessage(); +mention.setType("mention"); +mention.setOffset(0); +mention.setLength(6); +mention.setInfo("{\"userID\":\"user_a\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage( + "OpenIM agreed", + originalMessage, + Collections.singletonList(mention) +); +``` + +被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx new file mode 100644 index 0000000000..76c5b8e988 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx @@ -0,0 +1,23 @@ +--- +title: '创建富文本消息' +description: '使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-text-message' +--- + +`RichMessage` 使用 `offset` 和 `length` 标记正文范围,并通过 `type`、`url` 和 `info` 携带业务定义的实体信息。 + +```java +RichMessage link = new RichMessage(); +link.setType("link"); +link.setOffset(0); +link.setLength(6); +link.setUrl("https://docs.openim.io"); +link.setInfo("{\"title\":\"OpenIM documentation\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage( + "OpenIM docs", + Collections.singletonList(link) +); +``` + +每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 `info` 内容,并确保接收端使用相同的 `type` 与 `info` 协议。本方法只创建 `Message`,不会发送消息;创建完成后使用[发送消息](/sdk/android/message/sending-messages/send-message)。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx index a08758fce1..b0df73bd91 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -1,12 +1,12 @@ --- -title: '从文件创建文件消息' -description: '使用相对路径或绝对路径创建文件消息。' +title: '使用本地路径创建文件消息' +description: '使用绝对路径创建文件消息。' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' --- -文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 - ```java Message message = OpenIMClient.getInstance().messageManager - .createFileMessageFromFullPath(filePath, fileName); + .createFileMessageFromFullPath(absolutePath, fileName); ``` + +绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx index 2ce7b0a895..474514464c 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建文件消息' +title: '使用 URL 创建文件消息' description: '使用 FileElem 创建已上传资源的文件消息。' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx new file mode 100644 index 0000000000..ac83e0e22d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建文件消息' +description: '使用相对于 SDK 初始化数据目录的路径创建文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessage(filePath, fileName); +``` + +文件应位于 SDK 初始化时配置的数据目录内,`filePath` 传入相对于该目录的路径,`fileName` 用于接收端展示。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx index b01ed5ea73..24fd6a258a 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -1,11 +1,12 @@ --- -title: '从文件创建图片消息' -description: '使用相对路径或绝对路径创建图片消息。' +title: '使用本地路径创建图片消息' +description: '使用绝对路径创建图片消息。' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' --- -缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。 - ```java -Message message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath); +Message message = OpenIMClient.getInstance().messageManager + .createImageMessageFromFullPath(absolutePath); ``` + +绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx index e789e2283f..47a1e6358f 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建图片消息' +title: '使用 URL 创建图片消息' description: '使用 createImageMessageByURL 创建已上传资源的图片消息。' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx new file mode 100644 index 0000000000..1ea3a0d49f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建图片消息' +description: '使用相对于 SDK 初始化数据目录的路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessage(imagePath); +``` + +图片文件应位于 SDK 初始化时配置的数据目录内,`imagePath` 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx index 498b2717ce..977ef62f22 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -1,5 +1,5 @@ --- -title: '创建引用消息' +title: '创建回复消息' description: '使用 createQuoteMessage 创建引用已有消息的回复。' sourcePath: '/sdk/android/message/creating-messages/create-quote-message' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx index 5c3ee21b12..476cbf4958 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -1,12 +1,12 @@ --- -title: '从文件创建音频消息' -description: '使用相对路径或绝对路径创建音频消息。' +title: '使用本地路径创建音频消息' +description: '使用绝对路径创建音频消息。' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' --- -音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 - ```java Message message = OpenIMClient.getInstance().messageManager - .createSoundMessageFromFullPath(soundPath, durationSeconds); + .createSoundMessageFromFullPath(absolutePath, durationSeconds); ``` + +绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx index f647e57883..fde2b58811 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建音频消息' +title: '使用 URL 创建音频消息' description: '使用 SoundElem 创建已上传资源的音频消息。' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx new file mode 100644 index 0000000000..b84d206f0a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建音频消息' +description: '使用相对于 SDK 初始化数据目录的路径创建音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessage(soundPath, durationSeconds); +``` + +音频文件应位于 SDK 初始化时配置的数据目录内,`soundPath` 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx index 1de9a128c6..ed009dbd59 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -1,12 +1,16 @@ --- -title: '从文件创建视频消息' -description: '使用相对路径或绝对路径创建视频消息及缩略图。' +title: '使用本地路径创建视频消息' +description: '使用视频和缩略图的绝对路径创建视频消息。' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' --- -视频方法需要 MIME 类型、时长和缩略图路径。 - ```java Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( - videoPath, mimeType, durationSeconds, snapshotPath); + absoluteVideoPath, + mimeType, + durationSeconds, + absoluteSnapshotPath +); ``` + +视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx index 8f15837c33..91cb67dec4 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建视频消息' +title: '使用 URL 创建视频消息' description: '使用 VideoElem 创建已上传资源的视频消息。' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx new file mode 100644 index 0000000000..edc1e79f06 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx @@ -0,0 +1,16 @@ +--- +title: '创建视频消息' +description: '使用相对于 SDK 初始化数据目录的路径创建视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessage( + videoPath, + mimeType, + durationSeconds, + snapshotPath +); +``` + +视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx index 8c35a9aea7..38569554d7 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -1,5 +1,5 @@ --- -title: '清空全部本地消息' +title: '清理全部本地消息' description: '使用 deleteAllMsgFromLocal 清理当前设备的全部消息。' sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx index cdcb7102f0..12a2130f0c 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -1,5 +1,5 @@ --- -title: '清空全部已保存消息' +title: '清理全部消息' description: '使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。' sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 846606b0cd..dcb41dae6e 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -1,11 +1,48 @@ --- -title: '删除已保存消息' -description: '使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。' +title: '批量删除消息' +description: '使用 Android SDK 批量删除当前账号在同一会话中的消息。' sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' --- -删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 | +| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | +| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 | + +```java +DeleteMessagesReq request = new DeleteMessagesReq( + true, + conversationID, + selectedClientMsgIDs.toArray(new String[0]) +); + +messageManager.deleteMessages(request, new OnBase() { + @Override + public void onSuccess(String data) { + // 删除请求已完成 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } +}); +``` + +`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 + +成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 + +`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。 ```java -messageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback); +@Override +public void onMsgDeleted(Message message) { + removeMessage(resolveConversationID(message), message.getClientMsgID()); +} ``` + +需要校准当前消息快照时,重新查询对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx new file mode 100644 index 0000000000..63239d1731 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,36 @@ +--- +title: '删除群聊中指定用户的全部消息' +description: '使用 Android SDK 删除指定用户在群聊中的全部消息。' +sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' +--- + +```java +messageManager.deleteUserAllMessagesInConv( + conversationID, + targetUserID, + new OnBase() { + @Override + public void onSuccess(String data) { + // 删除请求已完成 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 + +`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + removeMessagesBySender(event.getConversationID(), event.getUserID()); +} +``` + +成功回调、事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index faccb79cd4..a8886cb400 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -1,5 +1,5 @@ --- -title: '查看置顶消息' +title: '查询会话置顶消息' description: '使用 getConversationPinnedMsgs 查询会话中的置顶消息。' sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index 5faba1be23..ef13cc038a 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -1,11 +1,28 @@ --- title: '修改消息' -description: '使用 ModifyMessageReq 修改支持修改的消息内容。' +description: '修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。' sourcePath: '/sdk/android/message/managing-messages/modify-a-message' --- -请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。 +`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。 ```java messageManager.modifyMessage(callback, modifyRequest); ``` + +成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。 + +本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配: + +```java +@Override +public void onMessageModified(Message message) { + String conversationID = resolveConversationID(message); + if (conversationID == null) { + return; + } + replaceMessage(conversationID, message.getClientMsgID(), message); +} +``` + +该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index 315f117125..7479c49769 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -1,11 +1,31 @@ --- title: '撤回消息' -description: '使用 revokeMessageV2 撤回已发送消息。' +description: '撤回已发送消息,并处理其他客户端收到的撤回通知。' sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' --- -Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。 +撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 ```java messageManager.revokeMessageV2(callback, conversationID, clientMsgID); ``` + +成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。 + +本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + String clientMsgID = info.getClientMsgID(); + String conversationID = findConversationIDByClientMsgID(clientMsgID); + if (conversationID == null) { + return; + } + markMessageRevoked(conversationID, clientMsgID, info); +} +``` + +接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。 + +成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx index c991a22e6a..6e64c0b8a9 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -1,5 +1,5 @@ --- -title: '设置消息本地扩展字段' +title: '设置消息本地扩展' description: '使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。' sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index 308db6a098..8c812ae422 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -1,11 +1,29 @@ --- title: '置顶或取消置顶消息' -description: '使用 setConversationPinnedMsg 设置会话消息的置顶状态。' +description: '设置会话消息的置顶状态,并处理置顶消息变化事件。' sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' --- -最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。 +最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶: ```java -messageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true); +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); ``` + +成功回调表示设置请求完成,不代表置顶变化事件已经到达。 + +`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + replacePinnedMessages(event.getConversationID(), event.getMsgs()); +} +``` + +该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx new file mode 100644 index 0000000000..667a270226 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -0,0 +1,38 @@ +--- +title: '查询群消息已读成员' +description: '使用 Android SDK 分页查询群消息的已读或未读成员。' +sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' +--- + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 群聊会话 ID。 | +| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 | +| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 | +| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 | +| `count` | `int` | 是 | 本次请求的成员数量。 | + +```java +messageManager.getGroupMessageReaderList( + conversationID, + clientMsgID, + 0, + 0, + 50, + new OnBase>() { + @Override + public void onSuccess(List members) { + renderMembers(members); + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx new file mode 100644 index 0000000000..aa0852b8dc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -0,0 +1,36 @@ +--- +title: '上报群消息已读' +description: '使用 Android SDK 上报群消息已读回执。' +sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' +--- + +```java +messageManager.sendGroupMessageReadReceipt( + conversationID, + visibleClientMsgIDs, + new OnBase() { + @Override + public void onSuccess(String data) { + // 已读回执已上报 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。 + +其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + mergeGroupReadReceipt(receipt); +} +``` + +上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index 381f4ab42c..2583ae4544 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -1,5 +1,5 @@ --- -title: '按 ID 查询消息' +title: '按 ID 查找消息' description: '使用 findMessageList 按 SearchParams 查询消息记录。' sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' --- diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx new file mode 100644 index 0000000000..dcf4caaa73 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -0,0 +1,43 @@ +--- +title: '读取消息上下文' +description: '使用 Android SDK 读取一条消息前后的上下文。' +sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' +--- + +从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。 + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 | +| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 | +| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 | +| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 | +| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 | + +```java +messageManager.fetchSurroundingMessages( + new OnBase() { + @Override + public void onSuccess(Messages messages) { + List surrounding = messages.getData(); + renderMessages(surrounding); + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + }, + conversationID, + targetMessage, + ViewType.Search, + 20, + 20 +); +``` + +成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。 + +`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。 diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx index 8ae412f2cb..a1a6b9355f 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -1,11 +1,11 @@ --- -title: '加载更新消息' +title: '反向加载历史消息' description: '使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。' sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' --- -该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 +该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 `ViewType.History`。 ```java -messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL); +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History); ``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx index 7f6fa2a448..31e810cd30 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -1,11 +1,11 @@ --- -title: '加载更早消息' +title: '加载历史消息' description: '使用 getAdvancedHistoryMessageList 分页加载会话历史消息。' sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' --- -首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。 +首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。普通历史消息使用 `ViewType.History`,按返回的 `clientMsgID` 去重。 ```java -messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL); +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); ``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx index 86bbd1a9fb..2d5fe56db3 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -1,5 +1,5 @@ --- -title: '发送非 OSS 消息' +title: '发送不经 OSS 的消息' description: '使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。' sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' --- diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx index e14f1ddc5e..d18b4047c5 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/message/sending-messages/send-message' ```java messageManager.sendMessage(new OnMsgSendCallback() { - @Override public void onSuccess(String id) { mergeSentMessage(message); } + @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } @Override public void onError(int code, String error) { showSendError(error); } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 107d841dff..521d34e08e 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -1,5 +1,5 @@ --- -title: '跟踪消息发送进度' +title: '监听消息发送进度' description: '通过 OnMsgSendCallback 的进度回调更新媒体发送进度。' sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' --- @@ -9,7 +9,7 @@ Android 没有独立的全局发送进度 listener;进度随每次 `sendMessag ```java messageManager.sendMessage(new OnMsgSendCallback() { @Override public void onProgress(long progress) { updateProgress(progress); } - @Override public void onSuccess(String id) { finishProgress(); } + @Override public void onSuccess(Message sentMessage) { finishProgress(); } @Override public void onError(int code, String error) { failProgress(error); } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx index 5e8e963d45..db82484ce2 100644 --- a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx +++ b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -42,4 +42,4 @@ public void onUserStatusChanged(UsersOnlineStatus status) { } ``` -订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。 +订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx new file mode 100644 index 0000000000..caf17506e6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,32 @@ +--- +title: '取消用户状态订阅' +description: '使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。' +sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' +--- + +用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( + new OnBase() { + @Override + public void onSuccess(String data) { + for (String userID : userIDs) { + presenceByUserID.remove(userID); + } + } + + @Override + public void onError(int code, String error) { + recordStatusUnsubscribeFailure(code, error); + } + }, + userIDs +); +``` + +成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 + +需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx index cb4d3311f3..7b447ea85c 100644 --- a/content/zh/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -20,7 +20,7 @@ Android SDK 会根据使用场景返回不同的用户对象: | `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | | `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | -| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` | +| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` | 同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 @@ -40,7 +40,7 @@ Android SDK 会根据使用场景返回不同的用户对象: | 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) | | 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | | 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | -| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) | ## 状态更新 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 7705f7517e..a8d324a7df 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -20,7 +20,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setOnGroupListener"], + "sdkMethods": [ + "setOnGroupListener" + ], "sdkEvents": [ "onGroupApplicationAccepted", "onGroupApplicationAdded", @@ -48,10 +50,16 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "reason": null + } } }, "redirectTo": null @@ -64,7 +72,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["createGroup"], + "sdkMethods": [ + "createGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -73,15 +83,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.createGroup"], + "evidence": [ + "GroupManager.createGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.createGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -94,24 +112,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupInfo"], + "evidence": [ + "GroupManager.setGroupInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -124,24 +152,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupInfo"], + "evidence": [ + "GroupManager.setGroupInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -154,24 +192,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupInfo"], + "evidence": [ + "GroupManager.setGroupInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -184,7 +232,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -193,15 +243,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupInfo.setNeedVerification"], + "evidence": [ + "GroupInfo.setNeedVerification" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setNeedVerification" + ], + "reason": null + } } }, "redirectTo": null @@ -214,7 +272,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -223,15 +283,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupInfo.setLookMemberInfo"], + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -244,24 +312,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupInfo.setApplyMemberFriend"], + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], + "reason": null + } } }, "redirectTo": null @@ -274,24 +352,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["changeGroupMute"], + "sdkMethods": [ + "changeGroupMute" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.changeGroupMute"], + "evidence": [ + "GroupManager.changeGroupMute" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMute" + ], + "reason": null + } } }, "redirectTo": null @@ -304,7 +392,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["joinGroup"], + "sdkMethods": [ + "joinGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -313,15 +403,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.joinGroup"], + "evidence": [ + "GroupManager.joinGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.joinGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -334,7 +432,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["quitGroup"], + "sdkMethods": [ + "quitGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -343,15 +443,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.quitGroup"], + "evidence": [ + "GroupManager.quitGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.quitGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -364,7 +472,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["dismissGroup"], + "sdkMethods": [ + "dismissGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -373,15 +483,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.dismissGroup"], + "evidence": [ + "GroupManager.dismissGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.dismissGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -394,24 +512,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupsInfo"], + "sdkMethods": [ + "getGroupsInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupsInfo"], + "evidence": [ + "GroupManager.getGroupsInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupsInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -424,7 +552,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getJoinedGroupListPage"], + "sdkMethods": [ + "getJoinedGroupListPage" + ], "sdkEvents": [], "locales": { "zh": { @@ -433,15 +563,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getJoinedGroupListPage"], + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], + "reason": null + } } }, "redirectTo": null @@ -454,24 +592,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["isJoinGroup"], + "sdkMethods": [ + "isJoinGroup" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.isJoinGroup"], + "evidence": [ + "GroupManager.isJoinGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.isJoinGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -484,7 +632,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["searchGroups"], + "sdkMethods": [ + "searchGroups" + ], "sdkEvents": [], "locales": { "zh": { @@ -493,15 +643,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.searchGroups"], + "evidence": [ + "GroupManager.searchGroups" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroups" + ], + "reason": null + } } }, "redirectTo": null @@ -520,7 +678,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -528,10 +686,14 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "This overview explains application state and page responsibilities without a code example." + } } }, "redirectTo": null @@ -544,24 +706,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getRecvGroupApplicationList"], + "sdkMethods": [ + "getRecvGroupApplicationList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getRecvGroupApplicationList"], + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], + "reason": null + } } }, "redirectTo": null @@ -574,24 +746,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getSendGroupApplicationList"], + "sdkMethods": [ + "getSendGroupApplicationList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getSendGroupApplicationList"], + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], + "reason": null + } } }, "redirectTo": null @@ -604,24 +786,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["acceptGroupApplication"], + "sdkMethods": [ + "acceptGroupApplication" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.acceptGroupApplication"], + "evidence": [ + "GroupManager.acceptGroupApplication" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.acceptGroupApplication" + ], + "reason": null + } } }, "redirectTo": null @@ -634,24 +826,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["refuseGroupApplication"], + "sdkMethods": [ + "refuseGroupApplication" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.refuseGroupApplication"], + "evidence": [ + "GroupManager.refuseGroupApplication" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.refuseGroupApplication" + ], + "reason": null + } } }, "redirectTo": null @@ -678,10 +880,14 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "This overview explains query identifiers and returned models without a code example." + } } }, "redirectTo": null @@ -694,24 +900,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupMemberList"], + "sdkMethods": [ + "getGroupMemberList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupMemberList"], + "evidence": [ + "GroupManager.getGroupMemberList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberList" + ], + "reason": null + } } }, "redirectTo": null @@ -724,24 +940,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupMembersInfo"], + "sdkMethods": [ + "getGroupMembersInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupMembersInfo"], + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -754,24 +980,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getUsersInGroup"], + "sdkMethods": [ + "getUsersInGroup" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getUsersInGroup"], + "evidence": [ + "GroupManager.getUsersInGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getUsersInGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -784,7 +1020,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupMemberOwnerAndAdmin"], + "sdkMethods": [ + "getGroupMemberOwnerAndAdmin" + ], "sdkEvents": [], "locales": { "zh": { @@ -793,15 +1031,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupMemberOwnerAndAdmin"], + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], + "reason": null + } } }, "redirectTo": null @@ -814,7 +1060,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["searchGroupMembers"], + "sdkMethods": [ + "searchGroupMembers" + ], "sdkEvents": [], "locales": { "zh": { @@ -823,15 +1071,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.searchGroupMembers"], + "evidence": [ + "GroupManager.searchGroupMembers" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroupMembers" + ], + "reason": null + } } }, "redirectTo": null @@ -844,24 +1100,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["inviteUserToGroup"], + "sdkMethods": [ + "inviteUserToGroup" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.inviteUserToGroup"], + "evidence": [ + "GroupManager.inviteUserToGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.inviteUserToGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -874,7 +1140,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["kickGroupMember"], + "sdkMethods": [ + "kickGroupMember" + ], "sdkEvents": [], "locales": { "zh": { @@ -883,15 +1151,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.kickGroupMember"], + "evidence": [ + "GroupManager.kickGroupMember" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.kickGroupMember" + ], + "reason": null + } } }, "redirectTo": null @@ -904,24 +1180,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -934,24 +1220,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -964,7 +1260,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -973,15 +1271,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -994,7 +1300,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1003,15 +1311,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -1024,7 +1340,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["transferGroupOwner"], + "sdkMethods": [ + "transferGroupOwner" + ], "sdkEvents": [], "locales": { "zh": { @@ -1033,15 +1351,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.transferGroupOwner"], + "evidence": [ + "GroupManager.transferGroupOwner" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.transferGroupOwner" + ], + "reason": null + } } }, "redirectTo": null @@ -1054,24 +1380,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["changeGroupMemberMute"], + "sdkMethods": [ + "changeGroupMemberMute" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.changeGroupMemberMute"], + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], + "reason": null + } } }, "redirectTo": null @@ -1085,7 +1421,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/tree/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" ], - "sdkMethods": ["OpenIMClient.getInstance"], + "sdkMethods": [ + "OpenIMClient.getInstance" + ], "sdkEvents": [], "locales": { "zh": { @@ -1146,7 +1484,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -1173,7 +1511,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" ], - "sdkMethods": ["initSDK", "networkChanged", "logout", "unInit"], + "sdkMethods": [ + "initSDK", + "networkChanged", + "logout", + "unInit" + ], "sdkEvents": [], "locales": { "zh": { @@ -1220,7 +1563,14 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" ], - "sdkMethods": ["initSDK", "login", "getLoginStatus", "getLoginUserID", "logout", "unInit"], + "sdkMethods": [ + "initSDK", + "login", + "getLoginStatus", + "getLoginUserID", + "logout", + "unInit" + ], "sdkEvents": [ "onConnecting", "onConnectSuccess", @@ -1275,8 +1625,15 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/OfflinePushInfo.java" ], - "sdkMethods": ["setAdvancedMsgListener", "login", "createTextMessage", "sendMessage"], - "sdkEvents": ["onRecvNewMessage"], + "sdkMethods": [ + "setAdvancedMsgListener", + "login", + "createTextMessage", + "sendMessage" + ], + "sdkEvents": [ + "onRecvNewMessage" + ], "locales": { "zh": { "reviewStatus": "published", @@ -1327,7 +1684,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1337,7 +1694,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1355,7 +1712,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["getUsersInfo"], + "sdkMethods": [ + "getUsersInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1393,7 +1752,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["getSelfLocalUserInfo"], + "sdkMethods": [ + "getSelfLocalUserInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1432,8 +1793,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" ], - "sdkMethods": ["setSelfInfo"], - "sdkEvents": ["onSelfInfoUpdated"], + "sdkMethods": [ + "setSelfInfo" + ], + "sdkEvents": [ + "onSelfInfoUpdated" + ], "locales": { "zh": { "reviewStatus": "published", @@ -1451,7 +1816,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -1472,7 +1837,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["setSelfInfo"], + "sdkMethods": [ + "setSelfInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1511,8 +1878,14 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["getFriendListPage"], - "sdkEvents": ["onFriendAdded", "onFriendInfoChanged", "onFriendDeleted"], + "sdkMethods": [ + "getFriendListPage" + ], + "sdkEvents": [ + "onFriendAdded", + "onFriendInfoChanged", + "onFriendDeleted" + ], "locales": { "zh": { "reviewStatus": "published", @@ -1551,7 +1924,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["searchFriends"], + "sdkMethods": [ + "searchFriends" + ], "sdkEvents": [], "locales": { "zh": { @@ -1589,7 +1964,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["getFriendsInfo"], + "sdkMethods": [ + "getFriendsInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1627,7 +2004,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["checkFriend"], + "sdkMethods": [ + "checkFriend" + ], "sdkEvents": [], "locales": { "zh": { @@ -1665,7 +2044,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["updateFriendsReq"], + "sdkMethods": [ + "updateFriendsReq" + ], "sdkEvents": [], "locales": { "zh": { @@ -1703,7 +2084,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["deleteFriend"], + "sdkMethods": [ + "deleteFriend" + ], "sdkEvents": [], "locales": { "zh": { @@ -1741,7 +2124,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["addFriend"], + "sdkMethods": [ + "addFriend" + ], "sdkEvents": [], "locales": { "zh": { @@ -1780,7 +2165,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["getRecvFriendApplicationList"], + "sdkMethods": [ + "getRecvFriendApplicationList" + ], "sdkEvents": [ "onFriendApplicationAdded", "onFriendApplicationAccepted", @@ -1825,7 +2212,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["getSendFriendApplicationList"], + "sdkMethods": [ + "getSendFriendApplicationList" + ], "sdkEvents": [], "locales": { "zh": { @@ -1863,7 +2252,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["acceptFriendApplication"], + "sdkMethods": [ + "acceptFriendApplication" + ], "sdkEvents": [], "locales": { "zh": { @@ -1901,7 +2292,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["refuseFriendApplication"], + "sdkMethods": [ + "refuseFriendApplication" + ], "sdkEvents": [], "locales": { "zh": { @@ -1939,7 +2332,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["getBlacklist"], + "sdkMethods": [ + "getBlacklist" + ], "sdkEvents": [], "locales": { "zh": { @@ -1978,8 +2373,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["addBlacklist"], - "sdkEvents": ["onBlacklistAdded"], + "sdkMethods": [ + "addBlacklist" + ], + "sdkEvents": [ + "onBlacklistAdded" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2019,8 +2418,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["removeBlacklist"], - "sdkEvents": ["onBlacklistDeleted"], + "sdkMethods": [ + "removeBlacklist" + ], + "sdkEvents": [ + "onBlacklistDeleted" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2060,13 +2463,17 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" ], - "sdkMethods": ["subscribeUsersOnlineStatus"], - "sdkEvents": ["onUserStatusChanged"], + "sdkMethods": [ + "subscribeUsersOnlineStatus" + ], + "sdkEvents": [ + "onUserStatusChanged" + ], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -2079,7 +2486,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -2100,7 +2507,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["getSubscribeOnlineUsersStatus"], + "sdkMethods": [ + "getSubscribeOnlineUsersStatus" + ], "sdkEvents": [], "locales": { "zh": { @@ -2130,6 +2539,46 @@ }, "redirectTo": null }, + { + "currentPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "targetPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "unsubscribeOnlineUsersStatus" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + } + }, + "redirectTo": null + }, { "currentPath": "/sdk/android/conversation/overview-conversation", "targetPath": "/sdk/android/conversation/overview-conversation", @@ -2173,7 +2622,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["getOneConversation"], + "sdkMethods": [ + "getOneConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2211,7 +2662,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["getConversationIDBySessionType"], + "sdkMethods": [ + "getConversationIDBySessionType" + ], "sdkEvents": [], "locales": { "zh": { @@ -2249,7 +2702,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["getMultipleConversation"], + "sdkMethods": [ + "getMultipleConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2288,8 +2743,14 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" ], - "sdkMethods": ["getConversationListSplit", "setOnConversationListener"], - "sdkEvents": ["onNewConversation", "onConversationChanged"], + "sdkMethods": [ + "getConversationListSplit", + "setOnConversationListener" + ], + "sdkEvents": [ + "onNewConversation", + "onConversationChanged" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2326,7 +2787,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["pinConversation"], + "sdkMethods": [ + "pinConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2364,7 +2827,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationEx"], + "sdkMethods": [ + "setConversationEx" + ], "sdkEvents": [], "locales": { "zh": { @@ -2402,7 +2867,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationDraft"], + "sdkMethods": [ + "setConversationDraft" + ], "sdkEvents": [], "locales": { "zh": { @@ -2440,7 +2907,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationRecvMessageOpt"], + "sdkMethods": [ + "setConversationRecvMessageOpt" + ], "sdkEvents": [], "locales": { "zh": { @@ -2478,7 +2947,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["resetConversationGroupAtType"], + "sdkMethods": [ + "resetConversationGroupAtType" + ], "sdkEvents": [], "locales": { "zh": { @@ -2517,8 +2988,13 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" ], - "sdkMethods": ["markConversationMessageAsRead", "setAdvancedMsgListener"], - "sdkEvents": ["onRecvC2CReadReceipt"], + "sdkMethods": [ + "markConversationMessageAsRead", + "setAdvancedMsgListener" + ], + "sdkEvents": [ + "onRecvC2CReadReceipt" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2556,8 +3032,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" ], - "sdkMethods": ["getTotalUnreadMsgCount"], - "sdkEvents": ["onTotalUnreadMessageCountChanged"], + "sdkMethods": [ + "getTotalUnreadMsgCount" + ], + "sdkEvents": [ + "onTotalUnreadMessageCountChanged" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2594,7 +3074,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setOneConversationPrivateChat"], + "sdkMethods": [ + "setOneConversationPrivateChat" + ], "sdkEvents": [], "locales": { "zh": { @@ -2632,7 +3114,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationBurnDuration"], + "sdkMethods": [ + "setConversationBurnDuration" + ], "sdkEvents": [], "locales": { "zh": { @@ -2670,7 +3154,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversation"], + "sdkMethods": [ + "setConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2708,7 +3194,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["hideConversation"], + "sdkMethods": [ + "hideConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2746,7 +3234,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["deleteConversationAndDeleteAllMsg"], + "sdkMethods": [ + "deleteConversationAndDeleteAllMsg" + ], "sdkEvents": [], "locales": { "zh": { @@ -2784,7 +3274,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["clearConversationAndDeleteAllMsg"], + "sdkMethods": [ + "clearConversationAndDeleteAllMsg" + ], "sdkEvents": [], "locales": { "zh": { @@ -2822,14 +3314,10 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["setAdvancedMsgListener"], - "sdkEvents": [ - "onRecvGroupMessageReadReceipt", - "onRecvMessageRevokedV2", - "onChangedPinnedMsg", - "onMsgDeleted", - "onMessageModified" + "sdkMethods": [ + "setAdvancedMsgListener" ], + "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", @@ -2844,10 +3332,16 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "reason": null + } } }, "redirectTo": null @@ -2860,7 +3354,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createTextMessage"], + "sdkMethods": [ + "createTextMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -2869,28 +3365,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createTextMessage"], + "evidence": [ + "MessageManager.createTextMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } - } - }, - "redirectTo": null - }, - { - "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", "targetPath": "/sdk/android/message/creating-messages/create-text-at-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createTextAtMessage"], + "sdkMethods": [ + "createTextAtMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -2899,15 +3405,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createTextAtMessage"], + "evidence": [ + "MessageManager.createTextAtMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextAtMessage" + ], + "reason": null + } } }, "redirectTo": null @@ -2920,7 +3434,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createCustomMessage"], + "sdkMethods": [ + "createCustomMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -2929,388 +3445,518 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createCustomMessage"], + "evidence": [ + "MessageManager.createCustomMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCustomMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-image-message", + "targetPath": "/sdk/android/message/creating-messages/create-image-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createImageMessage", "createImageMessageFromFullPath"], + "sdkMethods": [ + "createImageMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createImageMessage"], + "evidence": [ + "MessageManager.createImageMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createImageMessageByURL"], + "sdkMethods": [ + "createImageMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createImageMessageByURL"], + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createSoundMessage", "createSoundMessageFromFullPath"], + "sdkMethods": [ + "createImageMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createSoundMessage"], + "evidence": [ + "MessageManager.createImageMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-sound-message", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createSoundMessageByURL"], + "sdkMethods": [ + "createSoundMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createSoundMessageByURL"], + "evidence": [ + "MessageManager.createSoundMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createVideoMessage", "createVideoMessageFromFullPath"], + "sdkMethods": [ + "createSoundMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createVideoMessage"], + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createVideoMessageByURL"], + "sdkMethods": [ + "createSoundMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createVideoMessageByURL"], + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-video-message", + "targetPath": "/sdk/android/message/creating-messages/create-video-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createFileMessage", "createFileMessageFromFullPath"], + "sdkMethods": [ + "createVideoMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createFileMessage"], + "evidence": [ + "MessageManager.createVideoMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createFileMessageByURL"], + "sdkMethods": [ + "createVideoMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createFileMessageByURL"], + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-card-message", - "targetPath": "/sdk/android/message/creating-messages/create-card-message", + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createCardMessage"], + "sdkMethods": [ + "createVideoMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createCardMessage"], + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-location-message", - "targetPath": "/sdk/android/message/creating-messages/create-location-message", + "currentPath": "/sdk/android/message/creating-messages/create-file-message", + "targetPath": "/sdk/android/message/creating-messages/create-file-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createLocationMessage"], + "sdkMethods": [ + "createFileMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createLocationMessage"], + "evidence": [ + "MessageManager.createFileMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-face-message", - "targetPath": "/sdk/android/message/creating-messages/create-face-message", + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createFaceMessage"], + "sdkMethods": [ + "createFileMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createFaceMessage"], + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-quote-message", - "targetPath": "/sdk/android/message/creating-messages/create-quote-message", + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createQuoteMessage"], + "sdkMethods": [ + "createFileMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createQuoteMessage"], + "evidence": [ + "MessageManager.createFileMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-forward-message", - "targetPath": "/sdk/android/message/creating-messages/create-forward-message", + "currentPath": "/sdk/android/message/creating-messages/create-card-message", + "targetPath": "/sdk/android/message/creating-messages/create-card-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createForwardMessage"], + "sdkMethods": [ + "createCardMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3319,28 +3965,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createForwardMessage"], + "evidence": [ + "MessageManager.createCardMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCardMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-merger-message", - "targetPath": "/sdk/android/message/creating-messages/create-merger-message", + "currentPath": "/sdk/android/message/creating-messages/create-location-message", + "targetPath": "/sdk/android/message/creating-messages/create-location-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createMergerMessage"], + "sdkMethods": [ + "createLocationMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3349,28 +4005,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createMergerMessage"], + "evidence": [ + "MessageManager.createLocationMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createLocationMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/sending-messages/send-message", - "targetPath": "/sdk/android/message/sending-messages/send-message", + "currentPath": "/sdk/android/message/creating-messages/create-face-message", + "targetPath": "/sdk/android/message/creating-messages/create-face-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["sendMessage"], + "sdkMethods": [ + "createFaceMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3379,152 +4045,164 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.sendMessage"], - "reason": null + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", - "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "currentPath": "/sdk/android/message/creating-messages/create-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-quote-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["sendMessageNotOss"], + "sdkMethods": [ + "createQuoteMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.sendMessageNotOss"], + "evidence": [ + "MessageManager.createQuoteMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createQuoteMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "currentPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "targetPath": "/sdk/android/message/creating-messages/create-advanced-text-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedTextMessage" ], - "sdkMethods": [], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["OnMsgSendCallback"], + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } - } - }, - "redirectTo": null - }, - { - "currentPath": "/sdk/android/message/receiving-messages/receive-messages", - "targetPath": "/sdk/android/message/receiving-messages/receive-messages", - "sourceKind": "openim-specific", - "disposition": "adapt", - "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" - ], - "sdkMethods": [], - "sdkEvents": ["onRecvOfflineNewMessage", "onRecvOnlineOnlyMessage"], - "locales": { - "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["OnAdvanceMsgListener"], + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], "reason": null } - }, - "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", - "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "currentPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedQuoteMessage" ], - "sdkMethods": ["setCustomBusinessListener"], - "sdkEvents": ["onRecvCustomBusinessMessage"], + "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ - "MessageManager.setCustomBusinessListener", - "OnCustomBusinessListener.onRecvCustomBusinessMessage" + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", - "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "currentPath": "/sdk/android/message/creating-messages/create-forward-message", + "targetPath": "/sdk/android/message/creating-messages/create-forward-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["getAdvancedHistoryMessageList"], + "sdkMethods": [ + "createForwardMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3533,28 +4211,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.getAdvancedHistoryMessageList"], + "evidence": [ + "MessageManager.createForwardMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createForwardMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "currentPath": "/sdk/android/message/creating-messages/create-merger-message", + "targetPath": "/sdk/android/message/creating-messages/create-merger-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["getAdvancedHistoryMessageListReverse"], + "sdkMethods": [ + "createMergerMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3563,28 +4251,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.getAdvancedHistoryMessageListReverse"], + "evidence": [ + "MessageManager.createMergerMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createMergerMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "currentPath": "/sdk/android/message/sending-messages/send-message", + "targetPath": "/sdk/android/message/sending-messages/send-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["findMessageList"], + "sdkMethods": [ + "sendMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3593,94 +4291,118 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.findMessageList"], + "evidence": [ + "MessageManager.sendMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/searching-messages/search-messages", - "targetPath": "/sdk/android/message/searching-messages/search-messages", + "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["searchLocalMessages"], + "sdkMethods": [ + "sendMessageNotOss" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.searchLocalMessages"], + "evidence": [ + "MessageManager.sendMessageNotOss" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessageNotOss" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/composing-messages/update-typing-status", - "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" ], - "sdkMethods": ["typingStatusUpdate"], - "sdkEvents": ["onConversationUserInputStatusChanged"], + "sdkMethods": [], + "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ - "MessageManager.typingStatusUpdate", - "OnConversationListener.onConversationUserInputStatusChanged" + "OnMsgSendCallback" ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnMsgSendCallback" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/delete-local-message", - "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "currentPath": "/sdk/android/message/receiving-messages/receive-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": [], + "sdkEvents": [ + "onRecvOfflineNewMessage", + "onRecvOnlineOnlyMessage" ], - "sdkMethods": ["deleteMessageFromLocalStorage"], - "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", @@ -3688,29 +4410,42 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteMessageFromLocalStorage"], + "evidence": [ + "OnAdvanceMsgListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnAdvanceMsgListener" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", - "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + ], + "sdkMethods": [ + "setCustomBusinessListener" + ], + "sdkEvents": [ + "onRecvCustomBusinessMessage" ], - "sdkMethods": ["deleteMessageFromLocalAndSvr"], - "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", @@ -3718,137 +4453,618 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteMessageFromLocalAndSvr"], + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", - "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["revokeMessageV2"], + "sdkMethods": [ + "getAdvancedHistoryMessageList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.revokeMessageV2"], + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/modify-a-message", - "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["modifyMessage"], + "sdkMethods": [ + "getAdvancedHistoryMessageListReverse" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.modifyMessage"], + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", - "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["getConversationPinnedMsgs"], + "sdkMethods": [ + "findMessageList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.getConversationPinnedMsgs"], + "evidence": [ + "MessageManager.findMessageList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.findMessageList" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", - "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "currentPath": "/sdk/android/message/retrieving-messages/load-message-context", + "targetPath": "/sdk/android/message/retrieving-messages/load-message-context", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/Messages.java" + ], + "sdkMethods": [ + "fetchSurroundingMessages" ], - "sdkMethods": ["setConversationPinnedMsg"], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.setConversationPinnedMsg"], + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } - } - }, + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/searching-messages/search-messages", + "targetPath": "/sdk/android/message/searching-messages/search-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "searchLocalMessages" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.searchLocalMessages" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.searchLocalMessages" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/update-typing-status", + "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + ], + "sdkMethods": [ + "changeInputState" + ], + "sdkEvents": [ + "onConversationUserInputStatusChanged" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/get-typing-status", + "targetPath": "/sdk/android/message/composing-messages/get-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "getInputState" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-local-message", + "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteMessageFromLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessageFromLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessageFromLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteMessages" + ], + "sdkEvents": [ + "onMsgDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-user-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-user-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/DeleteUserAllMsgsListenerMsg.java" + ], + "sdkMethods": [ + "deleteUserAllMessagesInConv" + ], + "sdkEvents": [ + "onDeleteUserAllMsgsInConv" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", + "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "revokeMessageV2" + ], + "sdkEvents": [ + "onRecvMessageRevokedV2" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/modify-a-message", + "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "modifyMessage" + ], + "sdkEvents": [ + "onMessageModified" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "getConversationPinnedMsgs" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", + "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "setConversationPinnedMsg" + ], + "sdkEvents": [ + "onChangedPinnedMsg" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + } + }, "redirectTo": null }, { @@ -3859,144 +5075,281 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["insertSingleMessageToLocalStorage"], + "sdkMethods": [ + "insertSingleMessageToLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "insertGroupMessageToLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertGroupMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertGroupMessageToLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteAllMsgFromLocal" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.insertSingleMessageToLocalStorage"], + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", - "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["insertGroupMessageToLocalStorage"], + "sdkMethods": [ + "deleteAllMsgFromLocalAndSvr" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.insertGroupMessageToLocalStorage"], + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["deleteAllMsgFromLocal"], + "sdkMethods": [ + "setMessageLocalEx" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteAllMsgFromLocal"], + "evidence": [ + "MessageManager.setMessageLocalEx" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setMessageLocalEx" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", - "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", + "currentPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "targetPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/GroupMessageReceipt.java" + ], + "sdkMethods": [ + "sendGroupMessageReadReceipt" + ], + "sdkEvents": [ + "onRecvGroupMessageReadReceipt" ], - "sdkMethods": ["deleteAllMsgFromLocalAndSvr"], - "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteAllMsgFromLocalAndSvr"], + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", - "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "currentPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "targetPath": "/sdk/android/message/managing-read-status/get-group-message-readers", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/GroupMembersInfo.java" + ], + "sdkMethods": [ + "getGroupMessageReaderList" ], - "sdkMethods": ["setMessageLocalEx"], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.setMessageLocalEx"], + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], + "reason": null + } } }, "redirectTo": null @@ -4016,18 +5369,28 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener"], + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener" + ], + "reason": null + } } }, "redirectTo": null @@ -4042,7 +5405,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/PutArgs.java" ], - "sdkMethods": ["uploadFile"], + "sdkMethods": [ + "uploadFile" + ], "sdkEvents": [], "locales": { "zh": { @@ -4051,15 +5416,27 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener", "PutArgs"], + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], + "reason": null + } } }, "redirectTo": null @@ -4088,10 +5465,14 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } } }, "redirectTo": null @@ -4105,7 +5486,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" ], - "sdkMethods": ["signalingInvite"], + "sdkMethods": [ + "signalingInvite" + ], "sdkEvents": [], "locales": { "zh": { @@ -4114,15 +5497,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingInvite", "SignalingInvitationInfo"], + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -4136,7 +5529,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" ], - "sdkMethods": ["signalingInviteInGroup"], + "sdkMethods": [ + "signalingInviteInGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -4145,15 +5540,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingInviteInGroup", "SignalingInvitationInfo"], + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -4166,7 +5571,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingAccept"], + "sdkMethods": [ + "signalingAccept" + ], "sdkEvents": [], "locales": { "zh": { @@ -4175,15 +5582,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingAccept"], + "evidence": [ + "SignalingManager.signalingAccept" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingAccept" + ], + "reason": null + } } }, "redirectTo": null @@ -4196,7 +5611,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingReject"], + "sdkMethods": [ + "signalingReject" + ], "sdkEvents": [], "locales": { "zh": { @@ -4205,15 +5622,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingReject"], + "evidence": [ + "SignalingManager.signalingReject" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingReject" + ], + "reason": null + } } }, "redirectTo": null @@ -4226,7 +5651,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingCancel"], + "sdkMethods": [ + "signalingCancel" + ], "sdkEvents": [], "locales": { "zh": { @@ -4235,15 +5662,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingCancel"], + "evidence": [ + "SignalingManager.signalingCancel" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingCancel" + ], + "reason": null + } } }, "redirectTo": null @@ -4256,7 +5691,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingHungUp"], + "sdkMethods": [ + "signalingHungUp" + ], "sdkEvents": [], "locales": { "zh": { @@ -4265,15 +5702,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingHungUp"], + "evidence": [ + "SignalingManager.signalingHungUp" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingHungUp" + ], + "reason": null + } } }, "redirectTo": null @@ -4288,7 +5733,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_SignalingListener.java" ], - "sdkMethods": ["setSignalingListener"], + "sdkMethods": [ + "setSignalingListener" + ], "sdkEvents": [ "onHangup", "onInvitationCancelled", @@ -4309,15 +5756,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.setSignalingListener", "_SignalingListener"], + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], + "reason": null + } } }, "redirectTo": null @@ -4330,7 +5787,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["getSignalingInvitationInfoStartApp"], + "sdkMethods": [ + "getSignalingInvitationInfoStartApp" + ], "sdkEvents": [], "locales": { "zh": { @@ -4339,15 +5798,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.getSignalingInvitationInfoStartApp"], + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], + "reason": null + } } }, "redirectTo": null @@ -4361,7 +5828,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RoomCallingInfo.java" ], - "sdkMethods": ["signalingGetRoomByGroupID"], + "sdkMethods": [ + "signalingGetRoomByGroupID" + ], "sdkEvents": [], "locales": { "zh": { @@ -4370,15 +5839,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingGetRoomByGroupID", "RoomCallingInfo"], + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -4392,7 +5871,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" ], - "sdkMethods": ["signalingGetTokenByRoomID"], + "sdkMethods": [ + "signalingGetTokenByRoomID" + ], "sdkEvents": [], "locales": { "zh": { @@ -4401,15 +5882,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingGetTokenByRoomID", "SignalingCertificate"], + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], + "reason": null + } } }, "redirectTo": null @@ -4424,8 +5915,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/CustomSignalingInfo.java" ], - "sdkMethods": ["signalingSendCustomSignal"], - "sdkEvents": ["onReceiveCustomSignal"], + "sdkMethods": [ + "signalingSendCustomSignal" + ], + "sdkEvents": [ + "onReceiveCustomSignal" + ], "locales": { "zh": { "reviewStatus": "published", @@ -4433,15 +5928,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingSendCustomSignal", "OnSignalingListener.onReceiveCustomSignal"], + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], + "reason": null + } } }, "redirectTo": null @@ -4470,15 +5975,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["ConversationManager.setOnConversationListener", "OnConversationListener"], + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], + "reason": null + } } }, "redirectTo": null @@ -4494,7 +6009,10 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LogLevel.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/utils/ParamsUtil.java" ], - "sdkMethods": ["logs", "uploadLogs"], + "sdkMethods": [ + "logs", + "uploadLogs" + ], "sdkEvents": [], "locales": { "zh": { @@ -4503,15 +6021,29 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["OpenIMClient.logs", "OpenIMClient.uploadLogs", "InitConfig", "LogLevel"], + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], + "reason": null + } } }, "redirectTo": null diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json index 49d8fbb708..e75bc1a784 100644 --- a/data/structure/android-navigation-labels.json +++ b/data/structure/android-navigation-labels.json @@ -26,7 +26,7 @@ "get-users-info": "获取指定用户资料", "Get the current user profile": "获取当前用户资料", "get-self-local-user-info": "获取当前用户资料", - "Update the current user profile": "更新当前用户资料", + "Update your profile": "更新当前用户资料", "set-self-info": "更新当前用户资料", "Set global message reception": "设置全局消息接收方式", "set-global-message-reception": "设置全局消息接收方式", @@ -88,6 +88,8 @@ "Get subscribed user online status": "查询已订阅用户状态", "Refresh subscribed user status": "查询已订阅用户状态", "get-subscribe-online-users-status": "查询已订阅用户状态", + "Unsubscribe from user status": "取消用户状态订阅", + "unsubscribe-users-online-status": "取消用户状态订阅", "Conversation": "会话", "conversation": "会话", "Conversation overview": "会话概览", @@ -144,24 +146,24 @@ "profile-and-settings": "群资料与设置", "Create a group": "创建群组", "create-group": "创建群组", - "Update group profile": "更新群资料", - "update-group-profile": "更新群资料", - "Publish a group announcement": "发布群公告", - "set-group-announcement": "发布群公告", - "Set group extra data": "设置群扩展字段", - "set-group-extension": "设置群扩展字段", - "Group permissions": "群权限", - "permissions": "群权限", + "Update group profile": "更新群名称、简介和头像", + "update-group-profile": "更新群名称、简介和头像", + "Publish a group announcement": "发布或更新群公告", + "set-group-announcement": "发布或更新群公告", + "Set group extra data": "设置群组扩展字段", + "set-group-extension": "设置群组扩展字段", + "Group permissions": "群权限与管理", + "permissions": "群权限与管理", "Set group join verification": "设置入群验证方式", "set-group-join-verification": "设置入群验证方式", "Set member profile access": "设置成员资料查看权限", "set-group-member-profile-access": "设置成员资料查看权限", - "Set member friend request permission": "设置成员好友申请权限", - "set-group-member-friend-permission": "设置成员好友申请权限", - "Change group mute status": "设置全员禁言", - "change-group-mute": "设置全员禁言", - "Joining and leaving groups": "加入与退出群组", - "joining-and-leaving": "加入与退出群组", + "Set member friend request permission": "设置群内添加好友权限", + "set-group-member-friend-permission": "设置群内添加好友权限", + "Change group mute status": "设置群组全员禁言", + "change-group-mute": "设置群组全员禁言", + "Joining and leaving groups": "加入、退出与解散群组", + "joining-and-leaving": "加入、退出与解散群组", "Apply to join a group": "申请加入群组", "join-group": "申请加入群组", "Leave a group": "退出群组", @@ -170,58 +172,58 @@ "dismiss-group": "解散群组", "Retrieving groups": "查询群组", "retrieving-groups": "查询群组", - "Get group information": "获取群资料", - "get-specified-groups-info": "获取群资料", + "Get group information": "查询指定群组资料", + "get-specified-groups-info": "查询指定群组资料", "Get joined groups by page": "分页获取已加入群组", "get-joined-group-list-page": "分页获取已加入群组", - "Check group membership": "检查是否加入群组", - "is-join-group": "检查是否加入群组", + "Check group membership": "检查是否已加入群组", + "is-join-group": "检查是否已加入群组", "Search groups": "搜索群组", "search-groups": "搜索群组", - "Group applications": "群申请", - "group-applications": "群申请", - "Group applications overview": "群申请概览", - "overview-group-applications": "群申请概览", - "Get received group applications": "获取收到的群申请", - "get-group-application-list-as-recipient": "获取收到的群申请", - "Get sent group applications": "获取发出的群申请", - "get-group-application-list-as-applicant": "获取发出的群申请", - "Accept a group application": "同意群申请", - "accept-group-application": "同意群申请", - "Reject a group application": "拒绝群申请", - "refuse-group-application": "拒绝群申请", + "Group applications": "入群申请", + "group-applications": "入群申请", + "Group applications overview": "入群申请概览", + "overview-group-applications": "入群申请概览", + "Get received group applications": "获取收到的入群申请", + "get-group-application-list-as-recipient": "获取收到的入群申请", + "Get sent group applications": "获取发出的入群申请", + "get-group-application-list-as-applicant": "获取发出的入群申请", + "Accept a group application": "接受入群申请", + "accept-group-application": "接受入群申请", + "Reject a group application": "拒绝入群申请", + "refuse-group-application": "拒绝入群申请", "Retrieving group members": "查询群成员", "retrieving-group-members": "查询群成员", "Group member queries overview": "群成员查询概览", "overview-retrieving-group-members": "群成员查询概览", - "Get group members": "获取群成员列表", - "get-group-member-list": "获取群成员列表", - "Get group member profiles": "获取群成员资料", - "get-specified-group-members-info": "获取群成员资料", - "Check users in a group": "检查用户是否在群内", - "get-users-in-group": "检查用户是否在群内", + "Get group members": "分页查询群成员", + "get-group-member-list": "分页查询群成员", + "Get group member profiles": "查询指定群成员资料", + "get-specified-group-members-info": "查询指定群成员资料", + "Check users in a group": "查询用户入群状态", + "get-users-in-group": "查询用户入群状态", "Get group owners and admins": "获取群主和管理员", "get-group-member-owner-and-admin": "获取群主和管理员", "Search group members": "搜索群成员", "search-group-members": "搜索群成员", "Managing group members": "管理群成员", "managing-group-members": "管理群成员", - "Invite users to a group": "邀请用户入群", - "invite-user-to-group": "邀请用户入群", + "Invite users to a group": "邀请用户加入群组", + "invite-user-to-group": "邀请用户加入群组", "Remove group members": "移除群成员", "kick-group-member": "移除群成员", - "Update a group nickname": "更新群昵称", - "set-group-member-nickname": "更新群昵称", - "Manage group administrators": "管理群管理员", - "set-group-member-role-level": "管理群管理员", + "Update a group nickname": "修改群内昵称", + "set-group-member-nickname": "修改群内昵称", + "Manage group administrators": "设置管理员", + "set-group-member-role-level": "设置管理员", "Update a group member avatar": "更新群成员头像", "set-group-member-avatar": "更新群成员头像", "Set group member extra data": "设置群成员扩展字段", "set-group-member-extension": "设置群成员扩展字段", "Transfer group ownership": "转让群主", "transfer-group-owner": "转让群主", - "Mute or unmute a group member": "禁言或解除禁言群成员", - "change-group-member-mute": "禁言或解除禁言群成员", + "Mute or unmute a group member": "设置群成员禁言", + "change-group-member-mute": "设置群成员禁言", "Message": "消息", "message": "消息", "Message overview": "消息概览", @@ -234,30 +236,47 @@ "create-text-at-message": "创建 @ 消息", "Create a custom message": "创建自定义消息", "create-custom-message": "创建自定义消息", - "Create an image message from a file": "从文件创建图片消息", - "create-image-message-by-file": "从文件创建图片消息", - "Create an image message from a URL": "从 URL 创建图片消息", - "create-image-message-by-url": "从 URL 创建图片消息", - "Create an audio message from a file": "从文件创建音频消息", - "create-sound-message-by-file": "从文件创建音频消息", - "Create an audio message from a URL": "从 URL 创建音频消息", - "create-sound-message-by-url": "从 URL 创建音频消息", - "Create a video message from a file": "从文件创建视频消息", - "create-video-message-by-file": "从文件创建视频消息", - "Create a video message from a URL": "从 URL 创建视频消息", - "create-video-message-by-url": "从 URL 创建视频消息", - "Create a file message from a file": "从文件创建文件消息", - "create-file-message-by-file": "从文件创建文件消息", - "Create a file message from a URL": "从 URL 创建文件消息", - "create-file-message-by-url": "从 URL 创建文件消息", + "Create an image message": "创建图片消息", + "create-image-message": "创建图片消息", + "Create an image message from a file": "使用本地路径创建图片消息", + "Create an image message from a path": "使用本地路径创建图片消息", + "create-image-message-by-file": "使用本地路径创建图片消息", + "Create an image message from a URL": "使用 URL 创建图片消息", + "Create an image message from URLs": "使用 URL 创建图片消息", + "create-image-message-by-url": "使用 URL 创建图片消息", + "Create an audio message": "创建音频消息", + "create-sound-message": "创建音频消息", + "Create an audio message from a file": "使用本地路径创建音频消息", + "Create an audio message from a path": "使用本地路径创建音频消息", + "create-sound-message-by-file": "使用本地路径创建音频消息", + "Create an audio message from a URL": "使用 URL 创建音频消息", + "create-sound-message-by-url": "使用 URL 创建音频消息", + "Create a video message": "创建视频消息", + "create-video-message": "创建视频消息", + "Create a video message from a file": "使用本地路径创建视频消息", + "Create a video message from a path": "使用本地路径创建视频消息", + "create-video-message-by-file": "使用本地路径创建视频消息", + "Create a video message from a URL": "使用 URL 创建视频消息", + "create-video-message-by-url": "使用 URL 创建视频消息", + "Create a file message": "创建文件消息", + "create-file-message": "创建文件消息", + "Create a file message from a file": "使用本地路径创建文件消息", + "Create a file message from a path": "使用本地路径创建文件消息", + "create-file-message-by-file": "使用本地路径创建文件消息", + "Create a file message from a URL": "使用 URL 创建文件消息", + "create-file-message-by-url": "使用 URL 创建文件消息", "Create a contact card message": "创建名片消息", "create-card-message": "创建名片消息", "Create a location message": "创建位置消息", "create-location-message": "创建位置消息", "Create an emoji message": "创建表情消息", "create-face-message": "创建表情消息", - "Create a reply message": "创建引用消息", - "create-quote-message": "创建引用消息", + "Create a reply message": "创建回复消息", + "create-quote-message": "创建回复消息", + "Create rich text": "创建富文本消息", + "create-advanced-text-message": "创建富文本消息", + "Create a rich reply": "创建富文本回复", + "create-advanced-quote-message": "创建富文本回复", "Create a forwarded message": "创建转发消息", "create-forward-message": "创建转发消息", "Create a merged message": "创建合并消息", @@ -266,10 +285,10 @@ "sending-messages": "发送消息", "Send a message": "发送消息", "send-message": "发送消息", - "Send a message without OSS": "发送非 OSS 消息", - "send-message-not-oss": "发送非 OSS 消息", - "Track message sending progress": "跟踪消息发送进度", - "set-msg-send-progress-listener": "跟踪消息发送进度", + "Send a message without OSS": "发送不经 OSS 的消息", + "send-message-not-oss": "发送不经 OSS 的消息", + "Track message sending progress": "监听消息发送进度", + "set-msg-send-progress-listener": "监听消息发送进度", "Receiving messages": "接收消息", "receiving-messages": "接收消息", "Receive messages": "接收消息", @@ -278,60 +297,77 @@ "receive-custom-business-messages": "接收自定义业务消息", "Retrieving messages": "查询消息", "retrieving-messages": "查询消息", - "Load older messages": "加载更早消息", - "load-older-messages": "加载更早消息", - "Load newer messages": "加载更新消息", - "load-newer-messages": "加载更新消息", - "Find messages by ID": "按 ID 查询消息", - "find-messages-by-id": "按 ID 查询消息", + "Load older messages": "加载历史消息", + "load-older-messages": "加载历史消息", + "Load newer messages": "反向加载历史消息", + "load-newer-messages": "反向加载历史消息", + "Find messages by ID": "按 ID 查找消息", + "find-messages-by-id": "按 ID 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", "Search messages": "搜索消息", "search-messages": "搜索消息", "Composing messages": "编辑消息", "composing-messages": "编辑消息", - "Update typing status": "更新输入状态", - "update-typing-status": "更新输入状态", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", "Managing messages": "管理消息", "managing-messages": "管理消息", "Delete a local message": "删除本地消息", "delete-local-message": "删除本地消息", - "Delete saved messages": "删除已保存消息", - "delete-saved-messages": "删除已保存消息", + "Delete a message": "批量删除消息", + "Delete a saved message": "批量删除消息", + "Delete saved messages": "批量删除消息", + "Delete messages in a batch": "批量删除消息", + "delete-saved-messages": "批量删除消息", + "Delete messages from a user": "删除群聊中指定用户的全部消息", + "Delete all messages from a user in a group chat": "删除群聊中指定用户的全部消息", + "delete-user-messages": "删除群聊中指定用户的全部消息", "Revoke a message": "撤回消息", "revoke-a-message": "撤回消息", "Modify a message": "修改消息", "modify-a-message": "修改消息", - "View pinned messages": "查看置顶消息", - "get-pinned-messages": "查看置顶消息", + "View pinned messages": "查询会话置顶消息", + "get-pinned-messages": "查询会话置顶消息", "Pin or unpin a message": "置顶或取消置顶消息", "set-message-pinned": "置顶或取消置顶消息", "Insert a local direct message": "插入本地单聊消息", "insert-local-single-message": "插入本地单聊消息", "Insert a local group message": "插入本地群聊消息", "insert-local-group-message": "插入本地群聊消息", - "Clear all local messages": "清空全部本地消息", - "clear-all-local-messages": "清空全部本地消息", - "Clear all saved messages": "清空全部已保存消息", - "clear-all-messages": "清空全部已保存消息", - "Set local message extensions": "设置消息本地扩展字段", - "set-message-local-ex": "设置消息本地扩展字段", + "Clear all local messages": "清理全部本地消息", + "clear-all-local-messages": "清理全部本地消息", + "Clear all saved messages": "清理全部消息", + "clear-all-messages": "清理全部消息", + "Set local message extensions": "设置消息本地扩展", + "set-message-local-ex": "设置消息本地扩展", + "Group message read status": "群消息已读状态", + "group-message-read-status": "群消息已读状态", + "Send group read receipts": "上报群消息已读", + "Report group messages as read": "上报群消息已读", + "send-group-read-receipts": "上报群消息已读", + "View group message readers": "查询群消息已读成员", + "Get members who read a group message": "查询群消息已读成员", + "get-group-message-readers": "查询群消息已读成员", "Create an @ message": "创建 @ 消息", - "Create a video message from files": "从文件创建视频消息", - "Create a video message from URLs": "从 URL 创建视频消息", + "Create a video message from files": "使用本地路径创建视频消息", + "Create a video message from URLs": "使用 URL 创建视频消息", "Create a merged forward message": "创建合并转发消息", - "Send an uploaded media message": "发送已上传媒体消息", + "Send an uploaded media message": "发送不经 OSS 的消息", "Load message history": "加载历史消息", - "Load message history in reverse": "逆序加载历史消息", + "Load message history in reverse": "反向加载历史消息", "Report typing status": "上报输入状态", - "Delete messages in a batch": "批量删除消息", - "Get pinned messages in a conversation": "获取会话置顶消息", + "Get pinned messages in a conversation": "查询会话置顶消息", "Insert a local one-to-one message": "插入本地单聊消息", "Insert a local group message": "插入本地群聊消息", - "Clear local and server messages": "清空本地和服务端消息", - "Set a local message extension": "设置消息本地扩展字段", + "Clear local and server messages": "清理全部消息", + "Set a local message extension": "设置消息本地扩展", "File uploads": "文件上传", "file-uploads": "文件上传", - "Track file upload progress": "跟踪文件上传进度", - "track-file-upload-progress": "跟踪文件上传进度", + "Track file upload progress": "监听文件上传进度", + "track-file-upload-progress": "监听文件上传进度", "Upload a file": "上传文件", "upload-file": "上传文件", "Calling": "音视频通话", diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json index 004995928a..c1cef64e32 100644 --- a/data/structure/android-sidebar.json +++ b/data/structure/android-sidebar.json @@ -44,6 +44,10 @@ { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", "navigationTitle": "Refresh subscribed user status" + }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "navigationTitle": "Unsubscribe from user status" } ] } @@ -407,18 +411,54 @@ "/sdk/android/message/creating-messages/create-text-message", "/sdk/android/message/creating-messages/create-text-at-message", "/sdk/android/message/creating-messages/create-custom-message", - "/sdk/android/message/creating-messages/create-image-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "navigationTitle": "Create an image message" + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "navigationTitle": "Create an image message from a path" + }, "/sdk/android/message/creating-messages/create-image-message-by-url", - "/sdk/android/message/creating-messages/create-sound-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "navigationTitle": "Create an audio message" + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "navigationTitle": "Create an audio message from a path" + }, "/sdk/android/message/creating-messages/create-sound-message-by-url", - "/sdk/android/message/creating-messages/create-video-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "navigationTitle": "Create a video message" + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "navigationTitle": "Create a video message from a path" + }, "/sdk/android/message/creating-messages/create-video-message-by-url", - "/sdk/android/message/creating-messages/create-file-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "navigationTitle": "Create a file message" + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "navigationTitle": "Create a file message from a path" + }, "/sdk/android/message/creating-messages/create-file-message-by-url", "/sdk/android/message/creating-messages/create-card-message", "/sdk/android/message/creating-messages/create-location-message", "/sdk/android/message/creating-messages/create-face-message", "/sdk/android/message/creating-messages/create-quote-message", + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "navigationTitle": "Create rich text" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "navigationTitle": "Create a rich reply" + }, "/sdk/android/message/creating-messages/create-forward-message", "/sdk/android/message/creating-messages/create-merger-message" ] @@ -444,16 +484,40 @@ "/sdk/android/message/retrieving-messages/load-older-messages", "/sdk/android/message/retrieving-messages/load-newer-messages", "/sdk/android/message/retrieving-messages/find-messages-by-id", + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "navigationTitle": "Load message context" + }, "/sdk/android/message/searching-messages/search-messages" ] }, - "/sdk/android/message/composing-messages/update-typing-status", + { + "id": "message/composing-messages", + "title": "Composing messages", + "children": [ + { + "path": "/sdk/android/message/composing-messages/update-typing-status", + "navigationTitle": "Update typing status" + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "navigationTitle": "Get typing status" + } + ] + }, { "id": "message/managing-messages", "title": "Managing messages", "children": [ "/sdk/android/message/managing-messages/delete-local-message", - "/sdk/android/message/managing-messages/delete-saved-messages", + { + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "navigationTitle": "Delete saved messages" + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "navigationTitle": "Delete messages from a user" + }, "/sdk/android/message/managing-messages/revoke-a-message", "/sdk/android/message/managing-messages/modify-a-message", "/sdk/android/message/managing-messages/get-pinned-messages", @@ -464,6 +528,20 @@ "/sdk/android/message/managing-messages/clear-all-messages", "/sdk/android/message/managing-messages/set-message-local-ex" ] + }, + { + "id": "message/group-message-read-status", + "title": "Group message read status", + "children": [ + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "navigationTitle": "Send group read receipts" + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "navigationTitle": "View group message readers" + } + ] } ] }, diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index 2b10d016a0..6f008d9aa2 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1,6547 +1,6643 @@ [ { - "sourcePath": "/sdk/ios/overview", - "openimPath": "/sdk/ios/overview", - "title": "OpenIM SDK for iOS", - "context": "chat/sdk/ios", + "sourcePath": "/platform-api/overview", + "openimPath": "/platform-api/overview", + "title": "Overview", + "context": "chat/platform-api", "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/overview.mdx" + "contentFile": "content/docs/chat/platform-api/overview.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/before-you-start", - "openimPath": "/sdk/ios/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx" + "sourcePath": "/platform-api/prepare-to-use-api", + "openimPath": "/platform-api/prepare-to-use-api", + "title": "Prepare to use the API", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/prepare-to-use-api.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", - "openimPath": "/sdk/ios/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx" + "sourcePath": "/platform-api/user/overview", + "openimPath": "/platform-api/user/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/user/overview.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/ios/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx" + "sourcePath": "/platform-api/user/listing-users/list-users", + "openimPath": "/platform-api/user/listing-users/list-users", + "title": "List users", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/list-users.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/send-first-message", - "openimPath": "/sdk/ios/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx" + "sourcePath": "/platform-api/user/listing-users/list-all-user-ids", + "openimPath": "/platform-api/user/listing-users/list-all-user-ids", + "title": "List all user IDs", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/list-all-user-ids.mdx" }, { - "sourcePath": "/sdk/ios/user/overview-user", - "openimPath": "/sdk/ios/user/overview-user", - "title": "Overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx" + "sourcePath": "/platform-api/user/listing-users/check-user-accounts", + "openimPath": "/platform-api/user/listing-users/check-user-accounts", + "title": "Check user accounts", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/check-user-accounts.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", - "openimPath": "/sdk/ios/user/retrieving-users/retrieve-users", - "title": "Retrieve users", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx" + "sourcePath": "/platform-api/user/listing-users/get-a-user", + "openimPath": "/platform-api/user/listing-users/get-a-user", + "title": "Get a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/get-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", - "title": "View your profile", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx" + "sourcePath": "/platform-api/user/creating-users/create-a-user", + "openimPath": "/platform-api/user/creating-users/create-a-user", + "title": "Create a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/creating-users/create-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", - "title": "Update your profile", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" + "sourcePath": "/platform-api/user/managing-users/update-a-user", + "openimPath": "/platform-api/user/managing-users/update-a-user", + "title": "Update a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/managing-users/update-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" + "sourcePath": "/platform-api/user/presence/get-users-online-status", + "openimPath": "/platform-api/user/presence/get-users-online-status", + "title": "Get users' online status", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-status.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", - "title": "Subscribe to user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "sourcePath": "/platform-api/user/presence/get-users-online-token-detail", + "openimPath": "/platform-api/user/presence/get-users-online-token-detail", + "title": "Get users online token details", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-token-detail.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "title": "Refresh subscribed user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" + "sourcePath": "/platform-api/user/notification-accounts/add-notification-account", + "openimPath": "/platform-api/user/notification-accounts/add-notification-account", + "title": "Add a notification account", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/add-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "title": "Unsubscribe from user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" + "sourcePath": "/platform-api/user/notification-accounts/update-notification-account", + "openimPath": "/platform-api/user/notification-accounts/update-notification-account", + "title": "Update a notification account", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/update-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", - "openimPath": "/sdk/ios/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx" + "sourcePath": "/platform-api/user/notification-accounts/search-notification-account", + "openimPath": "/platform-api/user/notification-accounts/search-notification-account", + "title": "Search notification accounts", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/search-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/search-friends", - "openimPath": "/sdk/ios/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx" + "sourcePath": "/platform-api/relation/overview", + "openimPath": "/platform-api/relation/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/relation/overview.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", - "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", + "openimPath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", + "title": "Apply to add a friend", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/apply-to-add-friend.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/check-friend", - "openimPath": "/sdk/ios/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", + "openimPath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", + "title": "Respond to a friend request", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/respond-friend-apply.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/update-friends", - "openimPath": "/sdk/ios/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", + "title": "List received friend requests", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-received-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/delete-friend", - "openimPath": "/sdk/ios/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", + "title": "List sent friend requests", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-sent-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/add-friend", - "openimPath": "/sdk/ios/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx" + "sourcePath": "/platform-api/relation/listing-friends/list-friends", + "openimPath": "/platform-api/relation/listing-friends/list-friends", + "title": "List friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/listing-friends/list-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "sourcePath": "/platform-api/relation/listing-friends/get-designated-friends", + "openimPath": "/platform-api/relation/listing-friends/get-designated-friends", + "title": "Get designated friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/listing-friends/get-designated-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "sourcePath": "/platform-api/relation/managing-friends/delete-friend", + "openimPath": "/platform-api/relation/managing-friends/delete-friend", + "title": "Delete a friend", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx" + "sourcePath": "/platform-api/error-codes", + "openimPath": "/platform-api/error-codes", + "title": "Error codes", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/error-codes.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/ios/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" + "sourcePath": "/platform-api/relation/managing-friends/import-friends", + "openimPath": "/platform-api/relation/managing-friends/import-friends", + "title": "Import friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/import-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/ios/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx" + "sourcePath": "/platform-api/relation/managing-friends/update-friends", + "openimPath": "/platform-api/relation/managing-friends/update-friends", + "title": "Update friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/update-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", - "openimPath": "/sdk/ios/user/friend-applications/delete-friend-requests", - "title": "Delete friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx" + "sourcePath": "/platform-api/relation/blacklist/add-black", + "openimPath": "/platform-api/relation/blacklist/add-black", + "title": "Add to blacklist", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/add-black.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "sourcePath": "/platform-api/relation/blacklist/list-blacks", + "openimPath": "/platform-api/relation/blacklist/list-blacks", + "title": "List blacklisted users", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/list-blacks.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", - "openimPath": "/sdk/ios/user/moderating-a-user/block-user", - "title": "Block a user", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx" + "sourcePath": "/platform-api/relation/blacklist/remove-black", + "openimPath": "/platform-api/relation/blacklist/remove-black", + "title": "Remove from blacklist", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/remove-black.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", - "openimPath": "/sdk/ios/user/moderating-a-user/unblock-user", - "title": "Unblock a user", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx" + "sourcePath": "/platform-api/group/overview", + "openimPath": "/platform-api/group/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/group/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/overview-conversation", - "openimPath": "/sdk/ios/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx" + "sourcePath": "/platform-api/group/managing-groups/create-group", + "openimPath": "/platform-api/group/managing-groups/create-group", + "title": "Create group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/create-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "sourcePath": "/platform-api/group/managing-groups/set-group-info-ex", + "openimPath": "/platform-api/group/managing-groups/set-group-info-ex", + "title": "Set group info extension", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/set-group-info-ex.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx" + "sourcePath": "/platform-api/group/group-applications/join-group", + "openimPath": "/platform-api/group/group-applications/join-group", + "title": "Join group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/join-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "sourcePath": "/platform-api/group/group-membership/quit-group", + "openimPath": "/platform-api/group/group-membership/quit-group", + "title": "Quit group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-membership/quit-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "sourcePath": "/platform-api/group/group-applications/respond-group-application", + "openimPath": "/platform-api/group/group-applications/respond-group-application", + "title": "Respond to a group application", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/respond-group-application.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/ios/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/platform-api/group/managing-groups/transfer-group-owner", + "openimPath": "/platform-api/group/managing-groups/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/platform-api/group/group-applications/list-received-group-applications", + "openimPath": "/platform-api/group/group-applications/list-received-group-applications", + "title": "List received group applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-received-group-applications.mdx" + }, + { + "sourcePath": "/platform-api/group/group-applications/list-user-requested-group-applications", + "openimPath": "/platform-api/group/group-applications/list-user-requested-group-applications", + "title": "List user requested group applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-user-requested-group-applications.mdx" + }, + { + "sourcePath": "/platform-api/group/group-applications/list-group-users-request-applications", + "openimPath": "/platform-api/group/group-applications/list-group-users-request-applications", + "title": "List group users request applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-group-users-request-applications.mdx" + }, + { + "sourcePath": "/platform-api/group/group-applications/get-specified-user-group-request-info", + "openimPath": "/platform-api/group/group-applications/get-specified-user-group-request-info", + "title": "Get specified user group request info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/get-specified-user-group-request-info.mdx" + }, + { + "sourcePath": "/platform-api/group/managing-groups/get-groups-info", + "openimPath": "/platform-api/group/managing-groups/get-groups-info", + "title": "Get groups info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/get-groups-info.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/kick-group-members", + "openimPath": "/platform-api/group/group-members/kick-group-members", + "title": "Kick group members", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/kick-group-members.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/get-group-members-info", + "openimPath": "/platform-api/group/group-members/get-group-members-info", + "title": "Get group members info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-members-info.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/get-group-member-list", + "openimPath": "/platform-api/group/group-members/get-group-member-list", + "title": "Get group member list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-member-list.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/invite-users-to-group", + "openimPath": "/platform-api/group/group-members/invite-users-to-group", + "title": "Invite users to group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/invite-users-to-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-membership/get-joined-group-list", + "openimPath": "/platform-api/group/group-membership/get-joined-group-list", + "title": "Get joined group list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-membership/get-joined-group-list.mdx" + }, + { + "sourcePath": "/platform-api/group/managing-groups/dismiss-group", + "openimPath": "/platform-api/group/managing-groups/dismiss-group", + "title": "Dismiss group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/dismiss-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/mute-group-member", + "openimPath": "/platform-api/group/group-moderation/mute-group-member", + "title": "Mute group member", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group-member.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group-member", + "openimPath": "/platform-api/group/group-moderation/cancel-mute-group-member", + "title": "Cancel mute group member", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group-member.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/mute-group", + "openimPath": "/platform-api/group/group-moderation/mute-group", + "title": "Mute group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group", + "openimPath": "/platform-api/group/group-moderation/cancel-mute-group", + "title": "Cancel mute group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/set-group-member-info", + "openimPath": "/platform-api/group/group-members/set-group-member-info", + "title": "Set group member info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/set-group-member-info.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx" + "sourcePath": "/platform-api/auth/overview", + "openimPath": "/platform-api/auth/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/auth/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", - "title": "Set message reception", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/platform-api/auth/tokens/get-admin-token", + "openimPath": "/platform-api/auth/tokens/get-admin-token", + "title": "Get an administrator token", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/tokens/get-admin-token.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/platform-api/auth/tokens/get-user-token", + "openimPath": "/platform-api/auth/tokens/get-user-token", + "title": "Get a user token", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/tokens/get-user-token.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx" + "sourcePath": "/platform-api/auth/sessions/force-logout", + "openimPath": "/platform-api/auth/sessions/force-logout", + "title": "Force logout", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/sessions/force-logout.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx" + "sourcePath": "/platform-api/message/overview", + "openimPath": "/platform-api/message/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/message/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-private-chat", - "title": "Set private chat", - "context": "chat/sdk/ios", + "sourcePath": "/platform-api/message/message-content-types", + "openimPath": "/platform-api/message/message-content-types", + "title": "Message content types", + "context": "chat/platform-api", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx" + "contentFile": "content/docs/chat/platform-api/message/message-content-types.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/platform-api/message/sending-messages/send-msg", + "openimPath": "/platform-api/message/sending-messages/send-msg", + "title": "Send a message", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-msg.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/platform-api/message/sending-messages/batch-send-msg", + "openimPath": "/platform-api/message/sending-messages/batch-send-msg", + "title": "Batch send messages", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/batch-send-msg.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", - "title": "Set server message deletion period", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx" + "sourcePath": "/platform-api/message/sending-messages/send-business-notification", + "openimPath": "/platform-api/message/sending-messages/send-business-notification", + "title": "Send a business notification", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-business-notification.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" + "sourcePath": "/platform-api/message/managing-messages/revoke-msg", + "openimPath": "/platform-api/message/managing-messages/revoke-msg", + "title": "Revoke a message", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/managing-messages/revoke-msg.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "sourcePath": "/platform-api/message/retrieving-messages/get-server-time", + "openimPath": "/platform-api/message/retrieving-messages/get-server-time", + "title": "Get server time", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/retrieving-messages/get-server-time.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx" + "sourcePath": "/platform-api/conversation/overview", + "openimPath": "/platform-api/conversation/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/conversation/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", - "openimPath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", - "title": "Hide all conversations", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", + "openimPath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", + "title": "Get sorted conversation list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-sorted-conversation-list.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-conversation", + "openimPath": "/platform-api/conversation/listing-conversations/get-conversation", + "title": "Get conversation", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "title": "Open_im_sdkCreateConversationGroup", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-conversations", + "openimPath": "/platform-api/conversation/listing-conversations/get-conversations", + "title": "Get conversations", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversations.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", - "title": "Open_im_sdkGetConversationGroups", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "sourcePath": "/platform-api/conversation/managing-conversations/set-conversations", + "openimPath": "/platform-api/conversation/managing-conversations/set-conversations", + "title": "Set conversations", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/managing-conversations/set-conversations.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "Open_im_sdkGetConversationGroupInfoWithConversations", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-owner-conversation", + "openimPath": "/platform-api/conversation/listing-conversations/get-owner-conversation", + "title": "Get owner conversation", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-owner-conversation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "Open_im_sdkGetConversationGroupByConversationID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "sourcePath": "/platform-api/migration-to-openim", + "openimPath": "/platform-api/migration-to-openim", + "title": "Migrate to OpenIM", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/migration-to-openim.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", - "title": "Open_im_sdkUpdateConversationGroup", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx" + "sourcePath": "/platform-api/logs/overview", + "openimPath": "/platform-api/logs/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/logs/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "Open_im_sdkSetConversationGroupOrder", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "sourcePath": "/platform-api/logs/upload-logs", + "openimPath": "/platform-api/logs/upload-logs", + "title": "Upload log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/upload-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "Open_im_sdkAddConversationsToGroups", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "sourcePath": "/platform-api/logs/search-logs", + "openimPath": "/platform-api/logs/search-logs", + "title": "Search log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/search-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "Open_im_sdkRemoveConversationsFromGroups", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "sourcePath": "/platform-api/logs/delete-logs", + "openimPath": "/platform-api/logs/delete-logs", + "title": "Delete log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/delete-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", - "title": "Open_im_sdkDeleteConversationGroup", + "sourcePath": "/sdk/ios/overview", + "openimPath": "/sdk/ios/overview", + "title": "OpenIM SDK for iOS", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/overview.mdx" }, { - "sourcePath": "/sdk/ios/group/overview-group", - "openimPath": "/sdk/ios/group/overview-group", - "title": "Group overview", + "sourcePath": "/sdk/ios/getting-started/before-you-start", + "openimPath": "/sdk/ios/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/ios/group/create-group", - "openimPath": "/sdk/ios/group/create-group", - "title": "Create a group", + "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", + "openimPath": "/sdk/ios/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/ios/group/update-group-profile", - "openimPath": "/sdk/ios/group/update-group-profile", - "title": "Update group profile", + "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/ios/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-announcement", - "openimPath": "/sdk/ios/group/set-group-announcement", - "title": "Publish a group announcement", + "sourcePath": "/sdk/ios/getting-started/send-first-message", + "openimPath": "/sdk/ios/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-extension", - "openimPath": "/sdk/ios/group/set-group-extension", - "title": "Set group extra data", + "sourcePath": "/sdk/ios/user/overview-user", + "openimPath": "/sdk/ios/user/overview-user", + "title": "Overview", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-join-verification", - "openimPath": "/sdk/ios/group/set-group-join-verification", - "title": "Set group join verification", + "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", + "openimPath": "/sdk/ios/user/retrieving-users/retrieve-users", + "title": "Retrieve users", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-member-profile-access", - "openimPath": "/sdk/ios/group/set-group-member-profile-access", - "title": "Set member profile access", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", + "title": "View your profile", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", - "openimPath": "/sdk/ios/group/set-group-member-friend-permission", - "title": "Set member friend request permission", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", + "title": "Update your profile", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/change-group-mute", - "openimPath": "/sdk/ios/group/change-group-mute", - "title": "Change group mute status", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/ios/group/join-group", - "openimPath": "/sdk/ios/group/join-group", - "title": "Apply to join a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", + "title": "Subscribe to user status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/quit-group", - "openimPath": "/sdk/ios/group/quit-group", - "title": "Leave a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "title": "Refresh subscribed user status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/dismiss-group", - "openimPath": "/sdk/ios/group/dismiss-group", - "title": "Dismiss a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", + "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", + "openimPath": "/sdk/ios/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", + "sourcePath": "/sdk/ios/user/friends/search-friends", + "openimPath": "/sdk/ios/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", + "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/ios/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/ios/user/friends/check-friend", + "openimPath": "/sdk/ios/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", - "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/ios/user/friends/update-friends", + "openimPath": "/sdk/ios/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", - "openimPath": "/sdk/ios/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/ios/user/friends/delete-friend", + "openimPath": "/sdk/ios/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/ios/user/friend-applications/add-friend", + "openimPath": "/sdk/ios/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", - "openimPath": "/sdk/ios/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", - "openimPath": "/sdk/ios/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/ios/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", - "openimPath": "/sdk/ios/group/group-applications/delete-group-requests", - "title": "Delete group applications", + "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/ios/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", + "openimPath": "/sdk/ios/user/friend-applications/delete-friend-requests", + "title": "Delete friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "openimPath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "title": "Retrieve a list of blocked users", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", + "openimPath": "/sdk/ios/user/moderating-a-user/block-user", + "title": "Block a user", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", + "openimPath": "/sdk/ios/user/moderating-a-user/unblock-user", + "title": "Unblock a user", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/ios/conversation/overview-conversation", + "openimPath": "/sdk/ios/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/ios/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/ios/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/ios/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/ios/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/ios/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", + "title": "Set message reception", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/ios/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/ios/message/overview-message", - "openimPath": "/sdk/ios/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-private-chat", + "title": "Set private chat", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-at-all-message", - "title": "Create an @all message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", - "openimPath": "/sdk/ios/message/creating-messages/create-at-all-flag", - "title": "Create an @all marker", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", - "openimPath": "/sdk/ios/message/creating-messages/get-at-all-tag", - "title": "Get the @all tag", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", + "title": "Set server message deletion period", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", - "openimPath": "/sdk/ios/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", - "title": "Create an image message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", - "title": "Create an audio message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", + "openimPath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", + "title": "Hide all conversations", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", - "title": "Create a video message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", + "title": "Open_im_sdkCreateConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", + "title": "Open_im_sdkGetConversationGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", - "title": "Create a file message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "Open_im_sdkGetConversationGroupInfoWithConversations", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "Open_im_sdkGetConversationGroupByConversationID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", - "openimPath": "/sdk/ios/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", + "title": "Open_im_sdkUpdateConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", - "openimPath": "/sdk/ios/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "Open_im_sdkSetConversationGroupOrder", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", - "openimPath": "/sdk/ios/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "Open_im_sdkAddConversationsToGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", - "openimPath": "/sdk/ios/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "Open_im_sdkRemoveConversationsFromGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", - "openimPath": "/sdk/ios/message/creating-messages/create-advanced-text-message", - "title": "Create rich text", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", + "title": "Open_im_sdkDeleteConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", - "openimPath": "/sdk/ios/message/creating-messages/create-markdown-message", - "title": "Create a Markdown message", + "sourcePath": "/sdk/ios/group/overview-group", + "openimPath": "/sdk/ios/group/overview-group", + "title": "Group overview", + "context": "chat/sdk/ios", + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx" + }, + { + "sourcePath": "/sdk/ios/group/create-group", + "openimPath": "/sdk/ios/group/create-group", + "title": "Create a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", - "openimPath": "/sdk/ios/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/ios/group/update-group-profile", + "openimPath": "/sdk/ios/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", - "openimPath": "/sdk/ios/message/creating-messages/create-merge-message", - "title": "Create a merged message", + "sourcePath": "/sdk/ios/group/set-group-announcement", + "openimPath": "/sdk/ios/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/ios/message/sending-messages/send-message", - "openimPath": "/sdk/ios/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/ios/group/set-group-extension", + "openimPath": "/sdk/ios/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/ios/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/ios/group/set-group-join-verification", + "openimPath": "/sdk/ios/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", - "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/ios/group/set-group-member-profile-access", + "openimPath": "/sdk/ios/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", - "openimPath": "/sdk/ios/message/receiving-messages/custom-business-listener", - "title": "Receive custom business messages", + "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", + "openimPath": "/sdk/ios/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/ios/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/ios/group/change-group-mute", + "openimPath": "/sdk/ios/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/ios/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/ios/group/join-group", + "openimPath": "/sdk/ios/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/ios/group/quit-group", + "openimPath": "/sdk/ios/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", - "openimPath": "/sdk/ios/message/retrieving-messages/load-message-context", - "title": "Load message context", + "sourcePath": "/sdk/ios/group/dismiss-group", + "openimPath": "/sdk/ios/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/ios/message/searching-messages/search-messages", - "openimPath": "/sdk/ios/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", - "openimPath": "/sdk/ios/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", - "openimPath": "/sdk/ios/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/ios/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/ios/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", + "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/ios/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", + "openimPath": "/sdk/ios/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", - "openimPath": "/sdk/ios/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", - "openimPath": "/sdk/ios/message/managing-messages/delete-saved-message", - "title": "Delete a saved message", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/ios/message/managing-messages/delete-saved-messages", - "title": "Delete saved messages", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", - "openimPath": "/sdk/ios/message/managing-messages/delete-user-messages", - "title": "Delete messages from a user", + "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", + "openimPath": "/sdk/ios/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", + "openimPath": "/sdk/ios/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", - "openimPath": "/sdk/ios/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", + "openimPath": "/sdk/ios/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/ios/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/ios/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/ios/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/ios/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/ios/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/ios/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/ios/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/ios/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/ios/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "openimPath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "title": "View group message readers", + "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/ios/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "openimPath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "title": "Send group read receipts", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/ios/file-uploads/upload-file", - "openimPath": "/sdk/ios/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/ios/calling/overview-calling", - "openimPath": "/sdk/ios/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", - "openimPath": "/sdk/ios/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", - "openimPath": "/sdk/ios/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/ios/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", - "openimPath": "/sdk/ios/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/ios/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", - "openimPath": "/sdk/ios/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/ios/message/overview-message", + "openimPath": "/sdk/ios/message/overview-message", + "title": "Overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", - "openimPath": "/sdk/ios/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-message", + "title": "Create a text message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/ios/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-at-message", + "title": "Create a mention message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/ios/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-at-all-message", + "title": "Create an @all message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", + "openimPath": "/sdk/ios/message/creating-messages/create-at-all-flag", + "title": "Create an @all marker", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", + "openimPath": "/sdk/ios/message/creating-messages/get-at-all-tag", + "title": "Get the @all tag", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", + "openimPath": "/sdk/ios/message/creating-messages/create-custom-message", + "title": "Create a custom message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", + "title": "Create an image message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/ios/events/overview-events", - "openimPath": "/sdk/ios/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/ios/logger", - "openimPath": "/sdk/ios/logger", - "title": "Logger", + "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", + "title": "Create an audio message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/logger.mdx" - }, - { - "sourcePath": "/sdk/android/overview", - "openimPath": "/sdk/android/overview", - "title": "OpenIM Android SDK overview", - "context": "chat/sdk/android", - "template": "overview", - "contentFile": "content/docs/chat/sdk/android/overview.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/android/getting-started/before-you-start", - "openimPath": "/sdk/android/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", - "openimPath": "/sdk/android/getting-started/environment-specific-implementation", - "title": "Integrate for Android", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", + "title": "Create a video message from a path", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/getting-started/send-first-message", - "openimPath": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", + "title": "Create a file message from a path", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/android/user/overview-user", - "openimPath": "/sdk/android/user/overview-user", - "title": "User overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/get-users-info", - "openimPath": "/sdk/android/user/user-profile/get-users-info", - "title": "Get specified user profiles", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", + "openimPath": "/sdk/ios/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", - "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", - "title": "Get the current user profile", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", + "openimPath": "/sdk/ios/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/set-self-info", - "openimPath": "/sdk/android/user/user-profile/set-self-info", - "title": "Update the current user profile", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", + "openimPath": "/sdk/ios/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", - "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", + "openimPath": "/sdk/ios/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", - "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", - "title": "Subscribe to user online status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/ios/message/creating-messages/create-advanced-text-message", + "title": "Create rich text", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", - "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", - "title": "Get subscribed user online status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", + "openimPath": "/sdk/ios/message/creating-messages/create-markdown-message", + "title": "Create a Markdown message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/get-friend-list-page", - "openimPath": "/sdk/android/user/friends/get-friend-list-page", - "title": "Get the friend list by page", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", + "openimPath": "/sdk/ios/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/search-friends", - "openimPath": "/sdk/android/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", + "openimPath": "/sdk/ios/message/creating-messages/create-merge-message", + "title": "Create a merged message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/get-friends-info", - "openimPath": "/sdk/android/user/friends/get-friends-info", - "title": "Get specified friend profiles", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/sending-messages/send-message", + "openimPath": "/sdk/ios/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/check-friend", - "openimPath": "/sdk/android/user/friends/check-friend", - "title": "Check friendship", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/ios/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/android/user/friends/update-friends", - "openimPath": "/sdk/android/user/friends/update-friends", - "title": "Update friend profiles", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", + "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/android/user/friends/delete-friend", - "openimPath": "/sdk/android/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", + "openimPath": "/sdk/ios/message/receiving-messages/custom-business-listener", + "title": "Receive custom business messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/add-friend", - "openimPath": "/sdk/android/user/friend-applications/add-friend", - "title": "Send a friend request", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/ios/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", - "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", - "title": "Get received friend requests", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/ios/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", - "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", - "title": "Get sent friend requests", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", - "title": "Accept a friend request", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/ios/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", - "title": "Reject a friend request", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/searching-messages/search-messages", + "openimPath": "/sdk/ios/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/android/user/blacklist/get-blacklist", - "openimPath": "/sdk/android/user/blacklist/get-blacklist", - "title": "Get the blacklist", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", + "openimPath": "/sdk/ios/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/android/user/blacklist/add-blacklist", - "openimPath": "/sdk/android/user/blacklist/add-blacklist", - "title": "Block a user", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", + "openimPath": "/sdk/ios/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", - "openimPath": "/sdk/android/user/blacklist/remove-blacklist", - "title": "Unblock a user", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/ios/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/sdk/android/conversation/overview-conversation", - "openimPath": "/sdk/android/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/ios/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", + "openimPath": "/sdk/ios/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", + "openimPath": "/sdk/ios/message/managing-messages/delete-saved-message", + "title": "Delete a saved message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Get the conversation list", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/ios/message/managing-messages/delete-saved-messages", + "title": "Delete saved messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/ios/message/managing-messages/delete-user-messages", + "title": "Delete messages from a user", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", + "openimPath": "/sdk/ios/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/ios/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/ios/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/ios/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/ios/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/ios", + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" + }, + { + "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/ios/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/ios/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/ios/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "title": "View group message readers", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "title": "Send group read receipts", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/file-uploads/upload-file", + "openimPath": "/sdk/ios/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/overview-calling", + "openimPath": "/sdk/ios/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/android/group/overview-group", - "openimPath": "/sdk/android/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", + "openimPath": "/sdk/ios/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/android/group/create-group", - "openimPath": "/sdk/android/group/create-group", - "title": "Create a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", + "openimPath": "/sdk/ios/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/android/group/update-group-profile", - "openimPath": "/sdk/android/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", + "openimPath": "/sdk/ios/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-announcement", - "openimPath": "/sdk/android/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", + "openimPath": "/sdk/ios/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-extension", - "openimPath": "/sdk/android/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", + "openimPath": "/sdk/ios/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-join-verification", - "openimPath": "/sdk/android/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/ios/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-member-profile-access", - "openimPath": "/sdk/android/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/ios/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-member-friend-permission", - "openimPath": "/sdk/android/group/set-group-member-friend-permission", - "title": "Set member friend request permission", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/android/group/change-group-mute", - "openimPath": "/sdk/android/group/change-group-mute", - "title": "Change group mute status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/android/group/join-group", - "openimPath": "/sdk/android/group/join-group", - "title": "Apply to join a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/android/group/quit-group", - "openimPath": "/sdk/android/group/quit-group", - "title": "Leave a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/android/group/dismiss-group", - "openimPath": "/sdk/android/group/dismiss-group", - "title": "Dismiss a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/events/overview-events", + "openimPath": "/sdk/ios/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/logger", + "openimPath": "/sdk/ios/logger", + "title": "Logger", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/logger.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/android/overview", + "openimPath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", "context": "chat/sdk/android", - "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/android/overview.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/android/getting-started/before-you-start", + "openimPath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", - "openimPath": "/sdk/android/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "openimPath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "openimPath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/android/getting-started/send-first-message", + "openimPath": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/android/user/overview-user", + "openimPath": "/sdk/android/user/overview-user", + "title": "User overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/accept-group-application", - "openimPath": "/sdk/android/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "openimPath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", - "openimPath": "/sdk/android/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "openimPath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update your profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "List group members", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get specified group member profiles", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "Check group membership", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get the group owner and administrators", + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "openimPath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/android/user/friends/search-friends", + "openimPath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "openimPath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "Update a member’s group nickname", + "sourcePath": "/sdk/android/user/friends/check-friend", + "openimPath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/android/user/friends/update-friends", + "openimPath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member’s avatar", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "openimPath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", - "title": "Set a group member extension", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "openimPath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", - "title": "Transfer group ownership", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/overview-message", - "openimPath": "/sdk/android/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-text-message", - "openimPath": "/sdk/android/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", - "title": "Create an @ message", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "openimPath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", - "openimPath": "/sdk/android/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "openimPath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "openimPath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "openimPath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from files", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from URLs", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-card-message", - "openimPath": "/sdk/android/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-location-message", - "openimPath": "/sdk/android/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-face-message", - "openimPath": "/sdk/android/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", - "openimPath": "/sdk/android/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", - "openimPath": "/sdk/android/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", - "openimPath": "/sdk/android/message/creating-messages/create-merger-message", - "title": "Create a merged forward message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" }, - { - "sourcePath": "/sdk/android/message/sending-messages/send-message", - "openimPath": "/sdk/android/message/sending-messages/send-message", - "title": "Send a message", + { + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "Send an uploaded media message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "title": "Track message sending progress", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", - "openimPath": "/sdk/android/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", - "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", - "title": "Receive custom business messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "Load message history", + "sourcePath": "/sdk/android/group/overview-group", + "openimPath": "/sdk/android/group/overview-group", + "title": "Group overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "Load message history in reverse", + "sourcePath": "/sdk/android/group/create-group", + "openimPath": "/sdk/android/group/create-group", + "title": "Create a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/android/group/update-group-profile", + "openimPath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/android/message/searching-messages/search-messages", - "openimPath": "/sdk/android/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/android/group/set-group-announcement", + "openimPath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", - "openimPath": "/sdk/android/message/composing-messages/update-typing-status", - "title": "Report typing status", + "sourcePath": "/sdk/android/group/set-group-extension", + "openimPath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", - "openimPath": "/sdk/android/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "openimPath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", - "title": "Delete messages in a batch", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "openimPath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "openimPath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", - "openimPath": "/sdk/android/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/android/group/change-group-mute", + "openimPath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "Get pinned messages in a conversation", + "sourcePath": "/sdk/android/group/join-group", + "openimPath": "/sdk/android/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/android/group/quit-group", + "openimPath": "/sdk/android/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", - "title": "Insert a local one-to-one message", + "sourcePath": "/sdk/android/group/dismiss-group", + "openimPath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "Clear local and server messages", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "Set a local message extension", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "openimPath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "Track file upload progress", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "openimPath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/android/file-uploads/upload-file", - "openimPath": "/sdk/android/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/android/calling/overview-calling", - "openimPath": "/sdk/android/calling/overview-calling", - "title": "Audio and video calling overview", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", - "openimPath": "/sdk/android/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "openimPath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", - "openimPath": "/sdk/android/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "openimPath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/accept-call", - "openimPath": "/sdk/android/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/reject-call", - "openimPath": "/sdk/android/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", - "openimPath": "/sdk/android/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", - "title": "End a call", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending call invitation", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get a call room token", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/android/events/overview-events", - "openimPath": "/sdk/android/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/android/logger", - "openimPath": "/sdk/android/logger", - "title": "Logger", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/logger.mdx" - }, - { - "sourcePath": "/sdk/flutter/overview", - "openimPath": "/sdk/flutter/overview", - "title": "OpenIM SDK for Flutter", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/overview.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/before-you-start", - "openimPath": "/sdk/flutter/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", - "openimPath": "/sdk/flutter/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/flutter/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/send-first-message", - "openimPath": "/sdk/flutter/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/overview-message", + "openimPath": "/sdk/android/message/overview-message", + "title": "Message overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/overview-user", - "openimPath": "/sdk/flutter/user/overview-user", - "title": "Overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", - "openimPath": "/sdk/flutter/user/retrieving-users/retrieve-users", - "title": "Retrieve users", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", - "title": "View your profile", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "openimPath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", - "title": "Update your profile", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "openimPath": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a local path", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", - "title": "Subscribe to user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from URLs", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "title": "Refresh subscribed user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "title": "Unsubscribe from user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", - "openimPath": "/sdk/flutter/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/search-friends", - "openimPath": "/sdk/flutter/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "openimPath": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/get-friends-info", - "openimPath": "/sdk/flutter/user/friends/get-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from local paths", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/check-friend", - "openimPath": "/sdk/flutter/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/update-friends", - "openimPath": "/sdk/flutter/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "openimPath": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/delete-friend", - "openimPath": "/sdk/flutter/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", - "openimPath": "/sdk/flutter/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "openimPath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "openimPath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "openimPath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/flutter/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/flutter/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", - "openimPath": "/sdk/flutter/user/moderating-a-user/block-user", - "title": "Block a user", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "openimPath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", - "openimPath": "/sdk/flutter/user/moderating-a-user/unblock-user", - "title": "Unblock a user", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "openimPath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/overview-conversation", - "openimPath": "/sdk/flutter/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "openimPath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "openimPath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "openimPath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "openimPath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "openimPath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "openimPath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", - "title": "createConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", - "title": "getConversationGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "getConversationGroupInfoWithConversations", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "getConversationGroupByConversationID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", - "title": "updateConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "setConversationGroupOrder", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "addConversationsToGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "removeConversationsFromGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", - "title": "deleteConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "openimPath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/flutter/group/overview-group", - "openimPath": "/sdk/flutter/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/overview-calling", + "openimPath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/flutter/group/create-group", - "openimPath": "/sdk/flutter/group/create-group", - "title": "Create a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "openimPath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx" - }, - { - "sourcePath": "/sdk/flutter/group/update-group-profile", - "openimPath": "/sdk/flutter/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-announcement", - "openimPath": "/sdk/flutter/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "openimPath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-extension", - "openimPath": "/sdk/flutter/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "openimPath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-join-verification", - "openimPath": "/sdk/flutter/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "openimPath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", - "openimPath": "/sdk/flutter/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "openimPath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", - "openimPath": "/sdk/flutter/group/set-group-member-friend-permission", - "title": "Set member friend request permission", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/change-group-mute", - "openimPath": "/sdk/flutter/group/change-group-mute", - "title": "Change group mute status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/flutter/group/join-group", - "openimPath": "/sdk/flutter/group/join-group", - "title": "Apply to join a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/flutter/group/quit-group", - "openimPath": "/sdk/flutter/group/quit-group", - "title": "Leave a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/flutter/group/dismiss-group", - "openimPath": "/sdk/flutter/group/dismiss-group", - "title": "Dismiss a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/events/overview-events", + "openimPath": "/sdk/android/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/logger", + "openimPath": "/sdk/android/logger", + "title": "Logging", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/logger.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/flutter/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/flutter/overview", + "openimPath": "/sdk/flutter/overview", + "title": "OpenIM SDK for Flutter", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/overview.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", - "openimPath": "/sdk/flutter/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/flutter/getting-started/before-you-start", + "openimPath": "/sdk/flutter/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", - "openimPath": "/sdk/flutter/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", + "openimPath": "/sdk/flutter/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/flutter/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/flutter/getting-started/send-first-message", + "openimPath": "/sdk/flutter/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/flutter/user/overview-user", + "openimPath": "/sdk/flutter/user/overview-user", + "title": "Overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", - "openimPath": "/sdk/flutter/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", + "openimPath": "/sdk/flutter/user/retrieving-users/retrieve-users", + "title": "Retrieve users", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", - "openimPath": "/sdk/flutter/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", + "title": "View your profile", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", + "title": "Update your profile", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", + "title": "Subscribe to user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "title": "Refresh subscribed user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/flutter/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", + "openimPath": "/sdk/flutter/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/flutter/user/friends/search-friends", + "openimPath": "/sdk/flutter/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/flutter/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/flutter/user/friends/get-friends-info", + "openimPath": "/sdk/flutter/user/friends/get-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/flutter/user/friends/check-friend", + "openimPath": "/sdk/flutter/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/flutter/user/friends/update-friends", + "openimPath": "/sdk/flutter/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/flutter/user/friends/delete-friend", + "openimPath": "/sdk/flutter/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", + "openimPath": "/sdk/flutter/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/flutter/message/overview-message", - "openimPath": "/sdk/flutter/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/flutter/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/flutter/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "openimPath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "title": "Retrieve a list of blocked users", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message", - "title": "Create an image message", + "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", + "openimPath": "/sdk/flutter/user/moderating-a-user/block-user", + "title": "Block a user", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", - "title": "Create an image message from a path", + "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", + "openimPath": "/sdk/flutter/user/moderating-a-user/unblock-user", + "title": "Unblock a user", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/flutter/conversation/overview-conversation", + "openimPath": "/sdk/flutter/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message", - "title": "Create an audio message", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", - "title": "Create an audio message from a path", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message", - "title": "Create a video message", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", - "title": "Create a video message from a path", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message", - "title": "Create a file message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", - "title": "Create a file message from a path", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", - "title": "Create rich text", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", - "title": "Create a rich reply", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-merger-message", - "title": "Create a merged message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/send-message", - "openimPath": "/sdk/flutter/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/flutter/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", + "title": "createConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", - "openimPath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", - "title": "Track message sending progress", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", + "title": "getConversationGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", - "openimPath": "/sdk/flutter/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "getConversationGroupInfoWithConversations", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", - "openimPath": "/sdk/flutter/message/receiving-messages/custom-business-listener", - "title": "Receive custom business messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "getConversationGroupByConversationID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/flutter/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", + "title": "updateConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "setConversationGroupOrder", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", - "openimPath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", - "title": "Locate messages by ID", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "addConversationsToGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", - "openimPath": "/sdk/flutter/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "removeConversationsFromGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", - "openimPath": "/sdk/flutter/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", + "title": "deleteConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", - "openimPath": "/sdk/flutter/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/flutter/group/overview-group", + "openimPath": "/sdk/flutter/group/overview-group", + "title": "Group overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/flutter/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/flutter/group/create-group", + "openimPath": "/sdk/flutter/group/create-group", + "title": "Create a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/flutter/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/flutter/group/update-group-profile", + "openimPath": "/sdk/flutter/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/flutter/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/flutter/group/set-group-announcement", + "openimPath": "/sdk/flutter/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", - "openimPath": "/sdk/flutter/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/flutter/group/set-group-extension", + "openimPath": "/sdk/flutter/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", - "openimPath": "/sdk/flutter/message/managing-messages/delete-saved-message", - "title": "Delete a saved message", + "sourcePath": "/sdk/flutter/group/set-group-join-verification", + "openimPath": "/sdk/flutter/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/flutter/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", + "openimPath": "/sdk/flutter/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", - "openimPath": "/sdk/flutter/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", + "openimPath": "/sdk/flutter/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/flutter/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/flutter/group/change-group-mute", + "openimPath": "/sdk/flutter/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/flutter/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/flutter/group/join-group", + "openimPath": "/sdk/flutter/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/flutter/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/flutter/group/quit-group", + "openimPath": "/sdk/flutter/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/flutter/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/flutter/group/dismiss-group", + "openimPath": "/sdk/flutter/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/flutter/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/flutter/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", - "openimPath": "/sdk/flutter/file-uploads/set-upload-file-listener", - "title": "Track file upload progress", + "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/flutter/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/flutter/file-uploads/upload-file", - "openimPath": "/sdk/flutter/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", + "openimPath": "/sdk/flutter/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/flutter/calling/overview-calling", - "openimPath": "/sdk/flutter/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", + "openimPath": "/sdk/flutter/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", - "openimPath": "/sdk/flutter/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", - "openimPath": "/sdk/flutter/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", - "openimPath": "/sdk/flutter/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", - "openimPath": "/sdk/flutter/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", + "openimPath": "/sdk/flutter/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", - "openimPath": "/sdk/flutter/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", + "openimPath": "/sdk/flutter/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/flutter/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/flutter/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/flutter/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/flutter/events/overview-events", - "openimPath": "/sdk/flutter/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/flutter/logger", - "openimPath": "/sdk/flutter/logger", - "title": "Logger", + "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/flutter/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/logger.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/uniapp/overview", - "openimPath": "/sdk/uniapp/overview", - "title": "OpenIM SDK for uni-app", - "context": "chat/sdk/uniapp", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/uniapp/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/electron/overview", - "openimPath": "/sdk/electron/overview", - "title": "OpenIM SDK for Electron", - "context": "chat/sdk/electron", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/electron/overview.mdx" - }, - { - "sourcePath": "/sdk/electron/getting-started/authenticate-and-init", - "openimPath": "/sdk/electron/getting-started/authenticate-and-init", - "title": "Authenticate and init", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/getting-started/authenticate-and-init.mdx" - }, - { - "sourcePath": "/sdk/electron/message/create-media-from-full-path", - "openimPath": "/sdk/electron/message/create-media-from-full-path", - "title": "Create media from full path", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/message/create-media-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/electron/logger/upload-logs", - "openimPath": "/sdk/electron/logger/upload-logs", - "title": "Upload logs", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/logger/upload-logs.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/flutter", + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/miniprogram/overview", - "openimPath": "/sdk/miniprogram/overview", - "title": "OpenIM SDK for Mini Program", - "context": "chat/sdk/miniprogram", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/miniprogram/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/react-native/overview", - "openimPath": "/sdk/react-native/overview", - "title": "OpenIM SDK for React Native", - "context": "chat/sdk/react-native", - "template": "overview", - "contentFile": "content/docs/chat/sdk/react-native/overview.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/wasm/overview", - "openimPath": "/sdk/wasm/overview", - "title": "OpenIM SDK for WASM", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/overview.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/before-you-start", - "openimPath": "/sdk/wasm/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/overview-message", + "openimPath": "/sdk/flutter/message/overview-message", + "title": "Overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/environment-specific-implementation", - "openimPath": "/sdk/wasm/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/wasm/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/send-first-message", - "openimPath": "/sdk/wasm/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/overview-user", - "openimPath": "/sdk/wasm/user/overview-user", - "title": "User overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message", + "title": "Create an image message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/get-users-info", - "openimPath": "/sdk/wasm/user/profile/get-users-info", - "title": "Get user profiles", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", + "title": "Create an image message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-users-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/get-self-user-info", - "openimPath": "/sdk/wasm/user/profile/get-self-user-info", - "title": "Get your profile", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-self-user-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-self-info", - "openimPath": "/sdk/wasm/user/profile/set-self-info", - "title": "Update your profile", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-self-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-global-message-reception", - "openimPath": "/sdk/wasm/user/profile/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-global-message-reception.mdx" + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", + "title": "Create an audio message from a path", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/subscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/subscribe-users-status", - "title": "Subscribe to online status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/subscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/get-subscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/get-subscribe-users-status", - "title": "Get subscribed user status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message", + "title": "Create a video message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/get-subscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/unsubscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/unsubscribe-users-status", - "title": "Unsubscribe from online status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", + "title": "Create a video message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/unsubscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/get-friend-list-page", - "openimPath": "/sdk/wasm/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/search-friends", - "openimPath": "/sdk/wasm/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message", + "title": "Create a file message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/get-specified-friends-info", - "openimPath": "/sdk/wasm/user/friends/get-specified-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", + "title": "Create a file message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-specified-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/check-friend", - "openimPath": "/sdk/wasm/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/update-friends", - "openimPath": "/sdk/wasm/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/delete-friend", - "openimPath": "/sdk/wasm/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/add-friend", - "openimPath": "/sdk/wasm/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", + "title": "Create rich text", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich reply", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/wasm/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/wasm/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/delete-friend-requests", - "openimPath": "/sdk/wasm/user/friend-applications/delete-friend-requests", - "title": "Delete friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/send-message", + "openimPath": "/sdk/flutter/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/delete-friend-requests.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/get-black-list", - "openimPath": "/sdk/wasm/user/blacklist/get-black-list", - "title": "Get the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/flutter/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/get-black-list.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/add-black", - "openimPath": "/sdk/wasm/user/blacklist/add-black", - "title": "Add a user to the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/add-black.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/remove-black", - "openimPath": "/sdk/wasm/user/blacklist/remove-black", - "title": "Remove a user from the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", + "openimPath": "/sdk/flutter/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/remove-black.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/overview-conversation", - "openimPath": "/sdk/wasm/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", + "openimPath": "/sdk/flutter/message/receiving-messages/custom-business-listener", + "title": "Receive custom business messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/flutter/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", + "openimPath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", + "title": "Locate messages by ID", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", + "openimPath": "/sdk/flutter/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", + "openimPath": "/sdk/flutter/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", - "title": "Mark or unmark a conversation", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", + "openimPath": "/sdk/flutter/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", - "title": "Set a conversation remark", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-remark.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/flutter/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/flutter/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/flutter/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", + "openimPath": "/sdk/flutter/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", + "openimPath": "/sdk/flutter/message/managing-messages/delete-saved-message", + "title": "Delete a saved message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/flutter/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", + "openimPath": "/sdk/flutter/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/flutter/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/flutter/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/flutter/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/flutter/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", - "title": "Delete a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/flutter/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/flutter/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", - "title": "Clear all local conversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", + "openimPath": "/sdk/flutter/file-uploads/set-upload-file-listener", + "title": "Track file upload progress", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-local-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/file-uploads/upload-file", + "openimPath": "/sdk/flutter/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", - "title": "createConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/overview-calling", + "openimPath": "/sdk/flutter/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", - "title": "getConversationGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", + "openimPath": "/sdk/flutter/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "getConversationGroupInfoWithConversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", + "openimPath": "/sdk/flutter/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "getConversationGroupIDsByConversationID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", + "openimPath": "/sdk/flutter/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", - "title": "updateConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", + "openimPath": "/sdk/flutter/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "setConversationGroupOrder", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", + "openimPath": "/sdk/flutter/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "addConversationsToGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/flutter/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "removeConversationsFromGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/flutter/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", - "title": "deleteConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/wasm/group/overview-group", - "openimPath": "/sdk/wasm/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/wasm/group/create-group", - "openimPath": "/sdk/wasm/group/create-group", - "title": "Create a group", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/create-group.mdx" - }, - { - "sourcePath": "/sdk/wasm/group/update-group-profile", - "openimPath": "/sdk/wasm/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-announcement", - "openimPath": "/sdk/wasm/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-announcement.mdx" + "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-extension", - "openimPath": "/sdk/wasm/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-extension.mdx" + "sourcePath": "/sdk/flutter/events/overview-events", + "openimPath": "/sdk/flutter/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-join-verification", - "openimPath": "/sdk/wasm/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-join-verification.mdx" + "sourcePath": "/sdk/flutter/logger", + "openimPath": "/sdk/flutter/logger", + "title": "Logger", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/logger.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-member-profile-access", - "openimPath": "/sdk/wasm/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/uniapp/overview", + "openimPath": "/sdk/uniapp/overview", + "title": "OpenIM SDK for uni-app", + "context": "chat/sdk/uniapp", "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-profile-access.mdx" + "contentFile": "content/docs/chat/sdk/uniapp/overview.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-member-friend-permission", - "openimPath": "/sdk/wasm/group/set-group-member-friend-permission", - "title": "Set member friend request permission", + "sourcePath": "/sdk/wasm/overview", + "openimPath": "/sdk/wasm/overview", + "title": "OpenIM SDK for WASM", "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-friend-permission.mdx" + "contentFile": "content/docs/chat/sdk/wasm/overview.mdx" }, { - "sourcePath": "/sdk/wasm/group/change-group-mute", - "openimPath": "/sdk/wasm/group/change-group-mute", - "title": "Change group mute status", + "sourcePath": "/sdk/wasm/getting-started/before-you-start", + "openimPath": "/sdk/wasm/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/wasm/group/join-group", - "openimPath": "/sdk/wasm/group/join-group", - "title": "Apply to join a group", + "sourcePath": "/sdk/wasm/getting-started/environment-specific-implementation", + "openimPath": "/sdk/wasm/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/wasm/group/quit-group", - "openimPath": "/sdk/wasm/group/quit-group", - "title": "Leave a group", + "sourcePath": "/sdk/wasm/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/wasm/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/wasm/group/dismiss-group", - "openimPath": "/sdk/wasm/group/dismiss-group", - "title": "Dismiss a group", + "sourcePath": "/sdk/wasm/getting-started/send-first-message", + "openimPath": "/sdk/wasm/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", + "sourcePath": "/sdk/wasm/user/overview-user", + "openimPath": "/sdk/wasm/user/overview-user", + "title": "User overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/overview-user.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", + "sourcePath": "/sdk/wasm/user/profile/get-users-info", + "openimPath": "/sdk/wasm/user/profile/get-users-info", + "title": "Get user profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/wasm/user/profile/get-self-user-info", + "openimPath": "/sdk/wasm/user/profile/get-self-user-info", + "title": "Get your profile", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-self-user-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/wasm/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/wasm/user/profile/set-self-info", + "openimPath": "/sdk/wasm/user/profile/set-self-info", + "title": "Update your profile", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/search-groups", - "openimPath": "/sdk/wasm/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/wasm/user/profile/set-global-message-reception", + "openimPath": "/sdk/wasm/user/profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/search-groups.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/wasm/user/online-status/subscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/subscribe-users-status", + "title": "Subscribe to online status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/subscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/wasm/user/online-status/get-subscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/get-subscribe-users-status", + "title": "Get subscribed user status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/get-subscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/wasm/user/online-status/unsubscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/unsubscribe-users-status", + "title": "Unsubscribe from online status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/unsubscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", - "title": "Get group application badge count", + "sourcePath": "/sdk/wasm/user/friends/get-friend-list-page", + "openimPath": "/sdk/wasm/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-badge-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", - "openimPath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", - "title": "Clear the group application badge", + "sourcePath": "/sdk/wasm/user/friends/search-friends", + "openimPath": "/sdk/wasm/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/clear-group-application-badge-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/accept-group-application", - "openimPath": "/sdk/wasm/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/wasm/user/friends/get-specified-friends-info", + "openimPath": "/sdk/wasm/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/refuse-group-application", - "openimPath": "/sdk/wasm/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/wasm/user/friends/check-friend", + "openimPath": "/sdk/wasm/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/delete-group-requests", - "openimPath": "/sdk/wasm/group/group-applications/delete-group-requests", - "title": "Delete group applications", + "sourcePath": "/sdk/wasm/user/friends/update-friends", + "openimPath": "/sdk/wasm/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/wasm/user/friends/delete-friend", + "openimPath": "/sdk/wasm/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/wasm/user/friend-applications/add-friend", + "openimPath": "/sdk/wasm/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/wasm/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/wasm/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/wasm/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/wasm/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/wasm/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/wasm/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/wasm/user/friend-applications/delete-friend-requests", + "openimPath": "/sdk/wasm/user/friend-applications/delete-friend-requests", + "title": "Delete friend applications", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-nickname.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/delete-friend-requests.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/wasm/user/blacklist/get-black-list", + "openimPath": "/sdk/wasm/user/blacklist/get-black-list", + "title": "Get the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-role-level.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/get-black-list.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/wasm/user/blacklist/add-black", + "openimPath": "/sdk/wasm/user/blacklist/add-black", + "title": "Add a user to the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/add-black.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/wasm/user/blacklist/remove-black", + "openimPath": "/sdk/wasm/user/blacklist/remove-black", + "title": "Remove a user from the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/remove-black.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/wasm/conversation/overview-conversation", + "openimPath": "/sdk/wasm/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/wasm/message/overview-message", - "openimPath": "/sdk/wasm/message/overview-message", - "title": "Message overview", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-text-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-custom-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-custom-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", + "title": "Mark or unmark a conversation", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", + "title": "Set a conversation remark", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-remark.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-card-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-card-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-location-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-location-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-face-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-quote-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-markdown-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-markdown-message", - "title": "Create a Markdown message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", + "title": "Delete a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-markdown-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-forward-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-merger-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-merger-message", - "title": "Create a merged message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/wasm/message/sending-messages/send-message", - "openimPath": "/sdk/wasm/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", + "title": "Clear all local conversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-local-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/wasm/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/receiving-messages/receive-messages", - "openimPath": "/sdk/wasm/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", + "title": "createConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", - "openimPath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", - "title": "Receive custom business messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", + "title": "getConversationGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-custom-business-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "getConversationGroupInfoWithConversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "getConversationGroupIDsByConversationID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", + "title": "updateConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-message-context", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-message-context", - "title": "Load message context", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "setConversationGroupOrder", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/wasm/message/searching-messages/search-messages", - "openimPath": "/sdk/wasm/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "addConversationsToGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/update-typing-status", - "openimPath": "/sdk/wasm/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "removeConversationsFromGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/get-typing-status", - "openimPath": "/sdk/wasm/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", + "title": "deleteConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/wasm/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/wasm/group/overview-group", + "openimPath": "/sdk/wasm/group/overview-group", + "title": "Group overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/overview-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/wasm/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/wasm/group/create-group", + "openimPath": "/sdk/wasm/group/create-group", + "title": "Create a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/create-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/wasm/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/wasm/group/update-group-profile", + "openimPath": "/sdk/wasm/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/save-local-transcript.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-local-message", - "openimPath": "/sdk/wasm/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/wasm/group/set-group-announcement", + "openimPath": "/sdk/wasm/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-local-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/wasm/message/managing-messages/delete-saved-messages", - "title": "Delete saved messages", + "sourcePath": "/sdk/wasm/group/set-group-extension", + "openimPath": "/sdk/wasm/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-saved-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-user-messages", - "openimPath": "/sdk/wasm/message/managing-messages/delete-user-messages", - "title": "Delete messages from a user", + "sourcePath": "/sdk/wasm/group/set-group-join-verification", + "openimPath": "/sdk/wasm/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-user-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/wasm/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/wasm/group/set-group-member-profile-access", + "openimPath": "/sdk/wasm/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/revoke-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/modify-a-message", - "openimPath": "/sdk/wasm/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/wasm/group/set-group-member-friend-permission", + "openimPath": "/sdk/wasm/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/modify-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/wasm/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/wasm/group/change-group-mute", + "openimPath": "/sdk/wasm/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/wasm/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/wasm/group/join-group", + "openimPath": "/sdk/wasm/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/join-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/wasm/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/wasm/group/quit-group", + "openimPath": "/sdk/wasm/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/quit-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/wasm/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/wasm/group/dismiss-group", + "openimPath": "/sdk/wasm/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/wasm/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/wasm/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", - "openimPath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", - "title": "View group message readers", + "sourcePath": "/sdk/wasm/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/wasm/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/get-group-message-readers.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", - "openimPath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", - "title": "Send group read receipts", + "sourcePath": "/sdk/wasm/group/retrieving-groups/search-groups", + "openimPath": "/sdk/wasm/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/wasm/file-uploads/upload-file", - "openimPath": "/sdk/wasm/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/wasm/calling/overview-calling", - "openimPath": "/sdk/wasm/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/start-single-call", - "openimPath": "/sdk/wasm/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/start-group-call", - "openimPath": "/sdk/wasm/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", + "title": "Get group application badge count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-badge-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/accept-call", - "openimPath": "/sdk/wasm/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", + "openimPath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", + "title": "Clear the group application badge", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/clear-group-application-badge-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/reject-call", - "openimPath": "/sdk/wasm/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/wasm/group/group-applications/accept-group-application", + "openimPath": "/sdk/wasm/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/cancel-call", - "openimPath": "/sdk/wasm/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/wasm/group/group-applications/refuse-group-application", + "openimPath": "/sdk/wasm/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/wasm/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/wasm/group/group-applications/delete-group-requests", + "openimPath": "/sdk/wasm/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/delete-group-requests.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/wasm/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/wasm/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/wasm/events/overview-events", - "openimPath": "/sdk/wasm/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/wasm/logger", - "openimPath": "/sdk/wasm/logger", - "title": "Logger", + "sourcePath": "/sdk/wasm/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/wasm/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/logger.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/platform-api/overview", - "openimPath": "/platform-api/overview", - "title": "Overview", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/overview.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/platform-api/prepare-to-use-api", - "openimPath": "/platform-api/prepare-to-use-api", - "title": "Prepare to use the API", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/prepare-to-use-api.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/platform-api/user/overview", - "openimPath": "/platform-api/user/overview", - "title": "Overview", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/user/overview.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/list-users", - "openimPath": "/platform-api/user/listing-users/list-users", - "title": "List users", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/list-users.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/wasm", + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/list-all-user-ids", - "openimPath": "/platform-api/user/listing-users/list-all-user-ids", - "title": "List all user IDs", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/list-all-user-ids.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/check-user-accounts", - "openimPath": "/platform-api/user/listing-users/check-user-accounts", - "title": "Check user accounts", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/check-user-accounts.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/get-a-user", - "openimPath": "/platform-api/user/listing-users/get-a-user", - "title": "Get a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/get-a-user.mdx" + "sourcePath": "/sdk/wasm/message/overview-message", + "openimPath": "/sdk/wasm/message/overview-message", + "title": "Message overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/overview-message.mdx" }, { - "sourcePath": "/platform-api/user/creating-users/create-a-user", - "openimPath": "/platform-api/user/creating-users/create-a-user", - "title": "Create a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/creating-users/create-a-user.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-text-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/platform-api/user/managing-users/update-a-user", - "openimPath": "/platform-api/user/managing-users/update-a-user", - "title": "Update a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/managing-users/update-a-user.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/platform-api/user/presence/get-users-online-status", - "openimPath": "/platform-api/user/presence/get-users-online-status", - "title": "Get users' online status", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-status.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-custom-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/platform-api/user/presence/get-users-online-token-detail", - "openimPath": "/platform-api/user/presence/get-users-online-token-detail", - "title": "Get users online token details", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-token-detail.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/add-notification-account", - "openimPath": "/platform-api/user/notification-accounts/add-notification-account", - "title": "Add a notification account", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/add-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/update-notification-account", - "openimPath": "/platform-api/user/notification-accounts/update-notification-account", - "title": "Update a notification account", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/update-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/search-notification-account", - "openimPath": "/platform-api/user/notification-accounts/search-notification-account", - "title": "Search notification accounts", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/search-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/overview", - "openimPath": "/platform-api/relation/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/relation/overview.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", - "openimPath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", - "title": "Apply to add a friend", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/apply-to-add-friend.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", - "openimPath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", - "title": "Respond to a friend request", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/respond-friend-apply.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", - "title": "List received friend requests", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-received-friend-requests.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", - "title": "List sent friend requests", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-sent-friend-requests.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-card-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/platform-api/relation/listing-friends/list-friends", - "openimPath": "/platform-api/relation/listing-friends/list-friends", - "title": "List friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/listing-friends/list-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-location-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/platform-api/relation/listing-friends/get-designated-friends", - "openimPath": "/platform-api/relation/listing-friends/get-designated-friends", - "title": "Get designated friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/listing-friends/get-designated-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-face-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/delete-friend", - "openimPath": "/platform-api/relation/managing-friends/delete-friend", - "title": "Delete a friend", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/delete-friend.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-quote-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/platform-api/error-codes", - "openimPath": "/platform-api/error-codes", - "title": "Error codes", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/error-codes.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-markdown-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-markdown-message", + "title": "Create a Markdown message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-markdown-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/import-friends", - "openimPath": "/platform-api/relation/managing-friends/import-friends", - "title": "Import friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/import-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-forward-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/update-friends", - "openimPath": "/platform-api/relation/managing-friends/update-friends", - "title": "Update friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/update-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-merger-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/add-black", - "openimPath": "/platform-api/relation/blacklist/add-black", - "title": "Add to blacklist", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/add-black.mdx" + "sourcePath": "/sdk/wasm/message/sending-messages/send-message", + "openimPath": "/sdk/wasm/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/list-blacks", - "openimPath": "/platform-api/relation/blacklist/list-blacks", - "title": "List blacklisted users", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/list-blacks.mdx" + "sourcePath": "/sdk/wasm/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/wasm/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message-not-oss.mdx" + }, + { + "sourcePath": "/sdk/wasm/message/receiving-messages/receive-messages", + "openimPath": "/sdk/wasm/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/remove-black", - "openimPath": "/platform-api/relation/blacklist/remove-black", - "title": "Remove from blacklist", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/remove-black.mdx" + "sourcePath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/platform-api/group/overview", - "openimPath": "/platform-api/group/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/group/overview.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/create-group", - "openimPath": "/platform-api/group/managing-groups/create-group", - "title": "Create group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/create-group.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/set-group-info-ex", - "openimPath": "/platform-api/group/managing-groups/set-group-info-ex", - "title": "Set group info extension", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/set-group-info-ex.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/join-group", - "openimPath": "/platform-api/group/group-applications/join-group", - "title": "Join group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/join-group.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/platform-api/group/group-membership/quit-group", - "openimPath": "/platform-api/group/group-membership/quit-group", - "title": "Quit group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-membership/quit-group.mdx" + "sourcePath": "/sdk/wasm/message/searching-messages/search-messages", + "openimPath": "/sdk/wasm/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/respond-group-application", - "openimPath": "/platform-api/group/group-applications/respond-group-application", - "title": "Respond to a group application", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/respond-group-application.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/update-typing-status", + "openimPath": "/sdk/wasm/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/transfer-group-owner", - "openimPath": "/platform-api/group/managing-groups/transfer-group-owner", - "title": "Transfer group owner", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/transfer-group-owner.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/get-typing-status", + "openimPath": "/sdk/wasm/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-received-group-applications", - "openimPath": "/platform-api/group/group-applications/list-received-group-applications", - "title": "List received group applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-received-group-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/wasm/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-user-requested-group-applications", - "openimPath": "/platform-api/group/group-applications/list-user-requested-group-applications", - "title": "List user requested group applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-user-requested-group-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/wasm/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-group-users-request-applications", - "openimPath": "/platform-api/group/group-applications/list-group-users-request-applications", - "title": "List group users request applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-group-users-request-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/wasm/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/get-specified-user-group-request-info", - "openimPath": "/platform-api/group/group-applications/get-specified-user-group-request-info", - "title": "Get specified user group request info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/get-specified-user-group-request-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-local-message", + "openimPath": "/sdk/wasm/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/get-groups-info", - "openimPath": "/platform-api/group/managing-groups/get-groups-info", - "title": "Get groups info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/get-groups-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/wasm/message/managing-messages/delete-saved-messages", + "title": "Delete saved messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-members/kick-group-members", - "openimPath": "/platform-api/group/group-members/kick-group-members", - "title": "Kick group members", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/kick-group-members.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/wasm/message/managing-messages/delete-user-messages", + "title": "Delete messages from a user", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-members/get-group-members-info", - "openimPath": "/platform-api/group/group-members/get-group-members-info", - "title": "Get group members info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-members-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/wasm/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/platform-api/group/group-members/get-group-member-list", - "openimPath": "/platform-api/group/group-members/get-group-member-list", - "title": "Get group member list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-member-list.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/modify-a-message", + "openimPath": "/sdk/wasm/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/platform-api/group/group-members/invite-users-to-group", - "openimPath": "/platform-api/group/group-members/invite-users-to-group", - "title": "Invite users to group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/invite-users-to-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/wasm/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-membership/get-joined-group-list", - "openimPath": "/platform-api/group/group-membership/get-joined-group-list", - "title": "Get joined group list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-membership/get-joined-group-list.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/wasm/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/dismiss-group", - "openimPath": "/platform-api/group/managing-groups/dismiss-group", - "title": "Dismiss group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/dismiss-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/wasm/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/mute-group-member", - "openimPath": "/platform-api/group/group-moderation/mute-group-member", - "title": "Mute group member", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group-member.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/wasm/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group-member", - "openimPath": "/platform-api/group/group-moderation/cancel-mute-group-member", - "title": "Cancel mute group member", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group-member.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/mute-group", - "openimPath": "/platform-api/group/group-moderation/mute-group", - "title": "Mute group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/wasm/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group", - "openimPath": "/platform-api/group/group-moderation/cancel-mute-group", - "title": "Cancel mute group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/wasm/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/platform-api/group/group-members/set-group-member-info", - "openimPath": "/platform-api/group/group-members/set-group-member-info", - "title": "Set group member info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/set-group-member-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", + "title": "View group message readers", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/platform-api/auth/overview", - "openimPath": "/platform-api/auth/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/auth/overview.mdx" + "sourcePath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", + "title": "Send group read receipts", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/platform-api/auth/tokens/get-admin-token", - "openimPath": "/platform-api/auth/tokens/get-admin-token", - "title": "Get an administrator token", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/tokens/get-admin-token.mdx" + "sourcePath": "/sdk/wasm/file-uploads/upload-file", + "openimPath": "/sdk/wasm/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/file-uploads/upload-file.mdx" }, { - "sourcePath": "/platform-api/auth/tokens/get-user-token", - "openimPath": "/platform-api/auth/tokens/get-user-token", - "title": "Get a user token", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/tokens/get-user-token.mdx" + "sourcePath": "/sdk/wasm/calling/overview-calling", + "openimPath": "/sdk/wasm/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/overview-calling.mdx" }, { - "sourcePath": "/platform-api/auth/sessions/force-logout", - "openimPath": "/platform-api/auth/sessions/force-logout", - "title": "Force logout", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/sessions/force-logout.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/start-single-call", + "openimPath": "/sdk/wasm/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/platform-api/message/overview", - "openimPath": "/platform-api/message/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/message/overview.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/start-group-call", + "openimPath": "/sdk/wasm/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/platform-api/message/message-content-types", - "openimPath": "/platform-api/message/message-content-types", - "title": "Message content types", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/calling/managing-calls/accept-call", + "openimPath": "/sdk/wasm/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/platform-api/message/message-content-types.mdx" + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/send-msg", - "openimPath": "/platform-api/message/sending-messages/send-msg", - "title": "Send a message", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/reject-call", + "openimPath": "/sdk/wasm/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/batch-send-msg", - "openimPath": "/platform-api/message/sending-messages/batch-send-msg", - "title": "Batch send messages", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/batch-send-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/cancel-call", + "openimPath": "/sdk/wasm/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/send-business-notification", - "openimPath": "/platform-api/message/sending-messages/send-business-notification", - "title": "Send a business notification", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-business-notification.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/wasm/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/platform-api/message/managing-messages/revoke-msg", - "openimPath": "/platform-api/message/managing-messages/revoke-msg", - "title": "Revoke a message", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/managing-messages/revoke-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/wasm/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/platform-api/message/retrieving-messages/get-server-time", - "openimPath": "/platform-api/message/retrieving-messages/get-server-time", - "title": "Get server time", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/retrieving-messages/get-server-time.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/platform-api/conversation/overview", - "openimPath": "/platform-api/conversation/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/conversation/overview.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", - "openimPath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", - "title": "Get sorted conversation list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-sorted-conversation-list.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-conversation", - "openimPath": "/platform-api/conversation/listing-conversations/get-conversation", - "title": "Get conversation", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversation.mdx" + "sourcePath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-conversations", - "openimPath": "/platform-api/conversation/listing-conversations/get-conversations", - "title": "Get conversations", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversations.mdx" + "sourcePath": "/sdk/wasm/events/overview-events", + "openimPath": "/sdk/wasm/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/events/overview-events.mdx" }, { - "sourcePath": "/platform-api/conversation/managing-conversations/set-conversations", - "openimPath": "/platform-api/conversation/managing-conversations/set-conversations", - "title": "Set conversations", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/managing-conversations/set-conversations.mdx" + "sourcePath": "/sdk/wasm/logger", + "openimPath": "/sdk/wasm/logger", + "title": "Logger", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/logger.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-owner-conversation", - "openimPath": "/platform-api/conversation/listing-conversations/get-owner-conversation", - "title": "Get owner conversation", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-owner-conversation.mdx" + "sourcePath": "/sdk/electron/overview", + "openimPath": "/sdk/electron/overview", + "title": "OpenIM SDK for Electron", + "context": "chat/sdk/electron", + "template": "overview", + "contentFile": "content/docs/chat/sdk/electron/overview.mdx" }, { - "sourcePath": "/platform-api/migration-to-openim", - "openimPath": "/platform-api/migration-to-openim", - "title": "Migrate to OpenIM", - "context": "chat/platform-api", + "sourcePath": "/sdk/miniprogram/overview", + "openimPath": "/sdk/miniprogram/overview", + "title": "OpenIM SDK for Mini Program", + "context": "chat/sdk/miniprogram", + "template": "overview", + "contentFile": "content/docs/chat/sdk/miniprogram/overview.mdx" + }, + { + "sourcePath": "/sdk/react-native/overview", + "openimPath": "/sdk/react-native/overview", + "title": "OpenIM SDK for React Native", + "context": "chat/sdk/react-native", "template": "overview", - "contentFile": "content/docs/chat/platform-api/migration-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/react-native/overview.mdx" }, { - "sourcePath": "/platform-api/logs/overview", - "openimPath": "/platform-api/logs/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/logs/overview.mdx" + "sourcePath": "/sdk/electron/getting-started/authenticate-and-init", + "openimPath": "/sdk/electron/getting-started/authenticate-and-init", + "title": "Authenticate and init", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/getting-started/authenticate-and-init.mdx" }, { - "sourcePath": "/platform-api/logs/upload-logs", - "openimPath": "/platform-api/logs/upload-logs", - "title": "Upload log records", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/upload-logs.mdx" + "sourcePath": "/sdk/electron/message/create-media-from-full-path", + "openimPath": "/sdk/electron/message/create-media-from-full-path", + "title": "Create media from full path", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/message/create-media-from-full-path.mdx" }, { - "sourcePath": "/platform-api/logs/search-logs", - "openimPath": "/platform-api/logs/search-logs", - "title": "Search log records", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/search-logs.mdx" + "sourcePath": "/sdk/electron/logger/upload-logs", + "openimPath": "/sdk/electron/logger/upload-logs", + "title": "Upload logs", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/logger/upload-logs.mdx" }, { - "sourcePath": "/platform-api/logs/delete-logs", - "openimPath": "/platform-api/logs/delete-logs", - "title": "Delete log records", + "sourcePath": "/platform-api/webhooks/overview", + "openimPath": "/platform-api/webhooks/overview", "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/delete-logs.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/webhooks/overview.mdx" }, { - "sourcePath": "/platform-api/message/managing-messages/modify-message", - "openimPath": "/platform-api/message/managing-messages/modify-message", + "sourcePath": "/platform-api/webhooks/user/before-user-register", + "openimPath": "/platform-api/webhooks/user/before-user-register", "context": "chat/platform-api", "template": "api", - "title": "Modify a message", - "contentFile": "content/docs/chat/platform-api/message/managing-messages/modify-message.mdx" + "title": "Before user registration", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-user-register.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/ban-user", - "openimPath": "/platform-api/user/account-governance/ban-user", + "sourcePath": "/platform-api/webhooks/user/after-user-register", + "openimPath": "/platform-api/webhooks/user/after-user-register", "context": "chat/platform-api", "template": "api", - "title": "Ban users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/ban-user.mdx" + "title": "After user registration", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-user-register.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/list-disabled-users", - "openimPath": "/platform-api/user/account-governance/list-disabled-users", + "sourcePath": "/platform-api/webhooks/user/before-update-user-info", + "openimPath": "/platform-api/webhooks/user/before-update-user-info", "context": "chat/platform-api", "template": "api", - "title": "List disabled users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/list-disabled-users.mdx" + "title": "Before updating user information", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/unban-user", - "openimPath": "/platform-api/user/account-governance/unban-user", + "sourcePath": "/platform-api/webhooks/user/after-update-user-info", + "openimPath": "/platform-api/webhooks/user/after-update-user-info", "context": "chat/platform-api", "template": "api", - "title": "Unban users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/unban-user.mdx" + "title": "After updating user information", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/unregister-user", - "openimPath": "/platform-api/user/account-governance/unregister-user", + "sourcePath": "/platform-api/webhooks/user/before-update-user-info-ex", + "openimPath": "/platform-api/webhooks/user/before-update-user-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Unregister users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/unregister-user.mdx" + "title": "Before updating selected user fields", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info-ex.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", + "sourcePath": "/platform-api/webhooks/user/after-update-user-info-ex", + "openimPath": "/platform-api/webhooks/user/after-update-user-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Delete received friend requests", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-received-friend-requests.mdx" + "title": "After updating selected user fields", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info-ex.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", + "sourcePath": "/platform-api/webhooks/relation/before-add-friend", + "openimPath": "/platform-api/webhooks/relation/before-add-friend", "context": "chat/platform-api", "template": "api", - "title": "Delete sent friend requests", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-sent-friend-requests.mdx" + "title": "Before adding a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/clear-group-application-badge-count", - "openimPath": "/platform-api/group/group-applications/clear-group-application-badge-count", + "sourcePath": "/platform-api/webhooks/relation/after-add-friend", + "openimPath": "/platform-api/webhooks/relation/after-add-friend", "context": "chat/platform-api", "template": "api", - "title": "Clear the group application badge count", - "contentFile": "content/docs/chat/platform-api/group/group-applications/clear-group-application-badge-count.mdx" + "title": "After adding a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/delete-group-received-requests", - "openimPath": "/platform-api/group/group-applications/delete-group-received-requests", + "sourcePath": "/platform-api/webhooks/relation/before-add-friend-agree", + "openimPath": "/platform-api/webhooks/relation/before-add-friend-agree", "context": "chat/platform-api", "template": "api", - "title": "Delete applications received by a group", - "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-group-received-requests.mdx" + "title": "Before accepting a friend request", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend-agree.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/delete-user-group-requests", - "openimPath": "/platform-api/group/group-applications/delete-user-group-requests", + "sourcePath": "/platform-api/webhooks/relation/after-add-friend-agree", + "openimPath": "/platform-api/webhooks/relation/after-add-friend-agree", "context": "chat/platform-api", "template": "api", - "title": "Delete applications sent by a user", - "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-user-group-requests.mdx" + "title": "After accepting a friend request", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend-agree.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/get-group-application-badge-count", - "openimPath": "/platform-api/group/group-applications/get-group-application-badge-count", + "sourcePath": "/platform-api/webhooks/relation/after-delete-friend", + "openimPath": "/platform-api/webhooks/relation/after-delete-friend", "context": "chat/platform-api", "template": "api", - "title": "Get the group application badge count", - "contentFile": "content/docs/chat/platform-api/group/group-applications/get-group-application-badge-count.mdx" + "title": "After deleting a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-delete-friend.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", - "openimPath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", + "sourcePath": "/platform-api/webhooks/relation/before-set-friend-remark", + "openimPath": "/platform-api/webhooks/relation/before-set-friend-remark", "context": "chat/platform-api", "template": "api", - "title": "Add conversations to groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/add-conversations-to-groups.mdx" + "title": "Before setting a friend remark", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-set-friend-remark.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/create-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/create-conversation-group", + "sourcePath": "/platform-api/webhooks/relation/after-set-friend-remark", + "openimPath": "/platform-api/webhooks/relation/after-set-friend-remark", "context": "chat/platform-api", "template": "api", - "title": "Create a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/create-conversation-group.mdx" + "title": "After setting a friend remark", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-set-friend-remark.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/delete-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/delete-conversation-group", + "sourcePath": "/platform-api/webhooks/relation/before-add-black", + "openimPath": "/platform-api/webhooks/relation/before-add-black", "context": "chat/platform-api", "template": "api", - "title": "Delete a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/delete-conversation-group.mdx" + "title": "Before adding to the blacklist", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-black.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/list-conversation-groups", - "openimPath": "/platform-api/conversation/conversation-groups/list-conversation-groups", + "sourcePath": "/platform-api/webhooks/relation/after-remove-black", + "openimPath": "/platform-api/webhooks/relation/after-remove-black", "context": "chat/platform-api", "template": "api", - "title": "List conversation groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/list-conversation-groups.mdx" + "title": "After removing from the blacklist", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-remove-black.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", - "openimPath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", + "sourcePath": "/platform-api/webhooks/relation/before-import-friends", + "openimPath": "/platform-api/webhooks/relation/before-import-friends", "context": "chat/platform-api", "template": "api", - "title": "Remove conversations from groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/remove-conversations-from-groups.mdx" + "title": "Before importing friends", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-import-friends.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", - "openimPath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", + "sourcePath": "/platform-api/webhooks/relation/after-import-friends", + "openimPath": "/platform-api/webhooks/relation/after-import-friends", "context": "chat/platform-api", "template": "api", - "title": "Set conversation group order", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/set-conversation-group-order.mdx" + "title": "After importing friends", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-import-friends.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/update-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/update-conversation-group", + "sourcePath": "/platform-api/webhooks/group/before-create-group", + "openimPath": "/platform-api/webhooks/group/before-create-group", "context": "chat/platform-api", "template": "api", - "title": "Update a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/update-conversation-group.mdx" + "title": "Before creating a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-create-group.mdx" }, { - "sourcePath": "/platform-api/message/content-processing/translate-text", - "openimPath": "/platform-api/message/content-processing/translate-text", + "sourcePath": "/platform-api/webhooks/group/after-create-group", + "openimPath": "/platform-api/webhooks/group/after-create-group", "context": "chat/platform-api", "template": "api", - "title": "Translate text", - "contentFile": "content/docs/chat/platform-api/message/content-processing/translate-text.mdx" + "title": "After creating a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-create-group.mdx" }, { - "sourcePath": "/platform-api/message/read-status/mark-conversation-read", - "openimPath": "/platform-api/message/read-status/mark-conversation-read", + "sourcePath": "/platform-api/webhooks/group/before-member-join-group", + "openimPath": "/platform-api/webhooks/group/before-member-join-group", "context": "chat/platform-api", "template": "api", - "title": "Mark a conversation read through a Seq", - "contentFile": "content/docs/chat/platform-api/message/read-status/mark-conversation-read.mdx" + "title": "Before members join a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-member-join-group.mdx" }, { - "sourcePath": "/platform-api/message/streaming-messages/append-stream-message", - "openimPath": "/platform-api/message/streaming-messages/append-stream-message", + "sourcePath": "/platform-api/webhooks/group/before-invite-user-to-group", + "openimPath": "/platform-api/webhooks/group/before-invite-user-to-group", "context": "chat/platform-api", "template": "api", - "title": "Append stream-message packets", - "contentFile": "content/docs/chat/platform-api/message/streaming-messages/append-stream-message.mdx" + "title": "Before inviting users to a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-invite-user-to-group.mdx" }, { - "sourcePath": "/platform-api/message/streaming-messages/put-stream-message", - "openimPath": "/platform-api/message/streaming-messages/put-stream-message", + "sourcePath": "/platform-api/webhooks/group/before-apply-join-group", + "openimPath": "/platform-api/webhooks/group/before-apply-join-group", "context": "chat/platform-api", "template": "api", - "title": "Upload stream-message content", - "contentFile": "content/docs/chat/platform-api/message/streaming-messages/put-stream-message.mdx" + "title": "Before applying to join a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-apply-join-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/clear-conversations-unread-count", - "openimPath": "/platform-api/message/unread-count/clear-conversations-unread-count", + "sourcePath": "/platform-api/webhooks/group/after-join-group", + "openimPath": "/platform-api/webhooks/group/after-join-group", "context": "chat/platform-api", "template": "api", - "title": "Clear conversation unread counts", - "contentFile": "content/docs/chat/platform-api/message/unread-count/clear-conversations-unread-count.mdx" + "title": "After joining a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-join-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/get-conversations-unread-count", - "openimPath": "/platform-api/message/unread-count/get-conversations-unread-count", + "sourcePath": "/platform-api/webhooks/group/after-quit-group", + "openimPath": "/platform-api/webhooks/group/after-quit-group", "context": "chat/platform-api", "template": "api", - "title": "Get conversation unread counts", - "contentFile": "content/docs/chat/platform-api/message/unread-count/get-conversations-unread-count.mdx" + "title": "After leaving a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-quit-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/reset-conversation-unread", - "openimPath": "/platform-api/message/unread-count/reset-conversation-unread", + "sourcePath": "/platform-api/webhooks/group/after-kick-group-member", + "openimPath": "/platform-api/webhooks/group/after-kick-group-member", "context": "chat/platform-api", "template": "api", - "title": "Set a conversation unread count", - "contentFile": "content/docs/chat/platform-api/message/unread-count/reset-conversation-unread.mdx" - }, - { - "sourcePath": "/platform-api/timer/overview", - "openimPath": "/platform-api/timer/overview", - "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/timer/overview.mdx" + "title": "After removing group members", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-kick-group-member.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/create-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/create-timer-task", + "sourcePath": "/platform-api/webhooks/group/after-dismiss-group", + "openimPath": "/platform-api/webhooks/group/after-dismiss-group", "context": "chat/platform-api", "template": "api", - "title": "Create a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/create-timer-task.mdx" + "title": "After dismissing a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-dismiss-group.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/delete-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/delete-timer-task", + "sourcePath": "/platform-api/webhooks/group/after-transfer-group-owner", + "openimPath": "/platform-api/webhooks/group/after-transfer-group-owner", "context": "chat/platform-api", "template": "api", - "title": "Delete a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/delete-timer-task.mdx" + "title": "After transferring group ownership", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-transfer-group-owner.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/get-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/get-timer-task", + "sourcePath": "/platform-api/webhooks/group/before-set-group-member-info", + "openimPath": "/platform-api/webhooks/group/before-set-group-member-info", "context": "chat/platform-api", "template": "api", - "title": "Get a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/get-timer-task.mdx" + "title": "Before updating group member information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-member-info.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/list-timer-tasks", - "openimPath": "/platform-api/timer/managing-tasks/list-timer-tasks", + "sourcePath": "/platform-api/webhooks/group/after-set-group-member-info", + "openimPath": "/platform-api/webhooks/group/after-set-group-member-info", "context": "chat/platform-api", "template": "api", - "title": "List timer tasks", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/list-timer-tasks.mdx" + "title": "After updating group member information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-member-info.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/update-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/update-timer-task", + "sourcePath": "/platform-api/webhooks/group/before-set-group-info", + "openimPath": "/platform-api/webhooks/group/before-set-group-info", "context": "chat/platform-api", "template": "api", - "title": "Update a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/update-timer-task.mdx" + "title": "Before updating group information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/after-set-group-info", + "openimPath": "/platform-api/webhooks/group/after-set-group-info", "context": "chat/platform-api", "template": "api", - "title": "Pull meeting chat messages", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/pull-meeting-chat.mdx" + "title": "After updating group information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/before-set-group-info-ex", + "openimPath": "/platform-api/webhooks/group/before-set-group-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Revoke a meeting chat message", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/revoke-meeting-chat.mdx" + "title": "Before updating selected group fields", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info-ex.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/send-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/send-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/after-set-group-info-ex", + "openimPath": "/platform-api/webhooks/group/after-set-group-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Send a meeting chat message", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/send-meeting-chat.mdx" + "title": "After updating selected group fields", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info-ex.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/book-meeting", - "openimPath": "/platform-api/meeting/meeting-management/book-meeting", + "sourcePath": "/platform-api/webhooks/message/before-send-single-message", + "openimPath": "/platform-api/webhooks/message/before-send-single-message", "context": "chat/platform-api", "template": "api", - "title": "Schedule a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/book-meeting.mdx" + "title": "Before sending a one-to-one message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-single-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/create-immediate-meeting", - "openimPath": "/platform-api/meeting/meeting-management/create-immediate-meeting", + "sourcePath": "/platform-api/webhooks/message/after-send-single-message", + "openimPath": "/platform-api/webhooks/message/after-send-single-message", "context": "chat/platform-api", "template": "api", - "title": "Create an immediate meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/create-immediate-meeting.mdx" + "title": "After sending a one-to-one message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-single-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/end-meeting", - "openimPath": "/platform-api/meeting/meeting-management/end-meeting", + "sourcePath": "/platform-api/webhooks/message/before-send-group-message", + "openimPath": "/platform-api/webhooks/message/before-send-group-message", "context": "chat/platform-api", "template": "api", - "title": "End or cancel a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/end-meeting.mdx" + "title": "Before sending a group message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-group-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-meeting-token", - "openimPath": "/platform-api/meeting/meeting-management/get-meeting-token", + "sourcePath": "/platform-api/webhooks/message/after-send-group-message", + "openimPath": "/platform-api/webhooks/message/after-send-group-message", "context": "chat/platform-api", "template": "api", - "title": "Get a meeting token", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting-token.mdx" + "title": "After sending a group message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-group-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-meeting", - "openimPath": "/platform-api/meeting/meeting-management/get-meeting", + "sourcePath": "/platform-api/webhooks/message/before-message-modify", + "openimPath": "/platform-api/webhooks/message/before-message-modify", "context": "chat/platform-api", "template": "api", - "title": "Get a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting.mdx" + "title": "Before writing a message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-message-modify.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-user-related-meetings", - "openimPath": "/platform-api/meeting/meeting-management/get-user-related-meetings", + "sourcePath": "/platform-api/webhooks/message/after-single-message-read", + "openimPath": "/platform-api/webhooks/message/after-single-message-read", "context": "chat/platform-api", "template": "api", - "title": "Get user-related meetings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-user-related-meetings.mdx" + "title": "After one-to-one messages are read", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-single-message-read.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/invite-meeting-users", - "openimPath": "/platform-api/meeting/meeting-management/invite-meeting-users", + "sourcePath": "/platform-api/webhooks/message/after-group-message-read", + "openimPath": "/platform-api/webhooks/message/after-group-message-read", "context": "chat/platform-api", "template": "api", - "title": "Invite users to a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/invite-meeting-users.mdx" + "title": "After group messages are read", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-group-message-read.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/join-meeting", - "openimPath": "/platform-api/meeting/meeting-management/join-meeting", + "sourcePath": "/platform-api/webhooks/message/after-revoke-message", + "openimPath": "/platform-api/webhooks/message/after-revoke-message", "context": "chat/platform-api", "template": "api", - "title": "Join a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/join-meeting.mdx" + "title": "After revoking a message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-revoke-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/leave-meeting", - "openimPath": "/platform-api/meeting/meeting-management/leave-meeting", + "sourcePath": "/platform-api/webhooks/push/before-online-push", + "openimPath": "/platform-api/webhooks/push/before-online-push", "context": "chat/platform-api", "template": "api", - "title": "Leave a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/leave-meeting.mdx" + "title": "Before one-to-one online push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-online-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/list-meetings", - "openimPath": "/platform-api/meeting/meeting-management/list-meetings", + "sourcePath": "/platform-api/webhooks/push/before-group-online-push", + "openimPath": "/platform-api/webhooks/push/before-group-online-push", "context": "chat/platform-api", "template": "api", - "title": "List a user's meetings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/list-meetings.mdx" + "title": "Before group online push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-group-online-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/update-meeting", - "openimPath": "/platform-api/meeting/meeting-management/update-meeting", + "sourcePath": "/platform-api/webhooks/push/before-offline-push", + "openimPath": "/platform-api/webhooks/push/before-offline-push", "context": "chat/platform-api", "template": "api", - "title": "Update a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/update-meeting.mdx" + "title": "Before offline push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-offline-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/delete-meeting-records", - "openimPath": "/platform-api/meeting/meeting-records/delete-meeting-records", + "sourcePath": "/platform-api/webhooks/push/after-user-online", + "openimPath": "/platform-api/webhooks/push/after-user-online", "context": "chat/platform-api", "template": "api", - "title": "Delete meeting recordings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/delete-meeting-records.mdx" + "title": "After a user comes online", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-online.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-attendance", - "openimPath": "/platform-api/meeting/meeting-records/get-meeting-attendance", + "sourcePath": "/platform-api/webhooks/push/after-user-offline", + "openimPath": "/platform-api/webhooks/push/after-user-offline", "context": "chat/platform-api", "template": "api", - "title": "Get meeting attendance", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-attendance.mdx" + "title": "After a user goes offline", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-offline.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-records", - "openimPath": "/platform-api/meeting/meeting-records/get-meeting-records", + "sourcePath": "/platform-api/webhooks/push/after-user-kick-off", + "openimPath": "/platform-api/webhooks/push/after-user-kick-off", "context": "chat/platform-api", "template": "api", - "title": "Get meeting recordings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-records.mdx" + "title": "After a user is forced offline", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-kick-off.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", - "openimPath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", + "sourcePath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get recordings by meeting IDs", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-records-by-meeting-ids.mdx" + "title": "Before creating one-to-one conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-single-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", - "openimPath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", + "sourcePath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get meetings hosted by a user", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-hosted-meetings.mdx" + "title": "After creating one-to-one conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-single-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", - "openimPath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", + "sourcePath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get a user's meeting history", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-meeting-histories.mdx" + "title": "Before creating group conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-group-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", - "openimPath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", + "sourcePath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Clean previous meeting state", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/clean-previous-meetings.mdx" + "title": "After creating group conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-group-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/get-personal-setting", - "openimPath": "/platform-api/meeting/meeting-settings/get-personal-setting", + "sourcePath": "/platform-api/timer/overview", + "openimPath": "/platform-api/timer/overview", "context": "chat/platform-api", - "template": "api", - "title": "Get personal meeting preferences", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/get-personal-setting.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/timer/overview.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/modify-participant-name", - "openimPath": "/platform-api/meeting/meeting-settings/modify-participant-name", + "sourcePath": "/platform-api/meeting/overview", + "openimPath": "/platform-api/meeting/overview", "context": "chat/platform-api", - "template": "api", - "title": "Modify a participant name", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/modify-participant-name.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/meeting/overview.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/operate-all-streams", - "openimPath": "/platform-api/meeting/meeting-settings/operate-all-streams", + "sourcePath": "/platform-api/user/account-governance/ban-user", + "openimPath": "/platform-api/user/account-governance/ban-user", "context": "chat/platform-api", "template": "api", - "title": "Control participant media streams", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/operate-all-streams.mdx" + "title": "Ban users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/ban-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/remove-participants", - "openimPath": "/platform-api/meeting/meeting-settings/remove-participants", + "sourcePath": "/platform-api/user/account-governance/unban-user", + "openimPath": "/platform-api/user/account-governance/unban-user", "context": "chat/platform-api", "template": "api", - "title": "Remove meeting participants", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/remove-participants.mdx" + "title": "Unban users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/unban-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/set-meeting-host", - "openimPath": "/platform-api/meeting/meeting-settings/set-meeting-host", + "sourcePath": "/platform-api/user/account-governance/unregister-user", + "openimPath": "/platform-api/user/account-governance/unregister-user", "context": "chat/platform-api", "template": "api", - "title": "Set meeting hosts", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-meeting-host.mdx" + "title": "Unregister users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/unregister-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/set-personal-setting", - "openimPath": "/platform-api/meeting/meeting-settings/set-personal-setting", + "sourcePath": "/platform-api/user/account-governance/list-disabled-users", + "openimPath": "/platform-api/user/account-governance/list-disabled-users", "context": "chat/platform-api", "template": "api", - "title": "Set personal meeting preferences", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-personal-setting.mdx" + "title": "List disabled users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/list-disabled-users.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", - "openimPath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", + "sourcePath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", "context": "chat/platform-api", "template": "api", - "title": "Get a call room by group ID", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-room-by-group-id.mdx" + "title": "Delete sent friend requests", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-sent-friend-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", - "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", + "sourcePath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", "context": "chat/platform-api", "template": "api", - "title": "Get a call invitation", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-invitation.mdx" + "title": "Delete received friend requests", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-received-friend-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", - "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", + "sourcePath": "/platform-api/group/group-applications/get-group-application-badge-count", + "openimPath": "/platform-api/group/group-applications/get-group-application-badge-count", "context": "chat/platform-api", "template": "api", - "title": "Get call rooms", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-rooms.mdx" + "title": "Get the group application badge count", + "contentFile": "content/docs/chat/platform-api/group/group-applications/get-group-application-badge-count.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", - "openimPath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", + "sourcePath": "/platform-api/group/group-applications/clear-group-application-badge-count", + "openimPath": "/platform-api/group/group-applications/clear-group-application-badge-count", "context": "chat/platform-api", "template": "api", - "title": "Get a startup call invitation", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-startup-invitation.mdx" + "title": "Clear the group application badge count", + "contentFile": "content/docs/chat/platform-api/group/group-applications/clear-group-application-badge-count.mdx" }, { - "sourcePath": "/platform-api/meeting/overview", - "openimPath": "/platform-api/meeting/overview", + "sourcePath": "/platform-api/group/group-applications/delete-user-group-requests", + "openimPath": "/platform-api/group/group-applications/delete-user-group-requests", "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/meeting/overview.mdx" + "template": "api", + "title": "Delete applications sent by a user", + "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-user-group-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", + "sourcePath": "/platform-api/group/group-applications/delete-group-received-requests", + "openimPath": "/platform-api/group/group-applications/delete-group-received-requests", "context": "chat/platform-api", "template": "api", - "title": "Create a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/create-repeat-meeting.mdx" + "title": "Delete applications received by a group", + "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-group-received-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", + "sourcePath": "/platform-api/message/content-processing/translate-text", + "openimPath": "/platform-api/message/content-processing/translate-text", "context": "chat/platform-api", "template": "api", - "title": "Delete a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/delete-repeat-meeting.mdx" + "title": "Translate text", + "contentFile": "content/docs/chat/platform-api/message/content-processing/translate-text.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", + "sourcePath": "/platform-api/message/streaming-messages/append-stream-message", + "openimPath": "/platform-api/message/streaming-messages/append-stream-message", "context": "chat/platform-api", "template": "api", - "title": "Get a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/get-repeat-meeting.mdx" + "title": "Append stream-message packets", + "contentFile": "content/docs/chat/platform-api/message/streaming-messages/append-stream-message.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", - "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", + "sourcePath": "/platform-api/message/streaming-messages/put-stream-message", + "openimPath": "/platform-api/message/streaming-messages/put-stream-message", "context": "chat/platform-api", "template": "api", - "title": "List recurring meeting instances", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances.mdx" + "title": "Upload stream-message content", + "contentFile": "content/docs/chat/platform-api/message/streaming-messages/put-stream-message.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", - "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", + "sourcePath": "/platform-api/message/read-status/mark-conversation-read", + "openimPath": "/platform-api/message/read-status/mark-conversation-read", "context": "chat/platform-api", "template": "api", - "title": "List recurring meetings", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meetings.mdx" + "title": "Mark a conversation read through a Seq", + "contentFile": "content/docs/chat/platform-api/message/read-status/mark-conversation-read.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", + "sourcePath": "/platform-api/message/managing-messages/modify-message", + "openimPath": "/platform-api/message/managing-messages/modify-message", "context": "chat/platform-api", "template": "api", - "title": "Update a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/update-repeat-meeting.mdx" + "title": "Modify a message", + "contentFile": "content/docs/chat/platform-api/message/managing-messages/modify-message.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/get-conversations-unread-count", + "openimPath": "/platform-api/message/unread-count/get-conversations-unread-count", "context": "chat/platform-api", "template": "api", - "title": "After creating group conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-group-chat-conversations.mdx" + "title": "Get conversation unread counts", + "contentFile": "content/docs/chat/platform-api/message/unread-count/get-conversations-unread-count.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/clear-conversations-unread-count", + "openimPath": "/platform-api/message/unread-count/clear-conversations-unread-count", "context": "chat/platform-api", "template": "api", - "title": "After creating one-to-one conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-single-chat-conversations.mdx" + "title": "Clear conversation unread counts", + "contentFile": "content/docs/chat/platform-api/message/unread-count/clear-conversations-unread-count.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/reset-conversation-unread", + "openimPath": "/platform-api/message/unread-count/reset-conversation-unread", "context": "chat/platform-api", "template": "api", - "title": "Before creating group conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-group-chat-conversations.mdx" + "title": "Set a conversation unread count", + "contentFile": "content/docs/chat/platform-api/message/unread-count/reset-conversation-unread.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", + "sourcePath": "/platform-api/conversation/conversation-groups/create-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/create-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "Before creating one-to-one conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-single-chat-conversations.mdx" + "title": "Create a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-create-group", - "openimPath": "/platform-api/webhooks/group/after-create-group", + "sourcePath": "/platform-api/conversation/conversation-groups/update-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/update-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "After creating a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-create-group.mdx" + "title": "Update a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-dismiss-group", - "openimPath": "/platform-api/webhooks/group/after-dismiss-group", + "sourcePath": "/platform-api/conversation/conversation-groups/delete-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/delete-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "After dismissing a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-dismiss-group.mdx" + "title": "Delete a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-join-group", - "openimPath": "/platform-api/webhooks/group/after-join-group", + "sourcePath": "/platform-api/conversation/conversation-groups/list-conversation-groups", + "openimPath": "/platform-api/conversation/conversation-groups/list-conversation-groups", "context": "chat/platform-api", "template": "api", - "title": "After joining a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-join-group.mdx" + "title": "List conversation groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/list-conversation-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-kick-group-member", - "openimPath": "/platform-api/webhooks/group/after-kick-group-member", + "sourcePath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", + "openimPath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", "context": "chat/platform-api", "template": "api", - "title": "After removing group members", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-kick-group-member.mdx" + "title": "Set conversation group order", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-quit-group", - "openimPath": "/platform-api/webhooks/group/after-quit-group", + "sourcePath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", + "openimPath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", "context": "chat/platform-api", "template": "api", - "title": "After leaving a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-quit-group.mdx" + "title": "Add conversations to groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-info", - "openimPath": "/platform-api/webhooks/group/after-set-group-info", + "sourcePath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", + "openimPath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", "context": "chat/platform-api", "template": "api", - "title": "After updating group information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info.mdx" + "title": "Remove conversations from groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-info-ex", - "openimPath": "/platform-api/webhooks/group/after-set-group-info-ex", + "sourcePath": "/platform-api/timer/managing-tasks/create-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/create-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After updating selected group fields", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info-ex.mdx" + "title": "Create a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/create-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-member-info", - "openimPath": "/platform-api/webhooks/group/after-set-group-member-info", + "sourcePath": "/platform-api/timer/managing-tasks/update-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/update-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After updating group member information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-member-info.mdx" + "title": "Update a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/update-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-transfer-group-owner", - "openimPath": "/platform-api/webhooks/group/after-transfer-group-owner", + "sourcePath": "/platform-api/timer/managing-tasks/delete-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/delete-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After transferring group ownership", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-transfer-group-owner.mdx" + "title": "Delete a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/delete-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-apply-join-group", - "openimPath": "/platform-api/webhooks/group/before-apply-join-group", + "sourcePath": "/platform-api/timer/managing-tasks/get-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/get-timer-task", "context": "chat/platform-api", "template": "api", - "title": "Before applying to join a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-apply-join-group.mdx" + "title": "Get a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/get-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-create-group", - "openimPath": "/platform-api/webhooks/group/before-create-group", + "sourcePath": "/platform-api/timer/managing-tasks/list-timer-tasks", + "openimPath": "/platform-api/timer/managing-tasks/list-timer-tasks", "context": "chat/platform-api", "template": "api", - "title": "Before creating a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-create-group.mdx" + "title": "List timer tasks", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/list-timer-tasks.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-invite-user-to-group", - "openimPath": "/platform-api/webhooks/group/before-invite-user-to-group", + "sourcePath": "/platform-api/meeting/meeting-management/book-meeting", + "openimPath": "/platform-api/meeting/meeting-management/book-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before inviting users to a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-invite-user-to-group.mdx" + "title": "Schedule a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/book-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-member-join-group", - "openimPath": "/platform-api/webhooks/group/before-member-join-group", + "sourcePath": "/platform-api/meeting/meeting-management/create-immediate-meeting", + "openimPath": "/platform-api/meeting/meeting-management/create-immediate-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before members join a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-member-join-group.mdx" + "title": "Create an immediate meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/create-immediate-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-info", - "openimPath": "/platform-api/webhooks/group/before-set-group-info", + "sourcePath": "/platform-api/meeting/meeting-management/join-meeting", + "openimPath": "/platform-api/meeting/meeting-management/join-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before updating group information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info.mdx" + "title": "Join a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/join-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-info-ex", - "openimPath": "/platform-api/webhooks/group/before-set-group-info-ex", + "sourcePath": "/platform-api/meeting/meeting-management/get-meeting-token", + "openimPath": "/platform-api/meeting/meeting-management/get-meeting-token", "context": "chat/platform-api", "template": "api", - "title": "Before updating selected group fields", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info-ex.mdx" + "title": "Get a meeting token", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting-token.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-member-info", - "openimPath": "/platform-api/webhooks/group/before-set-group-member-info", + "sourcePath": "/platform-api/meeting/meeting-management/update-meeting", + "openimPath": "/platform-api/meeting/meeting-management/update-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before updating group member information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-member-info.mdx" + "title": "Update a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/update-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-group-message-read", - "openimPath": "/platform-api/webhooks/message/after-group-message-read", + "sourcePath": "/platform-api/meeting/meeting-management/get-meeting", + "openimPath": "/platform-api/meeting/meeting-management/get-meeting", "context": "chat/platform-api", "template": "api", - "title": "After group messages are read", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-group-message-read.mdx" + "title": "Get a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-revoke-message", - "openimPath": "/platform-api/webhooks/message/after-revoke-message", + "sourcePath": "/platform-api/meeting/meeting-management/list-meetings", + "openimPath": "/platform-api/meeting/meeting-management/list-meetings", "context": "chat/platform-api", "template": "api", - "title": "After revoking a message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-revoke-message.mdx" + "title": "List a user's meetings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/list-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-send-group-message", - "openimPath": "/platform-api/webhooks/message/after-send-group-message", + "sourcePath": "/platform-api/meeting/meeting-management/invite-meeting-users", + "openimPath": "/platform-api/meeting/meeting-management/invite-meeting-users", "context": "chat/platform-api", "template": "api", - "title": "After sending a group message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-group-message.mdx" + "title": "Invite users to a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/invite-meeting-users.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-send-single-message", - "openimPath": "/platform-api/webhooks/message/after-send-single-message", + "sourcePath": "/platform-api/meeting/meeting-management/leave-meeting", + "openimPath": "/platform-api/meeting/meeting-management/leave-meeting", "context": "chat/platform-api", "template": "api", - "title": "After sending a one-to-one message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-single-message.mdx" + "title": "Leave a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/leave-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-single-message-read", - "openimPath": "/platform-api/webhooks/message/after-single-message-read", + "sourcePath": "/platform-api/meeting/meeting-management/end-meeting", + "openimPath": "/platform-api/meeting/meeting-management/end-meeting", "context": "chat/platform-api", "template": "api", - "title": "After one-to-one messages are read", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-single-message-read.mdx" + "title": "End or cancel a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/end-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-message-modify", - "openimPath": "/platform-api/webhooks/message/before-message-modify", + "sourcePath": "/platform-api/meeting/meeting-management/get-user-related-meetings", + "openimPath": "/platform-api/meeting/meeting-management/get-user-related-meetings", "context": "chat/platform-api", "template": "api", - "title": "Before writing a message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-message-modify.mdx" + "title": "Get user-related meetings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-user-related-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-send-group-message", - "openimPath": "/platform-api/webhooks/message/before-send-group-message", + "sourcePath": "/platform-api/meeting/meeting-settings/set-personal-setting", + "openimPath": "/platform-api/meeting/meeting-settings/set-personal-setting", "context": "chat/platform-api", "template": "api", - "title": "Before sending a group message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-group-message.mdx" + "title": "Set personal meeting preferences", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-personal-setting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-send-single-message", - "openimPath": "/platform-api/webhooks/message/before-send-single-message", + "sourcePath": "/platform-api/meeting/meeting-settings/get-personal-setting", + "openimPath": "/platform-api/meeting/meeting-settings/get-personal-setting", "context": "chat/platform-api", "template": "api", - "title": "Before sending a one-to-one message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-single-message.mdx" + "title": "Get personal meeting preferences", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/get-personal-setting.mdx" }, { - "sourcePath": "/platform-api/webhooks/overview", - "openimPath": "/platform-api/webhooks/overview", + "sourcePath": "/platform-api/meeting/meeting-settings/operate-all-streams", + "openimPath": "/platform-api/meeting/meeting-settings/operate-all-streams", "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/webhooks/overview.mdx" + "template": "api", + "title": "Control participant media streams", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/operate-all-streams.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-kick-off", - "openimPath": "/platform-api/webhooks/push/after-user-kick-off", + "sourcePath": "/platform-api/meeting/meeting-settings/modify-participant-name", + "openimPath": "/platform-api/meeting/meeting-settings/modify-participant-name", "context": "chat/platform-api", "template": "api", - "title": "After a user is forced offline", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-kick-off.mdx" + "title": "Modify a participant name", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/modify-participant-name.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-offline", - "openimPath": "/platform-api/webhooks/push/after-user-offline", + "sourcePath": "/platform-api/meeting/meeting-settings/remove-participants", + "openimPath": "/platform-api/meeting/meeting-settings/remove-participants", "context": "chat/platform-api", "template": "api", - "title": "After a user goes offline", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-offline.mdx" + "title": "Remove meeting participants", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/remove-participants.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-online", - "openimPath": "/platform-api/webhooks/push/after-user-online", + "sourcePath": "/platform-api/meeting/meeting-settings/set-meeting-host", + "openimPath": "/platform-api/meeting/meeting-settings/set-meeting-host", "context": "chat/platform-api", "template": "api", - "title": "After a user comes online", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-online.mdx" + "title": "Set meeting hosts", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-meeting-host.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-group-online-push", - "openimPath": "/platform-api/webhooks/push/before-group-online-push", + "sourcePath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", + "openimPath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", "context": "chat/platform-api", "template": "api", - "title": "Before group online push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-group-online-push.mdx" + "title": "Clean previous meeting state", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/clean-previous-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-offline-push", - "openimPath": "/platform-api/webhooks/push/before-offline-push", + "sourcePath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before offline push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-offline-push.mdx" + "title": "Create a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/create-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-online-push", - "openimPath": "/platform-api/webhooks/push/before-online-push", + "sourcePath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before one-to-one online push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-online-push.mdx" + "title": "Update a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/update-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-add-friend", - "openimPath": "/platform-api/webhooks/relation/after-add-friend", + "sourcePath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "After adding a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend.mdx" + "title": "Delete a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/delete-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-add-friend-agree", - "openimPath": "/platform-api/webhooks/relation/after-add-friend-agree", + "sourcePath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "After accepting a friend request", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend-agree.mdx" + "title": "Get a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/get-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-delete-friend", - "openimPath": "/platform-api/webhooks/relation/after-delete-friend", + "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", + "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", "context": "chat/platform-api", "template": "api", - "title": "After deleting a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-delete-friend.mdx" + "title": "List recurring meetings", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-import-friends", - "openimPath": "/platform-api/webhooks/relation/after-import-friends", + "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", + "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", "context": "chat/platform-api", "template": "api", - "title": "After importing friends", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-import-friends.mdx" + "title": "List recurring meeting instances", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-remove-black", - "openimPath": "/platform-api/webhooks/relation/after-remove-black", + "sourcePath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", + "openimPath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", "context": "chat/platform-api", "template": "api", - "title": "After removing from the blacklist", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-remove-black.mdx" + "title": "Get a user's meeting history", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-meeting-histories.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-set-friend-remark", - "openimPath": "/platform-api/webhooks/relation/after-set-friend-remark", + "sourcePath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", + "openimPath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", "context": "chat/platform-api", "template": "api", - "title": "After setting a friend remark", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-set-friend-remark.mdx" + "title": "Get meetings hosted by a user", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-hosted-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-black", - "openimPath": "/platform-api/webhooks/relation/before-add-black", + "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-records", + "openimPath": "/platform-api/meeting/meeting-records/get-meeting-records", "context": "chat/platform-api", "template": "api", - "title": "Before adding to the blacklist", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-black.mdx" + "title": "Get meeting recordings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-records.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-friend", - "openimPath": "/platform-api/webhooks/relation/before-add-friend", + "sourcePath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", + "openimPath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", "context": "chat/platform-api", "template": "api", - "title": "Before adding a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend.mdx" + "title": "Get recordings by meeting IDs", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-records-by-meeting-ids.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-friend-agree", - "openimPath": "/platform-api/webhooks/relation/before-add-friend-agree", + "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-attendance", + "openimPath": "/platform-api/meeting/meeting-records/get-meeting-attendance", "context": "chat/platform-api", "template": "api", - "title": "Before accepting a friend request", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend-agree.mdx" + "title": "Get meeting attendance", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-attendance.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-import-friends", - "openimPath": "/platform-api/webhooks/relation/before-import-friends", + "sourcePath": "/platform-api/meeting/meeting-records/delete-meeting-records", + "openimPath": "/platform-api/meeting/meeting-records/delete-meeting-records", "context": "chat/platform-api", "template": "api", - "title": "Before importing friends", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-import-friends.mdx" + "title": "Delete meeting recordings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/delete-meeting-records.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-set-friend-remark", - "openimPath": "/platform-api/webhooks/relation/before-set-friend-remark", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", + "openimPath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", "context": "chat/platform-api", "template": "api", - "title": "Before setting a friend remark", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-set-friend-remark.mdx" + "title": "Get a call room by group ID", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-room-by-group-id.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-update-user-info", - "openimPath": "/platform-api/webhooks/user/after-update-user-info", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", + "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", "context": "chat/platform-api", "template": "api", - "title": "After updating user information", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info.mdx" + "title": "Get call rooms", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-rooms.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-update-user-info-ex", - "openimPath": "/platform-api/webhooks/user/after-update-user-info-ex", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", + "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", "context": "chat/platform-api", "template": "api", - "title": "After updating selected user fields", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info-ex.mdx" + "title": "Get a call invitation", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-invitation.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-user-register", - "openimPath": "/platform-api/webhooks/user/after-user-register", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", + "openimPath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", "context": "chat/platform-api", "template": "api", - "title": "After user registration", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-user-register.mdx" + "title": "Get a startup call invitation", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-startup-invitation.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-update-user-info", - "openimPath": "/platform-api/webhooks/user/before-update-user-info", + "sourcePath": "/platform-api/meeting/meeting-chat/send-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/send-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before updating user information", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info.mdx" + "title": "Send a meeting chat message", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/send-meeting-chat.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-update-user-info-ex", - "openimPath": "/platform-api/webhooks/user/before-update-user-info-ex", + "sourcePath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before updating selected user fields", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info-ex.mdx" + "title": "Pull meeting chat messages", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/pull-meeting-chat.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-user-register", - "openimPath": "/platform-api/webhooks/user/before-user-register", + "sourcePath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before user registration", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-user-register.mdx" + "title": "Revoke a meeting chat message", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/revoke-meeting-chat.mdx" }, { "sourcePath": "/sdk/error-codes", diff --git a/scripts/__tests__/client-sdk-sidebar.test.mjs b/scripts/__tests__/client-sdk-sidebar.test.mjs index c848b78925..9d40d1b91c 100644 --- a/scripts/__tests__/client-sdk-sidebar.test.mjs +++ b/scripts/__tests__/client-sdk-sidebar.test.mjs @@ -93,6 +93,7 @@ test('keeps relationships beside users and account settings beside user profiles ? [ '/sdk/android/user/online-status/subscribe-users-online-status', '/sdk/android/user/online-status/get-subscribe-online-users-status', + '/sdk/android/user/online-status/unsubscribe-users-online-status', ] : [ `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, diff --git a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs index 8bd14b6654..0d79f9b171 100644 --- a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs +++ b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs @@ -95,6 +95,53 @@ test('uses each native SDK method name while preserving the shared WASM route su ); }); +test('uses Flutter-aligned titles for Android media message routes', () => { + const expectedTitles = { + 'message/creating-messages/create-image-message': 'Create an image message', + 'message/creating-messages/create-image-message-by-file': + 'Create an image message from a local path', + 'message/creating-messages/create-image-message-by-url': + 'Create an image message from URLs', + 'message/creating-messages/create-sound-message': 'Create an audio message', + 'message/creating-messages/create-sound-message-by-file': + 'Create an audio message from a local path', + 'message/creating-messages/create-sound-message-by-url': + 'Create an audio message from a URL', + 'message/creating-messages/create-video-message': 'Create a video message', + 'message/creating-messages/create-video-message-by-file': + 'Create a video message from local paths', + 'message/creating-messages/create-video-message-by-url': + 'Create a video message from URLs', + 'message/creating-messages/create-file-message': 'Create a file message', + 'message/creating-messages/create-file-message-by-file': + 'Create a file message from a local path', + 'message/creating-messages/create-file-message-by-url': + 'Create a file message from a URL', + }; + + for (const [suffix, expectedTitle] of Object.entries(expectedTitles)) { + assert.equal( + resolveClientSdkRouteTitle({ + platformId: 'android', + suffix, + baselineTitle: 'Create a message from a file', + }), + expectedTitle, + ); + } +}); + +test('uses the batch-message deletion title for Android', () => { + assert.equal( + resolveClientSdkRouteTitle({ + platformId: 'android', + suffix: 'message/managing-messages/delete-saved-messages', + baselineTitle: 'Delete messages in a batch', + }), + 'Delete messages in a batch', + ); +}); + test('supports reviewed Android extension routes outside the WASM tree', () => { const routes = readJson('src/generated/routes.json'); const sidebar = readJson('data/structure/android-sidebar.json'); diff --git a/scripts/__tests__/wasm-commercial.test.mjs b/scripts/__tests__/wasm-commercial.test.mjs index dcb7db3613..eae678d97d 100644 --- a/scripts/__tests__/wasm-commercial.test.mjs +++ b/scripts/__tests__/wasm-commercial.test.mjs @@ -83,7 +83,9 @@ const nonCommercialEvents = [ ]; const platformSymbolAliases = { - android: {}, + android: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -126,6 +128,11 @@ const partialCommercialConceptSources = { '/sdk/ios/calling/managing-calls/handle-call-events', '/sdk/ios/calling/retrieving-call-information/restore-pending-invitation', ], + '/sdk/android/calling/overview-calling': [ + '/sdk/android/calling/managing-calls/start-single-call', + '/sdk/android/calling/managing-calls/handle-call-events', + '/sdk/android/calling/retrieving-call-information/restore-pending-invitation', + ], }; const fullCommercialConceptPages = new Set([ @@ -396,6 +403,12 @@ test('applies the WASM commercial presentation to verified Flutter and iOS capab assert.ok(flutterPinned.methods.includes('setConversationPinnedMsg')); assert.ok(flutterPinned.events.includes('onChangedPinnedMsg')); + const androidPinned = getPageCommercialInfo( + '/sdk/android/message/managing-messages/get-pinned-messages', + ); + assert.equal(androidPinned.kind, 'full'); + assert.ok(androidPinned.methods.includes('getConversationPinnedMsgs')); + const flutterTranscription = getPageCommercialInfo( '/sdk/flutter/message/composing-messages/transcribe-audio', ); @@ -420,6 +433,11 @@ test('marks calling overviews as mixed while preserving verified platform symbol assert.ok( iosOverview.methods.includes('getSignalingInvitationInfoStartAppWithOnSuccess:onFailure:'), ); + + const androidOverview = getPageCommercialInfo('/sdk/android/calling/overview-calling'); + assert.equal(androidOverview.kind, 'partial'); + assert.ok(androidOverview.methods.includes('signalingInvite')); + assert.ok(androidOverview.methods.includes('getSignalingInvitationInfoStartApp')); }); test('does not infer commercial presentation for absent or open-source native capabilities', () => { @@ -474,6 +492,24 @@ test('classifies mixed commercial pages', () => { getPageCommercialInfo('/sdk/wasm/group/group-applications/delete-group-requests').kind, 'full', ); + + for (const pagePath of [ + '/sdk/android/message/managing-messages/delete-saved-messages', + '/sdk/android/message/retrieving-messages/load-message-context', + '/sdk/android/message/managing-read-status/send-group-read-receipts', + '/sdk/android/message/managing-read-status/get-group-message-readers', + ]) { + assert.equal(getPageCommercialInfo(pagePath).kind, 'full'); + } + + assert.equal( + getPageCommercialInfo('/sdk/android/message/managing-messages/delete-user-messages').kind, + 'none', + ); + assert.equal( + getPageCommercialInfo('/sdk/android/message/composing-messages/update-typing-status').kind, + 'none', + ); }); test('matches commercial symbols in inline code text', () => { diff --git a/scripts/__tests__/wasm-full-capability-structure.test.mjs b/scripts/__tests__/wasm-full-capability-structure.test.mjs index 487b4c7b5a..61a9954201 100644 --- a/scripts/__tests__/wasm-full-capability-structure.test.mjs +++ b/scripts/__tests__/wasm-full-capability-structure.test.mjs @@ -655,16 +655,19 @@ test('the rendered WASM overview links only to active capability pages', () => { assert.match(source, /OpenIM WASM SDK 为浏览器应用/); }); -test('custom SDK overviews render for Chinese pages and the reviewed English WASM overview', () => { +test('custom SDK overviews render for Chinese pages and reviewed English WASM and Android overviews', () => { const source = readFileSync('src/components/docs/documentation-page.tsx', 'utf8'); + const overviewSource = readFileSync('src/components/docs/sdk-overview-page.tsx', 'utf8'); const wasmOverview = readFileSync( 'content/zh/docs/chat/sdk/wasm/overview.mdx', 'utf8', ); assert.match(source, /candidateSdkOverviewPlatform === 'wasm'/); + assert.match(source, /candidateSdkOverviewPlatform === 'android'/); assert.match(source, /'\/sdk\/flutter\/overview': 'flutter'/); assert.match(source, /'\/sdk\/ios\/overview': 'ios'/); assert.match(source, /'\/sdk\/wasm\/overview': 'wasm'/); + assert.match(overviewSource, /OpenIM Android SDK provides users, conversations, groups/); assert.equal(wasmOverview.replace(/^---\n[\s\S]*?\n---\n?/, '').trim(), ''); }); diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index a611e3ac20..6d7826555d 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -29,10 +29,35 @@ const androidRouteTitles = { 'user/blacklist/remove-blacklist': 'Unblock a user', 'user/online-status/subscribe-users-online-status': 'Subscribe to user online status', 'user/online-status/get-subscribe-online-users-status': 'Get subscribed user online status', + 'user/online-status/unsubscribe-users-online-status': 'Unsubscribe from user status', 'group/group-applications/overview-group-applications': 'Group applications overview', 'group/retrieving-group-members/overview-retrieving-group-members': 'Group member queries overview', 'message/sending-messages/set-msg-send-progress-listener': 'Track message sending progress', + 'message/managing-messages/delete-saved-messages': 'Delete messages in a batch', + 'message/creating-messages/create-image-message': 'Create an image message', + 'message/creating-messages/create-image-message-by-file': + 'Create an image message from a local path', + 'message/creating-messages/create-image-message-by-url': + 'Create an image message from URLs', + 'message/creating-messages/create-sound-message': 'Create an audio message', + 'message/creating-messages/create-sound-message-by-file': + 'Create an audio message from a local path', + 'message/creating-messages/create-sound-message-by-url': + 'Create an audio message from a URL', + 'message/creating-messages/create-video-message': 'Create a video message', + 'message/creating-messages/create-video-message-by-file': + 'Create a video message from local paths', + 'message/creating-messages/create-video-message-by-url': + 'Create a video message from URLs', + 'message/creating-messages/create-file-message': 'Create a file message', + 'message/creating-messages/create-file-message-by-file': + 'Create a file message from a local path', + 'message/creating-messages/create-file-message-by-url': + 'Create a file message from a URL', + 'message/creating-messages/create-advanced-text-message': 'Create a rich-text message', + 'message/creating-messages/create-advanced-quote-message': 'Create a rich-text reply', + 'message/composing-messages/get-typing-status': 'Retrieve typing status', 'file-uploads/track-file-upload-progress': 'Track file upload progress', }; diff --git a/src/components/docs/documentation-page.tsx b/src/components/docs/documentation-page.tsx index 1e16f03ed2..45cd87f1b8 100644 --- a/src/components/docs/documentation-page.tsx +++ b/src/components/docs/documentation-page.tsx @@ -212,7 +212,9 @@ export async function renderDocumentationPage( const candidateSdkOverviewPlatform = getSdkOverviewPlatform(effectiveRoute.path); const sdkOverviewPlatform = - locale === 'zh' || candidateSdkOverviewPlatform === 'wasm' + locale === 'zh' || + candidateSdkOverviewPlatform === 'wasm' || + candidateSdkOverviewPlatform === 'android' ? candidateSdkOverviewPlatform : undefined; diff --git a/src/components/docs/sdk-overview-page.tsx b/src/components/docs/sdk-overview-page.tsx index f51dabfc25..6649482ee1 100644 --- a/src/components/docs/sdk-overview-page.tsx +++ b/src/components/docs/sdk-overview-page.tsx @@ -357,6 +357,102 @@ const mobileCopy = { }, } satisfies Record, OverviewCopy>; +const androidEnglishCopy = { + eyebrow: 'Version 4', + intro: + 'OpenIM Android SDK provides users, conversations, groups, messages, realtime events, and local storage for native Android applications. Configure the Android project and sign in first, then connect business data to application state through manager APIs and listeners.', + mostPopular: 'Most popular', + recommended: 'Recommended features', + resources: 'Resources', + popular: [ + { + title: 'Manage conversations', + description: + 'Configure conversation state, drafts, unread counts, hiding, and deletion.', + href: '/sdk/android/conversation/overview-conversation', + visual: 'migration', + }, + { + title: 'Unread message count', + description: + 'Read conversation unread counts and synchronize chat lists, badges, and global unread state.', + href: '/sdk/android/conversation/managing-conversations/mark-conversation-read', + visual: 'unread', + }, + { + title: 'Conversation read status', + description: + 'Clear conversation unread counts and handle one-to-one message read receipts.', + href: '/sdk/android/conversation/managing-conversations/mark-conversation-read', + visual: 'receipt', + }, + { + title: 'Send messages', + description: 'Create text, file, or custom messages and send them to users or groups.', + href: '/sdk/android/message/sending-messages/send-message', + visual: 'message', + }, + { + title: 'Receive messages', + description: + 'Subscribe to new-message events and merge incremental messages into application state.', + href: '/sdk/android/message/receiving-messages/receive-messages', + visual: 'events', + }, + { + title: 'Message history', + description: + 'Retrieve local and synchronized message history with conversation identifiers and message cursors.', + href: '/sdk/android/message/retrieving-messages/load-older-messages', + visual: 'history', + }, + ], + features: [ + { + title: 'Authentication', + description: + 'Sign in with a backend-issued token and handle connection, expiration, and forced-logout events.', + href: '/sdk/android/getting-started/authenticate-and-manage-session', + }, + { + title: 'Groups', + description: + 'Manage group profiles, members, applications, permissions, and group events.', + href: '/sdk/android/group/overview-group', + }, + { + title: 'Events', + description: + 'Register listeners on each manager and merge incremental data by stable identifiers.', + href: '/sdk/android/events/overview-events', + }, + ], + links: [ + { + title: 'Send your first message', + description: 'Complete integration, initialization, sign-in, target selection, and sending.', + href: '/sdk/android/getting-started/send-first-message', + }, + { + title: 'Android integration', + description: + 'Configure the Android project, SDK initialization, network permissions, and application data directory.', + href: '/sdk/android/getting-started/environment-specific-implementation', + }, + { + title: 'Logging and diagnostics', + description: + 'Configure SDK logging and retain error codes and messages for diagnosis.', + href: '/sdk/android/logger', + }, + { + title: 'Client SDK error codes', + description: 'Look up common client errors and choose a handling path by error source.', + href: '/sdk/error-codes', + }, + ], +} satisfies OverviewCopy; + function createMobilePopularCards( platform: Exclude, ): OverviewCard[] { @@ -421,7 +517,12 @@ export function SdkOverviewPage({ route: RouteRecord; showVersion: boolean; }) { - const text = platform === 'wasm' ? copy[locale] : mobileCopy[platform]; + const text = + platform === 'wasm' + ? copy[locale] + : platform === 'android' && locale === 'en' + ? androidEnglishCopy + : mobileCopy[platform]; return (
diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index 93cc315043..e5f04071b4 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1,8 +1,8 @@ { "sourceContext": "chat/sdk/android", "sourceRoot": "content/zh/docs/chat/sdk/android", - "pageCount": 134, - "manualPageCount": 134, + "pageCount": 146, + "manualPageCount": 146, "pendingPaths": [], "reviewStates": { "/sdk/android/overview": "published", @@ -17,6 +17,7 @@ "/sdk/android/user/user-profile/set-global-message-reception": "published", "/sdk/android/user/online-status/subscribe-users-online-status": "published", "/sdk/android/user/online-status/get-subscribe-online-users-status": "published", + "/sdk/android/user/online-status/unsubscribe-users-online-status": "published", "/sdk/android/user/friends/get-friend-list-page": "published", "/sdk/android/user/friends/search-friends": "published", "/sdk/android/user/friends/get-friends-info": "published", @@ -88,18 +89,24 @@ "/sdk/android/message/creating-messages/create-text-message": "published", "/sdk/android/message/creating-messages/create-text-at-message": "published", "/sdk/android/message/creating-messages/create-custom-message": "published", + "/sdk/android/message/creating-messages/create-image-message": "published", "/sdk/android/message/creating-messages/create-image-message-by-file": "published", "/sdk/android/message/creating-messages/create-image-message-by-url": "published", + "/sdk/android/message/creating-messages/create-sound-message": "published", "/sdk/android/message/creating-messages/create-sound-message-by-file": "published", "/sdk/android/message/creating-messages/create-sound-message-by-url": "published", + "/sdk/android/message/creating-messages/create-video-message": "published", "/sdk/android/message/creating-messages/create-video-message-by-file": "published", "/sdk/android/message/creating-messages/create-video-message-by-url": "published", + "/sdk/android/message/creating-messages/create-file-message": "published", "/sdk/android/message/creating-messages/create-file-message-by-file": "published", "/sdk/android/message/creating-messages/create-file-message-by-url": "published", "/sdk/android/message/creating-messages/create-card-message": "published", "/sdk/android/message/creating-messages/create-location-message": "published", "/sdk/android/message/creating-messages/create-face-message": "published", "/sdk/android/message/creating-messages/create-quote-message": "published", + "/sdk/android/message/creating-messages/create-advanced-text-message": "published", + "/sdk/android/message/creating-messages/create-advanced-quote-message": "published", "/sdk/android/message/creating-messages/create-forward-message": "published", "/sdk/android/message/creating-messages/create-merger-message": "published", "/sdk/android/message/sending-messages/send-message": "published", @@ -110,10 +117,13 @@ "/sdk/android/message/retrieving-messages/load-older-messages": "published", "/sdk/android/message/retrieving-messages/load-newer-messages": "published", "/sdk/android/message/retrieving-messages/find-messages-by-id": "published", + "/sdk/android/message/retrieving-messages/load-message-context": "published", "/sdk/android/message/searching-messages/search-messages": "published", "/sdk/android/message/composing-messages/update-typing-status": "published", + "/sdk/android/message/composing-messages/get-typing-status": "published", "/sdk/android/message/managing-messages/delete-local-message": "published", "/sdk/android/message/managing-messages/delete-saved-messages": "published", + "/sdk/android/message/managing-messages/delete-user-messages": "published", "/sdk/android/message/managing-messages/revoke-a-message": "published", "/sdk/android/message/managing-messages/modify-a-message": "published", "/sdk/android/message/managing-messages/get-pinned-messages": "published", @@ -123,6 +133,8 @@ "/sdk/android/message/managing-messages/clear-all-local-messages": "published", "/sdk/android/message/managing-messages/clear-all-messages": "published", "/sdk/android/message/managing-messages/set-message-local-ex": "published", + "/sdk/android/message/managing-read-status/send-group-read-receipts": "published", + "/sdk/android/message/managing-read-status/get-group-message-readers": "published", "/sdk/android/file-uploads/track-file-upload-progress": "published", "/sdk/android/file-uploads/upload-file": "published", "/sdk/android/calling/overview-calling": "published", @@ -168,7 +180,7 @@ "get-users-info": "获取指定用户资料", "Get the current user profile": "获取当前用户资料", "get-self-local-user-info": "获取当前用户资料", - "Update the current user profile": "更新当前用户资料", + "Update your profile": "更新当前用户资料", "set-self-info": "更新当前用户资料", "Set global message reception": "设置全局消息接收方式", "set-global-message-reception": "设置全局消息接收方式", @@ -230,6 +242,8 @@ "Get subscribed user online status": "查询已订阅用户状态", "Refresh subscribed user status": "查询已订阅用户状态", "get-subscribe-online-users-status": "查询已订阅用户状态", + "Unsubscribe from user status": "取消用户状态订阅", + "unsubscribe-users-online-status": "取消用户状态订阅", "Conversation": "会话", "conversation": "会话", "Conversation overview": "会话概览", @@ -286,24 +300,24 @@ "profile-and-settings": "群资料与设置", "Create a group": "创建群组", "create-group": "创建群组", - "Update group profile": "更新群资料", - "update-group-profile": "更新群资料", - "Publish a group announcement": "发布群公告", - "set-group-announcement": "发布群公告", - "Set group extra data": "设置群扩展字段", - "set-group-extension": "设置群扩展字段", - "Group permissions": "群权限", - "permissions": "群权限", + "Update group profile": "更新群名称、简介和头像", + "update-group-profile": "更新群名称、简介和头像", + "Publish a group announcement": "发布或更新群公告", + "set-group-announcement": "发布或更新群公告", + "Set group extra data": "设置群组扩展字段", + "set-group-extension": "设置群组扩展字段", + "Group permissions": "群权限与管理", + "permissions": "群权限与管理", "Set group join verification": "设置入群验证方式", "set-group-join-verification": "设置入群验证方式", "Set member profile access": "设置成员资料查看权限", "set-group-member-profile-access": "设置成员资料查看权限", - "Set member friend request permission": "设置成员好友申请权限", - "set-group-member-friend-permission": "设置成员好友申请权限", - "Change group mute status": "设置全员禁言", - "change-group-mute": "设置全员禁言", - "Joining and leaving groups": "加入与退出群组", - "joining-and-leaving": "加入与退出群组", + "Set member friend request permission": "设置群内添加好友权限", + "set-group-member-friend-permission": "设置群内添加好友权限", + "Change group mute status": "设置群组全员禁言", + "change-group-mute": "设置群组全员禁言", + "Joining and leaving groups": "加入、退出与解散群组", + "joining-and-leaving": "加入、退出与解散群组", "Apply to join a group": "申请加入群组", "join-group": "申请加入群组", "Leave a group": "退出群组", @@ -312,58 +326,58 @@ "dismiss-group": "解散群组", "Retrieving groups": "查询群组", "retrieving-groups": "查询群组", - "Get group information": "获取群资料", - "get-specified-groups-info": "获取群资料", + "Get group information": "查询指定群组资料", + "get-specified-groups-info": "查询指定群组资料", "Get joined groups by page": "分页获取已加入群组", "get-joined-group-list-page": "分页获取已加入群组", - "Check group membership": "检查是否加入群组", - "is-join-group": "检查是否加入群组", + "Check group membership": "检查是否已加入群组", + "is-join-group": "检查是否已加入群组", "Search groups": "搜索群组", "search-groups": "搜索群组", - "Group applications": "群申请", - "group-applications": "群申请", - "Group applications overview": "群申请概览", - "overview-group-applications": "群申请概览", - "Get received group applications": "获取收到的群申请", - "get-group-application-list-as-recipient": "获取收到的群申请", - "Get sent group applications": "获取发出的群申请", - "get-group-application-list-as-applicant": "获取发出的群申请", - "Accept a group application": "同意群申请", - "accept-group-application": "同意群申请", - "Reject a group application": "拒绝群申请", - "refuse-group-application": "拒绝群申请", + "Group applications": "入群申请", + "group-applications": "入群申请", + "Group applications overview": "入群申请概览", + "overview-group-applications": "入群申请概览", + "Get received group applications": "获取收到的入群申请", + "get-group-application-list-as-recipient": "获取收到的入群申请", + "Get sent group applications": "获取发出的入群申请", + "get-group-application-list-as-applicant": "获取发出的入群申请", + "Accept a group application": "接受入群申请", + "accept-group-application": "接受入群申请", + "Reject a group application": "拒绝入群申请", + "refuse-group-application": "拒绝入群申请", "Retrieving group members": "查询群成员", "retrieving-group-members": "查询群成员", "Group member queries overview": "群成员查询概览", "overview-retrieving-group-members": "群成员查询概览", - "Get group members": "获取群成员列表", - "get-group-member-list": "获取群成员列表", - "Get group member profiles": "获取群成员资料", - "get-specified-group-members-info": "获取群成员资料", - "Check users in a group": "检查用户是否在群内", - "get-users-in-group": "检查用户是否在群内", + "Get group members": "分页查询群成员", + "get-group-member-list": "分页查询群成员", + "Get group member profiles": "查询指定群成员资料", + "get-specified-group-members-info": "查询指定群成员资料", + "Check users in a group": "查询用户入群状态", + "get-users-in-group": "查询用户入群状态", "Get group owners and admins": "获取群主和管理员", "get-group-member-owner-and-admin": "获取群主和管理员", "Search group members": "搜索群成员", "search-group-members": "搜索群成员", "Managing group members": "管理群成员", "managing-group-members": "管理群成员", - "Invite users to a group": "邀请用户入群", - "invite-user-to-group": "邀请用户入群", + "Invite users to a group": "邀请用户加入群组", + "invite-user-to-group": "邀请用户加入群组", "Remove group members": "移除群成员", "kick-group-member": "移除群成员", - "Update a group nickname": "更新群昵称", - "set-group-member-nickname": "更新群昵称", - "Manage group administrators": "管理群管理员", - "set-group-member-role-level": "管理群管理员", + "Update a group nickname": "修改群内昵称", + "set-group-member-nickname": "修改群内昵称", + "Manage group administrators": "设置管理员", + "set-group-member-role-level": "设置管理员", "Update a group member avatar": "更新群成员头像", "set-group-member-avatar": "更新群成员头像", "Set group member extra data": "设置群成员扩展字段", "set-group-member-extension": "设置群成员扩展字段", "Transfer group ownership": "转让群主", "transfer-group-owner": "转让群主", - "Mute or unmute a group member": "禁言或解除禁言群成员", - "change-group-member-mute": "禁言或解除禁言群成员", + "Mute or unmute a group member": "设置群成员禁言", + "change-group-member-mute": "设置群成员禁言", "Message": "消息", "message": "消息", "Message overview": "消息概览", @@ -376,30 +390,47 @@ "create-text-at-message": "创建 @ 消息", "Create a custom message": "创建自定义消息", "create-custom-message": "创建自定义消息", - "Create an image message from a file": "从文件创建图片消息", - "create-image-message-by-file": "从文件创建图片消息", - "Create an image message from a URL": "从 URL 创建图片消息", - "create-image-message-by-url": "从 URL 创建图片消息", - "Create an audio message from a file": "从文件创建音频消息", - "create-sound-message-by-file": "从文件创建音频消息", - "Create an audio message from a URL": "从 URL 创建音频消息", - "create-sound-message-by-url": "从 URL 创建音频消息", - "Create a video message from a file": "从文件创建视频消息", - "create-video-message-by-file": "从文件创建视频消息", - "Create a video message from a URL": "从 URL 创建视频消息", - "create-video-message-by-url": "从 URL 创建视频消息", - "Create a file message from a file": "从文件创建文件消息", - "create-file-message-by-file": "从文件创建文件消息", - "Create a file message from a URL": "从 URL 创建文件消息", - "create-file-message-by-url": "从 URL 创建文件消息", + "Create an image message": "创建图片消息", + "create-image-message": "创建图片消息", + "Create an image message from a file": "使用本地路径创建图片消息", + "Create an image message from a path": "使用本地路径创建图片消息", + "create-image-message-by-file": "使用本地路径创建图片消息", + "Create an image message from a URL": "使用 URL 创建图片消息", + "Create an image message from URLs": "使用 URL 创建图片消息", + "create-image-message-by-url": "使用 URL 创建图片消息", + "Create an audio message": "创建音频消息", + "create-sound-message": "创建音频消息", + "Create an audio message from a file": "使用本地路径创建音频消息", + "Create an audio message from a path": "使用本地路径创建音频消息", + "create-sound-message-by-file": "使用本地路径创建音频消息", + "Create an audio message from a URL": "使用 URL 创建音频消息", + "create-sound-message-by-url": "使用 URL 创建音频消息", + "Create a video message": "创建视频消息", + "create-video-message": "创建视频消息", + "Create a video message from a file": "使用本地路径创建视频消息", + "Create a video message from a path": "使用本地路径创建视频消息", + "create-video-message-by-file": "使用本地路径创建视频消息", + "Create a video message from a URL": "使用 URL 创建视频消息", + "create-video-message-by-url": "使用 URL 创建视频消息", + "Create a file message": "创建文件消息", + "create-file-message": "创建文件消息", + "Create a file message from a file": "使用本地路径创建文件消息", + "Create a file message from a path": "使用本地路径创建文件消息", + "create-file-message-by-file": "使用本地路径创建文件消息", + "Create a file message from a URL": "使用 URL 创建文件消息", + "create-file-message-by-url": "使用 URL 创建文件消息", "Create a contact card message": "创建名片消息", "create-card-message": "创建名片消息", "Create a location message": "创建位置消息", "create-location-message": "创建位置消息", "Create an emoji message": "创建表情消息", "create-face-message": "创建表情消息", - "Create a reply message": "创建引用消息", - "create-quote-message": "创建引用消息", + "Create a reply message": "创建回复消息", + "create-quote-message": "创建回复消息", + "Create rich text": "创建富文本消息", + "create-advanced-text-message": "创建富文本消息", + "Create a rich reply": "创建富文本回复", + "create-advanced-quote-message": "创建富文本回复", "Create a forwarded message": "创建转发消息", "create-forward-message": "创建转发消息", "Create a merged message": "创建合并消息", @@ -408,10 +439,10 @@ "sending-messages": "发送消息", "Send a message": "发送消息", "send-message": "发送消息", - "Send a message without OSS": "发送非 OSS 消息", - "send-message-not-oss": "发送非 OSS 消息", - "Track message sending progress": "跟踪消息发送进度", - "set-msg-send-progress-listener": "跟踪消息发送进度", + "Send a message without OSS": "发送不经 OSS 的消息", + "send-message-not-oss": "发送不经 OSS 的消息", + "Track message sending progress": "监听消息发送进度", + "set-msg-send-progress-listener": "监听消息发送进度", "Receiving messages": "接收消息", "receiving-messages": "接收消息", "Receive messages": "接收消息", @@ -420,59 +451,76 @@ "receive-custom-business-messages": "接收自定义业务消息", "Retrieving messages": "查询消息", "retrieving-messages": "查询消息", - "Load older messages": "加载更早消息", - "load-older-messages": "加载更早消息", - "Load newer messages": "加载更新消息", - "load-newer-messages": "加载更新消息", - "Find messages by ID": "按 ID 查询消息", - "find-messages-by-id": "按 ID 查询消息", + "Load older messages": "加载历史消息", + "load-older-messages": "加载历史消息", + "Load newer messages": "反向加载历史消息", + "load-newer-messages": "反向加载历史消息", + "Find messages by ID": "按 ID 查找消息", + "find-messages-by-id": "按 ID 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", "Search messages": "搜索消息", "search-messages": "搜索消息", "Composing messages": "编辑消息", "composing-messages": "编辑消息", - "Update typing status": "更新输入状态", - "update-typing-status": "更新输入状态", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", "Managing messages": "管理消息", "managing-messages": "管理消息", "Delete a local message": "删除本地消息", "delete-local-message": "删除本地消息", - "Delete saved messages": "删除已保存消息", - "delete-saved-messages": "删除已保存消息", + "Delete a message": "批量删除消息", + "Delete a saved message": "批量删除消息", + "Delete saved messages": "批量删除消息", + "Delete messages in a batch": "批量删除消息", + "delete-saved-messages": "批量删除消息", + "Delete messages from a user": "删除群聊中指定用户的全部消息", + "Delete all messages from a user in a group chat": "删除群聊中指定用户的全部消息", + "delete-user-messages": "删除群聊中指定用户的全部消息", "Revoke a message": "撤回消息", "revoke-a-message": "撤回消息", "Modify a message": "修改消息", "modify-a-message": "修改消息", - "View pinned messages": "查看置顶消息", - "get-pinned-messages": "查看置顶消息", + "View pinned messages": "查询会话置顶消息", + "get-pinned-messages": "查询会话置顶消息", "Pin or unpin a message": "置顶或取消置顶消息", "set-message-pinned": "置顶或取消置顶消息", "Insert a local direct message": "插入本地单聊消息", "insert-local-single-message": "插入本地单聊消息", "Insert a local group message": "插入本地群聊消息", "insert-local-group-message": "插入本地群聊消息", - "Clear all local messages": "清空全部本地消息", - "clear-all-local-messages": "清空全部本地消息", - "Clear all saved messages": "清空全部已保存消息", - "clear-all-messages": "清空全部已保存消息", - "Set local message extensions": "设置消息本地扩展字段", - "set-message-local-ex": "设置消息本地扩展字段", + "Clear all local messages": "清理全部本地消息", + "clear-all-local-messages": "清理全部本地消息", + "Clear all saved messages": "清理全部消息", + "clear-all-messages": "清理全部消息", + "Set local message extensions": "设置消息本地扩展", + "set-message-local-ex": "设置消息本地扩展", + "Group message read status": "群消息已读状态", + "group-message-read-status": "群消息已读状态", + "Send group read receipts": "上报群消息已读", + "Report group messages as read": "上报群消息已读", + "send-group-read-receipts": "上报群消息已读", + "View group message readers": "查询群消息已读成员", + "Get members who read a group message": "查询群消息已读成员", + "get-group-message-readers": "查询群消息已读成员", "Create an @ message": "创建 @ 消息", - "Create a video message from files": "从文件创建视频消息", - "Create a video message from URLs": "从 URL 创建视频消息", + "Create a video message from files": "使用本地路径创建视频消息", + "Create a video message from URLs": "使用 URL 创建视频消息", "Create a merged forward message": "创建合并转发消息", - "Send an uploaded media message": "发送已上传媒体消息", + "Send an uploaded media message": "发送不经 OSS 的消息", "Load message history": "加载历史消息", - "Load message history in reverse": "逆序加载历史消息", + "Load message history in reverse": "反向加载历史消息", "Report typing status": "上报输入状态", - "Delete messages in a batch": "批量删除消息", - "Get pinned messages in a conversation": "获取会话置顶消息", + "Get pinned messages in a conversation": "查询会话置顶消息", "Insert a local one-to-one message": "插入本地单聊消息", - "Clear local and server messages": "清空本地和服务端消息", - "Set a local message extension": "设置消息本地扩展字段", + "Clear local and server messages": "清理全部消息", + "Set a local message extension": "设置消息本地扩展", "File uploads": "文件上传", "file-uploads": "文件上传", - "Track file upload progress": "跟踪文件上传进度", - "track-file-upload-progress": "跟踪文件上传进度", + "Track file upload progress": "监听文件上传进度", + "track-file-upload-progress": "监听文件上传进度", "Upload a file": "上传文件", "upload-file": "上传文件", "Calling": "音视频通话", @@ -673,7 +721,7 @@ "title": "发送第一条消息" }, "/sdk/android/user/overview-user": { - "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", + "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "headings": [ { @@ -747,7 +795,7 @@ "title": "设置全局消息接收方式" }, "/sdk/android/user/online-status/subscribe-users-online-status": { - "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。", + "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。", "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "headings": [ { @@ -766,6 +814,13 @@ "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", "title": "查询已订阅用户状态" }, + "/sdk/android/user/online-status/unsubscribe-users-online-status": { + "body": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n for (String userID : userIDs) {\n presenceByUserID.remove(userID);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusUnsubscribeFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。\n\n需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。", + "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", + "headings": [], + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "取消用户状态订阅" + }, "/sdk/android/user/friends/get-friend-list-page": { "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendListFailure(code, error);\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。\n\n## 好友资料字段\n\n`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID,也是好友列表的稳定标识。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。\n\n本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n friendStore.remove(friend.getUserID());\n}\n```", "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", @@ -1064,21 +1119,21 @@ "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "headings": [], "sourcePath": "/sdk/android/group/update-group-profile", - "title": "更新群资料" + "title": "更新群名称、简介和头像" }, "/sdk/android/group/set-group-announcement": { "body": "Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。", "description": "通过 GroupInfo.notification 发布或更新群公告。", "headings": [], "sourcePath": "/sdk/android/group/set-group-announcement", - "title": "发布群公告" + "title": "发布或更新群公告" }, "/sdk/android/group/set-group-extension": { "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```\n\n不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。", "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "headings": [], "sourcePath": "/sdk/android/group/set-group-extension", - "title": "设置群扩展字段" + "title": "设置群组扩展字段" }, "/sdk/android/group/set-group-join-verification": { "body": "入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); }\n @Override public void onError(int code, String error) { showVerificationError(error); }\n});\n```\n\n该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。", @@ -1099,14 +1154,14 @@ "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "headings": [], "sourcePath": "/sdk/android/group/set-group-member-friend-permission", - "title": "设置成员好友申请权限" + "title": "设置群内添加好友权限" }, "/sdk/android/group/change-group-mute": { "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```\n\n群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。", "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "headings": [], "sourcePath": "/sdk/android/group/change-group-mute", - "title": "设置全员禁言" + "title": "设置群组全员禁言" }, "/sdk/android/group/join-group": { "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。", @@ -1134,7 +1189,7 @@ "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "title": "获取群资料" + "title": "查询指定群组资料" }, "/sdk/android/group/retrieving-groups/get-joined-group-list-page": { "body": "Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。", @@ -1148,7 +1203,7 @@ "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", - "title": "检查是否加入群组" + "title": "检查是否已加入群组" }, "/sdk/android/group/retrieving-groups/search-groups": { "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。", @@ -1162,35 +1217,35 @@ "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "群申请概览" + "title": "入群申请概览" }, "/sdk/android/group/group-applications/get-group-application-list-as-recipient": { "body": "使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。", "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "title": "获取收到的群申请" + "title": "获取收到的入群申请" }, "/sdk/android/group/group-applications/get-group-application-list-as-applicant": { "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。", "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "title": "获取发出的群申请" + "title": "获取发出的入群申请" }, "/sdk/android/group/group-applications/accept-group-application": { "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。", "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/accept-group-application", - "title": "同意群申请" + "title": "接受入群申请" }, "/sdk/android/group/group-applications/refuse-group-application": { "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。", "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", - "title": "拒绝群申请" + "title": "拒绝入群申请" }, "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": { "body": "成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。\n\n成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。", @@ -1204,21 +1259,21 @@ "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "获取群成员列表" + "title": "分页查询群成员" }, "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": { "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```\n\n返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。", "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "获取群成员资料" + "title": "查询指定群成员资料" }, "/sdk/android/group/retrieving-group-members/get-users-in-group": { "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用“获取群成员资料”。", "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "检查用户是否在群内" + "title": "查询用户入群状态" }, "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": { "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。", @@ -1239,7 +1294,7 @@ "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", - "title": "邀请用户入群" + "title": "邀请用户加入群组" }, "/sdk/android/group/managing-group-members/kick-group-member": { "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。", @@ -1253,14 +1308,14 @@ "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "更新群昵称" + "title": "修改群内昵称" }, "/sdk/android/group/managing-group-members/set-group-member-role-level": { "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n实际角色变更和权限由服务端校验,以成员资料变化事件为准。", "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "title": "管理群管理员" + "title": "设置管理员" }, "/sdk/android/group/managing-group-members/set-group-member-avatar": { "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。", @@ -1288,7 +1343,7 @@ "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", - "title": "禁言或解除禁言群成员" + "title": "设置群成员禁言" }, "/sdk/android/message/overview-message": { "body": "Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。\n\n```java\nOpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n});\n```\n\n查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。", @@ -1318,61 +1373,89 @@ "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", "title": "创建自定义消息" }, + "/sdk/android/message/creating-messages/create-image-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createImageMessage(imagePath);\n```\n\n图片文件应位于 SDK 初始化时配置的数据目录内,`imagePath` 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。", + "description": "使用相对于 SDK 初始化数据目录的路径创建图片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "title": "创建图片消息" + }, "/sdk/android/message/creating-messages/create-image-message-by-file": { - "body": "缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath);\n```", - "description": "使用相对路径或绝对路径创建图片消息。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createImageMessageFromFullPath(absolutePath);\n```\n\n绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。", + "description": "使用绝对路径创建图片消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "从文件创建图片消息" + "title": "使用本地路径创建图片消息" }, "/sdk/android/message/creating-messages/create-image-message-by-url": { "body": "准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageByURL(\n sourceURL, sourcePicture, bigPicture, snapshotPicture);\n```", "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "从 URL 创建图片消息" + "title": "使用 URL 创建图片消息" + }, + "/sdk/android/message/creating-messages/create-sound-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessage(soundPath, durationSeconds);\n```\n\n音频文件应位于 SDK 初始化时配置的数据目录内,`soundPath` 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。", + "description": "使用相对于 SDK 初始化数据目录的路径创建音频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "创建音频消息" }, "/sdk/android/message/creating-messages/create-sound-message-by-file": { - "body": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessageFromFullPath(soundPath, durationSeconds);\n```", - "description": "使用相对路径或绝对路径创建音频消息。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessageFromFullPath(absolutePath, durationSeconds);\n```\n\n绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。", + "description": "使用绝对路径创建音频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "从文件创建音频消息" + "title": "使用本地路径创建音频消息" }, "/sdk/android/message/creating-messages/create-sound-message-by-url": { "body": "`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem);\n```", "description": "使用 SoundElem 创建已上传资源的音频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "title": "从 URL 创建音频消息" + "title": "使用 URL 创建音频消息" + }, + "/sdk/android/message/creating-messages/create-video-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessage(\n videoPath,\n mimeType,\n durationSeconds,\n snapshotPath\n);\n```\n\n视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。", + "description": "使用相对于 SDK 初始化数据目录的路径创建视频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "title": "创建视频消息" }, "/sdk/android/message/creating-messages/create-video-message-by-file": { - "body": "视频方法需要 MIME 类型、时长和缩略图路径。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath(\n videoPath, mimeType, durationSeconds, snapshotPath);\n```", - "description": "使用相对路径或绝对路径创建视频消息及缩略图。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath(\n absoluteVideoPath,\n mimeType,\n durationSeconds,\n absoluteSnapshotPath\n);\n```\n\n视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。", + "description": "使用视频和缩略图的绝对路径创建视频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "从文件创建视频消息" + "title": "使用本地路径创建视频消息" }, "/sdk/android/message/creating-messages/create-video-message-by-url": { "body": "将远端视频及缩略图信息填入 `VideoElem` 后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem);\n```", "description": "使用 VideoElem 创建已上传资源的视频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "title": "从 URL 创建视频消息" + "title": "使用 URL 创建视频消息" + }, + "/sdk/android/message/creating-messages/create-file-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessage(filePath, fileName);\n```\n\n文件应位于 SDK 初始化时配置的数据目录内,`filePath` 传入相对于该目录的路径,`fileName` 用于接收端展示。本方法只创建待发送对象。", + "description": "使用相对于 SDK 初始化数据目录的路径创建文件消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "title": "创建文件消息" }, "/sdk/android/message/creating-messages/create-file-message-by-file": { - "body": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessageFromFullPath(filePath, fileName);\n```", - "description": "使用相对路径或绝对路径创建文件消息。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessageFromFullPath(absolutePath, fileName);\n```\n\n绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。", + "description": "使用绝对路径创建文件消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "从文件创建文件消息" + "title": "使用本地路径创建文件消息" }, "/sdk/android/message/creating-messages/create-file-message-by-url": { "body": "`FileElem` 应包含远端 URL、文件名和文件大小。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem);\n```", "description": "使用 FileElem 创建已上传资源的文件消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "title": "从 URL 创建文件消息" + "title": "使用 URL 创建文件消息" }, "/sdk/android/message/creating-messages/create-card-message": { "body": "`CardElem` 保存名片用户的展示资料。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem);\n```", @@ -1400,7 +1483,21 @@ "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", - "title": "创建引用消息" + "title": "创建回复消息" + }, + "/sdk/android/message/creating-messages/create-advanced-text-message": { + "body": "`RichMessage` 使用 `offset` 和 `length` 标记正文范围,并通过 `type`、`url` 和 `info` 携带业务定义的实体信息。\n\n```java\nRichMessage link = new RichMessage();\nlink.setType(\"link\");\nlink.setOffset(0);\nlink.setLength(6);\nlink.setUrl(\"https://docs.openim.io\");\nlink.setInfo(\"{\\\"title\\\":\\\"OpenIM documentation\\\"}\");\n\nMessage message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage(\n \"OpenIM docs\",\n Collections.singletonList(link)\n);\n```\n\n每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 `info` 内容,并确保接收端使用相同的 `type` 与 `info` 协议。本方法只创建 `Message`,不会发送消息;创建完成后使用[发送消息](/sdk/android/message/sending-messages/send-message)。", + "description": "使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "创建富文本消息" + }, + "/sdk/android/message/creating-messages/create-advanced-quote-message": { + "body": "富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。\n\n```java\nRichMessage mention = new RichMessage();\nmention.setType(\"mention\");\nmention.setOffset(0);\nmention.setLength(6);\nmention.setInfo(\"{\\\"userID\\\":\\\"user_a\\\"}\");\n\nMessage message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage(\n \"OpenIM agreed\",\n originalMessage,\n Collections.singletonList(mention)\n);\n```\n\n被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。", + "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "创建富文本回复" }, "/sdk/android/message/creating-messages/create-forward-message": { "body": "传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage);\n```", @@ -1417,7 +1514,7 @@ "title": "创建合并消息" }, "/sdk/android/message/sending-messages/send-message": { - "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(String id) { mergeSentMessage(message); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message", @@ -1428,14 +1525,14 @@ "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "发送非 OSS 消息" + "title": "发送不经 OSS 的消息" }, "/sdk/android/message/sending-messages/set-msg-send-progress-listener": { - "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(String id) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(Message sentMessage) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "title": "跟踪消息发送进度" + "title": "监听消息发送进度" }, "/sdk/android/message/receiving-messages/receive-messages": { "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", @@ -1452,25 +1549,38 @@ "title": "接收自定义业务消息" }, "/sdk/android/message/retrieving-messages/load-older-messages": { - "body": "首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。\n\n```java\nmessageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "body": "首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。普通历史消息使用 `ViewType.History`,按返回的 `clientMsgID` 去重。\n\n```java\nmessageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History);\n```", "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "加载更早消息" + "title": "加载历史消息" }, "/sdk/android/message/retrieving-messages/load-newer-messages": { - "body": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。\n\n```java\nmessageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "body": "该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 `ViewType.History`。\n\n```java\nmessageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History);\n```", "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "加载更新消息" + "title": "反向加载历史消息" }, "/sdk/android/message/retrieving-messages/find-messages-by-id": { "body": "构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "title": "按 ID 查询消息" + "title": "按 ID 查找消息" + }, + "/sdk/android/message/retrieving-messages/load-message-context": { + "body": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 |\n| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 |\n| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 |\n| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 |\n| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 |\n\n```java\nmessageManager.fetchSurroundingMessages(\n new OnBase() {\n @Override\n public void onSuccess(Messages messages) {\n List surrounding = messages.getData();\n renderMessages(surrounding);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n targetMessage,\n ViewType.Search,\n 20,\n 20\n);\n```\n\n成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。\n\n`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。", + "description": "使用 Android SDK 读取一条消息前后的上下文。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "读取消息上下文" }, "/sdk/android/message/searching-messages/search-messages": { "body": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。\n\n```java\nmessageManager.searchLocalMessages(callback, conversationID, keywords, 1,\n senderIDs, messageTypes, 0, 0, 0, 20);\n```", @@ -1480,11 +1590,18 @@ "title": "搜索消息" }, "/sdk/android/message/composing-messages/update-typing-status": { - "body": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。\n\n```java\nmessageManager.typingStatusUpdate(callback, peerUserID, \"typing\");\n```\n\n成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。", - "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", + "body": "进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。\n\n```java\nconversationManager.changeInputState(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 输入状态已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n true\n);\n```\n\n输入结束时及时清除状态:\n\n```java\nconversationManager.changeInputState(callback, conversationID, false);\n```\n\n调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。\n\n其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。\n\n进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。", + "description": "使用 Android SDK 上报当前会话的输入状态。", "headings": [], "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", - "title": "更新输入状态" + "title": "上报输入状态" + }, + "/sdk/android/message/composing-messages/get-typing-status": { + "body": "进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getInputState(\n new OnBase>() {\n @Override\n public void onSuccess(List platformIDs) {\n boolean typing = platformIDs != null && !platformIDs.isEmpty();\n updateTypingState(conversationID, userID, typing);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTypingStatusQueryFailure(code, error);\n }\n },\n conversationID,\n userID\n);\n```\n\n成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。", + "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", + "headings": [], + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "查询输入状态" }, "/sdk/android/message/managing-messages/delete-local-message": { "body": "该操作不影响其他设备和其他用户的消息记录。\n\n```java\nmessageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback);\n```", @@ -1494,22 +1611,35 @@ "title": "删除本地消息" }, "/sdk/android/message/managing-messages/delete-saved-messages": { - "body": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。\n\n```java\nmessageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback);\n```", - "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", - "headings": [], + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 |\n| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 |\n| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 |\n\n```java\nDeleteMessagesReq request = new DeleteMessagesReq(\n true,\n conversationID,\n selectedClientMsgIDs.toArray(new String[0])\n);\n\nmessageManager.deleteMessages(request, new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n});\n```\n\n`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。\n\n成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。\n\n`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。\n\n```java\n@Override\npublic void onMsgDeleted(Message message) {\n removeMessage(resolveConversationID(message), message.getClientMsgID());\n}\n```\n\n需要校准当前消息快照时,重新查询对应会话的历史消息。", + "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", - "title": "删除已保存消息" + "title": "批量删除消息" + }, + "/sdk/android/message/managing-messages/delete-user-messages": { + "body": "```java\nmessageManager.deleteUserAllMessagesInConv(\n conversationID,\n targetUserID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。\n\n`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。\n\n```java\n@Override\npublic void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) {\n removeMessagesBySender(event.getConversationID(), event.getUserID());\n}\n```\n\n成功回调、事件到达和重新查询历史是三个独立阶段。", + "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "删除群聊中指定用户的全部消息" }, "/sdk/android/message/managing-messages/revoke-a-message": { - "body": "Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```", - "description": "使用 revokeMessageV2 撤回已发送消息。", + "body": "撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```\n\n成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。\n\n本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息:\n\n```java\n@Override\npublic void onRecvMessageRevokedV2(RevokedInfo info) {\n String clientMsgID = info.getClientMsgID();\n String conversationID = findConversationIDByClientMsgID(clientMsgID);\n if (conversationID == null) {\n return;\n }\n markMessageRevoked(conversationID, clientMsgID, info);\n}\n```\n\n接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。\n\n成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。", + "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", "title": "撤回消息" }, "/sdk/android/message/managing-messages/modify-a-message": { - "body": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```", - "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", + "body": "`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```\n\n成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。\n\n本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配:\n\n```java\n@Override\npublic void onMessageModified(Message message) {\n String conversationID = resolveConversationID(message);\n if (conversationID == null) {\n return;\n }\n replaceMessage(conversationID, message.getClientMsgID(), message);\n}\n```\n\n该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。", + "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", "title": "修改消息" @@ -1519,11 +1649,11 @@ "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "查看置顶消息" + "title": "查询会话置顶消息" }, "/sdk/android/message/managing-messages/set-message-pinned": { - "body": "最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。\n\n```java\nmessageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true);\n```", - "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", + "body": "最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶:\n\n```java\nmessageManager.setConversationPinnedMsg(\n callback,\n conversationID,\n clientMsgID,\n true\n);\n```\n\n成功回调表示设置请求完成,不代表置顶变化事件已经到达。\n\n`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重:\n\n```java\n@Override\npublic void onChangedPinnedMsg(ChangedPinnedMsg event) {\n replacePinnedMessages(event.getConversationID(), event.getMsgs());\n}\n```\n\n该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。", + "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", "title": "置顶或取消置顶消息" @@ -1547,28 +1677,48 @@ "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "title": "清空全部本地消息" + "title": "清理全部本地消息" }, "/sdk/android/message/managing-messages/clear-all-messages": { "body": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。\n\n```java\nmessageManager.deleteAllMsgFromLocalAndSvr(callback);\n```", "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "清空全部已保存消息" + "title": "清理全部消息" }, "/sdk/android/message/managing-messages/set-message-local-ex": { "body": "`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。\n\n```java\nmessageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson);\n```", "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "设置消息本地扩展字段" + "title": "设置消息本地扩展" + }, + "/sdk/android/message/managing-read-status/send-group-read-receipts": { + "body": "```java\nmessageManager.sendGroupMessageReadReceipt(\n conversationID,\n visibleClientMsgIDs,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 已读回执已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。\n\n其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。\n\n```java\n@Override\npublic void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) {\n mergeGroupReadReceipt(receipt);\n}\n```\n\n上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。", + "description": "使用 Android SDK 上报群消息已读回执。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "上报群消息已读" + }, + "/sdk/android/message/managing-read-status/get-group-message-readers": { + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 群聊会话 ID。 |\n| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 |\n| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 |\n| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 |\n| `count` | `int` | 是 | 本次请求的成员数量。 |\n\n```java\nmessageManager.getGroupMessageReaderList(\n conversationID,\n clientMsgID,\n 0,\n 0,\n 50,\n new OnBase>() {\n @Override\n public void onSuccess(List members) {\n renderMembers(members);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。", + "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "查询群消息已读成员" }, "/sdk/android/file-uploads/track-file-upload-progress": { "body": "Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。\n\n```java\nOnPutFileListener uploadListener = new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUploadProgress(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void uploadPartComplete(long partNumber, long partSize, String partHash) {\n markPartComplete(uploadTaskID, partNumber, partSize, partHash);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n};\n\nOpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs);\n```\n\n`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。\n\n业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。\n\n完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。", "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", "headings": [], "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "跟踪文件上传进度" + "title": "监听文件上传进度" }, "/sdk/android/file-uploads/upload-file": { "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", @@ -1706,7 +1856,7 @@ "title": "发送自定义信令" }, "/sdk/android/events/overview-events": { - "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | 合并标识 | 完整处理页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) |\n| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", + "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | Listener | 对应页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) |\n| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) |\n| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) |\n| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) |\n| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", "headings": [ { diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 453dfc4b17..733005df25 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -4402,7 +4402,7 @@ { "id": "user/user-profile/set-self-info", "segment": "set-self-info", - "title": "Update the current user profile", + "title": "Update your profile", "href": "/sdk/android/user/user-profile/set-self-info", "type": "page", "children": [], @@ -4447,6 +4447,16 @@ "children": [], "minIndex": 140, "navigationTitle": "Refresh subscribed user status" + }, + { + "id": "user/online-status/unsubscribe-users-online-status", + "segment": "unsubscribe-users-online-status", + "title": "Unsubscribe from user status", + "href": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "type": "page", + "children": [], + "minIndex": 141, + "navigationTitle": "Unsubscribe from user status" } ], "minIndex": 139 @@ -4475,7 +4485,7 @@ "href": "/sdk/android/user/friends/get-friend-list-page", "type": "page", "children": [], - "minIndex": 141, + "minIndex": 142, "navigationTitle": "Get the friend list" }, { @@ -4485,7 +4495,7 @@ "href": "/sdk/android/user/friends/search-friends", "type": "page", "children": [], - "minIndex": 142, + "minIndex": 143, "navigationTitle": "Search friends" }, { @@ -4495,7 +4505,7 @@ "href": "/sdk/android/user/friends/get-friends-info", "type": "page", "children": [], - "minIndex": 143, + "minIndex": 144, "navigationTitle": "Get friend profiles" }, { @@ -4505,7 +4515,7 @@ "href": "/sdk/android/user/friends/check-friend", "type": "page", "children": [], - "minIndex": 144, + "minIndex": 145, "navigationTitle": "Check friendship status" }, { @@ -4515,7 +4525,7 @@ "href": "/sdk/android/user/friends/update-friends", "type": "page", "children": [], - "minIndex": 145, + "minIndex": 146, "navigationTitle": "Update friend information" }, { @@ -4525,7 +4535,7 @@ "href": "/sdk/android/user/friends/delete-friend", "type": "page", "children": [], - "minIndex": 146, + "minIndex": 147, "navigationTitle": "Delete a friend" }, { @@ -4542,7 +4552,7 @@ "href": "/sdk/android/user/friend-applications/add-friend", "type": "page", "children": [], - "minIndex": 147, + "minIndex": 148, "navigationTitle": "Send a friend application" }, { @@ -4552,7 +4562,7 @@ "href": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "type": "page", "children": [], - "minIndex": 148, + "minIndex": 149, "navigationTitle": "Get received friend applications" }, { @@ -4562,7 +4572,7 @@ "href": "/sdk/android/user/friend-applications/get-send-friend-application-list", "type": "page", "children": [], - "minIndex": 149, + "minIndex": 150, "navigationTitle": "Get sent friend applications" }, { @@ -4572,7 +4582,7 @@ "href": "/sdk/android/user/friend-applications/accept-friend-application", "type": "page", "children": [], - "minIndex": 150, + "minIndex": 151, "navigationTitle": "Accept a friend application" }, { @@ -4582,14 +4592,14 @@ "href": "/sdk/android/user/friend-applications/refuse-friend-application", "type": "page", "children": [], - "minIndex": 151, + "minIndex": 152, "navigationTitle": "Reject a friend application" } ], - "minIndex": 147 + "minIndex": 148 } ], - "minIndex": 141 + "minIndex": 142 }, { "id": "user/blacklist", @@ -4605,7 +4615,7 @@ "href": "/sdk/android/user/blacklist/get-blacklist", "type": "page", "children": [], - "minIndex": 152 + "minIndex": 153 }, { "id": "user/blacklist/add-blacklist", @@ -4614,7 +4624,7 @@ "href": "/sdk/android/user/blacklist/add-blacklist", "type": "page", "children": [], - "minIndex": 153, + "minIndex": 154, "navigationTitle": "Block a user" }, { @@ -4624,14 +4634,14 @@ "href": "/sdk/android/user/blacklist/remove-blacklist", "type": "page", "children": [], - "minIndex": 154, + "minIndex": 155, "navigationTitle": "Unblock a user" } ], - "minIndex": 152 + "minIndex": 153 } ], - "minIndex": 141 + "minIndex": 142 }, { "id": "conversation", @@ -4647,7 +4657,7 @@ "href": "/sdk/android/conversation/overview-conversation", "type": "page", "children": [], - "minIndex": 155 + "minIndex": 156 }, { "id": "conversation/retrieving-conversations", @@ -4663,7 +4673,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "type": "page", "children": [], - "minIndex": 156, + "minIndex": 157, "navigationTitle": "Open a conversation" }, { @@ -4673,7 +4683,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "type": "page", "children": [], - "minIndex": 157, + "minIndex": 158, "navigationTitle": "Resolve a conversation ID" }, { @@ -4683,7 +4693,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "type": "page", "children": [], - "minIndex": 158, + "minIndex": 159, "navigationTitle": "Get conversations by ID" }, { @@ -4693,10 +4703,10 @@ "href": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "type": "page", "children": [], - "minIndex": 159 + "minIndex": 160 } ], - "minIndex": 156 + "minIndex": 157 }, { "id": "conversation/conversation-list-and-drafts", @@ -4712,7 +4722,7 @@ "href": "/sdk/android/conversation/managing-conversations/pin-conversation", "type": "page", "children": [], - "minIndex": 160, + "minIndex": 161, "navigationTitle": "Pin or unpin a conversation" }, { @@ -4722,7 +4732,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "type": "page", "children": [], - "minIndex": 161, + "minIndex": 162, "navigationTitle": "Set conversation extra data" }, { @@ -4732,10 +4742,10 @@ "href": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "type": "page", "children": [], - "minIndex": 162 + "minIndex": 163 } ], - "minIndex": 160 + "minIndex": 161 }, { "id": "conversation/message-reception-and-reminders", @@ -4751,7 +4761,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "type": "page", "children": [], - "minIndex": 163, + "minIndex": 164, "navigationTitle": "Set conversation message reception" }, { @@ -4761,7 +4771,7 @@ "href": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "type": "page", "children": [], - "minIndex": 164, + "minIndex": 165, "navigationTitle": "Reset group mention status" }, { @@ -4771,7 +4781,7 @@ "href": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "type": "page", "children": [], - "minIndex": 165, + "minIndex": 166, "navigationTitle": "Mark a conversation as read" }, { @@ -4781,11 +4791,11 @@ "href": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "type": "page", "children": [], - "minIndex": 166, + "minIndex": 167, "navigationTitle": "Track the total unread count" } ], - "minIndex": 163 + "minIndex": 164 }, { "id": "conversation/message-retention-and-privacy", @@ -4801,7 +4811,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-private-chat", "type": "page", "children": [], - "minIndex": 167, + "minIndex": 168, "navigationTitle": "Enable or disable burn after reading" }, { @@ -4811,7 +4821,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-burn-duration", "type": "page", "children": [], - "minIndex": 168, + "minIndex": 169, "navigationTitle": "Set the burn duration" }, { @@ -4821,11 +4831,11 @@ "href": "/sdk/android/conversation/managing-conversations/set-message-destruct", "type": "page", "children": [], - "minIndex": 169, + "minIndex": 170, "navigationTitle": "Schedule server message deletion" } ], - "minIndex": 167 + "minIndex": 168 }, { "id": "conversation/hiding-and-deleting-conversations", @@ -4841,7 +4851,7 @@ "href": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "type": "page", "children": [], - "minIndex": 170 + "minIndex": 171 }, { "id": "conversation/managing-conversations/delete-conversation-with-messages", @@ -4850,7 +4860,7 @@ "href": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "type": "page", "children": [], - "minIndex": 171, + "minIndex": 172, "navigationTitle": "Delete a conversation and its messages" }, { @@ -4860,14 +4870,14 @@ "href": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "type": "page", "children": [], - "minIndex": 172, + "minIndex": 173, "navigationTitle": "Clear messages in a conversation" } ], - "minIndex": 170 + "minIndex": 171 } ], - "minIndex": 155 + "minIndex": 156 }, { "id": "group", @@ -4883,7 +4893,7 @@ "href": "/sdk/android/group/overview-group", "type": "page", "children": [], - "minIndex": 173, + "minIndex": 174, "navigationTitle": "Group overview" }, { @@ -4900,7 +4910,7 @@ "href": "/sdk/android/group/create-group", "type": "page", "children": [], - "minIndex": 174, + "minIndex": 175, "navigationTitle": "Create a group" }, { @@ -4910,7 +4920,7 @@ "href": "/sdk/android/group/update-group-profile", "type": "page", "children": [], - "minIndex": 175, + "minIndex": 176, "navigationTitle": "Update group profile" }, { @@ -4920,7 +4930,7 @@ "href": "/sdk/android/group/set-group-announcement", "type": "page", "children": [], - "minIndex": 176, + "minIndex": 177, "navigationTitle": "Publish a group announcement" }, { @@ -4930,11 +4940,11 @@ "href": "/sdk/android/group/set-group-extension", "type": "page", "children": [], - "minIndex": 177, + "minIndex": 178, "navigationTitle": "Set group extra data" } ], - "minIndex": 174 + "minIndex": 175 }, { "id": "group/permissions", @@ -4950,7 +4960,7 @@ "href": "/sdk/android/group/set-group-join-verification", "type": "page", "children": [], - "minIndex": 178, + "minIndex": 179, "navigationTitle": "Set group join verification" }, { @@ -4960,7 +4970,7 @@ "href": "/sdk/android/group/set-group-member-profile-access", "type": "page", "children": [], - "minIndex": 179, + "minIndex": 180, "navigationTitle": "Set member profile access" }, { @@ -4970,7 +4980,7 @@ "href": "/sdk/android/group/set-group-member-friend-permission", "type": "page", "children": [], - "minIndex": 180, + "minIndex": 181, "navigationTitle": "Set member friend request permission" }, { @@ -4980,11 +4990,11 @@ "href": "/sdk/android/group/change-group-mute", "type": "page", "children": [], - "minIndex": 181, + "minIndex": 182, "navigationTitle": "Change group mute status" } ], - "minIndex": 178 + "minIndex": 179 }, { "id": "group/joining-and-leaving", @@ -5000,7 +5010,7 @@ "href": "/sdk/android/group/join-group", "type": "page", "children": [], - "minIndex": 182, + "minIndex": 183, "navigationTitle": "Apply to join a group" }, { @@ -5010,7 +5020,7 @@ "href": "/sdk/android/group/quit-group", "type": "page", "children": [], - "minIndex": 183, + "minIndex": 184, "navigationTitle": "Leave a group" }, { @@ -5020,11 +5030,11 @@ "href": "/sdk/android/group/dismiss-group", "type": "page", "children": [], - "minIndex": 184, + "minIndex": 185, "navigationTitle": "Dismiss a group" } ], - "minIndex": 182 + "minIndex": 183 }, { "id": "group/retrieving-groups", @@ -5040,7 +5050,7 @@ "href": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "type": "page", "children": [], - "minIndex": 185, + "minIndex": 186, "navigationTitle": "Get group information" }, { @@ -5050,7 +5060,7 @@ "href": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "type": "page", "children": [], - "minIndex": 186, + "minIndex": 187, "navigationTitle": "Get joined groups by page" }, { @@ -5060,7 +5070,7 @@ "href": "/sdk/android/group/retrieving-groups/is-join-group", "type": "page", "children": [], - "minIndex": 187, + "minIndex": 188, "navigationTitle": "Check group membership" }, { @@ -5070,11 +5080,11 @@ "href": "/sdk/android/group/retrieving-groups/search-groups", "type": "page", "children": [], - "minIndex": 188, + "minIndex": 189, "navigationTitle": "Search groups" } ], - "minIndex": 185 + "minIndex": 186 }, { "id": "group/group-applications", @@ -5090,7 +5100,7 @@ "href": "/sdk/android/group/group-applications/overview-group-applications", "type": "page", "children": [], - "minIndex": 189, + "minIndex": 190, "navigationTitle": "Group applications overview" }, { @@ -5100,7 +5110,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "type": "page", "children": [], - "minIndex": 190, + "minIndex": 191, "navigationTitle": "Get received group applications" }, { @@ -5110,7 +5120,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "type": "page", "children": [], - "minIndex": 191, + "minIndex": 192, "navigationTitle": "Get sent group applications" }, { @@ -5120,7 +5130,7 @@ "href": "/sdk/android/group/group-applications/accept-group-application", "type": "page", "children": [], - "minIndex": 192, + "minIndex": 193, "navigationTitle": "Accept a group application" }, { @@ -5130,11 +5140,11 @@ "href": "/sdk/android/group/group-applications/refuse-group-application", "type": "page", "children": [], - "minIndex": 193, + "minIndex": 194, "navigationTitle": "Reject a group application" } ], - "minIndex": 189 + "minIndex": 190 }, { "id": "group/retrieving-group-members", @@ -5150,47 +5160,47 @@ "href": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "type": "page", "children": [], - "minIndex": 194, + "minIndex": 195, "navigationTitle": "Group member queries overview" }, { "id": "group/retrieving-group-members/get-group-member-list", "segment": "get-group-member-list", - "title": "List group members", + "title": "Get group members", "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 195, + "minIndex": 196, "navigationTitle": "Get group members" }, { "id": "group/retrieving-group-members/get-specified-group-members-info", "segment": "get-specified-group-members-info", - "title": "Get specified group member profiles", + "title": "Get group member profiles", "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 196, + "minIndex": 197, "navigationTitle": "Get group member profiles" }, { "id": "group/retrieving-group-members/get-users-in-group", "segment": "get-users-in-group", - "title": "Check group membership", + "title": "Check users in a group", "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 197, + "minIndex": 198, "navigationTitle": "Check users in a group" }, { "id": "group/retrieving-group-members/get-group-member-owner-and-admin", "segment": "get-group-member-owner-and-admin", - "title": "Get the group owner and administrators", + "title": "Get group owners and admins", "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 198, + "minIndex": 199, "navigationTitle": "Get group owners and admins" }, { @@ -5200,11 +5210,11 @@ "href": "/sdk/android/group/retrieving-group-members/search-group-members", "type": "page", "children": [], - "minIndex": 199, + "minIndex": 200, "navigationTitle": "Search group members" } ], - "minIndex": 194 + "minIndex": 195 }, { "id": "group/managing-group-members", @@ -5220,7 +5230,7 @@ "href": "/sdk/android/group/managing-group-members/invite-user-to-group", "type": "page", "children": [], - "minIndex": 200, + "minIndex": 201, "navigationTitle": "Invite users to a group" }, { @@ -5230,17 +5240,17 @@ "href": "/sdk/android/group/managing-group-members/kick-group-member", "type": "page", "children": [], - "minIndex": 201, + "minIndex": 202, "navigationTitle": "Remove group members" }, { "id": "group/managing-group-members/set-group-member-nickname", "segment": "set-group-member-nickname", - "title": "Update a member’s group nickname", + "title": "Update a group nickname", "href": "/sdk/android/group/managing-group-members/set-group-member-nickname", "type": "page", "children": [], - "minIndex": 202, + "minIndex": 203, "navigationTitle": "Update a group nickname" }, { @@ -5250,27 +5260,27 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-role-level", "type": "page", "children": [], - "minIndex": 203, + "minIndex": 204, "navigationTitle": "Manage group administrators" }, { "id": "group/managing-group-members/set-group-member-avatar", "segment": "set-group-member-avatar", - "title": "Update a group member’s avatar", + "title": "Update a group member avatar", "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 204, + "minIndex": 205, "navigationTitle": "Update a group member avatar" }, { "id": "group/managing-group-members/set-group-member-extension", "segment": "set-group-member-extension", - "title": "Set a group member extension", + "title": "Set group member extra data", "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 205, + "minIndex": 206, "navigationTitle": "Set group member extra data" }, { @@ -5280,7 +5290,7 @@ "href": "/sdk/android/group/managing-group-members/transfer-group-owner", "type": "page", "children": [], - "minIndex": 206, + "minIndex": 207, "navigationTitle": "Transfer group ownership" }, { @@ -5290,14 +5300,14 @@ "href": "/sdk/android/group/managing-group-members/change-group-member-mute", "type": "page", "children": [], - "minIndex": 207, + "minIndex": 208, "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 200 + "minIndex": 201 } ], - "minIndex": 173 + "minIndex": 174 }, { "id": "message", @@ -5309,11 +5319,11 @@ { "id": "message/overview-message", "segment": "overview-message", - "title": "Overview", + "title": "Message overview", "href": "/sdk/android/message/overview-message", "type": "page", "children": [], - "minIndex": 208 + "minIndex": 209 }, { "id": "message/creating-messages", @@ -5329,16 +5339,16 @@ "href": "/sdk/android/message/creating-messages/create-text-message", "type": "page", "children": [], - "minIndex": 209 + "minIndex": 210 }, { "id": "message/creating-messages/create-text-at-message", "segment": "create-text-at-message", - "title": "Create an @ message", + "title": "Create a mention message", "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 211 }, { "id": "message/creating-messages/create-custom-message", @@ -5347,34 +5357,56 @@ "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 212 + }, + { + "id": "message/creating-messages/create-image-message", + "segment": "create-image-message", + "title": "Create an image message", + "href": "/sdk/android/message/creating-messages/create-image-message", + "type": "page", + "children": [], + "minIndex": 213, + "navigationTitle": "Create an image message" }, { "id": "message/creating-messages/create-image-message-by-file", "segment": "create-image-message-by-file", - "title": "Create an image message from a file", + "title": "Create an image message from a local path", "href": "/sdk/android/message/creating-messages/create-image-message-by-file", "type": "page", "children": [], - "minIndex": 212 + "minIndex": 214, + "navigationTitle": "Create an image message from a path" }, { "id": "message/creating-messages/create-image-message-by-url", "segment": "create-image-message-by-url", - "title": "Create an image message from a URL", + "title": "Create an image message from URLs", "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 213 + "minIndex": 215 + }, + { + "id": "message/creating-messages/create-sound-message", + "segment": "create-sound-message", + "title": "Create an audio message", + "href": "/sdk/android/message/creating-messages/create-sound-message", + "type": "page", + "children": [], + "minIndex": 216, + "navigationTitle": "Create an audio message" }, { "id": "message/creating-messages/create-sound-message-by-file", "segment": "create-sound-message-by-file", - "title": "Create an audio message from a file", + "title": "Create an audio message from a local path", "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 214 + "minIndex": 217, + "navigationTitle": "Create an audio message from a path" }, { "id": "message/creating-messages/create-sound-message-by-url", @@ -5383,16 +5415,27 @@ "href": "/sdk/android/message/creating-messages/create-sound-message-by-url", "type": "page", "children": [], - "minIndex": 215 + "minIndex": 218 + }, + { + "id": "message/creating-messages/create-video-message", + "segment": "create-video-message", + "title": "Create a video message", + "href": "/sdk/android/message/creating-messages/create-video-message", + "type": "page", + "children": [], + "minIndex": 219, + "navigationTitle": "Create a video message" }, { "id": "message/creating-messages/create-video-message-by-file", "segment": "create-video-message-by-file", - "title": "Create a video message from files", + "title": "Create a video message from local paths", "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 216 + "minIndex": 220, + "navigationTitle": "Create a video message from a path" }, { "id": "message/creating-messages/create-video-message-by-url", @@ -5401,16 +5444,27 @@ "href": "/sdk/android/message/creating-messages/create-video-message-by-url", "type": "page", "children": [], - "minIndex": 217 + "minIndex": 221 + }, + { + "id": "message/creating-messages/create-file-message", + "segment": "create-file-message", + "title": "Create a file message", + "href": "/sdk/android/message/creating-messages/create-file-message", + "type": "page", + "children": [], + "minIndex": 222, + "navigationTitle": "Create a file message" }, { "id": "message/creating-messages/create-file-message-by-file", "segment": "create-file-message-by-file", - "title": "Create a file message from a file", + "title": "Create a file message from a local path", "href": "/sdk/android/message/creating-messages/create-file-message-by-file", "type": "page", "children": [], - "minIndex": 218 + "minIndex": 223, + "navigationTitle": "Create a file message from a path" }, { "id": "message/creating-messages/create-file-message-by-url", @@ -5419,7 +5473,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message-by-url", "type": "page", "children": [], - "minIndex": 219 + "minIndex": 224 }, { "id": "message/creating-messages/create-card-message", @@ -5428,7 +5482,7 @@ "href": "/sdk/android/message/creating-messages/create-card-message", "type": "page", "children": [], - "minIndex": 220 + "minIndex": 225 }, { "id": "message/creating-messages/create-location-message", @@ -5437,7 +5491,7 @@ "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], - "minIndex": 221 + "minIndex": 226 }, { "id": "message/creating-messages/create-face-message", @@ -5446,7 +5500,7 @@ "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], - "minIndex": 222 + "minIndex": 227 }, { "id": "message/creating-messages/create-quote-message", @@ -5455,7 +5509,27 @@ "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], - "minIndex": 223 + "minIndex": 228 + }, + { + "id": "message/creating-messages/create-advanced-text-message", + "segment": "create-advanced-text-message", + "title": "Create a rich-text message", + "href": "/sdk/android/message/creating-messages/create-advanced-text-message", + "type": "page", + "children": [], + "minIndex": 229, + "navigationTitle": "Create rich text" + }, + { + "id": "message/creating-messages/create-advanced-quote-message", + "segment": "create-advanced-quote-message", + "title": "Create a rich-text reply", + "href": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "type": "page", + "children": [], + "minIndex": 230, + "navigationTitle": "Create a rich reply" }, { "id": "message/creating-messages/create-forward-message", @@ -5464,19 +5538,19 @@ "href": "/sdk/android/message/creating-messages/create-forward-message", "type": "page", "children": [], - "minIndex": 224 + "minIndex": 231 }, { "id": "message/creating-messages/create-merger-message", "segment": "create-merger-message", - "title": "Create a merged forward message", + "title": "Create a merged message", "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 225 + "minIndex": 232 } ], - "minIndex": 209 + "minIndex": 210 }, { "id": "message/sending-messages", @@ -5492,16 +5566,16 @@ "href": "/sdk/android/message/sending-messages/send-message", "type": "page", "children": [], - "minIndex": 226 + "minIndex": 233 }, { "id": "message/sending-messages/send-message-not-oss", "segment": "send-message-not-oss", - "title": "Send an uploaded media message", + "title": "Send a message without OSS", "href": "/sdk/android/message/sending-messages/send-message-not-oss", "type": "page", "children": [], - "minIndex": 227 + "minIndex": 234 }, { "id": "message/sending-messages/set-msg-send-progress-listener", @@ -5510,11 +5584,11 @@ "href": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "type": "page", "children": [], - "minIndex": 228, + "minIndex": 235, "navigationTitle": "Track message sending progress" } ], - "minIndex": 226 + "minIndex": 233 }, { "id": "message/receiving-messages/receive-messages", @@ -5523,7 +5597,7 @@ "href": "/sdk/android/message/receiving-messages/receive-messages", "type": "page", "children": [], - "minIndex": 229 + "minIndex": 236 }, { "id": "message/receiving-messages/receive-custom-business-messages", @@ -5532,7 +5606,7 @@ "href": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "type": "page", "children": [], - "minIndex": 230 + "minIndex": 237 }, { "id": "message/retrieving-messages", @@ -5544,20 +5618,20 @@ { "id": "message/retrieving-messages/load-older-messages", "segment": "load-older-messages", - "title": "Load message history", + "title": "Load older messages", "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 231 + "minIndex": 238 }, { "id": "message/retrieving-messages/load-newer-messages", "segment": "load-newer-messages", - "title": "Load message history in reverse", + "title": "Load newer messages", "href": "/sdk/android/message/retrieving-messages/load-newer-messages", "type": "page", "children": [], - "minIndex": 232 + "minIndex": 239 }, { "id": "message/retrieving-messages/find-messages-by-id", @@ -5566,7 +5640,17 @@ "href": "/sdk/android/message/retrieving-messages/find-messages-by-id", "type": "page", "children": [], - "minIndex": 233 + "minIndex": 240 + }, + { + "id": "message/retrieving-messages/load-message-context", + "segment": "load-message-context", + "title": "Load message context", + "href": "/sdk/android/message/retrieving-messages/load-message-context", + "type": "page", + "children": [], + "minIndex": 241, + "navigationTitle": "Load message context" }, { "id": "message/searching-messages/search-messages", @@ -5575,19 +5659,40 @@ "href": "/sdk/android/message/searching-messages/search-messages", "type": "page", "children": [], - "minIndex": 234 + "minIndex": 242 } ], - "minIndex": 231 + "minIndex": 238 }, { - "id": "message/composing-messages/update-typing-status", - "segment": "update-typing-status", - "title": "Report typing status", - "href": "/sdk/android/message/composing-messages/update-typing-status", - "type": "page", - "children": [], - "minIndex": 235 + "id": "message/composing-messages", + "segment": "composing-messages", + "title": "Composing messages", + "href": null, + "type": "folder", + "children": [ + { + "id": "message/composing-messages/update-typing-status", + "segment": "update-typing-status", + "title": "Update typing status", + "href": "/sdk/android/message/composing-messages/update-typing-status", + "type": "page", + "children": [], + "minIndex": 243, + "navigationTitle": "Update typing status" + }, + { + "id": "message/composing-messages/get-typing-status", + "segment": "get-typing-status", + "title": "Retrieve typing status", + "href": "/sdk/android/message/composing-messages/get-typing-status", + "type": "page", + "children": [], + "minIndex": 244, + "navigationTitle": "Get typing status" + } + ], + "minIndex": 243 }, { "id": "message/managing-messages", @@ -5603,7 +5708,7 @@ "href": "/sdk/android/message/managing-messages/delete-local-message", "type": "page", "children": [], - "minIndex": 236 + "minIndex": 245 }, { "id": "message/managing-messages/delete-saved-messages", @@ -5612,7 +5717,18 @@ "href": "/sdk/android/message/managing-messages/delete-saved-messages", "type": "page", "children": [], - "minIndex": 237 + "minIndex": 246, + "navigationTitle": "Delete saved messages" + }, + { + "id": "message/managing-messages/delete-user-messages", + "segment": "delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "href": "/sdk/android/message/managing-messages/delete-user-messages", + "type": "page", + "children": [], + "minIndex": 247, + "navigationTitle": "Delete messages from a user" }, { "id": "message/managing-messages/revoke-a-message", @@ -5621,7 +5737,7 @@ "href": "/sdk/android/message/managing-messages/revoke-a-message", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 248 }, { "id": "message/managing-messages/modify-a-message", @@ -5630,16 +5746,16 @@ "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 239 + "minIndex": 249 }, { "id": "message/managing-messages/get-pinned-messages", "segment": "get-pinned-messages", - "title": "Get pinned messages in a conversation", + "title": "View pinned messages", "href": "/sdk/android/message/managing-messages/get-pinned-messages", "type": "page", "children": [], - "minIndex": 240 + "minIndex": 250 }, { "id": "message/managing-messages/set-message-pinned", @@ -5648,16 +5764,16 @@ "href": "/sdk/android/message/managing-messages/set-message-pinned", "type": "page", "children": [], - "minIndex": 241 + "minIndex": 251 }, { "id": "message/managing-messages/insert-local-single-message", "segment": "insert-local-single-message", - "title": "Insert a local one-to-one message", + "title": "Insert a local direct message", "href": "/sdk/android/message/managing-messages/insert-local-single-message", "type": "page", "children": [], - "minIndex": 242 + "minIndex": 252 }, { "id": "message/managing-messages/insert-local-group-message", @@ -5666,7 +5782,7 @@ "href": "/sdk/android/message/managing-messages/insert-local-group-message", "type": "page", "children": [], - "minIndex": 243 + "minIndex": 253 }, { "id": "message/managing-messages/clear-all-local-messages", @@ -5675,31 +5791,61 @@ "href": "/sdk/android/message/managing-messages/clear-all-local-messages", "type": "page", "children": [], - "minIndex": 244 + "minIndex": 254 }, { "id": "message/managing-messages/clear-all-messages", "segment": "clear-all-messages", - "title": "Clear local and server messages", + "title": "Clear all saved messages", "href": "/sdk/android/message/managing-messages/clear-all-messages", "type": "page", "children": [], - "minIndex": 245 + "minIndex": 255 }, { "id": "message/managing-messages/set-message-local-ex", "segment": "set-message-local-ex", - "title": "Set a local message extension", + "title": "Set local message extensions", "href": "/sdk/android/message/managing-messages/set-message-local-ex", "type": "page", "children": [], - "minIndex": 246 + "minIndex": 256 } ], - "minIndex": 236 + "minIndex": 245 + }, + { + "id": "message/group-message-read-status", + "segment": "group-message-read-status", + "title": "Group message read status", + "href": null, + "type": "folder", + "children": [ + { + "id": "message/managing-read-status/send-group-read-receipts", + "segment": "send-group-read-receipts", + "title": "Report group messages as read", + "href": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "type": "page", + "children": [], + "minIndex": 257, + "navigationTitle": "Send group read receipts" + }, + { + "id": "message/managing-read-status/get-group-message-readers", + "segment": "get-group-message-readers", + "title": "Get members who read a group message", + "href": "/sdk/android/message/managing-read-status/get-group-message-readers", + "type": "page", + "children": [], + "minIndex": 258, + "navigationTitle": "View group message readers" + } + ], + "minIndex": 257 } ], - "minIndex": 208 + "minIndex": 209 }, { "id": "file-uploads", @@ -5715,7 +5861,7 @@ "href": "/sdk/android/file-uploads/track-file-upload-progress", "type": "page", "children": [], - "minIndex": 247, + "minIndex": 259, "navigationTitle": "Track file upload progress" }, { @@ -5725,11 +5871,11 @@ "href": "/sdk/android/file-uploads/upload-file", "type": "page", "children": [], - "minIndex": 248, + "minIndex": 260, "navigationTitle": "Upload a file" } ], - "minIndex": 247 + "minIndex": 259 }, { "id": "calling", @@ -5745,7 +5891,7 @@ "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 249 + "minIndex": 261 }, { "id": "calling/managing-calls", @@ -5761,7 +5907,7 @@ "href": "/sdk/android/calling/managing-calls/start-single-call", "type": "page", "children": [], - "minIndex": 250, + "minIndex": 262, "navigationTitle": "Start a one-to-one call" }, { @@ -5771,7 +5917,7 @@ "href": "/sdk/android/calling/managing-calls/start-group-call", "type": "page", "children": [], - "minIndex": 251, + "minIndex": 263, "navigationTitle": "Start a group call" }, { @@ -5781,7 +5927,7 @@ "href": "/sdk/android/calling/managing-calls/accept-call", "type": "page", "children": [], - "minIndex": 252, + "minIndex": 264, "navigationTitle": "Accept a call" }, { @@ -5791,7 +5937,7 @@ "href": "/sdk/android/calling/managing-calls/reject-call", "type": "page", "children": [], - "minIndex": 253, + "minIndex": 265, "navigationTitle": "Reject a call" }, { @@ -5801,17 +5947,17 @@ "href": "/sdk/android/calling/managing-calls/cancel-call", "type": "page", "children": [], - "minIndex": 254, + "minIndex": 266, "navigationTitle": "Cancel a call invitation" }, { "id": "calling/managing-calls/hang-up-call", "segment": "hang-up-call", - "title": "End a call", + "title": "Hang up a call", "href": "/sdk/android/calling/managing-calls/hang-up-call", "type": "page", "children": [], - "minIndex": 255, + "minIndex": 267, "navigationTitle": "Hang up a call" }, { @@ -5821,11 +5967,11 @@ "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 256, + "minIndex": 268, "navigationTitle": "Handle call events" } ], - "minIndex": 250 + "minIndex": 262 }, { "id": "calling/retrieving-call-information", @@ -5837,11 +5983,11 @@ { "id": "calling/retrieving-call-information/restore-pending-invitation", "segment": "restore-pending-invitation", - "title": "Restore a pending call invitation", + "title": "Restore a pending invitation", "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "type": "page", "children": [], - "minIndex": 257, + "minIndex": 269, "navigationTitle": "Restore a pending invitation" }, { @@ -5851,21 +5997,21 @@ "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "type": "page", "children": [], - "minIndex": 258, + "minIndex": 270, "navigationTitle": "Get a group call room" }, { "id": "calling/retrieving-call-information/get-token-by-room-id", "segment": "get-token-by-room-id", - "title": "Get a call room token", + "title": "Get room credentials", "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 259, + "minIndex": 271, "navigationTitle": "Get room credentials" } ], - "minIndex": 257 + "minIndex": 269 }, { "id": "calling/sending-custom-signals/send-a-custom-signal", @@ -5874,10 +6020,10 @@ "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "type": "page", "children": [], - "minIndex": 260 + "minIndex": 272 } ], - "minIndex": 249 + "minIndex": 261 }, { "id": "events/overview-events", @@ -5886,20 +6032,20 @@ "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 261, + "minIndex": 273, "navigationTitle": "Events" }, { "id": "logger", "segment": "logger", - "title": "Logger", + "title": "Logging", "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 262 + "minIndex": 274 } ], - "pageCount": 134, + "pageCount": 146, "sidebarExpansion": "active-path" }, { diff --git a/src/generated/routes.json b/src/generated/routes.json index ce343ee212..7497e571d3 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -4307,7 +4307,7 @@ "relativePath": "sdk/android/getting-started/environment-specific-implementation", "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", "title": "Integrate for Android", - "description": "Integrate, configure, and initialize OpenIM Android SDK while handling permissions, data storage, and application lifecycle boundaries.", + "description": "Add OpenIM Android SDK dependencies and network permissions to an Android project.", "product": "sdk", "version": "v4", "platform": "android", @@ -4343,7 +4343,7 @@ "relativePath": "sdk/android/getting-started/send-first-message", "sourcePath": "/sdk/android/getting-started/send-first-message", "title": "Send your first message", - "description": "Verify the first one-to-one or group text-message send and receive flow in an Android application.", + "description": "Send and verify the first one-to-one text message in an Android application.", "product": "sdk", "version": "v4", "platform": "android", @@ -4414,7 +4414,7 @@ "path": "/sdk/android/user/user-profile/set-self-info", "relativePath": "sdk/android/user/user-profile/set-self-info", "sourcePath": "/sdk/android/user/user-profile/set-self-info", - "title": "Update the current user profile", + "title": "Update your profile", "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "product": "sdk", "version": "v4", @@ -4483,6 +4483,24 @@ }, { "id": 1364, + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "relativePath": "sdk/android/user/online-status/unsubscribe-users-online-status", + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", + "description": "Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2734, + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx", + "navOrder": 141 + }, + { + "id": 1365, "path": "/sdk/android/user/friends/get-friend-list-page", "relativePath": "sdk/android/user/friends/get-friend-list-page", "sourcePath": "/sdk/android/user/friends/get-friend-list-page", @@ -4495,12 +4513,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2734, + "sourceIndex": 2735, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx", - "navOrder": 141 + "navOrder": 142 }, { - "id": 1365, + "id": 1366, "path": "/sdk/android/user/friends/search-friends", "relativePath": "sdk/android/user/friends/search-friends", "sourcePath": "/sdk/android/user/friends/search-friends", @@ -4513,12 +4531,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2735, + "sourceIndex": 2736, "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx", - "navOrder": 142 + "navOrder": 143 }, { - "id": 1366, + "id": 1367, "path": "/sdk/android/user/friends/get-friends-info", "relativePath": "sdk/android/user/friends/get-friends-info", "sourcePath": "/sdk/android/user/friends/get-friends-info", @@ -4531,12 +4549,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2736, + "sourceIndex": 2737, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx", - "navOrder": 143 + "navOrder": 144 }, { - "id": 1367, + "id": 1368, "path": "/sdk/android/user/friends/check-friend", "relativePath": "sdk/android/user/friends/check-friend", "sourcePath": "/sdk/android/user/friends/check-friend", @@ -4549,12 +4567,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2737, + "sourceIndex": 2738, "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx", - "navOrder": 144 + "navOrder": 145 }, { - "id": 1368, + "id": 1369, "path": "/sdk/android/user/friends/update-friends", "relativePath": "sdk/android/user/friends/update-friends", "sourcePath": "/sdk/android/user/friends/update-friends", @@ -4567,12 +4585,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2738, + "sourceIndex": 2739, "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx", - "navOrder": 145 + "navOrder": 146 }, { - "id": 1369, + "id": 1370, "path": "/sdk/android/user/friends/delete-friend", "relativePath": "sdk/android/user/friends/delete-friend", "sourcePath": "/sdk/android/user/friends/delete-friend", @@ -4585,12 +4603,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2739, + "sourceIndex": 2740, "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx", - "navOrder": 146 + "navOrder": 147 }, { - "id": 1370, + "id": 1371, "path": "/sdk/android/user/friend-applications/add-friend", "relativePath": "sdk/android/user/friend-applications/add-friend", "sourcePath": "/sdk/android/user/friend-applications/add-friend", @@ -4603,12 +4621,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2740, + "sourceIndex": 2741, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx", - "navOrder": 147 + "navOrder": 148 }, { - "id": 1371, + "id": 1372, "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-recv-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", @@ -4621,12 +4639,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2741, + "sourceIndex": 2742, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx", - "navOrder": 148 + "navOrder": 149 }, { - "id": 1372, + "id": 1373, "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-send-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", @@ -4639,12 +4657,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2742, + "sourceIndex": 2743, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx", - "navOrder": 149 + "navOrder": 150 }, { - "id": 1373, + "id": 1374, "path": "/sdk/android/user/friend-applications/accept-friend-application", "relativePath": "sdk/android/user/friend-applications/accept-friend-application", "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", @@ -4657,12 +4675,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2743, + "sourceIndex": 2744, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx", - "navOrder": 150 + "navOrder": 151 }, { - "id": 1374, + "id": 1375, "path": "/sdk/android/user/friend-applications/refuse-friend-application", "relativePath": "sdk/android/user/friend-applications/refuse-friend-application", "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", @@ -4675,12 +4693,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2744, + "sourceIndex": 2745, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", - "navOrder": 151 + "navOrder": 152 }, { - "id": 1375, + "id": 1376, "path": "/sdk/android/user/blacklist/get-blacklist", "relativePath": "sdk/android/user/blacklist/get-blacklist", "sourcePath": "/sdk/android/user/blacklist/get-blacklist", @@ -4693,12 +4711,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2745, + "sourceIndex": 2746, "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx", - "navOrder": 152 + "navOrder": 153 }, { - "id": 1376, + "id": 1377, "path": "/sdk/android/user/blacklist/add-blacklist", "relativePath": "sdk/android/user/blacklist/add-blacklist", "sourcePath": "/sdk/android/user/blacklist/add-blacklist", @@ -4711,12 +4729,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2746, + "sourceIndex": 2747, "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx", - "navOrder": 153 + "navOrder": 154 }, { - "id": 1377, + "id": 1378, "path": "/sdk/android/user/blacklist/remove-blacklist", "relativePath": "sdk/android/user/blacklist/remove-blacklist", "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", @@ -4729,12 +4747,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2747, + "sourceIndex": 2748, "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx", - "navOrder": 154 + "navOrder": 155 }, { - "id": 1378, + "id": 1379, "path": "/sdk/android/conversation/overview-conversation", "relativePath": "sdk/android/conversation/overview-conversation", "sourcePath": "/sdk/android/conversation/overview-conversation", @@ -4747,12 +4765,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2748, + "sourceIndex": 2749, "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx", - "navOrder": 155 + "navOrder": 156 }, { - "id": 1379, + "id": 1380, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", @@ -4765,12 +4783,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2749, + "sourceIndex": 2750, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx", - "navOrder": 156 + "navOrder": 157 }, { - "id": 1380, + "id": 1381, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", @@ -4783,12 +4801,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2750, + "sourceIndex": 2751, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx", - "navOrder": 157 + "navOrder": 158 }, { - "id": 1381, + "id": 1382, "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", @@ -4801,12 +4819,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2751, + "sourceIndex": 2752, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx", - "navOrder": 158 + "navOrder": 159 }, { - "id": 1382, + "id": 1383, "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "relativePath": "sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", @@ -4819,12 +4837,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2752, + "sourceIndex": 2753, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx", - "navOrder": 159 + "navOrder": 160 }, { - "id": 1383, + "id": 1384, "path": "/sdk/android/conversation/managing-conversations/pin-conversation", "relativePath": "sdk/android/conversation/managing-conversations/pin-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", @@ -4837,12 +4855,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2753, + "sourceIndex": 2754, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx", - "navOrder": 160 + "navOrder": 161 }, { - "id": 1384, + "id": 1385, "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-extension", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", @@ -4855,12 +4873,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2754, + "sourceIndex": 2755, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx", - "navOrder": 161 + "navOrder": 162 }, { - "id": 1385, + "id": 1386, "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-draft", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", @@ -4873,12 +4891,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2755, + "sourceIndex": 2756, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx", - "navOrder": 162 + "navOrder": 163 }, { - "id": 1386, + "id": 1387, "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "relativePath": "sdk/android/conversation/managing-conversations/set-message-receive-option", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", @@ -4891,12 +4909,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2756, + "sourceIndex": 2757, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx", - "navOrder": 163 + "navOrder": 164 }, { - "id": 1387, + "id": 1388, "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "relativePath": "sdk/android/conversation/managing-conversations/clear-group-mentions", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", @@ -4909,12 +4927,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2757, + "sourceIndex": 2758, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx", - "navOrder": 164 + "navOrder": 165 }, { - "id": 1388, + "id": 1389, "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "relativePath": "sdk/android/conversation/managing-conversations/mark-conversation-read", "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", @@ -4927,12 +4945,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2758, + "sourceIndex": 2759, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx", - "navOrder": 165 + "navOrder": 166 }, { - "id": 1389, + "id": 1390, "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "relativePath": "sdk/android/conversation/managing-conversations/get-total-unread-count", "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", @@ -4945,12 +4963,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2759, + "sourceIndex": 2760, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx", - "navOrder": 166 + "navOrder": 167 }, { - "id": 1390, + "id": 1391, "path": "/sdk/android/conversation/managing-conversations/set-private-chat", "relativePath": "sdk/android/conversation/managing-conversations/set-private-chat", "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", @@ -4963,12 +4981,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2760, + "sourceIndex": 2761, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx", - "navOrder": 167 + "navOrder": 168 }, { - "id": 1391, + "id": 1392, "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", "relativePath": "sdk/android/conversation/managing-conversations/set-burn-duration", "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", @@ -4981,12 +4999,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2761, + "sourceIndex": 2762, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx", - "navOrder": 168 + "navOrder": 169 }, { - "id": 1392, + "id": 1393, "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", "relativePath": "sdk/android/conversation/managing-conversations/set-message-destruct", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", @@ -4999,12 +5017,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2762, + "sourceIndex": 2763, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx", - "navOrder": 169 + "navOrder": 170 }, { - "id": 1393, + "id": 1394, "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "relativePath": "sdk/android/conversation/managing-conversations/hide-a-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", @@ -5017,12 +5035,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2763, + "sourceIndex": 2764, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx", - "navOrder": 170 + "navOrder": 171 }, { - "id": 1394, + "id": 1395, "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "relativePath": "sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", @@ -5035,12 +5053,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2764, + "sourceIndex": 2765, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx", - "navOrder": 171 + "navOrder": 172 }, { - "id": 1395, + "id": 1396, "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "relativePath": "sdk/android/conversation/managing-conversations/clear-conversation-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -5053,1629 +5071,1827 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2765, + "sourceIndex": 2766, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx", - "navOrder": 172 + "navOrder": 173 }, { - "id": 1396, + "id": 1397, "path": "/sdk/android/group/overview-group", "relativePath": "sdk/android/group/overview-group", "sourcePath": "/sdk/android/group/overview-group", "title": "Group overview", - "description": "OpenIM Android SDK guide for Group overview.", + "description": "Learn how group profiles, members, applications, and group events are organized in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2766, + "status": "published", + "sourceIndex": 2767, "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx", - "navOrder": 173 + "navOrder": 174 }, { - "id": 1397, + "id": 1398, "path": "/sdk/android/group/create-group", "relativePath": "sdk/android/group/create-group", "sourcePath": "/sdk/android/group/create-group", "title": "Create a group", - "description": "OpenIM Android SDK guide for Create a group.", + "description": "Use createGroup to create a group profile and specify its initial members, administrators, and owner.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2767, + "status": "published", + "sourceIndex": 2768, "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx", - "navOrder": 174 + "navOrder": 175 }, { - "id": 1398, + "id": 1399, "path": "/sdk/android/group/update-group-profile", "relativePath": "sdk/android/group/update-group-profile", "sourcePath": "/sdk/android/group/update-group-profile", "title": "Update group profile", - "description": "OpenIM Android SDK guide for Update group profile.", + "description": "Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2768, + "status": "published", + "sourceIndex": 2769, "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx", - "navOrder": 175 + "navOrder": 176 }, { - "id": 1399, + "id": 1400, "path": "/sdk/android/group/set-group-announcement", "relativePath": "sdk/android/group/set-group-announcement", "sourcePath": "/sdk/android/group/set-group-announcement", "title": "Publish a group announcement", - "description": "OpenIM Android SDK guide for Publish a group announcement.", + "description": "Publish or update a group announcement through GroupInfo.notification.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2769, + "status": "published", + "sourceIndex": 2770, "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx", - "navOrder": 176 + "navOrder": 177 }, { - "id": 1400, + "id": 1401, "path": "/sdk/android/group/set-group-extension", "relativePath": "sdk/android/group/set-group-extension", "sourcePath": "/sdk/android/group/set-group-extension", "title": "Set group extra data", - "description": "OpenIM Android SDK guide for Set group extra data.", + "description": "Store application-defined group data in GroupInfo.ex.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2770, + "status": "published", + "sourceIndex": 2771, "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", - "navOrder": 177 + "navOrder": 178 }, { - "id": 1401, + "id": 1402, "path": "/sdk/android/group/set-group-join-verification", "relativePath": "sdk/android/group/set-group-join-verification", "sourcePath": "/sdk/android/group/set-group-join-verification", "title": "Set group join verification", - "description": "OpenIM Android SDK guide for Set group join verification.", + "description": "Configure verification rules for group applications and invitations through GroupInfo.needVerification.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2771, + "status": "published", + "sourceIndex": 2772, "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx", - "navOrder": 178 + "navOrder": 179 }, { - "id": 1402, + "id": 1403, "path": "/sdk/android/group/set-group-member-profile-access", "relativePath": "sdk/android/group/set-group-member-profile-access", "sourcePath": "/sdk/android/group/set-group-member-profile-access", "title": "Set member profile access", - "description": "OpenIM Android SDK guide for Set member profile access.", + "description": "Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2772, + "status": "published", + "sourceIndex": 2773, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx", - "navOrder": 179 + "navOrder": 180 }, { - "id": 1403, + "id": 1404, "path": "/sdk/android/group/set-group-member-friend-permission", "relativePath": "sdk/android/group/set-group-member-friend-permission", "sourcePath": "/sdk/android/group/set-group-member-friend-permission", "title": "Set member friend request permission", - "description": "OpenIM Android SDK guide for Set member friend request permission.", + "description": "Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2773, + "status": "published", + "sourceIndex": 2774, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx", - "navOrder": 180 + "navOrder": 181 }, { - "id": 1404, + "id": 1405, "path": "/sdk/android/group/change-group-mute", "relativePath": "sdk/android/group/change-group-mute", "sourcePath": "/sdk/android/group/change-group-mute", "title": "Change group mute status", - "description": "OpenIM Android SDK guide for Change group mute status.", + "description": "Use changeGroupMute to enable or disable mute-all mode for a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2774, + "status": "published", + "sourceIndex": 2775, "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx", - "navOrder": 181 + "navOrder": 182 }, { - "id": 1405, + "id": 1406, "path": "/sdk/android/group/join-group", "relativePath": "sdk/android/group/join-group", "sourcePath": "/sdk/android/group/join-group", "title": "Apply to join a group", - "description": "OpenIM Android SDK guide for Apply to join a group.", + "description": "Use joinGroup to submit a group application or join request.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2775, + "status": "published", + "sourceIndex": 2776, "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx", - "navOrder": 182 + "navOrder": 183 }, { - "id": 1406, + "id": 1407, "path": "/sdk/android/group/quit-group", "relativePath": "sdk/android/group/quit-group", "sourcePath": "/sdk/android/group/quit-group", "title": "Leave a group", - "description": "OpenIM Android SDK guide for Leave a group.", + "description": "Use quitGroup to remove the current signed-in user from a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2776, + "status": "published", + "sourceIndex": 2777, "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx", - "navOrder": 183 + "navOrder": 184 }, { - "id": 1407, + "id": 1408, "path": "/sdk/android/group/dismiss-group", "relativePath": "sdk/android/group/dismiss-group", "sourcePath": "/sdk/android/group/dismiss-group", "title": "Dismiss a group", - "description": "OpenIM Android SDK guide for Dismiss a group.", + "description": "Use dismissGroup to dismiss a group that the current user is allowed to manage.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2777, + "status": "published", + "sourceIndex": 2778, "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx", - "navOrder": 184 + "navOrder": 185 }, { - "id": 1408, + "id": 1409, "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "relativePath": "sdk/android/group/retrieving-groups/get-specified-groups-info", "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "title": "Get group information", - "description": "OpenIM Android SDK guide for Get group information.", + "description": "Use getGroupsInfo to retrieve the latest profiles for specified groups.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2778, + "status": "published", + "sourceIndex": 2779, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx", - "navOrder": 185 + "navOrder": 186 }, { - "id": 1409, + "id": 1410, "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "relativePath": "sdk/android/group/retrieving-groups/get-joined-group-list-page", "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "title": "Get joined groups by page", - "description": "OpenIM Android SDK guide for Get joined groups by page.", + "description": "Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2779, + "status": "published", + "sourceIndex": 2780, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx", - "navOrder": 186 + "navOrder": 187 }, { - "id": 1410, + "id": 1411, "path": "/sdk/android/group/retrieving-groups/is-join-group", "relativePath": "sdk/android/group/retrieving-groups/is-join-group", "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", "title": "Check group membership", - "description": "OpenIM Android SDK guide for Check group membership.", + "description": "Use isJoinGroup to determine whether the current signed-in user has joined a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2780, + "status": "published", + "sourceIndex": 2781, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx", - "navOrder": 187 + "navOrder": 188 }, { - "id": 1411, + "id": 1412, "path": "/sdk/android/group/retrieving-groups/search-groups", "relativePath": "sdk/android/group/retrieving-groups/search-groups", "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", "title": "Search groups", - "description": "OpenIM Android SDK guide for Search groups.", + "description": "Use searchGroups to search locally available groups by group ID or name.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2781, + "status": "published", + "sourceIndex": 2782, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx", - "navOrder": 188 + "navOrder": 189 }, { - "id": 1412, + "id": 1413, "path": "/sdk/android/group/group-applications/overview-group-applications", "relativePath": "sdk/android/group/group-applications/overview-group-applications", "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", "title": "Group applications overview", - "description": "OpenIM Android SDK guide for Group applications overview.", + "description": "Understand received and sent group applications, handling results, and state events in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2782, + "status": "published", + "sourceIndex": 2783, "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx", - "navOrder": 189 + "navOrder": 190 }, { - "id": 1413, + "id": 1414, "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-recipient", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "title": "Get received group applications", - "description": "OpenIM Android SDK guide for Get received group applications.", + "description": "Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2783, + "status": "published", + "sourceIndex": 2784, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx", - "navOrder": 190 + "navOrder": 191 }, { - "id": 1414, + "id": 1415, "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-applicant", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "title": "Get sent group applications", - "description": "OpenIM Android SDK guide for Get sent group applications.", + "description": "Use getSendGroupApplicationList to retrieve group applications sent by the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2784, + "status": "published", + "sourceIndex": 2785, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx", - "navOrder": 191 + "navOrder": 192 }, { - "id": 1415, + "id": 1416, "path": "/sdk/android/group/group-applications/accept-group-application", "relativePath": "sdk/android/group/group-applications/accept-group-application", "sourcePath": "/sdk/android/group/group-applications/accept-group-application", "title": "Accept a group application", - "description": "OpenIM Android SDK guide for Accept a group application.", + "description": "Use acceptGroupApplication to accept a user’s application to join a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2785, + "status": "published", + "sourceIndex": 2786, "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx", - "navOrder": 192 + "navOrder": 193 }, { - "id": 1416, + "id": 1417, "path": "/sdk/android/group/group-applications/refuse-group-application", "relativePath": "sdk/android/group/group-applications/refuse-group-application", "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", "title": "Reject a group application", - "description": "OpenIM Android SDK guide for Reject a group application.", + "description": "Use refuseGroupApplication to reject a user’s application to join a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2786, + "status": "published", + "sourceIndex": 2787, "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx", - "navOrder": 193 + "navOrder": 194 }, { - "id": 1417, + "id": 1418, "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "relativePath": "sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "title": "Group member queries overview", - "description": "OpenIM Android SDK guide for Group member queries overview.", + "description": "Understand group member lists, specified member profiles, and membership queries in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2787, + "status": "published", + "sourceIndex": 2788, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx", - "navOrder": 194 + "navOrder": 195 }, { - "id": 1418, + "id": 1419, "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-list", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "List group members", - "description": "OpenIM Android SDK guide for List group members.", + "title": "Get group members", + "description": "Use getGroupMemberList to retrieve group members by role and page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2788, + "status": "published", + "sourceIndex": 2789, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx", - "navOrder": 195 + "navOrder": 196 }, { - "id": 1419, + "id": 1420, "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "relativePath": "sdk/android/group/retrieving-group-members/get-specified-group-members-info", "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get specified group member profiles", - "description": "OpenIM Android SDK guide for Get specified group member profiles.", + "title": "Get group member profiles", + "description": "Use getGroupMembersInfo to retrieve specified users’ profiles within a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2789, + "status": "published", + "sourceIndex": 2790, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx", - "navOrder": 196 + "navOrder": 197 }, { - "id": 1420, + "id": 1421, "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", "relativePath": "sdk/android/group/retrieving-group-members/get-users-in-group", "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "Check group membership", - "description": "OpenIM Android SDK guide for Check group membership.", + "title": "Check users in a group", + "description": "Use getUsersInGroup to select the users who are currently members of a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2790, + "status": "published", + "sourceIndex": 2791, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx", - "navOrder": 197 + "navOrder": 198 }, { - "id": 1421, + "id": 1422, "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get the group owner and administrators", - "description": "OpenIM Android SDK guide for Get the group owner and administrators.", + "title": "Get group owners and admins", + "description": "Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2791, + "status": "published", + "sourceIndex": 2792, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", - "navOrder": 198 + "navOrder": 199 }, { - "id": 1422, + "id": 1423, "path": "/sdk/android/group/retrieving-group-members/search-group-members", "relativePath": "sdk/android/group/retrieving-group-members/search-group-members", "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", "title": "Search group members", - "description": "OpenIM Android SDK guide for Search group members.", + "description": "Use searchGroupMembers to search group members by user ID or group nickname.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2792, + "status": "published", + "sourceIndex": 2793, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx", - "navOrder": 199 + "navOrder": 200 }, { - "id": 1423, + "id": 1424, "path": "/sdk/android/group/managing-group-members/invite-user-to-group", "relativePath": "sdk/android/group/managing-group-members/invite-user-to-group", "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", "title": "Invite users to a group", - "description": "OpenIM Android SDK guide for Invite users to a group.", + "description": "Use inviteUserToGroup to invite a list of users to a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2793, + "status": "published", + "sourceIndex": 2794, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx", - "navOrder": 200 + "navOrder": 201 }, { - "id": 1424, + "id": 1425, "path": "/sdk/android/group/managing-group-members/kick-group-member", "relativePath": "sdk/android/group/managing-group-members/kick-group-member", "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", "title": "Remove group members", - "description": "OpenIM Android SDK guide for Remove group members.", + "description": "Use kickGroupMember to remove specified members from a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2794, + "status": "published", + "sourceIndex": 2795, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx", - "navOrder": 201 + "navOrder": 202 }, { - "id": 1425, + "id": 1426, "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", "relativePath": "sdk/android/group/managing-group-members/set-group-member-nickname", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "Update a member’s group nickname", - "description": "OpenIM Android SDK guide for Update a member’s group nickname.", + "title": "Update a group nickname", + "description": "Use SetGroupMemberInfo.nickname to update a member’s display name in a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2795, + "status": "published", + "sourceIndex": 2796, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx", - "navOrder": 202 + "navOrder": 203 }, { - "id": 1426, + "id": 1427, "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", "relativePath": "sdk/android/group/managing-group-members/set-group-member-role-level", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", "title": "Manage group administrators", - "description": "OpenIM Android SDK guide for Manage group administrators.", + "description": "Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2796, + "status": "published", + "sourceIndex": 2797, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx", - "navOrder": 203 + "navOrder": 204 }, { - "id": 1427, + "id": 1428, "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", "relativePath": "sdk/android/group/managing-group-members/set-group-member-avatar", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member’s avatar", - "description": "OpenIM Android SDK guide for Update a group member’s avatar.", + "title": "Update a group member avatar", + "description": "Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2797, + "status": "published", + "sourceIndex": 2798, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx", - "navOrder": 204 + "navOrder": 205 }, { - "id": 1428, + "id": 1429, "path": "/sdk/android/group/managing-group-members/set-group-member-extension", "relativePath": "sdk/android/group/managing-group-members/set-group-member-extension", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", - "title": "Set a group member extension", - "description": "OpenIM Android SDK guide for Set a group member extension.", + "title": "Set group member extra data", + "description": "Store application-defined group member data in SetGroupMemberInfo.ex.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2798, + "status": "published", + "sourceIndex": 2799, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx", - "navOrder": 205 + "navOrder": 206 }, { - "id": 1429, + "id": 1430, "path": "/sdk/android/group/managing-group-members/transfer-group-owner", "relativePath": "sdk/android/group/managing-group-members/transfer-group-owner", "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", "title": "Transfer group ownership", - "description": "OpenIM Android SDK guide for Transfer group ownership.", + "description": "Use transferGroupOwner to transfer group ownership to a specified member.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2799, + "status": "published", + "sourceIndex": 2800, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx", - "navOrder": 206 + "navOrder": 207 }, { - "id": 1430, + "id": 1431, "path": "/sdk/android/group/managing-group-members/change-group-member-mute", "relativePath": "sdk/android/group/managing-group-members/change-group-member-mute", "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", "title": "Mute or unmute a group member", - "description": "OpenIM Android SDK guide for Mute or unmute a group member.", + "description": "Use changeGroupMemberMute to set the mute duration for a specified group member.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2800, + "status": "published", + "sourceIndex": 2801, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx", - "navOrder": 207 + "navOrder": 208 }, { - "id": 1431, + "id": 1432, "path": "/sdk/android/message/overview-message", "relativePath": "sdk/android/message/overview-message", "sourcePath": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "Message overview", + "description": "Learn about the Android SDK Message model, message lifecycle, and message listener.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 2801, + "status": "published", + "sourceIndex": 2802, "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", - "navOrder": 208 + "navOrder": 209 }, { - "id": 1432, + "id": 1433, "path": "/sdk/android/message/creating-messages/create-text-message", "relativePath": "sdk/android/message/creating-messages/create-text-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-message", "title": "Create a text message", - "description": "OpenIM Android SDK guide for Create a text message.", + "description": "Use createTextMessage to create a text Message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2802, + "status": "published", + "sourceIndex": 2803, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx", - "navOrder": 209 + "navOrder": 210 }, { - "id": 1433, + "id": 1434, "path": "/sdk/android/message/creating-messages/create-text-at-message", "relativePath": "sdk/android/message/creating-messages/create-text-at-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", - "title": "Create an @ message", - "description": "OpenIM Android SDK guide for Create an @ message.", + "title": "Create a mention message", + "description": "Use createTextAtMessage to create a text message that mentions group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2803, + "status": "published", + "sourceIndex": 2804, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx", - "navOrder": 210 + "navOrder": 211 }, { - "id": 1434, + "id": 1435, "path": "/sdk/android/message/creating-messages/create-custom-message", "relativePath": "sdk/android/message/creating-messages/create-custom-message", "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", "title": "Create a custom message", - "description": "OpenIM Android SDK guide for Create a custom message.", + "description": "Use createCustomMessage to carry application-defined JSON content.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2804, + "status": "published", + "sourceIndex": 2805, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx", - "navOrder": 211 + "navOrder": 212 }, { - "id": 1435, + "id": 1436, + "path": "/sdk/android/message/creating-messages/create-image-message", + "relativePath": "sdk/android/message/creating-messages/create-image-message", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "description": "Create an image message from a path relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2806, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx", + "navOrder": 213 + }, + { + "id": 1437, "path": "/sdk/android/message/creating-messages/create-image-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", - "description": "OpenIM Android SDK guide for Create an image message from a file.", + "title": "Create an image message from a local path", + "description": "Create an image message from an absolute path.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2805, + "status": "published", + "sourceIndex": 2807, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx", - "navOrder": 212 + "navOrder": 214 }, { - "id": 1436, + "id": 1438, "path": "/sdk/android/message/creating-messages/create-image-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", - "description": "OpenIM Android SDK guide for Create an image message from a URL.", + "title": "Create an image message from URLs", + "description": "Use createImageMessageByURL to create an image message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2806, + "status": "published", + "sourceIndex": 2808, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx", - "navOrder": 213 + "navOrder": 215 }, { - "id": 1437, + "id": 1439, + "path": "/sdk/android/message/creating-messages/create-sound-message", + "relativePath": "sdk/android/message/creating-messages/create-sound-message", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "description": "Create an audio message from a path relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2809, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx", + "navOrder": 216 + }, + { + "id": 1440, "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", - "description": "OpenIM Android SDK guide for Create an audio message from a file.", + "title": "Create an audio message from a local path", + "description": "Create an audio message from an absolute path.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2807, + "status": "published", + "sourceIndex": 2810, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx", - "navOrder": 214 + "navOrder": 217 }, { - "id": 1438, + "id": 1441, "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", "title": "Create an audio message from a URL", - "description": "OpenIM Android SDK guide for Create an audio message from a URL.", + "description": "Use SoundElem to create an audio message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2808, + "status": "published", + "sourceIndex": 2811, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx", - "navOrder": 215 + "navOrder": 218 }, { - "id": 1439, + "id": 1442, + "path": "/sdk/android/message/creating-messages/create-video-message", + "relativePath": "sdk/android/message/creating-messages/create-video-message", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "description": "Create a video message from paths relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2812, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx", + "navOrder": 219 + }, + { + "id": 1443, "path": "/sdk/android/message/creating-messages/create-video-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from files", - "description": "OpenIM Android SDK guide for Create a video message from files.", + "title": "Create a video message from local paths", + "description": "Create a video message from absolute video and thumbnail paths.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2809, + "status": "published", + "sourceIndex": 2813, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx", - "navOrder": 216 + "navOrder": 220 }, { - "id": 1440, + "id": 1444, "path": "/sdk/android/message/creating-messages/create-video-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", "title": "Create a video message from URLs", - "description": "OpenIM Android SDK guide for Create a video message from URLs.", + "description": "Use VideoElem to create a video message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2810, + "status": "published", + "sourceIndex": 2814, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx", - "navOrder": 217 + "navOrder": 221 }, { - "id": 1441, + "id": 1445, + "path": "/sdk/android/message/creating-messages/create-file-message", + "relativePath": "sdk/android/message/creating-messages/create-file-message", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "description": "Create a file message from a path relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2815, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx", + "navOrder": 222 + }, + { + "id": 1446, "path": "/sdk/android/message/creating-messages/create-file-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", - "description": "OpenIM Android SDK guide for Create a file message from a file.", + "title": "Create a file message from a local path", + "description": "Create a file message from an absolute path.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2811, + "status": "published", + "sourceIndex": 2816, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx", - "navOrder": 218 + "navOrder": 223 }, { - "id": 1442, + "id": 1447, "path": "/sdk/android/message/creating-messages/create-file-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", "title": "Create a file message from a URL", - "description": "OpenIM Android SDK guide for Create a file message from a URL.", + "description": "Use FileElem to create a file message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2812, + "status": "published", + "sourceIndex": 2817, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx", - "navOrder": 219 + "navOrder": 224 }, { - "id": 1443, + "id": 1448, "path": "/sdk/android/message/creating-messages/create-card-message", "relativePath": "sdk/android/message/creating-messages/create-card-message", "sourcePath": "/sdk/android/message/creating-messages/create-card-message", "title": "Create a contact card message", - "description": "OpenIM Android SDK guide for Create a contact card message.", + "description": "Use createCardMessage to create a contact card message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2813, + "status": "published", + "sourceIndex": 2818, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx", - "navOrder": 220 + "navOrder": 225 }, { - "id": 1444, + "id": 1449, "path": "/sdk/android/message/creating-messages/create-location-message", "relativePath": "sdk/android/message/creating-messages/create-location-message", "sourcePath": "/sdk/android/message/creating-messages/create-location-message", "title": "Create a location message", - "description": "OpenIM Android SDK guide for Create a location message.", + "description": "Use createLocationMessage to create a message with coordinates and a location description.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2814, + "status": "published", + "sourceIndex": 2819, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx", - "navOrder": 221 + "navOrder": 226 }, { - "id": 1445, + "id": 1450, "path": "/sdk/android/message/creating-messages/create-face-message", "relativePath": "sdk/android/message/creating-messages/create-face-message", "sourcePath": "/sdk/android/message/creating-messages/create-face-message", "title": "Create an emoji message", - "description": "OpenIM Android SDK guide for Create an emoji message.", + "description": "Use createFaceMessage to create a custom emoji message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2815, + "status": "published", + "sourceIndex": 2820, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx", - "navOrder": 222 + "navOrder": 227 }, { - "id": 1446, + "id": 1451, "path": "/sdk/android/message/creating-messages/create-quote-message", "relativePath": "sdk/android/message/creating-messages/create-quote-message", "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", "title": "Create a reply message", - "description": "OpenIM Android SDK guide for Create a reply message.", + "description": "Use createQuoteMessage to reply while quoting an existing message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2816, + "status": "published", + "sourceIndex": 2821, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx", - "navOrder": 223 + "navOrder": 228 }, { - "id": 1447, + "id": 1452, + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "relativePath": "sdk/android/message/creating-messages/create-advanced-text-message", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "description": "Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2822, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx", + "navOrder": 229 + }, + { + "id": 1453, + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "relativePath": "sdk/android/message/creating-messages/create-advanced-quote-message", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "description": "Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2823, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx", + "navOrder": 230 + }, + { + "id": 1454, "path": "/sdk/android/message/creating-messages/create-forward-message", "relativePath": "sdk/android/message/creating-messages/create-forward-message", "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", "title": "Create a forwarded message", - "description": "OpenIM Android SDK guide for Create a forwarded message.", + "description": "Use createForwardMessage to create a forwarded copy of a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2817, + "status": "published", + "sourceIndex": 2824, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx", - "navOrder": 224 + "navOrder": 231 }, { - "id": 1448, + "id": 1455, "path": "/sdk/android/message/creating-messages/create-merger-message", "relativePath": "sdk/android/message/creating-messages/create-merger-message", "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", - "title": "Create a merged forward message", - "description": "OpenIM Android SDK guide for Create a merged forward message.", + "title": "Create a merged message", + "description": "Use createMergerMessage to combine multiple messages into one summary message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2818, + "status": "published", + "sourceIndex": 2825, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx", - "navOrder": 225 + "navOrder": 232 }, { - "id": 1449, + "id": 1456, "path": "/sdk/android/message/sending-messages/send-message", "relativePath": "sdk/android/message/sending-messages/send-message", "sourcePath": "/sdk/android/message/sending-messages/send-message", "title": "Send a message", - "description": "OpenIM Android SDK guide for Send a message.", + "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2819, + "status": "published", + "sourceIndex": 2826, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx", - "navOrder": 226 + "navOrder": 233 }, { - "id": 1450, + "id": 1457, "path": "/sdk/android/message/sending-messages/send-message-not-oss", "relativePath": "sdk/android/message/sending-messages/send-message-not-oss", "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "Send an uploaded media message", - "description": "OpenIM Android SDK guide for Send an uploaded media message.", + "title": "Send a message without OSS", + "description": "Use sendMessageNotOss to send a media message whose resources were uploaded by your application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2820, + "status": "published", + "sourceIndex": 2827, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx", - "navOrder": 227 + "navOrder": 234 }, { - "id": 1451, + "id": 1458, "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "relativePath": "sdk/android/message/sending-messages/set-msg-send-progress-listener", "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "title": "Track message sending progress", - "description": "OpenIM Android SDK guide for Track message sending progress.", + "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2821, + "status": "published", + "sourceIndex": 2828, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx", - "navOrder": 228 + "navOrder": 235 }, { - "id": 1452, + "id": 1459, "path": "/sdk/android/message/receiving-messages/receive-messages", "relativePath": "sdk/android/message/receiving-messages/receive-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", "title": "Receive messages", - "description": "OpenIM Android SDK guide for Receive messages.", + "description": "Use OnAdvanceMsgListener to receive new, offline, and online-only messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2822, + "status": "published", + "sourceIndex": 2829, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx", - "navOrder": 229 + "navOrder": 236 }, { - "id": 1453, + "id": 1460, "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "relativePath": "sdk/android/message/receiving-messages/receive-custom-business-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "title": "Receive custom business messages", - "description": "OpenIM Android SDK guide for Receive custom business messages.", + "description": "Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2823, + "status": "published", + "sourceIndex": 2830, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx", - "navOrder": 230 + "navOrder": 237 }, { - "id": 1454, + "id": 1461, "path": "/sdk/android/message/retrieving-messages/load-older-messages", "relativePath": "sdk/android/message/retrieving-messages/load-older-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "Load message history", - "description": "OpenIM Android SDK guide for Load message history.", + "title": "Load older messages", + "description": "Use getAdvancedHistoryMessageList to load conversation history by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2824, + "status": "published", + "sourceIndex": 2831, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx", - "navOrder": 231 + "navOrder": 238 }, { - "id": 1455, + "id": 1462, "path": "/sdk/android/message/retrieving-messages/load-newer-messages", "relativePath": "sdk/android/message/retrieving-messages/load-newer-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "Load message history in reverse", - "description": "OpenIM Android SDK guide for Load message history in reverse.", + "title": "Load newer messages", + "description": "Use getAdvancedHistoryMessageListReverse to load messages after a starting point.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2825, + "status": "published", + "sourceIndex": 2832, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx", - "navOrder": 232 + "navOrder": 239 }, { - "id": 1456, + "id": 1463, "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", "relativePath": "sdk/android/message/retrieving-messages/find-messages-by-id", "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", "title": "Find messages by ID", - "description": "OpenIM Android SDK guide for Find messages by ID.", + "description": "Use findMessageList to retrieve message records with SearchParams.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2826, + "status": "published", + "sourceIndex": 2833, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx", - "navOrder": 233 + "navOrder": 240 }, { - "id": 1457, + "id": 1464, + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "relativePath": "sdk/android/message/retrieving-messages/load-message-context", + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "description": "Retrieve messages before and after a specified message with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2834, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx", + "navOrder": 241 + }, + { + "id": 1465, "path": "/sdk/android/message/searching-messages/search-messages", "relativePath": "sdk/android/message/searching-messages/search-messages", "sourcePath": "/sdk/android/message/searching-messages/search-messages", "title": "Search messages", - "description": "OpenIM Android SDK guide for Search messages.", + "description": "Use searchLocalMessages to search messages synchronized to the current account’s local storage.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2827, + "status": "published", + "sourceIndex": 2835, "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx", - "navOrder": 234 + "navOrder": 242 + }, + { + "id": 1466, + "path": "/sdk/android/message/composing-messages/update-typing-status", + "relativePath": "sdk/android/message/composing-messages/update-typing-status", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "description": "Report the current conversation typing state with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2836, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", + "navOrder": 243 }, { - "id": 1458, - "path": "/sdk/android/message/composing-messages/update-typing-status", - "relativePath": "sdk/android/message/composing-messages/update-typing-status", - "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", - "title": "Report typing status", - "description": "OpenIM Android SDK guide for Report typing status.", + "id": 1467, + "path": "/sdk/android/message/composing-messages/get-typing-status", + "relativePath": "sdk/android/message/composing-messages/get-typing-status", + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "description": "Use getInputState to retrieve a specified user’s current typing status in a conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2828, - "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", - "navOrder": 235 + "status": "published", + "sourceIndex": 2837, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx", + "navOrder": 244 }, { - "id": 1459, + "id": 1468, "path": "/sdk/android/message/managing-messages/delete-local-message", "relativePath": "sdk/android/message/managing-messages/delete-local-message", "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", "title": "Delete a local message", - "description": "OpenIM Android SDK guide for Delete a local message.", + "description": "Use deleteMessageFromLocalStorage to delete only the message copy on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2829, + "status": "published", + "sourceIndex": 2838, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx", - "navOrder": 236 + "navOrder": 245 }, { - "id": 1460, + "id": 1469, "path": "/sdk/android/message/managing-messages/delete-saved-messages", "relativePath": "sdk/android/message/managing-messages/delete-saved-messages", "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", "title": "Delete messages in a batch", - "description": "OpenIM Android SDK guide for Delete messages in a batch.", + "description": "Delete multiple messages from one conversation for the current account with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2830, + "status": "published", + "sourceIndex": 2839, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx", - "navOrder": 237 + "navOrder": 246 }, { - "id": 1461, + "id": 1470, + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "relativePath": "sdk/android/message/managing-messages/delete-user-messages", + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "description": "Delete every message sent by a specified user in a group chat with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2840, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx", + "navOrder": 247 + }, + { + "id": 1471, "path": "/sdk/android/message/managing-messages/revoke-a-message", "relativePath": "sdk/android/message/managing-messages/revoke-a-message", "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", "title": "Revoke a message", - "description": "OpenIM Android SDK guide for Revoke a message.", + "description": "Revoke a sent message and handle revocation notifications received by other clients.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2831, + "status": "published", + "sourceIndex": 2841, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", - "navOrder": 238 + "navOrder": 248 }, { - "id": 1462, + "id": 1472, "path": "/sdk/android/message/managing-messages/modify-a-message", "relativePath": "sdk/android/message/managing-messages/modify-a-message", "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", "title": "Modify a message", - "description": "OpenIM Android SDK guide for Modify a message.", + "description": "Modify supported message content and handle modification events received by other clients.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2832, + "status": "published", + "sourceIndex": 2842, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx", - "navOrder": 239 + "navOrder": 249 }, { - "id": 1463, + "id": 1473, "path": "/sdk/android/message/managing-messages/get-pinned-messages", "relativePath": "sdk/android/message/managing-messages/get-pinned-messages", "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "Get pinned messages in a conversation", - "description": "OpenIM Android SDK guide for Get pinned messages in a conversation.", + "title": "View pinned messages", + "description": "Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2833, + "status": "published", + "sourceIndex": 2843, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx", - "navOrder": 240 + "navOrder": 250 }, { - "id": 1464, + "id": 1474, "path": "/sdk/android/message/managing-messages/set-message-pinned", "relativePath": "sdk/android/message/managing-messages/set-message-pinned", "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", "title": "Pin or unpin a message", - "description": "OpenIM Android SDK guide for Pin or unpin a message.", + "description": "Change a conversation message’s pinned state and handle pinned-message change events.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2834, + "status": "published", + "sourceIndex": 2844, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx", - "navOrder": 241 + "navOrder": 251 }, { - "id": 1465, + "id": 1475, "path": "/sdk/android/message/managing-messages/insert-local-single-message", "relativePath": "sdk/android/message/managing-messages/insert-local-single-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", - "title": "Insert a local one-to-one message", - "description": "OpenIM Android SDK guide for Insert a local one-to-one message.", + "title": "Insert a local direct message", + "description": "Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2835, + "status": "published", + "sourceIndex": 2845, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx", - "navOrder": 242 + "navOrder": 252 }, { - "id": 1466, + "id": 1476, "path": "/sdk/android/message/managing-messages/insert-local-group-message", "relativePath": "sdk/android/message/managing-messages/insert-local-group-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", "title": "Insert a local group message", - "description": "OpenIM Android SDK guide for Insert a local group message.", + "description": "Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2836, + "status": "published", + "sourceIndex": 2846, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx", - "navOrder": 243 + "navOrder": 253 }, { - "id": 1467, + "id": 1477, "path": "/sdk/android/message/managing-messages/clear-all-local-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-local-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", "title": "Clear all local messages", - "description": "OpenIM Android SDK guide for Clear all local messages.", + "description": "Use deleteAllMsgFromLocal to clear all messages stored on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2837, + "status": "published", + "sourceIndex": 2847, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx", - "navOrder": 244 + "navOrder": 254 }, { - "id": 1468, + "id": 1478, "path": "/sdk/android/message/managing-messages/clear-all-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "Clear local and server messages", - "description": "OpenIM Android SDK guide for Clear local and server messages.", + "title": "Clear all saved messages", + "description": "Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2838, + "status": "published", + "sourceIndex": 2848, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx", - "navOrder": 245 + "navOrder": 255 }, { - "id": 1469, + "id": 1479, "path": "/sdk/android/message/managing-messages/set-message-local-ex", "relativePath": "sdk/android/message/managing-messages/set-message-local-ex", "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "Set a local message extension", - "description": "OpenIM Android SDK guide for Set a local message extension.", + "title": "Set local message extensions", + "description": "Use setMessageLocalEx to store message data used only on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2839, + "status": "published", + "sourceIndex": 2849, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx", - "navOrder": 246 + "navOrder": 256 }, { - "id": 1470, + "id": 1480, + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "relativePath": "sdk/android/message/managing-read-status/send-group-read-receipts", + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "description": "Report group-message read receipts with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2850, + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx", + "navOrder": 257 + }, + { + "id": 1481, + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "relativePath": "sdk/android/message/managing-read-status/get-group-message-readers", + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "description": "Retrieve members who have or have not read a group message using pagination.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2851, + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx", + "navOrder": 258 + }, + { + "id": 1482, "path": "/sdk/android/file-uploads/track-file-upload-progress", "relativePath": "sdk/android/file-uploads/track-file-upload-progress", "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", "title": "Track file upload progress", - "description": "OpenIM Android SDK guide for Track file upload progress.", + "description": "Use OnPutFileListener to track an individual Android SDK file upload.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2840, + "status": "published", + "sourceIndex": 2852, "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx", - "navOrder": 247 + "navOrder": 259 }, { - "id": 1471, + "id": 1483, "path": "/sdk/android/file-uploads/upload-file", "relativePath": "sdk/android/file-uploads/upload-file", "sourcePath": "/sdk/android/file-uploads/upload-file", "title": "Upload a file", - "description": "OpenIM Android SDK guide for Upload a file.", + "description": "Upload a standalone file with the Android SDK and retrieve its remote resource URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2841, + "status": "published", + "sourceIndex": 2853, "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", - "navOrder": 248 + "navOrder": 260 }, { - "id": 1472, + "id": 1484, "path": "/sdk/android/calling/overview-calling", "relativePath": "sdk/android/calling/overview-calling", "sourcePath": "/sdk/android/calling/overview-calling", "title": "Audio and video calling overview", - "description": "OpenIM Android SDK guide for Audio and video calling overview.", + "description": "Learn about Android SDK call signaling, room information, and event boundaries.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2842, + "status": "published", + "sourceIndex": 2854, "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", - "navOrder": 249 + "navOrder": 261 }, { - "id": 1473, + "id": 1485, "path": "/sdk/android/calling/managing-calls/start-single-call", "relativePath": "sdk/android/calling/managing-calls/start-single-call", "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", "title": "Start a one-to-one call", - "description": "OpenIM Android SDK guide for Start a one-to-one call.", + "description": "Start a one-to-one audio or video call with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2843, + "status": "published", + "sourceIndex": 2855, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", - "navOrder": 250 + "navOrder": 262 }, { - "id": 1474, + "id": 1486, "path": "/sdk/android/calling/managing-calls/start-group-call", "relativePath": "sdk/android/calling/managing-calls/start-group-call", "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", "title": "Start a group call", - "description": "OpenIM Android SDK guide for Start a group call.", + "description": "Start a group audio or video call with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2844, + "status": "published", + "sourceIndex": 2856, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", - "navOrder": 251 + "navOrder": 263 }, { - "id": 1475, + "id": 1487, "path": "/sdk/android/calling/managing-calls/accept-call", "relativePath": "sdk/android/calling/managing-calls/accept-call", "sourcePath": "/sdk/android/calling/managing-calls/accept-call", "title": "Accept a call", - "description": "OpenIM Android SDK guide for Accept a call.", + "description": "Accept a call invitation with the Android SDK and retrieve room credentials.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2845, + "status": "published", + "sourceIndex": 2857, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", - "navOrder": 252 + "navOrder": 264 }, { - "id": 1476, + "id": 1488, "path": "/sdk/android/calling/managing-calls/reject-call", "relativePath": "sdk/android/calling/managing-calls/reject-call", "sourcePath": "/sdk/android/calling/managing-calls/reject-call", "title": "Reject a call", - "description": "OpenIM Android SDK guide for Reject a call.", + "description": "Reject a call invitation with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2846, + "status": "published", + "sourceIndex": 2858, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", - "navOrder": 253 + "navOrder": 265 }, { - "id": 1477, + "id": 1489, "path": "/sdk/android/calling/managing-calls/cancel-call", "relativePath": "sdk/android/calling/managing-calls/cancel-call", "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", "title": "Cancel a call invitation", - "description": "OpenIM Android SDK guide for Cancel a call invitation.", + "description": "Cancel a call invitation before it is accepted with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2847, + "status": "published", + "sourceIndex": 2859, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", - "navOrder": 254 + "navOrder": 266 }, { - "id": 1478, + "id": 1490, "path": "/sdk/android/calling/managing-calls/hang-up-call", "relativePath": "sdk/android/calling/managing-calls/hang-up-call", "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", - "title": "End a call", - "description": "OpenIM Android SDK guide for End a call.", + "title": "Hang up a call", + "description": "Hang up an established call with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2848, + "status": "published", + "sourceIndex": 2860, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", - "navOrder": 255 + "navOrder": 267 }, { - "id": 1479, + "id": 1491, "path": "/sdk/android/calling/managing-calls/handle-call-events", "relativePath": "sdk/android/calling/managing-calls/handle-call-events", "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", "title": "Handle call events", - "description": "OpenIM Android SDK guide for Handle call events.", + "description": "Register Android SDK invitation, participant, and media-stream callbacks in one call listener.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2849, + "status": "published", + "sourceIndex": 2861, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", - "navOrder": 256 + "navOrder": 268 }, { - "id": 1480, + "id": 1492, "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "relativePath": "sdk/android/calling/retrieving-call-information/restore-pending-invitation", "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending call invitation", - "description": "OpenIM Android SDK guide for Restore a pending call invitation.", + "title": "Restore a pending invitation", + "description": "Restore a call invitation that was received before the Android application started or resumed.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2850, + "status": "published", + "sourceIndex": 2862, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", - "navOrder": 257 + "navOrder": 269 }, { - "id": 1481, + "id": 1493, "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-room-by-group-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "title": "Get a group call room", - "description": "OpenIM Android SDK guide for Get a group call room.", + "description": "Use the Android SDK to retrieve an active call room by group ID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2851, + "status": "published", + "sourceIndex": 2863, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", - "navOrder": 258 + "navOrder": 270 }, { - "id": 1482, + "id": 1494, "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-token-by-room-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get a call room token", - "description": "OpenIM Android SDK guide for Get a call room token.", + "title": "Get room credentials", + "description": "Use the Android SDK to retrieve fresh join credentials for a known room ID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2852, + "status": "published", + "sourceIndex": 2864, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", - "navOrder": 259 + "navOrder": 271 }, { - "id": 1483, + "id": 1495, "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "relativePath": "sdk/android/calling/sending-custom-signals/send-a-custom-signal", "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "title": "Send a custom signal", - "description": "OpenIM Android SDK guide for Send a custom signal.", + "description": "Send and receive custom signaling data in an Android SDK call room.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2853, + "status": "published", + "sourceIndex": 2865, "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", - "navOrder": 260 + "navOrder": 272 }, { - "id": 1484, + "id": 1496, "path": "/sdk/android/events/overview-events", "relativePath": "sdk/android/events/overview-events", "sourcePath": "/sdk/android/events/overview-events", "title": "Events overview", - "description": "OpenIM Android SDK guide for Events overview.", + "description": "Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2854, + "status": "published", + "sourceIndex": 2866, "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", - "navOrder": 261 + "navOrder": 273 }, { - "id": 1485, + "id": 1497, "path": "/sdk/android/logger", "relativePath": "sdk/android/logger", "sourcePath": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "Logging", + "description": "Configure Android SDK logging, write application diagnostics, and upload logs.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 2855, + "status": "published", + "sourceIndex": 2867, "contentFile": "content/docs/chat/sdk/android/logger.mdx", - "navOrder": 262 + "navOrder": 274 }, { "id": 864, diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index 382f7cf5f6..bf1ee33bd6 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1941,7 +1941,7 @@ "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅和读取在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" + "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus 、 unsubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅、读取和取消在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 、 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" }, { "path": "/sdk/android/user/user-profile/get-users-info", @@ -1981,7 +1981,7 @@ "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", - "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。" + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status 移除不再需要的用户。" }, { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -1991,6 +1991,14 @@ "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; 该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 List 状态快照,适合在重连或重新进入页面时按 userID 校准状态。 查询本身不会触发 onUserStatusChanged 。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。" }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "取消用户状态订阅", + "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user online-status unsubscribe-users-online-status", + "content": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data for String userID : userIDs presenceByUserID.remove userID ; @Override public void onError int code, String error recordStatusUnsubscribeFailure code, error ; , userIDs ; 成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 userID ;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 需要再次跟踪用户状态时,重新调用 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。" + }, { "path": "/sdk/android/user/friends/get-friend-list-page", "title": "分页获取好友列表", @@ -2265,7 +2273,7 @@ }, { "path": "/sdk/android/group/update-group-profile", - "title": "更新群资料", + "title": "更新群名称、简介和头像", "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group update-group-profile", @@ -2273,7 +2281,7 @@ }, { "path": "/sdk/android/group/set-group-announcement", - "title": "发布群公告", + "title": "发布或更新群公告", "description": "通过 GroupInfo.notification 发布或更新群公告。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-announcement", @@ -2281,7 +2289,7 @@ }, { "path": "/sdk/android/group/set-group-extension", - "title": "设置群扩展字段", + "title": "设置群组扩展字段", "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-extension", @@ -2305,7 +2313,7 @@ }, { "path": "/sdk/android/group/set-group-member-friend-permission", - "title": "设置成员好友申请权限", + "title": "设置群内添加好友权限", "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", @@ -2313,7 +2321,7 @@ }, { "path": "/sdk/android/group/change-group-mute", - "title": "设置全员禁言", + "title": "设置群组全员禁言", "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group change-group-mute", @@ -2345,7 +2353,7 @@ }, { "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "title": "获取群资料", + "title": "查询指定群组资料", "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", @@ -2361,7 +2369,7 @@ }, { "path": "/sdk/android/group/retrieving-groups/is-join-group", - "title": "检查是否加入群组", + "title": "检查是否已加入群组", "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", @@ -2377,7 +2385,7 @@ }, { "path": "/sdk/android/group/group-applications/overview-group-applications", - "title": "群申请概览", + "title": "入群申请概览", "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", @@ -2385,7 +2393,7 @@ }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "title": "获取收到的群申请", + "title": "获取收到的入群申请", "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", @@ -2393,7 +2401,7 @@ }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "title": "获取发出的群申请", + "title": "获取发出的入群申请", "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", @@ -2401,7 +2409,7 @@ }, { "path": "/sdk/android/group/group-applications/accept-group-application", - "title": "同意群申请", + "title": "接受入群申请", "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications accept-group-application", @@ -2409,7 +2417,7 @@ }, { "path": "/sdk/android/group/group-applications/refuse-group-application", - "title": "拒绝群申请", + "title": "拒绝入群申请", "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", @@ -2425,7 +2433,7 @@ }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "获取群成员列表", + "title": "分页查询群成员", "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", @@ -2433,7 +2441,7 @@ }, { "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "获取群成员资料", + "title": "查询指定群成员资料", "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", @@ -2441,7 +2449,7 @@ }, { "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "检查用户是否在群内", + "title": "查询用户入群状态", "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", @@ -2465,7 +2473,7 @@ }, { "path": "/sdk/android/group/managing-group-members/invite-user-to-group", - "title": "邀请用户入群", + "title": "邀请用户加入群组", "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", @@ -2481,7 +2489,7 @@ }, { "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "更新群昵称", + "title": "修改群内昵称", "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", @@ -2489,7 +2497,7 @@ }, { "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "title": "管理群管理员", + "title": "设置管理员", "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", @@ -2521,7 +2529,7 @@ }, { "path": "/sdk/android/group/managing-group-members/change-group-member-mute", - "title": "禁言或解除禁言群成员", + "title": "设置群成员禁言", "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", @@ -2559,65 +2567,97 @@ "keywords": "sdk android v4 sdk android message creating-messages create-custom-message", "content": "data 、 extension 和 description 由业务定义,接收端应按自己的协议解析。 Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" }, + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "title": "创建图片消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建图片消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessage imagePath ; 图片文件应位于 SDK 初始化时配置的数据目录内, imagePath 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。" + }, { "path": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "从文件创建图片消息", - "description": "使用相对路径或绝对路径创建图片消息。", + "title": "使用本地路径创建图片消息", + "description": "使用绝对路径创建图片消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", - "content": "缓存目录内使用 createImageMessage ,绝对路径使用 createImageMessageFromFullPath 。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageFromFullPath filePath ;" + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessageFromFullPath absolutePath ; 绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。" }, { "path": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "从 URL 创建图片消息", + "title": "使用 URL 创建图片消息", "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-url", "content": "准备 PictureInfo 的原图、大图和缩略图信息后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "title": "创建音频消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建音频消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessage soundPath, durationSeconds ; 音频文件应位于 SDK 初始化时配置的数据目录内, soundPath 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。" + }, { "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "从文件创建音频消息", - "description": "使用相对路径或绝对路径创建音频消息。", + "title": "使用本地路径创建音频消息", + "description": "使用绝对路径创建音频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-file", - "content": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath soundPath, durationSeconds ;" + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath absolutePath, durationSeconds ; 绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。" }, { "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "title": "从 URL 创建音频消息", + "title": "使用 URL 创建音频消息", "description": "使用 SoundElem 创建已上传资源的音频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-url", "content": "createSoundMessageByURL 接收已经包含 URL、时长和大小的 SoundElem 。 Message message = OpenIMClient.getInstance .messageManager.createSoundMessageByURL soundElem ;" }, + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "title": "创建视频消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建视频消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessage videoPath, mimeType, durationSeconds, snapshotPath ; 视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。" + }, { "path": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "从文件创建视频消息", - "description": "使用相对路径或绝对路径创建视频消息及缩略图。", + "title": "使用本地路径创建视频消息", + "description": "使用视频和缩略图的绝对路径创建视频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-file", - "content": "视频方法需要 MIME 类型、时长和缩略图路径。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath videoPath, mimeType, durationSeconds, snapshotPath ;" + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath absoluteVideoPath, mimeType, durationSeconds, absoluteSnapshotPath ; 视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。" }, { "path": "/sdk/android/message/creating-messages/create-video-message-by-url", - "title": "从 URL 创建视频消息", + "title": "使用 URL 创建视频消息", "description": "使用 VideoElem 创建已上传资源的视频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-url", "content": "将远端视频及缩略图信息填入 VideoElem 后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" }, + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "title": "创建文件消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建文件消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessage filePath, fileName ; 文件应位于 SDK 初始化时配置的数据目录内, filePath 传入相对于该目录的路径, fileName 用于接收端展示。本方法只创建待发送对象。" + }, { "path": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "从文件创建文件消息", - "description": "使用相对路径或绝对路径创建文件消息。", + "title": "使用本地路径创建文件消息", + "description": "使用绝对路径创建文件消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-file", - "content": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath filePath, fileName ;" + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath absolutePath, fileName ; 绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。" }, { "path": "/sdk/android/message/creating-messages/create-file-message-by-url", - "title": "从 URL 创建文件消息", + "title": "使用 URL 创建文件消息", "description": "使用 FileElem 创建已上传资源的文件消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-url", @@ -2649,12 +2689,28 @@ }, { "path": "/sdk/android/message/creating-messages/create-quote-message", - "title": "创建引用消息", + "title": "创建回复消息", "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", "content": "引用消息保存被引用的完整 Message ,发送前应确保引用对象包含稳定的 clientMsgID 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "创建富文本消息", + "description": "使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-text-message", + "content": "RichMessage 使用 offset 和 length 标记正文范围,并通过 type 、 url 和 info 携带业务定义的实体信息。 RichMessage link = new RichMessage ; link.setType \"link\" ; link.setOffset 0 ; link.setLength 6 ; link.setUrl \"https://docs.openim.io\" ; link.setInfo \" \\\"title\\\":\\\"OpenIM documentation\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedTextMessage \"OpenIM docs\", Collections.singletonList link ; 每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 info 内容,并确保接收端使用相同的 type 与 info 协议。本方法只创建 Message ,不会发送消息;创建完成后使用 发送消息 /sdk/android/message/sending messages/send message 。" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "创建富文本回复", + "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-quote-message", + "content": "富文本回复同时保存回复正文、被引用的原消息和正文中的 RichMessage 实体范围。 RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; 被引用的 originalMessage 应包含稳定的 clientMsgID ,实体范围必须对应最终回复正文。 type 、 url 和 info 的业务协议与 创建富文本消息 /sdk/android/message/creating messages/create advanced text message 相同。本方法只创建待发送对象,不会自动发送。" + }, { "path": "/sdk/android/message/creating-messages/create-forward-message", "title": "创建转发消息", @@ -2681,7 +2737,7 @@ }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "发送非 OSS 消息", + "title": "发送不经 OSS 的消息", "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", @@ -2689,7 +2745,7 @@ }, { "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "title": "跟踪消息发送进度", + "title": "监听消息发送进度", "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", @@ -2713,7 +2769,7 @@ }, { "path": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "加载更早消息", + "title": "加载历史消息", "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", @@ -2721,7 +2777,7 @@ }, { "path": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "加载更新消息", + "title": "反向加载历史消息", "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", @@ -2729,12 +2785,20 @@ }, { "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "title": "按 ID 查询消息", + "title": "按 ID 查找消息", "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", "content": "构造 SearchParams 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" }, + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "读取消息上下文", + "description": "使用 Android SDK 读取一条消息前后的上下文。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", + "content": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 Message 作为锚点。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 锚点消息所在的会话 ID。 | | startMsg | Message | 是 | 已经取得的锚点消息。 | | type | ViewType | 是 | 上下文查看类型;引用消息使用 ViewType.History ,搜索结果使用 ViewType.Search 。 | | before | int | 是 | 锚点之前最多读取的消息数量。 | | after | int | 是 | 锚点之后最多读取的消息数量。 | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // 处理失败 , conversationID, targetMessage, ViewType.Search, 20, 20 ; 成功回调中的 messages.getData 是锚点前后取得的消息列表,消息字段见 消息概览 /sdk/android/message/overview message 。 before 和 after 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 conversationID:clientMsgID 合并,不要依赖固定数组位置。需要先定位消息时见 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 。" + }, { "path": "/sdk/android/message/searching-messages/search-messages", "title": "搜索消息", @@ -2745,11 +2809,19 @@ }, { "path": "/sdk/android/message/composing-messages/update-typing-status", - "title": "更新输入状态", - "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", + "title": "上报输入状态", + "description": "使用 Android SDK 上报当前会话的输入状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", - "content": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 messageManager.typingStatusUpdate callback, peerUserID, \"typing\" ; 成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 OnConversationListener.onConversationUserInputStatusChanged 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。" + "content": "进入输入状态时,将 focus 设为 true ;输入结束、输入框失去焦点或退出会话时,将其设为 false 。 conversationManager.changeInputState new OnBase @Override public void onSuccess String data // 输入状态已上报 @Override public void onError int code, String error // 处理失败 , conversationID, true ; 输入结束时及时清除状态: conversationManager.changeInputState callback, conversationID, false ; 调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 false 。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 其他客户端通过 OnConversationListener.onConversationUserInputStatusChanged 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 进入会话或连接恢复时,可通过 查询输入状态 /sdk/android/message/composing messages/get typing status 获取当前快照。" + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "title": "查询输入状态", + "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", + "content": "进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; 成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由 上报输入状态 /sdk/android/message/composing messages/update typing status 归属的 listener 维护。" }, { "path": "/sdk/android/message/managing-messages/delete-local-message", @@ -2761,31 +2833,39 @@ }, { "path": "/sdk/android/message/managing-messages/delete-saved-messages", - "title": "删除已保存消息", - "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", + "title": "批量删除消息", + "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", - "content": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 messageManager.deleteMessageFromLocalAndSvr conversationID, clientMsgID, callback ;" + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 要删除消息所在的会话 ID。 | | clientMsgIDs | String | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | | isSync | boolean | 是 | 是否把删除动作同步到当前账号的其他客户端。 | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; isSync 为 false 时,删除当前设备及当前账号服务端保存的记录;为 true 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 OnAdvanceMsgListener.onMsgDeleted 是本页归属事件。根据消息路由字段确定会话后,按 clientMsgID 幂等移除消息。 @Override public void onMsgDeleted Message message removeMessage resolveConversationID message , message.getClientMsgID ; 需要校准当前消息快照时,重新查询对应会话的历史消息。" + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "删除群聊中指定用户的全部消息", + "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; 该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 OnAdvanceMsgListener.onDeleteUserAllMsgsInConv 是本页归属事件。收到事件后,根据 conversationID 和 userID 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event removeMessagesBySender event.getConversationID , event.getUserID ; 成功回调、事件到达和重新查询历史是三个独立阶段。" }, { "path": "/sdk/android/message/managing-messages/revoke-a-message", "title": "撤回消息", - "description": "使用 revokeMessageV2 撤回已发送消息。", + "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", - "content": "Android 的撤回方法为 revokeMessageV2 ,撤回详情通过 onRecvMessageRevokedV2 返回。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ;" + "content": "撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; 成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 OnAdvanceMsgListener.onRecvMessageRevokedV2 合并撤回变化。 本页是 onRecvMessageRevokedV2 的完整事件归属页。 RevokedInfo 包含 clientMsgID 、撤回者和撤回时间,但不包含 conversationID ,应先从当前账号的消息索引解析所属会话,再按 conversationID:clientMsgID 更新消息: @Override public void onRecvMessageRevokedV2 RevokedInfo info String clientMsgID = info.getClientMsgID ; String conversationID = findConversationIDByClientMsgID clientMsgID ; if conversationID == null return; markMessageRevoked conversationID, clientMsgID, info ; 接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。 成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。" }, { "path": "/sdk/android/message/managing-messages/modify-a-message", "title": "修改消息", - "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", + "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", - "content": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 onMessageModified 同步。 messageManager.modifyMessage callback, modifyRequest ;" + "content": "modifyMessage 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、 clientMsgID 、路由和发送者等字段,只更新允许修改的内容。 messageManager.modifyMessage callback, modifyRequest ; 成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 OnAdvanceMsgListener.onMessageModified 接收修改后的完整 Message 。 本页是 onMessageModified 的完整事件归属页。根据消息路由解析 conversationID ,再按 conversationID:clientMsgID 替换原消息,不要按数组位置或显示文本匹配: @Override public void onMessageModified Message message String conversationID = resolveConversationID message ; if conversationID == null return; replaceMessage conversationID, message.getClientMsgID , message ; 该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。成功回调、修改事件到达和重新查询历史是三个独立阶段。" }, { "path": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "查看置顶消息", + "title": "查询会话置顶消息", "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", @@ -2794,10 +2874,10 @@ { "path": "/sdk/android/message/managing-messages/set-message-pinned", "title": "置顶或取消置顶消息", - "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", + "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", - "content": "最后一个参数为 true 置顶, false 取消置顶;变化通过 onChangedPinnedMsg 同步。 messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ;" + "content": "最后一个参数为 true 时置顶消息,为 false 时取消置顶: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 OnAdvanceMsgListener.onChangedPinnedMsg 是本页归属事件。回调中的 ChangedPinnedMsg 包含 conversationID 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 clientMsgID 去重: @Override public void onChangedPinnedMsg ChangedPinnedMsg event replacePinnedMessages event.getConversationID , event.getMsgs ; 该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。成功回调、事件到达和 查询会话置顶消息 /sdk/android/message/managing messages/get pinned messages 取得的快照是三个独立阶段。" }, { "path": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -2817,7 +2897,7 @@ }, { "path": "/sdk/android/message/managing-messages/clear-all-local-messages", - "title": "清空全部本地消息", + "title": "清理全部本地消息", "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages clear-all-local-messages", @@ -2825,7 +2905,7 @@ }, { "path": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "清空全部已保存消息", + "title": "清理全部消息", "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages clear-all-messages", @@ -2833,15 +2913,31 @@ }, { "path": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "设置消息本地扩展字段", + "title": "设置消息本地扩展", "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-local-ex", "content": "localEx 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" }, + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "上报群消息已读", + "description": "使用 Android SDK 上报群消息已读回执。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // 已读回执已上报 @Override public void onError int code, String error // 处理失败 ; 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 markConversationMessageAsRead 独立维护。 其他客户端通过 OnAdvanceMsgListener.onRecvGroupMessageReadReceipt 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 conversationID 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt mergeGroupReadReceipt receipt ; 上报回调、群回执事件和 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers 取得的成员快照是三个独立阶段。" + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "查询群消息已读成员", + "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 群聊会话 ID。 | | clientMsgID | String | 是 | 要查询阅读成员的消息 ID。 | | filter | int | 是 | 0 查询已读成员, 1 查询未读成员。 | | offset | int | 是 | 分页偏移量,首页传 0 。 | | count | int | 是 | 本次请求的成员数量。 | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // 处理失败 ; 成功回调返回当前页 GroupMembersInfo 列表,字段含义见 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。按 groupID:userID 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。" + }, { "path": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "跟踪文件上传进度", + "title": "监听文件上传进度", "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", @@ -2957,7 +3053,7 @@ "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android events overview-events", - "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | 合并标识 | 完整处理页面 | | | | | | 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | userID | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | userID | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | userID | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | fromUserID:toUserID | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | userID | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | conversationID | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | 当前登录用户 | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | conversationID:userID | 更新输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | groupID 或 groupID:userID | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | clientMsgID ,必要时结合 conversationID | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回、删除、修改和置顶 | clientMsgID ,必要时结合 conversationID | 消息概览 /sdk/android/message/overview message | | 单聊已读回执 | conversationID:clientMsgID | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | 业务协议中的幂等 ID | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | roomID ,参与者结合用户 ID | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | roomID:eventID | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" + "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | Listener | 对应页面 | | | | | | 连接、Token 和强制下线 | OnConnListener | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | OnUserListener | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | OnUserListener | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | OnFriendshipListener | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | OnFriendshipListener | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | OnFriendshipListener | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | OnConversationListener | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | OnConversationListener | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | OnConversationListener | 上报输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | OnGroupListener | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | OnAdvanceMsgListener | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回 | OnAdvanceMsgListener | 撤回消息 /sdk/android/message/managing messages/revoke a message | | 消息删除 | OnAdvanceMsgListener | 批量删除消息 /sdk/android/message/managing messages/delete saved messages | | 消息修改 | OnAdvanceMsgListener | 修改消息 /sdk/android/message/managing messages/modify a message | | 置顶消息 | OnAdvanceMsgListener | 置顶或取消置顶消息 /sdk/android/message/managing messages/set message pinned | | 单聊已读回执 | OnAdvanceMsgListener | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | OnCustomBusinessListener | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | OnSignalingListener | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | OnSignalingListener | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | OnConversationListener | 监听初始化同步 监听初始化同步 | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" }, { "path": "/sdk/android/logger", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index 284ac46749..23766516f2 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1941,7 +1941,7 @@ "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to and retrieve online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." + "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus , unsubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to, retrieve, and unsubscribe from online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status , Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." }, { "path": "/sdk/android/user/user-profile/get-users-info", @@ -1961,7 +1961,7 @@ }, { "path": "/sdk/android/user/user-profile/set-self-info", - "title": "Update the current user profile", + "title": "Update your profile", "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile set-self-info", @@ -1981,7 +1981,7 @@ "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", - "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one." + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status ." }, { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -1991,6 +1991,14 @@ "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed user List snapshot, which can reconcile status by userID after reconnecting or reopening a screen. The query does not trigger onUserStatusChanged . Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs." }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", + "description": "Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user online-status unsubscribe-users-online-status", + "content": "Cancel online status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data for String userID : userIDs presenceByUserID.remove userID ; @Override public void onError int code, String error recordStatusUnsubscribeFailure code, error ; , userIDs ; A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. Call Subscribe to user online status /sdk/android/user/online status/subscribe users online status when those users need to be tracked again." + }, { "path": "/sdk/android/user/friends/get-friend-list-page", "title": "Get the friend list by page", @@ -2247,6 +2255,814 @@ "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", "content": "Use messageManager.clearConversationAndDeleteAllMsg for a product action such as “clear chat history”. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from onConversationChanged or a fresh query." }, + { + "path": "/sdk/android/group/overview-group", + "title": "Group overview", + "description": "Learn how group profiles, members, applications, and group events are organized in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group overview-group", + "content": "A group is represented by GroupInfo . Its groupID is the unique target identifier for profile, member, application, and permission operations. GroupMembersInfo represents a member's group specific nickname, role, mute expiration time, and extra data. One to one relationships and conversation unread counts do not belong to the group APIs. GroupManager delivers group profile changes, member changes, application handling, and joined group changes through one OnGroupListener . Set the listener once in a shared state layer and merge events by groupID or userID . OpenIMClient.getInstance .groupManager.setOnGroupListener new OnGroupListener @Override public void onGroupInfoChanged GroupInfo group groupStore.put group.getGroupID , group ; @Override public void onGroupMemberInfoChanged GroupMembersInfo member memberStore.put member.getGroupID + member.getUserID , member ; ; A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. Main capabilities Group profile and settings /sdk/android/group/create group Group permissions /sdk/android/group/set group join verification Joining and leaving groups /sdk/android/group/join group Retrieving groups /sdk/android/group/retrieving groups/get specified groups info Group applications /sdk/android/group/group applications/overview group applications Retrieving group members /sdk/android/group/retrieving group members/overview retrieving group members Managing group members /sdk/android/group/managing group members/invite user to group" + }, + { + "path": "/sdk/android/group/create-group", + "title": "Create a group", + "description": "Use createGroup to create a group profile and specify its initial members, administrators, and owner.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group create-group", + "content": "Use createGroup to create a group. Set the group profile in GroupInfo , and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete GroupInfo created by the server. Store the server assigned groupID . GroupInfo info = new GroupInfo ; info.setGroupName \"Project discussion\" ; info.setIntroduction \"For project members only\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ; Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list." + }, + { + "path": "/sdk/android/group/update-group-profile", + "title": "Update group profile", + "description": "Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group update-group-profile", + "content": "Use setGroupInfo to update a group profile. The request object should contain at least the groupID and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"Mobile project team\" ; update.setIntroduction \"Android and iOS collaboration group\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; Merge the latest profile from onGroupInfoChanged . Group announcements and extra data use the same API and are covered on their respective pages." + }, + { + "path": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", + "description": "Publish or update a group announcement through GroupInfo.notification.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-announcement", + "content": "The Android SDK does not provide a separate announcement method. Create a GroupInfo containing the groupID and notification , then call setGroupInfo . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"Release review starts at 20:00 tonight.\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; The returned GroupInfo exposes the update time and author through notificationUpdateTime and notificationUserID . The server validates whether the current user has permission to publish the announcement." + }, + { + "path": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", + "description": "Store application-defined group data in GroupInfo.ex.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-extension", + "content": "GroupInfo.ex is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ; Do not store access tokens, secrets, or device only UI state in group extra data." + }, + { + "path": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", + "description": "Configure verification rules for group applications and invitations through GroupInfo.needVerification.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-join-verification", + "content": "Set the verification mode in GroupInfo.needVerification , then call setGroupInfo . Use one of the GroupVerification constants: APPLY NEED VERIFICATION INVITE DIRECTLY , ALL NEED VERIFICATION , or DIRECTLY . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markVerificationSubmitted groupID ; @Override public void onError int code, String error showVerificationError error ; ; This setting applies to subsequent join requests. It does not accept or reject existing applications." + }, + { + "path": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", + "description": "Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-member-profile-access", + "content": "lookMemberInfo is an integer switch: 0 disables access and 1 enables it. Submit only the groupID and this permission field when changing the setting. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markMemberInfoAccessSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; This switch controls profile access through the group. It does not change user profile data that a member already possesses." + }, + { + "path": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", + "description": "Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", + "content": "applyMemberFriend is an integer switch: 0 disables friend requests and 1 enables them. This rule only affects requests initiated through the member relationship in this group. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; After the update, use onGroupInfoChanged or a newly retrieved GroupInfo as the source of truth." + }, + { + "path": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", + "description": "Use changeGroupMute to enable or disable mute-all mode for a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group change-group-mute", + "content": "Use changeGroupMute to toggle mute all mode. Pass true to enable it or false to disable it. To mute one member, see Mute or unmute a group member /sdk/android/group/managing group members/change group member mute . OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ; The effective speaking permissions for the owner and administrators, as well as server side permission checks, depend on the deployment policy." + }, + { + "path": "/sdk/android/group/join-group", + "title": "Apply to join a group", + "description": "Use joinGroup to submit a group application or join request.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group join-group", + "content": "Use joinGroup to submit a request to join a group. Set joinSource to the source of the request, such as an invitation, search result, or QR code. Use the five parameter overload when attaching extra data. OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"I would like to join the project discussion\", 3, \" \\\"from\\\":\\\"search\\\" \" ; The verification mode determines whether the user joins immediately. Update local state later through onJoinedGroupAdded or the relevant group application event." + }, + { + "path": "/sdk/android/group/quit-group", + "title": "Leave a group", + "description": "Use quitGroup to remove the current signed-in user from a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group quit-group", + "content": "quitGroup only removes the current signed in user. It does not dismiss the group or remove other members. OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; Even after the request succeeds, handle onJoinedGroupDeleted and clear application caches for the group's member list, conversation entry, and related data." + }, + { + "path": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", + "description": "Use dismissGroup to dismiss a group that the current user is allowed to manage.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group dismiss-group", + "content": "dismissGroup dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; Merge the final state from onGroupDismissed . After receiving the event, remove cached group profile, member, and conversation related data." + }, + { + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", + "description": "Use getGroupsInfo to retrieve the latest profiles for specified groups.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", + "content": "When you already have a set of groupID values, use getGroupsInfo to retrieve their profiles. The result is a list of GroupInfo objects. Do not assume that its order exactly matches the request list. OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups mergeGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ; Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results." + }, + { + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", + "description": "Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", + "content": "The Android SDK provides the paginated API. Start offset at 0 , then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; Merge incremental changes from onJoinedGroupAdded and onJoinedGroupDeleted . Do not treat the pages loaded so far as the complete joined group list." + }, + { + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", + "description": "Use isJoinGroup to determine whether the current signed-in user has joined a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", + "content": "isJoinGroup only checks the membership relationship between the current signed in user and the specified groupID . OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ; This result does not replace a group profile query and cannot determine whether another user is in the group." + }, + { + "path": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", + "description": "Use searchGroups to search locally available groups by group ID or name.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", + "content": "searchGroups accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; A search result does not prove membership. Before opening the group, call Check group membership /sdk/android/group/retrieving groups/is join group when the current state matters." + }, + { + "path": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", + "description": "Understand received and sent group applications, handling results, and state events in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", + "content": "Group applications are represented by GroupApplicationInfo . Received applications are intended for group administrators, while sent applications belong to the current user. Use handleResult , reqMsg , handledMsg , and the handling time to display application state. The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending application count API found in the Flutter menu. Merge application added, accepted, rejected, and deleted events through the shared listener described in Group overview /sdk/android/group/overview group ." + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", + "description": "Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", + "content": "Use the non deprecated overload with GetGroupApplicationListAsRecipientReq . The request can filter by offset , count , groupIDs , and handleResults . GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; Merge application events by their groupID and userID . Do not use a list index as an application identifier." + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", + "description": "Use getSendGroupApplicationList to retrieve group applications sent by the current user.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", + "content": "Configure pagination and filters in GetGroupApplicationListAsApplicantReq , then call getSendGroupApplicationList . GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; After an application is accepted, use onJoinedGroupAdded as the source of truth for the joined group list." + }, + { + "path": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", + "description": "Use acceptGroupApplication to accept a user’s application to join a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications accept-group-application", + "content": "Pass the application's groupID , the applicant's userID , and a handling message. The server checks whether the current user has permission to approve the application. OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"Welcome to the group\" ; After acceptance, update the application and member lists through the group application event and onGroupMemberAdded ." + }, + { + "path": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", + "description": "Use refuseGroupApplication to reject a user’s application to join a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", + "content": "The reject operation also takes the application's groupID , the applicant's userID , and a handling message. OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"The group is currently full\" ; Do not delete the local record immediately after the success callback. Update it from onGroupApplicationRejected or a fresh query." + }, + { + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", + "description": "Understand group member lists, specified member profiles, and membership queries in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members overview-retrieving-group-members", + "content": "Group member queries are scoped by groupID and return either GroupMembersInfo objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. Merge member additions, removals, and profile changes through the OnGroupListener owned by Group overview /sdk/android/group/overview group . A query provides a snapshot and does not replace event handling." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", + "description": "Use getGroupMemberList to retrieve group members by role and page.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", + "content": "Set filter to 0 for all members, 1 for regular members, 2 for the owner, or 3 for administrators. Use offset and count for pagination. OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ; Continue accepting member events while paging. Use the combination of groupID and userID as the merge key." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", + "description": "Use getGroupMembersInfo to retrieve specified users’ profiles within a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", + "content": "getGroupMembersInfo accepts one groupID and a list of target user IDs. It returns the users' GroupMembersInfo profiles within that group. OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ; An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", + "description": "Use getUsersInGroup to select the users who are currently members of a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", + "content": "getUsersInGroup returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; To retrieve nicknames, roles, or mute state, call Get group member profiles /sdk/android/group/retrieving group members/get specified group members info afterward." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", + "description": "Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", + "content": "Use getGroupMemberOwnerAndAdmin when you need to display or check members with management roles. OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; The owner, administrator, and regular member roleLevel constants are defined in GroupRole . The server still determines whether a particular operation is permitted." + }, + { + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", + "description": "Use searchGroupMembers to search group members by user ID or group nickname.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members search-group-members", + "content": "Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members showMemberSearch members ; @Override public void onError int code, String error showSearchError error ; , groupID, Collections.singletonList keyword , true, true, 0, 20 ; The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled." + }, + { + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", + "description": "Use inviteUserToGroup to invite a list of users to a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", + "content": "Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"Join the project discussion\" ; Merge users into the member list only after onGroupMemberAdded confirms that they joined. A successful submission alone does not mean that they are already members." + }, + { + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", + "description": "Use kickGroupMember to remove specified members from a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", + "content": "kickGroupMember accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"No longer participating in this project\" ; Remove targets from the member cache after receiving onGroupMemberDeleted ." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "description": "Use SetGroupMemberInfo.nickname to update a member’s display name in a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", + "content": "All group member profile changes use setGroupMemberInfo . Set the groupID , userID , and nickname in the request. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"Lin\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Update the displayed name from GroupMembersInfo.nickname received by onGroupMemberInfoChanged ." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "description": "Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", + "content": "Set roleLevel with a GroupRole constant: OWNER , ADMIN , or MEMBER . Use the separate ownership transfer API when changing the group owner; do not infer an ownership transfer flow from this API. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; The server validates the role change and its permissions. Use the member profile change event as the source of truth." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "description": "Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", + "content": "A group member avatar is a group specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Keep the previous avatar or an optimistic local state until the event arrives, then reconcile it with the latest member profile." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "description": "Store application-defined group member data in SetGroupMemberInfo.ex.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", + "content": "SetGroupMemberInfo.ex is a complete string; the SDK does not merge JSON values. If several application modules share the field, read and merge the existing value while preserving the other namespaces. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Do not store credentials, tokens, or device only display state in this field." + }, + { + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "description": "Use transferGroupOwner to transfer group ownership to a specified member.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", + "content": "The target user must already be a group member. Require explicit confirmation before transferring ownership, then retrieve the owner and administrator profiles again after completion. OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; onGroupMemberInfoChanged and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback." + }, + { + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "description": "Use changeGroupMemberMute to set the mute duration for a specified group member.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", + "content": "seconds is the mute duration in seconds. Pass 0 to unmute the member. Member level mute state is independent from the group's mute all setting. OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ; Read muteEndTime from onGroupMemberInfoChanged to update the member state. Do not keep deriving the final mute state from local time and the submitted duration." + }, + { + "path": "/sdk/android/message/overview-message", + "title": "Message overview", + "description": "Learn about the Android SDK Message model, message lifecycle, and message listener.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message overview-message", + "content": "Android messages are represented by Message . Use clientMsgID for deduplication, and use sessionType , recvID , and groupID to distinguish one to one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. OpenIMClient.getInstance .messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; ; Queries establish a snapshot, while OnAdvanceMsgListener merges incremental changes. Setting a listener on MessageManager replaces the current listener, so register it once in a shared state layer." + }, + { + "path": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "description": "Use createTextMessage to create a text Message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-text-message", + "content": "createTextMessage only creates a local message object. It does not send the message. Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "description": "Use createTextAtMessage to create a text message that mentions group members.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-text-at-message", + "content": "Pass the text, mentioned user IDs, the AtUserInfo list, and an optional quoted message. Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "description": "Use createCustomMessage to carry application-defined JSON content.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-custom-message", + "content": "Your application defines data , extension , and description . Receiving clients must parse them according to the same application protocol. Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "description": "Create an image message from a path relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessage imagePath ; The image file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory. This method only creates an object waiting to be sent; the regular send flow uploads the image." + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a local path", + "description": "Create an image message from an absolute path.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessageFromFullPath absolutePath ; The absolute path must be readable. This method only creates an object waiting to be sent; the regular send flow uploads the image." + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from URLs", + "description": "Use createImageMessageByURL to create an image message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-url", + "content": "Prepare the original, large, and thumbnail PictureInfo values before creating the message. Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "description": "Create an audio message from a path relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessage soundPath, durationSeconds ; The audio file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a local path", + "description": "Create an audio message from an absolute path.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath absolutePath, durationSeconds ; The absolute path must be readable, and the audio duration is measured in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "description": "Use SoundElem to create an audio message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-url", + "content": "createSoundMessageByURL accepts a SoundElem that already contains the remote URL, duration, and file size. Message message = OpenIMClient.getInstance .messageManager.createSoundMessageByURL soundElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "description": "Create a video message from paths relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessage videoPath, mimeType, durationSeconds, snapshotPath ; The video and snapshot files must be stored under the data directory configured during SDK initialization. Pass both paths relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from local paths", + "description": "Create a video message from absolute video and thumbnail paths.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath absoluteVideoPath, mimeType, durationSeconds, absoluteSnapshotPath ; The absolute video and thumbnail paths must be readable, and the duration is measured in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "description": "Use VideoElem to create a video message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-url", + "content": "Populate VideoElem with the remote video and thumbnail information, then create the message. Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "description": "Create a file message from a path relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessage filePath, fileName ; The file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory; fileName is displayed to recipients. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a local path", + "description": "Create a file message from an absolute path.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath absolutePath, fileName ; The absolute path must be readable. Pass the file name and path separately. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "description": "Use FileElem to create a file message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-url", + "content": "FileElem should contain the remote URL, file name, and file size. Message message = OpenIMClient.getInstance .messageManager.createFileMessageByURL fileElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "description": "Use createCardMessage to create a contact card message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-card-message", + "content": "CardElem stores the display profile for the user represented by the card. Message message = OpenIMClient.getInstance .messageManager.createCardMessage cardElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "description": "Use createLocationMessage to create a message with coordinates and a location description.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-location-message", + "content": "Use decimal degrees for latitude and longitude. The description is displayed in a map view or message list. Message message = OpenIMClient.getInstance .messageManager .createLocationMessage latitude, longitude, description ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "description": "Use createFaceMessage to create a custom emoji message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-face-message", + "content": "index identifies the emoji position, while data stores JSON such as an emoji URL. Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "description": "Use createQuoteMessage to reply while quoting an existing message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", + "content": "A quote message stores the complete quoted Message . Before sending, make sure the quoted object has a stable clientMsgID . Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "description": "Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-text-message", + "content": "RichMessage marks a range in the text with offset and length , while type , url , and info carry application defined entity data. RichMessage link = new RichMessage ; link.setType \"link\" ; link.setOffset 0 ; link.setLength 6 ; link.setUrl \"https://docs.openim.io\" ; link.setInfo \" \\\"title\\\":\\\"OpenIM documentation\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedTextMessage \"OpenIM docs\", Collections.singletonList link ; Every entity range must match an actual range in the final text. Validate the ranges, URLs, and info values before sending, and make sure receiving clients use the same type and info protocol. This method only creates a Message ; send it through Send a message /sdk/android/message/sending messages/send message ." + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "description": "Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-quote-message", + "content": "A rich text reply stores the reply text, the quoted message, and the RichMessage entity ranges in the reply text. RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; The quoted originalMessage should contain a stable clientMsgID , and every entity range must match the final reply text. Use the same application protocol for type , url , and info as described in Create a rich text message /sdk/android/message/creating messages/create advanced text message . This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "description": "Use createForwardMessage to create a forwarded copy of a message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-forward-message", + "content": "Pass the source Message . The returned message must still be delivered to the target conversation through a send API. Message message = OpenIMClient.getInstance .messageManager.createForwardMessage sourceMessage ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "description": "Use createMergerMessage to combine multiple messages into one summary message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-merger-message", + "content": "Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" + }, + { + "path": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message sending-messages send-message", + "content": "For a one to one message, set recvUid and pass null for the group target. For a group message, set recvGid and pass null for the user target. OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess String id mergeSentMessage message ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + }, + { + "path": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "description": "Use sendMessageNotOss to send a media message whose resources were uploaded by your application.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", + "content": "Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built in upload flow again. messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" + }, + { + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", + "content": "Android does not provide a separate global send progress listener. Each call to sendMessage or sendMessageNotOss reports progress through its own OnMsgSendCallback . messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess String id finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + }, + { + "path": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "description": "Use OnAdvanceMsgListener to receive new, offline, and online-only messages.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", + "content": "After calling setAdvancedMsgListener , onRecvNewMessage receives real time messages, onRecvOfflineNewMessage receives offline batches, and onRecvOnlineOnlyMessage receives online only message strings. Merge all messages idempotently by clientMsgID . messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" + }, + { + "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "description": "Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", + "content": "The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a Message . messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ; This page owns the complete handling contract for onRecvCustomBusinessMessage . Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client side permissions. MessageManager retains only one custom business listener; setting another replaces the previous one. Register it once in an application level event center, and stop dispatching into the previous account's state when signing out or switching accounts." + }, + { + "path": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "description": "Use getAdvancedHistoryMessageList to load conversation history by page.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", + "content": "Pass null for startMsg on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Deduplicate returned messages by clientMsgID . messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + }, + { + "path": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "description": "Use getAdvancedHistoryMessageListReverse to load messages after a starting point.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", + "content": "Use this method to read forward from a located message, such as when opening a search result or loading the following page of context. messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + }, + { + "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "description": "Use findMessageList to retrieve message records with SearchParams.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", + "content": "Create a list of SearchParams for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" + }, + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "description": "Retrieve messages before and after a specified message with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", + "content": "When navigating from a search result or referenced message into its chat context, use the Message already retrieved as the anchor. Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the anchor message. | | startMsg | Message | Yes | Previously retrieved anchor message. | | type | ViewType | Yes | Context type. Use ViewType.History for a referenced message and ViewType.Search for a search result. | | before | int | Yes | Maximum number of messages to retrieve before the anchor. | | after | int | Yes | Maximum number of messages to retrieve after the anchor. | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // Handle the failure , conversationID, targetMessage, ViewType.Search, 20, 20 ; In the success callback, messages.getData is the list retrieved before and after the anchor. For message fields, see Message overview /sdk/android/message/overview message . before and after independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by conversationID:clientMsgID ; do not rely on fixed array positions. If the message must first be located, see Find messages by ID /sdk/android/message/retrieving messages/find messages by id ." + }, + { + "path": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "description": "Use searchLocalMessages to search messages synchronized to the current account’s local storage.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message searching-messages search-messages", + "content": "Search by conversation, keywords, senders, message types, time range, and pagination parameters. Pass null for conversationID to search across all local conversations. messageManager.searchLocalMessages callback, conversationID, keywords, 1, senderIDs, messageTypes, 0, 0, 0, 20 ;" + }, + { + "path": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "description": "Report the current conversation typing state with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", + "content": "Set focus to true when typing starts. Set it to false when typing ends, the input field loses focus, or the conversation screen closes. conversationManager.changeInputState new OnBase @Override public void onSuccess String data // The typing state has been reported @Override public void onError int code, String error // Handle the failure , conversationID, true ; Clear the state promptly when typing ends: conversationManager.changeInputState callback, conversationID, false ; Coalesce consecutive focus changes and attempt to report false before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. Other clients receive typing state changes through OnConversationListener.onConversationUserInputStatusChanged . The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; Merge typing states by conversationID:userID and clear them after an application defined timeout. ConversationManager retains only one conversation listener, so combine this callback with conversation list, total unread, and synchronization events in one listener. When opening a conversation or restoring a connection, use Get typing status /sdk/android/message/composing messages/get typing status to retrieve the current snapshot." + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "description": "Use getInputState to retrieve a specified user’s current typing status in a conversation.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", + "content": "When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by Report typing status /sdk/android/message/composing messages/update typing status ." + }, + { + "path": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "description": "Use deleteMessageFromLocalStorage to delete only the message copy on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-local-message", + "content": "This operation does not affect message records on other devices or for other users. messageManager.deleteMessageFromLocalStorage conversationID, clientMsgID, callback ;" + }, + { + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "description": "Delete multiple messages from one conversation for the current account with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the messages to delete. | | clientMsgIDs | String | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | | isSync | boolean | Yes | Whether to synchronize the deletion to the current account's other clients. | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; With isSync set to false , the operation deletes the current device's copy and the current account's server side record. With true , it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. This page owns OnAdvanceMsgListener.onMsgDeleted . Determine the conversation from the message routing fields, then remove the message idempotently by clientMsgID . @Override public void onMsgDeleted Message message removeMessage resolveConversationID message , message.getClientMsgID ; To reconcile the current message snapshot, query the corresponding conversation history again." + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "description": "Delete every message sent by a specified user in a group chat with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high impact group moderation action and should not appear in an ordinary single message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. This page owns OnAdvanceMsgListener.onDeleteUserAllMsgsInConv . When the event arrives, use its conversationID and userID to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event removeMessagesBySender event.getConversationID , event.getUserID ; Callback completion, event arrival, and a new history query are three independent stages." + }, + { + "path": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "description": "Revoke a sent message and handle revocation notifications received by other clients.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", + "content": "Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through OnAdvanceMsgListener.onRecvMessageRevokedV2 . This page is the complete owner of onRecvMessageRevokedV2 . RevokedInfo contains the clientMsgID , revoker, and revocation time, but not the conversationID . Resolve the owning conversation from the current account's message index, then update by conversationID:clientMsgID : @Override public void onRecvMessageRevokedV2 RevokedInfo info String clientMsgID = info.getClientMsgID ; String conversationID = findConversationIDByClientMsgID clientMsgID ; if conversationID == null return; markMessageRevoked conversationID, clientMsgID, info ; Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. Re query the corresponding conversation history when reconciliation is required." + }, + { + "path": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "description": "Modify supported message content and handle modification events received by other clients.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", + "content": "Use modifyMessage to change an existing message in a conversation. Preserve the original conversation ID, clientMsgID , routing fields, sender, and other message data in the request, and update only the supported content. messageManager.modifyMessage callback, modifyRequest ; The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified Message through OnAdvanceMsgListener.onMessageModified . This page is the complete owner of onMessageModified . Resolve the conversationID from the message routing fields, then replace the original message by conversationID:clientMsgID . Do not match by array position or displayed text: @Override public void onMessageModified Message message String conversationID = resolveConversationID message ; if conversationID == null return; replaceMessage conversationID, message.getClientMsgID , message ; Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and a new history query are three independent stages." + }, + { + "path": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "description": "Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", + "content": "The result is a snapshot of the messages currently pinned in the specified conversation. messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" + }, + { + "path": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "description": "Change a conversation message’s pinned state and handle pinned-message change events.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", + "content": "Pass true as the final argument to pin the message or false to unpin it: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; The success callback means that the request completed; it does not mean that the pinned message event has arrived. This page owns OnAdvanceMsgListener.onChangedPinnedMsg . ChangedPinnedMsg contains the conversationID and current pinned message collection. Replace the collection for that conversation, then deduplicate its messages by clientMsgID : @Override public void onChangedPinnedMsg ChangedPinnedMsg event replacePinnedMessages event.getConversationID , event.getMsgs ; Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and the snapshot from View pinned messages /sdk/android/message/managing messages/get pinned messages are three independent stages." + }, + { + "path": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "description": "Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages insert-local-single-message", + "content": "This method does not send the message to the server. receiver and sender determine how the local message is associated with the conversation. messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" + }, + { + "path": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "description": "Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages insert-local-group-message", + "content": "Pass the group ID and sender ID. The message is not synchronized to other devices. messageManager.insertGroupMessageToLocalStorage callback, message, groupID, senderUserID ;" + }, + { + "path": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "description": "Use deleteAllMsgFromLocal to clear all messages stored on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages clear-all-local-messages", + "content": "This operation only clears the current device's local cache. It does not delete server records. messageManager.deleteAllMsgFromLocal callback ;" + }, + { + "path": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "description": "Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages clear-all-messages", + "content": "This is a high impact operation. Ask for confirmation before calling it, then clear the local conversation display after it completes. messageManager.deleteAllMsgFromLocalAndSvr callback ;" + }, + { + "path": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "description": "Use setMessageLocalEx to store message data used only on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages set-message-local-ex", + "content": "localEx is suitable for local information such as a download path or playback state. It is not synchronized to other users. messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" + }, + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "description": "Report group-message read receipts with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // The read receipts have been reported @Override public void onError int code, String error // Handle the failure ; Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through markConversationMessageAsRead . Other clients receive member level group read changes through OnAdvanceMsgListener.onRecvGroupMessageReadReceipt . This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's conversationID and message IDs. @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt mergeGroupReadReceipt receipt ; The report callback, the group receipt event, and the member snapshot from Get members who read a group message /sdk/android/message/managing read status/get group message readers are three independent stages." + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "description": "Retrieve members who have or have not read a group message using pagination.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the group conversation. | | clientMsgID | String | Yes | ID of the message whose reader list to query. | | filter | int | Yes | Pass 0 for members who have read the message or 1 for members who have not read it. | | offset | int | Yes | Pagination offset. Pass 0 for the first page. | | count | int | Yes | Maximum number of members to retrieve. | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // Handle the failure ; The success callback returns the current page of GroupMembersInfo objects. For field descriptions, see List group members /sdk/android/group/retrieving group members/get group member list . Deduplicate by groupID:userID . The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required." + }, + { + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "description": "Use OnPutFileListener to track an individual Android SDK file upload.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", + "content": "The Android SDK does not use a global file upload listener. Pass an OnPutFileListener to each uploadFile call. That listener receives progress, part completion, and final result callbacks for the current task. OnPutFileListener uploadListener = new OnPutFileListener @Override public void open long size initializeUploadProgress uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void uploadPartComplete long partNumber, long partSize, String partHash markPartComplete uploadTaskID, partNumber, partSize, partHash ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; ; OpenIMClient.getInstance .uploadFile resultCallback, uploadListener, putArgs ; Use open to initialize the total size, uploadID to receive the SDK upload identifier, uploadComplete for in progress byte counts, uploadPartComplete when one part finishes, and complete for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. Generate a stable application level uploadTaskID and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. For complete argument construction and error handling, see Upload a file /sdk/android/file uploads/upload file ." + }, + { + "path": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "description": "Upload a standalone file with the Android SDK and retrieve its remote resource URL.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android file-uploads upload-file", + "content": "uploadFile uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. Parameters | Parameter | Type | Required | Description | | | | | | | base | OnBase | Yes | Receives the final success or failure result for the upload request. | | listener | OnPutFileListener | Yes | Receives progress, part completion, and final file information for this task. | | putArgs.filepath | String | Yes | A local file path readable by the Android application. | | putArgs.name | String | Yes | The upload file name. PutArgs initially uses the supplied path; replace it with the original file name when appropriate. | | putArgs.cuase | String | No | An application defined upload reason. The spelling follows the Android SDK PutArgs declaration. | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; Each call receives its own OnPutFileListener , so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See Track file upload progress /sdk/android/file uploads/track file upload progress for callback responsibilities. The URL returned by complete can be used later to update an avatar, store an attachment address, or create a URL based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls." + }, + { + "path": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "description": "Learn about Android SDK call signaling, room information, and event boundaries.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling overview-calling", + "content": "The Android SDK SignalingManager provides the signaling APIs needed to invite, accept, reject, cancel, hang up, query rooms, and synchronize call state. It coordinates participants, room information, and the call lifecycle. It does not capture camera video, play remote media, or render a call interface. Pass the returned roomID , token , and liveURL to your chosen real time audio/video engine. Your application remains responsible for Android permissions, devices, media tracks, poor network behavior, and UI state. The signaling APIs are not a complete real time media SDK. Call flow 1. Call signalingInvite for a one to one call or signalingInviteInGroup for a group call. 2. The invitee receives SignalingInfo through onReceiveNewInvitation and chooses to accept or reject. 3. The invitee calls signalingAccept , and both parties connect their media engine with the returned room credentials. 4. During the call, update local state from participant, media stream, and custom signaling callbacks. 5. The inviter can cancel a pending invitation; any participant can hang up an established call. Core data | Data | Description | | | | | SignalingInvitationInfo | Inviter, invitees, group, room, media type, timeout, session type, and application extra data. | | SignalingInfo | Current operation user, original invitation, participant profiles, and optional offline push information. | | SignalingCertificate | The roomID , token , liveURL , and busy user list returned by OpenIMServer. | | RoomCallingInfo | A snapshot of a group's room, invitation, participants, group, and join credentials. | Use customData and custom signaling only for application negotiation data. Do not place long lived credentials, administrator secrets, or other sensitive data in these fields. State updates and event ownership For invite, accept, reject, cancel, and hang up operations, handle both the API callback and the call listener. The API success callback means that the current signaling request completed. The listener represents incremental state observed by inviters, invitees, other devices, or room participants. They are not the same completion signal. The complete invitation lifecycle, participant, hang up, and stream listener belongs to Handle call events /sdk/android/calling/managing calls/handle call events . Custom signaling belongs to Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal . Room, credential, and pending invitation queries only return snapshots. This overview does not register a listener. Use roomID as the call state key and combine it with user ID for participant state. Query again when the current room needs to be restored or reconciled. Find a page by task | Task | Page | | | | | Start a one to one or group call | Start a one to one call /sdk/android/calling/managing calls/start single call , Start a group call /sdk/android/calling/managing calls/start group call | | Accept or reject an invitation | Accept a call /sdk/android/calling/managing calls/accept call , Reject a call /sdk/android/calling/managing calls/reject call | | Cancel an invitation or hang up | Cancel a call invitation /sdk/android/calling/managing calls/cancel call , Hang up a call /sdk/android/calling/managing calls/hang up call | | Restore a room or pending invitation | Get a group call room /sdk/android/calling/retrieving call information/get room by group id , Get room credentials /sdk/android/calling/retrieving call information/get token by room id , Restore a pending invitation /sdk/android/calling/retrieving call information/restore pending invitation | | Handle call events and negotiation | Handle call events /sdk/android/calling/managing calls/handle call events , Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal |" + }, + { + "path": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "description": "Start a one-to-one audio or video call with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", + "content": "signalingInvite starts a one to one call. The Android SDK handles call signaling; your application must connect a real time audio/video engine with the returned room credentials. Parameters | Field | Type | Required | Description | | | | | | | userID | String | Yes | The current signed in user performing the invite operation. | | inviterUserID | String | Yes | The inviter, normally the current signed in user. | | inviteeUserIDList | List | Yes | The invitees; for a one to one call, include only the other user. | | groupID | String | Yes | Use an empty string for a one to one call. | | roomID | String | Yes | The call's unique room identifier and the primary key for subsequent state. | | timeout | long | Yes | Invitation timeout in seconds. | | mediaType | String | Yes | The application defined media type, typically audio or video . | | sessionType | int | Yes | Use ConversationType.SINGLE CHAT . | | platformID | int | Yes | Use Platform.ANDROID for an Android phone client. | | customData | String | No | Application extra data carried with the invitation. | | offlinePushInfo | OfflinePushInfo | No | Push content used when the invitee is offline. | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID identifies the media room, token is a short lived join credential, liveURL is the media service address, and busyLineUserIDList contains busy users. Connect the media engine only after receiving a valid token and roomID . API success does not mean the invitee accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "description": "Start a group audio or video call with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", + "content": "signalingInviteInGroup starts a group call. It invites only the members explicitly listed in inviteeUserIDList ; setting groupID does not automatically invite every group member. SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; groupID must not be empty. Remove the current user, empty IDs, and duplicates from inviteeUserIDList . The example reuses the group ID as the room ID. If your application generates another roomID , every participant must use the same value. The success callback returns SignalingCertificate ; see Start a one to one call /sdk/android/calling/managing calls/start single call for its fields. busyLineUserIDList only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted." + }, + { + "path": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "description": "Accept a call invitation with the Android SDK and retrieve room credentials.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls accept-call", + "content": "After receiving the original SignalingInfo from onReceiveNewInvitation , pass it to signalingAccept : OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; Preserve the original roomID , inviter, invitees, and session type in receivedInfo . Do not rebuild it as an object that contains only roomID . The success callback returns SignalingCertificate . Connect the media room only after receiving a valid token and roomID , then keep merging remote state through Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "description": "Reject a call invitation with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls reject-call", + "content": "When the user declines an incoming call, pass the original SignalingInfo to signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , receivedInfo ; The success callback only means that the reject signaling request completed. The inviter later updates its interface through onInviteeRejected ; see Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "description": "Cancel a call invitation before it is accepted with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", + "content": "Before an invitation is accepted, the inviter can call signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; Pass the complete SignalingInfo saved when the call was started, not a new object containing only roomID . A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through onInvitationCancelled ." + }, + { + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "description": "Hang up an established call with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", + "content": "After a call is established, a participant can call signalingHungUp . The supplied SignalingInfo should preserve the complete invitation, and its roomID must match the active media room. OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , activeInfo ; The success callback only means that the hang up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang up should all enter one idempotent cleanup flow keyed by roomID ." + }, + { + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "description": "Register Android SDK invitation, participant, and media-stream callbacks in one call listener.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", + "content": "Register OnSignalingListener once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by roomID . OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info upsertCall info, \"ringing\" ; @Override public void onInviteeAccepted SignalingInfo info mergeCallEvent \"accepted\", info ; @Override public void onInviteeRejected SignalingInfo info mergeCallEvent \"rejected\", info ; @Override public void onInvitationCancelled SignalingInfo info mergeCallEvent \"cancelled\", info ; @Override public void onInvitationTimeout SignalingInfo info mergeCallEvent \"timeout\", info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info mergeCallEvent \"accepted by other device\", info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info mergeCallEvent \"rejected by other device\", info ; @Override public void onHangup SignalingInfo info finishCall info.getInvitation .getRoomID ; @Override public void onRoomParticipantConnected RoomCallingInfo room mergeConnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room mergeDisconnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onStreamChange String streamInfo mergeStreamChange streamInfo ; ; This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than onReceiveCustomSignal . Custom signaling belongs to Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal . Merge invitation events with SignalingInfo.invitation.roomID . Merge participant state with RoomCallingInfo.roomID plus the participant user ID. Do not merge by event order, display name, or array position. onStreamChange currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. SignalingManager retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account." + }, + { + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "description": "Restore a call invitation that was received before the Android application started or resumed.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", + "content": "getSignalingInvitationInfoStartApp takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming call interface only when both invitation and roomID are valid. Continue handling cancellation, timeout, acceptance, and hang up through Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "description": "Use the Android SDK to retrieve an active call room by group ID.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", + "content": "signalingGetRoomByGroupID takes a group ID, not a custom roomID . OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; The success callback returns a RoomCallingInfo snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives groupID ." + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "description": "Use the Android SDK to retrieve fresh join credentials for a known room ID.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", + "content": "When you know the roomID but need new join credentials, call signalingGetTokenByRoomID . OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; The success callback returns SignalingCertificate ; see Start a one to one call /sdk/android/calling/managing calls/start single call for its fields. Connect the media engine only after receiving a valid token and roomID . A room token is a short lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage." + }, + { + "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "description": "Send and receive custom signaling data in an Android SDK call room.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", + "content": "signalingSendCustomSignal sends lightweight application negotiation data to a call room, such as a raised hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. Send a signal Both roomID and customInfo are required strings. Define a stable schema and serialize structured data as JSON. JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long lived state, or sensitive credentials in customInfo . Receive a signal OnSignalingListener.onReceiveCustomSignal returns CustomSignalingInfo . Validate the room and your application protocol before updating the interface. @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; This page owns the complete handling contract for onReceiveCustomSignal . parseAndValidateCallSignal should check the JSON structure, protocol version, eventID , type , and application fields. Process signals idempotently by roomID:eventID and do not depend on event order. SignalingManager retains only one listener. Add the custom signal callback to the application level listener shown in Handle call events /sdk/android/calling/managing calls/handle call events . Registering another listener from this feature would replace all other call callbacks. Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long lived state through a room query or the application backend." + }, + { + "path": "/sdk/android/events/overview-events", + "title": "Events overview", + "description": "Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android events overview-events", + "content": "OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. The connection listener is the exception. OnConnListener is passed to initSDK ; its complete handling contract is described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register listeners centrally The following entry point uses stable application level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. Event ownership | Event scope | Listener | Corresponding page | | | | | | Connection, token, and forced logout | OnConnListener | Authenticate and manage a session /sdk/android/getting started/authenticate and manage session | | Current user profile | OnUserListener | Update the current user profile /sdk/android/user/user profile/set self info | | Online status | OnUserListener | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | | Friend relationships and profiles | OnFriendshipListener | Get the friend list by page /sdk/android/user/friends/get friend list page | | Friend applications | OnFriendshipListener | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Blacklist | OnFriendshipListener | Block a user /sdk/android/user/blacklist/add blacklist , Remove a user from the blacklist /sdk/android/user/blacklist/remove blacklist | | Conversation list | OnConversationListener | Retrieve the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list | | Total unread count | OnConversationListener | Get the total unread count /sdk/android/conversation/managing conversations/get total unread count | | Typing state | OnConversationListener | Update typing status /sdk/android/message/composing messages/update typing status | | Group profiles, members, and applications | OnGroupListener | Group overview /sdk/android/group/overview group | | New, offline, and online only messages | OnAdvanceMsgListener | Receive messages /sdk/android/message/receiving messages/receive messages | | Message revocation | OnAdvanceMsgListener | Revoke a message /sdk/android/message/managing messages/revoke a message | | Message deletion | OnAdvanceMsgListener | Delete messages in a batch /sdk/android/message/managing messages/delete saved messages | | Message modification | OnAdvanceMsgListener | Modify a message /sdk/android/message/managing messages/modify a message | | Pinned messages | OnAdvanceMsgListener | Pin or unpin a message /sdk/android/message/managing messages/set message pinned | | One to one read receipts | OnAdvanceMsgListener | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read | | Custom business messages | OnCustomBusinessListener | Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Calls | OnSignalingListener | Handle call events /sdk/android/calling/managing calls/handle call events | | Custom call signaling | OnSignalingListener | Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal | | SDK data synchronization | OnConversationListener | Handle initial synchronization handle initial synchronization | Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. Handle initial synchronization The synchronization lifecycle belongs to the application level OnConversationListener . That listener must also include conversation list, unread count, and typing status callbacks. The following example only highlights synchronization logic owned by this page. private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; When reinstall is true , treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. onSyncServerProgress reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. This page owns the complete handling contract for onSyncServerStart , onSyncServerProgress , onSyncServerFinish , and onSyncServerFailed . Synchronization state has no business entity key; isolate it by the current OpenIMClient singleton and signed in user." + }, + { + "path": "/sdk/android/logger", + "title": "Logging", + "description": "Configure Android SDK logging, write application diagnostics, and upload logs.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android logger", + "content": "OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. Configure logging during initialization Logging options belong to InitConfig and must be set before initSDK . File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | Field | Description | | | | | logLevel | Controls verbosity with a LogLevel constant. Available values include DebugWithSQL , Debug , Info , Warn , Error , Panic , and Fatal . | | isLogStandardOutput | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | | logFilePath | Optional log directory. Keep it within application writable storage and manage its size and retention. | Use Debug for ordinary development diagnostics. Enable DebugWithSQL temporarily and only when diagnosing database problems. Production builds normally use Warn or Error and disable unnecessary standard output. Write application diagnostic logs Use the non deprecated logs overload to add application context to SDK logs. OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName and currentLineNum identify the call site. msgStr is a short action description, and errStr is the error information. Warn , Error , Panic , and Fatal require a non empty error string. Pass trailing extra values as key value pairs and include only non sensitive identifiers needed for diagnosis. The older logs overload with OnBase and Map parameters is deprecated and should not be used in new code. Upload diagnostic logs Call uploadLogs only after the user explicitly agrees to submit diagnostic information. The Android API retains the params argument; pass an empty list when no additional parameters are needed. line configures how many log lines are read for the upload. String uploadID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , Collections.emptyList , 2000, uploadID, \"support ticket 42\", new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | Parameter | Description | | | | | line | Number of log lines configured for this upload. | | cancelID | Stable identifier for this upload, such as an application generated UUID. | | ex | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | UploadLogProgress | Reports current progress and total work for the upload interface. | The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. operationID and application tracing Public methods in the Android Java wrapper do not accept operationID . The wrapper generates one with ParamsUtil.buildOperationID for each call and passes it to Core, so applications normally do not create or supply this value. Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required conversationID , clientMsgID , groupID , or roomID . The application trace ID links a multi step business flow, while the SDK operationID links one SDK call. Neither is an identity credential or a business idempotency key. Related pages Implement for the Android environment /sdk/android/getting started/environment specific implementation Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send a message /sdk/android/message/sending messages/send message" + }, { "path": "/sdk/flutter/overview", "title": "OpenIM Flutter SDK overview", diff --git a/src/lib/client-sdk-commercial.ts b/src/lib/client-sdk-commercial.ts index 69f62d5703..bb8313c268 100644 --- a/src/lib/client-sdk-commercial.ts +++ b/src/lib/client-sdk-commercial.ts @@ -44,6 +44,7 @@ const nativeAudits: Record = { const platformSymbolAliases: Record> = { android: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', onHangup: 'OnHangUp', onRecvGroupMessageReadReceipt: 'OnRecvGroupReadReceipt', }, @@ -89,6 +90,11 @@ const partialCommercialConceptSources: Record = { '/sdk/ios/calling/managing-calls/handle-call-events', '/sdk/ios/calling/retrieving-call-information/restore-pending-invitation', ], + '/sdk/android/calling/overview-calling': [ + '/sdk/android/calling/managing-calls/start-single-call', + '/sdk/android/calling/managing-calls/handle-call-events', + '/sdk/android/calling/retrieving-call-information/restore-pending-invitation', + ], }; // These capabilities share general-purpose setters with open-source fields. Classify the

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≶*#Qeo=_RoAo7+7 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 o*QNagRHWQN{~RtzyvUJqGZpE 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

DKyL(vQ zbMrJNWmA9AIWUW>6eq1gCO{EEs-|T!p(n9SmoBmN_=C;2if%M!5``@+1;|c;1 zf+@SMDAC5KAX3hK=Q=d4${8;mcEnM$Gt&<~xNRbwX9a6*T-70KGpVXnAMuehETYce zE7Ma^2{Xq@`@rV=W@o35Jn|@wjZ&OUCT-h_BxbbjB*peI=bU!-S*LyJi(mZyZTDVq z(&;CiedOhr-@Se7!tUj`5_(4*xuMsi(RkDwgn%#^w>x+58Mk9@IHkxWlQ!+xv18jq z55;!EO(-L^Doo4TO~lzEn2Cu)&$^ofgft$GmX;QQX3zfpfApt+c<)^|o_yNlfA{y_ z@uUkc`tdd2zw7=7zwm`GT=m^Aop$z<|Nf(Y|F+-zgWV6_`oR6Kf8I-8bn$4al9tXp@o>$9S9c3xGHM?& zH~i$E9KNB~Us+*Fqe#pRk5)!;7_p0EYS#=F=7y<(1>q$f+hrhH7G{<~hUms_lx?{Q z6gFEalp%z%X0z%-drhk>sDr|gpeh9@$X@7Y@m2-6P5tzRWXP_TT*9`}BxSHw+f5c0 z*oZT8YeZ+(s;HJ&jNie7&fKQ~dx1d{Qq^?(driJkk>|R{h|_P!G3C5rGLT%z+4jxFKPpB)W`M4|Ys>=^#mVvBu2^ zy7GkpLLwa~voKr63fm~u6(*@GHY>`zc`-n`8-+&M&~!-7`cY2GR2c!XSYHR6sEn=A zLR5PY zB0#7NLC?0YjJ9g2q6qtZno9^}T{)n8ujafi*&evA>qeJJ9eu^;2!@B^TW@Bm>*h20 z=L%0;mup)pp??i&DA^4+YwN_rd=w)f<_0WmD3P{PCnH-r?pVmRz@vC zpa4*U5U9Zb>7>J&uiw>v{44GLWey?ZK`)|Vi40Ak0HC~IKGXb$jk^vkUVO<{)~;DQ zf5g$FwmooQ->$uTZolKlGxLWJruxmGSz2DX;yYJ_Kr?IRfUs-V?j75=5p%ECTeEIW z+r|eTxPNMTW@^obA6;_|h-TK#_vZVtm3udDoto-z+_?V68*lu_fBMYqRDWuAdgu1t zJZP4NqtNu25L@1{bJzOA4qIGUyl(rpshR2i+Nnt!Z@TeDq;_g<&Fq>cfo{L!_7vmH z>`Z^q#1t7J1Qrn*GznQ;O+-QuSZP~nMj+?zu*a*AKY^AzyW>C!ziRFa-}OqHuBE`3&G1|mJ=IU z^{B3$s%;gGbjYo2$pNlng{3IjZnj6b$>^R8$j-KlzpFn~tH1uEk#02=ra4e|+}Nf~R?%0L-@vWdvg5y7Gj*{V1^mtF5P-)2=p4Gv36om2 z6kyF)SBv5l!s>A@I4tHAbYs=>gi6F+UJHVNNtdfwIYreCaewQc%K0}*J|h-B^XETU z){T^?)aibBk{BAz7@Z=0Q3A2$D#XJW7umNbArU@L>pqVBs zlTDj8Od{QP?*jlPO}OX&9S`kW90P3=b}Xlb;b`lYhXx!5{lTam&#zg#YuDZ_4?NIo z8YXVr5d!w?+55l)n^%?>IRr`36u9al85j_O^0c}JOB{mcf3tWIQcUf*1$h1XwJ&|q ziwFJJ%&(uPn3v`^!-b(tBGEiIy&Vtk3;^@Y(#j$w0O^4{ZwFC-W;Vr0#3D%$^J+S0 zG5hxJo|;~>>9E5d+`6?tHFwJ`w|xJHS3mzb&wA9!CtOM-l88gE7YIpWghT--$@1dC ztFQji<1cvpjW^tM%rQs&%O^iMf7mg-0A@=0yhZ{AUOPwQh2e0`WYRWG)5Iv;P>P6S zP_K^=X@HrT1Q8_B9g1r=RuL3fqs58|EWc1<+A76Y&###;GRCY*Vqqj9pUCSX$=1(~ z=}t1MIXCk}f-+a;!L+ej1FphyYp5z-P;arAw))nL8&&VTh@+|}vo9@NAAHHBj-pP0){z_846XIoJxHgI==wIBi>zYidOfApw3%1U zVP4&Re}(xjr6wI2l1<2zC#xqYyxH^n3P33lQD`_YhY<3i+svFpLS3v;f?X0wLL{VI zNEiqyS+*?ZYa#&z;h01aA+3lcY2BfsirbP{kn<+#^F=#pRMvo4M>dZtW5osG#)&?IQGUtFt^ z9e2u$i6D|PZ^?pY@kuHWQ$S8}X$hyXKh!G0$h$u)GN=O9!KC%jwKTy_yOYE^=6-Aq zkk`f99lEFp^}Le8pcyr>k#2Lc)=0p6PMZC7N}T_(;YWGsD%`2Cp?oElWpL7L$dF}c zlu2K0vMA*V`Kpo@5-+u=(98zao)3rK&b5x-3jC$TC6X~R+(A4CE+dfShMqgZI<=$9 z33m)#F!Ju3WLz*Erl<7F$zkPR%7_&cFUUp}DfDJ@8& zPhDNaTVTDxwZfRx%4BZy{aXR~6Yl-S}W&gUlryzFylcyML-mUsOAq>Zy14;O*7Gc9cAgLZHar+ff+l4SNT-g7{H@|t~#=~Fs^FN!?Wc}Kic5?6~FZ|_y_~`$A z?$5pSN87f~t)0=^jTWHuDJppAhdQdG;iyOfHb*rml|;$WN>;6`&2WmNprmF{VqfSk zobE}X9@F5l=0~oz@VO(hMjq0;hv}Ctjf8mwDc5^2?13{Vr$GyqvO6knp1p(mVu(~W zO9a~#*kb3Jhbc8hjT4rt){fbvm-`TVZBwvB1*UECk;|ejo`^UfIA<7JAw{Ow*)~%$ zUJwBwg{5e)7Fy9tP$pul}Q+J0xYv26|v1z6{UyT5`9uN z?d$iN%-Km|F8{_)`;c`(;2Dz6IMt(41Y9mDv@4*gajG!YpmBoS%? zC7F!caoY+ILKCv{1LakyA_7TqG@3xh!{G?A-SNP^ci(^S&%flwAN||E+qZY$mEZVk zufcPk`Lipd5s457Va~Iw5P?u6gkIAhge$K2-uX{_!pmRr(uW>;@WK1;IOfDh2?K~A z)*~$fruy86P>a+|wL(nNh)~<|IE98%jOg{J*7TVZ5*XDIy)vZ5Or6{*(n)73NA+B& z+~oRUfB=g+3<}Ju9LhTnl=3fUiIvjj$7z#lkdXog7Hv2ouG&L|Q5Mb6H(R+wjZgYq zFDwMQ_Fs_1bj$!zA+rVuz0BubslLxdlR z<~Bt0!Q$%fdfnX=pI`^+d2YpYvJ{r)LyoKBXjJJsCZYtPe7dcsexz6@khextt5&FR zo}b@bX|_egWx868)!mPjvISdJAp-rfaej2=WzsNZC|u3eQL2_uZCaWgE}0ciLl}-{s$8+?^2+M@ zHMSS9cY3T+SL2b2EsMCEP@0_^MWthh$k2>KUoGamOgE*1^Mcd{hP4VQK5LZaXq!<- zs>_O-^i+OsCUFRXV=pi>0L>Lr*I}1-qeI6%k0tIIs|1u?WXl>ou(P{5ZmT?By6vt0 zRG!(ru9d)A}D1d+YSjE`CqS+|GB5#*dr09C_O=&&^{6ao+ z7nziiB?Mw#f|*2O+h${Gh}W&#U~Oq*oMZ_|UM%8kD>P#s2uOO4EM=g{2TcJ)98fgD zR4nfxnG+=`!!_;LwsUH3EinO!Kruxjgr*seMoq7gyb~W7DWw=|gpia-_d%%ev>s%L zqy&fr9?Z=A;qSiVTi^WpD}Uv;rl1H{3Y8c9xh@+iG{S zVRtO6gG1E)*<#tv6mv{i(;CbHSrdKIN{v z?z-XnYhw)S4m+mbYmPYL$fF+dh#y>e<=mRJb8BW#JoS`&ZoBh=&37Mv{3FkQ(gls+ z8{hi&&K(bhrbn`L&f_k8(nU|c_zRb;nOjexCrChqhPv*^4LwkynfI^?vJSC9wHh%E zH=U%1VFpYTW#6vdOx#Y!gMR;qKlt7WCm#QTpMM?`AAkJO-@g2t?|#?24;SN?N@&Phe=}7G^63l(&FO% z58StR_ipyd2?IB0PADxTs_}#Fqmqt(#xBVZ(Yv84gz@ zavJYiH-GNNqc*IWn--+rbU#vF6q>=Te$T ziXt+YnmO^L6Zh?Z;_S@S%V{tM54!sGtv zkNz<92Dx5;sy`hXm8rzEW_E6BYOs6T{kPnD+v|Si)$e}yyGEmhBac2}W@a{&Yp%55JDDY5=kkhlwyiWY#&jvnGp$04RcBqC7(c*eS%Ie6k!UI z2q7h*6w?G=f01Jz2~2^|G~DDvXGvLUpuo(8d`PaOBq^btpq<2qDcIpD`3aFgAurdD z2+Rb@`w5m*xT{T>%;Aupg@X$Luu`Ah>bJdE> z;0VHYix07T@o2QgEU$2ws?5e6y?Cn4tVsl(n$KFKepjlXF^K_!_8uaV7ptVCGdAq= zNm*m7nHAmfTqv;b)ROlE(Yb80K4{0NS{xx_Quj7`Qeag`z)`MKb^&@ zl)(uVMwkJ*1iQIQE7l_ms0td1sZGT-E&S3kS5(%da)m8a2$tcgcpWHd{!#P+)pVk% zKt<3i)IzONWtP?GXkAQUNRg8JBg6l^2;4AF`z3X^sr+D^u1t}ZTTBMNC3r!#qCbUo z7_OEHXBgk~IKZzi)E4G^Tn<_IhQX zJum>MA)%&`&_f`wAaDLYo-id&NRsl>mV}%@Nl_$%B&RU|l8AC*xFn>MSsz3YBf02R z@v?g{My(6sh={7C;zdbR(ApQII1v%^YifLj2SL3_F)JS)GS5#P=4SYxnTX0)qsp*YDfX0T?~Y1@b;DX1_Xm1<@l~Jy z{J*uJyYIN`lFKgstM~u)$N%9YGwV0B?F31hem})FTYdT z1UP0n^>A=;W@;1krR2@=x6qsNXf+Atr8Q~PWV_|BJ4IVni&ua2+hl4lhMu6DfU6_l z>>J!vs5GZycO9MyQw9-*D+T=ANSp4I3Xk+?7!(?h%C21x{AE`6t@US4ctMTAhq#); za7^HNok?|a{W({H`$o0os{bD#Xo zOJ4ZGCqL(rregxXI0jxa!BNE zu@n2%7q7~Cl=wGLit)g{eZ)9y)28ug{IQRHY}~eQe$#8OzxLX9|Jk42f8X7+Yt}9e zhy4b}AJ!j_21gyc?%+L>$*sGXC^XHFue;T8cb8@{m17&zj@1+{d*6L zhbtfX$cO*n_ulrgfBMwc2Y3GHs_)-))9wA4xd*mxSzcKNxNXyIcig$MG9>D)j8?Wj zv;`25oN&T%dB&CiCQK&dYp=iNlv7STeaKB*N_=QtFiDAv?2u*|54FEgxnKJrmU?wWs@(NzG5d2K zZV;%T5*)V7jW`7bb*||?z6$~6l}dFgJ+S|42c3X<*xYGii2-b=-P@N3dOWX!$^R`4 z*Z1hzwahG<-mq8Zr5vosauEe$gg_wZX{mXGWJxK-lwyi8A=(+UeqK8h2vH;@Nk$}N z)YC@9Xjc-ED6!K%#YZLtrqB{Wf+s}s&cz}0dm+2$r2E%{qA(CbzJ>yc1QJF7Q4<&h zNt7Z79RjKxkJ!)2w%HVrM_XOI(fQ9_ZtU9n2UOn^B~IUHir`{A1m1A%v-6A<&qqUveqIip%~X)?a5XFg1@7@ z+AmxEl?{c8&RCzLDNrXN3xlgs+|aQwOT!w?cNO5SsgP@hBZMcL^hZStdvi7yMVKT_od@?um=%9QahPnH#6N#v80&VLQM~W^J;hsqKhd(eRWBpXX%mpDpeJ- z*rxIb*^PN0tqa9hS0QVsEp~+>nU05{O0VCuT z1fdmL8Dsr4e*dfO`!8;Ll1N&LA`&49k~HYnMz}J=T#o=LX9_I+T8$(KKt6{HL`JGf zkHvDt>kO0up%Eo@Ca`@>oJ#<%KvBPRfU68nAG>;di-Jh!3@KTPmQTCR>B5%B_%JlO&Zy zk3G+XS1+Yd_v}k#G@qLtFRhyHcKI5XLYhhq9RWMO%p^`CDYGTLszO~CwmS-wuO)rS z{Rb5o%efkOdfNRiiKLu1C6KSJ(F}r4dgQEX$rO5mKR>BH9o0o!mJ2~B@7bYON2xy6 z67gILfgMa0@pEChX_k|Z%J10KqRk{zGy7AOLN(vxeH6ft_si>t^BNgLr92;!s57+H zu=ya#s&>`1!Y^UXX+qHJFYMg$&JTR(jjwynpZw9=c5L7EKi~fL_r818=f7~->1Ukr z!H<4o?}PWCKYR6cH+<>ROUH`~x7@$wH-GizU-*wN?ccZWz`=v>`|H12I(T4u&4x`I zH@x$`e|^uL_xAeD2S50M|NPv=S6=boE5r6(fBskJJ?6~u%INto`1wEh!{2*o>z#lc zd*qS5FkmL6gs|F}JUv+qn(A(%YxZyxDQU%00H!gFLWLNa$pnOHG9K;UvoE%B(_x3V zOA8GNF!`O-0bBYvtgOyf3{!jn-@qhY9 zA_z%pCvhA>{EnNh;Q?)Z;DO)zt+&jsU9+@sFpbBdKh2@}tM|SuwW&8dzxn=q|MES5 zl3EEf8*aS*x}RKsO>b(=Wfxz3*%v?G8%&EN0fnX+$M&B-{C5&t5b1Pp6MAbmZr{4) z-GA~&^BWHjEC+V&5ehs#6JraOrG+;5_`23$+vu>Tt28j)UWO}-{ zZIKVQKyxUj7gRS<8NI2^Dw~{xqfP6Hw2F^>0cS3_A1NZq14l9FvRZDi5x{(peUbY-_0+I5}PyitD7` zrV^oCiHbWaGk#@e-R)H@H*FK*9WP!4kiDqoh^tw~VxDd*h3Dv~Ifqpqr=Uj8%X3_` z3K9U6pPjel7WuG|(X$%hYnLfxWhGtqAOu}Sk}D~)Gs$1i% zbEO7}i4&DEa1C$=i(={36e8sfV#$)_7-R0NIs}J!xOY*K3Qww;(%Fz$PR{*K z32U5b8t~Rk+oKxuBc<3)VA)j^0czvT*y=1w0Wb$!1%*-qQ$K_%37fbJ111x+h%j?( zCsP5>d&bZ1-L+>tTn@-smtbBAt3K}LoW>RACgy)_fQr-gyR6jFL`>CV^|tN{YEIxc zR*{-mL<61Z&{(+RP0M5R+0KEOFahOT%8DO%8d(LXjlQwU|4qYc7dw!2vq;yi)YG*s^0!ev2W8IhTqQD$UY_LY3HY z&O=sPXfd!Cor$YZ~q<0bX&#WYF=&>`3Ew(7W&p|Jd~5%2nEMYAL> zTFH`!X`C^|`gYwJ%i8P#HjE<`rYF+)7?ciMw9(1NXk&%E?jt4Q(6NdtvP2mVcu$D3 zVcSS#3$&8&(ks^;9|0<6X3NQJZ=zy8j&#;q$@`|Wxs4L^lL4*hhtglR}RV$=Fp|H2Cr z)BO5%(}O8)`W*T<-E?O=UJkvf{`Aa)TX!7Tdmy&M!;XAp5_;_UXFuw+M-A4jeblKZ z|KJB#J@x6&zUuo|9oV-W{dtV{Z{50O?fk|NdO$A6u93S`lUALoDTC@;NdcL9S8S!= zI$05{85Nm%YJJmqys~f4XgFNixM}0U!R7z+{tu+l0#O)`NBw>;G|hMJ+I9F8J@d>> zU%qkI^;?&?84$%7;}J(4H5R_~>)%cylgaYtEt~i3-aZ};n_eG>d?iMFas%eE^U)^ca`|k)%l6P#__Z z*ed9gOla!8-&w$TEX0I(?oSqt^ zMa5Ub(uti2x}Jgav8b|#HQ7?r6Jy_s2VOpxH-CgDIAHHJN2R!2Mlv^$46G_eD7U%8 z(>GRzZrE09j6RoK>pOyS%XX)hHLPP6WT;(dFnTVU~sw zn87KtU?w2%GipF=8=gWCvKR4zNkL(jp?YDW8XHLuE*lqK4K?%(^d!5Hm#DlqBg^o@G!V`9$7^DN61RhX^K#ES!KS z2m%q5=tuy{k4hFdB+7;-M9`fupj8G&GgKul@0Cx^E5#13PE_flYowTdm|Ca@ARFXT zf|-#w@1)@wPPiKAA{udmp|e>O-S7*+1B||xpi8Ro)ilJmXN8FFXO#=vl9iU^e5aiz zTUCeZNrI(s060K27gkJGkU&cRbSDMl0N&~_d>Ly#ZfqbIVUt0+|KdofgR}p-` zY(pxo_Vj@>c$8bzGJV*5w5??(8Y44-B+#w5-m-J&?z7K1J2ZI%A`qhp@sLk(_NBw+ zHJ*o{YKYa&>c(0m?Fnq}pgXRTDlPBxmz5~q-;mRnR$N8ZTS>Sf4hRiWf>1kQT1Q{} zHZHj$QKO3=sX+#RW^fW7x5KeCj1+;yiE^!oLbDadm4pr<$3gzAx z9EZ?=8I%Z|QVh%jNNho14yZ$?A~6@TMWq!H|0!ctR6~EPB-3S4QfRKr)|S4yKKda0 za|^mUmabMD)o<~~Wvc-|$VZjU&99rAoMUa=?w-wh*Xm`gl^9(-Fa9UhzE&X*;c5kze|^Cz$H^?g;}N45~;&dcUoiyN3clV ziKit{`~ij#RRdQ`oGJ+`YY>5*Sz6o@U=GmK#HX1|Ah5a{^Y(5ud2NegZr*FmeSv$| zY<*JJc~B{VA$MSf0-JpD&yK-BKGmfHeM=POM;hJf_$SN46PpATrb%(7N_e~dSW|^q zfz`6kbsF7SewC-Ntcj8$wfRbIiamDc7&?iyGO+m#hUO+rkZ}c9I8q zI^E-H<7%SQOk!VUp=r^qb)So)^0b__!4JVRz9p{MmF1XYAsuP;k7bOdzS2dF($j+3 zAOX^opYgx;@8AEE>#jMl{lQOv@?Rc*-dRTEf@oTT{O-~btp(Jn*Nt(f6l6PXIusojdVCvfIZ{BkMgFxP3Gp5%UQ2nVWWf?&e+j)Jnv*ZQI^p>g3ZN zb8yt&eb0Tv@o3Mk?JLVm%+&OHsC59QqN<3NZgJ)Fbp=&VvNnMzWWto|+BxK6$Us2D zB0y{z0#L54cgzF;Nz5$y$ZHELTrj4no;k3&RuQBadOZS*h@@C+mg$U{7Uxx`71+R( zHYN9Z5J^N5)?hjjBqsU6*7$?_#)MvAA|xOR^`tk&`RL<{$(TsY7z{jM3=G8)_^L5b z;V}BWC3Xw^i${b7z#TdYIu)@ZdQNGE65-XAp{DX z$5S}Zw{;cIUl3p%#O76!n0W~$0x<$XkBb8_NiLRdm>Qyng%~Nu*rqn6$wb(|mZgB_kEpN2C~a2E)1K z)xA|lZ)Zm^(DrfzBa9aAb}+yJ*+P5!z6`2$$bE^YXbN69dXPO6 zsL;vUX8ceEqy$*UMa66u>|YmOrU+OCoMm^4(m_z=fQZP-r3!?jw5iBVh)9jrJC}_} z-9#~y^17^%4!p+v3q(CDl}bUGMEIgKGg|O`z>L{%`MD{nxy7h>7!t(IH1z zOhK4KpaxYzVzN-4(BG?U4s;U-X+#CCdi3Nh{9zppCNZYePA21a;lSd;^71*4Ipc3X z^09@b5rrTETkI@G7|diUui<9zl5+b%u|dFUcr`F5Z>Gt`Y9dxcU`HB7G2O~Z%ag@o zcQu&8aVmJM^TOG)5!I?*D|hA$*-Iu*j8~&d<^fGa%1}{CP*$P3kq?;TGa!P=+8KGK z7gYz!oR%IEM=C8ZY_WG$bXu&cF<;gc^(-J!{)ZxZDoR?y4kb7qyA{CeFlohj+t8zn z7n$mfgJUu05Y@5Rrmhw!n(OShwQ8}qC4`7BwuxA z14V9xBCxgFC@M;nX|Rq+zB`|1<|SwDpu4JUy>m}aS*KSiT~Sgp@mj~rrNtE)qM0EZ z6Ugrmh?A2}Jo!0Kd+Mv-_@>dm{Xg@JXB>a*BX;cA4wBh5Gf#T_xeq@0;3=n^Ivy@x zea(+YlX&W*PFXj^G7%yTEB<3(NZ?e939Z3E~ zm8$Y31$K-zRL#oqiU?x$lxjXJJFH@dR5?Z}wt-s5^O;bIAi2E1*CXjoD}(e>(T;d( z?X5BfrJ0?V)J^pV7${Tc4?f4>)xVV}1&3T-#SI4C1a)Ns5%%qz-6<0agqJMB>b6>7 zS#?9;Otjm%4wta3l~fOMm6KxW^$^q?-T!1MEN6z*tGwG}c%ieVsyTI7*=b~XR2@83 z^n{$UROu6`o6zZS(PyRns1=JUkL=MX@2*9Hz{L4L#6W>51Zo&WB2i*WlZi|waWWoH zT534-LTp=_v@wZD(vks@f_s?|#8gU$VQP}h=+wjM)+BoV^(09?yjLi-LP5}^$gMCl zku*$!K$5f*T!Pgk3F;ixT@w(@3#-h@LBu?@gP)BVX%468d9s+&EzOlCnK&m*}OOhl6&XcW@m)Z;EQ++5wG`Ev-lYE;~Z7iiyg$j2a z?4f^oXE846%*(=~+}yidno+THy_m8_lj3)-=7!Q6OM2NS=*k6hA4VjBggy5s(zQak zOUNT;UF@*D(u>@=8lX%4bICr~O@_cy_teJU*ry|Ld6`Q{pW*XlV!(@{0O-JV)=9Bx zWOvm5c7kz=dUouPXK4n_k{UJb^;t8j+%!6`Djk8%QgreZ)rFPY@@0vIN7g6BTjYRB z!2Yb&e%adE@xMkwT@d~Nktjj%*mKW0V$=Hn{M>)Wn4IX8iJ$IAyDzI{S925emtolmRafF}mW;zEZ7DZHO3(S9Vv%C94GGv^Fs)2pUk}&;~-UM+f($-+BSR^Lf06 zRa~RQQ;ctIl{b7i-MbGoBQilW7@rNVIrN(Kq0V}G zYQy82@@>r^r27BEG^c*6n^g&Lbhs-0F8P(1;>`Ton{WQf>wf*sM;~*{Xf#<_T1tp1 zMhZkiGcz*~L`nNUwEwnSZwvhf5b+&VT~9Q@Am}95N?T1MJ+Sra19H8p5YYLCKd=Kg z`H8jvsnxX1CjlMd*E437xHQ!OLwvnRLszmRi+n(;$RDu1t8_Jmbgru)A^*pFVsm@$ z2*~}@y!ODZaBOOvmAhZ@=`TVqAW?z~FBj2- zN>Zw66k8>IQne|`DwZ+KmAF!#Cty5zLePWkh9{qf@RI7zzxraMNX(c*Z5)FvSSF{aJC zc26Wlq#mdD|IOdL?$xjU-9P^QH8b-&_wK#?TbGaaJ^20)|J^VB;>(`$GZ)@-*L^>{ z?#BdbdQ%v-f}l1*j*G6josQK#QVW#&x?=TI_(wO#;S;rmmYIkM9D<0n<6%1)tt>7y zz24OHRKMR3&7heg0um4sr5MNUa4M7Y^Bvz)S3ebDuF?sMFm&;vCeaD-4VK9;1~33MnHGW9p?Zfo=B|o; zpA#I49eLi^n-7rIf!8gpXodm4nVSI>+}~7ik^5nsuhfi{Y7LFvOGb)7;%hX^&^h68 z-?lnGQ@IndSAZzj6IoOYNG?jRrsC@duCj<( z*pgCO)ucSfkW>HA)uNQZLX-%Bgd60V31$k6(DGyw15;q?HPpr=$tJ5(-XseNNJ)}V zn^Me2iPVcmp^>ab+@@awNfNUN5~P(V5=26b%o2hG5@B#4-6A}&w7Q{RP7w)6h*OFo z1SUx&oDYZ5l#r>L?#JQdEkyaW8nq=7-7Ua$1)72~b>dTP*!y*pXLT01g|Bh7jsbyCoQ#BUFDZ zO|MB==dWVHyhmILUO<&as2rR_aitxK3HRsH&BReFfsc7Op`ucrl*x`JLqsy-YE0Xxdva1l z7Os)!kqqAfB;8R?TSykk7)Zjcrucz+RJ1*OVDAC6ZJSbzlMcijLSa3&^WiiSyxOza zyVSz1@9yfVCu`qy@apKmM!)tab=&>pqy$Y^`kq8Ypa5bpF}MkdSehyR-aV7Q zznW8|#R<{`eM-k{z!i6<2lqE;o|GCBAB3r;`d^zUDF6%VG;WD?tS#1V&|cGej;Uw=zG z!HFlIvUcOT4To)f)Tt+Z^UIfP-umFnUiqq1PrT=*Tkq^oPf0X{H1(;huS}=IWdE1UVm6?9l8_6D?%Z*DK-GgLaFVeV7O^(F@XauGSC;vvBA{n`? zNU}yAwH#DRIgdsD*J2iGB%M*H1R{k`8%9+ou&m+MKT58XgGWkoL z2yIKT?>~OzLq{Ha!eDx8 z`{sL>4j!bz+UL%*U!4Riey()Q9aSl9Q~8irsa94{RKkH+xuE+1?WO=$uUFi^l!R4f zBM&n`83(hatiqZO#FdT~8CB!}?p&mZuYQx1oAV{bUzAJ`Ip0;f(slaknf1|{N-sSr zhX$Cu&F%Q@KG51BVj?}x)~K1S^2}$wW?71&NJ{Q!5(L7YeYSBRpAhjO z6oF0664KEv-0kY4k~0g zNFK}s46(~85fVuBjA@P9%t0ns#0;L+KVgEMR3dK5xj-}7#jsbq>LigmR4C-B3aD(b z1VY3P+BJ>S_K?{689`u5u4<$tARkIeB>`cKjFFe-XzPMNBoOlSiAAx(WFAdOG@oM) zWFR4u=T)hs?a9pt5YdA%$ulAdgg&DolS0SXrHouL*kaj+c@O8mQ5mye;8kYjMe4<% zn&WvWd!N(}n7Yle-okvfCvZ`#dM_-8FV> zlP8wGs9GnaZ4v{wB1?g7;a?Qekt*k}JRM`-O6SFZMmvhbL?yH5(X2-M=)9=vhBhkC zoDWCCxNDS>1kDuWv}Q*#ox8m+K&?yW@=fEErki9$TV4?_V*=*)?Hx|!JT9fqU3GJ) zxHEANK)Fse<0T0Na1bU6pd`nihm8l3*pmT1QR{ z4j?8XA`%dj#1wl|)8lsh{qJ76{ek<>JolWX;Yv)gHy9k)v**;)&N%LblW)A?=0R_; zVZ;3H?K}HZvs<@r->`AhW6wMH-uoY#n_qWe@7@^GL)*7Evuhr8=Gph(bI*<)I|oxU z5)*gC-sPpvwOsg>Rdgw4jedon6eI9|Q-|{zw<(cr7Zk|(Je85_V1VCTwG{P$2?;?0 z)9ma_-e1KuK5wI!CmQmO-1$Ia@uupF$-~~_{oPns3Bc2m+5-KyBdwy*(utyB?8~HI z_+OO(T1Bi11JZ9Z9Que>lPHEdCbNfCdHp2w_^$Q>UG-V*HfeozQIxI`Y!)uJ!B0^x z^DD}dBsoVb;gtsIPT{PXVnwqmYk|}83ctKZg((Ue>vVZXzR61)V3_JX%7vkny}mPd zRHVharg;NRaM(2}p}e;f`-qx%hNmQog2U=T0N*7zE&G#*9%rK!AQ|bXno;v2 zxROUx?a(Bfs|YgyNs{YVZ1-t%B<{7<80z>!TWqbZO^=Tb;_pQFNtQU_3!qzO^k?} zT7?l#XROt^|`?O{Goi zx=-?_qa@8cM&X7~(6kyw!$KeCtRCb~IdmFdYzv&?bll4F3y4sx-pV5dHunc2EAJrK z?h>{qW&S?pqh!_d2$)y|Ddve;)-8jTi9wIiqXaMqYE+R^6iFn^jSwYilQ2U}_B z2qgL8uQ>x9MR&-ufh$l6f#vf+mFY>|NS-Mtj&j-{<(!C5!P$fmX?9*&lO{>XNCzyO zGT5=Z$m&S7v{dpzKZ?|bTtvuuDHz=AUYHa}p!>Y4xp?PvG$9}a&XuUis8SAD-Q0Cl z)d01uOLDF&K}3?xhSbrpgat>xI zYC|9hvoI;>8c7jJO+zWA9ou)D@aWT?_N-^#a>GpzJ+yVrElks?IadF?ieW7X2KJW1d5AN>;8BDE-2X}z_Nf%d& z2}t<>YzqFT43P8`SZwESIV&)T*5paKH@&WYCoxQJAeG6gh-+c%3Skb2Y0$@O-hx zr0A6Tie6*06y4Dx^EOu8rLs)k#6!ndT+yu!1WHJxVX*znmBdlY9JZbHhDwAkVHi3k zLe9raUWx$_kl4<3C9(Epz-P@@fS{n6$BDgyE|~Zm#O}gy%iET0Aa1zMhvi277b>#+aVw{M4HeNiQqs2JKG%8>xo$I zHmC8lnj}c$JZ%-;mF`O2a;G4<)sme{b*)N|6hmFpR=Zd#;;}ojUR5G; zzL0Sl+{+)LkY2`!96uk9K#9rR@>(hy za!v$}N%kmxt|3(%NR#NX`PKPsCL#ZxZHbFT}sw{&n1o!d_vcyx@ zt%x_zALZdq2N=r;*mq*)Zvyak9->kx452v4JoO49KjBt#(n8~S&mu*Qqq3Vw0#Fn} z%4O5p$+P07P)bQR6w6mjD~Ur8wj(@J5@re15D8M-#x_OHVY#G?R>a)oP%j_85>iSj zMG`%Z5lHI3IZ(rh0c}i45M$o&vJi8&ss+;~k%Xv=D~NQHCt{++LP9L?gA^r?1|{3n zP)lVw@9dfqB6Cn2u?=%rm?hV5Ktz%azfeBWMucrXiXdRhd7NDAkaQ(#=HkhTDXGC~ z<%kcy2%>S4D3WYZl0Z@!X4Q>i=hV>lEKBr zmpK~?zU=qP?{)k`r#sG_E7n_!-JFNDk_3bp)4qcXdAWKN$tQ6Ga)@@6fiR-dZH4_N zo@A+V9IJZ2YFI5CLuI(+@6x8LXX&;~R{u!VKSub81mK=chbIyi5kwG4p4LRnJ|fw! zPz)`5AwcqZE`&s4`AQWuGMFzNJaGIYk9+dde&)y5{rCr0T-Ee?qm|*=XPtZQW6o>> zjaSA%S~tJ$z^)xlz;v&<_kpb^oOHs8f$qEep1G;1HS=p@N?-o>Pv3jrT`zmpuRZ<= z=l|Ph|8-_|nl(o%o%zzb%bnoMm5+)Jm=2NA&MG+wCkc)eRM~0?Qfd`mCHKNLD=t=F zETz%ewlpr!Hwo+HJ_IRyBJDHs*RZoiG)F<|6|_>XB+R`TR4}Hr-o&GH-V)jlIckpL zsN$+x0&oWz|C@uAqnHl`6(Mw;GrFHDpeR2mXbP&Hb!D%E=6!>}HvjgXSI=6dJ{HS% zLLYc?t0;-*b}O?rH>+Qlm+JSGA&aG`I-Ss+H~k6$AdN}JR{E8hJrgclJ%wp45qx(H zle4<`O3*qtLPS=0P|c(6Ba?w zInK5wT_ma1uy)$DC`x{y`jV4KSyo)d_BA!J8=^Z~$F_30!1lZlCwA6ff@ddDp{hY@ zr-eV|<6*DAxoVrB8b!-26lMU+dsqTV3aYxpsibLfj6rsRZlIdxD?P8*Sri_HtN}j7 zR7tYauT`X4@2$TyW2KVbF$z~hQV|GXBQ52Rm76f-T;+NS*mnn}YQw57h`Rvs@ywch zNXy72Ru#F+>T0C zrOs`bNUOA1$Hz+L2r{NW3`oB3fGNQHobE zKpL9`&PQ!#iG|=t@Bpl5%|kgW^vWvAb5B3t8OEy=mlm zY`1PIu0gL;pWJOvrw!5p2#fiNZ2L+_V?!IG^$tWLDQkkqn%=D3?PLn8adAh8imDd7 zktS11{9G#At(+|@7^vfy8l#n0Q%RP?Cug;fm6m`gPTSulq9)vJ%gA9XI%7z z2OhY8-Q3L6pZUx)cAtOZ3CDl=OP5SdO{JJ5#nO_JR*>r7&O!{?>Ipxpf2aj5wMvw+ z?z&wmPls`hJm|FQ9;!wKW*t_9TK+BWx736|(0qr2eVGbNssK{gJ9mb+1l*L*lU7HB z&OfT6ew))3?~*@n)hwKokbHqhx8klT1F<#2C=d!AEz>(C(y95LSU_6-l*O4d+InDI zJqrFw@I;W0U@=88g~(+cV%$kk)ozfvZ-8_I?PL!u`&|l=|4Q(5w8vFMg_l_$L_`lr zwb-*vHIc6MFjUA&fX3-%&SjKgE*SwKwj77PC}pl=6&+n|E%%!2)$OputGXy-w9Xv- zKgx{BlOu-J(Df`-sG%vjxgdhIOQ)%ltv4y=!0ftcJAjd?JP~D0@};e2d#?66=G@uz z#Z-)`7GJ>uQgx(c$8&cSyV!}U-l{-Ww~VMhhD;so5!Z;-AGf5+QB?k>iXtl=cK4-i zGw@eBESlA-f@JHJztJA*UbEXObMdH{q$7^mLiOx!_rx8}p?&VwR=7=cpOt^6`UwSS z$bxj0s$q!5Z6?GF3Hp3-`*B}Eo!9vMv!Eh60LZc^S>XCoDI!&IR7E14>HC~s()U)- zTC!}NP8QhLOpkS=7G-fv{s)0~&7BtcnEP~>|J@y)X{;xS+!IpuzzpOD8pV3Fr49~u zy|XkYrsd@>b^{Qdu&foz(BCXWB-^MD5m8Yj3vKcecq5KAJ2Zr=ot)HDQjRCZMyisn z+6u&Grt97mWvZONB?0`wVneCV)Eq&^H1$ZLF`)~|N0-P^sSID1UX}6jvhAYi{-M>s z87{eUc8ALK%+ncFFU`a%Sx}~C{)NAx;GeqmEPE3t6%;bh?EJRI_|mAN^bg-RN5#@Q z%DelE=;^T<{jhb2Y%t8?aFak+Fv|IbyG}1Ik4N}R;tT9MbNP? z6ics+(R8wo*HsP~FvzUYZpo%vB|O~Um4>Z$A}Wh6#CKY*nTz_n%3&9S%}>kiD2}{? zL3Q7a{|Jn0kUiPFsUW9UN$EoBwz15Nb$dfq3!N5J?0~E%rXH%Y1j*;&Lgz<2PhORX z%994lo5@U$h&eE~ZQe^)QcB4Z0;tX08dr(iy@*j2 z8{B#{^j;fy(hYGk*0OD24io4|;v}X?PAsOR6O&b#Uyn{khm6DmiD2P$fYK1U=rzIU z33KQTrf$3Swtl}^T3VhASHd7HEgf7~J^-e@`}Td|3m1nbtSk?w)^57*f%}(7iz_QD z|NXVEFB~{9Gc$YBPj1|^d-qrV`|D?)b9O)QXaDsxyLRlFT{Aan$5aWw&bE{RDl(L6 zI*@9QX)LQSgi5fL)pQ2dbh7)&WS~nfR#}R@F#D!J5J@pXVjd6x%uEzwY&oAXOq^17 zZrRyVXo8-02I9c6on-aM7u$5Y>6d+A*hm)1Rkomih1ro~j!Hs|=SbBRMKme0w>N5H z&{f|QzE~%^!&D14-{^KiQmofFw?8{`o7HU2je`hzYNG<$hp|@eV}2@|>G|xNC5yb_ zIacz+QoJqti~^P_3y+?ZNLdh{TUc0&r;}{!bC|;gHD=smj;;K;q#IJsbmXFgvXYZf z?l$j}8{$Est!%dWtIEpDv>%ZN*7U8tY_wJva>PO)(lHb!kl+Up?naGioPmI(z$LwuqH!i%4`>= z^2O=dz!%@@pX7q9l+?V@PsyNLg~O`ow)%VdQH|5Sv%&3NRZ&UvbE}^x)n(ea`ifQU zD6#*;{PAI$N`6~1KkaOxdZ=qWx@uc>r+SyB-Kw_RYdY7|{Zj@kP96P5e;qkv=;S{1 z6sEE&7$W8A_8jpC88A9EA&&yhr4~PLR8vERFRa49)dN+&Ghc6Ur9apy zX+3|CZ?W!E9lyJy)$etJNa0ZN(M6ZZcX{H&(7eztIe%6n||@?AEF;zB9x8nvnz8g*V#2}-rOY~Jb9j^)AC z>;{ozXNEUjNSU>}4gjhu&HR`ug{!`{4uoTk*aP(@jQPacR(e`pN?M8K?v6=nCG zH;rdWt;l4YB&L`Wv={-*oJ%4&1Wh7PElHtVm@6Qn7)b&JwZI%R6GS8;1d2p~IPav9 zJ)m|l`+{g0nuMh5o^2PYQwnv zm;^iFR`R~Q!rTFH#nLQL1Cm2sw>*rq?{F2Hpexa(eOXvht(0U`hp1z!5T}%0@Ks%t zZ*}0UT#R8);l4@>tLo-bL}qvdwP=H*?3q*Lr@Ec4y`;}1QTHNigFAx)b=9r zD(GGQrT~=zc{T4fT$PGx+Z*f+PtONjbBr=&kmU(4wt8=XY-8w zaAmpI>orYdU{erM2j3G2#&g_G3YRd8v$&s%wHt&xt*hw_RTr8NN>0M`*R}f)xXl-+ zho{o?0&FOwpzvA-wH`EU9NCMjAs6XhDCUW6d@O5R@&*>vN?m)BIUD&#oZ4rie14mf zD02qx!$p!12h~!cB3gTRwq^N$82hsz>$c=P4Er+oIaT!!cfM%!0H6U7Xv`b{NFV_c zBt@E}NGfPiCPixqSz%go*bF-uVGZ_!<&eU5_|bl{tqAMEv<6d_LZU=lq6QEo!2tw8 zqJc(Z>TaOt=??$BxBjX+duRF~^UKVAsxGJ#-T$pRwf7owWqvuXwSd~_8iPM@Ub~_D z85>qrcyVn_u<1}7x?|vi^A1-{j;BwbWg+amkD_kGwGF+p&CZm8f9PXj#8a(^vH!G(RJ^o6_F}db~3sf)lOI+ z`1tG#1Zyg&?vH^rMhpCbqLCqe?b3}vZ2U3JnlkuG6N}hb-w{b93G(~aHZmz+(vZCh z2&d;CY2-xr0y>HVX2+tpeU#!U-CA)45u|&O3iRis9$txi8j3C{Ct3fpP=U-)fYVSz zvezTks?2YTPa7+S&ZyQJV#eDIW&_rDPJW}=ePy4dDeqf465m)-j0EnNDdq%rW&)RN zQh%tx6if6pimNMd(Cw6#%R$q2COwA0)?2yGWqAxrrXuS<r-+iLclq&>(^^>fjKV$)XF=pF|ME z0rM<0cak?fUKQI|JK#J0Awc-Nl8xl*nCxtZ*c4Lq&Wl)6o_#&?2i)dz*;-nD8l4@i@xSv4~2ds|92txvc^EKlSvN1kV3%nF3@Z{IhyTmy`lnVnA2V}r`K(?zu6^r1g znQ+;VdTE0=;w}%Dx(ujGJ#$$iLOdOTUa;oUG=N2;d_^2$d4UkMk2_@CUP#SmY>P_| zszLXN$4G|K&ZK$%c;7f5x_*2o^>5{uckz+@VnFaN8lEE^E?i-9*ijq%I1R_ z70aoZ_5|Y~Z7WiQew@P@Q$mS8D(@T*yi->U`<5~* z@-q6@>L=HTmRMGGrGe5I)C)mCrL)lLn4z&iL65?+JiFP?n(0r${!TxYA{ok>-R(e~ zin!Wp(X2S&qMky}Ts_rK{Xg{hWc$eP-L782atYZW7J{q=9#upXdT|K39d7SnKj{S>=1a2?iQ=^oC7~3qTEsH{Wb#+VqsD4?`(DYu zX|?S+xfW(~+itJF>6<!F?D7er7>Rda%h6H0JhEmNGBr%Z=6umCaSJnIh%R%Xl846ZTd1 zolGe%lrKC!cs^ZN(7iiYeD54UWnUu=*a4LR-I-Dyy`;Kj0<3W&Z;Hz$6M>`7>3~$9 zv492VkphvHvJCGD?_VKj-6J%R?x+f=pax}-!6EcANpC(vMw=q#V=OX`r7gYW6{HBw zJ=}*Z7?BEG1+^-59}6K46NtNsaynXP(l$T=h}6z5yh=54-({PuxBCO;DCi3oiVciKcq{uoR}X&AqPtTcLKV7=l1V?%X_S0k^` zWGsx{vrD;th1+2d%{Gd*VCzl}*@qo{zEJJ7r0mB(U-SmZ=DadJxDLG?21MO4@A|Yz zbu`DzE(|-*COhnu${E`P#8ENSGiNcBAY*JNokBp($1zlI!-geo2NAsg@#=+>Emb$C zJlUq0q4{(FNnD=6$b8;+(p1bhGKy7nao%t*F-rB+>T;S5ryST++vUkn?U4>tVbbKv zcdOZ+!~mXD7$Wcx;SrT0o_j@`+EP!9-#%H?fU}j*39UH8x+u;5wi^8DmSBa9WZvDlN{q;tGTpF7KcI&L4Jm|JyUF5jPL1j}p9P+FXS&mhS8+^S8#IqKo`B!4(24E2&YMMo~ zu5it515uBIB}z|Yf2?Hj2(x^&R3zjp$->xy$DR}$477Nk>(PgRKo<0|9fzp9fvd{q zr3b|`u%hN3(VD2A&mB<%Gtg3yl9G@iu2OXdkuZuAV^a^5%8dX`zNWI(dX@wUJZ`-~ z6bhZGauDhtid#2VHl7OYx-%&UTF823r7dW_nwV;@6Fv@XkA zrGXvk%)KbslI+0=-#caa;K#WJ0*vveG*ius2#fjlx_;0> z$dk0ZhCU??`EuJ38QClQlsH(bwpHKeriaVB&*J0%rhW1?y?Ryk=(d`eh$4#Hpe8_s zY16LX!pisU_8vx$gv!)$LT_WLxm^Q|OLnnrCky#J>{iVy#>h9VH)bbI^5KlsBx{Ez;l zmlqd*=coVnU;Ar+>*An4@B_d7TfgO_hl70ZgWvd-FTe38{)s>O-u1JWUwQd>dHfrH z<8M8F^yKdL*+)L|&Hv0l|4;wLfB!H3>`(ulkAC0x|Koq`kNw;KxBvUi?PeSPz#sgB zfA6P%`qQ8J?B%5(Z%zqj$${m;O&km;WsNySxKI{@CS_fayGW>{pfe~oOqX_8TF_7r zB|)frF@{A`x$58c4quUUCpYi&1k63kv?9`~^;#N>P8CsxtCeKcq{tBkfH`y8TKt#; z&^&4*(E|}oFoW_=Si)dBP^xj+D>5hKLt~_1)EOUyu#oNgHh0zTi6GP`y(;%gr0UuD zS<_<2ET}_5PdPIV#FR2T?8uwnIK8B4zZLvsvPit|0v7HiS0+P9?LFyPWPE`O!L?;y z4i{c(8(P)L=l7{mZ03cAREK46kxi-XN8q3suj1}woK2#r)#vD=cn2(aCUd;shhv&3 zHDJuoCpO5`aK;F=N5t+S`6zsB6GW1r)t8Kj1LhBzl^VZ1_&J+qlwk7|*0blTFZx*} zSXB;N?1dh*kClT^KAVetOeRyPG*j9fY+H!K$ln|8%J|?R z!t?ELoyrKKpv~p;mf|7oZFo^&6Xk~yK~}$4>%%GR7pa8-_n+_hy>or{uY3Jx_dUte zR$rID_InhmTn7dc^Dm5i>_Dt`t~6eE2q%?{gUpb`O#2daK;7pU(bPw#Z<{mXnH_`m z-)U7LjK67H?ivVwcXY_Q(4+PZX$_JqNu^oF^4XwfLY0~+`C;($kjmZS4q?u2a`ov+ z3x#F+H{Z&(-X)OHEJyC% zx1U6d3gLG{OyTOd5ggSIf`j0&;J9qZ)h-rXs9Y#67C9_>SX7UC zTwIS>L?fdKMz_PTROXk2_h+V1C>GUa$yi9-(F%u~Y>3@1$oLI#5I2ayd;eE?LxMWE z6o96RQ>yRedx9OyesKwG^+r%2YwU<+)5(0iv2R&BI5i zo&+wknJZ!of~WZauTq_ZW^qJEavo2%J0wTWxxe(wlFb~Mtp^bcEJMDt<)YECm(U!LL2XQCj^yEL{GbB zodhWZem2*m;7SPd^G&Wc6KL-C#7kMWXEkhqF>LP8qyJR!m}WMK@5E{;#Z@jBEu};@ zrorxe4{|)#7JEn&{vh=*RD(z6rQh1#vZ zuA${8AEFX~JH(cYgT0HpcX0RX?wg7%yz)>4BC27rib~w%NEapYx(W9#jx8&abkBMPaprtkN)oe=r8^U?>>9`kN=53@z&e#e(lR&y}W$u|K-2(U%vL*tH1xpf9&u5%s<%N-2G$U_1%B{C;!HGe8+eE>aTp} z(c{N2zWn5)AN|%}`1w!%*5C2l?6jWNHFkz_D0Dz+_wLMs{`mYUWwwyYL8Ty+seYDH zO4NaXerG+BaialfMOWW-p6f@EsqEqy>bW`noBl;;+>|Ld4ZlKzifk6Hk$By-cFHZp zhRsN87N<2c!oFn^ren@A(po|8;7sT|N7~8+5P(>PJAy3$b2ZKZB~=snY!?Idl$RL* z17i2@eh|c*!k7$HWM6qiQ@+?-Q4}0wbR?MAjsZB#kgjM)iw$z=3JZr--8h>wQ5amk zEE-b7B~BvB?j)}czNeVt%Ze+vacY+5p7caYeGtlF)kEF*S*!KrZs6}PdziiKl@m%_+#U$}ge6eM81|f#?b9Oi zUCV=yQpjmjwP@xO(Qh<^wD-$#8jrwO+MM=kjvs#LP*bM3@@f0cee1LfMosVvX z@m43kN!P%Wh=1KXXwl!Qu}y;f9ZpiN!d+d z$n(zDqCL%Dh@Cr@Kszlt|29dBjH6nlR*aqW7M_t%lKG$%G1`(i5B+;JKI&5wwIfR| zE^%Z7Oe!gAFnC@v%E+aet*fo;cG_0k+&2@rC{*>RqN;~Df2n zmfAXGAP)+4AS*Xkb2HyIv&|w-0Z%hS726s&m*HCak@E`5>z~P;d-1# z?oR)d3erW=#TLK-O@&X?j-4E#shJh_Erd|8ZHU7!bo0X^#|0M)F2s+EUMx5+xLD-i zxIDO;9k#p0To1=OEhDbH-4wz@&ka~qR3y#~fr!PyoFZlsFp}7d56wii5CsGlF%*{q zf$U025JDvKLOhiv61CzAEW7AZ)~`a`%vBkvfw&=Wf=GkPL;z8TjrcYZoq{Elk&Jg} z@o2I|#B~VTVUIYel3bKfKfqa1vaYYGumULl>38c!jikj~k{KwOsp^&mOh zszLNJE!qU%TU0VM%K*uGp-jQEau51rV?GJ^G-t}(O*&Ke#&yxeh9qk#<|N+;aMKnE zK2p87xQq*=_`k-{9q*hm$yjDW^Wd3wamKS%v70{+w&9~mD&P0ScBs^vgNs@cvI{P2 z*#Qn9LYJ3umViX>o?GeSAD;WD@L|lw?D9Ntmd9_A^CAYK}YkYYKYR0c|DGTF zg^&Nji!Z)%^Zfbs&Gj$;@-M#g&h?M{&fmFQ93NdBzWU`aZ702c_c=tKJbC)HH{N{u zA&o*% zc?Y-%b+(H~l2vHfdJh%s1SzjX7gCn|*vqU9`^ELGGtW>`$~9&;O3v8hbHK<%$0Q3Va44kC z7wZ9rU=obzoH{ALLx7%6&2ks9sK3xiAR#Cep*^5bA7M%#?-Wt#h@pDkBh&bFP@ql3 zTE8HHy;#~4+Sm+K=v_L#|RmEq|UPH75L?nSy~$Fxh%1+6WdB3Wv~ zwjAZ5SBtIdmx3OjB11eWaYLbK3q@A9r#4_Jr5SM|AKTd(Y-2%ahwN%oy~eo<2*zwp zY9e!{d9--kY7WgSJS47JO>zm_9u7}ba~xDRH*>X!;u=nHU;~zer~smJPx(V=qOJzJwjL9%I$zC$+MaD5+gQW~<}!U%J7olAF@dY2|e`W*$i z#WyaC%HeRd-5<{F!L!efmn4S^>`BxH?dfner>vknUXA2|Hb5C4uYe(6icMa5ma+Ae%}gbJ&) zRdVDAhMaR)`qxSEf}^r@I<^LeklG;YJlzogP&-@-%1?nw8}Z?P`=lhQyRM)5@A3(( ziQK(}g|UAirtkCv8+==yq~Y#IFH<5@GDAM4Xwi-t*X%>{1krdPl4P?z~%MKqq zq(W(1m+k`LvAxaaU+)*Z^fdSbTjJheI7>q%C+=pVS}EP!CJ+^#1@UFBSBxizP*I#F zo|on1tye^~M%?;Oa*AC~kqi`|nmI6XwL>)f5+UdUs8hQM+!jZm3Z>NDocGQu8}Z%p zk?Eb@BpV2VcGi%I6&bICZw*b&A(RJ9;GS!mNX4#p6_^cMC1NEbH0e-egGUapgng9K z%+D|rg#-kbw>g@GA~aHFJ$WvM>r_%q_Gfv;z&duHo~+0$V$+M95 z5@%T3^^cP)*m1E> z>ka4C1UsvB? zTZSq^wYrO22G~215%D;wD`b++PUKC72Kh11;)6S)sze+HXaK1|z|%CMsk}*rJex9o zrVTu6y|=9n0mSC!2LXHo4h9ih)D9}PZrfow9#kS~B#?zy-U(dtI@m3)p$SOcB6ty- zPy}T)0*mIj++}m$-1GK0G0+sFxTfT!Llah_rpzw_iOXNb;tn^{xYe^kp>>mZ?cE$g z6dY%W-Au##5Ly(6scK41ix}Ju=DaaC2kr`we3-&LP8Dk$%70U4heQm8JHXKbP)C&f zp-(~Q)HOsK{;4`}hD4}L)0?b-DR_`?2a5-(*glbYU|*Z6rHWD+r2~ytVWo*`%X$NS zm>@(jn%i8N?5s=V&d|)qP%E%IrV;Z^?>L+1Wt=EFv@$@t)5wOCmv`zoUg42L>}py9 zoJ5SoI7TGWwsT7`NY%&oF@0(eX+n-p54xlcDGc$*T=Mz^{B+&s2O7q!?39b!2FAXiquIDR<@z-t3Po$IHJ6z6jBn)& zZTFZTRG&S2=h?HjKk9{Z|J2 zl2k2Dle~Lo>3??*Xn>L2d#OVlREuQC{TK(TdX)~9x63AIQNzu-WtITVJ~#l1vJ|3p zu(j+p8olY>6TZjxkP7|R^ zn!7ZmiA@O#)Y}oaRmuR7a2iXl^51$O@-TVUTdAvTyp^TzWiQEqych^iB%*efVtEX?b>Ce zYzKlqAE>V?YC8-U5JRzhy_IAcLK75+DvyLVld!w&z@&sLJ989NjD$5LGNHsqPCFGPuo6eu+3Ii2h=xlcT-zL;Ho$YY?I5wCKt=`XmVJV!xDO2 z6^Vxml}MaPE4V;X3W%gV8)>Q4 zX8@8!84FdfyL+96i}(9b0KA2*v`jS|K!kGaOQ9BU5`ac*G$z%v_Z@uk9k#rik6@>E zsUMSuh1C2L!HMa>$!*@j-r$G9SN-8>aIAEnX;0F6>B-z3icnXuc_mka3IQ-Ht{qk>o`ZFKs4)R({b z)t~yQzxmEP&jkL#4}Opih(~lC$V;|LVWjuIqY*)NKLc7ygdSpvjGvJTsI0_f28fKf z$OOxQgy%~XF^XOBPDy8}05YHT%Q*Y&zi1!x-cybp&k!ZXUmBQWTdYLzfmYiT6xyN# zY<$Nb44#fL#=MFv&e>QvVLzZ4l;hYrmPNv*K#WAQL|IHv)w8ODttT&h71uhdBrf>0|0sVj)- zMg!o6-L#gAujCY3Yp~=|mpKcs9b3`=)1Tv7;|da7x1nH_mbGp@x&+ zX$Ywq>_0;K)}WjK{U8dXR(3auB3u1bP+iY@+YR^Tz-UD^-V4am&fU`}pvbr8??aL8 z%Jc|lDa@V)PbGe7r*vPP?2#d^@h6{?AGtt&9ZX*lhkNUm3bi`Er%Q4%YCLI1`RD+< z&5GmuVPPfuJ4L%69s-Gmy)wCn^x}*zIku^@%g~r=x-iWLlTQ`gvMFSM{H<`i2_VB8 zCJ0avtKC6gA=XWR8MxoH2T#WP_j9b+yeQDhh=P47&HB zD6~@CHWOV9a5uGWg9sLtMdP?sU9c@Kz)|I}EQ`B{xh#yOWXQ&;2pp104wiTt+Qu=+ zvZRfK+^Z8_i>3QyK;D}mqH#5iN{KKFPT*1c5{GlgQ$_pVFQ)gz$5ABv= ze3WMK#y=S_$l>+R6>Ba-ZMw!GQEV@wsQF#bi>O|TOUCd!?&G`PcQ%uku4WX27%IY} zW-1eju~yQ-=?v@0q#Oyf^Bw5bm#!g-E~+A$w>Q?_d-t+u)7^7qTs6i?U?j>7c>?9486`Qe$6Mo} z>Tg=isZZ_I5_2~Ba`qVP;a?v76g~bSkN}*Gec$|; zU_e6c zO-rsA#{igYBHh?M`$sELjBN|ZLfy( z2nnA!6v1Qe-pN-1M)6BwHq{=ar-zZuOv=V>OS}@La6iy4APA%pr#Td3!eVw^&-4^> zJj6q;ZT_r00wm3)v&}NdjavvSZD^igP{}i*MbP_&T7^!k)(nW66RzV&n-MFQOdn<{ zB4Zq28mKo?O1qt+rSjP;SE4!eEN($;Iu{U73THTlUpC(Nlew;?0*k$?m+G?L7Qpw# z85}{my*@`Mq}Q-8_G9_YurVPh#m1|%{a~fp=4{qcb6#4ca7^a!!CaMi!WmIg9~R}j zz1%a>mKl%1B$GrtfTD38r0XFJ6RPRhYs!9^VhxBXDh?1Fc!@DY#{jR2RyElOmuD*@ zJ%$1L)Z4?Cc1}2kPY_PN71k&xfvFp6RMZxMoP)d_q%Q>4xFVC)Ep#*p`nK zoXaj1Y^jxOoyqj5&~O}F%Y_^Hi0E%FAh7?XiZx{a_nd!WZR@a15oHD#HMy#H*_qd* z;rK?lxL)HQnuz!_)<1FNANJ`5qY{O~Ew5!=fP>(mvMh2ET~{;P@-R={`yy~rJ*0Yy z3qjlw`(kYK*oTsl2vt?pMMYF}kww6pUm!3AOHtDxb8POm!A;a{gSn-mlf`TkKn{Qx zQfJy%^YW2~2siU^pcB~}pd2hwb2zk?%{DhPU*N8*yTwr*W*Z=)UU!lW{pOyhTue4r zmWOIw=qnaB;bV9aI%KC`4`116(C8%K;+BA)*dvB81THl50WK zZE9bk8xM{A&xzzL2SU*EV#i1*gOd42=-A5L z#iJJ5#W&*Fx#&waN!_>m`%X!h$>UW#=RT38v_K9T<+^i~hLWR(B#bm@c|{q3HhP^F z?2KfCfi|hMzn2=Kz9ybD_I40b4;E(QZ62Yz7WNm)8{-; z-_YjcpM~ZJu`%N%Y?fKL=-ueUXL2b|>zMN4W^u6|Qg_n18mDzMr0kiASHp}$KuTfm z6<#S4Y6XUQlrcJiK-p=-4$n{H8gl@>H-VdD(njDYxAv+Z%sSzTVz$2&U_mACc;^c!pg! z{$8I_?DZEvqifNTLSM~DElTl-6Jdspg*3rB6WJmmwPbAGTOARUN!n)h4u68_+Q^$W z0eU)(r=`rwA}kdsJ4BxFAp8%*7$^jkT!oBqa2ACH)&8I)$4FY${<<9M-bg~XGQE8a zqL;K5*R&bZPzLGf!EXHJ1pGG zP?PLdItDTKAraE0HhY|LzLU+|-8JkfKvWLU?I4^1 zxtaMEr5pUijf!1-Ob%>GhfX&)6IQd%@%QYgF%$n zjwcEi0QSEDYD*-^Fx@rz`b8H($+TFcM^Q&I96_#Xx zNh-ox2teHtow>LxHkl?A1qTo6g%*Akz)Zj{K|;oYL(*A-v1=rrA>yTsGTzLYAQ@Kb zNotFHj&XEiA^WH160fGMR8I8RdIdBZL?dK zR9YNQO@w-I%y!JBP1U)s(qAQg2OI4s>km`fi^=Ezcb|J^Pd7M6xJ!o&@}DiSadNx9 zdUoIfRJRo2GK~;UTp3S;y23O~#5OMu2fw-uH}iP(%ZrP2AKmS^U0%AGMf7?(EanzO zTdtz^a)JADPo76-5B9*ne%B`X^$~}ryPJ*Oj&#wKrrB= zu%hT%9VVdpc@C#2o) zaz;<#LdEoPzKFYSYAK7Kv@!#uy#mu+FZBe;l?9@avPpHU1(Xg<$8OEMDnJ7!gnBi%{)n=*6 zGo8<-C^B260a%Tdug zmD5Z2Jw{YpWB?!DHv!2}NaSOnlVeG;{Sx_L79jb+ay3Ak)YFy=T2lJynALQ-OgRB(e)d^Zg2{*9Hj`p(1iH^dGR+cwMFT2x%) zauI`xtH>e%ux-AauOyx-5QN?6@o&mPK7vB_bfm8+B!I zIFu{svA@E^%wQ160x=hLiAaaIh^Y7>!Up0;<$bRaOGu(wW{o@#%ZzAAajr*|i9z6q z%X$s#W}9JEHMiB{hLmJx4XY_=u3`|&{3LBQB{HxMOxTrRBa1nVcZ7(T`)W{uZhlZX zthOxMvdH2lakzksEO6UI^4^_-EFqHt0#V~#d6~?G#yGNSXA!6Zrtl?psl@#_;wrwH z0cN@c=m1sfn}$e+X+_*!GloJjb(h$;5}_K8n2p0XipmJGJCt{8Ld4snhB$Ol6>)QS zx6J5?O<*?~Dv~Bk;9Kyawy2Q*D|R5hz}0E9OjXB^5A&_wZ$ZNRaX?k>!w{lfN81bi zyk)*z{j{fPOiv64V;@{$)MyJ+a)U;Yp%jhpaG1Z+uxynykh5a}Li;|BnJcOY|37KN zSBOSF`W0pz&%0nWBxzOt2=+C%dotAIa||Bl)4)i^e5e#TR32)a#O?7n&m`>xmYR9 zTB6`+$$APDj|FcQ#DZ=^n{5@?Xh3kb+&vGYHRCjFbMnqTK5l zHYmv)0_xPEc|>;3-V-E3$Ed@^#G}mAxuKSY=Q+oS17RdHU3gRG@QepD6p?s8jdF@z zV<}QDdWgLjEt1RJS*k~hH8u7>da3$Zx+1-5Md88av)=RJkIY5sADaCJOT6#9`_W1f zO7baU_!x)msOkLQ{XTYm4b-E_vUB;y?D^~HWD>dKA}Nr?_tC)ab&6i4uS;mXG*k0C zxaoi>A+=JakEABdbR6edHe%DR7@)jCCr!tyc?!@J=ll!l&7qW`CsiLgQTN`*Yr{-Y zMaG_qMwY=$v~I>~%$cUWL*y)mnF9#BaUgwbk^wNa`lW@k|6aZp38|F_I>?qfr3YF= zcWN8y&guaQSs)KsXfV`eFT)Hv6bo_S9Hq0*Xr|V^ZKORK{@q}+?>$2wn;vDqXn3bTu}Q7k84bQ6^WT*Orl(uapc3X9#j?M#(Y=G+l5jaZ^~Dj0^{N#EiHVUUItrVcG|5RRXnb}Ow4_R)%-uk_40qY;2; z&kP+`5N@1k1#@48&1a-AkDUVB4FE&!GtCx#K zijzyX4iG7M8F)1TXqvT?GG}5?ygkM(g@=Q_!;L6an^uli7=%fWnxzkS814*p1W$S$ z`2c_dGeE1tUokss(;n=4Bvdu5in6IP^(Gsn|!kQB9Rwf-;kl!VLacK>8 zq)0|9kmppxMHf|tAEBXbXqSmn;GAU1qsj>Nk*=qQuCFbA$DFO-#*0Mm|g7oIRgN-f)HC^p*5c zEwu`wW}pJ9m8=)rz2u^5O*2`dM#9l@_QP?D)+!1Yz7f5h6sy9P$yV*sa-JnDl;MTmx=-u#uX&iRB{3-sh-6lDMz~{;3{xBK3e7) z`S>++K){G>G8NLaU`$~jrj$`=SL&L|z9cuPP#S(^Zzk$8PEs@D!Q((*tr5eGapwLd-poVClvio zJ7Fiw(}wRqrpR~!TP-GoT#<6*G(owdq!rM$EXr7{jsbJIh3zy-=lBQrgO8yq>qafc z?!(%rYCicRm1nhv#G5@8&X@;1*aQ)>U;c1T!|^8ow%N9w?pCO6X0~qONvevN`{HtR zbyZc5;t=2H)9r~w**8pj4P#}dVofSVu0A+}*N z**04(Odr{t8ze+G%SsRf6V@VTzM4a1GgxdLSD<%rCAz7I#>u9Os`w(Jf$=0H2ZOCX29Abd>6khS^NSG0hn4S{9#?526hN7WaFt~8kiqfmGtyS;&3>ePN$Kx1^~@U z@MMoH<0prw#wx|brkU>Obe||qTXBgRJ$D=Ro;gu6SE^UdP20+M2M^I&+|hATRrX)8 zR5^dy8zg7T!RMP^xxzxmv!>?Yf_;a%S}3ewUt=j4dOzzM)z^;4b2x!-aToK%t_)l_ z9fJ_pr4qe@Uav&{s>dhxipp}hxOsk^XE4F-#!g-7b8*tbHc;*rNy_Dp70c0HW}xe3cAo4W@P+^l(f`RHqQMvseD%f<)N* zYlkNsyuw0SOR%hu_AyQHgrB4@5xd&7K-(&S9<$9MYD$G`RWYB1lI zdSWo1KHI3}26&08^>?F=U!(?G)#dam8!36GqG2K`rG_ zPNXVLB96q5R?dn!fPB_fGGEwH<*cLpDb|yLtzw~>8xW?Xcit^EI)%_{ z)vE-QsbCQv16J4Er|;pvcY75_~xRni!8vhEWn}? zRVVJIX1?)iRR<#-?yF(53{r#=6oom=Wb@eXgAKlIxoFXS7!(nUIjBUT1*t)NQ56@3t7CIGHiyQxq`}&P2!8;J zERJyMY;i-_-;!1hTs-ViarH&T9loT!keMf8rFT`;2|SF0MVSZ5I9MWIS(aX65=LJ; zn<;9H9XTL63SIzT7>kT6Wg-@2v|IuT*ejB89MURy7zZsLjrkZRL5Y8jvD7pOTKR1& z2BJl&>O_KkpI>B$4Q$hzDKDQMMG2z{nVfe$lT>%W0i)mveOdtyMFhi-Esm0O?<0Rd+ePB>8&uORhwGJ)SG4=Yi zH6Ea6eQP`Cw3K6-RsHh(scf?ne;MD8Prc;lU+xT}e(-@8&H;vgZGY)CToj6o21z~s zrNGEV#6Z!W-I*Js6={QA94}9Ix2N0NY5F{1X0dICZO1ki@>{VhE#{;|8G?x+BZOQ? zEPT;90ot;tX-JbSjW&~nanOp{;m@A(sj6vkg*F8(p!f=KS1%tqyn5nSu1MRq@k=l) zJ;1mCz-tnrnQ9fCH`~MLqYU|t!7LIhl^`Gj4uVRIY~p^{?ry1148U?rF3nPy@*YVH9{p`UD1jshY}4$et#iLe`!Y-PJ%tJ&xk{Ftg3$WG5Qz`Fw zS;Z|=TUF&E%OW0`I%D8w%Qr=1%XQ**S89oHgJo-RNi)c|q=8tGg^EEm7|1q9x-?rR z-9!M{w%B*uRmK7<9x-gN*hw7`C5NaZ3%6zp@S+aRxGBV079E|TnWqr?4&J&4iV!XB3<~|h}q+$ zz&DSRU=>Hs2w)f5#1Ob)uN0U}5^~YJMRxy5_nO)lTtm(=QDQ_)YYbh0U4{aOFuNJ) zxqM!*QyU}pvDjoErksy!R!_L+HwoJvYGB%tb6t4~)x8CBiYv7@kBM z0vB}^Q$Q7hJb_cy1R6KxYBEujeQc5Gi5_ipwgwSdOt!d$RTjbVsLLX8$zw$9w{45_ zH0kUm;nvN}Y<2UfY{?o-nEC2%D>jpLgBi@sTsE)GK;qz0tSX|=1-i%~B0h0I$%3Om zmCWmA201|v>Jaq<;_%NXwOka-0#`#8Y`{bBrVz#HUT$u%;+xq2Dw4Gy#p=K&=I{+} zyhue51vbK>8d+gj#tj#78mf!KH`ap0Em5{8mQc`(tBWE7LwWjZRJ8Gynh=S)H(APj zMjcrIZ9tO0mdC&=tt1s0hD_EZ8hn8Oun5?|!N8RY%r|urm}8?Mw^!Wtv$Xms!=iMG zl(?ehtTDw)Gg9C}ztD?ltp?9?26}xO2+o9mfVt!dhe8=TARB44K{=qH8rmbtXrC5z zMQ4&xC;(}Rm0{j5R&aY)+ztXA2?at>`|LfN{zj_tRw5|iD1fDJ7Qfe&ojBt_To}Y+ z2((cW$Xyimv49+hs)8pknEQ6`Ox*YR2v9ChP}Aq|T8pGpmAV6i1=<{G)s@iY$fwH$ z+S4#YTBmire*XN?qequlmz!-^!KhLBXSLQzGlanoctak!LLeT;ByonJbQx);DURl- zQAwm_BoTEey!8a_t@<`SRq{l|!l=$tiT0Y$9M07JJEJ}=r0O@s(a!|#J}Ah&@6Svg z?50!lhCNl-Oob4}aUeCqF^Be$xQnoj|A3X|T?XwkY$1?kImoiy-QC{aJa@7^hf{Jx z;23;avj~3KNjll4NjPlDGW*HB`GV}0Aq8UxhB1zNi#oOkkDm66(V`;&qvVLwyh6ET z_nY@c=(+65J$m4{%h(33KuJ8w^Sn5)0%4M*jQ=&*cm!sN{%yE6?Ja{ZwX)U_Ex^Io zQy%Xg2Kw~3(niWCx=5aH!KH5KE%EcATVs;SkTOKX;4tnejjv)nQY+VyFwHGeaf{tv z8p@JwHVN0lk$J3?^(cVxRJsJ7+)tmwNX|0I0*QP3T)a;mMH)X!)}XCPUCe+0;jdEW zC6GgfQB4`I=Hq-TXcV+}1JvEJ8YqS-a9AFg?`CFN9-)}~R(>++MT~9xxIbQ2S__lp z!#fEWf0eVZfb#p!n(jX6=|A{k+(n9uY6=b-HlwrMyL`CR%?x`JhIZBz?TOtuCqDKM zsRauiibtn8!g5REhm1$Sa6?IQv?Y|OPMn3yN?;%rMn)VZZasnBYEs?OJSiCiI(hBg z!tf^1{32X2QdOL8{m08c(j77He5`JI^0N?_TOh z3gcLK!eu=VYHH4+W|yMk-LDr~@79#uH`!CbpO ztAe2l_R96DwJg}>bc-u;y&ENyV;i5!FsOg-ku;f&TszmN*<)}+QAyYvmHfznj1C0w z-E3<)@^ShhUKkW2oBf1_6DO%E8S5-8MU9W0r0I} zL5^H3q_l`{wuwY8UQ|g5qHZDv3^x%|=msD!iBWSAQJ9FS15r(%F(hooUVy7C0*_rrtXdfrU}<+}K2BQ? zXd9CG3A1r2pdiAuUuV8#;A4Z81xvYZNiINWP$0wlM4th>1sohUAu=Ukrx}o zKEb1O+j#(_eT#5yh!|+e>b0E_NkM;_-fhRpl$#!h zXX8`)Us)oG)lUUonGS8~bm3{|{Mh*ei6LXB(DZ zg@${0d-MEsy5)u6UR{l0)vqO;9g-M`G$3pLLao+_#C42>f<^?|kGk^;>B7gK8cF#> zyjx8A;3`Cak{IRW3W#J0LmoZm4!F@0opo*z=8eN|G`6%<;-Y27hn*V#F(&8pPLmNT zHbl_MourN&_c^u*o+R5b5sQ4xs@fK%U7OJvO_fZEQ)ZUA&LHO;G% zGL_*R0^qm=Dr)Y+B8{X`*hKl82r~T<@#R<|*ReSHIE#pe3YCn0&8<*nU`W^gBL$o|CwO!x z2>6U3#j3!oe6R3+fc99bG9lsRj$;zGHtt)bd^*cUQAeZ9AzU)Q!_xWLburnqUtz9 zyIzE@)lMuyG_3xQDG?$Nf;`xV>*ItD)h0O4SA;% zt3tijQPh%UcFn~p5T*Awg*t#q>vyUD1q%rzyxi2D+k)IVX=X$gwBGPt2P&~cK`bp~ z*oG}q^)x(k9L5=dY}9VW0>!r3a?sc~p_FBjP|KOj$=X9f?sJWVzhDW+*F!g^S)ig= z024W=yQ>;hP1P4cCL$13BEpk7MKaqjajuBPmJrM0hJd-%%xqgXv)tKf5#Bd*_`0TD z8_}Jp^;i~-EjrO|sZYg{#sy?KNLm^P#jBGSe(Lw2DkuZhTBv8DCk~3ukSL+VU)yV>Pm#1ounPSEiURNv6*M&EL%^@Fc$Vw z-?n`JN;KzR##rm&VN?zo&*wY9k^7;Dwax~aifBVZI#x0x^%V%H&g9HgYWnV87r<>A zenRk~Eg=qLK-LEs#n3Iy#wJEYV+xImaG{0=`AXrYMbLwf2#8rR?0zi!LGOJtUg3&Oe&gA#7|--8XOovEOo348#WT?1AJcnG z^Y=G#dO|5eVCJE(1)`#rpcodP=i_w03SiUM82(70bG+c?iA+1B#<54L-6T*R$*^WX zP?RyQt_V`bB|_`R(|Vs&{E!*apmDm$o{B5>&E-*4IZi3(E8teOt|ifo^Ld#bA>f{X zAwcY%ftM#t$Ata@%2>P0vt-DM*+%U8R^ti6kXQeCQS;AhDPPW z7)#$u#^cm_-yF8NC`1=TktgHGk(8LjeKrO3Wvt?^Gi@>y`S+^07UAC|yk`Sdhl>-tQwiZ#R%9x~d zr<)O7NZybbijxwU(~VohJqm&0+lKTHEZ*HA^0w9CsqIR31z|n8*Dz?|u5~G4nC@u2 zI)eV)$XGYxm($8oRQiTW8WZBQF3r&M9C#Gj= zq)pid_<4)w0)Y)k_+pyEV=DN7LN;ZAtGW`7%6Hr$2=nz2rkkE;x2A3 zCK9l!%G)(<{z%|PvN ztiOuLSo0DNmJ5j7W3_C(q-%#p^1u`KBU5KjG{J@#0dlrZJ=-y&^b9zVvfuju$!f7Q z+-t?RM>=u_#0CZ1pFvdyqzP3B>U-WUAng$o-J%NZK0%9uky)2O`QqhD*rE(5&^E20 zgcN3UtuCFvw7@lPu}gnJV~0s--u5$g!d(i&`zv~IlsRL*!O^4w4sG8RKUHB2%C4Y68<3B+b#kSQNFcUwhpSa7^pE-x=GWRZpU&2aF9ccL_tj?${!>2Idi z9E2ajP3qK58#Vf@hKWtIxl+NH2Qm@?NuiOhsv&kNzgFD4yL>60&+^@|=Zx1Tr4J8A z&KCfzZzM>SgC`3BzYsTHZr`@;^vX+5sd`*g%;m5s+~q?bR2EkvOkRPx^KcSBownPX z+nd{yZ5t3(IhvY&Pq~Z)-ec>W_yek{9~#Ipt*n~*BwZDQ^7(qEErwj6UI9`NY5&d9 zG_ay90DiOcUm~X};wB;AR`THebA6-jGqXNE%Xt7OU6^s~;XRK3Mx zJCgcPv&G`XGn}Q~$k@ZlFIcKxq+qmhn8shV-{#Y9&3B7~nit=0dv3m*RRqE9=4Swt z1Ks6d4BqGe}n|bUdLlap5vmD4Jwccv%-*+&zEyz4s0m zR~z)sPG+i?2g$U`-p&#+kE7djdSr9r3(|T908v#4B%S!Eat&rw7B-fVQQb%e^i>wP znn2-D2o@~RLmUKafW@7!5&@4j&ipWes6td-M3zNVb4f#-)ifGD`h^IY3jiT`o+x3JUT?pxdJ9`&7pgG;vUivp_R4l%JfRn@Yn zgXs|zcf&;iC`3JVp+dSj3*&el~4QN-X}qXPsx}^Kf?z0Jbl(9fIP|?e!f8W9-qG~ za{kSJcsQF509l4T{or`|rm%o!HJNA^)M>k1t3rHZ~}CFlawQH`K-Y$yWS66A15^W&>v+k zmywE`+oYrrrim4?UX1Gyo8jAfQk6$n%j2u%>f%C|P`YOB=9cPS;BHE3W1=PdQYbAA zm)xJ4$*&liSsW86nAP>g75TjZbr5P{C(JD`a-k)lQT&t0&AA}PDJ=LDN0g5^AkI)A z*M4xqjOM}J5cdFin(e_tR_=DVSb0TOw4iE^n`dtB%M!a?%4mVv2FKOqRjm*=bGsud zeX;1`SH3-YeA>3#o4f1l>)X4NZ(CZWsgF}2NO($&%vr=g?XmK^@m_v8jEUwy{`qVX zrnyjPTvjH!=kZ8uJFoAnmzlWbFub<|a8k|N?MjxZF;RnF+Z=oib)Nz$^(4(>6=IMv z^Eu`n(aJ~(JA$quQNK8RRMZV44k&Y{XuJ#V6mokg8|;56r3tLXTHxG#sRr6jMM#D&@Qt?OxLsWNQPQN6$ld z4piiXs;|I?D#YNG3EdGlr`D!eIULzXHY z+e|!D5VDu*f`o4G%rQ9A>Gjv-yv`HU8aI;ocn-aq8HMl3kh6;K3Mpp@ayPIMH!M`x zM-tn$FX)juqJVWoGAb4Lcr{41MM1*0x-1!-FAZ*Ru-x3-09i!fd3vZr;(YVXBCQxF zI^~HG5}tb8unKpD1MA6GgNv!?@p!P)>Vn5t7k2afsLSI=my7tit>5s{#Rot9`oH_v ze&uV=?*8?E>bL6p=#8(wEvk2mzPGM7uBOT(+e^M<4GifydIel!DpYS26VY6dOy8xu z4Uq^QhN2eg>s>T8jE^kL6p3_AoDwD~YJtWn(r$9$uuU^`3z0nIG-@Rd%^yJ9sYI7v z*y2NT$W|4V3S_#pmVV10<9^8;ZKkEf;*d7#Vwlv#;>eT=62L`}9nkw_2;9oR5dPHJ zu{^Rw9oWn_gJ)bLpd&+lB3a)nX*ncK35R^hp@gnz!n63M4KJEnK`W@|NhOR5N8rOX z%V>~@k!jq^+dWI zj8!ZkS220G&4DIhX-Vv@Pz-eKQRb733AKWAYM}%XZ=NJIss^l$8FKdw{s!r3&Q$5g zPOY`Z?f8n2q|^XGs*X>cuf)!Sgj6U%f;}=aI2QW-Ka+G)212RB@__?t?tpr+)MMvv#tr<|c4M;+)JbF}90>?F^eT2Ke_qQ~MbO&zNo3 z%-LV}L-O}~SLR61+PmLyG4uP38;`1Da!n8OOytD;sg@m9M10yNG-5Wjp43QaNkFJ)dk1iiQI*M=G zw%y&V>$+{Wxx;+x)f$}9lPCRU$J1UTe;{7WJY=$^M2e1n1y2_#DedZTnH+^-_Xftx zfZdc$X?_aZjyf-s3uja!_-w9eXW&chXZc>@anf7Z3W_)(p+Y%6>K2>=VEK@BQshIrKw6 zdGXKuo^SuoZ~MTz?>v9^cD*|Jd)w&-htX5qZ%zYtlc5$0y1m zBVZ%unIG}E;4fl|fW%27x9oNGoI zKRnb7r!dy^O#b(I#(flHzUxs2=H2E4pL>hiB1vTF^~B_f`*y)^-h4K34h^Z29%##V zKZXc-0xD)p^Ev6cW}7XNGi=CgMT4q0g9HszLLMfZQ-E_%qgO3qM#`IXK9Q@~hlzpk zTx>39u(VemC45|AkW@x{4hRfcBM);^ru+)*MBs7E>TW6%Oy!W#nGosw+iy@5^g_!z zb~u%M(<&ck=|@u5-4?|QPp)2gdZA`_cei(Ur*+*nt3%jQ?%h2M7k79b6wmZ5hz;Fe zQ`&o|1$Dyp-^JlFB<YA1^$5`d8^b9kCIim6>b)i!g+bWQ|(@7wQeY8{1BPFkRqr!+-;Bt1oV{8Qfr= z#~H!1mT)F-Jpee+^7@XW%D7enF!^C#Q({u-5cmJaK9W@BV9>9Q9)kwm~JuBSPC8 zJES5}(sLH-tYjTNvF}uh#|B!ZhN)r@Eszw#cSQ+OUXv5ar^6CT(1&~4YO#B%;zyl! zm?+LjL~3;}cA;q4;A&KPK(0pSP{%Y@Q2 zulNE@=dtcNR|{rz##8ckCK-?U{-sX9Z~=#{B(ymz2vsH?RdH$ZI%QVQ$yd!c)VDb} zgFCb{Xko2mrdL!QrPBhGvV=ta!I?^R0vwTjyhD8ma= z97G^>E@ysGdL*CXl|W!+YFd(!Ot2)eZO5a${LyZD)uZp(60R}n1HSWC)CDD>O0 zXxT_Sl{hJglpt9r^<`T)D6roZ4q*S^0OmLjx2c#zAc7Dn3x%rV&|NF1c(5qjS z38r%PK+04mnHYo)O0%`n8c{+5r8xk#?Inyc>32Nw%MHA!-k= zJKcfOj+uo?jeK=Ss3Ej9+2*~0gDMbF$f6eKdJ;9_IY(SFg7{9u*~q1K$)oK1cosL0 zSc#oXVXwY$xKsIwU;Ww(y8P4M`{GNFFaP?lzxDt8*)RXhYT$a8sW>6nO*UQaF zcf^t0?m$!~c*fQ(w*4wvuSgWiN@`#RucV+!sn+q1)LgGvBb%t$Vf}X z3Lp-v3&#tX;%p=yCF9ANQFBD_?T{aRWfh3k(cuxk^n%$qLp^JgJ$`Y`gVh~?!eZalN-f9aaus8MHymX zaJW{dR3(cat1>n zqR=jQB5t-h{}>ReWt@P~rLGogYfiP|;fTsYMrR2Dau1--C`Gg{*%;FzQR?+%qPl>U zvEwOqk;|ybpbkOKh;gRlss;KG%;lq9vYbpA@&w-|I2Z)XyVGz8H6xOz(eL4P5Qlog zjazgA=?malaTgGXRG!<#QD1xM@#Td+fByXT_O|X=@z5mjO1Q+7gB8+xiGifJ)(En7 zXZ4zo;uId7lzcgnG`TGb?Yd5lpcEB&GDlHB>7g_X2)u@f!BPZW#4A@QJfwqt7Bxo@ zTr$<+P0CD2mZFL>bygEGjf8=Ka2kuC36tj=v_31E5`kSHaZ*@;>AJ4(zPDXnTs(RF z2=dAsZ@d{-^bKgK2{p#e|BOU8#k~$kpnxy{G)f=Hpj}tG2f|tbucxJj*>_K}+o_d@ z?(jON1LN2JI;m&VNeO8f*YSo*n!%zTcZmW&CbZ& zGYU5-FxLKzGM<^!p=q-@8G|fMTB#v=z>|q2u^J-*K5I;;yEcNJdD5*RJ?g0UJaM+bLA$p6XNY^hX61x< zZ5{WlBC`5jxE2pY`q(!k2U5HzJE8272e{e!%Tut5VuhU2WTm7J*&E5LbE8XkvFiAv z0|UYMqH`rWDOHQUBk#RrRnQP={IeMng@#i&N<;IbnP!h9)SNs=FP<{WDmkyb$`<2- zOabCnSWy?*LP`v9t7MQBPDvUesTk^Tad$UYNdwC^6ZaP`mq(YEUwH5Kr#|z>-}>CU zPZqp%^^G5V>FVG9+h6+R8|&*&FSomsz+QQxr`zpvkryBN>CTo5y}Vf51vo5+WzmCe z5W!LGqpw{)J;)c{dG|m4+3TPArR4{{<;Cy&(35X@>G(}A9Pd_p_q5%Z-)?Z1)3%+= z7MQ@*Hai)BI6~D#)Zm8&akfUP^o-SrhqBzlM--=YvGl^-`_`1S0c?nqK*Ws~)>4K= zMe}a7QsY3LFq~gd6}kfp9I(8FB%%@S?lAWSZeHF#xx?Y!@fHG^l9(ZJr|T zZixLM5;m2pz$9JSO)GH~I?)B&=2;S>y2O!X2^Fpa$+8tQ-?pHR1`({RuV{#v9!l38 z@raw`eWAvX&BRrSImDt-c?rZ_oH<^Hq`MsR&Krvo<>(CW6wpp!Co;~zj$b7=)0FMi zuwUj2|DF13>=|!+r03`zg`mWv5SQTzzU_p8adHD~R1_j%C-AIlpvCNUcu*eVTfErQ z2#{-*^6EIjMaI&cd!L@8!T_{9!flrk&5&u`iCx_@i^kcrL3a#u52arjRb&KQc314C z2{BNgN+jY#W4q89V8{R4+%2+(Pi z`W}8ZcnroZ`ck7zVL%%bUh7#xI81$xr?9bxFl?p%q=3lzANX*E8L{n1F~QKMCD*ia z#5Lx^2So&;3-Z)tf*~2y&u!D)%=w8ud+r_=j|pUkWNO%Kw8BS@lvE7xVJ5L8IK+4t zrOHryAscx=g;oGpWkq8~p-GvE=+p=)y{uC^gud3jj7E;btxw7a71K_dRq{?)WvDnX zHGAI{l~-PRa&eUF>+9RwQ!TJjNm%Pnf@gIhy?Cx~#OxV zUMdv?Nb&VfO2a&=ldb&r_T*+yo;>kaUVh{2Z&s61Ji%W&=-HaOo4xn%0KkNSU5x+( z2R<9!O@D&u)Mt_tbpWcobf9%4NYUL02HDR?jatWQL3-LSfr#j`sE+Eg0|;R=$XP?FaPa#Mx7I!EcdnL$N9UB{k{ag&!XIk&q2x*vg$k~$ zuo94nn&qt7&bc*Y)px z_U)hj+_Nvf^WJgMljvXg*{@%yy|FGIe);jyS6hw_xY^~!;&9)#%`aa)IjV}t$*vBE zmk$D4pWWQurRn2v*;MtQvMh1%!vSy;Ms75!K-&uJ?0jmnw8A2d9;cWvRFN$2!qYb) zi@`(|6?0kSpn!zc0aQwX-Fb43D_nxqFqnxTt5M+*7FZ+`8sbhQto61X7gcIdAgZz) z++ntDt6Q8hs_N!$wp4mT;(U!PywtqrhCG*1iwG#hh!M)YF7YsTx2-H8v<;JGvYG{7 zan48tkBn5z>t5U(X4ZT!>CUSJ6AB>EOti$7AYojaL53KSW`4|QRsoJ!B#G;Mc>2Qw zB8utGaK=P}LNYHMF*7d%R$4_5{Ebk&(iNZxl?G#db!ihXG$@RiZgZ}5#VLq%85p0M z78RnMy2W>3mY!{&0F`_zQ$Pq}o{Dx_Ak%V7-L~_Zm^o~%klw9KwnYFp# zn-oREq2idLF3YXPBkf2{?I(G6l2Tsb9#!_*BWo?fbuR6K2S4Szavm`$QX8{$lq1Dh zy)%tcA&U$+2)KW~XjD_pBMsEagAn*05Z z`hCews4C*V*=dCwWH~@p#+?~bB#ps%&1$ej2S!Q^nw%vBS-x;KB+dfx0HIdB!2&95 zge&EpPMn#w#GdBPokW7QFH(wH3R?EkD+Cm-ISTH5PH0S_E76SO*%4iKYgh4=>ZyoU z0_7uLE5dmup?J^Bpvc|?2lkVXc`ywW(a-J9PuHT0EC&YE`drcRu8be{^B5#{#DNcs zF3UYMEU@LH(tt~Mo}wZT?TwBHEp_xBArrmov>q@dpK<#P^Ry=thL$@-<7T(Aut&U`t`V9d`GYga--@dEOlF!T6C?G` zMBLW}Cx( z-fOn65*(8sYC|R;ru^1fGQvw;e2g7~*?MlwW)0YOFrCWW)tRGDrYYB>6FJGnGB6sCm9ONiy|RlB8Y%W<8P<)!9cRRL+Jxn2Q3?e$rB8n?g-@owT86t zh9QJ(Yy>B1xDErhuxUtCabGh@cGUqgbeN@lwh5p;zB2%6dhdG!7b91(z*5Sx$-z_6 zRB}6hwLz(hfDVQQ;vB&GdTIq>nN7udxuy=#33HlU=eeUKZoS7;jhn~S8=f@*d9;_; z38o@(lQ ze7yK}x=Xput6L$69g7N)#TO0HfhzU4>bsl#@>gyTFKxf&rOOY!c=ee#Z$9zWn_qqN z?(xB2zg%9pJU%`G+xGY%A9*4_@cPwh1?4OjnWJa0a-T@h@}Bnn`Mwi7ICm>I8O?wEaECAqEOLA zXqT$T-X{@>>*vD)Fn1C2i1&yG4-<7x37 zW;X(N3~-}tM>r>WO;XDg6r^qCv@|lM2mU&yq^y}pGz_&CTA-lG#{kJ-h2G`FRJ6bg z$%!NJdZf5nz|x+NcO-}NcWUPuiUjym~=66Zsplhbu|!63}WT0Wkmd+(s5tsLM*E=Uk>uERu>tWxMg4H|*KxaQC(x zE}#mJ%_R5oeLMQiu|ojSNSXi;&7;KkQ|!GhGwzx^Kj2H_K+np%D^0AlTDf-t6OsUl~>afCEvCsGJUe&$}(cp{V$`Gi?Ae0Nl2xFI+u+bbS8& z`tI&zaD!`U-BKnwCS?r45y6)tzt^;aTUanNf)QtyXmV5`%YIQgn+lPRopOTlhwi%A zGA5_ee;f(PkmiPo((x6VH_{)}T4~M5K*8Sc)TJ7zK8U2kOxf8|r1?gLO3a552eV4V=#W zwfarXTBHP{V%{$j-C*XjWo;?2G)2k;3J&3#8$#34h zeg4Mv-8*jstKfL?=<)ID%G|bX1?c`4me7)thU=nB`%kot3L5KLAE3o^&~E=J5TzCK z&_g&U$j-+s>X5sM8D&DBQ&VJT-tBuSqk%1_{V>=N`+vN2Y_@(LUEQ~@!sjboL7I*b zP4=Dqze71Zz#$=OX-u?|BAJG<(?8^_Mi3(xQ!27Q$jdZNE~YW&N@YE?cfQqz&cmcQ zBl81t+3qE%<9DB-ZNnJcsX+G!h;=@e=vjAP#DAwaBo`#3C$Qa%Adg5lZOj@;W!h-n zS9m9BMR%_tUS??2Nl&MtKP?T1>`e*)-W84aKAdhWkOStnx~Z#~2|fHR%0r?hb%nyk z)@@P0x;U;YZf@7(L0)=vd~|v7>~{P3SKs@@m*4sIuf2PHXHPEV>0#N--CW!sT|i}V zGZnb#x~}S)zO%)Zx31!c!=lIoAgGEqRhPr^g}dXsUs=C%z5SLax8L)!zVi6;=e~6M z)SL459sJE}T^yUK*dsap^yd!W|LUV3`taiqJvqL7p(b*7P+VNz-JMSB=D=#=Sk0gZ zsOxf&MZ{K|>~v5)YGfQtoPm$r=-TnLv@t`o(OOwVV8Ehbu`c0_#w95tF2btOihMZ4 z!Zm@rimSW3Wfgrl-hXD(PwvdlCBb_R`;Sd+zXxTMJY`^ZPmXxl&Aw-A5c|sc9$_XeQBkoZvaUck+Q#-cNtd4&_P6#B9b5 zcFL$>vfNM4Oo12Oog#!~(PdH9%zacUuEw+bVT^zJCjF;jPK*V}5W|S#1HD2IeViJC zL~aYLoe;)%sKnL6uBnzwPXl^Vp}&H zUY1wC8!vnadIe}4E;SBQrPChBoPm#`u@74F7ph-{lo%6PYMFktA~b?2Gx8#Z{dRD@rU%uN9^mL^y|+rDtUPM zSl3Af*&|=3QCNQ|a1j&5q5}r0eEpn3D^yWn!KOPfIuez}_(#KHNmyD76)ve{kv&K68TrgZ)qOywEeCn=$>qA5Da$k(i-4_)xlyWj{MFmc9ns> zyl{|&sI??W&~P8|BC_mI4y7bhL0W}!3Z=b7FkWWD8iI@sG5$D0^*Pw#C3>khPBGV< zXU7fk5qW-dcX@Gq`K1@X`n5Nv`&RIOPm|W$GU6##Ybga;vn2>dssdcq7(;zQIu~Ej zovptHCZ%q5w$5S9YzPg4i6Nwh*8`GiQ(2aSE{D_e=g+U-!_~#>-~W+s`PhfP<-0%p zp>O~2s~>pz(F>PRdtmE&{p|WHpMT>EpZenGe)aR8{p1(k{=rGGfKk@$+J>3YL)AO@&HXN#l?bR9ffzAj=>C$1zGCAkesJC=J76S-Sfv zQV$gi04XWbUFC^;G!lY`M+B2Xo(S6*HNYWamv z+#!h`lmpa{fvaQgMWr5HxR_*{vP3H})N4J!YKKDO?@~rhTy`3FwYyEM%k55!ImFFZ zUthdho;-T|e8tO;^yN$09B)5g|Na->`}r@u^BZrzdwsV)I_T?94rXSSWB}aU+%{bn zGnlQ%1rqg2+$`bl8&q9XTo-j704X91u*inv@$K#EXWv{u`{vEJyo@Io_~^^a%?V$B z*DfxWe(n17nd|Gn|MuxSU%33}Ygad`efeGc?vK9q`#<*baarInS@aMo zCY;=F*X{1^^z`!h;wvv)zjuAQIf;l$UK0a1-#m15ZBdjoN<%BfFd?a<;!0Xo$Rcs~ zNzz|++~i|fNFwgSYi1GGs2Eo?y3;^|jExH5+JU-CxJ%Gl#U%nsIilFmagc+11=XTc zzzuQGshOAu#bYZmV>W;Qi^xH+sHj3!4+ktu(uQC~W5C@#wo{rhM{DMrVY4XrFxxC^ zi;@djeUdz>o*-W;NCoPZ#F5+uWTGlIa5ze(LK%o=?kcT@3N;RN$h92kQkd!#oLYwg zkTYbFmd}}hc?JZefX6F@4eBF`Ml_kjX?04Rq{YN2Gs71BeXygoJ;v<6Q-&?Mb?mgC z48{~4h@UyHQW=HXiE24mdg?Cd+c{Nu!vSYXiVCk0^|Bp2LSzgpmS%7FcxP>M5j|a; z!nPt>M6IG*A2eiOVIXeEH#c-m|2FS`pp~K;7^6{ zl;9OZaQfcN>)VQpR}UZfZT9FJZN2r=d*BP+>C+BQdBRZQkpNK&GUHzY)ZK9bwZwv% z@F-HD67B{_UYS`#+@IJKp_-XiO84Tg$w zS9fs|Lfda;9XrOYb~bUaBWZc&C@m25_?ca6$&Jr`wTQ3{1 zpX{hst*(_j8yn1)GIW*6y!{{OD` zsI$@Kc(l8__uhK@;`JAQ_yCeXZNHEF$PfJ3_kHZQf7^$@{R6MQ`t4on9K7NocK z23Qs|kZq?d8M7bgbnoLRJgLyh0}t0IXC$dYBr*2}YRaB>#Dc~)$2qXR0@c{jz5m?5 z#)g9)0Xyr^RYgAP$$n)=&Hdca!%Mp;XSknJy&z|8@Yf-YXF8g*c^|3vgfVUc926NH z*KWJQywpQ3Wx2KKLTIfjJ+^`o)g}CvvTyBGS*;{y0|UpSr4XxYA86dK_PlrSBhx0V zAvc@IIO79wU=vXjVA<^S$`f5KFaO4;-~6?&+Cob zP4w=l%PRWi)A8$HzLmSv>#rTY@rC2<&GzPVe|)uEs$jEAmB&vXZK7Yewa;CzPu{w| zGk^EF{ldFnxwiH7E4jQlitE+m!*Mx0esp+xvAlFC-~8Iu8@KW|fBEa*_L{tYdAhzf zb6JENcg+E3DR%qMA`-Xgs;b1P0HTYC3RFcFNF0?Rw8YD1^(w12*?$?;3K`{yY@~>a zTAX`Y2?g27a~!iO5wJnWK3sr2TvZ)z)tx&$N_ZT$!AxvpEjb{XTLnaXQ8_Nq1A{RF ziJKNwAZ8A8xWHj%7Mq~V-5r~|dtULfIo!qEw+OYkt!AmnbH_+19gnMq;O?@BMEQn7 zB`!~PKvkSq%epRtE%a67ghG%s6-ZbmQTgKOX^$MG?o2rfXIYGUdD@9f*dm3C1#RN*p<~y`M7A(d4wopU(7NS6K*i9TgEcGXQdmmHHdHoNdW?u!md5%BWJ!_30`f zL9GS{IpCy>{bU9bnWW1IMYHj4;{0i-tzNHClvAtotzdhz6?(P2`Y}BIfZe?#4$)(_ zD*nKnrQ8`d=*Tn5#_cJnKx*Yz@V}y~Usvo(G=OQV9L|#B@7C=RG zOk$&|^!o#`b5d!__8JIUS_fiNP@F*qfzS{t`>hS>5ZdX#XQ~>ip=_u7y zfl5a6JX;my8RQ&U2YbujjPWkZ^5oIQdb&NWW*O-n0F&XZ-n9V{PR-{`iVq5YgVG~6 z1E+ziWYG#J#X?XM?Bf5<1Y&AYht-x7A~m;#H;0iDMm1H?>6D1(mDb-BWJSwr=RfBf z^6{KTDsMvNNJmga&y0y&%rxTTKbf;8M%LTLdNfaW-(ts<;`Z+D^5Xd9$)mS!-o~<^ zt{s9vu`H_1LI5BthJ~lMDCQ97W9i6gC2fna7-W9n6P%UAJJ+M=h=Nzjnq4y#PgEr{ zP|w(IdEI?kmPMB9H{Qg>@>~DtZ~J}!gCG0BAOF4&e(+UU<>t9ve{FrXK96jk0V~Y5 zEPOf~!Du5Yehe#y+;46-zLBtfi) zMUe-}U<>Mazn7~UyY*u}RY8k9iyi>nEN{sQz;-Yj z#<(tFcljN+)^}WVL#NK2Rgo$8Oiuo%9%i%^#Fuf z#p`vd*Xp-nBO#M=Uq{uK5@{!ApXvv=@?4hqQIif#-HBKoP2EBMIgpwm|Cp3eIK)f^ z7pg~9S8-E;TU=lva5HxosH~?CymZ9z@K-+Z#lQO-Z*6|~$~*6T{MYr}JAdm=U%b3{ z`EgWv7$67LfL*uE-IN)dMf}lGt`2&0I^CHgsm2$Z-)s*Ui=~#_Vo) zdcf6Dj(WJ3!>@kr=GCk98(+R!-m|x_PgstR7q!h)R^z~{ZjGx)#csO`v3Xa zuU^RA#pS_II9x2E7gtvoFDSnCwabrv>(h^a`Sf4?%vb)*kG%e8fAqyyE>3r=UO&IR zz1<{leHTw9RTwXD6%~Psn*xi9h^gqZKn32npOB&2J|P1;>g290@fx}MkYT|hqH&UF z1zkg1q-8%)Gl4d?H%snshA!bci&^B|*|Nh;Ot5X(9Ln=HBsG<*;&{MvjKr^P25fF7 z20b1k-s6C6C)?ng`!>RD=Duxi=4OaPRktlIg)K@yth`Z|MYB93@j+nPMJK$9P6Xp; zIdw;Gp~K$M?7+lGZc&rTjD{2ZYE?RygDL`J*o40j z_wwf7I2N+uWEZTIp)qzNA7;aDqe1$Cs%541FgyuIzlKI76-N`KYIO_w=}BkMsa(XN z`}aUhD;7K$w+JqS$X?pF;rP6nULwzoNZF||DEb6cPdZVtv%p=yiMCK>kkZ4BhzhOy z7TuV_IUDukXX?gT_*#Uler3E%y;0L*y)ANv^TcaaN@+2`*usyOQc*&dZ(!QhxFkhtpZ+a@o4L|^#G>F&8eupGH+A?V?< z8cnNc+Tl)y9@=ikxS|1Ngf;m%EimczPO|V!oU;`2V6UBxA-#rii8gYoB?}W|#70#W z4Y4!EVfu`!JYTg6eq|J%=0|oIiyhVp-8vtDnQC_QoC|2QzUfMfSEFpu1!DBTb6=tF z2AOlz{bXoZB`v#NEc&pPJQi{vMchu;xO_=p`3}2%OU*?V=a$OQk+NHE-*-nl6A)dl z9z8iM3Nu}V)m&rAi01`!vnk>3g$g`VB67nJhQJwbd6QZcWDKLi`|*8>ZRwaDljjqK zScl@D5ywcYkgpG;E}>|TkrPD)?sj>3xg2nFy+&a!5}Ugsm3{`7w-|!zA*A>`OE3fw zeukKx2i-frF-q-q*lE58AoL!d_B`j}`FS7n1-9A=%U*s~%ol5>a_smPeBas5E35fe zG!Im)^)Nb`7Mo&PQSO*}aK@a!x!1_t0!B= zK3aZujvJ#zD8grlKAIv-_Dp-cJA%h2_Y$5{EMFG3Ff6R8PV-#tq@yp(rLF7j^&21f z&Tsz5{@LIEd;jF`{Ln`~aQ$rk+-Ki)lcOGv%d#Afg3ZM>Y66Pp@=yKP_y4Ys{a1hCum9D5_piS9g*UHWdc_V$r^Cesv~vYFMxSC;JK3Dd#gQig zy6UpXqKMP$(6@VQ<7QM8N)bo|zMdGhID>00O~|MS9IA`xvaKh;MO+rQ&0|w{ffl4t zzKA(m&oF(*p~h-^E$J@qSr!2Vyr{XClKjlk?{sJrv`19nl#DVW1k$sn8NU~HpZ^tV z-PRDD79gS_|nh*`kOC5 zef0Q3ub;19eA^#g9zO8oARY%exC)lT;+vZ}L{!`$ZX)iNiyRNY=I`CDcP1_>&0tAg zcNe$gL5~OBw(aD$d2pA1W&F3XkUailj+x;(%2uitFXpWl7_OE(w4^u}{n94`OXZ`>~S)em3U zw|(HzM_#&k^5}T|-tF!6&7zCNWxayscqpe6t|C?Kn5SlLW~PeG0Ey$-Ttr|NRSLAx z-Ce?nH(v4Ki2dp+@QAjA-L4flZR}CaWRslhl)>sEqKoU235f{QxofhkMIi;;+(y+V zfGE^cg{wKRnMb`wguyoR(+XVx*k*2K8w5NkHrUx5(P*5SYv!8?#BH+;unlpMt&0g% z!}n5I1gKMHBaB|MrVxl5u*5wtLDQ@dfx}&Mr;dlLIuk~PJnnIsi~;Qs-j|Rw**?c2 zKF7HEz0bhWuI?GOP5$>Rl)zW(nu@(KbkDL&mCG4N03~8tWg$DA&S449c@BV0-r(p- zRT_GnaDk%SYXa44G?@BJFzX=8>H^yQ6JT^5vz_?}46G39F~VYvK+i5;AQ{`~qF(2> zoEU)Ghu>Y=X6tDajSVp-o!X?siG6Ro&$Jt)iCKTG->UwjSLS@FJCVrWcaWc}wcpR{ zr3+E)M7yH;U{}1J zQ0{4a=J3wsyvS_D;FO?2uIQep^$skW6>q@47r*dRjcT9G6di@)zHDPgDkrr9#mDnd!U}GKU$DnrQeaX-RiAYS;L3)tU9#Aa&db8-gbKa+y3AW{_+3C zKlyz>@?AI2*H3@?*+Gw2$K&DPs_tUu4zZ0pdkwO}R@rdCBIv!LM=k-^g z{F(pdAOE%={4M{<|M@@v+~5A?$1lHP%W?C~L!6_~*r;h7dDs90R>ryr+uWW%1MYyw zhZmmux`{hv5n1l8uVL>1k1n3Pw0R^R-S1PsD23(p{2A8k*mbp@J7W2n*0f z)VFQDy*XSwhGJXq)_2|lE*`)5qDh|1+{}Zpg7S*>luZF#6yh3tp7Sv(1xc%~lm%Cn zxtX29@^+Hb-$+(*VBAnYuvJjSnY3dd!b_FPFj5|JB-A#^aG4ZNhN?_vc>yRCs1h9a zy1ZqwZ-xx`N=6b}JM3bFQ%zEF5xr?Dg@*KMw&D%DI)z->q=1U*vQ!{AF7VpcEy}}6 z=6LxPjj*I-4KP=)Y>_j`tfy#CdC6K1h;x82(o1A-a2-juQT>xM?`Z-MsiUBMb{|@e zDeUZX22-e)7I3U~xL*CG_4Lw(zxVX=E4S;q-F@Vh zizgTO`t$8})vHTAinzl(a{I0jU$;j`S;QArJ>qzAyuRGlO-_%mHpkuF`sBDk{7dgV z|9Ae*^DC8)ymbAs4?g;>AH4Y8-~RHGM;HFiJ0^Ji=<0O3JKf&lu=FYIqOOtd*3|%o zZ4NP*s$)?HPXcwg#2#PIz<|2LT_c<9ak_`6juk?VuW-n6&=e10b+)H95y7f75hSe8 z*o7l5fI$_y2pnb(*JfZ>INX2@zQN5cr74coa5MKU0tJkOYfyHz6~3vYuFTtNJ+USB zR*E|;Zcg7KXkrdGiz8p)#ygJ0&GO7t%R?l^MHWzX=6TStyemtPHlKvo;GSN#ZO$+) zVuwr0L8{y|N+RZhIEJL$`uo1@5YZ9nY$GR8M}X|AWS_=xdIJ?Bjx!U6IV?fu!~~18 z+bas-!3wk6DmiAzqaBukDs(o85W#WHvZFqYG7CqWn_3lY9J8*!vLkF!L}1Qsd9V_n!F#Nn5sSCmHye8h{rynN=Lkb2!y) z@kRnfh6T$^$RRlymec^w$OB$gmrE41WCV$w#NrHVt!Ps241Yx}wWzu2#S6H2aoaW- zw{FlEx71yT#I%PkLnd0RtP`G=|P}Oxt!1jUsJT!&8=lh|GY zMHZ}gFTMVOfBcXAli&K$Z&@_9z^J=Dy1M%A@A-kh`2YU*-g)-+a&ZaUAkI`5GN>iX zB8wqU>DkSu`ff-W9M%tw5Z^QxqWJ8m;$UqJT4dO&9&k5`~JB<_)q=$ zKmGIruYCTC@3`agc%dq*-vNjt`PFfO?dsB&<8pnwy?YWDbur)8NSwK1xj4EXzW%l6 z$BXAb`UijD^>6*=zwmGT`@i;A{_f*fUV|Q1-=NxO@9tSRowEdPv30#z^uPBf{>1nH z!1w>BfBC=o#6S4Ci^osQHUrkXyKnpUkN(j=@`wKZ&;9)0`l-LUTwDNoYl0mW zqP*6%J|3`CCSscJYG*gtDyF(oYT{MKtwy1@xLdcShvCdK}RH-~#DXmYt z%($XvG;F)MT@1V`=umxf$w$9C4d(kVhX@w>rL){jHZ!172E*WGpW;Sogp5D5=qISS zRNPbsO6<^?-a$e8`?wgKim1rx_SWy-1s31{Y`_M+xP0-&0a>;)g1rtK$H3l694^T;`WL?V>{q|?-t#+?!*+XjdiwNo@$Gc7D4X9- zD1r0{@9Jz=< zbb0OtgY;t*_VlFDS#c4=~=eIbBU0#Z9 z{_N)F)^R$yE~+Xna=V#ro2Wc}^62FH$+y;j@YQ$!n_s;BuElX?Wg0MZ_08SHjfbFHl!Ant zo=#m*BDQ;%3F$6waL*`%&;=C{Q9u=9FcHT_v%xL)GMPKfAO_oDtDo+CTl2sUk+?R+ z-OaY_&P7F|z&eVJGnr}wlN=drcermkv@L5r5T!fjfV&wyBP9Yv3NHgE?l6JGmB7L5 zaXhP}+mQBxFqmN7KTmxwJ3NJs+hsCkW+Q)#!sKDjJOB~?n|vGc=hL4n*JYI3Qde|4 z3{JFUml1$Yjh8*nOy9Y|!OAhBG~88Td^zJC4}qSKAH;2*_2?OLxvzMH;Fjiq&Shwe zvniIItK=UF6b0kgz-w=#ClyYG3IHa&d`FgG`O<7sUzZJ=S;SOy>7V$#A{QeG$Co4W zi0kLiA75Rn#wMyo@Bkw3NO|_H%Y7;a&FI26(cJ-=EGFlKSqGMgCWA7qKf&(&c2 z8Jv5rsk0~kmCC3RD!HPWZf=b~Qy5O}X+>6KMmEzEcm53`rWdkYjDw_O`3w=^jRS)a z+|H7L9b2s9b9yvy>tw7xG~@YN#9$B6!4@QJu&Y zv`sA*vo)UTP_^LfekexGT|L>_T{IqVmWx4h~P%7h=%cs_W;<6;-<?%lzEZ(0EjXOZNkVcybpD>F5Dy~zYr z@IunzJhP5P4!J^gk`uWr18&j{XG1Y+^G1Q4vE_$F4m$dCT`cYMcpeC_LB4+%XS7Kpri{rqF!@g0BoAOGWj<-hn#Z@>90 z^;;4viSFAi;ClIFto+X0*s*`run$G@pcWjCu9p@b?hZQZP8LqRLu<(ei(G7XcPCqa z-~Z^J_|yN&pE5ms{`1c+FONr6GrNN?i;C;A$zt1!2Y>NOKC>M^_YA+~k-vJhuik9B zsL4UFg%EAF0l2ujygT{le&fw=`L+-I3;+B7@xNosXMW;m9>4O6n{M6*Ka&+5dtwNn zvYbxWFFt+x=l-QX`-lGMANro}{jUGXzxXeU`|{A-)9uZ=nJ$;ha@@8P0Eq+b7FnOKSI5IY`_KIk|HXgqpZ~d^`}oH{ z{&Sa)zVY_<*0xPVRllalBLD#a07*naRDeac^-dhei%WIbwz}Q@_y5#C{iFZrKl11P z=YQ_;;tQpmmU1jNBpmHNOG zz$^b!1}fvpId%b{P#1*9J8U5D5m%UhENWgPQEi2+wTa#HYtyu*!)OnUqEfM4K!ZYa zQi#Z)>b`C3H+;i4{I>7^@zdSu&9~msWqJAK7r*w^um19ZRY=^mk!dMajdL)~ z?Wnj|md)(6IaE~{kM`pHH1^`cfVWnalN=UVwspBYUfbno-dexyHGK4CdH1<|;o5ID zEUF6}d8I4d-Bh;~W^#RNC-X%`H}Cojs2kkZOTnW@z~jSvC;baQ`}Hq=_1VAjPyUuq zfA!h__5b_D@BG%+{`?>Q#*5|odb@7N!xklHqQ0mc4l0X#9JvAm;us4RUoC@}ale+* z2yhEme-qnMQ=(F)0ueFA!F+R=x~hmk(~*<7k11j(&Y};H`5`b7RctGkP3%yXDaoRBlJ!C*lc<2pM!(1br;ivtT;ZU3efw1I*)VrdKsSYMGH#{RPII+u)x2+ioR0Hf%kEL(M!IfDvnreZ{a@CBtEl#0ZZ z+=l=X!$UFNGrRxqZrwk+N-o?+U^5jD{)Ho zBkZ*7&gQ`pFP8bMGx;a%xj?vZHNq$&>dWD0e)?zs>;LM%{hsgpu5DYByB^#gH9i%T z$>VpqB%M4TdMBpmoKPBh37*H%hCz7x7ev~l*H zB_9e=D+eMESwQEwBDjRV()ie?XEKE{n)w>zcun zFjf*UEpJV#N!b?VCyOWm(>4MNFB08M^I)7=B9Lcz#e&AkWSY~cl~IwVe~Y7I)f*I_`1t#oraSP>vKXwd}Ay>VKd}$b5ZUyXwk03VKg5>om>s^ ztX_`wTPp1zLfdjaGCl0jxoHIMc3SUVf919JUcLRom%fJ0u&}n0uVnS4(6Od$lnw3U z^po-hL=xvhtXbEWbg|rIgt7{y#Xh0hGe*V;9I}+x%hLBI;-QEn*at;ude?+EaVY2+Mri*h@30*EgUU{I zf`bFQ@LSlPIl6Y!YOD!qBUGNPCzEk76?iK}LLJn&))R8D4j}a%T4~MlxO{6+ccOgD z&ro;!uHsM9ghbP-%zuaK!h86{)(vv_<_~|<8*ja}ZKk3C*3DGKAz%E`SAO7ozjs;m z%U}9()Ex_}lOS;ef&KC?e&X|=`>Y%M7m^G8)@|q-^#S*+$T5$G!P|kb3XB zB-@3&Zz4x=+}^zVqksAj|EWL!XEwLDzV_~;t4oP3+Umd}+reymgqv@;@Ku+;dHv)s zz4gMcJ==cgYj=P01MBODo3GrtEW*Q&L?Iinn#kqF!H#cz;cFlK=!bvr|Mp-0(%b)+ z+n@XSi4H_zXD4*;-icn&NVFTQfRz47aJYwFkj%2&Vg=JoaU?P(Le zeDB%YckjIoTs?mIMZxL4H@^&A0CtPh^5}(&<#6-voBz{4`)7a8kN(jA=3o8Sp1t$z z`3o=p&;Hz>|J6_an%QD@diSk2VUEplP^`Cy$1g0)q6c~Y&NHm5E>}0VZvqY+mq(Y& z;h06@Y3xmN4MUD3WwBSZkU@^eefgS^!xts zAHI9<_O(}DettTgHu>eB{|6ucxu3iI{}cA!@s=FLy?9mi%$#)d-K?-$MU)Ui5)u-K zAZ&6DCK{75V2tszdB%V-4m_M6AO}F0oO1?=3_=Ozw7c3}ZH_nJd&10g)$fn)>h5z_ ze!ugP_MUt0oS6<)-}+YQ?oLM#xw2xbtjGbV?)Plf2V;un2$A7rWQJ~!t3OTg`G0;T ztT7bsxUdlbgjM;2Wyd1?2(aJh z%}1mCbu2Q|t?u4Czx}|mWu~s>o~>tB28%sgWcgI5Nnlx|JKziZR$SNCRbTA=k&lHV2q9R+`5t$g zMI)!OvUx$0H4gOH)YYluG}SRX7Wrsb8qLf_U6{q>R9UG8PzzhX?-Po+B>*5SqI>vR zfT|Qi9?2-1?ELmv^^MyXZ`yTiTd#R&*YY{Hx1RUtwWd>612MT_Bp?(b0RjeLcH5n} zzJU*JXgxUk*oRL8u!x9di`F7oSIg==FISrn$cQ8s5D*Lk5oLsA5Z&RqnSe-L0tm2$ zn7R~n-lp@2ax0u$afJ^SMaT#uOU+PMz_lmwzJiEA7|=LcOx~vg??O2BMF4k9D)?xd zb!-lWExS;bFY5p|4y@?K4jB{Hib3m9MVk=8ou)zhV00EAFa-`hIZ^Y60aU|4po_zx zl1mT(s@#d--lEBITD1z3y#6Z7iT;4LMyXa%IT?x#1kLxi7e(bzqoemr61O4QB&(X1 zw#}Ok1tHy26(IIQE!Yqgdo!b??Kl|LekxDIct&NQs?m^vw=SYiImX*W^WX&@)QJc^ z(isgMhvX3mYJfoPPXcrp1}`x6gjmN2fG1?A)gKN?Vre5FppZt8yu4Xk%`Gg9Pfa#j zt*WkLeBd}lKJJC#K0}`l5n~x1&_DsA`3|>=m-uh5%2);wj?eScrl0EY__$zPoT3q? zAVV?6oY*D(z~4GqAbTe#b)5Z_*EJ4i=Ai7k zgTldDAb>^##A2gpHk-^0h5(HKiUSTLcj$w5n-Mb*=`PHG$(p01wk$Oy=b!-*(bh1S zJ(P9EsM!`4B&z!**L8Dr)LI86T7V`xuLT^0sb!@ zO{0?q0gqTil5Sc#XoZfoF8u+}2o!|b7xbxkL=qN7C`|=GB4>zxm#AndhF*yxMxx~e zmjRe9B6iv%2M^6Ib@x+ND5r2Dh?tHIxH1K$`U(y4H-$DI^KkRc(T|S$AmW)eVcc;^ z6e*SaX&+KHrn}LBPJ{@EWU9#k;=NgwX;%g-`au{41YdW6;HoOp5fd?nocJYQNXRAw zAV-PuwnOuJIyWc+NUkaeV(2|YxI+)aMiyS=F!VcsFRU^_3SSca1SNuyU{COk!s7z1 z^sYr5C>VtES z`l4BZmDf+gda91p1_(JrVPK04AZWzGC=oPUH}9FheeH>(fBf>J@BTma;YHJK*Hs1J zR%^%PYv?5ELR2znnfqmx7x~om^lM)8${&31JN@Nub7cIP&w9bw_-L|D>y)_0*?41xW6^>&`EIwn1`P8Sr0H)dRElo{Kzvi{C zI`i~1c0c&wkFWdjc^5o<=gytK{M8LenVa+D9Zyc6P^n}1gX*zYa~~1*IwlZegh461 zm}qbz@R$fN;5-EazgHGQ2;(cUka(k@o(?xSD558K!GsY-yj^8iFq|QbPAomN_fy<4n{LZ%b9m3B73)d-v`8_YeL@t3C4C*Sz-Ld+-0rPp&mobVeup zwge_XKoXYRmR(^v@zgCV3yX6zb9s9djd4!?aW_v}5rfa+4@zUaTB7HiN;=X=6C{`F zcNLHPMS5UKV&^bUJtV6seWXj>lQ7H<@S;5)enp(bm}N~XPKI9rlQ8_k%!Y^sesSNP zTlT|Tuadlp1`I(nqw#i;A=S(^BMUbO$C?HW*%iwI1dti%6i6T|l~@aCh;*|_gW!%j zGK4Hl1T07_UZc+M6RsH`o`3fQL9lgCba2$qbH+cYb*P z;=&SaSd){;x9*ysZfB3XVx!5y_A7=a05h|#*|HU2mlY%tANo+!989n?ONfBL=(A|d zmQ_#~5K&Oj00EbEW}w~4pjC+AU?2d9c>!q99jk&U?l4;SD79x^9MG_!WMDEXiX6xY z*S0^9+LGG@B`jHXWZGo`$z|NY@5O+QL`7r?*CQgZmXEv2XArl0ZBP$JXWAXsxyfM5Vm;ahcBWbt z!65y!d#rOAot`O>`+R$3dEosMK+wHOQ2hW@0v6=J>plPyi3ma5+g@8m$G1cSE+J-u zsn^S4AGMUVNczLa%>t?Q$lwK(BK`!M5CZ%PBz`ly1eg%XuQt;8^xf1g(7TaTRilTR4E6V6b(0eVl*9>=W7ix+vu>N~zZ5q;2|^7%s%@&lfDJzUkr(!s z7e&a00z<}o^$WugdSe-^G3b;>Yp;YcNtozhhRZ$t1;df_+CNc-CnH=YGh(B8d#k*V*+6N$^5Hgq66eOWlddcE7B5ADk`nycS@}h={TR1g*6K0F)U* zGGc%SD`h*+uDtSs`Gw`%?%b1)ci2|wcAYXAkf{b`%g|{LJ7v%8%3_}>%YbEiY@~&Q zBmEl1xTX^bWw{~Xy0%r%fedAo=b3O-4r*X}(qk{GtMb=3Z!adM7;0ulKw}Jw*s2n) z0bPMV8&hDOApl!oL^3&nag^HD6;hTPBOru8buEGAtl$!3A6dh>Q~iwv`|dX5ySQTX{esKtUt}VBIDIfecGyX|KjkaJc#MAp%}f8{D{+z)d0whT1jvxE=Z~Sefx&oGR5c82SdgMd za>DsstS))JQ_&EFP2%zK5e^Mw&NL>G{0f**<(=F!<-TEPg1at5e-aH=g$NN2T@N0g zVr(j#VLml#zBpWfM0MFPKJ(<>K^ONt&cD#W*`xtq{WJD zfi|O?e0B{?CMke+=(PB+hh%uzTW$C;q8$!+8^mAIX2oIfC8U(hx&)ShfM~6?%x)PG zfIIUS(HKOUonJ)MIJHZ_2>^&?E3>fq@vxaAhrqdZhfDpjF-5u3n_Rc%MQ?e=^oiqp4=uVNw-7U-fT4;yQf zTL=5y)I_NBhrlysaD{n@*lsqu{lWGJc0B$uS6q1U<-h&S zFV4H*l9#;n#XBF^IWjTXXygF!jAy^-9eLwxUwPG4SH0rpFB=&d`;V*t zwcD>dopz(q*tPc^^9#!WU<$|(KKS8(ecF?s__1p~!BRi{+0Xmf$3BX7p&ZED-~NYZ zo^!@~-}5(5eeQEcC&t9`b6@bBUTtr_@zx(-_pR;QcUCb&`XS7{lcKbcI-SCs2 zhCP7#SWH#!UmnkSz8e zas-m>Ut&7+A)&0mU+=Mc*l32QqW}OAipbKy5@qdUY<9vN78+?DGalesKdt^~viTd~$1Z$siLNMcMJQ0o3Ikg@G9bj1=uW8)*XITo+bqnrNAkaRXIp7nh`FBok$WoarVfmq-F`Ls88@ zcyCMqz-{{hB7z1`kgYrT6Tym?FBbPw&}1(nx)#TKvYrU~8WpdiL}<`0a&Z+PVGkQb z5b=Hyh#(Mah!R00sA!aaag9dL#yFz(@GC06*6SpUNKq^BIfyQ7$cqLh62nBk#pxrW zK^Z1)!=y{es-l)(J%I^l(+4Xd!src$)?@Ne(90mrN};EP>SjZ*@sX24F#X|Baf}bv z>mA)>4{yUX4nZx1h5@`E49QR>6e{LLlX*`|m0j)v_(Um(>aSJKhakCze(UGf&L6}04D{A zfZ~_dxK->n%S^f4@3hT}p8cfDFFuni8f)Zi%w0PVZQb_ZBQ8Ggv!B0i`}KFp<_*|r zNlvz={=y0(Hb+MQ>Z&Z6(e{^sEtEL6ar}?o_=1DG_PpV`e`t=K)>~Q58wFR^F3&)g zBjp>mtbPBx-t?hQfBXC2y*^*Rkyn;~_vw#);)R=E|7ZV_Pp)S`gMb44g+*Rjrgp16 z+NtY45)8Wi-r{^V)}~^_3|8L$y64lNe9F)M(llFr=Eg{e2W5Y5fii4%I+8Ke7LmZ1 zswf%;3LA}9;f)!B`i&SARkYSa03a*+{kraTvB;X8CLjwUQlspb)yg86tQc((Qoq~h zvQI@LZy4Yj0A0Yd>i38M4GLqg*Ea?!H;4d?y?)OaGI>*3h6i>h{f;Y;t!%#sm|;d_ zEl6$48nY%94RJZ}M6X;tJ(g-f#MVUj6lx*`5dpE4Wf3eIS<$raY&j=p2yyRF-KHwR z^&rFm9yEedgGN|U_f8UB0uJB~sdN~rE+s+)1_YA0p`;|rks1;7|Ld|ozjsE^91g2_ zhF+NbP)i2@0POe00hW**2?Y+m9m5IUFq#tYh{4u)Dx-f2Q7G~=jR=4Y1W1UPm<-7% zC+G>;S*5nTI1$PQgJwRGbAM6%kZX5Jd9jHriO|VKA3tyO)?t< z0x+&i2!7kkp);Pm7P)5|Fga32CO27OvfP*~&kH14T3Rl$+@E0GcCD>z<0SG^)3(r!z7YX)K@q6`4*e)-&&UwHYWI?J;&h6+Zs25NUsL{(2ne>xlN zhT>BzYd^fS?lu`~H1eFpirAV7YaD5P->&`0%J@;rHVwL`K6vod+Yg*}|DF?%9ypoj zMw`nwqxtHfbFe*@<)*Ayu6!(BdO@`~3y50a6XrgQgA;Fb**O4cG>Suq4t@4>U!Izr zc*zT%0Z={us;j0ZT7UK4e>iq@ma7r~PTsWPi=X}M1s6W%-18sxcOUrB?>_0uXFmJc zbF&8k^YO9qtN-I8&w1{1KlzDIO;1e$0GZ-duX@eXp8UkO{Lx$g@Xc>IcK*L+3}(mz4ZCdd-2hu$KLZ7Z_jM``Zv7hwXb^V2mk$=r#@7uTk zh0p)J&1arvdtE{U-YJq0YxH^N=q#lD$KhXfME!@suZd-DktTaOq2JOs?raqCb_c*O zT~I!X!&Alp8jBBJ6JmVOLyffiAQ`^n+b*l;StrQlt_cJ(#7?`_YGhz7F&km7EwdF7 z1j&KN3Y;hm*Sy%5o<%_dL?Wu0mIl(bD2Rq!{RSht!#mig{#8LdL;w&Wxx-7j?&Mr# zIH)aaK*)`PHeN(XOZfD4mIM4goMsuA-cV+0H7Xg;f7A5Lw3AF#YpR`x6OY28+(o& zsIwLu8rVUf%TjC&mZ4^02Fqxfgh?#1CAJxe5jJd%FaZ++AsB;sGjEKvo8u#m(N>lh z2mma$uF2Gsqtpkvc5C^6ezf?WZyfrsAMD?{Z-oHz5mSs&W0Zuv~stpszY%E@&~$j zk1LFfGwlEfWB|!8JO@N1AcK?>6`9G6$&4woJU5x4EW<3r%m5iN1je8-kdYVylVN5s zGn5(1a+BpI%PGsq z>iR%ZZs4~ob|=iM4Rfj}N;?B$2oEQE72U$t@SyB39dq=A5VQr}-v9_fHXrvH25fZ> zlaZo4@Ab>0M-Q32QCC*6^Z$p@DRP4zxU8Wf&lBS|Vad}W&P|ZVK;zw;C?xJvjS?o~ zj7g%z*?ZPclh(!e>gk0FrSJz(k3=tbQz3qJTN0O7uOl|Y|B&!q9pBieV1N^cN0KFB zAfjs=EQ*!7q8wLh`@J9C^5K8`;=T7jxMt1tSHJnw&wTppy?(jngf+8Aj;>iZJwDng zYp4cNEiY~yYpfqBdb10LvsR8R>26s!deK=YG_W2ltgLhwi;SSp%QJHmozc2vyD~WK zk{l^30JdTymWJcpGbBi355LS=vB)YxEorR;XkI%(~64&B8Ww!~C0=4E$KuPmOl zW_-jze_^TYRUMNxY$(qhj2N1U~3!${UWcBCp{Fn?_0SoVmsPNb?V_sm>+ z;hFDy^9wJ1*vTzIv8dq{L}%}CiVE1N;q>MqQV z7JTt}TTWj$N-KlG!pccgjZ4oyak@kGpky?HC}8T^HZ#E5)&sGXT|eG#XIWKZC3(L) znCvtsM;di)*%jM?uK7e@0E1*~#Y;W2<-+2!r$}cFFZXR}VEwr=brP2qBBlxrfoevE zyqb^?Ukn~s5dg&6ngvD3+8}e32sA{#hL8wg67Y7rj!RstsTjrJ4pU26uxqEJ(O8Vi z3JA$sX&8ErATSQ`w5UK?s7=!^K?py3ZPDN;2BZcE#UTC(p(+@|)788wI}dTvSPK^# zm<)Xg$)pBJ4TO*A8_EC}YzekPK%fjv?rb8(y^CWk<#=G#tnzRuM26ZRngS4A+oJI{ z?I5VF4PzSa8M@{BMw;gn90K4lwh~5H|1J@*)He&WgRwp`-c9=ug4s#@OEUxN6NOn2 z&=Slre|l86QZPT^;EH5px5QOFtbJQs*x56WK zc>}Es^5!q>=#P4%yX;8IWD{&{ZA)TTng+Esc`c3RkD+n6uHQV^_LS|nG;ZHhw?HmG z{rBJL1{GkhcfYnC{{XSj+ z4wRWheUSucoti{cQgoW#p>yqob zwk2~_mi^hIM@0asn4dd#_|So(v-a{!FWIr<{*kfK14j?nz522XFWSBJUW5)tK#8K6 zmXQy?S;e43hhzH`Vxx}wS&A#3y?7*b84#g24 zgvFL12uHh8wX-E?E*@Jv^@MS;{h2{o8a*Vb`B1GeeY8qJ@v57)Xb~yfNkyEI6+|-+ay2$Mz=M; zOM_^&Euv$igvL;l0F7xESy7eC%gj})Z7QL=j>)%fTfT04)s<|tSzLS9^6vdBSDx0n z?83>lYa2zD38J;8sKGRIYH&t^NI(d6)vILhEbKWtxMSz+t$P+8INI+HfJkm8_+Dl% zKB4uz$E>^LVV%tMt8RrZ-0H>C@j@HL7lX9|zaS`Iuh(yis4O#2W!+mNb=Bx3L!v5*+AhG zUqu~9Rqd3Irms+MAwjJqVRuQL0*JQ@!-c>h;VD}G;^tID+a7HTU|2p8z%7hQFgiZH z39()vU03Lg9r>iMn!ISchRZ9446e5_gy5k>0o6BCF9r}TK@y6+K*$;e$T*|aR^{)Z zC|}@24@KXT+-MX4Z$N{45h!N#IJA62Wk^6E?J369<;n-VI~R7iNjS5PnO+|ZjsM~B zNKM4h93^Hyp!2FtK78aPUYK?`s6cohwtWRbP47z-9(Su0<WMUS7HA^bK!&(+fA9viaD-eee6g zr|!99-x+6b_~SP|=hU;#KDc+s-@N}bhxg1h8m*sQe+OFl`**!=`~I0vU-QLRzT&x; zUwUqn;6Fe2l^_4?KAc)(S60T2{Mnzp;H1;etg69XcWwLj4{v++GoQF=Oxj~>@=oi0 z@BQ!_UiZTF8>iMMN>EA#6<=4I7>1Ut0{@s81 z);IsnM|R%7FYh4u;tm%xM)g&kfD@3h){N!&;-_8QSu>Jx{@tJ4zIFdnZ*FP2l|A|q zXKp!p<9Iv&+!ub>8X3RxinGTjCeA*3^m{+P`RGbjjI`>7rLngB{&Syj*L^#Ga@}o3 zr}^yXJa*Ua13$ju0lQR=PPSh3v`25>x%;}`Y&Y!@$^gZkndpv;GKR})VTCte-hARq z>iMJ9Jv(I3HRoTMJ@T>jO+S>wd-7%up_c$|eNWQ*e(w z8pIzGhIu+LmfwTZ9xSB zAE(xCh+-uACn+=lMgj$t#H!%HAR0tE& zkly_v<~opmi60>#vLPXmx|V1B?%K;vt0w06U5Gm_tnWOdziYaCY-2UMDO;S&@T-II zkFQMar1oe5IS(ukEL6g!k=pIvPgXKpwMg#7(GPUa{PJn%?>TML(n(uxUHkB>?U|qI zpLzsFaw#oaKme|-)bQ~0@xlwZyFio+pxA%{P$Pl2S!BpCi{J~4VpfZ#IN3NF65w7UNqKcV!l2}-$u$>UeDOJFo^k8#x81*e2WAZh7Kwlvf&<#$ zRP*9*Q6Y7bbqK=Gz!!tPR1d^`5X$!el+lGeW4srxx*H6MQSfTQW8*!8EGn2L{y}V| zK16Ri)L#rY(u*B6!6Gw_%+%J_B0waFHA}DNg-RAG7yyYo2EfIq1Tq6T#l*XtR!+u% zg;`j14X+?E8Wtji={Bt&Z3@z$0`wc1C|deBBI@==0O(F2^(ib@y$I;}5M_i0s+wyN z3t*WM#fmKUdXtmQMziz4o`uPY&S-<{vMMs{v`sFYXJ`N#2HS=w+tSM1;UH)Xxl>mV z*kmMPQJ9RFqL}N+k%gtv78z>?gUZ@+%@o};TYmKW`>(xWab|8XVr(a`4fN0sGFxR* zXHXldGPb$YnbeuB3|DAtR{%n6!7^C3gQ_a)x~!_Yh8DIrbXwD$ZN1`CxAMEbz3}zB z2c2eq>Nu^*?V8c%gG>04-^~5X*Y|w%E4#1x=H8Eg`_R>2+4ub$=j*(kk2Mwsyz{8N zbyxX=TbDm^?a_by%AUXZ%JxtGV$at73r(yyjLG^@9&d2F!P^%GpZxxV*Zt;5Wg7Wd zLx4dTNCd5*MPU@T-)aqFQ9~MtqTvljbm!?>07e2dLOD=@m;o8Y3^4;!5amQU8AB!` zlaVoG3>t%!p~;al#0)S4G>8VsxSd-OkdXwDUDzl*lpJO{K?5dN>%k1*R`!I;n36XJ ztwC#$4KV^6_n@d1)uN=_ z-ItGh1ODt8?=83r2|7P8cG(gCRt;x(>BWM--!7fH$IG=$gM#JVX@$ zfZ2*=U}51ToU_`33=NyULPdM@3KZxulDz1oL9q34Ze7bUG2O{@q(c!y*>S8~bz8y{ zVD(I5d;`ic#DlpgPYAb<#Y7Ow)58tLX9ieH`D4=pA;DBU!LtB4F3{+?k03L;<$53} zoFR;CSd(o!b!2R!k!2^Jak+~fYJm$hPe*bBgc5=Szii@`0{{UM1 zkAMBfGq;Rgb@8chdd1VW-*oq$dw0D3O)uJT#wLM`1+RR@mGAna7cA`Fe)g74|NP!p zKXB*WTkpB|(U)9QgKe~P(`o@Zd;@AWDbD}|ZN=T*#*X>m|M` z`1TFs@;86+#z&oZ=9fP4>GRGx^Y7pH23yS+mHGzkcQ2 zH{Ucfcl4|+rx^mUOe;%&`qtln^>cn_=N&gsjuij;-Zwt(lG9FD+y2wHym-^viQT*Q z{{G9K`G%K0{RiLt$vJ17{DrIEy=DThc;p4!w(a@U=YQ~LZ+zj)UjK}*eEZsCb1S#r zarf;0LzHud;wyDrJQ_$41xQ@Uzktb#a&GpikAKvLbsN6+m0uk>w)C8*KX%hZV;pe~nqrt##I{n1W=bZN7-uaJz?guBVS$po;r@){mrL_z5m!5OlnJ2Hk@SM%l zV-19CaH5xhIWYpRm1++{1xMi45tO$x za$pfR+?#Lssaf}}!TS4PtdZlWR90#+Vp#+Uuu;}kUR4?5z?RZz64@qpcXdYIf6C=I zO`WyY_J7jo+?TZ|N3?_5Rrj#~k#u`9HBFDXoNu_v0vpWq2(@Tl{f@#S!YCrOl|fmf zF|%`XU;D~e{@2^y@Qy!y>-GnBeC`XMofw;R1_JG zXc!eVXQiqx=@17|m!MWEHX#V&tcJR+M$@gw|W_)f^J3FrYiI@k}@v&5mn;m;}sz(5%Z z$99M4SR5d4#KdiirX?o?gn;b#Z2|zODi$IF#9A_g1J34`x>IBAC>YLIMTVY)m`PdwomB09BafyBErlM%@D2>#@ax z>g9=cbD_dd-n4MnPI>ehtu5vfGVJ=2Pai;}g01JlEl>?Qoj+cZ)y*fSg2YnvK%R2%HkoYAl z=%|edAQCXJ-*kz@2ZhDKF$(|^kc5V*_Z(TI10WP6M6`&>UnRwg^o_!EqDso0B8Dc! zXBGSfbOR3_-iUbYM_rwa`mlhI2|RmCfo{DOI=J@9K8X>R$W~>ju>lqI!sPxT9q1n_ zs=7mtH-MtI;#*?KhJHj^>WCQ1s*w#;C+tt*!VIjsu3J=~-v}t)PP22d-~!Y8#_dbI z<-zzy&9~3Lg~AqPTA}z{#}A!|gAo-Z1`$rvg*e2oQvpe)K$MCHA0Y&FhQAf=IXv~s zC46WA{rH4jn%aV7mZEh|cy#cIFcndqI-T#tG{hN}z)&QPs;r&>RAEyR6UtNKxFl^( zzngSBEb$hfTon=2ldus07;IJ5gNiI?IStC%mQ}OaJhagJ!2kW)&YN!RH%HGsVdFxT z{rtuo@4a{H!_PVEkqjvJ*;bX6K_w=K43Wz6 z+(({w!3C$C`N)?Yxc9d|yngF--}(}1${HI+0+CTn>V>7*9{`kW?_Z%2sH#s}Eyt2GBz2#vy-f_?3 z;!*{;_u#RK=Hw5)f8*hIuDt*1PcIx^>6|bnR(!m}kF)2FI@;)h*P|nJbarOp@a#=@ z?tI3Ejm>6j7z?4OFh2z*LQRe9h+V|*)MBhgIQkB%@w1alQwVu z#}9q&g7Z#4^}Mt0xNrCUJNBP<=1J?PN9NW{Y&c=<(Yd8#ixp%!FcTnROKdGG1Cy0i zce!evi5! zNL3I>Uk1RrzHzzKgHC+CNp{^p7;%YF@SB!a`#XyH4AdD_JV+`6c6#E1i zdR9;xg}yBLj2&oteb(q zSIW-0{P5SvsV{_f%U?i1i*s`S=jFctrok@LXbX{_%dica`n;fvA3?DwdPfe9{K?5` zj3KNajk^~my~OY%UDp`yzxpCwB9yuiI+*$ohB;16Z-iWwL{K1J2m%_K!WehPNHqk& z4?n8G@HY?ZgF>hx%!h_Ih|m}^uIz(-+=GBwie~eHojbnqwJ-Ko7J%W<;lodP@-vVO zTZ>82xEE<8K?8AiAHuD`;kT>Yt;B|``WS~61Sdi-kxuxx25D)fe8LrLExo2VJhUKMR*33j2 zz2#*vUuuj2bPSdSl@*i5^btrT%b+Z!1^9?_VdE(>d&IQHxUSN)ka8#&C_%A|fTJTL z?M|mN+B~rLzR!K>>woyVSKM~{?fdsW_^@*?o}L)pa`H*zBjd-89XsdjlOK2GWg9oY z^pF4Kj|pkhx^)29?zA^FyLMmwZy$W&i=O?*Z+X+bcijKAZ+!Re z9Xnt7s#omVxwFw~Jo<{qUjEq2p7-3BAKkZY>(1>@dD>&%^Ot|Vd-tAifB)KMt35rr z1_0abHj!zy8zMqkwr1_*==expn1A`#f4Sn)i@)~OFMRFG-)xSIT>h8~0l>IzTthFN zj7l;~DMJC(p6KciO*baaJb3CBq6v}+Oe~{_3J{89C+ktG(oQ8K3jhpI+6n*{W{&OM zxA)o4dghV2h0{+yak<;GL_fUtyDxqD%l_cCZ>2mx@uW@r_H183P4_8qsv!(GF=S?N z^$$sgB!ra1G8*K<1fTqC=#edBuFGL7~WFsIl0t40p z3}OJ985Egh1`EP=24&4Ned$^xVoe_h5l59M@41n7-nc!b{JtB4gk;c1-w?zd;6+pk z*H#QG>7?Uq>9ofhP_ZZxHnu?1XOs`GYUfY=%e5+<;g*No;z zW|pTmOjP}{tS~PCrLvUoI98ssKF|8~%zW8u5ph2U8fj%W9I0>7WX>SdV0meJ zG{>>VPwzgqvebXdm769fo3OIXRtSwNpa2xK1cdI81vC-#-61Eg76TYyfbK9~e?e}b z*#IJ_2k5J(#D`g3^{)E_V-1sYmH-5-v-uz*#(=P&YZv2ik{EDHgblj8TCXc2D!Aem zz}tTx=EHD0OblYL)*9t~p|koDh^m-ge>{~1moY((+v6onC2ILl)HwtgVlpwRb+i}S z1otgv+8z_4eNws@AtC~sUyD8btAa?dFdTH&WX=Y-asu7^cVHo!M_V5{>Xs-yE>UsSyv--sU5Sh**Vv$H4ue z!67IWn;ph2j*K7w)lbHufmO2{JCkHLF|k|e+=L;FK@Rbwu9;8-AJ-TbyKn~?x^2v@ zf>!W_R-`i&tzgmjJaBO4zdn84<1RkqZ~yv#KXCW9_q^w0-~I7DhYlaXoVcoO#ihl%vi9)d zMJv#iIx7|zmscu=_PKcubBil$Pgpm5Y>^E?`@E_glr?WSajMm5l(v6x)}FR`%}pCm zzy8<1{nNi)e8=ma^_&+x`_8-WeapK)k8Fz3k=}Cm@bVH&pCt%KW|sOan@&9W=&^aJ zY-@TNEQ9b#8#i6|i`#bZpKTS**Sz8xqpjB6+a6e4>L1vDEIZ-UW+y-4gpCVFcdX1V z0h(g8113yBAVL6uK)_t*(`&zW?TxQ{;gg^6ysJ*%wBeS!w(U8#IH-==wwMWoWwVz)mr);|5L z&GS8bY_V*%8jt}A^HOj0oF`V3r!L%cr&%~E`B`$&i=jC!*MAvj=3vd)aM?3}E4cYP z2D{W61+MidTnu6vEkxisX?4?auV5Mgko~5_s02pRWh_c4yzmx0o+-4USn9PKr{_r-;?)#;<7}UoXV(2EP^3I6JS8^<9ZUq zuYRk76hCwblV|&2bwEQ8e4ePfD2g@(S(GJ$2!Js;_h;?sxqR8*)TdpE{S~t?YlH<% zjd|4^rHkKW#?Pv6epl9e0E;mO@s=LcHwh3FCfpA@`4CKkHkdl2pe7Go7B0z8ueRZ< zKL~Ip@q*O@uHW*4eh)xAh*oGBPq+3%e3pQlKD3Sr@EJhXT{K zff`A8$b9mui5YgcBu&8RXa}p{#+InAY7n^e;&od#jMfW-s?nIisRwc6Z|rFwm-Fv0 z){anrq$(>G&Jf)WZfJmr2mGX>^_)#>_S^pQ0AF|V=2H&s`}oW;m>7kM(GEJoV8jwu zVKJM8$U6d|)B`y21bV~;^8IgOXHu|MxY3U2L2=9sBFuK@&K66kqscyU&DED(dj31#`DZuYaO>wk_oe&q+hz|&&x)X_e9^bSgEnBiRWJiGOn(D~^Epk>ETxtp zB={FcK@ehSJcd9c&DIQOpy$Jwa=gl*f*t^f$@A`D@a=DXb@!g#Xh!Cj=0ErO&t7uT zMP)ho{=IkC!iM<%d++-ACqMC+M_)cSbMz-a`N7`(d$VSfE#q-_*6=}EU8T>&@Q=S3 zV*PS>IT8L0U(4d1VLa=(6Jqw5xa(NcC z#+YRbvfLeOH2dAYpfp_H)6$F1Vcn<5I{IbFpX?(sm!KZ!o6O1FxH}j z3pQ)yQum7{E%b2D{9r@d*yVbTi;*@;RU`6fn`)+;kMYe%yQhu9WgClgCS`r2Y8$kS zH4771Msz!CB7&eXP~=%wAPXGqH}2dEKiInR>s=KIY+jR(G^Hwe008L88i-iS%{H|V zmMc53?6WllAarHE# zckW$W{(kl3D>j_Gsi3l7SEbv&6i@^WDCWEACMOTBo*D#%!L3%d3AjOkg$f z?lEv7p#x!H6N8$PTs5lEMMMydcWC&d26wo1XuRVaES*kcd~}4ZfY??u8yjm^c2M^h zi;Tvajms`Q{ruC{z3feYd)~uNegC^&GdVfd8EK4+Hp+64<@wY^$5!Q!38$bAOpLp0K&p-W?QyZ<$)1GkNOWyQ> zAN}N(pM2$C&U)BM^%s9MGFm+8@fRN2y5p4d&p&O;#%q6m!*b1#=^RG?qN!FBnW5< z2tmxm#{vS^ba$eZ-~t3LCLV-D{F)k2X08zAIU4w zqQlfTd_h4pU@GcC2EM092nt7~(;$i@U>Lu^x?5Tx@k7Jr2PI%mot+_(N?a>Yvk-m_ zQ@gsC2#!~xfDlq|x!YMgGI7CacV}zwUOD3dyY?R0@Uvp`p?su?Fb*ZxVv!^RzcH|H zJ#n@2yi-qoSi5-lkMEdSvKKw>;#Y6k@{ReU$9mmno-x;q3=AwN#m{{D)9$$awx9m+x=SAW_;RpVvU$xL-n`OVDf?BU(FDd{ z{_4gzzV+?b|K`ExQ)QF9`e+b@~#8OG39vA%JIW`W1X!!pa&_667DCnB#>*fjN)~!1R8Rm#A7fCKjTW=vy_kcq2AULEkmZ<4#oZn5j%7 zB58gy4H@fD_%6lZM+mfg^;y*o|1HW)zp8J&@#kP#)NYZ$;RAcWv-f_03?Ku7tTU3g z+Pm((bJtzB0RR}vS{)oZ5*3eskAWBu{R!irhMB6uj2quz7yPs&E`hr5{?EZ`M05<# zU*$qLiW%;bT$4(XyH}XaFl9k9brM$hOuWwlNzWyWh6Dfw@~dz>U)IH;27nL?lH3Th zlq?K-k=h&vaI4DF3Vs175DCp}3CoqQa`6#ev z05KQr)=;P%2_PZ~h!r4{tyBQUc3O?ar7F+BWQc%Bra!PID}=acU|rirUX(T1+K!Dh zdfh>{Ur$bs%q*0f*XP;tpsXYZ#JU`56i1fqcwSA8n*$57(gy=zh2jcouS$Uo2EiCC z40Jls9>-=2gh49Ij93FAXb{-#CJTUW4|~-Sb>7j6f`l?chpuixjRTzEQHub1_X#~; zWCX|YJo_c1r5{d3Fhr_Bktiztu+oIIjw)Me=w}t?#ojs#sc|hBg188%ad_09SNQfH$1&8|a}ly+WF!m- zCAGS%+cP{%QFip7A^VQ$Gn4P6iH}skl3Qt$hZtwD`w&~K-HujSR(-)uW2((+yH)#A z6Cax4MK`gS@lmLT%1>Pq9)UneQgi5Q*DWxESa)2fqttFQ9(3v|2*&iPdjHH)RUzbA zjdWygv0t+VnP2V|HT~?m8*Y8_W$*vXH;j)pj~+a5*WC|}JZ5U|>>Om-;-J23>w&pr z3ww^v+_U4*7e4XX7ryj)Z+`8I-}m?bzWLvfBE;HSUNnvZQsEM4=()bD_{HM6E1%4Q=V}3N5A?v3c-$i_NZe^4~rKmO%y2lpJ?e8!fG&pBz~;DM<% z(`zO!*|=`vo}X_${iG94-8i;y@3spsx?tC#V|(t~w&A3cPB>}JkA8Cfy*m${vT5BD zFFE_v4Wpfwx&5AFWmR2t@yM~C+}2;yn4TWVfNP=F*m!TpFTsq_MK6#?T>^Dqwq6fq zji+BK=Uoh0A8z|L9lFc3n*ju)ehh`;RGcHVa7=48BE%OW=t473e&jg4^Z=Q#-vA2% z?>6Eoko1bQI?bJ}za4uE%B zK(n3_&1w<`O$I#4>xGDTTw|nQAzIpE5J4)c7R8c<4oaCdu^!Cg8Gpc=9tr&t7z8sB z!%T=^0I~wPrh291GoOk_t~XmhmSt$`o>(hvff(}+K;gsTemp!?jo{_CmK7b-AQK_< z0EmdjIH>c7XkkL4(=Mwp3}bHu?4eim_yqvN)&r}=FeF8T$EBfj#NoRp#uWg-9gm!b z6?F3aT{Rbqq3JHO4I;vph!kyOy5Ax z6hvlb6~p+ib|UmU=uCuuS=}=j63+DV;Q@EE3kcpqrNJb$Rd4i!6RvHa_VuG@Jy=g1 zZI1MjItbG;V1U{H7z9RQV;xUMw8%n)Mf1x?kDS+OJ^b`jA#YHpap&?9m>k)%tps#e zVfQ8XTy`E1qSOEgP(V?@^tfPdZHa_YF8u0l^m{3ZD^Si39XbSLP0=B$5eVuE8@V6} z%fVfHD1%~j!Wgr2>(+m}`xby^Yi#1?>wgKRXpBzWar^B=ChK&V+2r}rLr1>%m9J#& z2~*@*KECz#JGb6`vuRE?C)Y2{%zpYK|Lz8^XpV^?WHIAw_U+#L#hw2RkQHOox7~a* zFf=Boj~<&nynA;(Hia2NmhXLV9|1^hH*K2!;%ENj(_i@PkFNXG)N`Ko_kZ_STesi! z>tEl32GPZHA>{Ycst+X*>Z}HMP^d{5TEssEzK}~xWK6#qBzjnzh7vg;HJFN#I^Tgy zq?9C~rHYCEjdIZNC5Jh_UH+~^98_&XXuBLw^nz$>&2y~k@>V30dc9n+Vu;LvK$aWR zTJH{61(3$rsG$iRCaLS1rEZK(dbbC`R#h?p52<~tUaPN3YHU!A&+u9&2wn-8Sz z6c$6!%mBm=Y7sPUBGH|@;Yu(>K;kCYPAiDOpfoZA@E$$)@Q`a5Ihs!Ch}!Daak zFc^b+_KB;H@OItReRu;A*XjcyG6Jx$u8Uy-S0}+Nh^AL@hMX}HNuxnk1tme3$yD6P z5kS~Ny9HH6gTBp)$6K`0vm4g556ulqD`QPMx>y&Tf~9KZTvf1tQ8r9KGb_7;ENft^ z$hfR43nGLBV+~+|9X+#SyKLSs=S<;vVMhy^DsXe7n#ybqaHNm7FSLGhi0@dachA)CO~dWR3N}C19$MZWf0agXF(k&pULs3WfP#~ z5NAYWVS%{)7N^>lpo$X^Q9Te4T^*wlR;{-~0Jb2JD}p*%>as~BHh~ z0?J4r^f#TRXi+@%NV$ZkudAI-m7OT+sRh@;@k2NgL3mX}*m~RJ z1T@tI$DjaleEi41yyvz%_ACra+O+=0JNNDVz~|9_k`3(#e}|-@fnd|L~=9VP*S=KHaN~-SF_=f6M#NIsLS|_bk5b zO&@s16CZW!?RVXD!(CG+p88jR{n3L54`VA6vDofh`?Fi_yW^ftvlwfS^lDs`{99l9 z`91gTyZrpq?zsPfJMY_(ownuXU)}!9*X@7xvmX0TAG-awH{4N7pZKPC{Kx##a<=8n zcm3n1x14(Fj$Qko{QK{F(q-q(&dvPbH}~L3$JP}T`EtMd%vXPS@X+CtHf_A1JUC4tll7P8H=cIN&u+Va+r2w1 zX2{h&_wT;zjypG=aKcqrKH`@9w%u|6!S=zf@ZiMtn`Rak?pv5cF*)#W?zr>8-3OsG zyB;|3Q)8OO+;H3dyALc9%C$egZDnO~$DRWOwPk@uUK3>_wcYV!W}=5bUgnR`zMsLd zgF<~c=aKTjEx7BZtO@A0kVPaBx296z6cm#LgaiIL>+Up7uMN6|8UuAAHB5JgKn_rI zK3;K1skExB*F+J=MiQ(F8sopB+}J^`^BsoEgta3{Tq3bw!OPI6N96;_AV5%XHd?|@Cto@004lH&@#)w0zj7MCMy8h2@iykbED2~JP{;jEETzj2>Ect10XG~^Yavu zFoZMIvMd;iMEsodX#pJNX+bl}Yi{$&^JQ5KntG=;7Po9?#4R3k&C-bMATP zoi8l&^Yem8j^u+_KtN>cX}Eq>r55U>)Yjh*y};FA$18^CTwF5y^Rn36+~!uMgh^<(m7Am zY`QWrV<4LxMPaKU-cdfGEy@#2>;$o=`3|=g501*L8lar+^E>H3gf|5#Zc)8yA&>RJ#b~Qe%ywZr6_QQ zfm>ZjCUJC=_UH#8?4Y0ezD6&?yA6pOgsbkN*q981|DsL}=uL;kVo1zFoXY>nUFRn> zb|eWM*wIAV04V6{3V?ws z7S4?zlmdN*UIi8m0u3r|^35u9vdi=?d4A`L3W%yc?bBJAtQw*B0-QiF8ZK4q$W!ijL8G~ax% z`qd0ARn%<2nh_prP%g+K{?roiQ7y;3+@ce=TXzjm*23&JIx!&43^SBL&C8VxDgXi^ ztQl7NH6io>EShC#bgF7J!|{UVORkX?ERU78WyqMu!TDa_&YrS%!i=_ldhg@?bE8l%oI&TQ`GS^oOopxl1^^Hl1reAe zh?w|(x-v_TitJ(^4&NBqMk)2#hNyHR;WW%dw5N-hCU z!|3<{mjK6VGNS2HFjW=u;fny23X-18yMRa{O722JWI!|_7V$s6jx%xb6%%`jK&`&s z*`*{+mr6!>vQiQ8ZI9PPQ;~|Au4KhH@k0#*@QYu9*@yv`0IfQf$5UC=#st!%c8A!+Irt! zK-=DU^0xc-|I@E;g=Su?S%Z0F>$dGEoUdKq?RQs}R zJ8s+#x;hvu&N z=+_}L&Gjc>Mg&;*`dijd{NrD|?COtx@llsPVrF4}+wNU+2j`&3%*d#egM4z`fjvjA z{?O+j&l;Q7akDvhbmim!`86Pc@$q6}QnCUD<+r}@O~_g_HF4MNTXAIE6ogu}@63U3(8QU}NLyhnJQ<^R=G<)cMHdLa+P7pWF&k0aer* zrRmANM`rf!-#VAjA5t&42f<;>LXs_Y7IpM#ESFm^vJmXhbqeOFA|+% zhnlFA zYZ8j7MEvg1F>0b`Z7FGu25D8CM3vuXyxq;ix_AASf1bw&^j;!TM#6*Ip7@gbg7@&+ z4KNLjKG>N(*uOzq>xBy7G7@6+|JQ=R2(^KVaQ(&g$Z60=yx_0o%*%iQjvc9Q`v~m$ zWX`id1qZik7oq4eC}Erw<3dfx5aSLtHsQ0>Ay79Yn1qlyPqKN@UdPhSWS%3A`cK`0K(8t!B9>XS zFvz7Y8Q9jm&|ef0W;R&{0L<+3SdK0+TU!g)?$})nj~sejB0}k~#ED8Qf}bLnesXzB zSUsnj@sF+52nGOGMKi-f7Uot4wzO-^lM>Z-AB{OD5e z`#T>n?cDZjKtrttvn3X(1zFHO6ev{%&T(O``hA^5;ktG+Zp(oui--U$m95Ltt*-;NbzOy- zuw`khGRPES<~U4U+p6vZ5*brh7SSRSSJqawvP!XofdwHlDEX^i@v28$a`9PbpM%E! z^t$T~?>UsU$JiIM5XO0m>@Of*A`}`DRBAZHpb`uXd{olXI3GY%VIO*7B5J8zt-dIz zMYufhEsZg&oNBQYA}J|UZN@mE0N!(mR>QYB0C(WVEE=ega8r#E%`g8&7g{N(qEVi+a2XD+5@n5c3QG zfPL*r2%028b3g=gcqb2=s*J`_L1q zZ9SI5bV19U9qqz$#VfV>_M!H#W_kyEaHwpw8?dQki%fDMvI0;c8AtmOg@9baH<8;+ zMObPQs4H7K5fjM_5`bl1skvK21!xSQNL5OXFj7ES12X3*XtKqDZHi1Zs9)ASz~x#F zFIFdvWaDiqF`r#5Nfu7oI65`iyz8*tf9>3pub8~xtdShJwnUhjoJ?li=#twCODtC< zmsQ;>xhlcd8L-J0p|^sY2*%cc5V(C(y?_Y-hxG@b{LTXl3Hr@ZEubI^xO0Rc)Fh?s zEr_vdCMa}~|13cP>yw0T@i+ln3!3s;4Y-OIo;W5}9=)z5zx#LULx$h|M?UKonjXRy zQTZa+q;(amO-p#1B6EnLC)q*}OgwZ6XfR}15Ol$}4u3!}ZHHdx;nVMQp<^Qw-Cdsu zbhIg?5Ru~M5gOG{GX%*1y50u!Bx-=%rpaMULPtTvF#&*mCzGsc7%S1{sdS`M9LnWT zm-7(>qKILwp$B$!rdzYgL-$JNX_x`(@9Olcon7@xW>q4sKpjqmp?;-BFF`alNZ~{1 z5^o(nF;T9S_%(j&{8Q9wdxebmm+*hA_3+x5tfLraD#0Xr5kim0NsWKK$yR`gIemU(QMFYhx>i5dd;aZVOtI6o9jlhO;aScuFASD zo0Fq}RQHxCGuUiHUDMbI)TLcs%*ICY@o_uoHrG$*CvAe7%aysjz--IucF>oq1Tsb} zwHju8M9=^c2v^;{beGy2N3&Dbv$a*P3m`lwi>c9K(^|1*xw0&P%@aZ8@O!cx{uv_5I0D^x1 zPk&sxvmJ?={r_sAhBib$cGAg;mLh&z4-qAj67)!=S9G&g007`1-lDs029E8YtbjkH zqH1YYnVXbyYLF^uQjFs!dwh6G4IwZr5S8B}v~Xnh;7t%{nku@|GDM_Pt#$lfjiXvD zjh+%2st3Jn-Sf?5@3SLQd2dek2zSP@SSuzIB0vLzAO=XE5R&=e$CHaSVn&O`1{odW zvVw&b9_g4X-(_#?;QjB%d>~l(vjLF-Ot4oDhQLLsg%MClK!}LSs;+zeQ#NmY%oSIh zdG^_Pqp@q(uHW8r>$V3T=nkq*vtVZSnC1AWP#o`M6#PflOA&#Ji02T>_C1A31}ENU zI63uepgpxlu!>x-(uvXC*NXdspW z$?b-1MXasS)o<&`3TjtW1R?k&t{=F%bN`Rmuo+G|<$D!mRzQ3Rlp2*ab^x$k_V*oa z4C=<(HP|Saz=CB2L{~r#K!{`v0}*gxc+kUoK#f8Gvt|K6wyJ=|S2Sb>C<6elYP1$m zz#vIO=6k&VFf8|>XhCZn+FdAev9&I5(K!hd;_Pa`nScR+zGU8Q^A>1>Cxv=CkDq-} zv=Z@EPX5E-)Pw#6B=xd=Y7hOkw1{B9D+quVC8YW7>1tsCl)0*Z_`hMtpdg35Lf(eR-7+fbM%&U~y+2W8`{bC^l^LvbQdX@I!G zFp(+W*3h#!7qJo1wU0#7Mc4H+f#DnKz^r;H_r-84NLmzZnjcC}i$iOpt1#4Q?QATM zOh#D$o=mZFQ}n=~sO#}!h|^0LG)ZnYba(XkN5Ht$)I}9U_Yeg@U}zX<?z=B00649s{g|3l{h_TzA1B47hGlNcsT-jWp0bDYp zAuz6)7*Zt&N&Lubsp~w2(eQ`n#4aNcRE#A+DWtm%`28j-3nrtSGN_={FjXPFfo-<( z?sC-`%d!jyrHpnO0207hypFceSqEl%n)uE1#~G8OC~2|HpZ1LS#+KwF^cCeND|F25ur6A!oUE%ntL@{ z5kpxff{t$zbxbu@;DVsk1SBY8O}-@66v9M{`YUxwG-stfu#+vCY-hIOl~NX$E7Ov7 z6U~`r`=x95FRq+$#iQ3YatmUFvgN*=JJO$@=`{>auE|G6pg>EuLa7lL34shCNWYIu zv(OlkoIw1deXtD7Ab@&MJOa6mYTf>IC;-AJR{T8iGjl#K~WkbXLJU*j)h#g&V`>Kmp(5fD&Cq zq!9biTL!)qTM;xDHE05AFFf*v!GR=@r2SIYUc}pH&yiQL`{=93h?_PSQE#72gxaz= zHmm7?_A45xVY8x=758Y{@3VB3B8XTkAVfxLk-8$xzz)DIkQ~&2f?#A&mAyU)0}=|^m1Q76%-q@v zwl()E0YpJ>x{$crE4zJgM~fi=h?IkJFc1J&%E;YiXSSp)#UKE2IT)0EC)flTfM7M~ ztl#+E>wf#)Z~PpLh0aJmHYS4}2osVE8FRlU&;uXri z!H^numkicIHbjlVG6EwKm$kF~T$k=BdZ{Y`cRHF8w!%H{BKvi$wJ@MNI$T6-?UC0z z+BJd!5Ruy1Vger|Ww4kv+&iZuNQ7bm#o;;nsE2Da0{}218k8FCfZ4hNLm1YZ|K|%8 zYXi_pK>&v#$U`G~hAWZ&dBh3+1w_nN1RMr@RWuKIAs6VM=CMc;BIX3%|2-Q* zvEU1VpVq+jQSa_W-;-(f-wJksgJDYE1b~t>tC>`QivS=Q08z(!2Y;F^{E&)9 z7$XHTi08HW!7(fhfRvfKEU~grf7(<2>fL{N@gp97bZ!O#*REf)w7l|<|MY*a`R~sz zFR$dyW+jYB{**X&qQ;2MdlV4?t~ofmh<+6}ix7wikqhy&*KrYdhKkGNiFj3kFoz1V z!QVqku{H(^1cs(qi@TjIjHNx%_Dd=Xp67^QHCQ=1bM%yxPF!4GcIxkADN3TqZyTpF zmWU`IH1f<@cxFKZA(|eI0IC5?9K8R@NF-wrQC`J041)VBE8Xzz@?JWDa0N(W3yQ6pBqKm#L1t%Uc@alO?Vy&y0GlmfwAO82$^bxsP%-p+R9hGw zkycZ%L?WtcIWWU}jsRxR9)oHCy&hDR=dW6678E?4-ayt8YmHu)5!Kv>NTc}jW2cI0 zIx&t9DB6fJ1yVAQ$QB~_z0JryB?c@cxVr2c#yY$rAY4~MgsrJ{?&O}jwsl>C=MoPY zoq|BJVsF(215jK|Au0)C1%9A|6u>g!4NeqR5hL&bt&BmDG?kr*#gWf>XWY@^I7y!J zK?o~{(1dG|mSwC;VFu}q+-R6qMwRwhpRk{yu0__QO%-3YJ>))sH@ZWVvtD__gI5U@L%- zAsB#OpUawv(27{$++-^inI2CxXvCPATKa$smfIz_aLc^!koCam>S1U6N`+1Em*ff3&^0vx&)Jh zt)VKxTC7+q3*sVYuI|x*kG&y)h+FJr87+%t@o@SQPsrK%WM+~Ubfk2J{e0hNq7%$KeoMyN3 zSR?h(I0UYY0a|0G5fNEkJiV2Ao&I(0wNeONMU$w$1U-GQSuQpVB=zKvxg9+alf^u)`hL@uz z&-58=OnM(CQte|%;H4>tgqXT17ncO~(&8?X*w&#fG$V(s>s>~2Gwotv%7}XT-(Uj9K=eX8P3PFkQE@})9}guB)VdXoH6#G z46LigQ1f*NF`)|(68e7f5&ZftD+01K-&(&8*R2z-gzLJl1pxh$QUaIK1aLbm0E#;n zHO@8~Ak<26h>wVE)-*pvp6Z+%)sB=Ei$aLQ5VtZ>6p-|}NRkW;0{LSwy)3%-5DwjR z$$JEMkhoK)%6Z4g0#bYYVnz^h(j!)o(DtET0jUKtjZvul1@Y0Yxwm2GVb_~vqkGRA z!zg)r>E|L%Kc#D>6Tpm_MNn@vLSVQ|ctk3t3_D*lzQq!Ba$O#1Pp)%u|3Yx#pMHN zStuhBtwsn#&VDlmli~7%G}uoDT(J<4Kta$ONb?k!I34DG=u1>QM|SA%5BLMG3;@6= zNG1~&+wHyb4}Sl{SO3e-9lQSEb+5nShFjR$M_uyBKYhpB-}l~kp15i4o8R^qBY9R= zC6h5kgKig@ie}5?nXSwIO4n93pyXMe=NTeeMr&(Z4UB1IS?1uR?Ds*WXm+Zqd383E={->&KynL%ptog%1}O4+>kIou@2fLyXPSLe^M7JpYFsC&Qq z^-tG4<9VHCv$EFxEm$LAA9rw+Nrb(7P5=N!UaWMxdv-lg2hUI-5xms#R0&399^n;j za^m&DkQydN03)Xf7fXoeDH(C8Ff?FtSSbfP_YdY48|&9(oi-p45;NHDlASqFEF4@n zF}=L)$Xu^9r=Kn?P*qYhkN^>};LHL%ctCdU;hAIE8C&oPSJtC#oSEm{2jSQpHbBR>$HBpP8%|!EZC;v@T|!wyRr~OV4d>AkAR%ReR_hXP1`%N-vIy?rF;KP%00P#L(Exc6 zJSX%Z=VXi_YymIgt4KhEtlK^{G2AI94B)>ykD;0)N=J_8AW4`&f2dz6YW;?kRD5tc zsI_}Q@b{ww85Jf#XRPw@d37z9h(uQdB&zP-8b;4O0nXUw#Kb0=s*tKRgd)Bv=?%H1TX6bovn z?a>zMB35mSpsD*kbmw@AML=nWEO+VQ7|b7z)I&l#?sBajCcizz_xMzSLcxaE(qP_~s3% zz;Q2M@Q^qy$~>afqe3M55T_rU#03x?!`Qb3c!wndeL!7eNIOiGXsNY;q)f)oNdhO4 za)KcEJw6;9d9iXa7Y$eHB>8_t-7EnBq_7)&Xs4tS5+dSJJ+-b_!5{)Vus~hbjq})y z5uoLa5JiXqWb`zPBgKPXhZCQ`jSZ&141iWh52Y7ifU1T(LtE3n-@x29SaYSc*7zb3 zcD4x#3jhPc=%Q{SKw(i5QaE=U0K_0smNym-A9~#59`kp9`=0yn+y25AzGTOayGKXI zb3>o|!rgb=bN?5={JGQ4ID5nT4Kqh))~;VWH#^r`>8)EgPM9qZ>|oF=jK<6 zW}amkT2>&4Qww2;bp|5;004hNozB0>Xi=debo8BN? z8NLw_9Ft3=te~=BasUAq5P>`cA(&kmEG`emM`>i#0Lt7v@`@bWxq0(RuYU5Ye(}?9 zfA9JmXv-P4s$o!~0m(C3DRJ9gzWaWeT|gmRSmL91!uSR_{Uq7GQ!K#91R#O0Lt{XM zs)9iYXuM8^-l{rFH1WeeZ=_eN++4RpOVSbZ^DaS=>FbbhEg0M%YX@ZD#r{~IBAS~ zsCXwm-0r_&&rsLKH>=@)%i*m!P3WiT@9S`USBG4P$}KV6!k#0s*v|d6wnY zx)O`b=Yw1Vo=DuX1Q(KW>xV%MLPlUfP^7kO5Ng3vpaKv;7PmdObHE`Z06@#)j)f$U z!bm|R%r3_#gf$j(Wj(@ntZABDEtFDaxu8K3r6EynG}_@}Fs^Qv+!&MlUx56Y9B`IZ z7+Boqpa2L$z|5SP0h+RuJTs+{t~Y)8Q8kns-ca8lgFuB%f6*rY}Rf_F4llp1O(_-!a^cK zMlwKQ7VDK(04mFtfrx;RD67Svp2wCU69VZ=Hdj>}3s}>{eh-%i+-=y2BCiG(47Nt{ zL7x|w>Q1L1w2cgFTim~=yJb`B#OV&RSO#GtTaGngq-h40dY10mE87m#=Wl78cUmKF zKn(@vqsWHJ9#$2U74%D}Em|v;h1yE(Og;f1lR-qc_DB%Li!o*d0JesV5E*N(Nf7;3 zH5_D^Rh|W1oGa?HhBh?Efh-^v1b|qWRT%==jX0FRLVyVc$b|kNO+Y?|+P#A)`epYmXPpr+4!gG|9@F$^Vm0*t7*BU$O#o1j9uP@~OU*PV=Fbnb zLP=QZ0xYc2{FsK(*;aE9?vTu|GQw!PLxeoKK1m0LQb>sz*ET2SU4oU3!j?>kx>i0; z7G@cI#X@XqDw2M5H4dgs0mCC>K}?wMFu9_2IuNq(s*tD!-$CYBk|YPlhbP9*$vRS& zbGeNDd77N8>r(6G)w~B=7<&-MFj+7xI-?=Y7XA|7YM((LVWXHS&Cm%=mQDH=56``b z=O#hgbiTapRgn&liz+3cM|?YoG10q6jUxoB4;+Tgt5w=4&rHJOV=PMr$q%^pFckys zh-*>gX5rBgzoe3+L5pPI5~8GhScw&e8-_`XM=J<`U)B$9HxdhMm0%KDpP@5Vr!F-1V7Mf+swI);$&v{G_qtyVb-009tM74N!FakwF;p44PTC|2o?Bb%BgG zKUq2_V7UUoA_5i>YqUKSi$SBw%c(!!Pr$P~K_DtFNgYd-d|pa1k{jrK^p z$lv_7w>IS-#+-AAACOp1foO} zf{T~Z0@Nvucq1wjYNVrZBSslggwcPz)2G%H0E*V(z1zRN_W__H)lKIO$Gf72rbPwE zC72o=N#F|`ItgSrMR{E96QaBJR* z0>Hv-muFUlETLcyP>iA(gJVaU6O(k#S&$Q~Sg064Xt6K1ZRh)UfgogUF&UOjAW{k} zmCzakBCrg|Ds2W3px1-`08N&3E%eLHU|>#a-y$ADWM!&dPD=yJ970VkPrv|i0T=@| zd8KuaNkah`1W7B#hRvb2GENBT+y+Yr7$2hV^;a4Cc5Dzx+72x-ixFKVQ*q!V<_5x7 zhKPwI?*iooP@)rL5qy-NyilhLHC$^PWlEAym<)Yj5-F?pu^tLD=rtsIO&mMM6wRUB*dAGjFjgieMT z1psh+baB-%n6(Qr8KJQ(;&xI%Cm8NfS=UcOKtmE-M?%Oz2w4PK!~#?T7NORsiUtJ4 zLoa3q351yiAScYU=Y$AG&xmO>dv#??JKfGV7(OL8iJ}UL4{-!q;S7N{2}Fb> zApKqsxNa5&Ap*G~3m}8y7vB&fl0gP^r70ydo1$McR~9pL)q#YefEQGc(YX&VC zBJi7dc%Q<7pI2HzM}Hl)b{ROwZJ9|>j6ki0@u4tUspF7IIZlK0+K|Cae3n2~QUeok z9Fy;g+7ZQ#pxTO7n#)r@s|lWHtyJ!#`yZ%7nkoqCe#8i~(W!|y9SY>CDF`^I7z)XQ zwH=C(8e9Nn-H{{tTY5p%%(T|ZYuCI1Q=kkZ9SOYCe*Z`D1semPe=I^8utRMMgGb%Gs$Se)9*Hg9lGPBd>O013!Y4 zJQt#JhWmxkJU|w^83I{~BZ~ftPeBO8hcv?k454`<7BQft=os)`Nt@`nGJ}XIWO+N( zeQb0xta22F43}%WX-o6M7sK@rz@2|v6h(E`bL-I&?g`Yj_hhpSo2A+RGrH^FdG?O% zglF1yj~1vi86cponVX}yvRhVm>L#+z*CqdK6!JDH#EOKnthchfX8pSJ9)8|^TOYXT z)>}R-Fe5yKmPGEA9m&&|L|46^Sh6K&huXOz}DLzasCCbc+ z2nc`-8?tO+bko*-OaJ?>Ptn9gzGh81+k;*OQo_+Cx&J}gc^Ie#IYM1Szvjx?iE)^m zkh}qu0SXWS3LpU^5CS92FG^iPqwOjHJ@$B{@P2nt84R-!t$y0`Xpv*@qZwGOmBZr{ z!Vo&w?m_VZA^Is{>>y-r{Ik3?4EvLMX>2pa4*KgA1GRBV43#TDBIL)-xbpMiPs4+g zn4mUDaXpfz@Micn7$wwM^bj>ru?(ZCY*rFmr;?`nn z0m3)EQH$642ZSE^rO1-rQ)A*WOp%IDVh;3;s1y!0%zsse?+|a4yp47x3Q5YCeGEwJ z>BB%K60coHmvIXc6X7OuFqg^VWcK6C9G6uKv#oXhj+{X%mFUMe3HgC;hdwkQ{wste zFnjm_)y3rGWIj6T54aMBunnaf7DNy<2mrt=goMBZY*0kRTE9?OkR%ogBY;?cDuNK9 zAk-`=a|mvmP%gCxQx17xyd5q!!- zHObRhj~8y@EW7B5Fk3{+Y*h#mfh~e?VW2Ps0F_|PA{w*t#*xqstRQs7>|LxG&;T`z zRJE)iEe^O_V@_NUR+dq~9ce3M2BlxRfg-tq93dmDS^SAQ0zT}?!Ymm{3Ak9{R7*~5 zNyqTYK<0ZqVN4@KW~wVo8G)Ey-`Y%y24w~J`q{nvdtH{zV+B?NG)9QJ6|MBSVkRt2 zo-^TZx2?1~=HZWBljRo560i?Y*Vdx1W)-LeD(l{}+mFO=N==ZNilnNGr9rWO4(?wt z4=!Z=0iASAt~#f^X}T^GA**a~?ulACyHsTxNs7oMIrbQQ-? zR0!^MiohC~@b?(rZ^_#faUN)J-NFEQq8!tZDT_`*60aY>>bSJyKNQR1R|k2fr(bPIWW<~amSlmU1FSIUQx z$4G2L2x=tZ22lY@>{&vVL8(=wCN2m}Ij zfS&BBg{(u=N(;=AJ4D*5V;!L&odjhi?n82hQUEcmO-_UZy=%|0{fbDaTr|{MXh0=2 zlq2biT)=lBG(1EhwEclPJ%pSdCyJqVA@&hLSDd*gke-Ax)G5F)qe%cF5*V#DiXD?U z&f1jFmq1p8*$N?L1xY1U-)1dbb2`>5JhRgp^-yk|lty_pIO3~YbfX|`SVC>nV0Th%0sxufwQ_eD z>bMe-sM4V3M4K+FF81#eS@m7_x*diDAQ3wN5V4Stn8oY(z>D#W%Ooo-R8|aTIUwWY zXf{2`M~=Ylf0i%bE@!@}9zRJq0|Dd}=&zW2zDip^ipxhRCz{?Y zKTcqu0*q)HV8I_sD*^&CIRc#~R0GH|B)1mY0lJ0Eh#)L3Ak<(o5vw*Zg}WFv^)4+A zQOUq;q8*7AMnd(g46CP~^r&>GpN9yS``63AMAPfXJ{7iy4oP4n4H1SVJWIt%85hRR zD`QLHVTkyIH$&DnvWCzj9h$`CMv8!n&DxM)kRkm_cx*5|k@l==nAaNrxhE9fiyte%}nx(MgA0Cr;vx zG*X~u<$r#OW=%o6<-ZUnRUhF6JFt==g%1d(E>IxjI<>><;6prV8@wI!ebMYeyhtT6 zjF+}Awm~TMe$op;S4$$+ww{?e)?J*NoSyEiS&yv|sFB?UkVvue2b_*cmLY)j0ZU&MVQiyys9%j4+Zt)h zK$a?~tz?L{quf5Z9Z}YS*^P4Ypg5Wn?Ss_7+8hP@_o2ewS@T%m8s9+2T@m zU;%f}@ZJ?(s<6nbiK5P%*e&5}H^Eu!vqx-cOm?`Dn;e;IW)Xijo?tW~EWl!2CWA$7 zx}aZk!Dt*0U_c~9jwK(7W<>B$NMay`!4SldV~CKdo+KC=kPZTehSUv=PgOo6A(-jj zdDPW~B=PGBi@^A?zmGOAqCtoNNNPKh6q1LGWOZk_Dftz_$gH-*_uNB{20XOH4}!d{ z9^eqlz<}M!$ROyZ5TU9j0J}PgBCZ-;E9^qBJq9mOO`+?H&SuD;fdoH4jC^RWk8kK` zvxtk@iRX)}X`x8qPn+wJC6hNfJ?(0O(cOip53;vFQ4 zU65S~?bdq=_$`VYbOhHpY)*kX{XSF{=T(wcdC5ox* z<hX9iF6?H#z>JgA`b#*`>m+4bAFcqiWrPn-7PFtpkmAFUIa0D@QmouZujGd=D z|C&esx_k1)1Z`^p%BAAApYekq%liAXcFS^J-hWN8`{#{QUpSa}1lVpizg6~MSI^yo z$cPQ*n)iRljGqGQAH&UDOeWUCUEhSeKa#;bX02FG<7YYKT0=~YK~NZwOt&}acDtQU zC(li<3$`3gO^(0hMbCNq)1Fig>bx+`W^*uq?4}!UnO?L0zI*Qf>X*MZ)+u`V^yQad zvUaNT)~l~!yS(|-^9~>0{fq0q_4Thk@8V0&Z?#YAc30Y+W?tj~48lmz$a6zz2W8$Y z)~*@-(f4ou^fgyctv$73d-%ca@B6#I|HQ}t<4IRN?lYhIM5}XRU00q6^3Vi9m=@Kc z;hskOty2UMDu->g_)vvTsNe6|1Sa57J2C}?C_m_ShXpYHp6bbkFGqaQcgWIcGth0oNep&M^Q0V1|qUTX3WgyAR=L z2ToikSlg-(=#EQdU<-uM>EPx9DwcgSP-S2U#6q6S=m-=B0R@fN+CRLuKz%40)DxMR z0RS`vHf+wSEX5BCdXEmtlaS+GOAOK9p=`8xp1}^b1Dr=h$JD^OCz3}Qbb$}@hizk^ zCCUgS@E=gp5+)SDdoSwo1PhXYewfi{lOzc?C*cp&DU;wQ4;kz5)=QNHqLs)$YO~w} z#S2AntbG>(_X)0=qTul0>18U4zTPtMK%d@8xl7Q*kk(OW8$(DY2{0)XhdV%MO>)n~ z2KX_+Gy)Oa27py$z{TcLWz$qGrk@8IrPes@eF)K|$+Bb&10xX_(rVQEh4eh<%QO|P0jJOSmbQQ)n_93wW)w$2occ$Tan75Wnl1&HnURqvij!jLiTUQiCZT~;Q{ygBiqo@ipvbh7Lou-NJt<+ z_C4>uKI?t%a!z;E?~m^4?(@9i`@3S^``ml(Io;J&pZZjFbvKCDAW|Rzg3?+v2E~{2 zcnK0x2|XYP3K$d=^bVMv02+e;!r@Rbk-o(qffs27nzVK`r}cv72}(R4fRGyR1*G-R zcyNG*kk}8b5W#Tb9TNedfcIVi2!T*4YXG2i(29rf9o7W+ zvKFT;4jUBYeq~z6lWA*vl@l0_U0q?X@-^X@@uAZbBHA{v@F9yluxp7J~9?4f=AC+w1)gDEx>X27`b3yQEX0)x146fPqJayZoskI7v8| zr@*32i&P5{0*3Psvk%qeMP&F;W`8st1(-@56U1U77#O`+*O1F(ddTZ=u>e*3DIy$Z zo8sTuO&0@SyvcEDI0>ukX~NH?Pzi00y3RCVmYs1VDrsqC?qm2nP>)1!R3=a`0(Ilj z$>|^_U5vL(N}ausKu&q6lY(^D?mO)CMLVR-El(szjnHKU<@JC_WIQk5*^W=rwkv3M z4;q_RUMhbPof*)(Nijnif^o@;nTV=}jgrQ{qysrhOe5TZ2gxn~y0czUt%B0CK&lrO z{ZDv&(rXqJ5kZN&0Yp22G?5cCFRI4n*)mu(M#WvGTGF^{v+`V9&VlF!N=mf1g*c)b zC0bM_JM~*-;rbwum@`qQub`&SBb7twwE&1P0*0C@0z{dd^=I#ejnjxI(y(K*c+f0e z+)h?_G9)q*SHl)QG`+H|CDkhER@9Lc>L-B8R+c-TOs4=S)N4dDW0`K16Q}^XOB0BM zZN=h7Hj4j%h2$;2_16Lw0<`TI zp#|u(pCC-EL0-Pc-Taeg_K+-H!}SHY@>N*5(GXH^QG82eVxbg5s6hx?lwd9li}$Xs ztFy~z@4fH-SO3T>o_y7%*M8~~+YVfIZhifoKl$GO_6L`oJ-hOp=RWt(KKOyP(FPg- zV?+e2K`Y|?cxHC?+}h-!qlcNzupNtlV_IF`==J*xOLK%s7*4yjwyH?{pkE;ZuvFFp z!0P%s5wbDObOKnNIlDrZ_V3#Z;G*V-t1%8%)V6@UamX-}00k{9#9o@>R#p=2dJ8<| zUrS~RsE!;Jq_ru5xkrO7=SVxgMjdtn_;2tknMcPQQuDUF;%ul|55~MpXosl)TDa!{ z_~z%p>;Tq=MKsldHDCvD?-{u55g2)?kS^QAt1e<7m^45L$Uq1lK)m!TxO6`t!s#_& z0wS27!<`G*GtvSH3KNR}u=Eh^9L#UWdym0m#}Rvk%>Vf!{hBVIV>lET7T3BI2YP1uJuZf~dFM2hvw;pAL0o`ppa zu`&pNo|zd?pjT0k&@(pzPA7^~?Lj#)g9w=*7nlk=56*jsfPf@m<3^ycIp&EcK?DL8 z21Elw2t>w2w-if_3WF*)Ygj~ zHLds3t8lh&H^%(%snI37XZn@#QzwET3`79vy$EwES(w4;rsY2 zN9iS3Ej)2w1sh{POU^rRAP9oM5>F5U5pco`jKCP23>Xj)6i*IfwMaTVwo3=Q93#V6 zY52)VB^j?o^zZyMriRs<Ouh|ND?JK zcwU~Qn0YB8ZA}kmznU!|H3hW_O4U2*dCt)*P6g>l5Q`o>7)Fu5NE;%Af4Kz7>=Us2 zXLjsy)+A*UFnN0|SnN#fMsJM;4u=;rN2a22P6+_&f(r-Sbsn)V$s>vq%Irc?my|su z^}v++DFfk-+fR`IC}U6=Y#phfi5kr#VDkH_1e!)F#i4f8q7RLj zi6sqzB$iIaoN>p_Vl_wA9M}pXuL~I{>B@~eGUym@5=vm3fTZht3Sjrlc-)Z^U>ly@#=Cq2S9S1 z7>P`_-{|0q#$c=*FFTpOCCEt=#M~c!Z2C`PB&Eo+3u4HLkMu3)$BD#|Wd=WW%?9$6 zY72nUEW^1CSbul-Z6 ztdN1RlYhVzD**^|i3Ek-6&9n(l#q}8YoPvb ztLzdYb=+a1bKyCTrM3ezdBlAACzyLoGc?yTgPMWdv~{pxc3)#IdNC|rDP~SQu(a50 z%J?j<+zTgf_Gj)uce<`DAjs%G*tp-fWQeOl-{U|8(bgz=ZaFy&Z49SgdFSi8H(EaV z&maA_*T3e6-|}N``NHRJT03`YZfX1aaPxDY`;4{ts@ML9%HsX^Ju>LkJ!>29rp?qC z!>&1X=G?X&vsXU(im%*yed}@BwDW`df&=@VYsaHe-KzzF89~^2u?BZ+TVn4)ToCEP zwgqMwZH`5p$ojth7ofo5qsK#$4r>91f^qmaE-o8XPSrb_eZ@ z-18tDKL<}f1go17!aRc|FnzfF5%}sc=r6+VIdCoCe+nDMCtV`K&`iMy2*k~DyoaiW zOD}}k6*#d1J%U|}SkLs<+%~&-fEIVp_bTgGr=tg^D<_Dl9+-#kZ;m`hv-5%EL)c{s z%kD&=2z430X@Q`wdn|xR!r)zFh|q*~=zg~t&RGzM1E{k+0=}67nYyZV(u_ev(-@;7 z0wN+Ips;USA3(|&vet6QqsBd=MNw7M(;>P=nSf%@scjpcPI`j@8Ur8@ zssPhiXZjP>LqVg+!stD*d{fRS$78~jEu|Zkz6C+T!N!^?ET9<6N0pd|iFHefCONl} zW+MZ-LqZ+(b$MTLrLQrIgwbw6*?^+3UJ=BjJ3Xa*qmudD%$PUnj#MIl+7bl@`GyQK za_YETuAv3~oYS*UK zV%^NqlpA4YaUvoPm?su0B3_CSaKX!{8H3l(@;m&mcUXH zA|*J;gf;z8RWr9T6=g*GLron+i5MA0WA43V-6_US3r-WLg(n81EwEU*m;!Uaq11~6 zm{@j3Fx^10E`=_-JHmm;j}?CDmtt%#Llcakf{B%vrB&GZOj+zd$XL#fr#p(rm+ z-bUiV$l7t`66GLo@k60 za*JxI!?2*?IZ*0LW> zgPmKrMVf{G%|;E;eJb7C(hSHp|2U(l{VKFA-UyS_J9GD`yZIiuVx!Aq3J;%RV^!Et z&W5RBokkbbq7#FZ_7~bw$~@0EB?v2XX<0QRW$VUfShhl=^K`FZP>(O#$7dkLxUude zg2osyJ#B>`dTCar5g>zLKsY5)b02eJC6GAm+&`&z`ZGcbr6EHVTV`|}DjO}2Il@G?ixDsFCV+wdUNd`Pz56L{{Q+LT&pVL0tKf;RpI-94zBdz2N&#o0H@19+@ zvWQ`d2~Azy_N7}-9zFFlKk*Zv`PAn(mQVFe^`aNQ^!vW|#h>`(XV+IwI&lQ>>}Ona z?I->PoV(`P-*ovCpYZ6B#{fY9rxO6DKv=(i(vz` zdOesr@E$6Q)ePMJpxk`|2HT-uLpugzU}?J?IZFa~)y0eqJV8J(C_r)9OJ#A-cIX>% z4b05;UGF))eLwu{r(d&uVLQP>5BfFSvpo91XKuXVZ~rgfblv)FAFR=|WrB$kiFJ$x z7v|?d{Q79r@6C8-q-v&DHOydr$(P zDUYzap8(Od&VoCzfB*I!yEZpAPoF%t*)+DQK|F-g41~D65K%011gOv5ztwfrESRw7z=~~gy96GxYJgL2&kNc38o!8<2MCUR^3dERf8xHGjrictj^>5 znrw*fT+U#z{#!un$>rr#r-t7jLA3lC$ys^A*?}5b~`)y^N zi;A8?vmo%8AdS0S$HU=J*cihgZPQw7LD*U(Fw@otU9gCiL1t-vI2&9&PM`r8JU1AM zSxgpey?6%JeMKx%Z4pIU;no8{*tk_dxM46r)}m)OoeU^d7)?4THbW*(S(9y1OUQO!=AA+m216YCPP%g)RQ#a2R}b&hhu;E^yYzW z{mO!42@z~iKoJT_7#1c$1XmdXYmSZVW9y#84+w0(Vrv#c^N^T@IgLGT2? zBREDQ+%wb){>yD^V9fo;`AHYb%P#NDVGGW;-X7V2FC3#UpYT_0hgTf3`*1={3m%vm zfdw5(7*50-tqPQ8R<0^5EH#vFXzDgOJ<&-NKuFXjtAAnqxhMokm#$zm>qL@Pa53s7wbjm~k;o1R(+?1|#=PiH?nM}k7#TrwGoTn>#JcK4ihkvGsT{I!^DwAV zWFL$9V-;@c&T_iDn21!tr5~s6p*p*=>&4f~Q<6sqL<=UTandXHJsrhaYG5IQ?$=qa zrFZH&|7d@_@7{BTcERSm+D_vW+AUgfovx+O5%|aCqFo2 zPNW%G|Fd8^kC)u_pjMRRlg+Oju6S*SG64X_?O`HrC|ni^S%r=S!XZI|`I@{sDj|93 zPnRo&?=U~jcB#9lEKA8|rPH)U%&SY9V~j(DF%zRV$s9A1*XW_L&0vc6Ku|~=w@ouR z2p7JL_dU;C{M3p!+Ry$1ubsl(-!0$tKDYCUGHJj~005966otnBiHLKDUPAk?Zf^N+ z?(j!watiwg@R>g^t+)q2!Kbb_!~2bljj0$-o!`zJqx0xx;-3!e3?tFOE63qSu0|M}e6!xvq8nUGYruIqZTIa*v? zy!+0(-}BQy|2Kd2Cttbc(|`1*AKJTn@0;KJ+B@&Q_cwp{50IvJ-*x}PkDdIPpL+Wf zE;&RMeeZXFd%th%s)F7O0*%I-`}XYorw{-48$SP~o4;_|o8S7Hg_-IXfALq3Ja%|t z*Uq+`U{sVMo=E_rII5T!K_F#|CEKuSJmegT`T|AT=#)y0NCSvl6j{IRwk88xN3|p| zgm{|*GLnK6L(;7_Pbv)nSkAbd2Sr7Q81JSAV=6S2+;lTM;~Kd50yuRBdjp`J+;KL97!5{wq#`@6I zJ@GC~`4WJL2LO>+i=Mb1iy#_|D{)ELR7#RX_8{y4z!=*Om!JIH7rpP-e(l|F|M9Qi zbw_V@Hg0?nW-Z9*u#2z<5JHOKAt-AE6qdMmZ*=uRlNsZ(9R?v`mT2sZ0wBoXnHiCc zHPgv-Fu(07&wSG1M;<(J@tR%0%{nEC}OlV}X`W(>Ygu;1BKNT$vuDHa4($Mr7IkdrKD>wsms8nSZ2N+~kvW#x=Ul0l*IWW8sHKZbhaS&Dp(kW|7CoPTzm-)bZI1pI~N} z+O|dU9O*+j<(vpB00;$NO~HpV0t&NAES#2$EaI6#kP$fSRV5(6fQA5jwM8_51VmxR zp2!$uMBI2fI=8kunl>zKDpQ97V-{vMMBaM}DFz>MfgloMYhjR8j}I-6dpmL8_L|};?`LLLuNX4637Z6 z0kl5U$RkTw=?Tms=oS%RAQVPmMr4Vy0P%!?2-bvEK;oELfJKNf?tdU63}{IhTGvu# zMG#uwuh1GXh)&4I?#9#Ln1y0G3cZu z)7I9{^r%L34g`pZ0Du|TOT+_JuLv1PL47>|0t1?{!=~Y#+Xs)X@L$}@i#4O6WNg(U zQi4)(wD2qWQ2>|?KY^uW)Kow$@1vwf*>)mP3hbE4EOt^VDLazrg(Ofb2ygl-u^~(y zNvtafCLyWBt`zGgMIk5)K>d<7L)~o$A#;XCI=5G6p_rUz&9lGCg)l*&l-jKBLVr?T zjF?5F4by>))$1Li*LkV_6s1Giy`lQGJh}CENCgrDU4HkFs6*ywTF{^+l99xCG2=%1UZtmqA1z!R0mf(rFrVdK&R`=Xd{sFF%MXGP=NbpLs3$To{<=THhp)ABPjb)xrFQ!hVYmrMFZ^EP?x-`)LxWk&bg3WO-_Uk)6Iwx}xVI%^i^#xo0xr_P>x%bVYR z`&aIM>s#OSwzs^VtQ~Hw|CitXz2E)a4>aQm^>&^)b^6AezqGP?c5`z`NDaH0rTKsU zmw)-`{2hoJtT6E-BP$ly_EWZ9VH zBTAo=omlCd%inatOY(Gq6nD_*F$xA#+tsE#%`d=_Bk;vrVBbF3xgACxzIZo0coG(N zKwUvx4`P7~NCjYVVV4{~2knFOv_mqm(2ju!EFu6pM*`5Ze%gD<6;J)ymp=7FAD{m5 z@5ua8f93+fDco_Byz(~puAemTe#grW-~Rc({ilDJ-L=2*Ud5d{Eozc6pMXGpJ9ysn zzWEiec=<>E_up3iZMCiT?>(@%xDCX+X4-5HtBPFfoUNs5Vx&Iv{j7+zVYl^+aItnA~cO3)b_{U`i`eO{n@|szF&FZp@$D%aNsB2`Sv&e z$2WiAcizupcsw-NGPhFA+S+*bGHp=A7<5>HsYu$|VB>u?m_>u_v;o%|aERDC#$KPS zZMlWb&B`*fo6-QQnXldPrMJK3&5u3yFb(Qy(-=QBXuTkUn3-7tmZlXqt?SA;=cqDu z1&P)mHjP6!vE&R=)Kh9&OdD6B$Y4qv?!b6B6M#QPxO3V}_|9*V&gx z2BV3+Qq@uO^kp>$DEO-K=LVn>qLg7uR8*&kvYmf#*z zmCmf@9&Du}g&C(JLD^#5X?_-CEm>Mdp3BoD&K&0SOv00*CIzD0l{+5T}3eHQw1V~jRTJ{2toux3R{v#k4s1>4d9WH%#+_WZ!TKEBWr$r3Ux)qaStT{ zXq;z5){tir5j4nxQx=)nV{$N%Q&aepd-&-~c(JVq!nQI!BmEvd)b_$QXQfehtmJ%}pG*;zbZX)<;VtGU zJpy9NUntfj)*9z66Etgft;=kS0H6#BM2W6mjM|SfN1RQ*Br_4ni@XEGRSyZ{pup-l z%ZRc5I>4C3*{o=1k&tR5F=Hp>$UVzPsW)i6qi+H;S9xWZkuhHr7wWf4u+4r$y@iHy z9hrj$A!&evmWG9VkXr^wNt9uaXE;w&x-W${NbCrdGHDT@N;jcq>WR){r%XtxC*dAh zAfSV%i6JSYs(4Lu%-Kz+YJ5oaTQw)q&BPsw{-!IE01Af~U2x%egQ9ml7ZmT*hh_hp z&dKOJr>qW<%)i5}q78I{-$KO;F%{N~`Cj=axoyQ7qO!LoWk{pj=}M$UnEz1zu9W`q z+mPE?q(}A6nJtvR&CSTNNYc>D%3UA;)N;ZHYN!d=BDksn=JsU1r&^;lP}HQ$XK17b z`J!wA=^71zQc=TsV^NAFd6p7T<&;F0xh4le z!GHzwrZ)-lREVMnMM;!mWPPd=5J{G%AyV!&?(2QNQ;D3w#BF@TNGfG~gqTf^AN!VF&VgK+j{ID4Zx{Wae8EzFg7EKhlr+50qi z)34(Cjke!QbfCZ{j9CwXl>Ttdq(8sl+x8DW@SA`5$A5J2!VBtN|J2Eo>u1mP=NIa^ zd6+aO&z*hckGz^)TU8ZVbdwPoJF~Fu)1SWf8P|UH2~WHnfF6GEL2-V5`%d3X=H|D3 z@s?Y!e&%y8xZvRFQzuu?F5B9es@8Mkc=_D&|NP58{MaY2yW;Xg_ucpPGe?ijY~RV; z=0r1SdsV~`XN}{3Ax||&AEquV8D|>XVr9FM0Zf*F$#}!RnA9#kG$~Qn*c3hz1VTcW zWLsN;q+|=lkFwI}rzHkw`;<;2)IDNqO2(3SCnSTt0blz$y!zR2#bt8+b#QV6mUcje zfDD2_2E>2>xG@L_A?%nHKawLy>4}%(%s|{&guy$h4G^}D>+O49{k%&a{yP8hpSf*& z2jBC3{E{a?>;1odRsQ||nh*Wq^wK}r^Ts#5=EMK|f7-?o5qnNjiR3G0596E4R%e&b z-Fxpn-~6H%Kk(pVx8Hod!2b2&#`@Bn+;{JdpS!-DG6*a#ZhOi# z*KAwbe$T!4Jbcf+G&7G#t@jrmdfL;jx%%F_?|JmdVY2iJ-FN5Le&%O?_6@In?c&1X=KAUru72u;7hODBTfP0OUmg!9 zGc&UnTz19M(zXjOy718l9=!MNd!POMZ+YUCPrB#MuigHo+ZgJD2lwvZw`bSB{WEp{ z(TDH<%I&we9x8z=pZQHsz542Qb9n7%KYjM(sX;y1aE^)CZ+|O5dpL^*_@xBf7;d0J#_KK4?gnn9k<>( zX*_y)_BX%qDNla#9d~^BuCIP=vOe9hd(R7B^eyxK{ujP*-D5|Ov?JH+^`HHM7d`Q^ zCw%?Ruit*tjf45U&wJ6g&&|y~|69J>nT0Rka>K!c7rp4)zq1){-1PbDkDokgY?XYF zC}3tfm<=aIgI#4Vxhx@>n(U$=Nc&As{1dPi5jft#EZ*g zdN51~C37qNQc)qQpdo6=Imap>nQ?T@IEB!f21?U|kg_ZVi`4)iHD7svicfik`W?_o z&N64Dg%hA{$jqjgNG({8`P!s<2v z&x}C6ZF?0}mb_;`v?k_#yv9+&OhloN0H}w$AP8@_&F)!TZ)7wT0^U7OmEjGB4UbbV zZBZ+RI=mq9WKj_>03HY&SH@IC2sri9wBbA*5eO9`f+B{1FdY3BQ-wp1o8Fvad$yTg zysf%$$v(0?U7wnMU6JT!u86G@wn&2F0Sy8&5Hy}vC%gze*SEtlEN?V2SI^d_^}Yo} zFn}a+kB(4{3Pc$8g+T&fk3@5G)ue&LtIeQtyJyU7O~~Hq(YqW-q8AAhREz+G1iGI+ z0x)_65M~tb4a*FnFna+8@Qj|xIjjvZnOoNICI=uw1SDdt96bYItOq5Ek7F7T%5oHM z(pZ$W7KtKfW6bfkE=en=`lXx(gb1%uNxW4qSjfxb61`4A1ZonrxKBy0 zlMvcE1q$sa`-mnnmeOwvCc2EJufRP(mXZgkebKy??QE$h54lq9EkR)U-&`=MWC#7o!5>8h*XDym&5TMwA8;R1Y+lr@g|?FQt34;!y$A71|5RBmja)@hp`@z~YHPWyT?rJuOX2 z=|K>!@=!!Ars(2tDdjW5H=@NODk_m8sgV#YGK{>*My^D&h+D;wv|ccJS|m(Iz)BQQ zL?nF%ZqeZ+QcTdVF+--iY7K4Dn> zGynv`zyO9qDLse)699o25C*a^p334g+@5dhpS#gck9wK1nFBZGvqRW(1wQ4K?u!qQ zJB@ZA5cWF&j+;U;oc9tyX(xuv-1gnB^@ksR6cFmc%;N6d?3tS;>_1@1U_}BD4%86e z0?WeUg7fmgJ@+ACe{PNj#O)M;5V$`x=e#`f(4+OB-m!l#5fR~;(`N<2O&w50)vn2S z?Ta^FXRKY=vAuO|sL}{3SmZsUWny-v*(#!vlqpWlkQM%*TZ0rwExm`Vj^XLaAH^$j z8Dze^cviNbE)JyzCcEsYU%a$1&_pTHrFpfon&FlgYP<9Ty(tPHvp4;D*;wX}eH@QI z7e);8OHf%rhM@f1qMv{;%+#`d4we>RFblm3Hb=aC)?ReLE-ksyI=iv7o~s@V+sl@= z?Od4u%q?R&R`35#`Ti^DnOAUSWzVd?^|t2BGTrfcc+u0gUvcolyN{lkSzKh_WE;%M zONQ}$!_22fL-~Hgj_kG8=yyzLv zxaRkM`_~s2_q_F;@7{O8zLn*3uYC0n|Jeus;^qK3fT|awte*1yOwS$GlW;*$^4}K81 zebzU9^Q+(RrmubVjwikNg-?IR)Bf8B{_x=bD}Lj*fAjMy*=9y|8N_x;x2f8>9E=+FM(na_U7>woku z_uO~arO$lERZo5LZ~oeUzTn`YH@)S@f9)54YGVYy_Upgp8@c;|dtULn*IahNo}YN@ z+b=qJ=sUmnyVi%Juik#!cYOP|?>lheU;NPrHpY|w>|DFKX?y**z2m+6_wIb)-h1Bl z?qB%iC;sh2fBJ{t^8>H_-j{vPqemY3*`NJSfAiOW_5c3)Uw-0UKff^7M;<@_h0pu_ z_kZAld%yO!cmCX--Mh}5JMoTp{Nz9E*nQ_+_b)Cih~UmW`}gnPefE+kzV;1oY)0e7 zZI@qp)e}GX$N%l*$+P{LS?}9~`Gq2$r_!po1%t@>`f?VctEXy8DZ8Jeax8d^#Pdvb zX0n{vOmh&W{cd%dn5an1tpxTKts`9-orGkh&I|z0vt{XW8`(m^3gI9Wbh>O(x>Ib2 zb_H|&8Ys%7^*dYgO__Jb`zF4ws1kdxSdd6O;^WfqTr(oYf0HAOw<#9xX2}zXXYZ!A zwz0$ky_-z1a)ZVBO{vbUF7K@E1&bA~-m`Y{VZXFT=C(_3R!B%B_#}+W3Bm%kI1v$V zZ%{(vK-gfRWM>Mt3d}JT7m6DNU@{$@Id^VzxXvin7yuCO0R$NhxXPHud-fvi<1@i( zd;};FcttoQM1uNxGRIanFWZL$0VE+L&q9RW2_p0fYNX-FHG+eR z5%9!DJ7yVsaN&U3?E7*|got7K10fwSg^W1%EIzU|GKe6gEQq2BFcK8GM?peBT<5_9 z=f;N?{3YA$Lo4lY0{wm!4u3^NB=lZ{5D>*n*waW1c)|6?J8pY@Yr(FMnAt2Y_DyJI zIDH2Z36X$3J1>GLXuJpZ!XWHDBF@a!lZk(1wOQ!P_P(i%ah|Wo3>ZQ=YRjYTnD>bWI5r>!qd?d8e3-2FI?`YE2* z1X01ISgr8 z(#=c$Sc;m`LMtFwlNN1{N*t4fT0>QIFy+)r4Jbw2`A{%vN2z|OR8Zy9so2Uxo1XEw zH}A-ys3*W!#IMWYJRtIVl z!ImPLV$z*3HXM#q)7_dAn+b!W=g%s{DnfPzAQ0|Qj06CH*qnFCnQzUzC`*i6t|eNT zh7&LV zn8+b{z{*n(TEq}PqKF{@kgCT1PA7ov5RidtAO~J}D%igms$D!eYRpX8rZkfYn2y>I zH4kJKk%kP-E-eC(fH)s$QKEhzI?W~mAS{S&GbN;%x%u!3JFj)bjN*+k)!ZC_v`vEu z)>vT??~JjwS8=;RG&h)?V|LE9>RF{2>}Wk*ZQb%$M^ihAe?icLMDqpeUnvIO31l&H z2c+WiGV2y=e>8QN@TFsg>4%+vix$UK1Ijxd=Ojj$<==PXXRl-7M;|-#TfhDr{TcJNcf99^UiE{&_VZu7 z_PWo0>NB6H2mN5L1lX$vr_Y`eF^vx=KMD~_Wrgjub-(>z-goNwJ$B*1ul@4R%x>H6 zMTYCEfAQb{d~^BeOTOcW-um`8zxl`Bws!iF{kwKua_J>x?V-yK{mozfk57K=Q`71A z)?03U&riMm-~REV&NsjO3qQTSdfN5o|KR=azxc8z57*X^{CK$frZ@lOxwGfq{~NzJ zo^0;A=qbPZ8~>$W_a40Wp6~sE@A=n%{P68Jed3NU-SSgE_j9{;?^%2BA@7{?e&@Db z*ZseLe&q0@%jb@M<*WC+>OcJ8j=dMX_$A+Z^XG5+pC9^zgO@(VFR<9j_T$yLa~0KR5h`r>Yau$Hj}Zts9SNz zArKJpC}E@1cGr#pBAz)r0C2ZP5=vxtBLm2nl(UBT9baHj`;GUf; zYt0yX$Hu(z*oiCm?b@}y-dNul9v@ZP_tkUT8f(0BsPUmNcyzS!st2)s-O-(Sx?U z=g5aeVr4x+%d|fAm1}2uw%@Ntt#4Lf$3nd{Ul{@Ce9O=}0RTbcS}y_u!U7EB89axa z1Cs%w-nnVJGHMoUoU6c+5yZCjj0i+5XstmJM8>$(B}#+=ThGpiWD~`sbi^|=3wrUo zD_R(H60nGDMNCYjQalJV+X#l7M-H-*!FPB`eAB6(NL6XYG7rcbSSY2AL^|WH(%O$efyk@yE{;yIC}G7%z*oXW#u8H-LXf>v7y6ibT#LruOb<0~uvGBT#;Vs1@r zx(;qqiqcu+S8i`Hv|)GyM=t^m$mK1?PrKo69uECbw{d~80|^;2lPu$^tvR~R{WGsE z@?HAeLf@f$BBlxrRZo3<+4^u{dQjrprBl|>vm;#Xg+wBpdXTaw#oT9ZbI=|YqI$n1 z?_6)C4@m?;OP;!-NjFZB(s?pgexmJ8B&IvmS+~le>^`y#MI^*mTPH5|da)R${29O%w(bH_C5gsu2 zUX|Km5^E`9 zK~#zYs-+?zV9)C#C>|q*eakx!$P;L}Uz8LbKr-*tmWFQ%`-_`QWD`RWM9bJm>?2MI zy#O+r$k_S^0B0d?{lTt|sh4J#VBPA5JvNk=ym;Zn3HR|^+;nPS;0eJ^d2Iv$7`6#aN#cZ7 zDtrV$vIYqeW##O{|MIW@`ophy&-4L*7x6Y*U?As?=S3IK6C6d*IxJH z7rf{*pZwR>xL^F0-vVRz@7uF-?rhbc^`2MGokncy-nNrx&Tikc698}h(ygv(?V!iL zML-eU7!P;s*$Lo47{CLdcMR-A==93jm%aRZP5p!0ckSG^xNZBkB>`AlS*;Ms&LY|S z@4eqmMs~1sbLzblQ}w39@na7@S`Yez#ie`hzWdRKkL^8h!SUs@FMs6^@7TMyaejVb zp|;gzvl$OZ&Q<$&@A=Fp{%zW@8EjuYcY3(CVX&HASU7p?*s+K2N9<3gli_FtXu_aZ z{h8Azj_upG=M6vpj=ERv-Ltm>>D9e|`j>xx-D_TX@Y3JE{)QXwzT+#$kDd797eD{% z*S+dHzxTU8@yU-ra_{Pe2QR$%(tWRf%^TN7&83Gfoa+z7HNAdK){}9FbD#VCXP@@e z%YXehKk%j7zVfku`{?QA<=$Y1!FLJ0T2iT$$qh$*28w4WD9T85B+5@i?jd?%4F%ON zW5-AWbQIvL?pYw^LAq9w*2OV$pIu}ac7)0r4Tu_DJM~4I0mm2&Jx1jwVa03|b-tn0W6R3EPfF{r6HC z3Z*J!(4Y`OICh%}90;>`0ugkcr+_UZ7nvZ6^c4}*L?UC0oJwK=Fopt_piSXdl=RII zAwnp+q+}_G61G`UKa3>8$j(@UcIL#n;hsfvV0(3VwH>$As}aD*usWnlDefwU02X=B zr)fi@DLe7o1~@mUrk>AkOs9?)XX?SA>ai!1al_vGu#JKj(Ia+HfS4uj{VLuVX~CWz zyK|e(jKMie##%HWNQ}@(Whx*9A`?Ol253dbEl(P*D^pv;9BvOpAYi8B)_a(#Ohgkc z8vr!M5E_H&1cIXEBL)6Mf?I>df}X2#r_VAc*%}U)BuCOXKw@pssgFoJMJ1i7cEsT= zNL%JIQ9}icZHk}7+M)Cd#ZP5S8oCI8E@+SY6XhSoghd462&z#t;=>eG0HVgG?r02v z!7z%*Gl6IFL8+aRIw#TdfIcGuBPQHeqO|3)krfz7fij= z_rg6D4^lHt8d8w{?CuL|PnUNp5wffW05gnlX?zlIVqP6bp2gjm2${107wa#@u_4Xtv!tr z)Ra0P+H0089l)fN8UQfDp}j5A1=RuovcHb6o)h z;KWM+x+kPTK2T7Hxio|{ci1)EoRbVopRl+`R#*T)&#pJ#U&jakNE?WVkE5@S9sVC_#Odmwm6$Etbt?l7t)PCW!Bt3ZHx5_L* z1!4_MrZAp>cn}06APY!90^}i_TtDc^>YAT!(ym=JyUh>gADlGDW&DH#7G%?p2Dg0O zJK@#k_Rf28ZPNhCfkhaeTzUBD8SMAHcR^|a2-Fv&?o<|dwL!p1(*VGizVNB5uDI&m z?|j>R58gMKHnX!c{eBHlH*I4O>bbdzOfJ3Z=|B4VH+|$EK79Dmqc8f_Z@u`^i>);R z5{?&OX}vI26#!JW3PuOu1;u%}?Y7(A^Uil}+kN56nKO2Nt{sgAGc!+n`ZwMB#hZTk z<=Umig*UzN4RfPH3&w1f@z4BGByy^ODZ~EdFU-WI?apjY)><5qN#WB>fGU-@#=*2|?;YT8c+l!xvya*;^*Ly21k^s~BIYlZWHb8m4HZ4UC!3{$} zCN!o=h<%=mFRG<8dYtFx0O0&Nv4XUvFhr*fVTf!$CsPuEtncG6_kpd+4fkn?tjbH=;=RBh|wRq3olQHZ)5+ahDP5{ET3myrn zvO^DdoM~o_?3=H5Z0l|F&b7_v+Og5{(P=&7=6CY8J@w2I)fI%@H5kG~dT0%+IMUQ} zs0KhnL*%#}ZftIjhF;iI6#=DrYzi_K6ycsVAbfgdbIOEh$adI~VrsSQw5rS5G{O z3p@J@i_@0bhjfE9E+=Y&RfK5XA|eO@BS=ML5kQ1MgxMevAp=f5w+yXd)+yq_a(n5T?_CWseG9|=L8$O67;cFxkSnf}Jc zggowBs7|a;M~&@O20%g?1(MP`1_rSJWVv67bL^ej7_oQF!n`H2Q^#jEn!(h}_H3`B zUJu3-X`L{jATfyd!XjRT8CZ}7m?bQ00)q`yqsA>yn!agz1cnS6BgWaPuKN`MAR&90 zco{Zr!@?eL()P&A_Crzxrmc)xH<~(Ysn;{!v-isIQcNg9ac&Uv`mn-AgH1qTBwG+8 zxW0%c1@2&xrGf&Kr1-TGPzbrvM4gK}DT*r0Du#tPL7)iBQguYRAxCUUanoo-kR%a5 zk7xu1CZ|s3IhxRilp;!#ibXsh2w&0EgioPApk)(r2;$QenzOicup-fmp-fQl+|jZc zA$3b}TG@Q`U**_m5uyGkDKXy>QjnN`sEMNgf3H}y-wo(gSdo^7sYlP=12B=X z#)c6W39ICp!;bPsHyrL1O?OH87ACoM5W9je3JeQZmO55wMs9m~Wt4BJ)#XhJ7Oi86 zx$kLg(iltJK2xueoT}@3v*gQ)8H{Ycg+os5Ejp-EHih;jzOC&S)gL7$oqOuj3#rH! z5ye54B#bmsh?s(w+%A2a%Bmpgs_Jo~EUL>2GN@y4o-ESTZZ|Hat3V`0;IM23xKyLSV)Rzo4J0(nOj->v;Z3)iA*r~6wE*edTTFh$FAFj!Ve>^I z2;4I+$U)`*rP(GC#ZinGJ&upt@&O4VpaF@;jHqrAAfW9F*dXk<7YBk=mg{{}*y9fT zkStvZE_o0PRi}V}SRq-YO2Yn>p;Ignk{#lOJqxpzew1UadPRT+$RJTTMKJVH$z{M( zmMn!hLQxcmNEFun0%Fc`X)(JY5xW!pxIZVF$n{j1WqC(i5~1 zs4CI%TwS#gZOB$V>GZQ}?^3mm!{1*+Z*`SsV&PE4TPvkNJvP;JOzN$XO=(m;lJ+p z22Xn873Y@E9zS(r|G`Txx$Ma}UBBw;XMOv(zxWfM`Ro;!9U9ctwIBcIQzwq>*}Hq! zt{s3_87qV#?bjO&s(ufs`j!`e`_rHKEH~LS1PC5#y8mmp-+J3E@BhI2x9#4?!|BZ2 z($D|WFaC#D{s38X_0zAp>uYzd9)ECQVez7i4$jWbdKPPIG8U1@lI``wu=Qqob@FPH>ItYJRY7sW)#XwDM?s95R$P`e8QnhHLwo^t}7$VYs1l05aaP2Vu%b;Jl_BqM2rQrW;|)8R`E-lSna_PQ$+n&2mj=p;QG}OJli#aLpa<{*9>9w@W-sCd9Rm}QHMUoKTW@$gJMm}7({sbo+UEG& z+QzAK8>dz`PpyqlZ;V&Qlcx2=o}_J^Tb)i%t&fkdZXRD7omd~QjvFV?I&Ph-ELE0_ zi84bnL?i(p6sES2a*&w!C?d>`Awu|3S+`KI(DY40tmx4TG9iFl*5PJjR+g)G$dQw# zxgvGfyCs5~r~)L$CZJqdoph#`;dc@qA-NfdkoP@B=^%dUQI<+f4Tv(bjwFjJxyT!G z`c;F96kTLVqKYAg6N#oODclNX-A3k{gr{`TyU1na&^r-SOrwdBtRY~WGZCHT+4@St zKA$HGC~zfV5g;M4c;_1N+@G1*wqw_}?K_timv(I5zGv5-eY+P-7w&Ye4U?VMkn zM}f9!ymt{NP{F?(1|^i~6M;f3v0gF60SxJVc88J%?7Z%X%3MmoDT1jja!5@=0F>0& zLQ@O*fNuJrw~nsvJc~OoYCC@bx{`-2*Pl1T@C_JI{x)AAnOemAZtZr?^As(>;{TzH zRg;Ggzn9JzP%xp+bVd3)2MbV`UT#9iIwn#ATo;KS!i@o(h$>)sY_et z_)_8r5|7vXSxSFNq=7-gC_=^05fMxuz<{8xvmgNCrr|5zU@m&q#4NC#g{i_u!b1Td z1`AA9z~n&;S&vu@>w!6z2Vqfi*fGcCQi=melw%f*zeD|tY@!rqmUSc=QmpmX9KTB5 zdoQ5^8+Fl48Z*$uxs;Qa;gisfuJ{ACmBm1@z*&`K;bK9Y5K7Yr3FMavtKl6^AfAEK+c6CrKNo#O2#KoGw_gVJgFMRTY zfAu@iUt(@hQ=O1-QIae~fS3V@*wEBD0MnmeIP%baAO8ElebeiHv?Bk&owt4DAOHS8 z{mL&Me&nGiTzc6*{_8*Adi|&OUvl|(eCJF4;;%mZ=#k_55A1*Fp+`(rH7vu)DE5MI zI38PrFM9C{m)FnU{Mk>~-gXf&1kS-<{r5i;*Z$!je&DWq?tj9eCp`4fJ-_=Kzs=)~ zkN(p~-}SDy-E!+USzDhvb!s|oT;m+KK?7~wUmcGD5R7S@TU%KMz@sP5KKYqfU-pzM zxAhk`ryIZjyT9$5&Alx5vpF3B0)QtAo8w_9wfD?bfBQdv^dElqz3=|zU-|V@=hk=c z+k4{J@y(6#XyRV~A7B5x7d`*r#fSdwqaXeH9e2Lyg)jKAx4(1H?;l@2edpKiIDYuP z>#uy`Ti*8OSH14l2M!**;f61)ube)9^7ws^KJ-&R_p{erbM?Rd>&KpX&C`GJSAS#J z@QpX!bp7==fSvWlltW=-s?pJHX$^eAF@hmWbYhZFvhWQ#H6BBH$y`5TYq15B8b_M0 z&?<~@tDxqot(ayo^dCuu3?=Mz()3u^l6r%T2I&rx9n|Amr4)QCw!5sT=+FZd3?{fs z(*lV>rdck`*JrYl9DstjY{Bf3nnOt+07|cyun99fb}j~uQabaGg?nWYK=_7&42boJ=bWrLF^J;1XDeGI47>=qPjz;HJSI3hHBF3qUEbCBaAjqP)>um(q-{A+Q5Nv5lQ|-)Trudcs>&fc zBrnXu&Pi>ck38QKK_52t3Z%C2Fl>3~uyJ7n69EJw0A>JM8#c28o*nejbJ*S_%>8gS zcFa+KQaJ2R?L zqnIj>5H9hqX^o8JHbj}^%)TKhDlLwH*<4Gq_9qtO93#3SUZ0&mF19=gWwx>|-plWFjKM%E9 ziePywwKYlPI`=TNtk_(ppeLR7=ew2N$UGo+YYUlw+#ONM+=Rw9Xj zX;U zA04bXKQ}wrzHN46IBc9Nhp5ye$!!A!Vk8(3+voiaUiuxC3=K0oZ0c?NF+Z6&-7y z3g{?Qss#w?aLwThnu6bCyr8ByX*NU zf8sqa`sU}~`^cj}v}@<~&s}%@4L5x5_kQ<%zw^7l$7Emsnm7E+&%Apy-lVz$G5`ee zlp_f{jfaYta2RAZnyh1GbfeP1)W436CKM%Od9*&i_t1|07oC3O?&)O1RJE`qy_NG4 zSy?BGSJ5UQK-Ub}xA?3Vzz_YPTyZf>N3gO169-PfGlYDZXMnIr2Ou#JlIi)S1HB6l z&ffCx&p3PPh2Q_~$CeM>b!WSARsj8ud3gGv!OESV`R5P)_=a1i-V8UbK~)ju3`r%T zz`P*R;$D8Zx#@4e7bCs>mo;bO%G|%1-heI+H)eM1KFVoGXy%%0^ z;lbtQv&SEN0BjGe!FF=db1@@v2H{@?hGlgE$u7w6jP7+BES{@na{xB+O9h-{B1LsQiUF1WC5 zn~mW*d+{waZo0U%uzUC3vuBPkpFJaDy=!;x+c&qkbo{XgC&Nv&J>ho8z6&n6=;GDY zv&SEPh{XVSv~=*ICrn0@6OTREn;Bg6gsa+ia^#^0*skS{5tu>DcK+{H@v; zWOA5X4)dOU2UeHQO{NnHA-B%G7a?Y9TfAMtExM*Exxb*OS)^_=NrcCFsjJFyQCZZe zh%H5fI(`B^VDB3bM7B1SwSR( z8fj3$bTU4(yu7@==9$Tm_BPGMWd4E}*S&bpEKHho6NZq)2&0LFz<`9_Ga^_5B4WoA z=R81Q4hU!~gJJne)9e|@_NB##PmQJ%f7ONC2bJ|mSoeqHW_fj;n&C4q+q=H8dE;G2 zWM-l2RlT~mI6t@0uLiwdZEFJY&I1F0M+ESK6dj58>{uEJwH{%~rA}@Nt0E^ODqU?H zDi&b&bLbWacC(QUha8XK%SjVV87~9@aV&G>_S?n^H?}_koHWvUh)3*3N~!Njg43+A z?HLfLHb?DTpLZ_QD?`6NC1Y)z(@16=H!zE)6q-y#m7$v1ayvI;7G?*CICZ{pAVPI* z$$(>MoOl)%aV*{o0C<+*eB)VwC}AN_>zs2An3<&_+%aPodRF-}3J4Ik0GkfhrqcLS zT%gbrrx37LnfXBe8v;ZXod+&qK(IHMdKHps47FS#9dS7C814dUnf(dpOv|Q z0%j8JQF0$Ihg2h*XTma3j!$6iYPb)^q_)oVLR_|?xCj8c9Z5!MwT|q+bXq7UViK6f z75M6E^kS8_M44y?K*?^y}Qt|USrLFUcPA9>Ad-}$y5`^>eU__bg8)dTx>8%vKJ zKI~juV-W;zr#(#?J!YB0t5j!9WCwLv1{ipi?F`Dx_#I7r(Skp>zljoyywWV z(;MT7wbkrk@U*90aq+?Z4?leD=!tW4+m<~0Bgc+!tZz_NDMe4}nL{)6fI5%PA|Sf= zo{+Ez3mPG#yZGUjyF{0g$w79@TlbDAHC>WB$=+6y8Frjnd{%*S(QPJv0mTRw?q4-3 zhtSeZ*W~L8E|DgRA*7s>l9mLf(|LVNdBaXSFz;%U)Gw2mvOVcOi9TW1+)@;ju1V=S zeOzjy8Z{o z_k@7GYaU9dIO4@2IB|boNx*0?jtT5Umg!X_e4FiA#W016MNoEGHJRJi#00c1D zTLfceItsNzB7#*f8MbyKV~nV{FMnLq!XHK61 z1Y<3*CtJ1NpF4dTYeTgWnLBsn=()oW09M$aM+Bs5JZ^6P+;w1kRM$X6raF7(6p%4h z%>e7GYvS1q`WwSdVK!CG-T}mD(pZw-((1Xht0#{E8XC+6ZYI6CNAJ520HE$82wB_s z=Jc`SRMm*IIUE85RkeUjCk=Uls=sa9p1Ey{58nIrm2*c-RhyYv<`(Oj(em18c{$`O zu`(>OdiI=5M|%$(c;`>P9eJnUhEa#;lxMSw3+Lkg%@N5}DrVFKLo3Gk{DWO8S(rA^CiP9CiQ{_tY;G*3#5L_KGDxEqK4=xl|BM6@!!l zj#C%q4H8U=03mWa_0ttGJ*q0QwUG5*2$2kir z$BldVHljhpHjz0g2{onGmCw%s6_iwZ_8)kfFWt9-? zet)*^?^>GQK0h;K5F9(lo>>r?(E~Dw7i>7reg_4SIImBch8HSWxElmO_O54mX{H`e z{iX-qY>gxJR|afBfV~GoLIiF-xymB&`qX%;kJ zqI#mp0||5$baYy%1JxQ3#sDeNuFQioibDEA31_@Mb6?0lgo zoKnRU%qYV{#8_^auUF?08<}mQAge_Uh|Xt1YD$XmGIfj+grdvJr*cFP2UaB2m>{As zpaGJ!Fu6!h2Kj7_w-Yh!sFF_i0;vCV)6D}HUO2z7xPESJ|E`7a`2KHu_SIMX-QWKG zCq8#; zj#Z2T(GLg%u%9{+B5M(ufPt}fjD%@)R?(Yr%vBNGe}!n9lI;t&x&gbRTGsg7UC5h=9Kl!Sd-T=Y%J(sWRi2ZENBXlFDN5iff@#4Z#| z`wb;QEd6chV~H3^h0@TMv@`ZB?{t?ZzLQUgia{bGkQVV3!E7OM&@@DTMWy8kWrzr3 zqYMy5Qr08Q2|b<+VmA_if)qGZe3Rd9fq*zP+944^U}Ofc$qe*}DvM-<`hXRHK|Mw| zlEst<37w0{2pv2I00V$=FBSsCu%?Cp!=~_oUc}>900Dr3!?(G$0IBpt0FV%cJ%f-T zLgSoMwj|y;1VC$*foCTZ{+CTU*iFf>Kz)85v^=7PMyYkGUT6wT6f~2cz@&kwDwoDC z`KJUc`XG#7>;J2S2|xs>Xvv;C0TXx?mVs9YMTh* zK1FC(-Vw_SqhBd+l}7~i!6FPq)nGvw+}&T}yKcvwJIxa=g9|R=?K@y@096eDzznUE z;TTrd;lyL|$ir}I*-bXs+G=(;O8dwiAARWdkJ_q6GVOT6D7HTUQ?vIbOvIJ&ncRc+ zK*1DjWd#7(0|0^$Ar1Or&tXJ{L5Jgu>LbDdj52gop-_=D+@>&;9vd4!-HR&w0jko`2hyZvOXw`G>JX>erF8BLWas zl*bf7*aM=itHdTm7(q;Bpqd8}5ijBifciavp3bTgf>6H(>_HlYAnJY}gqax;s@Xv_ zyyTZrX+^3yj%nze?@g{obDNQPlQNZU5#= ziCtmwdAc>|q?7tZ?TL~w?0`}xWmr5yJ-vPuSU5(7Nne$&qT`&RTkp_mh~h5@`POeE z1xda&LqN`YWE@n&r3@mAPThZp2Zr9FqK4!W;`l%+pDjfT5N)sLedRoe2pS?o;=`Iw zVGqm#ghV7>L;y`%kRjj^5$n1Fk#;f-8XI!IaMC z{@ljYj5eo@W3Uy1$6~THau>zRK%6YQ8YjRqgya`y#A{Xj9t%GhJ8C7Z;VF6mEr23s+Z=~L&Wpkt5Gi!SW z1*ipZE&CYwq^T;fAU(ngOl3u=t!y>i#8a!&ZHtvbvoi86SsPA{L1f*?7XZBvX$KS# z78tgEV5W;R2B&gnb)#o-VYcqss`0*c%nTILRE*4$R1=Chq(IF>{A+9_Y?vi1AZ`T^ zfj}taj6$vife?)Z)zhe$01;W(8bmZKus(8?l?n-G`k?GA8K|iJ#Xr*j3N{XEiHYUs zxhJ)~Walx=D@lUdY##Z9!+P&%zr1b~K~I^kd5CZ>nNNFsJ0p_N4)*N~p1%qaP$ z^c3Zf*+(TgqSDYjilM?hb&}%e5)v!%f04ax^`esRpT{hawIF^#*N*mIbm7AM;_C9L zmw)$5U;1s&UmDn7_|Ly{ts3<>$# z)Y#64TV5rgKzg6qi<+*gxu{7*$C5ciNnO1z?zr{Tp~#|4^zjO!~W+QW5yOq#tq3}*qNW= zGH%tD=Zx7F#6u`_0t<yU3?v-)jtC?GVb8gw zxgA&q0O4TPVe*T@N(}@6Y$lt{Xb50{8K4EKdvgoc8t)tc)wOlZ-usHE@EVxVDvnm^ zx)Fid8Y76#wYm%>y6>DVfp8Xak>3l-m!lqC9Hm)R9kZxeq5xVNFh=(i=wPQ#4E5*9 zAO&FBOb;EpVBZCo5)v76c4eh?{s(^GyS{Sw*T=Qe z1=J&G-gpZ#t3*^8^e4&rC(XlbdWEvak5b-Lf>~i4!Qda_g;?A|;!It*D6y6ToB%?_ zab|{bn3H3UDkNzV2?0Pl45BCpjryKu9<UWRe#(uAtIRY?;q5bZlDU(k;@^RmVBMVXb$ou?oYhD~*gK+LWh?KzA2(nDiNymTAORX==UJGH2?r4XQm82xVH6gDhPi2`0*DsH zc|ib_P=Y~3qtWEy*3TH~*VV+kx#6-|JIA(<)$CkvZd&&mL1qw6CYDA$0EPe{iCe7N z9eukt@{>lym}6+=eEL}oz1JQ|paA9WCeh9qd8?bpuB zun`XyFk}hTWC0M-0~q01%WPo8;w7LAP8u21P+M4QVZDXzMx685v%Q{ao3PPJL~}x{ zkoy%FhNfj9s4BNOYc?kJnU!|iEbW{(E2Fk)jj@K}kSI!F_<)0{G;B`|+m_qyg9-uG zM(vrE@m$Z%&i1UOrfr-zVhNF~A@6;$)-#wv*bOlp#0Eq}0!#`waRNSU$)J;vf~^xn z;WX|*_ToW?29ZR_h!fdpWjY2xKif{$rw&U{&CuEb+0tC1#Vb3Mq-WXDlgry zL2IUK&=rNKIu-60vzBVoB+etIB!z}?5NdSNFr@5{bZ`>2ecA13zZ3cuE-TxaHZQxL zJba-3PFJPmlu~Sh$kssdabBgX!L*tZqwhlBjCb!pux(*!ys`SuAN!BjTy^DK5B~7a z{^F+Fzsw>PQQM5$)*?vLIuP#ldrOP+M~tW*<7!O!4?A(bD-Q_nonWyX=2xB!{_XY^k zjEBOEAhuUqYyEW8w$9cwwlbbrgp`LL0OP! zy6F6DK^)9(>Mjw$ZW=B5(Cl7|x^vii=j8u8bSp9*EqP9AkcdQ(d%8a=jAi8lB|oY4 zsnLoS`SD3PvE5Ft!G=_rG>Ls|NB7)k&nYPGK<)o>Ze4n!M z5KX$&j+9E#DH+LMDSnDx5PzB$)NLLAZ~Vg87z9ckl9)jNkq}mwLck)kQlMC3Sc-Zg zVSP<(mMFa|pac{rH3NdmS9JsP5DlR!j6M(%ge4R*M!@03mf42$p8)c+^5|rfQq@d& z7c?XKM70YHJBbCuLY*B$U7?q!%Swp?f*^@BFgYW3=$#iPaR7#a7^r0$2pUxRf_gpu zy@WY2(NwyILjXp|iV^REv2f@*qpTor0$F7SWsD!y3_{8SkwFZh2#khnS6=pnH@@k0 z-|{Wbo9z$oy8HhB@xT7}CqDKmoSB_$44?DO&-v3o`J=!4@c;S1Z~glG&b_W}04bEM z2tp`0kzDi<&`tz|8HQ`;5KV7(7R5_ekVM%r$26&#X)ro~l!KO12uoF$Oq>gxRVJ-%rg$KUlG-*))OL)U-d zrr~Jvxf^bN%NyUYI^5j1Z~H&|{YP&5(&s<_x$CA)Yx=Xv0W(6!%qMg)Bi*e`9DsVG@&V;zlm{26n|hvFA}Y7^B}PT+zA#-b zNhDg~sWDoT24r>sI?zRuuWX+t!yt3_*zELFrG16)v@zk~>Myl6I|&`q;ulcLmHt&b}&2RK)fNWs&+JDW+W6Av<8IPIWz_Ym=R4C542~Vj9c&8sQBUJ zY!Ogj&+HMTZF$3)v9Z%l-}HD}&(zIuy0MB?ZOuStmz?QC-4`Zi7j~ZvtqyBM$ViO{ zLMszD@+78`P+%LVMCh*}Ky==RZaT*zXbkmxrdJ!^I`3K_G6vbRtuX{MEUftnSl=Aa z&CT@sX43lg*3B`ro;}cb)H3^RbN&6>cOO1+YH_Lef@fXvrLWz0WM#7&%%E=(1PKMi zakDXOhr{9OaJbl;o9p*&ZLG0CWUT?L7=)PxFvJ)l4vh&rT(AfsaE!Jhjj1Z@ym&7{ z#&mHtQ8ECmP%1Kw9(Es23>mS^itAhG*XV($HsG4gG0*f(;0Xe8g^4v(0Wy0eU}M*& zf~{NZ^W4CWr}fIHogcWJv-RqjN39cMqi#pc=Ri!N6cJkLof*4P>*g!d>-Wdgc6sb3 z-YxWP-Rpb6M&eEbfIt?#2Th9x5FmgUIRFY-A`cwKO280_fOsJrN|HoCfUxm`ES3-f z2*DT%P4a^4BR}!p2?~)Qc~1=^5fw=ciN;lcXqR6W#*H0M7d}g2N%;+C!`3^aj#wf~ z31-W1p>T{_fHb9C&%=DoZA-o{sT|!$*djLm4;E{idrYP5YS}Za#2epBFzI zZi*f>tt=uqOCewYFUsf=vU6Z5Nx97fI(_D4% zTfE&iL$*Elwei`z=P!DR%s+ASv1?`efaz5fr@8Z>B(eYislp)z^GSZ`&p70&V_{4a zcT3|fr8#NtuoN=nk>4W!WCr;fD8@T0OYtKC&DZ2XJ1@e>%AE>dIv*FzCpq3^n~y_o zJ9m~M)pnkOrFNCSRLP54Rx&JYPHG`)aFASu=HWnH3}kiBPgTYhFV2)Zp;{@g_T*t_IPkTM&l4w?(=x4{3-WQsz5l6Jz}W zNbYE6#;RJOd!_6oaoH>*1cADOhyEArxk4_u!jD?%0oJXNF@goQ;60$pxGbuY>2VTu z9YST92LK^rj{_K;B3zZZy|5-w_ptJC@)jH)rfQJdB1x}fxa1KjtdBLeX75JB;g7!I zH6Qq$_btrLJaF#=M^Bu7&U2pmgD?NS|MAy<{|mqTYm(nqyLK!-`0!(=j-LM85C7wv-t@X3desl!c;n5V`OK%i z00kW_&AV*85)IX&!l8!mw7ta`df*Sl0tkE3Pfee;}rl`pA&B`C4=jX zYnCshE*9M^ystoN0b=)oQqY}3IJrSxlt{PlCWBLoCu>I>bWOgdWy~ev*rMA(Si#Lo z0*FaU9NCYYH2@IVci304cfS+X=UW8HYu4L4-vq$3M63tTVS`E5v5h%;D(08j)O zy}^~11ZpPaWKt?*B=jsTJ0uV<%wQ0DJ=3qNX6hzmPl$lzr>*T(t#`%|BDlr@NYgad zR)8>RyqQd?s@b=WWpTzVB0#T}ru9(mT&VZV%e2~Y_mNX)*2drTlq+WLfB2rG=c<`m z2%!;?H6~2&Y)(eQ(ZpI~fGvVSGS(2;eqHr!J*ca`h1KP=YwH{RnYrydFR1ED&`6kB zC7nQI7Le96hUgGL^4wY+*5ITCakGI|kOjkRlL2T2MlBC|G+W`uxNYmISJQALqp4J( zqMr~5gwcCpi;mHG_9#L)YE3iZ#Xi>+qNz3~-Zj&0bM;Im%bU(qg{IW$(3)5d2E-oB zhNH3b2E8ScUOjZK-E8L^^y zP|;=Z1uR42JW4MML(Hr*&li+X*+KP?yo1cI%IvTjI_5T~F6Y+d@`tn?sjg!x{AY%j z=&m(l1k6oSG|PJ{#1w99N1A5Ns94A+(OZzXxosXCRP@h8@;rb|fLXK_Lvjw!AGMUM zPqbQHODH@{QjLO&GqjLLt9T_3Tzs!Lj}Kr|*L(IK*jPRDBR}}^Yp#Ck%F6P<*x|;; z^7?Sc+~SYD^l4ApZQ9MLt<1FX7J)1dS>FFoU-`E?Pj76r8-4;KmYm9SY2Pg z?d$jL+OvByIWld0aw0*y^TPpfI$=gYgMf?%#NsnwMKinQ%O9M7<{PTrPaU0Hk!Qb+ zKKC>3>vzJ7{}az$4DC>cD{y)l=PKBCnK|?df8%>`w^lL3#gLe>;Ll~f=JW1lf;cI_nPu@&us`iwlO_n)u9tib!(oys9X&7ZkQW5Vsh!Whfm3lam5&z%K;dTyydGsA5IfwrWsYIV43 zIYah@c26$l01P@rTHWngaT zdBM|p!Bqadh^Z9b5lj0iuHGUfO#dnQMvnEuhoUPrVhn<**r{khl3c!Rg80&@q~A&> z!1@M#%WsteLZX5Bp?Wbw5rj%=j7mkjssOKZM+JzM93}Q$xnq7*$z#vMPKE0&ir7Jd zEF)BkD-f3~7QP5O|3DJjmJUXVl%tvkN4meo;=|P5q%)GQ%svCPmFg>1N@{%|5*NjV z0gB-@cRQ31n`OiE&p?)p;n2wzEPU+gL%}KQ9 zO-Mqi#T{SU>6zxJau}2PnawFHA8P0G)6cW!7^~;YN<%EQxa>xnX)VN)3?yl4?oDwY zj24*K(Uy*)AbJ)rVk&A{2kmAp4Numc?Mr{QH&eHcUDE_!MmEp~PZdhr@}!v}n#$VQ zo^Kpao4D6#5>a5ubnTf;3*K3S5@xb;63p`)>YCPIlKgDpGhck75Q3mtVY5-La z1xe5gFf$sIAcy3yV*w6=#JxyZKv*iGx!IZ=yQXbfS_c5o>!GdCvqKcmYzV`2uC>;& zBP1XgH?9V%>S{8b&MsCnhNXt-ycw@xB?d;L0pMj9?7a2fqvzHheC|^&9@O?L4mNaaA*KmTL3^HASJJ2%$UtUWMFV?XzXQMzv?&b*a0H}GI)e= z6fQ#R*#H7kzzH(YGOdket_PLzrlP6GbL-Q0CS z9W$Yjts2JlQPZDHd%en3Rn_YQh9#BA0tE)>=pqTAXOS=~qfFAX5FjKjO&HGjG6o0@ z08Tu+);mEL${L9vRMdo{n>~oIE@_m)(?p>L>M7})1TWEt#`QL(=fW<^CmW3>Cix=J z$fDySI!2$N2{SQJ7>^fpmV0+vpM7ht=+MYNp-y^uMk_%KM-}ViwbjXMfav17(tjr( zm2Q*0L<(HDc-#USv`nD$ov61;#U@2NA@cfe8A~bi*yTbhlB&g15-Ndjkr2vpk4hT> z5D+;B`rQFbjXUp^eh-A={Px{@+Uew~%P;?y7d~&ezD6MI+xhvy%xwRXg?e$utgH^* zWZJKcFt-Sk&1PX~@RXhXTNmeM=X%hqsJ5`_rsL^LUi7>Zr%s<(USC?8KXYbPBnu>} zw2mEnD>4AA08!W@?21XFYrbuA_ni*BIsWO5|Mv&< zod0OQ^?QaNeycoY@l_v$eb>nH?a<>6(Rut%cO18VAlbEdhp`|%(fZR03KgFEQysc= zSL`SiZfQ@El8rYkDF^1+rJ^y#(u0mqEwdhF)AdqJ3fy61xs8bFcKXng_oeZZ$B}D> z4#+ju7y`%~I~Uw+%Pmq+P|VzB`4nPP{Z_dl=6ACqw{EB603TJ(y)sZfet~* zV8ZV-=a{dQ&M!5k(+LB+0#kCJz1~8h5E$ORfNO` z15^m}1Gwj3;o*;3U}H^l|DW??pR~Oto}8t2*-#TUV2cEWF?U19I8+=GRm0`8S3dFb zpLx&QmRDAP;wRsG?PoqaxBDOf4mUR5|Nh^z7B0K>R@pfU&SSTxTA9_sd?fIoZ7J z)?0>aYm2+~G)*%ZjmftcUwXx%OD@`2U;WBg?tr@Aw!UB4=RE5<)|gS#*7bJh9oBU- z8COCteff{f&(GcR`7azk{P5!T9W0*1HXn)@Da)Ru8s(9)oQ0nSNS0HqVvQqGaQM>J zMgK3rm&nXu0KO$+1`j02)VgV}?g@akW-v3TEA#PBf9Bn9`;YfOeE*4)Cx7h6-*)`O z(ZBu3-~Ig0{_M5aUw89$AAi|*ec#RVeYEl`@qY0=VibQZr@RXA4 zTCWF?7I!431$hBl97GAjtD@Bk3rNidO-`4fnuMUpTBt&S>m3)C^eK&1R+%n;D&aic zGE&AgUXpGQ6K|4!Rkjh+WSW$jU{Qbvfc$IS^ebh-Bo9uwRB|nc6x}VRIda-S$G+%v znJdmDI8MJnIYS6aTu`&+asC7Z!bWJpwWM0aV&XB3Se{iAoumsbOnJR7InHrKS^(L} zX6Yallsm6SQU;*9q{a!wnCNn~lsPR)M#oha#03id!czZ=b|xPITfBU!?m7XhW&(L8 zP_lT-R8`_Mu@ymQqJ!)xtF{CR=UX&Hqc{KnVBP(?bVUNf0wOHFnF`2c?7eN4=4Z%l zjy5)$QSGtDx+k822&x{qxb-hpMx2Azv2Ub7>h;V_-%lpeHfSv(f`mMU8d)gV1QBr_ zjc3zvH70Ax%+JiQTbU3Wp3FDvhpN_0*A9=&nR*d>+o0+*U|4%c6rHD}=`O_3gAg&Z z=gOL1WxV6Yc|a2H&=~KSy?Ez<2!Xw04zwXGqVNo%gn|7O*i?1n+{So{1~xaQ4U=jcBf#AwBFVhUVl zk&-xT!!&iSuCcZ_8u4633o~ZA&P_|ULJ}KMj5r&dsC1gl9Kn>ouy7f$w64+xJLxql<=E#lA)F{n2=Xfug2qwCO z39%J162_<0hN4-)g*(0I5_64Cq8Csip17W(I&fG;i;2*yZ%+gR^6yo7b0>3aB|R?5 z3Uyqxy|IQ|BLdBrrKG#k9~EhlHOQU|3T22vxj!?vdud_MoFR{5$qs5VI2kr|-}Yv4V>DUY|Oj{5` zb~{wPdhLgQn@oVL6n_CG;Ojmt&&6ksV^z zw?Zv2*MR8IWO&Z0lEkAR5vTmMhBmR8u_2fPkVLVeAV#TY5EjEI%|n%BGWTeVIUSk0 zr6^Q}0csAIA*HMekE*8>Q^V(CUQS95m;tBcPijEXdJ`sP$tGG>j!GJJL_uANsR9-R zNypM*mSt=Wm0(+Fgc4?ngN|ucYD7(S1Tlr7`jJ3V-K(>j0Y zp+oO~{|Dalo*#40-E`|$-t*JH@YOrMUe)!1UAzA4e|_H%yzD!w%8J1CpS$^0KlHjC zyLSG`AN}!ne*5!AqscG)?7QCcuD5^aL;vUJfBu~ZF1hl9fBNU&{;kgtHpfmJ`!B!s z{=fU156{leiFnCKoZNtpNi^H|Ss~w~!Eu8a#VcMS5O>uH!9Xyh;xc7C8Zni>P4`zr zkM@~DVNfxva55t+-a(mQO_DDWB~Qv{c!g;15GL`uMFDz68W{*0p2$p2hj+5G#q}EM z=LSVH6BV;`8k)jc-P`UwA$Bl7JyF3s`&*QvO$sGRwXl0Tby}gBn9O-ARta>_FR5|j zv0)t2ABD&2wj1@j)DE@x4lhmf9=UJ5y6|X2>MlCoL|tT&zS|xD3vs1P6Ig`o%7F;T4%`_B#vsWR&B1Eh4PTxzZ!9nv>t+oiZ$sh=qoQiM+7M(7bRr;U?i?80tX zq7_Q?*h57vnB~p!LeK7;tEP<~`srli7!Yg?EmngWCUCG4s8Y5|04tp57i&YD99j)=xw#OF><3RNJR)0jQfUn+jck_t&Y4mPgniIG-^TN2&yAbG zY}I;P-k1Q%$T#<$S>BGacYC!&{Pc^r-*=R*zwNgANiAARG+8k{l=wjf+EQE+?h``i#>|E=>03ouU zwpHt^y6z474H(aHd(FTUJu`><llO2p-|3-aXXce;s|*T z(Q;*NuN06S>p3zTOr|2rG_d2&3gb=?0XYQ>|3Av!Jl>Y1s1uLKtg3U)-QNEC_0G~X z&C={5i+~6?Zlj{C@WX{q8-dsxmW{Z+s(isnUvGX96r1+ALvIF%KBh`BMV7 ziUSH73vFv<#6tQukU}Xy zgB%XTIVhkA_sg>-=2>OQO%kSPM-pBMD^kH9WL*P#DIyXBgtTc7#jP+q^*Mf6djL9i zka*0%yt=k`I&UBQu*)uc=*63x8@0!T1g@@+>|eWh&Cl9yvkRlf9o{pp8|Ox&qw8BA z`P{MlPPPa4G>6Yy_8!`Ka2^0*YkTLRmt1ne!F}!V)62^%U4ND`pHa(9sNXOXb}i56 zG0Yjfhl)Gqm3{8gZ-*y-L)b>R`O9$rW8G+mzQVw<51e)-ZnhAJxdozhgsLqk6a%#p zu6&mq7zZTEXbFpcRe)@M&os(JDD#KL>;X?3&izXTH9Le}ZyFOOq$EKZuS^J*1Zy|~ z^RFR`hV$8BC6Cr;r(1FoXCB1bA449MZJ;FZgZ~fyTRuz`B%_nTls=kq>CC~dX`#hw zumSi8cT5ycXor58ytaso?T6)lu$Ck2a8b;|b-E(L!9N4@GC!%7COEhVZ05Ssk<2#* zc1m9o(<@aD&eJzJuftq?az$TREK;B~%*&Lr)Ev}dOol6w1OTyORZWUsq%XDA5+X?# zwZbPAV#a&{h?>;&Or!x_$0(qg2T}r4f*54Pm zA4Y;W155|D1)u1_JniYPe8rFb@~^$_l|TFQ|MLE; zceXa3|AKG6;Y&w9__0sD=Y9WLRm-pVsh2My?j=U(~Yt3P<+ z_?gl2Qs4Cmm=E3`#Aywp*&b1_XaOb7?8-nN@+i?Of*jJ2eh6IiZ~ypr49r*o0x+?! z!*t_q|NG7DtUZ3u9q)MiZ6PvLqfdVDy|>(OJ%Ha?KiRe9eDiPr@HZd3dhcXuZR_-j z>CPPM2GZ*d)cOb00Yksz#VAl9W0%(reYVWcWW&uK#-Ixf&Dh05a+x;Q029V0E~q7p zL4UNKG5AJEC4jCJVU7L^t(nMUDiDS6l|NFqO@lc6&%#(hW?mE>x%efnG=jW%8 zEM*5hrZ_*StT`wlQmLlEU9O44bzz6D=T5 zR;y^#Rg9IfWo*{)7K;iRYNUK1D&wL&9y(k4ra%s;{n$XLkx=;r7aD124uu`F*}e;+ zA5-SY5t>V1OoYWeCsRlYt3{#NB*`im?WQP5VoTYyo+WN7&?=fNeJhu|?%Pgki6F{a z51CWU1;2s)X+Ke?AK8k&u(L9qYeT0nb13wztR%M`0+naRCoYzt1LHxZul!&RBH*jU z(zwD%)n`a$jIJ9T!iX$tVdq!Wp@vcWd?4oaY>?I$+ z<=765CX>qLJr%_-D6#{toQr*Q4j3^;c9LWv=6A3ou)}ITpIx|GA6#3$?f$cYD?~T% z`g%ll&lI+K>H@K^t9mqU#!FQ_MsUQ$1m1Z704g8^2wi{>keMCwyvMi`(@K-{-jlpK zJ^&*`fJix-G9ptVRM0X*M2~=uox^$Xr>C*0(F4pW)|KZxrO%4F2IT+{1962^)j02Q zYYMLNlaUJnLkJ`8CZVh2ydEvNX50si#F2pHgxgg7h-pzz`ak7g9I*F}nA;E{F;-Ph zDH8fH0b;t3(|f;x0hlP+3Jb9`-XzYaF=*&(Yyy*fuTCZbs~`~o?FcqqVG;!u%Q34S*I<^d|B z81SV07+c61nuYyX@*|U@u=CYqWodhR`zcR+Yz#ezfF3zAB2eV2@6KP{d-U#;Z~fq{ zJHb8r{Jqb)eD7`dZ+__LMi=lA7ccqw{OqyyNWuBg_rQRC+m9=M*+U+5$Gs<(mnNH= z>oLUqKF1v7fx!ce!L9J&Blw8#;^|Y@u6We^+Rw!ClG}TPZfv05$FRG4Po z_Ig-`tTCJcbjZCMbzBiJ4fulLASOi@wVLkN+}_bOF=q?84-lN!3HE+;E% zWEq&C1Ss~IAC-I3mjbIwVi#Fa>q0244}UNh{$w!urKsr+CO{`E6D1RMS-J|%2>EqZ z1^Ou4fZ~8aZd&oE?|+nQ#E6G96`3?$Wkgp%1+BP+hstOxRGN@gFaK4s=jKoXF66Ky zu2q)%OMAnAL3~3ZUy)}%Qy7Kd|}0z165Xefsz-Uj7qLeA1Jz`RFJA^{T6X`}cn9_FKLPz*qgtyDoq5 zrQiHb&wbr5{My@o?+tg~@sjWQ&ToC|@BZPR|MlD24j%f@2Y>f>zv#1{{`_zM)^7m7 zM?Q4*V;=j2*|f#FiUjF(00RwzfCcDySusW;S*dPnTpQ$c1HFiC7B9>>Ngn|ipz^>3 z-~j;GwbL0?BLboxpsLX$(D=*)C%_?AHP#gXMe-Y`*Edd{0gtXqZ%jl*0?C*ySSoTD z?=B(LnhlodQmC{yO4_$SXU4rb%f;2$H(fmR2xNUguL zo!?0d;?t!rnLFtc-XthR@SfA*FBKBQjInQN+;vMe?yZqyKnFXs^_|(wFR%J>O#!$K zMC>Zh&T-!(MVf5~>Z_&IW^GS5-G&g^Ib*f@YeWL{9NSsw=YY%{fjI!5BDV>?LaZ@d zIDwjW+KuhYC;MX$$KBy=SnB)|L6EsTaUui&AOMPinbCPBj*;^Tp1_C@Vvytx5r8RX zpdbRk7zrIRAcO$GJB%}ER_g{mx6_Cd-*`9PH(B499^d3s{nnB3{NjUaYY#sE#QkUX zERCN1s3TvzZ~cLdzz*xCLDEIm0L%`NiM+$qN9RCFa{!R(0WwhRCyj3!yzTheGvs*G zFc6{(k)y+8h$>Qz+lxD7}la(L#opyTo1zU!jw1zgDyIdZnC-AV3Y!`cFb^i ziN3o+>;RgjY9q?lxoz3HB9>#Op)(pgRhkZoIh$~9(JZ$^L}IpYVms$g!v6xyK*?n5 z(HNMQCiUeHy<|4s_Ks6d?7U+NdnWjxi}sEg_SN_PE!e$(_2|V(+pE?E27}?9OGZo4;+rWWb|KM@b$MRnt-JrKa zx=^k$s}c| z@I?UUb}#77-A1KIIw)miL(|RVxmbLz&vEw z-_8J{b5K?8_M5(P=Du4GocFNP$M3r7#+$tN54z;i4|nhW+;yM&=5PC^U;gD^JaXu8 zfcUhpdE%XS-MhTDeD;i6UR`5`>1@`v-P+!Z?!W)!JKp(sKk=h4d;j~d`q(wsUG;&h z-}|0-E$=&A)iqHlLnz)kFkF#bmNhDGKq-dgNGl6nB#x$UU9qTPWhGUSsw!3O0DTsk zbLeXT0Ceo-TIbx@ah@e2U`B_|ImoB%3@XwIuVf5L4s=Z76$?f(_@q>G26=zhs7!_z zmQi;0>TSkKlLtz5S4#)wp~FuEtI>eAovPn8A8eh$1Uu=_Vh|B+q#?3$CL=o3(Ub`< zDc(q~TT0i0A-QO+G)4-_Meu1XD14{fO8K9kZf$qT0z1p5u5}u>3PW& zKn1EC42@k65C&|+nJu%SfaMnL6-tD$t4@S@7os7$fU+P$6Laah{F1{glOShSd3w7< zAr2NzZCALg6%@iRST8Oub43~EL?ybyt%QUO((+$bB50l~gVnhX=@6Toz}iQ4yIk~H zko!5}trC=ho9EwB1-sB|Ry&r)8S*S?Qh?|qn_>Yy(0HVSmFQTgyrd>r9+STqSj3=@ zW*j;B)KZZsFm1ofa>K+CB0!q$XLhb<2#oWdD+;R~FIsLUwZD6(ePFXASGjS`6;szz zL~JUoD=a0|HkxC008Ry;A;om?HSjH_cRgc?5v-6VH!6tIk0s8p|uB&Z9{wZ z5eJqYbeCzIw;G3#y5GbVO_C(R4L(d$T(h(CZK0u_P2*6e4PE7kQIIQZ*0YxAp zW(OnB0HJ4ezN$TkDs=Pt&IZgkmq$yZrPWwXqWA1;Up0sx0RRXbv|Wr0ebi0JsAtSG zP;zO?>;o8xVs;$y910N_fdDx&dLV$lqm_v}u(#<0&)UB2sgKCO4%5021kUf8Wh5p* za)F`k!8?eNXFEMR7YRcI^cea+5@FXNcYz$?7{(JopO*AQ;&i%XTB(sJ1yk~Sl<0*d zuM%QTNAg2t2uzd?zGdcQ1Lzn^kQMLID4%)VZYWs53@)z3>Y-qOTg8{dp_D~a|4~3p zm~N@3vwSfO5fU@yDcYXGLykv+y{I$Bn0c67kacUyFR0b3!a5K$;wlxFi*hJdB!MCa zB}N);(i|)gf`rC&EevY3(-@ITuqCS~n5QGkx?=NLk&julqW#9QE=JT|L|h72Ler2z z7w!#srlDlUMr?UE*&8s_-nZ@ik_!*7u8jNnv~~^{90Eo13@e0ttMP*$bm*sEJg!$( zFF3foQpb3B^+}hk()p8$;w|^D?`&+%cUmSUBBsbd?X+K6UfMfZI(cTZuBs`;tbS1X zfqv}59e)S6{}WdgRHHe>I`nYUEj@2FcsAVrJK@ehkH8$KF>X5w@V;N@C{}(se&qxG z-5;;R24L(z@_G!>jYes(4#3PvSSlm2r?8$v#d47?2TG%3yLMzTZrOlr)=>`Y4`LL> zOO!{5EojP6=&ilFm_g}7j@;=B+bQ!q8Uv87awfCodP66n0BZTVR8qNgGmng|3`+@B zhpnt#K2TPy=B>{xi%9JHRT+t}f6<0D_zX(ovihMe@=9^6NFQzNC@cNh3QPu(9UFz3 z=4oS|E4{Ij9^yn8LEu=Xe&^L#{f{NxC(L3$}POV%q40d(akRl(aaQk@=XKD z6i!+E+7$Crw@M;ti#tfj0O0e>O^oQ&DFKl486Htv5jt4ZtzbKdjjSOkqdWnRMk9d! z=9_P=ynp=T9{b*R{{sX1x?%?Js=jY8yzrvcmF4TNyQi+}0MPbx1jNb%R8`#o!uIyr z$$0h6Z~mVzeBpQ8e8*iM`^0q~;2F=T0om6M04L*$9Z>B6pk7(oJhuHSzwo;4t=adz z^u=HI%xAvx760RHfB2_A`}4oNT-VNFjIxbZESyUnZ4l-~*rJ7!!4$792x~qEfLtZi zIIQ3>$SKXu8X@>5ij2(KKoJbPg$<z{B%v9_-yt3S?VM=u&o18$(EMj~{55xO& z<5H0{(ZOC@3cOkt(Hsf~dQidVVK6{hC~rOS+yg^MH5#e=tF|(D0wAEn^zw^5)rU$n#Ek6L11P=AY!-K)?Mv;hxdjiZia(le#ySDjN$&Ux&zDGH0H`76Q;Mq zdq;uNv`^Y@l8)_k4Ed~0(1auz4*}$K0uhKIwq2yKvb;KK#gKc6zMC}TrSYf- z*JHzVQ`aL`p>vd$yD+5#*qGC4BguLZv?L6vvcLj@xikbZABxM2NPr;gVzy>6#QD;w z+Ou3Ux<1fs9_N9ixCF#8GNWUMt`8I;onOj<0N5cgI1G#%)5zolBcMZO3VrC>e!d-D zgOdrknq37%JrOfwDp)5d1K@OwTB??raKH!=AZ_O%E>(g|5)y3!$7L4=h(CO_`1aNQ zHq}o{(iSevjwUW&;>>{A<=>bJJI(lQ@M|IRlzd;B%I7O+IV6vpp_Cm=_A{sg=Q?tZ z1~Q{9MAK$WT4h#AScJ8O6}?I$KB7>6iN)x0&Vw3Ja=bU>AopA|>l~h}yalMWZA86B zo+QDzLC{ipE>Q??Xp-hC3x};TbGKH8$m(x#BB@a4m)3olWlB5}Q&Kh!A-!Ng*f_O5i z5ld{6E|*%ktYJ~JFY^g9znThH&VyUN<`dU^;fpu?r~mZgcfIQ$zx;*k4_tH^Aa0yK zzBFon?e(ucuy6T!&;1}Gd4xU&1`eSEAnzO^Z|rP7_Q_9s(F?!*o$vgoSNzP+Y;Vu@ z@7?pLhdtc0SN+Uef9Fl-Kj>kv_~}>t$bbHUcmLb_ zKK7B1?KyB>ALau$mK|kjgjhVP%ukE#6tRRQ*aS%n`B*+@6VOr^9byTplpt-*kYr5K zF_VvjP@#bp7O;`4)If%KqzV?7S`3zqriWG}nJx^cYXn#F>W|!FPNgjT8#~hV5(0t+ z&Bb28N;+2rWTZ;67BHf8wk-6@3J`Bsa#UKdB@Ypsq;DYg91(osZ`x3nI+r;#DDb5@ zxmIbV>^%sjA~rRqA#qZzTSqUgoFiUkuv&=LSfp#JmFlzUcbWJq@=kVun$wD5Y7jER zfKv1+xLqb@^MleKnY?P%LJBV~58J30#rSf6@^U9rU&`Vr^AnI~11ak`&7sSZ7O4s& ztC}pNv-Y5*;;I{oo7oA~#|tQ9F_pC9NflM7G-~*@m98?S$VRHHUD)NVVz)B7oB(9Y zax->!?BL0!0!F{Ry|>@lyS8)+SGKA{ z^LfMEJAfD>r0pckdEGi|yPVG30VUM3+h}Oh!A|A&7t@J3#Ldh+<@R=zKCCH*0&Wp_(*(#Q7}Dy3j{P zUlTwNj0myq$L)M&GFoZ+*>t;Q*E&~^YD5q9#Mho9QXq;U$G!B{6SU@%187=3k>CXZ z2-8lam}k)<19AX2pTTC^RURAfMzybN56(}!FzaJJOB5Ix35kh_7!dXU^`u( zz*Z|CFv!u0!y@lOUI2|8P&B6WFLyvGoKy-*p}&MDA%~hBsNB=NLO;-k&;r;t{N+bW zz#W7-ka!{^SN02eHAzBfDC=!yRb8p3N{r?57f4++qn;p?Mx$JL0GZtc$zKX@*8ZjO zIQa!NT!H~iDL^>pO#N7l6Ex`MtA}bs{ksGUEW=D+DA`Lu4XIF;%Px#&Ho^exLOPfc z746>|dip+$>KYlGhz5ZjvU7a#!>eDsYyHmkc;QO@ zrTfla`HZLU-@kV{?UG?r1R|ywS65d0o($v22kPaQ3OGdP867we2x-T+M*!!EBe)vs z3S49$pzJCx19Y8NfueKR6y67*lr#^~4&Sm8QK2YVXD02{N~mNGI5E-2qvXCrAn~D9oZR&}KbfLP%6{)l!KPHj=XeBNZrJ z$-HZ5a{o8^LN)^fv2p@%8m?A63&#UR5|9j2_+7E9 zltNL?T#9`#090rfFpIiu%7!RKPo2g9IH^cny-aNgmcd-cm-^1^R@-@jc2K1_@l4aZ>c4t8$VB?1CWmA7i~@|169}`~yWyNxUT&UGNWu zU>JC=Lav^QsWHAp;Kj!baIxsas7nHM zdb6o8p}3o|hC+!!L2Vd?^S?qHWbop*l3U6bD32?&1|;q+6t*PXX!T_vI^m2WilRQ2 zr>O@?=L}uYn!k0c;UozxIOibN6i2nR!-S+FBSfQLKgivQ4o2; zfcg}b*^vO~q9rpR;o_LFF{7J#S`L{64#7Ey=?*7tx{Rr5hdV-aZkzr69d4bSjVeB} zHaAWWZSJ!DKo;k*@W9PB*hz>$zAc!3RV_lihNDPQ_^c9%GndXzs0BI8jG60do zEyf!+dDMoBC-DNuYq32(ogZ%})t=R!>&QTaF+?KpD8|U58vx*F)SZ&z^olf&%zfV< z-n;MOLx+GOIy`UB3IN`7W@8>g)imI-3$!$@dybx9buwNV^|P+?<7OuS&A7tA9`>y* zHCSw$>y{_=q^fqN^Cp6?;PiIW`SH@EZkmd~ z_W?s>AOblDL=dN>)+`~&AwXHHqZ@jeF@ke>tw$el7SbZGzyzH3qA~z8Ipzos2{IWV z&WFb_VAR(}Ffk*tivfDz5n|=Iig8S#+nLQHwoSwJ$W;voBm_j)RF$thMX9=`KFeN` z%-PER7ePqKr4JNZVcpu`;NnlN!Wy45NURy0RJIpgyTGSS^h#Er92PZ~FV|#+pg>3F z-&%giP-(C^H#{s+*t8R+A|upau|`AqfOV87mB=mK%7I1@4NI*dRY3$p3h_%F00DOd zlc6bM>#PQ7amvj3nF6lGWDT?_)ac5l5}XBAtXj>ygg(uRKjnLcCzxbv_=5-;x4{9B zOjaQvMk42YvUCJML}Vn6mt1kheP8$j7X;bm=RoB z7$@W$u>^`?2-HwH44$PhZvvlMPa%K{5f=)9!oj_TW@YVUT4Q2gp%Jj~Ea|F=vU+_P zjx?-299mTA`|clm6T-!xs6{qd##Ofb2ndytqrg(ueOaECbygV~ zoj=q70LM_%7nIsd39Eyi zSYfe%HiKb-pnRlQFAqk60Kk!)_oKD_fBHv%cKFDlU;4RMe(=5T{L0b0VjmBmcj&?k zkNoTVKln4RdL00c#%m+*&pUh&Ae}$zM&oK+RhM4!kazvlKYi{CUw-wge(K>@JlI#` zum6T;O;%TqoPYSC54-Gvdv3e^_M^Ambt3UGcSG@L1H+<>UuX*{? zpYo&!PM!SbZ~DgTzxes9uKMU?&%V&NAoU0~oi#>K>RpH`PZauM)XqgEW!6*ZSx)Bi zJRYEue~p?0?P3vOsm2wEEtabH4DrHX>7tbkduenzxMZOI)IRHfQysBz4qZcQQdt%= zDvMMU7R5O2C=k?NZB*N@K)VD0k zNjJ?hB~WD4q)tR!{;?y<#iU)%l5v|Cby50LTv)-;Mwono3J}YTYl?2-1Jaw~>mpuN zsNfNTHi8z=0l-WY7{z576vJlq>+~=+(hPvirXLwBvqVYbZZTH|mI+k^Q&doeqEkPtWKyyCE0ot&Qa z{d`VtUiZGiv)DqtXKx3-YsRxM>Is4S%Cm#?c2)vLU_wmUHvj+=F{g8|(*Yk?H>1eV z^@QwJkPfd-z~P<8&d%oj^4baon0B$ARBhMS4X;i{JL~;Cga#oHjK&r8eEj74BQ97y zvbyK!{X4hcapEx-t*z8MpSycwyt+~&5)nnt+i}JYs0+XVjuBlFH97!vZO`OA`w@_vc75Hot0Nv$zjuWDSI6zioqIQ?VS*mH9*yhq za$S!Z>psSw$U8)K2^>lQNXtASi$8r%`AsR=t&y2Ra2~vK%z%s`h7e-18}E{b5OS_K zG3V`0QBIgd08Di^LIiMF^~@2Npsqt-GmVheYKRS<+&R0s1=V6H@j!EyYYcj-};@;J#zl}r#5yHJ*EU+4iGW+fth1Ifh(=ia-fC}3>*<1fMX_N zPMczwIlmPl(MXnRA#+;63DR#YIkbe3RKPM6WkCdk+^>*rb5W7E(tB9Ae34;Vh38L9 zkT;?)-n955qbdF6tSvt0^}E}*oU8C;WjA&UcQ$r)Hz9;P5QOQ7eo%;exo1HN<_S8A zV)W%2A(-Zte~;Xz*3sN-P)`>m`0L-XSY5+Nyqi`D~Vv?gt{*J}Np!gtXB&chq4Ti7BCJ{sKkDM#mEHOx3Y~ zui8r?twWC>M6 zls)?tKD)90E#LlaJF_WN%QxSC`}e=>M}F`Je&Eqp zKJF{`-9O)6f6c32`{i41ec=n9|CmcIecx3d`n5Ow`kBqm<(1VKdXXKQ0iepvo;DJpS<0!0GfW~|$pG%Zf>>6-fD05#!RSC(=39;}?u!<{0Q?hKMbQN%k0s{wG zs1%DRZQm5d@?B-y~DX7Zi0!=*!J55FD{)5YH<5Qhuev9%$C;L2btLSvHR; z0m@gR15Ase(<|4^*Nm?4UqnJikISPbLfq+N7y3g>{?dJuQ=79>^PXZr=fG9W0RkW* z2O_GQr6pJ4d}jw@4^0E$(N#=oVSso&rn;|CglsD&fBuCMscMcdhAYd*wve+DCGe=-V?EAPmn^mrI;ChA{ zVE^(`e+W0Gv(SZRwAA)}OTI?-3`?VCG-}!yW8(rb1ZKbx$G08tF5kz135WA1^?ta0`M$4uTk>SF~wuA3OB>&R8kc?ak?G9iOwN~;|l z#1I@f=R5*4kwX_E^@yXYW{2BtzccL{2b;0K$a|=3-!K7l+s65M#>4_F}dSs}oCh0HNKPrmUp8uc+f6a5A_R07EYda0&#_bvV$)vvgl09vE z{{!pI6<1!~bHKC}QDz7ng0I}>_8d69vnUTDD^H~g>2;d{5YrJ(0I3E-;F3a;Svkby z{?69jv+naMH8yiJ*>dG~W8B86^r!HflG2I?6{H^+^Wbh18+q5)3m2)75?RFc~x zV$`}h7@;mq%q!RxrR1z%86&d-%b>;bJQGM1bCfgbbdQWF{ZjCukflM{$N?mNI}i>h zr02BgB#R5xWs~?0RBe=uJL7Ps3+XgS(`8%ODiw_aKd8Sms+}mF zNp-16A^%?GzDW^Ch$%@h$dMt@sbU#okv2001_Ttu5Q$5TgLUDa9(2o`ge329L4Ba4 z91<~f=cN33F4tDmPj)4>4=Avc(X&i%>VGxaW6+&cqWu^{Gj7_p`_P9!aou&FU0q%F z-p$)?V{?ZPC*ukDr8~ZI*U$d+PetZtWi9k=y|nbX&wchwpZ`=BT(f%M=9_MN)la_S zx8C?ayTJF|cidP0qaXg*&TKl_voA*a)OFW?>9b!PH*Vhd&D!1*>zi-+&ENX#Kl!s! zQ*CT*uWwD4mX|2>Qa59*SujJIZ5wo0%z+KHm5GV+!^U((8jLc{pQJ@ZU||md2G!OA zY7!PLK0wysU>TlVa1Jasmkfb9f1}Y~G+FLR?n(e!u*k`-7*bh6B|ejJ6*KKg?qG1k z_6Q7qh_9BMzRWY*92!g|fO?zT_Oh5q(8{U8*`aeBBINh5Wa7oKZN!o)eHMs?OT^bY54UCKKN?hc^1U+P6F! zkE+e>HpGa|ZBF~Or8@RqQ@c@9Z*4|!Sb3avp{hJr)yX->^>}!^b6|ON-l5f-?>v2E zfBp1}R=<2~{mgXa>a>1>^8TSTZ^Q(QF~&*b8o;jY$oU8eoX-S7=K(noAvz`wOdisN z69Y06ILE-ycA=`>$T>G2bpd7}&Z6Hu6Y9w*)IRq8WHebDA;+$r_wzHStLesgZQp3L zrzcMg$V4dCuW2d(Fh(%TpGcgPB34z1L_IQ7AVOphP*r|u(sc9C^&ud7k9k#WnmrTM zGU&n&jOjoQa6lL!G9q(DkqIiMI#7tnTtNqJr|n0`9?2oEjv)4%vv$g(WvEBa)ggk; z&*xu~ofCsYW+cXR4u}NFfg7o<8IUMoshmK4Olo#wSAxcQC8q`jVYel3w?zk2)>P;l zWDN#HhSd-aBIY{54CM!fUTUl<@GodTh`AcWbMSP9cRAKox;gIW-z2X}u_8Z(Q+dmd zQO00O6sW@!1XPe0F@m_L@FMYFD7-E!1ht1yW>WMyAmUA#Tm=16vVp%qr2W8`N5aog$fqjn29YB8 zg&+Q^f0SMcH(R`wC1__iK6eZHXe|vcq}}{+WYnJB5T#DiX^ooTgDO5DH zyvocmm(BtX`mTZ~ODzPEKzj!Rmn{Kc07Aq6E5}m;YkXAroIx}bLreQ1%oJ(B6by<5xV8fP`=LuQKj|P6kga;F1AXP?*)zEH98G-}X#+dM1En zrcwH6mt4wUs8h_6C+v!4rI0l=fWjiQ70#QSN-_d!@&(!v3)G(D$M}JoO>S4*L~;&E z$qkNV_QAG~JgA;!*e(PDb$H^y2%rE6a-|gqmaDOVmK6q@kJ$b>Bz~&8Gy&=A#zCa6 z14Ka27y+{lF*7&^d5xs&34(LW%cIfGETV5QOu-#s*b8y((CUe$?*8@ZY~Eqz89e}k zgV4?a7`#g-djJNE0N}xSfC?+eB)EY?kwW=|ft~Y6{Z32UQ*M_01DoM2g@b!Wvu!s& zGkee;=UsdIHdNzLO>uL5>U?`>wH|k8*8R#9mRhQ?t^k<9Wr!6@kBI0v#BLt@2GNI* zma=+cPcW&xU!BZ)+L?D9!PdMV`-(!Cj7K={T4GM`#372Ycg`K_{ppqtwL1q_>jQ`P z-*ETw3-?bSdt~qJXS(~hI&MY|m{87e1rX-s7$8#Y0%HZ}5fB0aBRb&ZndlueIdp(b zF>2>2kwL_spe9D3)#Y*5^Spx&n!ZPN2vxHcsYbuLGU{Q5++hganG;KU!er&ZJYp>D zM{ExP@&XC~kk{`35CI@emPXEDH*LE=J_Ld)8*N%qlqzZw zB1ZHckwG@6FsHZQLOK$JnIkYmI@c6A5KYk$R!Gr%7-3v?+|;p+VcJ!(o zEP!o`4uZ+1X#>teDf2Usb5y~CXe?MFF|;71GJ1>2+U@{H$}C99z~p6*PJu1w7Kj?e zB|jKW9!ZPBa6n|4N1@Ee%wCnHf@yY#~`84v|h51#hil@<%bPOCF*v& zLb|k4qAc*-E?me`_KIOBEnmphgoo zngFm&Z|K-iHI^LB0b0cm#j{H_MK)Fe`2}wPAjc;IB9s*&Sw@K^p`J@Qq?b}f)ghn^ zw(#shHxm*rV5BYe3KnVIIMW`mWFS2N0k{Hjg8Xn0Yoco6tf6wI~opZ^<#Iy`JS4CwH ztxSI8`*jlD3|;87PBFQd%VaTf28NFxkIqgR%?lwYNnLjy3(Ax#012zDT-Qin zU|Yae$VE&o8yXF=up?tKmL(g*Xl7;-1S*TcpyDbDHk;>|$-uON0c1yd22agCM1RI{ zqp(JUXjCjQRl?{3yEJ}V?6$br@cCe_v6#pCFoxW0 z?pfgz>Fp%hh>QUXzx)|d|r2VzuU)QHM zXR|KuTN+Qs^~Uxzb^%9YrU*cYj$=eu`NSQ9yxdgIE!7^Vc8<2EUGQ8xK#WaYZ_j#g zu0jlfFp|R_u-b`!9{uTgdvK{*J8$37lV`T3ryg{8b>!&i*_~L8e5!003k6_`Jyeaa z8zk_7C_;K|9*4-zp+g_r=qkqyL=gZ&B=22{6olZ>&3hU*ZiL)#&nL^ZN8ag}v0?y5 z4B$>qaid3!qp^pPLl@gPT}R|*wAMk@lcVfzVCH($LR!ZR>>wEvM~;z0pstO8o|!qu zh-muGCAgG!S*Hd|9wPLH^>Z-r zg}S~{AyHO+XB=Sdo9q;koYy%AAj_EmfGNLy(nuryqH+Q`j6;%2jcFjp0_Ttzs;ctd9XN92o;z>Zw>CPmdfx5#o&3ygXLpFEfvcs_!99~teDceC z*53Wi-|?K4$#`RDK5t`Bba>yMYd-UZ_3e3xMAQQyq8p9J-q$h4&<7?)=O)X`9;>eH zsKjU~Ez7EE5|b5!C=^Zdo%~;wbs%7QqvwE>rA(Ln)S79K*JqDe>OP;HkBnrj6+80Z7 zSGi=w0YsE>=T2#&0Fr7hXij_)i0$qnC2fWC=R?zwlKb!i3PH)!OC|sXOI80;vJn44 zE5?jA1*q7r)hJ@-1PTV&v$Zf+Vlkp}m*pbWTTL!FDTO7=iRZQn1AD(|`| z@X8?Cw5&ZnQ1f9$?Gl|bvy`M!`dTKab7Cu0zNGR}>`CbYsb)l6dC`Z2m-Lb7Qhxz6 zs|vDuHlM*Rwxm8p(e_bfih1`G1t6q_>MP`kPBBQ|5CLM0P%;33ya6m{EHXsX4oEUE zARWaVOH+Df;$S9FsS7#h>Z%HnLYk-?JeY+-%SUGNLaeUj9Sd%RrC122inxmg0SuA~ z!*b3E$EJaSrxzEH0ZKw_6F(Ta3SJ`3el#q3;(z?#m zmO&IkQ34lAqPJ_pJ*OVB%E6Qcq?^d59Fuaw!2^cBmFYJCE`-Sj!?c=K%mV>H4(&3j zA*v8%owqerjTR=ymzZI-U&dtyY&;kBez{VPVz4H~B6f`AF3Wbub7gn@WP z!BQhb(Y;~zBC^~cF5-v$i7cpFT)d64JlUuwuhBFgq690!SdbwPm}q9?x!hw)7z&7J zj7QzUkXsomTLdyHQY6J>9HnA6=pxFCKvQ>Ey<%aW0A&=)TiCW`25W>nkjuGJDv&O6 z>8*OZ*n;?uHTEj) zj4;t%(kZ;`i30>5D;SJo8^@lx-jbi0K9`PLOW;Y z5Oc5|NK1#5JHTnOo;}8%utEfw&jZ#N+1}4>1I&yz3Em<~*(_#`)eQjI;&L z_lR?xY|*4;-y<`+l&7V26VnRkJ+yRdgZHcH7M(xf+R> zC=y|;Tq;H&N9PH!YRPvI=CNB|sV4jO-gENo^w`ED&s(}+jqaLtgtcQ%ubxQ8>%1do zMDHsX``o9rkA)&TbPU8mh#r6fk;7a=U|>j-D!^R%ofub^Y8N`1_bY34WZ3B$yk`dQ zF_PQv0I;r_YH8e#2)i!C*=7w~HOo_MT6U3;C?X;{UCxlCyJR7D1!;)f*fa8EKBVf`ZSeSAp?4V z8CQKzjVA|OBSh}{={zqcA|#+d5vV8XfdYnr2;A@JoLRwwMZ2>&C1J@>41r&Ku*7kHll*brW62dYi1pX)&hi{n-DvsQ6?-2dJWctr2fd21}#!6 zc3wlCWkKV7aTcra%X;O+R@VJf#W-8msW1N^Q61>=DkbJ<(FN0aR0u( zo%a+!_1PP-s^+sRdt&xgRXHDGA7dJaP!kO_s8Kx&O=*|@l+32k zR27&JU$%uoO#}fGJHWy6;Gv-MrCc6mIDm%xh0D(=d_4D`Sr@|&mnP8gArKvhr-E_l>2LtKbtW5^2UZpCNR84jlrz=5Al}QLXLS9g1 z5&fVcE+=}5=yNKZsB)HQL10i=NzEiU7r?c9Npk-Y^49x;epqJHEd1uuLJ4D~fP$uZ zBU}|{r9i9$$q|(Exv7bSnJNzh0J?mjyLgh8FBkx)({_2%)KwK@U+PW?uZwk=ez8>J zIpcjEe-W-^WoTj{=wnMPlyZ@sht%yJ5@`zxaKWog5F}f&mU`VvshM z=JjKNmvnPEtf5%A>T*#orK&5qP-ubWMyyp0a}5q~&ETC}TS5(5TTRc%^hnlFxQ;RVA%P={i<&H(g3@RbeGNKKaAa$kFg9-^ir%^Oj@JPO;Q*#%f>tIynsbc3;DY^4x)>1}FXYdgbAcF%W1_uPZ6S4;f zVg!if&h%les+JoMF|J3L&co6e#x=Sy4Q*SGMpa$Uq6cdr{^{wq@ygG?XOE(| z+dDVjvvuUacwE)%bMh3M#>tysbIh1^0nkxWL9#PqU%42_0adl*zKg(4Po@S&a(OR4 zfOFUe+?uzCR;qU1_uIY4$|3XwX`8V_KnES+oSeg|0u0~@Ikr>m`=%O^oAj;*kHBfM zImPrcob+xT21F!e297=W=-6Q-Kp;To$eib0vK7u+YI}~HbeIu_nZW_d!MRekL+1Qa zmZW~x*R!N`yUfWJ2#|Y-9vg?;bM#fuNL}xcnV6W6dj~BOdxQ!ixX2J0nV18`HuR8K zqu|M~QVmqR);gb|A1r)I0)1u-2H7FU5;5apU^T7_64Q0PhCZ@1uF)d%d7aQ@CEKN~ zK_4XjF9E^?O2|mYvd7KI@6nsCxa9n2f6c=_a`n|`*QXuDcHW|^&;f_owVm@7I&_tH;DDg( zgGPU`xwJVhrIGU18(;twaMusyuTsu312p>8gl{-%6Bivr-q}$2k<0`Sg$8MPkd!2| z9Swio6}ioPwDbo|6=y(%G6%p#Z4K0>6@IlB<25=e6W2}aC_GMU6(Fmu&NT!xKKUfw zU)o15v{QXr{Mu4G1&MPQsGXaZ3_o;TGiv(Khd$)xB6fmKRV;Mk)RR$)EChI;A;rItgyC@q42(=I} z{T5uaMZVql1C&Ar5>kog*4ca|TEJnWB3r?FtNGk6l)x&=5gbcT;6)aW zMF+;asm;L!`$R5sMtLG+652$vw;BoT77ub9MVd`*9!yOK1kwt}+!jh+`$f zWtXz$ZPsfC%F4!Bu3`yqIRP1x70|K?<3PHl5%WiiGYB%-qVTITF>LxH3CTd&>b907 z3@R{2T*lMvkflwPw6ItS*(ltoh_Zam`L^;U>Nf&^2#D;Esh#_JFkhZ=!_oL}!EuWuh-TdM2&{;c5P;Dk5O82jDLRAmx?nYpkbA~0u0qc-_z13xP_@o? z!~h}08t3~%djQ>r8_&@(I{+r&IZ=&>#2n(da$W6afp)r^(9-*Ar1+S8io_d1XFdn{FNou30%ai_rGe1+F|IIPXzYd}CV- zfH4vRjGGEE&MAQN!r;&;zeyUV=qk4vtES_z_kB-Lab010$!rR$$-UYLbFL;>feS=H zksNghf!dwuN1+}ud+)t-4iN!dPc5*Uo@r)znF(NydT=V%Nr52AGg87QSNLxp*E5ipdSa-b%n+$bKaF4-g@Dz~ZNI zZW|eel7WE;wokL=Z_p{t^c4@#OTQ|$Am#38+q7IR*S2$!Iz3qs$P9;oGcT5Wz|00~ zp7u|gH*cb1cZO&pueCQ?TRrjxK#QMw*_Fdb?IGWVn z#nEJi_g!?~wEoJOEw}F=_2H&_k8SdF7H<0D=WoW^ZJu0bK<_;;gJ)n4eP7o#MNY53 z(!rG&TDnR)KVNjE)4Mk4pwu>?7_v;f7D;BlBZ;Os)FLq>lig|1OJu`IR>u;i+2qk` zN+>$hsRy-&auFMK2*Tw5qmvvT>U)V8F`q zqgbDw)8X=bfj-16on4k_7I;aa!G2LtBJFb}28Oz>V~i@XL@IUnFb?o7>%&SOZEgZm z6UlC5P(U3l4IxcX5bT)&PT`Q~;9%6aB#ea?;P7$fVpqyc>i*=OXM?yXu#>@l&mz7O)2hZ zwS)zi0Fh$Y+@9~>w^CO=b|GuKIA@WwMk_2%lJ%nN6c(ovOIWgrIA-RiIAX$@nMDT3 z3o6RYa5gx}xm3$pZIYX$efkA}7yLuTs*%8~5HMDygneLV8V=5tKa@6#lH|TZ9R{Bp zGXqHLbwN~^M#*M5iDu?$>Gr4@wQbvVU3%|8fw3}DEp=)e3I_V;IaYQIWmb66;)jaJ zyT7u3fr8Lr&Y&2h*mJ2Am5?Q{$>xcfIbhLWuK9r^eq~uesdOrO6pt0ZkgKzei)U%z z5iuDK2ij2vh5o_P1Y_AU4l9&W8p!2gMjg%WKIlU@dtZtSIeMtLj9M4;q6A7isP>KJ zPW1-Wt`>bVRF`mDD%m;i3v`OeKqH*3JQfF1J|QE^(}}4ErQ&SvESD*RRG*XmW8FZSdr3jQ^4#^n9_k7aII^p2=w`)m z%47l*VGyU2FT{*x(`kwwtR@M7*hXrja7KVW5-@{DbP#&lhIsjkKab+ESvRdlu^H`j zeRQ-ng+0q7kFNG^&!lo)+?sYfJF%*LJC8i&2pnTaeQ+KSn2@ROAm%sB5)l!5=OP1P zbk0SBI41TbIII@m?`A-Yw3^~=Q7M@I7^$Wne)3gIW79m z$eib_Ql_cYBs-*_cMftP0s%+wDi0MRI7bfKKK3DYJqN}ZFfzsffj9)m0DT*IKA+S) z@({U1APM7WQN;L>xH4GOlG_Rz7;d3_M?DtH{2>mO77o2wEnQGRBNj@$PNI-i!)%;6 ze~Ts9*|3p^Sio)QW{Z(mLxFacmH+0})8{25C{s=JM98b*=~}|bLt>UB4g_$OvgK!% zazlDck9oyRW)4Gv6=|7~A{9dtIY>x{^gd>JI|gYK&WtGCi;~BDwS~Y4Vxk6Vb5q@P zwz;*nwz~QkZ~uo`T)yln&pWyK(4KIH~8<~HVA(smg0Fm<9*zz2u&Md~jVoC|ha|wn}Cng={;=1f=E-Nl_?aWESl@Y(> zQz@?Lx6UOXv(!;RmF-X|Q<|(d=E{~XN(Dr8RO5bgcBoWP|Si{I^ zsmKYYI<*u0!C((+a}3s0;h`W2N1(2o zlJl-^JYhwFDF&d3sp^43=k+!~=RDat`X{rLK?1wq|>ln*(c;^?5(* z0(yrY5s-+{6V{#y0m#=?=;nmr>JfAuBRYp139E{8b}!B=YaCJ*4*fp|`<}ru z^#L71U_j@9feASR`_K|rmDn$Xylp)tR(I~eHbc|ks<;jc<%t>Ru5go zCGQ)=+5yA}9IFOLeTWny01~w^&Sy1Lqli8br@1r&SQ*uam#Z<-)~pNYp{l$??;IjB zV2m+QPYOK)<~N9;_!VYsB1h!_07gojh;_Q1jkPDdq4bwy1P6>Rf{T%7gcM^0?m`U2 zM3m3$A6qg$W-#p7ClTE^nWD7~*P2$R& z174wsC400^Y$#ubOVlo8z*EZ>P*F0O;m(w#7ckYLO{%4U8KMSyxg(vuN0~aXVbq01 znB^6M*D_cYgiN&*cE!^dhU0&!kIfX%a~M@>Dc{olU*?a$cp4|~cp);G@F`lTE1y6G#&@4IKM z+54G0HlK6p`0$?Pr9CTgY5(Vr(`W8Fv)$KFZLjU!^WcX)bY(=xZn~DX&vda{KXZl= zotzkx!!-9X^rP`4#t=hP%0ROGszh&7rBFhybc@SZG8&e_ONCMmHNCAmzs^xM)8+k; z&mCC6Z#bh+b`*VMb(+Z~;P%su-;{u&1T~Et@%*BWvk@Jb#Hn2)? zPG#6kIL)MgJoxz%DC#lD87EFW2;vNpCze^K2Yt^G-RsO(i{ zoQhR~cRn2lpNii^0>;esj)S1T5_hxjSe>i{89|=KoIXyW3Vau1q?tGsUrJIUMld(=ttGojG|7F*>Mx)dR&C5GY1)z5);E>#A8I0FJ~V05cOH z0JzBP5D`2AGY|nHI0umgf0FrnM6Bwn8rAc;KRcU`e7m$faXwCG0iXhp-UG+T41PQU zVw!iZ_8f^LL7isg9YBcPv>GkNNI(RYN0#@|k); z=MgZSJ<7gEaMVX|o}FW2S0P7Wihu~N+UQ{x>q8Z+thw>Ho_GD(oo==s(7Ewsd}w)X z8eqF6CO}_!NcL_7bV$q)Qw1aofC1%jECfL0XOsLU9Mx5HVl*P-BkNf5jQo03}h>VgyUxp{eljWnt1ol_3|E6^#Jrcg!qM z)S`8n=#>Hr17Lpd4@eGVOIYWkV+D$ZPDudFVq@l0$B!R6d}v(5N8k0ACr+Gt)Ym^_ z&*3AhXSTM1#%|x$w|%+x?%7v7sOrN%U4Q!8`#7%cKmW2LlV)XgWjs4^^uC*q&Zp~v z_~gkGp(9s$FiRT|!F%7$=XE_wIKWaRG&vkQ=bdwrVpVw}h?HN6?a*aKp)=-f66KOM zr8iLl12}X{5dpogGUITm5&{%sq@+YAG=oy|*yZ}1iW%CyA5CF;L6+KX%2H705ePL$gD zvv=oWfSLtBuAU0yY037r&}>I_=d6DkG3s5(`#6}_u{ zqi$<4w$A3#vQ!F6=Bx;lzNG9Ig?EYwh7Ibd7pYo7NZUL8N5BarW>}HoV5wbM+9g#7 zo!(UTL$O#)D38l06OlF6Y6WJKbpxUi2MZ8wSnLHYsG3S>vg($iwSfpr9slYG@G zWqfutDq+??0rcpTh5kS>Mr~$+5GdL)fUn$SGU)?tZf>(l+zhP2(9T2#=E7Zn?skwu`HDI^7GkIfB(P=78ds0zx>Xz#a>Vk}A` zPBweiyJfyz;JfsLmA9O0*bGwYQwzwRqGiDXgThAyBUrVp!DtAeNj_YJT%e>FCkTWW zZl@zaBQ7lAlw}p3nMpPz5A`N73^tNA_Ex%CM5W$jQKf{^99a+h9UpgxIFtkEq#Ub9x^zrut| zY(qIJWgyq|X^|(UE42Dh#tUdWr&?n&vo)ZTs2V{)XLtwmoW<@<(bLqHvS!uFa%2$G zQm9mf1RVwHAPmVinlNoG;11^>L31N{0H~UgZ|l%?zN!Eqh7MvtR|9(XHB=2wCJ2s+ zkt0y#7*Yn3b(j?GipK(j^B%lw+ZZYb-g7;k_FX^is=6L6jk_*#i0NL*!8}8B&NCwS zJ%VEbqOiO=UaI2BlRG$GmW{e7b|`R=l|hr0NjIDKT?FUTYwAi|Q=c~&nb2d(IAw&6 ze2izo*Bl8QJ7nOA3lCc1vpci(v)z`f$746*IC8M!V~1|LBW%Xx0T9tUS7Fz79D%t9 z=a?9)hGRO4lK~wNGeln@`+5f)AneR&Y2;VeCOD6?Y1_u0+u6$6+GJ&UtAp(>B7!$F z8HhPWOD@D|whEDRNX8@#$~KL8)dRX_8l7{9E?vyb;E;)# zkz+?Y>)dVv^#D9tT5=w`HrJIj;1nks@RDLNg7GYnku6Fg2+hUzW=mrf7I?u$i>m?} zjAOH2Ln4CY6gg;Wg(gj*nPP^-C6KVC;T0wH88(ssg9YgFt%4hvR(64KR3ZgER4_0V zhXRkF;X`iW*S^@1uQ5_yf$$;$DOi3%*INTDZey)D8sZ96$9dsdL7wJ z9rL+n*^0Uo+7vpM?F9kR#YiVkoH%e`{}}n`weLH1@2%%w`iO@=;n9zN%3~(udh7Vp zn*R8|UjM0kPKV6{Pk78@E^kH@wob1fJO02u_jjl71Bh)O&YV3vpZB$|3e`|RX9VET z2VYelQ4X=mm!$)cHa9jP(r9^k>+~6%OqP}=z<^j0umemhvw-sg4UhR?Qs#`8iAkW8 zo(UawUC-Q%E1%ASa@EHAMx<_aZ4KpE>U3l=VA`eVy0&e%Hn3S*-Mcr&fX>GlDRgx+ z+TPfrc0Ss>Rym{?o%8v`>oiO4g%0FZ#lpA5fGj@+0FI26%SP!CzyT9h-Xr#XJacBF zuB*w)BxgO&tM)Fb$QR-cs05T|{*6b2@DaEdm9s>;4pk@ zgNzi-Yc`azGw06{^p)ex%1+Z9rkWlI_8?lx74R=BUJ#_rYAI;)UaX4h2bv#twy+}^bbAkJnjphIw+2B@HF5<(-8qBXX5APOmknoRQ4fTbKH z*BADj`ZuvUH8~=yHm%fykRFXquln%<$ zj9vVotYeXGun{zhJlJ`+v@|B>_4SR|_l!=hm?alk=$et+xxSKqiplNn+~ReHBH5{h zb8LM%=U9Qu!UAd4y6~{M?CYGWUpxdKG%JaAwLL_!#b?{D6--#@rranTN$X-_cWCu4 z-~bGR{EG(-h}4V}g(T@ywaAnUaBQ|^WKtniD0Qf;W+>Dz3r$ni?Ec77yIWL3neb5w z3>6Mqe-TJ!83>jVWXZ~nLFF6L&L6Yt>Z||AFab0;>2pfh)JwC=+VST5q#G>pDR-5j zcv&gENzVk!i||le11qB3rg2jFLavpFT;>C0U^XHbFLQ5Ql#>#C-4mE(v+5vvM9psuSX6RdzjfV#q}f=JGLj*;fm z(cUGexqJ@hoZe8vu8<364qfLf-}O{Bq}f>^RloWW01!K$0GSwZqi0~Ks~qUN81{I2 z*x~xiC)aO1OZD=y<8W|XJ#?kvzTI-L?XVx$A#m(l0Ah-v>s?g=F%t=J zArlkh4vu!B3tgOW^i1GuUan)`&D*ZqI6EHA_b#oDRz}+$&!-)F?>(pZl5MM;!=RMN zWeX7i^N0-4_8|h-wF}6R@$7bB=;!1jIABB|WhD&QG0)I>@LSW^RBk?6Ior1PpGE>7 z00DbPS#FFR5!(<$>{2oTNC3_|MCXwq5>n`iBDX-`9C~mbs|x+dI}eCVk%166=0h9A z@fn$8a!F=pcIW^oa-4;}CE}hTk|RKH4$wn7auSdU8Dp-%kyL#9Y1}yl-6qDCiAIyj zWK?zYZS>xv#=!a2H`Tc^J_rbxz%;0^+ou#}Fj!cD1r-GvbE;x91jT|380FSv?wDgD zXcdMFa%w%nLMRT0l`fKgN;#c1t_Vyec2QWQt?*)AteoklTmj683Q(Ro}swA_(jO92Wo~Ar)Xwu3j1WEE2 zoGCHrbR24tWS4=%BFWGNv`|QvGOBF%r3O-(SA#92y3i8NwV3>i+?2VsbqQ$rjZJ=E>q^L5KKCNYP zMsdX$ES)-+iR`+_w4K!~RX2UK_H39R44IpGsHQfb)uaj`XhN2OXCRDH0A#(&d}$`IYBTi4bHVu83v8KP)I<<_C}&P3vkZO(4_4Wy;UEJqACGf2zWX>L84NDI+D7!47t=F5rDxli#^&}sMZ_J zz>KXI#4R=|g$tQZ%=9AJg$aIQGZL?5d5}C9wf!7ZtplnZWi<^8$N2$3m?m5a#1*uN zE@EFSy^5~NFwZf5ilJ^sla9jur&7{#u=vYB(QF5~Td}v2{Rtc~wg)(@MVdRC`$v>R~W;9NfcA@2%nQRbp zP_k@Np^s$9xnz^3UJE|4Ok!kpEX3iAq?wSg1>4M33Xg&Uu?$>}=NqWimdII=I5o^f zs-|cZxHa$vN&Cv@%hsrvxt0B*E)WV}3~5W%~?iyLRo(0mIZ)XV$V4jiV? zub)2MPfq~UOZ$$5(Dk#kdk!9+?(D>{xw8Mr=Eli>KHqof!uf1|U`Y?XC6s`uzY^bZj7w28< z;of`iXFdSq1&of53Q{2+gv}}Zyf_*fYHjq3mD_ZiDS@DQ;=;| z506%t&K`S!+bsYZubsENXEk)4nlJ!>ZV4PXBLEw>Qv8uk33|!UW=kHFSV|!Vn2%*y zG;*QhN*xLhFYJ~9fJoW9m?S8(9PoebMd3UJ9tRMVsgwY9YDX&#i$AGUu76}qN+$>j zT?AN=W#OCvd1+7HW&sveQ242mTn7lw<yv!=HKHg}}@;S}KATMglyk6@)iBVTj zoL!3P>Ao^8DQkq1yyayUDtmS&4;}9FW<+M(-kK88-nHe`rKNe>b|HjF8XHY1g3lpz zV=IMST8KKw<->2#NKCh4owJR_&rNn~9i}|g=0EvAJh&IoXcWqXc< z0IZ^O@yl3(GK_LbQ7`}k_{xu)QB_s*w%y#^YTHgOklI)YGbjrLz?R;v;epkn9iXUC zGGSJ49NxU^m#-#?;=VliN^Lv;6w@BoYgHu+L&0)S>BGQ63+a+;hUK0Cwpo`fzY63P zP<1L>OHecg6bu_!NTNv#qB33A9IuopWTl6->RnUi@{Mje(8m-(nNlbiqs&HHR(+us zZUuv(Ab!f~xfFK?>9io+aEOw6NfyT1rqO^59Hc8E>~wdTZ8KsnU6zVRriOOhV!EXR z%q101jmQ`Ixu8X0TM{%}5OpO({wwi%&i<#6kv&#Ye4~&Ol7^Zu;>c3c5}PHV#evK( zVtP1~pGHbCK9I3PuHS%kR(q8Gw*aL>ahTrb$x;b1Ss&Tu(aOp`P{eAUR+OCWiFNQ76^Sz!aIi^CM)0 zw6&l{V3)QP5HN6l&0-0Ppk=Q*b~O5YROZ#ZWs( z+#$28JvjhmLIMP0%23A)4iFKDs&wLCsw`t7BQ8URVoQ=hI+i49F>*GMw3oyo5}|YJ zvAJQhd)(OXX=o4OW`!-m-CMIZR`+f1oarhgY$DbUy?5A7!Pg8(=p3aT_6%Gx0umxP z;NCGXwLAyvr;uLn79&7ph=9oG(%~Sp7~Fh^=iB@C?pXsj@4LXv`2{HHJr0r@XOu%o z8$EK;iHLxqW1ezd2cWKRnF2>nWo{bmtxQFS?0pRAz(*hkLS~n$DvU8H7XTdsd4MWb z{Z`*$2!Ub`uJ;v1&wvrrQKpJAxg3Q+K2nGjdn8vyUsd(Ud+!mG24rarBQR0q*i%18 zYB|iAVyccnNIAWe92)?=Z(KnoUN`X(&mjq0V_ZoBQd|KT~$ebzI+_=PXL z^F9C8b^YG8J=5*2em;G{3!ncrPk8)$-urK#|Kd$?+8#Wx=fywzU7Kf5Uv$BR51cr5 zc5`R{!SjCPKmW+)*)x}3aN*gF^?BFFKD_uP-~EKgJ?>ra`lnBR=5rk4c^4k})|Y;# zr{>UswcDKssCRa@p7E@2e8VrlZtvce&FSgA`}S_nX8-NK{kV7VFIRo!rkigCf=4~( zG2iwr-+bTQcfaTT@883a@Yv+5{_B`?_Pk6-T4_$4R{`CV_-EhlSDi4pn@{vFM zgTHz7=&gVHXMee8-vt+3cbZeMD~JG1ug2kw8y zv!C&lr$7Ck`;WczUGLpEdHTqC2Y>R_Kj)Et=dHhY&;6$#|D>;7TXK(n zq5DsrecDr>`jQuZH+0*-{@cHM>ddK?mAxT$Yz=yX^0x0MjmIWE)`PYIw!YD9fn&W(Y38S2YEzDd-CATQ%5FjF%U3SFj zcwoq61(=~43|c|e?Sk!;g_JA>Q<{=%F-h8F_jDB62#nL6dFaCG%4BKMjGCs8eduE! zVkAl@nk(oOoE*qJeWdJDg(&&CDgX$}?*LHFJJ#(*DOL`#mX*MXA?jmOvy_&jE>tXp zQL3dS4h343x0ffS5EiR7ssbL=-Q{b|0JSIOGO#gTS8=hXAmuRS#Lr#)FI1WRw$H4ZGY4uQQ|tPqwNY?=0_wlGypW;m@>xT-%Nb~ zfd|WDK=_AFDd3=X2>^hu#B|`isYesul-m~XK<8MkUtvpooggU_GAh`j#YE#6Wqv*r z3ry2nD6E6aJhWV51tk;avTS4E|9RU93*7`cRYC>HsXN&!lo>$*)Bym>WnrZqUZtSB&r zywqaGrV>zdhg?z90FN{3$O?Ds^}$qRq9VoVjMz%L*F61!!{O{$h24Rjg26hA}Xbp^wNC_bfp~V2%;IANl1f zEvQ6EjHJKz$qr=mvp5&0S8O0ap8U=h1 zV@({L$I3g#lYKnB5hFL%xB|c!TOzKa7;@?fBc_D~=qQ7hPw}Y+V%iY1VHA3n%qAi- zy5Jmg+?mDAofF>qKuj(d88Le-aCSfhz=#PaGGH+2-{t8nW@b+8mjPW~sG@99ff;j@V-ze( zuP5Zbg?5wk3P(!L(0X6!2BPdWq1sV38hLaPxbM3dDQEtufos80bhg}Z8%18ZW??cb z6R%7<%B_VNuz5_1XgLpHU$B<3i@)=`p7_{D5b_)T*Z+Luue{;2pZxq=-}0u5A9B%kpS|&0|HJb>^O;Wp z`Cobcuf5dzDx%-}bU-{Zs{>tm$IQGr2{PNEq zz571jG+*6z3z3t)X(PaZ1%M0Jooj#^6F1~@S_j8>=EDn121{WcfEAn zEdBgzUwy-uzVw(UKK}ax%{I1P^wRHq-gCeGzyIhDKko65{O*^$?E7E&@=Gs1{5{|I zgUhS?r`y}j^4gQ1_I0-(ec*dv_OeSZx%k(A?ae>`npaM|-`JkL@i*T1vp?~w|NdY8 z^E00LHMib!-@D%R5C7vQf9fSKeBrg9`TTFZ={NVi;SGQH_kTaxbFhN>e|-M)_m1n| zc+2m<>g6xL``-JA-Lszc_4gio;EIPl;@97J@wYtp+g|+R-~H6DdF)qiz5Rc`^>=^p z2Y&R-i8FusXK%aV##_Qp_hUctV-J4o@4w@3-u=Jd@|*wsuJ=6h$}9iyZNK|H-}C)l z-|NXog|rpEGhm?rrZQq~7%XKfCst57e?}Q#c19NCWs5&7iGdap)qfO7OXJdDsmq~$ znFGPV!%)A_C)$C?N(IC;*T`jrgPe8ICs7`4m>?8v5RRP#i_UKgWT38=Lxaz0UB~V; z2U2AqAM}(aPBe@a;1Y~iek&Z#gc(!_Pg6PwQurt_B}Gkno_TID5i7Selb|XW;#%?v z=JYN+?7IHUMx4&;rKM5R)RRdw0VIlP^#{qO>jFU*c5~MlOSY9|wov#`(bx|FK*NPT zGl{3PRgw#B*X777Bva$G`Ue1lzEck}T{P?4(|;sVihw~@-AiyE+EBzVh=Og0(i=0wOwxX}Xb^1BG^HHlNPAu474(i-5ACb386`mcmIBjvF5r$evh;W6+uDCo>=67c z8Raqriy~Papdhhus{#!`(b>RDw3?ubWUF}-!-_>?sk!893%e2ZpaC8E3v-w#UCjKI zhP5OBQ1#@A07>mrF;%uWg8eDxq#p=HW#Y0;(He$SHO02nvIaG0&P#iSWj+l>D1lKm zjcRHp?jvHU(Q&TmCk5DeZWOGJp1xJ$%R@40h9LQaSY-}UAVIV=#9FH==9NRFL245E#%gr6m$W*VS5eE(YiNqC%xcC>G!W zhY0zYGDHA&Vq{n{$Q)uRGUAkgsq&1@5g@R`9x4am5z-4~nYag;T0sD8-QQ1qv8Dl-#kvcd7Sb60NoD^m@sx_*^>6B7i8uD_Yeqr1=nJ z#o2|0RO)z401yE=7rhL7&8HC6utNRN}mFsbG}4UkWg2R%a9in!l6W^(~H? z{_5O}s7eogQNV zXBC*QN=pa@eOr@1;o$~-Z8IRjpJD+aPXZ^eX;q9;Z*<eAo*)t~(IPrW=u{;fB^`GUiT|J#54i5Gs)i>`dsl@Ge;lDAy*=F1-Pu$R8{ z`~Lae|NPO9UF(~r0|)jmHB>)Edrb^;;^-YSxp%(v-T&~8|7Yjy zYhLhzZ~xRMKK;DsJnNT!^^MD;N4XT@}MS)Nw#Ulq|CocM^Lt@L*8wDxUIv0uMGQtqIymJ4Y%es^6`T&1W5ric{$(mMdAcQ^Mw=&Cn2UK*s`{ugXgyHK zrvzTD4QkZO-?+r%b9BVS3n3qKRZI+W2#v(TY#?t7H!++EDD-{k`?l@6zKbE`ZBVxA zA%v-@15x~k^%F7KU81&5pE4WCUJMg}MIGVL>HmNHp!{#)W1YYgzeP#@g}kJ7RFV=G zTp=z*QBMym&t+EoNi{^x?HS5f=^i;QC2KyhFq;O7Ri^`}Wfl_#_?2sY`Hc#)>Wa}J z7oRSuknK#8R497OEF~T0FLYB>Q7}{{C{f8_VN0f}meD}~t`zgY0l@GapUfacbSBp* zrlpP{&XU)d0+h97ig%XYiSw#oOJ-sVN$P4kP?^d{IXJG^d?u2Vb{RU64oO2Y0gFRr zN;!}nNcOD?HI`AL2xK+M7IBqV4kuZjg3T;(2J^cFK@TC2+Y*)wtrsT{U{?*M=b)gD zFyImztdRBiJ54AC*Xfc7BS49VI)tJJXKH+0d>0dZa!Rpy5ZfrTOr1QHhibd>@T6vQ zD1e|AOQjfOjv+@ll6g^ycUmCaU8u?$AtH)27(!A$8vUiEnz=g*xwsgWl&dX+NF8IA z$;I4R68-@&u(;%^;-5LZXqd{vFiq$A+02zJYNAv(70Oh3D8b3tt&Y7IS>`$hGN3@J zFursZdtmRuo)H2XJ1V^ANYYbwFqu5WP@jUE zc{Eb0Nh@$bjx|Dci~-ll_P{Lp9;&fBc>|OjQ6#ZQ!$o=;bAJDjW9#z5aMhHJjXLjR zh>)umtXB)oT_^@=)s2T@?T^F!YEn6FH$6&NF)l`5)1+ZCrlOlQV}IUWRNxT2Gt?+MJ{E?bQF%u z&+q`wJ0B^c^UG^{)@Ntm^Pcxz`KU+y@Q?iP0}mX(_vCs#8J{}4{nTfC!`8;epa1b+ z-hb?Ly}Z)5VR?D=InR6MspF^ax${2nt0z72%1?djlUH5+(T&Yx*L~*m4|~wXk9_Q- zjvl@JUH|w`x7>EqM?U(=XFcty4}ZiJA+!$Q{KFSr`>|`+*S9XY@cj2(ebp_u-@O08 z#m7&a7>^nNbPfo3d%Dy2^VsbKqC0Q>%4a|G*|QJ2^!V`;4}17!`}Xab&F4>h`q#%u z@BQb0?gO}H#NKUBr$=u;de89_J4ZJ^c-60Ieo<=AJc8ku73Xq|MA^d zpMU8?-uzo{xb5iOH{X2g>wfVyecS#1pZ?X-zVmt_cJAz%^;>Vc<-`MbUw7^2pYiNx zKJ1Ez5XB2Fe(0e+%m4U}e_Y?(zU$s&?QH#vU;OL~U;N`+XE(39`dt9^-~QeI^F!bN zlKn?6IC1J&-HbQRt~(bdE30QtpZfH*pWJ_F?UoyF|LmtfckjJ--gocuuY1l@uK(gq z-}X)4c=vtx+nc-ib>(Mj|aLF0l9@+zu+KqD3 zDWC~>xt>u%OKyTu4wn?9EX8YytWbhXW>!T@P`o*fhGbr&uuUf}U+K^gG81C62VQ2e zj6}o;(*3r*{4Ei>G-XrxQVE^jGjSKXt^>fC_s%(ovXnzFO})%PxMbim$VA%&LK#Yj zjb?WLD1_(m0ANf9Y!ahUcJSbIi%e9?j88^+88E2qRB**JY~jOpY*dJf?8(Ax-174d{hpUM><%LGO*7yD3gL_jLJ{4 zkv}((B+rZ5(~^~`K_CyVGYDX1W>zD!eO@UfnWZkqN%RRCek>8r7AWoJdzGk_(xsva z7s;T0F^n9dNl}}TgBj28a^pc3+$4sIBiN88w`kG3JXIfL6l%0I02H}g1}f59Xiben zn^$=NfNpTpBG~}b|Ns41fv8z7ey@E~9TiL&UIn677}Vs%YP7Sm+!{q7nedjBA5;^?AUB3xj*#4Sv7V9w&F{T2#lf^WrzH1k{3rZBzldMNevA}5`VwMbQsZB7z z5CJxum6D9PSdNz2?SN#XYnB=d%K?dCd4o}g#C%PDSgti`ZYYZmc1gIvQ$dUTH>SF( zMh5ArTC;%(2Efb>O_*6MuIjJZYe=swzYRNQm6Y2`v_;4u0uYI1VsU!5Bnb?f7y+tH zv(RF7a0WoEs(NR8YnRB3r|Z*277K``RgR2~MQ}Xu8QW73w2>7vCY~!eXU*ChC6H(k zG8^TDZL-!6B~C9$*~Bn$sp7&$?`EoyheZf8n)DPyg>CRsuM=03RbW_>D7APLU=;X= zvR}SDeW<>oNAqzB$`a1Xq7Ou40Srzc!a0}DA}}pMRxA8pe^ko@f7jT`5)>?WDSV?= z^Pre;=?6)S$g%=JO%ZM17#VcmAp?W=2yU{}jFu6D-aCgYd-k4xXdeTt zEKgRK$Idl}FTD8Bg@-=<`Ri7fS3>Ci;xGQA>0n+mFsBT6R z+%sBTI(qBT?XArRUwp}1|KN|m{_CH9`0$0F{ru`44&MvE%mx!(=?(vwx3se)YhfcHZ87-vi6z<*VNFZ(Hrww|?`t+;z|W zPkzeNW?}BV-|6P(oqyh=uKd~?zVzvry!6FeTU+aAPEVFsA@ucVRQalE>ZRq$WMz5( zkqh_kS)Gi>D|-%&S63eS=*u5{iBEj|=$-ci&|7}{4^~%Kp8C`$5QgVG@A-G!dGy4|Gv51Bo;D$WVE^`KFtugz z7nIT`TSSn#sp3xqXwndvp?^>vQN&`@C{utUIeB48h8KX$6_xAcnjFW>bL`-Fck8--b4pL3i}23L`|iD zA)#rAeGF-KAwMmZXLHD5bh45Sn29kjcPyet5wHX+L0*(T0OX(|(XxoJ@(930F;Wb@ zk=XD$D|C>$&j6%VRJ*SS(9-xhE>lY`%nT4A5ftD-H!Sy5Q$?0ZJH1RLTL{dqzA5r9 ze5fF7XtTCk_%DG&Ujq=eeGfW!13Cvo-FyzE)GdreBfU&p0J>ZdDRE89N`~f@_{Hav zvx-`~ii6JqKql38f1bW94k^<#8r_Ou2Gk3|aXOOD)~68M;1xJ(%2}4_SuQ7Cdbb{i zQFcQYFk)4Q23o};Wo|ww+ujAFGqI zM0n$((q(ZVspfETsa?pgYmKA>Y(CY;=H=)N_A!dCPP>E(yOz(%(qjhUooOrr-&$T^ zb6AF=>X4>s;X)uXw>Y3uHd;xK4d+JEg9wv;C|%(aw&p1-EoBLtWR&jD1}QhAQEEY_G;Wegh{2W;DD%GqPtUT**qa`T4B&LWQe|W2?8|9B4$_NF z<z%oxT7-JrGGIh!;R0#8NM@fEp7d=B-Bm#ioM4n|?v=pKE%F>enix5-^YI|}RS~4jm zHb8O(vhj(Wg{sG}8K%Tk&XpF>|0`A-NKVqWIhphUO1dZH#5h-4=n24SF%%ERB-p4) zBQqc}mZU$8crn`L7SbSO6%VjZoaJG1zD=jmvz_N0mI}-nC&@h<+`ga<)hMJjCPv3% zsM3*~x60;PUVMP+KpL=NYoSz6GRk7M2>IA~Kr`)Aa?!L}2-zr5J$g(3Lb(o`q0=!yoo&=TJUZG`nK119#Ika|Ey+du%o_nIg1ak;)Sp*@4 zOR;oC9>g5}$}(ln+p-WPl*q{`1Ar$PxAZyln4yfoDuo;ae%ge56`abNv;Jo{8{@mw2 z_l0LXNx%8#-}tr8DjhF|@~Ll<27hkx)V#~!%d?R4F2YxC?pgpIA)+yCkvuYS$TU-Rl$95`^` zhFk79bNY0%G;Vih-Ml+?dVOW~A%J$K&sj=%l8%YXMxzxAd!95{I3)1Ut`!1VT` zcOJd>*wH)h*g1Xr%QxTs$?LBN2hKYrZrk~(vuDvGQJl5YNc7PUUj6R(zW*ow`wyKy zb82&AhMC#|W^{wf2tNZ-tKmW9!`tcwA;UBo@!XtOw{*|lW_o1(Q+Ef4Z zPv3U()Dq7$HtBQEblKG%pmBf;DqC37zO> z6ZlyJQ(82fWusv-msYs|4=6}w%9b#c%nA;Xciw9P8PJqM=P;1)3)zIPtoszMq+`XB zbxNA0=V?KH(uDJX$P^((EooP1TKe7TS^!Mx%`h%Y*wTWK5m`PoMEh!@6a2rd{dd4^ zS6L^Hf1b7XDQ|yo%gs$sNTK&8O*#Q-0t1SQid|u_j5y+m&WsHKoe>eFIqCq42nf;z zLP7}%0YVBXgoLzPa@%{~dd}HtkKrL3c% z4AFH>l0YKj*+H*Q&F0pIWy6a9TUQl8%x4!Oln zsM|sISVuER?S?9L_h+-^=1!_r_Pk2CWHKUdQ8dz}F&SQ}s=RSx@znEoopJWT?_IaG zaiZ?^nArp@yj{BqkDSBwtht9d_T1P5233?&B1+04mi>2toVlDq>BTdNfaFtl1#Hyj zA`+<3!;XSe4x+rW z`Uhp3cn{K7(rznW3M{xrg4K`FcANuUGvm#f7zVDj&-Y>b1(K zl^T{L;UJ>wVX|^u`0JF0#Ri=amox9(cjmF9hexB$Wa$%$%N&?kLxoN^gq>zG2_BGJ z*2YVUENIam${5uL*2Gf4tTM!aGeRnh3Z=|QqG(qI?KqHgo}HZ?42N4=Tby&Elx;(6 zRiO?uv;~UhOUJ5Wp~6cZmkE(cFa)OE+7&mzDq84%IoU@scPbyKDlmPsPbbC4O{u*O zH|PV0N-cjjOrEKo(FOy}td;JYEEFRjpK(zJ1kan;u++H1y}#g-Sl=C+!n=KEC4^=> z$tRs03c9^hHNpCnHI$N^I!&~WbjBL#m z3Lpj}5Hz=w2UGfSe3&E$P}TL!?EHz9W8=|?lI&ru0B%!oaG%4g&OEoJXc5v61~n`O ztW3HmEpmH6sqMDhkDls3W64nLS~ZnM4K1 z+^tiiTHFWC$Pox-Q7k3ZFH#BC;Gi%rWH4j^;E}QD>7Vs@ClDy zU0M0|cdq~H*S@~Kx-~aHzrMb?ymS8PPkC~?)gC-@Xw;0axZ)cNb8`=T;QbFCICA~9 z*FEDIPkQdNFW$fZ?tl6CCvUv*=J|z%tHcyzw+mPasd3>7cRT>vadhl(T~V!a?Q7{ zW~v80`l%oPvGdM3_w$#1`4gY~%<`T+#NbTloqu+}O1Iv2$0Hx{;4gjUYjvvccmMl- z_q*TS*w}c~qaS_z$nhJ$bHl4&^NWjfGk4u}#}!w6>-h1_bI#kh@6>&(>+8S$pMK@< z{_ewX`HMF{|A$}l+-E=Yo}>4?^Id;;+xKq&$)Ea>Yp%WK+H1elpPefk8<|CRQCA@_ z#~>&RtKh?ILT5rjQMRtCs_L(cv}`1VZmPxojdBtTXIS_Ui0XlVnQ10ljL+8X;x85#+(~E2 zTXQnSUCBfq0gWqQ(VzX3!g?W^;2xA1>C4>#9P=+VLZ(2jFbR6)JP; zQ80PFCK?C(n8U$t z-dtTg^}JnYoTG`4eoTDm^raTL&S^`s|R8>TE&O8~n?W9FxnCLb* z_0a1f)c`W*%$XP!QzhC#WlChqRRo~5QKsDfcJsQ_3@cPdm(v`(sb=*l)J%~a0!@8x}4`_lijJXiTATMHkci{em&GYHo zi|eXlz(ydUmM(5q&&QL00cF*~Nf}5C`4ynNy4Z*pxWvq`T|#_sC3^$=x_1p~3@MG~ zEYUtqsj#W7(GWqBpa}&9M2i?5YDk@E%Yz!kTZ?X4y=e~yfSh^XX=ffga(Fb_no4|V zo34S-xem*}XaFmcz@nXGX3Y~HVg7;?+}s~gHyDFP8D7I1@UE*hjKo^j@BN z?BwqVnTze$gC^V6js*#K>RnENPVcvMXR5pUhq)f{zLQWoKo0;$=3Lj+aAt06Yjb_= z1f@znAEtn4Fxo5r6fl5*HGDxm8&b%KEul>0NbI1`%n?=sEv9Dhl|tl}1sWYNGX+0h zY@vD<(Rlg9Zilwz4jYfzKEnYyve7p_MKFLsFcuIf)TC_pb?OHLR^bkqPww}Gp2^si z1p(tNgBJ2Es@5duaLcyHM7qeuqd37>fjcr8N+6<1^NOGP$rn85nV^Ci>C%CDPc{-#nNXe^9gDOj97uWHf)>G=)_mjLybW~zLauqhl9azc0m#! zC=m)JN(@wWZ*6mZGMdcJ&-Y3hOI>fSt!=FwA1*ERhr?!bbK~e?RD^bnUT2vvoa>xISng{9-ik7F|G&kQD$7Iif@yRg2t!s{nM2}~IDhjR;C>uVTo0t8H| zh23>;Fj_f=x<`pQ=eebwgMOdeoT_?rw7Ic*VmO>(Lff_rOS{^(Sv_{7?hl58-s-W# zm^46({$Orlxtvh5v9;N5tj#R$sH)!D%2CwS?ELb^iQ|||0MOjr;^NNnXtcSuI=i@- z`u&X)E5rV9W_H+4#z<*A8E>38R`&+|;lk$nG2U9ATi(6CdK~Rmq498O&(_)oYMNi# z!Qjcp=6LM{dP8u#v}bRkgq)Gm+S(d&Gc!AP;>5AVrQMYH#LCM2;!@qKj~_kS>kWJT z{`!fPx>q;j26=MceJ*(Sd;aIA{`J$xSK8nB^`H5PSN{AruDp7(v4LKV$vUdRU~zeL z>|h$q&de<^P&N<%k#IhoLFUZ^rgSffkC~GAXq)`9m;K0N9{;5G z{nMvo;v-wHEa4~)aAM|^5=wn5k-4mzZCCQh_JtXNL^?=<;VNg}A4D*%n1yU)iDOfi zv9eVfCq`{x>TaLqX=HXFF*8|Zgtf>17W?j|-dr_{ZroYtPXAO4Y_Rqs4X9(A-9L?S z6b9;UgH9VP@dt}RRv%al{m_h9ohl;Z|S<4a}#zVT`gfA z0O_ALA{6R z**7?CN3}QZ zCyg-_dcc0&A;0@T%qJPzdRtM2JV_%89aj;G;nG=6mc@W}k0C3CcTaVkp=8$)Y5-`y zdn6Re&AJHO3??)p=Rk$dAf}0`dg;7734IZahe0%VDHCE0C}K?uo;TcTFrX23xRbz~KhuGqICL{ok>dh} zX}Xp0$p85#C`xQ5htz6eTJrpxhU+2Iv|VoO%C`6UDs6xNw0y`|Ou>qq$%)YK_XmT) z)@Zc8zDB7kx5*F;gpFk8=a8!T`!h>*#L@A95q>MK#{Em+n}G zf_*q@4m67t@U>%0I|-}~d?~LaFH{j2%(+Y!X64#;i?Qufh^uNPFABhEra>LKZC*;S zDyksiQn)pks>oV!*1h}^=R%VVN^Lut8_w{|Y|drt0p!VKc6Mfdey(krc0BI&>gBzs zY;9~*)nckr&Mi1o#?rz<%kxccd-VWBZJzAhwXI|V?efx6o}X)*NutDz z%+12WTss^#lgVH(gI)q?xO-1CX;VdYe?Xkub^=t~PKJZQV7RAknyRW3RXH~`VaKlB zZ8IU{<=uNGTVn#(y}E5$2AJEKL9d$GmD?6PSzKOZ0I6Nru_I4%-Ro6#-Etnz3}@%& z+niIvaMv!*Ikyv{gxvNj+Ocz2(@xsFH8(ed*&(=H+_|%vOxnq0Ff+r<_0l}0gxnI- z+``iQ;__rX8uSNDXq%?AvoJpc5OdzOYj@MO1lqZCXVW&^Ham9g%sC^ar5!t)Nwc^# z;5<2S={~bjn#UU7qGDug1l|I@QnJ5bgkYvBovT9Hg#?T~)fE)uvl0S*)B)?{| zr4qId#X@1C%&k$!Gu2jd5|GsWLqhFqhb_`Be-nHcB7rwKdz%@Qz&WguRb+rrz`_Hf zR0<+AL7qc(E0IqBBxh*>-Y`5f26~VIC?%b+Ra3^nW^GDzmQF5I&(2QvJ+EUv!pvbp2?z*~Q#0V5B`{Jd zE`d7@$({DDNKZ?*#W@6x-AXW!It1!?4BilTzS<3G+k0#d+i%k>;WpLth*PCJS|iUK z;a)$iue{gKv}Gg+FNje0``q&S@huQtu&@81^LiIvFn7O;=FU5NcJB_%_jBP*+w#U{ z-hTw&{r>2NTQ+X|?&!K(MzQb$$H?-3oj`uuD54)0 zjC79K49FJcCF0P#lS+?Fkm@R8(QZIpWoJ_1P}m^1cp(yp=57boGIXy%>tM6hIZLnE z{|j@@S*=W%f-@*1bEC)}Qk2uOZ}$SjbRUOz+9aZd`a(8=67fncV(7Y7rer$PRjTZC zN)Uhnozx?nmXOMF2GC7+z}r;9#k_zM$Z)!7i7qLa?q~4rNOoOOwNUbUv(Av94S|sz z|5PDH|1@>&bXPIjnnS69QHE;c<{QHsOh6}Ex5!QhRT@p@(9}>`F6Ot~k<1>zv3mQb zXp>9>sU1*)B;9t$2?~Ij61BNmTU(o%otYU9+O}<*HY0NmCZ%gpjA~I55jw?ypYc(; zCY1~!=J0_QlEyiJPX9v?9_LA;sk8Sp*i*Cq5@0*Cw?X~3Y@512ol$nFS32diFe%BV zBAThor8O?}?3S=YAIM!RqSo7Hf2T)L2<Ju1L2 zt;#=gI*#SNm6AHynB}2>&0;zW?=#9oYk4iP<)0vHCyO&oEG}Z%rOk3Kh(#6_vdH+t z{IU?oQp4tjQn8=%rxqcSimF;ZXc8fiCKX&QVxme%g&u;pF2tQudNEpM9$ie$s> z8PmwfWZBJkBHi)(RI0*fi_Q4N)=VyB2%LX%tR@-Oq~1u0W-Jl zMAV6yK)F@8&Hxc-B;x*{52D;Qsj9%7+esp#Tn-{+qQsN|aEpc;0ExwkV^AJXQc9^m z$Zh7FkrFaMlu~LZld7uv{Xv_vib^hX|I7^LCby;AP1}ONpf;C7YjTyU-pl|DRCRAK z^Saml_jAuaYqGg|=N)(V7Z!*c&dqQ*!#Oui18|cYl!^Rl>@w+?vexE1xG2Uuxhq(j zp-@3k6UZj^W;`sPh~lmgt3w)=g67T(K~NOnYh1gb6?LqS@y^b>Z=knZN%z z{Zmf`W&tpo25pNL;1&cVx`3)DJ$8t#**or`?|iTM`nOg;bJ@xlztc>%cy@8nAR}j8 zT$JOhttYx5)@F)S+5At|bYcqn3}_uJ=Pc;UnTtu5$}s~hV`#~Il&!fsgrg~e>Bv#( zL-fg~f(`a}`D2F3yj|0&D^cay0yXmH7@M;4Hnx4#Pbps%AiJilLkG!a2wIBZ zn!32p83|;?9HHBtMnh+8q|&}=htjf;%)G~dn2P=sgMGEIYSgwVt|oa-q8$E0>$&tP z_SRwBkg({E6$1S~G2tWxnSLZB0mEJK5#d4S(IA2}#gpzB{cES&C&3PTcuU`>WvWc|GQ zKers@xl)~Ty_c!?fVBE0?E2J&dG~(1PUgM!OI)~|Go>VlW`@~ac_B-&jn4H}ZEjh_ zm7poY44};*O2mZ3pv+9URdFX!;@mRp@k>;Jsm+|oNSOf2ZCNsF>?@TiB}8N{D~yb> zpp+`)lsSW$C@EF5yCC`xAu&?hW=cpYsVi4xQWu`OLFx!Ns|w1#L_{Dx1-R7GQ(_>? z-p}N@HhB#bLz8t$bx(SjnI-wya!U2m&Yid4aR)LMcJE_qxos%bIhP!C6{d5d>;(bt z26^uGb@fzTBa4z0BTnxB5V|@71>%#N$0^94g4%5cKyMGCtI8e$Nj=q=Fg(d(+k5|L z|6@m@2C?5mlmZs%j_JjS7=0trp-QTl8+#^tDdknB{N@nkl0lp5-V}qao6;IFK((>f zA_zy`q?3j$Nfa<-dny|MkxWn!A!k*2%aprG3dwcrIdugiblhuN3UX(lTSGvs>q=~h zRyktyB@-Q&z_E1PGW zl78~yQ(p8#dmsM5gt^Qk9&L^Dp$WB_I490vMi!`Uky_N~_fI{wf95&!&wTviOD|sf z=)WC#@5fiaar@R_zOH(8Gj0gQGsq-sabUX*!?Q>NsnXNn(xtktQl-b=aoe`sPKXkv zI_I|BKt$ZMxosi-c4Fi*eNL2!Y{!-a;-n{hFjx+zFvg(l?8B)_6;-7ygqYjhs@m%W>lXkf3`BVaO_}wKl(-%L)Q7>k^iVaM!)%bDgDD1iL0ohP;;~;KqO1aE{+Pc{zS+`HmMOLf zdn~}hrT2a?3G81t$tW{ng*hCL2#upKn2Vzi43h4KMyHhhBu3dgQF!HQNa4SFg#(8| zW~1X0=so(dTw=vPs6QW?*0)OBl3}$etmyB(Wx>~}@`woAQ=?$!DkWxYZElRmsaMxk zof1`DA|kZY0Xv^9rfDNcol8?FSZFh4Jl6C9i3LtkdjXMjotxc~@tV zL6jr&11vi0kSy>o(1SazOwaFZqi$3`b7+DXls^Iij9t-3?hMenNYX(8n~vOeI?-VV zk?eJsn`SbZGz=|uCNs^EA}TV)?{)id{tv_i%Pg8JT-%? zR948A`h$WHDh{z?#BB)ct{EYiEauu)o+A}+M@d;;#}@S#C%Md7mLcg1O7Xyx4c-n| z(?#$`2WCoQYjiASQ0_TMsK%}vp2;L133Y|26MhsESjq|u5lG89bfPzF9RYx>wr-iY5*EZcSSWtP=mMH)rv`$A5M)+x!x5^v2Q!XZFbGIXG2XN&q$L(Y( z&dRYbN_L@WsRm5|CveFv$WAZz;xII~$Tp9jA=xLUq^ewjh*Fq}mn!@+J(kPa*(gK@ zQ_9Q<>{UME3OWnQW-Z7znPt&m2eVDwB`e)gLM9|a8;T@I<NKXA+-}mK~iB-V3%_;o^UGC21f})SDxl$_f7X^_#CLM z#6fhr{E)N|kjwEb==vpYCCfQm9gvjst#cPW?D3ePHj7S)h;!DBLxNx4NeGzP^YB(( z1g_Q4B~4k9VQA!soY+#JmPi>OL>1{J*|K}vyJJ(rW}kG^Tr9k6Zh_fbwnmD~sX;Bb zvcj7rN}O)eRI!2P=tZmL{Uv(`kd#QVT!4I=1|k=G4xJ=_9lT2bvnOuKk;P?u9X}FR z$0*C9%xLHWC$^s{l@v(;Xn_GmMi|psos6iEE)&j}aQg4P%!h9)%IJL9|J7xsA|j;p zX460oKej*KePj8FjKtb?p1zHvbe+U%A;wdk*P6-ay4TwrH8h@F`~y2*^W&#p{KOf| zrS;>SSK5S}QdK3SIulyTEx1L7SW=`aQ*L;&(rm2|4XX1WF#GHGtDf}e#XtMoqaXOv zTJF*8pq@-7YR1KCIKigp{*<{4S>%?|cw-%tH6ulDb_ezPlhG!&jspGu!jAFrdw`63 zp&kynosf7GiIE8vL3SfoIwcS#k_BW{RS`J1Ik(xS4=G`^v5xU-=vdufSSA9>5*}AK z5f`mOK{+`%f!7c32b%uEDXB`?k3uXs+!?p%q&S@nfZH)qrJhWelL&&)@!?hZqYQ7K z*C!MQxjY`xLOHXohv$e=bm! zsH!Sv=IkB`5vrZBQaIxg9cL9y1xX0UD#Hy2?3kjm8*5G=mc=y?ORamVL)SyOAupQmbss+9BrmdZQ&wc`9$_Y9 zDY0}w7f@$u4qf=r}BJGi`7T=Yd848K23|@9uj-EA?DYGsdn>qRMnf^95 zp@6?wX^Ut$>`oh@6Dp2{TtoxZ7qN?gcrpRg9+wG@pz3aOU3|LO8hS%+!=Ug(MI#kt ziVA=rMq4vB(iW+NkZg!6At8e$y@ygF!T>TSBu+qPs)&;q4&hpH)d?w;1r!z`IUN~5 z23G{inTe9oR^=vOL@s&kVsWz*#W835!~{v)Oe#)g%`gIn3w=m-DhGw-NXX7 z8?`K%0Z4*%mgd|EgYGX-tc^(!m(v=>3G}%W6jGV0OgSu5v_QNuh?Ht)l(ZnG!3~mR zkx6s$j7gJDZib}_+^tNoE?pa_DOR6^aZ&8{qx&hpi*X?r^pvP&h9=RHafB5u_3cw2 zVgl^B3)KaCpCc|QmCN*E`88Iek^V=9W6`^&@5o@Uu(h_#q_*v~-LYE3h^pR}mHUOW zc3FFCk%`B@Ajy12cKceu5KAbX6h}`&Vc7rvOA9|=vfft@AAlri`%R#S5i&+foI`bK9R8exXu#&=f$ps;f zS29p~Ot0C{t{dUZ?@&+w7n4+m=RzVC6bkVbl?x>HMw^YVw-<|^m=yV|^&gg`N*KHK z(31;*NUb4i00ySIS8Z;N7JB^CFFxb9e&OuXF2LycMn0H(b)tR^v_O*p5@b%C8Rh(1 zVxmlmQp$;P51AQThr#{fBOf>WS7$Ap{q6(r`0)Otn=>=R{$w-(B|;W-^%S}=1tYcm;zDOCk5Ide(?(&mX(jJIZY?nJT#DmSBM->G{a z@vvt$lgXghUtK+M(~URYdDp@I+)Sc2=ThaFh*AbIDk7>X5Rshe)N)nf$A97#^E1Qu z|I>%p$KxsybCxx~Oj!gP043s7C7-iE)og8GJg$cGRgX-y3`9J_4Qkc}Ze_H{qk))5 z4|;=a1tGYRU0~o&Wihj2V~6(HiY5_F=<%{oiAs)HA% zi5-O`n6Ff_^&xaDL-C4oqkn0Ji;W6igv@9udf1f4vp6MSnDO_~X5W`f_E9^o{ZZD8& zJgekDk{TaFI~`}aqg=NT9u!d*f+DeR0NWHNytiU1%zki3c|1oeSt#wXb6vP1Vy9)E zlvtBQg{FzbVJDJZZsiT3G))lfWTL5;d{)+AfIV)K9+o}rq}(Gz-CJX%aGP1%k+TkU zUXyZ0s-lfT&T5&rCC#_>vjami#wopW$t%<@Qq|e|n1doIqs8v4#!pW|v9YWKBRL~c z&KZ=FxzhysQ*@P-ge+8(nTMR)HgvrZE}>)-C?#?3%NR0%oZD3BBb`bDMwB!M!E(1` zPO~N*bU-ATl~N%>sKh^zu`z>@Gjb`r$!_8cp{Oc7B=H0im8eZb(@ZNfGjmRyIcMgK zoFyC1I!WPe5~#FHM9EQ2Ud@I{0<%KYlA|HPDajibnN8w2LeoUdK+BmKOq^Lx0+sES z5>bggEt8_uVg@6zs!)c@4j|o5ninxqVfQ`^)q)|`mX#r7y6SeyA|FwiWNsFBBS}RX znXxh(#A+SL>v1)N&z4H}qF@5Tf-xY>%-`$BfkaYN&IX7N9D_mYFM+{Qo~Go|ItkL6 z@i2KtK-u#}JTo>kW>88+vkX0e;zJ516bphEYv>8xFjf|=1-~2$8c(tb&yBX(&-%UFMx#`1Bb9P+4D~QjM~-#GSMZWiZVmgI3`jP zh*-92ar3L-XyrpXFw*|W8(9vWGLDn-*z;J1x@4|_R+m_V5j$0h$g0$sC?&LjA&w}i z6?<^^KMHe!M^YZCFEsMnEho203}X| zQc9W7WB|yCs#HuvQ}-t0-toJ6c@O^hH%{NToc{1Vciyv^hBLipJPA3MVjB$vo%@n6 zr<8MU*4OX*zz4nVzx?(Kp7o3xX)r%?;LyR>{q7(9-Fx1)@2rd7_0G3l_JvD6^@)%F z?(e<+5f6Xhi(mS(TW+{!Vc`_yCZ*JJ)wI+!P3Bx7r39iXRaM)zRQEWyK<=gLVUK_G zseAT(_TN5V*Zs+4OFWtJ<};u6vNyf)zl|s3et$Nl>Z+^0{?>QA>t8K$SS@`?Edl!Iz`RKo{tgQ|f7iwfe%S=s+$z+^45h2xe zUDe1FO4Kr;>gCPN$3Nl8&v?dD-ud>oA3Ah6)m2t!L6D_0F$~+T1+8a;)wT%3fpOjNF!Ib*JPcFsn0{ zY(ncDmP;{PQhsBaI#j!ZdLa!?9d+LRi7jh}!wrIX0wE0)AteUD5oV)}vmWYXGl?Ax ztm;ByU;$er({_{MAMq2x?*HmDEtCJ>KL0N|Fy+w5wYUrI|DRs{?~XM8zoEqcopF;- zS4jTdTc*GJOSe5)3|5-DEkr9*@B4S&es3S2N@wTS|25J6-Lc)vBPY4f>K;s6JY`w( zLaaqr9^#3+D%;e7%}EVI;qF^J8Cw2Q@5pdoU7iqU%ZA{jDO`IZF3B_}szXEu;CYo| zSIUF3|6u7rSZ}M9Es9!+C~Ml(ry~X9$;HRLCm$`@fI>`F)~JSLJvaa`QHMPgw?}b{ zGDYGNWa<5WFYAC53Rx%7G`FA3G7590&VUG3IAGB+=p@oPb*a^=FkG8PU;<4K z-{~5>0;8HfrhzVs9mp{PB7i8R8sMfGXYoIgnajG7vQa02nRD5ol>L~7@^A$ZC`pa1 z^q#>PVA<0&tcoPr-h(J5p?Zd3O52Jz!8u@;RcIzkNwUpU0xMaHrK@Bzb1u8=x|2-_ zNaTr+O4AmQkX0myIk&mAkXvR(mLUi+P0Y#|i6}|4ChFoQnK2f*x1vSTj6$JZ(x_PU zv#cTunNJ3!8qHDB%30OG>s=%jZ$xmu zFhKy_Kq9{jBb0jyhSjV|LuV)Hydi*cE{eO;Dv&mZHXX2#tw{lF^&g=73sHy7@S~4aZQPkQesp+ z8rJpZ(Wbw||M8d3ZQK6uzUPifQ}ueOowVXDP(nE^nbbH0174hjW_|rW7hLd;zkcfz zANQC)d-Gp?=}TW(+PV0XKmCgT^^UjRbMT&TedEf}#uicn@>~AmEvKBi`w%yz~^2R@Y?~cW#4}akAskbz@IG5WA za{}ds#f64KWx?9Tbwh0UXP zz2t{q@T;$S<=_6*J0_b)dUJc^3@M86t{m6NCn@PMEnwk2sr0hA6mlhax@B7pEu2vK zHKW?m4NXI9y`bjfIY_KJ8%c_U0CmgNA_){4s;I7r?6Zn(G%K;V#VA3c0h4fMq=d=F zWO>giulkR#`Ofv%zWcAXr}{?C;aFu zgE{xNlfLj|frEz`fI8LC(1qe9*~wcdz0F0JUdJuCbR5%A)frdkN(j%a1U;^=ouUn& z^zms2OM2%wtJ^m<60_!0ecT>pm`0oghda-1>&LdMtbjLt6XJbw#M9)Q9$M!G9ZzBE z6_Q(y`SEDgf>?QXyzx%wriZ6~Wps8;Kv3coINc|mNjnKqLqF)==x&ib zb$S$quJd;Rr+Zu58U`8PuN6~4j|;$+_#)(dVI>&hcB|@Q)gf12Y1{Cx++V&bPeR`j zCDh)e@+`W{_D)zoSW&k#ZtJ_Kw|OD9=HDwwBr0V_qLh)%T}hHi<*rMo(3zQ&XDpPo zx*?SAc_+rpI<0AT*20z$*ay3!#!*QJt-{b7qkCkAM+GsEh@1m%2#ujrvXD#%q$_@K zAyO*qZc8i>MLv=}e$h%#(6+ac$OLz|W^)k~?hBR^=4@*FrS<77yz4xdM|8fLOKBig z6^%w4IdiW+7!3MEDV2!>=tdp6mB1UiA7=@iO2q**iI6OEFv$fo=eCW(8%Xm7Liv)X zU}nyl86~z4@m|T1Buc4DR8dNlsziyB=1wFC1<8>&B?|&AR4D=>8H$uDt@wxu5CDvF zoG<6xwz*_Iq|O3*4*)_cO_eGV7banrc^3>I6IJ35iOV3)5f`^gQxn=U0b!%ovi&Ku z91@dTP3cfdsVbSKC^*bE0=_ zjanr6K*F@^qWPPkDwh6WSuX~2EJ7xv1K#BF9DqcAGu!El?NrxQxbMxh$S0MRXn&NKIq;HT%ZErBx~5u(*u64vV%|6jc+5g~E!C>c*@4FvT!?-kvqZHxTko zS}c>~WHqBCRzeYh-53|Ga4fJ98Wsn5r09`Ec~Gw<+^gj{Uaw^e>aXZ@xgczO2lO7} zg0w96Sbl&QpsMOsbq1*d>C2MEcJ_(qw?%%b{pDzYyPs_rwtsZ!PE57gQ~ng0GtqS^ zH0$K=cgRDaVYgdOSbvI7-r=AF_OK%cCuFWGZYR}b^7Ai0_f@Z0=F!pdDh9)T!X`jv z=RK|xc)eX;nebw7{_*{V3sKkY+Dg-I4u(};yKdw7mA!hsp4-PT6&3 zKi~MrKo6LFDucqywCX$dE~=x{@(Zh;r;(K81#Pjl|S{k z$2{h)JHP+@=e_Wb{fBP6@rJst8f0c1SvfiykKgx!fBeKpKMLUUpZWZUKm1QGc<~GV z;e8ty-R}X{T>XtbJ9j_!aZmi>WnaGa=BqEb@WIc0-m@3x=D+dHt3UPW&-P~rqdfVW zcm7R_+z^_r&3;us?O7M!=iCdLX6qB5{PbOS-Q8cFMhvU%2cmqftY>TEtGXnCch9d@@BHlg5q=S?i6p>KK=*KKlkk1BGog^WHMP@0V-gE{#<|1 zA8)N=G6oXWb+fgV`l$M~k{7DC0kLUHTh*bHbZp0)Cz*VZ*nT?N_7#8Vj3eF?85_FN z1sA_Lf{K3&n9Olf6v1YzpQYYLkd&C+@OR%!KjO>++x+mhPj*YjwyKNZzB}n|yEOg0 zSWrpc#b3#R`XnFA^o76OVi`%)b?}!3ha&*82eN@>7P6GlhrH2L3*HGa-0~}18!|-C ze*`sV)fzRy;y0;uvT8{jug>##GAbTkZs(;+vKu}Tj3BnkYcap9%U-Dv#&BNCi%g>J zZ46!aPX0SXras^-vMwqZ=(Uq8LnN_w&W7(Jiwp{*I!P;5@Bl#k($ZH#cQis4^T+&t z^G38ym8U{jS-(E5#M?h7@f|!7qcfo94a%*g*8w(vMtzHzztZ&@$_p)EQ614Y7WpFG z)KwBB>i4tkKo3o#$mYIYtOk*TAg8)HcIN~rtJ0P&{!|pzkZ4!gv?b(>Iz&@#GYRT~ z7az+>F0L(~CDA^NBfuJZSl~hO}Uk1QAbDLXmIqO!W zQ&P=D1T7vh&tDB)aq4tJNhYer({o)$$;p)LOlGj0qsF95DF9|Lw^{N*g$JeP0|2P5 zs7{5_g~%m6lAD%G)}~}kT86faDs!(wol;742oa0NQOEzx#LUZhfnWc<+0Zo-^LIUT8TS~o|$??(b^5{2z_Ox5} zZ++y_m4(IGF;8q}$-EATs&Xk2Bv2l2o_^s)FL}ueFTe5|@BHg`4hHk{J5L#HZLY7} z^RvJ3i^G1kxU|rp>DRp;fM5RQU;2?BeaX`=e)cUleeY*}{x!e)npd57&c1$C-*n4u zzxmt0^RbV9=&?_E^1J`~t>3xsx<^0!5vkt;KzV%WC71o#pS_XWcK5E`@BPPre8)T9 z`PyImwZYCE&7=j&M!IR|u3Z31IA7J((IbbS`m|^N@f-j96_;Om|MM@n-~I0M$j3Z! z`Js>btGB)Fv5$RNITGy;{^$*Fe&e6zRR8by{r%$7+|!(v>fG!TRdfU@$0UpQaBSh1@_XM6E_(6C+hcum*$*6|NXTlzB=L3vv{ERoKYMwZ7&(5#W$#iF(a0KY22V|L5adH7tt4t?wyTKhm*H!Y&TMKEbw&JK6MbWDcAA3TWETe-I#g|M`f$QHwZXjt?6Z^iB>gj$829gp@m3hdRuZtPFLi=ug(aSLAn!x(2@hW{nvESt&M^{iz%{66jHTv#z(TL2wTujtmTr1YE*al+Lo`j) zbObDrSMq_@CGAdkr8J`xDyt%=60pb7n4*eL69Cyu4W#T({T}flI-{e6ASMtWrBt10 zMTCpDx-T)u7d#9BBDtUy%w^nO<6DeQIa9CPpGi;Rvvje|P>LG^%Y#ckNRw$4`Xgtp zk-kPJ=nXoemMZ!%3oMJ$YY=7IosfE<2wCZ9Q_OO4q(IDis6;EU@pJ^SN{*g7TEp4PKZEkMv-hIXoJnrHP zFT8(M*UVH>)(taJRk8!jx`U}k@L(onFsDSlD)myT6M7YTRq9oBN~kr6&&*|djF~e^ z4F#o?5+QL;nG=eifU+bkGg=S>nM#ETik(TRlzCKDN)@3>R8_LQM){vOAhyf}g?3D3 z%L`&D)F_*a5G4Nrajp`{*32XxEKA5*+9~)X?>(;xiAzmCRDzt_uzvH_d{i~w4cT}=Ho1)QSTVxfEo3v&#n&_bmUlsXv$w^J4@ z8CrNRrsF8?9-F$Yv))r;&de=xn;G0@MkV%-!6~tBZlo+#zk)$+=|kz4tmOxnvyn7S zArfJ80=}J)q+bz?BvV_S(V`GC(Nf_uDYHKas7pqu*b0*{J*P!*xugXRCv{h2rb_3h z1YrP9Z;Zj$?P?4w{g z)IE+`XojfNV#oPnn?u0VFzyY;yPlk8tHW44KjpSR^iAH$L{uS(H(tm?rEskxJ@8ij zQthWHjoP#D;{S)GKlDk8U-h`} z`#<>kuUvKgcW=Do)`Mt!r=EM-^Plp#7r*R9Pk!L@`}_a-#NkgY%p9e98JW>CH!Y}Q z230eol@OE3M(#)+fz zi+i?K?;&7zb~s*NKXPE@?6c2e=G3bIT9})epPSiS-F(!e9{tw0{`u!W`H-3Hp-FJQZ-2NZJhK^%fBI*B>Noz=ul(_!{OSAO_x|%Qyzu?+fA1UK{3k#5;+Or_>t6q#U;m%} z@-P4LUGMta=e^*Czwiq`d*e;Fyz|{}9S+jdpY@dg^7=ox^6OV@j3(7^uuUX`46t*b zbpi?~Zij&=+~9UGB)C&{ryw^ua!*MbCn9KhC^3QMiiw<_Gai+~!uhcH834+GatHv@ zk?N4gi|SyMQ1@S=7l_4g+q$Z9o3Fd>y8A!i0lmT8utyJjl~uUlc1`!Cl&;NFSkONezsMh#KD1a$|R6)wqdWaSdG;H z#4hMWN2j$ojFVY{sUb(?k2cy=DzZs)4zS3PGsw5Oac|gY!I9YaVy>*~o_FYUr}MF% z7H>+;O|V{Sqy$64Inb6(u}{uE4?uuAbUq!ejRr6YX5a4!9q!ssl_z!|GThK1PgiB2 z9%pE(+j*Pp=Bal(Pn|3T6+Yq)SAsh%$2be(|a>eXUulC+@LlKMAl!-?gf=^YL?1eB6pjtR! z)sTUdQue; zHnOdQU<;UKI$w&kSdOVLX(kdGl-!hPxUNSd5I{-xHkBKgx#cpamfNx{2{L=mjFhVRt+2#CW=)wa<1wY0R;nGzQ|l1 zIsz-mRIF!~N4q;XrIWP#UxjHkxq+>99M26>3i=lsNHaXyl4mh9-p%$C!IdY^_HpsPU)gx3XQ)06vR^b&>!EVd2 z#Q%~^Psxngb|92U^J>b|q9vB&XWg$<`NM1nOO=z@6PI%|LiR$lb4i&ix{xS|ni++( zt5H0ag;16{W|y9m9jB~@MAMJK8L~=14@W5cDqbDCgh?+M`b+Q>ooR&;<|C-liyukX zv9!TqBn}Q1g@%5an%iW9cbO^nzxzH2(3!-OD-eNGm70cYw7>G=-H*IqZ*<~BFZGaH zLW@M)G8b7N=l}r#07*naR1z@W*jQVfdBAUO?7jH?@BirA-}dfrUG`;QGl7P~iU{{y z_4RjL^^y0z_uaqwYrpb}pZob!c0Tynciy->y8<3!3{(~MDr%Zk^(gn+jg1F9sP~%Z z@A{2*92oF0+i6I$60%IMFmVQ2Fr!L9F5bmtG66DGR2Ic>&LAMw0JUxLuB!25vc9=K z9*=+U36HC596og5%yUj_CX?&GeeI9_)XQJ|q93{Q_PcY=Z~D_e|BJtRYpNHY^rRnr z*7KgaI?iu;(_g;k)xUCZ|2=Pd!y8h)u(&kWG-Co0w-r(Xp8d?HKmEy1n_pVE;rbii z{H8xYaNv$M=Sh=)=k!m;Z!goLAS-J>6~{uWO!Y2d60W1o&UH+-rBO4J1=uws5x^K6E%Jg<)!D5apL zK4S^9svXbGt*5?*9rZX-&N<(Bd^?hfa z^PG#H{l+)^@wHcfW!Jt7f9JP<>+wJMv;zl^oLE`^*uQ+R**fyFpZwJ)Kk12Ae&sWu zB{q~cC)9LohnCW(Ds{dy7J7Z#dl&#-RWMA3j-PP_3luB&Eo#cxU&C4=?QolQFY)ntiQ zL|f^;qz;*489c*AM&1c^wV<8UAIL&0b=bOwQQA>k?5;$4qEJ?8#lkTqoQ+;xLsH2u z?{s_S1TmM%`Rwv#P|}Unopr(a(~w<($9w@(0G;d-F=B-l8KlaQxm6y3@AB!= zC(~p~5OdhXmoyqX)58v$bc$7_ zE4HVa#vK8U5bh2$z{sTA4+I-TCTGkgl(4yN7aLVugClvpIZCC7+b7N}9YKmz0zF~i zs<8@)N_Mp`U=2Egp)s{*sNR}v5{1F4eyf88WtsFmB3KCqX*e8KsVXV@E}Wm_qpwk( z>bs1*itrtHg3hFp^@pMi!;_PQpv9&u){HiiIzBe%%$XneglC<3`nfB|4(GP*_XkAC zZI*JX1W;|Io*AVsg20@)1!n?kqAC#)dR6MxsY+EDgKYLZbvfQ!VjlE1J?S)&bg4UWPXQ8?>YLr?FFN?qy-Bom1A zr1UZ#2HMQE9J+%n>t0xMi6G`0JOI~abx#5q>zkXY;vas-v#!4O+VAbZYnXaa%Nczb z#lGoE^{_tBlQi0+V9OBgfZ|}VQHY}xWHQVM+78Y6h&TtEZY$I7MG=FBl4l|8X(*@6 z-0K{Da9rJPGJtF~Xi%TZ?Vs)YNx@H$=55H@rvN?HNz6Jf|Rke#i~76)tgQ7Y{@2pWS624LAi&cDKU_q)xt^V4opFVBnvPp z|020yZi!6uurKuqL{RhzG!!Y4=9=z>`rLN zSmPH0wCYc0sMLRjnwaUvw!NYI>9pz(h9)SylL&-drQYW8ji)|p;Wu`b+I|pEmdYONLk9JQ~bZleW}; zvFzYo3<0vNpGp9#6DN)y+<)-=^UqDa+40uK%-metPBzy^v-9&icg^I?sj3(aK)wE; zuB+k9%;JvaNz*>?5f8in!ycB<+uT^aTK zSA+3*^tG>iEhReZf(w~(*_SV$nVFwm+TAqcZ(Ma*-CL^brRC+F08ZO?>PXS6JYmwHSK;OxZhpp-pSU@m zEH3Zdf5#oyUj5bioo61u=Z;Iia^)i*{*VuRZvJbcfodzY+dMxUwI zYp>J_shg?5Dnl@Tc`Ce-KQlT$r}GMyH&KhN)N#5Qf-;52)!h+>26TmBU98R5Pl7Jd zAn3Yr$3W6Zywg<^gAf1)uJFA=STXoAVeMhM)@YbZu4_9ZliMAH^tyVOn_O zG94r^3`T_$7F>0z4K$v!R%Fy&>!1UY-5SIl3?(*G#PBacbNmO*HI(kDUloE|On+46 zY(=a@u;Oxef=u%PeAZEA$30r>GjD?hZF_n=kzLbXrkhI*)67M~G;5tDC;5zoOWc>HtdpVU{=1+PnKWwkV=kUdhv|hZ9P(aM zqal^~^3sCXSx71Yb0=lvc@)JWjpmKZtezK}rAbow;cG@bS8EeCv5^?^NHRz{qV-v< zoiv)Wl}^Z5g8Nb?$zsbK?1`>xky_~>vEl?5Fd(B{oPu(pF_!ue*+O4viYYk2mX9D! zhlxH0*aR}As(kI$b*CHl^`v;9ZD{@>C=hw3XM5-Et7&_Agu9Oz4@?nV9!)~TkjqU~ zRjseD?mOe$bI!hKV||s;*1aBcPN2F}W}xM^O_Zt% zjG_+6knMevI2l^HP#7qkPKk1Et?twcG!nomQKD2<-cUx;vY>J|I5_=^b|r05G;b=p zB@I|oMoJ*DUX+w-wMJ0ocm~#;6J+C};_?!}l-({-W-V8B&Z&7c11_~h~d);C*5~f(k_y1DH&3v1i7gAR}vq|l&xhZ9t;Po>zjLb@4o1Qi*CL9uH5FT zDr;RNIEw~VZEyt3@UdDl*7K4{|JxPO00nABMSBJnyP<>(^Wb29IfNSZ0Pbj%jj z=-y}PTuY)CkF&UP9oEG@C?A+gwnM6zghe5$FYFM|=0HuGy)jL;(p+Bw!J_Fgkq_;> zrmKnEe3*%2^&o9tBuu#|+M4^JZm#&+gtGsvK^G|!SfO7TkKAL$)rDy4%mjZzxFcZ5 zCdg8{RnjYJu*Hoin%a?1|3N!$=UXdyK?fAEUA}7pO~>yKabTDi6E+Kt3~BXEB2`)p zIqidrL*wQI=D}DM8#F6wu?bs$%D+>l>LhYFeJ!{PIsyr>Qc9CaJLskV@Qj`3pHXj| zXcB7V2B`%Sw}f6EudQJD5jgv4fAObpdCMRDx0!`qb4xp#%@b?KSGUGnoEfR=*EBb% zXZM`i8@K=VkAL-_hNu7apS^f~{@n4#oxQn*oF|Dg0hBp&1+JT|=Dai0%O5}d`VH$d zNC`O$=w?ZOWY%q}0B%z~*uVeI5B~E%|N5`~@+*GkmH+GQe>vJ*2ih~vIQO@I@AubM zkNxo<{K>FibIt&&iolecc4M^JtLy*y=Wl(_d)~FY>-3#FcAdU&*JWS5{^c)y-nf}; zaUPAv5u=^kG$|X&wt)K-|}ap&11WEpKPg|<`+EgMYr5?+uHipp543efB%cFx&D^d|Cj&t#HT)a@TYS}4%|ld?317RL&uJ< zUj2yuQA!>O$5FGh)X`p(>4ug4!s)Bfc$P2f`u>4V>L3!!`WU+ zbj`QF`HZJO`Nw|bhp+hh<0l%x8RfxQ@8B!=DyF0p zn`p4WN(r)I0U`VYnYN||18Ny#g* z1A8?zh0fBFx)KoQ$YvNwZF?br?hVADcf@L3l|`cVo+z^j!N+GQMMfBjG22}-c^_Ln zr=uF6HAo>uw%&;xx~ki&g&Ia2Gx{2`8R^ug?W&}TaVVfOLH0R$GN}+3$MxIt3$hQT zl9LJ~!?em@qmZS}tI{)=7Lx^Yk5zlhmqe76h((pui87Y6HAaSiq@I@NgM_~ zGD!tX5v4n<-H!sORqMFDqwZ}k4>0jFkaCvkovNbRF~u37jcO+q4h5Y@N@&|=X>k`( z*~}B50$Nn1ln7PEB%sRjJg$bILiV7D#AYCMx@g5g=2|$l#i) zDiOdLsHiLu5dJ14szgeYRD=LT6{WIHsvM@1h!S&Rq)Ob3oQy@JQpyFNlExwmltheD zt^`7fA}UR_pxmE8K$W<1;b&AO3PaY_ENuyyAkkTQ7NAnyQbtkEnwC;~H;n?Bo=uWm zgZ)Sl)|;}30F^Wi%1P3aL=-JaB&ONSMXAM3%oTH`cB+h~ZChq;GB3?95_8UNvUG~* zYxtNLKtY`ypVe+yxv|2hsaO}~VEXGGu32<_xx*>B`7~?peTuQ+)E*zIL?XVV$Yitd zT)@HDXZj_R8txO@`@7HvB!s4s9(Q_cvF3;3#gL~5q&X`KKff*y)umQ2c(#1E5w zejJMBe}?&Hk_GVv3v6F>kjYQ^gGEbx;3|HH4G(#nDzFZH`Xq<@=qoRM&&e z&36Cst-~vAe=_bb>>A89mwfc^{{ATs{@sh8aO|pg_GXxKF&QlbIa7%AYrvDI;}PkB<#3}>aE81#|{sb_{8YbW0Ej=%n)=RD(Y-u9N=OH1Fm=IY^a{>Ojf z$6xruA9~{-|H;hE%)Wi6+;ivr*X;=-3M`^w=XM}GciU%7VTc-^0Q;6ooe z?B}n1^{T}k^MkrKGgkv+LRwy4T$rC*+PScL^uRrbk6d)YeSY@mfAKpv-Eh?vSN3|T z)SL`w2E*ZSVQIb|E-mfeI~tF3+ZMN@->;W;E`ghRX6{q}`mwKn^O`sQ;eW>@AKZV} zOaH@*Pd|O{@BHrXgPXx{$hjpnAN;_Fe&9|2?Wcd@Suh<$- zQcBzr-@;Hb1O%zyF2AU#1w0pbFvyPwHheNYP)&E$G_O*QBDOAxB@j(fv@Nh1v!VJn z(_Om=SZvD*f#${`c0uJFoq*In>>A3HQh%6E9KGYl@7(gj7d-0?Z+hc!P*weYuc{8* zdCT|rA9%@2UwZRRH$3EFkJwr}_T|eied@EHzcpTGv_Rdfs+_s3+B1X_H?DlsUUb-! z9LlV3WPcXw#hu7C5#YSyayd8>A_sY-3K+I4Rv$bG0?HNVP| z*cNSie*h=6B_ebva&yQ#i(&GPsPAA@qQEe{D*lK56j=>svh$4KIIhIh;GC2uK`+WX z*j)*$V~0K@={ZfcL`JF4qTRBn4$)eYhg&|Nju{dIQ*;wT%WW<>p9k zYubozq_zSURiEg!A@;^|F)ognCWi4GmRTStnmK>gwctyzsH@N{tApc`r?WexCa(NT zHeSuVQD^ATDVvKLTpE20Fhi7A)-M8!;*P{|RQD9Mo$ zs8q~VD%)-9S!i6E31%XL6OwH#DqRv(FgAlwrAl{7uzUq2LLx#!A|ygZoTy|axa?Rj z0U`<0h!PPKb0Q=#!rBmVO_cpahye)^>nX8T1SD%-SRo;4J+pAL=#NMb6`d#xycIII zN`Tf~c9GHq(X!M6uUUMdLtrhaBW8qZXXY3@y@W%N!tcl_?9- zTO}7y%|c86%mAxAsEP;?OKi_JOTi+a(Z-4hlbL2VfkYxXCbAG%1Xc^ctS4?jPU6FK z{!Aj4RAOa!$vVXl)`;ct zjW@IJCQZalXz`?n%v^YSnyfWc_SfUgnHia>YBx7&_S8&spZ%9l-EsTf%ctzx+&s}6 zkDqeCGylW$9`)$^pF3C29b4J_=1u!QdD*u9*Sj3yYUscKNUW z)^ES|H-7CO|LGsc&17?9;~(DlzuRWz(6N=9Z@sOmY9QyF?>cg#UEZC>Bpc{eGK1UMxy84={hb#* z@V-Cy%fIyMUwt)z+wZ*N_kQP(hO@JO`ldIXea`7W^@<<+<)42gfUkV@^2@$>S=F2Q z;0Hha1CM>wD_{AF=RET%PkGk!Z}{#V!`WGIJB81k*~pkzRj=K|Qs=UuPBxQBEyH69 zms(~m99D7F;420%GO3{RftKbq;blkD@>J0Rb+~-`*Yu&IXQ~}jw#l{CY__F3ph+DSOD?(O(7}UL_b&a?r3Vh(zH;=~+`{4|mwf)v{<}9e*Wdk~cRu$yKlG4?KjeDwkX<3`k21zsAIKHnu6$Fx zr7l!@&H>tcGGQQ6#7=R>-d>3S$RU{dC9E^vOR@&-A#=z{hpV_L$O$#XZ8kYF*Ge!uIqSJt-pY20Fq2bwo^#uB z+cv36tQof`wL!W$h@y*EtVeJotM8X!83GGtRkeN71h%)x^==Z`!QX>?jo-^A{Xxet z^(nm8&PBksfZfNaIA|JYL(ra*CLs&4Gr&m1+4565G!e(tFKq?tVp`wWd@lLwd zNr|aM=du#97$SpFgUjHeg+anx1c#JD2_5`26AiD_Atlcfn(48>INCO09D<0rj_OC| zV^quaf3B4Qx0x!!c+ysb`hoYKo1f1c2iqzUU?nO>-Wcvae{E%S>rFSNlo@Hf zzW(9|o%`qi`Q@iR{h=74ouo7S)k7=((HB1G^?&~1w|(w9q#h?;UtJ%K`!lI(MqB95 zpq(%^#7s=YZ9+2{wR`9A;4|r;zRbBT<$fki>S>D35}1(E%<}GUUipnDKkd0se(Dn+ z{E!Fb$>_^p{>nG6_}0wQ^4<5Wyz&=bvtwbt8Z7+p_kZXMmtA(ljW<_=nZJMc-+t^P zpLqTc|4`klue##OtFO8e)y~g)vU2Dk_2!xu%#?aFmtOkiSN_7QZn*9{)yzW60M(h1`onL2`@zxr=5TrM*S>b; zFZ|MLe(;G;oHV0*j;&VxK_+&ar+Q3LBup9EOMS#Awn{!bOWZsH6_O$_7H5k;CEleX zW$=YetlwX^>d&6 zD0;m#SiI}5@7?wN>v{{zTjR+WKl>@vy}`n+!-o$1&D-CK)I%Qi=a;#vufO&iXxe&q zju|&xcMZ6$XXdAOHdXou-3*4ZBoA7!*el!$Z7la#9AaBeUh zrn;^Z<+e=;Ng*hi^N^5Im1Ze3H%+s?vAMo6%A6^jq!39KsuH4=l_5nqv{0uASvJln z%rlGmQO95D<^=G@eLfTBtgz$+G@lhP0;&R@4o2=`bx;IQc+TEzw@)QdpdOfUhq_H_ zou;>DTM6h8;{*P3qHZ07saY|LIvpZ{p(T|7NJ^bUtR8&;&4_gJ1q8CR6YIe-nR3j- z+e#312(7yz_a1o4{zgk&2C&ey8l=L@#_3UbaBT~g1aTtge2@m0J_5S*a|*krvC$8j zb|D=ui$P{RJ%kL+*gZEu<7A)1cVY*=aVqnDf?iBfWJoojD6$?$!X1&7(UFqK{3DQ( zMww!_vGvmUBb{gOn>X&z0k$k6P2Wi_(drM94#To2niaA%1Y(+ij9R)jpM!v@)gtSF zr>UV7k9G**#&AVYN75ojpYnx4+9kV3bzN(@%`xI&$#ilEnmdE%`ypcD1S+Ow8)%bb zHblB?yl}%vB^yjeVV8pKW+0gKpgs2U$&|soN;Mpk334*(SR{avr$U6OnC{J+-4F91 zL_{f-Ls1ftEasP-1b_spL5a}jwgop_nbK5LQV-}6r9@@@1rs&QltDxm;ucC*33WxK zOv4a03<68hik^^? zG;k#Xh)qg0Q=}51^2R^~P3lUJ$qYsY6Q#_V(K0~PW+u|@f+37ZsTd4S%C($PW`Rv^ zlIGP()zi-ZOj4J|1)LOS*`qRWG3=>Q0*EmHg_REk2D2Tcqi&mm4cufHo|DUJ6f!pk z6a+ci<*84sg@f8ZDhzb!F8Y^+@Rp@h>DM4l4Vt5p_bm35p@S4?>2}WXEIt9N!eh3S zq!URdr%77%th^Ww$?$ixEV>_P*LIja@D6yp*27eH@=2_VJ7D%j{CU8ebn#czx8%J@ zPbYRQeU@1r&Y1{xMRncl)pft$>!oBcLyoS9*4XT$7jQUNHHV}uB%jSgqOv88UNBbx z?wBZkrc%>oupQ*d#HWxaki-nNwO)p+LSUJG@kheV=4SZ!Fz?CCn(>r(N;)g00gVWG zVRnWI3B;xR5>%%Oly{%9S34`53TX_bLg{?wwr$7b$z(if+P2NQGDx&iO`KCX8nG~9 zZQlh(vlVO-V}{1WOHDLeYLcf-S;rh2%rkih^rtB!X}!}_osR^}sY+YxlXK4;+~=$r zZYL>EQcBE?jFDSHg}hbwd&jnDb$u)6w7#+Npgqg4{gEe~dhWvNS8L88nk-=b7_u-}&}!XzJmvYS6E8|JrX{1#AL! zJ-;(^3#8Pm?m4*so;z=${$g)-P5_KK)%D>6`#*E*jj2CV&CDWaQ)mH$h7EY=Az1+5@KV7fPb6hrEW_O4fsNvFo zf~OD9U_|YVp^?rxO4{GAgFuk8;5AvSVI)~27HFCJI3O4%cZFJ|)xk(TwPHlYV3Dd_ z&_*2+kim6br~Y!ATh5dIa6oCM&6yGp78b#jx$Vu)r`d(vHdVEhbLQOihqDBibWEL02X%J;wCv$XK zBKTTHeDRuDf!D%y$7)PP{=wwhi&Wb6dg(v9b4nU{YCg!Vw>b=^8s3!7%9!|@j#$^g z9IjYDISyans~)FovKv0tAM>vY$XXY?xW))*bBmxUi{oa-$E&|E+k}>R46vCXO{=Lt zW8RyvuapqDugSuD%Cq2;E3HZhEJ=x!_7gF%5ttY*cwIgi}8!NP&+*h2Cy=kH;woy)ige;mz($ zBQQ$wNNEnh3i)DKS1>{SzYa#ZCDVy#J8nazYrFZ|Mr>mRIaFAkp){ngQZ`3~@$90C z2P-Mb08*8{(+Re8YKes@rE+3z*)pR_WkV^HMIu$AlyaS@W~!L`DNi_q(KdusQH6@A zPaw_-Q~?!o+3bL+?9<1k0z^bEQIDuDfj3>sxU~B zEU6T0faLgDW=aaJC6y!V8(2^htf%SC#Ha{6YG*sP#jL_kvm zTqQy-XNEFlTUbUpRJiQbQijfIZcBSUW$OT0q}Foiq?2cs7hywk*jgbqD->19;G`p~ zWa~)~oGY!BFiQ_pPX%OEz7T>24OCNP0F6L$zkmAe#gTIum%qSyj?UBncFJ|X}$!l=v~I8lQQQBx==7~T){augZ;eZ}+= zh`7x}==Z9@On=y`2ZLT!CE~KEB}bzy#5eMHoDO3En-nVu2N5&JKsuMSjsol_z6P2I z6iW-#y+i#jl`xjg6r-A)N2Bq^=Ei7iG-(#S>7_Z8H+vi(EhzkXXxrHFMcBWs!q_RXHQCsEUs07kU4Jd=srhPhAG z&W0IidKI4YptByhd-j%(f9ado9~#&Fg?`;bI`h<>7ZRO$>fBTAf9mINI$GChdFRq# zFl;BIRL^jp5KkyIMOw-U=DEqJ^WtI!LT*~B{Hy^N79tcb5EU1pZQFVBmoSU|t5YcdH zM@m)Owz(M*rP<{jsotI2b}}AmE{2D*^HpzGn{#ekXvo01?aj;$7nX9KG?NJk$ef$; z?Ba4=ms;d>;^>i=zU(D`_&dLG_rZg2dE0x&ZAxuRDb4RaJtgL5(o81JWQzdgmJ-eG z*jJ^*j7i(Jc}$?mcynfcu3Fv!U^Lp|w(SUya#c@5Q-n6p%&x#3E>i6GIWSXNR!LOH z$XBD7+h>v|W>LdF^8!r{BWS1th|n7oQZsVq;#sF*K&fK@}l%4Yn^K%u5Qbkn~n_Ho2d24g)(4nK>`~F?G z+;PW|BP)Ymy=%|T^|kfYmE-NCNmV5v?6F?QxG9J>@?Q^X+w>85CWLf zKmDuufZLwxa*MjW3Qw{30d$fl0riM9It^08h}D496$x=v-4u{|EMm=y;Cf^J)rLeq zMpDPur8Fp%13z4uy=&%&hQzydMrXZ9JRNDZ!!HiqH;boEgN0tCt#Gti9)VF525Y)w zkIl1I)Cr?C;)b&eBdmxJc&a48lw0QTH>mS=(%CPge8*`Fw~3N>=x;pX*lqJ-1L%~# zc&@?&Zokb}a7{gDt|^C$@#VoUH}b0@Iz-6qASnsehX*tvXp+b3^~0+F6j31pp@Z#k z5|V|q+=2GqMpuHC>}p~wT-0~76q9zz1eLpJ&4C#DlK6{XHd-kW)j$e9vU&)@MwZfd zjjt?11d-+#3dEO^-5^mW8XaJAqX4y;Q3wNjT}XU5U8ZZbj>V@$+uqk1bifcIBBE5K zRMmAwRAsJGnSM;EN}N)vE2_X1=bDgmLYv#B$(*^VYN~rgb&2xIrJPb#fk2r-RaI3~ z(iuQzRNx*_C7?^-vXP%}u8|TYst8Dgx=I!2DuIZy=3$cwQ392PGlW_)8dT1RNft%~ zKcuv;Lct6<7zUbKfo4WfHU}-GdC*Isa-JxY-p`zDULXipR>)#VnSOc3f+_}D;dLUd z@gOZaqf+0ej#vef^Os246r7a~i;f~&k%7f_CpoNy%K5+GR1r8+RZ>4prJAOp zR1wulU@riq7JjguL1gAEID@PmQ}MNUG0rThiurGjX!=GK;HjR3)f@r_Uc)BMs*)<1 zwkv=>sk+4mj}b!kNqe>C4jfVhu@x#5HSGpBuwp_wC@#GXf2*Am#dI7NO*VTG^WpMn zjSvTyn|$^|A0nxnU?vi2(y~rwP2Ql$pCl=LCZYg!+twA$%@5~h26eB>lV&p7+Q?0A zTUjLs^W1_Qz)Y!_7&YpOwhFaHl;odau)DTec0UG?!0a=$VZa9PDk<51vHz&6Xr&y5 zrP21f>F_c!Nw`r-iko+&-mA*H$|IN%OJ@BM@(!s9)2pR~-tzsy1@m#KzaSanx~}V9 zJv%d)pBrwC$0ts#ZEbEft!%Di^VpWZh^i_g9NUM0h{%N8Ag-^~t(u&$QlyBJ<{`}t z#{}r~d%7R){uUHOq|-RU%o%8x=P=iA(G=UMB7{^<;7WwiI`*7>(FGS>^o7eVOKo%Z zj>X>E`nA^``0(WiCd2-4SZ}OOp7D_OoX4#82G!C`szw_NJNG{7kx%H=qxHNsNMp*0 z&>}YyCNU8cw=Hs>ovBkFdD2#L-h{E3)RIUt+~BAkHw{|#pDj(ylhLR=+cs^RCj~;7 z(M%@Icm&y~EK^FHb2Ay0HxY9?9<^$mGPk2qlg5hC%HW)H9&Le=haF%BwQbw9P4etA zG0-&QJZTAxsz+6Q$!91hW{7XzFP zgsn8hmUL&xy5# zxrLeG;MkEP8ylMykyQG|aZS;e;Uv*5=Lw)ZX{$Y0KAR?oXmS84F;$5eqs?Y;7VSDG zZQMc|N87~*a(_T4ZpL_xtG)x1zAMa_bZj7dwp`018Mc5%DJV9G-Ttag49wubYooF0 zg&O)Yxv!EKHAU=u(J`}K691D%HbSoZqww+qH>dvNmB;cB3A|cm<_{XN; z(kLytab#z>eavWO=E6JDSlJ_#dv)wOaBLXmf+ox~FfgqVx6VhY#xI&06CcG-2dv-) z0Xm0SSeqd3SxQyES5vBqa#f`=v{X?=37o4Us+==3a!#46w$0q8gep~NbIv)pZO%DY z)K-+4Ck#;C)^$}UplokQM4-AN*%bv$WjR&x-@%NkY}ZGkg1w4*DQD&u;`p;YVuAO<{ntbhHR<(g0bl0i_~!Ad6qsF(7ebB{^Z_FC~(8g*9S~OBqPz zIN6d^DhJ921E-5$NXr~jN>w=&3o_eo;AZbi9_`7zPzB~Brv(rl& zM!D-)O zbE9e6oZBp$V#95&8g=EFelNnW!#4A2{}pR4Y#|q)PCwM9nI&|5*Q*^Fktf;z?2IiC z#JXy@Va7*zEPxwc*CA48Hq5&bvhz`}rpDDJc*rKizJ`&h1J*JaP1EouQboO9Z+2#8 z&#oQo>s!ZHR>nrR2A+JtAfLWam0GhKP?FY?R5 zmO7Rf_q^<{z=IxowSuaoqbsQW==H0O(b~e?(kp-Nmv8#sZI@qm$-%=%n(D&)J?Ok2 zT3EjG*v4p*_Absp?g9H|^XBpE4&8d^(RwidvX{N=1bgxENHqi~@>?9Tc$AqF3^dyw6#cdaYpw0GR;A)bl z#4Rc2N&N^XsO9_Y-Bh;sW;vD()y&*izWBwjeDTx3%wTy3C^2Uu(!Gciq=LGzxE8n6 z+Ka0*!K{^pYFr(LEtp~Rx4OE@&h0~%U?W+5VuH&SRf(16( zoMcpFg_nR(*HM`za2F9+g=pMq0Bfpie#={4>hbyL3_Q&ie! zRJ(+NnacP~7_8pxL?D1DrKX+CFD#vY#u=2cI7knE&;<{F&_%;uZ!}up+FI@P`&Diy zqm}XMu|szsT-_XWXJo-WRzv#S6zWntoufBm3cAc^Z z_Z;3>U8AU5K{-gHL}4+rfL_6j)aKC$_xthmq}QdpKh<9PdfK=%&CKLxo!cdP_;2-| z@^b#{>qlSu>)98*e(rt`Kk@FDjc&iRw|Hu98bV76Wz+7`UShR!uBQmb6&z?~TF;%I z6iPW<3`kk5eo<;MIuudcMB8nd_JSj{a9~{QmD}+UB5ji&3pObr4;kjfNtZB6Ljj7e zj|Nc2w2;kIL*X%YR39BhxBuPIMVn)WRZUjxtmKfQ?)su6j+QqJZpwBWxRHHf?F?!C zbsPC<(@AjK=U$R6`|bXx|^ZXCQ>_V#^D+tJqiB9nBs zm_Zoq7>{7D!X&12SR{Z|5X{g~e6Gl^7P5xHs6|mC($sH82dEXH4kKy$ipLA!DD4nO zoD^7C)zOHep)H_l>Un80pRO1~$tSp~sVgr5g1VX@(0EaPsw$RA#8%iC~MEMPF*NcMdFvMCO>AY z%54GCO4~$4RYJetqpGIFy(H0ZD*H#|L}0Xub8g!SXzEOKMa;fe^Ns7S#b_L{zFIP6__S7MC4jUTuuUpZgE-IYDDN`td z!g)MUi_AJQ`$eJHQxar3a^+sgxdRF@+kC;;XPB!jYAS)1!jgo2K8LJWWfCO48jZ%I z@nmK&n4g{P^?OH-92id1rW8TE zpx2ytnkfr>^K??F94-03qLWqPg5-%3s8RzUW-is}^?DmePCVw(5Buj2fA9@|{D(Jw z_JjZSjT`TK(V0(p)ZR8%lP&C+9rn4||DD?|zy9_s@7Vn5U-`}7|1ZC^ypXrn2K~7{ z;UHm&89>=jDT9F)Xc=79J?d3y6Pe9o2tX2%ZfynXM!Rh!YEfrJBi;B(xEu>Ti={|W z9xdRt92x7M1~KJ}xC-p-4!m-_(*Kg4%MJj;ou^cF%|O$PspHqOx^$!#QNpaDfyut4}SZ)TaT@_7o4^G>Cb%p(!NvEV8>v7c{It~=A0)-4j=AS z^$%bCq>Ii!`(Ho*m4o*j*}Z4?VerQ4Dphr{2`WH=_$QT#V%o!_3q9yO;5e z|0|``Zf(}5y@c-fw03uc;S5pTTlsGP=7YV}gKd@4=5d~6FmsjB>!o_YAkN9BFAx%Z z(Z-o9xNNA5D%a!8rwYB|6bwi!Vpgc-6^CMxYBRv_3)d zYn)`wKP$PtJix7_I*w!wl)+ct7f^}8o{U&Sa0O3BS<0`y zVm7Z&G@MM#)#ZmXSBtM$gHl!ygK8#|lU#dFWEdj2ZC98*wq#+E&34)(Idxiq@y{Oc z*+t8HnlwoxtX4e2jNPNxlt<+Ki9?|dYXYXR*&qdX6CBo2JCL$*!vIhXj8abh3FcCv z5WurjI1{3D7h_WRc9k&`A*3Rf=}dz9btaCiVKzm$OU6F+U#u$Fro~8+*{qCEP<-Ix z)~k6IH!t{=3IGH-uvX+vy>}g(jl^RoO?6o$q4X6ilEeKvH3$0AbrQ!Y2G7XGJFkxJ=ps05+A! z%qZC(265t~0th{bs{Z803EnHTflZ#{Fcmh+Bow19AGRpB00LhuoWqE`gEiC^} zKmxU*kpRi2ULE^qX=>MQlQ36*H7NQg;L584TmZ%S2p~%ss?MS|%#bGjoZoSf>x&73?q&YIQRX`GEdD*mzsX~~Dg;uv| zNT7hpsD)7W63AR@tTiyWoFao#pTJo>k#4X-;Q58&j`^9pWnTE*P%oAj3=$S z$j*KD04Oj89oEMyq-Ll)5Jq<_=IANC)M%N565bUaP`*-7N0pDz62tzV0dOTJnV0>k zYMnetB6yTQRQ39sG_@v&$h) zBez+RHU8AeJ{;c?Xy#ujQI*?vI6FM!%(L3j==`(yJ^z_c8uoZ?WtAyYjk%fL(c5qO z=9ezpI&oxSu7B{r%Iy5y;$k(6%@enNd#O2oq8TpiJ8OR5SzDajmIu9hGHH$+y63*< zoOb$;z3_t{`|S0%e1Cc8Zf@F*&5fFRSrTj_v6?InNdxg{ijLI47|j~)Ug7x}oc37$ z{v~*xpEKG^uD~^$Y*7(o)UGfL){BUfOj|J)F;L``e?}*Lk(-4O-%I za$jUT5VF-yUyh*ZrpWWdZsAJA6-gXFYF}J`?ItxJ(oPVlXmC_x>;_Sfz;ul+MOEEB z2+A2IPE6vXoJT8Z(i084^)h(k>d~?WnGi`QeYx5+wVJlX!Whl5-@!@Ij+rNlz!50~ zkCCI3-WfCX2`1C8bR+ZdyR%1o0uACcWu`-5^9~Rx;r@e-R-r>NNs}P{R_&-(pHYD2 zz!jJ*1#h)HTZ&jf!T%v+Jo{+Onvl`d5y(hL;ePFN5JgMvM2hOTL=s|>E|4K;pa%(E zKKaWvWn(TIEd1{pD>sp(?vD+R^a1y1%0x74gGFA2#fjM^yns@O6hMh`1{kt$osA$Q zH&22KA?smn>mc=?Ae7GAgWVJi8xVRmbxSYBO#S!E)sE-dUcIlqs?HHG7rv8 zN$gXioGE9tZJUW&W-!U2whS&yWm-&fo7=QSR44RO)vHroS9Mi(*UZ#r=5}0Uv7$-h zcFa{-o}4IGDfLpXS5-+9+99#+63!rSC401@963=okr6^kc<)tW4usAgcNYXfP2Pk} z%uFq_?o8?sX?wXA-esmllv3HlG%?GLr9s|=;g$H%#8k2&3O}jrl0pD-Suzs?L4svh{68K@)HreGi*Qt4WbzVmneQw{L}mGJyi@#hyE=cT`_rt47f5Z;>iRr6L-VBh6)J+GvqwKq8845MiLo zLGNX(k)+EEDerkDWJE zGSQ|XIcwQPqNdHqSJ##o=lAT{b@1S!HZ#f2s|Y5$TRmw?c`x?M0nvqCyQO@zfX_rx zNwmGa*l@rDqR6FU79Dnrgs|j>+6Fn78M8T)*9aj_3b|VQ8;gWd zw_}QOI*2eQ#j?Lzp}Qrd)lL99aqcKVMB*TZsubu_Om?T5bplsxf(pI>ta)uA*sxHW zyvrh-2ExJx0Kr07Ok(Cl`7B*^?TCSf34{rO`$dQkbn=(nZSnv1qeGYEHB^=e#U*6U zRQFCl>pporzVA7wJ?G*d=Yj{UXEdX>*X#AF`sk6PGcz+k{^IAn|HGg8_D#1g z?AkfGr)|cQR8@M~u?@^!1j9hl(3BXAG=mA{9)*&1MB_3IxRef!VQ9;Ld^+(r`<9D~khIv`P7 z7WEJoLYWfh;S6Lm0sq3&OrZhm6)eM9{kpIV0 z48c#0J!3rD*!dWWWXjdo^dq3xAao)pQ1F(n2Mv9k-dAYpr}M}L#Bj_28+xd zl8s~=3_3bExzse+q!dTE4skad%cK1LtWpUHNoc%+$i%-S7NPf~@#FiN>EF1y(ouQG&H1_hYY z5vT}Q1O@B5E1qd3DfP=dq$;!MJDWvgRmLWTsma|s`xCrw9pmLg|GA;%0Kbf~B zN5|2qU;t+ zu4n6c%mgZ!kZFPkr=&v*`|+#dsg9pS5jAj9HFJsS*nR6RX|BK!URVLyCJ9znrbrzr zBhRXQ<}fW$mdwM-GT5Ys04k^c2{TDDm;i+3M4C@Qtv^`*z3VCwgdiM1Ah8bEvkdOK zw!LB6u{b*#ZEcQ5oJrYa0BtW*r=(ov0HS)o*-!C=|tzvI)F6MjjfOO9ule zwkM3~A)_J;EzRYe*ETj5=I3|pTt0H-XqQB4GpFe6z3-4S{?IY56h=VyuMXeuFxO2R zXYJ+o4|lsDZm1c3GqDWN$_B4Dw4?0F%n1ZaEY(CzT+P$?5H)wE^w3_fVx+yNo%ztG zKJC(5zdxCrn4PPeUcag9@xptbaw>jZ=4l$`t+zE_V2d4F=7*G2%rh zK&8dmQ2;m4+kDahCh|3lb7CUj@g@*iJdH%#Wh!<)xO%F9=3Sa?HWAh7BZBIeCeC$? zHew@$dZ?;qUg92JEBLE#w|?6!mwQ-YL>`TSth$&Lg2cqY?SjFCCQSThS1p2qrM)K3 z8AO6es~sj1T$rFNvzClf-j>DO2GSjCy^U$?&4&PJ+lPqSW^(G;=Ts@5e(H{AJoN`g zn;UIz`gJwh+FV+kz5AByF8TPUdT37BJ%8-@+KFQu!@9S3d1m(+J9f-396fmOu7ij7 zp0;%E-ozZED`pD37VW4)HJrx&4#$dvt~hbjzdSS*3e9;dUM(zZNW9i{RV=&SJu;zGgkK? zEXy!(fRdWXflco*(-(;Y_?tVI{A~g5EUeYo*w9o`zy=Z>9{6xA!PQ}o`J#boWWPmo z5OQ^fT9&j9xhk6|nQ|Xgv^1(xmMD?kj|wHzg5_lP)%8a?=Bl-Wwb4R^j;@$}415xEW?T~@hml%aE*@d@s-GsF zCVm8+zj2!)m{S;+s>+>hg3Cka!{NUo1`*_@dSXnHN7O}%ZJQXF9@F%X6o>(}>@Kf* znVEAUhV0l1lGXdN@hf?dSk`MGRVh&-?s2c>oZFU5s7ByAapFwewv6$(9go{_(=@ql z+T0?n1Ys~ZXC95($)p;kNmZw+N{QqM5)cznl~STySKRAWm~bLAO(tsUIuWRxKZBeV zk*S=an==toRe@OdZ?zPjVTndVq~c8GwCK7gA`zh+^+63m@PA;U4D;Mn;Y}r5fWe8R zMkIy!hE??>SwP{Wo02Dl9>U8RNI4iB$vsUn739l^Vp5xkIJ2&Ck$VDkTOhA3v5Jy`gwbAU;w}-_C7f3>dA}V2 zB0;7?U1H9%e@UcFVf2pqIiTGdjdSbiB2PzIK8B_uTX*@~VPPG=PET1vt%Ks)NdtNo z&r4;7?FJ!F&O%Cuc4Y!LIeLV2I-BeJ)zS$t`y z!+Rx&@~J>Ba}ar{gi>m2I;J3(TT>q$a|TnQ)J)oqjm^b{`Hju3jkOKW6MH43Nr}>Z zyHjPCMJ-&h{bN`d(;r=LI7pW@y6pv>`$-Q{Q2~*ri?{=*Za>@{Il*V_O3cKvttlsY zmXMZGdk?Q%iBq51>-7_D-FC}ucU8NVp79d?=4VC+ZsYlSeWlsFd*hsaXFcG4_qpx% z+xG0*yK{NDm`Ubw9`C6eI2F~arG+#N*HJg>Yt1lRUP8=gt5 z4MbAYhRPA#U0VW53Z#UgC?=ccvyMu|y=CLLMQp+LYAuRQg(<(KYZ{aULDJAJ zgahh?L?37B)Ab(=5A-KXoyfqb8INX{b}Y`%FVN(vPkKx<88=Nk?AMd=q~EJ2YsbI% z>CdfiY@NDec<9jT#^&Vy=bZY4M?CBik9qi>vren~Gl%ZF>m&d0k;||8?$e&~kbTRG z-~ZOP?z?o#U}4whR>Pp2+u>liu`!xo8eaV5$G!JMpE|ZdvkQxBC)PZUm0>D0oA?oV zbx^9AQW|i+{SrQ98K+!8^&{xQhv&_k`MS$+_5;8p!aCNQ>d^O6d&lUWl|xs3u7Ae) zGY{RpIpOwbiVS`U50jGQMu2G2ZzHZ zmUXx;z0u0)v>Z$w$i6dV0#(CqZAbfKI>R9+ZN5Y*#8KN;4rEY?Ah4eQsMul><6p>l zFs*En>3T_FR?`ig8FimvGmFzTC1esR(jg%`sny36$GYHVA`%@Nh*RyX35ucAHuu#j zYXO+cmAPB)rnBmXbb-0^tn*l%X17B?Y*60H5Qz2cl{%{;@;VYDLCCh4M074{r~(mJ z#bQ(Eq71A)hYf~;NX0~tIa+3arab}|A$we&2w6EZD<%sjVNr2SaMX^c&I{_Q(t}3G zC}ONAO_M4B%eaVhe1!@H5ZmFdFj8=dR2Zc_XyH;otzjv{w%;L1ckGdO4UG9(l$ z+ZHBuCkjwY3{DJ2&P;N~N~#io8jOrwQy%otBWl~6hk4TQXfkP=X4JHkCbzj92FMI% zPA%v1f0K;KxUDFqDp3NZR3~EQDy6DYiRz^`V>HeHaULg1DQTfQm*A3+5~^a?kW!VI zQxaYah!H_NCizs7e`f|#qH_L>j#@rRR49uf{iQbH95Rz}&DvpJsVMy)30}PU_DOD3en!2;C=tMGycTuZoc4z?5~<$L{4P>i*{F!<`|^n;D>9|E2?zJNAzr za-Tk`mH}o;#Gp)^GU`l;s+sn{<$34V(w;}&{rzh`@})bze0=_lGahm7Y)YT|7!KUC zXQ8+EA!jW=;&I>F#Jm3Tqvze{f}eWs4_tKKo_6z&$-ytsflJcLVKPU3jAjED&@MyZe2D;jw)W7KhnJ^WH>0gW30OG3CC^1VTMX$MMob^$52qZK)hf9 zxS#|~BcrsD-!4=GSa$~_E%*e57x-Em1zs6kVW7o+idUNRR%&SyMS<5C#f6Hby)?Bp z`XL%9qoG}nh_77k_&Xu5;{72joxInN0p(QgTZ54)k~1^!+P#NI>p$?sM-O_vt?_1E z)lJimo5_xa#mhhUg}d%Lw7k$?+sv!SM^AY8eSZ2C&p-R@`(kE(Yb#H99Ge}JG4I44{{vqh+pvjBu1J_k5PaG2gmStCq{L+(i9Ix;)u!@6Tnl( zEA~;l#NBaB$#|SS>slU~8vb+x9o*$E>*0F8{hdZUQiOK@OaZR*kfXf3tGLfWin@-2 zk=b#{0U43i6A*aJnLNG9$Ir1)s&jx$+1 zk)$1)ImI|NVp5#vw<=^sx0$+Kk;Xjy@N|Zg2mxSXFWARd243VOlbNuBoW&ZDFFjC0 z6ks;?hV?fMSDc~bbk~`!P!S&*gei-eV7Dzww`l|@1JO)SLQg6_H1)udhTC|crcJKI zBAw2SWE^E?3n+9RN0rrpTn6fz12xp0eh_g42mLK`1~MUmTT;0!>77&}#sVWbb8f+z zvp`B>CZd#5T@gTusG_Q>QP-(Q)K1!}&AqnDZ9CJnO~aF>ERNyKxox@S+-7bw=W?w~ zm2x6RZZinE&54MK+DX$Ojj67Xs*0O715FLo2|dXofVtvaAtz217%ezeRmpS6?7pV@ z)m1_&XAPww!+50k1n*S^D_S@y@3K{<>FWI;imI-?IH(+8ocj7|t6+^q!^EGuLQ<}#!V5G2W(bVnsZ zS%RbidF%t#U4>`ijU{nT3gzn-3)$$TLsDh(|omodq(c!D4UlY%Mg6WNn6a_h@D^I%x79^JU*<~2NeN2)pJM%F4) z27xniOPC$hM@}5L>5A{(KDqRU6Sr*c?k_LhdMvkFyMEw|v(DzVGb>EdiTl)KKb>Z{-M3Q*WXXqzNgB4%GUu`SY>Anx9^JD>H{R7Ep{i2=%@FYj${5&O&VHNC7*BUs5GnqJPW)}_otc=42JK6&<4ma8jInCvJb zuPRq1RYlXatf1mqmRSghrWLKEXu?P-Axgly_SH4ls6`5cqBSD=6owe6ZGXf$z=E>T zQm9Khh34kW*cc0nWP?s)n(Ml$Vuy!jt<2WI7}3#oZpPz<9Xp9|?&*8aKI7EQ%?$ut z@pv?@`qlc0!`EGNEv1$z9Xho3fOB{M@Ux$=cjwO4)eRc=+cwpGI)2wZ3(Gqm{pg4N z<9k1H%HqJz3!BY9ynOuyScF?l1!+o`uNJqV;}S2@7{jL&37K0Uzj_7Yz0hA zWuLU@oR|qMl+Z%Q46f%eNBrH7=d+)TAABw!x-Q@FMIP=!Z;0Fgee`B?z6ayI)gxY* zdiRXp^DBAlVE>74Ob`80R4q6It!bdqF6vnKqck)5k7&tL9zX<7vcL7J%`h3xbX_+Q zA^$1*PwH7jxMlM#?!`!GAG}jeVo+2ENX*8%bVcl|JJ^OR>aDVgA_af3iy7{4sGk!( z1p`SPi=b5;d}s^?tWzSabf++}4pmkiz9K+}h1+63cAg4!xNj4G@+m=m##;z)7Qu2m z9!+&{Ga|zrFa7?|_DKxCN{&vbN3tl36=x~jSHzY-7>pINSe*%WW_TYAX%%z}Gt|j6vl-e{wj`-q^6*`vN?91AP~20=G+2YQ6i$;rc|XWQG=Y2>Wb==P%+D@OVkzRKH7$xHn+KLCpqVw zQC`SRo6B;TTvlad&Ol03rp#MzQDHJ+&Wr)t%w@{AMjj>%dQ?$vIfLq!>fBbS7%640 zS}Gfh7Lt^;pU@2vxgM$8B8f>^=kxMnSsjOhJ;4g0?nE+b6LA$lBW=$_Qi-O z65@F`bG?e-XDS6Igrs?(ins!oLWR;~1~Qlv5=qf75eOvIBg#2*O2zaO(5RS+im40~ z39AWp`9X4;DafaQNjaaDDR@WI9}`2BIg8o?Om&Qi*-4uKGv!e6wW!{0Xn;o(Znm^U zxIQiSxnQuxoF20x1X2bAI>eD(Mz(6^6CmZhp6yj%_ zA;}q<7bb%$HQ@xVLjYoc>vqmDfTHwSq^gfd=SsKpaL}*oYHPG%{($)-{;WceIh7(T ziqIV)Gk*CO9f%vG;OLk!F4W~tOJbhP7^{VnCWBuRM&&}HsOGjLgcefZ+3lv+&APFN z;=hpBO-jg2=m@xzEr=NH4i}3ykW(7aj0vgQkls1vC|HBxF9y)IJef=uW@p#e)|L0p z2KVl~3u0W|oY}u>uuRL#JaH_>hq-6rE!uvpkzsUtF72{Kt1yw3KU`b^aGQDrJor`H>HCGADnZZZ^wM4n@H_hPGFWtKQ@pd+)+2L$&qsf?zcP(PiG99^o^O|oQ z=I>$k8TTD84{2lToV~M08@%;jZhz_mJ!!{z)nK!2E3^qInHc~v>U7t^{LNc(uis~+ zvd%@Z-h3}*4SWBUF1{<9in8m96RTil)E+nR#Yae#GIF7quK1erCtN6s#3-u}NgMAg zCQO0S4$&3IMA_mqaK=u(3F;*gF;f{S5m4+$d`uT(Xl05^fSjfej&qZF;jRk1B$Bv2JN&hJ#TK3$$Lv z#$6~lXo>PMyxEKR0wrPgOo#CQqwLS)wabe7P`s+v-p_E(dFQwL?YWz7=z)f21{qWo zB@QHxIG`~`aucuKYZ7nNkD8zcjY$lMQ830EHGmR9R76k&fd*t~=mxr>=XrYP@l4P2 z?7gaff2^unwV(51?(cyYO~d+oJqRekGQwI;F0YTQx1MeW_7&z`@IDun(B65{^7 z`$_tnZg|>!F=J)~$X({#?Vjwp{|mRCI&pT~w(A@7@rYjXyc;%;uHSv;&MR+x=B~8^ zX;0e-ubaBx1N$%Pno(v(qzpJ3x3l@YZJHN9 z|E4F8e|&>!I-PHA&xsn2dR1|+$`JuDGc;pJ0PQMl{SBPFL-ySyU-|-`yb~|^c3N2j zVSofH<7W37v~9P&O)D2SH@rG^39otH92wFIAfm8`gL*2vA!~FmRkMe#&QzhswgY(7 z0IB#3j8Fr}z6t$@LzuCJYK=QTq2AtJCnUpL2I{s{!oX95>xcql;EwLB&l4HgRN?ZY z=4oB(;AjR=0Z<}5)}#PfVUBF}Gvd8O9QGJX-Iv;tc$x+y7xQYHYFK+CaV$-as#YCH z$P_rQ^B0s;Bh{+}hZBV{v?X7SQkwz;W30tsO+pz1kic3^c2Y$W+)aV4%51BfP~8u< zW(5f|m*Zcx2}1)q-v_;jN_yj$156Mzx+-}~_v?~_pr!-hT2|+Jv1&3Da)n8BC5TWN zaEZ#1a|UEC+g#{~2qF?eiVh|Cw*A}6W zdRoaOO+rdeXw`p%fNp3x)Y6ES0U)&%waJdRju-&WsoX=Ldjcxk6iR>vOGudMAy{l^ zl{MS++Q?Tj!r+_=0uUfUnN1ZpxvkV!%wL*;3mDi|=RTw;npP>RLu)u9UO-KG8=c0h15orO+W9Dd{M@EKJHqFwH|h*`&M^C?rgP(&f|L2i2NJ(#V7z`!_bB| z(F@iR{fZDUa))jD#9i|*KG=W#^Ba~9xd9XqA{NAXGwm1K`~K?aOFlGzdTv)o*!3cv z^w;d$e(L(ecYg7K&)hG^w=Otv7@m51>(G_$;q8s>E{#^EC*a~gUw;L6^H*H*F&Hg4 zL$ak3B$--~KHYW~+$pGQKp-!?91~*h7tkMoO3Yl-L3+#`X^;lw;k&lx=`wAOKky1Q};XMoVuCre;PdTX}~j>Ht^&Z;Pev= z=iu~%A`ReOeA_#_3$IPz@V)to2l?=Acy5bmTevx2)aNpZX@lBNPQ*f{TeJMN5ABf} ze(g{(a~{=IhU|lJ*I;h0iUUX;#9}do1EXAC6LnbiqY1$<{H`vxc%^8S>Our$uzOLh zNhMp}U4!omAF2~HquUp+`Cy16R0&LJT`iVBhB0Ef4-B$Z;iC13Jrc(Hv6^|1jX&oh zGw#F;Z?t7o^*hbvig{aWiN$EVLYi9!U0VUN7GP}x5E$?l zLmnBFJ9rh;F2?0AwDr!f{5rcrdc0*x^~#P+#1gz!MN91x?>bY9QlG0H){7?lBNGJ#_!bBzPE{>zP2O$)qGQ6cvma?+|fKLM{(Y6|AnJ*&} zY9PqW;3L1k->N^AguKz_fd%YBq}myuy3o7Jc_OjU=Vl`K%81G);1gVFty&A|#rDOJmK1spPj^I4>TfG}r7 zoQy{s^TpD);RPYRWq!;%D_Vt^$FW>h?OCg-xX_kgx8riTCf2F`{_2qR@45v67KX>L zG95kq#Nwl$+5Fn;_co&r`ixBi0f3w)c`@Jp2VZ*jI}hKqvVV0K_GzVI=r6`|mu=j4 z$HzZ)|8Z)*_8ZsQm96_9m>+$3|CxQerhB_ZH=mzv+U{(#`;X7OER9cp!{xUwddYoR zZi&Q;(JpxONc*Rs==w#HDRGwtDYmKj*b)j9>F-)wYa2R!W<9kng7h6Xh@@*Xw)sXH#awNywXy$x_kG=<~kQMnXxS)}KrO*4QaN69kjtOo{k#-6No~FTDRwbDfMD?{ny0AX?85MT ziiz8q==r_md1{Ha(q|}y@+~3)WRSi4_DWt{bJeBHS=|LQGfyV%*;7Z4Ja(j^W^1$G zH^mz--8*g;qf1wr`jaP4?7HNV*_rjbZ@F#b+_{UdJhcD7o~K=N(Wk!jz}=6Yditfi zHcuRxpF7!HxCc8T0znd@Brsnr+EH`EwO2m)u-h0ld-&9+xA39%+1;#3Z-w?ys~g%j}0;2*6|Vu$D(B7Bt%{k#wB@Pc0~ZE`g*V9@@m zp4tT*gj*l-%l4l~_pygOTN)7|K%(bp^tEUiJSQwNd~F4wLZCzHVDK3Lie3n*35V;d zG2SE%x&wK`$k{5b6vJbE+l&(ys-{#$sk{L!<6;7@_Guw!=#J=#qWapSQNd9A7G>$a z^6&t7ozVE$Ao3B2A9EX$R#BKj4YWok)#_U zqX?FRH_Vbn{S|^_1^{8f9ssuyHy79vwaBA3CF~nQYN%N(W(bKm5w}F+mfEICO=_B^ z?8=f52%#Y?C&?0024nyRJ^8`NPGw!hfFKQ#00~lVsE4#*5?$npCANu19F+zQhtY;g z5G0`xN-F!XLRoW!EGS4KKv3p-2tr9zshUBVh72VGuIIL-L;{erAe3`)Kv*}W7bwRG zYf+i25+*8Jz-n9umX{RJvz7z^VL~E9YlqT?W#_Jh_)eTrup?E4`rD1tRS zwxH8gga>PxRBh0n1q9|WNyq%_ATEpELSp9)+$xJ74_u_mh=a3o2Lm0}=cQ)GlJzor z_+p*nqfiLQIWzNkJl>EEF#L$0p`eGIP)AA!k71Cdx58;jFnAn1a^74>EfC{r!GmwS zdjuE}APEaKi4y$9&FB8n*Q`DN#(s8YkzhhO(`4RlU-SpJJ@@w?dAh9Nba8UDy0*Qs zzHk1(bKCnK{L;hsY>jt6=jn^x7xj}}&3JY8=;yZYyo;`WKBQ5{xzC&XT0Tv?Kk~#g zu3Ne1^1Y95&exE5#CvHHrYqFFi0wW-2$&2~RzvUl%+dur) zpZckPd*;+hX{UQv$N%`B{LqQxr{3}Q|Cy$%Sr{M*ifzPWI;=bRdg@Tm$P^aox*Kk~ z@zvk;JuCZHw$5(7?SH=Qk$dmB{@Gvkec$(;ulvPcWM)i?Y=9_~ii0Oig2nNY?#5c? z6{0{;rs9E$`;%_{Wv~3!m%jAHzxJ!Yw#d>nbx=SA0NGi0$+QrrZu`tX_~vhZ?GOLJ z@BhIcWrS~f<+uFOul(vi`=Nil)%U;m-`~8**rstt77-vSrCF?@tGdJz%;IXM&d8>~ zfpJ{2Sl@g~p=65FPLK3=k13)xg94SLqLw#HRSvEtz}qSi!yMBDRt(wz}aq@a<5f(SIJY1tOfh{Dh?Wav*KVWtuD9C!wVlqMvnfCZ>QB$^+U?IWpa zQcB!E1V}(lnSpCUFy|}P^Fe@FGzgDRNR?-0kHPC!_;v6%4TS1+m)DvLT=6U3nE6=S<$7NPpuP-t-O zR)^Rs7rqJJ850!n4RceXMC)s8xEYLeX&h@J#o^oHv+C8o+NP<4MGm#&y*;HBwuUZb zA{;!2x~Mqm!zQkqk)Rli?5M9u?E!(><$eV%6gS1MwWVyQK?2&=`UMSIV z8E4aq+My2!Ww61;9DT7h-#lZTP9h>Di{h9P^$3CzhwjvvGgycKAlD30FhUVP3Wfks zl^<=2ZiOAoF7BXsCK_3OwW-v=WTWrZF1JX?nxzj`cr`X$LkcyIT4e2EVDqbH2qo*0 z5K%YK0Fbg}AV8v4M&(OR4d)C9k_AB!A!km6LI5n8K}Zro1`tAG6aXM1Qr03!A}lQ3 zqVM}GnI$uVBt#_XMSz|A3W*RSLg@jJEGBgjuu&<5444rYD2XWLvKa>uX4L5tkVr-e z#|=(L-DH#|qozsFCLARMk{)o>5bA+4i2($#?6aziK}xWNK)^(h04P!64ZWluxuLcb z>IJx*{9v;%OjQK2WFJ()ttX4iVL~C0l%PQ-U=U#dW?;w?_Fnb=6J>W~3!0S~C(^NX zBrN-bNIj}l0D*)NbpMp%d-Wd8p@14J8k!Y50g5iX>g8AXu=@d5N#h)rmo)Skpe!0p zppEVe0AN{sC64SML8%M)8~atYahB%A4_!By3$95j1s_D<0K%SNP{6FHr8C!9tkQx8 zXMo__Yl;n{*Fe>Os70$}z`?zQKP)1QM24K6#9;qf-b^Lx))Ff+A=aE`bX%sBsH`RC z=SoGICQ;JBBZ3ADDT~x=?%GseN@~rj;A&KArQlnB6ZBCkG+d6@SZ^N?_KJO`n1GcM z7`}=HbYk}j)c*&?@cNYoIU=J7ir7I=V69OAf||SZYFRT4XR%_o=yV;elC6s~9M`FO zCISO;P&`+Ej%J_3d|2pw6>TKaERs35O@oO{?X0T7cMU%}b|IG6sxlK$n5f3(;$G62 zSTomA2;rYcg|+Ma9ig0P?}&f`#7NxBXm$F<2WRj7n=^SmH_`5o@Fw>Bb+35kYrg+ApZol+0NrA1bFsOxn0Mtw%zifO7d=zM%>8WE zEfxZ}*xsIRZ3=)$7Vi43jZ3e%^5_5UzkB5IM}Gfz-g^4%$zOlt8+IMIyh(J;)mQf0 z8_@OrY@V|SCI;+gi+*#X-`bdM&jA}C%6-Qa5?lqLG*dm!Fce8oFwcc-T^s^b8ZDC5%FH&0l!5{d?AN=s&{q4=4IeT_~ z1^7Y5hq!7!CSX>%3>EFnK)iw?HZMo5#9pLT zw&Kg&*5FmpQ_Ct)BKx{{O4L|Ei>z_4RIJp0L#YNU?m1&q!Uq8a@@PE4M7wvb?OL5E zbuBnZD6n|={)aO6SvZkgbJf8|A3y$~kKXflw?1^|!$)}pD+kxsF5W*{89#CO)ZcvI zbMN`Hk8G|luDSHU$~evYj*vHxJ)RfajM!(%!o6^pGYD*MFQzNgy?a)hrW`XUqWf-$ z)D7u1DXEvCOj2fB@G69mk{#TJM5zTzjEK+@wTy|O#dZYaNv5hmr= z8{u`TYA;YP8=eI!0r732iWRbq4tZFB8aOYNP~A61NrLlTZ=%_G#Wh1kn^JD9(*@*~ zTERywxnL>~tE*r$m}mex^k3-**1FbP>YMd~C!b7%ye*)T@!A;-LHyw0*PyHelyZf~ z3aVINq#B3-G5rD7R|PDM{23z)ougs5&)F}43yR5NI9SP9P;I4+>Zj_cTX`}xqmnVy zummjY;SDr~2;hB#>Hw2z z@hG(|CBm}l1_-mB{KDe&fXkv46y~nWi^U@6uFpMlHWL>RArK-V5ELemgh0RutPuzZ zf-q;%EwoucKp25RGDt7n=iD!HKkK{A#bRT=*qC=4^L~Av&ur(DTlwflfB00-c;vG8=^8XVj#GL_#P{!jyneh$QLKnDRI$GvQKsiJix1U%0MP!jSSGTzA=(uk;@DfgeDqUQ-=Q&betuMA+vrAGLbcC2IpWO&6fGerN`! z@3GsYmKXR$UH${-dEE{kbG}+RCYj0sBPE)ow|rppdC#2uqgUeW)M7&O`ybl(CwD#V zR62MOo;tN?vaDY=`{F-6^jF__^*y{geaTHnKmN&cpItw2Xn)(yH;-@d#rykz`Hb5? z_T-U2dgA3L^H-&nUEFOT^&1&aZmssSMpn4*XgopQoc`$t@I&{=?loHUGqog3!5eCn zF$FB!Dm9bocFhxyJ^DX? z=hp%7p4)Hv!23R&(s+F_JACTQ+U|><_1x#2JbwJahaLcFNO=E+7d-vx*EiJOb=Tb| zPn>GUqm?~-`uXCTXWsbu;UmYMcw*Pu^eNAH26O-5z4vTx&aoxgUf;F%!keD`>^r}7 z=Yw}YaMd+e0B{+j5=P;??}7_2x%84<)0IaadHCqjqmV|J66T)9(^tOgo3`e&kAL!( z>2&4GU%vB8cigeHc^0t+NR%eLdG^rdS6+Ahb<nPuPZwI(%-enDjkF7s$IUO#i<@S{&6L!V{bz@?WSeEhD5A3Cv-*0=Vp zv@5&Ux@~EutCw7M#r_ALIKH_!_>`wyaP5sZwxgSGx%=GuV(-EB%&{l;o;%gAj^^_@ z&JYN5$AG}xk0;Z$mDNO)u$*v^5fL~}tc%lVVxwJ+7y$suBEJHpq<2%JN)b*NP*?lDO6xCX@_S$@5i`9ycL~qIQ%ZTdW5jy z0t6g{;U+a^kAu2MU<2L&OJ%}P9o^CDB+W20z$SZDCoVzm7O93#*x`vJeiNy~QuP9r zK=A1;1Hqn0)&a^w+rjvgqeOUQi6ogNSJl~JsS=POUiaG&EP+s8q3!X1j6pQJYhE~iY$DO#Wi1yk+ah9g5jb0%Ra+CY`cO#?`*8$i^VgZ={4;;RoaksAk= z0E=OEiSjGa{S>QEG@VhzrRl#~zhVkLZ(X5SJiOQZgu4NBNti5s9Ld>rWO`u0fNFqV zF6u}zqM?Uamqt-rx1r@`yo;3c*jS=PY@9g*hi~+6D;|Q9}R%EG$`A zv+5`$2mqXcNPC%qnURoLx~}J(Au|`H%ZvadX4@j=7zkrXVG84we847tND%Piy8f=3D4gp(FmQeI6oZeZM|rp;hmuGj`&4K_(Xou7?p$H430Gs8RD#TL)RYA;J zOO6UrP`C4tMCE8=As|30rwt(iX#^&vGR1Lc5h5F~)TPliR5yQaz%X#>k^MxSEwu}V zSwnuhobFIJ*b@wk&$Ig{YgP4XxoxD|0QD05-m{lN_1@Ox7_D^$O$r-9s zzGx*RD!i$ddlB+b#ku ztF&r#9gzoR9!nY(pIQ2dfobTkz@-sLn8z#Alk1EB`u6SXFB)BY{T$B1srAX8_V5*x zyQl4Z4dMFHBR_oQ-#qiehq`VIn{e4x$G&It_Q&pi?zzQvn9p4~dh&Tsy`Qf={?cb` zU4G}Ez4h_+FV4RzkD75>f9~4jUvuytOhDTi+Qq1C|LmjqAKo`x9XA=JoVNrHWTloB z^NQdyrWVuW?k|4o3wM0+r+?}vKmM^#U$B4I+ur)tOD?NYYFB`{?JpIP!{Me8EpOcl*(PPJ_)0K0xb0Q=Fl&G6;9lG@L*S+o+ za@WmfTYGo!`cH5At^4nLa6F=Zk)M9!Gr#4VUU}%ip8w}3e*80^{hTlyICS}MyzxJ8 zY^;w*Epxu^`Ws*S&wupvnNxe#Cg1#xU;oB8zTwfwpO~z!lw?Cp*r~30-v^B~{}G9S zs+-}77<=6rOjOQjh!BCrtUe~R(f?DL3JA_U%(`uQxewzmsdi(ws37KjYaqe%(u7{L;sdZEb8F+Pn7D>#iHGPWwf^ z_W94d`1)&Lyte1SMf)$gWOdi%(1jm7ec~k2Xyf#mjgv=lv~S*Z+%pkM7D&XLo80eO z9gk8&gow;pFd>x5nIg6Ev30eR&0UuE5ysofye{nm#B!#dNzsE=8DyLR%RavT@dSI& zCJReE>sM+}LoX9A!T@*+eW}s1gu3Z(wO^}m3Gb4+8qA0anhwS~@f3Lbf_rM{&;&$r{A(Vqv@2mH&9)6HvuTI>cSzlf6sUal*N?l`Yjnpc* z0has8q^|FcUJh~47iIqrbpAK!u}Xbn-+6bj*{ydaKy8gb5X2t8hv7|CpaYgD)=a1Y zrrV3FN+>vHbitrYyRQNjcrBed4M-oj0a?i!u9g(AXq@6CSYfhieh`--td2;@5`G8m z0IP9j(+&=`I<>c54?U6=|6c5L&~jyvz;SafbN_=(G#;p3??cVDGSOQUdMOU24mvv& zYd&c}xT{D(rCJ?_-)G@KP{t)O42ZO~qHGvw_6V?}P6MHrHparLII%+UGBvFBKTMdE z=Av1gjyMhq-dUYkt^k*%4DT0szkD=LIV2BC9*mb!BW4cP__Kahs%{<j--Ty9?@v0{%NwS4lCYJ-{MX_yg4mU zhfd5s_WOrNdnV^zd;QHXzu=DflZ4~$s;3_PHy8Z*U1#q)*Q{Q%^3WxdGa|%un2y%l zHTuLID?k5-bapnHtWfTlk;?oB>tN>ySpO9S?%UDm#Ho|N^Si(MYyas#Kkr%3`>o&o zo#Tg({^IL@6;QtM8~?$|uGOFTiJ$y0zxE&g)xZ9k`F!)x1s4E7-_7TnTi0LrbddC+ z559js-v(&a4Ys2v@4fd|-uPQT`~UpptG?q^cYgWq_q_Lg58ZPQVFF0+eAm10zw4e? ze#@&~`!D|KpZ(Fh4(vbp(GUIY`~Uj=iSVa>=HI;dB`^K!_q^w+*IaY=UHAOsANt|> zZ0prO@S4@t$xr>u9~16>_7{KUyT9|>-}d`|_%lEAv+sDS zwV)Z@)TYVX-}*&(CZ<^S+?U-Pw(KJZ|-=-bsjU;5(bfA;4ef8(#d{(t<@ zyFUGq4}Z`1fB&fEFIY=t~q+%CpsUJT5i9 zYvXg3aJuoJz)rJr`!Qs#re>qpHHftz=4~;w+Xq6;F+>6#{v7~uj2t4whA<2wrH!^% z&EL?oS~8-bNFoBn$#_I%sSPDyPHoe7vwQEpx9j?~m6W%kOMnbdz3!=3TzmDY$BxZU zpV>ZrYVF`|>0xE>p4EN(X?11u?Bd+<<1NT^)E=Jo3&xGj`ROMf+jZb6Jp=bW0+xJk z*X6e9+NJ^PD&|b(aQHAx8rmSCS%Z9)ASuMxt$eAfiin*8$1V!<Vry<}Zqr5!{%biws;Cu`nhXToO6I1uk(#?THs3exqa zh`%y?u=bJiK#N@!wMr|OhuUKDP%RJ#5Lt&!L$VlZHH^;#V%cv2OrD0`b!JEDqf(`k z2Ma|g<6?IY0dmb`2mqMbn^~&q5;lKij31P=59TqHUo3&|7rZ8j)lkH@|1d=^cIy5w zl}H-XPagt5lbCBv=