From ca70e2c0eb3f12c97d4c7b2c4f29ae9caf617759 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 8 Jul 2022 14:59:54 +0200 Subject: [PATCH] Introduce Telegram Premium, public chat join requests (#1912) --- .stylelintrc.json | 9 + src/api/gramjs/apiBuilders/appConfig.ts | 38 +- src/api/gramjs/apiBuilders/bots.ts | 38 +- src/api/gramjs/apiBuilders/chats.ts | 24 +- src/api/gramjs/apiBuilders/common.ts | 17 +- src/api/gramjs/apiBuilders/messages.ts | 56 +- src/api/gramjs/apiBuilders/payments.ts | 66 +- src/api/gramjs/apiBuilders/symbols.ts | 7 +- src/api/gramjs/apiBuilders/users.ts | 10 +- src/api/gramjs/gramjsBuilders/index.ts | 16 + src/api/gramjs/helpers.ts | 47 +- src/api/gramjs/methods/bots.ts | 6 + src/api/gramjs/methods/chats.ts | 53 +- src/api/gramjs/methods/client.ts | 3 + src/api/gramjs/methods/index.ts | 8 +- src/api/gramjs/methods/management.ts | 20 +- src/api/gramjs/methods/media.ts | 24 +- src/api/gramjs/methods/messages.ts | 22 + src/api/gramjs/methods/payments.ts | 69 +- src/api/gramjs/methods/settings.ts | 30 + src/api/gramjs/methods/symbols.ts | 1 + src/api/gramjs/methods/users.ts | 13 + src/api/gramjs/updater.ts | 29 +- src/api/types/bots.ts | 8 +- src/api/types/chats.ts | 4 + src/api/types/messages.ts | 45 +- src/api/types/misc.ts | 9 + src/api/types/payments.ts | 11 + src/api/types/updates.ts | 10 +- src/api/types/users.ts | 7 + src/assets/fonts/icomoon.woff | Bin 44924 -> 48208 bytes src/assets/fonts/icomoon.woff2 | Bin 21236 -> 22648 bytes src/assets/premium/DeviceFrame.svg | 5 + src/assets/premium/PremiumAds.svg | 5 + src/assets/premium/PremiumBadge.svg | 4 + src/assets/premium/PremiumChats.svg | 4 + src/assets/premium/PremiumFile.svg | 4 + src/assets/premium/PremiumLimits.svg | 4 + src/assets/premium/PremiumLogo.svg | 181 ++++++ src/assets/premium/PremiumReactions.svg | 4 + src/assets/premium/PremiumSpeed.svg | 4 + src/assets/premium/PremiumStickers.svg | 4 + src/assets/premium/PremiumVideo.svg | 4 + src/assets/premium/PremiumVoice.svg | 4 + src/assets/reaction-thumbs-premium.png | Bin 0 -> 78924 bytes src/assets/reaction-thumbs.png | Bin 22055 -> 44877 bytes src/bundles/extra.ts | 6 + .../calls/group/GroupCallParticipant.tsx | 2 +- .../calls/group/GroupCallParticipantVideo.tsx | 2 +- .../calls/phone/PhoneCall.module.scss | 8 +- src/components/calls/phone/PhoneCall.tsx | 7 +- src/components/common/AboutAdsModal.async.tsx | 16 + src/components/common/AboutAdsModal.tsx | 44 ++ src/components/common/AnimatedSticker.tsx | 1 - src/components/common/Audio.scss | 52 +- src/components/common/Audio.tsx | 84 ++- src/components/common/Avatar.scss | 14 +- src/components/common/Avatar.tsx | 97 ++- src/components/common/ChatExtra.tsx | 2 +- src/components/common/EmbeddedMessage.scss | 8 +- src/components/common/EmbeddedMessage.tsx | 9 +- src/components/common/GroupChatInfo.tsx | 7 +- src/components/common/PickerSelectedItem.tsx | 1 + src/components/common/PremiumIcon.scss | 27 + src/components/common/PremiumIcon.tsx | 47 ++ src/components/common/PrivateChatInfo.tsx | 9 +- src/components/common/ProfileInfo.scss | 11 +- src/components/common/ProfileInfo.tsx | 22 +- src/components/common/ProfilePhoto.tsx | 76 ++- src/components/common/SliderDots.module.scss | 62 ++ src/components/common/SliderDots.tsx | 90 +++ src/components/common/StickerButton.scss | 30 + src/components/common/StickerButton.tsx | 105 ++- src/components/common/StickerSetModal.tsx | 6 +- src/components/common/UiLoader.tsx | 12 +- .../common/code/CodeOverlay.module.scss | 2 +- .../common/helpers/mediaDimensions.ts | 1 + .../helpers/renderActionMessageText.tsx | 2 +- .../common/helpers/renderTextWithEntities.tsx | 4 +- src/components/common/helpers/waveform.ts | 2 +- src/components/left/ChatFolderModal.tsx | 3 +- src/components/left/main/Chat.scss | 2 +- src/components/left/main/Chat.tsx | 14 +- src/components/left/main/ChatCallStatus.scss | 1 + src/components/left/main/ChatFolders.tsx | 64 +- src/components/left/main/ChatList.tsx | 19 +- src/components/left/main/LeftMainHeader.tsx | 32 +- src/components/left/search/ChatMessage.tsx | 5 +- .../left/search/LeftSearchResultChat.tsx | 4 +- src/components/left/settings/Settings.scss | 5 + .../SettingsActiveWebsite.module.scss | 2 +- .../SettingsActiveWebsites.module.scss | 2 +- .../left/settings/SettingsEditProfile.tsx | 27 +- .../left/settings/SettingsExperimental.tsx | 3 +- .../left/settings/SettingsHeader.tsx | 25 +- src/components/left/settings/SettingsMain.tsx | 23 +- .../left/settings/SettingsPrivacy.tsx | 33 +- .../settings/SettingsPrivacyBlockedUsers.tsx | 2 +- .../left/settings/SettingsQuickReaction.tsx | 12 +- .../left/settings/SettingsStickerSet.tsx | 1 + .../settings/folders/SettingsFolders.scss | 5 + .../folders/SettingsFoldersChatsPicker.tsx | 47 +- .../settings/folders/SettingsFoldersEdit.tsx | 12 +- .../settings/folders/SettingsFoldersMain.tsx | 141 ++-- .../main/ConfettiContainer.module.scss | 1 + src/components/main/ConfettiContainer.tsx | 57 +- .../main/DeleteFolderDialog.async.tsx | 17 + src/components/main/DeleteFolderDialog.tsx | 36 ++ src/components/main/DownloadManager.tsx | 19 +- src/components/main/Main.tsx | 46 +- src/components/main/Notifications.tsx | 8 +- src/components/main/WebAppModal.scss | 39 ++ src/components/main/WebAppModal.tsx | 168 ++++- src/components/main/hooks/useWebAppFrame.ts | 42 +- .../premium/PremiumFeatureItem.module.scss | 22 + .../main/premium/PremiumFeatureItem.tsx | 34 + .../premium/PremiumFeatureModal.module.scss | 136 ++++ .../main/premium/PremiumFeatureModal.tsx | 322 ++++++++++ .../main/premium/PremiumMainModal.async.tsx | 17 + .../main/premium/PremiumMainModal.module.scss | 134 ++++ .../main/premium/PremiumMainModal.tsx | 290 +++++++++ .../common/PremiumLimitPreview.module.scss | 18 + .../premium/common/PremiumLimitPreview.tsx | 45 ++ .../common/PremiumLimitReachedModal.async.tsx | 17 + .../PremiumLimitReachedModal.module.scss | 54 ++ .../common/PremiumLimitReachedModal.tsx | 216 +++++++ .../common/PremiumLimitsCompare.module.scss | 69 ++ .../premium/common/PremiumLimitsCompare.tsx | 50 ++ ...PremiumFeaturePreviewReactions.module.scss | 34 + .../PremiumFeaturePreviewReactions.tsx | 155 +++++ .../PremiumFeaturePreviewStickers.module.scss | 32 + .../PremiumFeaturePreviewStickers.tsx | 153 +++++ .../PremiumFeaturePreviewVideo.module.scss | 61 ++ .../previews/PremiumFeaturePreviewVideo.tsx | 62 ++ src/components/mediaViewer/MediaViewer.scss | 2 +- src/components/mediaViewer/MediaViewer.tsx | 20 +- .../mediaViewer/MediaViewerContent.tsx | 57 +- .../mediaViewer/MediaViewerFooter.scss | 2 +- .../mediaViewer/VideoPlayerControls.scss | 2 +- .../mediaViewer/VideoPlayerControls.tsx | 16 +- .../mediaViewer/helpers/formatFileSize.ts | 9 - src/components/middle/ContactGreeting.tsx | 1 + .../middle/EmojiInteractionAnimation.tsx | 2 +- .../middle/FloatingActionButtons.module.scss | 2 +- src/components/middle/HeaderActions.tsx | 31 +- src/components/middle/MessageList.scss | 23 + src/components/middle/MessageList.tsx | 78 ++- src/components/middle/MessageListContent.tsx | 7 +- src/components/middle/MiddleColumn.tsx | 61 +- src/components/middle/MiddleHeader.scss | 7 +- src/components/middle/MiddleHeader.tsx | 25 +- src/components/middle/ReactorListModal.tsx | 4 +- .../middle/ScrollDownButton.module.scss | 2 +- src/components/middle/composer/AttachMenu.tsx | 23 +- .../middle/composer/AttachmentModal.tsx | 5 + src/components/middle/composer/BotCommand.tsx | 2 +- src/components/middle/composer/Composer.scss | 1 + src/components/middle/composer/Composer.tsx | 56 +- .../middle/composer/InlineBotTooltip.tsx | 5 +- .../middle/composer/MessageInput.tsx | 8 + .../middle/composer/StickerPicker.tsx | 45 +- src/components/middle/composer/StickerSet.tsx | 3 + .../middle/composer/StickerTooltip.tsx | 9 +- .../middle/composer/TextFormatter.scss | 2 +- .../composer/inlineResults/StickerResult.tsx | 3 + .../middle/message/CommentButton.tsx | 1 + .../middle/message/ContextMenuContainer.tsx | 12 +- src/components/middle/message/Invoice.tsx | 20 +- src/components/middle/message/Message.scss | 2 + src/components/middle/message/Message.tsx | 67 +- .../middle/message/MessageContextMenu.tsx | 69 +- .../middle/message/MessageMeta.scss | 8 + src/components/middle/message/Poll.tsx | 1 + .../middle/message/ReactionButton.tsx | 2 +- .../middle/message/ReactionSelector.scss | 15 + .../middle/message/ReactionSelector.tsx | 27 +- .../message/ReactionSelectorReaction.scss | 7 +- .../message/ReactionSelectorReaction.tsx | 4 +- .../middle/message/SponsoredMessage.tsx | 47 +- ...soredMessageContextMenuContainer.async.tsx | 18 + .../SponsoredMessageContextMenuContainer.tsx | 78 +++ src/components/middle/message/Sticker.scss | 15 + src/components/middle/message/Sticker.tsx | 75 ++- .../middle/message/_message-content.scss | 78 ++- .../message/helpers/buildContentClassName.ts | 5 + src/components/payment/CardInput.scss | 8 +- src/components/payment/CardInput.tsx | 5 +- src/components/payment/Checkout.module.scss | 122 ++++ src/components/payment/Checkout.scss | 100 --- src/components/payment/Checkout.tsx | 125 +++- src/components/payment/ExpiryInput.tsx | 1 + src/components/payment/PaymentInfo.tsx | 8 +- src/components/payment/PaymentModal.scss | 15 +- src/components/payment/PaymentModal.tsx | 56 +- src/components/payment/ReceiptModal.tsx | 17 +- src/components/payment/Shipping.tsx | 2 +- src/components/payment/ShippingInfo.tsx | 10 + src/components/right/RightColumn.scss | 2 +- src/components/right/RightHeader.tsx | 6 +- src/components/right/StickerSearch.scss | 1 - src/components/right/StickerSetResult.tsx | 12 +- .../right/management/ManageChannel.tsx | 8 +- .../management/ManageChatPrivacyType.tsx | 21 +- .../right/management/ManageDiscussion.tsx | 45 ++ .../right/management/ManageGroup.tsx | 27 +- .../right/management/ManageReactions.tsx | 15 +- src/components/ui/Button.scss | 22 + src/components/ui/Button.tsx | 3 + src/components/ui/ListItem.scss | 10 +- src/components/ui/ListItem.tsx | 9 +- src/components/ui/Modal.tsx | 4 +- src/components/ui/Notification.scss | 21 + src/components/ui/Notification.tsx | 26 +- src/components/ui/RadioGroup.tsx | 4 +- src/components/ui/Select.tsx | 3 + src/components/ui/Skeleton.scss | 1 + src/components/ui/Skeleton.tsx | 7 +- src/components/ui/Tab.scss | 12 +- src/components/ui/Tab.tsx | 9 +- src/components/ui/TabList.tsx | 5 +- src/components/ui/TextArea.tsx | 121 ++++ src/config.ts | 22 +- src/global/actions/api/bots.ts | 98 +-- src/global/actions/api/chats.ts | 154 ++++- src/global/actions/api/management.ts | 7 +- src/global/actions/api/messages.ts | 28 +- src/global/actions/api/payments.ts | 167 +++-- src/global/actions/api/settings.ts | 24 + src/global/actions/api/symbols.ts | 58 +- src/global/actions/api/users.ts | 6 +- src/global/actions/apiUpdaters/initial.ts | 4 +- src/global/actions/apiUpdaters/messages.ts | 18 + src/global/actions/apiUpdaters/payments.ts | 13 +- src/global/actions/apiUpdaters/users.ts | 5 +- src/global/actions/ui/chats.ts | 39 ++ src/global/actions/ui/initial.ts | 2 - src/global/actions/ui/misc.ts | 40 +- src/global/actions/ui/payments.ts | 18 +- src/global/cache.ts | 14 + src/global/helpers/bots.ts | 5 + src/global/helpers/chats.ts | 10 + src/global/helpers/index.ts | 2 + src/global/helpers/media.ts | 5 + src/global/helpers/messageMedia.ts | 22 +- src/global/helpers/messageSummary.ts | 18 +- src/global/helpers/messages.ts | 8 + src/global/initialState.ts | 6 + src/global/reducers/payments.ts | 26 +- src/global/selectors/chats.ts | 30 +- src/global/selectors/limits.ts | 26 + src/global/selectors/payments.ts | 8 +- src/global/selectors/users.ts | 10 + src/global/types.ts | 137 +++- src/hooks/reducers/usePaymentReducer.ts | 6 +- src/hooks/useReducer.ts | 14 +- src/lib/gramjs/Utils.js | 3 + src/lib/gramjs/client/TelegramClient.js | 19 +- src/lib/gramjs/client/downloadFile.ts | 5 +- src/lib/gramjs/client/uploadFile.ts | 18 +- src/lib/gramjs/tl/AllTLObjects.js | 2 +- src/lib/gramjs/tl/api.d.ts | 312 +++++++-- src/lib/gramjs/tl/apiTl.js | 75 ++- src/lib/gramjs/tl/static/api.json | 8 +- src/lib/gramjs/tl/static/api.tl | 95 ++- src/styles/Telegram T.json | 600 +++++++++++++----- src/styles/_forms.scss | 10 + src/styles/_variables.scss | 3 + src/styles/icons.scss | 36 ++ src/styles/themes.json | 4 +- src/types/index.ts | 5 +- src/util/deeplink.ts | 9 +- src/util/fastSmoothScrollHorizontal.ts | 40 +- src/util/formatCurrency.ts | 23 +- src/util/getReadableErrorText.ts | 10 +- src/util/langProvider.ts | 3 +- src/util/math.ts | 3 + src/util/permanentWebVersion.ts | 21 - src/util/switchTheme.ts | 5 +- src/util/textFormat.ts | 14 + src/util/themeStyle.ts | 2 + 280 files changed, 7526 insertions(+), 1409 deletions(-) create mode 100644 src/assets/premium/DeviceFrame.svg create mode 100644 src/assets/premium/PremiumAds.svg create mode 100644 src/assets/premium/PremiumBadge.svg create mode 100644 src/assets/premium/PremiumChats.svg create mode 100644 src/assets/premium/PremiumFile.svg create mode 100644 src/assets/premium/PremiumLimits.svg create mode 100644 src/assets/premium/PremiumLogo.svg create mode 100644 src/assets/premium/PremiumReactions.svg create mode 100644 src/assets/premium/PremiumSpeed.svg create mode 100644 src/assets/premium/PremiumStickers.svg create mode 100644 src/assets/premium/PremiumVideo.svg create mode 100644 src/assets/premium/PremiumVoice.svg create mode 100644 src/assets/reaction-thumbs-premium.png create mode 100644 src/components/common/AboutAdsModal.async.tsx create mode 100644 src/components/common/AboutAdsModal.tsx create mode 100644 src/components/common/PremiumIcon.scss create mode 100644 src/components/common/PremiumIcon.tsx create mode 100644 src/components/common/SliderDots.module.scss create mode 100644 src/components/common/SliderDots.tsx create mode 100644 src/components/main/DeleteFolderDialog.async.tsx create mode 100644 src/components/main/DeleteFolderDialog.tsx create mode 100644 src/components/main/premium/PremiumFeatureItem.module.scss create mode 100644 src/components/main/premium/PremiumFeatureItem.tsx create mode 100644 src/components/main/premium/PremiumFeatureModal.module.scss create mode 100644 src/components/main/premium/PremiumFeatureModal.tsx create mode 100644 src/components/main/premium/PremiumMainModal.async.tsx create mode 100644 src/components/main/premium/PremiumMainModal.module.scss create mode 100644 src/components/main/premium/PremiumMainModal.tsx create mode 100644 src/components/main/premium/common/PremiumLimitPreview.module.scss create mode 100644 src/components/main/premium/common/PremiumLimitPreview.tsx create mode 100644 src/components/main/premium/common/PremiumLimitReachedModal.async.tsx create mode 100644 src/components/main/premium/common/PremiumLimitReachedModal.module.scss create mode 100644 src/components/main/premium/common/PremiumLimitReachedModal.tsx create mode 100644 src/components/main/premium/common/PremiumLimitsCompare.module.scss create mode 100644 src/components/main/premium/common/PremiumLimitsCompare.tsx create mode 100644 src/components/main/premium/previews/PremiumFeaturePreviewReactions.module.scss create mode 100644 src/components/main/premium/previews/PremiumFeaturePreviewReactions.tsx create mode 100644 src/components/main/premium/previews/PremiumFeaturePreviewStickers.module.scss create mode 100644 src/components/main/premium/previews/PremiumFeaturePreviewStickers.tsx create mode 100644 src/components/main/premium/previews/PremiumFeaturePreviewVideo.module.scss create mode 100644 src/components/main/premium/previews/PremiumFeaturePreviewVideo.tsx delete mode 100644 src/components/mediaViewer/helpers/formatFileSize.ts create mode 100644 src/components/middle/message/SponsoredMessageContextMenuContainer.async.tsx create mode 100644 src/components/middle/message/SponsoredMessageContextMenuContainer.tsx create mode 100644 src/components/payment/Checkout.module.scss delete mode 100644 src/components/payment/Checkout.scss create mode 100644 src/components/ui/TextArea.tsx create mode 100644 src/global/helpers/bots.ts create mode 100644 src/global/helpers/media.ts create mode 100644 src/global/selectors/limits.ts diff --git a/.stylelintrc.json b/.stylelintrc.json index 9e945e829..61d981f38 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -12,6 +12,15 @@ "./dev/wholePixel.js" ], "rules": { + "property-no-unknown": [ + true, + { + "ignoreProperties": [ + "composes", + "compose-with" + ] + } + ], "number-leading-zero": "always", "selector-attribute-quotes": "always", "scss/operator-no-unspaced": null, diff --git a/src/api/gramjs/apiBuilders/appConfig.ts b/src/api/gramjs/apiBuilders/appConfig.ts index 8f9c21c0e..e4842af1d 100644 --- a/src/api/gramjs/apiBuilders/appConfig.ts +++ b/src/api/gramjs/apiBuilders/appConfig.ts @@ -3,9 +3,18 @@ import BigInt from 'big-integer'; import localDb from '../localDb'; import { Api as GramJs } from '../../../lib/gramjs'; import type { ApiAppConfig } from '../../types'; +import type { ApiLimitType } from '../../../global/types'; import { buildJson } from './misc'; +import { DEFAULT_LIMITS } from '../../../config'; -type GramJsAppConfig = { +type LimitType = 'default' | 'premium'; +type Limit = 'upload_max_fileparts' | 'stickers_faved_limit' | 'saved_gifs_limit' | 'dialog_filters_chats_limit' | +'dialog_filters_limit' | 'dialogs_folder_pinned_limit' | 'dialogs_pinned_limit' | 'caption_length_limit' | +'channels_limit' | 'channels_public_limit' | 'about_length_limit'; +type LimitKey = `${Limit}_${LimitType}`; +type LimitsConfig = Record; + +interface GramJsAppConfig extends LimitsConfig { emojies_sounds: Record buildApiBotCommand(botId, command)); + const botId = userId && buildApiPeerId(userId, 'user'); + const photo = descriptionPhoto instanceof GramJs.Photo ? buildApiPhoto(descriptionPhoto) : undefined; + const gif = descriptionDocument instanceof GramJs.Document ? buildVideoFromDocument(descriptionDocument) : undefined; + + const commandsArray = commands?.map((command) => buildApiBotCommand(botId || chatId, command)); return { - botId, + botId: botId || chatId, description, + gif, + photo, menuButton: buildApiBotMenuButton(menuButton), - commands: commandsArray.length ? commandsArray : undefined, + commands: commandsArray?.length ? commandsArray : undefined, }; } @@ -112,7 +124,7 @@ function buildApiBotCommand(botId: string, command: GramJs.BotCommand): ApiBotCo }; } -export function buildApiBotMenuButton(menuButton: GramJs.TypeBotMenuButton): ApiBotMenuButton { +export function buildApiBotMenuButton(menuButton?: GramJs.TypeBotMenuButton): ApiBotMenuButton { if (menuButton instanceof GramJs.BotMenuButton) { return { type: 'webApp', diff --git a/src/api/gramjs/apiBuilders/chats.ts b/src/api/gramjs/apiBuilders/chats.ts index d13ae5278..56e49f52a 100644 --- a/src/api/gramjs/apiBuilders/chats.ts +++ b/src/api/gramjs/apiBuilders/chats.ts @@ -31,17 +31,22 @@ function buildApiChatFieldsFromPeerEntity( ): PeerEntityApiChatFields { const isMin = Boolean('min' in peerEntity && peerEntity.min); const accessHash = ('accessHash' in peerEntity) && String(peerEntity.accessHash); + const hasVideoAvatar = 'photo' in peerEntity && peerEntity.photo && 'hasVideo' in peerEntity.photo + && peerEntity.photo.hasVideo; const avatarHash = ('photo' in peerEntity) && peerEntity.photo && buildAvatarHash(peerEntity.photo); const isSignaturesShown = Boolean('signatures' in peerEntity && peerEntity.signatures); const hasPrivateLink = Boolean('hasLink' in peerEntity && peerEntity.hasLink); const isScam = Boolean('scam' in peerEntity && peerEntity.scam); const isFake = Boolean('fake' in peerEntity && peerEntity.fake); + const isJoinToSend = Boolean('joinToSend' in peerEntity && peerEntity.joinToSend); + const isJoinRequest = Boolean('joinRequest' in peerEntity && peerEntity.joinRequest); return { isMin, hasPrivateLink, isSignaturesShown, ...(accessHash && { accessHash }), + hasVideoAvatar, ...(avatarHash && { avatarHash }), ...( (peerEntity instanceof GramJs.Channel || peerEntity instanceof GramJs.User) @@ -63,6 +68,8 @@ function buildApiChatFieldsFromPeerEntity( ...buildApiChatRestrictions(peerEntity), ...buildApiChatMigrationInfo(peerEntity), fakeType: isScam ? 'scam' : (isFake ? 'fake' : undefined), + isJoinToSend, + isJoinRequest, }; } @@ -379,9 +386,10 @@ export function buildApiChatFolder(filter: GramJs.DialogFilter): ApiChatFolder { export function buildApiChatFolderFromSuggested({ filter, description, }: { - filter: GramJs.DialogFilter; + filter: GramJs.TypeDialogFilter; description: string; -}): ApiChatFolder { +}): ApiChatFolder | undefined { + if (!(filter instanceof GramJs.DialogFilter)) return undefined; return { ...buildApiChatFolder(filter), description, @@ -390,12 +398,14 @@ export function buildApiChatFolderFromSuggested({ export function buildApiChatBotCommands(botInfos: GramJs.BotInfo[]) { return botInfos.reduce((botCommands, botInfo) => { - const botId = buildApiPeerId(botInfo.userId, 'user'); + const botId = buildApiPeerId(botInfo.userId!, 'user'); - botCommands = botCommands.concat(botInfo.commands.map((mtpCommand) => ({ - botId, - ...omitVirtualClassFields(mtpCommand), - }))); + if (botInfo.commands) { + botCommands = botCommands.concat(botInfo.commands.map((mtpCommand) => ({ + botId, + ...omitVirtualClassFields(mtpCommand), + }))); + } return botCommands; }, [] as ApiBotCommand[]); diff --git a/src/api/gramjs/apiBuilders/common.ts b/src/api/gramjs/apiBuilders/common.ts index 85e2ac727..7c2f6ceb2 100644 --- a/src/api/gramjs/apiBuilders/common.ts +++ b/src/api/gramjs/apiBuilders/common.ts @@ -2,7 +2,7 @@ import { Api as GramJs } from '../../../lib/gramjs'; import { strippedPhotoToJpg } from '../../../lib/gramjs/Utils'; import type { - ApiPhoto, ApiPhotoSize, ApiThumbnail, + ApiPhoto, ApiPhotoSize, ApiThumbnail, ApiVideoSize, } from '../../types'; import { bytesToDataUri } from './helpers'; import { pathBytesToSvg } from './pathBytesToSvg'; @@ -73,6 +73,21 @@ export function buildApiPhoto(photo: GramJs.Photo): ApiPhoto { id: String(photo.id), thumbnail: buildApiThumbnailFromStripped(photo.sizes), sizes, + ...(photo.videoSizes && { videoSizes: photo.videoSizes.map(buildApiVideoSize), isVideo: true }), + }; +} + +export function buildApiVideoSize(videoSize: GramJs.VideoSize): ApiVideoSize { + const { + videoStartTs, size, h, w, type, + } = videoSize; + + return { + videoStartTs, + size, + height: h, + width: w, + type: type as ('u' | 'v'), }; } diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts index 0a114fb25..c1a695279 100644 --- a/src/api/gramjs/apiBuilders/messages.ts +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -31,6 +31,7 @@ import type { ApiLocation, ApiGame, PhoneCallAction, + ApiWebDocument, } from '../../types'; import { @@ -66,7 +67,7 @@ export function setMessageBuilderCurrentUserId(_currentUserId: string) { export function buildApiSponsoredMessage(mtpMessage: GramJs.SponsoredMessage): ApiSponsoredMessage | undefined { const { - fromId, message, entities, startParam, channelPost, chatInvite, chatInviteHash, randomId, + fromId, message, entities, startParam, channelPost, chatInvite, chatInviteHash, randomId, recommended, } = mtpMessage; const chatId = fromId ? getApiChatIdFromMtpPeer(fromId) : undefined; const chatInviteTitle = chatInvite @@ -80,6 +81,7 @@ export function buildApiSponsoredMessage(mtpMessage: GramJs.SponsoredMessage): A isBot: fromId ? isPeerUser(fromId) : false, text: buildMessageTextContent(message, entities), expiresAt: Math.round(Date.now() / 1000) + SPONSORED_MESSAGE_CACHE_MS, + isRecommended: Boolean(recommended), ...(chatId && { chatId }), ...(chatInviteHash && { chatInviteHash }), ...(chatInvite && { chatInviteTitle }), @@ -237,17 +239,21 @@ export function buildMessagePeerReaction(userReaction: GramJs.MessagePeerReactio export function buildApiAvailableReaction(availableReaction: GramJs.AvailableReaction): ApiAvailableReaction { const { selectAnimation, staticIcon, reaction, title, - inactive, aroundAnimation, centerIcon, + inactive, aroundAnimation, centerIcon, effectAnimation, activateAnimation, + premium, } = availableReaction; return { selectAnimation: buildApiDocument(selectAnimation), + activateAnimation: buildApiDocument(activateAnimation), + effectAnimation: buildApiDocument(effectAnimation), staticIcon: buildApiDocument(staticIcon), aroundAnimation: aroundAnimation ? buildApiDocument(aroundAnimation) : undefined, centerIcon: centerIcon ? buildApiDocument(centerIcon) : undefined, reaction, title, isInactive: inactive, + isPremium: premium, }; } @@ -368,7 +374,7 @@ function buildSticker(media: GramJs.TypeMessageMedia): ApiSticker | undefined { return undefined; } - return buildStickerFromDocument(media.document); + return buildStickerFromDocument(media.document, media.nopremium); } function buildPhoto(media: GramJs.TypeMessageMedia): ApiPhoto | undefined { @@ -427,7 +433,7 @@ export function buildVideoFromDocument(document: GramJs.Document): ApiVideo | un isRound, isGif: Boolean(gifAttr), thumbnail: buildApiThumbnailFromStripped(thumbs), - size, + size: size.toJSNumber(), }; } @@ -469,7 +475,8 @@ function buildAudio(media: GramJs.TypeMessageMedia): ApiAudio | undefined { id: String(media.document.id), fileName: getFilenameFromDocument(media.document, 'audio'), thumbnailSizes, - ...pick(media.document, ['size', 'mimeType']), + size: media.document.size.toJSNumber(), + ...pick(media.document, ['mimeType']), ...pick(audioAttribute, ['duration', 'performer', 'title']), }; } @@ -559,7 +566,7 @@ export function buildApiDocument(document: GramJs.TypeDocument): ApiDocument | u return { id: String(id), - size, + size: size.toJSNumber(), mimeType, timestamp: date, fileName: getFilenameFromDocument(document), @@ -717,22 +724,10 @@ export function buildInvoice(media: GramJs.MessageMediaInvoice): ApiInvoice { description: text, title, photo, test, totalAmount, currency, receiptMsgId, } = media; - const imageAttribute = photo?.attributes - .find((a: any): a is GramJs.DocumentAttributeImageSize => a instanceof GramJs.DocumentAttributeImageSize); - - let photoWidth: number | undefined; - let photoHeight: number | undefined; - if (imageAttribute) { - photoWidth = imageAttribute.w; - photoHeight = imageAttribute.h; - } - return { text, title, - photoUrl: photo?.url, - photoWidth, - photoHeight, + photo: buildApiWebDocument(photo), receiptMsgId, amount: Number(totalAmount), currency, @@ -1311,6 +1306,27 @@ function buildUploadingMedia( }; } +export function buildApiWebDocument(document?: GramJs.TypeWebDocument): ApiWebDocument | undefined { + if (!document) return undefined; + + const { + url, size, mimeType, + } = document; + const accessHash = document instanceof GramJs.WebDocument ? document.accessHash.toString() : undefined; + const sizeAttr = document.attributes.find((attr): attr is GramJs.DocumentAttributeImageSize => ( + attr instanceof GramJs.DocumentAttributeImageSize + )); + const dimensions = sizeAttr && { width: sizeAttr.w, height: sizeAttr.h }; + + return { + url, + accessHash, + size, + mimeType, + dimensions, + }; +} + function buildNewPoll(poll: ApiNewPoll, localId: number) { return { poll: { @@ -1321,7 +1337,7 @@ function buildNewPoll(poll: ApiNewPoll, localId: number) { }; } -function buildApiMessageEntity(entity: GramJs.TypeMessageEntity): ApiMessageEntity { +export function buildApiMessageEntity(entity: GramJs.TypeMessageEntity): ApiMessageEntity { const { className: type, offset, length } = entity; return { type, diff --git a/src/api/gramjs/apiBuilders/payments.ts b/src/api/gramjs/apiBuilders/payments.ts index c8752fd8b..20ce8cb59 100644 --- a/src/api/gramjs/apiBuilders/payments.ts +++ b/src/api/gramjs/apiBuilders/payments.ts @@ -1,5 +1,10 @@ import type { Api as GramJs } from '../../../lib/gramjs'; +import type { ApiInvoice, ApiPaymentSavedInfo, ApiPremiumPromo } from '../../types'; + +import { buildApiDocument, buildApiMessageEntity, buildApiWebDocument } from './messages'; +import { omitVirtualClassFields } from './helpers'; + export function buildShippingOptions(shippingOptions: GramJs.ShippingOption[] | undefined) { if (!shippingOptions) { return undefined; @@ -8,11 +13,11 @@ export function buildShippingOptions(shippingOptions: GramJs.ShippingOption[] | return { id: option.id, title: option.title, - amount: option.prices.reduce((ac, cur) => ac + Number((cur.amount as any).value), 0), + amount: option.prices.reduce((ac, cur) => ac + cur.amount.toJSNumber(), 0), prices: option.prices.map(({ label, amount }) => { return { label, - amount: Number((amount as any).value), + amount: amount.toJSNumber(), }; }), }; @@ -34,7 +39,7 @@ export function buildReceipt(receipt: GramJs.payments.PaymentReceipt) { const { prices } = invoice; const mapedPrices = prices.map(({ label, amount }) => ({ label, - amount: Number((amount as any).value), + amount: amount.toJSNumber(), })); let shippingPrices; @@ -44,7 +49,7 @@ export function buildReceipt(receipt: GramJs.payments.PaymentReceipt) { shippingPrices = shipping.prices.map(({ label, amount }) => { return { label, - amount: Number((amount as any).value), + amount: amount.toJSNumber(), }; }); shippingMethod = shipping.title; @@ -54,7 +59,7 @@ export function buildReceipt(receipt: GramJs.payments.PaymentReceipt) { currency, prices: mapedPrices, info: { shippingAddress, phone, name }, - totalAmount: Number((totalAmount as any).value), + totalAmount: totalAmount.toJSNumber(), credentialsTitle, shippingPrices, shippingMethod, @@ -86,19 +91,25 @@ export function buildPaymentForm(form: GramJs.payments.PaymentForm) { prices, } = invoice; - const mapedPrices = prices.map(({ label, amount }) => ({ + const mappedPrices = prices.map(({ label, amount }) => ({ label, - amount: Number((amount as any).value), + amount: amount.toJSNumber(), })); + const { shippingAddress } = savedInfo || {}; + const cleanedInfo: ApiPaymentSavedInfo | undefined = savedInfo ? omitVirtualClassFields(savedInfo) : undefined; + if (cleanedInfo && shippingAddress) { + cleanedInfo.shippingAddress = omitVirtualClassFields(shippingAddress); + } const nativeData = nativeParams ? JSON.parse(nativeParams.data) : {}; + return { canSaveCredentials, passwordMissing, formId: String(formId), providerId: String(providerId), nativeProvider, - savedInfo, + savedInfo: cleanedInfo, invoice: { test, nameRequested, @@ -109,7 +120,7 @@ export function buildPaymentForm(form: GramJs.payments.PaymentForm) { phoneToProvider, emailToProvider, currency, - prices: mapedPrices, + prices: mappedPrices, }, nativeParams: { needCardholderName: nativeData.need_cardholder_name, @@ -120,3 +131,40 @@ export function buildPaymentForm(form: GramJs.payments.PaymentForm) { }, }; } + +export function buildApiInvoiceFromForm(form: GramJs.payments.PaymentForm): ApiInvoice { + const { + invoice, description: text, title, photo, + } = form; + const { + test, currency, prices, recurring, recurringTermsUrl, + } = invoice; + + const totalAmount = prices.reduce((ac, cur) => ac + cur.amount.toJSNumber(), 0); + + return { + text, + title, + photo: buildApiWebDocument(photo), + amount: totalAmount, + currency, + isTest: test, + isRecurring: recurring, + recurringTermsUrl, + }; +} + +export function buildApiPremiumPromo(promo: GramJs.help.PremiumPromo): ApiPremiumPromo { + const { + statusText, statusEntities, videos, videoSections, currency, monthlyAmount, + } = promo; + + return { + statusText, + statusEntities: statusEntities.map((l) => buildApiMessageEntity(l)), + videoSections, + currency, + videos: videos.map(buildApiDocument).filter(Boolean), + monthlyAmount: monthlyAmount.toString(), + }; +} diff --git a/src/api/gramjs/apiBuilders/symbols.ts b/src/api/gramjs/apiBuilders/symbols.ts index bde29e8c5..c0a727ebe 100644 --- a/src/api/gramjs/apiBuilders/symbols.ts +++ b/src/api/gramjs/apiBuilders/symbols.ts @@ -10,12 +10,12 @@ import localDb from '../localDb'; const LOTTIE_STICKER_MIME_TYPE = 'application/x-tgsticker'; const VIDEO_STICKER_MIME_TYPE = 'video/webm'; -export function buildStickerFromDocument(document: GramJs.TypeDocument): ApiSticker | undefined { +export function buildStickerFromDocument(document: GramJs.TypeDocument, isNoPremium?: boolean): ApiSticker | undefined { if (document instanceof GramJs.DocumentEmpty) { return undefined; } - const { mimeType } = document; + const { mimeType, videoThumbs } = document; const stickerAttribute = document.attributes .find((attr: any): attr is GramJs.DocumentAttributeSticker => ( attr instanceof GramJs.DocumentAttributeSticker @@ -78,6 +78,8 @@ export function buildStickerFromDocument(document: GramJs.TypeDocument): ApiStic const { w: width, h: height } = cachedThumb as GramJs.PhotoCachedSize || sizeAttribute || {}; + const hasEffect = !isNoPremium && videoThumbs?.some(({ type }) => type === 'f'); + return { id: String(document.id), stickerSetId: stickerSetInfo ? String(stickerSetInfo.id) : NO_STICKER_SET_ID, @@ -88,6 +90,7 @@ export function buildStickerFromDocument(document: GramJs.TypeDocument): ApiStic width, height, thumbnail, + hasEffect, }; } diff --git a/src/api/gramjs/apiBuilders/users.ts b/src/api/gramjs/apiBuilders/users.ts index 12449de27..19697e3c7 100644 --- a/src/api/gramjs/apiBuilders/users.ts +++ b/src/api/gramjs/apiBuilders/users.ts @@ -4,11 +4,13 @@ import type { } from '../../types'; import { buildApiPeerId } from './peers'; import { buildApiBotInfo } from './bots'; +import { buildApiPhoto } from './common'; export function buildApiUserFromFull(mtpUserFull: GramJs.users.UserFull): ApiUser { const { fullUser: { about, commonChatsCount, pinnedMsgId, botInfo, blocked, + profilePhoto, }, users, } = mtpUserFull; @@ -18,11 +20,12 @@ export function buildApiUserFromFull(mtpUserFull: GramJs.users.UserFull): ApiUse return { ...user, fullInfo: { + ...(profilePhoto instanceof GramJs.Photo && { profilePhoto: buildApiPhoto(profilePhoto) }), bio: about, commonChatsCount, pinnedMessageId: pinnedMsgId, isBlocked: Boolean(blocked), - ...(botInfo && { botInfo: buildApiBotInfo(botInfo) }), + ...(botInfo && { botInfo: buildApiBotInfo(botInfo, user.id) }), }, }; } @@ -35,6 +38,9 @@ export function buildApiUser(mtpUser: GramJs.TypeUser): ApiUser | undefined { const { id, firstName, lastName, fake, scam, } = mtpUser; + const hasVideoAvatar = mtpUser.photo instanceof GramJs.UserProfilePhoto + ? Boolean(mtpUser.photo.hasVideo) + : undefined; const avatarHash = mtpUser.photo instanceof GramJs.UserProfilePhoto ? String(mtpUser.photo.photoId) : undefined; @@ -45,6 +51,7 @@ export function buildApiUser(mtpUser: GramJs.TypeUser): ApiUser | undefined { isMin: Boolean(mtpUser.min), fakeType: scam ? 'scam' : (fake ? 'fake' : undefined), ...(mtpUser.self && { isSelf: true }), + isPremium: Boolean(mtpUser.premium), ...(mtpUser.verified && { isVerified: true }), ...((mtpUser.contact || mtpUser.mutualContact) && { isContact: true }), type: userType, @@ -56,6 +63,7 @@ export function buildApiUser(mtpUser: GramJs.TypeUser): ApiUser | undefined { noStatus: !mtpUser.status, ...(mtpUser.accessHash && { accessHash: String(mtpUser.accessHash) }), ...(avatarHash && { avatarHash }), + hasVideoAvatar, ...(mtpUser.bot && mtpUser.botInlinePlaceholder && { botPlaceholder: mtpUser.botInlinePlaceholder }), ...(mtpUser.bot && mtpUser.botAttachMenu && { isAttachMenuBot: mtpUser.botAttachMenu }), }; diff --git a/src/api/gramjs/gramjsBuilders/index.ts b/src/api/gramjs/gramjsBuilders/index.ts index a43510120..81a091d12 100644 --- a/src/api/gramjs/gramjsBuilders/index.ts +++ b/src/api/gramjs/gramjsBuilders/index.ts @@ -19,6 +19,7 @@ import type { ApiVideo, ApiThemeParameters, ApiPoll, + ApiRequestInputInvoice, } from '../../types'; import { ApiMessageEntityTypes, @@ -349,6 +350,8 @@ export function isMessageWithMedia(message: GramJs.Message | GramJs.UpdateServic ) || ( media instanceof GramJs.MessageMediaGame && (media.game.document instanceof GramJs.Document || media.game.photo instanceof GramJs.Photo) + ) || ( + media instanceof GramJs.MessageMediaInvoice && media.photo ) ); } @@ -525,3 +528,16 @@ export function buildInputPhoneCall({ id, accessHash }: ApiPhoneCall) { accessHash: BigInt(accessHash!), }); } + +export function buildInputInvoice(invoice: ApiRequestInputInvoice) { + if ('slug' in invoice) { + return new GramJs.InputInvoiceSlug({ + slug: invoice.slug, + }); + } else { + return new GramJs.InputInvoiceMessage({ + peer: buildInputPeer(invoice.chat.id, invoice.chat.accessHash), + msgId: invoice.messageId, + }); + } +} diff --git a/src/api/gramjs/helpers.ts b/src/api/gramjs/helpers.ts index 1755e504b..75f41f6df 100644 --- a/src/api/gramjs/helpers.ts +++ b/src/api/gramjs/helpers.ts @@ -14,30 +14,31 @@ export function addMessageToLocalDb(message: GramJs.Message | GramJs.MessageServ const messageFullId = `${resolveMessageApiChatId(message)}-${message.id}`; localDb.messages[messageFullId] = message; - if ( - message instanceof GramJs.Message - && message.media instanceof GramJs.MessageMediaDocument - && message.media.document instanceof GramJs.Document - ) { - localDb.documents[String(message.media.document.id)] = message.media.document; - } - - if ( - message instanceof GramJs.Message - && message.media instanceof GramJs.MessageMediaWebPage - && message.media.webpage instanceof GramJs.WebPage - && message.media.webpage.document instanceof GramJs.Document - ) { - localDb.documents[String(message.media.webpage.document.id)] = message.media.webpage.document; - } - - if (message instanceof GramJs.Message - && message.media instanceof GramJs.MessageMediaGame - ) { - if (message.media.game.document instanceof GramJs.Document) { - localDb.documents[String(message.media.game.document.id)] = message.media.game.document; + if (message instanceof GramJs.Message) { + if (message.media instanceof GramJs.MessageMediaDocument + && message.media.document instanceof GramJs.Document + ) { + localDb.documents[String(message.media.document.id)] = message.media.document; + } + + if (message.media instanceof GramJs.MessageMediaWebPage + && message.media.webpage instanceof GramJs.WebPage + && message.media.webpage.document instanceof GramJs.Document + ) { + localDb.documents[String(message.media.webpage.document.id)] = message.media.webpage.document; + } + + if (message.media instanceof GramJs.MessageMediaGame) { + if (message.media.game.document instanceof GramJs.Document) { + localDb.documents[String(message.media.game.document.id)] = message.media.game.document; + } + addPhotoToLocalDb(message.media.game.photo); + } + + if (message.media instanceof GramJs.MessageMediaInvoice + && message.media.photo) { + localDb.webDocuments[String(message.media.photo.url)] = message.media.photo; } - addPhotoToLocalDb(message.media.game.photo); } if (message instanceof GramJs.MessageService && 'photo' in message.action) { diff --git a/src/api/gramjs/methods/bots.ts b/src/api/gramjs/methods/bots.ts index 11adfcbd6..76e15b258 100644 --- a/src/api/gramjs/methods/bots.ts +++ b/src/api/gramjs/methods/bots.ts @@ -157,6 +157,7 @@ export async function requestWebView({ startParam, replyToMessageId, theme, + sendAs, isFromBotMenu, }: { isSilent?: boolean; @@ -166,6 +167,7 @@ export async function requestWebView({ startParam?: string; replyToMessageId?: number; theme?: ApiThemeParameters; + sendAs?: ApiUser | ApiChat; isFromBotMenu?: boolean; }) { const result = await invokeRequest(new GramJs.messages.RequestWebView({ @@ -177,6 +179,7 @@ export async function requestWebView({ startParam, themeParams: theme ? buildInputThemeParams(theme) : undefined, fromBotMenu: isFromBotMenu || undefined, + ...(sendAs && { sendAs: buildInputPeer(sendAs.id, sendAs.accessHash) }), })); if (result instanceof GramJs.WebViewResultUrl) { @@ -211,12 +214,14 @@ export function prolongWebView({ bot, queryId, replyToMessageId, + sendAs, }: { isSilent?: boolean; peer: ApiChat | ApiUser; bot: ApiUser; queryId: string; replyToMessageId?: number; + sendAs?: ApiUser | ApiChat; }) { return invokeRequest(new GramJs.messages.ProlongWebView({ silent: isSilent || undefined, @@ -224,6 +229,7 @@ export function prolongWebView({ bot: buildInputPeer(bot.id, bot.accessHash), queryId: BigInt(queryId), replyToMsgId: replyToMessageId, + ...(sendAs && { sendAs: buildInputPeer(sendAs.id, sendAs.accessHash) }), })); } diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 90cf7dd2f..7baf0bb31 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -16,7 +16,7 @@ import type { } from '../../types'; import { - DEBUG, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID, + DEBUG, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID, ALL_FOLDER_ID, } from '../../../config'; import { invokeRequest, uploadFile } from './client'; import { @@ -45,6 +45,7 @@ import { addEntitiesWithPhotosToLocalDb, addMessageToLocalDb, addPhotoToLocalDb import { buildApiPeerId, getApiChatIdFromMtpPeer } from '../apiBuilders/peers'; import { buildApiPhoto } from '../apiBuilders/common'; import { buildStickerSet } from '../apiBuilders/symbols'; +import localDb from '../localDb'; type FullChatData = { fullInfo: ApiChatFullInfo; @@ -365,8 +366,13 @@ async function getFullChatInfo(chatId: string): Promise isAdmin || isOwner) : undefined; const botCommands = botInfo ? buildApiChatBotCommands(botInfo) : undefined; @@ -374,12 +380,14 @@ async function getFullChatInfo(chatId: string): Promise l instanceof GramJs.DialogFilterDefault); + const dialogFilters = result.filter((df): df is GramJs.DialogFilter => df instanceof GramJs.DialogFilter); + const orderedIds = dialogFilters.map(({ id }) => id); + if (defaultFolderPosition !== -1) { + orderedIds.splice(defaultFolderPosition, 0, ALL_FOLDER_ID); + } return { - byId: buildCollectionByKey(result.map(buildApiChatFolder), 'id') as Record, - orderedIds: result.map(({ id }) => id), + byId: buildCollectionByKey( + dialogFilters + .map(buildApiChatFolder), 'id', + ) as Record, + orderedIds, }; } @@ -760,7 +783,7 @@ export async function fetchRecommendedChatFolders() { return undefined; } - return results.map(buildApiChatFolderFromSuggested); + return results.map(buildApiChatFolderFromSuggested).filter(Boolean); } export async function editChatFolder({ @@ -1038,6 +1061,8 @@ export function setDiscussionGroup({ export async function migrateChat(chat: ApiChat) { const result = await invokeRequest( new GramJs.messages.MigrateChat({ chatId: buildInputEntity(chat.id) as BigInt.BigInteger }), + undefined, + true, ); // `migrateChat` can return a lot of different update types according to docs, @@ -1156,6 +1181,20 @@ export function deleteChatMember(chat: ApiChat, user: ApiUser) { } } +export function toggleJoinToSend(chat: ApiChat, isEnabled: boolean) { + return invokeRequest(new GramJs.channels.ToggleJoinToSend({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + enabled: isEnabled, + }), true); +} + +export function toggleJoinRequest(chat: ApiChat, isEnabled: boolean) { + return invokeRequest(new GramJs.channels.ToggleJoinRequest({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + enabled: isEnabled, + }), true); +} + function preparePeers( result: GramJs.messages.Dialogs | GramJs.messages.DialogsSlice | GramJs.messages.PeerDialogs, ) { diff --git a/src/api/gramjs/methods/client.ts b/src/api/gramjs/methods/client.ts index 1995e6571..35728f906 100644 --- a/src/api/gramjs/methods/client.ts +++ b/src/api/gramjs/methods/client.ts @@ -312,6 +312,9 @@ export async function fetchCurrentUser() { const user = userFull.users[0]; + if (user.photo instanceof GramJs.Photo) { + localDb.photos[user.photo.id.toString()] = user.photo; + } localDb.users[buildApiPeerId(user.id, 'user')] = user; const currentUser = buildApiUserFromFull(userFull); diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index a2802b919..302ada0f3 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -19,7 +19,7 @@ export { getChatByUsername, togglePreHistoryHidden, updateChatDefaultBannedRights, updateChatMemberBannedRights, updateChatTitle, updateChatAbout, toggleSignatures, updateChatAdmin, fetchGroupsForDiscussion, setDiscussionGroup, migrateChat, openChatByInvite, fetchMembers, importChatInvite, addChatMembers, deleteChatMember, toggleIsProtected, - getChatByPhoneNumber, + getChatByPhoneNumber, toggleJoinToSend, toggleJoinRequest, } from './chats'; export { @@ -28,7 +28,8 @@ export { fetchWebPagePreview, editMessage, forwardMessages, loadPollOptionResults, sendPollVote, findFirstMessageIdAfterDate, fetchPinnedMessages, fetchScheduledHistory, sendScheduledMessages, rescheduleMessage, deleteScheduledMessages, reportMessages, sendMessageAction, fetchSeenBy, fetchSponsoredMessages, viewSponsoredMessage, fetchSendAs, - saveDefaultSendAs, fetchUnreadReactions, readAllReactions, fetchUnreadMentions, readAllMentions, closePoll, + saveDefaultSendAs, fetchUnreadReactions, readAllReactions, fetchUnreadMentions, readAllMentions, transcribeAudio, + closePoll, } from './messages'; export { @@ -58,6 +59,7 @@ export { fetchNotificationExceptions, fetchNotificationSettings, updateContactSignUpNotification, updateNotificationSettings, fetchLanguages, fetchLangPack, fetchPrivacySettings, setPrivacySettings, registerDevice, unregisterDevice, updateIsOnline, fetchContentSettings, updateContentSettings, fetchLangStrings, fetchCountryList, fetchAppConfig, + fetchGlobalPrivacySettings, updateGlobalPrivacySettings, } from './settings'; export { @@ -71,7 +73,7 @@ export { } from './bots'; export { - validateRequestedInfo, sendPaymentForm, getPaymentForm, getReceipt, + validateRequestedInfo, sendPaymentForm, getPaymentForm, getReceipt, fetchPremiumPromo, } from './payments'; export { diff --git a/src/api/gramjs/methods/management.ts b/src/api/gramjs/methods/management.ts index d5d230f48..6907c7cb0 100644 --- a/src/api/gramjs/methods/management.ts +++ b/src/api/gramjs/methods/management.ts @@ -49,9 +49,8 @@ export async function updatePrivateLink({ expireDate, })); - if (!result) { - return undefined; - } + // TODO Verify Exported Invite logic + if (!(result instanceof GramJs.ChatInviteExported)) return undefined; onUpdate({ '@type': 'updateChatFullInfo', @@ -76,7 +75,10 @@ export async function fetchExportedChatInvites({ if (!exportedInvites) return undefined; addEntitiesWithPhotosToLocalDb(exportedInvites.users); - return exportedInvites.invites.map(buildApiExportedInvite); + // TODO Verify Exported Invite logic + return (exportedInvites.invites + .filter((l) => l instanceof GramJs.ChatInviteExported) as GramJs.ChatInviteExported[]) + .map(buildApiExportedInvite); } export async function editExportedChatInvite({ @@ -90,6 +92,7 @@ export async function editExportedChatInvite({ isRequestNeeded?: boolean; title?: string; }) { + // TODO Verify Exported Invite logic const invite = await invokeRequest(new GramJs.messages.EditExportedChatInvite({ link, peer: buildInputPeer(peer.id, peer.accessHash), @@ -103,7 +106,7 @@ export async function editExportedChatInvite({ if (!invite) return undefined; addEntitiesWithPhotosToLocalDb(invite.users); - if (invite instanceof GramJs.messages.ExportedChatInvite) { + if (invite instanceof GramJs.messages.ExportedChatInvite && invite.invite instanceof GramJs.ChatInviteExported) { const replaceInvite = buildApiExportedInvite(invite.invite); return { oldInvite: replaceInvite, @@ -111,7 +114,9 @@ export async function editExportedChatInvite({ }; } - if (invite instanceof GramJs.messages.ExportedChatInviteReplaced) { + if (invite instanceof GramJs.messages.ExportedChatInviteReplaced + && invite.invite instanceof GramJs.ChatInviteExported + && invite.newInvite instanceof GramJs.ChatInviteExported) { const oldInvite = buildApiExportedInvite(invite.invite); const newInvite = buildApiExportedInvite(invite.newInvite); return { @@ -139,7 +144,8 @@ export async function exportChatInvite({ title, })); - if (!invite) return undefined; + // TODO Verify Exported Invite logic + if (!(invite instanceof GramJs.ChatInviteExported)) return undefined; return buildApiExportedInvite(invite); } diff --git a/src/api/gramjs/methods/media.ts b/src/api/gramjs/methods/media.ts index cec15d0b8..5db806a28 100644 --- a/src/api/gramjs/methods/media.ts +++ b/src/api/gramjs/methods/media.ts @@ -16,7 +16,9 @@ import localDb from '../localDb'; import * as cacheApi from '../../../util/cacheApi'; import { getEntityTypeById } from '../gramjsBuilders'; -const MEDIA_ENTITY_TYPES = new Set(['msg', 'sticker', 'gif', 'wallpaper', 'photo', 'webDocument', 'document']); +const MEDIA_ENTITY_TYPES = new Set([ + 'msg', 'sticker', 'gif', 'wallpaper', 'photo', 'webDocument', 'document', 'videoAvatar', +]); export default async function downloadMedia( { @@ -31,6 +33,7 @@ export default async function downloadMedia( const { data, mimeType, fullSize, } = await download(url, client, isConnected, onProgress, start, end, mediaFormat, isHtmlAllowed) || {}; + if (!data) { return undefined; } @@ -62,7 +65,7 @@ export default async function downloadMedia( export type EntityType = ( 'msg' | 'sticker' | 'wallpaper' | 'gif' | 'channel' | 'chat' | 'user' | 'photo' | 'stickerSet' | 'webDocument' | - 'document' | 'staticMap' + 'document' | 'staticMap' | 'videoAvatar' ); async function download( @@ -127,6 +130,7 @@ async function download( case 'wallpaper': entity = localDb.documents[entityId]; break; + case 'videoAvatar': case 'photo': entity = localDb.photos[entityId]; break; @@ -159,22 +163,27 @@ async function download( if (entity instanceof GramJs.Message) { mimeType = getMessageMediaMimeType(entity, sizeType); if (entity.media instanceof GramJs.MessageMediaDocument && entity.media.document instanceof GramJs.Document) { - fullSize = entity.media.document.size; + fullSize = entity.media.document.size.toJSNumber(); } if (entity.media instanceof GramJs.MessageMediaWebPage && entity.media.webpage instanceof GramJs.WebPage && entity.media.webpage.document instanceof GramJs.Document) { - fullSize = entity.media.webpage.document.size; + fullSize = entity.media.webpage.document.size.toJSNumber(); } } else if (entity instanceof GramJs.Photo) { - mimeType = 'image/jpeg'; + if (entityType === 'videoAvatar') { + mimeType = 'video/mp4'; + } else { + mimeType = 'image/jpeg'; + } } else if (entityType === 'sticker' && sizeType) { mimeType = 'image/webp'; } else if (entityType === 'webDocument') { mimeType = (entity as GramJs.TypeWebDocument).mimeType; + fullSize = (entity as GramJs.TypeWebDocument).size; } else { mimeType = (entity as GramJs.Document).mimeType; - fullSize = (entity as GramJs.Document).size; + fullSize = (entity as GramJs.Document).size.toJSNumber(); } // Prevent HTML-in-video attacks @@ -296,7 +305,8 @@ export function parseMediaUrl(url: string) { : url.startsWith('webDocument') ? url.match(/(webDocument):(.+)/) : url.match( - /(avatar|profile|photo|msg|stickerSet|sticker|wallpaper|gif|document)([-\d\w./]+)(?::\d+)?(\?size=\w+)?/, + // eslint-disable-next-line max-len + /(avatar|profile|photo|msg|stickerSet|sticker|wallpaper|gif|document|videoAvatar)([-\d\w./]+)(?::\d+)?(\?size=\w+)?/, ); if (!mediaMatch) { return undefined; diff --git a/src/api/gramjs/methods/messages.ts b/src/api/gramjs/methods/messages.ts index 4e22d3f4a..1f8062725 100644 --- a/src/api/gramjs/methods/messages.ts +++ b/src/api/gramjs/methods/messages.ts @@ -1431,3 +1431,25 @@ export async function fetchUnreadReactions({ chats, }; } + +export async function transcribeAudio({ + chat, messageId, +}: { + chat: ApiChat; messageId: number; +}) { + const result = await invokeRequest(new GramJs.messages.TranscribeAudio({ + msgId: messageId, + peer: buildInputPeer(chat.id, chat.accessHash), + })); + + if (!result) return undefined; + + onUpdate({ + '@type': 'updateTranscribedAudio', + isPending: result.pending, + transcriptionId: result.transcriptionId.toString(), + text: result.text, + }); + + return result.transcriptionId.toString(); +} diff --git a/src/api/gramjs/methods/payments.ts b/src/api/gramjs/methods/payments.ts index 936fef336..65838cf56 100644 --- a/src/api/gramjs/methods/payments.ts +++ b/src/api/gramjs/methods/payments.ts @@ -1,9 +1,16 @@ import BigInt from 'big-integer'; import { Api as GramJs } from '../../../lib/gramjs'; import { invokeRequest } from './client'; -import { buildInputPeer, buildShippingInfo } from '../gramjsBuilders'; -import { buildShippingOptions, buildPaymentForm, buildReceipt } from '../apiBuilders/payments'; -import type { ApiChat, OnApiUpdate } from '../../types'; +import { buildInputInvoice, buildInputPeer, buildShippingInfo } from '../gramjsBuilders'; +import { + buildShippingOptions, buildPaymentForm, buildReceipt, buildApiPremiumPromo, buildApiInvoiceFromForm, +} from '../apiBuilders/payments'; +import type { + ApiChat, OnApiUpdate, ApiRequestInputInvoice, +} from '../../types'; +import localDb from '../localDb'; +import { addEntitiesWithPhotosToLocalDb } from '../helpers'; +import { buildApiUser } from '../apiBuilders/users'; let onUpdate: OnApiUpdate; @@ -12,13 +19,11 @@ export function init(_onUpdate: OnApiUpdate) { } export async function validateRequestedInfo({ - chat, - messageId, + inputInvoice, requestInfo, shouldSave, }: { - chat: ApiChat; - messageId: number; + inputInvoice: ApiRequestInputInvoice; requestInfo: GramJs.TypePaymentRequestedInfo; shouldSave?: boolean; }): Promise<{ @@ -26,8 +31,7 @@ export async function validateRequestedInfo({ shippingOptions: any; } | undefined> { const result = await invokeRequest(new GramJs.payments.ValidateRequestedInfo({ - peer: buildInputPeer(chat.id, chat.accessHash), - msgId: messageId, + invoice: buildInputInvoice(inputInvoice), save: shouldSave || undefined, info: buildShippingInfo(requestInfo), })); @@ -47,15 +51,13 @@ export async function validateRequestedInfo({ } export async function sendPaymentForm({ - chat, - messageId, + inputInvoice, formId, requestedInfoId, shippingOptionId, credentials, }: { - chat: ApiChat; - messageId: number; + inputInvoice: ApiRequestInputInvoice; formId: string; credentials: any; requestedInfoId?: string; @@ -63,8 +65,7 @@ export async function sendPaymentForm({ }) { const result = await invokeRequest(new GramJs.payments.SendPaymentForm({ formId: BigInt(formId), - peer: buildInputPeer(chat.id, chat.accessHash), - msgId: messageId, + invoice: buildInputInvoice(inputInvoice), requestedInfoId, shippingOptionId, credentials: new GramJs.InputPaymentCredentials({ @@ -85,22 +86,23 @@ export async function sendPaymentForm({ return Boolean(result); } -export async function getPaymentForm({ - chat, messageId, -}: { - chat: ApiChat; - messageId: number; -}) { +export async function getPaymentForm(inputInvoice: ApiRequestInputInvoice) { const result = await invokeRequest(new GramJs.payments.GetPaymentForm({ - peer: buildInputPeer(chat.id, chat.accessHash), - msgId: messageId, + invoice: buildInputInvoice(inputInvoice), })); if (!result) { return undefined; } - return buildPaymentForm(result); + if (result.photo) { + localDb.webDocuments[result.photo.url] = result.photo; + } + + return { + form: buildPaymentForm(result), + invoice: buildApiInvoiceFromForm(result), + }; } export async function getReceipt(chat: ApiChat, msgId: number) { @@ -114,3 +116,22 @@ export async function getReceipt(chat: ApiChat, msgId: number) { return buildReceipt(result); } + +export async function fetchPremiumPromo() { + const result = await invokeRequest(new GramJs.help.GetPremiumPromo()); + if (!result) return undefined; + + addEntitiesWithPhotosToLocalDb(result.users); + + const users = result.users.map(buildApiUser).filter(Boolean); + result.videos.forEach((video) => { + if (video instanceof GramJs.Document) { + localDb.documents[video.id.toString()] = video; + } + }); + + return { + promo: buildApiPremiumPromo(result), + users, + }; +} diff --git a/src/api/gramjs/methods/settings.ts b/src/api/gramjs/methods/settings.ts index 38e1cb1a5..4eb73f604 100644 --- a/src/api/gramjs/methods/settings.ts +++ b/src/api/gramjs/methods/settings.ts @@ -492,3 +492,33 @@ export async function fetchCountryList({ langCode = 'en' }: { langCode?: LangCod } return buildApiCountryList(countryList.countries); } + +export async function fetchGlobalPrivacySettings() { + const result = await invokeRequest(new GramJs.account.GetGlobalPrivacySettings()); + + if (!result) { + return undefined; + } + + return { + shouldArchiveAndMuteNewNonContact: Boolean(result.archiveAndMuteNewNoncontactPeers), + }; +} + +export async function updateGlobalPrivacySettings({ shouldArchiveAndMuteNewNonContact } : { + shouldArchiveAndMuteNewNonContact: boolean; +}) { + const result = await invokeRequest(new GramJs.account.SetGlobalPrivacySettings({ + settings: new GramJs.GlobalPrivacySettings({ + archiveAndMuteNewNoncontactPeers: shouldArchiveAndMuteNewNonContact, + }), + })); + + if (!result) { + return undefined; + } + + return { + shouldArchiveAndMuteNewNonContact: Boolean(result.archiveAndMuteNewNoncontactPeers), + }; +} diff --git a/src/api/gramjs/methods/symbols.ts b/src/api/gramjs/methods/symbols.ts index 6d1f736b3..d8d7fa04c 100644 --- a/src/api/gramjs/methods/symbols.ts +++ b/src/api/gramjs/methods/symbols.ts @@ -70,6 +70,7 @@ export async function fetchFeaturedStickers({ hash = '0' }: { hash?: string }) { return { hash: String(result.hash), + isPremium: Boolean(result.premium), sets: result.sets.map(buildStickerSetCovered), }; } diff --git a/src/api/gramjs/methods/users.ts b/src/api/gramjs/methods/users.ts index 647063b32..76f12156c 100644 --- a/src/api/gramjs/methods/users.ts +++ b/src/api/gramjs/methods/users.ts @@ -19,6 +19,7 @@ import { buildApiChatFromPreview } from '../apiBuilders/chats'; import { buildApiPhoto } from '../apiBuilders/common'; import { addEntitiesWithPhotosToLocalDb, addPhotoToLocalDb, addUserToLocalDb } from '../helpers'; import { buildApiPeerId } from '../apiBuilders/peers'; +import localDb from '../localDb'; let onUpdate: OnApiUpdate; @@ -44,6 +45,18 @@ export async function fetchFullUser({ return; } + if (fullInfo.fullUser.profilePhoto instanceof GramJs.Photo) { + localDb.photos[fullInfo.fullUser.profilePhoto.id.toString()] = fullInfo.fullUser.profilePhoto; + } + + const botInfo = fullInfo.fullUser.botInfo; + if (botInfo?.descriptionPhoto instanceof GramJs.Photo) { + localDb.photos[botInfo.descriptionPhoto.id.toString()] = botInfo.descriptionPhoto; + } + if (botInfo?.descriptionDocument instanceof GramJs.Document) { + localDb.documents[botInfo.descriptionDocument.id.toString()] = botInfo.descriptionDocument; + } + const userWithFullInfo = buildApiUserFromFull(fullInfo); onUpdate({ diff --git a/src/api/gramjs/updater.ts b/src/api/gramjs/updater.ts index 60475114e..e1ae999f1 100644 --- a/src/api/gramjs/updater.ts +++ b/src/api/gramjs/updater.ts @@ -194,6 +194,7 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { if (action instanceof GramJs.MessageActionPaymentSent) { onUpdate({ '@type': 'updatePaymentStateCompleted', + slug: action.invoiceSlug, }); } else if (action instanceof GramJs.MessageActionChatEditTitle) { onUpdate({ @@ -559,7 +560,7 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { }); } else if (update instanceof GramJs.UpdateDialogFilter) { const { id, filter } = update; - const folder = filter ? buildApiChatFolder(filter) : undefined; + const folder = filter instanceof GramJs.DialogFilter ? buildApiChatFolder(filter) : undefined; onUpdate({ '@type': 'updateChatFolder', @@ -941,7 +942,10 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { queryId: queryId.toString(), }); } else if (update instanceof GramJs.UpdateBotMenuButton) { - const { botId, button } = update; + const { + botId, + button, + } = update; const id = buildApiPeerId(botId, 'user'); @@ -950,6 +954,27 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { botId: id, button: buildApiBotMenuButton(button), }); + } else if (update instanceof GramJs.UpdateTranscribedAudio) { + // eslint-disable-next-line no-underscore-dangle + const entities = update._entities; + if (entities) { + addEntitiesWithPhotosToLocalDb(entities); + dispatchUserAndChatUpdates(entities); + } + + onUpdate({ + '@type': 'updateTranscribedAudio', + transcriptionId: update.transcriptionId.toString(), + text: update.text, + isPending: update.pending, + }); + } else if (update instanceof GramJs.UpdateConfig) { + // eslint-disable-next-line no-underscore-dangle + const entities = update._entities; + if (entities) { + addEntitiesWithPhotosToLocalDb(entities); + dispatchUserAndChatUpdates(entities); + } } else if (DEBUG) { const params = typeof update === 'object' && 'className' in update ? update.className : update; // eslint-disable-next-line no-console diff --git a/src/api/types/bots.ts b/src/api/types/bots.ts index 13a54c40b..364188e2d 100644 --- a/src/api/types/bots.ts +++ b/src/api/types/bots.ts @@ -1,4 +1,5 @@ import type { + ApiDimensions, ApiPhoto, ApiSticker, ApiThumbnail, ApiVideo, } from './messages'; @@ -9,7 +10,10 @@ export type ApiInlineResultType = ( export interface ApiWebDocument { url: string; + size: number; mimeType: string; + accessHash?: string; + dimensions?: ApiDimensions; } export interface ApiBotInlineResult { @@ -60,6 +64,8 @@ export type ApiBotMenuButton = ApiBotMenuButtonWebApp | ApiBotMenuButtonCommands export interface ApiBotInfo { botId: string; commands?: ApiBotCommand[]; - description: string; + description?: string; + photo?: ApiPhoto; + gif?: ApiVideo; menuButton: ApiBotMenuButton; } diff --git a/src/api/types/chats.ts b/src/api/types/chats.ts index 4443488a8..2fa707ff2 100644 --- a/src/api/types/chats.ts +++ b/src/api/types/chats.ts @@ -27,6 +27,7 @@ export interface ApiChat { hasPrivateLink?: boolean; accessHash?: string; isMin?: boolean; + hasVideoAvatar?: boolean; avatarHash?: string; username?: string; membersCount?: number; @@ -65,6 +66,8 @@ export interface ApiChat { typingStatus?: ApiTypingStatus; joinRequests?: ApiChatInviteImporter[]; + isJoinToSend?: boolean; + isJoinRequest?: boolean; sendAsIds?: string[]; unreadReactions?: number[]; @@ -105,6 +108,7 @@ export interface ApiChatFullInfo { requestsPending?: number; statisticsDcId?: number; stickerSet?: ApiStickerSet; + profilePhoto?: ApiPhoto; } export interface ApiChatMember { diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index fd8daac6a..7c189213a 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -1,4 +1,6 @@ +import type { ApiWebDocument } from './bots'; import type { ApiGroupCall, PhoneCallAction } from './calls'; +import type { ApiChat } from './chats'; export interface ApiDimensions { width: number; @@ -9,6 +11,12 @@ export interface ApiPhotoSize extends ApiDimensions { type: 's' | 'm' | 'x' | 'y' | 'z'; } +export interface ApiVideoSize extends ApiDimensions { + type: 'u' | 'v'; + videoStartTs: number; + size: number; +} + export interface ApiThumbnail extends ApiDimensions { dataUri: string; } @@ -16,7 +24,9 @@ export interface ApiThumbnail extends ApiDimensions { export interface ApiPhoto { id: string; thumbnail?: ApiThumbnail; + isVideo?: boolean; sizes: ApiPhotoSize[]; + videoSizes?: ApiVideoSize[]; blobUrl?: string; } @@ -31,6 +41,7 @@ export interface ApiSticker { height?: number; thumbnail?: ApiThumbnail; isPreloadedGlobally?: boolean; + hasEffect?: boolean; } export interface ApiStickerSet { @@ -134,16 +145,31 @@ export interface ApiPoll { }; } +// First type used for state, second - for API requests +export type ApiInputInvoice = { + chatId: string; + messageId: number; +} | { + slug: string; +}; + +export type ApiRequestInputInvoice = { + chat: ApiChat; + messageId: number; +} | { + slug: string; +}; + export interface ApiInvoice { text: string; title: string; - photoUrl?: string; - photoWidth?: number; - photoHeight?: number; + photo?: ApiWebDocument; amount: number; currency: string; receiptMsgId?: number; isTest?: boolean; + isRecurring?: boolean; + recurringTermsUrl?: string; } interface ApiGeoPoint { @@ -321,6 +347,8 @@ export interface ApiMessage { isFromScheduled?: boolean; seenByUserIds?: string[]; isProtected?: boolean; + transcriptionId?: string; + isTranscriptionError?: boolean; reactors?: { nextOffset?: string; count: number; @@ -350,12 +378,15 @@ export interface ApiReactionCount { export interface ApiAvailableReaction { selectAnimation?: ApiDocument; + activateAnimation?: ApiDocument; + effectAnimation?: ApiDocument; staticIcon?: ApiDocument; centerIcon?: ApiDocument; aroundAnimation?: ApiDocument; reaction: string; title: string; isInactive?: boolean; + isPremium?: boolean; } export interface ApiThreadInfo { @@ -374,6 +405,7 @@ export type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'faile export type ApiSponsoredMessage = { chatId?: string; randomId: string; + isRecommended?: boolean; isBot?: boolean; channelPostId?: number; startParam?: string; @@ -446,6 +478,12 @@ interface ApiKeyboardButtonUrlAuth { buttonId: number; } +export type ApiTranscription = { + text: string; + isPending?: boolean; + transcriptionId: string; +}; + export type ApiKeyboardButton = ( ApiKeyboardButtonSimple | ApiKeyboardButtonReceipt @@ -484,6 +522,7 @@ export type ApiThemeParameters = { link_color: string; button_color: string; button_text_color: string; + secondary_bg_color: string; }; export const MAIN_THREAD_ID = -1; diff --git a/src/api/types/misc.ts b/src/api/types/misc.ts index 345f7d4c4..48f8fc537 100644 --- a/src/api/types/misc.ts +++ b/src/api/types/misc.ts @@ -1,5 +1,6 @@ import type { ApiDocument, ApiPhoto } from './messages'; import type { ApiUser } from './users'; +import type { ApiLimitType } from '../../global/types'; export interface ApiInitialArgs { userAgent: string; @@ -93,7 +94,11 @@ export type ApiNotifyException = { export type ApiNotification = { localId: string; + title?: string; message: string; + actionText?: string; + action: VoidFunction; + className?: string; }; export type ApiError = { @@ -161,6 +166,10 @@ export interface ApiAppConfig { autologinDomains: string[]; autologinToken: string; urlAuthDomains: string[]; + premiumInvoiceSlug: string; + premiumBotUsername: string; + isPremiumPurchaseBlocked: boolean; + limits: Record; } export interface GramJsEmojiInteraction { diff --git a/src/api/types/payments.ts b/src/api/types/payments.ts index c3fe6cc1e..a160dde9a 100644 --- a/src/api/types/payments.ts +++ b/src/api/types/payments.ts @@ -1,3 +1,5 @@ +import type { ApiDocument, ApiMessageEntity } from './messages'; + export interface ApiShippingAddress { streetLine1: string; streetLine2: string; @@ -61,3 +63,12 @@ export interface ApiReceipt { shippingPrices?: ApiLabeledPrice[]; shippingMethod?: string; } + +export interface ApiPremiumPromo { + currency: string; + monthlyAmount: string; + videoSections: string[]; + videos: ApiDocument[]; + statusText: string; + statusEntities: ApiMessageEntity[]; +} diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts index dc43c88a7..5a5d10f5e 100644 --- a/src/api/types/updates.ts +++ b/src/api/types/updates.ts @@ -412,6 +412,7 @@ export type ApiUpdatePaymentVerificationNeeded = { export type ApiUpdatePaymentStateCompleted = { '@type': 'updatePaymentStateCompleted'; + slug?: string; }; export type ApiUpdatePrivacy = { @@ -516,6 +517,13 @@ export type ApiUpdateBotMenuButton = { button: ApiBotMenuButton; }; +export type ApiUpdateTranscribedAudio = { + '@type': 'updateTranscribedAudio'; + transcriptionId: string; + text: string; + isPending?: boolean; +}; + export type ApiUpdate = ( ApiUpdateReady | ApiUpdateSession | ApiUpdateAuthorizationState | ApiUpdateAuthorizationError | ApiUpdateConnectionState | ApiUpdateCurrentUser | @@ -539,7 +547,7 @@ export type ApiUpdate = ( ApiUpdateGroupCallConnectionState | ApiUpdateGroupCallLeavePresentation | ApiUpdateGroupCallChatId | ApiUpdatePendingJoinRequests | ApiUpdatePaymentVerificationNeeded | ApiUpdatePaymentStateCompleted | ApiUpdatePhoneCall | ApiUpdatePhoneCallSignalingData | ApiUpdatePhoneCallMediaState | - ApiUpdatePhoneCallConnectionState | ApiUpdateBotMenuButton + ApiUpdatePhoneCallConnectionState | ApiUpdateBotMenuButton | ApiUpdateTranscribedAudio ); export type OnApiUpdate = (update: ApiUpdate) => void; diff --git a/src/api/types/users.ts b/src/api/types/users.ts index 2e36fdcb6..7ea24dcd8 100644 --- a/src/api/types/users.ts +++ b/src/api/types/users.ts @@ -6,6 +6,7 @@ export interface ApiUser { isMin: boolean; isSelf?: true; isVerified?: true; + isPremium?: boolean; isContact?: true; type: ApiUserType; firstName?: string; @@ -14,6 +15,7 @@ export interface ApiUser { username: string; phoneNumber: string; accessHash?: string; + hasVideoAvatar?: boolean; avatarHash?: string; photos?: ApiPhoto[]; botPlaceholder?: string; @@ -36,6 +38,7 @@ export interface ApiUserFullInfo { commonChatsCount?: number; pinnedMessageId?: number; botInfo?: ApiBotInfo; + profilePhoto?: ApiPhoto; } export type ApiFakeType = 'fake' | 'scam'; @@ -51,9 +54,13 @@ export interface ApiUserStatus { expires?: number; } +export type ApiAttachMenuPeerType = 'self' | 'bot' | 'private' | 'chat' | 'channel'; + export interface ApiAttachMenuBot { id: string; + hasSettings?: boolean; shortName: string; + peerTypes: ApiAttachMenuPeerType[]; icons: ApiAttachMenuBotIcon[]; } diff --git a/src/assets/fonts/icomoon.woff b/src/assets/fonts/icomoon.woff index ff124f775dfd14bc8ecfdd74a11c6a387046770b..5ad06c7c3681c1ac283e0cf18830b067db41a6d0 100644 GIT binary patch delta 3595 zcma)9eQX>@6`$Fe-Py0X-M!lnpX0NAxA9$VN9Xf>2HQ!T#4&L`)TW7@78OUf)7FBd zElOHS`p1USqN=KdDyvobk5D0KOi6`FfvBJYS4&F{T8_u&=kwf{)|7jK@PMi{~M(k;k{-xT4Mg$w?ZTQbobOD7lZ zLkKTJ#}Prn+;6LQFPsv*m!Pe7$iDl;m+k`ID+v8yO3<_SUtC$fbKy8bFAABap#Jk; z`}Hy~fj0^5&4Sn~^q%FDrym3!$Vx8@y7)uTCyJ2oqm= z3dkQs zk6P8wVR%57{1KZeg;KG;18)~vJSXW6$=~=u5cSMXw+qupvfTr^EmICG;NU9>$CL@- zSN}BcaXUS4r+stYH{-7~o?f-n9bU9npY(+MC(a#;3zVhkA z8>;=>Ez|E!AMS3y1j;-PYR%35x?b+BdYpS#x-|`S&MFEeY2LmpcxxYg>oF1?y!KDB zMy5~|p_WtccmjOV@ecT@0}6W!K#^GSX;2`&P^V*+1;uo87SU{|{c3bsEcHOeDhC zV3f~e40~BE<2{ozSuZpsiht1<8QJ5y#{}yJpG@vupJRP|GF-2f(e=QdL1#W8u%j5+ zz5=^8BHREj+JQ^OW~=G<3FLztEgTHQ03XHz{Pm^)cB5W|rXoNPhlB`+SV;KMtHoIV zc&N8&q$?)R>5Ge6j&n&leOi$?&uNQ`fJu|EQ>XA&5eIMC>COG8?Nq^UamP2g|EZx? zbKgLC+T<5LQ3UKYbGjz;M;?Jm^ql$hQ!oik{b=+k%%b%3r=I2l`5rHX>%%O zM?{S`v~{KxPTDON@ECSyuYEwyl6iCsdI+3c^=s?M3w(DYc_a|r0HbL8u2&Hv8*x*N z5?BI2*8?ocMC=szk8v#lvnk7_5qjB~N&HYUv7xkA6qu(g^S0|V8p%Wj<)Pci zm(xy0Nd=6^i7gU%8>0Lmnu^m<1APvmjL6TBlAG09J_++As>^s755@6a#_O&t76d{? zbmPWEr%!mhSP1j$QO_cg46fU@jhx?@=T!IfROm{NyJ1RqbC`YW4CG>oq`xybX2WRcDOgyV9(j1ATwW@FrECpbmQ}1& zj#nzhrD6uIVy86<9YfaW6W57GA0sQhHZlS_m&)aMY@%+dqc3TV#uJWSy;v^aAnCf9 z;$la#B$iPch1o4@G{M!|*M36=Ni+;`Jf9>>$a>pF(H8}-QxQfXne|{VaD6Y1#H6GM zP(jfXB?U%^bXWsS)|-vi1RjM-Q-@rdfinUGwW$4$tKi*1mNL^;^L;q%%c~Y=G#m6% z77?b)R8y(O`obbL92ZJK`$y%f5u^-S4EvZyRgKCzBaDVW33_@0An8&j%j~>LB#Eeb zn`JYbsX_rOD!s$hDZmrH+)V`|s2HjwsYWF*3Y%P&sg6NY>K*W*Q7X~FtC80eU?kLD zgD0EkencR9`nz(A<<(EoFrT=DSWWg+O{hQDA@3 zWzKYyz+#Lj} zN<7EOQKlWO*SBd_X0-pv_%6Sv#1u`}tyFqzKD&GD1{R$9ELGP>!Z6xG&Lm%3hMXKB zt~1n_&_L4>NmVQ{x>e}fJwCq6%fNoY%{H0IdZ0Ryn2@k)O% zH9j{!74%oQU>E~g+ZijBww&GHXzX`}y63uw95S2mPNasrL40C&S6_wegy_7|*R^{B zMt2XVP9%!kZ_YLL`}-Sn82)<@G>pDS-jG&N9u1&FD`&qPMxzibtpNcrnv*Q0laNH* z!PYyF9*cm zr}(|{jpthUg|&B{i=>?hx)*_FftEXT5Z*N)(RUU|v~LG`8|WC&WuP~Kh6SxHe|HiO z9WoC+ap>Q-K78w|hkFly|H$##?%5aTrsiHfI(GE@ZR%|gf2IKH#L`|^yY&3e@&5pq ClnZbG delta 339 zcmcccgXzybCXsS~H#Y`G1|V2p!@v!u4JL|c*B?vHO)OwwV9Wptg@CYl*k!f!#A1-x z9w46siUrbhD${^sM;I8E?*QRXSrw}?QWH}c7*^H*)tG^>!mRzh89+gx*cKpP1%%m; zuq0*VmQ(=6ZZI$~O#tE68!jty@{@t;?A8D+X7mDK7ip<2xrr4(i`RlQD}eDP#yfe5 zxv4<0D?l}EAUxBH^LIghaS6~TF%$pzGtQsv!|2U8fAb7R#f6(sZgODWe0Omhvm#I_ z1H@v6tYDVl3Bh-Ont;YJEZN+*>kuOV^DSRp diff --git a/src/assets/fonts/icomoon.woff2 b/src/assets/fonts/icomoon.woff2 index 7b711129fd9dad683efe4885f08e8191c155fa7f..62d7a4a6e0fe1dff665726fea91d391311faef5b 100644 GIT binary patch literal 22648 zcmV(_K-9l?Pew8T0RR9109bec4FCWD0K_Z+09YIV0RR9100000000000000000000 z0000#Mn+Uk92y=5U;u(%5eN!`=s1FtR11P+00A}vBm;#c1Rw>28wZVZ8-JHoMum+7 z2*JbqBdTauZd3#t2LNsE?Ck%~3o^$2R@_1WL4m>~vCwVM5R{fpccmQ;H#A-5JcGsu z90lm5b87BN->1&^HKQet1>wKnrLvM|VB5%_TGACxJn5K)OAafo0z$(`k3+ z(rO-%G84oHgY!a*D_Op=3zxbw;Nun9GOrGR9)YV&x^Gi7b$q}5J`QHP6v8$V`p zjUe&yI5a(GK!@nm!C7C8JO6PyO}Ktgi9T@0qZ^DaP#y!R8RFCyjw~VnogqMiOeIj% z2__fM70ltJ{2ytKOvgHelZ0ecB_V?8@N>pgY0A4TSV0GaNg0Q6TCPf!Y@r7zsL)JM zMmmm#<_g{?NDUFzIabfanukN~zY1ezd~swPyI z_0DR5#B|5uSZjjke5{MEot2_)`^WC(?4MM;OaLmWwlf9f{bn8@sDy1CDQ+9S4WP4x z?<*)RD3XJi50D7wVsQkLNN~9=C4myaMXDYQq?*%HXn*H|JI|L9W-gbO zJ}gSYkrmCXX#4g)FO^lUtVAN}5}|2s0Af(9rH6Xcqp9EjdOn%@R*+RZ?5|{*9;a$j8c6kMRMWKI9!q*O8NdFXR-9{GTr@f33A;d-#8MqG z1p~vSWD*A%tJTW2PODQ&wYDn#UZb%^XXctbtyTXLgHVDLMkxJBcJc6F3ll;UI$(@@ zt{V~te`ydcyKyu;)AQpAl`>Qr;}#JS-nJDUh+MT$6p`cg({Rd|h=P3@3f$`#X|O~y za)W7wYS}lpmxWGfDhT|zb$nHXvJmsNB80RD9)WB00u;gnOX?jJ!QB|Tn5r1Q5ix;%uF?$jGCz^rx7_;Onni+UZFQ2k^o7fDZpv5CCF+$Vj@DG zkP(QoDv098cd7%FRqkMu!;zx11p|kVm$Nc>jwuBj(7G zqWId8$lMk>xhw4fWo~YrA9oa!lR+%zmWe!w88=AK86)f3FUBG7gow~jW#pYSf zOtPyuD}ZiivR<-t3}}W$!wM(!L!EirurJ^q{t(b$j$8)oKb3rkM6BvH;$(Ao!nO#d z+YjfN#U^%7V+;qdEMl4_-f9?rS-X0cDY zgQAzl4~e38I9XkqHdgc z$gFb}YJ*t`Pl`0%&MfPcJMd6K8m`AQJs{8q-i}EM3WU$O zyfQrqR$-o(0_UD~#u8{Y4E#dYomd-|X78I%KOXWMDJywi7${J0 ziXgNDp%AKQn$_^CYDg&U6;o9REpL@lI_#QKzUk>SxFsyig-~>`%7!jZE$=PHH+ZJU zZPKQ*I3)lT;{(4@y_CuH;f_>e3Va++G<^lsSPwok_r`6vZSJPosLB`-iVp1A8U$Z5 zy&0<_JSoV@gVqJ&ctp}$D6-U0lI5&hBd{ade~KBpQa zD16Fe&?TM{wT6s6FPBCr}6L1PvUYWK-=YSV7vcn9x>>GRw=Nfhq$W3ei#I2AKh{pke@zotaaF znv=olCT=AgAOS0c>wHCep1>>&b2g>$m=h%xri3CsZzk?BKdow*QYbQ(O-7%`O9K#% z|6^4QgOiQMlZu_{8<8S=K#6FB36qbUZ(R4=^~mLB^v~gGV>+UU2IGbNKFYL91gJ~y zDGwO?TWNyFcx5;VzTK&!GHMc9uvyO7mg#kocejO`PQMI)P%XFSAUv)yE+HA{2IC+1 zCfOG3ZsS>VkSIdKD@dz!N_I1a290>T*BGAz-(An;V85eXmWGF|oz6R*Z<#P#%TieL z4Qk)BS&2@11OVWQKC--GXX$ucn~ujg^1W5Ox+Rt%f>#es`G!at!mzG~0p>{hdmp$^ zTG(5JZk8DpIbB{@;Rd(SjrImk*Be;fFdmVCkcWqywNSs=-BdB`FZqn}{UMz|^Lkx} zts4e@)DM;Y{;==^<6%EEZdU1D(YV)s0l5)vJYG48I6<$2)#sdSK%dUTKR zA+))&{)q9!CG6X)S29q99;c5H2%!!RYyD32`Z(g|eF%1M9g@p)7I)+b4C4~d&MNn; z8f+8_22tjmKt3w2K1t*8}>FoJAxkBX;85I8x`DJcV6(mBJoyoy8znBO>>NGYA1c9AH4j_# zi;+Q937v(eKF{M*?F9bBU6(T&RoK>vVS(I_F|LPXUk0j1w|8UE?hkgB$e7^0+SQc^%bn1^3J0`jo(r11?7u_TM} zh@69Dq0(clqsdf0r4ZSCU~r-hdpSwCMY%kY14rN)`H*UaD!)}$9Bf`{cLu+S=@o0k7xCG@Ois2KETPwo7;vLl+BF(L0b{f zpVPZ^MO#l>gY`JKu)m}f?|dMqDahIKiMe8|a$)H$(O^nSGnTWT<=mj;ROHton(>4x zKSIaLQ`+a`8Pz`t*KS@FJG-1t=M}=uGoSxv&ZF z)}9JoatQ&zjz-BL!$%Cnim=U?k6Dx_RhR`+v6iTiN_0xK%v6j|(~vkLig)YBiAlPZ zzpnt!AQhp)FwAAG#aXgr%radEEj3aSa7nA$2lcKcnA>@&n)R>>hSh^9e?eB6!gZ=%Fv?hPxl zfWUb}tT$1<36Bok3 z87z=66-+C&wv)1ZW-7zD+Zvq`Fg?+`*eVqN{X>_+MVDuz2hEB1D6l}R#j!us6zn? zCbn4#@hf`!VLKp9Mx;Kmu0LVu81KPs*>SOVx1fMa<4&Y10a8CmgH$$WWV-#;iHLY|I%?k)hk1cp=?vAh{clr&c*%|JO`BizjClHD znBJNe;9CI*@nGq*ZwlZk>#0`&qFDN4#v43p_bE>R*%z&-fc}ylNF>J|@DhLR^@KbY z&s+?1XJVP$A`KQUCZ7VF5UGvz>?@E5W34#nbt|0@KIWOPU`9|7FxX7u8k}b9(uT}t zWq@>;SSqVJR_u?sQr5^izsEnMbWT9_ko%uX;+3ut_A|>jx7BM?Mpx8Kl9HhUEG23w zXK(q~X84_Hh4A5cyJ?dB1Gz~4NgA0vas#em{uzY%f;J93^G39w#Og%gUVGFsO{F1^ zAS|oOo~J-S&f^R}9g&Y73ozuJGayNR9x8KDhVX_qmC`7w{R)=vbtZR}|2PM7aw3`) z`g(C(dryO@X~ksdCX*YQWThI46~e&Whe_)*_2rltUyps)Ivw4u^@d#XECX+kH)2+! z7{KRavATc2Z&|V`RA+1`*J#QO#=20IT*F9Cs|%-*BO8nFAl5IK_XTXvT~CGpJ13a> zL%LQ7`p70oqbwFWS&Cfr2Gmx~ZzI?U$#q#Eb7ELg&;+VGF;lg?fc6$FY>PYjo-$#q zJjj|yW@o1>lc*7UIbVf#zczNx*hJDwoM4(bC+V_)^=C#S;2gF?MIN9Do?~8KG*nD@ z{Whh>q{AwMZbW!HN&H!!uye6bo(2|g7O}sZaIPcm__Mz{tUaNrx2>~ zZ*Mv^f-rqs|vUNDCIfT0A6R)|0;WkK7*ajbAu(jq!=;e85aWe3D*jCD;Wgl)zSyy(u^xj8_w>TH$Oy(`bvc@i->UXv7*!o;1NL>|$JLwuuYJ(8qWRo(FFqSyS%{5VCB>MYV;+A#?>z{#HBDa+zvhokMz9e8ScHy+#y0r z7>4kwZ<-B(m!Ku;uEFodk-=&)ZGnAuGudgYbUtXt_(hQ#iOQUU$%)?r6=d>De1(f8 zVmzRpKH;AyMPk31(rL@hyt;E)<1i-2zEgzOFR939KQV5Xt&`lFxGKDvq_>qMs zD;ML6Kq6LzkQ$hUI15m6=5IY91E; z5G6x=QNdWjlfzaPBTdf{+H56Y6)CCEp;DOhn`u0lh*d_P*XlGas&@E5%tl})oLv(w zm(Zy=X6`zE$uv^58UT_J@WQ3YdXb_C5j`%2@C^7+BYm)M_nYW!`x#SZAyuFZqdBu`DI@Zl zc&}38Uh#3IHl#dzZ9VWR^rFVcSQcmgHP|%$v}BX!to6!zGrrXVY!A+u;<&Bz0_b*g z$ckUNvZ5m{z|t-8sB!2Ps=0AOlr!U3VY{v*w8KdyC*nVSgMHl95oO=*3I~&wa-8lM zd_kSshNvK8hGs~=vzK*H-sC$qnAB6?DTEc0&S;hD2&y(FE{a&~OXmWcHU+(5U4xLK zGvo}D#^ZWtR8fC#J9UXM)4c>Y1P?HVqf5)^4sTV(4gxWy!0XrYHI*!A3MZ zdrUc*%dOwDs|v<~G1DwT_SRY!fF!~D97X(6dkY=RSdH*bM5$$#=+m1ODC7`03M*XD zD(!>O$ZqgHS7s0CQnOZ#Q_3*ycT+Y_06>cxX=TAgmMNfD##i~-<1S;%dQH=dx5M%K za?b9P-N7@y3Fb@W;T&JLP;o-%-de{_d@jJ0>6kQN#zN1Sp>m?TJ$`&KE6ILK7$cA% zL^UmdG0T`Q4^(&z-@9=nn~B`5V>yG_pbTuYP>VWkFw8uq*7^r2dPL-@qUQwSnI6JV@5FYThV4mvj+cO?Cv`BE3g#zzX=C(Im~W&fs~Y^`K4} zfXTpIkXcDhwH%9(=Bdu*4lmUHX1!P@5JTb=c;l9KZ7lmfNJH@9J`Lhvh=!!>4lMQlDnOlZszrGo zWivOJzC_DhcY8U*iQA5&u%JbIcw3fj;W#>sn->0*e#r_7q=^triZTfz@qp$y48-DQ z^9Eg3Mrv(31uH<{Vdw<7qRPp55w_!|w zCg6?dN}ac2GAX>oo!2AJgsnXs7pa#x#P7`n{%fGNgspx?;oim4@9ZlySYmyhZx6=m zYjB#c=Np5uZ&SaC6~_C&&ZJEE3^$ne%b~nmX;0X;Lx#(C;z{@vDM(R=H9a;<6p&8F zx^bX*DcF0iYMWagIQc2U1No<}ZG$J>YIsJ~!$Cv~tFAPTy~f0b5HF6CMUvLFk2*k6 zjsbPkmSwYjJrc)3w1GY-uA4SBE5Z?81N`nEVXXp?P({lR0`W^rhQHpNVA84};s3UF z0nSr(0PeqI&tn7nS#lz=YQm+H>rSkSwEs{#mVRt5^?Ch8%7I~_Pq=g83s3b9+-f$C zgxYSXrb>|u%WxRDtpn(zXqEb5IC3nVnIioP2;RHfFk1JmRE_J|8OE+#N{2wOA}d}@+qxK ziSrdkK;A3f&&!OGMW9(8*r2#ugcki!I1Q|_D%e~i=3KfR=I@hW)k(?GtJjRdRp|=L zgEGll>xC~Ek*H8~neqPkLPd$$J?FN3r7vU}b$lOIN?hI;Z7*7d>|u4zqb-95?kVeI z)zl$sMLArb&T4kIISiB)*%o}+84TskZ6d$r7<(edWjIpyck6P;(1=3~ z<;5F9x7>XFe>6CCgUf4D8vcx|@cIFR8H1|ZR=SQKe^!X)W6NwZkMX^_qrsYENP`QL zc?~4ka3=H8ReMNmJ>=eR4T7P{-AL0P)SRS%qVcv-cZqwAWeU@rZn8UUeLd6brb34d zz}|$0yHw(i^>rFDx4t@?1=wW&5^F2ULX1TkmJMV%BvOfTwAfqi>HfU#sj})L7!Jq{ zfUjn~4)UTd1J)k|-H|M;Ie2VZxJX`DLHc(KEQAPvvTr+!3Bp7^?l_EV>j8-S-=J41 zf&InDoUFmT!I`&Xb%x>UIeo0l94U1JZR{H}lC^{iKnKcx zod_XcEP{olvlr>IN&ly4XCuX3@#=LktgB`lbI&3kT=iRdepitEhRIkBKf7J0EX6Ut z#tT2jxg;08*~};bvtkLRiFgv$#q#ylzH>QGJ6ajQ9ON272=Vs@Qh-I&!xoRJuzKP% zqjce03_FBp1>r@&No4!Ov#!f&D0HD*-IOW2YyNoqX*ls@nEhrlgDZ(GjeW-2Pte%w zGymX#%-is@+v8%GYF0>Dv_12kL$@ z+vh4kkdcAzqXfZS5R1ByYIc(sVVymnMr)n-OO+CDw?0hS9gTDQfxN3sAG1P&OTjR1 z-fy@4*7++()m&SR{7v26K4qv)Vb}E6_1ZGeuwLSpp%6{KvaI^q-K{ru^b9V!Y)C#U zL`*&&oT0o?IK*Tx`srDSIy846)$Ib&Q|5RyR_sVE=Dy2`UN7beTJtPXG$Na<>UI6P zm_qi{Hd_AU-nw&|hl~kra@LZ7c4Gii(Ko6DZvsL`h_+lc8J%kO{lx-QYXYDAYL=b} z*Qn&!S2;g)iB!g3v60Kw*X90aJwaXR;cI+<3!C`0$tbLiyxD*mq)o{4<7aPX-F$(# zV=sZECOsy9NSw!s%%0nb23McZG!U;E=NpB-Ik?yr3I8b^rr!^Z{dsFZ2 zD7vAkZE4>?w0epY_Gu)b>3OC?r_;J>^(<3ud<_h3R6M6zgL6*?@@UF3l@ge(RGvM# z&55i$BW-c0F?Tc#`V6WdRpA&m4XFX3(Nx$496-^gK9~uqx$*vMCzb_F!ut|}YbUEZn>yDduQ_*|*tL4=EIgOZ^1s9YszGx&$ znT?VhFt8EamBU=4Rt(uRu~WtQN`|+}%-%J9TjAWvQW6(kladwc!p+0To=M(@(VK+w zH6CzRJ$a&LUaFp*E81l=SJ~M^fBs;uA2_?X7w(oL2g%+&@dUVQ2|M6wUU>o$FFH6mkL$ zT%xl{!zW5x*ZF8zJv3y}k^@8P;YUhZjFdo+(b!}q^@hjWHI!jWsp(ZI+LU3d6^)?DA9GbiwLQm1uFF^DnSLDY{>`WuaSNh zs~=&zIc2(;11uHU6&u)=$ZsrVc-{ZC{uP}QBR~Xz{4pH*tNLH>hgvS(kRNj5_q6-s zQPboQIOQeYWI6Mj>@bKMB(ulj+B%!;^X0`e#zmFf45&9?CN55bq!v%|Nime@BTU9 zap23H_{FrS(3__@B?dP(;Vv;Alf8fM!>BbXF;^3?t~HV+WJR{F(*$r;;x$nZ_wL7J z$3G^p-3%q1(>Ft-a<1s{JHKQ{2@pZ@;x8M0b=jqrb;7whL1}g}Ro8yogu$NYh5dP7 zAtPc&Dmbjw2%Pdlq5A3M+1jX&K2AvZ_#;z3d-5k$>5qTiO9dyl+D(R$@WQ%Zgkwy% z+o|e?Mt}3sXuT|QwK0S6RkcJPbE8$yI!t9ub zJl;}tAN#MLZuQkHl?0M%zL4~kpHjZX#suHzoHjT3-G(}(zZFfx&al}Ty#5Vh@rHgw zT=Gm<5aOD;hIipMw^v_b?#~B`bKm#MQ{_DpngU<4hXwM7);L>cm>vQ@Q|m>(=&2X zG!ZogGPry1Wf4z!FpL3+W4qm7?fZ6hGJ2g$qP!MbxS3euJpZ~N5L~4aC@C|}MLlH~ zF7ipC-A&$m(gB^8T2%d%aB7M<5NWd&i0*Y>FkfP^vwS{}JpE}44VcqEJ$>vYYz98d zT{PG3S*9OJn$Pb)fYQ%?bF5kxQ{7a32h+9RG(0jdm>c&UlnswmtE%UfH>I*zL8ah% z4~80|Fn|30H}v=4UpSlWdC=y~jE+6;O$(={e0K}i2jq6|j@3JQZy!ZXP)l^w;A#pJ z`!-!-A^QZsM(2>RfBVk+Qf?jmNmfR?{5phzaX&Oun4_2vV4}u_AHetP|2i}ad5FV- z!deYoj`V95jG!NdjgGG_k$+1;CV2#`!D`lI$`d;lME7SmG-OfebNd}PtxmfI_bCR#ISMV>660(S)a0W}-)UN1*h{b}_YvH|P7ncaB#> z6>r~Pc-<~$HC)Afz^sDxo3o@8sobX?a4*dZ=BI>HVli4qA`d~uLDRzNIpN&$@^fSb zcai6|4eK}GC+syFLW0fa4Fr53m_S(5LY*D~i9Ka>q#epqwSL5451TdpuA8!^ zNKM;NL=gzc*kB1GI}({?wRr@~4esvm9l9TI9~V2=$Od!wh`V^)J+*Q7p^gbkCG*_5 z-HIHfOMnPWRMUmzC_q_Tua2VYX_QwRUkFdB!*3nFx#ZLf+JvW~X3YtrBIZg~qAZep zSLnnCd43P$Y1F-tn!P07?N6C|)>LfV!vy8QijdnOyIsCI_DMd`>*{!h^UM?eMm^oq zmK6-G_m~YK6K^ivl(1$t)%o*1u4m%Ln`UCL<^0!|K0D2vxGYUDPoLiPPzj+df81{J zJQ+k!zvY~6~LEc$ZA-XMd60JRhcCL)_{QO zgsztcIE=a^+^i}rWR+uik2K{a7&XbREwQMvq)@y&GH5%fT#X@JN2mC79s%UM2pLS) zPqgzFFoe$!p68aas0hjB;dVLawqY_+1Sx_idl&WW($W>>=1ElsJhr>pwbw23`d1oN zdWH+x(S(ugc;7a7Crj2TKAL5`+fp|Mk-b_=3D#S3TejF@1=E>7ue6&<780V; zeDe)&$W6@ZXPtMFJT-6YEx!fGEcT>@mdVaEMnGC>DZ(Or6U) z>@e&DM4e4_Izx8*`UD&|t)>>6PRXonNX0a@^a-goN(?mX?@mSB9P4p*QnKzp z;V$eAxX(Z#PYDDQep`#4TGtH063)Oj?_F>3BGBzEgvEjr%3l_)26)|>8@=C&w?PPZ zVz%d`$6R-D0hOALv>;q6t#5JHyvK?4vlHBWmHV_4>rVtuch&1@pOo6MzI!V0WY5Hp zxR=^O&>XgNSkGNJ_NHbyw_gOg6G_P~jVum{ln6v?bK&MDvfbr5%TBg8gWSC$;I5N( zPooQotR+ICkzByz@wyd(B>@{Z2CNuMb#(zHnmDrrjk;JkKrIQckb$)hAHPs6nJeMU znxzMMP>(*W4C67=6@?1}-VD_99^xlJk~mU- z7(&a^2qU1znj1_5V4c;;UJs9Fc5)mzER zz_{-o!P4RnqBScZ!AI3mxZnjq{41;WiT-E*x1@GfuYa)dzENCNu_@4SJp=ju-&{SX z$)hQBSyQ4Zsq>2-|R{LitL8rc6^Ne(2N8Z7xdLQA1I&zG7>*nRIZP`B3bXmG!(xre^@Z=`<;#XH6 zY7_2X!;npTP&Z$u$JGMaeTiD#pVA){g}x@)wTLVeW$4l(P@ibnuzp>C{MTwjh5l*B zm`3AptUlnJDb3_V)8^uz|MlSf^Q@^T%a6IGB}5EyrGNk7co2!ht20XKQz|NS)ZNs% z@mepfr?=cj3pT#k^UHr_W5%1T>D|MZCv7S}UcreeW3pHFN^N+tA>&=t?wWZq6Z11L zIFVxXH0RiNxH??h@O|MX(OEwldArbfjZ#~(-sBB@+eqra=qLPc)a%`k(jQJ5ZHEsV zak~a8>i62A@mN+r0@ME=2v~}E|LK++t)nBRU86=Ht>GKB%O={3`k8*hA7h4ZR`#?T z2z6_uD+jwUw6ysmWH(QmWE%|nDE>qmTXFZ)I}$0l$SVpeu`GJk&v?*x3buX=4KhG$<< z#qR7gI)7CD`{N}P#*r|{(~rajMi=>XRCyo4FuGm&wy5B@-;78`9LLRSx})-Xj>;( zTuV6-Lmc6xZ?ru3Im#_f%tnL8N6W3L=FU=^ZBWFKCa2*VVh6a_8?xv47-;NUZf-yS z`?t!U+!$3!xk*v{%dfK%2~5S6$8wRm5PZh2KQ+6<9^PEnd+&cCur5&DNMn%Ro|hY1Tav1wbi?ZN^juX$ z*4$i#fm=ib>sSS!CqZDfN5o-VO3Jqy4A%Cfz~je56$uG{41Y}%JH)iFhyU=%h6H3_ zQu~YT@{_Wwb^jCX8%#bUU71!L3IL=UW87Z<+t47`^yrZkz>V|s!52-<{@P!DJ(Opz zX&~u#S_1Cx11ikr%#296LW&OlPB9B1$`cUtVm2w zdVc?-Z#)^L35TcRhY#`;Sh{_1hOlBzRFP21pqsD@DNashl+tO_G@oq*o9@$q*@(t8 zH_@ENe8J2g!E|z!ses*dh(1Z!5mksp!cP*{w-vGiaBqjDoW>u-9#a1Q{}si@_UYnX z6s`*WMrle!N_@&b!{&J1O1x6)MptE!ICtN%0#dYn3M#+9sMRDT%ER0P6mJD9#?j<2 zzKC3m8RiRc50fV*W!_}*zI@!ezGuJ>`^dU3eCr^33P4mF5YC~{>~2gy9|JR}F)6B; z=u_wbfT^_{xBtKd^F^Y|3+BZ7@apzX>i~Mn)b?4LCoAc)E#K;e~h$&MfnzL+9ZnAMMyN&-3Ix+%_+h_v6Z2AsEOj9UY_cq*5I&44;H? z(`iO>ctA7+;W9e-IADn9jv?}4<3&IRQ@ANS2cC#+T>u~nf}+}uRMDS2nKxBsQ>9o4 zU`Am4B?Qs5bUPs`rGaVN*z5CDYSi(JgD|N=kUn=X18%uO1okuRAUQ(YB8Eoi#ueIv znP#!7ob)s|QEaTp%@lJ~u~@u?cGD)*yze6wv0!-`1=js&-;P93%Wa2@5v`?i@$Gu! z>SxA)H!Hws?-;BocAQpbgeAKXCOICN7H2K7&?VB(I$3F_^Kw#qJ3e0?RQUZpdF<%X z-Dl{8i{5Pi(@jkw@}iJO@~0@Or>3VB5^J3nk4z3>5>jQSrV@_(cowZb*t;Y^gbpDj z1k&>;8+6dvO}~|>(ex8hugI@~{&`|!feob4>@f<o+5YSTKvBHQtP8*b=gfU)ALgO0&u@fO$(+fD&_^#&#G8e_O2?V3b=0HHzl01 ze(iHr9Xjm5l5k}q>2w|ujGOe=Rth}FW<$$Jq#rL+D|7z$SRSYrXTO%2(G{Wf&5){W&uF)Bk^56vOh^lbD~G^fI!_-Cjj1 zds_cVL9W+ZrOUz*l2`Ab1%1)7W}dUEJnk0 z@oS0H330Em#uhtB8(Q8+S=a0*I6zuSTTE7mkkX>EGjfMW>*ChM&(6fHi?fl2WGR_a zQri1@O~1CUD(9y(`+T$TqSqIn&R}0xtfapGZ<@;nfNklsy3fT@uWcaX%?S+SRUkc& z#v%#R^%Xkef>hqq2sSv-Adaiov+i5Er+Z!QTx_TyQ1EYIMk z%Io<#UpH##RU6p3x$FPQ*VT-j)T|#s_A6*0!-LXPKK%WS~k1B&|{z!fpO# z^P@haWn~*Sj%@kRZ6-Y%8{<0; z)g(cD0^eEAZvHnLA zpx6Me(+)9pw!orI+iZ7vad+E`70yqurQ!B7vb8ygVMz}EJ?eYTqUx^I zOp~vkr?0Bh`D%H^_$WM$Na)5Oll)3{I3}NhxTd$eqh~?qPvslurWvUrN4(puMLyAi zaj~ve_(HuMy?;E?Xm3G3_Zg)iB#2^ptwn$c;4`OReLK!Mti{#s9%ou`9#LfXSzax) zDq3e+u$>SrI)e#>z2>rz;70QXYx>zIS!-?#4k1&SSjX-K-Coqcf0}v<83d0b2j&E4&a|>r2VDvGM9M`Qjwabh$GG8|4K{a&s>w1 zN=wMKHbJM$%BrkPNF-u%T3rGUX|GC5P;~z^<;o#{EcP~2#-x{d<3F;PH+ZZOjC38A zty%>k4IRCWSdo8|-~y(M`5h)1ZREqH8u-kx%ZQAg#CsJ7!)kR|ZunpVplO7AKg?Rb zQCRNTC#rW;?iNMX`Ok=oM50WRS4x`yZjEe2Z6;xC2I<4pBQnjdfHa*KIa4Go7R`w2 zBSpI^cUDi3mo3V#%V(c16PqAH0PmKms|)?0;vUh!AXX6>Jqh<(KM1YUWxC-*2+hRh zr?cf>D=o|9iRzt|yF`)oq8U-KP?Smb(xnCLYU-0&NRVL@`p`kU{nJvsND)y{#J?`K zyK+Z!`#p=|8_Vnu_XsV7VByQs)rK8x^(YKe9Qr>#T(T{Zs`tEmu%Ls{S8-6~QN9fe z5kMq5r0k7~W`S*&ZmZGO+ve%zPNgMydA0T0j8!ZMJU_!z7qwTXU#stqkhQH`<#Dj0 zkI|8TaM_cpcPC?>;<^2=z|bp56t49t%Lnrxzm*4`0Z>Ps5@Un%lAfwprTri_jhg7? zSw^c6ND)wK2U1cnAVg0g-u~o*gLhd?B5U_5Ss{z0^TOiu_9Roj!O(6^0_XxMn40G= zDR>;Qwj239fV{RAl>w*)W`M~e$u1hekD7yPpZ*I0;l&Y!L~$LLR)Vt}Y&QXYN*AL` zEPlBU)(sbr-+nu=x#8)9h>H6pPt?=P=t(cA@xw4p_;jlfDCdeBfweU=Q5up#YU5Ra zEh0YLQ7CACDisw~nvs&NCS3!{#g3ef;>lKi92W5gQX*9Ba$}((^T& z{m|3v0h|4+*Z0XcBy?xHgPQ-+l?=UVmFjtYm;gC-2aI;8aq+3s}bV{{edR?EtbAFW;?aE1f5CGpgZUp z>F7+!+EZh;&%8h5nA-E>``Y6B+Vfpj_D@tejtj|mNhUtEd>}_7r-jqmcpl7>D>X0a zK*l=!oVpzx>wPjzjNoCvO_sb@p_o{aDUR6kzLTRh>EQQZodp4uK5!Vc(mkrBiQ&aY47_FlEMR$B)_; z#*n6_)BbGl3q*Bp%<4Je69g96LMTqUv+40YD7P85Y#E6YYPDNW8u9&)*FA{g)>M4) z3zIy$&rtQZPKu%q*4+}3v2J1HeBk;DiW%)8!sGefi<$mlas zws#N>>}s)**WDF`g^KxkNe<~^fcBn?gGGLWW=L=0FC(|_GUdFfjI`-xT~U4jH>9Je zZvCN(|B#@W9)%tSm1{Ei>AWi3!X{w!LcU%&Cdcsp+~nN(=C&$FYs^($&iu#YmRp6% z6~qf1=cmCdp^3_C#8bF#JN$t=;p90gBPIOK2yZ?aKjYO1q|Yq{$odz_Is_$;qq0f= zaHJg4{fhnOReL>u^V+*|ot^R5+1)i9Kh8_y-#T>G_U3e2-3kO**;$5u;_A+vUTJ2w zH%Z#7?Cf+683s48n$y>*gjiN~<~Xp`k0TI^wV8ZTg7aVg1&C}|49+zn<8a)uk>}w) zf;VF%{l!ENt&BWaH0I$NK1`#q$Ld4EaaRW)giHdIlu|qHIr&Y)uxNM)r3<7ve)&)z z_i5R+tvTm-J~35SXXP~*J^sL7!PgfS^mmbfXlvv*m9<0-q}|?mcGB*Yr`qk?ZNv8A zm8~*}2-=OcU1n`V29`X2ye_Mu7L!5N-gcP{b(nNgy`w&}t|1*`H)S)cq7MVlBl$y1 zw_^cK7_#TsleW72Ddcl1^|N*LdDPlq$)2sm8K+}>tgRJ?+zA%%-C_>=g3>FAW^s`c z^fz1=bV5fU`tO7Q$M5tAZ@iQku2qH-P2oz-J(A;gBVq+p!(f!ta1{)@GqYI7xa~5) zH#l5Rv+%bg9G5gq_slQ4M*cWpYZGSmUd*8E-YH165B*&!sF81+Oe!bN{j`#@^W4eo zojakcvy3{G7i#y4iqFXz_+)bnYS4ITJ!?wue6QEjWvwaEdTBfj9>1d4TxqYP@53s} zp#?3bT*;RASJydd#Py^TroHIb{K>Y$v~42;XU%=ROF%sjtxc)ivOaEFP5 z>>*_sxx4%<>0o^C0I@BN`|cK|0H-Pf>3ND+jEgvgN!-ylUTgb+etc06Ew?SAH!TcJ zy?Jj?wh6<-aHe*cx2yDta4dLr5iTB&op2~RoqeO-jKqH8@CnOHfcpzv*4l|d;9QUK zGCAi2bKB6~*>?G!<=(O;GB_BN{zrG~1oBXVo@E>kh%GthsB6MztGU5YDV-jd%}ooZ zW32{cPGaca^;mDzW|@xaZ)RuPd&}il?`b@pUls4dIh>Co{4Tb`&C`jwU9E77;Gmh= z%M1Iv;+9(MzXHMs3bs&EX6Sp3mjvTq_ZiA0A(?)k*Jp=ch3~Fw@GwRZRnyii%2HBf zFCqOraPk*FzaTuS7v!_SfkQyF^UP)Tqu%&r>B&>01bZ*A5Hrqb4S;+EK0uO40wpy3 zuF@I;UubC^l~PSZnMEsXwnJY1w`0{Rb-uZpa9<)RE8Bs`B~#EzYzcbH_&>Jz(1|5* zhmF&@JQ{N@3tW${J$xiTly6b~MLuKqo?RD$*H_>)NI-IS7Kxm5g-@_)+z&Er6a2|1 zNE1wwclcOM9%a&D((D;$`1UUwcz@corL*+W^OK;z!0aL4t#8}@DTScTrQM(0hxNok z7S6rF_nq!-cinl3^Qb2d{qfa@8hER*Y1xu3dhI2^QcVSUukm!s3$tIu5Fy(-xkfLm ztL6J(Vb$C9%M$gSAzKKwlW1M-%r!IsoORAhW*|)9YnX_Z)0U@RT#(TtUR~WvnTaLa z@@HzOushiG)izq6Yy`?mV13!wYU*1$w1I^Q%bWRDO1|<&c!#aPt>bQ-mswI%7czTa zIrZLqtCD|h-C9|&iDXmNtRUcx{>`@4=_wtH5XBZRdjpq7Qx#q8hHg5Uwe+P^UX5wu zn?|o8f=6)E=dJ>vcARbS;W>=zWdlAYDCbEWKA8-}3p%?IracNg&r3X&TS$G1Cm|^d zHC(&|l_=O| zpgIT~LP!9d!URfG2ui2}IMjtr4j}K1+Q(4=BDldOb-?GZ7`CwnoscIVkVb5lp}ZZ3Yn(5#f`9x`o~`gya!OY0 zdoNx7wZh5;xs(l{OMj3xE5m%XCA_S0psm%w`;l+f&MsJ!H~+`c0?8ma z_*V$R*u4UMLy#stC#7sv7fI+PyHWf(DxJR z+RihTAMQl=U#*T_IOx5mFchf@%m1$`9k(a{`1AkAevjTi*3oe5Spb{i7V!L5$Ewp$ zs6zqytKCI7t(7N=(i#lyuA(NJq%-}hp-dtD_DTXyK-IRWMq;(N-|7vm%dBRp1icJ&ZxZKtz_YX0W2n_02g_Do{Ix2`jq4|x!ye%N?hV&cyIS4U zYWj8TO1-wBzXXpT)c<$eIjGok+_M-!*LV5%c%-GlG5=jt5V&~`1g`HEO^9|+wIr63 z1KI2P*$4F3`!^gd9FF~9{5^aSJB%(CMbRo3P0z9&iU9kUPL&|`l848oSb_Jl|2+cu zy{#@(Sy0bm=34>bio2VWN-sZ(X!l14-MjHGQ;;q_(e1v;*q-n|x?Gw)^D3fb8~Mlk z{*KQG2*`;4d*8=$o`3CB9C(JJEx@=5Oe*`|bP#Rx$Ny_c+I&|L{xY9=xF<+Pb=mr! zM78(lilx?f7FL;_J>jauYm9PxMpmuAb;a-b-Q}k zz-`jl5lx%s$Rj$iE4q85G1kl)xW637a;Za>2;yp-!DuW?D}mp{4Adj{0NlI+z^l0P zu?>{H;#+tARB{EG)GU!qZc+Z(`PzsrINE@8+r)2^$;lDfw=YM8U%nlYog9Arw@+*~ z${Y7C(f8*rNsk>9+${(3>4KU;j`h@=3x<1E5SKzb8JBZaX2XZz2@ZC;IvjQGD-xU>Xg zN}{(L6L7??nrEx+JJaKhtB6=-Hu>9~U473q8APn#xV4NfOjK*GU6)5*zoy|4c_c9;K1ue0&SKHhH9GAHt+|UtsMsGfBCg`>CE3wqg8#oC zRuL_in48fDq;+e^gfU0`=1Su2I&JK_#G9C-)BH=cty}%FMmGe9?Aj>IdjFueagq4$ zGo+stnW~RWyW!@cjpPl!-)sm@3pN-=UK9G@_P}{J)ZR5uat{mjAkB5zLkm%&M}#;( zDWo1=;xK_Z zF<`if)sLJ*Hn1i?a+bB4RS>|_tiLf0^KXcb2lrPP71vJp)%kCw;u1V|bp~+sRaX7g z)T%1ISwBZpuRg$f44A-C;njIh8uprWi%0T?{7qMBo9t}3*;#uvA-I+Lbj~Yt5SD+_uZidFyV>2(FFs|5>iOs%q zuzL#CXTi+gs$6p8phL8cw~Mz;WE%xKr=PcxKNeOV-WQfsIU*hnJxm!J> zByl@pV@!eF{{Fl=;nFx~=)^FqsMXW%ohRh+RbE+3fh(6|kr5U$f~Z2`T7nm)&DtfZx*mCAtU9@%~%?xpr;vTc^M`2Rm+5qIShcOlRIpPpdu zR^PD##mpi@L%^zlhp+!r6dT%N0W>tM;@=OdnOspaEsvdc zJG@<~4DYyIUeg)3IXf%v-45IZ5oi}Qz-a`!k(D|$rLsb2^A#zm?`cu5Ts!;LMTIo+ zG{}US>iWRr{t5k~IIb0pvyaX}vsUBbNRbyOA{98(BDNeTW`%_pu|DZ?t`qxT8OIAL z3fBepzSVLx00e+v4(Xv$vx*pae&0fFhb>P2s<_P9!79^WY-Z*_tQCzL%nX9F@Ywe+ z%|S<}d1u0-GvYH`%u?X`35wxJAejAlEqZ>P<;)f9u6Zoo@e1I=N4OSCPg=LN&+OYT zY$5-K{2k&X_4!ZKXCd2XklasXtd=t{u6+tZ0KgYnsxM`%yn(E>TNpC>&?CqX2Cb%W7D=rp6~&feLo6#-JSY&KNSS7DHi^GKpkIT82AvGX=FE6#=?%ewRE+Q;nN zpEl?FA^<2I0NAFWEvsT$8qh`(T6wAu^ONx^{ScECyCS!!Ri<_t%1u3 zwijR%7$LS02;v_9P!X%EsCESq5Fx6CsT5Brc;5BeyGhknLr#Y^iPK~a4nZ5pc2XmX zK3q0t!C*`p(8(+^PJY-Im!9eIRF3KA zv^6tEyzY)J4>zz!JN!2;Pj@E;n|tA+rgp}NE89JGaF1qq8keoRkI`asFLKnSrLd9? zyVA`wUFkH7c0&#gcBB2x^f;|!yy=AAmM*)qVT5~O19uQLqE+u~J+Q&Zo0D-cuz3a0 zahY^dp2S1f)$3a(dPmIJ*pTW+=f`SBkbV~%F(K3CO#?nbo!*>!C+}974Ty{+wfos)R zvSI?)e$lnOoTi+Z@zFdW5{~7D&CI5&mS1&$9=JAU$5)wqj{Z?xyn8Brg(7C}(abCC zGH%owuAa61?B^$sBA3p8zclQk=Wg`pvdgZ3$Z5vzSIga~{tJNUq#fjS08~LGt6mgApITb4!Ou6_IGPPxRd4ykw zwI3)xoTzy#`95nESp9_$SVa-r6kp4ek~Et8_vIx^rP`H622!58tW3cUe6jROY|4d2 zz5X}&g*Lq=f1TRB;`D`Y_E_E-n+|??_M&%j>u~G#72egQvjdhMXu12Vb0@-9wrp=1 zj;1MEzMghtxg36ixW8MY-rR)UVRkef*xhgrjb2Z86ZeUuqf+(Jg6y!=6+L;5{xNV{ zUdjk34RyoiQ&Eryg_6OR`(kkMy<2bHz7n`vso?p_-F=4k=jZc>0?CwgHh`$IQhWm` zIHjv{o!oxPz0#*S6LtB z3SYtte7T$7UGs7?DEXoCzH?o-s)rT?t{Yti3q#Uvl*)C7kfODEtTKklYR>saRWa|V za?I!DPFgH3%=)9;kv!+5jO|0ABtcPA<#6}Vejj!(U$K8@*p|X#w8jxxTLc#y0qqOV zx}V*C=XQDd+~k?$*)#Do^wq1%X)sz|j)sL*+Gx=NW4@ALAnoVwpQnEOFO|Q9Eqx}% z)F=MY3|e0;?~iJn_^k!<75G9ek7paB`pd7&s(@f34y#Ms09q<8sjE}kS8-pQ6L**y z_aPFh4@Ew#`~GlTj`)6cFRs%bhsz|92at%+#|m&3S>W_j_bGQk{NG~2@q+KQ~HFPen(A@nwF9MiE*X{^WTK>sc3W|Eo9;z0_upk z7(KeR*Xkv|86JXdhAL;<4|xm&{_-^+j&4wemY2W%7B2&XxgTEJV~UT7Nie;`$m0`V z=P|~VjFL~RmVAGzY zJW6;IymC|8ST9x`pMX{MU2*7KXY9E834=Lx>@%N+&$E`7?&W`P&3OwWf_id@-5!4A8Oh=p zDbXd>b!-Wt6EsU&%d{{ob`Fb>V`h?$|DI^C$DK8+7_;2>6=e5}k@zd}( zSsgxGx`Yd%gqH4*7?^fUSE!rj%LFz(xsNBeejJ3n&Hy!4I z5$C}YkTlgL_VzjG|A4-DJ|CSr@HBWB>W&5%51}Yn%aHm`D2Tz_wi>hJ!axeHofsx* z3rCHIkQA&eq>d8`5@2qtjTOHesKOpliwZPi6_vZg27qxNlBwOe{;M~tP>pu1gas`C z-!<${0QQxt$stss1+A#P%R>Z05f1SA#QriOG~BG)UTn9W*r-O8typPW+LCEkHXG%5 zOLtSvWNwB6d=Tp=pIvP;wW9I=?X39!4dnmJa{!QlAO;^+C{opQ!?bM2^$0qHWU|;C zE{_i>aS2H&X&G5Lc?Cr!WffI5bq!4|Z5>@beFFv!88%|nm~j&(0YDHK0)@d5NE8}_ z#o-A=5}87!(HTq@o5SVt1wxTnB9+M%N|jop)#(jJli6am*&R-o+vD~5K?p`r3@1p6 zW>`)j6p1BLnOvb%sWn=i-e5GDd5hI%cQ{>ckJsl<@Q28wZSh8}W`+Muv?8 zfX2Z)j;NkZvr!Rj8~|jmqq6@$CpX4~8rG`sLB0){RN*Le6c{|B$kd{nnO7{D!UxqZ zy{yn(a)m_Huq0GS+aR0|`o!+Do2R<_m=Cp{?_`m@bg}WX3bVWW5gPj>mmHpS^WWVi zmrZhk1QG}&Bw-{Vkg!I`BJ2RUutW$WEJcQZwSE&Q0xDWXQE<#^C1|U=3Klw?Q0oBy z|8*4HwXLgFTRZaC+$ZJuEhQV?4dCZPWYwuVTj6U}h3&vOM|hxvFDo8{^Ul!1OPqC? z_;=eqJ|j~zDG)oxVrp*A5**ZN_132ifYKfitk2sdtvKg<8Yw^yd2?Riz%=^p|E;VE(W3VVI-+_Z0?d+?NvULW zOFdBKXkfv}Nkse~b9#q5P3ovyTb3L&a7Y*+a5wzto$a4f6a8N>Vyoa;<9WxjYNIJ@ z@$NptCX9jlNH-Xpn^qs*RLgb-By_+=ICCBEvQ`ec=dNREUsJlM{(pZ4GxPua!Qca+ zfB{H>ASH95G#FA^5DF%>38cb>m>dHLQY$Waf#lM=Sn2{#>zHEExTr%cS{I#Lmu}@P zy24fI+62_SKBw$>1OnitUS7KO4pyoKFa`nn;_#RK^#4zU*wW!aBO-+;Q}5VseyvO9 z>X%|GhesJMLc|zD4fTQz!SVwkplyX0oc7s098_N8}lY^#a72u~bGU1$XP7%C^ z5kf>Fn(%`60njBNw4`JOHd2wnV0Clhd*uAb>2!b}6nW>vV3Vk2Y7FrI6(WdGBxDp+ zG;|Cum{=H!>rAn>Q>huPq$!xLO><*{P z?eX#T^9Mi(Mo+`DsfCd0i0RR91Py+zKd5t3S zPnpGZ2=qGE`Z;fc6b7i?^C|RIf5d2Bb`x|!wHgig&y0nQe`XehKN12$NTnh? zQSt05=K_f&77!b;9&HhVlZK##Pr@qan!sv%yP_zK4hb9_c=LWGr3z)2U6fGY%<(c? zt_cys;K*;JA&ij1ymHH zDRgQ2nk0mD0GU7<@&b|sh%GZz8Y&EhT`{H;)5+-A>Y)N4%#@XyrH-sYCUb;}Sed#X zjEAi`r-`7i1^zyOR+_wlr~=p`h609_n!s$XkPBt`{2oB>Z*5&6KgG)D+vg;9PRC}80$Q|McGfGsYcD&v}R z^0g6H(g{_N+G&tfGKET}P|1|F+<6>!IGGoQ(jw2A7E7j%??qs>tWd*e9P&)Az zLF_X>1svisz*8aZE>Y^}^vqPgs1YKyLESuer!tO6^xF|EyLODkoZab65AUG2#Saly z-}bWVDX$G4Y`HA%M>(G!BPPHzjMGy}0Ux&P_}54j4*Y4l_3|LC$^g2=_&Fs>Zym^d zba%){Um88%Q)fIMw|+?AuBWfxW!=dFUz+#(-`OD*R^R0?InaGhT=kxY@qlK_N>1(!@QdEP=*yy@g;$IlRmrY3*r1Kq`14${bB81}e0gwCN9C!#W3=VL;5bX`Y4%tk6Xe`I60Lef z8lVDEaHMxU-irwbuLLMhIciprxwiOo7k}h?F<=&O+I0d@2%CTl+7O#r_b@fWx+H=Y z8wzvdar+P{9fz?;qtioy>TBvVAH!?8UkAs5RpC)d2lV})^j^xhdXu;~#}~D+>b^s_ z`_rU!0l#j{nuB+RMYtgU0YK>-A})exBR(XhZ5D zMY$7BOm&6TcxrG_-`g)g_V|MMsL3f+nkVMy41$fB{&-1>uSF~cfK6nMCn#`GK?o!6eI zY}$YFPGC-a%M2VBfmsvjm7jHjpUUC|w2^1un~M`_1e+XRv*$U?ZV7bCzn0Ky+36KG zgc=2>!S`4YOkpOp@Lk}J)4)c4-s*|C{;eUEe-O-&sQWwx4O3E_HKqkzTN=Rz8m*zJ z+>4K$g_xZ3xltoMz8e8`fW;y|p?xw9wAAyWycp2D67|uIaZ$j>{m5~#$)aVRnr#rK z5)tYij}#&|7dDAUI(p)(_Nzlyk9=#i7?mCZTVvWl_h>8%aDIDg`t@?;)9AC2F|^lE z)O{04-hH6c5q)n0rAhEJ_rJBSxzkGt%a*hqMY-rEO2PshxyO9HdC4pWlE9GU8U zuc#`2eO;(^QRcQR)}hJG``e*>r^lx^GQAn~dX;P)pb0Jb_515E{ zJgM`E^Itdo$rG2qlmDob=5!*-Nq;1NJ%hAi2Gkb@&LhR)1tPeDR>q^~+l_8Arz%l{ z|m;5dNo{j2Ni=+cl@4*@OX~l5wf0cczS(*O2$E^KV&{!WRlSGOVk>8Ew`9P z$zqlJNAvU+boZ&bYVFswuYsmv=gx+m&bLq6o#RH-m>Tr9GWij`m=FNK6V}Yis+r{z z31vF8E>Uit;`wce$Rem-rpq_QN*~8f%MWm7^56Qv`6{BpQJLY`Y^Z5r^*}np$A9&I z;q+&RzTa~$(~(htOWYk{{XP7xY&!lDXZ&!uv`2LQY+GmV#Uz&pv2!>tRUrwPj?=*9 z8tZO3WH25=wH7VCZu=T4$sT~idy;IRP|RqSPo$uh1AL^S$UpwVENU!{*Ua%s;b~ly zb8SEW`A3!CSMJDsD&F0P^mX2NTqx@ME>ELvj}+UEtSb1%;VphpPR!!oKDgKZ7bvl`?i8-00vZty{~n>>1YwJon{6yz6qW#@MOu4Y}vue!&ow|O@Q!^xHG ziX6qr0;5X57Cqg8>fS`)*_C5z`Gdjj8-pw?QEn}Z4O3&gRiYJxmL!nRHCLade15)G zjwM-wZ1EL~=SB!P4Lhf03~Wj7jkkFo1v+?X7kIw?#dsFravzx)lzPG$<_nAT)h74C zkuUB7W4adCH8IuM%lt{Jik8k|O)fmEF)5vP@mc4okt@TzO71jJ<@)p+xrC2%&Wl`% zi}tMxgqJhwhfCZ>4EnA!OTqu~L>5xMRBSO3&^MLbsbGDm+l)(Cnsl z2{XPZ@Ye8U2ax-zkp6!fORIF@m~tar?`c75mtE=H4>aC8jB#&@Gj2=3yntaYtP>We|VQ7U-MpND+tj^j8We(u8WvT z!$uXRV12B_^|Ku-1&9Rm(hPG5+Hu;3=!QeLgr18!vfRp^P=TeGt!o=?kJ#k+$B7`4 zd2gj}x~2NMj8cC*BX-szi3-eC9O^=JG6vT$g|H}Yc6n60Codf-);R0@FCq?}|yP24HfyBkfRVNoed15=42=6Fd*mQ%G%Wt!?JrJt>~Py!)- z#(# z4JxE@VmwL5Eb0if8r5_{(Q&1}Ak{UO4hYR*D7Qk)B+8m6PqC@+rDh2k6(YKI3rKJn z3i34sk-9RA$gHHYDJmc!?8~o>K`>e>Z7p$$Rb8&j)CtHII;xMoGg(JntH3vUqJ>$O3rNlMdMy;4DOZGLVkcL?tP-B zDX96%?sDTLDjY-`%$o|d&G8%-d7q5#Cw?B{InS`HCg5m!4qigvJTM1C<0LY{(p%LlugKWzrTXkY{!_JwlP2P%{UXo^WQRohh!CcA(OU*;h)Bq|CKz&QLjb zfClR+*8CEcfLtU1?3Ia^5nSn|<~LR6N(RG%oSkect%RS;^+ zbD9M)&fC9NVFl}IRx!2!jIDK(&n0EGuDTPJo#BNg%z4{L-Cf6`8%2m!w)KKBUa5%I zi{E?Yo52IA(m|*nl!pm|;_7li zNmtHIKDmXtg&JO*ixtB!&kyfwAJBm(0=BZ~5F%E%jn54u0PLVExDXWig0VYvwh#h` zdd-9jPT}Al!E2%m;Jrxz04KnVSIB7A`U7FYrZ_TSn9J><$>WNt2 zI}L|CK`dD_a!&ihnxqCak$Ud649 ztPwWu46%16r}t%`E#FTQ+86yBUbl>Y6mqnBMyT{O(HwnlCIiBx9*_rtB1%7%bZvgF!T2$cqk&GmggBSTM@7SEN*W$XnQEhBn7VOd%2^Vv3!A^+O!o7Y2 z(qOC>uXU%B?TcR>L_R1d{mo3Z#yyePS=}e*>A{2!86)Q z+SfPQP)Q;~H-#ds$%xi{v2sj8 zeVDXOOcU*qa5acjO@?0!fe-|&gc>#~$a#h=U` z{{whvD4rV9545*yi61Jo6%#qGf^wztIY%Zt5%OCt zsnB7fx}1OWc<6~mmJT=1=^*QVbW1G-U=Eu7P{NSVsXQ3oE?h~9)*~P~!(RB5I29|N zBcSISK0ISS^wY?7KnMa%{Leld`48r>!Crz@1_lxBEj$=xTRNYjf0!5OE1sVO_}1d01`d_K8_J z$NjDzJ{ZC67)d2BMxVaIHXhrUi5r)~`7N7gGWue2D|IUQtb&3~V939`nRQUx;%hCQ zR2j-sh&vW|vu$b#sOE*kZg4OOl3UEUX2yR9^hD_wTG#BiipuYlJxnNvH&{W(9qvr{X*KtJj|A%_Oe3 z`St?);XSx!QF?Br4fgTK=yWs_sYAoPngti*BNoN#rcc2>kG0YsHkQt7&_kCp29vS5m}eD0S?5^9lrkOWj?eY> zazkMdK?sqPK*rsSZCrD=n}Xs)Yqnn%f{Gv6k^1}(JTr(|_O0Lo5v*V)iC8w3F|Q58 zf%|=cx*-WHgxzvjGAtdI4X{wB;=5nb9o%#3zt;2da{nlf;X!eSucBd$m{ai%wIB29X1L5Fm`?!C+2HU&Sq@+ zXqS8vRC|l*q?K}AM-XlLktY$RNHG_66so>mqQKd9%#0(oU&50{6KrmO7F6b`jOKq@ zU>n`@JNK;)!%@tt+o86G-ps^?kC&Fo61sQ8oq;m_`7>^5*hp>&BWW4LEUcokrt8?O z@B@4f@N{sA_jCXeRqoIr%zo*r@Yl1isCzZ6!l&*thVxhp!2MT^2piJR0U;KuX8d$= z%U307#<#WS=qKk>>!&rTM}~#9<=WM^IyDqOY7dEwy2(vjrK!(b`g87e?%+3fdAca~ zU)-MU`cD7M&1#wZvb)+R*Hi*vnS12QJE?+b(7Q*DPiLe%9-Uifv5d#EVb9~Hse78M zG<&|ar{naO-_og3v-QJ0Avd6ih8zF-K>n;Y5h`<={CV`kH=A>QGn_vs;nYdZf#3fK@UE(Nc`K|7cz*x0&s`#Uo1!bcPdAr4 z#O&^CCELG^ zUh6zjnY6<|(~tcHxU|65T$05`@0#xF%ObMJivI0`w+!$NfTtXWe7EP#;BS$Ir@9>s zH2*9WWQ(o$_USO>*E>V(m?)~^D1#Erk#)p0+?u~DcQ)rXGV5zWl4wge1u1@Cn znf`D&kxpb)aHX*n%E2Kr2LWG8*q32nJKXQeHGPZ6TFz_lH8b)n{r_Na`TU|S!ugK2AW$QkTqSagg7Jn}wDbLQ@c|CJF*)yc&{ar!8Q3ptJ!#pWO#gR(u7d{wQcZ%fX)K z$7V!p!s>z3zaVfFBEecjA1Opxk#n@%i#c7xQmn(~1g8U8%joPQR8_8Ehu12RPKt(dZ3RjrW-Cb8yA%DvwgHT@RUtED8nQOM~ z-zw7dulwan>qf-R^C1KLiC(5&3fg*GoNd(lk*Mxn^NMMEE#rQ#+PfR$Esyx_0Z5cM zEt*JDWt#%^_~bkKObzp`-YE1ltYs5d`VE`r?9vw;Mo}=pb+h{{tDF=2!r)wH7K^{< zTpdcKmf+ks_f9k|Xgzbw4PM4;lb-_~&_`?gELf4jDOs%~E&IeW?E9RG^xoayA+1?e zN0(S?o%%`(cc*-*KOden@*%j*mIQ)IZ7DcN9G)w6lze}K*`;ds&T-5;?~nhR070~` zovV@HhRhM=P*G%NknwP;xm88H_;U4iUutl8laC)7nEXoxl z1(@eoQE;bn(Uy;yZl)qdn>W5ie!u9~Yjx4?y&~KkPIS+SYkGd4Pt^S9FP{a=j=C2YjlGcI z-_hTUXisH3SUluI#IpXaUkwh%)Jm3qwrcMI&F($J0!QzLEsE|QKqHoBKH%VB;LVhK z_6!NOYHFKt#$NpZXdh_(4t`4vcC2FrFu%c3Zs`5n8qK+R2p1&>DP-Qc4!7@za!;C7 z>|SijvS-l7z*C{CYXxOxRhSt?1!Mt=nz1VB3y$v}ZEVH#TvxlrPNZ>>#KRiR&-aDy zUnJRJI(I!)yXi^$ic~F?!li>#3@&;2IB6@|9}j5OuXpI#q4k=9$68v7%w?qLT#A-@ z)00hF>L@kD{IvK|p-36qh3vvELqZu`MnzgSK7}BtcHAbeHlznZg{>8WfGCqB*0n4W zR4D`<8X)SZ4lr0z1Z2;!UN*ZI<8l(^aO^I&j%|nwY_^D7GZ~%_ey@Mc;6;luF`#fX zkMX+x_Xn}AGq)o4JBcr~`VevR`yQ;6S46XU4{V7K(Tw|8{*c9S_=3QGM@mISiWUXq zn}Y8K2Pt;Y+FbXuaq(hf_Tom`YGY%zv2n2^#J9#P&EB24Oqc5-Xcw@;^pIGpqC%DX z&2Z$x1w5c{M;iVg--}N-th4d{FiDDe9N#97n-i8a<7r&~z(*5hq#KFE$Se9`uCFrR z%?%RFsza<5%J0*A_&GVWdiwXu3TudZRsgxV^#;Vmn){sOgZS>&S~yW#A(Cn%R=Ea9EGJufons)4xWD{iD16Dv>uI}@*VT%oL! zOiqdyWGB(|t#{2Za$Fel{((wKf-6-#_ELJFSnYbgyq7J&X=LE`EDys)3DgD?9iAGJ>bf)&)F@%z6w{H8Ujvk4QPlYTN41gPAxBF>)KCDi{ZwkoNnY6`f zYKHgXn}SGmky@Ng9d{P>oLy4nvl6>++;PeQol#hH>!@UOl({C{W?Lhs-zo7_iN((L zJ{NxGSTh~an~$A2{EAfuygzc)-neg>e)MV2J$MMEpa1r7wKBT8vHBj|vD-W_I3=DO z@##|z3|6bFr;=|glriE;@ry2)W~MS<{_zg~E2@$XSN6y&|nln)ix@t%?#<@)=2m__)hiOQ^E zK4cNKKIz*#yiBLeGXMHA?i50A<5^%csy6zqf$MW_fWJdyI$jsWNG z?1qLcDr0G{A9Ks zL3>?b!KFA7c>*fcSH8)8nb>F7wQ=X;iCB)rrVQ8Ptx`W>^I;Ra)1UyQ7Xnvt$i6fPmz7 zvF4;$W9zC?m&z{uiBE1FnxK`7cALQC5R5{ypn zP}iwU)%lWwJZ#qVSx$0Ik%qpih$cc0@noJ|c5)F@d>p z%w0C(p1OG3{{Lf6X!JOp=*zg<;W$Sy~OkG16`u!d~cl~^0)jAj=m*+ti2^zp%q+%XjuVYx!WR%dS8W}C#Y3b?eRsE^Fd%qVwG z=^79s_GE5a#tFaqwN{;;;Yu-c$gj295VD=opLZXAfwWOs-7Tu~8sPz9h511|tQcGP%TAo{rfa z#B2_Stg2wW92jVhT+v}?!8U-?8L!tHvs+ij69j2BwMaTOv$7!-Zd?+JB@HiCO9FNT z$>-;yDaYP50xy(8*=cDCGBlUCrp5~=h`w=nadMKeu$inQ-JUMAzds?_(^C;frN*f~ zYPn7a@4tOI<+`0;(Ll1gKDUm5FO+A&8l}x<5fe;GCWl$;b8(qK*%GSNXxgDVm{;OB}&-b5SSLa`1h<8fRu1m%J z^^*AfAfVR4zhwU1|gb{Bs`ag2{ASHnxmt$aBP zYP6lkKYT}8137;a-%_M^A0};$Nq*}&%l4AJH)&8R?;4Y1$fdZ!kedD}-;?UlwKC6s z&$1=_oBE`0u_P(_>O?(LZ=Kr?N0{!tN%3TQ2GWHFbagXIkCUz` zTp9>laQ=PFSBxd{6f~F)V|YywW&+sQbc1;SjI-V#^YD0XCWnACjz&KwTrF-`MI`d_ zz_iT_SAld`HFkobHGReq8S&XJo|(QT#xw#FeMB8%6}$w1b92#7>HqEjmefud3=da7 zFv+Sa)&>}FW?+B(n`_`TdNj_P)0SvU>U_gc=wR8DB!gj%5dMy}EHru0Te;%~@yB_hjIDLyj| z^vAJSdiA|=-)L+#hQ}PkTCKyehJbT?L8b^gHWmN+uLtj+=Z!^KzRX`xLc|hZ{r4Z9 z2az;39#>MIQc=dkhHg;9wg81l# z?d{Az9Q`Yib)~tE}zbj5r+9^k;o}AmRO=sos10LEC$Ncxqb2;qbJya6Z+_ z>hF(j?N4e#T_)Iql_JgYliG*wA!<$NTI|%YsWx659&#;#lhzyGfC7miC+Vs2uj=({&r2`H1u%454KT~Y7ho6pMJSsq>j zxBGj)6kBI#E=nfKNB3j|MFAlquk5KMwx*u98xU5TD30#NVTi|R{z(~AYS|U zu>!DS^Yg)%jZJ>K-+tepr>}V+Z+2b|o^Rt=rl$F3Z6$qqS}Yx-{YxWo;7GkPZSKrz zpK)qZJbCJr_+HTC(ZddhbJFvBAAietSrC6t;Vs#Z_I zBOXlaw2283A@2UF4}w(Vc+!_&hA;Lw3;DZ;L?k2@US|41#E5Zy%YdJDQuH0fmOlJ6 zfS@SMg+TxcJLy{t z0OSfmfIvj)REBVw)RW3Ui2wow2mse&@kt>oC$!NHA%HQ90TzPK*baj{N2uOY_enD} zo%t46S7|;=SQ!^1{@M&e5&_71H;Q1^;Q(wPadl%+2+d%-iN%iLAbQMV;rX#P&l|LJ zB@mn^*I5=IYRbU58i@nG*C3JuNkz1z#7eT0&N>g;-u1K1o2P{TSK^CE#J2NxgYAyr z`W&on;^~=*zff0)0fO|5Q-1sv13|~}&k!OUy59duAAZ`_M1_e6inIx|%Jm;>6~bI0 z0RV{JKP-*A3FR#i3#cm{6|LseXf7;RM20a2oyrUKkAfg@8t;4Jzh3ALlaO7e%YXq8 z$le&5!|I7uT>*dy00KmmLG_fr7pf8+C2s1FD+IuRp!)*|g8F5%N2CkrpsAm`GEc3+ z9nX0flLo^OdFU_zez{6UcDvX?k^{FTjElWn|8ko*(7ZDwvwZcvBfLs z)~?0Nc7CQN6^u{2!1wN%%j^Rthtg6t_wlJsOW&CUUWf{ewhkk3pyNz(Mo1C| zJ;C$Hv^Z-?g|6Yg*51lHo%ao`t;GC@z{+p$hT%hpww-05C%w3SXBr!WBZ`6_M?AxE z11&wRkW}lmcx3X>6OcMPH5EPX%`aNIuX{#}NgNVL0u;w_GU(xvTeYUSUDWjB5LbLDJU+KK{><+t` zZGK&@uRr0p(J}F8Ma7hO?0FTt%HC0hRROn+J4Yp>)^DadU;mCF~H-pD$g7V2mq=Vv%KH=GUQNkP8`-6CW8oTzu}--F>BF3V&L z;gLS&+}sOU$bR7wVB)iq1ybb_usI(NPM-ZfU0RENfw!h_$#>CBE)oyRLoVv^vGv|p zY9D=1m2tgz$@{@Eoc_acX*AnoPf}rK;;Zl~cY70Q>}%!Gf?UrJ7R*WJe|+sXw==uL zhw6i)UR+y|d;Z8pLtGUV3=btpviNGlf{LGZfQ{fG`ncsJT7B$m#MEpDX=UX-)D=y> z;yvVr^ywr`FgYzUJ0o{Jc}47sxQX%D6|pw*dSyzcf}FNDukrWRMdhNDChu>rz3lcO zrn_)&sut4r{+s5y3Lq-)r9G~edR+sBNUwJ>T?dNecqo!FudmQSSFG~BR=oC+Q1$T> zAOb*8RxzhzTSrQVj$=LSqn@yWwXVef*bcw$aGsH)&g=R$Uq58*))=|Dxhwz4*Vhc6 zQmpSl?oB+v#e>>dKJep;@z`tTD%QakkuLxMLI~7CJ_#bED1oW_7UTTj7Rh`fKTC7+ z#Dt5GyKH7qADL&CafL1uCr)bkS;YC0EraJ7x4KP0nL>a_d}<*9fdBx$qLzcKD)Y72 z@fAM~ls8g6T;Tq|eIBCSltusmsL1jI003Q8_a?!U$}?KWvqbJZGD0l`L^?|AsSWQ@ zg7P!}=tOJ)AP6ELjU1LAi_?e@AP540Ez;pe{VBl*-rLwx(tTHRA)W%SoU+L74_fTo+s?~!VKJ^`< z)F~Wc-+zV#TOCDy(;cBXv=>L7Csfzf9KXEd$>>;3+=10`ZTo8yArUIFR>0De1Q9>lrnIty@Y1M9p)hMiq7YV$VR zQ=_=h_F{qa;B#qs{M7V!2GNK-N3@H!%bAp#I1`%_<>pHNOnGaiP7)aV2>_;@A0+D#;tAdUk~lLjf{=FzN9$3DRVy@!aQ4vcKtW4XN&%MR?hc`LZH>rEFLN#|z?3FSgV-f+fc8{QI-dAcV2}F0Jf) z)%U*3stHUlUo;2pP?Arasmu#wv7k@@K?D-<<@kT}t_X}0Q8H^O)9hmq8mj8_K00AB zF_K7!Aec-oF-Kg@4u$inm|MEo7$Xb1csk!SIp&fYe9)`aTI3xS5S!Z6d>^R0t^3c% zTHPJ!*B+As1n1$lyxAhg#H_PtUVlHHa6m_>+cv_q*m;gy_K@ZEwH8&&OeI$X5o*7g!fZ*KW5 zcXpwaMg(lfSKn+dj-hyZ6i=QQds=aVU3@$3yQk&*JHNi=wjhRFy!qR&;&LM1APV@Y zSltoMYI_Yf9IPJk_I&R793VRGlJ=L%v#iu}2vn(QCGn(tpTE-5jCZa}OQkjB)*P?b zXJu7Z#wQT5MV&sL$8^^u#B2J$nhGKyKLiFXCsGvQ-|-#Dg6Nl#3QYSVaf! zVpi;T1FL|kWd0YkE*f>U)Bx`myOQK$B;Bvr7gDRw;t+#S05zfaf10p-tFqj;AF1A4 zxlI~g=Ql1bl1eklo+)X5+qB9-O&J-cP$9BKGpN*V^-t4#QZl8IV(GZFK3uxBa!d6Q z%A6(noAQZgbEHNH4JL9j^>y<;skl!vx{$(2E=Kfz%O~^d^qCxDFxo_#dp1%2O|oT< za-@1owh!ERkkXJoRb*TdVp67BWPoz~r*sw)v%{c#;#+qJ&>vYFp*z&i4Bj z)wh<3pYEg0XpjtL>1#vwwFDIEkQ)wxUzZP4+-U~>?7o6Fm!67!YLD`b2m}EDL2ydS zj>srBxY`tEHQBnC@IBpWbgrl8l5U%+iv8wk0I;JYcjyhV`prQ=*k7*p*jLfx(w4t( zj!!eVQ{b;gYX1wMk`-hsa@G%=+n4`7{X+0)03d^2igu(E11l&r~<$ZumH>kNp{I#;&@q5?X!PFz`xk1lB?EfX(c+rLpo9X8D31zu#Nj| zuy46~ynDB2UBk17VHFR^e4OuT;xh_rd|{%AgS!PoIafI-yFW8Q;gf;ecphMLh!1xa zN}ruJ2|%yH2wL&ylgGPOh}4~VMkBq)qU05yKl$(b6)Wb)M8_1z*z&*Pzu|Hp@jV}M zxxahSy$y|6I8e z987klR(twKUzVTq^Xhw>tkG;ZmV8ny{40OY53R(&wq}i9kG+hu=!Q_0N|Y;nLSkVu z{xiM|W09Un55IZJFhJ!4P{*SJ%(CLNcA?+*vT5nGTYg-WlN6GiamI1ooMZ}aY&_$~ z^|~Oa^P`u}8E-GJ%#}c4(%p@ZUr+Kz~gJX;ZN8=>~hCg}U*W5%W!{pVd&aY-MIg$I4DCU$w_;%Bx4i)SeA5WmCj-(<;C=2G(7S9L}C{(|7PqPms)EB-@< zmUt9;6jUzD5Ty&N2-nsElMM2$!ZSOD2XdQt@7ufT9Gxjw{axli9(OnuW>=6d_y|3X zelag0`3C8%bGj9o*+GM%JGs5x zEoK}2)KXqgdorZ5vNQJsn`y)Xu~3`I7gbjNtG|F_3l@SKicoMko=EI{Jm+BRgaZ>q z(Zf7O2~3;HSYvOR#EMs65+8AO*b|8a94V)9JoECaM!T5y5JwkSb;kX__mL@WWO+-< zIh{_-)zuk!6Bs)F&`%{YRF)01m`AiS_D*dr(Evr}N6$~$o$_?MeUoj#J`mZefv`Ng zw)V=bZOA|nPX-?T|{?#OM%2t;? zMLK7qexj~EjoKU}-`-CecREJK=2}_sy&&0+4Q26AV0tB~Oje}@{t4Fwp46kHpnJi< z@dqQ!i>M%l>XPS?%%REJ`((%CQX~aa>*5kdCn#Lp+RS3T%U#zsBBR6Y44Zg2%yCcS zbkC+m-y|A`Y)d3r{TI7Xw`>uo+SmVGDXxiFeIl`(H2KRy>Xr+qvbSu3u1~nM>B3m6 zDk{DuXK-L=3vSeU>i9Ja?)_*m(2mxW=sdN2qsQ+!lB?);^n6-H-G5C7mnU;0daG-~ zKZppbX-y6>bmba;yw^^|`n8@$;LIw>^v)Et)Clz=ozW=L3w15EoLp2v!7cGbko`BJ zF?e{;KXv^3)b7QJ5zE4tLe+seEg7)uh0NB2J}hsRmL{9f z+o_$qZ@E9G4G#(e3;tnn+L=5q7taa~2gjBjcC>Ziay5b=XaR%aRxFN5#!}tZD4h^P z|E@&5aF^vcn!lQz+WT|m*Y9hI&d*AC=>ox96*`Nwarh|aPL0A9f&#}UzPq-&BX(xQ z{w+X1QE?^mQe)2>qCANBrpH(+56<*GSDzhvoi)3n!NU}psG6~CTA7lfT*VBhfK$Ku z`UVnlSO}i?t?2_|yyuuXjC&E26sJy)0oZXV3$fsIb^zv&;2v`lNu&xI-l~l$z?Yj_ zhUQYuz?nt!ZMHtI|J$}`k)~W;gFcYUOG`Hs2|Oykjg*VGEdNK!`cBNSJ8YAc%VTEF zjR3ddl>-C$?tG7nE{j~YZQpt+Xk`UKi}@#IXOStsS4F4|aNk9{P5fSjD&o!Zk3@(z zk9xvk)@~nh@#&p23g6qn(wn*O`)S}`psn=3E0=6KMny?W=?_lqMEC>g_i?MJC!4HM&c<)Mb}^wn74IgnL$}soA1L5+g{e6 zO4J*}NFg*%l6AGmFQWqhhMoH=6eLWr9whvZmz3!dRabXbW@E{=_Jsy2GzVGV zZsYYyCZJtz)|WinQD4*MRctsUZ~S{j^3_nnyX*u`kG*wKX-Q4JmO1$bqq}yUEBLd& zzqL?DvZ-t5qeSZTCT(4MOxrX>rEuoG0n?beV$F8r97tv(eg2Nu!i`4V=q-jSlmq9! z3ZOa665K0?Nxvk>$AoqsArN^KFnhtuZp5w!0ROn0sN7EBU3>ykWTAXzr>7wd6c_m@ zWFcu5jP6)W61Z+lc|C-D1h7{+7Bl?4tFT}iKARjl$Fvc^Lge@*x@MZeV3%Du$D_Y^ zUdI|`_()TtJuwpc(ZIW?%Sa%?Cq)8 zV{?5<)99MgB%2_pA_xF5FcHMFl!uI(qa^T&o9$WT(c&v`;Vg;QbMet-ysOp42ca5 zf!aJ-oi31}ZU9hY;%@)|Ak!ES;|~|{<%f-kL21ZF&Mn7J|3EMrdPxk@z}d=Ax8S?4 zS4Umj=e4YG9#$2S|37s)VSD*~F8+Z0AbN1Pt>Mmdf36G1|HYlQMQ5JU*8Ar#b(a!! zR-rUfXEe6DNgHkQ_Vnw`%(ZwRd4M807wY$z0?W-0E*+C|G%I1y7I^r zKUg}H3zt*uJlCo|J%Ba3JOr@7ME5%m6-(iXuPfkTY1L2ylOESBqn=cz9fi5ud$mf4i8qtKXHT4D33< z{J=j{HM=fx!FP|tTK(`o_fF!g6znrS)#<+0)S3xD{%%3``0KEmRU$s$`FC7~zkf#D z-#b5#;H5WC)qzK=miU|2qE2O_j(zwNKjOc}#C5Z((6>{W2f6~4G}r!JkEnKD|5k1_ z#~O)fQX)#Uqh_ldy*@FiFT3w+zsOIy+)pF@UIY2Q5$*7BLH_D(npVx$HTQ<$gW4t9 zgU{ret;ubx?cr|Lng?^SY}Yz$NnmdFSxm;TO$Ra~?>5mt# zC=MSM-`*Qi9vvYsZ8kk3QApOq?Arrh`VO1-6e@mVhmr}t&wU35nj+FtBQA%hrAIVv z+^G4emHjNN5Zrl0LCs_0E1R$SO1xF4eo&k{EWW)bq#`O(UfNvwkmPfYo?g6ox9{3r z?cRE_LX%Fs-M!dGdsln$bW$aml8``~NvybdsW#b8I615MiQT$UxoK0Q*yNYS53zAz zK=iK|A&0VmQWWkf%{36v6!{xW^KZNwGd< zc&lvSzf0uxqs1qdL=Fb`oJ9mVNRLx3rlK2vwf{=m=($*x5%>3e*XAI&Bx;i>ogHz+^RTP!-dPOm$xE9)Smoc%r{6{yZ%Q64%h{$X!OMO1{mtOt%($-*ZJx8O?D_Lq9X2pPe0d7v>Cu1Lx2J~$R2@mpMwx2u? zvq%beg2sR%{X&V4eCwN+- zZa?8!QGAPwo%wKJHBbkt?o^GYd!(9HE<;GxhztlOB0$t%L{FkXFtq#W!S=(%rd*?x zie7wKW9y~80D&5(^DqT;yx1X_fTTeU{x#rPLl+B%jI9!B`gL)(~v^wuuoRv$;1C)=n(s1c@sZtvBQ2QO(z(g;V{;P|vObHCHhRLx$u1U4h zQV@6SGLoh5(jpm`&+F!I%Oq&JG*I0(A3u5bGqk=H$-I2hG=F<00^c~u_Cn2hFutQI zm$JCeA>An4D%>cw4FNsV*UKat4k-_9n#a4_;_9HUPi;7Gg(oZ)^z$R-v72L}%>kW$ ze!@D*%m{D&$pLmz3*YXQClQL&o>?;i3+H06K{hssse@yiCADq=NOD!E=#!w%U|CSV z>`gY^kW*%=q^IMR$^I`qvVB49_15Rgjh3{yAD**GTXRWUvFAUe$Cq_#?pc9qNs+O^ zf06&A)qfSm#wE$-H;XIi!}9+U*FZs+HWTSvs6Bs%kg4g4g><$56J?N`!jNV2noNSW zH+2)b^Vepkyv_5vV#G*z?$_s7Ov$aX4W;VpVS97XuG}HgLesHT_VcSq^KG;BBnilD z4!c9o8ny#q9vOB7SOKPh(^2OfeBi(=4!Rl+@J+*YgL&UZB$5B+`SK_aE5Pp3lI@;< zcy6B$4HFr(^WaLI{?eTNm2tBWAS$6yg8_{|kRlLhdU?G{wZKcQ#56*o5!sjhx%?ah z0MLEmt;$bO03cA4w{Z#5NevkC8fxF!X6Q78&kL#ekArJZ_>@h{V<+7WZB0%NZM%za zYL8u)ofZ3W8*YFENGG(wX#)DnN_*sg8vQvJJ?D3 ziyx@ZgEx(1xkr`k=Cdq9>nMZ)0G?#2zf!XE)?_W;;G$%#e+>DuK#S)irjmKm+$Tt8 z-BVYd)rTi1FY;2cU#Kf4brJZgN~XpIfT;Cox4O7ExyPrbZf}QoH+v~IZJk~9g8arj zDVaQed`vu9TH+S4YUQ^l9x;9v@>{Vz{S$xNNO_Bwl?)7+-;k^9v#w&c26`R97IU6H zq0@;$0cvv7d=BN-o-|Ye00ht+Bwl}T-`JiW z>}cunXK{Nj5wAB^_2~Dse(ZsAA6lZ(S6gxmj;?&z?8~~{y(;`wBD4MZvzlzSCu0+v z(6kU(i+kG8F}DNNJ0chegR3Q7DM})K+wk()#A>TCr_GwkYqSOh;|&x$c`=SZT9$Z& z-_2z&W$RO+BmV>CIjw*2lJcu_jMlcq#5QYAjx|52>3)6z06?S_ZaPknRRb7-*zEv7 zASIR_mkL3kU8_w``;+1$_sM#GH%llF$`t;3Pnac_3$yM%&-4lM*<}ZD>VmGQV=Y&& zY8B<>+p3;)kY>rGYow0H)(xDEDZKWwkB_A+dB-x(3&VnN{DpVJxvaUF`}sdwb3TBjP*)DA)5DiC zE}tGIC%C4%4bRBNX@2r%BPy)dIdnHpT#rAv(EE$wl=`o}a&b9&eIwJLG)6E}1YT^F}hw^k$CEcc^* zc_4eoDZU<^IixN~3J*`q$AL}uICuJ??`%XOkKNR7u9%pYg)-1MX&sHpY|^g8V(qDu z#*rq_wS8S?r^{r%QS7zzTGe-upR8`3cPXq=5g532hqY^g%>-QAT-_$RIBrTgaWv`L zPKZLVX=cDA@Ln0<<9wc(-`GN(rBgxMVVvpCD1VwQIcl+7k*2;^~ns0f3lJ zLzdRk&PXG+qbk9hN67+iO&Th&YAspO0n5Man43#WJ~HmDeMmz0=7x+5V>8ZM04j4Ml>zSCg)|G`qXi!}MBe-@ssa$Bc+no}i`b^v|2Q*plEk{85fy4o} zRI!o3n8#XsSb)6f+6Ty8T;dRJI6i2P0XdT_nd_zPQV>ZpQOT6slj!sY{R4Sg)6;KF z9>={p+mv;?UMuCOm!D+A=|OV*7-)2d#PKqpL<1axxEzp?v9!{7e)?O63GKL-1WC|| zI!R(_5}z*_Bm%};^mzzqpBd!G@%A88%30Or$bUgRWC1?v;S!Wg=(ImS08|VgODh+j zxjSn}!m?wqfEYp*BPd7{(JT#U%BC$9-@g+ns8eDt1v>`wh#^8_1co#b*Hu6}UB9Wq z{WXa7TFUmb4p95cu!Mg7D_1JFYJ?`hZx!?jK>8xCZfbln@LiI(ZGy|=nwxc2U+RO&6q{eQAC$Nx7L{|@_APy=uf zfLte}(saYLY{&I{rfOU_Ov`p$Aw53`qc};kyihEaE7e+OS9ecuU;n`1(D2CU*!aZc z6bQixis1xF(G1J+f+)#~s_BMl*^cY^K^VnJn&m}V)lJ*=!#K^$y6wk#-OuOy`vZtD zp^OWuw6V^Im~t7Xd0DspIIsJ8rS2oOcHb+yXvC|Xu|{)H1~qjJoFFM$-@wqwI60{! zXaE2J00000Ktx1DL_|bHBqAarA|fIpVrFJ$W@ct)77-B<5fKp)QB_q{RaI40H8V3a jGcz+YbIv*EoO8}O=bZE2d+)u^V9}uU4GfKps}leKTcSb! diff --git a/src/assets/premium/DeviceFrame.svg b/src/assets/premium/DeviceFrame.svg new file mode 100644 index 000000000..f2de1789d --- /dev/null +++ b/src/assets/premium/DeviceFrame.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/premium/PremiumAds.svg b/src/assets/premium/PremiumAds.svg new file mode 100644 index 000000000..490a62c8c --- /dev/null +++ b/src/assets/premium/PremiumAds.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/premium/PremiumBadge.svg b/src/assets/premium/PremiumBadge.svg new file mode 100644 index 000000000..9284aaf79 --- /dev/null +++ b/src/assets/premium/PremiumBadge.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumChats.svg b/src/assets/premium/PremiumChats.svg new file mode 100644 index 000000000..d9bfe816b --- /dev/null +++ b/src/assets/premium/PremiumChats.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumFile.svg b/src/assets/premium/PremiumFile.svg new file mode 100644 index 000000000..c7da3403b --- /dev/null +++ b/src/assets/premium/PremiumFile.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumLimits.svg b/src/assets/premium/PremiumLimits.svg new file mode 100644 index 000000000..e2e0da61b --- /dev/null +++ b/src/assets/premium/PremiumLimits.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumLogo.svg b/src/assets/premium/PremiumLogo.svg new file mode 100644 index 000000000..ebefe6c80 --- /dev/null +++ b/src/assets/premium/PremiumLogo.svg @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/premium/PremiumReactions.svg b/src/assets/premium/PremiumReactions.svg new file mode 100644 index 000000000..48d307a30 --- /dev/null +++ b/src/assets/premium/PremiumReactions.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumSpeed.svg b/src/assets/premium/PremiumSpeed.svg new file mode 100644 index 000000000..3b7ae10d7 --- /dev/null +++ b/src/assets/premium/PremiumSpeed.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumStickers.svg b/src/assets/premium/PremiumStickers.svg new file mode 100644 index 000000000..c9d4a8f62 --- /dev/null +++ b/src/assets/premium/PremiumStickers.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumVideo.svg b/src/assets/premium/PremiumVideo.svg new file mode 100644 index 000000000..7f11bd99b --- /dev/null +++ b/src/assets/premium/PremiumVideo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/premium/PremiumVoice.svg b/src/assets/premium/PremiumVoice.svg new file mode 100644 index 000000000..1b95419c9 --- /dev/null +++ b/src/assets/premium/PremiumVoice.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/reaction-thumbs-premium.png b/src/assets/reaction-thumbs-premium.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6bf57ed8dad9610d0e7875ef0e327756533504 GIT binary patch literal 78924 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%0Dk-sCp(FH}yGf- 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 = ({ onClick={handleOnClick} ref={anchorRef} > - +
{name} {aboutText} diff --git a/src/components/calls/group/GroupCallParticipantVideo.tsx b/src/components/calls/group/GroupCallParticipantVideo.tsx index 8314c619e..9443518c5 100644 --- a/src/components/calls/group/GroupCallParticipantVideo.tsx +++ b/src/components/calls/group/GroupCallParticipantVideo.tsx @@ -60,7 +60,7 @@ const GroupCallParticipantVideo: FC = ({ {lang('Back')} )} - + {ENABLE_THUMBNAIL_VIDEO && (
); }; +function getSeeklineSpikeAmounts() { + return { + MIN_SPIKES: IS_SINGLE_COLUMN_LAYOUT ? (TINY_SCREEN_WIDTH_MQL.matches ? 16 : 20) : 25, + MAX_SPIKES: IS_SINGLE_COLUMN_LAYOUT ? (TINY_SCREEN_WIDTH_MQL.matches ? 35 : 48) : 75, + }; +} + function renderAudio( lang: LangFn, audio: ApiAudio, @@ -436,15 +472,42 @@ function renderVoice( waveformCanvasRef: React.Ref, playProgress: number, isMediaUnread?: boolean, + isTranscribing?: boolean, + isTranscriptionHidden?: boolean, + isTranscribed?: boolean, + isTranscriptionError?: boolean, + onClickTranscribe?: VoidFunction, + onHideTranscription?: (isHidden: boolean) => void, ) { return (
-
- +
+
+ +
+ {onClickTranscribe && ( + // eslint-disable-next-line react/jsx-no-bind + + )}

{playProgress === 0 ? formatMediaDuration(voice.duration) : formatMediaDuration(voice.duration * playProgress)} @@ -475,6 +538,7 @@ function useWaveformCanvas( }; } + const { MIN_SPIKES, MAX_SPIKES } = getSeeklineSpikeAmounts(); const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1); const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor); const decodedWaveform = decodeWaveform(new Uint8Array(waveform)); diff --git a/src/components/common/Avatar.scss b/src/components/common/Avatar.scss index 0e69ba473..ce2c97ea5 100644 --- a/src/components/common/Avatar.scss +++ b/src/components/common/Avatar.scss @@ -12,11 +12,13 @@ display: flex; white-space: nowrap; user-select: none; + position: relative; - &__img { + &__media { border-radius: 50%; width: 100%; height: 100%; + z-index: 1; } .emoji { @@ -105,8 +107,6 @@ } &.online { - position: relative; - &::after { content: ""; display: block; @@ -119,10 +119,18 @@ border: 2px solid var(--color-background); background-color: #0ac630; flex-shrink: 0; + z-index: 1; } } &.interactive { cursor: pointer; } + + .poster { + position: absolute; + left: 0; + top: 0; + z-index: 0; + } } diff --git a/src/components/common/Avatar.tsx b/src/components/common/Avatar.tsx index fecb2bb9d..1898a7cf1 100644 --- a/src/components/common/Avatar.tsx +++ b/src/components/common/Avatar.tsx @@ -1,10 +1,14 @@ import type { MouseEvent as ReactMouseEvent } from 'react'; -import type { FC, TeactNode } from '../../lib/teact/teact'; -import React, { memo, useCallback } from '../../lib/teact/teact'; +import React, { + memo, useCallback, useEffect, useRef, +} from '../../lib/teact/teact'; +import { getActions } from '../../global'; +import type { FC, TeactNode } from '../../lib/teact/teact'; import type { ApiChat, ApiPhoto, ApiUser, ApiUserStatus, } from '../../api/types'; +import type { ObserveFn } from '../../hooks/useIntersectionObserver'; import { ApiMediaFormat } from '../../api/types'; import { IS_TEST } from '../../config'; @@ -21,14 +25,17 @@ import { import { getFirstLetters } from '../../util/textFormat'; import buildClassName, { createClassNameBuilder } from '../../util/buildClassName'; import renderText from './helpers/renderText'; + import useMedia from '../../hooks/useMedia'; import useShowTransition from '../../hooks/useShowTransition'; import useLang from '../../hooks/useLang'; +import { useIsIntersecting } from '../../hooks/useIntersectionObserver'; import './Avatar.scss'; +import useVideoAutoPause from '../middle/message/hooks/useVideoAutoPause'; const cn = createClassNameBuilder('Avatar'); -cn.img = cn('img'); +cn.media = cn('media'); cn.icon = cn('icon'); type OwnProps = { @@ -40,8 +47,11 @@ type OwnProps = { userStatus?: ApiUserStatus; text?: string; isSavedMessages?: boolean; + noVideo?: boolean; + noLoop?: boolean; lastSyncTime?: number; - onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void; + observeIntersection?: ObserveFn; + onClick?: (e: ReactMouseEvent, hasMedia: boolean) => void; }; const Avatar: FC = ({ @@ -53,15 +63,33 @@ const Avatar: FC = ({ userStatus, text, isSavedMessages, + noVideo, + noLoop, lastSyncTime, + observeIntersection, onClick, }) => { + const { loadFullUser } = getActions(); + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + // eslint-disable-next-line no-null/no-null + const videoRef = useRef(null); + const isIntersecting = useIsIntersecting(ref, observeIntersection); const isDeleted = user && isDeletedUser(user); const isReplies = user && isChatWithRepliesBot(user.id); let imageHash: string | undefined; + let videoHash: string | undefined; + + const hasVideoAvatar = (user || chat)?.hasVideoAvatar; + const profilePhoto = (user?.fullInfo?.profilePhoto || chat?.fullInfo?.profilePhoto); + const shouldShowVideo = !noVideo && Boolean(user?.isPremium && profilePhoto?.isVideo); + const shouldPlayVideo = isIntersecting && shouldShowVideo; const shouldFetchBig = size === 'jumbo'; if (!isSavedMessages && !isDeleted) { + if (shouldShowVideo) { + videoHash = getChatAvatarHash(user!, undefined, 'video'); + } if (user) { imageHash = getChatAvatarHash(user, shouldFetchBig ? 'big' : undefined); } else if (chat) { @@ -71,8 +99,29 @@ const Avatar: FC = ({ } } - const blobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime); - const hasBlobUrl = Boolean(blobUrl); + useVideoAutoPause(videoRef, shouldPlayVideo); + + useEffect(() => { + const video = videoRef.current; + if (!video || !noLoop) return undefined; + + const returnToStart = () => { + video.currentTime = 0; + }; + + video.addEventListener('ended', returnToStart); + return () => video.removeEventListener('ended', returnToStart); + }, [noLoop]); + + useEffect(() => { + if (isIntersecting && !noVideo && user && hasVideoAvatar && !profilePhoto) { + loadFullUser({ userId: user.id }); + } + }, [hasVideoAvatar, profilePhoto, loadFullUser, user, noVideo, isIntersecting]); + + const imgBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime); + const videoBlobUrl = useMedia(videoHash, false, ApiMediaFormat.BlobUrl, lastSyncTime); + const hasBlobUrl = Boolean(imgBlobUrl || videoBlobUrl); const { transitionClassNames } = useShowTransition(hasBlobUrl, undefined, hasBlobUrl, 'slow'); const lang = useLang(); @@ -86,14 +135,27 @@ const Avatar: FC = ({ content = ; } else if (isReplies) { content = ; - } else if (blobUrl) { + } else if (hasBlobUrl) { content = ( - {author} + <> + {author} + {videoBlobUrl && ( +

= ({ narrow isStatic > - + {renderText(description, ['br', 'links', 'emoji'])} {lang(userId ? 'UserBio' : 'Info')} diff --git a/src/components/common/EmbeddedMessage.scss b/src/components/common/EmbeddedMessage.scss index 7b8201f00..9592d1f92 100644 --- a/src/components/common/EmbeddedMessage.scss +++ b/src/components/common/EmbeddedMessage.scss @@ -11,6 +11,12 @@ cursor: pointer; direction: ltr; + @for $i from 1 through 8 { + &.color-#{$i} { + --accent-color: var(--color-user-#{$i}); + } + } + body.animation-level-1 & { .ripple-container { display: none; @@ -100,7 +106,7 @@ } .embedded-action-message { - color: var(--accent-color); + color: var(---secondary-color); opacity: 0.75; } diff --git a/src/components/common/EmbeddedMessage.tsx b/src/components/common/EmbeddedMessage.tsx index 70e18e3b6..c27b134eb 100644 --- a/src/components/common/EmbeddedMessage.tsx +++ b/src/components/common/EmbeddedMessage.tsx @@ -8,6 +8,7 @@ import { isActionMessage, getSenderTitle, getMessageRoundVideo, + getUserColorKey, } from '../../global/helpers'; import renderText from './helpers/renderText'; import { getPictogramDimensions } from './helpers/mediaDimensions'; @@ -30,6 +31,7 @@ type OwnProps = { sender?: ApiUser | ApiChat; title?: string; customText?: string; + noUserColors?: boolean; isProtected?: boolean; onClick: NoneToVoidFunction; }; @@ -43,6 +45,7 @@ const EmbeddedMessage: FC = ({ title, customText, isProtected, + noUserColors, observeIntersection, onClick, }) => { @@ -61,7 +64,11 @@ const EmbeddedMessage: FC = ({ return (
{mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl, isRoundVideo, isProtected)} diff --git a/src/components/common/GroupChatInfo.tsx b/src/components/common/GroupChatInfo.tsx index 3e1fa557a..88f195ab0 100644 --- a/src/components/common/GroupChatInfo.tsx +++ b/src/components/common/GroupChatInfo.tsx @@ -34,6 +34,7 @@ type OwnProps = { withFullInfo?: boolean; withUpdatingStatus?: boolean; withChatType?: boolean; + withVideoAvatar?: boolean; noRtl?: boolean; }; @@ -55,6 +56,7 @@ const GroupChatInfo: FC = ({ withFullInfo, withUpdatingStatus, withChatType, + withVideoAvatar, noRtl, chat, onlineCount, @@ -75,8 +77,8 @@ const GroupChatInfo: FC = ({ } }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]); - const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => { - if (chat && hasPhoto) { + const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasMedia: boolean) => { + if (chat && hasMedia) { e.stopPropagation(); openMediaViewer({ avatarOwnerId: chat.id, @@ -140,6 +142,7 @@ const GroupChatInfo: FC = ({ size={avatarSize} chat={chat} onClick={withMediaViewer ? handleAvatarViewerOpen : undefined} + noVideo={!withVideoAvatar} />
diff --git a/src/components/common/PickerSelectedItem.tsx b/src/components/common/PickerSelectedItem.tsx index 1ec4cb5e0..afc1932b0 100644 --- a/src/components/common/PickerSelectedItem.tsx +++ b/src/components/common/PickerSelectedItem.tsx @@ -61,6 +61,7 @@ const PickerSelectedItem: FC = ({ user={user} size="small" isSavedMessages={user?.isSelf} + noVideo /> ); diff --git a/src/components/common/PremiumIcon.scss b/src/components/common/PremiumIcon.scss new file mode 100644 index 000000000..3a0ff4e87 --- /dev/null +++ b/src/components/common/PremiumIcon.scss @@ -0,0 +1,27 @@ +.PremiumIcon { + display: inline-block; + flex-shrink: 0; + width: 1rem; + height: 1rem; + + &.big { + width: 1.5rem; + height: 1.5rem; + } + + --color-fill: var(--color-primary); + + & > svg { + width: 100%; + height: 100%; + } + + &:not(.gradient) { + transform: translateY(-2px); + } + + &.clickable { + cursor: pointer; + pointer-events: auto; + } +} diff --git a/src/components/common/PremiumIcon.tsx b/src/components/common/PremiumIcon.tsx new file mode 100644 index 000000000..67396320d --- /dev/null +++ b/src/components/common/PremiumIcon.tsx @@ -0,0 +1,47 @@ +import type { FC } from '../../lib/teact/teact'; +import React, { memo, useMemo } from '../../lib/teact/teact'; + +import generateIdFor from '../../util/generateIdFor'; + +import buildClassName from '../../util/buildClassName'; + +import './PremiumIcon.scss'; + +// eslint-disable-next-line max-len +const PREMIUM_ICON = { __html: '' }; +const store: Record = {}; + +type OwnProps = { + withGradient?: boolean; + big?: boolean; + onClick?: VoidFunction; +}; + +const PremiumIcon: FC = ({ + withGradient, + big, + onClick, +}) => { + const html = useMemo(() => { + return withGradient ? getPremiumIconGradient() : PREMIUM_ICON; + }, [withGradient]); + + return ( + + ); +}; + +function getPremiumIconGradient() { + const id = generateIdFor(store); + return { + // eslint-disable-next-line max-len + __html: ``, + }; +} + +export default memo(PremiumIcon); diff --git a/src/components/common/PrivateChatInfo.tsx b/src/components/common/PrivateChatInfo.tsx index d03c6aa31..0ed37f0e9 100644 --- a/src/components/common/PrivateChatInfo.tsx +++ b/src/components/common/PrivateChatInfo.tsx @@ -17,6 +17,7 @@ import VerifiedIcon from './VerifiedIcon'; import TypingStatus from './TypingStatus'; import DotAnimation from './DotAnimation'; import FakeIcon from './FakeIcon'; +import PremiumIcon from './PremiumIcon'; type OwnProps = { userId: string; @@ -29,6 +30,7 @@ type OwnProps = { withUsername?: boolean; withFullInfo?: boolean; withUpdatingStatus?: boolean; + withVideoAvatar?: boolean; noStatusOrTyping?: boolean; noRtl?: boolean; }; @@ -52,6 +54,7 @@ const PrivateChatInfo: FC = ({ withUsername, withFullInfo, withUpdatingStatus, + withVideoAvatar, noStatusOrTyping, noRtl, user, @@ -75,8 +78,8 @@ const PrivateChatInfo: FC = ({ } }, [userId, loadFullUser, lastSyncTime, withFullInfo]); - const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => { - if (user && hasPhoto) { + const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasMedia: boolean) => { + if (user && hasMedia) { e.stopPropagation(); openMediaViewer({ avatarOwnerId: user.id, @@ -130,6 +133,7 @@ const PrivateChatInfo: FC = ({ user={user} isSavedMessages={isSavedMessages} onClick={withMediaViewer ? handleAvatarViewerOpen : undefined} + noVideo={!withVideoAvatar} />
{isSavedMessages ? ( @@ -140,6 +144,7 @@ const PrivateChatInfo: FC = ({

{fullName && renderText(fullName)}

{user?.isVerified && } + {user.isPremium && } {user.fakeType && }
)} diff --git a/src/components/common/ProfileInfo.scss b/src/components/common/ProfileInfo.scss index f42e8000b..cf6707891 100644 --- a/src/components/common/ProfileInfo.scss +++ b/src/components/common/ProfileInfo.scss @@ -122,18 +122,21 @@ display: flex; align-items: center; - h3 { + .fullName { font-weight: 500; font-size: 1.25rem; line-height: 1.375rem; white-space: pre-wrap; word-break: break-word; - margin-bottom: 0.25rem; + margin-bottom: 0; } - .VerifiedIcon { + .VerifiedIcon, .PremiumIcon { margin-left: 0.25rem; - margin-top: -0.125rem; + z-index: 2; + --color-fill: var(--color-white); + --color-checkmark: var(--color-primary); + opacity: 0.8; } .emoji { diff --git a/src/components/common/ProfileInfo.tsx b/src/components/common/ProfileInfo.tsx index e3cb3099a..13b0766ec 100644 --- a/src/components/common/ProfileInfo.tsx +++ b/src/components/common/ProfileInfo.tsx @@ -23,6 +23,7 @@ import VerifiedIcon from './VerifiedIcon'; import ProfilePhoto from './ProfilePhoto'; import Transition from '../ui/Transition'; import FakeIcon from './FakeIcon'; +import PremiumIcon from './PremiumIcon'; import './ProfileInfo.scss'; @@ -55,6 +56,7 @@ const ProfileInfo: FC = ({ const { loadFullUser, openMediaViewer, + openPremiumModal, } = getActions(); const lang = useLang(); @@ -94,6 +96,12 @@ const ProfileInfo: FC = ({ }); }, [openMediaViewer, userId, chatId, currentPhotoIndex, forceShowSelf]); + const handleClickPremium = useCallback(() => { + if (!user) return; + + openPremiumModal({ fromUserId: user.id }); + }, [openPremiumModal, user]); + const selectPreviousMedia = useCallback(() => { if (isFirst) { return; @@ -151,9 +159,8 @@ const ProfileInfo: FC = ({ ); } - function renderPhoto() { - const photo = !isSavedMessages && photos && photos.length > 0 ? photos[currentPhotoIndex] : undefined; - + function renderPhoto(isActive?: boolean) { + const photo = !isSavedMessages && photos.length > 0 ? photos[currentPhotoIndex] : undefined; return ( = ({ photo={photo} isSavedMessages={isSavedMessages} isFirstPhoto={isFirst} + notActive={!isActive} onClick={handleProfilePhotoClick} /> ); @@ -187,6 +195,7 @@ const ProfileInfo: FC = ({ } const isVerifiedIconShown = (user || chat)?.isVerified; + const isPremiumIconShown = user?.isPremium; const fakeType = (user || chat)?.fakeType; return ( @@ -194,7 +203,7 @@ const ProfileInfo: FC = ({
{renderPhotoTabs()} - {renderPhoto()} + {renderPhoto} {!isFirst && ( @@ -218,12 +227,13 @@ const ProfileInfo: FC = ({
{isSavedMessages ? (
-

{lang('SavedMessages')}

+
{lang('SavedMessages')}
) : (
-

{fullName && renderText(fullName)}

+
{fullName && renderText(fullName)}
{isVerifiedIconShown && } + {isPremiumIconShown && } {fakeType && }
)} diff --git a/src/components/common/ProfilePhoto.tsx b/src/components/common/ProfilePhoto.tsx index a4939ba0d..74124a127 100644 --- a/src/components/common/ProfilePhoto.tsx +++ b/src/components/common/ProfilePhoto.tsx @@ -1,6 +1,6 @@ -import type { FC, TeactNode } from '../../lib/teact/teact'; -import React, { memo } from '../../lib/teact/teact'; +import React, { memo, useEffect, useRef } from '../../lib/teact/teact'; +import type { FC, TeactNode } from '../../lib/teact/teact'; import type { ApiChat, ApiPhoto, ApiUser } from '../../api/types'; import { ApiMediaFormat } from '../../api/types'; @@ -11,7 +11,7 @@ import { getUserFullName, isUserId, isChatWithRepliesBot, - isDeletedUser, + isDeletedUser, getVideoAvatarMediaHash, } from '../../global/helpers'; import renderText from './helpers/renderText'; import buildClassName from '../../util/buildClassName'; @@ -30,6 +30,7 @@ type OwnProps = { isSavedMessages?: boolean; photo?: ApiPhoto; lastSyncTime?: number; + notActive?: boolean; onClick: NoneToVoidFunction; }; @@ -39,34 +40,55 @@ const ProfilePhoto: FC = ({ photo, isFirstPhoto, isSavedMessages, + notActive, lastSyncTime, onClick, }) => { + // eslint-disable-next-line no-null/no-null + const videoRef = useRef(null); const lang = useLang(); const isDeleted = user && isDeletedUser(user); const isRepliesChat = chat && isChatWithRepliesBot(chat.id); - function getMediaHash(size: 'normal' | 'big', forceAvatar?: boolean) { - if (photo && !forceAvatar) { - return `photo${photo.id}?size=c`; - } + function getMediaHash(size: 'normal' | 'big', type: 'photo' | 'video' = 'photo') { + const userOrChat = user || chat; + const profilePhoto = photo || userOrChat?.fullInfo?.profilePhoto; + const hasVideo = profilePhoto?.isVideo; + const forceAvatar = isFirstPhoto; - let hash: string | undefined; - if (!isSavedMessages && !isDeleted && !isRepliesChat) { - if (user) { - hash = getChatAvatarHash(user, size); - } else if (chat) { - hash = getChatAvatarHash(chat, size); + if (type === 'video' && !hasVideo) return undefined; + + if (photo && !forceAvatar) { + if (hasVideo && type === 'video') { + return getVideoAvatarMediaHash(photo); + } + if (type === 'photo') { + return `photo${photo.id}?size=c`; } } - return hash; + if (!isSavedMessages && !isDeleted && !isRepliesChat && userOrChat) { + return getChatAvatarHash(userOrChat, size, type); + } + + return undefined; } - const photoBlobUrl = useMedia(getMediaHash('big'), false, ApiMediaFormat.BlobUrl, lastSyncTime); - const avatarMediaHash = isFirstPhoto && !photoBlobUrl ? getMediaHash('normal', true) : undefined; - const avatarBlobUrl = useMedia(avatarMediaHash, false, ApiMediaFormat.BlobUrl, lastSyncTime); - const imageSrc = photoBlobUrl || avatarBlobUrl || photo?.thumbnail?.dataUri; + useEffect(() => { + if (!videoRef.current) return; + if (notActive) { + videoRef.current.pause(); + videoRef.current.currentTime = 0; + } else { + videoRef.current.play(); + } + }, [notActive]); + + const photoHash = getMediaHash('big', 'photo'); + const photoBlobUrl = useMedia(photoHash, false, ApiMediaFormat.BlobUrl, lastSyncTime); + const videoHash = getMediaHash('normal', 'video'); + const videoBlobUrl = useMedia(videoHash, false, ApiMediaFormat.BlobUrl, lastSyncTime); + const imageSrc = videoBlobUrl || photoBlobUrl || photo?.thumbnail?.dataUri; let content: TeactNode | undefined; @@ -77,7 +99,21 @@ const ProfilePhoto: FC = ({ } else if (isRepliesChat) { content = ; } else if (imageSrc) { - content = ; + if (videoBlobUrl) { + content = ( +